URI: 
       tlightning: do not handle more than one fee update at a time - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 5422de90a2e3f0840fe8604a03eca3bfef29ba63
   DIR parent 1352b0ce9f3549f9bdb98a68dac87235c6ec4e7e
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Mon, 12 Nov 2018 11:55:13 +0100
       
       lightning: do not handle more than one fee update at a time
       
       Diffstat:
         M electrum/lnbase.py                  |       5 +++--
         M electrum/lnchan.py                  |      56 ++++++++++++++-----------------
       
       2 files changed, 28 insertions(+), 33 deletions(-)
       ---
   DIR diff --git a/electrum/lnbase.py b/electrum/lnbase.py
       t@@ -1103,7 +1103,8 @@ class Peer(PrintError):
        
            def on_update_fee(self, payload):
                channel_id = payload["channel_id"]
       -        self.channels[channel_id].receive_update_fee(int.from_bytes(payload["feerate_per_kw"], "big"))
       +        feerate =int.from_bytes(payload["feerate_per_kw"], "big")
       +        self.channels[channel_id].update_fee(feerate, False)
        
            async def bitcoin_fee_update(self, chan: Channel):
                """
       t@@ -1122,7 +1123,7 @@ class Peer(PrintError):
                    self.print_error("FEES HAVE RISEN")
                else:
                    return
       -        chan.update_fee(feerate_per_kw)
       +        chan.update_fee(feerate_per_kw, True)
                await self.update_channel(chan, "update_fee", channel_id=chan.channel_id, feerate_per_kw=feerate_per_kw)
        
            def current_feerate_per_kw(self):
   DIR diff --git a/electrum/lnchan.py b/electrum/lnchan.py
       t@@ -187,7 +187,7 @@ class Channel(PrintError):
        
                self.name = name
        
       -        self.fee_mgr = []
       +        self.pending_fee = None
        
                self.local_commitment = self.pending_local_commitment
                self.remote_commitment = self.pending_remote_commitment
       t@@ -377,11 +377,11 @@ class Channel(PrintError):
                    current_commitment_signature=sig,
                    current_htlc_signatures=htlc_sigs_string)
        
       -        for pending_fee in self.fee_mgr:
       +        if self.pending_fee:
                    if not self.constraints.is_initiator:
       -                pending_fee[FUNDEE_SIGNED] = True
       -            if self.constraints.is_initiator and pending_fee[FUNDEE_ACKED]:
       -                pending_fee[FUNDER_SIGNED] = True
       +                self.pending_fee[FUNDEE_SIGNED] = True
       +            if self.constraints.is_initiator and self.pending_fee[FUNDEE_ACKED]:
       +                self.pending_fee[FUNDER_SIGNED] = True
        
                self.process_new_offchain_ctx(pending_local_commitment, ours=True)
        
       t@@ -403,14 +403,14 @@ class Channel(PrintError):
        
                new_feerate = self.constraints.feerate
        
       -        for pending_fee in self.fee_mgr[:]:
       -            if not self.constraints.is_initiator and pending_fee[FUNDEE_SIGNED]:
       -                new_feerate = pending_fee.rate
       -                self.fee_mgr.remove(pending_fee)
       +        if self.pending_fee:
       +            if not self.constraints.is_initiator and self.pending_fee[FUNDEE_SIGNED]:
       +                new_feerate = self.pending_fee.rate
       +                self.pending_fee = None
                        print("FEERATE CHANGE COMPLETE (non-initiator)")
       -            if self.constraints.is_initiator and pending_fee[FUNDER_SIGNED]:
       -                new_feerate = pending_fee.rate
       -                self.fee_mgr.remove(pending_fee)
       +            if self.constraints.is_initiator and self.pending_fee[FUNDER_SIGNED]:
       +                new_feerate = self.pending_fee.rate
       +                self.pending_fee = None
                        print("FEERATE CHANGE COMPLETE (initiator)")
        
                self.config[LOCAL]=self.config[LOCAL]._replace(
       t@@ -477,11 +477,11 @@ class Channel(PrintError):
                    self.log = old_logs
                    raise Exception('revoked secret not for current point')
        
       -        for pending_fee in self.fee_mgr:
       +        if self.pending_fee:
                    if not self.constraints.is_initiator:
       -                pending_fee[FUNDEE_SIGNED] = True
       +                self.pending_fee[FUNDEE_SIGNED] = True
                    if self.constraints.is_initiator and pending_fee[FUNDEE_ACKED]:
       -                pending_fee[FUNDER_SIGNED] = True
       +                self.pending_fee[FUNDER_SIGNED] = True
        
                # FIXME not sure this is correct... but it seems to work
                # if there are update_add_htlc msgs between commitment_signed and rev_ack,
       t@@ -527,9 +527,9 @@ class Channel(PrintError):
                    amount_msat = self.config[LOCAL].amount_msat + (received_this_batch - sent_this_batch)
                )
        
       -        for pending_fee in self.fee_mgr:
       +        if self.pending_fee:
                    if self.constraints.is_initiator:
       -                pending_fee[FUNDEE_ACKED] = True
       +                self.pending_fee[FUNDEE_ACKED] = True
        
                self.local_commitment = self.pending_local_commitment
                self.remote_commitment = self.pending_remote_commitment
       t@@ -608,11 +608,10 @@ class Channel(PrintError):
        
            def pending_feerate(self, subject):
                candidate = self.constraints.feerate
       -        for pending_fee in self.fee_mgr:
       -            x = pending_fee.pending_feerate(subject)
       +        if self.pending_fee:
       +            x = self.pending_fee.pending_feerate(subject)
                    if x is not None:
                        candidate = x
       -
                return candidate
        
            @property
       t@@ -682,17 +681,12 @@ class Channel(PrintError):
            def pending_local_fee(self):
                return self.constraints.capacity - sum(x[2] for x in self.pending_local_commitment.outputs())
        
       -    def update_fee(self, feerate):
       -        if not self.constraints.is_initiator:
       -            raise Exception("only initiator can update_fee, this counterparty is not initiator")
       -        pending_fee = FeeUpdate(self, rate=feerate)
       -        self.fee_mgr.append(pending_fee)
       -
       -    def receive_update_fee(self, feerate):
       -        if self.constraints.is_initiator:
       -            raise Exception("only the non-initiator can receive_update_fee, this counterparty is initiator")
       -        pending_fee = FeeUpdate(self, rate=feerate)
       -        self.fee_mgr.append(pending_fee)
       +    def update_fee(self, feerate, initiator):
       +        if self.constraints.is_initiator != initiator:
       +            raise Exception("Cannot update_fee: wrong initiator", initiator)
       +        if self.pending_fee:
       +            raise Exception("a fee update is already in progress")
       +        self.pending_fee = FeeUpdate(self, rate=feerate)
        
            def remove_uncommitted_htlcs_from_log(self, subject):
                """