openingd: Add reserve to fundchannel and multifundchannel

Changelog-Added: JSON-RPC: `fundchannel`, `multifundchannel` and `fundchannel_start` now accept a `reserve` parameter to indicate the absolute reserve to impose on the peer.
This commit is contained in:
Christian Decker 2022-06-08 11:05:10 +02:00
parent 7159a25e73
commit 5c1de8029a
13 changed files with 39 additions and 2 deletions

View File

@ -393,6 +393,7 @@
"FundChannel.mindepth": 12,
"FundChannel.push_msat": 5,
"FundChannel.request_amt": 7,
"FundChannel.reserve": 13,
"FundChannel.utxos[]": 11
},
"FundchannelResponse": {

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -730,7 +730,8 @@ class LightningRpc(UnixDomainSocketRpc):
def fundchannel(self, node_id, amount, feerate=None, announce=True,
minconf=None, utxos=None, push_msat=None, close_to=None,
request_amt=None, compact_lease=None,
mindepth: Optional[int] = None):
mindepth: Optional[int] = None,
reserve: Optional[str] = None):
"""
Fund channel with {id} using {amount} satoshis with feerate
of {feerate} (uses default feerate if unset).
@ -756,6 +757,7 @@ class LightningRpc(UnixDomainSocketRpc):
"request_amt": request_amt,
"compact_lease": compact_lease,
"mindepth": mindepth,
"reserve": reserve,
}
return self.call("fundchannel", payload)

View File

@ -44,6 +44,10 @@
"mindepth": {
"description": "Number of confirmations required before we consider the channel active",
"type": "u32"
},
"reserve": {
"type": "msat",
"description": "The amount we want the peer to maintain on its side"
}
}
}

View File

@ -65,6 +65,13 @@ new_uncommitted_channel(struct peer *peer)
/* We override this in openchannel hook if we want zeroconf */
uc->minimum_depth = ld->config.anchor_confirms;
/* Use default 1% reserve if not otherwise specified. If this
* is not-NULL it will be used by openingd as absolute value
* (clamped to dust limit). */
uc->reserve = NULL;
memset(&uc->cid, 0xFF, sizeof(uc->cid));
/* Declare the new channel to the HSM. */
new_channel_msg = towire_hsmd_new_channel(NULL, &uc->peer->id, uc->dbid);
if (!wire_sync_write(ld->hsm_fd, take(new_channel_msg)))

View File

@ -58,6 +58,12 @@ struct uncommitted_channel {
/* Our channel config. */
struct channel_config our_config;
/* Reserve we will impose on the other side. If this is NULL
* we will use our default of 1% of the funding
* amount. Otherwise it will be used by openingd as absolute
* value (clamped to dust limit). */
struct amount_sat *reserve;
};
struct funding_channel {
@ -66,6 +72,7 @@ struct funding_channel {
struct wallet_tx *wtx;
struct amount_msat push;
struct amount_sat funding_sats;
u8 channel_flags;
const u8 *our_upfront_shutdown_script;

View File

@ -1095,7 +1095,7 @@ static struct command_result *json_fundchannel_start(struct command *cmd,
bool *announce_channel;
u32 *feerate_per_kw, *mindepth;
int fds[2];
struct amount_sat *amount;
struct amount_sat *amount, *reserve;
struct amount_msat *push_msat;
u32 *upfront_shutdown_script_wallet_index;
struct channel_id tmp_channel_id;
@ -1114,6 +1114,7 @@ static struct command_result *json_fundchannel_start(struct command *cmd,
p_opt("close_to", param_bitcoin_address, &fc->our_upfront_shutdown_script),
p_opt("push_msat", param_msat, &push_msat),
p_opt_def("mindepth", param_u32, &mindepth, cmd->ld->config.anchor_confirms),
p_opt("reserve", param_sat, &reserve),
NULL))
return command_param_failed();
@ -1223,6 +1224,8 @@ static struct command_result *json_fundchannel_start(struct command *cmd,
assert(mindepth != NULL);
fc->uc->minimum_depth = *mindepth;
fc->uc->reserve = reserve;
/* Needs to be stolen away from cmd */
if (fc->our_upfront_shutdown_script)
fc->our_upfront_shutdown_script

View File

@ -54,6 +54,7 @@ json_fundchannel(struct command *cmd,
const jsmntok_t *request_amt;
const jsmntok_t *compact_lease;
const jsmntok_t *mindepth;
const jsmntok_t *reserve;
struct out_req *req;
@ -69,6 +70,7 @@ json_fundchannel(struct command *cmd,
p_opt("request_amt", param_tok, &request_amt),
p_opt("compact_lease", param_tok, &compact_lease),
p_opt("mindepth", param_tok, &mindepth),
p_opt("reserve", param_tok, &reserve),
NULL))
return command_param_failed();
@ -99,6 +101,9 @@ json_fundchannel(struct command *cmd,
if (mindepth)
json_add_tok(req->js, "mindepth", mindepth, buf);
if (reserve)
json_add_tok(req->js, "reserve", reserve, buf);
json_object_end(req->js);
json_array_end(req->js);
if (feerate)

View File

@ -1125,6 +1125,11 @@ fundchannel_start_dest(struct multifundchannel_destination *dest)
if (dest->mindepth)
json_add_u32(req->js, "mindepth", *dest->mindepth);
if (dest->reserve)
json_add_string(
req->js, "reserve",
type_to_string(tmpctx, struct amount_sat, dest->reserve));
send_outreq(cmd->plugin, req);
}
@ -1914,6 +1919,7 @@ param_destinations_array(struct command *cmd, const char *name,
AMOUNT_SAT(0)),
p_opt("compact_lease", param_lease_hex, &rates),
p_opt("mindepth", param_u32, &dest->mindepth),
p_opt("reserve", param_sat, &dest->reserve),
NULL))
return command_param_failed();

View File

@ -112,6 +112,8 @@ struct multifundchannel_destination {
bool all;
struct amount_sat amount;
struct amount_sat *reserve;
/* the output index for this destination. */
unsigned int outnum;