mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
close: accept wrong_funding outpoint arg if we negotiated the feature.
Changelog-Added: lightningd: experimental-shutdown-wrong-funding to allow remote nodes to close incorrectly opened channels. Changelog-Added: JSON-RPC: close has a new `wrong_funding` option to try to close out unused channels where we messed up the funding tx. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@@ -1492,6 +1492,19 @@ command_find_channel(struct command *cmd,
|
||||
}
|
||||
}
|
||||
|
||||
static struct command_result *param_outpoint(struct command *cmd,
|
||||
const char *name,
|
||||
const char *buffer,
|
||||
const jsmntok_t *tok,
|
||||
struct bitcoin_outpoint **outp)
|
||||
{
|
||||
*outp = tal(cmd, struct bitcoin_outpoint);
|
||||
if (json_to_outpoint(buffer, tok, *outp))
|
||||
return NULL;
|
||||
return command_fail_badparam(cmd, name, buffer, tok,
|
||||
"should be a txid:outnum");
|
||||
}
|
||||
|
||||
static struct command_result *json_close(struct command *cmd,
|
||||
const char *buffer,
|
||||
const jsmntok_t *obj UNNEEDED,
|
||||
@@ -1502,8 +1515,9 @@ static struct command_result *json_close(struct command *cmd,
|
||||
struct channel *channel COMPILER_WANTS_INIT("gcc 7.3.0 fails, 8.3 OK");
|
||||
unsigned int *timeout;
|
||||
const u8 *close_to_script = NULL;
|
||||
bool close_script_set;
|
||||
bool close_script_set, wrong_funding_changed;
|
||||
const char *fee_negotiation_step_str;
|
||||
struct bitcoin_outpoint *wrong_funding;
|
||||
char* end;
|
||||
|
||||
if (!param(cmd, buffer, params,
|
||||
@@ -1513,6 +1527,7 @@ static struct command_result *json_close(struct command *cmd,
|
||||
p_opt("destination", param_bitcoin_address, &close_to_script),
|
||||
p_opt("fee_negotiation_step", param_string,
|
||||
&fee_negotiation_step_str),
|
||||
p_opt("wrong_funding", param_outpoint, &wrong_funding),
|
||||
NULL))
|
||||
return command_param_failed();
|
||||
|
||||
@@ -1618,6 +1633,34 @@ static struct command_result *json_close(struct command *cmd,
|
||||
fee_negotiation_step_str);
|
||||
}
|
||||
|
||||
if (wrong_funding) {
|
||||
if (!feature_negotiated(cmd->ld->our_features,
|
||||
channel->peer->their_features,
|
||||
OPT_SHUTDOWN_WRONG_FUNDING)) {
|
||||
return command_fail(cmd, JSONRPC2_INVALID_PARAMS,
|
||||
"wrong_funding feature not negotiated"
|
||||
" (we said %s, they said %s: try experimental-shutdown-wrong-funding?)",
|
||||
feature_offered(cmd->ld->our_features
|
||||
->bits[INIT_FEATURE],
|
||||
OPT_SHUTDOWN_WRONG_FUNDING)
|
||||
? "yes" : "no",
|
||||
feature_offered(channel->peer->their_features,
|
||||
OPT_SHUTDOWN_WRONG_FUNDING)
|
||||
? "yes" : "no");
|
||||
}
|
||||
|
||||
wrong_funding_changed = true;
|
||||
channel->shutdown_wrong_funding
|
||||
= tal_steal(channel, wrong_funding);
|
||||
} else {
|
||||
if (channel->shutdown_wrong_funding) {
|
||||
channel->shutdown_wrong_funding
|
||||
= tal_free(channel->shutdown_wrong_funding);
|
||||
wrong_funding_changed = true;
|
||||
} else
|
||||
wrong_funding_changed = false;
|
||||
}
|
||||
|
||||
/* Normal case.
|
||||
* We allow states shutting down and sigexchange; a previous
|
||||
* close command may have timed out, and this current command
|
||||
@@ -1663,8 +1706,9 @@ static struct command_result *json_close(struct command *cmd,
|
||||
/* Register this command for later handling. */
|
||||
register_close_command(cmd->ld, cmd, channel, *timeout);
|
||||
|
||||
/* If we set `channel->shutdown_scriptpubkey[LOCAL]`, save it. */
|
||||
if (close_script_set)
|
||||
/* If we set `channel->shutdown_scriptpubkey[LOCAL]` or
|
||||
* changed shutdown_wrong_funding, save it. */
|
||||
if (close_script_set || wrong_funding_changed)
|
||||
wallet_channel_save(cmd->ld->wallet, channel);
|
||||
|
||||
/* Wait until close drops down to chain. */
|
||||
|
||||
Reference in New Issue
Block a user