diff --git a/electrum/gui/kivy/uix/dialogs/settings.py b/electrum/gui/kivy/uix/dialogs/settings.py index ab89d330f..f362ea9e2 100644 --- a/electrum/gui/kivy/uix/dialogs/settings.py +++ b/electrum/gui/kivy/uix/dialogs/settings.py @@ -136,7 +136,7 @@ class SettingsDialog(Factory.Popup): self.wallet = self.app.wallet self.use_encryption = self.wallet.has_password() if self.wallet else False self.has_pin_code = self.app.has_pin_code() - self.enable_toggle_use_recoverable_channels = bool(self.wallet.lnworker and self.wallet.lnworker.has_deterministic_node_id()) + self.enable_toggle_use_recoverable_channels = bool(self.wallet.lnworker and self.wallet.lnworker.can_have_recoverable_channels()) def get_language_name(self) -> str: lang = self.config.get('language') or '' diff --git a/electrum/gui/qt/settings_dialog.py b/electrum/gui/qt/settings_dialog.py index 8b3c2373c..02a5734b9 100644 --- a/electrum/gui/qt/settings_dialog.py +++ b/electrum/gui/qt/settings_dialog.py @@ -129,16 +129,16 @@ class SettingsDialog(WindowModalDialog): # lightning lightning_widgets = [] - if self.wallet.lnworker and self.wallet.lnworker.has_deterministic_node_id(): - help_recov = _(messages.MSG_RECOVERABLE_CHANNELS) - recov_cb = QCheckBox(_("Create recoverable channels")) - recov_cb.setToolTip(messages.to_rtf(help_recov)) - recov_cb.setChecked(bool(self.config.get('use_recoverable_channels', True))) - def on_recov_checked(x): - self.config.set_key('use_recoverable_channels', bool(x)) - recov_cb.stateChanged.connect(on_recov_checked) - recov_cb.setEnabled(not bool(self.config.get('lightning_listen'))) - lightning_widgets.append((recov_cb, None)) + help_recov = _(messages.MSG_RECOVERABLE_CHANNELS) + recov_cb = QCheckBox(_("Create recoverable channels")) + enable_toggle_use_recoverable_channels = bool(self.wallet.lnworker and self.wallet.lnworker.can_have_recoverable_channels()) + recov_cb.setEnabled(enable_toggle_use_recoverable_channels) + recov_cb.setToolTip(messages.to_rtf(help_recov)) + recov_cb.setChecked(bool(self.config.get('use_recoverable_channels', True)) and enable_toggle_use_recoverable_channels) + def on_recov_checked(x): + self.config.set_key('use_recoverable_channels', bool(x)) + recov_cb.stateChanged.connect(on_recov_checked) + lightning_widgets.append((recov_cb, None)) help_trampoline = _(messages.MSG_HELP_TRAMPOLINE) trampoline_cb = QCheckBox(_("Use trampoline routing (disable gossip)")) diff --git a/electrum/lnworker.py b/electrum/lnworker.py index efc0b4391..b8ababb27 100644 --- a/electrum/lnworker.py +++ b/electrum/lnworker.py @@ -650,14 +650,19 @@ class LNWallet(LNWorker): # map forwarded htlcs (fw_info=(scid_hex, htlc_id)) to originating peer pubkeys self.downstream_htlc_to_upstream_peer_map = {} # type: Dict[Tuple[str, int], bytes] - def has_deterministic_node_id(self): + def has_deterministic_node_id(self) -> bool: return bool(self.db.get('lightning_xprv')) - def has_recoverable_channels(self): - # TODO: expose use_recoverable_channels in preferences - return self.has_deterministic_node_id() \ - and self.config.get('use_recoverable_channels', True) \ - and not (self.config.get('lightning_listen')) + def can_have_recoverable_channels(self) -> bool: + return (self.has_deterministic_node_id() + and not (self.config.get('lightning_listen'))) + + def has_recoverable_channels(self) -> bool: + """Whether *future* channels opened by this wallet would be recoverable + from seed (via putting OP_RETURN outputs into funding txs). + """ + return (self.can_have_recoverable_channels() + and self.config.get('use_recoverable_channels', True)) @property def channels(self) -> Mapping[bytes, Channel]: