Browse Source

invoices: minor clean-up (type hints, mark broken things)

also rm some dead code
bip39-recovery
SomberNight 5 years ago
parent
commit
0b224ba685
No known key found for this signature in database GPG Key ID: B33B5F232C6271E9
  1. 12
      electrum/gui/qt/main_window.py
  2. 2
      electrum/invoices.py
  3. 14
      electrum/paymentrequest.py
  4. 3
      electrum/plugins/email_requests/qt.py
  5. 27
      electrum/wallet.py

12
electrum/gui/qt/main_window.py

@ -1159,7 +1159,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
def sign_payment_request(self, addr):
alias = self.config.get('alias')
alias_privkey = None
if alias and self.alias_info:
alias_addr, alias_name, validated = self.alias_info
if alias_addr:
@ -1230,17 +1229,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
tooltip_text = _("{} copied to clipboard").format(title)
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):
self.receive_payreq_e.setText('')
self.receive_address_e.setText('')

2
electrum/invoices.py

@ -115,7 +115,7 @@ class OnchainInvoice(Invoice):
id=pr.get_id(),
time=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(),
)

14
electrum/paymentrequest.py

@ -25,7 +25,7 @@
import hashlib
import sys
import time
from typing import Optional, List
from typing import Optional, List, TYPE_CHECKING
import asyncio
import urllib.parse
@ -41,13 +41,16 @@ except ImportError:
from . import bitcoin, ecc, util, transaction, x509, rsakey
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 .bitcoin import address_to_script
from .transaction import PartialTxOutput
from .network import Network
from .logging import get_logger, Logger
if TYPE_CHECKING:
from .simple_config import SimpleConfig
_logger = get_logger(__name__)
@ -315,8 +318,7 @@ class PaymentRequest:
return False, error
def make_unsigned_request(req):
from .transaction import Transaction
def make_unsigned_request(req: 'OnchainInvoice'):
addr = req.get_address()
time = req.time
exp = req.exp
@ -444,7 +446,7 @@ def sign_request_with_x509(pr, key_path, cert_path):
pr.signature = bytes(sig)
def serialize_request(req):
def serialize_request(req): # FIXME this is broken
pr = make_unsigned_request(req)
signature = req.get('sig')
requestor = req.get('name')
@ -455,7 +457,7 @@ def serialize_request(req):
return pr
def make_request(config, req):
def make_request(config: 'SimpleConfig', req: 'OnchainInvoice'):
pr = make_unsigned_request(req)
key_path = config.get('ssl_keyfile')
cert_path = config.get('ssl_certfile')

3
electrum/plugins/email_requests/qt.py

@ -44,6 +44,7 @@ from PyQt5.QtWidgets import (QVBoxLayout, QLabel, QGridLayout, QLineEdit,
from electrum.gui.qt.util import (EnterButton, Buttons, CloseButton, OkButton,
WindowModalDialog, get_parent_main_window)
from electrum.gui.qt.main_window import ElectrumWindow
from electrum.plugin import BasePlugin, hook
from electrum.paymentrequest import PaymentRequest
@ -179,7 +180,7 @@ class Plugin(BasePlugin):
window = get_parent_main_window(menu)
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
r = window.wallet.receive_requests.get(addr)
message = r.get('memo', '')

27
electrum/wallet.py

@ -267,7 +267,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
self.frozen_addresses = set(db.get('frozen_addresses', []))
self.frozen_coins = set(db.get('frozen_coins', [])) # set of txid:vout strings
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._reserved_addresses = set(db.get('reserved_addresses', []))
@ -1624,7 +1624,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
return True, conf
return False, None
def get_request_URI(self, req: Invoice):
def get_request_URI(self, req: OnchainInvoice) -> str:
addr = req.get_address()
message = self.labels.get(addr, '')
amount = req.amount
@ -1674,8 +1674,13 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
if x:
return self.export_request(x)
def export_request(self, x):
key = x.rhash if x.is_lightning() else x.get_address()
def export_request(self, x: Invoice) -> Dict[str, Any]:
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_str = x.get_status_str(status)
is_lightning = x.is_lightning()
@ -1695,7 +1700,6 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
if self.lnworker and status == PR_UNPAID:
d['can_receive'] = self.lnworker.can_receive_invoice(x)
else:
#key = x.id
addr = x.get_address()
paid, conf = self.get_payment_status(addr, x.amount)
d['address'] = addr
@ -1715,7 +1719,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
d['bip70_url'] = request_url
return d
def export_invoice(self, x):
def export_invoice(self, x: Invoice) -> Dict[str, Any]:
status = self.get_invoice_status(x)
status_str = x.get_status_str(status)
is_lightning = x.is_lightning()
@ -1730,10 +1734,12 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
'status_str': status_str,
}
if is_lightning:
assert isinstance(x, LNInvoice)
d['invoice'] = x.invoice
if self.lnworker and status == PR_UNPAID:
d['can_pay'] = self.lnworker.can_pay_invoice(x)
else:
assert isinstance(x, OnchainInvoice)
d['outputs'] = [y.to_legacy_tuple() for y in x.outputs]
if x.bip70:
d['bip70'] = x.bip70
@ -1763,25 +1769,28 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
bip70 = 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)
assert isinstance(req, OnchainInvoice)
alias_privkey = self.export_private_key(alias_addr, password)
pr = paymentrequest.make_unsigned_request(req)
paymentrequest.sign_request_with_alias(pr, alias, alias_privkey)
req.bip70 = pr.raw.hex()
req['name'] = pr.pki_data
req['sig'] = bh2u(pr.signature)
self.receive_requests[key] = req
def add_payment_request(self, req):
def add_payment_request(self, req: Invoice):
if not req.is_lightning():
assert isinstance(req, OnchainInvoice)
addr = req.get_address()
if not bitcoin.is_address(addr):
raise Exception(_('Invalid Bitcoin address.'))
if not self.is_mine(addr):
raise Exception(_('Address not in wallet.'))
key = addr
message = req.message
else:
assert isinstance(req, LNInvoice)
key = req.rhash
message = req.message
self.receive_requests[key] = req

Loading…
Cancel
Save