From e41d2dc0e6cfa30c930ecbe1813fece825a5a209 Mon Sep 17 00:00:00 2001 From: niftynei Date: Tue, 8 Jun 2021 16:50:41 -0500 Subject: [PATCH] liquidity-ad: request amount, pass through to dualopend Changelog-Experimental: EXPERIMENTAL-DUAL-FUND: JSON-RPC: openchannel_init now takes a `requested_amt`, which is an amount to request from peer --- contrib/pyln-client/pyln/client/lightning.py | 3 +- doc/lightning-openchannel_init.7 | 18 ++++++- doc/lightning-openchannel_init.7.md | 14 ++++- lightningd/dual_open_control.c | 14 +++-- openingd/dualopend.c | 54 ++++++++++++++++++-- openingd/dualopend_wire.csv | 6 +++ openingd/dualopend_wiregen.c | 34 +++++++++--- openingd/dualopend_wiregen.h | 15 +++--- 8 files changed, 131 insertions(+), 27 deletions(-) diff --git a/contrib/pyln-client/pyln/client/lightning.py b/contrib/pyln-client/pyln/client/lightning.py index e664c54bd..e407e107c 100644 --- a/contrib/pyln-client/pyln/client/lightning.py +++ b/contrib/pyln-client/pyln/client/lightning.py @@ -1009,7 +1009,7 @@ class LightningRpc(UnixDomainSocketRpc): } return self.call("pay", payload) - def openchannel_init(self, node_id, channel_amount, psbt, feerate=None, funding_feerate=None, announce=True, close_to=None, *args, **kwargs): + def openchannel_init(self, node_id, channel_amount, psbt, feerate=None, funding_feerate=None, announce=True, close_to=None, request_amt=None, *args, **kwargs): """Initiate an openchannel with a peer """ payload = { "id": node_id, @@ -1019,6 +1019,7 @@ class LightningRpc(UnixDomainSocketRpc): "funding_feerate": funding_feerate, "announce": announce, "close_to": close_to, + "request_amt": request_amt, } return self.call("openchannel_init", payload) diff --git a/doc/lightning-openchannel_init.7 b/doc/lightning-openchannel_init.7 index be59860eb..3c449a822 100644 --- a/doc/lightning-openchannel_init.7 +++ b/doc/lightning-openchannel_init.7 @@ -3,7 +3,7 @@ lightning-openchannel_init - Command to initiate a channel to a peer .SH SYNOPSIS -\fBopenchannel_init\fR \fIid\fR \fIamount\fR \fIinitalpsbt\fR [\fIcommitment_feerate\fR] [\fIfunding_feerate\fR] [\fIannounce\fR] [\fIclose_to\fR] +\fBopenchannel_init\fR \fIid\fR \fIamount\fR \fIinitalpsbt\fR [\fIcommitment_feerate\fR] [\fIfunding_feerate\fR] [\fIannounce\fR] [\fIclose_to\fR] [\fIrequest_amt\fR] .SH DESCRIPTION @@ -43,6 +43,11 @@ funding transaction\. Defaults to 'opening' feerate\. sent on close\. Only valid if both peers have negotiated \fBoption_upfront_shutdown_script\fR\. + +\fIrequest_amt\fR is an amount of liquidity you'd like to lease from the peer\. +If peer supports \fBoption_will_fund\fR, indicates to them to include this +much liquidity into the channel\. + .SH RETURN VALUE On success, an object is returned, containing: @@ -63,6 +68,15 @@ If the peer does not support \fBoption_dual_fund\fR, this command will return an error\. +If you sent a \fIrequest_amt\fR and the peer supports \fBoption_will_fund\fR and is +interested in leasing you liquidity in this channel, returns their updated +channel fee max (\fIchannel_fee_proportional_basis\fR, \fIchannel_fee_base_msat\fR), +updated rate card for the lease fee (\fIlease_fee_proportional_basis\fR, +\fIlease_fee_base_sat\fR) and their on-chain weight \fIweight_charge\fR, which will +be added to the lease fee at a rate of \fIfunding_feerate\fR \fI \fRweight_charge* +/ 1000\. + + On error the returned object will contain \fBcode\fR and \fBmessage\fR properties, with \fBcode\fR being one of the following: @@ -105,4 +119,4 @@ lightning-fundchannel_\fBcomplete\fR(7), \fBlightning-fundchannel\fR(7), Main web site: \fIhttps://github.com/ElementsProject/lightning\fR -\" SHA256STAMP:ba03cf64c3578303a0cdfcf94546bb94d86ecf3d6187b16871a39c08b3a40f38 +\" SHA256STAMP:13023bb80ee4a7f6a94a168399a01e05c6c5ab68e9eec5795ebd5f49207a03ac diff --git a/doc/lightning-openchannel_init.7.md b/doc/lightning-openchannel_init.7.md index 36c187c49..b3493557f 100644 --- a/doc/lightning-openchannel_init.7.md +++ b/doc/lightning-openchannel_init.7.md @@ -4,7 +4,7 @@ lightning-openchannel\_init -- Command to initiate a channel to a peer SYNOPSIS -------- -**openchannel_init** *id* *amount* *initalpsbt* \[*commitment_feerate*\] \[*funding_feerate*\] \[*announce*\] \[*close_to*\] +**openchannel_init** *id* *amount* *initalpsbt* \[*commitment_feerate*\] \[*funding_feerate*\] \[*announce*\] \[*close_to*\] \[*request_amt*\] DESCRIPTION ----------- @@ -38,6 +38,10 @@ funding transaction. Defaults to 'opening' feerate. sent on close. Only valid if both peers have negotiated `option_upfront_shutdown_script`. +*request_amt* is an amount of liquidity you'd like to lease from the peer. +If peer supports `option_will_fund`, indicates to them to include this +much liquidity into the channel. + RETURN VALUE ------------ @@ -53,6 +57,14 @@ On success, an object is returned, containing: If the peer does not support `option_dual_fund`, this command will return an error. +If you sent a *request_amt* and the peer supports `option_will_fund` and is +interested in leasing you liquidity in this channel, returns their updated +channel fee max (*channel_fee_proportional_basis*, *channel_fee_base_msat*), +updated rate card for the lease fee (*lease_fee_proportional_basis*, +*lease_fee_base_sat*) and their on-chain weight *weight_charge*, which will +be added to the lease fee at a rate of *funding_feerate* * *weight_charge* +/ 1000. + On error the returned object will contain `code` and `message` properties, with `code` being one of the following: diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 0eeac2b52..a2a2d86b1 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -701,7 +701,8 @@ openchannel2_hook_cb(struct openchannel2_payload *payload STEALS) msg = towire_dualopend_got_offer_reply(NULL, payload->accepter_funding, payload->psbt, - payload->our_shutdown_scriptpubkey); + payload->our_shutdown_scriptpubkey, + payload->rates); subd_send_msg(dualopend, take(msg)); } @@ -1733,7 +1734,9 @@ static void accepter_got_offer(struct subd *dualopend, &payload->max_accepted_htlcs, &payload->channel_flags, &payload->locktime, - &payload->shutdown_scriptpubkey)) { + &payload->shutdown_scriptpubkey, + &payload->requested_lease_amt, + &payload->lease_blockheight_start)) { channel_internal_error(channel, "Bad DUALOPEND_GOT_OFFER: %s", tal_hex(tmpctx, msg)); return; @@ -2343,7 +2346,7 @@ static struct command_result *json_openchannel_init(struct command *cmd, bool *announce_channel; u32 *feerate_per_kw_funding; u32 *feerate_per_kw; - struct amount_sat *amount, psbt_val; + struct amount_sat *amount, psbt_val, *request_amt; struct wally_psbt *psbt; const u8 *our_upfront_shutdown_script; struct open_attempt *oa; @@ -2357,6 +2360,7 @@ static struct command_result *json_openchannel_init(struct command *cmd, p_opt("funding_feerate", param_feerate, &feerate_per_kw_funding), p_opt_def("announce", param_bool, &announce_channel, true), p_opt("close_to", param_bitcoin_address, &our_upfront_shutdown_script), + p_opt_def("request_amt", param_sat, &request_amt, AMOUNT_SAT(0)), NULL)) return command_param_failed(); @@ -2488,7 +2492,9 @@ static struct command_result *json_openchannel_init(struct command *cmd, oa->our_upfront_shutdown_script, *feerate_per_kw, *feerate_per_kw_funding, - channel->channel_flags); + channel->channel_flags, + *request_amt, + get_block_height(cmd->ld->topology)); subd_send_msg(channel->owner, take(msg)); return command_still_pending(cmd); diff --git a/openingd/dualopend.c b/openingd/dualopend.c index a92087651..8db2a7daa 100644 --- a/openingd/dualopend.c +++ b/openingd/dualopend.c @@ -119,6 +119,9 @@ struct tx_state { /* Have we gotten the peer's tx-sigs yet? */ bool remote_funding_sigs_rcvd; + + /* Rates that we're using for this open... */ + struct lease_rates *rates; }; static struct tx_state *new_tx_state(const tal_t *ctx) @@ -1908,7 +1911,8 @@ static void accepter_start(struct state *state, const u8 *oc2_msg) struct channel_id cid, full_cid; char *err_reason; u8 *msg; - struct amount_sat total; + struct amount_sat total, requested_amt; + u32 lease_blockheight_start; enum dualopend_wire msg_type; struct tx_state *tx_state = state->tx_state; @@ -1943,6 +1947,19 @@ static void accepter_start(struct state *state, const u8 *oc2_msg) } else state->upfront_shutdown_script[REMOTE] = NULL; + /* This is an `option_will_fund` request */ + if (open_tlv->request_funds) { + /* FIXME: Do we support this? */ + requested_amt + = amount_sat(open_tlv->request_funds->requested_sats); + lease_blockheight_start + = open_tlv->request_funds->blockheight; + } else { + requested_amt = AMOUNT_SAT(0); + lease_blockheight_start = 0; + } + + /* BOLT-* #2 * If the peer's revocation basepoint is unknown (e.g. * `open_channel2`), a temporary `channel_id` should be found @@ -2006,7 +2023,9 @@ static void accepter_start(struct state *state, const u8 *oc2_msg) tx_state->remoteconf.max_accepted_htlcs, state->channel_flags, tx_state->tx_locktime, - state->upfront_shutdown_script[REMOTE]); + state->upfront_shutdown_script[REMOTE], + requested_amt, + lease_blockheight_start); wire_sync_write(REQ_FD, take(msg)); msg = wire_sync_read(tmpctx, REQ_FD); @@ -2021,7 +2040,8 @@ static void accepter_start(struct state *state, const u8 *oc2_msg) if (!fromwire_dualopend_got_offer_reply(state, msg, &tx_state->accepter_funding, &tx_state->psbt, - &state->upfront_shutdown_script[LOCAL])) + &state->upfront_shutdown_script[LOCAL], + &tx_state->rates)) master_badmsg(WIRE_DUALOPEND_GOT_OFFER_REPLY, msg); if (!tx_state->psbt) @@ -2031,6 +2051,19 @@ static void accepter_start(struct state *state, const u8 *oc2_msg) /* Locktimes must match! */ tx_state->psbt->tx->locktime = tx_state->tx_locktime; + /* BOLT- #2: + * + * - if they decide to accept the offer: + * ... + * - MUST set `funding_satoshis` to a value greater than 0msat + */ + if (tx_state->rates && amount_sat_zero(tx_state->accepter_funding)) { + status_broken("opt_will_fund ad passed in, but no funding"); + negotiation_failed(state, "We're unable to accept" + " your lease offer."); + return; + } + /* Check that total funding doesn't overflow */ if (!amount_sat_add(&total, tx_state->opener_funding, tx_state->accepter_funding)) @@ -2400,7 +2433,8 @@ static void opener_start(struct state *state, u8 *msg) struct tlv_accept_tlvs *a_tlv; struct channel_id cid; char *err_reason; - struct amount_sat total; + struct amount_sat total, requested_sats; + u32 current_blockheight; struct tx_state *tx_state = state->tx_state; if (!fromwire_dualopend_opener_init(state, msg, @@ -2409,7 +2443,9 @@ static void opener_start(struct state *state, u8 *msg) &state->upfront_shutdown_script[LOCAL], &state->feerate_per_kw_commitment, &tx_state->feerate_per_kw_funding, - &state->channel_flags)) + &state->channel_flags, + &requested_sats, + ¤t_blockheight)) master_badmsg(WIRE_DUALOPEND_OPENER_INIT, msg); state->our_role = TX_INITIATOR; @@ -2438,6 +2474,14 @@ static void opener_start(struct state *state, u8 *msg) state->upfront_shutdown_script[LOCAL]; } + if (!amount_sat_zero(requested_sats)) { + open_tlv->request_funds = + tal(open_tlv, struct tlv_opening_tlvs_request_funds); + open_tlv->request_funds->requested_sats = + requested_sats.satoshis; /* Raw: struct -> wire */ + open_tlv->request_funds->blockheight = current_blockheight; + } + msg = towire_open_channel2(NULL, &chainparams->genesis_blockhash, &state->channel_id, diff --git a/openingd/dualopend_wire.csv b/openingd/dualopend_wire.csv index 53f52e103..397b2ccbe 100644 --- a/openingd/dualopend_wire.csv +++ b/openingd/dualopend_wire.csv @@ -9,6 +9,7 @@ #include #include #include +#include msgtype,dualopend_init,7000 # Which network are we configured for? @@ -79,6 +80,8 @@ msgdata,dualopend_got_offer,channel_flags,u8, msgdata,dualopend_got_offer,locktime,u32, msgdata,dualopend_got_offer,shutdown_len,u16, msgdata,dualopend_got_offer,shutdown_scriptpubkey,u8,shutdown_len +msgdata,dualopend_got_offer,requested_amt,amount_sat, +msgdata,dualopend_got_offer,lease_blockheight_start,u32, # master->dualopend: reply back with our first funding info/contribs msgtype,dualopend_got_offer_reply,7105 @@ -86,6 +89,7 @@ msgdata,dualopend_got_offer_reply,accepter_funding,amount_sat, msgdata,dualopend_got_offer_reply,psbt,wally_psbt, msgdata,dualopend_got_offer_reply,shutdown_len,u16, msgdata,dualopend_got_offer_reply,our_shutdown_scriptpubkey,?u8,shutdown_len +msgdata,dualopend_got_offer_reply,lease_rates,?lease_rates, # dualopend->master: they offered a RBF, should we continue? msgtype,dualopend_got_rbf_offer,7500 @@ -161,6 +165,8 @@ msgdata,dualopend_opener_init,local_shutdown_scriptpubkey,u8,local_shutdown_len msgdata,dualopend_opener_init,feerate_per_kw,u32, msgdata,dualopend_opener_init,feerate_per_kw_funding,u32, msgdata,dualopend_opener_init,channel_flags,u8, +msgdata,dualopend_opener_init,requested_sats,amount_sat, +msgdata,dualopend_opener_init,blockheight,u32, # dualopend->master received tx_sigs from peer msgtype,dualopend_funding_sigs,7010 diff --git a/openingd/dualopend_wiregen.c b/openingd/dualopend_wiregen.c index f084ddd03..5aa955466 100644 --- a/openingd/dualopend_wiregen.c +++ b/openingd/dualopend_wiregen.c @@ -247,7 +247,7 @@ bool fromwire_dualopend_reinit(const tal_t *ctx, const void *p, const struct cha /* WIRE: DUALOPEND_GOT_OFFER */ /* dualopend->master: they offered channel */ -u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat opener_funding, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_msat htlc_minimum_msat, u32 feerate_per_kw_funding, u32 feerate_per_kw_commitment, u16 to_self_delay, u16 max_accepted_htlcs, u8 channel_flags, u32 locktime, const u8 *shutdown_scriptpubkey) +u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat opener_funding, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_msat htlc_minimum_msat, u32 feerate_per_kw_funding, u32 feerate_per_kw_commitment, u16 to_self_delay, u16 max_accepted_htlcs, u8 channel_flags, u32 locktime, const u8 *shutdown_scriptpubkey, struct amount_sat requested_amt, u32 lease_blockheight_start) { u16 shutdown_len = tal_count(shutdown_scriptpubkey); u8 *p = tal_arr(ctx, u8, 0); @@ -266,10 +266,12 @@ u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channe towire_u32(&p, locktime); towire_u16(&p, shutdown_len); towire_u8_array(&p, shutdown_scriptpubkey, shutdown_len); + towire_amount_sat(&p, requested_amt); + towire_u32(&p, lease_blockheight_start); return memcheck(p, tal_count(p)); } -bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channel_id *channel_id, struct amount_sat *opener_funding, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_msat *htlc_minimum_msat, u32 *feerate_per_kw_funding, u32 *feerate_per_kw_commitment, u16 *to_self_delay, u16 *max_accepted_htlcs, u8 *channel_flags, u32 *locktime, u8 **shutdown_scriptpubkey) +bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channel_id *channel_id, struct amount_sat *opener_funding, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_msat *htlc_minimum_msat, u32 *feerate_per_kw_funding, u32 *feerate_per_kw_commitment, u16 *to_self_delay, u16 *max_accepted_htlcs, u8 *channel_flags, u32 *locktime, u8 **shutdown_scriptpubkey, struct amount_sat *requested_amt, u32 *lease_blockheight_start) { u16 shutdown_len; @@ -293,12 +295,14 @@ bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channe // 2nd case shutdown_scriptpubkey *shutdown_scriptpubkey = shutdown_len ? tal_arr(ctx, u8, shutdown_len) : NULL; fromwire_u8_array(&cursor, &plen, *shutdown_scriptpubkey, shutdown_len); + *requested_amt = fromwire_amount_sat(&cursor, &plen); + *lease_blockheight_start = fromwire_u32(&cursor, &plen); return cursor != NULL; } /* WIRE: DUALOPEND_GOT_OFFER_REPLY */ /* master->dualopend: reply back with our first funding info/contribs */ -u8 *towire_dualopend_got_offer_reply(const tal_t *ctx, struct amount_sat accepter_funding, const struct wally_psbt *psbt, const u8 *our_shutdown_scriptpubkey) +u8 *towire_dualopend_got_offer_reply(const tal_t *ctx, struct amount_sat accepter_funding, const struct wally_psbt *psbt, const u8 *our_shutdown_scriptpubkey, const struct lease_rates *lease_rates) { u16 shutdown_len = tal_count(our_shutdown_scriptpubkey); u8 *p = tal_arr(ctx, u8, 0); @@ -308,10 +312,16 @@ u8 *towire_dualopend_got_offer_reply(const tal_t *ctx, struct amount_sat accepte towire_wally_psbt(&p, psbt); towire_u16(&p, shutdown_len); towire_u8_array(&p, our_shutdown_scriptpubkey, shutdown_len); + if (!lease_rates) + towire_bool(&p, false); + else { + towire_bool(&p, true); + towire_lease_rates(&p, lease_rates); + } return memcheck(p, tal_count(p)); } -bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct amount_sat *accepter_funding, struct wally_psbt **psbt, u8 **our_shutdown_scriptpubkey) +bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct amount_sat *accepter_funding, struct wally_psbt **psbt, u8 **our_shutdown_scriptpubkey, struct lease_rates **lease_rates) { u16 shutdown_len; @@ -326,6 +336,12 @@ bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct // 2nd case our_shutdown_scriptpubkey *our_shutdown_scriptpubkey = shutdown_len ? tal_arr(ctx, u8, shutdown_len) : NULL; fromwire_u8_array(&cursor, &plen, *our_shutdown_scriptpubkey, shutdown_len); + if (!fromwire_bool(&cursor, &plen)) + *lease_rates = NULL; + else { + *lease_rates = tal(ctx, struct lease_rates); + fromwire_lease_rates(&cursor, &plen, *lease_rates); + } return cursor != NULL; } @@ -605,7 +621,7 @@ bool fromwire_dualopend_fail(const tal_t *ctx, const void *p, wirestring **reaso /* WIRE: DUALOPEND_OPENER_INIT */ /* master->dualopend: hello */ -u8 *towire_dualopend_opener_init(const tal_t *ctx, const struct wally_psbt *psbt, struct amount_sat funding_amount, const u8 *local_shutdown_scriptpubkey, u32 feerate_per_kw, u32 feerate_per_kw_funding, u8 channel_flags) +u8 *towire_dualopend_opener_init(const tal_t *ctx, const struct wally_psbt *psbt, struct amount_sat funding_amount, const u8 *local_shutdown_scriptpubkey, u32 feerate_per_kw, u32 feerate_per_kw_funding, u8 channel_flags, struct amount_sat requested_sats, u32 blockheight) { u16 local_shutdown_len = tal_count(local_shutdown_scriptpubkey); u8 *p = tal_arr(ctx, u8, 0); @@ -618,10 +634,12 @@ u8 *towire_dualopend_opener_init(const tal_t *ctx, const struct wally_psbt *psbt towire_u32(&p, feerate_per_kw); towire_u32(&p, feerate_per_kw_funding); towire_u8(&p, channel_flags); + towire_amount_sat(&p, requested_sats); + towire_u32(&p, blockheight); return memcheck(p, tal_count(p)); } -bool fromwire_dualopend_opener_init(const tal_t *ctx, const void *p, struct wally_psbt **psbt, struct amount_sat *funding_amount, u8 **local_shutdown_scriptpubkey, u32 *feerate_per_kw, u32 *feerate_per_kw_funding, u8 *channel_flags) +bool fromwire_dualopend_opener_init(const tal_t *ctx, const void *p, struct wally_psbt **psbt, struct amount_sat *funding_amount, u8 **local_shutdown_scriptpubkey, u32 *feerate_per_kw, u32 *feerate_per_kw_funding, u8 *channel_flags, struct amount_sat *requested_sats, u32 *blockheight) { u16 local_shutdown_len; @@ -639,6 +657,8 @@ bool fromwire_dualopend_opener_init(const tal_t *ctx, const void *p, struct wall *feerate_per_kw = fromwire_u32(&cursor, &plen); *feerate_per_kw_funding = fromwire_u32(&cursor, &plen); *channel_flags = fromwire_u8(&cursor, &plen); + *requested_sats = fromwire_amount_sat(&cursor, &plen); + *blockheight = fromwire_u32(&cursor, &plen); return cursor != NULL; } @@ -912,4 +932,4 @@ bool fromwire_dualopend_dev_memleak_reply(const void *p, bool *leak) *leak = fromwire_bool(&cursor, &plen); return cursor != NULL; } -// SHA256STAMP:2aa38c967abfcd0110b6c65f62b13aa77cefacaf5f036a9217bb5d63220f1e1f +// SHA256STAMP:d8a31a5de292561ccfb5b7050c911b590db44a50209e02469179904708328861 diff --git a/openingd/dualopend_wiregen.h b/openingd/dualopend_wiregen.h index d71ca4574..2ef8db7b3 100644 --- a/openingd/dualopend_wiregen.h +++ b/openingd/dualopend_wiregen.h @@ -18,6 +18,7 @@ #include #include #include +#include enum dualopend_wire { WIRE_DUALOPEND_INIT = 7000, @@ -96,13 +97,13 @@ bool fromwire_dualopend_reinit(const tal_t *ctx, const void *p, const struct cha /* WIRE: DUALOPEND_GOT_OFFER */ /* dualopend->master: they offered channel */ -u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat opener_funding, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_msat htlc_minimum_msat, u32 feerate_per_kw_funding, u32 feerate_per_kw_commitment, u16 to_self_delay, u16 max_accepted_htlcs, u8 channel_flags, u32 locktime, const u8 *shutdown_scriptpubkey); -bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channel_id *channel_id, struct amount_sat *opener_funding, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_msat *htlc_minimum_msat, u32 *feerate_per_kw_funding, u32 *feerate_per_kw_commitment, u16 *to_self_delay, u16 *max_accepted_htlcs, u8 *channel_flags, u32 *locktime, u8 **shutdown_scriptpubkey); +u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat opener_funding, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_msat htlc_minimum_msat, u32 feerate_per_kw_funding, u32 feerate_per_kw_commitment, u16 to_self_delay, u16 max_accepted_htlcs, u8 channel_flags, u32 locktime, const u8 *shutdown_scriptpubkey, struct amount_sat requested_amt, u32 lease_blockheight_start); +bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channel_id *channel_id, struct amount_sat *opener_funding, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_msat *htlc_minimum_msat, u32 *feerate_per_kw_funding, u32 *feerate_per_kw_commitment, u16 *to_self_delay, u16 *max_accepted_htlcs, u8 *channel_flags, u32 *locktime, u8 **shutdown_scriptpubkey, struct amount_sat *requested_amt, u32 *lease_blockheight_start); /* WIRE: DUALOPEND_GOT_OFFER_REPLY */ /* master->dualopend: reply back with our first funding info/contribs */ -u8 *towire_dualopend_got_offer_reply(const tal_t *ctx, struct amount_sat accepter_funding, const struct wally_psbt *psbt, const u8 *our_shutdown_scriptpubkey); -bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct amount_sat *accepter_funding, struct wally_psbt **psbt, u8 **our_shutdown_scriptpubkey); +u8 *towire_dualopend_got_offer_reply(const tal_t *ctx, struct amount_sat accepter_funding, const struct wally_psbt *psbt, const u8 *our_shutdown_scriptpubkey, const struct lease_rates *lease_rates); +bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct amount_sat *accepter_funding, struct wally_psbt **psbt, u8 **our_shutdown_scriptpubkey, struct lease_rates **lease_rates); /* WIRE: DUALOPEND_GOT_RBF_OFFER */ /* dualopend->master: they offered a RBF */ @@ -152,8 +153,8 @@ bool fromwire_dualopend_fail(const tal_t *ctx, const void *p, wirestring **reaso /* WIRE: DUALOPEND_OPENER_INIT */ /* master->dualopend: hello */ -u8 *towire_dualopend_opener_init(const tal_t *ctx, const struct wally_psbt *psbt, struct amount_sat funding_amount, const u8 *local_shutdown_scriptpubkey, u32 feerate_per_kw, u32 feerate_per_kw_funding, u8 channel_flags); -bool fromwire_dualopend_opener_init(const tal_t *ctx, const void *p, struct wally_psbt **psbt, struct amount_sat *funding_amount, u8 **local_shutdown_scriptpubkey, u32 *feerate_per_kw, u32 *feerate_per_kw_funding, u8 *channel_flags); +u8 *towire_dualopend_opener_init(const tal_t *ctx, const struct wally_psbt *psbt, struct amount_sat funding_amount, const u8 *local_shutdown_scriptpubkey, u32 feerate_per_kw, u32 feerate_per_kw_funding, u8 channel_flags, struct amount_sat requested_sats, u32 blockheight); +bool fromwire_dualopend_opener_init(const tal_t *ctx, const void *p, struct wally_psbt **psbt, struct amount_sat *funding_amount, u8 **local_shutdown_scriptpubkey, u32 *feerate_per_kw, u32 *feerate_per_kw_funding, u8 *channel_flags, struct amount_sat *requested_sats, u32 *blockheight); /* WIRE: DUALOPEND_FUNDING_SIGS */ /* dualopend->master received tx_sigs from peer */ @@ -216,4 +217,4 @@ bool fromwire_dualopend_dev_memleak_reply(const void *p, bool *leak); #endif /* LIGHTNING_OPENINGD_DUALOPEND_WIREGEN_H */ -// SHA256STAMP:2aa38c967abfcd0110b6c65f62b13aa77cefacaf5f036a9217bb5d63220f1e1f +// SHA256STAMP:d8a31a5de292561ccfb5b7050c911b590db44a50209e02469179904708328861