commit 530a446172ac244a7a96b277edfeae9fffa65c1d
parent 6040e953a32803a65a10f62d4f7ac815d1a9e590
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:
2 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py
@@ -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)
diff --git a/electrum/lnworker.py b/electrum/lnworker.py
@@ -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,