tfollow-up prev: don't reuse funding tx change address for static_remotekey - electrum - Electrum Bitcoin wallet
 (HTM) git clone https://git.parazyd.org/electrum
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
       ---
 (DIR) commit 530a446172ac244a7a96b277edfeae9fffa65c1d
 (DIR) parent 6040e953a32803a65a10f62d4f7ac815d1a9e590
 (HTM) Author: SomberNight <somber.night@protonmail.com>
       Date:   Fri, 22 May 2020 17:11:53 +0200
       
       follow-up prev: don't reuse funding tx change address for static_remotekey
       
       see comment in code
       
       Diffstat:
         M electrum/lnpeer.py                  |      29 +++++++++++++++++++++++++++--
         M electrum/lnworker.py                |       2 +-
       
       2 files changed, 28 insertions(+), 3 deletions(-)
       ---
 (DIR) diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py
       t@@ -517,9 +517,34 @@ class Peer(Logger):
                )
                return local_config
        
       +    def temporarily_reserve_funding_tx_change_address(func):
       +        # During the channel open flow, if we initiated, we might have used a change address
       +        # of ours in the funding tx. The funding tx is not part of the wallet history
       +        # at that point yet, but we should already consider this change address as 'used'.
       +        async def wrapper(self: 'Peer', *args, **kwargs):
       +            funding_tx = kwargs['funding_tx']  # type: PartialTransaction
       +            wallet = self.lnworker.wallet
       +            change_addresses = [txout.address for txout in funding_tx.outputs()
       +                                if wallet.is_change(txout.address)]
       +            for addr in change_addresses:
       +                wallet.set_reserved_state_of_address(addr, reserved=True)
       +            try:
       +                return await func(self, *args, **kwargs)
       +            finally:
       +                for addr in change_addresses:
       +                    self.lnworker.wallet.set_reserved_state_of_address(addr, reserved=False)
       +        return wrapper
       +
            @log_exceptions
       -    async def channel_establishment_flow(self, password: Optional[str], funding_tx: 'PartialTransaction', funding_sat: int,
       -                                         push_msat: int, temp_channel_id: bytes) -> Tuple[Channel, 'PartialTransaction']:
       +    @temporarily_reserve_funding_tx_change_address
       +    async def channel_establishment_flow(
       +            self, *,
       +            password: Optional[str],
       +            funding_tx: 'PartialTransaction',
       +            funding_sat: int,
       +            push_msat: int,
       +            temp_channel_id: bytes
       +    ) -> Tuple[Channel, 'PartialTransaction']:
                await asyncio.wait_for(self.initialized, LN_P2P_NETWORK_TIMEOUT)
                feerate = self.lnworker.current_feerate_per_kw()
                local_config = self.make_local_config(funding_sat, push_msat, LOCAL)
 (DIR) diff --git a/electrum/lnworker.py b/electrum/lnworker.py
       t@@ -749,7 +749,7 @@ class LNWallet(LNWorker):
                # will raise if init fails
                await asyncio.wait_for(peer.initialized, LN_P2P_NETWORK_TIMEOUT)
                chan, funding_tx = await peer.channel_establishment_flow(
       -            password,
       +            password=password,
                    funding_tx=funding_tx,
                    funding_sat=funding_sat,
                    push_msat=push_sat * 1000,