electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 638de63f1378d280d0773540ca951cc326ca052c
parent 788d54f9a67d819a69e9e80186a45322b5559b55
Author: ThomasV <thomasv@electrum.org>
Date:   Wed,  9 Oct 2019 20:16:11 +0200

lnworker: rename 'invoices' to 'payments' when they can be in both directions

Diffstat:
Melectrum/lnpeer.py | 6+++---
Melectrum/lnworker.py | 50+++++++++++++++++++++++++-------------------------
Melectrum/tests/test_lnpeer.py | 19++++++++-----------
Melectrum/wallet.py | 8++++----
4 files changed, 40 insertions(+), 43 deletions(-)

diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py @@ -1267,7 +1267,7 @@ class Peer(Logger): self.logger.info(f"on_update_fulfill_htlc. chan {chan.short_channel_id}. htlc_id {htlc_id}") chan.receive_htlc_settle(preimage, htlc_id) self.lnworker.save_preimage(payment_hash, preimage) - self.lnworker.set_invoice_status(payment_hash, PR_PAID) + self.lnworker.set_payment_status(payment_hash, PR_PAID) local_ctn = chan.get_latest_ctn(LOCAL) asyncio.ensure_future(self._on_update_fulfill_htlc(chan, htlc_id, preimage, local_ctn)) @@ -1406,7 +1406,7 @@ class Peer(Logger): await self.await_local(chan, local_ctn) await self.await_remote(chan, remote_ctn) try: - info = self.lnworker.get_invoice_info(htlc.payment_hash) + info = self.lnworker.get_payment_info(htlc.payment_hash) preimage = self.lnworker.get_preimage(htlc.payment_hash) except UnknownPaymentHash: reason = OnionRoutingFailureMessage(code=OnionFailureCode.INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS, data=b'') @@ -1443,7 +1443,7 @@ class Peer(Logger): self.logger.info(f"_fulfill_htlc. chan {chan.short_channel_id}. htlc_id {htlc_id}") chan.settle_htlc(preimage, htlc_id) payment_hash = sha256(preimage) - self.lnworker.set_invoice_status(payment_hash, PR_PAID) + self.lnworker.set_payment_status(payment_hash, PR_PAID) remote_ctn = chan.get_latest_ctn(REMOTE) self.send_message("update_fulfill_htlc", channel_id=chan.channel_id, diff --git a/electrum/lnworker.py b/electrum/lnworker.py @@ -85,7 +85,7 @@ encoder = ChannelJsonEncoder() from typing import NamedTuple -class InvoiceInfo(NamedTuple): +class PaymentInfo(NamedTuple): payment_hash: bytes amount: int direction: int @@ -324,7 +324,7 @@ class LNWallet(LNWorker): LNWorker.__init__(self, xprv) self.ln_keystore = keystore.from_xprv(xprv) self.localfeatures |= LnLocalFeatures.OPTION_DATA_LOSS_PROTECT_REQ - self.invoices = self.storage.get('lightning_invoices2', {}) # RHASH -> amount, direction, is_paid + self.payments = self.storage.get('lightning_payments', {}) # RHASH -> amount, direction, is_paid self.preimages = self.storage.get('lightning_preimages', {}) # RHASH -> preimage self.sweep_address = wallet.get_receiving_address() self.lock = threading.RLock() @@ -481,7 +481,7 @@ class LNWallet(LNWorker): label = self.wallet.get_label(key) if _direction == SENT: try: - inv = self.get_invoice_info(bfh(key)) + inv = self.get_payment_info(bfh(key)) fee_msat = inv.amount*1000 - amount_msat if inv.amount else None except UnknownPaymentHash: fee_msat = None @@ -850,11 +850,11 @@ class LNWallet(LNWorker): lnaddr = lndecode(invoice, expected_hrp=constants.net.SEGWIT_HRP) key = bh2u(lnaddr.paymenthash) amount = int(lnaddr.amount * COIN) if lnaddr.amount else None - status = self.get_invoice_status(lnaddr.paymenthash) + status = self.get_payment_status(lnaddr.paymenthash) if status == PR_PAID: raise PaymentFailure(_("This invoice has been paid already")) - info = InvoiceInfo(lnaddr.paymenthash, amount, SENT, PR_UNPAID) - self.save_invoice_info(info) + info = PaymentInfo(lnaddr.paymenthash, amount, SENT, PR_UNPAID) + self.save_payment_info(info) self._check_invoice(invoice, amount_sat) self.wallet.set_label(key, lnaddr.get_description()) for i in range(attempts): @@ -870,12 +870,12 @@ class LNWallet(LNWorker): if not chan: raise Exception(f"PathFinder returned path with short_channel_id " f"{short_channel_id} that is not in channel list") - self.set_invoice_status(lnaddr.paymenthash, PR_INFLIGHT) + self.set_payment_status(lnaddr.paymenthash, PR_INFLIGHT) peer = self.peers[route[0].node_id] htlc = await peer.pay(route, chan, int(lnaddr.amount * COIN * 1000), lnaddr.paymenthash, lnaddr.get_min_final_cltv_expiry()) self.network.trigger_callback('htlc_added', htlc, lnaddr, SENT) success = await self.pending_payments[(short_channel_id, htlc.htlc_id)] - self.set_invoice_status(lnaddr.paymenthash, (PR_PAID if success else PR_UNPAID)) + self.set_payment_status(lnaddr.paymenthash, (PR_PAID if success else PR_UNPAID)) return success @staticmethod @@ -968,7 +968,7 @@ class LNWallet(LNWorker): "Other clients will likely not be able to send to us.") payment_preimage = os.urandom(32) payment_hash = sha256(payment_preimage) - info = InvoiceInfo(payment_hash, amount_sat, RECEIVED, PR_UNPAID) + info = PaymentInfo(payment_hash, amount_sat, RECEIVED, PR_UNPAID) amount_btc = amount_sat/Decimal(COIN) if amount_sat else None lnaddr = LnAddr(payment_hash, amount_btc, tags=[('d', message), @@ -988,7 +988,7 @@ class LNWallet(LNWorker): 'invoice': invoice } self.save_preimage(payment_hash, payment_preimage) - self.save_invoice_info(info) + self.save_payment_info(info) self.wallet.add_payment_request(req) self.wallet.set_label(key, message) return key @@ -1002,36 +1002,36 @@ class LNWallet(LNWorker): def get_preimage(self, payment_hash: bytes) -> bytes: return bfh(self.preimages.get(bh2u(payment_hash))) - def get_invoice_info(self, payment_hash: bytes) -> bytes: + def get_payment_info(self, payment_hash: bytes) -> bytes: key = payment_hash.hex() with self.lock: - if key not in self.invoices: + if key not in self.payments: raise UnknownPaymentHash(payment_hash) - amount, direction, status = self.invoices[key] - return InvoiceInfo(payment_hash, amount, direction, status) + amount, direction, status = self.payments[key] + return PaymentInfo(payment_hash, amount, direction, status) - def save_invoice_info(self, info): + def save_payment_info(self, info): key = info.payment_hash.hex() with self.lock: - self.invoices[key] = info.amount, info.direction, info.status - self.storage.put('lightning_invoices2', self.invoices) + self.payments[key] = info.amount, info.direction, info.status + self.storage.put('lightning_payments', self.payments) self.storage.write() - def get_invoice_status(self, payment_hash): + def get_payment_status(self, payment_hash): try: - info = self.get_invoice_info(payment_hash) + info = self.get_payment_info(payment_hash) return info.status except UnknownPaymentHash: return PR_UNKNOWN - def set_invoice_status(self, payment_hash: bytes, status): + def set_payment_status(self, payment_hash: bytes, status): try: - info = self.get_invoice_info(payment_hash) + info = self.get_payment_info(payment_hash) except UnknownPaymentHash: # if we are forwarding return info = info._replace(status=status) - self.save_invoice_info(info) + self.save_payment_info(info) if info.direction == RECEIVED and info.status == PR_PAID: self.network.trigger_callback('payment_received', self.wallet, bh2u(payment_hash), PR_PAID) @@ -1077,13 +1077,13 @@ class LNWallet(LNWorker): cltv_expiry_delta)])) return routing_hints - def delete_invoice(self, payment_hash_hex: str): + def delete_payment(self, payment_hash_hex: str): try: with self.lock: - del self.invoices[payment_hash_hex] + del self.payments[payment_hash_hex] except KeyError: return - self.storage.put('lightning_invoices', self.invoices) + self.storage.put('lightning_payments', self.payments) self.storage.write() def get_balance(self): diff --git a/electrum/tests/test_lnpeer.py b/electrum/tests/test_lnpeer.py @@ -21,7 +21,7 @@ from electrum.channel_db import ChannelDB from electrum.lnworker import LNWallet from electrum.lnmsg import encode_msg, decode_msg from electrum.logging import console_stderr_handler -from electrum.lnworker import InvoiceInfo, RECEIVED, PR_UNPAID +from electrum.lnworker import PaymentInfo, RECEIVED, PR_UNPAID from .test_lnchannel import create_test_channels from . import ElectrumTestCase @@ -88,8 +88,7 @@ class MockLNWallet: self.node_keypair = local_keypair self.network = MockNetwork(tx_queue) self.channels = {self.chan.channel_id: self.chan} - self.invoices = {} - self.inflight = {} + self.payments = {} self.wallet = MockWallet() self.localfeatures = LnLocalFeatures(0) self.pending_payments = defaultdict(asyncio.Future) @@ -120,13 +119,11 @@ class MockLNWallet: def on_channels_updated(self): pass - def save_invoice(*args, is_paid=False): - pass - preimages = {} - get_invoice_info = LNWallet.get_invoice_info - save_invoice_info = LNWallet.save_invoice_info - set_invoice_status = LNWallet.set_invoice_status + get_payment_info = LNWallet.get_payment_info + save_payment_info = LNWallet.save_payment_info + set_payment_status = LNWallet.set_payment_status + get_payment_status = LNWallet.get_payment_status save_preimage = LNWallet.save_preimage get_preimage = LNWallet.get_preimage _create_route_from_invoice = LNWallet._create_route_from_invoice @@ -216,9 +213,9 @@ class TestPeer(ElectrumTestCase): amount_btc = amount_sat/Decimal(COIN) payment_preimage = os.urandom(32) RHASH = sha256(payment_preimage) - info = InvoiceInfo(RHASH, amount_sat, RECEIVED, PR_UNPAID) + info = PaymentInfo(RHASH, amount_sat, RECEIVED, PR_UNPAID) w2.save_preimage(RHASH, payment_preimage) - w2.save_invoice_info(info) + w2.save_payment_info(info) lnaddr = LnAddr( RHASH, amount_btc, diff --git a/electrum/wallet.py b/electrum/wallet.py @@ -574,7 +574,7 @@ class Abstract_Wallet(AddressSynchronizer): if request_type == PR_TYPE_ONCHAIN: item['status'] = PR_PAID if item.get('txid') is not None else PR_UNPAID elif self.lnworker and request_type == PR_TYPE_LN: - item['status'] = self.lnworker.get_invoice_status(bfh(item['rhash'])) + item['status'] = self.lnworker.get_payment_status(bfh(item['rhash'])) else: return self.check_if_expired(item) @@ -1367,7 +1367,7 @@ class Abstract_Wallet(AddressSynchronizer): if conf is not None: req['confirmations'] = conf elif self.lnworker and _type == PR_TYPE_LN: - req['status'] = self.lnworker.get_invoice_status(bfh(key)) + req['status'] = self.lnworker.get_payment_status(bfh(key)) else: return self.check_if_expired(req) @@ -1443,7 +1443,7 @@ class Abstract_Wallet(AddressSynchronizer): if key in self.receive_requests: self.remove_payment_request(key) elif self.lnworker: - self.lnworker.delete_invoice(key) + self.lnworker.delete_payment(key) def delete_invoice(self, key): """ lightning or on-chain """ @@ -1451,7 +1451,7 @@ class Abstract_Wallet(AddressSynchronizer): self.invoices.pop(key) self.storage.put('invoices', self.invoices) elif self.lnworker: - self.lnworker.delete_invoice(key) + self.lnworker.delete_payment(key) def remove_payment_request(self, addr): if addr not in self.receive_requests: