diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index ddbedb70b..c88491603 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -726,6 +726,11 @@ struct command_result *cancel_channel_before_broadcast(struct command *cmd, buffer + cidtok->start); } + if (cancel_channel->funder == REMOTE) + return command_fail(cmd, LIGHTNINGD, + "Cannot cancel channel that was " + "initiated by peer"); + /* Check if we broadcast the transaction. (We store the transaction type into DB * before broadcast). */ enum wallet_tx_type type; diff --git a/tests/test_connection.py b/tests/test_connection.py index 849c28b59..80c269a70 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -1030,7 +1030,12 @@ def test_funding_external_wallet_corners(node_factory, bitcoind): # Be sure fundchannel_complete is successful assert l1.rpc.fundchannel_complete(l2.info['id'], prep['txid'], txout)['commitments_secured'] - # Canceld channel after fundchannel_complete + + # Peer shouldn't be able to cancel channel + with pytest.raises(RpcError, match=r'Cannot cancel channel that was initiated by peer'): + l2.rpc.fundchannel_cancel(l1.info['id']) + + # We can cancel channel after fundchannel_complete assert l1.rpc.fundchannel_cancel(l2.info['id'])['cancelled'] # l2 won't give up, since it considers error "soft".