URI: 
       tcode refactoring: _maybe_fullfill_htlc, _maybe_forward_htlc - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 86b33a563781a6f30d8ad4d85b1bcb38e667f773
   DIR parent 5d26f51ad09ddc4dd8eb3d48d25bf2e76de17e4d
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Mon, 11 Feb 2019 16:31:50 +0100
       
       code refactoring: _maybe_fullfill_htlc, _maybe_forward_htlc
       
       Diffstat:
         M electrum/lnpeer.py                  |      82 ++++++++++++++++---------------
       
       1 file changed, 43 insertions(+), 39 deletions(-)
       ---
   DIR diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py
       t@@ -917,45 +917,50 @@ class Peer(PrintError):
                htlc = {'amount_msat': amount_msat_htlc, 'payment_hash':payment_hash, 'cltv_expiry':cltv_expiry}
                htlc_id = chan.receive_htlc(htlc)
                local_ctn = chan.get_current_ctn(LOCAL)
       -        asyncio.ensure_future(self._on_update_add_htlc(chan, local_ctn, htlc_id, htlc, payment_hash, cltv_expiry, amount_msat_htlc, processed_onion))
       +        if processed_onion.are_we_final:
       +            asyncio.ensure_future(self._maybe_fulfill_htlc(chan, local_ctn, htlc_id, htlc, payment_hash, cltv_expiry, amount_msat_htlc, processed_onion))
       +        else:
       +            asyncio.ensure_future(self._maybe_forward_htlc(chan, local_ctn, htlc_id, htlc, payment_hash, cltv_expiry, amount_msat_htlc, processed_onion))
        
       -    @log_exceptions
       -    async def _on_update_add_htlc(self, chan, local_ctn, htlc_id, htlc, payment_hash, cltv_expiry, amount_msat_htlc, processed_onion):
       +    @log_exceptions 
       +    async def _maybe_forward_htlc(self, chan, local_ctn, htlc_id, htlc, payment_hash, cltv_expiry, amount_msat_htlc, processed_onion):
                await self.await_local(chan, local_ctn)
                # Forward HTLC
                # FIXME: this is not robust to us going offline before payment is fulfilled
       -        if not processed_onion.are_we_final:
       -            dph = processed_onion.hop_data.per_hop
       -            next_chan = self.lnworker.get_channel_by_short_id(dph.short_channel_id)
       -            next_peer = self.lnworker.peers[next_chan.node_id]
       -            if next_chan is None or next_chan.get_state() != 'OPEN':
       -                self.print_error("cannot forward htlc", next_chan.get_state() if next_chan else None)
       -                reason = OnionRoutingFailureMessage(code=OnionFailureCode.PERMANENT_CHANNEL_FAILURE, data=b'')
       -                await self.fail_htlc(chan, htlc_id, onion_packet, reason)
       -                return
       -            self.print_error('forwarding htlc to', next_chan.node_id)
       -            next_cltv_expiry = int.from_bytes(dph.outgoing_cltv_value, 'big')
       -            next_amount_msat_htlc = int.from_bytes(dph.amt_to_forward, 'big')
       -            next_htlc = {'amount_msat':next_amount_msat_htlc, 'payment_hash':payment_hash, 'cltv_expiry':next_cltv_expiry}
       -            next_htlc_id = next_chan.add_htlc(next_htlc)
       -            next_remote_ctn = next_chan.get_current_ctn(REMOTE)
       -            next_peer.send_message(
       -                "update_add_htlc",
       -                channel_id=next_chan.channel_id,
       -                id=next_htlc_id,
       -                cltv_expiry=dph.outgoing_cltv_value,
       -                amount_msat=dph.amt_to_forward,
       -                payment_hash=payment_hash,
       -                onion_routing_packet=processed_onion.next_packet.to_bytes()
       -            )
       -            next_peer.pending_updates[next_chan] = True
       -            await next_peer.await_remote(next_chan, next_remote_ctn)
       -            # wait until we get paid
       -            preimage = await next_peer.payment_preimages[payment_hash].get()
       -            # fulfill the original htlc
       -            await self.fulfill_htlc(chan, htlc_id, preimage)
       -            self.print_error("htlc forwarded successfully")
       +        dph = processed_onion.hop_data.per_hop
       +        next_chan = self.lnworker.get_channel_by_short_id(dph.short_channel_id)
       +        next_peer = self.lnworker.peers[next_chan.node_id]
       +        if next_chan is None or next_chan.get_state() != 'OPEN':
       +            self.print_error("cannot forward htlc", next_chan.get_state() if next_chan else None)
       +            reason = OnionRoutingFailureMessage(code=OnionFailureCode.PERMANENT_CHANNEL_FAILURE, data=b'')
       +            await self.fail_htlc(chan, htlc_id, onion_packet, reason)
                    return
       +        self.print_error('forwarding htlc to', next_chan.node_id)
       +        next_cltv_expiry = int.from_bytes(dph.outgoing_cltv_value, 'big')
       +        next_amount_msat_htlc = int.from_bytes(dph.amt_to_forward, 'big')
       +        next_htlc = {'amount_msat':next_amount_msat_htlc, 'payment_hash':payment_hash, 'cltv_expiry':next_cltv_expiry}
       +        next_htlc_id = next_chan.add_htlc(next_htlc)
       +        next_remote_ctn = next_chan.get_current_ctn(REMOTE)
       +        next_peer.send_message(
       +            "update_add_htlc",
       +            channel_id=next_chan.channel_id,
       +            id=next_htlc_id,
       +            cltv_expiry=dph.outgoing_cltv_value,
       +            amount_msat=dph.amt_to_forward,
       +            payment_hash=payment_hash,
       +            onion_routing_packet=processed_onion.next_packet.to_bytes()
       +        )
       +        next_peer.pending_updates[next_chan] = True
       +        await next_peer.await_remote(next_chan, next_remote_ctn)
       +        # wait until we get paid
       +        preimage = await next_peer.payment_preimages[payment_hash].get()
       +        # fulfill the original htlc
       +        await self._fulfill_htlc(chan, htlc_id, preimage)
       +        self.print_error("htlc forwarded successfully")
       +
       +    @log_exceptions
       +    async def _maybe_fulfill_htlc(self, chan, local_ctn, htlc_id, htlc, payment_hash, cltv_expiry, amount_msat_htlc, processed_onion):
       +        await self.await_local(chan, local_ctn)
                try:
                    preimage, invoice = self.lnworker.get_invoice(payment_hash)
                except UnknownPaymentHash:
       t@@ -986,12 +991,11 @@ class Peer(PrintError):
                    await self.fail_htlc(chan, htlc_id, onion_packet, reason)
                    return
                self.network.trigger_callback('htlc_added', UpdateAddHtlc(**htlc, htlc_id=htlc_id), invoice, RECEIVED)
       -        # settle htlc
       -        if not self.network.config.debug_lightning_do_not_settle:
       -            # settle htlc
       -            await self.fulfill_htlc(chan, htlc_id, preimage)
       +        if self.network.config.debug_lightning_do_not_settle:
       +            return
       +        await self._fulfill_htlc(chan, htlc_id, preimage)
        
       -    async def fulfill_htlc(self, chan: Channel, htlc_id: int, preimage: bytes):
       +    async def _fulfill_htlc(self, chan: Channel, htlc_id: int, preimage: bytes):
                chan.settle_htlc(preimage, htlc_id)
                remote_ctn = chan.get_current_ctn(REMOTE)
                self.send_message("update_fulfill_htlc",