|
|
@ -6,7 +6,7 @@ from typing import Sequence, Optional, Dict |
|
|
|
from PyQt5 import QtCore, QtGui |
|
|
|
from PyQt5.QtCore import Qt |
|
|
|
from PyQt5.QtWidgets import (QMenu, QHBoxLayout, QLabel, QVBoxLayout, QGridLayout, QLineEdit, |
|
|
|
QPushButton, QAbstractItemView, QComboBox) |
|
|
|
QPushButton, QAbstractItemView, QComboBox, QCheckBox) |
|
|
|
from PyQt5.QtGui import QFont, QStandardItem, QBrush |
|
|
|
|
|
|
|
from electrum.util import bh2u, NotEnoughFunds, NoDynamicFeeEstimates |
|
|
@ -104,11 +104,23 @@ class ChannelsList(MyTreeView): |
|
|
|
self.main_window.show_error('Failed to close channel:\n{}'.format(repr(e))) |
|
|
|
|
|
|
|
def close_channel(self, channel_id): |
|
|
|
self.is_force_close = False |
|
|
|
msg = _('Close channel?') |
|
|
|
if not self.parent.question(msg): |
|
|
|
force_cb = QCheckBox('Request force close from remote peer') |
|
|
|
tooltip = _( |
|
|
|
'If you check this option, your node will pretend that it has lost its data and ask the remote node to broadcast their latest state. ' |
|
|
|
'Doing so from time to time helps make sure that nodes are honest, because your node can punish them if they broadcast a revoked state.') |
|
|
|
def on_checked(b): |
|
|
|
self.is_force_close = bool(b) |
|
|
|
force_cb.stateChanged.connect(on_checked) |
|
|
|
force_cb.setToolTip(tooltip) |
|
|
|
if not self.parent.question(msg, checkbox=force_cb): |
|
|
|
return |
|
|
|
def task(): |
|
|
|
coro = self.lnworker.close_channel(channel_id) |
|
|
|
if self.is_force_close: |
|
|
|
coro = self.lnworker.request_remote_force_close(channel_id) |
|
|
|
else: |
|
|
|
coro = self.lnworker.close_channel(channel_id) |
|
|
|
return self.network.run_from_another_thread(coro) |
|
|
|
WaitingDialog(self, 'please wait..', task, self.on_success, self.on_failure) |
|
|
|
|
|
|
|