diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py index ba8d3e5dd..69ab48c02 100644 --- a/electrum/lnpeer.py +++ b/electrum/lnpeer.py @@ -24,6 +24,7 @@ from . import bitcoin, util from . import constants from .util import (bfh, log_exceptions, ignore_exceptions, chunks, OldTaskGroup, UnrelatedTransactionException, error_text_bytes_to_safe_str, AsyncHangDetector) +from .util import event_listener, EventListener from . import transaction from .bitcoin import make_op_return, DummyAddress from .transaction import PartialTxOutput, match_script_against_template, Sighash @@ -64,7 +65,7 @@ if TYPE_CHECKING: LN_P2P_NETWORK_TIMEOUT = 20 -class Peer(Logger): +class Peer(Logger, EventListener): # note: in general this class is NOT thread-safe. Most methods are assumed to be running on asyncio thread. LOGGING_SHORTCUT = 'P' @@ -122,6 +123,7 @@ class Peer(Logger): self._received_revack_event = asyncio.Event() self.received_commitsig_event = asyncio.Event() self.downstream_htlc_resolved_event = asyncio.Event() + self.register_callbacks() def send_message(self, message_name: str, **kwargs): assert util.get_running_loop() == util.get_asyncio_loop(), f"this must be run on the asyncio thread!" @@ -633,6 +635,7 @@ class Peer(Logger): # note: This method might get called multiple times! # E.g. if you call close_and_cleanup() to cause a disconnection from the peer, # it will get called a second time in handle_disconnect(). + self.unregister_callbacks() try: if self.transport: self.transport.close() @@ -2251,6 +2254,13 @@ class Peer(Logger): self._received_revack_event.set() self._received_revack_event.clear() + @event_listener + async def on_event_fee(self, *args): + async def async_wrapper(): + for chan in self.channels.values(): + self.maybe_update_fee(chan) + await self.taskgroup.spawn(async_wrapper) + def on_update_fee(self, chan: Channel, payload): if chan.peer_state != PeerState.GOOD: # should never happen raise Exception(f"received update_fee in unexpected {chan.peer_state=!r}")