URI: 
       tlnchan: replace properties with functions - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 78896897cbb0678e2983582714484b163902d998
   DIR parent c339eabd31e6e516f0c37355d1a9442e4c230e48
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Wed, 21 Nov 2018 15:32:36 +0100
       
       lnchan: replace properties with functions
       
       Diffstat:
         M electrum/lnbase.py                  |       4 ++--
         M electrum/lnchan.py                  |      42 +++++++++++++------------------
         M electrum/tests/test_lnchan.py       |      10 +++++-----
       
       3 files changed, 24 insertions(+), 32 deletions(-)
       ---
   DIR diff --git a/electrum/lnbase.py b/electrum/lnbase.py
       t@@ -512,7 +512,7 @@ class Peer(PrintError):
                chan.receive_new_commitment(remote_sig, [])
                # broadcast funding tx
                await self.network.broadcast_transaction(funding_tx)
       -        chan.remote_commitment_to_be_revoked = chan.pending_remote_commitment
       +        chan.remote_commitment_to_be_revoked = chan.pending_remote_commitment()
                chan.config[REMOTE] = chan.config[REMOTE]._replace(ctn=0)
                chan.config[LOCAL] = chan.config[LOCAL]._replace(ctn=0, current_commitment_signature=remote_sig)
                chan.set_state('OPENING')
       t@@ -598,7 +598,7 @@ class Peer(PrintError):
                    signature=sig_64,
                )
                chan.set_state('OPENING')
       -        chan.remote_commitment_to_be_revoked = chan.pending_remote_commitment
       +        chan.remote_commitment_to_be_revoked = chan.pending_remote_commitment()
                chan.config[REMOTE] = chan.config[REMOTE]._replace(ctn=0)
                chan.config[LOCAL] = chan.config[LOCAL]._replace(ctn=0, current_commitment_signature=remote_sig)
                self.lnworker.save_channel(chan)
   DIR diff --git a/electrum/lnchan.py b/electrum/lnchan.py
       t@@ -189,8 +189,8 @@ class Channel(PrintError):
        
                self.pending_fee = None
        
       -        self.local_commitment = self.pending_local_commitment
       -        self.remote_commitment = self.pending_remote_commitment
       +        self.local_commitment = self.pending_commitment(LOCAL)
       +        self.remote_commitment = self.pending_commitment(REMOTE)
        
                self._is_funding_txo_spent = None  # "don't know"
                self._state = None
       t@@ -296,7 +296,7 @@ class Channel(PrintError):
        
                old_logs = dict(self.lock_in_htlc_changes(LOCAL))
        
       -        pending_remote_commitment = self.pending_remote_commitment
       +        pending_remote_commitment = self.pending_commitment(REMOTE)
                sig_64 = sign_and_get_sig_string(pending_remote_commitment, self.config[LOCAL], self.config[REMOTE])
        
                their_remote_htlc_privkey_number = derive_privkey(
       t@@ -357,7 +357,7 @@ class Channel(PrintError):
        
                assert len(htlc_sigs) == 0 or type(htlc_sigs[0]) is bytes
        
       -        pending_local_commitment = self.pending_local_commitment
       +        pending_local_commitment = self.pending_commitment(LOCAL)
                preimage_hex = pending_local_commitment.serialize_preimage(0)
                pre_hash = sha256d(bfh(preimage_hex))
                if not ecc.verify_signature(self.config[REMOTE].multisig_key.pubkey, sig, pre_hash):
       t@@ -386,8 +386,8 @@ class Channel(PrintError):
                self.process_new_offchain_ctx(pending_local_commitment, ours=True)
        
            def verify_htlc(self, htlc, htlc_sigs, we_receive):
       -        _, this_point, _ = self.points
       -        _script, htlc_tx = make_htlc_tx_with_open_channel(self, this_point, True, we_receive, self.pending_local_commitment, htlc)
       +        _, this_point, _ = self.points()
       +        _script, htlc_tx = make_htlc_tx_with_open_channel(self, this_point, True, we_receive, self.pending_commitment(LOCAL), htlc)
                pre_hash = sha256d(bfh(htlc_tx.serialize_preimage(0)))
                remote_htlc_pubkey = derive_pubkey(self.config[REMOTE].htlc_basepoint.pubkey, this_point)
                for idx, sig in enumerate(htlc_sigs):
       t@@ -399,7 +399,7 @@ class Channel(PrintError):
            def revoke_current_commitment(self):
                self.print_error("revoke_current_commitment")
        
       -        last_secret, this_point, next_point = self.points
       +        last_secret, this_point, next_point = self.points()
        
                new_feerate = self.constraints.feerate
        
       t@@ -420,11 +420,10 @@ class Channel(PrintError):
                    feerate=new_feerate
                )
        
       -        self.local_commitment = self.pending_local_commitment
       +        self.local_commitment = self.pending_commitment(LOCAL)
        
                return RevokeAndAck(last_secret, next_point), "current htlcs"
        
       -    @property
            def points(self):
                last_small_num = self.config[LOCAL].ctn
                this_small_num = last_small_num + 1
       t@@ -486,7 +485,7 @@ class Channel(PrintError):
                # FIXME not sure this is correct... but it seems to work
                # if there are update_add_htlc msgs between commitment_signed and rev_ack,
                # this might break
       -        prev_remote_commitment = self.pending_remote_commitment
       +        prev_remote_commitment = self.pending_commitment(REMOTE)
        
                self.config[REMOTE].revocation_store.add_next_entry(revocation.per_commitment_secret)
                self.process_new_revocation_secret(revocation.per_commitment_secret)
       t@@ -531,8 +530,8 @@ class Channel(PrintError):
                    if self.constraints.is_initiator:
                        self.pending_fee[FUNDEE_ACKED] = True
        
       -        self.local_commitment = self.pending_local_commitment
       -        self.remote_commitment = self.pending_remote_commitment
       +        self.local_commitment = self.pending_commitment(LOCAL)
       +        self.remote_commitment = self.pending_commitment(REMOTE)
                self.remote_commitment_to_be_revoked = prev_remote_commitment
                return received_this_batch, sent_this_batch
        
       t@@ -601,11 +600,6 @@ class Channel(PrintError):
                fee_for_htlc = lambda htlc: htlc.amount_msat // 1000 - (weight * feerate // 1000)
                return filter(lambda htlc: fee_for_htlc(htlc) >= conf.dust_limit_sat, htlcs)
        
       -    @property
       -    def pending_remote_commitment(self):
       -        this_point = self.config[REMOTE].next_per_commitment_point
       -        return self.make_commitment(REMOTE, this_point)
       -
            def pending_feerate(self, subject):
                candidate = self.constraints.feerate
                if self.pending_fee is not None:
       t@@ -614,10 +608,9 @@ class Channel(PrintError):
                        candidate = x
                return candidate
        
       -    @property
       -    def pending_local_commitment(self):
       -        _, this_point, _ = self.points
       -        return self.make_commitment(LOCAL, this_point)
       +    def pending_commitment(self, subject):
       +        this_point = self.config[REMOTE].next_per_commitment_point if subject == REMOTE else self.points()[1]
       +        return self.make_commitment(subject, this_point)
        
            def total_msat(self, sub):
                return sum(self.settled[sub])
       t@@ -677,9 +670,8 @@ class Channel(PrintError):
            def current_height(self):
                return {LOCAL: self.config[LOCAL].ctn, REMOTE: self.config[REMOTE].ctn}
        
       -    @property
            def pending_local_fee(self):
       -        return self.constraints.capacity - sum(x[2] for x in self.pending_local_commitment.outputs())
       +        return self.constraints.capacity - sum(x[2] for x in self.pending_commitment(LOCAL).outputs())
        
            def update_fee(self, feerate, initiator):
                if self.constraints.is_initiator != initiator:
       t@@ -821,7 +813,7 @@ class Channel(PrintError):
                                fee_sat: Optional[int]=None) -> Tuple[bytes, int, str]:
                """ cooperative close """
                if fee_sat is None:
       -            fee_sat = self.pending_local_fee
       +            fee_sat = self.pending_local_fee()
        
                _, outputs = make_commitment_outputs({
                            LOCAL:  fee_sat * 1000 if     self.constraints.is_initiator else 0,
       t@@ -849,7 +841,7 @@ class Channel(PrintError):
                # but in this case, we want the current one. So substract one ctn number
                old_local_state = self.config[LOCAL]
                self.config[LOCAL]=self.config[LOCAL]._replace(ctn=self.config[LOCAL].ctn - 1)
       -        tx = self.pending_local_commitment
       +        tx = self.pending_commitment(LOCAL)
                self.config[LOCAL] = old_local_state
                tx.sign({bh2u(self.config[LOCAL].multisig_key.pubkey): (self.config[LOCAL].multisig_key.privkey, True)})
                remote_sig = self.config[LOCAL].current_commitment_signature
   DIR diff --git a/electrum/tests/test_lnchan.py b/electrum/tests/test_lnchan.py
       t@@ -193,7 +193,7 @@ class TestChannel(unittest.TestCase):
                bob_idx = self.bob_channel.add_htlc(self.htlc_dict)
                alice_idx = self.alice_channel.receive_htlc(self.htlc_dict)
                self.alice_channel.receive_new_commitment(*self.bob_channel.sign_next_commitment())
       -        self.assertEqual(len(self.alice_channel.pending_remote_commitment.outputs()), 3)
       +        self.assertEqual(len(self.alice_channel.pending_commitment(REMOTE).outputs()), 3)
        
            def test_SimpleAddSettleWorkflow(self):
                alice_channel, bob_channel = self.alice_channel, self.bob_channel
       t@@ -577,13 +577,13 @@ class TestChanReserve(unittest.TestCase):
                bob_idx = self.bob_channel.receive_htlc(htlc_dict)
                force_state_transition(self.alice_channel, self.bob_channel)
                self.check_bals(one_bitcoin_in_msat*3\
       -                - self.alice_channel.pending_local_fee,
       +                - self.alice_channel.pending_local_fee(),
                          one_bitcoin_in_msat*5)
                self.bob_channel.settle_htlc(paymentPreimage, bob_idx)
                self.alice_channel.receive_htlc_settle(paymentPreimage, alice_idx)
                force_state_transition(self.alice_channel, self.bob_channel)
                self.check_bals(one_bitcoin_in_msat*3\
       -                - self.alice_channel.pending_local_fee,
       +                - self.alice_channel.pending_local_fee(),
                          one_bitcoin_in_msat*7)
                # And now let Bob add an HTLC of 1 BTC. This will take Bob's balance
                # all the way down to his channel reserve, but since he is not paying
       t@@ -593,7 +593,7 @@ class TestChanReserve(unittest.TestCase):
                self.alice_channel.receive_htlc(htlc_dict)
                force_state_transition(self.alice_channel, self.bob_channel)
                self.check_bals(one_bitcoin_in_msat*3\
       -                - self.alice_channel.pending_local_fee,
       +                - self.alice_channel.pending_local_fee(),
                          one_bitcoin_in_msat*6)
        
            def check_bals(self, amt1, amt2):
       t@@ -624,7 +624,7 @@ class TestDust(unittest.TestCase):
                self.assertEqual(len(alice_channel.local_commitment.outputs()), 3)
                self.assertEqual(len(bob_channel.local_commitment.outputs()), 2)
                default_fee = calc_static_fee(0)
       -        self.assertEqual(bob_channel.pending_local_fee, default_fee + htlcAmt)
       +        self.assertEqual(bob_channel.pending_local_fee(), default_fee + htlcAmt)
                bob_channel.settle_htlc(paymentPreimage, bobHtlcIndex)
                alice_channel.receive_htlc_settle(paymentPreimage, aliceHtlcIndex)
                force_state_transition(bob_channel, alice_channel)