URI: 
       tlnchannel: save htlc preimages as soon as possible but horribly hacky - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit ef7a59b4a97fddcdf354f8a3a599714fbe4e6284
   DIR parent 7292da24e6fa2813056f9d0843af568c6eb0a413
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Tue, 26 Feb 2019 21:28:11 +0100
       
       lnchannel: save htlc preimages as soon as possible but horribly hacky
       
       will properly clean this up...
       
       Diffstat:
         M electrum/lnchannel.py               |      19 +++++++++++--------
         M electrum/lnpeer.py                  |       2 ++
         M electrum/lnworker.py                |       8 ++++----
       
       3 files changed, 17 insertions(+), 12 deletions(-)
       ---
   DIR diff --git a/electrum/lnchannel.py b/electrum/lnchannel.py
       t@@ -28,6 +28,7 @@ import binascii
        import json
        from enum import Enum, auto
        from typing import Optional, Dict, List, Tuple, NamedTuple, Set, Callable, Iterable, Sequence
       +import time
        
        from . import ecc
        from .util import bfh, PrintError, bh2u
       t@@ -120,10 +121,9 @@ class Channel(PrintError):
                    return super().diagnostic_name()
        
            def __init__(self, state, *, sweep_address=None, name=None,
       -                 payment_completed: Optional[Callable[['Channel', Direction, UpdateAddHtlc, bytes], None]] = None):
       -        self.preimages = {}
       +                 payment_completed: Optional[Callable[['Channel', Direction, UpdateAddHtlc], None]] = None):
                if not payment_completed:
       -            payment_completed = lambda this, x, y, z: None
       +            payment_completed = lambda this, x, y: None
                self.sweep_address = sweep_address
                self.payment_completed = payment_completed
                assert 'local_state' not in state
       t@@ -438,10 +438,9 @@ class Channel(PrintError):
                received = self.hm.received_in_ctn(self.config[LOCAL].ctn)
                sent = self.hm.sent_in_ctn(self.config[LOCAL].ctn)
                for htlc in received:
       -            self.payment_completed(self, RECEIVED, htlc, None)
       +            self.payment_completed(self, RECEIVED, htlc)
                for htlc in sent:
       -            preimage = self.preimages.pop(htlc.htlc_id)
       -            self.payment_completed(self, SENT, htlc, preimage)
       +            self.payment_completed(self, SENT, htlc)
                received_this_batch = htlcsum(received)
                sent_this_batch = htlcsum(sent)
        
       t@@ -625,8 +624,12 @@ class Channel(PrintError):
                assert htlc.payment_hash == sha256(preimage)
                assert htlc_id not in log['settles']
                self.hm.recv_settle(htlc_id)
       -        self.preimages[htlc_id] = preimage
       -        # we don't save the preimage because we don't need to forward it anyway
       +        try:
       +            self.save_preimage(htlc.payment_hash, preimage, timestamp=int(time.time()))
       +        except AttributeError as e:
       +            # save_preimage is not defined in the unit tests... this is ugly as hell. FIXME
       +            import traceback
       +            traceback.print_exc()
        
            def fail_htlc(self, htlc_id):
                self.print_error("fail_htlc")
   DIR diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py
       t@@ -379,6 +379,7 @@ class Peer(PrintError):
                               payment_completed=self.lnworker.payment_completed)
                chan.lnwatcher = self.lnwatcher
                chan.get_preimage = self.lnworker.get_preimage  # FIXME hack.
       +        chan.save_preimage = self.lnworker.save_preimage  # FIXME hack.
                sig_64, _ = chan.sign_next_commitment()
                self.send_message("funding_created",
                    temporary_channel_id=temp_channel_id,
       t@@ -472,6 +473,7 @@ class Peer(PrintError):
                               payment_completed=self.lnworker.payment_completed)
                chan.lnwatcher = self.lnwatcher
                chan.get_preimage = self.lnworker.get_preimage  # FIXME hack.
       +        chan.save_preimage = self.lnworker.save_preimage  # FIXME hack.
                remote_sig = funding_created['signature']
                chan.receive_new_commitment(remote_sig, [])
                sig_64, _ = chan.sign_next_commitment()
   DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py
       t@@ -79,7 +79,8 @@ class LNWorker(PrintError):
                self.channels = {}  # type: Dict[bytes, Channel]
                for x in wallet.storage.get("channels", []):
                    c = Channel(x, sweep_address=self.sweep_address, payment_completed=self.payment_completed)
       -            c.get_preimage = self.get_preimage
       +            c.get_preimage = self.get_preimage  # FIXME hack.
       +            c.save_preimage = self.save_preimage  # FIXME hack.
                    self.channels[c.channel_id] = c
                    c.set_remote_commitment()
                    c.set_local_commitment(c.current_commitment(LOCAL))
       t@@ -126,11 +127,10 @@ class LNWorker(PrintError):
                    self.print_error('saved lightning gossip timestamp')
        
            def payment_completed(self, chan: Channel, direction: Direction,
       -                          htlc: UpdateAddHtlc, preimage: Optional[bytes]):
       +                          htlc: UpdateAddHtlc):
                chan_id = chan.channel_id
       -        preimage = preimage if preimage else self.get_preimage(htlc.payment_hash)
       +        preimage = self.get_preimage(htlc.payment_hash)
                timestamp = int(time.time())
       -        self.save_preimage(htlc.payment_hash, preimage, timestamp=timestamp)
                self.network.trigger_callback('ln_payment_completed', timestamp, direction, htlc, preimage, chan_id)
        
            def get_invoice_status(self, payment_hash):