tlnworker: amount passed in HtlcLog must be without fees - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 693583edc5010ece804e312626c7c40157613ff1 DIR parent 06ea06f7d37a02d7d242d84eca89da3d85191c1b HTML Author: ThomasV <thomasv@electrum.org> Date: Tue, 2 Mar 2021 10:23:30 +0100 lnworker: amount passed in HtlcLog must be without fees Diffstat: M electrum/lnchannel.py | 6 +++--- M electrum/lnworker.py | 11 +++++------ M electrum/tests/test_lnpeer.py | 12 +++++------- 3 files changed, 13 insertions(+), 16 deletions(-) --- DIR diff --git a/electrum/lnchannel.py b/electrum/lnchannel.py t@@ -993,7 +993,7 @@ class Channel(AbstractChannel): if self.lnworker: sent = self.hm.sent_in_ctn(new_ctn) for htlc in sent: - self.lnworker.htlc_fulfilled(self, htlc.payment_hash, htlc.htlc_id, htlc.amount_msat) + self.lnworker.htlc_fulfilled(self, htlc.payment_hash, htlc.htlc_id) failed = self.hm.failed_in_ctn(new_ctn) for htlc in failed: try: t@@ -1004,7 +1004,7 @@ class Channel(AbstractChannel): if self.lnworker.get_payment_info(htlc.payment_hash) is None: self.save_fail_htlc_reason(htlc.htlc_id, error_bytes, failure_message) else: - self.lnworker.htlc_failed(self, htlc.payment_hash, htlc.htlc_id, htlc.amount_msat, error_bytes, failure_message) + self.lnworker.htlc_failed(self, htlc.payment_hash, htlc.htlc_id, error_bytes, failure_message) def save_fail_htlc_reason( self, t@@ -1049,7 +1049,7 @@ class Channel(AbstractChannel): info = self.lnworker.get_payment_info(payment_hash) if info is not None and info.status != PR_PAID: if is_sent: - self.lnworker.htlc_fulfilled(self, payment_hash, htlc.htlc_id, htlc.amount_msat) + self.lnworker.htlc_fulfilled(self, payment_hash, htlc.htlc_id) else: # FIXME #self.lnworker.htlc_received(self, payment_hash) DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py t@@ -658,7 +658,7 @@ class LNWallet(LNWorker): self._channels[bfh(channel_id)] = Channel(c, sweep_address=self.sweep_address, lnworker=self) self.sent_htlcs = defaultdict(asyncio.Queue) # type: Dict[bytes, asyncio.Queue[HtlcLog]] - self.sent_htlcs_routes = dict() # (RHASH, scid, htlc_id) -> route + self.sent_htlcs_routes = dict() # (RHASH, scid, htlc_id) -> route, amount_for_receiver self.received_htlcs = dict() # RHASH -> mpp_status, htlc_set self.swap_manager = SwapManager(wallet=self.wallet, lnworker=self) t@@ -1166,7 +1166,7 @@ class LNWallet(LNWorker): min_final_cltv_expiry=min_cltv_expiry, payment_secret=payment_secret, fwd_trampoline_onion=trampoline_onion) - self.sent_htlcs_routes[(payment_hash, short_channel_id, htlc.htlc_id)] = route + self.sent_htlcs_routes[(payment_hash, short_channel_id, htlc.htlc_id)] = route, amount_msat util.trigger_callback('htlc_added', chan, htlc, SENT) def handle_error_code_from_failed_htlc(self, htlc_log): t@@ -1739,11 +1739,11 @@ class LNWallet(LNWorker): info = info._replace(status=status) self.save_payment_info(info) - def htlc_fulfilled(self, chan, payment_hash: bytes, htlc_id:int, amount_msat:int): + def htlc_fulfilled(self, chan, payment_hash: bytes, htlc_id:int): util.trigger_callback('htlc_fulfilled', payment_hash, chan.channel_id) q = self.sent_htlcs.get(payment_hash) if q: - route = self.sent_htlcs_routes[(payment_hash, chan.short_channel_id, htlc_id)] + route, amount_msat = self.sent_htlcs_routes[(payment_hash, chan.short_channel_id, htlc_id)] htlc_log = HtlcLog( success=True, route=route, t@@ -1759,14 +1759,13 @@ class LNWallet(LNWorker): chan: Channel, payment_hash: bytes, htlc_id: int, - amount_msat:int, error_bytes: Optional[bytes], failure_message: Optional['OnionRoutingFailure']): util.trigger_callback('htlc_failed', payment_hash, chan.channel_id) q = self.sent_htlcs.get(payment_hash) if q: - route = self.sent_htlcs_routes[(payment_hash, chan.short_channel_id, htlc_id)] + route, amount_msat = self.sent_htlcs_routes[(payment_hash, chan.short_channel_id, htlc_id)] if error_bytes: # TODO "decode_onion_error" might raise, catch and maybe blacklist/penalise someone? try: DIR diff --git a/electrum/tests/test_lnpeer.py b/electrum/tests/test_lnpeer.py t@@ -134,7 +134,7 @@ class MockLNWallet(Logger, NetworkRetryManager[LNPeerAddr]): self.enable_htlc_settle.set() self.received_htlcs = dict() self.sent_htlcs = defaultdict(asyncio.Queue) - self.sent_htlcs_routes = defaultdict(list) + self.sent_htlcs_routes = dict() def get_invoice_status(self, key): pass t@@ -498,26 +498,24 @@ class TestPeer(ElectrumTestCase): # alice sends htlc BUT NOT COMMITMENT_SIGNED p1.maybe_send_commitment = lambda x: None route1, amount_msat1 = w1.create_routes_from_invoice(lnaddr2.get_amount_msat(), decoded_invoice=lnaddr2)[0] - p1.pay( + await w1.pay_to_route( route=route1, - chan=alice_channel, amount_msat=lnaddr2.get_amount_msat(), total_msat=lnaddr2.get_amount_msat(), payment_hash=lnaddr2.paymenthash, - min_final_cltv_expiry=lnaddr2.get_min_final_cltv_expiry(), + min_cltv_expiry=lnaddr2.get_min_final_cltv_expiry(), payment_secret=lnaddr2.payment_secret, ) p1.maybe_send_commitment = _maybe_send_commitment1 # bob sends htlc BUT NOT COMMITMENT_SIGNED p2.maybe_send_commitment = lambda x: None route2, amount_msat2 = w2.create_routes_from_invoice(lnaddr1.get_amount_msat(), decoded_invoice=lnaddr1)[0] - p2.pay( + await w2.pay_to_route( route=route2, - chan=bob_channel, amount_msat=lnaddr1.get_amount_msat(), total_msat=lnaddr1.get_amount_msat(), payment_hash=lnaddr1.paymenthash, - min_final_cltv_expiry=lnaddr1.get_min_final_cltv_expiry(), + min_cltv_expiry=lnaddr1.get_min_final_cltv_expiry(), payment_secret=lnaddr1.payment_secret, ) p2.maybe_send_commitment = _maybe_send_commitment2