diff --git a/.msggen.json b/.msggen.json index 1744ef145c1a..d298681d1330 100644 --- a/.msggen.json +++ b/.msggen.json @@ -2173,10 +2173,16 @@ "GetRoutes.routes[].probability_ppm": 1 }, "GetroutesRoutesPath": { + "GetRoutes.routes[].path[].amount_in_msat": 7, "GetRoutes.routes[].path[].amount_msat": 3, + "GetRoutes.routes[].path[].amount_out_msat": 8, + "GetRoutes.routes[].path[].cltv_in": 11, + "GetRoutes.routes[].path[].cltv_out": 12, "GetRoutes.routes[].path[].delay": 5, "GetRoutes.routes[].path[].direction": 2, "GetRoutes.routes[].path[].next_node_id": 4, + "GetRoutes.routes[].path[].node_id_in": 9, + "GetRoutes.routes[].path[].node_id_out": 10, "GetRoutes.routes[].path[].short_channel_id": 1, "GetRoutes.routes[].path[].short_channel_id_dir": 6 }, @@ -2200,6 +2206,7 @@ "InjectpaymentonionRequest": { "InjectPaymentOnion.amount_msat": 3, "InjectPaymentOnion.cltv_expiry": 4, + "InjectPaymentOnion.destination": 11, "InjectPaymentOnion.destination_msat": 10, "InjectPaymentOnion.groupid": 6, "InjectPaymentOnion.invstring": 8, @@ -4006,10 +4013,14 @@ }, "SendpayRoute": { "SendPay.route[].amount_msat": 5, + "SendPay.route[].amount_out_msat": 8, "SendPay.route[].channel": 4, + "SendPay.route[].cltv_out": 9, "SendPay.route[].delay": 3, "SendPay.route[].id": 2, - "SendPay.route[].msatoshi": 1 + "SendPay.route[].msatoshi": 1, + "SendPay.route[].node_id_out": 7, + "SendPay.route[].short_channel_id_dir": 6 }, "SendpsbtRequest": { "SendPsbt.psbt": 1, @@ -4438,8 +4449,11 @@ }, "XpayRequest": { "Xpay.amount_msat": 2, + "Xpay.dev_use_shadow": 11, "Xpay.invstring": 1, + "Xpay.label": 9, "Xpay.layers[]": 4, + "Xpay.localinvreqid": 10, "Xpay.maxdelay": 7, "Xpay.maxfee": 3, "Xpay.partial_msat": 6, @@ -8527,13 +8541,29 @@ "added": "v24.08", "deprecated": null }, + "GetRoutes.routes[].path[].amount_in_msat": { + "added": "v26.06", + "deprecated": null + }, "GetRoutes.routes[].path[].amount_msat": { "added": "v24.08", + "deprecated": "v26.06" + }, + "GetRoutes.routes[].path[].amount_out_msat": { + "added": "v26.06", + "deprecated": null + }, + "GetRoutes.routes[].path[].cltv_in": { + "added": "v26.06", + "deprecated": null + }, + "GetRoutes.routes[].path[].cltv_out": { + "added": "v26.06", "deprecated": null }, "GetRoutes.routes[].path[].delay": { "added": "v24.08", - "deprecated": null + "deprecated": "v26.06" }, "GetRoutes.routes[].path[].direction": { "added": "v24.08", @@ -8541,6 +8571,14 @@ }, "GetRoutes.routes[].path[].next_node_id": { "added": "v24.08", + "deprecated": "v26.06" + }, + "GetRoutes.routes[].path[].node_id_in": { + "added": "v26.06", + "deprecated": null + }, + "GetRoutes.routes[].path[].node_id_out": { + "added": "v26.06", "deprecated": null }, "GetRoutes.routes[].path[].short_channel_id": { @@ -8747,6 +8785,10 @@ "added": "v24.11", "deprecated": null }, + "InjectPaymentOnion.destination": { + "added": "v26.06", + "deprecated": null + }, "InjectPaymentOnion.destination_msat": { "added": "v24.11.1", "deprecated": null @@ -13555,10 +13597,18 @@ "added": "pre-v0.10.1", "deprecated": null }, + "SendPay.route[].amount_out_msat": { + "added": "v26.06", + "deprecated": null + }, "SendPay.route[].channel": { "added": "pre-v0.10.1", "deprecated": null }, + "SendPay.route[].cltv_out": { + "added": "v26.06", + "deprecated": null + }, "SendPay.route[].delay": { "added": "pre-v0.10.1", "deprecated": null @@ -13567,6 +13617,14 @@ "added": "pre-v0.10.1", "deprecated": null }, + "SendPay.route[].node_id_out": { + "added": "v26.06", + "deprecated": null + }, + "SendPay.route[].short_channel_id_dir": { + "added": "v26.06", + "deprecated": null + }, "SendPay.status": { "added": "pre-v0.10.1", "deprecated": null @@ -14747,6 +14805,10 @@ "added": "v24.11", "deprecated": null }, + "Xpay.dev_use_shadow": { + "added": "v26.06", + "deprecated": null + }, "Xpay.failed_parts": { "added": "v24.11", "deprecated": null @@ -14755,10 +14817,18 @@ "added": "v24.11", "deprecated": null }, + "Xpay.label": { + "added": "v24.11", + "deprecated": null + }, "Xpay.layers[]": { "added": "v24.11", "deprecated": null }, + "Xpay.localinvreqid": { + "added": "v24.11", + "deprecated": null + }, "Xpay.maxdelay": { "added": "v25.02", "deprecated": null diff --git a/bitcoin/psbt.c b/bitcoin/psbt.c index 6856459536dd..10dada97edea 100644 --- a/bitcoin/psbt.c +++ b/bitcoin/psbt.c @@ -673,9 +673,7 @@ size_t psbt_output_get_weight(const struct wally_psbt *psbt, static void add(u8 **key, const void *mem, size_t len) { - size_t oldlen = tal_count(*key); - tal_resize(key, oldlen + len); - memcpy(*key + oldlen, memcheck(mem, len), len); + tal_arr_appendn(key, mem, len); } static void add_type(u8 **key, const u8 num) diff --git a/bitcoin/script.c b/bitcoin/script.c index 3b38eae9d426..ede201e9eee6 100644 --- a/bitcoin/script.c +++ b/bitcoin/script.c @@ -37,9 +37,7 @@ static void hash160(struct ripemd160 *redeemhash, const void *mem, size_t len) static void add(u8 **scriptp, const void *mem, size_t len) { - size_t oldlen = tal_count(*scriptp); - tal_resize(scriptp, oldlen + len); - memcpy(*scriptp + oldlen, mem, len); + tal_arr_appendn(scriptp, mem, len); } static void add_op(u8 **scriptp, u8 op) diff --git a/ccan/README b/ccan/README index 047cf78acf9f..6dd49e6445ee 100644 --- a/ccan/README +++ b/ccan/README @@ -1,3 +1,3 @@ CCAN imported from http://ccodearchive.net. -CCAN version: init-2611-g050dc66d +CCAN version: init-2612-ge242779f diff --git a/ccan/ccan/json_escape/json_escape.c b/ccan/ccan/json_escape/json_escape.c index 4bbb0032d1b5..6344bd8a8985 100644 --- a/ccan/ccan/json_escape/json_escape.c +++ b/ccan/ccan/json_escape/json_escape.c @@ -20,6 +20,14 @@ bool json_escape_eq(const struct json_escape *a, const struct json_escape *b) return streq(a->s, b->s); } +struct json_escape *json_escape_dup(const tal_t *ctx, const struct json_escape *esc TAKES) +{ + if (taken(esc)) + return (struct json_escape *)tal_steal(ctx, esc); + + return json_escape_string_(ctx, esc->s, strlen(esc->s)); +} + bool json_escape_needed(const char *str, size_t len) { size_t i; diff --git a/ccan/ccan/json_escape/json_escape.h b/ccan/ccan/json_escape/json_escape.h index 88d1eefc1a64..6a53fd5d96f7 100644 --- a/ccan/ccan/json_escape/json_escape.h +++ b/ccan/ccan/json_escape/json_escape.h @@ -27,6 +27,9 @@ struct json_escape *json_escape_len(const tal_t *ctx, struct json_escape *json_partial_escape(const tal_t *ctx, const char *str TAKES); +/* Copy a json_escape */ +struct json_escape *json_escape_dup(const tal_t *ctx, const struct json_escape *esc TAKES); + /* Do we need to escape this str? */ bool json_escape_needed(const char *str, size_t len); diff --git a/ccan/ccan/json_escape/test/run.c b/ccan/ccan/json_escape/test/run.c index 9d8b049c37d6..d81200e92d6f 100644 --- a/ccan/ccan/json_escape/test/run.c +++ b/ccan/ccan/json_escape/test/run.c @@ -9,7 +9,7 @@ int main(void) struct json_escape *e; /* This is how many tests you plan to run */ - plan_tests(6); + plan_tests(8); e = json_escape(ctx, "Hello"); ok1(!strcmp(e->s, "Hello")); @@ -25,6 +25,7 @@ int main(void) ok1(!strcmp(json_escape_unescape(ctx, e), "\\\b\f\n\r\t\"" "\\\\\\b\\f\\n\\r\\t\\\"")); + ok1(json_escape_eq(e, json_escape_dup(ctx, e))); /* This one doesn't escape the already-escaped chars */ e = json_partial_escape(ctx, @@ -36,6 +37,7 @@ int main(void) ok1(!strcmp(json_escape_unescape(ctx, e), "\\\b\f\n\r\t\"" "\\\b\f\n\r\t\"")); + ok1(json_escape_eq(e, json_escape_dup(ctx, e))); tal_free(ctx); diff --git a/cln-grpc/proto/node.proto b/cln-grpc/proto/node.proto index 5274572a19d8..24261e4094c3 100644 --- a/cln-grpc/proto/node.proto +++ b/cln-grpc/proto/node.proto @@ -373,10 +373,14 @@ message SendpayResponse { } message SendpayRoute { - bytes id = 2; - uint32 delay = 3; - string channel = 4; - Amount amount_msat = 5; + optional bytes id = 2; + optional uint32 delay = 3; + optional string channel = 4; + optional Amount amount_msat = 5; + optional string short_channel_id_dir = 6; + optional bytes node_id_out = 7; + optional Amount amount_out_msat = 8; + optional uint32 cltv_out = 9; } message ListchannelsRequest { @@ -4073,10 +4077,16 @@ message GetroutesRoutes { } message GetroutesRoutesPath { - Amount amount_msat = 3; - bytes next_node_id = 4; - uint32 delay = 5; + optional Amount amount_msat = 3; + optional bytes next_node_id = 4; + optional uint32 delay = 5; string short_channel_id_dir = 6; + optional Amount amount_in_msat = 7; + optional Amount amount_out_msat = 8; + optional bytes node_id_in = 9; + optional bytes node_id_out = 10; + optional uint32 cltv_in = 11; + optional uint32 cltv_out = 12; } message AskrenedisablenodeRequest { @@ -4204,6 +4214,7 @@ message InjectpaymentonionRequest { optional string invstring = 8; optional bytes localinvreqid = 9; optional Amount destination_msat = 10; + optional bytes destination = 11; } message InjectpaymentonionResponse { @@ -4230,6 +4241,9 @@ message XpayRequest { optional Amount partial_msat = 6; optional uint32 maxdelay = 7; optional string payer_note = 8; + optional string label = 9; + optional bytes localinvreqid = 10; + optional bool dev_use_shadow = 11; } message XpayResponse { diff --git a/cln-grpc/src/convert.rs b/cln-grpc/src/convert.rs index 0c299cde352c..e864b65136a1 100644 --- a/cln-grpc/src/convert.rs +++ b/cln-grpc/src/convert.rs @@ -4336,13 +4336,22 @@ impl From for pb::AskreneageResponse { } } -#[allow(unused_variables)] +#[allow(unused_variables,deprecated)] impl From for pb::GetroutesRoutesPath { fn from(c: responses::GetroutesRoutesPath) -> Self { Self { - amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat - delay: c.delay, // Rule #2 for type u32 - next_node_id: c.next_node_id.serialize().to_vec(), // Rule #2 for type pubkey + amount_in_msat: c.amount_in_msat.map(|f| f.into()), // Rule #2 for type msat? + #[allow(deprecated)] + amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat? + amount_out_msat: c.amount_out_msat.map(|f| f.into()), // Rule #2 for type msat? + cltv_in: c.cltv_in, // Rule #2 for type u32? + cltv_out: c.cltv_out, // Rule #2 for type u32? + #[allow(deprecated)] + delay: c.delay, // Rule #2 for type u32? + #[allow(deprecated)] + next_node_id: c.next_node_id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey? + node_id_in: c.node_id_in.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey? + node_id_out: c.node_id_out.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey? short_channel_id_dir: c.short_channel_id_dir.to_string(), // Rule #2 for type short_channel_id_dir } } @@ -5109,10 +5118,14 @@ impl From for pb::ListfundsRequest { impl From for pb::SendpayRoute { fn from(c: requests::SendpayRoute) -> Self { Self { - amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat - channel: c.channel.to_string(), // Rule #2 for type short_channel_id - delay: c.delay, // Rule #2 for type u32 - id: c.id.serialize().to_vec(), // Rule #2 for type pubkey + amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat? + amount_out_msat: c.amount_out_msat.map(|f| f.into()), // Rule #2 for type msat? + channel: c.channel.map(|v| v.to_string()), // Rule #2 for type short_channel_id? + cltv_out: c.cltv_out, // Rule #2 for type u32? + delay: c.delay, // Rule #2 for type u32? + id: c.id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey? + node_id_out: c.node_id_out.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey? + short_channel_id_dir: c.short_channel_id_dir.map(|v| v.to_string()), // Rule #2 for type short_channel_id_dir? } } } @@ -6762,6 +6775,7 @@ impl From for pb::InjectpaymentonionRequest Self { amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat cltv_expiry: c.cltv_expiry.into(), // Rule #2 for type u16 + destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey? destination_msat: c.destination_msat.map(|f| f.into()), // Rule #2 for type msat? groupid: c.groupid, // Rule #2 for type u64 invstring: c.invstring, // Rule #2 for type string? @@ -6789,9 +6803,12 @@ impl From for pb::XpayRequest { fn from(c: requests::XpayRequest) -> Self { Self { amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat? + dev_use_shadow: c.dev_use_shadow, // Rule #2 for type boolean? invstring: c.invstring, // Rule #2 for type string + label: c.label, // Rule #2 for type string? // Field: Xpay.layers[] layers: c.layers.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 + localinvreqid: c.localinvreqid.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex? maxdelay: c.maxdelay, // Rule #2 for type u32? maxfee: c.maxfee.map(|f| f.into()), // Rule #2 for type msat? partial_msat: c.partial_msat.map(|f| f.into()), // Rule #2 for type msat? @@ -7130,10 +7147,14 @@ impl From for requests::ListfundsRequest { impl From for requests::SendpayRoute { fn from(c: pb::SendpayRoute) -> Self { Self { - amount_msat: c.amount_msat.unwrap().into(), // Rule #1 for type msat - channel: cln_rpc::primitives::ShortChannelId::from_str(&c.channel).unwrap(), // Rule #1 for type short_channel_id - delay: c.delay, // Rule #1 for type u32 - id: PublicKey::from_slice(&c.id).unwrap(), // Rule #1 for type pubkey + amount_msat: c.amount_msat.map(|a| a.into()), // Rule #1 for type msat? + amount_out_msat: c.amount_out_msat.map(|a| a.into()), // Rule #1 for type msat? + channel: c.channel.map(|v| cln_rpc::primitives::ShortChannelId::from_str(&v).unwrap()), // Rule #1 for type short_channel_id? + cltv_out: c.cltv_out, // Rule #1 for type u32? + delay: c.delay, // Rule #1 for type u32? + id: c.id.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey? + node_id_out: c.node_id_out.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey? + short_channel_id_dir: c.short_channel_id_dir.map(|v| cln_rpc::primitives::ShortChannelIdDir::from_str(&v).unwrap()), // Rule #1 for type short_channel_id_dir? } } } @@ -8748,6 +8769,7 @@ impl From for requests::InjectpaymentonionRequest Self { amount_msat: c.amount_msat.unwrap().into(), // Rule #1 for type msat cltv_expiry: c.cltv_expiry as u16, // Rule #1 for type u16 + destination: c.destination.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey? destination_msat: c.destination_msat.map(|a| a.into()), // Rule #1 for type msat? groupid: c.groupid, // Rule #1 for type u64 invstring: c.invstring, // Rule #1 for type string? @@ -8775,8 +8797,11 @@ impl From for requests::XpayRequest { fn from(c: pb::XpayRequest) -> Self { Self { amount_msat: c.amount_msat.map(|a| a.into()), // Rule #1 for type msat? + dev_use_shadow: c.dev_use_shadow, // Rule #1 for type boolean? invstring: c.invstring, // Rule #1 for type string + label: c.label, // Rule #1 for type string? layers: Some(c.layers.into_iter().map(|s| s.into()).collect()), // Rule #4 + localinvreqid: c.localinvreqid.map(|v| hex::encode(v)), // Rule #1 for type hex? maxdelay: c.maxdelay, // Rule #1 for type u32? maxfee: c.maxfee.map(|a| a.into()), // Rule #1 for type msat? partial_msat: c.partial_msat.map(|a| a.into()), // Rule #1 for type msat? diff --git a/cln-rpc/src/model.rs b/cln-rpc/src/model.rs index d8337644fa1c..817f38d254dd 100644 --- a/cln-rpc/src/model.rs +++ b/cln-rpc/src/model.rs @@ -531,10 +531,22 @@ pub mod requests { } #[derive(Clone, Debug, Deserialize, Serialize)] pub struct SendpayRoute { - pub amount_msat: Amount, - pub channel: ShortChannelId, - pub delay: u32, - pub id: PublicKey, + #[serde(skip_serializing_if = "Option::is_none")] + pub amount_msat: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub amount_out_msat: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub channel: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub cltv_out: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub delay: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub node_id_out: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub short_channel_id_dir: Option, } #[derive(Clone, Debug, Deserialize, Serialize)] @@ -4846,6 +4858,8 @@ pub mod requests { } #[derive(Clone, Debug, Deserialize, Serialize)] pub struct InjectpaymentonionRequest { + #[serde(skip_serializing_if = "Option::is_none")] + pub destination: Option, #[serde(skip_serializing_if = "Option::is_none")] pub destination_msat: Option, #[serde(skip_serializing_if = "Option::is_none")] @@ -4907,6 +4921,12 @@ pub mod requests { #[serde(skip_serializing_if = "Option::is_none")] pub amount_msat: Option, #[serde(skip_serializing_if = "Option::is_none")] + pub dev_use_shadow: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub label: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub localinvreqid: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub maxdelay: Option, #[serde(skip_serializing_if = "Option::is_none")] pub maxfee: Option, @@ -12198,9 +12218,27 @@ pub mod responses { #[derive(Clone, Debug, Deserialize, Serialize)] pub struct GetroutesRoutesPath { - pub amount_msat: Amount, - pub delay: u32, - pub next_node_id: PublicKey, + #[deprecated] + #[serde(skip_serializing_if = "Option::is_none")] + pub amount_msat: Option, + #[deprecated] + #[serde(skip_serializing_if = "Option::is_none")] + pub delay: Option, + #[deprecated] + #[serde(skip_serializing_if = "Option::is_none")] + pub next_node_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub amount_in_msat: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub amount_out_msat: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub cltv_in: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub cltv_out: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub node_id_in: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub node_id_out: Option, pub short_channel_id_dir: ShortChannelIdDir, } diff --git a/common/bolt11.c b/common/bolt11.c index 27e5bd24113c..bc851ed49114 100644 --- a/common/bolt11.c +++ b/common/bolt11.c @@ -1251,8 +1251,6 @@ static void maybe_encode_9(u5 **data, const u8 *features, static bool encode_extra(u5 **data, const struct bolt11_field *extra) { - size_t len; - /* Can't encode an invalid tag. */ if (bech32_charset_rev[(unsigned char)extra->tag] == -1) return false; @@ -1261,9 +1259,7 @@ static bool encode_extra(u5 **data, const struct bolt11_field *extra) push_varlen_uint(data, tal_count(extra->data), 10); /* extra->data is already u5s, so do this raw. */ - len = tal_count(*data); - tal_resize(data, len + tal_count(extra->data)); - memcpy(*data + len, extra->data, tal_count(extra->data)); + tal_arr_append(data, extra->data); return true; } diff --git a/common/json_param.h b/common/json_param.h index a000c71b1179..7b25715a8454 100644 --- a/common/json_param.h +++ b/common/json_param.h @@ -89,7 +89,7 @@ enum param_style { * Add a required parameter. */ #define p_req_depr(name, depr_start, depr_end, cbx, arg) \ - name"", \ + name, \ PARAM_REQUIRED, \ (depr_start), (depr_end), \ (param_cbx)(cbx), \ @@ -99,7 +99,10 @@ enum param_style { (const jsmntok_t *)NULL, \ (arg)) == (struct command_result *)NULL) -#define p_req(name, cbx, arg) p_req_depr(name, NULL, NULL, (cbx), (arg)) +#define p_req(name, cbx, arg) p_req_depr(name"", NULL, NULL, (cbx), (arg)) + +/* name is not a literal: I promise its lifetime is infinite though! */ +#define p_req_var(name, cbx, arg) p_req_depr(name, NULL, NULL, (cbx), (arg)) /* * Add an optional parameter. *arg is set to NULL if it isn't found. diff --git a/common/test/run-bolt12_merkle.c b/common/test/run-bolt12_merkle.c index 902268def87d..59ab359fbdbc 100644 --- a/common/test/run-bolt12_merkle.c +++ b/common/test/run-bolt12_merkle.c @@ -48,8 +48,7 @@ static LAST_ARG_NULL void *concat_(const void *p, ...) va_start(ap, p); do { - tal_resize(&ret, len + tal_bytelen(p)); - memcpy(ret + len, p, tal_bytelen(p)); + tal_arr_append(&ret, p); len += tal_bytelen(p); } while ((p = va_arg(ap, const void *)) != NULL); va_end(ap); diff --git a/common/test/run-utils-tal_arr_append.c b/common/test/run-utils-tal_arr_append.c new file mode 100644 index 000000000000..483d8b28cfab --- /dev/null +++ b/common/test/run-utils-tal_arr_append.c @@ -0,0 +1,238 @@ +/* ChatGPT-derived */ +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* AUTOGENERATED MOCKS START */ +/* Generated stub for amount_asset_is_main */ +bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) +{ fprintf(stderr, "amount_asset_is_main called!\n"); abort(); } +/* Generated stub for amount_asset_to_sat */ +struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) +{ fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_feerate */ + bool amount_feerate(u32 *feerate UNNEEDED, struct amount_sat fee UNNEEDED, size_t weight UNNEEDED) +{ fprintf(stderr, "amount_feerate called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } +/* Generated stub for amount_sat_add */ + bool amount_sat_add(struct amount_sat *val UNNEEDED, + struct amount_sat a UNNEEDED, + struct amount_sat b UNNEEDED) +{ fprintf(stderr, "amount_sat_add called!\n"); abort(); } +/* Generated stub for amount_sat_eq */ +bool amount_sat_eq(struct amount_sat a UNNEEDED, struct amount_sat b UNNEEDED) +{ fprintf(stderr, "amount_sat_eq called!\n"); abort(); } +/* Generated stub for amount_sat_greater_eq */ +bool amount_sat_greater_eq(struct amount_sat a UNNEEDED, struct amount_sat b UNNEEDED) +{ fprintf(stderr, "amount_sat_greater_eq called!\n"); abort(); } +/* Generated stub for amount_sat_sub */ + bool amount_sat_sub(struct amount_sat *val UNNEEDED, + struct amount_sat a UNNEEDED, + struct amount_sat b UNNEEDED) +{ fprintf(stderr, "amount_sat_sub called!\n"); abort(); } +/* Generated stub for amount_sat_to_asset */ +struct amount_asset amount_sat_to_asset(struct amount_sat *sat UNNEEDED, const u8 *asset UNNEEDED) +{ fprintf(stderr, "amount_sat_to_asset called!\n"); abort(); } +/* Generated stub for amount_tx_fee */ +struct amount_sat amount_tx_fee(u32 fee_per_kw UNNEEDED, size_t weight UNNEEDED) +{ fprintf(stderr, "amount_tx_fee called!\n"); abort(); } +/* Generated stub for fromwire */ +const u8 *fromwire(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, void *copy UNNEEDED, size_t n UNNEEDED) +{ fprintf(stderr, "fromwire called!\n"); abort(); } +/* Generated stub for fromwire_bool */ +bool fromwire_bool(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_bool called!\n"); abort(); } +/* Generated stub for fromwire_fail */ +void *fromwire_fail(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_fail called!\n"); abort(); } +/* Generated stub for fromwire_secp256k1_ecdsa_signature */ +void fromwire_secp256k1_ecdsa_signature(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, + secp256k1_ecdsa_signature *signature UNNEEDED) +{ fprintf(stderr, "fromwire_secp256k1_ecdsa_signature called!\n"); abort(); } +/* Generated stub for fromwire_sha256 */ +void fromwire_sha256(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct sha256 *sha256 UNNEEDED) +{ fprintf(stderr, "fromwire_sha256 called!\n"); abort(); } +/* Generated stub for fromwire_tal_arrn */ +u8 *fromwire_tal_arrn(const tal_t *ctx UNNEEDED, + const u8 **cursor UNNEEDED, size_t *max UNNEEDED, size_t num UNNEEDED) +{ fprintf(stderr, "fromwire_tal_arrn called!\n"); abort(); } +/* Generated stub for fromwire_u32 */ +u32 fromwire_u32(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_u32 called!\n"); abort(); } +/* Generated stub for fromwire_u64 */ +u64 fromwire_u64(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_u64 called!\n"); abort(); } +/* Generated stub for fromwire_u8 */ +u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_u8 called!\n"); abort(); } +/* Generated stub for fromwire_u8_array */ +void fromwire_u8_array(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, u8 *arr UNNEEDED, size_t num UNNEEDED) +{ fprintf(stderr, "fromwire_u8_array called!\n"); abort(); } +/* Generated stub for siphash_seed */ +const struct siphash_seed *siphash_seed(void) +{ fprintf(stderr, "siphash_seed called!\n"); abort(); } +/* Generated stub for towire */ +void towire(u8 **pptr UNNEEDED, const void *data UNNEEDED, size_t len UNNEEDED) +{ fprintf(stderr, "towire called!\n"); abort(); } +/* Generated stub for towire_bool */ +void towire_bool(u8 **pptr UNNEEDED, bool v UNNEEDED) +{ fprintf(stderr, "towire_bool called!\n"); abort(); } +/* Generated stub for towire_secp256k1_ecdsa_signature */ +void towire_secp256k1_ecdsa_signature(u8 **pptr UNNEEDED, + const secp256k1_ecdsa_signature *signature UNNEEDED) +{ fprintf(stderr, "towire_secp256k1_ecdsa_signature called!\n"); abort(); } +/* Generated stub for towire_sha256 */ +void towire_sha256(u8 **pptr UNNEEDED, const struct sha256 *sha256 UNNEEDED) +{ fprintf(stderr, "towire_sha256 called!\n"); abort(); } +/* Generated stub for towire_u32 */ +void towire_u32(u8 **pptr UNNEEDED, u32 v UNNEEDED) +{ fprintf(stderr, "towire_u32 called!\n"); abort(); } +/* Generated stub for towire_u64 */ +void towire_u64(u8 **pptr UNNEEDED, u64 v UNNEEDED) +{ fprintf(stderr, "towire_u64 called!\n"); abort(); } +/* Generated stub for towire_u8 */ +void towire_u8(u8 **pptr UNNEEDED, u8 v UNNEEDED) +{ fprintf(stderr, "towire_u8 called!\n"); abort(); } +/* Generated stub for towire_u8_array */ +void towire_u8_array(u8 **pptr UNNEEDED, const u8 *arr UNNEEDED, size_t num UNNEEDED) +{ fprintf(stderr, "towire_u8_array called!\n"); abort(); } +/* AUTOGENERATED MOCKS END */ + +static void test_append_empty(void) +{ + int *arr = tal_arr(NULL, int, 0); + int one[] = { 1, 2, 3 }; + + tal_arr_append(&arr, tal_dup_arr(arr, int, one, ARRAY_SIZE(one), 0)); + + assert(tal_count(arr) == 3); + assert(arr[0] == 1); + assert(arr[1] == 2); + assert(arr[2] == 3); + + tal_free(arr); +} + +static void test_append_nonempty(void) +{ + int *arr = tal_arr(NULL, int, 2); + arr[0] = 10; + arr[1] = 20; + + int more[] = { 30, 40 }; + + tal_arr_append(&arr, tal_dup_arr(arr, int, more, ARRAY_SIZE(more), 0)); + + assert(tal_count(arr) == 4); + assert(arr[0] == 10); + assert(arr[1] == 20); + assert(arr[2] == 30); + assert(arr[3] == 40); + + tal_free(arr); +} + +static void test_appendn_partial(void) +{ + int *arr = tal_arr(NULL, int, 1); + arr[0] = 5; + + int more[] = { 6, 7, 8, 9 }; + + tal_arr_appendn(&arr, more, 2); + + assert(tal_count(arr) == 3); + assert(arr[0] == 5); + assert(arr[1] == 6); + assert(arr[2] == 7); + + tal_free(arr); +} + +static void test_appendn_zero(void) +{ + int *arr = tal_arr(NULL, int, 3); + arr[0] = 1; + arr[1] = 2; + arr[2] = 3; + + int more[] = { 4, 5 }; + + tal_arr_appendn(&arr, more, 0); + + assert(tal_count(arr) == 3); + assert(arr[0] == 1); + assert(arr[1] == 2); + assert(arr[2] == 3); + + tal_free(arr); +} + +static void test_append_structs(void) +{ + struct foo { + int a; + int b; + }; + + struct foo *arr = tal_arr(NULL, struct foo, 1); + arr[0].a = 1; + arr[0].b = 2; + + struct foo more[] = { + { 3, 4 }, + { 5, 6 }, + }; + + tal_arr_append(&arr, tal_dup_arr(arr, struct foo, more, ARRAY_SIZE(more), 0)); + + assert(tal_count(arr) == 3); + assert(arr[0].a == 1 && arr[0].b == 2); + assert(arr[1].a == 3 && arr[1].b == 4); + assert(arr[2].a == 5 && arr[2].b == 6); + + tal_free(arr); +} + +static void test_append_take(void) +{ + int *arr = tal_arr(NULL, int, 0); + int more[] = { 4, 5 }; + const int *moreptr = tal_dup_arr(NULL, int, more, ARRAY_SIZE(more), 0); + + tal_arr_appendn(&arr, take(moreptr), 1); + moreptr = tal_dup_arr(NULL, int, more, ARRAY_SIZE(more), 0); + tal_arr_append(&arr, take(moreptr)); + + assert(tal_count(arr) == 3); + assert(arr[0] == 4); + assert(arr[1] == 4); + assert(arr[2] == 5); + + tal_free(arr); +} + +int main(int argc, char *argv[]) +{ + common_setup(argv[0]); + + test_append_empty(); + test_append_nonempty(); + test_appendn_partial(); + test_appendn_zero(); + test_append_structs(); + test_append_take(); + + common_shutdown(); +} diff --git a/common/utils.c b/common/utils.c index 102eed7a59b3..860cd446a4d4 100644 --- a/common/utils.c +++ b/common/utils.c @@ -147,6 +147,28 @@ void tal_arr_remove_(void *p, size_t elemsize, size_t n) tal_resize((char **)p, len - elemsize); } +static void tal_arr_append_bytes(void *p, const void *append, size_t bytes) +{ + void **pptr = p; + size_t oldsize = tal_bytelen(*pptr); + tal_resize(pptr, oldsize + bytes); + /* Blah blah blah memcpy NULL blah blah */ + if (append || bytes) + memcpy(*pptr + oldsize, memcheck(append, bytes), bytes); + if (taken(append)) + tal_free(append); +} + +void tal_arr_append_(void *p, const void *append TAKES) +{ + tal_arr_append_bytes(p, append, tal_bytelen(append)); +} + +void tal_arr_appendn_(void *p, const void *append TAKES, size_t bytes) +{ + tal_arr_append_bytes(p, append, bytes); +} + /* Check for valid UTF-8 */ bool utf8_check(const void *vbuf, size_t buflen) { diff --git a/common/utils.h b/common/utils.h index cc378e62ff1d..7a5c98aa0cf9 100644 --- a/common/utils.h +++ b/common/utils.h @@ -104,6 +104,21 @@ static inline void tal_free_if_taken(const tal_t *p) tal_free(p); } +/** + * Append one tal array to another (TAKES) + */ +#define tal_arr_append(pptr, append) \ + tal_arr_append_((pptr) + 0*sizeof(*(pptr) == (append)), (append)) + +/** + * Append an array of appendnum elements to a tal arr (TAKES) + */ +#define tal_arr_appendn(pptr, append, appendnum) \ + tal_arr_appendn_((pptr), (append), (appendnum) * sizeof(*append) + 0*sizeof(*(pptr) == (append))) + +void tal_arr_append_(void *p, const void *append TAKES); +void tal_arr_appendn_(void *p, const void *append TAKES, size_t bytes); + /* Check for valid UTF-8 */ bool utf8_check(const void *buf, size_t buflen); diff --git a/connectd/multiplex.c b/connectd/multiplex.c index 46e3aeb0d841..59e483d97596 100644 --- a/connectd/multiplex.c +++ b/connectd/multiplex.c @@ -376,7 +376,6 @@ static bool is_urgent(enum peer_wire type) static u8 *process_batch_elements(const tal_t *ctx, struct peer *peer, const u8 *msg TAKES) { u8 *ret = tal_arr(ctx, u8, 0); - size_t ret_size = 0; const u8 *cursor = msg; size_t plen = tal_count(msg); @@ -422,9 +421,7 @@ static u8 *process_batch_elements(const tal_t *ctx, struct peer *peer, const u8 enc_msg = cryptomsg_encrypt_msg(tmpctx, &peer->cs, take(element_bytes)); - tal_resize(&ret, ret_size + tal_bytelen(enc_msg)); - memcpy(&ret[ret_size], enc_msg, tal_bytelen(enc_msg)); - ret_size += tal_bytelen(enc_msg); + tal_arr_append(&ret, enc_msg); } while(plen); diff --git a/connectd/test/run-websocket.c b/connectd/test/run-websocket.c index d31e889b2533..2d133f062663 100644 --- a/connectd/test/run-websocket.c +++ b/connectd/test/run-websocket.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -31,9 +32,7 @@ static bool my_read_all(int fd, void *buf, size_t count) static ssize_t my_write(int fd, const void *buf, size_t count) { - size_t buflen = tal_bytelen(my_wbuf); - tal_resize(&my_wbuf, buflen + count); - memcpy(my_wbuf + buflen, buf, count); + tal_arr_appendn(&my_wbuf, buf, count); return count; } static bool my_write_all(int fd, const void *buf, size_t count) diff --git a/contrib/msggen/msggen/schema.json b/contrib/msggen/msggen/schema.json index e79cb442a168..8f7c24fbc9d1 100644 --- a/contrib/msggen/msggen/schema.json +++ b/contrib/msggen/msggen/schema.json @@ -34,7 +34,7 @@ "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." ], "see_also": [ - "lightning-pay(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" @@ -11084,7 +11084,7 @@ "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." ], "see_also": [ - "lightning-pay(7)", + "lightning-xpay(7)", "lightning-offer(7)", "lightning-fetchinvoice(7)", "lightning-sendinvoice(7)", @@ -11966,7 +11966,7 @@ "see_also": [ "lightning-listpays(7)", "lightning-listsendpays(7)", - "lightning-paystatus(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" @@ -14120,7 +14120,7 @@ ], "see_also": [ "lightning-sendinvoice(7)", - "lightning-pay(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" @@ -16297,6 +16297,8 @@ "rpc": "getroute", "title": "Command for routing a payment (low-level)", "description": [ + "NOTE: As of v26.06, getroute is deprecated in favor of **getroutes**. The usual equivalent is to use getroutes with `layers` including `auto.localchans`, `auto.sourcefree` and `maxparts` set to 1.", + "", "The **getroute** RPC command attempts to find the best route for the payment of *amount_msat* to lightning node *id*, such that the payment will arrive at *id* with *cltv*.", "", "There are two considerations for how good a route is: how low the fees are, and how long your payment will get stuck in a delayed output if a node goes down during the process. ." @@ -16577,7 +16579,7 @@ "", "Layers are generally maintained by plugins, either to contain persistent information about capacities which have been discovered, or to contain transient information for this particular payment (such as blinded paths or routehints).", "", - "There are four automatic layers: *auto.localchans* contains information on local channels from this node (including non-public ones), and their exact current spendable capacities. *auto.sourcefree* overrides all channels (including those from previous layers) leading out of the *source* to be zero fee and zero delay. These are both useful in the case where the source is the current node. *auto.no_mpp_support* forces getroutes to return a single path solution which is useful for payments for which MPP is not supported. And *auto.include_fees* that fixes the send amount and deducts fee from there, ie. the receiver pays for fees instead of the sender." + "There are some automatic layers: *auto.localchans* contains information on local channels from this node (including non-public ones), and their exact current spendable capacities. *auto.sourcefree* overrides all channels (including those from previous layers) leading out of the *source* to be zero fee and zero delay. These are both useful in the case where the source is the current node. *auto.include_fees* that fixes the send amount and deducts fee from there, ie. the receiver pays for fees instead of the sender. *auto.no_mpp_support* is deprecated in v26.06: use `maxparts=1` instead." ], "categories": [ "readonly" @@ -16703,9 +16705,12 @@ "additionalProperties": false, "required": [ "short_channel_id_dir", - "next_node_id", - "amount_msat", - "delay" + "node_id_in", + "node_id_out", + "amount_in_msat", + "amount_out_msat", + "cltv_in", + "cltv_out" ], "properties": { "short_channel_id_dir": { @@ -16714,22 +16719,76 @@ "The channel and direction joining these nodes." ] }, + "amount_in_msat": { + "added": "v26.06", + "type": "msat", + "description": [ + "The amount to send into this hop." + ] + }, + "amount_out_msat": { + "added": "v26.06", + "type": "msat", + "description": [ + "The amount which arrives at the far end of this hop." + ] + }, + "node_id_in": { + "added": "v26.06", + "type": "pubkey", + "description": [ + "The peer id at the start of this hop." + ] + }, + "node_id_out": { + "added": "v26.06", + "type": "pubkey", + "description": [ + "The peer id at the end of this hop." + ] + }, + "cltv_in": { + "added": "v26.06", + "type": "u32", + "description": [ + "The total CLTV expected by the node at the start of this hop." + ] + }, + "cltv_out": { + "added": "v26.06", + "type": "u32", + "description": [ + "The total CLTV expected by the node at the end of this hop." + ] + }, "amount_msat": { "type": "msat", "description": [ "The amount to send into this hop." + ], + "deprecated": [ + "v26.06", + "v27.06" ] }, "next_node_id": { "type": "pubkey", "description": [ "The peer id at the end of this hop." + ], + "deprecated": [ + "v26.06", + "v27.06" ] }, "delay": { "type": "u32", "description": [ "The total CLTV expected by the node at the start of this hop." + ], + "deprecated": [ + "v26.06", + "v27.06" ] } } @@ -16740,6 +16799,13 @@ } } }, + "errors": [ + "The following error codes may occur:", + "", + "- -1: Catchall nonspecific error.", + "- 205: Unable to find a route.", + "- 206: Route too expensive. Either the max_delay or maxfee_msat was exceeded." + ], "author": [ "[lagrang3@protonmail.com](mailto:lagrang3@protonmail.com) wrote the minimum-cost-flow solver, Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) wrote the API and this documentation." ], @@ -17041,6 +17107,13 @@ "description": [ "Amount that is actually delivered to the destination (i.e. `amount_msat` minus fees), for showing in listsendpays (confusingly, as `amount_msat`)." ] + }, + "destination": { + "type": "pubkey", + "added": "v26.06", + "description": [ + "Destination id (for *waitsendpay* and *listsendpays*). If not set, will be extracted if possible from *invstring*." + ] } } }, @@ -17324,7 +17397,7 @@ "see_also": [ "lightning-listinvoices(7)", "lightning-delinvoice(7)", - "lightning-pay(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" @@ -17536,6 +17609,8 @@ "rpc": "keysend", "title": "Send funds to a node without an invoice", "description": [ + "WARNING: deprecated: use *xkeysend* which uses askrene for better route calculation (and learns from previous payments).", + "", "The **keysend** RPC command attempts to find a route to the given destination, and send the specified amount to it. Unlike the `pay` RPC command the `keysend` command does not require an invoice, instead it uses the `destination` node ID, and `amount` to find a route to the specified node.", "", "In order for the destination to be able to claim the payment, the `payment_key` is randomly generated by the sender and included in the encrypted payload for the destination. As a consequence there is not proof-of-payment, like there is with an invoice where the `payment_key` is generated on the destination, and the only way sender could have it is by sending a payment. Please ensure that this matches your use-case when using `keysend`.", @@ -17753,6 +17828,7 @@ "Christian Decker [decker@blockstream.com](mailto:decker@blockstream.com) is mainly responsible." ], "see_also": [ + "lightning-xkeysend(7)", "lightning-listpays(7)", "lightning-decode(7)", "lightning-listinvoices(7)", @@ -24826,7 +24902,7 @@ "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." ], "see_also": [ - "lightning-pay(7)", + "lightning-xpay(7)", "lightning-paystatus(7)", "lightning-listsendpays(7)" ], @@ -30359,9 +30435,11 @@ "$schema": "../rpc-schema-draft.json", "type": "object", "rpc": "pay", - "title": "Command for sending a payment to a BOLT11 invoice", + "title": "Command for sending a payment to a BOLT11/BOLT12 invoice", "description": [ - "The **pay** RPC command attempts to find a route to the given destination, and send the funds it asks for. .", + "NOTE: As of v26.06, xpay transparantly handles most **pay** invocations, and **pay** is deprecated.", + "", + "The **pay** RPC command attempts to find a route to the given destination, and send the funds it asks for.", "", "The response will occur when the payment fails or succeeds. Once a payment has succeeded, calls to **pay** with the same *bolt11* will succeed immediately.", "", @@ -30376,6 +30454,8 @@ "bolt11": { "type": "string", "description": [ + "NOTE: `invstring` is an alternate name for this parameter, since v26.06, for xpay compatibility.", + "", "Bolt11 or bolt12 invoice (such as one received from lightningd-fetchinvoice(7)). For a bolt11 invoice, if it does not contain an amount, *amount_msat* is required, otherwise if it is specified it must be *null*." ] }, @@ -30585,6 +30665,7 @@ "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." ], "see_also": [ + "lightning-xpay(7)", "lightning-listpays(7)", "lightning-decode(7)", "lightning-listinvoices(7)", @@ -31234,7 +31315,7 @@ "Ken Sedgwick [ken@bonsai.com](mailto:ken@bonsai.com) is mainly responsible." ], "see_also": [ - "lightning-pay(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" @@ -31712,6 +31793,8 @@ "title": "Command for sending a payment to a BOLT11 invoice", "added": "v23.08", "description": [ + "WARNING: Deprecated, scheduled for removal in v27.03", + "", "**renepay** is a new payment plugin based on Pickhardt-Richter optimization method for Multi-Path-Payments. This implementation has not been thoroughly tested and it should be used with caution.", "", "The response will occur when the payment fails or succeeds. Once a payment has succeeded, calls to **renepay** with the same *invstring* will not lead to a new payment attempt, but instead it will succeed immediately.", @@ -31974,6 +32057,8 @@ "title": "Command for quering the status of previous renepay attempts", "added": "v23.08", "description": [ + "WARNING: Deprecated, scheduled for removal in v27.03", + "", "The **renepaystatus** RPC command queries the payment plugin **renepay** for the status of previous payment attempts.", "", "This command always succeeds." @@ -32978,7 +33063,7 @@ "description": [ "The **sendpay** RPC command attempts to send funds associated with the given *payment_hash*, along a route to the final destination in the route.", "", - "Generally, a client would call lightning-getroute(7) to resolve a route, then use **sendpay** to send it. If it fails, it would call lightning-getroute(7) again to retry. If the route is empty, a payment-to-self is attempted.", + "Generally, a client would call lightning-getroute(7) or lightning-getroutes(7) to resolve a route, then use **sendpay** to send it. This is why *sendpay*'s route ignores unknown members: it uses the fields from either of those commands and ignored others. If it fails, it would call lightning-getroutes(7) again to retry. If the route is empty, a payment-to-self is attempted.", "", "The response will occur when the payment is on its way to the destination. The **sendpay** RPC command does not wait for definite success or definite failure of the payment (except for already-succeeded payments, or to-self payments). Instead, use the **waitsendpay** RPC command to poll or wait for definite success or definite failure.", "", @@ -32995,36 +33080,58 @@ "type": "array", "items": { "type": "object", - "required": [ - "amount_msat", - "id", - "delay", - "channel" - ], "additionalProperties": true, "properties": { - "id": { + "short_channel_id_dir": { + "type": "short_channel_id_dir", + "added": "v26.06", + "description": [ + "The channel joining these nodes." + ] + }, + "node_id_out": { "type": "pubkey", + "added": "v26.06", "description": [ "The node at the end of this hop." ] }, + "amount_out_msat": { + "added": "v26.06", + "type": "msat", + "description": [ + "The amount expected at the far end of this hop." + ] + }, + "cltv_out": { + "added": "v26.06", + "type": "u32", + "description": [ + "The total CLTV expected by the node at the end of this hop." + ] + }, + "id": { + "type": "pubkey", + "description": [ + "The node at the end of this hop (older name for `node_id_out`)." + ] + }, "channel": { "type": "short_channel_id", "description": [ - "The channel joining these nodes." + "The channel joining these nodes (older name for `short_channel_id_dir`)" ] }, "delay": { "type": "u32", "description": [ - "The total CLTV expected by the node at the end of this hop." + "The total CLTV expected by the node at the end of this hop (older name for `cltv_out`)." ] }, "amount_msat": { "type": "msat", "description": [ - "The amount expected by the node at the end of this hop." + "The amount expected by the node at the end of this hop (older name for `amount_out_msat`)." ] } } @@ -33325,7 +33432,7 @@ "lightning-delinvoice(7)", "lightning-getroute(7)", "lightning-invoice(7)", - "lightning-pay(7)", + "lightning-xpay(7)", "lightning-waitsendpay(7)" ], "resources": [ @@ -38415,7 +38522,7 @@ ], "see_also": [ "lightning-sendpay(7)", - "lightning-pay(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" @@ -38585,17 +38692,153 @@ } ] }, + "xkeysend.json": { + "$schema": "../rpc-schema-draft.json", + "type": "object", + "rpc": "xkeysend", + "title": "Send funds to a node without an invoice", + "added": "v26.06", + "description": [ + "The **xkeysend** RPC command attempts to find a route to the given destination, and send the specified amount to it. Unlike the `xpay` RPC command the `xkeysend` command does not require an invoice, instead it uses the `destination` node ID, and `amount` to find a route to the specified node.", + "", + "In order for the destination to be able to claim the payment, the `payment_key` is randomly generated by the sender and included in the encrypted payload for the destination. As a consequence there is not proof-of-payment, like there is with an invoice where the `payment_key` is generated on the destination, and the only way sender could have it is by sending a payment. Please ensure that this matches your use-case when using `xkeysend`.", + "", + "This replaces the older `keysend` command." + ], + "request": { + "required": [ + "destination", + "amount_msat" + ], + "additionalProperties": false, + "properties": { + "destination": { + "type": "pubkey", + "description": [ + "The 33 byte, hex-encoded, node ID of the node that the payment should go to." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "A whole number, or a whole number with suffix `msat` or `sat`, or a three decimal point number with suffix `sat`, or an 1 to 11 decimal point number suffixed by `btc`." + ] + }, + "label": { + "type": "string", + "description": [ + "Attach a label to the payment for which is returned in `listpays` and `listsendpays`. This is for your own use: it is not visible to the recipient." + ] + }, + "maxfee": { + "type": "msat", + "description": [ + "*maxfee* creates an absolute limit on what fee we will pay." + ] + }, + "layers": { + "type": "array", + "description": [ + "These are askrene layers to apply: these can alter the topology or provide additional information on the lightning network. See askrene-create-layer." + ], + "items": { + "type": "string", + "description": [ + "name of an existing layer" + ] + } + }, + "retry_for": { + "type": "u32", + "description": [ + "Until *retry_for* seconds passes, the command will keep finding routes and retrying the payment. However, a payment may be delayed for up to `maxdelay` blocks by another node; clients should be prepared for this worst case." + ], + "default": "60 seconds" + }, + "maxdelay": { + "type": "u32", + "description": [ + "Number of blocks the payment may be delayed." + ] + }, + "extratlvs": { + "type": "object", + "additionalProperties": true, + "required": [], + "description": [ + "Dictionary of additional fields to insert into the final tlv. The format is 'fieldnumber': 'hexstring'." + ] + } + } + }, + "response": { + "required": [ + "payment_preimage", + "failed_parts", + "successful_parts", + "amount_msat", + "amount_sent_msat" + ], + "properties": { + "payment_preimage": { + "type": "secret", + "description": [ + "The proof of payment: SHA256 of this **payment_hash**." + ] + }, + "failed_parts": { + "type": "u64", + "description": [ + "How many separate payment parts failed." + ] + }, + "successful_parts": { + "type": "u64", + "description": [ + "How many separate payment parts succeeded (or are anticipated to succeed). This will be at least one." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "Amount the recipient received." + ] + }, + "amount_sent_msat": { + "type": "msat", + "description": [ + "Total amount we sent (including fees)." + ] + } + }, + "post_return_value_notes": [ + "Note that the return is the same as it is for `xpay`." + ] + }, + "author": [ + "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." + ], + "see_also": [ + "lightning-listpays(7)", + "lightning-askrene-create-layer(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-update-channel(7)" + ], + "resources": [ + "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" + ] + }, "xpay.json": { "$schema": "../rpc-schema-draft.json", "type": "object", "added": "v24.11", "additionalProperties": false, "rpc": "xpay", - "title": "Command for sending a payment for an invoice", + "title": "Command for sending a payment", "description": [ - "The **xpay** RPC command attempts to find routes to the given destination, and send the funds it asks for.", + "The **xpay** RPC command attempts to make the specified payment: it can look up BIP353 names (such as \u20bfrusty@blockstream.com), it can resolve simple offers (lno1...), and pay bolt11 (lnbc...) and bolt12 invoices (lni1...).", "", - "This plugin is simpler and more sophisticated than the older 'pay' plugin, but does not have all the same features." + "This plugin is both simpler and more sophisticated than the older 'pay' plugin." ], "request": { "required": [ @@ -38624,7 +38867,7 @@ "layers": { "type": "array", "description": [ - "These are askrene layers to apply in addition to xpay's own: these can alter the topology or provide additional information on the lightning network. See askrene-create-layer." + "These are askrene layers to apply in addition to xpay's own: these can alter the topology or provide additional information on the lightning network. This lets you exclude particular nodes or channels, or bias against them: see askrene-create-layer." ], "items": { "type": "string", @@ -38660,6 +38903,23 @@ "description": [ "A message that a payer is willing to send to a payee within an invoice request." ] + }, + "label": { + "type": "string", + "description": [ + "Attach a label to payments for which is returned in `listpays` and `listsendpays`. This is for your own use: it is not visible to the recipient." + ] + }, + "localinvreqid": { + "type": "hex", + "description": [ + "`localinvreqid` is used by offers to link a payment attempt to a local `invoice_request` offer created by lightningd-invoicerequest(7). This ensures that we only make a single payment for an offer, and that the offer is marked `used` once paid." + ] + }, + "dev_use_shadow": { + "hidden": true, + "type": "boolean", + "added": "v26.06" } } }, @@ -38718,7 +38978,7 @@ "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." ], "see_also": [ - "lightning-pay(7)", + "lightning-listpays(7)", "lightning-decode(7)" ], "resources": [ diff --git a/contrib/pyln-client/pyln/client/lightning.py b/contrib/pyln-client/pyln/client/lightning.py index 76b8eb8e3f0c..9128809fc46e 100644 --- a/contrib/pyln-client/pyln/client/lightning.py +++ b/contrib/pyln-client/pyln/client/lightning.py @@ -896,6 +896,24 @@ def getroute(self, node_id, amount_msat, riskfactor, cltv=9, fromid=None, } return self.call("getroute", payload) + def getroutes(self, source, destination, amount_msat, layers, maxfee_msat, + final_cltv, maxdelay=None, maxparts=None): + """Find routes from {source} to {destination} for {amount_msat}, + applying {layers}, paying no more than {maxfee_msat}, + ending in {final_cltv}. + """ + payload = { + "source": source, + "destination": destination, + "amount_msat": amount_msat, + "layers": layers, + "maxfee_msat": maxfee_msat, + "final_cltv": final_cltv, + "maxdelay": maxdelay, + "maxparts": maxparts, + } + return self.call("getroutes", payload) + def help(self, command=None): """ Show available commands, or just {command} if supplied. @@ -1168,6 +1186,25 @@ def pay(self, bolt11, amount_msat=None, label=None, riskfactor=None, } return self.call("pay", payload) + def xpay(self, invstring, amount_msat=None, maxfee=None, retry_for=None, + partial_msat=None, maxdelay=None, payer_note=None, label=None, localinvreqid=None, + dev_use_shadow=None): + """ + Send payment specified by {invstring}. + """ + payload = { + "invstring": invstring, + "amount_msat": amount_msat, + "maxfee": maxfee, + "retry_for": retry_for, + "partial_msat": partial_msat, + "maxdelay": maxdelay, + "label": label, + "localinvreqid": localinvreqid, + "dev_use_shadow": dev_use_shadow, + } + return self.call("xpay", payload) + def openchannel_init(self, node_id, channel_amount, psbt, feerate=None, funding_feerate=None, announce=True, close_to=None, request_amt=None, channel_type=None): """Initiate an openchannel with a peer """ payload = { @@ -1666,3 +1703,24 @@ def keysend(self, destination, amount_msat, label=None, maxfeepercent=None, "extratlvs": extratlvs, } return self.call("keysend", payload) + + def xkeysend(self, destination, amount_msat, maxfee=None, + layers=None, retry_for=None, maxdelay=None, + extratlvs=None): + """ + """ + if extratlvs is not None and not isinstance(extratlvs, dict): + raise ValueError( + "extratlvs is not a dictionary with integer keys and hexadecimal values" + ) + + payload = { + "destination": destination, + "amount_msat": amount_msat, + "maxfee": maxfee, + "layers": layers, + "retry_for": retry_for, + "maxdelay": maxdelay, + "extratlvs": extratlvs, + } + return self.call("xkeysend", payload) diff --git a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py index fd8776864e5d..fe02cb9e92cf 100644 --- a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py +++ b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py @@ -25,7 +25,7 @@ from pyln.grpc import primitives_pb2 as primitives__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nnode.proto\x12\x03\x63ln\x1a\x10primitives.proto\"\x10\n\x0eGetinfoRequest\"\xb1\x04\n\x0fGetinfoResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05\x61lias\x18\x02 \x01(\t\x12\r\n\x05\x63olor\x18\x03 \x01(\x0c\x12\x11\n\tnum_peers\x18\x04 \x01(\r\x12\x1c\n\x14num_pending_channels\x18\x05 \x01(\r\x12\x1b\n\x13num_active_channels\x18\x06 \x01(\r\x12\x1d\n\x15num_inactive_channels\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\t\x12\x15\n\rlightning_dir\x18\t \x01(\t\x12\x32\n\x0cour_features\x18\n \x01(\x0b\x32\x17.cln.GetinfoOurFeaturesH\x00\x88\x01\x01\x12\x13\n\x0b\x62lockheight\x18\x0b \x01(\r\x12\x0f\n\x07network\x18\x0c \x01(\t\x12(\n\x13\x66\x65\x65s_collected_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x07\x61\x64\x64ress\x18\x0e \x03(\x0b\x32\x13.cln.GetinfoAddress\x12$\n\x07\x62inding\x18\x0f \x03(\x0b\x32\x13.cln.GetinfoBinding\x12\"\n\x15warning_bitcoind_sync\x18\x10 \x01(\tH\x01\x88\x01\x01\x12$\n\x17warning_lightningd_sync\x18\x11 \x01(\tH\x02\x88\x01\x01\x42\x0f\n\r_our_featuresB\x18\n\x16_warning_bitcoind_syncB\x1a\n\x18_warning_lightningd_sync\"R\n\x12GetinfoOurFeatures\x12\x0c\n\x04init\x18\x01 \x01(\x0c\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\x0c\x12\x0f\n\x07invoice\x18\x04 \x01(\x0c\"\xc4\x01\n\x0eGetinfoAddress\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.GetinfoAddress.GetinfoAddressType\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x00\x88\x01\x01\"G\n\x12GetinfoAddressType\x12\x07\n\x03\x44NS\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\n\n\x08_address\"\xac\x02\n\x0eGetinfoBinding\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.GetinfoBinding.GetinfoBindingType\x12\x14\n\x07\x61\x64\x64ress\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04port\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06socket\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07subtype\x18\x05 \x01(\tH\x03\x88\x01\x01\"_\n\x12GetinfoBindingType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x12\r\n\tWEBSOCKET\x10\x05\x42\n\n\x08_addressB\x07\n\x05_portB\t\n\x07_socketB\n\n\x08_subtype\"\xb5\x01\n\x10ListpeersRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x38\n\x05level\x18\x02 \x01(\x0e\x32$.cln.ListpeersRequest.ListpeersLevelH\x01\x88\x01\x01\"E\n\x0eListpeersLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\x0b\n\x07UNUSUAL\x10\x03\x12\t\n\x05TRACE\x10\x04\x42\x05\n\x03_idB\x08\n\x06_level\"7\n\x11ListpeersResponse\x12\"\n\x05peers\x18\x01 \x03(\x0b\x32\x13.cln.ListpeersPeers\"\xc9\x01\n\x0eListpeersPeers\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x11\n\tconnected\x18\x02 \x01(\x08\x12#\n\x03log\x18\x03 \x03(\x0b\x32\x16.cln.ListpeersPeersLog\x12\x0f\n\x07netaddr\x18\x05 \x03(\t\x12\x15\n\x08\x66\x65\x61tures\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0bremote_addr\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x0cnum_channels\x18\x08 \x01(\rB\x0b\n\t_featuresB\x0e\n\x0c_remote_addr\"\x88\x03\n\x11ListpeersPeersLog\x12?\n\titem_type\x18\x01 \x01(\x0e\x32,.cln.ListpeersPeersLog.ListpeersPeersLogType\x12\x18\n\x0bnum_skipped\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04time\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03log\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07node_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x11\n\x04\x64\x61ta\x18\x07 \x01(\x0cH\x05\x88\x01\x01\"t\n\x15ListpeersPeersLogType\x12\x0b\n\x07SKIPPED\x10\x00\x12\n\n\x06\x42ROKEN\x10\x01\x12\x0b\n\x07UNUSUAL\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\t\n\x05IO_IN\x10\x05\x12\n\n\x06IO_OUT\x10\x06\x12\t\n\x05TRACE\x10\x07\x42\x0e\n\x0c_num_skippedB\x07\n\x05_timeB\t\n\x07_sourceB\x06\n\x04_logB\n\n\x08_node_idB\x07\n\x05_data\"0\n\x10ListfundsRequest\x12\x12\n\x05spent\x18\x01 \x01(\x08H\x00\x88\x01\x01\x42\x08\n\x06_spent\"e\n\x11ListfundsResponse\x12&\n\x07outputs\x18\x01 \x03(\x0b\x32\x15.cln.ListfundsOutputs\x12(\n\x08\x63hannels\x18\x02 \x03(\x0b\x32\x16.cln.ListfundsChannels\"\xb9\x03\n\x10ListfundsOutputs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06output\x18\x02 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0cscriptpubkey\x18\x04 \x01(\x0c\x12\x14\n\x07\x61\x64\x64ress\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0credeemscript\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12<\n\x06status\x18\x07 \x01(\x0e\x32,.cln.ListfundsOutputs.ListfundsOutputsStatus\x12\x18\n\x0b\x62lockheight\x18\x08 \x01(\rH\x02\x88\x01\x01\x12\x10\n\x08reserved\x18\t \x01(\x08\x12\x1e\n\x11reserved_to_block\x18\n \x01(\rH\x03\x88\x01\x01\"Q\n\x16ListfundsOutputsStatus\x12\x0f\n\x0bUNCONFIRMED\x10\x00\x12\r\n\tCONFIRMED\x10\x01\x12\t\n\x05SPENT\x10\x02\x12\x0c\n\x08IMMATURE\x10\x03\x42\n\n\x08_addressB\x0f\n\r_redeemscriptB\x0e\n\x0c_blockheightB\x14\n\x12_reserved_to_block\"\x97\x02\n\x11ListfundsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12$\n\x0four_amount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x04 \x01(\x0c\x12\x16\n\x0e\x66unding_output\x18\x05 \x01(\r\x12\x11\n\tconnected\x18\x06 \x01(\x08\x12 \n\x05state\x18\x07 \x01(\x0e\x32\x11.cln.ChannelState\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x12\n\nchannel_id\x18\t \x01(\x0c\x42\x13\n\x11_short_channel_id\"\xbb\x03\n\x0eSendpayRequest\x12 \n\x05route\x18\x01 \x03(\x0b\x32\x11.cln.SendpayRoute\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x13\n\x06partid\x18\x07 \x01(\x04H\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\t \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x08\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_bolt11B\x11\n\x0f_payment_secretB\t\n\x07_partidB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x13\n\x11_payment_metadataB\x0e\n\x0c_description\"\x96\x05\n\x0fSendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x32\n\x06status\x18\x04 \x01(\x0e\x32\".cln.SendpayResponse.SendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x14\n\x07message\x18\x0e \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0f \x01(\x04H\t\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\"*\n\rSendpayStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\x0f\n\r_completed_atB\x10\n\x0e_updated_index\"\\\n\x0cSendpayRoute\x12\n\n\x02id\x18\x02 \x01(\x0c\x12\r\n\x05\x64\x65lay\x18\x03 \x01(\r\x12\x0f\n\x07\x63hannel\x18\x04 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"\x93\x01\n\x13ListchannelsRequest\x12\x1d\n\x10short_channel_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06source\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\t\n\x07_sourceB\x0e\n\x0c_destination\"C\n\x14ListchannelsResponse\x12+\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x19.cln.ListchannelsChannels\"\xb3\x03\n\x14ListchannelsChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\x0e\n\x06public\x18\x04 \x01(\x08\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\rmessage_flags\x18\x06 \x01(\r\x12\x15\n\rchannel_flags\x18\x07 \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x08 \x01(\x08\x12\x13\n\x0blast_update\x18\t \x01(\r\x12\x1d\n\x15\x62\x61se_fee_millisatoshi\x18\n \x01(\r\x12\x19\n\x11\x66\x65\x65_per_millionth\x18\x0b \x01(\r\x12\r\n\x05\x64\x65lay\x18\x0c \x01(\r\x12&\n\x11htlc_minimum_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x11htlc_maximum_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x0f \x01(\x0c\x12\x11\n\tdirection\x18\x10 \x01(\rB\x14\n\x12_htlc_maximum_msat\"#\n\x10\x41\x64\x64gossipRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x13\n\x11\x41\x64\x64gossipResponse\"\xac\x01\n\x14\x41\x64\x64psbtoutputRequest\x12\x1c\n\x07satoshi\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\x08locktime\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_locktimeB\x0e\n\x0c_initialpsbtB\x0e\n\x0c_destination\"U\n\x15\x41\x64\x64psbtoutputResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1e\n\x16\x65stimated_added_weight\x18\x02 \x01(\r\x12\x0e\n\x06outnum\x18\x03 \x01(\r\"O\n\x14\x41utocleanonceRequest\x12*\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystem\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x04\"G\n\x15\x41utocleanonceResponse\x12.\n\tautoclean\x18\x01 \x01(\x0b\x32\x1b.cln.AutocleanonceAutoclean\"\x89\x05\n\x16\x41utocleanonceAutoclean\x12L\n\x11succeededforwards\x18\x01 \x01(\x0b\x32,.cln.AutocleanonceAutocleanSucceededforwardsH\x00\x88\x01\x01\x12\x46\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32).cln.AutocleanonceAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x44\n\rsucceededpays\x18\x03 \x01(\x0b\x32(.cln.AutocleanonceAutocleanSucceededpaysH\x02\x88\x01\x01\x12>\n\nfailedpays\x18\x04 \x01(\x0b\x32%.cln.AutocleanonceAutocleanFailedpaysH\x03\x88\x01\x01\x12\x42\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32\'.cln.AutocleanonceAutocleanPaidinvoicesH\x04\x88\x01\x01\x12H\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32*.cln.AutocleanonceAutocleanExpiredinvoicesH\x05\x88\x01\x01\x12\x44\n\rnetworkevents\x18\x07 \x01(\x0b\x32(.cln.AutocleanonceAutocleanNetworkeventsH\x06\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoicesB\x10\n\x0e_networkevents\"M\n\'AutocleanonceAutocleanSucceededforwards\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"J\n$AutocleanonceAutocleanFailedforwards\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"I\n#AutocleanonceAutocleanSucceededpays\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"F\n AutocleanonceAutocleanFailedpays\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"H\n\"AutocleanonceAutocleanPaidinvoices\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"K\n%AutocleanonceAutocleanExpiredinvoices\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"I\n#AutocleanonceAutocleanNetworkevents\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"W\n\x16\x41utocleanstatusRequest\x12/\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystemH\x00\x88\x01\x01\x42\x0c\n\n_subsystem\"K\n\x17\x41utocleanstatusResponse\x12\x30\n\tautoclean\x18\x01 \x01(\x0b\x32\x1d.cln.AutocleanstatusAutoclean\"\x99\x05\n\x18\x41utocleanstatusAutoclean\x12N\n\x11succeededforwards\x18\x01 \x01(\x0b\x32..cln.AutocleanstatusAutocleanSucceededforwardsH\x00\x88\x01\x01\x12H\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32+.cln.AutocleanstatusAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x46\n\rsucceededpays\x18\x03 \x01(\x0b\x32*.cln.AutocleanstatusAutocleanSucceededpaysH\x02\x88\x01\x01\x12@\n\nfailedpays\x18\x04 \x01(\x0b\x32\'.cln.AutocleanstatusAutocleanFailedpaysH\x03\x88\x01\x01\x12\x44\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32).cln.AutocleanstatusAutocleanPaidinvoicesH\x04\x88\x01\x01\x12J\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32,.cln.AutocleanstatusAutocleanExpiredinvoicesH\x05\x88\x01\x01\x12\x46\n\rnetworkevents\x18\x07 \x01(\x0b\x32*.cln.AutocleanstatusAutocleanNetworkeventsH\x06\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoicesB\x10\n\x0e_networkevents\"g\n)AutocleanstatusAutocleanSucceededforwards\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"d\n&AutocleanstatusAutocleanFailedforwards\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"c\n%AutocleanstatusAutocleanSucceededpays\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"`\n\"AutocleanstatusAutocleanFailedpays\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"b\n$AutocleanstatusAutocleanPaidinvoices\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"e\n\'AutocleanstatusAutocleanExpiredinvoices\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"c\n%AutocleanstatusAutocleanNetworkevents\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"U\n\x13\x43heckmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\r\n\x05zbase\x18\x02 \x01(\t\x12\x13\n\x06pubkey\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x42\t\n\x07_pubkey\"8\n\x14\x43heckmessageResponse\x12\x10\n\x08verified\x18\x01 \x01(\x08\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\"\xcb\x02\n\x0c\x43loseRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1e\n\x11unilateraltimeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\tH\x01\x88\x01\x01\x12!\n\x14\x66\x65\x65_negotiation_step\x18\x04 \x01(\tH\x02\x88\x01\x01\x12)\n\rwrong_funding\x18\x05 \x01(\x0b\x32\r.cln.OutpointH\x03\x88\x01\x01\x12\x1f\n\x12\x66orce_lease_closed\x18\x06 \x01(\x08H\x04\x88\x01\x01\x12\x1e\n\x08\x66\x65\x65range\x18\x07 \x03(\x0b\x32\x0c.cln.FeerateB\x14\n\x12_unilateraltimeoutB\x0e\n\x0c_destinationB\x17\n\x15_fee_negotiation_stepB\x10\n\x0e_wrong_fundingB\x15\n\x13_force_lease_closed\"\x93\x01\n\rCloseResponse\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.CloseResponse.CloseType\x12\x0b\n\x03txs\x18\x04 \x03(\x0c\x12\r\n\x05txids\x18\x05 \x03(\x0c\"5\n\tCloseType\x12\n\n\x06MUTUAL\x10\x00\x12\x0e\n\nUNILATERAL\x10\x01\x12\x0c\n\x08UNOPENED\x10\x02\"T\n\x0e\x43onnectRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\x04host\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04port\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x07\n\x05_hostB\x07\n\x05_port\"\xb4\x01\n\x0f\x43onnectResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0c\x12\x38\n\tdirection\x18\x03 \x01(\x0e\x32%.cln.ConnectResponse.ConnectDirection\x12$\n\x07\x61\x64\x64ress\x18\x04 \x01(\x0b\x32\x13.cln.ConnectAddress\"#\n\x10\x43onnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\xfb\x01\n\x0e\x43onnectAddress\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.ConnectAddress.ConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"P\n\x12\x43onnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"J\n\x14\x43reateinvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x10\n\x08preimage\x18\x03 \x01(\x0c\"\xe6\x05\n\x15\x43reateinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12>\n\x06status\x18\x06 \x01(\x0e\x32..cln.CreateinvoiceResponse.CreateinvoiceStatus\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x16\n\tpay_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x06\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12:\n\rpaid_outpoint\x18\x11 \x01(\x0b\x32\x1e.cln.CreateinvoicePaidOutpointH\t\x88\x01\x01\"8\n\x13\x43reateinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_paid_outpoint\"9\n\x19\x43reateinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xb4\x02\n\x10\x44\x61tastoreRequest\x12\x10\n\x03hex\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x36\n\x04mode\x18\x03 \x01(\x0e\x32#.cln.DatastoreRequest.DatastoreModeH\x01\x88\x01\x01\x12\x17\n\ngeneration\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\t\x12\x13\n\x06string\x18\x06 \x01(\tH\x03\x88\x01\x01\"p\n\rDatastoreMode\x12\x0f\n\x0bMUST_CREATE\x10\x00\x12\x10\n\x0cMUST_REPLACE\x10\x01\x12\x15\n\x11\x43REATE_OR_REPLACE\x10\x02\x12\x0f\n\x0bMUST_APPEND\x10\x03\x12\x14\n\x10\x43REATE_OR_APPEND\x10\x04\x42\x06\n\x04_hexB\x07\n\x05_modeB\r\n\x0b_generationB\t\n\x07_string\"\x82\x01\n\x11\x44\x61tastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"$\n\x15\x44\x61tastoreusageRequest\x12\x0b\n\x03key\x18\x01 \x03(\t\"S\n\x16\x44\x61tastoreusageResponse\x12\x39\n\x0e\x64\x61tastoreusage\x18\x01 \x01(\x0b\x32!.cln.DatastoreusageDatastoreusage\"@\n\x1c\x44\x61tastoreusageDatastoreusage\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x13\n\x0btotal_bytes\x18\x02 \x01(\x04\"\x9d\x01\n\x12\x43reateonionRequest\x12\"\n\x04hops\x18\x01 \x03(\x0b\x32\x14.cln.CreateonionHops\x12\x11\n\tassocdata\x18\x02 \x01(\x0c\x12\x18\n\x0bsession_key\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x17\n\nonion_size\x18\x04 \x01(\rH\x01\x88\x01\x01\x42\x0e\n\x0c_session_keyB\r\n\x0b_onion_size\"<\n\x13\x43reateonionResponse\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x16\n\x0eshared_secrets\x18\x02 \x03(\x0c\"2\n\x0f\x43reateonionHops\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"J\n\x13\x44\x65ldatastoreRequest\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x03 \x03(\tB\r\n\x0b_generation\"\x85\x01\n\x14\x44\x65ldatastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xb6\x01\n\x11\x44\x65linvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\x12\x37\n\x06status\x18\x02 \x01(\x0e\x32\'.cln.DelinvoiceRequest.DelinvoiceStatus\x12\x15\n\x08\x64\x65sconly\x18\x03 \x01(\x08H\x00\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\x0b\n\t_desconly\"\xcf\x05\n\x12\x44\x65linvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x38\n\x06status\x18\x07 \x01(\x0e\x32(.cln.DelinvoiceResponse.DelinvoiceStatus\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0c \x01(\x04\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x06\x88\x01\x01\x12\x16\n\tpay_index\x18\x0e \x01(\x04H\x07\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x14\n\x07paid_at\x18\x10 \x01(\x04H\t\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x11 \x01(\x0cH\n\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\x9f\x01\n\x17\x44\x65vforgetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nchannel_id\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05\x66orce\x18\x04 \x01(\x08H\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x08\n\x06_force\"Y\n\x18\x44\x65vforgetchannelResponse\x12\x0e\n\x06\x66orced\x18\x01 \x01(\x08\x12\x17\n\x0f\x66unding_unspent\x18\x02 \x01(\x08\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\"\x19\n\x17\x45mergencyrecoverRequest\")\n\x18\x45mergencyrecoverResponse\x12\r\n\x05stubs\x18\x01 \x03(\x0c\" \n\x1eGetemergencyrecoverdataRequest\"n\n\x1fGetemergencyrecoverdataResponse\x12\x10\n\x08\x66iledata\x18\x01 \x01(\x0c\x12\x1a\n\x12\x63\x61n_create_penalty\x18\x02 \x01(\x08\x12\x1d\n\x15\x62\x61\x63ked_up_channel_ids\x18\x03 \x03(\x0c\"Q\n\x13\x45xposesecretRequest\x12\x12\n\npassphrase\x18\x01 \x01(\t\x12\x17\n\nidentifier\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\r\n\x0b_identifier\"_\n\x14\x45xposesecretResponse\x12\x12\n\nidentifier\x18\x01 \x01(\t\x12\x0f\n\x07\x63odex32\x18\x02 \x01(\t\x12\x15\n\x08mnemonic\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x0b\n\t_mnemonic\"#\n\x0eRecoverRequest\x12\x11\n\thsmsecret\x18\x01 \x01(\t\"x\n\x0fRecoverResponse\x12\x32\n\x06result\x18\x01 \x01(\x0e\x32\".cln.RecoverResponse.RecoverResult\"1\n\rRecoverResult\x12 \n\x1cRECOVERY_RESTART_IN_PROGRESS\x10\x00\"$\n\x15RecoverchannelRequest\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"\'\n\x16RecoverchannelResponse\x12\r\n\x05stubs\x18\x01 \x03(\t\"\x99\x02\n\x0eInvoiceRequest\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05label\x18\x03 \x01(\t\x12\x11\n\tfallbacks\x18\x04 \x03(\t\x12\x15\n\x08preimage\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x11\n\x04\x63ltv\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18\x07 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x15\x65xposeprivatechannels\x18\x08 \x03(\t\x12\x19\n\x0c\x64\x65schashonly\x18\t \x01(\x08H\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x10.cln.AmountOrAnyB\x0b\n\t_preimageB\x07\n\x05_cltvB\t\n\x07_expiryB\x0f\n\r_deschashonly\"\xfe\x02\n\x0fInvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x16\n\x0epayment_secret\x18\x03 \x01(\x0c\x12\x12\n\nexpires_at\x18\x04 \x01(\x04\x12\x1d\n\x10warning_capacity\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x0fwarning_offline\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10warning_deadends\x18\x07 \x01(\tH\x02\x88\x01\x01\x12#\n\x16warning_private_unused\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x0bwarning_mpp\x18\t \x01(\tH\x04\x88\x01\x01\x12\x15\n\rcreated_index\x18\n \x01(\x04\x42\x13\n\x11_warning_capacityB\x12\n\x10_warning_offlineB\x13\n\x11_warning_deadendsB\x19\n\x17_warning_private_unusedB\x0e\n\x0c_warning_mpp\"\xe1\x01\n\x15InvoicerequestRequest\x12\x1b\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x05 \x01(\x04H\x02\x88\x01\x01\x12\x17\n\nsingle_use\x18\x06 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_issuerB\x08\n\x06_labelB\x12\n\x10_absolute_expiryB\r\n\x0b_single_use\"\x8b\x01\n\x16InvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"1\n\x1c\x44isableinvoicerequestRequest\x12\x11\n\tinvreq_id\x18\x01 \x01(\t\"\x92\x01\n\x1d\x44isableinvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"l\n\x1aListinvoicerequestsRequest\x12\x16\n\tinvreq_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0c\n\n_invreq_idB\x0e\n\x0c_active_only\"_\n\x1bListinvoicerequestsResponse\x12@\n\x0finvoicerequests\x18\x01 \x03(\x0b\x32\'.cln.ListinvoicerequestsInvoicerequests\"\x97\x01\n\"ListinvoicerequestsInvoicerequests\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"#\n\x14ListdatastoreRequest\x12\x0b\n\x03key\x18\x02 \x03(\t\"G\n\x15ListdatastoreResponse\x12.\n\tdatastore\x18\x01 \x03(\x0b\x32\x1b.cln.ListdatastoreDatastore\"\x87\x01\n\x16ListdatastoreDatastore\x12\x0b\n\x03key\x18\x01 \x03(\t\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xde\x02\n\x13ListinvoicesRequest\x12\x12\n\x05label\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x15\n\x08offer_id\x18\x04 \x01(\tH\x03\x88\x01\x01\x12>\n\x05index\x18\x05 \x01(\x0e\x32*.cln.ListinvoicesRequest.ListinvoicesIndexH\x04\x88\x01\x01\x12\x12\n\x05start\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x12\n\x05limit\x18\x07 \x01(\rH\x06\x88\x01\x01\"-\n\x11ListinvoicesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x0f\n\r_payment_hashB\x0b\n\t_offer_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListinvoicesResponse\x12+\n\x08invoices\x18\x01 \x03(\x0b\x32\x19.cln.ListinvoicesInvoices\"\xbc\x06\n\x14ListinvoicesInvoices\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListinvoicesInvoices.ListinvoicesInvoicesStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x16\n\tpay_index\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x14\n\x07paid_at\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0e \x01(\x0cH\x08\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\t\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\x12\x41\n\rpaid_outpoint\x18\x12 \x01(\x0b\x32%.cln.ListinvoicesInvoicesPaidOutpointH\x0b\x88\x01\x01\"?\n\x1aListinvoicesInvoicesStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x11\n\x0f_local_offer_idB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"@\n ListinvoicesInvoicesPaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xf6\x03\n\x10SendonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12)\n\tfirst_hop\x18\x02 \x01(\x0b\x32\x16.cln.SendonionFirstHop\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\x05label\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x16\n\x0eshared_secrets\x18\x05 \x03(\x0c\x12\x13\n\x06partid\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\t \x01(\x0cH\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x12+\n\x11total_amount_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\x0e\n\x0c_destinationB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x0e\n\x0c_descriptionB\x14\n\x12_total_amount_msat\"\xd0\x04\n\x11SendonionResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x36\n\x06status\x18\x03 \x01(\x0e\x32&.cln.SendonionResponse.SendonionStatus\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x06 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\n \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0b \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x07message\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06partid\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0e \x01(\x04\x12\x1a\n\rupdated_index\x18\x0f \x01(\x04H\x08\x88\x01\x01\",\n\x0fSendonionStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\t\n\x07_partidB\x10\n\x0e_updated_index\"P\n\x11SendonionFirstHop\x12\n\n\x02id\x18\x01 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\r\n\x05\x64\x65lay\x18\x03 \x01(\r\"\xa0\x03\n\x13ListsendpaysRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12@\n\x06status\x18\x03 \x01(\x0e\x32+.cln.ListsendpaysRequest.ListsendpaysStatusH\x02\x88\x01\x01\x12>\n\x05index\x18\x04 \x01(\x0e\x32*.cln.ListsendpaysRequest.ListsendpaysIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\";\n\x12ListsendpaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"-\n\x11ListsendpaysIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\t\n\x07_bolt11B\x0f\n\r_payment_hashB\t\n\x07_statusB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListsendpaysResponse\x12+\n\x08payments\x18\x01 \x03(\x0b\x32\x19.cln.ListsendpaysPayments\"\xe5\x05\n\x14ListsendpaysPayments\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListsendpaysPayments.ListsendpaysPaymentsStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\n \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0b \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\nerroronion\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06partid\x18\x0f \x01(\x04H\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\t\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x12 \x01(\x04H\n\x88\x01\x01\"C\n\x1aListsendpaysPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\r\n\x0b_erroronionB\x0e\n\x0c_descriptionB\t\n\x07_partidB\x10\n\x0e_updated_indexB\x0f\n\r_completed_at\"\x19\n\x17ListtransactionsRequest\"S\n\x18ListtransactionsResponse\x12\x37\n\x0ctransactions\x18\x01 \x03(\x0b\x32!.cln.ListtransactionsTransactions\"\xf8\x01\n\x1cListtransactionsTransactions\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\r\n\x05rawtx\x18\x02 \x01(\x0c\x12\x13\n\x0b\x62lockheight\x18\x03 \x01(\r\x12\x0f\n\x07txindex\x18\x04 \x01(\r\x12\x10\n\x08locktime\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x37\n\x06inputs\x18\t \x03(\x0b\x32\'.cln.ListtransactionsTransactionsInputs\x12\x39\n\x07outputs\x18\n \x03(\x0b\x32(.cln.ListtransactionsTransactionsOutputs\"S\n\"ListtransactionsTransactionsInputs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\r\n\x05index\x18\x02 \x01(\r\x12\x10\n\x08sequence\x18\x03 \x01(\r\"l\n#ListtransactionsTransactionsOutputs\x12\r\n\x05index\x18\x01 \x01(\r\x12\x14\n\x0cscriptPubKey\x18\x03 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\"M\n\x11MakesecretRequest\x12\x10\n\x03hex\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x13\n\x06string\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x06\n\x04_hexB\t\n\x07_string\"$\n\x12MakesecretResponse\x12\x0e\n\x06secret\x18\x01 \x01(\x0c\"\x93\x04\n\nPayRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rmaxfeepercent\x18\x04 \x01(\x01H\x01\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x03\x88\x01\x01\x12#\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x17\n\nriskfactor\x18\x08 \x01(\x01H\x05\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\n \x03(\t\x12 \n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0c \x01(\tH\x07\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\r \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0e \x01(\x0cH\t\x88\x01\x01\x12&\n\x0cpartial_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x42\x08\n\x06_labelB\x10\n\x0e_maxfeepercentB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\x0c\n\n_exemptfeeB\r\n\x0b_riskfactorB\t\n\x07_maxfeeB\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x0f\n\r_partial_msat\"\xfb\x02\n\x0bPayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x18\n\x0b\x64\x65stination\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\r\n\x05parts\x18\x05 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\x1awarning_partial_completion\x18\x08 \x01(\tH\x01\x88\x01\x01\x12*\n\x06status\x18\t \x01(\x0e\x32\x1a.cln.PayResponse.PayStatus\"2\n\tPayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x0e\n\x0c_destinationB\x1d\n\x1b_warning_partial_completion\"*\n\x10ListnodesRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x05\n\x03_id\"7\n\x11ListnodesResponse\x12\"\n\x05nodes\x18\x01 \x03(\x0b\x32\x13.cln.ListnodesNodes\"\xb8\x02\n\x0eListnodesNodes\x12\x0e\n\x06nodeid\x18\x01 \x01(\x0c\x12\x1b\n\x0elast_timestamp\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x12\n\x05\x61lias\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05\x63olor\x18\x04 \x01(\x0cH\x02\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18\x05 \x01(\x0cH\x03\x88\x01\x01\x12/\n\taddresses\x18\x06 \x03(\x0b\x32\x1c.cln.ListnodesNodesAddresses\x12@\n\x10option_will_fund\x18\x07 \x01(\x0b\x32!.cln.ListnodesNodesOptionWillFundH\x04\x88\x01\x01\x42\x11\n\x0f_last_timestampB\x08\n\x06_aliasB\x08\n\x06_colorB\x0b\n\t_featuresB\x13\n\x11_option_will_fund\"\xf2\x01\n\x1cListnodesNodesOptionWillFund\x12(\n\x13lease_fee_base_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x17\n\x0flease_fee_basis\x18\x02 \x01(\r\x12\x16\n\x0e\x66unding_weight\x18\x03 \x01(\r\x12.\n\x19\x63hannel_fee_max_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x30\n(channel_fee_max_proportional_thousandths\x18\x05 \x01(\r\x12\x15\n\rcompact_lease\x18\x06 \x01(\x0c\"\xe8\x01\n\x17ListnodesNodesAddresses\x12K\n\titem_type\x18\x01 \x01(\x0e\x32\x38.cln.ListnodesNodesAddresses.ListnodesNodesAddressesType\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x00\x88\x01\x01\"P\n\x1bListnodesNodesAddressesType\x12\x07\n\x03\x44NS\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\n\n\x08_address\"g\n\x15WaitanyinvoiceRequest\x12\x1a\n\rlastpay_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\x10\n\x0e_lastpay_indexB\n\n\x08_timeout\"\xbc\x05\n\x16WaitanyinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12@\n\x06status\x18\x04 \x01(\x0e\x32\x30.cln.WaitanyinvoiceResponse.WaitanyinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\t \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\r \x01(\x04\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12;\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1f.cln.WaitanyinvoicePaidOutpointH\t\x88\x01\x01\"-\n\x14WaitanyinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\":\n\x1aWaitanyinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"#\n\x12WaitinvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\"\xad\x05\n\x13WaitinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.WaitinvoiceResponse.WaitinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\t \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\r \x01(\x04\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12\x38\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1c.cln.WaitinvoicePaidOutpointH\t\x88\x01\x01\"*\n\x11WaitinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"7\n\x17WaitinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\x8e\x01\n\x12WaitsendpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x13\n\x06partid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x02\x88\x01\x01\x42\t\n\x07_partidB\n\n\x08_timeoutB\n\n\x08_groupid\"\xf7\x04\n\x13WaitsendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.WaitsendpayResponse.WaitsendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0e \x01(\x01H\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0f \x01(\x04\x12\x1a\n\rupdated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\"!\n\x11WaitsendpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\x0f\n\r_completed_atB\x10\n\x0e_updated_index\"\x97\x01\n\x0eNewaddrRequest\x12@\n\x0b\x61\x64\x64resstype\x18\x01 \x01(\x0e\x32&.cln.NewaddrRequest.NewaddrAddresstypeH\x00\x88\x01\x01\"3\n\x12NewaddrAddresstype\x12\n\n\x06\x42\x45\x43H32\x10\x00\x12\x07\n\x03\x41LL\x10\x02\x12\x08\n\x04P2TR\x10\x03\x42\x0e\n\x0c_addresstype\"M\n\x0fNewaddrResponse\x12\x13\n\x06\x62\x65\x63h32\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04p2tr\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_bech32B\x07\n\x05_p2tr\"\xb9\x01\n\x0fWithdrawRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\t\x12!\n\x07satoshi\x18\x02 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\"\n\x07\x66\x65\x65rate\x18\x05 \x01(\x0b\x32\x0c.cln.FeerateH\x01\x88\x01\x01\x42\n\n\x08_minconfB\n\n\x08_feerate\":\n\x10WithdrawResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0c\n\x04psbt\x18\x03 \x01(\t\"\xaf\x03\n\x0eKeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rmaxfeepercent\x18\x04 \x01(\x01H\x01\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x03\x88\x01\x01\x12#\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12+\n\nroutehints\x18\x08 \x01(\x0b\x32\x12.cln.RoutehintListH\x05\x88\x01\x01\x12&\n\textratlvs\x18\t \x01(\x0b\x32\x0e.cln.TlvStreamH\x06\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x42\x08\n\x06_labelB\x10\n\x0e_maxfeepercentB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\x0c\n\n_exemptfeeB\r\n\x0b_routehintsB\x0c\n\n_extratlvsB\t\n\x07_maxfee\"\xf2\x02\n\x0fKeysendResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x18\n\x0b\x64\x65stination\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\r\n\x05parts\x18\x05 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\x1awarning_partial_completion\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x32\n\x06status\x18\t \x01(\x0e\x32\".cln.KeysendResponse.KeysendStatus\"\x1d\n\rKeysendStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\x0e\n\x0c_destinationB\x1d\n\x1b_warning_partial_completion\"\xa4\x03\n\x0f\x46undpsbtRequest\x12!\n\x07satoshi\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x1d\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.Feerate\x12\x13\n\x0bstartweight\x18\x03 \x01(\r\x12\x14\n\x07minconf\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07reserve\x18\x05 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08locktime\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x1f\n\x12min_witness_weight\x18\x07 \x01(\rH\x03\x88\x01\x01\x12\x1d\n\x10\x65xcess_as_change\x18\x08 \x01(\x08H\x04\x88\x01\x01\x12\x17\n\nnonwrapped\x18\t \x01(\x08H\x05\x88\x01\x01\x12#\n\x16opening_anchor_channel\x18\n \x01(\x08H\x06\x88\x01\x01\x42\n\n\x08_minconfB\n\n\x08_reserveB\x0b\n\t_locktimeB\x15\n\x13_min_witness_weightB\x13\n\x11_excess_as_changeB\r\n\x0b_nonwrappedB\x19\n\x17_opening_anchor_channel\"\xd9\x01\n\x10\x46undpsbtResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\x0e\x66\x65\x65rate_per_kw\x18\x02 \x01(\r\x12\x1e\n\x16\x65stimated_final_weight\x18\x03 \x01(\r\x12 \n\x0b\x65xcess_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1a\n\rchange_outnum\x18\x05 \x01(\rH\x00\x88\x01\x01\x12/\n\x0creservations\x18\x06 \x03(\x0b\x32\x19.cln.FundpsbtReservationsB\x10\n\x0e_change_outnum\"u\n\x14\x46undpsbtReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\"A\n\x0fSendpsbtRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x14\n\x07reserve\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_reserve\",\n\x10SendpsbtResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"1\n\x0fSignpsbtRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x10\n\x08signonly\x18\x02 \x03(\r\"\'\n\x10SignpsbtResponse\x12\x13\n\x0bsigned_psbt\x18\x01 \x01(\t\"\xa0\x03\n\x0fUtxopsbtRequest\x12!\n\x07satoshi\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x1d\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.Feerate\x12\x13\n\x0bstartweight\x18\x03 \x01(\r\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\x14\n\x07reserve\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08locktime\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1f\n\x12min_witness_weight\x18\x07 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nreservedok\x18\x08 \x01(\x08H\x03\x88\x01\x01\x12\x1d\n\x10\x65xcess_as_change\x18\t \x01(\x08H\x04\x88\x01\x01\x12#\n\x16opening_anchor_channel\x18\n \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_reserveB\x0b\n\t_locktimeB\x15\n\x13_min_witness_weightB\r\n\x0b_reservedokB\x13\n\x11_excess_as_changeB\x19\n\x17_opening_anchor_channel\"\xd9\x01\n\x10UtxopsbtResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\x0e\x66\x65\x65rate_per_kw\x18\x02 \x01(\r\x12\x1e\n\x16\x65stimated_final_weight\x18\x03 \x01(\r\x12 \n\x0b\x65xcess_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1a\n\rchange_outnum\x18\x05 \x01(\rH\x00\x88\x01\x01\x12/\n\x0creservations\x18\x06 \x03(\x0b\x32\x19.cln.UtxopsbtReservationsB\x10\n\x0e_change_outnum\"u\n\x14UtxopsbtReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\" \n\x10TxdiscardRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"6\n\x11TxdiscardResponse\x12\x13\n\x0bunsigned_tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xa4\x01\n\x10TxprepareRequest\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12 \n\x07outputs\x18\x05 \x03(\x0b\x32\x0f.cln.OutputDescB\n\n\x08_feerateB\n\n\x08_minconf\"D\n\x11TxprepareResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x13\n\x0bunsigned_tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"\x1d\n\rTxsendRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"8\n\x0eTxsendResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"\x8d\x01\n\x17ListpeerchannelsRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nchannel_id\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x05\n\x03_idB\x13\n\x11_short_channel_idB\r\n\x0b_channel_id\"K\n\x18ListpeerchannelsResponse\x12/\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1d.cln.ListpeerchannelsChannels\"\xf4\x19\n\x18ListpeerchannelsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x16\n\x0epeer_connected\x18\x02 \x01(\x08\x12 \n\x05state\x18\x03 \x01(\x0e\x32\x11.cln.ChannelState\x12\x19\n\x0cscratch_txid\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x12:\n\x07\x66\x65\x65rate\x18\x06 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFeerateH\x01\x88\x01\x01\x12\x12\n\x05owner\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x17\n\nchannel_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x19\n\x0c\x66unding_txid\x18\n \x01(\x0cH\x05\x88\x01\x01\x12\x1b\n\x0e\x66unding_outnum\x18\x0b \x01(\rH\x06\x88\x01\x01\x12\x1c\n\x0finitial_feerate\x18\x0c \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0clast_feerate\x18\r \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0cnext_feerate\x18\x0e \x01(\tH\t\x88\x01\x01\x12\x1a\n\rnext_fee_step\x18\x0f \x01(\rH\n\x88\x01\x01\x12\x37\n\x08inflight\x18\x10 \x03(\x0b\x32%.cln.ListpeerchannelsChannelsInflight\x12\x15\n\x08\x63lose_to\x18\x11 \x01(\x0cH\x0b\x88\x01\x01\x12\x14\n\x07private\x18\x12 \x01(\x08H\x0c\x88\x01\x01\x12 \n\x06opener\x18\x13 \x01(\x0e\x32\x10.cln.ChannelSide\x12%\n\x06\x63loser\x18\x14 \x01(\x0e\x32\x10.cln.ChannelSideH\r\x88\x01\x01\x12:\n\x07\x66unding\x18\x16 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFundingH\x0e\x88\x01\x01\x12$\n\nto_us_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x0f\x88\x01\x01\x12(\n\x0emin_to_us_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\x10\x88\x01\x01\x12(\n\x0emax_to_us_msat\x18\x19 \x01(\x0b\x32\x0b.cln.AmountH\x11\x88\x01\x01\x12$\n\ntotal_msat\x18\x1a \x01(\x0b\x32\x0b.cln.AmountH\x12\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x1b \x01(\x0b\x32\x0b.cln.AmountH\x13\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x1c \x01(\rH\x14\x88\x01\x01\x12)\n\x0f\x64ust_limit_msat\x18\x1d \x01(\x0b\x32\x0b.cln.AmountH\x15\x88\x01\x01\x12\x30\n\x16max_total_htlc_in_msat\x18\x1e \x01(\x0b\x32\x0b.cln.AmountH\x16\x88\x01\x01\x12,\n\x12their_reserve_msat\x18\x1f \x01(\x0b\x32\x0b.cln.AmountH\x17\x88\x01\x01\x12*\n\x10our_reserve_msat\x18 \x01(\x0b\x32\x0b.cln.AmountH\x18\x88\x01\x01\x12(\n\x0espendable_msat\x18! \x01(\x0b\x32\x0b.cln.AmountH\x19\x88\x01\x01\x12)\n\x0freceivable_msat\x18\" \x01(\x0b\x32\x0b.cln.AmountH\x1a\x88\x01\x01\x12.\n\x14minimum_htlc_in_msat\x18# \x01(\x0b\x32\x0b.cln.AmountH\x1b\x88\x01\x01\x12/\n\x15minimum_htlc_out_msat\x18$ \x01(\x0b\x32\x0b.cln.AmountH\x1c\x88\x01\x01\x12/\n\x15maximum_htlc_out_msat\x18% \x01(\x0b\x32\x0b.cln.AmountH\x1d\x88\x01\x01\x12 \n\x13their_to_self_delay\x18& \x01(\rH\x1e\x88\x01\x01\x12\x1e\n\x11our_to_self_delay\x18\' \x01(\rH\x1f\x88\x01\x01\x12\x1f\n\x12max_accepted_htlcs\x18( \x01(\rH \x88\x01\x01\x12\x36\n\x05\x61lias\x18) \x01(\x0b\x32\".cln.ListpeerchannelsChannelsAliasH!\x88\x01\x01\x12\x0e\n\x06status\x18+ \x03(\t\x12 \n\x13in_payments_offered\x18, \x01(\x04H\"\x88\x01\x01\x12)\n\x0fin_offered_msat\x18- \x01(\x0b\x32\x0b.cln.AmountH#\x88\x01\x01\x12\"\n\x15in_payments_fulfilled\x18. \x01(\x04H$\x88\x01\x01\x12+\n\x11in_fulfilled_msat\x18/ \x01(\x0b\x32\x0b.cln.AmountH%\x88\x01\x01\x12!\n\x14out_payments_offered\x18\x30 \x01(\x04H&\x88\x01\x01\x12*\n\x10out_offered_msat\x18\x31 \x01(\x0b\x32\x0b.cln.AmountH\'\x88\x01\x01\x12#\n\x16out_payments_fulfilled\x18\x32 \x01(\x04H(\x88\x01\x01\x12,\n\x12out_fulfilled_msat\x18\x33 \x01(\x0b\x32\x0b.cln.AmountH)\x88\x01\x01\x12\x31\n\x05htlcs\x18\x34 \x03(\x0b\x32\".cln.ListpeerchannelsChannelsHtlcs\x12\x1a\n\rclose_to_addr\x18\x35 \x01(\tH*\x88\x01\x01\x12\x1e\n\x11ignore_fee_limits\x18\x36 \x01(\x08H+\x88\x01\x01\x12:\n\x07updates\x18\x37 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsUpdatesH,\x88\x01\x01\x12#\n\x16last_stable_connection\x18\x38 \x01(\x04H-\x88\x01\x01\x12\x17\n\nlost_state\x18\x39 \x01(\x08H.\x88\x01\x01\x12\x1a\n\rreestablished\x18: \x01(\x08H/\x88\x01\x01\x12*\n\x10last_tx_fee_msat\x18; \x01(\x0b\x32\x0b.cln.AmountH0\x88\x01\x01\x12\x16\n\tdirection\x18< \x01(\rH1\x88\x01\x01\x12=\n#their_max_htlc_value_in_flight_msat\x18= \x01(\x0b\x32\x0b.cln.AmountH2\x88\x01\x01\x12;\n!our_max_htlc_value_in_flight_msat\x18> \x01(\x0b\x32\x0b.cln.AmountH3\x88\x01\x01\x42\x0f\n\r_scratch_txidB\n\n\x08_feerateB\x08\n\x06_ownerB\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x0f\n\r_funding_txidB\x11\n\x0f_funding_outnumB\x12\n\x10_initial_feerateB\x0f\n\r_last_feerateB\x0f\n\r_next_feerateB\x10\n\x0e_next_fee_stepB\x0b\n\t_close_toB\n\n\x08_privateB\t\n\x07_closerB\n\n\x08_fundingB\r\n\x0b_to_us_msatB\x11\n\x0f_min_to_us_msatB\x11\n\x0f_max_to_us_msatB\r\n\x0b_total_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x12\n\x10_dust_limit_msatB\x19\n\x17_max_total_htlc_in_msatB\x15\n\x13_their_reserve_msatB\x13\n\x11_our_reserve_msatB\x11\n\x0f_spendable_msatB\x12\n\x10_receivable_msatB\x17\n\x15_minimum_htlc_in_msatB\x18\n\x16_minimum_htlc_out_msatB\x18\n\x16_maximum_htlc_out_msatB\x16\n\x14_their_to_self_delayB\x14\n\x12_our_to_self_delayB\x15\n\x13_max_accepted_htlcsB\x08\n\x06_aliasB\x16\n\x14_in_payments_offeredB\x12\n\x10_in_offered_msatB\x18\n\x16_in_payments_fulfilledB\x14\n\x12_in_fulfilled_msatB\x17\n\x15_out_payments_offeredB\x13\n\x11_out_offered_msatB\x19\n\x17_out_payments_fulfilledB\x15\n\x13_out_fulfilled_msatB\x10\n\x0e_close_to_addrB\x14\n\x12_ignore_fee_limitsB\n\n\x08_updatesB\x19\n\x17_last_stable_connectionB\r\n\x0b_lost_stateB\x10\n\x0e_reestablishedB\x13\n\x11_last_tx_fee_msatB\x0c\n\n_directionB&\n$_their_max_htlc_value_in_flight_msatB$\n\"_our_max_htlc_value_in_flight_msat\"\xa7\x01\n\x1fListpeerchannelsChannelsUpdates\x12\x38\n\x05local\x18\x01 \x01(\x0b\x32).cln.ListpeerchannelsChannelsUpdatesLocal\x12?\n\x06remote\x18\x02 \x01(\x0b\x32*.cln.ListpeerchannelsChannelsUpdatesRemoteH\x00\x88\x01\x01\x42\t\n\x07_remote\"\xda\x01\n$ListpeerchannelsChannelsUpdatesLocal\x12&\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11htlc_maximum_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x11\x63ltv_expiry_delta\x18\x03 \x01(\r\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\"\xdb\x01\n%ListpeerchannelsChannelsUpdatesRemote\x12&\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11htlc_maximum_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x11\x63ltv_expiry_delta\x18\x03 \x01(\r\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\"?\n\x1fListpeerchannelsChannelsFeerate\x12\r\n\x05perkw\x18\x01 \x01(\r\x12\r\n\x05perkb\x18\x02 \x01(\r\"\xf4\x01\n ListpeerchannelsChannelsInflight\x12\x14\n\x0c\x66unding_txid\x18\x01 \x01(\x0c\x12\x16\n\x0e\x66unding_outnum\x18\x02 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x03 \x01(\t\x12\'\n\x12total_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10our_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x0cscratch_txid\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\rsplice_amount\x18\x07 \x01(\x12\x42\x0f\n\r_scratch_txid\"\xdd\x02\n\x1fListpeerchannelsChannelsFunding\x12%\n\x0bpushed_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12%\n\x10local_funds_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11remote_funds_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\rfee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\'\n\rfee_rcvd_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x11\n\x04psbt\x18\x06 \x01(\tH\x03\x88\x01\x01\x12\x15\n\x08withheld\x18\x07 \x01(\x08H\x04\x88\x01\x01\x42\x0e\n\x0c_pushed_msatB\x10\n\x0e_fee_paid_msatB\x10\n\x0e_fee_rcvd_msatB\x07\n\x05_psbtB\x0b\n\t_withheld\"]\n\x1dListpeerchannelsChannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"\xf9\x02\n\x1dListpeerchannelsChannelsHtlcs\x12\\\n\tdirection\x18\x01 \x01(\x0e\x32I.cln.ListpeerchannelsChannelsHtlcs.ListpeerchannelsChannelsHtlcsDirection\x12\n\n\x02id\x18\x02 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06\x65xpiry\x18\x04 \x01(\r\x12\x14\n\x0cpayment_hash\x18\x05 \x01(\x0c\x12\x1a\n\rlocal_trimmed\x18\x06 \x01(\x08H\x00\x88\x01\x01\x12\x13\n\x06status\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x05state\x18\x08 \x01(\x0e\x32\x0e.cln.HtlcState\"9\n&ListpeerchannelsChannelsHtlcsDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\x42\x10\n\x0e_local_trimmedB\t\n\x07_status\"3\n\x19ListclosedchannelsRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x05\n\x03_id\"[\n\x1aListclosedchannelsResponse\x12=\n\x0e\x63losedchannels\x18\x01 \x03(\x0b\x32%.cln.ListclosedchannelsClosedchannels\"\xd0\n\n ListclosedchannelsClosedchannels\x12\x14\n\x07peer_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x01\x88\x01\x01\x12>\n\x05\x61lias\x18\x04 \x01(\x0b\x32*.cln.ListclosedchannelsClosedchannelsAliasH\x02\x88\x01\x01\x12 \n\x06opener\x18\x05 \x01(\x0e\x32\x10.cln.ChannelSide\x12%\n\x06\x63loser\x18\x06 \x01(\x0e\x32\x10.cln.ChannelSideH\x03\x88\x01\x01\x12\x0f\n\x07private\x18\x07 \x01(\x08\x12\x1f\n\x17total_local_commitments\x18\t \x01(\x04\x12 \n\x18total_remote_commitments\x18\n \x01(\x04\x12\x18\n\x10total_htlcs_sent\x18\x0b \x01(\x04\x12\x14\n\x0c\x66unding_txid\x18\x0c \x01(\x0c\x12\x16\n\x0e\x66unding_outnum\x18\r \x01(\r\x12\x0e\n\x06leased\x18\x0e \x01(\x08\x12/\n\x15\x66unding_fee_paid_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12/\n\x15\x66unding_fee_rcvd_msat\x18\x10 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12-\n\x13\x66unding_pushed_msat\x18\x11 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x1f\n\ntotal_msat\x18\x12 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x66inal_to_us_msat\x18\x13 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0emin_to_us_msat\x18\x14 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0emax_to_us_msat\x18\x15 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x14last_commitment_txid\x18\x16 \x01(\x0cH\x07\x88\x01\x01\x12\x32\n\x18last_commitment_fee_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x65\n\x0b\x63lose_cause\x18\x18 \x01(\x0e\x32P.cln.ListclosedchannelsClosedchannels.ListclosedchannelsClosedchannelsCloseCause\x12#\n\x16last_stable_connection\x18\x19 \x01(\x04H\t\x88\x01\x01\x12\x19\n\x0c\x66unding_psbt\x18\x1a \x01(\tH\n\x88\x01\x01\x12\x1d\n\x10\x66unding_withheld\x18\x1b \x01(\x08H\x0b\x88\x01\x01\"u\n*ListclosedchannelsClosedchannelsCloseCause\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05LOCAL\x10\x01\x12\x08\n\x04USER\x10\x02\x12\n\n\x06REMOTE\x10\x03\x12\x0c\n\x08PROTOCOL\x10\x04\x12\x0b\n\x07ONCHAIN\x10\x05\x42\n\n\x08_peer_idB\x13\n\x11_short_channel_idB\x08\n\x06_aliasB\t\n\x07_closerB\x18\n\x16_funding_fee_paid_msatB\x18\n\x16_funding_fee_rcvd_msatB\x16\n\x14_funding_pushed_msatB\x17\n\x15_last_commitment_txidB\x1b\n\x19_last_commitment_fee_msatB\x19\n\x17_last_stable_connectionB\x0f\n\r_funding_psbtB\x13\n\x11_funding_withheld\"e\n%ListclosedchannelsClosedchannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"\x1f\n\rDecodeRequest\x12\x0e\n\x06string\x18\x01 \x01(\t\"\xf7,\n\x0e\x44\x65\x63odeResponse\x12\x31\n\titem_type\x18\x01 \x01(\x0e\x32\x1e.cln.DecodeResponse.DecodeType\x12\r\n\x05valid\x18\x02 \x01(\x08\x12\x15\n\x08offer_id\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0coffer_chains\x18\x04 \x03(\x0c\x12\x1b\n\x0eoffer_metadata\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x1b\n\x0eoffer_currency\x18\x06 \x01(\tH\x02\x88\x01\x01\x12+\n\x1ewarning_unknown_offer_currency\x18\x07 \x01(\tH\x03\x88\x01\x01\x12 \n\x13\x63urrency_minor_unit\x18\x08 \x01(\rH\x04\x88\x01\x01\x12\x19\n\x0coffer_amount\x18\t \x01(\x04H\x05\x88\x01\x01\x12+\n\x11offer_amount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x1e\n\x11offer_description\x18\x0b \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0coffer_issuer\x18\x0c \x01(\tH\x08\x88\x01\x01\x12\x1b\n\x0eoffer_features\x18\r \x01(\x0cH\t\x88\x01\x01\x12\"\n\x15offer_absolute_expiry\x18\x0e \x01(\x04H\n\x88\x01\x01\x12\x1f\n\x12offer_quantity_max\x18\x0f \x01(\x04H\x0b\x88\x01\x01\x12*\n\x0boffer_paths\x18\x10 \x03(\x0b\x32\x15.cln.DecodeOfferPaths\x12\x1a\n\roffer_node_id\x18\x11 \x01(\x0cH\x0c\x88\x01\x01\x12*\n\x1dwarning_missing_offer_node_id\x18\x14 \x01(\tH\r\x88\x01\x01\x12.\n!warning_invalid_offer_description\x18\x15 \x01(\tH\x0e\x88\x01\x01\x12.\n!warning_missing_offer_description\x18\x16 \x01(\tH\x0f\x88\x01\x01\x12+\n\x1ewarning_invalid_offer_currency\x18\x17 \x01(\tH\x10\x88\x01\x01\x12)\n\x1cwarning_invalid_offer_issuer\x18\x18 \x01(\tH\x11\x88\x01\x01\x12\x1c\n\x0finvreq_metadata\x18\x19 \x01(\x0cH\x12\x88\x01\x01\x12\x1c\n\x0finvreq_payer_id\x18\x1a \x01(\x0cH\x13\x88\x01\x01\x12\x19\n\x0cinvreq_chain\x18\x1b \x01(\x0cH\x14\x88\x01\x01\x12,\n\x12invreq_amount_msat\x18\x1c \x01(\x0b\x32\x0b.cln.AmountH\x15\x88\x01\x01\x12\x1c\n\x0finvreq_features\x18\x1d \x01(\x0cH\x16\x88\x01\x01\x12\x1c\n\x0finvreq_quantity\x18\x1e \x01(\x04H\x17\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x1f \x01(\tH\x18\x88\x01\x01\x12&\n\x19invreq_recurrence_counter\x18 \x01(\rH\x19\x88\x01\x01\x12$\n\x17invreq_recurrence_start\x18! \x01(\rH\x1a\x88\x01\x01\x12,\n\x1fwarning_missing_invreq_metadata\x18# \x01(\tH\x1b\x88\x01\x01\x12,\n\x1fwarning_missing_invreq_payer_id\x18$ \x01(\tH\x1c\x88\x01\x01\x12.\n!warning_invalid_invreq_payer_note\x18% \x01(\tH\x1d\x88\x01\x01\x12\x36\n)warning_missing_invoice_request_signature\x18& \x01(\tH\x1e\x88\x01\x01\x12\x36\n)warning_invalid_invoice_request_signature\x18\' \x01(\tH\x1f\x88\x01\x01\x12\x1f\n\x12invoice_created_at\x18) \x01(\x04H \x88\x01\x01\x12$\n\x17invoice_relative_expiry\x18* \x01(\rH!\x88\x01\x01\x12!\n\x14invoice_payment_hash\x18+ \x01(\x0cH\"\x88\x01\x01\x12-\n\x13invoice_amount_msat\x18, \x01(\x0b\x32\x0b.cln.AmountH#\x88\x01\x01\x12\x36\n\x11invoice_fallbacks\x18- \x03(\x0b\x32\x1b.cln.DecodeInvoiceFallbacks\x12\x1d\n\x10invoice_features\x18. \x01(\x0cH$\x88\x01\x01\x12\x1c\n\x0finvoice_node_id\x18/ \x01(\x0cH%\x88\x01\x01\x12(\n\x1binvoice_recurrence_basetime\x18\x30 \x01(\x04H&\x88\x01\x01\x12*\n\x1dwarning_missing_invoice_paths\x18\x32 \x01(\tH\'\x88\x01\x01\x12/\n\"warning_missing_invoice_blindedpay\x18\x33 \x01(\tH(\x88\x01\x01\x12/\n\"warning_missing_invoice_created_at\x18\x34 \x01(\tH)\x88\x01\x01\x12\x31\n$warning_missing_invoice_payment_hash\x18\x35 \x01(\tH*\x88\x01\x01\x12+\n\x1ewarning_missing_invoice_amount\x18\x36 \x01(\tH+\x88\x01\x01\x12\x38\n+warning_missing_invoice_recurrence_basetime\x18\x37 \x01(\tH,\x88\x01\x01\x12,\n\x1fwarning_missing_invoice_node_id\x18\x38 \x01(\tH-\x88\x01\x01\x12.\n!warning_missing_invoice_signature\x18\x39 \x01(\tH.\x88\x01\x01\x12.\n!warning_invalid_invoice_signature\x18: \x01(\tH/\x88\x01\x01\x12\'\n\tfallbacks\x18; \x03(\x0b\x32\x14.cln.DecodeFallbacks\x12\x17\n\ncreated_at\x18< \x01(\x04H0\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18= \x01(\x04H1\x88\x01\x01\x12\x12\n\x05payee\x18> \x01(\x0cH2\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18? \x01(\x0cH3\x88\x01\x01\x12\x1d\n\x10\x64\x65scription_hash\x18@ \x01(\x0cH4\x88\x01\x01\x12\"\n\x15min_final_cltv_expiry\x18\x41 \x01(\rH5\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x42 \x01(\x0cH6\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x43 \x01(\x0cH7\x88\x01\x01\x12\x1f\n\x05\x65xtra\x18\x45 \x03(\x0b\x32\x10.cln.DecodeExtra\x12\x16\n\tunique_id\x18\x46 \x01(\tH8\x88\x01\x01\x12\x14\n\x07version\x18G \x01(\tH9\x88\x01\x01\x12\x13\n\x06string\x18H \x01(\tH:\x88\x01\x01\x12-\n\x0crestrictions\x18I \x03(\x0b\x32\x17.cln.DecodeRestrictions\x12&\n\x19warning_rune_invalid_utf8\x18J \x01(\tH;\x88\x01\x01\x12\x10\n\x03hex\x18K \x01(\x0cH<\x88\x01\x01\x12\x16\n\tdecrypted\x18L \x01(\x0cH=\x88\x01\x01\x12\x16\n\tsignature\x18M \x01(\tH>\x88\x01\x01\x12\x15\n\x08\x63urrency\x18N \x01(\tH?\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18O \x01(\x0b\x32\x0b.cln.AmountH@\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18P \x01(\tHA\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18Q \x01(\x0cHB\x88\x01\x01\x12-\n\x06routes\x18R \x01(\x0b\x32\x18.cln.DecodeRoutehintListHC\x88\x01\x01\x12\x1c\n\x0foffer_issuer_id\x18S \x01(\x0cHD\x88\x01\x01\x12,\n\x1fwarning_missing_offer_issuer_id\x18T \x01(\tHE\x88\x01\x01\x12,\n\x0cinvreq_paths\x18U \x03(\x0b\x32\x16.cln.DecodeInvreqPaths\x12\'\n\x1awarning_empty_blinded_path\x18V \x01(\tHF\x88\x01\x01\x12=\n\x13invreq_bip_353_name\x18W \x01(\x0b\x32\x1b.cln.DecodeInvreqBip353NameHG\x88\x01\x01\x12\x35\n(warning_invreq_bip_353_name_name_invalid\x18X \x01(\tHH\x88\x01\x01\x12\x37\n*warning_invreq_bip_353_name_domain_invalid\x18Y \x01(\tHI\x88\x01\x01\x12%\n\x18invreq_recurrence_cancel\x18Z \x01(\x08HJ\x88\x01\x01\x12=\n0warning_invreq_recurrence_cancel_without_counter\x18[ \x01(\tHK\x88\x01\x01\x12?\n2warning_invreq_recurrence_cancel_with_zero_counter\x18\\ \x01(\tHL\x88\x01\x01\x12\x1b\n\x0eproof_preimage\x18] \x01(\x0cHM\x88\x01\x01\x12\x1a\n\x12proof_omitted_tlvs\x18^ \x03(\x04\x12\x1c\n\x14proof_missing_hashes\x18_ \x03(\x0c\x12\x19\n\x11proof_leaf_hashes\x18` \x03(\x0c\x12\x17\n\nproof_note\x18\x61 \x01(\tHN\x88\x01\x01\x12\x1c\n\x0fproof_signature\x18\x62 \x01(\tHO\x88\x01\x01\x12\x42\n\x18unknown_payer_proof_tlvs\x18\x63 \x03(\x0b\x32 .cln.DecodeUnknownPayerProofTlvs\"\x9b\x01\n\nDecodeType\x12\x10\n\x0c\x42OLT12_OFFER\x10\x00\x12\x12\n\x0e\x42OLT12_INVOICE\x10\x01\x12\x1a\n\x16\x42OLT12_INVOICE_REQUEST\x10\x02\x12\x12\n\x0e\x42OLT11_INVOICE\x10\x03\x12\x08\n\x04RUNE\x10\x04\x12\x15\n\x11\x45MERGENCY_RECOVER\x10\x05\x12\x16\n\x12\x42OLT12_PAYER_PROOF\x10\x06\x42\x0b\n\t_offer_idB\x11\n\x0f_offer_metadataB\x11\n\x0f_offer_currencyB!\n\x1f_warning_unknown_offer_currencyB\x16\n\x14_currency_minor_unitB\x0f\n\r_offer_amountB\x14\n\x12_offer_amount_msatB\x14\n\x12_offer_descriptionB\x0f\n\r_offer_issuerB\x11\n\x0f_offer_featuresB\x18\n\x16_offer_absolute_expiryB\x15\n\x13_offer_quantity_maxB\x10\n\x0e_offer_node_idB \n\x1e_warning_missing_offer_node_idB$\n\"_warning_invalid_offer_descriptionB$\n\"_warning_missing_offer_descriptionB!\n\x1f_warning_invalid_offer_currencyB\x1f\n\x1d_warning_invalid_offer_issuerB\x12\n\x10_invreq_metadataB\x12\n\x10_invreq_payer_idB\x0f\n\r_invreq_chainB\x15\n\x13_invreq_amount_msatB\x12\n\x10_invreq_featuresB\x12\n\x10_invreq_quantityB\x14\n\x12_invreq_payer_noteB\x1c\n\x1a_invreq_recurrence_counterB\x1a\n\x18_invreq_recurrence_startB\"\n _warning_missing_invreq_metadataB\"\n _warning_missing_invreq_payer_idB$\n\"_warning_invalid_invreq_payer_noteB,\n*_warning_missing_invoice_request_signatureB,\n*_warning_invalid_invoice_request_signatureB\x15\n\x13_invoice_created_atB\x1a\n\x18_invoice_relative_expiryB\x17\n\x15_invoice_payment_hashB\x16\n\x14_invoice_amount_msatB\x13\n\x11_invoice_featuresB\x12\n\x10_invoice_node_idB\x1e\n\x1c_invoice_recurrence_basetimeB \n\x1e_warning_missing_invoice_pathsB%\n#_warning_missing_invoice_blindedpayB%\n#_warning_missing_invoice_created_atB\'\n%_warning_missing_invoice_payment_hashB!\n\x1f_warning_missing_invoice_amountB.\n,_warning_missing_invoice_recurrence_basetimeB\"\n _warning_missing_invoice_node_idB$\n\"_warning_missing_invoice_signatureB$\n\"_warning_invalid_invoice_signatureB\r\n\x0b_created_atB\t\n\x07_expiryB\x08\n\x06_payeeB\x0f\n\r_payment_hashB\x13\n\x11_description_hashB\x18\n\x16_min_final_cltv_expiryB\x11\n\x0f_payment_secretB\x13\n\x11_payment_metadataB\x0c\n\n_unique_idB\n\n\x08_versionB\t\n\x07_stringB\x1c\n\x1a_warning_rune_invalid_utf8B\x06\n\x04_hexB\x0c\n\n_decryptedB\x0c\n\n_signatureB\x0b\n\t_currencyB\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x0b\n\t_featuresB\t\n\x07_routesB\x12\n\x10_offer_issuer_idB\"\n _warning_missing_offer_issuer_idB\x1d\n\x1b_warning_empty_blinded_pathB\x16\n\x14_invreq_bip_353_nameB+\n)_warning_invreq_bip_353_name_name_invalidB-\n+_warning_invreq_bip_353_name_domain_invalidB\x1b\n\x19_invreq_recurrence_cancelB3\n1_warning_invreq_recurrence_cancel_without_counterB5\n3_warning_invreq_recurrence_cancel_with_zero_counterB\x11\n\x0f_proof_preimageB\r\n\x0b_proof_noteB\x12\n\x10_proof_signature\"\xec\x01\n\x10\x44\x65\x63odeOfferPaths\x12\x1a\n\rfirst_node_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\x08\x62linding\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x1b\n\x0e\x66irst_scid_dir\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0e\x66irst_path_key\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x42\x10\n\x0e_first_node_idB\x0b\n\t_blindingB\x11\n\x0f_first_scid_dirB\r\n\x0b_first_scidB\x11\n\x0f_first_path_key\"\x89\x01\n\x1e\x44\x65\x63odeOfferRecurrencePaywindow\x12\x16\n\x0eseconds_before\x18\x01 \x01(\r\x12\x15\n\rseconds_after\x18\x02 \x01(\r\x12 \n\x13proportional_amount\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x16\n\x14_proportional_amount\"\x97\x02\n\x11\x44\x65\x63odeInvreqPaths\x12\x1b\n\x0e\x66irst_scid_dir\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08\x62linding\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x1a\n\rfirst_node_id\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x04 \x01(\tH\x03\x88\x01\x01\x12(\n\x04path\x18\x05 \x03(\x0b\x32\x1a.cln.DecodeInvreqPathsPath\x12\x1b\n\x0e\x66irst_path_key\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x42\x11\n\x0f_first_scid_dirB\x0b\n\t_blindingB\x10\n\x0e_first_node_idB\r\n\x0b_first_scidB\x11\n\x0f_first_path_key\"R\n\x15\x44\x65\x63odeInvreqPathsPath\x12\x17\n\x0f\x62linded_node_id\x18\x01 \x01(\x0c\x12 \n\x18\x65ncrypted_recipient_data\x18\x02 \x01(\x0c\"T\n\x16\x44\x65\x63odeInvreqBip353Name\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x64omain\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x07\n\x05_nameB\t\n\x07_domain\"S\n\x16\x44\x65\x63odeInvoicePathsPath\x12\x17\n\x0f\x62linded_node_id\x18\x01 \x01(\x0c\x12 \n\x18\x65ncrypted_recipient_data\x18\x02 \x01(\x0c\"X\n\x16\x44\x65\x63odeInvoiceFallbacks\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x0b\n\x03hex\x18\x02 \x01(\x0c\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_address\"\xaa\x02\n\x0f\x44\x65\x63odeFallbacks\x12\x36\n)warning_invoice_fallbacks_version_invalid\x18\x01 \x01(\tH\x00\x88\x01\x01\x12;\n\titem_type\x18\x02 \x01(\x0e\x32(.cln.DecodeFallbacks.DecodeFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0b\n\x03hex\x18\x04 \x01(\x0c\"K\n\x13\x44\x65\x63odeFallbacksType\x12\t\n\x05P2PKH\x10\x00\x12\x08\n\x04P2SH\x10\x01\x12\n\n\x06P2WPKH\x10\x02\x12\t\n\x05P2WSH\x10\x03\x12\x08\n\x04P2TR\x10\x04\x42,\n*_warning_invoice_fallbacks_version_invalidB\x07\n\x05_addr\"(\n\x0b\x44\x65\x63odeExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"O\n\x1b\x44\x65\x63odeUnknownPayerProofTlvs\x12\x11\n\titem_type\x18\x01 \x01(\x04\x12\x0e\n\x06length\x18\x02 \x01(\x04\x12\r\n\x05value\x18\x03 \x01(\x0c\";\n\x12\x44\x65\x63odeRestrictions\x12\x14\n\x0c\x61lternatives\x18\x01 \x03(\t\x12\x0f\n\x07summary\x18\x02 \x01(\t\"\xc2\x01\n\rDelpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12/\n\x06status\x18\x02 \x01(\x0e\x32\x1f.cln.DelpayRequest.DelpayStatus\x12\x13\n\x06partid\x18\x03 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x01\x88\x01\x01\"(\n\x0c\x44\x65lpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x42\t\n\x07_partidB\n\n\x08_groupid\"7\n\x0e\x44\x65lpayResponse\x12%\n\x08payments\x18\x01 \x03(\x0b\x32\x13.cln.DelpayPayments\"\xb4\x05\n\x0e\x44\x65lpayPayments\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x38\n\x06status\x18\x04 \x01(\x0e\x32(.cln.DelpayPayments.DelpayPaymentsStatus\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\t \x01(\x04\x12\x1a\n\rupdated_index\x18\n \x01(\x04H\x03\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12\x14\n\x07groupid\x18\x0c \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x08\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\t\x88\x01\x01\x12\x17\n\nerroronion\x18\x11 \x01(\x0cH\n\x88\x01\x01\"=\n\x14\x44\x65lpayPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x10\n\x0e_updated_indexB\x0f\n\r_completed_atB\n\n\x08_groupidB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\r\n\x0b_erroronion\"\xb3\x01\n\x11\x44\x65lforwardRequest\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x12\n\nin_htlc_id\x18\x02 \x01(\x04\x12\x37\n\x06status\x18\x03 \x01(\x0e\x32\'.cln.DelforwardRequest.DelforwardStatus\"=\n\x10\x44\x65lforwardStatus\x12\x0b\n\x07SETTLED\x10\x00\x12\x10\n\x0cLOCAL_FAILED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"\x14\n\x12\x44\x65lforwardResponse\"\'\n\x13\x44isableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\xdc\x01\n\x14\x44isableofferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"&\n\x12\x45nableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\xdb\x01\n\x13\x45nableofferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"=\n\x11\x44isconnectRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\x05\x66orce\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x08\n\x06_force\"\x14\n\x12\x44isconnectResponse\"k\n\x0f\x46\x65\x65ratesRequest\x12\x31\n\x05style\x18\x01 \x01(\x0e\x32\".cln.FeeratesRequest.FeeratesStyle\"%\n\rFeeratesStyle\x12\t\n\x05PERKB\x10\x00\x12\t\n\x05PERKW\x10\x01\"\x9a\x02\n\x10\x46\x65\x65ratesResponse\x12%\n\x18warning_missing_feerates\x18\x01 \x01(\tH\x00\x88\x01\x01\x12&\n\x05perkb\x18\x02 \x01(\x0b\x32\x12.cln.FeeratesPerkbH\x01\x88\x01\x01\x12&\n\x05perkw\x18\x03 \x01(\x0b\x32\x12.cln.FeeratesPerkwH\x02\x88\x01\x01\x12\x44\n\x15onchain_fee_estimates\x18\x04 \x01(\x0b\x32 .cln.FeeratesOnchainFeeEstimatesH\x03\x88\x01\x01\x42\x1b\n\x19_warning_missing_feeratesB\x08\n\x06_perkbB\x08\n\x06_perkwB\x18\n\x16_onchain_fee_estimates\"\xe4\x03\n\rFeeratesPerkb\x12\x16\n\x0emin_acceptable\x18\x01 \x01(\r\x12\x16\n\x0emax_acceptable\x18\x02 \x01(\r\x12\x14\n\x07opening\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmutual_close\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1d\n\x10unilateral_close\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x1a\n\rdelayed_to_us\x18\x06 \x01(\rH\x03\x88\x01\x01\x12\x1c\n\x0fhtlc_resolution\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x14\n\x07penalty\x18\x08 \x01(\rH\x05\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkbEstimates\x12\r\n\x05\x66loor\x18\n \x01(\r\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x06\x88\x01\x01\x12\x13\n\x06splice\x18\x0c \x01(\rH\x07\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\x10\n\x0e_delayed_to_usB\x12\n\x10_htlc_resolutionB\n\n\x08_penaltyB\x1a\n\x18_unilateral_anchor_closeB\t\n\x07_splice\"W\n\x16\x46\x65\x65ratesPerkbEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"\xe4\x03\n\rFeeratesPerkw\x12\x16\n\x0emin_acceptable\x18\x01 \x01(\r\x12\x16\n\x0emax_acceptable\x18\x02 \x01(\r\x12\x14\n\x07opening\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmutual_close\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1d\n\x10unilateral_close\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x1a\n\rdelayed_to_us\x18\x06 \x01(\rH\x03\x88\x01\x01\x12\x1c\n\x0fhtlc_resolution\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x14\n\x07penalty\x18\x08 \x01(\rH\x05\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkwEstimates\x12\r\n\x05\x66loor\x18\n \x01(\r\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x06\x88\x01\x01\x12\x13\n\x06splice\x18\x0c \x01(\rH\x07\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\x10\n\x0e_delayed_to_usB\x12\n\x10_htlc_resolutionB\n\n\x08_penaltyB\x1a\n\x18_unilateral_anchor_closeB\t\n\x07_splice\"W\n\x16\x46\x65\x65ratesPerkwEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"\x99\x02\n\x1b\x46\x65\x65ratesOnchainFeeEstimates\x12 \n\x18opening_channel_satoshis\x18\x01 \x01(\x04\x12\x1d\n\x15mutual_close_satoshis\x18\x02 \x01(\x04\x12!\n\x19unilateral_close_satoshis\x18\x03 \x01(\x04\x12\x1d\n\x15htlc_timeout_satoshis\x18\x04 \x01(\x04\x12\x1d\n\x15htlc_success_satoshis\x18\x05 \x01(\x04\x12\x30\n#unilateral_close_nonanchor_satoshis\x18\x06 \x01(\x04H\x00\x88\x01\x01\x42&\n$_unilateral_close_nonanchor_satoshis\"%\n\x12\x46\x65tchbip353Request\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"X\n\x13\x46\x65tchbip353Response\x12\r\n\x05proof\x18\x01 \x01(\t\x12\x32\n\x0cinstructions\x18\x02 \x03(\x0b\x32\x1c.cln.Fetchbip353Instructions\"\xf7\x01\n\x17\x46\x65tchbip353Instructions\x12\x18\n\x0b\x64\x65scription\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05offer\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07onchain\x18\x03 \x01(\tH\x02\x88\x01\x01\x12!\n\x14offchain_amount_msat\x18\x04 \x01(\x04H\x03\x88\x01\x01\x12\x1f\n\x12onchain_amount_sat\x18\x05 \x01(\x04H\x04\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x08\n\x06_offerB\n\n\x08_onchainB\x17\n\x15_offchain_amount_msatB\x15\n\x13_onchain_amount_sat\"\xb9\x03\n\x13\x46\x65tchinvoiceRequest\x12\r\n\x05offer\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x15\n\x08quantity\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x1f\n\x12recurrence_counter\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x10recurrence_start\x18\x05 \x01(\x01H\x03\x88\x01\x01\x12\x1d\n\x10recurrence_label\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x14\n\x07timeout\x18\x07 \x01(\x01H\x05\x88\x01\x01\x12\x17\n\npayer_note\x18\x08 \x01(\tH\x06\x88\x01\x01\x12\x1b\n\x0epayer_metadata\x18\t \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62ip353\x18\n \x01(\tH\x08\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0b\n\t_quantityB\x15\n\x13_recurrence_counterB\x13\n\x11_recurrence_startB\x13\n\x11_recurrence_labelB\n\n\x08_timeoutB\r\n\x0b_payer_noteB\x11\n\x0f_payer_metadataB\t\n\x07_bip353\"\x99\x01\n\x14\x46\x65tchinvoiceResponse\x12\x0f\n\x07invoice\x18\x01 \x01(\t\x12)\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x18.cln.FetchinvoiceChanges\x12\x35\n\x0bnext_period\x18\x03 \x01(\x0b\x32\x1b.cln.FetchinvoiceNextPeriodH\x00\x88\x01\x01\x42\x0e\n\x0c_next_period\"\x82\x02\n\x13\x46\x65tchinvoiceChanges\x12!\n\x14\x64\x65scription_appended\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0evendor_removed\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06vendor\x18\x04 \x01(\tH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x42\x17\n\x15_description_appendedB\x0e\n\x0c_descriptionB\x11\n\x0f_vendor_removedB\t\n\x07_vendorB\x0e\n\x0c_amount_msat\"}\n\x16\x46\x65tchinvoiceNextPeriod\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x04\x12\x11\n\tstarttime\x18\x02 \x01(\x04\x12\x0f\n\x07\x65ndtime\x18\x03 \x01(\x04\x12\x17\n\x0fpaywindow_start\x18\x04 \x01(\x04\x12\x15\n\rpaywindow_end\x18\x05 \x01(\x04\"\xe0\x01\n\x1d\x43\x61ncelrecurringinvoiceRequest\x12\r\n\x05offer\x18\x01 \x01(\t\x12\x1a\n\x12recurrence_counter\x18\x02 \x01(\x04\x12\x18\n\x10recurrence_label\x18\x03 \x01(\t\x12\x1d\n\x10recurrence_start\x18\x04 \x01(\x01H\x00\x88\x01\x01\x12\x17\n\npayer_note\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62ip353\x18\x06 \x01(\tH\x02\x88\x01\x01\x42\x13\n\x11_recurrence_startB\r\n\x0b_payer_noteB\t\n\x07_bip353\"0\n\x1e\x43\x61ncelrecurringinvoiceResponse\x12\x0e\n\x06\x62olt12\x18\x01 \x01(\t\"&\n\x18\x46undchannelCancelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\".\n\x19\x46undchannelCancelResponse\x12\x11\n\tcancelled\x18\x01 \x01(\t\"Z\n\x1a\x46undchannelCompleteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x15\n\x08withhold\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x0b\n\t_withhold\"N\n\x1b\x46undchannelCompleteResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\"\xfb\x03\n\x12\x46undchannelRequest\x12 \n\x06\x61mount\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12#\n\tpush_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\tH\x03\x88\x01\x01\x12%\n\x0brequest_amt\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x08 \x01(\tH\x05\x88\x01\x01\x12\n\n\x02id\x18\t \x01(\x0c\x12\x14\n\x07minconf\x18\n \x01(\rH\x06\x88\x01\x01\x12\x1c\n\x05utxos\x18\x0b \x03(\x0b\x32\r.cln.Outpoint\x12\x15\n\x08mindepth\x18\x0c \x01(\rH\x07\x88\x01\x01\x12!\n\x07reserve\x18\r \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\x0e \x03(\rB\n\n\x08_feerateB\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\n\n\x08_minconfB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xce\x01\n\x13\x46undchannelResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0e\n\x06outnum\x18\x03 \x01(\r\x12\x12\n\nchannel_id\x18\x04 \x01(\x0c\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\x08mindepth\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x31\n\x0c\x63hannel_type\x18\x07 \x01(\x0b\x32\x1b.cln.FundchannelChannelTypeB\x0b\n\t_close_toB\x0b\n\t_mindepth\"K\n\x16\x46undchannelChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\xd6\x02\n\x17\x46undchannelStartRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1b\n\x06\x61mount\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\x07\x66\x65\x65rate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\tH\x02\x88\x01\x01\x12#\n\tpush_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08mindepth\x18\x07 \x01(\rH\x04\x88\x01\x01\x12!\n\x07reserve\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\t \x03(\rB\n\n\x08_feerateB\x0b\n\t_announceB\x0b\n\t_close_toB\x0c\n\n_push_msatB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xf6\x01\n\x18\x46undchannelStartResponse\x12\x17\n\x0f\x66unding_address\x18\x01 \x01(\t\x12\x14\n\x0cscriptpubkey\x18\x02 \x01(\x0c\x12;\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32 .cln.FundchannelStartChannelTypeH\x00\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x12\x15\n\rwarning_usage\x18\x05 \x01(\t\x12\x15\n\x08mindepth\x18\x06 \x01(\rH\x02\x88\x01\x01\x42\x0f\n\r_channel_typeB\x0b\n\t_close_toB\x0b\n\t_mindepth\"P\n\x1b\x46undchannelStartChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x9d\x01\n\rGetlogRequest\x12\x32\n\x05level\x18\x01 \x01(\x0e\x32\x1e.cln.GetlogRequest.GetlogLevelH\x00\x88\x01\x01\"N\n\x0bGetlogLevel\x12\n\n\x06\x42ROKEN\x10\x00\x12\x0b\n\x07UNUSUAL\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\t\n\x05\x44\x45\x42UG\x10\x03\x12\x06\n\x02IO\x10\x04\x12\t\n\x05TRACE\x10\x05\x42\x08\n\x06_level\"h\n\x0eGetlogResponse\x12\x12\n\ncreated_at\x18\x01 \x01(\t\x12\x12\n\nbytes_used\x18\x02 \x01(\r\x12\x11\n\tbytes_max\x18\x03 \x01(\r\x12\x1b\n\x03log\x18\x04 \x03(\x0b\x32\x0e.cln.GetlogLog\"\xe8\x02\n\tGetlogLog\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.GetlogLog.GetlogLogType\x12\x18\n\x0bnum_skipped\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04time\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03log\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07node_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x11\n\x04\x64\x61ta\x18\x07 \x01(\x0cH\x05\x88\x01\x01\"l\n\rGetlogLogType\x12\x0b\n\x07SKIPPED\x10\x00\x12\n\n\x06\x42ROKEN\x10\x01\x12\x0b\n\x07UNUSUAL\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\t\n\x05IO_IN\x10\x05\x12\n\n\x06IO_OUT\x10\x06\x12\t\n\x05TRACE\x10\x07\x42\x0e\n\x0c_num_skippedB\x07\n\x05_timeB\t\n\x07_sourceB\x06\n\x04_logB\n\n\x08_node_idB\x07\n\x05_data\"\xd9\x08\n\x13\x46underupdateRequest\x12@\n\x06policy\x18\x01 \x01(\x0e\x32+.cln.FunderupdateRequest.FunderupdatePolicyH\x00\x88\x01\x01\x12$\n\npolicy_mod\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0bleases_only\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12\x30\n\x16min_their_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x30\n\x16max_their_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12.\n\x14per_channel_min_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12.\n\x14per_channel_max_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12+\n\x11reserve_tank_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x12\x19\n\x0c\x66uzz_percent\x18\t \x01(\rH\x08\x88\x01\x01\x12\x1d\n\x10\x66und_probability\x18\n \x01(\rH\t\x88\x01\x01\x12-\n\x13lease_fee_base_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x12\x1c\n\x0flease_fee_basis\x18\x0c \x01(\rH\x0b\x88\x01\x01\x12\x1b\n\x0e\x66unding_weight\x18\r \x01(\rH\x0c\x88\x01\x01\x12\x33\n\x19\x63hannel_fee_max_base_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\r\x88\x01\x01\x12\x35\n(channel_fee_max_proportional_thousandths\x18\x0f \x01(\rH\x0e\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x10 \x01(\x0cH\x0f\x88\x01\x01\"9\n\x12\x46underupdatePolicy\x12\t\n\x05MATCH\x10\x00\x12\r\n\tAVAILABLE\x10\x01\x12\t\n\x05\x46IXED\x10\x02\x42\t\n\x07_policyB\r\n\x0b_policy_modB\x0e\n\x0c_leases_onlyB\x19\n\x17_min_their_funding_msatB\x19\n\x17_max_their_funding_msatB\x17\n\x15_per_channel_min_msatB\x17\n\x15_per_channel_max_msatB\x14\n\x12_reserve_tank_msatB\x0f\n\r_fuzz_percentB\x13\n\x11_fund_probabilityB\x16\n\x14_lease_fee_base_msatB\x12\n\x10_lease_fee_basisB\x11\n\x0f_funding_weightB\x1c\n\x1a_channel_fee_max_base_msatB+\n)_channel_fee_max_proportional_thousandthsB\x10\n\x0e_compact_lease\"\xdf\x06\n\x14\x46underupdateResponse\x12\x0f\n\x07summary\x18\x01 \x01(\t\x12<\n\x06policy\x18\x02 \x01(\x0e\x32,.cln.FunderupdateResponse.FunderupdatePolicy\x12\x12\n\npolicy_mod\x18\x03 \x01(\r\x12\x13\n\x0bleases_only\x18\x04 \x01(\x08\x12+\n\x16min_their_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x16max_their_funding_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12)\n\x14per_channel_min_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12)\n\x14per_channel_max_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11reserve_tank_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66uzz_percent\x18\n \x01(\r\x12\x18\n\x10\x66und_probability\x18\x0b \x01(\r\x12-\n\x13lease_fee_base_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x1c\n\x0flease_fee_basis\x18\r \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0e\x66unding_weight\x18\x0e \x01(\rH\x02\x88\x01\x01\x12\x33\n\x19\x63hannel_fee_max_base_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x35\n(channel_fee_max_proportional_thousandths\x18\x10 \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x11 \x01(\x0cH\x05\x88\x01\x01\"9\n\x12\x46underupdatePolicy\x12\t\n\x05MATCH\x10\x00\x12\r\n\tAVAILABLE\x10\x01\x12\t\n\x05\x46IXED\x10\x02\x42\x16\n\x14_lease_fee_base_msatB\x12\n\x10_lease_fee_basisB\x11\n\x0f_funding_weightB\x1c\n\x1a_channel_fee_max_base_msatB+\n)_channel_fee_max_proportional_thousandthsB\x10\n\x0e_compact_lease\"\xec\x01\n\x0fGetrouteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\nriskfactor\x18\x03 \x01(\x04\x12\x11\n\x04\x63ltv\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x13\n\x06\x66romid\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x66uzzpercent\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\x07 \x03(\t\x12\x14\n\x07maxhops\x18\x08 \x01(\rH\x03\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountB\x07\n\x05_cltvB\t\n\x07_fromidB\x0e\n\x0c_fuzzpercentB\n\n\x08_maxhops\"5\n\x10GetrouteResponse\x12!\n\x05route\x18\x01 \x03(\x0b\x32\x12.cln.GetrouteRoute\"\xc5\x01\n\rGetrouteRoute\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x11\n\tdirection\x18\x03 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\r\n\x05\x64\x65lay\x18\x05 \x01(\r\x12\x34\n\x05style\x18\x06 \x01(\x0e\x32%.cln.GetrouteRoute.GetrouteRouteStyle\"\x1d\n\x12GetrouteRouteStyle\x12\x07\n\x03TLV\x10\x00\"t\n\x14ListaddressesRequest\x12\x14\n\x07\x61\x64\x64ress\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05start\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\x42\n\n\x08_addressB\x08\n\x06_startB\x08\n\x06_limit\"G\n\x15ListaddressesResponse\x12.\n\taddresses\x18\x01 \x03(\x0b\x32\x1b.cln.ListaddressesAddresses\"d\n\x16ListaddressesAddresses\x12\x0e\n\x06keyidx\x18\x01 \x01(\x04\x12\x13\n\x06\x62\x65\x63h32\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04p2tr\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_bech32B\x07\n\x05_p2tr\"\xb7\x03\n\x13ListforwardsRequest\x12@\n\x06status\x18\x01 \x01(\x0e\x32+.cln.ListforwardsRequest.ListforwardsStatusH\x00\x88\x01\x01\x12\x17\n\nin_channel\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bout_channel\x18\x03 \x01(\tH\x02\x88\x01\x01\x12>\n\x05index\x18\x04 \x01(\x0e\x32*.cln.ListforwardsRequest.ListforwardsIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\"L\n\x12ListforwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"-\n\x11ListforwardsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\t\n\x07_statusB\r\n\x0b_in_channelB\x0e\n\x0c_out_channelB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListforwardsResponse\x12+\n\x08\x66orwards\x18\x01 \x03(\x0b\x32\x19.cln.ListforwardsForwards\"\x9d\x06\n\x14ListforwardsForwards\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x1c\n\x07in_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x44\n\x06status\x18\x03 \x01(\x0e\x32\x34.cln.ListforwardsForwards.ListforwardsForwardsStatus\x12\x15\n\rreceived_time\x18\x04 \x01(\x01\x12\x18\n\x0bout_channel\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\"\n\x08out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12G\n\x05style\x18\t \x01(\x0e\x32\x33.cln.ListforwardsForwards.ListforwardsForwardsStyleH\x03\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x18\n\x0bout_htlc_id\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0c \x01(\x04\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rresolved_time\x18\x0e \x01(\x01H\x07\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x0f \x01(\rH\x08\x88\x01\x01\x12\x17\n\nfailreason\x18\x10 \x01(\tH\t\x88\x01\x01\"T\n\x1aListforwardsForwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"0\n\x19ListforwardsForwardsStyle\x12\n\n\x06LEGACY\x10\x00\x12\x07\n\x03TLV\x10\x01\x42\x0e\n\x0c_out_channelB\x0b\n\t_fee_msatB\x0b\n\t_out_msatB\x08\n\x06_styleB\r\n\x0b_in_htlc_idB\x0e\n\x0c_out_htlc_idB\x10\n\x0e_updated_indexB\x10\n\x0e_resolved_timeB\x0b\n\t_failcodeB\r\n\x0b_failreason\"a\n\x11ListoffersRequest\x12\x15\n\x08offer_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0b\n\t_offer_idB\x0e\n\x0c_active_only\";\n\x12ListoffersResponse\x12%\n\x06offers\x18\x01 \x03(\x0b\x32\x15.cln.ListoffersOffers\"\xd8\x01\n\x10ListoffersOffers\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"\x84\x03\n\x0fListpaysRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x38\n\x06status\x18\x03 \x01(\x0e\x32#.cln.ListpaysRequest.ListpaysStatusH\x02\x88\x01\x01\x12\x36\n\x05index\x18\x04 \x01(\x0e\x32\".cln.ListpaysRequest.ListpaysIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\"7\n\x0eListpaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\")\n\rListpaysIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\t\n\x07_bolt11B\x0f\n\r_payment_hashB\t\n\x07_statusB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"3\n\x10ListpaysResponse\x12\x1f\n\x04pays\x18\x01 \x03(\x0b\x32\x11.cln.ListpaysPays\"\xdb\x05\n\x0cListpaysPays\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x34\n\x06status\x18\x02 \x01(\x0e\x32$.cln.ListpaysPays.ListpaysPaysStatus\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\ncreated_at\x18\x04 \x01(\x04\x12\x12\n\x05label\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12*\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x17\n\nerroronion\x18\n \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0b \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0c \x01(\x04H\x08\x88\x01\x01\x12\x15\n\x08preimage\x18\r \x01(\x0cH\t\x88\x01\x01\x12\x1c\n\x0fnumber_of_parts\x18\x0e \x01(\x04H\n\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x0f \x01(\x04H\x0b\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x10 \x01(\x04H\x0c\x88\x01\x01\";\n\x12ListpaysPaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x13\n\x11_amount_sent_msatB\r\n\x0b_erroronionB\x0e\n\x0c_descriptionB\x0f\n\r_completed_atB\x0b\n\t_preimageB\x12\n\x10_number_of_partsB\x10\n\x0e_created_indexB\x10\n\x0e_updated_index\"\xd6\x01\n\x10ListhtlcsRequest\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x38\n\x05index\x18\x02 \x01(\x0e\x32$.cln.ListhtlcsRequest.ListhtlcsIndexH\x01\x88\x01\x01\x12\x12\n\x05start\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12\x12\n\x05limit\x18\x04 \x01(\rH\x03\x88\x01\x01\"*\n\x0eListhtlcsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\x05\n\x03_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"7\n\x11ListhtlcsResponse\x12\"\n\x05htlcs\x18\x01 \x03(\x0b\x32\x13.cln.ListhtlcsHtlcs\"\xe5\x02\n\x0eListhtlcsHtlcs\x12\x18\n\x10short_channel_id\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x0e\n\x06\x65xpiry\x18\x03 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12>\n\tdirection\x18\x05 \x01(\x0e\x32+.cln.ListhtlcsHtlcs.ListhtlcsHtlcsDirection\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x1d\n\x05state\x18\x07 \x01(\x0e\x32\x0e.cln.HtlcState\x12\x1a\n\rcreated_index\x18\x08 \x01(\x04H\x00\x88\x01\x01\x12\x1a\n\rupdated_index\x18\t \x01(\x04H\x01\x88\x01\x01\"*\n\x17ListhtlcsHtlcsDirection\x12\x07\n\x03OUT\x10\x00\x12\x06\n\x02IN\x10\x01\x42\x10\n\x0e_created_indexB\x10\n\x0e_updated_index\"\xb2\x02\n\x17MultifundchannelRequest\x12\x37\n\x0c\x64\x65stinations\x18\x01 \x03(\x0b\x32!.cln.MultifundchannelDestinations\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\x12H\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\x18\n\x0bminchannels\x18\x05 \x01(\x12H\x02\x88\x01\x01\x12-\n\x12\x63ommitment_feerate\x18\x06 \x01(\x0b\x32\x0c.cln.FeerateH\x03\x88\x01\x01\x42\n\n\x08_feerateB\n\n\x08_minconfB\x0e\n\x0c_minchannelsB\x15\n\x13_commitment_feerate\"\x97\x01\n\x18MultifundchannelResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x34\n\x0b\x63hannel_ids\x18\x03 \x03(\x0b\x32\x1f.cln.MultifundchannelChannelIds\x12+\n\x06\x66\x61iled\x18\x04 \x03(\x0b\x32\x1b.cln.MultifundchannelFailed\"\xff\x02\n\x1cMultifundchannelDestinations\x12\n\n\x02id\x18\x01 \x01(\t\x12 \n\x06\x61mount\x18\x02 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x15\n\x08\x61nnounce\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12#\n\tpush_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\tH\x02\x88\x01\x01\x12%\n\x0brequest_amt\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x07 \x01(\tH\x04\x88\x01\x01\x12\x15\n\x08mindepth\x18\x08 \x01(\rH\x05\x88\x01\x01\x12!\n\x07reserve\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x42\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xb2\x01\n\x1aMultifundchannelChannelIds\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12\x12\n\nchannel_id\x18\x03 \x01(\x0c\x12@\n\x0c\x63hannel_type\x18\x04 \x01(\x0b\x32*.cln.MultifundchannelChannelIdsChannelType\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_close_to\"Z\n%MultifundchannelChannelIdsChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x93\x02\n\x16MultifundchannelFailed\x12\n\n\x02id\x18\x01 \x01(\x0c\x12H\n\x06method\x18\x02 \x01(\x0e\x32\x38.cln.MultifundchannelFailed.MultifundchannelFailedMethod\x12/\n\x05\x65rror\x18\x03 \x01(\x0b\x32 .cln.MultifundchannelFailedError\"r\n\x1cMultifundchannelFailedMethod\x12\x0b\n\x07\x43ONNECT\x10\x00\x12\x14\n\x10OPENCHANNEL_INIT\x10\x01\x12\x15\n\x11\x46UNDCHANNEL_START\x10\x02\x12\x18\n\x14\x46UNDCHANNEL_COMPLETE\x10\x03\"<\n\x1bMultifundchannelFailedError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x12\x12\x0f\n\x07message\x18\x02 \x01(\t\"\xa8\x01\n\x14MultiwithdrawRequest\x12 \n\x07outputs\x18\x01 \x03(\x0b\x32\x0f.cln.OutputDesc\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.OutpointB\n\n\x08_feerateB\n\n\x08_minconf\"1\n\x15MultiwithdrawResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xe2\x04\n\x0cOfferRequest\x12\x0e\n\x06\x61mount\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0cquantity_max\x18\x05 \x01(\x04H\x03\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x06 \x01(\x04H\x04\x88\x01\x01\x12\x17\n\nrecurrence\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1c\n\x0frecurrence_base\x18\x08 \x01(\tH\x06\x88\x01\x01\x12!\n\x14recurrence_paywindow\x18\t \x01(\tH\x07\x88\x01\x01\x12\x1d\n\x10recurrence_limit\x18\n \x01(\rH\x08\x88\x01\x01\x12\x17\n\nsingle_use\x18\x0b \x01(\x08H\t\x88\x01\x01\x12 \n\x13proportional_amount\x18\r \x01(\x08H\n\x88\x01\x01\x12 \n\x13optional_recurrence\x18\x0e \x01(\x08H\x0b\x88\x01\x01\x12\x16\n\x0e\x66ronting_nodes\x18\x0f \x03(\x0c\x42\x0e\n\x0c_descriptionB\t\n\x07_issuerB\x08\n\x06_labelB\x0f\n\r_quantity_maxB\x12\n\x10_absolute_expiryB\r\n\x0b_recurrenceB\x12\n\x10_recurrence_baseB\x17\n\x15_recurrence_paywindowB\x13\n\x11_recurrence_limitB\r\n\x0b_single_useB\x16\n\x14_proportional_amountB\x16\n\x14_optional_recurrence\"\xbc\x01\n\rOfferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x0f\n\x07\x63reated\x18\x06 \x01(\x08\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x01\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_force_paths\"-\n\x17OpenchannelAbortRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"X\n\x18OpenchannelAbortResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x18\n\x10\x63hannel_canceled\x18\x02 \x01(\x08\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x9e\x01\n\x16OpenchannelBumpRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0binitialpsbt\x18\x02 \x01(\t\x12*\n\x0f\x66unding_feerate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x1b\n\x06\x61mount\x18\x04 \x01(\x0b\x32\x0b.cln.AmountB\x12\n\x10_funding_feerate\"\xed\x01\n\x17OpenchannelBumpResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x35\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32\x1f.cln.OpenchannelBumpChannelType\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x00\x88\x01\x01\x42\x1c\n\x1a_requires_confirmed_inputs\"O\n\x1aOpenchannelBumpChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x9f\x03\n\x16OpenchannelInitRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x13\n\x0binitialpsbt\x18\x02 \x01(\t\x12-\n\x12\x63ommitment_feerate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12*\n\x0f\x66unding_feerate\x18\x04 \x01(\x0b\x32\x0c.cln.FeerateH\x01\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\tH\x03\x88\x01\x01\x12%\n\x0brequest_amt\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x08 \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\t \x03(\r\x12\x1b\n\x06\x61mount\x18\n \x01(\x0b\x32\x0b.cln.AmountB\x15\n\x13_commitment_feerateB\x12\n\x10_funding_feerateB\x0b\n\t_announceB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_lease\"\xed\x01\n\x17OpenchannelInitResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x35\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32\x1f.cln.OpenchannelInitChannelType\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x00\x88\x01\x01\x42\x1c\n\x1a_requires_confirmed_inputs\"O\n\x1aOpenchannelInitChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"C\n\x18OpenchannelSignedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_psbt\x18\x02 \x01(\t\"I\n\x19OpenchannelSignedResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"<\n\x18OpenchannelUpdateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"\x95\x02\n\x19OpenchannelUpdateResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x37\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32!.cln.OpenchannelUpdateChannelType\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_outnum\x18\x05 \x01(\r\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12&\n\x19requires_confirmed_inputs\x18\x07 \x01(\x08H\x01\x88\x01\x01\x42\x0b\n\t_close_toB\x1c\n\x1a_requires_confirmed_inputs\"Q\n\x1cOpenchannelUpdateChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"Y\n\x0bPingRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x03len\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x16\n\tpongbytes\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x06\n\x04_lenB\x0c\n\n_pongbytes\"\x1e\n\x0cPingResponse\x12\x0e\n\x06totlen\x18\x01 \x01(\r\"\x91\x01\n\rPluginRequest\x12)\n\nsubcommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12\x13\n\x06plugin\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tdirectory\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x07options\x18\x04 \x03(\tB\t\n\x07_pluginB\x0c\n\n_directory\"}\n\x0ePluginResponse\x12&\n\x07\x63ommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12#\n\x07plugins\x18\x02 \x03(\x0b\x32\x12.cln.PluginPlugins\x12\x13\n\x06result\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_result\">\n\rPluginPlugins\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x0f\n\x07\x64ynamic\x18\x03 \x01(\x08\"<\n\x14RenepaystatusRequest\x12\x16\n\tinvstring\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_invstring\"G\n\x15RenepaystatusResponse\x12.\n\tpaystatus\x18\x01 \x03(\x0b\x32\x1b.cln.RenepaystatusPaystatus\"\xe2\x03\n\x16RenepaystatusPaystatus\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x1d\n\x10payment_preimage\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\x0f\n\x07groupid\x18\x05 \x01(\r\x12\x12\n\x05parts\x18\x06 \x01(\rH\x01\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12*\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12H\n\x06status\x18\t \x01(\x0e\x32\x38.cln.RenepaystatusPaystatus.RenepaystatusPaystatusStatus\x12\x18\n\x0b\x64\x65stination\x18\n \x01(\x0cH\x03\x88\x01\x01\x12\r\n\x05notes\x18\x0b \x03(\t\"E\n\x1cRenepaystatusPaystatusStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x13\n\x11_payment_preimageB\x08\n\x06_partsB\x13\n\x11_amount_sent_msatB\x0e\n\x0c_destination\"\xda\x02\n\x0eRenepayRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x03\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x12\n\x05label\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1b\n\x0e\x64\x65v_use_shadow\x18\x08 \x01(\x08H\x06\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\t \x03(\tB\x0e\n\x0c_amount_msatB\t\n\x07_maxfeeB\x0b\n\t_maxdelayB\x0c\n\n_retry_forB\x0e\n\x0c_descriptionB\x08\n\x06_labelB\x11\n\x0f_dev_use_shadow\"\xa5\x03\n\x0fRenepayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\r\n\x05parts\x18\x04 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12\x32\n\x06status\x18\x07 \x01(\x0e\x32\".cln.RenepayResponse.RenepayStatus\x12\x18\n\x0b\x64\x65stination\x18\x08 \x01(\x0cH\x00\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\t \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\n \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07groupid\x18\x0b \x01(\x04H\x03\x88\x01\x01\"6\n\rRenepayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x0e\n\x0c_destinationB\t\n\x07_bolt11B\t\n\x07_bolt12B\n\n\x08_groupid\"l\n\x14ReserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\texclusive\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x14\n\x07reserve\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x0c\n\n_exclusiveB\n\n\x08_reserve\"M\n\x15ReserveinputsResponse\x12\x34\n\x0creservations\x18\x01 \x03(\x0b\x32\x1e.cln.ReserveinputsReservations\"z\n\x19ReserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\"4\n\x14SendcustommsgRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x0c\x12\x0b\n\x03msg\x18\x02 \x01(\x0c\"\'\n\x15SendcustommsgResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\"\xb0\x01\n\x12SendinvoiceRequest\x12\x0e\n\x06invreq\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08quantity\x18\x05 \x01(\x04H\x02\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\n\n\x08_timeoutB\x0b\n\t_quantity\"\xb8\x04\n\x13SendinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.SendinvoiceResponse.SendinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x15\n\rcreated_index\x18\x08 \x01(\x04\x12\x1a\n\rupdated_index\x18\t \x01(\x04H\x02\x88\x01\x01\x12\x16\n\tpay_index\x18\n \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0c \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x06\x88\x01\x01\"6\n\x11SendinvoiceStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_amount_msatB\t\n\x07_bolt12B\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\xaa\x02\n\x11SetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12!\n\x07\x66\x65\x65\x62\x61se\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x66\x65\x65ppm\x18\x03 \x01(\rH\x01\x88\x01\x01\x12!\n\x07htlcmin\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12!\n\x07htlcmax\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x19\n\x0c\x65nforcedelay\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1c\n\x0fignorefeelimits\x18\x07 \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_feebaseB\t\n\x07_feeppmB\n\n\x08_htlcminB\n\n\x08_htlcmaxB\x0f\n\r_enforcedelayB\x12\n\x10_ignorefeelimits\"?\n\x12SetchannelResponse\x12)\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x17.cln.SetchannelChannels\"\xaf\x03\n\x12SetchannelChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\x12*\n\x15minimum_htlc_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x17warning_htlcmin_too_low\x18\x07 \x01(\tH\x01\x88\x01\x01\x12*\n\x15maximum_htlc_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x18warning_htlcmax_too_high\x18\t \x01(\tH\x02\x88\x01\x01\x12\x19\n\x11ignore_fee_limits\x18\n \x01(\x08\x42\x13\n\x11_short_channel_idB\x1a\n\x18_warning_htlcmin_too_lowB\x1b\n\x19_warning_htlcmax_too_high\"b\n\x10SetconfigRequest\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x10\n\x03val\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttransient\x18\x03 \x01(\x08H\x01\x88\x01\x01\x42\x06\n\x04_valB\x0c\n\n_transient\"9\n\x11SetconfigResponse\x12$\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x14.cln.SetconfigConfig\"\xa5\x02\n\x0fSetconfigConfig\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x64ynamic\x18\x04 \x01(\x08\x12\x10\n\x03set\x18\x05 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tvalue_str\x18\x06 \x01(\tH\x02\x88\x01\x01\x12$\n\nvalue_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x16\n\tvalue_int\x18\x08 \x01(\x12H\x04\x88\x01\x01\x12\x17\n\nvalue_bool\x18\t \x01(\x08H\x05\x88\x01\x01\x42\t\n\x07_pluginB\x06\n\x04_setB\x0c\n\n_value_strB\r\n\x0b_value_msatB\x0c\n\n_value_intB\r\n\x0b_value_bool\"6\n\x15SetpsbtversionRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\r\"&\n\x16SetpsbtversionResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"\'\n\x12SigninvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\"%\n\x13SigninvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"%\n\x12SignmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"F\n\x13SignmessageResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\r\n\x05recid\x18\x02 \x01(\x0c\x12\r\n\x05zbase\x18\x03 \x01(\t\"\xc8\x01\n\x11SpliceInitRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x17\n\x0frelative_amount\x18\x02 \x01(\x12\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x65\x65rate_per_kw\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x0e\n\x0c_initialpsbtB\x11\n\x0f_feerate_per_kwB\x10\n\x0e_force_feerate\"\"\n\x12SpliceInitResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"_\n\x13SpliceSignedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x17\n\nsign_first\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_sign_first\"^\n\x14SpliceSignedResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x13\n\x06outnum\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04psbt\x18\x04 \x01(\tB\t\n\x07_outnum\"7\n\x13SpliceUpdateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"y\n\x14SpliceUpdateResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\x12\x1f\n\x12signatures_secured\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x15\n\x13_signatures_secured\"2\n\x0fSpliceinRequest\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\t\"b\n\x10SpliceinResponse\x12\x11\n\x04psbt\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"\x8b\x01\n\x10SpliceoutRequest\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\t\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x04 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_destinationB\x10\n\x0e_force_feerate\"c\n\x11SpliceoutResponse\x12\x11\n\x04psbt\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"\xc6\x01\n\x10\x44\x65vspliceRequest\x12\x16\n\x0escript_or_json\x18\x01 \x01(\t\x12\x13\n\x06\x64ryrun\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tdebug_log\x18\x04 \x01(\x08H\x02\x88\x01\x01\x12\x17\n\ndev_wetrun\x18\x05 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_dryrunB\x10\n\x0e_force_feerateB\x0c\n\n_debug_logB\r\n\x0b_dev_wetrun\"\x80\x01\n\x11\x44\x65vspliceResponse\x12\x0e\n\x06\x64ryrun\x18\x01 \x03(\t\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03log\x18\x05 \x03(\tB\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"H\n\x16UnreserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x14\n\x07reserve\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_reserve\"Q\n\x17UnreserveinputsResponse\x12\x36\n\x0creservations\x18\x01 \x03(\x0b\x32 .cln.UnreserveinputsReservations\"\x97\x01\n\x1bUnreserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x1e\n\x11reserved_to_block\x18\x05 \x01(\rH\x00\x88\x01\x01\x42\x14\n\x12_reserved_to_block\"n\n\x14UpgradewalletRequest\x12\"\n\x07\x66\x65\x65rate\x18\x01 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x17\n\nreservedok\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\n\n\x08_feerateB\r\n\x0b_reservedok\"~\n\x15UpgradewalletResponse\x12\x15\n\rupgraded_outs\x18\x01 \x01(\x04\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\x0cH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"O\n\x16WaitblockheightRequest\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\x12\x14\n\x07timeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_timeout\".\n\x17WaitblockheightResponse\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\"\xb9\x02\n\x0bWaitRequest\x12\x31\n\tsubsystem\x18\x01 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitSubsystem\x12\x31\n\tindexname\x18\x02 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitIndexname\x12\x11\n\tnextvalue\x18\x03 \x01(\x04\"y\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\x12\t\n\x05HTLCS\x10\x03\x12\x0e\n\nCHAINMOVES\x10\x04\x12\x10\n\x0c\x43HANNELMOVES\x10\x05\x12\x11\n\rNETWORKEVENTS\x10\x06\"6\n\rWaitIndexname\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x12\x0b\n\x07\x44\x45LETED\x10\x02\"\xf0\x05\n\x0cWaitResponse\x12\x32\n\tsubsystem\x18\x01 \x01(\x0e\x32\x1f.cln.WaitResponse.WaitSubsystem\x12\x14\n\x07\x63reated\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07updated\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x14\n\x07\x64\x65leted\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12&\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32\x10.cln.WaitDetailsH\x03\x88\x01\x01\x12(\n\x08\x66orwards\x18\x06 \x01(\x0b\x32\x11.cln.WaitForwardsH\x04\x88\x01\x01\x12(\n\x08invoices\x18\x07 \x01(\x0b\x32\x11.cln.WaitInvoicesH\x05\x88\x01\x01\x12(\n\x08sendpays\x18\x08 \x01(\x0b\x32\x11.cln.WaitSendpaysH\x06\x88\x01\x01\x12\"\n\x05htlcs\x18\t \x01(\x0b\x32\x0e.cln.WaitHtlcsH\x07\x88\x01\x01\x12,\n\nchainmoves\x18\n \x01(\x0b\x32\x13.cln.WaitChainmovesH\x08\x88\x01\x01\x12\x30\n\x0c\x63hannelmoves\x18\x0b \x01(\x0b\x32\x15.cln.WaitChannelmovesH\t\x88\x01\x01\x12\x32\n\rnetworkevents\x18\x0c \x01(\x0b\x32\x16.cln.WaitNetworkeventsH\n\x88\x01\x01\"y\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\x12\t\n\x05HTLCS\x10\x03\x12\x0e\n\nCHAINMOVES\x10\x04\x12\x10\n\x0c\x43HANNELMOVES\x10\x05\x12\x11\n\rNETWORKEVENTS\x10\x06\x42\n\n\x08_createdB\n\n\x08_updatedB\n\n\x08_deletedB\n\n\x08_detailsB\x0b\n\t_forwardsB\x0b\n\t_invoicesB\x0b\n\t_sendpaysB\x08\n\x06_htlcsB\r\n\x0b_chainmovesB\x0f\n\r_channelmovesB\x10\n\x0e_networkevents\"\xcb\x02\n\x0cWaitForwards\x12\x39\n\x06status\x18\x01 \x01(\x0e\x32$.cln.WaitForwards.WaitForwardsStatusH\x00\x88\x01\x01\x12\x17\n\nin_channel\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12!\n\x07in_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x18\n\x0bout_channel\x18\x05 \x01(\tH\x04\x88\x01\x01\"L\n\x12WaitForwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x12\x10\n\x0cLOCAL_FAILED\x10\x03\x42\t\n\x07_statusB\r\n\x0b_in_channelB\r\n\x0b_in_htlc_idB\n\n\x08_in_msatB\x0e\n\x0c_out_channel\"\x95\x02\n\x0cWaitInvoices\x12\x39\n\x06status\x18\x01 \x01(\x0e\x32$.cln.WaitInvoices.WaitInvoicesStatusH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x05 \x01(\tH\x04\x88\x01\x01\"7\n\x12WaitInvoicesStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\t\n\x07_statusB\x08\n\x06_labelB\x0e\n\x0c_descriptionB\t\n\x07_bolt11B\t\n\x07_bolt12\"\xff\x01\n\x0cWaitSendpays\x12\x39\n\x06status\x18\x01 \x01(\x0e\x32$.cln.WaitSendpays.WaitSendpaysStatusH\x00\x88\x01\x01\x12\x13\n\x06partid\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x14\n\x07groupid\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x04 \x01(\x0cH\x03\x88\x01\x01\";\n\x12WaitSendpaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\t\n\x07_statusB\t\n\x07_partidB\n\n\x08_groupidB\x0f\n\r_payment_hash\"\x8c\x03\n\tWaitHtlcs\x12\"\n\x05state\x18\x01 \x01(\x0e\x32\x0e.cln.HtlcStateH\x00\x88\x01\x01\x12\x14\n\x07htlc_id\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x63ltv_expiry\x18\x04 \x01(\rH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x39\n\tdirection\x18\x06 \x01(\x0e\x32!.cln.WaitHtlcs.WaitHtlcsDirectionH\x05\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x07 \x01(\x0cH\x06\x88\x01\x01\"%\n\x12WaitHtlcsDirection\x12\x07\n\x03OUT\x10\x00\x12\x06\n\x02IN\x10\x01\x42\x08\n\x06_stateB\n\n\x08_htlc_idB\x13\n\x11_short_channel_idB\x0e\n\x0c_cltv_expiryB\x0e\n\x0c_amount_msatB\x0c\n\n_directionB\x0f\n\r_payment_hash\"d\n\x0eWaitChainmoves\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"f\n\x10WaitChannelmoves\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"\x89\x02\n\x11WaitNetworkevents\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x44\n\titem_type\x18\x02 \x01(\x0e\x32,.cln.WaitNetworkevents.WaitNetworkeventsTypeH\x01\x88\x01\x01\x12\x14\n\x07peer_id\x18\x03 \x01(\x0cH\x02\x88\x01\x01\"P\n\x15WaitNetworkeventsType\x12\x0b\n\x07\x43ONNECT\x10\x00\x12\x10\n\x0c\x43ONNECT_FAIL\x10\x01\x12\x08\n\x04PING\x10\x02\x12\x0e\n\nDISCONNECT\x10\x03\x42\x10\n\x0e_created_indexB\x0c\n\n_item_typeB\n\n\x08_peer_id\"\xfc\x04\n\x0bWaitDetails\x12\x37\n\x06status\x18\x01 \x01(\x0e\x32\".cln.WaitDetails.WaitDetailsStatusH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x14\n\x07groupid\x18\x07 \x01(\x04H\x06\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x08 \x01(\x0cH\x07\x88\x01\x01\x12\x17\n\nin_channel\x18\t \x01(\tH\x08\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\t\x88\x01\x01\x12!\n\x07in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x12\x18\n\x0bout_channel\x18\x0c \x01(\tH\x0b\x88\x01\x01\"\x89\x01\n\x11WaitDetailsStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x12\x0b\n\x07PENDING\x10\x03\x12\n\n\x06\x46\x41ILED\x10\x04\x12\x0c\n\x08\x43OMPLETE\x10\x05\x12\x0b\n\x07OFFERED\x10\x06\x12\x0b\n\x07SETTLED\x10\x07\x12\x10\n\x0cLOCAL_FAILED\x10\x08\x42\t\n\x07_statusB\x08\n\x06_labelB\x0e\n\x0c_descriptionB\t\n\x07_bolt11B\t\n\x07_bolt12B\t\n\x07_partidB\n\n\x08_groupidB\x0f\n\r_payment_hashB\r\n\x0b_in_channelB\r\n\x0b_in_htlc_idB\n\n\x08_in_msatB\x0e\n\x0c_out_channel\"4\n\x12ListconfigsRequest\x12\x13\n\x06\x63onfig\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_config\"P\n\x13ListconfigsResponse\x12-\n\x07\x63onfigs\x18\x01 \x01(\x0b\x32\x17.cln.ListconfigsConfigsH\x00\x88\x01\x01\x42\n\n\x08_configs\"\xd5\x30\n\x12ListconfigsConfigs\x12.\n\x04\x63onf\x18\x01 \x01(\x0b\x32\x1b.cln.ListconfigsConfigsConfH\x00\x88\x01\x01\x12\x38\n\tdeveloper\x18\x02 \x01(\x0b\x32 .cln.ListconfigsConfigsDeveloperH\x01\x88\x01\x01\x12?\n\rclear_plugins\x18\x03 \x01(\x0b\x32#.cln.ListconfigsConfigsClearpluginsH\x02\x88\x01\x01\x12;\n\x0b\x64isable_mpp\x18\x04 \x01(\x0b\x32!.cln.ListconfigsConfigsDisablemppH\x03\x88\x01\x01\x12\x34\n\x07mainnet\x18\x05 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsMainnetH\x04\x88\x01\x01\x12\x34\n\x07regtest\x18\x06 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsRegtestH\x05\x88\x01\x01\x12\x32\n\x06signet\x18\x07 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsSignetH\x06\x88\x01\x01\x12\x34\n\x07testnet\x18\x08 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsTestnetH\x07\x88\x01\x01\x12\x45\n\x10important_plugin\x18\t \x01(\x0b\x32&.cln.ListconfigsConfigsImportantpluginH\x08\x88\x01\x01\x12\x32\n\x06plugin\x18\n \x01(\x0b\x32\x1d.cln.ListconfigsConfigsPluginH\t\x88\x01\x01\x12\x39\n\nplugin_dir\x18\x0b \x01(\x0b\x32 .cln.ListconfigsConfigsPlugindirH\n\x88\x01\x01\x12?\n\rlightning_dir\x18\x0c \x01(\x0b\x32#.cln.ListconfigsConfigsLightningdirH\x0b\x88\x01\x01\x12\x34\n\x07network\x18\r \x01(\x0b\x32\x1e.cln.ListconfigsConfigsNetworkH\x0c\x88\x01\x01\x12N\n\x15\x61llow_deprecated_apis\x18\x0e \x01(\x0b\x32*.cln.ListconfigsConfigsAllowdeprecatedapisH\r\x88\x01\x01\x12\x35\n\x08rpc_file\x18\x0f \x01(\x0b\x32\x1e.cln.ListconfigsConfigsRpcfileH\x0e\x88\x01\x01\x12\x41\n\x0e\x64isable_plugin\x18\x10 \x01(\x0b\x32$.cln.ListconfigsConfigsDisablepluginH\x0f\x88\x01\x01\x12\x44\n\x10\x61lways_use_proxy\x18\x11 \x01(\x0b\x32%.cln.ListconfigsConfigsAlwaysuseproxyH\x10\x88\x01\x01\x12\x32\n\x06\x64\x61\x65mon\x18\x12 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsDaemonH\x11\x88\x01\x01\x12\x32\n\x06wallet\x18\x13 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsWalletH\x12\x88\x01\x01\x12\x41\n\x0elarge_channels\x18\x14 \x01(\x0b\x32$.cln.ListconfigsConfigsLargechannelsH\x13\x88\x01\x01\x12P\n\x16\x65xperimental_dual_fund\x18\x15 \x01(\x0b\x32+.cln.ListconfigsConfigsExperimentaldualfundH\x14\x88\x01\x01\x12O\n\x15\x65xperimental_splicing\x18\x16 \x01(\x0b\x32+.cln.ListconfigsConfigsExperimentalsplicingH\x15\x88\x01\x01\x12Z\n\x1b\x65xperimental_onion_messages\x18\x17 \x01(\x0b\x32\x30.cln.ListconfigsConfigsExperimentalonionmessagesH\x16\x88\x01\x01\x12K\n\x13\x65xperimental_offers\x18\x18 \x01(\x0b\x32).cln.ListconfigsConfigsExperimentaloffersH\x17\x88\x01\x01\x12i\n#experimental_shutdown_wrong_funding\x18\x19 \x01(\x0b\x32\x37.cln.ListconfigsConfigsExperimentalshutdownwrongfundingH\x18\x88\x01\x01\x12V\n\x19\x65xperimental_peer_storage\x18\x1a \x01(\x0b\x32..cln.ListconfigsConfigsExperimentalpeerstorageH\x19\x88\x01\x01\x12M\n\x14\x65xperimental_anchors\x18\x1b \x01(\x0b\x32*.cln.ListconfigsConfigsExperimentalanchorsH\x1a\x88\x01\x01\x12\x45\n\x10\x64\x61tabase_upgrade\x18\x1c \x01(\x0b\x32&.cln.ListconfigsConfigsDatabaseupgradeH\x1b\x88\x01\x01\x12,\n\x03rgb\x18\x1d \x01(\x0b\x32\x1a.cln.ListconfigsConfigsRgbH\x1c\x88\x01\x01\x12\x30\n\x05\x61lias\x18\x1e \x01(\x0b\x32\x1c.cln.ListconfigsConfigsAliasH\x1d\x88\x01\x01\x12\x35\n\x08pid_file\x18\x1f \x01(\x0b\x32\x1e.cln.ListconfigsConfigsPidfileH\x1e\x88\x01\x01\x12\x46\n\x11ignore_fee_limits\x18 \x01(\x0b\x32&.cln.ListconfigsConfigsIgnorefeelimitsH\x1f\x88\x01\x01\x12\x45\n\x10watchtime_blocks\x18! \x01(\x0b\x32&.cln.ListconfigsConfigsWatchtimeblocksH \x88\x01\x01\x12J\n\x13max_locktime_blocks\x18\" \x01(\x0b\x32(.cln.ListconfigsConfigsMaxlocktimeblocksH!\x88\x01\x01\x12\x45\n\x10\x66unding_confirms\x18# \x01(\x0b\x32&.cln.ListconfigsConfigsFundingconfirmsH\"\x88\x01\x01\x12\x39\n\ncltv_delta\x18$ \x01(\x0b\x32 .cln.ListconfigsConfigsCltvdeltaH#\x88\x01\x01\x12\x39\n\ncltv_final\x18% \x01(\x0b\x32 .cln.ListconfigsConfigsCltvfinalH$\x88\x01\x01\x12;\n\x0b\x63ommit_time\x18& \x01(\x0b\x32!.cln.ListconfigsConfigsCommittimeH%\x88\x01\x01\x12\x35\n\x08\x66\x65\x65_base\x18\' \x01(\x0b\x32\x1e.cln.ListconfigsConfigsFeebaseH&\x88\x01\x01\x12\x32\n\x06rescan\x18( \x01(\x0b\x32\x1d.cln.ListconfigsConfigsRescanH\'\x88\x01\x01\x12\x42\n\x0f\x66\x65\x65_per_satoshi\x18) \x01(\x0b\x32$.cln.ListconfigsConfigsFeepersatoshiH(\x88\x01\x01\x12L\n\x14max_concurrent_htlcs\x18* \x01(\x0b\x32).cln.ListconfigsConfigsMaxconcurrenthtlcsH)\x88\x01\x01\x12\x46\n\x11htlc_minimum_msat\x18+ \x01(\x0b\x32&.cln.ListconfigsConfigsHtlcminimummsatH*\x88\x01\x01\x12\x46\n\x11htlc_maximum_msat\x18, \x01(\x0b\x32&.cln.ListconfigsConfigsHtlcmaximummsatH+\x88\x01\x01\x12X\n\x1bmax_dust_htlc_exposure_msat\x18- \x01(\x0b\x32..cln.ListconfigsConfigsMaxdusthtlcexposuremsatH,\x88\x01\x01\x12\x44\n\x10min_capacity_sat\x18. \x01(\x0b\x32%.cln.ListconfigsConfigsMincapacitysatH-\x88\x01\x01\x12.\n\x04\x61\x64\x64r\x18/ \x01(\x0b\x32\x1b.cln.ListconfigsConfigsAddrH.\x88\x01\x01\x12?\n\rannounce_addr\x18\x30 \x01(\x0b\x32#.cln.ListconfigsConfigsAnnounceaddrH/\x88\x01\x01\x12\x37\n\tbind_addr\x18\x31 \x01(\x0b\x32\x1f.cln.ListconfigsConfigsBindaddrH0\x88\x01\x01\x12\x34\n\x07offline\x18\x32 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsOfflineH1\x88\x01\x01\x12:\n\nautolisten\x18\x33 \x01(\x0b\x32!.cln.ListconfigsConfigsAutolistenH2\x88\x01\x01\x12\x30\n\x05proxy\x18\x34 \x01(\x0b\x32\x1c.cln.ListconfigsConfigsProxyH3\x88\x01\x01\x12;\n\x0b\x64isable_dns\x18\x35 \x01(\x0b\x32!.cln.ListconfigsConfigsDisablednsH4\x88\x01\x01\x12T\n\x18\x61nnounce_addr_discovered\x18\x36 \x01(\x0b\x32-.cln.ListconfigsConfigsAnnounceaddrdiscoveredH5\x88\x01\x01\x12]\n\x1d\x61nnounce_addr_discovered_port\x18\x37 \x01(\x0b\x32\x31.cln.ListconfigsConfigsAnnounceaddrdiscoveredportH6\x88\x01\x01\x12?\n\rencrypted_hsm\x18\x38 \x01(\x0b\x32#.cln.ListconfigsConfigsEncryptedhsmH7\x88\x01\x01\x12>\n\rrpc_file_mode\x18\x39 \x01(\x0b\x32\".cln.ListconfigsConfigsRpcfilemodeH8\x88\x01\x01\x12\x37\n\tlog_level\x18: \x01(\x0b\x32\x1f.cln.ListconfigsConfigsLoglevelH9\x88\x01\x01\x12\x39\n\nlog_prefix\x18; \x01(\x0b\x32 .cln.ListconfigsConfigsLogprefixH:\x88\x01\x01\x12\x35\n\x08log_file\x18< \x01(\x0b\x32\x1e.cln.ListconfigsConfigsLogfileH;\x88\x01\x01\x12\x41\n\x0elog_timestamps\x18= \x01(\x0b\x32$.cln.ListconfigsConfigsLogtimestampsH<\x88\x01\x01\x12\x41\n\x0e\x66orce_feerates\x18> \x01(\x0b\x32$.cln.ListconfigsConfigsForcefeeratesH=\x88\x01\x01\x12\x38\n\tsubdaemon\x18? \x01(\x0b\x32 .cln.ListconfigsConfigsSubdaemonH>\x88\x01\x01\x12Q\n\x16\x66\x65tchinvoice_noconnect\x18@ \x01(\x0b\x32,.cln.ListconfigsConfigsFetchinvoicenoconnectH?\x88\x01\x01\x12L\n\x14tor_service_password\x18\x42 \x01(\x0b\x32).cln.ListconfigsConfigsTorservicepasswordH@\x88\x01\x01\x12\x46\n\x11\x61nnounce_addr_dns\x18\x43 \x01(\x0b\x32&.cln.ListconfigsConfigsAnnounceaddrdnsHA\x88\x01\x01\x12T\n\x18require_confirmed_inputs\x18\x44 \x01(\x0b\x32-.cln.ListconfigsConfigsRequireconfirmedinputsHB\x88\x01\x01\x12\x39\n\ncommit_fee\x18\x45 \x01(\x0b\x32 .cln.ListconfigsConfigsCommitfeeHC\x88\x01\x01\x12N\n\x15\x63ommit_feerate_offset\x18\x46 \x01(\x0b\x32*.cln.ListconfigsConfigsCommitfeerateoffsetHD\x88\x01\x01\x12T\n\x18\x61utoconnect_seeker_peers\x18G \x01(\x0b\x32-.cln.ListconfigsConfigsAutoconnectseekerpeersHE\x88\x01\x01\x12R\n\x17\x63urrencyrate_add_source\x18J \x01(\x0b\x32,.cln.ListconfigsConfigsCurrencyrateaddsourceHF\x88\x01\x01\x12Z\n\x1b\x63urrencyrate_disable_source\x18K \x01(\x0b\x32\x30.cln.ListconfigsConfigsCurrencyratedisablesourceHG\x88\x01\x01\x42\x07\n\x05_confB\x0c\n\n_developerB\x10\n\x0e_clear_pluginsB\x0e\n\x0c_disable_mppB\n\n\x08_mainnetB\n\n\x08_regtestB\t\n\x07_signetB\n\n\x08_testnetB\x13\n\x11_important_pluginB\t\n\x07_pluginB\r\n\x0b_plugin_dirB\x10\n\x0e_lightning_dirB\n\n\x08_networkB\x18\n\x16_allow_deprecated_apisB\x0b\n\t_rpc_fileB\x11\n\x0f_disable_pluginB\x13\n\x11_always_use_proxyB\t\n\x07_daemonB\t\n\x07_walletB\x11\n\x0f_large_channelsB\x19\n\x17_experimental_dual_fundB\x18\n\x16_experimental_splicingB\x1e\n\x1c_experimental_onion_messagesB\x16\n\x14_experimental_offersB&\n$_experimental_shutdown_wrong_fundingB\x1c\n\x1a_experimental_peer_storageB\x17\n\x15_experimental_anchorsB\x13\n\x11_database_upgradeB\x06\n\x04_rgbB\x08\n\x06_aliasB\x0b\n\t_pid_fileB\x14\n\x12_ignore_fee_limitsB\x13\n\x11_watchtime_blocksB\x16\n\x14_max_locktime_blocksB\x13\n\x11_funding_confirmsB\r\n\x0b_cltv_deltaB\r\n\x0b_cltv_finalB\x0e\n\x0c_commit_timeB\x0b\n\t_fee_baseB\t\n\x07_rescanB\x12\n\x10_fee_per_satoshiB\x17\n\x15_max_concurrent_htlcsB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x1e\n\x1c_max_dust_htlc_exposure_msatB\x13\n\x11_min_capacity_satB\x07\n\x05_addrB\x10\n\x0e_announce_addrB\x0c\n\n_bind_addrB\n\n\x08_offlineB\r\n\x0b_autolistenB\x08\n\x06_proxyB\x0e\n\x0c_disable_dnsB\x1b\n\x19_announce_addr_discoveredB \n\x1e_announce_addr_discovered_portB\x10\n\x0e_encrypted_hsmB\x10\n\x0e_rpc_file_modeB\x0c\n\n_log_levelB\r\n\x0b_log_prefixB\x0b\n\t_log_fileB\x11\n\x0f_log_timestampsB\x11\n\x0f_force_feeratesB\x0c\n\n_subdaemonB\x19\n\x17_fetchinvoice_noconnectB\x17\n\x15_tor_service_passwordB\x14\n\x12_announce_addr_dnsB\x1b\n\x19_require_confirmed_inputsB\r\n\x0b_commit_feeB\x18\n\x16_commit_feerate_offsetB\x1b\n\x19_autoconnect_seeker_peersB\x1a\n\x18_currencyrate_add_sourceB\x1e\n\x1c_currencyrate_disable_source\"\xa2\x01\n\x16ListconfigsConfigsConf\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12H\n\x06source\x18\x02 \x01(\x0e\x32\x38.cln.ListconfigsConfigsConf.ListconfigsConfigsConfSource\"+\n\x1cListconfigsConfigsConfSource\x12\x0b\n\x07\x43MDLINE\x10\x00\":\n\x1bListconfigsConfigsDeveloper\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x1eListconfigsConfigsClearplugins\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"[\n\x1cListconfigsConfigsDisablempp\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"8\n\x19ListconfigsConfigsMainnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsRegtest\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"7\n\x18ListconfigsConfigsSignet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsTestnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n!ListconfigsConfigsImportantplugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"?\n\x18ListconfigsConfigsPlugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"B\n\x1bListconfigsConfigsPlugindir\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"C\n\x1eListconfigsConfigsLightningdir\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsNetwork\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"K\n%ListconfigsConfigsAllowdeprecatedapis\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsRpcfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n\x1fListconfigsConfigsDisableplugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"F\n ListconfigsConfigsAlwaysuseproxy\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"7\n\x18ListconfigsConfigsDaemon\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x18ListconfigsConfigsWallet\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x1fListconfigsConfigsLargechannels\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"E\n&ListconfigsConfigsExperimentaldualfund\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"E\n&ListconfigsConfigsExperimentalsplicing\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"J\n+ListconfigsConfigsExperimentalonionmessages\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"C\n$ListconfigsConfigsExperimentaloffers\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"Q\n2ListconfigsConfigsExperimentalshutdownwrongfunding\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n)ListconfigsConfigsExperimentalpeerstorage\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n%ListconfigsConfigsExperimentalanchors\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsDatabaseupgrade\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\":\n\x15ListconfigsConfigsRgb\x12\x11\n\tvalue_str\x18\x01 \x01(\x0c\x12\x0e\n\x06source\x18\x02 \x01(\t\"<\n\x17ListconfigsConfigsAlias\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsPidfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsIgnorefeelimits\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n!ListconfigsConfigsWatchtimeblocks\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n#ListconfigsConfigsMaxlocktimeblocks\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n!ListconfigsConfigsFundingconfirms\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCltvdelta\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCltvfinal\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"A\n\x1cListconfigsConfigsCommittime\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsFeebase\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x18ListconfigsConfigsRescan\x12\x11\n\tvalue_int\x18\x01 \x01(\x12\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n\x1fListconfigsConfigsFeepersatoshi\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"I\n$ListconfigsConfigsMaxconcurrenthtlcs\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"T\n!ListconfigsConfigsHtlcminimummsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"T\n!ListconfigsConfigsHtlcmaximummsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"\\\n)ListconfigsConfigsMaxdusthtlcexposuremsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"g\n ListconfigsConfigsMincapacitysat\x12\x11\n\tvalue_int\x18\x01 \x01(\x04\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x14\n\x07\x64ynamic\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\n\n\x08_dynamic\"=\n\x16ListconfigsConfigsAddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"E\n\x1eListconfigsConfigsAnnounceaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"A\n\x1aListconfigsConfigsBindaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"8\n\x19ListconfigsConfigsOffline\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1cListconfigsConfigsAutolisten\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"<\n\x17ListconfigsConfigsProxy\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\";\n\x1cListconfigsConfigsDisabledns\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"\x80\x02\n(ListconfigsConfigsAnnounceaddrdiscovered\x12q\n\tvalue_str\x18\x01 \x01(\x0e\x32^.cln.ListconfigsConfigsAnnounceaddrdiscovered.ListconfigsConfigsAnnounceaddrdiscoveredValueStr\x12\x0e\n\x06source\x18\x02 \x01(\t\"Q\n0ListconfigsConfigsAnnounceaddrdiscoveredValueStr\x12\x08\n\x04TRUE\x10\x00\x12\t\n\x05\x46\x41LSE\x10\x01\x12\x08\n\x04\x41UTO\x10\x02\"Q\n,ListconfigsConfigsAnnounceaddrdiscoveredport\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x1eListconfigsConfigsEncryptedhsm\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1dListconfigsConfigsRpcfilemode\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"?\n\x1aListconfigsConfigsLoglevel\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsLogprefix\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x19ListconfigsConfigsLogfile\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"E\n\x1fListconfigsConfigsLogtimestamps\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n\x1fListconfigsConfigsForcefeerates\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1bListconfigsConfigsSubdaemon\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"f\n\'ListconfigsConfigsFetchinvoicenoconnect\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"I\n$ListconfigsConfigsTorservicepassword\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsAnnounceaddrdns\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"N\n(ListconfigsConfigsRequireconfirmedinputs\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCommitfee\x12\x11\n\tvalue_int\x18\x01 \x01(\x04\x12\x0e\n\x06source\x18\x02 \x01(\t\"J\n%ListconfigsConfigsCommitfeerateoffset\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"M\n(ListconfigsConfigsAutoconnectseekerpeers\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"n\n\'ListconfigsConfigsCurrencyrateaddsource\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"r\n+ListconfigsConfigsCurrencyratedisablesource\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"\r\n\x0bStopRequest\"a\n\x0cStopResponse\x12,\n\x06result\x18\x01 \x01(\x0e\x32\x1c.cln.StopResponse.StopResult\"#\n\nStopResult\x12\x15\n\x11SHUTDOWN_COMPLETE\x10\x00\"/\n\x0bHelpRequest\x12\x14\n\x07\x63ommand\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_command\"\x95\x01\n\x0cHelpResponse\x12\x1b\n\x04help\x18\x01 \x03(\x0b\x32\r.cln.HelpHelp\x12:\n\x0b\x66ormat_hint\x18\x02 \x01(\x0e\x32 .cln.HelpResponse.HelpFormathintH\x00\x88\x01\x01\"\x1c\n\x0eHelpFormathint\x12\n\n\x06SIMPLE\x10\x00\x42\x0e\n\x0c_format_hint\"\x1b\n\x08HelpHelp\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\"g\n\x18PreapprovekeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"\x1b\n\x19PreapprovekeysendResponse\"*\n\x18PreapproveinvoiceRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"\x1b\n\x19PreapproveinvoiceResponse\"\x15\n\x13StaticbackupRequest\"#\n\x14StaticbackupResponse\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"d\n\x16\x42kprchannelsapyRequest\x12\x17\n\nstart_time\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\r\n\x0b_start_timeB\x0b\n\t_end_time\"P\n\x17\x42kprchannelsapyResponse\x12\x35\n\x0c\x63hannels_apy\x18\x01 \x03(\x0b\x32\x1f.cln.BkprchannelsapyChannelsApy\"\xf9\x06\n\x1a\x42kprchannelsapyChannelsApy\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12$\n\x0frouted_out_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0erouted_in_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12(\n\x13lease_fee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12*\n\x15lease_fee_earned_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x0fpushed_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0epushed_in_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x16our_start_balance_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12/\n\x1a\x63hannel_start_balance_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\rfees_out_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x0c\x66\x65\x65s_in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x17\n\x0futilization_out\x18\x0c \x01(\t\x12$\n\x17utilization_out_initial\x18\r \x01(\tH\x01\x88\x01\x01\x12\x16\n\x0eutilization_in\x18\x0e \x01(\t\x12#\n\x16utilization_in_initial\x18\x0f \x01(\tH\x02\x88\x01\x01\x12\x0f\n\x07\x61py_out\x18\x10 \x01(\t\x12\x1c\n\x0f\x61py_out_initial\x18\x11 \x01(\tH\x03\x88\x01\x01\x12\x0e\n\x06\x61py_in\x18\x12 \x01(\t\x12\x1b\n\x0e\x61py_in_initial\x18\x13 \x01(\tH\x04\x88\x01\x01\x12\x11\n\tapy_total\x18\x14 \x01(\t\x12\x1e\n\x11\x61py_total_initial\x18\x15 \x01(\tH\x05\x88\x01\x01\x12\x16\n\tapy_lease\x18\x16 \x01(\tH\x06\x88\x01\x01\x42\x0f\n\r_fees_in_msatB\x1a\n\x18_utilization_out_initialB\x19\n\x17_utilization_in_initialB\x12\n\x10_apy_out_initialB\x11\n\x0f_apy_in_initialB\x14\n\x12_apy_total_initialB\x0c\n\n_apy_lease\"\xd2\x01\n\x18\x42kprdumpincomecsvRequest\x12\x12\n\ncsv_format\x18\x01 \x01(\t\x12\x15\n\x08\x63sv_file\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1d\n\x10\x63onsolidate_fees\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x17\n\nstart_time\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x05 \x01(\x04H\x03\x88\x01\x01\x42\x0b\n\t_csv_fileB\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"\xd4\x01\n\x19\x42kprdumpincomecsvResponse\x12\x10\n\x08\x63sv_file\x18\x01 \x01(\t\x12M\n\ncsv_format\x18\x02 \x01(\x0e\x32\x39.cln.BkprdumpincomecsvResponse.BkprdumpincomecsvCsvFormat\"V\n\x1a\x42kprdumpincomecsvCsvFormat\x12\x0f\n\x0b\x43OINTRACKER\x10\x00\x12\n\n\x06KOINLY\x10\x01\x12\x0b\n\x07HARMONY\x10\x02\x12\x0e\n\nQUICKBOOKS\x10\x03\"%\n\x12\x42kprinspectRequest\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\"7\n\x13\x42kprinspectResponse\x12 \n\x03txs\x18\x01 \x03(\x0b\x32\x13.cln.BkprinspectTxs\"\x9a\x01\n\x0e\x42kprinspectTxs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x18\n\x0b\x62lockheight\x18\x02 \x01(\rH\x00\x88\x01\x01\x12#\n\x0e\x66\x65\x65s_paid_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x07outputs\x18\x04 \x03(\x0b\x32\x1a.cln.BkprinspectTxsOutputsB\x0e\n\x0c_blockheight\"\xbc\x03\n\x15\x42kprinspectTxsOutputs\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12&\n\x11output_value_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x04 \x01(\t\x12%\n\x0b\x63redit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12$\n\ndebit_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12 \n\x13originating_account\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x17\n\noutput_tag\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tspend_tag\x18\t \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rspending_txid\x18\n \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x42\x0e\n\x0c_credit_msatB\r\n\x0b_debit_msatB\x16\n\x14_originating_accountB\r\n\x0b_output_tagB\x0c\n\n_spend_tagB\x10\n\x0e_spending_txidB\r\n\x0b_payment_id\"h\n\x1c\x42kprlistaccounteventsRequest\x12\x14\n\x07\x61\x63\x63ount\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\npayment_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\n\n\x08_accountB\r\n\x0b_payment_id\"Q\n\x1d\x42kprlistaccounteventsResponse\x12\x30\n\x06\x65vents\x18\x01 \x03(\x0b\x32 .cln.BkprlistaccounteventsEvents\"\xcd\x05\n\x1b\x42kprlistaccounteventsEvents\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12S\n\titem_type\x18\x02 \x01(\x0e\x32@.cln.BkprlistaccounteventsEvents.BkprlistaccounteventsEventsType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\t \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\n \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x05\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x07\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x08\x88\x01\x01\x12\x19\n\x0c\x63urrencyrate\x18\x11 \x01(\x01H\t\x88\x01\x01\"J\n\x1f\x42kprlistaccounteventsEventsType\x12\x0f\n\x0bONCHAIN_FEE\x10\x00\x12\t\n\x05\x43HAIN\x10\x01\x12\x0b\n\x07\x43HANNEL\x10\x02\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0e\n\x0c_descriptionB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_idB\x0f\n\r_currencyrate\"\x19\n\x17\x42kprlistbalancesRequest\"K\n\x18\x42kprlistbalancesResponse\x12/\n\x08\x61\x63\x63ounts\x18\x01 \x03(\x0b\x32\x1d.cln.BkprlistbalancesAccounts\"\xc6\x02\n\x18\x42kprlistbalancesAccounts\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x37\n\x08\x62\x61lances\x18\x02 \x03(\x0b\x32%.cln.BkprlistbalancesAccountsBalances\x12\x14\n\x07peer_id\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x16\n\twe_opened\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x1b\n\x0e\x61\x63\x63ount_closed\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x1d\n\x10\x61\x63\x63ount_resolved\x18\x06 \x01(\x08H\x03\x88\x01\x01\x12\x1e\n\x11resolved_at_block\x18\x07 \x01(\rH\x04\x88\x01\x01\x42\n\n\x08_peer_idB\x0c\n\n_we_openedB\x11\n\x0f_account_closedB\x13\n\x11_account_resolvedB\x14\n\x12_resolved_at_block\"X\n BkprlistbalancesAccountsBalances\x12!\n\x0c\x62\x61lance_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\tcoin_type\x18\x02 \x01(\t\"\x97\x01\n\x15\x42kprlistincomeRequest\x12\x1d\n\x10\x63onsolidate_fees\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x17\n\nstart_time\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x03 \x01(\rH\x02\x88\x01\x01\x42\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"P\n\x16\x42kprlistincomeResponse\x12\x36\n\rincome_events\x18\x01 \x03(\x0b\x32\x1f.cln.BkprlistincomeIncomeEvents\"\xb4\x02\n\x1a\x42kprlistincomeIncomeEvents\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0b\n\x03tag\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x05 \x01(\t\x12\x11\n\ttimestamp\x18\x06 \x01(\r\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\n \x01(\x0cH\x03\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_outpointB\x07\n\x05_txidB\r\n\x0b_payment_id\"P\n%BkpreditdescriptionbypaymentidRequest\x12\x12\n\npayment_id\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"e\n&BkpreditdescriptionbypaymentidResponse\x12;\n\x07updated\x18\x01 \x03(\x0b\x32*.cln.BkpreditdescriptionbypaymentidUpdated\"\xa3\x05\n%BkpreditdescriptionbypaymentidUpdated\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12g\n\titem_type\x18\x02 \x01(\x0e\x32T.cln.BkpreditdescriptionbypaymentidUpdated.BkpreditdescriptionbypaymentidUpdatedType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x15\n\x08outpoint\x18\t \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\n \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\x0b \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\r \x01(\x0cH\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x06\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x07\x88\x01\x01\"C\n)BkpreditdescriptionbypaymentidUpdatedType\x12\t\n\x05\x43HAIN\x10\x00\x12\x0b\n\x07\x43HANNEL\x10\x01\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_id\"M\n$BkpreditdescriptionbyoutpointRequest\x12\x10\n\x08outpoint\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"c\n%BkpreditdescriptionbyoutpointResponse\x12:\n\x07updated\x18\x01 \x03(\x0b\x32).cln.BkpreditdescriptionbyoutpointUpdated\"\x9f\x05\n$BkpreditdescriptionbyoutpointUpdated\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x65\n\titem_type\x18\x02 \x01(\x0e\x32R.cln.BkpreditdescriptionbyoutpointUpdated.BkpreditdescriptionbyoutpointUpdatedType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x15\n\x08outpoint\x18\t \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\n \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\x0b \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\r \x01(\x0cH\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x06\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x07\x88\x01\x01\"B\n(BkpreditdescriptionbyoutpointUpdatedType\x12\t\n\x05\x43HAIN\x10\x00\x12\x0b\n\x07\x43HANNEL\x10\x01\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_id\"\xb0\x01\n\x11\x42kprreportRequest\x12\x13\n\x06\x66ormat\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07headers\x18\x02 \x03(\t\x12\x13\n\x06\x65scape\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nstart_time\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x05 \x01(\rH\x03\x88\x01\x01\x42\t\n\x07_formatB\t\n\x07_escapeB\r\n\x0b_start_timeB\x0b\n\t_end_time\"$\n\x12\x42kprreportResponse\x12\x0e\n\x06report\x18\x01 \x03(\t\"n\n\x14\x42lacklistruneRequest\x12\x12\n\x05start\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x13\n\x06relist\x18\x03 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_endB\t\n\x07_relist\"G\n\x15\x42lacklistruneResponse\x12.\n\tblacklist\x18\x01 \x03(\x0b\x32\x1b.cln.BlacklistruneBlacklist\"4\n\x16\x42lacklistruneBlacklist\x12\r\n\x05start\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\"p\n\x10\x43heckruneRequest\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x13\n\x06nodeid\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06method\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0e\n\x06params\x18\x04 \x03(\tB\t\n\x07_nodeidB\t\n\x07_method\"\"\n\x11\x43heckruneResponse\x12\r\n\x05valid\x18\x01 \x01(\x08\"E\n\x11\x43reateruneRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0crestrictions\x18\x02 \x03(\tB\x07\n\x05_rune\"{\n\x12\x43reateruneResponse\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12&\n\x19warning_unrestricted_rune\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x1c\n\x1a_warning_unrestricted_rune\".\n\x10ShowrunesRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_rune\"7\n\x11ShowrunesResponse\x12\"\n\x05runes\x18\x01 \x03(\x0b\x32\x13.cln.ShowrunesRunes\"\x9d\x02\n\x0eShowrunesRunes\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x35\n\x0crestrictions\x18\x03 \x03(\x0b\x32\x1f.cln.ShowrunesRunesRestrictions\x12\x1f\n\x17restrictions_as_english\x18\x04 \x01(\t\x12\x13\n\x06stored\x18\x05 \x01(\x08H\x00\x88\x01\x01\x12\x18\n\x0b\x62lacklisted\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tlast_used\x18\x07 \x01(\x01H\x02\x88\x01\x01\x12\x15\n\x08our_rune\x18\x08 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_storedB\x0e\n\x0c_blacklistedB\x0c\n\n_last_usedB\x0b\n\t_our_rune\"p\n\x1aShowrunesRunesRestrictions\x12\x41\n\x0c\x61lternatives\x18\x01 \x03(\x0b\x32+.cln.ShowrunesRunesRestrictionsAlternatives\x12\x0f\n\x07\x65nglish\x18\x02 \x01(\t\"n\n&ShowrunesRunesRestrictionsAlternatives\x12\x11\n\tfieldname\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x11\n\tcondition\x18\x03 \x01(\t\x12\x0f\n\x07\x65nglish\x18\x04 \x01(\t\"r\n\x17\x41skreneunreserveRequest\x12\'\n\x04path\x18\x01 \x03(\x0b\x32\x19.cln.AskreneunreservePath\x12\x1b\n\x0e\x64\x65v_remove_all\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x11\n\x0f_dev_remove_all\"\x1a\n\x18\x41skreneunreserveResponse\"t\n\x14\x41skreneunreservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1c\n\x14short_channel_id_dir\x18\x04 \x01(\t\x12\x12\n\x05layer\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"8\n\x18\x41skrenelistlayersRequest\x12\x12\n\x05layer\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"I\n\x19\x41skrenelistlayersResponse\x12,\n\x06layers\x18\x01 \x03(\x0b\x32\x1c.cln.AskrenelistlayersLayers\"\xaa\x03\n\x17\x41skrenelistlayersLayers\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x16\n\x0e\x64isabled_nodes\x18\x02 \x03(\x0c\x12\x45\n\x10\x63reated_channels\x18\x03 \x03(\x0b\x32+.cln.AskrenelistlayersLayersCreatedChannels\x12<\n\x0b\x63onstraints\x18\x04 \x03(\x0b\x32\'.cln.AskrenelistlayersLayersConstraints\x12\x12\n\npersistent\x18\x05 \x01(\x08\x12\x19\n\x11\x64isabled_channels\x18\x06 \x03(\t\x12\x43\n\x0f\x63hannel_updates\x18\x07 \x03(\x0b\x32*.cln.AskrenelistlayersLayersChannelUpdates\x12\x32\n\x06\x62iases\x18\x08 \x03(\x0b\x32\".cln.AskrenelistlayersLayersBiases\x12;\n\x0bnode_biases\x18\t \x03(\x0b\x32&.cln.AskrenelistlayersLayersNodeBiases\"\x8b\x01\n&AskrenelistlayersLayersCreatedChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\"\n\rcapacity_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\"\xa8\x03\n%AskrenelistlayersLayersChannelUpdates\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x14\n\x07\x65nabled\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12+\n\x11htlc_minimum_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1e\n\x11\x63ltv_expiry_delta\x18\x07 \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_enabledB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x14\n\x12_cltv_expiry_delta\"\xda\x01\n\"AskrenelistlayersLayersConstraints\x12&\n\x0cmaximum_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12&\n\x0cminimum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x1c\n\x14short_channel_id_dir\x18\x05 \x01(\t\x12\x16\n\ttimestamp\x18\x06 \x01(\x04H\x02\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msatB\x0c\n\n_timestamp\"\x9b\x01\n\x1d\x41skrenelistlayersLayersBiases\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x0c\n\x04\x62ias\x18\x02 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x04 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\x91\x01\n!AskrenelistlayersLayersNodeBiases\x12\x0c\n\x04node\x18\x01 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x02 \x01(\x12\x12\x10\n\x08out_bias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x42\x0e\n\x0c_description\"R\n\x19\x41skrenecreatelayerRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x17\n\npersistent\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_persistent\"K\n\x1a\x41skrenecreatelayerResponse\x12-\n\x06layers\x18\x01 \x03(\x0b\x32\x1d.cln.AskrenecreatelayerLayers\"\xb0\x03\n\x18\x41skrenecreatelayerLayers\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x12\n\npersistent\x18\x02 \x01(\x08\x12\x16\n\x0e\x64isabled_nodes\x18\x03 \x03(\x0c\x12\x19\n\x11\x64isabled_channels\x18\x04 \x03(\t\x12\x46\n\x10\x63reated_channels\x18\x05 \x03(\x0b\x32,.cln.AskrenecreatelayerLayersCreatedChannels\x12\x44\n\x0f\x63hannel_updates\x18\x06 \x03(\x0b\x32+.cln.AskrenecreatelayerLayersChannelUpdates\x12=\n\x0b\x63onstraints\x18\x07 \x03(\x0b\x32(.cln.AskrenecreatelayerLayersConstraints\x12\x33\n\x06\x62iases\x18\x08 \x03(\x0b\x32#.cln.AskrenecreatelayerLayersBiases\x12<\n\x0bnode_biases\x18\t \x03(\x0b\x32\'.cln.AskrenecreatelayerLayersNodeBiases\"\x8c\x01\n\'AskrenecreatelayerLayersCreatedChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\"\n\rcapacity_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\"\xd1\x02\n&AskrenecreatelayerLayersChannelUpdates\x12+\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x12\n\x05\x64\x65lay\x18\x05 \x01(\rH\x04\x88\x01\x01\x42\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x08\n\x06_delay\"\xc4\x01\n#AskrenecreatelayerLayersConstraints\x12\x18\n\x10short_channel_id\x18\x01 \x01(\t\x12\x11\n\tdirection\x18\x02 \x01(\r\x12&\n\x0cmaximum_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12&\n\x0cminimum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msat\"\x9c\x01\n\x1e\x41skrenecreatelayerLayersBiases\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x0c\n\x04\x62ias\x18\x02 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x04 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\x92\x01\n\"AskrenecreatelayerLayersNodeBiases\x12\x0c\n\x04node\x18\x01 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x02 \x01(\x12\x12\x10\n\x08out_bias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x42\x0e\n\x0c_description\"*\n\x19\x41skreneremovelayerRequest\x12\r\n\x05layer\x18\x01 \x01(\t\"\x1c\n\x1a\x41skreneremovelayerResponse\">\n\x15\x41skrenereserveRequest\x12%\n\x04path\x18\x01 \x03(\x0b\x32\x17.cln.AskrenereservePath\"\x18\n\x16\x41skrenereserveResponse\"r\n\x12\x41skrenereservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1c\n\x14short_channel_id_dir\x18\x04 \x01(\t\x12\x12\n\x05layer\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"2\n\x11\x41skreneageRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0e\n\x06\x63utoff\x18\x02 \x01(\x04\"8\n\x12\x41skreneageResponse\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x13\n\x0bnum_removed\x18\x02 \x01(\x04\"\xe7\x01\n\x10GetroutesRequest\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12 \n\x0bmaxfee_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\nfinal_cltv\x18\x07 \x01(\r\x12\x15\n\x08maxdelay\x18\x08 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08maxparts\x18\t \x01(\rH\x01\x88\x01\x01\x42\x0b\n\t_maxdelayB\x0b\n\t_maxparts\"R\n\x11GetroutesResponse\x12\x17\n\x0fprobability_ppm\x18\x01 \x01(\x04\x12$\n\x06routes\x18\x02 \x03(\x0b\x32\x14.cln.GetroutesRoutes\"\x88\x01\n\x0fGetroutesRoutes\x12\x17\n\x0fprobability_ppm\x18\x01 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x04path\x18\x03 \x03(\x0b\x32\x18.cln.GetroutesRoutesPath\x12\x12\n\nfinal_cltv\x18\x04 \x01(\r\"z\n\x13GetroutesRoutesPath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0cnext_node_id\x18\x04 \x01(\x0c\x12\r\n\x05\x64\x65lay\x18\x05 \x01(\r\x12\x1c\n\x14short_channel_id_dir\x18\x06 \x01(\t\"8\n\x19\x41skrenedisablenodeRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\"\x1c\n\x1a\x41skrenedisablenodeResponse\"\x8a\x02\n\x1b\x41skreneinformchannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x06 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12K\n\x06inform\x18\x08 \x01(\x0e\x32;.cln.AskreneinformchannelRequest.AskreneinformchannelInform\"O\n\x1a\x41skreneinformchannelInform\x12\x0f\n\x0b\x43ONSTRAINED\x10\x00\x12\x11\n\rUNCONSTRAINED\x10\x01\x12\r\n\tSUCCEEDED\x10\x02\"Y\n\x1c\x41skreneinformchannelResponse\x12\x39\n\x0b\x63onstraints\x18\x02 \x03(\x0b\x32$.cln.AskreneinformchannelConstraints\"\xd3\x01\n\x1f\x41skreneinformchannelConstraints\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\r\n\x05layer\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\x04\x12&\n\x0cmaximum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12&\n\x0cminimum_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msat\"\x8f\x01\n\x1b\x41skrenecreatechannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x03 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x04 \x01(\t\x12\"\n\rcapacity_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"\x1e\n\x1c\x41skrenecreatechannelResponse\"\xad\x03\n\x1b\x41skreneupdatechannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x14\n\x07\x65nabled\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12+\n\x11htlc_minimum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x1e\n\x11\x63ltv_expiry_delta\x18\x08 \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_enabledB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x14\n\x12_cltv_expiry_delta\"\x1e\n\x1c\x41skreneupdatechannelResponse\"\xa4\x01\n\x19\x41skrenebiaschannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x0c\n\x04\x62ias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08relative\x18\x05 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_relative\"K\n\x1a\x41skrenebiaschannelResponse\x12-\n\x06\x62iases\x18\x01 \x03(\x0b\x32\x1d.cln.AskrenebiaschannelBiases\"\xa5\x01\n\x18\x41skrenebiaschannelBiases\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x0c\n\x04\x62ias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x05 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\xa4\x01\n\x16\x41skrenebiasnodeRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x11\n\tdirection\x18\x03 \x01(\t\x12\x0c\n\x04\x62ias\x18\x04 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08relative\x18\x06 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_relative\"N\n\x17\x41skrenebiasnodeResponse\x12\x33\n\x0bnode_biases\x18\x01 \x03(\x0b\x32\x1e.cln.AskrenebiasnodeNodeBiases\"\x98\x01\n\x19\x41skrenebiasnodeNodeBiases\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x03 \x01(\x12\x12\x10\n\x08out_bias\x18\x04 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x06 \x01(\x04\x42\x0e\n\x0c_description\" \n\x1e\x41skrenelistreservationsRequest\"a\n\x1f\x41skrenelistreservationsResponse\x12>\n\x0creservations\x18\x01 \x03(\x0b\x32(.cln.AskrenelistreservationsReservations\"\x91\x01\n#AskrenelistreservationsReservations\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x16\n\x0e\x61ge_in_seconds\x18\x03 \x01(\x04\x12\x12\n\ncommand_id\x18\x04 \x01(\t\"\xcb\x02\n\x19InjectpaymentonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x63ltv_expiry\x18\x04 \x01(\r\x12\x0e\n\x06partid\x18\x05 \x01(\x04\x12\x0f\n\x07groupid\x18\x06 \x01(\x04\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12*\n\x10\x64\x65stination_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x10\n\x0e_localinvreqidB\x13\n\x11_destination_msat\"w\n\x1aInjectpaymentonionResponse\x12\x12\n\ncreated_at\x18\x01 \x01(\x04\x12\x14\n\x0c\x63ompleted_at\x18\x02 \x01(\x04\x12\x15\n\rcreated_index\x18\x03 \x01(\x04\x12\x18\n\x10payment_preimage\x18\x04 \x01(\x0c\">\n\x19InjectonionmessageRequest\x12\x10\n\x08path_key\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x1c\n\x1aInjectonionmessageResponse\"\xbf\x02\n\x0bXpayRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12&\n\x0cpartial_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x17\n\npayer_note\x18\x08 \x01(\tH\x05\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0f\n\r_partial_msatB\x0b\n\t_maxdelayB\r\n\x0b_payer_note\"\xa1\x01\n\x0cXpayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x14\n\x0c\x66\x61iled_parts\x18\x02 \x01(\x04\x12\x18\n\x10successful_parts\x18\x03 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"=\n\x19SignmessagewithkeyRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"`\n\x1aSignmessagewithkeyResponse\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\x0e\n\x06\x62\x61se64\x18\x04 \x01(\t\"\xcd\x01\n\x17ListchannelmovesRequest\x12\x46\n\x05index\x18\x01 \x01(\x0e\x32\x32.cln.ListchannelmovesRequest.ListchannelmovesIndexH\x00\x88\x01\x01\x12\x12\n\x05start\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\"$\n\x15ListchannelmovesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"S\n\x18ListchannelmovesResponse\x12\x37\n\x0c\x63hannelmoves\x18\x01 \x03(\x0b\x32!.cln.ListchannelmovesChannelmoves\"\xa9\x04\n\x1cListchannelmovesChannelmoves\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x12\n\naccount_id\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12]\n\x0bprimary_tag\x18\x06 \x01(\x0e\x32H.cln.ListchannelmovesChannelmoves.ListchannelmovesChannelmovesPrimaryTag\x12\x19\n\x0cpayment_hash\x18\x07 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x07part_id\x18\x08 \x01(\x04H\x01\x88\x01\x01\x12\x15\n\x08group_id\x18\t \x01(\x04H\x02\x88\x01\x01\x12\x1e\n\tfees_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\"\x96\x01\n&ListchannelmovesChannelmovesPrimaryTag\x12\x0b\n\x07INVOICE\x10\x00\x12\n\n\x06ROUTED\x10\x01\x12\n\n\x06PUSHED\x10\x02\x12\r\n\tLEASE_FEE\x10\x03\x12\x14\n\x10\x43HANNEL_PROPOSED\x10\x04\x12\x0f\n\x0bPENALTY_ADJ\x10\x05\x12\x11\n\rJOURNAL_ENTRY\x10\x06\x42\x0f\n\r_payment_hashB\n\n\x08_part_idB\x0b\n\t_group_id\"\xc5\x01\n\x15ListchainmovesRequest\x12\x42\n\x05index\x18\x01 \x01(\x0e\x32..cln.ListchainmovesRequest.ListchainmovesIndexH\x00\x88\x01\x01\x12\x12\n\x05start\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\"\"\n\x13ListchainmovesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"K\n\x16ListchainmovesResponse\x12\x31\n\nchainmoves\x18\x01 \x03(\x0b\x32\x1d.cln.ListchainmovesChainmoves\"\xd4\x06\n\x18ListchainmovesChainmoves\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x12\n\naccount_id\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12U\n\x0bprimary_tag\x18\x06 \x01(\x0e\x32@.cln.ListchainmovesChainmoves.ListchainmovesChainmovesPrimaryTag\x12\x14\n\x07peer_id\x18\x08 \x01(\x0cH\x00\x88\x01\x01\x12 \n\x13originating_account\x18\t \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rspending_txid\x18\n \x01(\x0cH\x02\x88\x01\x01\x12\x1b\n\x04utxo\x18\x0b \x01(\x0b\x32\r.cln.Outpoint\x12\x19\n\x0cpayment_hash\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12 \n\x0boutput_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x0coutput_count\x18\x0e \x01(\rH\x04\x88\x01\x01\x12\x13\n\x0b\x62lockheight\x18\x0f \x01(\r\x12\x12\n\nextra_tags\x18\x10 \x03(\t\"\x95\x02\n\"ListchainmovesChainmovesPrimaryTag\x12\x0b\n\x07\x44\x45POSIT\x10\x00\x12\x0e\n\nWITHDRAWAL\x10\x01\x12\x0b\n\x07PENALTY\x10\x02\x12\x10\n\x0c\x43HANNEL_OPEN\x10\x03\x12\x11\n\rCHANNEL_CLOSE\x10\x04\x12\x11\n\rDELAYED_TO_US\x10\x05\x12\x0b\n\x07HTLC_TX\x10\x06\x12\x10\n\x0cHTLC_TIMEOUT\x10\x07\x12\x10\n\x0cHTLC_FULFILL\x10\x08\x12\r\n\tTO_WALLET\x10\t\x12\n\n\x06\x41NCHOR\x10\n\x12\x0b\n\x07TO_THEM\x10\x0b\x12\r\n\tPENALIZED\x10\x0c\x12\n\n\x06STOLEN\x10\r\x12\x0b\n\x07IGNORED\x10\x0e\x12\x0c\n\x08TO_MINER\x10\x0f\x42\n\n\x08_peer_idB\x16\n\x14_originating_accountB\x10\n\x0e_spending_txidB\x0f\n\r_payment_hashB\x0f\n\r_output_count\"\xe9\x01\n\x18ListnetworkeventsRequest\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12H\n\x05index\x18\x02 \x01(\x0e\x32\x34.cln.ListnetworkeventsRequest.ListnetworkeventsIndexH\x01\x88\x01\x01\x12\x12\n\x05start\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12\x12\n\x05limit\x18\x04 \x01(\rH\x03\x88\x01\x01\"%\n\x16ListnetworkeventsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x05\n\x03_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"W\n\x19ListnetworkeventsResponse\x12:\n\rnetworkevents\x18\x01 \x03(\x0b\x32#.cln.ListnetworkeventsNetworkevents\"\xf2\x01\n\x1eListnetworkeventsNetworkevents\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x0f\n\x07peer_id\x18\x03 \x01(\x0c\x12\x11\n\titem_type\x18\x04 \x01(\t\x12\x13\n\x06reason\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rduration_nsec\x18\x06 \x01(\x04H\x01\x88\x01\x01\x12\x1e\n\x11\x63onnect_attempted\x18\x07 \x01(\x08H\x02\x88\x01\x01\x42\t\n\x07_reasonB\x10\n\x0e_duration_nsecB\x14\n\x12_connect_attempted\"/\n\x16\x44\x65lnetworkeventRequest\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\"\x19\n\x17\x44\x65lnetworkeventResponse\"\xf6\x01\n\x1a\x43lnrestregisterpathRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x12\n\nrpc_method\x18\x02 \x01(\t\x12H\n\x11rune_restrictions\x18\x03 \x01(\x0b\x32(.cln.ClnrestregisterpathRuneRestrictionsH\x00\x88\x01\x01\x12\x1a\n\rrune_required\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x0bhttp_method\x18\x05 \x01(\tH\x02\x88\x01\x01\x42\x14\n\x12_rune_restrictionsB\x10\n\x0e_rune_requiredB\x0e\n\x0c_http_method\"\x1d\n\x1b\x43lnrestregisterpathResponse\"\xda\x01\n#ClnrestregisterpathRuneRestrictions\x12\x13\n\x06nodeid\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06method\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x44\n\x06params\x18\x03 \x03(\x0b\x32\x34.cln.ClnrestregisterpathRuneRestrictions.ParamsEntry\x1a-\n\x0bParamsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07_nodeidB\t\n\x07_method\",\n\x18ListcurrencyratesRequest\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\"W\n\x19ListcurrencyratesResponse\x12:\n\rcurrencyrates\x18\x01 \x03(\x0b\x32#.cln.ListcurrencyratesCurrencyrates\"@\n\x1eListcurrencyratesCurrencyrates\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x01\":\n\x16\x43urrencyconvertRequest\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x01\x12\x10\n\x08\x63urrency\x18\x02 \x01(\t\"4\n\x17\x43urrencyconvertResponse\x12\x19\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\"\'\n\x13\x43urrencyrateRequest\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\"$\n\x14\x43urrencyrateResponse\x12\x0c\n\x04rate\x18\x01 \x01(\x01\"\x1e\n\x1cStreamBalanceSnapshotRequest\"\x86\x01\n\x1b\x42\x61lanceSnapshotNotification\x12\x0f\n\x07node_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x62lockheight\x18\x02 \x01(\r\x12\x11\n\ttimestamp\x18\x03 \x01(\r\x12.\n\x08\x61\x63\x63ounts\x18\x04 \x03(\x0b\x32\x1c.cln.BalanceSnapshotAccounts\"c\n\x17\x42\x61lanceSnapshotAccounts\x12\x12\n\naccount_id\x18\x01 \x01(\t\x12!\n\x0c\x62\x61lance_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\tcoin_type\x18\x03 \x01(\t\"\x19\n\x17StreamBlockAddedRequest\"6\n\x16\x42lockAddedNotification\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\x0e\n\x06height\x18\x02 \x01(\r\" \n\x1eStreamChannelOpenFailedRequest\"3\n\x1d\x43hannelOpenFailedNotification\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"\x1c\n\x1aStreamChannelOpenedRequest\"w\n\x19\x43hannelOpenedNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12!\n\x0c\x66unding_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\x12\x15\n\rchannel_ready\x18\x04 \x01(\x08\"\"\n StreamChannelStateChangedRequest\"\xc1\x03\n\x1f\x43hannelStateChangedNotification\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x04 \x01(\t\x12)\n\told_state\x18\x05 \x01(\x0e\x32\x11.cln.ChannelStateH\x01\x88\x01\x01\x12$\n\tnew_state\x18\x06 \x01(\x0e\x32\x11.cln.ChannelState\x12L\n\x05\x63\x61use\x18\x07 \x01(\x0e\x32=.cln.ChannelStateChangedNotification.ChannelStateChangedCause\x12\x14\n\x07message\x18\x08 \x01(\tH\x02\x88\x01\x01\"c\n\x18\x43hannelStateChangedCause\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05LOCAL\x10\x01\x12\x08\n\x04USER\x10\x02\x12\n\n\x06REMOTE\x10\x03\x12\x0c\n\x08PROTOCOL\x10\x04\x12\x0b\n\x07ONCHAIN\x10\x05\x42\x13\n\x11_short_channel_idB\x0c\n\n_old_stateB\n\n\x08_message\"\x16\n\x14StreamConnectRequest\"\xbe\x01\n\x17PeerConnectNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x44\n\tdirection\x18\x02 \x01(\x0e\x32\x31.cln.PeerConnectNotification.PeerConnectDirection\x12(\n\x07\x61\x64\x64ress\x18\x03 \x01(\x0b\x32\x17.cln.PeerConnectAddress\"\'\n\x14PeerConnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\x9a\x02\n\x12PeerConnectAddress\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.PeerConnectAddress.PeerConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"c\n\x16PeerConnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x12\r\n\tWEBSOCKET\x10\x05\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"\x1b\n\x19StreamCoinMovementRequest\"\x9f\x0b\n\x18\x43oinMovementNotification\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\tcoin_type\x18\x02 \x01(\t\x12\x0f\n\x07node_id\x18\x03 \x01(\x0c\x12\x41\n\titem_type\x18\x04 \x01(\x0e\x32..cln.CoinMovementNotification.CoinMovementType\x12\x1a\n\rcreated_index\x18\x05 \x01(\x04H\x00\x88\x01\x01\x12\x12\n\naccount_id\x18\x06 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\t \x01(\x04\x12\x0c\n\x04tags\x18\n \x03(\t\x12N\n\x0bprimary_tag\x18\x0b \x01(\x0e\x32\x34.cln.CoinMovementNotification.CoinMovementPrimaryTagH\x01\x88\x01\x01\x12\x12\n\nextra_tags\x18\x0c \x03(\t\x12\x19\n\x0cpayment_hash\x18\r \x01(\x0cH\x02\x88\x01\x01\x12\x14\n\x07part_id\x18\x0e \x01(\x04H\x03\x88\x01\x01\x12\x15\n\x08group_id\x18\x0f \x01(\x04H\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x10 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12 \n\x04utxo\x18\x11 \x01(\x0b\x32\r.cln.OutpointH\x06\x88\x01\x01\x12\x14\n\x07peer_id\x18\x12 \x01(\x0cH\x07\x88\x01\x01\x12 \n\x13originating_account\x18\x13 \x01(\tH\x08\x88\x01\x01\x12\x11\n\x04txid\x18\x14 \x01(\x0cH\t\x88\x01\x01\x12\x1a\n\rspending_txid\x18\x15 \x01(\x0cH\n\x88\x01\x01\x12\x16\n\tutxo_txid\x18\x16 \x01(\x0cH\x0b\x88\x01\x01\x12\x11\n\x04vout\x18\x17 \x01(\rH\x0c\x88\x01\x01\x12%\n\x0boutput_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\r\x88\x01\x01\x12\x19\n\x0coutput_count\x18\x19 \x01(\rH\x0e\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\x1a \x01(\rH\x0f\x88\x01\x01\"2\n\x10\x43oinMovementType\x12\x0f\n\x0b\x43HANNEL_MVT\x10\x00\x12\r\n\tCHAIN_MVT\x10\x01\"\xf7\x02\n\x16\x43oinMovementPrimaryTag\x12\x0b\n\x07\x44\x45POSIT\x10\x00\x12\x0e\n\nWITHDRAWAL\x10\x01\x12\x0b\n\x07PENALTY\x10\x02\x12\x10\n\x0c\x43HANNEL_OPEN\x10\x03\x12\x11\n\rCHANNEL_CLOSE\x10\x04\x12\x11\n\rDELAYED_TO_US\x10\x05\x12\x0b\n\x07HTLC_TX\x10\x06\x12\x10\n\x0cHTLC_TIMEOUT\x10\x07\x12\x10\n\x0cHTLC_FULFILL\x10\x08\x12\r\n\tTO_WALLET\x10\t\x12\n\n\x06\x41NCHOR\x10\n\x12\x0b\n\x07TO_THEM\x10\x0b\x12\r\n\tPENALIZED\x10\x0c\x12\n\n\x06STOLEN\x10\r\x12\x0b\n\x07IGNORED\x10\x0e\x12\x0c\n\x08TO_MINER\x10\x0f\x12\x0b\n\x07INVOICE\x10\x10\x12\n\n\x06ROUTED\x10\x11\x12\n\n\x06PUSHED\x10\x12\x12\r\n\tLEASE_FEE\x10\x13\x12\x14\n\x10\x43HANNEL_PROPOSED\x10\x14\x12\x0f\n\x0bPENALTY_ADJ\x10\x15\x12\x11\n\rJOURNAL_ENTRY\x10\x16\x42\x10\n\x0e_created_indexB\x0e\n\x0c_primary_tagB\x0f\n\r_payment_hashB\n\n\x08_part_idB\x0b\n\t_group_idB\x0c\n\n_fees_msatB\x07\n\x05_utxoB\n\n\x08_peer_idB\x16\n\x14_originating_accountB\x07\n\x05_txidB\x10\n\x0e_spending_txidB\x0c\n\n_utxo_txidB\x07\n\x05_voutB\x0e\n\x0c_output_msatB\x0f\n\r_output_countB\x0e\n\x0c_blockheight\"\x18\n\x16StreamCustomMsgRequest\"9\n\x15\x43ustomMsgNotification\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\" \n\x1eStreamDeprecatedOneshotRequest\"6\n\x1d\x44\x65precatedOneshotNotification\x12\x15\n\rdeprecated_ok\x18\x01 \x01(\x08\"\x19\n\x17StreamDisconnectRequest\"$\n\x16\x44isconnectNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\"\x1b\n\x19StreamForwardEventRequest\"\x88\x05\n\x18\x46orwardEventNotification\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x12\n\nin_channel\x18\x02 \x01(\t\x12\x18\n\x0bout_channel\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x07in_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\x08out_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12@\n\x06status\x18\x07 \x01(\x0e\x32\x30.cln.ForwardEventNotification.ForwardEventStatus\x12\x15\n\x08\x66\x61ilcode\x18\x08 \x01(\rH\x03\x88\x01\x01\x12\x17\n\nfailreason\x18\t \x01(\tH\x04\x88\x01\x01\x12\x43\n\x05style\x18\n \x01(\x0e\x32/.cln.ForwardEventNotification.ForwardEventStyleH\x05\x88\x01\x01\x12\x15\n\rreceived_time\x18\x0b \x01(\x01\x12\x1a\n\rresolved_time\x18\x0c \x01(\x01H\x06\x88\x01\x01\"L\n\x12\x46orwardEventStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"(\n\x11\x46orwardEventStyle\x12\n\n\x06LEGACY\x10\x00\x12\x07\n\x03TLV\x10\x01\x42\x0e\n\x0c_out_channelB\x0b\n\t_out_msatB\x0b\n\t_fee_msatB\x0b\n\t_failcodeB\r\n\x0b_failreasonB\x08\n\x06_styleB\x10\n\x0e_resolved_time\"\x1e\n\x1cStreamInvoiceCreationRequest\"g\n\x1bInvoiceCreationNotification\x12\x1e\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08preimage\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\tB\x07\n\x05_msat\"\x1d\n\x1bStreamInvoicePaymentRequest\"\x8b\x01\n\x1aInvoicePaymentNotification\x12\x19\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08preimage\x18\x02 \x01(\x0c\x12$\n\x08outpoint\x18\x03 \x01(\x0b\x32\r.cln.OutpointH\x00\x88\x01\x01\x12\r\n\x05label\x18\x04 \x01(\tB\x0b\n\t_outpoint\"\x12\n\x10StreamLogRequest\"\xca\x01\n\x0fLogNotification\x12,\n\x05level\x18\x01 \x01(\x0e\x32\x1d.cln.LogNotification.LogLevel\x12\x0c\n\x04time\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\t\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x0b\n\x03log\x18\x05 \x01(\t\"K\n\x08LogLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05TRACE\x10\x01\x12\t\n\x05\x44\x45\x42UG\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\x0b\n\x07UNUSUAL\x10\x04\x12\n\n\x06\x42ROKEN\x10\x05\"&\n$StreamOnionMessageForwardFailRequest\"\xef\x01\n#OnionMessageForwardFailNotification\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x10\n\x08incoming\x18\x02 \x01(\x0c\x12\x10\n\x08path_key\x18\x03 \x01(\x0c\x12\x15\n\x08outgoing\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x12\x19\n\x0cnext_node_id\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12&\n\x19next_short_channel_id_dir\x18\x06 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_outgoingB\x0f\n\r_next_node_idB\x1c\n\x1a_next_short_channel_id_dir\"\"\n StreamOpenChannelPeerSigsRequest\"J\n\x1fOpenChannelPeerSigsNotification\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_psbt\x18\x02 \x01(\t\"\x1c\n\x1aStreamPluginStartedRequest\"V\n\x19PluginStartedNotification\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\x12\x13\n\x0bplugin_path\x18\x02 \x01(\t\x12\x0f\n\x07methods\x18\x03 \x03(\t\"\x1c\n\x1aStreamPluginStoppedRequest\"V\n\x19PluginStoppedNotification\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\x12\x13\n\x0bplugin_path\x18\x02 \x01(\t\x12\x0f\n\x07methods\x18\x03 \x03(\t\"\x1d\n\x1bStreamSendPayFailureRequest\"b\n\x1aSendPayFailureNotification\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x12\x12\x0f\n\x07message\x18\x02 \x01(\t\x12%\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x17.cln.SendpayFailureData\"\xc1\t\n\x12SendpayFailureData\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x03\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x06\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x12*\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x17\n\ncreated_at\x18\n \x01(\x04H\t\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\n\x88\x01\x01\x12\x45\n\x06status\x18\x0c \x01(\x0e\x32\x30.cln.SendpayFailureData.SendpayFailureDataStatusH\x0b\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x0c\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\r\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x0e\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\x0f\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x11 \x01(\tH\x10\x88\x01\x01\x12\x17\n\nerroronion\x18\x12 \x01(\x0cH\x11\x88\x01\x01\x12\x17\n\nonionreply\x18\x13 \x01(\x0cH\x12\x88\x01\x01\x12\x19\n\x0c\x65rring_index\x18\x14 \x01(\rH\x13\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x15 \x01(\rH\x14\x88\x01\x01\x12\x19\n\x0c\x66\x61ilcodename\x18\x16 \x01(\tH\x15\x88\x01\x01\x12\x18\n\x0b\x65rring_node\x18\x17 \x01(\x0cH\x16\x88\x01\x01\x12\x1b\n\x0e\x65rring_channel\x18\x18 \x01(\tH\x17\x88\x01\x01\x12\x1d\n\x10\x65rring_direction\x18\x19 \x01(\rH\x18\x88\x01\x01\x12\x18\n\x0braw_message\x18\x1a \x01(\x0cH\x19\x88\x01\x01\"A\n\x18SendpayFailureDataStatus\x12\n\n\x06\x46\x41ILED\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x10\n\x0e_created_indexB\x05\n\x03_idB\x0f\n\r_payment_hashB\n\n\x08_groupidB\x10\n\x0e_updated_indexB\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x13\n\x11_amount_sent_msatB\r\n\x0b_created_atB\x0f\n\r_completed_atB\t\n\x07_statusB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_descriptionB\r\n\x0b_erroronionB\r\n\x0b_onionreplyB\x0f\n\r_erring_indexB\x0b\n\t_failcodeB\x0f\n\r_failcodenameB\x0e\n\x0c_erring_nodeB\x11\n\x0f_erring_channelB\x13\n\x11_erring_directionB\x0e\n\x0c_raw_message\"\x1d\n\x1bStreamSendPaySuccessRequest\"\xcc\x05\n\x1aSendPaySuccessNotification\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x0f\n\x07groupid\x18\x04 \x01(\x04\x12\x1a\n\rupdated_index\x18\x05 \x01(\x04H\x00\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x02\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12%\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\ncreated_at\x18\n \x01(\x04\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12\x44\n\x06status\x18\x0c \x01(\x0e\x32\x34.cln.SendPaySuccessNotification.SendpaySuccessStatus\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x05\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\x08\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x11 \x01(\tH\t\x88\x01\x01\x12\x17\n\nerroronion\x18\x12 \x01(\x0cH\n\x88\x01\x01\"$\n\x14SendpaySuccessStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\x10\n\x0e_updated_indexB\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x0f\n\r_completed_atB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_descriptionB\r\n\x0b_erroronion\"\x17\n\x15StreamShutdownRequest\"\x16\n\x14ShutdownNotification\"\x16\n\x14StreamWarningRequest\"\xae\x01\n\x13WarningNotification\x12\x34\n\x05level\x18\x01 \x01(\x0e\x32%.cln.WarningNotification.WarningLevel\x12\x0c\n\x04time\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\t\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x0b\n\x03log\x18\x05 \x01(\t\"#\n\x0cWarningLevel\x12\x08\n\x04WARN\x10\x00\x12\t\n\x05\x45RROR\x10\x01\"\x19\n\x17StreamPayPartEndRequest\"\xf1\x03\n\x16PayPartEndNotification\x12<\n\x06status\x18\x01 \x01(\x0e\x32,.cln.PayPartEndNotification.PayPartEndStatus\x12\x10\n\x08\x64uration\x18\x02 \x01(\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x0f\n\x07groupid\x18\x04 \x01(\x04\x12\x0e\n\x06partid\x18\x05 \x01(\x04\x12\x17\n\nfailed_msg\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x61iled_node_id\x18\x07 \x01(\x0cH\x01\x88\x01\x01\x12$\n\x17\x66\x61iled_short_channel_id\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10\x66\x61iled_direction\x18\t \x01(\rH\x03\x88\x01\x01\x12\x17\n\nerror_code\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rerror_message\x18\x0b \x01(\tH\x05\x88\x01\x01\",\n\x10PayPartEndStatus\x12\x0b\n\x07SUCCESS\x10\x00\x12\x0b\n\x07\x46\x41ILURE\x10\x01\x42\r\n\x0b_failed_msgB\x11\n\x0f_failed_node_idB\x1a\n\x18_failed_short_channel_idB\x13\n\x11_failed_directionB\r\n\x0b_error_codeB\x10\n\x0e_error_message\"\x1b\n\x19StreamPayPartStartRequest\"\xc2\x01\n\x18PayPartStartNotification\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x0e\n\x06partid\x18\x03 \x01(\x04\x12\'\n\x12total_payment_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x0c\x61ttempt_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x04hops\x18\x06 \x03(\x0b\x32\x15.cln.PayPartStartHops\"\x9f\x01\n\x10PayPartStartHops\x12\x11\n\tnext_node\x18\x01 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x02 \x01(\t\x12\x11\n\tdirection\x18\x03 \x01(\r\x12$\n\x0f\x63hannel_in_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x63hannel_out_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount2\xce\x65\n\x04Node\x12\x36\n\x07Getinfo\x12\x13.cln.GetinfoRequest\x1a\x14.cln.GetinfoResponse\"\x00\x12<\n\tListPeers\x12\x15.cln.ListpeersRequest\x1a\x16.cln.ListpeersResponse\"\x00\x12<\n\tListFunds\x12\x15.cln.ListfundsRequest\x1a\x16.cln.ListfundsResponse\"\x00\x12\x36\n\x07SendPay\x12\x13.cln.SendpayRequest\x1a\x14.cln.SendpayResponse\"\x00\x12\x45\n\x0cListChannels\x12\x18.cln.ListchannelsRequest\x1a\x19.cln.ListchannelsResponse\"\x00\x12<\n\tAddGossip\x12\x15.cln.AddgossipRequest\x1a\x16.cln.AddgossipResponse\"\x00\x12H\n\rAddPsbtOutput\x12\x19.cln.AddpsbtoutputRequest\x1a\x1a.cln.AddpsbtoutputResponse\"\x00\x12H\n\rAutoCleanOnce\x12\x19.cln.AutocleanonceRequest\x1a\x1a.cln.AutocleanonceResponse\"\x00\x12N\n\x0f\x41utoCleanStatus\x12\x1b.cln.AutocleanstatusRequest\x1a\x1c.cln.AutocleanstatusResponse\"\x00\x12\x45\n\x0c\x43heckMessage\x12\x18.cln.CheckmessageRequest\x1a\x19.cln.CheckmessageResponse\"\x00\x12\x30\n\x05\x43lose\x12\x11.cln.CloseRequest\x1a\x12.cln.CloseResponse\"\x00\x12:\n\x0b\x43onnectPeer\x12\x13.cln.ConnectRequest\x1a\x14.cln.ConnectResponse\"\x00\x12H\n\rCreateInvoice\x12\x19.cln.CreateinvoiceRequest\x1a\x1a.cln.CreateinvoiceResponse\"\x00\x12<\n\tDatastore\x12\x15.cln.DatastoreRequest\x1a\x16.cln.DatastoreResponse\"\x00\x12K\n\x0e\x44\x61tastoreUsage\x12\x1a.cln.DatastoreusageRequest\x1a\x1b.cln.DatastoreusageResponse\"\x00\x12\x42\n\x0b\x43reateOnion\x12\x17.cln.CreateonionRequest\x1a\x18.cln.CreateonionResponse\"\x00\x12\x45\n\x0c\x44\x65lDatastore\x12\x18.cln.DeldatastoreRequest\x1a\x19.cln.DeldatastoreResponse\"\x00\x12?\n\nDelInvoice\x12\x16.cln.DelinvoiceRequest\x1a\x17.cln.DelinvoiceResponse\"\x00\x12Q\n\x10\x44\x65vForgetChannel\x12\x1c.cln.DevforgetchannelRequest\x1a\x1d.cln.DevforgetchannelResponse\"\x00\x12Q\n\x10\x45mergencyRecover\x12\x1c.cln.EmergencyrecoverRequest\x1a\x1d.cln.EmergencyrecoverResponse\"\x00\x12\x66\n\x17GetEmergencyRecoverData\x12#.cln.GetemergencyrecoverdataRequest\x1a$.cln.GetemergencyrecoverdataResponse\"\x00\x12\x45\n\x0c\x45xposeSecret\x12\x18.cln.ExposesecretRequest\x1a\x19.cln.ExposesecretResponse\"\x00\x12\x36\n\x07Recover\x12\x13.cln.RecoverRequest\x1a\x14.cln.RecoverResponse\"\x00\x12K\n\x0eRecoverChannel\x12\x1a.cln.RecoverchannelRequest\x1a\x1b.cln.RecoverchannelResponse\"\x00\x12\x36\n\x07Invoice\x12\x13.cln.InvoiceRequest\x1a\x14.cln.InvoiceResponse\"\x00\x12Q\n\x14\x43reateInvoiceRequest\x12\x1a.cln.InvoicerequestRequest\x1a\x1b.cln.InvoicerequestResponse\"\x00\x12`\n\x15\x44isableInvoiceRequest\x12!.cln.DisableinvoicerequestRequest\x1a\".cln.DisableinvoicerequestResponse\"\x00\x12Z\n\x13ListInvoiceRequests\x12\x1f.cln.ListinvoicerequestsRequest\x1a .cln.ListinvoicerequestsResponse\"\x00\x12H\n\rListDatastore\x12\x19.cln.ListdatastoreRequest\x1a\x1a.cln.ListdatastoreResponse\"\x00\x12\x45\n\x0cListInvoices\x12\x18.cln.ListinvoicesRequest\x1a\x19.cln.ListinvoicesResponse\"\x00\x12<\n\tSendOnion\x12\x15.cln.SendonionRequest\x1a\x16.cln.SendonionResponse\"\x00\x12\x45\n\x0cListSendPays\x12\x18.cln.ListsendpaysRequest\x1a\x19.cln.ListsendpaysResponse\"\x00\x12Q\n\x10ListTransactions\x12\x1c.cln.ListtransactionsRequest\x1a\x1d.cln.ListtransactionsResponse\"\x00\x12?\n\nMakeSecret\x12\x16.cln.MakesecretRequest\x1a\x17.cln.MakesecretResponse\"\x00\x12*\n\x03Pay\x12\x0f.cln.PayRequest\x1a\x10.cln.PayResponse\"\x00\x12<\n\tListNodes\x12\x15.cln.ListnodesRequest\x1a\x16.cln.ListnodesResponse\"\x00\x12K\n\x0eWaitAnyInvoice\x12\x1a.cln.WaitanyinvoiceRequest\x1a\x1b.cln.WaitanyinvoiceResponse\"\x00\x12\x42\n\x0bWaitInvoice\x12\x17.cln.WaitinvoiceRequest\x1a\x18.cln.WaitinvoiceResponse\"\x00\x12\x42\n\x0bWaitSendPay\x12\x17.cln.WaitsendpayRequest\x1a\x18.cln.WaitsendpayResponse\"\x00\x12\x36\n\x07NewAddr\x12\x13.cln.NewaddrRequest\x1a\x14.cln.NewaddrResponse\"\x00\x12\x39\n\x08Withdraw\x12\x14.cln.WithdrawRequest\x1a\x15.cln.WithdrawResponse\"\x00\x12\x36\n\x07KeySend\x12\x13.cln.KeysendRequest\x1a\x14.cln.KeysendResponse\"\x00\x12\x39\n\x08\x46undPsbt\x12\x14.cln.FundpsbtRequest\x1a\x15.cln.FundpsbtResponse\"\x00\x12\x39\n\x08SendPsbt\x12\x14.cln.SendpsbtRequest\x1a\x15.cln.SendpsbtResponse\"\x00\x12\x39\n\x08SignPsbt\x12\x14.cln.SignpsbtRequest\x1a\x15.cln.SignpsbtResponse\"\x00\x12\x39\n\x08UtxoPsbt\x12\x14.cln.UtxopsbtRequest\x1a\x15.cln.UtxopsbtResponse\"\x00\x12<\n\tTxDiscard\x12\x15.cln.TxdiscardRequest\x1a\x16.cln.TxdiscardResponse\"\x00\x12<\n\tTxPrepare\x12\x15.cln.TxprepareRequest\x1a\x16.cln.TxprepareResponse\"\x00\x12\x33\n\x06TxSend\x12\x12.cln.TxsendRequest\x1a\x13.cln.TxsendResponse\"\x00\x12Q\n\x10ListPeerChannels\x12\x1c.cln.ListpeerchannelsRequest\x1a\x1d.cln.ListpeerchannelsResponse\"\x00\x12W\n\x12ListClosedChannels\x12\x1e.cln.ListclosedchannelsRequest\x1a\x1f.cln.ListclosedchannelsResponse\"\x00\x12\x33\n\x06\x44\x65\x63ode\x12\x12.cln.DecodeRequest\x1a\x13.cln.DecodeResponse\"\x00\x12\x33\n\x06\x44\x65lPay\x12\x12.cln.DelpayRequest\x1a\x13.cln.DelpayResponse\"\x00\x12?\n\nDelForward\x12\x16.cln.DelforwardRequest\x1a\x17.cln.DelforwardResponse\"\x00\x12\x45\n\x0c\x44isableOffer\x12\x18.cln.DisableofferRequest\x1a\x19.cln.DisableofferResponse\"\x00\x12\x42\n\x0b\x45nableOffer\x12\x17.cln.EnableofferRequest\x1a\x18.cln.EnableofferResponse\"\x00\x12?\n\nDisconnect\x12\x16.cln.DisconnectRequest\x1a\x17.cln.DisconnectResponse\"\x00\x12\x39\n\x08\x46\x65\x65rates\x12\x14.cln.FeeratesRequest\x1a\x15.cln.FeeratesResponse\"\x00\x12\x42\n\x0b\x46\x65tchBip353\x12\x17.cln.Fetchbip353Request\x1a\x18.cln.Fetchbip353Response\"\x00\x12\x45\n\x0c\x46\x65tchInvoice\x12\x18.cln.FetchinvoiceRequest\x1a\x19.cln.FetchinvoiceResponse\"\x00\x12\x63\n\x16\x43\x61ncelRecurringInvoice\x12\".cln.CancelrecurringinvoiceRequest\x1a#.cln.CancelrecurringinvoiceResponse\"\x00\x12T\n\x11\x46undChannelCancel\x12\x1d.cln.FundchannelCancelRequest\x1a\x1e.cln.FundchannelCancelResponse\"\x00\x12Z\n\x13\x46undChannelComplete\x12\x1f.cln.FundchannelCompleteRequest\x1a .cln.FundchannelCompleteResponse\"\x00\x12\x42\n\x0b\x46undChannel\x12\x17.cln.FundchannelRequest\x1a\x18.cln.FundchannelResponse\"\x00\x12Q\n\x10\x46undChannelStart\x12\x1c.cln.FundchannelStartRequest\x1a\x1d.cln.FundchannelStartResponse\"\x00\x12\x33\n\x06GetLog\x12\x12.cln.GetlogRequest\x1a\x13.cln.GetlogResponse\"\x00\x12\x45\n\x0c\x46underUpdate\x12\x18.cln.FunderupdateRequest\x1a\x19.cln.FunderupdateResponse\"\x00\x12\x39\n\x08GetRoute\x12\x14.cln.GetrouteRequest\x1a\x15.cln.GetrouteResponse\"\x00\x12H\n\rListAddresses\x12\x19.cln.ListaddressesRequest\x1a\x1a.cln.ListaddressesResponse\"\x00\x12\x45\n\x0cListForwards\x12\x18.cln.ListforwardsRequest\x1a\x19.cln.ListforwardsResponse\"\x00\x12?\n\nListOffers\x12\x16.cln.ListoffersRequest\x1a\x17.cln.ListoffersResponse\"\x00\x12\x39\n\x08ListPays\x12\x14.cln.ListpaysRequest\x1a\x15.cln.ListpaysResponse\"\x00\x12<\n\tListHtlcs\x12\x15.cln.ListhtlcsRequest\x1a\x16.cln.ListhtlcsResponse\"\x00\x12Q\n\x10MultiFundChannel\x12\x1c.cln.MultifundchannelRequest\x1a\x1d.cln.MultifundchannelResponse\"\x00\x12H\n\rMultiWithdraw\x12\x19.cln.MultiwithdrawRequest\x1a\x1a.cln.MultiwithdrawResponse\"\x00\x12\x30\n\x05Offer\x12\x11.cln.OfferRequest\x1a\x12.cln.OfferResponse\"\x00\x12Q\n\x10OpenChannelAbort\x12\x1c.cln.OpenchannelAbortRequest\x1a\x1d.cln.OpenchannelAbortResponse\"\x00\x12N\n\x0fOpenChannelBump\x12\x1b.cln.OpenchannelBumpRequest\x1a\x1c.cln.OpenchannelBumpResponse\"\x00\x12N\n\x0fOpenChannelInit\x12\x1b.cln.OpenchannelInitRequest\x1a\x1c.cln.OpenchannelInitResponse\"\x00\x12T\n\x11OpenChannelSigned\x12\x1d.cln.OpenchannelSignedRequest\x1a\x1e.cln.OpenchannelSignedResponse\"\x00\x12T\n\x11OpenChannelUpdate\x12\x1d.cln.OpenchannelUpdateRequest\x1a\x1e.cln.OpenchannelUpdateResponse\"\x00\x12-\n\x04Ping\x12\x10.cln.PingRequest\x1a\x11.cln.PingResponse\"\x00\x12\x33\n\x06Plugin\x12\x12.cln.PluginRequest\x1a\x13.cln.PluginResponse\"\x00\x12H\n\rRenePayStatus\x12\x19.cln.RenepaystatusRequest\x1a\x1a.cln.RenepaystatusResponse\"\x00\x12\x36\n\x07RenePay\x12\x13.cln.RenepayRequest\x1a\x14.cln.RenepayResponse\"\x00\x12H\n\rReserveInputs\x12\x19.cln.ReserveinputsRequest\x1a\x1a.cln.ReserveinputsResponse\"\x00\x12H\n\rSendCustomMsg\x12\x19.cln.SendcustommsgRequest\x1a\x1a.cln.SendcustommsgResponse\"\x00\x12\x42\n\x0bSendInvoice\x12\x17.cln.SendinvoiceRequest\x1a\x18.cln.SendinvoiceResponse\"\x00\x12?\n\nSetChannel\x12\x16.cln.SetchannelRequest\x1a\x17.cln.SetchannelResponse\"\x00\x12<\n\tSetConfig\x12\x15.cln.SetconfigRequest\x1a\x16.cln.SetconfigResponse\"\x00\x12K\n\x0eSetPsbtVersion\x12\x1a.cln.SetpsbtversionRequest\x1a\x1b.cln.SetpsbtversionResponse\"\x00\x12\x42\n\x0bSignInvoice\x12\x17.cln.SigninvoiceRequest\x1a\x18.cln.SigninvoiceResponse\"\x00\x12\x42\n\x0bSignMessage\x12\x17.cln.SignmessageRequest\x1a\x18.cln.SignmessageResponse\"\x00\x12?\n\nSpliceInit\x12\x16.cln.SpliceInitRequest\x1a\x17.cln.SpliceInitResponse\"\x00\x12\x45\n\x0cSpliceSigned\x12\x18.cln.SpliceSignedRequest\x1a\x19.cln.SpliceSignedResponse\"\x00\x12\x45\n\x0cSpliceUpdate\x12\x18.cln.SpliceUpdateRequest\x1a\x19.cln.SpliceUpdateResponse\"\x00\x12\x39\n\x08SpliceIn\x12\x14.cln.SpliceinRequest\x1a\x15.cln.SpliceinResponse\"\x00\x12<\n\tSpliceOut\x12\x15.cln.SpliceoutRequest\x1a\x16.cln.SpliceoutResponse\"\x00\x12<\n\tDevSplice\x12\x15.cln.DevspliceRequest\x1a\x16.cln.DevspliceResponse\"\x00\x12N\n\x0fUnreserveInputs\x12\x1b.cln.UnreserveinputsRequest\x1a\x1c.cln.UnreserveinputsResponse\"\x00\x12H\n\rUpgradeWallet\x12\x19.cln.UpgradewalletRequest\x1a\x1a.cln.UpgradewalletResponse\"\x00\x12N\n\x0fWaitBlockHeight\x12\x1b.cln.WaitblockheightRequest\x1a\x1c.cln.WaitblockheightResponse\"\x00\x12-\n\x04Wait\x12\x10.cln.WaitRequest\x1a\x11.cln.WaitResponse\"\x00\x12\x42\n\x0bListConfigs\x12\x17.cln.ListconfigsRequest\x1a\x18.cln.ListconfigsResponse\"\x00\x12-\n\x04Stop\x12\x10.cln.StopRequest\x1a\x11.cln.StopResponse\"\x00\x12-\n\x04Help\x12\x10.cln.HelpRequest\x1a\x11.cln.HelpResponse\"\x00\x12T\n\x11PreApproveKeysend\x12\x1d.cln.PreapprovekeysendRequest\x1a\x1e.cln.PreapprovekeysendResponse\"\x00\x12T\n\x11PreApproveInvoice\x12\x1d.cln.PreapproveinvoiceRequest\x1a\x1e.cln.PreapproveinvoiceResponse\"\x00\x12\x45\n\x0cStaticBackup\x12\x18.cln.StaticbackupRequest\x1a\x19.cln.StaticbackupResponse\"\x00\x12N\n\x0f\x42kprChannelsApy\x12\x1b.cln.BkprchannelsapyRequest\x1a\x1c.cln.BkprchannelsapyResponse\"\x00\x12T\n\x11\x42kprDumpIncomeCsv\x12\x1d.cln.BkprdumpincomecsvRequest\x1a\x1e.cln.BkprdumpincomecsvResponse\"\x00\x12\x42\n\x0b\x42kprInspect\x12\x17.cln.BkprinspectRequest\x1a\x18.cln.BkprinspectResponse\"\x00\x12`\n\x15\x42kprListAccountEvents\x12!.cln.BkprlistaccounteventsRequest\x1a\".cln.BkprlistaccounteventsResponse\"\x00\x12Q\n\x10\x42kprListBalances\x12\x1c.cln.BkprlistbalancesRequest\x1a\x1d.cln.BkprlistbalancesResponse\"\x00\x12K\n\x0e\x42kprListIncome\x12\x1a.cln.BkprlistincomeRequest\x1a\x1b.cln.BkprlistincomeResponse\"\x00\x12{\n\x1e\x42kprEditDescriptionByPaymentId\x12*.cln.BkpreditdescriptionbypaymentidRequest\x1a+.cln.BkpreditdescriptionbypaymentidResponse\"\x00\x12x\n\x1d\x42kprEditDescriptionByOutpoint\x12).cln.BkpreditdescriptionbyoutpointRequest\x1a*.cln.BkpreditdescriptionbyoutpointResponse\"\x00\x12?\n\nBkprReport\x12\x16.cln.BkprreportRequest\x1a\x17.cln.BkprreportResponse\"\x00\x12H\n\rBlacklistRune\x12\x19.cln.BlacklistruneRequest\x1a\x1a.cln.BlacklistruneResponse\"\x00\x12<\n\tCheckRune\x12\x15.cln.CheckruneRequest\x1a\x16.cln.CheckruneResponse\"\x00\x12?\n\nCreateRune\x12\x16.cln.CreateruneRequest\x1a\x17.cln.CreateruneResponse\"\x00\x12<\n\tShowRunes\x12\x15.cln.ShowrunesRequest\x1a\x16.cln.ShowrunesResponse\"\x00\x12Q\n\x10\x41skReneUnreserve\x12\x1c.cln.AskreneunreserveRequest\x1a\x1d.cln.AskreneunreserveResponse\"\x00\x12T\n\x11\x41skReneListLayers\x12\x1d.cln.AskrenelistlayersRequest\x1a\x1e.cln.AskrenelistlayersResponse\"\x00\x12W\n\x12\x41skReneCreateLayer\x12\x1e.cln.AskrenecreatelayerRequest\x1a\x1f.cln.AskrenecreatelayerResponse\"\x00\x12W\n\x12\x41skReneRemoveLayer\x12\x1e.cln.AskreneremovelayerRequest\x1a\x1f.cln.AskreneremovelayerResponse\"\x00\x12K\n\x0e\x41skReneReserve\x12\x1a.cln.AskrenereserveRequest\x1a\x1b.cln.AskrenereserveResponse\"\x00\x12?\n\nAskReneAge\x12\x16.cln.AskreneageRequest\x1a\x17.cln.AskreneageResponse\"\x00\x12<\n\tGetRoutes\x12\x15.cln.GetroutesRequest\x1a\x16.cln.GetroutesResponse\"\x00\x12W\n\x12\x41skReneDisableNode\x12\x1e.cln.AskrenedisablenodeRequest\x1a\x1f.cln.AskrenedisablenodeResponse\"\x00\x12]\n\x14\x41skReneInformChannel\x12 .cln.AskreneinformchannelRequest\x1a!.cln.AskreneinformchannelResponse\"\x00\x12]\n\x14\x41skReneCreateChannel\x12 .cln.AskrenecreatechannelRequest\x1a!.cln.AskrenecreatechannelResponse\"\x00\x12]\n\x14\x41skReneUpdateChannel\x12 .cln.AskreneupdatechannelRequest\x1a!.cln.AskreneupdatechannelResponse\"\x00\x12W\n\x12\x41skReneBiasChannel\x12\x1e.cln.AskrenebiaschannelRequest\x1a\x1f.cln.AskrenebiaschannelResponse\"\x00\x12N\n\x0f\x41skreneBiasNode\x12\x1b.cln.AskrenebiasnodeRequest\x1a\x1c.cln.AskrenebiasnodeResponse\"\x00\x12\x66\n\x17\x41skReneListReservations\x12#.cln.AskrenelistreservationsRequest\x1a$.cln.AskrenelistreservationsResponse\"\x00\x12W\n\x12InjectPaymentOnion\x12\x1e.cln.InjectpaymentonionRequest\x1a\x1f.cln.InjectpaymentonionResponse\"\x00\x12W\n\x12InjectOnionMessage\x12\x1e.cln.InjectonionmessageRequest\x1a\x1f.cln.InjectonionmessageResponse\"\x00\x12-\n\x04Xpay\x12\x10.cln.XpayRequest\x1a\x11.cln.XpayResponse\"\x00\x12W\n\x12SignMessageWithKey\x12\x1e.cln.SignmessagewithkeyRequest\x1a\x1f.cln.SignmessagewithkeyResponse\"\x00\x12Q\n\x10ListChannelMoves\x12\x1c.cln.ListchannelmovesRequest\x1a\x1d.cln.ListchannelmovesResponse\"\x00\x12K\n\x0eListChainMoves\x12\x1a.cln.ListchainmovesRequest\x1a\x1b.cln.ListchainmovesResponse\"\x00\x12T\n\x11ListNetworkEvents\x12\x1d.cln.ListnetworkeventsRequest\x1a\x1e.cln.ListnetworkeventsResponse\"\x00\x12N\n\x0f\x44\x65lNetworkEvent\x12\x1b.cln.DelnetworkeventRequest\x1a\x1c.cln.DelnetworkeventResponse\"\x00\x12Z\n\x13\x43lnrestRegisterPath\x12\x1f.cln.ClnrestregisterpathRequest\x1a .cln.ClnrestregisterpathResponse\"\x00\x12T\n\x11ListCurrencyRates\x12\x1d.cln.ListcurrencyratesRequest\x1a\x1e.cln.ListcurrencyratesResponse\"\x00\x12N\n\x0f\x43urrencyConvert\x12\x1b.cln.CurrencyconvertRequest\x1a\x1c.cln.CurrencyconvertResponse\"\x00\x12\x45\n\x0c\x43urrencyRate\x12\x18.cln.CurrencyrateRequest\x1a\x19.cln.CurrencyrateResponse\"\x00\x12\x63\n\x18SubscribeBalanceSnapshot\x12!.cln.StreamBalanceSnapshotRequest\x1a .cln.BalanceSnapshotNotification\"\x00\x30\x01\x12T\n\x13SubscribeBlockAdded\x12\x1c.cln.StreamBlockAddedRequest\x1a\x1b.cln.BlockAddedNotification\"\x00\x30\x01\x12i\n\x1aSubscribeChannelOpenFailed\x12#.cln.StreamChannelOpenFailedRequest\x1a\".cln.ChannelOpenFailedNotification\"\x00\x30\x01\x12]\n\x16SubscribeChannelOpened\x12\x1f.cln.StreamChannelOpenedRequest\x1a\x1e.cln.ChannelOpenedNotification\"\x00\x30\x01\x12o\n\x1cSubscribeChannelStateChanged\x12%.cln.StreamChannelStateChangedRequest\x1a$.cln.ChannelStateChangedNotification\"\x00\x30\x01\x12O\n\x10SubscribeConnect\x12\x19.cln.StreamConnectRequest\x1a\x1c.cln.PeerConnectNotification\"\x00\x30\x01\x12Z\n\x15SubscribeCoinMovement\x12\x1e.cln.StreamCoinMovementRequest\x1a\x1d.cln.CoinMovementNotification\"\x00\x30\x01\x12Q\n\x12SubscribeCustomMsg\x12\x1b.cln.StreamCustomMsgRequest\x1a\x1a.cln.CustomMsgNotification\"\x00\x30\x01\x12i\n\x1aSubscribeDeprecatedOneshot\x12#.cln.StreamDeprecatedOneshotRequest\x1a\".cln.DeprecatedOneshotNotification\"\x00\x30\x01\x12T\n\x13SubscribeDisconnect\x12\x1c.cln.StreamDisconnectRequest\x1a\x1b.cln.DisconnectNotification\"\x00\x30\x01\x12Z\n\x15SubscribeForwardEvent\x12\x1e.cln.StreamForwardEventRequest\x1a\x1d.cln.ForwardEventNotification\"\x00\x30\x01\x12\x63\n\x18SubscribeInvoiceCreation\x12!.cln.StreamInvoiceCreationRequest\x1a .cln.InvoiceCreationNotification\"\x00\x30\x01\x12`\n\x17SubscribeInvoicePayment\x12 .cln.StreamInvoicePaymentRequest\x1a\x1f.cln.InvoicePaymentNotification\"\x00\x30\x01\x12?\n\x0cSubscribeLog\x12\x15.cln.StreamLogRequest\x1a\x14.cln.LogNotification\"\x00\x30\x01\x12{\n SubscribeOnionMessageForwardFail\x12).cln.StreamOnionMessageForwardFailRequest\x1a(.cln.OnionMessageForwardFailNotification\"\x00\x30\x01\x12o\n\x1cSubscribeOpenChannelPeerSigs\x12%.cln.StreamOpenChannelPeerSigsRequest\x1a$.cln.OpenChannelPeerSigsNotification\"\x00\x30\x01\x12]\n\x16SubscribePluginStarted\x12\x1f.cln.StreamPluginStartedRequest\x1a\x1e.cln.PluginStartedNotification\"\x00\x30\x01\x12]\n\x16SubscribePluginStopped\x12\x1f.cln.StreamPluginStoppedRequest\x1a\x1e.cln.PluginStoppedNotification\"\x00\x30\x01\x12`\n\x17SubscribeSendPayFailure\x12 .cln.StreamSendPayFailureRequest\x1a\x1f.cln.SendPayFailureNotification\"\x00\x30\x01\x12`\n\x17SubscribeSendPaySuccess\x12 .cln.StreamSendPaySuccessRequest\x1a\x1f.cln.SendPaySuccessNotification\"\x00\x30\x01\x12N\n\x11SubscribeShutdown\x12\x1a.cln.StreamShutdownRequest\x1a\x19.cln.ShutdownNotification\"\x00\x30\x01\x12K\n\x10SubscribeWarning\x12\x19.cln.StreamWarningRequest\x1a\x18.cln.WarningNotification\"\x00\x30\x01\x12T\n\x13SubscribePayPartEnd\x12\x1c.cln.StreamPayPartEndRequest\x1a\x1b.cln.PayPartEndNotification\"\x00\x30\x01\x12Z\n\x15SubscribePayPartStart\x12\x1e.cln.StreamPayPartStartRequest\x1a\x1d.cln.PayPartStartNotification\"\x00\x30\x01\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nnode.proto\x12\x03\x63ln\x1a\x10primitives.proto\"\x10\n\x0eGetinfoRequest\"\xb1\x04\n\x0fGetinfoResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05\x61lias\x18\x02 \x01(\t\x12\r\n\x05\x63olor\x18\x03 \x01(\x0c\x12\x11\n\tnum_peers\x18\x04 \x01(\r\x12\x1c\n\x14num_pending_channels\x18\x05 \x01(\r\x12\x1b\n\x13num_active_channels\x18\x06 \x01(\r\x12\x1d\n\x15num_inactive_channels\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\t\x12\x15\n\rlightning_dir\x18\t \x01(\t\x12\x32\n\x0cour_features\x18\n \x01(\x0b\x32\x17.cln.GetinfoOurFeaturesH\x00\x88\x01\x01\x12\x13\n\x0b\x62lockheight\x18\x0b \x01(\r\x12\x0f\n\x07network\x18\x0c \x01(\t\x12(\n\x13\x66\x65\x65s_collected_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x07\x61\x64\x64ress\x18\x0e \x03(\x0b\x32\x13.cln.GetinfoAddress\x12$\n\x07\x62inding\x18\x0f \x03(\x0b\x32\x13.cln.GetinfoBinding\x12\"\n\x15warning_bitcoind_sync\x18\x10 \x01(\tH\x01\x88\x01\x01\x12$\n\x17warning_lightningd_sync\x18\x11 \x01(\tH\x02\x88\x01\x01\x42\x0f\n\r_our_featuresB\x18\n\x16_warning_bitcoind_syncB\x1a\n\x18_warning_lightningd_sync\"R\n\x12GetinfoOurFeatures\x12\x0c\n\x04init\x18\x01 \x01(\x0c\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\x0c\x12\x0f\n\x07invoice\x18\x04 \x01(\x0c\"\xc4\x01\n\x0eGetinfoAddress\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.GetinfoAddress.GetinfoAddressType\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x00\x88\x01\x01\"G\n\x12GetinfoAddressType\x12\x07\n\x03\x44NS\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\n\n\x08_address\"\xac\x02\n\x0eGetinfoBinding\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.GetinfoBinding.GetinfoBindingType\x12\x14\n\x07\x61\x64\x64ress\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04port\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06socket\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07subtype\x18\x05 \x01(\tH\x03\x88\x01\x01\"_\n\x12GetinfoBindingType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x12\r\n\tWEBSOCKET\x10\x05\x42\n\n\x08_addressB\x07\n\x05_portB\t\n\x07_socketB\n\n\x08_subtype\"\xb5\x01\n\x10ListpeersRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x38\n\x05level\x18\x02 \x01(\x0e\x32$.cln.ListpeersRequest.ListpeersLevelH\x01\x88\x01\x01\"E\n\x0eListpeersLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\x0b\n\x07UNUSUAL\x10\x03\x12\t\n\x05TRACE\x10\x04\x42\x05\n\x03_idB\x08\n\x06_level\"7\n\x11ListpeersResponse\x12\"\n\x05peers\x18\x01 \x03(\x0b\x32\x13.cln.ListpeersPeers\"\xc9\x01\n\x0eListpeersPeers\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x11\n\tconnected\x18\x02 \x01(\x08\x12#\n\x03log\x18\x03 \x03(\x0b\x32\x16.cln.ListpeersPeersLog\x12\x0f\n\x07netaddr\x18\x05 \x03(\t\x12\x15\n\x08\x66\x65\x61tures\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0bremote_addr\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x0cnum_channels\x18\x08 \x01(\rB\x0b\n\t_featuresB\x0e\n\x0c_remote_addr\"\x88\x03\n\x11ListpeersPeersLog\x12?\n\titem_type\x18\x01 \x01(\x0e\x32,.cln.ListpeersPeersLog.ListpeersPeersLogType\x12\x18\n\x0bnum_skipped\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04time\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03log\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07node_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x11\n\x04\x64\x61ta\x18\x07 \x01(\x0cH\x05\x88\x01\x01\"t\n\x15ListpeersPeersLogType\x12\x0b\n\x07SKIPPED\x10\x00\x12\n\n\x06\x42ROKEN\x10\x01\x12\x0b\n\x07UNUSUAL\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\t\n\x05IO_IN\x10\x05\x12\n\n\x06IO_OUT\x10\x06\x12\t\n\x05TRACE\x10\x07\x42\x0e\n\x0c_num_skippedB\x07\n\x05_timeB\t\n\x07_sourceB\x06\n\x04_logB\n\n\x08_node_idB\x07\n\x05_data\"0\n\x10ListfundsRequest\x12\x12\n\x05spent\x18\x01 \x01(\x08H\x00\x88\x01\x01\x42\x08\n\x06_spent\"e\n\x11ListfundsResponse\x12&\n\x07outputs\x18\x01 \x03(\x0b\x32\x15.cln.ListfundsOutputs\x12(\n\x08\x63hannels\x18\x02 \x03(\x0b\x32\x16.cln.ListfundsChannels\"\xb9\x03\n\x10ListfundsOutputs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06output\x18\x02 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0cscriptpubkey\x18\x04 \x01(\x0c\x12\x14\n\x07\x61\x64\x64ress\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0credeemscript\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12<\n\x06status\x18\x07 \x01(\x0e\x32,.cln.ListfundsOutputs.ListfundsOutputsStatus\x12\x18\n\x0b\x62lockheight\x18\x08 \x01(\rH\x02\x88\x01\x01\x12\x10\n\x08reserved\x18\t \x01(\x08\x12\x1e\n\x11reserved_to_block\x18\n \x01(\rH\x03\x88\x01\x01\"Q\n\x16ListfundsOutputsStatus\x12\x0f\n\x0bUNCONFIRMED\x10\x00\x12\r\n\tCONFIRMED\x10\x01\x12\t\n\x05SPENT\x10\x02\x12\x0c\n\x08IMMATURE\x10\x03\x42\n\n\x08_addressB\x0f\n\r_redeemscriptB\x0e\n\x0c_blockheightB\x14\n\x12_reserved_to_block\"\x97\x02\n\x11ListfundsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12$\n\x0four_amount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x04 \x01(\x0c\x12\x16\n\x0e\x66unding_output\x18\x05 \x01(\r\x12\x11\n\tconnected\x18\x06 \x01(\x08\x12 \n\x05state\x18\x07 \x01(\x0e\x32\x11.cln.ChannelState\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x12\n\nchannel_id\x18\t \x01(\x0c\x42\x13\n\x11_short_channel_id\"\xbb\x03\n\x0eSendpayRequest\x12 \n\x05route\x18\x01 \x03(\x0b\x32\x11.cln.SendpayRoute\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x13\n\x06partid\x18\x07 \x01(\x04H\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\t \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x08\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_bolt11B\x11\n\x0f_payment_secretB\t\n\x07_partidB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x13\n\x11_payment_metadataB\x0e\n\x0c_description\"\x96\x05\n\x0fSendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x32\n\x06status\x18\x04 \x01(\x0e\x32\".cln.SendpayResponse.SendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x14\n\x07message\x18\x0e \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0f \x01(\x04H\t\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\"*\n\rSendpayStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\x0f\n\r_completed_atB\x10\n\x0e_updated_index\"\xe6\x02\n\x0cSendpayRoute\x12\x0f\n\x02id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05\x64\x65lay\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x14\n\x07\x63hannel\x18\x04 \x01(\tH\x02\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12!\n\x14short_channel_id_dir\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x18\n\x0bnode_id_out\x18\x07 \x01(\x0cH\x05\x88\x01\x01\x12)\n\x0f\x61mount_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x15\n\x08\x63ltv_out\x18\t \x01(\rH\x07\x88\x01\x01\x42\x05\n\x03_idB\x08\n\x06_delayB\n\n\x08_channelB\x0e\n\x0c_amount_msatB\x17\n\x15_short_channel_id_dirB\x0e\n\x0c_node_id_outB\x12\n\x10_amount_out_msatB\x0b\n\t_cltv_out\"\x93\x01\n\x13ListchannelsRequest\x12\x1d\n\x10short_channel_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06source\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\t\n\x07_sourceB\x0e\n\x0c_destination\"C\n\x14ListchannelsResponse\x12+\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x19.cln.ListchannelsChannels\"\xb3\x03\n\x14ListchannelsChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\x0e\n\x06public\x18\x04 \x01(\x08\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\rmessage_flags\x18\x06 \x01(\r\x12\x15\n\rchannel_flags\x18\x07 \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x08 \x01(\x08\x12\x13\n\x0blast_update\x18\t \x01(\r\x12\x1d\n\x15\x62\x61se_fee_millisatoshi\x18\n \x01(\r\x12\x19\n\x11\x66\x65\x65_per_millionth\x18\x0b \x01(\r\x12\r\n\x05\x64\x65lay\x18\x0c \x01(\r\x12&\n\x11htlc_minimum_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x11htlc_maximum_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x0f \x01(\x0c\x12\x11\n\tdirection\x18\x10 \x01(\rB\x14\n\x12_htlc_maximum_msat\"#\n\x10\x41\x64\x64gossipRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x13\n\x11\x41\x64\x64gossipResponse\"\xac\x01\n\x14\x41\x64\x64psbtoutputRequest\x12\x1c\n\x07satoshi\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\x08locktime\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_locktimeB\x0e\n\x0c_initialpsbtB\x0e\n\x0c_destination\"U\n\x15\x41\x64\x64psbtoutputResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1e\n\x16\x65stimated_added_weight\x18\x02 \x01(\r\x12\x0e\n\x06outnum\x18\x03 \x01(\r\"O\n\x14\x41utocleanonceRequest\x12*\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystem\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x04\"G\n\x15\x41utocleanonceResponse\x12.\n\tautoclean\x18\x01 \x01(\x0b\x32\x1b.cln.AutocleanonceAutoclean\"\x89\x05\n\x16\x41utocleanonceAutoclean\x12L\n\x11succeededforwards\x18\x01 \x01(\x0b\x32,.cln.AutocleanonceAutocleanSucceededforwardsH\x00\x88\x01\x01\x12\x46\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32).cln.AutocleanonceAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x44\n\rsucceededpays\x18\x03 \x01(\x0b\x32(.cln.AutocleanonceAutocleanSucceededpaysH\x02\x88\x01\x01\x12>\n\nfailedpays\x18\x04 \x01(\x0b\x32%.cln.AutocleanonceAutocleanFailedpaysH\x03\x88\x01\x01\x12\x42\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32\'.cln.AutocleanonceAutocleanPaidinvoicesH\x04\x88\x01\x01\x12H\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32*.cln.AutocleanonceAutocleanExpiredinvoicesH\x05\x88\x01\x01\x12\x44\n\rnetworkevents\x18\x07 \x01(\x0b\x32(.cln.AutocleanonceAutocleanNetworkeventsH\x06\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoicesB\x10\n\x0e_networkevents\"M\n\'AutocleanonceAutocleanSucceededforwards\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"J\n$AutocleanonceAutocleanFailedforwards\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"I\n#AutocleanonceAutocleanSucceededpays\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"F\n AutocleanonceAutocleanFailedpays\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"H\n\"AutocleanonceAutocleanPaidinvoices\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"K\n%AutocleanonceAutocleanExpiredinvoices\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"I\n#AutocleanonceAutocleanNetworkevents\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"W\n\x16\x41utocleanstatusRequest\x12/\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystemH\x00\x88\x01\x01\x42\x0c\n\n_subsystem\"K\n\x17\x41utocleanstatusResponse\x12\x30\n\tautoclean\x18\x01 \x01(\x0b\x32\x1d.cln.AutocleanstatusAutoclean\"\x99\x05\n\x18\x41utocleanstatusAutoclean\x12N\n\x11succeededforwards\x18\x01 \x01(\x0b\x32..cln.AutocleanstatusAutocleanSucceededforwardsH\x00\x88\x01\x01\x12H\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32+.cln.AutocleanstatusAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x46\n\rsucceededpays\x18\x03 \x01(\x0b\x32*.cln.AutocleanstatusAutocleanSucceededpaysH\x02\x88\x01\x01\x12@\n\nfailedpays\x18\x04 \x01(\x0b\x32\'.cln.AutocleanstatusAutocleanFailedpaysH\x03\x88\x01\x01\x12\x44\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32).cln.AutocleanstatusAutocleanPaidinvoicesH\x04\x88\x01\x01\x12J\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32,.cln.AutocleanstatusAutocleanExpiredinvoicesH\x05\x88\x01\x01\x12\x46\n\rnetworkevents\x18\x07 \x01(\x0b\x32*.cln.AutocleanstatusAutocleanNetworkeventsH\x06\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoicesB\x10\n\x0e_networkevents\"g\n)AutocleanstatusAutocleanSucceededforwards\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"d\n&AutocleanstatusAutocleanFailedforwards\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"c\n%AutocleanstatusAutocleanSucceededpays\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"`\n\"AutocleanstatusAutocleanFailedpays\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"b\n$AutocleanstatusAutocleanPaidinvoices\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"e\n\'AutocleanstatusAutocleanExpiredinvoices\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"c\n%AutocleanstatusAutocleanNetworkevents\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"U\n\x13\x43heckmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\r\n\x05zbase\x18\x02 \x01(\t\x12\x13\n\x06pubkey\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x42\t\n\x07_pubkey\"8\n\x14\x43heckmessageResponse\x12\x10\n\x08verified\x18\x01 \x01(\x08\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\"\xcb\x02\n\x0c\x43loseRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1e\n\x11unilateraltimeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\tH\x01\x88\x01\x01\x12!\n\x14\x66\x65\x65_negotiation_step\x18\x04 \x01(\tH\x02\x88\x01\x01\x12)\n\rwrong_funding\x18\x05 \x01(\x0b\x32\r.cln.OutpointH\x03\x88\x01\x01\x12\x1f\n\x12\x66orce_lease_closed\x18\x06 \x01(\x08H\x04\x88\x01\x01\x12\x1e\n\x08\x66\x65\x65range\x18\x07 \x03(\x0b\x32\x0c.cln.FeerateB\x14\n\x12_unilateraltimeoutB\x0e\n\x0c_destinationB\x17\n\x15_fee_negotiation_stepB\x10\n\x0e_wrong_fundingB\x15\n\x13_force_lease_closed\"\x93\x01\n\rCloseResponse\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.CloseResponse.CloseType\x12\x0b\n\x03txs\x18\x04 \x03(\x0c\x12\r\n\x05txids\x18\x05 \x03(\x0c\"5\n\tCloseType\x12\n\n\x06MUTUAL\x10\x00\x12\x0e\n\nUNILATERAL\x10\x01\x12\x0c\n\x08UNOPENED\x10\x02\"T\n\x0e\x43onnectRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\x04host\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04port\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x07\n\x05_hostB\x07\n\x05_port\"\xb4\x01\n\x0f\x43onnectResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0c\x12\x38\n\tdirection\x18\x03 \x01(\x0e\x32%.cln.ConnectResponse.ConnectDirection\x12$\n\x07\x61\x64\x64ress\x18\x04 \x01(\x0b\x32\x13.cln.ConnectAddress\"#\n\x10\x43onnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\xfb\x01\n\x0e\x43onnectAddress\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.ConnectAddress.ConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"P\n\x12\x43onnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"J\n\x14\x43reateinvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x10\n\x08preimage\x18\x03 \x01(\x0c\"\xe6\x05\n\x15\x43reateinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12>\n\x06status\x18\x06 \x01(\x0e\x32..cln.CreateinvoiceResponse.CreateinvoiceStatus\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x16\n\tpay_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x06\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12:\n\rpaid_outpoint\x18\x11 \x01(\x0b\x32\x1e.cln.CreateinvoicePaidOutpointH\t\x88\x01\x01\"8\n\x13\x43reateinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_paid_outpoint\"9\n\x19\x43reateinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xb4\x02\n\x10\x44\x61tastoreRequest\x12\x10\n\x03hex\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x36\n\x04mode\x18\x03 \x01(\x0e\x32#.cln.DatastoreRequest.DatastoreModeH\x01\x88\x01\x01\x12\x17\n\ngeneration\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\t\x12\x13\n\x06string\x18\x06 \x01(\tH\x03\x88\x01\x01\"p\n\rDatastoreMode\x12\x0f\n\x0bMUST_CREATE\x10\x00\x12\x10\n\x0cMUST_REPLACE\x10\x01\x12\x15\n\x11\x43REATE_OR_REPLACE\x10\x02\x12\x0f\n\x0bMUST_APPEND\x10\x03\x12\x14\n\x10\x43REATE_OR_APPEND\x10\x04\x42\x06\n\x04_hexB\x07\n\x05_modeB\r\n\x0b_generationB\t\n\x07_string\"\x82\x01\n\x11\x44\x61tastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"$\n\x15\x44\x61tastoreusageRequest\x12\x0b\n\x03key\x18\x01 \x03(\t\"S\n\x16\x44\x61tastoreusageResponse\x12\x39\n\x0e\x64\x61tastoreusage\x18\x01 \x01(\x0b\x32!.cln.DatastoreusageDatastoreusage\"@\n\x1c\x44\x61tastoreusageDatastoreusage\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x13\n\x0btotal_bytes\x18\x02 \x01(\x04\"\x9d\x01\n\x12\x43reateonionRequest\x12\"\n\x04hops\x18\x01 \x03(\x0b\x32\x14.cln.CreateonionHops\x12\x11\n\tassocdata\x18\x02 \x01(\x0c\x12\x18\n\x0bsession_key\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x17\n\nonion_size\x18\x04 \x01(\rH\x01\x88\x01\x01\x42\x0e\n\x0c_session_keyB\r\n\x0b_onion_size\"<\n\x13\x43reateonionResponse\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x16\n\x0eshared_secrets\x18\x02 \x03(\x0c\"2\n\x0f\x43reateonionHops\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"J\n\x13\x44\x65ldatastoreRequest\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x03 \x03(\tB\r\n\x0b_generation\"\x85\x01\n\x14\x44\x65ldatastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xb6\x01\n\x11\x44\x65linvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\x12\x37\n\x06status\x18\x02 \x01(\x0e\x32\'.cln.DelinvoiceRequest.DelinvoiceStatus\x12\x15\n\x08\x64\x65sconly\x18\x03 \x01(\x08H\x00\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\x0b\n\t_desconly\"\xcf\x05\n\x12\x44\x65linvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x38\n\x06status\x18\x07 \x01(\x0e\x32(.cln.DelinvoiceResponse.DelinvoiceStatus\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0c \x01(\x04\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x06\x88\x01\x01\x12\x16\n\tpay_index\x18\x0e \x01(\x04H\x07\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x14\n\x07paid_at\x18\x10 \x01(\x04H\t\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x11 \x01(\x0cH\n\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\x9f\x01\n\x17\x44\x65vforgetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nchannel_id\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05\x66orce\x18\x04 \x01(\x08H\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x08\n\x06_force\"Y\n\x18\x44\x65vforgetchannelResponse\x12\x0e\n\x06\x66orced\x18\x01 \x01(\x08\x12\x17\n\x0f\x66unding_unspent\x18\x02 \x01(\x08\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\"\x19\n\x17\x45mergencyrecoverRequest\")\n\x18\x45mergencyrecoverResponse\x12\r\n\x05stubs\x18\x01 \x03(\x0c\" \n\x1eGetemergencyrecoverdataRequest\"n\n\x1fGetemergencyrecoverdataResponse\x12\x10\n\x08\x66iledata\x18\x01 \x01(\x0c\x12\x1a\n\x12\x63\x61n_create_penalty\x18\x02 \x01(\x08\x12\x1d\n\x15\x62\x61\x63ked_up_channel_ids\x18\x03 \x03(\x0c\"Q\n\x13\x45xposesecretRequest\x12\x12\n\npassphrase\x18\x01 \x01(\t\x12\x17\n\nidentifier\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\r\n\x0b_identifier\"_\n\x14\x45xposesecretResponse\x12\x12\n\nidentifier\x18\x01 \x01(\t\x12\x0f\n\x07\x63odex32\x18\x02 \x01(\t\x12\x15\n\x08mnemonic\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x0b\n\t_mnemonic\"#\n\x0eRecoverRequest\x12\x11\n\thsmsecret\x18\x01 \x01(\t\"x\n\x0fRecoverResponse\x12\x32\n\x06result\x18\x01 \x01(\x0e\x32\".cln.RecoverResponse.RecoverResult\"1\n\rRecoverResult\x12 \n\x1cRECOVERY_RESTART_IN_PROGRESS\x10\x00\"$\n\x15RecoverchannelRequest\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"\'\n\x16RecoverchannelResponse\x12\r\n\x05stubs\x18\x01 \x03(\t\"\x99\x02\n\x0eInvoiceRequest\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05label\x18\x03 \x01(\t\x12\x11\n\tfallbacks\x18\x04 \x03(\t\x12\x15\n\x08preimage\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x11\n\x04\x63ltv\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18\x07 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x15\x65xposeprivatechannels\x18\x08 \x03(\t\x12\x19\n\x0c\x64\x65schashonly\x18\t \x01(\x08H\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x10.cln.AmountOrAnyB\x0b\n\t_preimageB\x07\n\x05_cltvB\t\n\x07_expiryB\x0f\n\r_deschashonly\"\xfe\x02\n\x0fInvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x16\n\x0epayment_secret\x18\x03 \x01(\x0c\x12\x12\n\nexpires_at\x18\x04 \x01(\x04\x12\x1d\n\x10warning_capacity\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x0fwarning_offline\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10warning_deadends\x18\x07 \x01(\tH\x02\x88\x01\x01\x12#\n\x16warning_private_unused\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x0bwarning_mpp\x18\t \x01(\tH\x04\x88\x01\x01\x12\x15\n\rcreated_index\x18\n \x01(\x04\x42\x13\n\x11_warning_capacityB\x12\n\x10_warning_offlineB\x13\n\x11_warning_deadendsB\x19\n\x17_warning_private_unusedB\x0e\n\x0c_warning_mpp\"\xe1\x01\n\x15InvoicerequestRequest\x12\x1b\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x05 \x01(\x04H\x02\x88\x01\x01\x12\x17\n\nsingle_use\x18\x06 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_issuerB\x08\n\x06_labelB\x12\n\x10_absolute_expiryB\r\n\x0b_single_use\"\x8b\x01\n\x16InvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"1\n\x1c\x44isableinvoicerequestRequest\x12\x11\n\tinvreq_id\x18\x01 \x01(\t\"\x92\x01\n\x1d\x44isableinvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"l\n\x1aListinvoicerequestsRequest\x12\x16\n\tinvreq_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0c\n\n_invreq_idB\x0e\n\x0c_active_only\"_\n\x1bListinvoicerequestsResponse\x12@\n\x0finvoicerequests\x18\x01 \x03(\x0b\x32\'.cln.ListinvoicerequestsInvoicerequests\"\x97\x01\n\"ListinvoicerequestsInvoicerequests\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"#\n\x14ListdatastoreRequest\x12\x0b\n\x03key\x18\x02 \x03(\t\"G\n\x15ListdatastoreResponse\x12.\n\tdatastore\x18\x01 \x03(\x0b\x32\x1b.cln.ListdatastoreDatastore\"\x87\x01\n\x16ListdatastoreDatastore\x12\x0b\n\x03key\x18\x01 \x03(\t\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xde\x02\n\x13ListinvoicesRequest\x12\x12\n\x05label\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x15\n\x08offer_id\x18\x04 \x01(\tH\x03\x88\x01\x01\x12>\n\x05index\x18\x05 \x01(\x0e\x32*.cln.ListinvoicesRequest.ListinvoicesIndexH\x04\x88\x01\x01\x12\x12\n\x05start\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x12\n\x05limit\x18\x07 \x01(\rH\x06\x88\x01\x01\"-\n\x11ListinvoicesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x0f\n\r_payment_hashB\x0b\n\t_offer_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListinvoicesResponse\x12+\n\x08invoices\x18\x01 \x03(\x0b\x32\x19.cln.ListinvoicesInvoices\"\xbc\x06\n\x14ListinvoicesInvoices\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListinvoicesInvoices.ListinvoicesInvoicesStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x16\n\tpay_index\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x14\n\x07paid_at\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0e \x01(\x0cH\x08\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\t\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\x12\x41\n\rpaid_outpoint\x18\x12 \x01(\x0b\x32%.cln.ListinvoicesInvoicesPaidOutpointH\x0b\x88\x01\x01\"?\n\x1aListinvoicesInvoicesStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x11\n\x0f_local_offer_idB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"@\n ListinvoicesInvoicesPaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xf6\x03\n\x10SendonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12)\n\tfirst_hop\x18\x02 \x01(\x0b\x32\x16.cln.SendonionFirstHop\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\x05label\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x16\n\x0eshared_secrets\x18\x05 \x03(\x0c\x12\x13\n\x06partid\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\t \x01(\x0cH\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x12+\n\x11total_amount_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\x0e\n\x0c_destinationB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x0e\n\x0c_descriptionB\x14\n\x12_total_amount_msat\"\xd0\x04\n\x11SendonionResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x36\n\x06status\x18\x03 \x01(\x0e\x32&.cln.SendonionResponse.SendonionStatus\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x06 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\n \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0b \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x07message\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06partid\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0e \x01(\x04\x12\x1a\n\rupdated_index\x18\x0f \x01(\x04H\x08\x88\x01\x01\",\n\x0fSendonionStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\t\n\x07_partidB\x10\n\x0e_updated_index\"P\n\x11SendonionFirstHop\x12\n\n\x02id\x18\x01 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\r\n\x05\x64\x65lay\x18\x03 \x01(\r\"\xa0\x03\n\x13ListsendpaysRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12@\n\x06status\x18\x03 \x01(\x0e\x32+.cln.ListsendpaysRequest.ListsendpaysStatusH\x02\x88\x01\x01\x12>\n\x05index\x18\x04 \x01(\x0e\x32*.cln.ListsendpaysRequest.ListsendpaysIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\";\n\x12ListsendpaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"-\n\x11ListsendpaysIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\t\n\x07_bolt11B\x0f\n\r_payment_hashB\t\n\x07_statusB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListsendpaysResponse\x12+\n\x08payments\x18\x01 \x03(\x0b\x32\x19.cln.ListsendpaysPayments\"\xe5\x05\n\x14ListsendpaysPayments\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListsendpaysPayments.ListsendpaysPaymentsStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\n \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0b \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\nerroronion\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06partid\x18\x0f \x01(\x04H\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\t\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x12 \x01(\x04H\n\x88\x01\x01\"C\n\x1aListsendpaysPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\r\n\x0b_erroronionB\x0e\n\x0c_descriptionB\t\n\x07_partidB\x10\n\x0e_updated_indexB\x0f\n\r_completed_at\"\x19\n\x17ListtransactionsRequest\"S\n\x18ListtransactionsResponse\x12\x37\n\x0ctransactions\x18\x01 \x03(\x0b\x32!.cln.ListtransactionsTransactions\"\xf8\x01\n\x1cListtransactionsTransactions\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\r\n\x05rawtx\x18\x02 \x01(\x0c\x12\x13\n\x0b\x62lockheight\x18\x03 \x01(\r\x12\x0f\n\x07txindex\x18\x04 \x01(\r\x12\x10\n\x08locktime\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x37\n\x06inputs\x18\t \x03(\x0b\x32\'.cln.ListtransactionsTransactionsInputs\x12\x39\n\x07outputs\x18\n \x03(\x0b\x32(.cln.ListtransactionsTransactionsOutputs\"S\n\"ListtransactionsTransactionsInputs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\r\n\x05index\x18\x02 \x01(\r\x12\x10\n\x08sequence\x18\x03 \x01(\r\"l\n#ListtransactionsTransactionsOutputs\x12\r\n\x05index\x18\x01 \x01(\r\x12\x14\n\x0cscriptPubKey\x18\x03 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\"M\n\x11MakesecretRequest\x12\x10\n\x03hex\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x13\n\x06string\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x06\n\x04_hexB\t\n\x07_string\"$\n\x12MakesecretResponse\x12\x0e\n\x06secret\x18\x01 \x01(\x0c\"\x93\x04\n\nPayRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rmaxfeepercent\x18\x04 \x01(\x01H\x01\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x03\x88\x01\x01\x12#\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x17\n\nriskfactor\x18\x08 \x01(\x01H\x05\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\n \x03(\t\x12 \n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0c \x01(\tH\x07\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\r \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0e \x01(\x0cH\t\x88\x01\x01\x12&\n\x0cpartial_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x42\x08\n\x06_labelB\x10\n\x0e_maxfeepercentB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\x0c\n\n_exemptfeeB\r\n\x0b_riskfactorB\t\n\x07_maxfeeB\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x0f\n\r_partial_msat\"\xfb\x02\n\x0bPayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x18\n\x0b\x64\x65stination\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\r\n\x05parts\x18\x05 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\x1awarning_partial_completion\x18\x08 \x01(\tH\x01\x88\x01\x01\x12*\n\x06status\x18\t \x01(\x0e\x32\x1a.cln.PayResponse.PayStatus\"2\n\tPayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x0e\n\x0c_destinationB\x1d\n\x1b_warning_partial_completion\"*\n\x10ListnodesRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x05\n\x03_id\"7\n\x11ListnodesResponse\x12\"\n\x05nodes\x18\x01 \x03(\x0b\x32\x13.cln.ListnodesNodes\"\xb8\x02\n\x0eListnodesNodes\x12\x0e\n\x06nodeid\x18\x01 \x01(\x0c\x12\x1b\n\x0elast_timestamp\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x12\n\x05\x61lias\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05\x63olor\x18\x04 \x01(\x0cH\x02\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18\x05 \x01(\x0cH\x03\x88\x01\x01\x12/\n\taddresses\x18\x06 \x03(\x0b\x32\x1c.cln.ListnodesNodesAddresses\x12@\n\x10option_will_fund\x18\x07 \x01(\x0b\x32!.cln.ListnodesNodesOptionWillFundH\x04\x88\x01\x01\x42\x11\n\x0f_last_timestampB\x08\n\x06_aliasB\x08\n\x06_colorB\x0b\n\t_featuresB\x13\n\x11_option_will_fund\"\xf2\x01\n\x1cListnodesNodesOptionWillFund\x12(\n\x13lease_fee_base_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x17\n\x0flease_fee_basis\x18\x02 \x01(\r\x12\x16\n\x0e\x66unding_weight\x18\x03 \x01(\r\x12.\n\x19\x63hannel_fee_max_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x30\n(channel_fee_max_proportional_thousandths\x18\x05 \x01(\r\x12\x15\n\rcompact_lease\x18\x06 \x01(\x0c\"\xe8\x01\n\x17ListnodesNodesAddresses\x12K\n\titem_type\x18\x01 \x01(\x0e\x32\x38.cln.ListnodesNodesAddresses.ListnodesNodesAddressesType\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x00\x88\x01\x01\"P\n\x1bListnodesNodesAddressesType\x12\x07\n\x03\x44NS\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\n\n\x08_address\"g\n\x15WaitanyinvoiceRequest\x12\x1a\n\rlastpay_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\x10\n\x0e_lastpay_indexB\n\n\x08_timeout\"\xbc\x05\n\x16WaitanyinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12@\n\x06status\x18\x04 \x01(\x0e\x32\x30.cln.WaitanyinvoiceResponse.WaitanyinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\t \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\r \x01(\x04\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12;\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1f.cln.WaitanyinvoicePaidOutpointH\t\x88\x01\x01\"-\n\x14WaitanyinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\":\n\x1aWaitanyinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"#\n\x12WaitinvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\"\xad\x05\n\x13WaitinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.WaitinvoiceResponse.WaitinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\t \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\r \x01(\x04\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12\x38\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1c.cln.WaitinvoicePaidOutpointH\t\x88\x01\x01\"*\n\x11WaitinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"7\n\x17WaitinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\x8e\x01\n\x12WaitsendpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x13\n\x06partid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x02\x88\x01\x01\x42\t\n\x07_partidB\n\n\x08_timeoutB\n\n\x08_groupid\"\xf7\x04\n\x13WaitsendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.WaitsendpayResponse.WaitsendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0e \x01(\x01H\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0f \x01(\x04\x12\x1a\n\rupdated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\"!\n\x11WaitsendpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\x0f\n\r_completed_atB\x10\n\x0e_updated_index\"\x97\x01\n\x0eNewaddrRequest\x12@\n\x0b\x61\x64\x64resstype\x18\x01 \x01(\x0e\x32&.cln.NewaddrRequest.NewaddrAddresstypeH\x00\x88\x01\x01\"3\n\x12NewaddrAddresstype\x12\n\n\x06\x42\x45\x43H32\x10\x00\x12\x07\n\x03\x41LL\x10\x02\x12\x08\n\x04P2TR\x10\x03\x42\x0e\n\x0c_addresstype\"M\n\x0fNewaddrResponse\x12\x13\n\x06\x62\x65\x63h32\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04p2tr\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_bech32B\x07\n\x05_p2tr\"\xb9\x01\n\x0fWithdrawRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\t\x12!\n\x07satoshi\x18\x02 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\"\n\x07\x66\x65\x65rate\x18\x05 \x01(\x0b\x32\x0c.cln.FeerateH\x01\x88\x01\x01\x42\n\n\x08_minconfB\n\n\x08_feerate\":\n\x10WithdrawResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0c\n\x04psbt\x18\x03 \x01(\t\"\xaf\x03\n\x0eKeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rmaxfeepercent\x18\x04 \x01(\x01H\x01\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x03\x88\x01\x01\x12#\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12+\n\nroutehints\x18\x08 \x01(\x0b\x32\x12.cln.RoutehintListH\x05\x88\x01\x01\x12&\n\textratlvs\x18\t \x01(\x0b\x32\x0e.cln.TlvStreamH\x06\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x42\x08\n\x06_labelB\x10\n\x0e_maxfeepercentB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\x0c\n\n_exemptfeeB\r\n\x0b_routehintsB\x0c\n\n_extratlvsB\t\n\x07_maxfee\"\xf2\x02\n\x0fKeysendResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x18\n\x0b\x64\x65stination\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\r\n\x05parts\x18\x05 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\x1awarning_partial_completion\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x32\n\x06status\x18\t \x01(\x0e\x32\".cln.KeysendResponse.KeysendStatus\"\x1d\n\rKeysendStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\x0e\n\x0c_destinationB\x1d\n\x1b_warning_partial_completion\"\xa4\x03\n\x0f\x46undpsbtRequest\x12!\n\x07satoshi\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x1d\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.Feerate\x12\x13\n\x0bstartweight\x18\x03 \x01(\r\x12\x14\n\x07minconf\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07reserve\x18\x05 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08locktime\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x1f\n\x12min_witness_weight\x18\x07 \x01(\rH\x03\x88\x01\x01\x12\x1d\n\x10\x65xcess_as_change\x18\x08 \x01(\x08H\x04\x88\x01\x01\x12\x17\n\nnonwrapped\x18\t \x01(\x08H\x05\x88\x01\x01\x12#\n\x16opening_anchor_channel\x18\n \x01(\x08H\x06\x88\x01\x01\x42\n\n\x08_minconfB\n\n\x08_reserveB\x0b\n\t_locktimeB\x15\n\x13_min_witness_weightB\x13\n\x11_excess_as_changeB\r\n\x0b_nonwrappedB\x19\n\x17_opening_anchor_channel\"\xd9\x01\n\x10\x46undpsbtResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\x0e\x66\x65\x65rate_per_kw\x18\x02 \x01(\r\x12\x1e\n\x16\x65stimated_final_weight\x18\x03 \x01(\r\x12 \n\x0b\x65xcess_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1a\n\rchange_outnum\x18\x05 \x01(\rH\x00\x88\x01\x01\x12/\n\x0creservations\x18\x06 \x03(\x0b\x32\x19.cln.FundpsbtReservationsB\x10\n\x0e_change_outnum\"u\n\x14\x46undpsbtReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\"A\n\x0fSendpsbtRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x14\n\x07reserve\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_reserve\",\n\x10SendpsbtResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"1\n\x0fSignpsbtRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x10\n\x08signonly\x18\x02 \x03(\r\"\'\n\x10SignpsbtResponse\x12\x13\n\x0bsigned_psbt\x18\x01 \x01(\t\"\xa0\x03\n\x0fUtxopsbtRequest\x12!\n\x07satoshi\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x1d\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.Feerate\x12\x13\n\x0bstartweight\x18\x03 \x01(\r\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\x14\n\x07reserve\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08locktime\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1f\n\x12min_witness_weight\x18\x07 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nreservedok\x18\x08 \x01(\x08H\x03\x88\x01\x01\x12\x1d\n\x10\x65xcess_as_change\x18\t \x01(\x08H\x04\x88\x01\x01\x12#\n\x16opening_anchor_channel\x18\n \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_reserveB\x0b\n\t_locktimeB\x15\n\x13_min_witness_weightB\r\n\x0b_reservedokB\x13\n\x11_excess_as_changeB\x19\n\x17_opening_anchor_channel\"\xd9\x01\n\x10UtxopsbtResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\x0e\x66\x65\x65rate_per_kw\x18\x02 \x01(\r\x12\x1e\n\x16\x65stimated_final_weight\x18\x03 \x01(\r\x12 \n\x0b\x65xcess_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1a\n\rchange_outnum\x18\x05 \x01(\rH\x00\x88\x01\x01\x12/\n\x0creservations\x18\x06 \x03(\x0b\x32\x19.cln.UtxopsbtReservationsB\x10\n\x0e_change_outnum\"u\n\x14UtxopsbtReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\" \n\x10TxdiscardRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"6\n\x11TxdiscardResponse\x12\x13\n\x0bunsigned_tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xa4\x01\n\x10TxprepareRequest\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12 \n\x07outputs\x18\x05 \x03(\x0b\x32\x0f.cln.OutputDescB\n\n\x08_feerateB\n\n\x08_minconf\"D\n\x11TxprepareResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x13\n\x0bunsigned_tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"\x1d\n\rTxsendRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"8\n\x0eTxsendResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"\x8d\x01\n\x17ListpeerchannelsRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nchannel_id\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x05\n\x03_idB\x13\n\x11_short_channel_idB\r\n\x0b_channel_id\"K\n\x18ListpeerchannelsResponse\x12/\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1d.cln.ListpeerchannelsChannels\"\xf4\x19\n\x18ListpeerchannelsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x16\n\x0epeer_connected\x18\x02 \x01(\x08\x12 \n\x05state\x18\x03 \x01(\x0e\x32\x11.cln.ChannelState\x12\x19\n\x0cscratch_txid\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x12:\n\x07\x66\x65\x65rate\x18\x06 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFeerateH\x01\x88\x01\x01\x12\x12\n\x05owner\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x17\n\nchannel_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x19\n\x0c\x66unding_txid\x18\n \x01(\x0cH\x05\x88\x01\x01\x12\x1b\n\x0e\x66unding_outnum\x18\x0b \x01(\rH\x06\x88\x01\x01\x12\x1c\n\x0finitial_feerate\x18\x0c \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0clast_feerate\x18\r \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0cnext_feerate\x18\x0e \x01(\tH\t\x88\x01\x01\x12\x1a\n\rnext_fee_step\x18\x0f \x01(\rH\n\x88\x01\x01\x12\x37\n\x08inflight\x18\x10 \x03(\x0b\x32%.cln.ListpeerchannelsChannelsInflight\x12\x15\n\x08\x63lose_to\x18\x11 \x01(\x0cH\x0b\x88\x01\x01\x12\x14\n\x07private\x18\x12 \x01(\x08H\x0c\x88\x01\x01\x12 \n\x06opener\x18\x13 \x01(\x0e\x32\x10.cln.ChannelSide\x12%\n\x06\x63loser\x18\x14 \x01(\x0e\x32\x10.cln.ChannelSideH\r\x88\x01\x01\x12:\n\x07\x66unding\x18\x16 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFundingH\x0e\x88\x01\x01\x12$\n\nto_us_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x0f\x88\x01\x01\x12(\n\x0emin_to_us_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\x10\x88\x01\x01\x12(\n\x0emax_to_us_msat\x18\x19 \x01(\x0b\x32\x0b.cln.AmountH\x11\x88\x01\x01\x12$\n\ntotal_msat\x18\x1a \x01(\x0b\x32\x0b.cln.AmountH\x12\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x1b \x01(\x0b\x32\x0b.cln.AmountH\x13\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x1c \x01(\rH\x14\x88\x01\x01\x12)\n\x0f\x64ust_limit_msat\x18\x1d \x01(\x0b\x32\x0b.cln.AmountH\x15\x88\x01\x01\x12\x30\n\x16max_total_htlc_in_msat\x18\x1e \x01(\x0b\x32\x0b.cln.AmountH\x16\x88\x01\x01\x12,\n\x12their_reserve_msat\x18\x1f \x01(\x0b\x32\x0b.cln.AmountH\x17\x88\x01\x01\x12*\n\x10our_reserve_msat\x18 \x01(\x0b\x32\x0b.cln.AmountH\x18\x88\x01\x01\x12(\n\x0espendable_msat\x18! \x01(\x0b\x32\x0b.cln.AmountH\x19\x88\x01\x01\x12)\n\x0freceivable_msat\x18\" \x01(\x0b\x32\x0b.cln.AmountH\x1a\x88\x01\x01\x12.\n\x14minimum_htlc_in_msat\x18# \x01(\x0b\x32\x0b.cln.AmountH\x1b\x88\x01\x01\x12/\n\x15minimum_htlc_out_msat\x18$ \x01(\x0b\x32\x0b.cln.AmountH\x1c\x88\x01\x01\x12/\n\x15maximum_htlc_out_msat\x18% \x01(\x0b\x32\x0b.cln.AmountH\x1d\x88\x01\x01\x12 \n\x13their_to_self_delay\x18& \x01(\rH\x1e\x88\x01\x01\x12\x1e\n\x11our_to_self_delay\x18\' \x01(\rH\x1f\x88\x01\x01\x12\x1f\n\x12max_accepted_htlcs\x18( \x01(\rH \x88\x01\x01\x12\x36\n\x05\x61lias\x18) \x01(\x0b\x32\".cln.ListpeerchannelsChannelsAliasH!\x88\x01\x01\x12\x0e\n\x06status\x18+ \x03(\t\x12 \n\x13in_payments_offered\x18, \x01(\x04H\"\x88\x01\x01\x12)\n\x0fin_offered_msat\x18- \x01(\x0b\x32\x0b.cln.AmountH#\x88\x01\x01\x12\"\n\x15in_payments_fulfilled\x18. \x01(\x04H$\x88\x01\x01\x12+\n\x11in_fulfilled_msat\x18/ \x01(\x0b\x32\x0b.cln.AmountH%\x88\x01\x01\x12!\n\x14out_payments_offered\x18\x30 \x01(\x04H&\x88\x01\x01\x12*\n\x10out_offered_msat\x18\x31 \x01(\x0b\x32\x0b.cln.AmountH\'\x88\x01\x01\x12#\n\x16out_payments_fulfilled\x18\x32 \x01(\x04H(\x88\x01\x01\x12,\n\x12out_fulfilled_msat\x18\x33 \x01(\x0b\x32\x0b.cln.AmountH)\x88\x01\x01\x12\x31\n\x05htlcs\x18\x34 \x03(\x0b\x32\".cln.ListpeerchannelsChannelsHtlcs\x12\x1a\n\rclose_to_addr\x18\x35 \x01(\tH*\x88\x01\x01\x12\x1e\n\x11ignore_fee_limits\x18\x36 \x01(\x08H+\x88\x01\x01\x12:\n\x07updates\x18\x37 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsUpdatesH,\x88\x01\x01\x12#\n\x16last_stable_connection\x18\x38 \x01(\x04H-\x88\x01\x01\x12\x17\n\nlost_state\x18\x39 \x01(\x08H.\x88\x01\x01\x12\x1a\n\rreestablished\x18: \x01(\x08H/\x88\x01\x01\x12*\n\x10last_tx_fee_msat\x18; \x01(\x0b\x32\x0b.cln.AmountH0\x88\x01\x01\x12\x16\n\tdirection\x18< \x01(\rH1\x88\x01\x01\x12=\n#their_max_htlc_value_in_flight_msat\x18= \x01(\x0b\x32\x0b.cln.AmountH2\x88\x01\x01\x12;\n!our_max_htlc_value_in_flight_msat\x18> \x01(\x0b\x32\x0b.cln.AmountH3\x88\x01\x01\x42\x0f\n\r_scratch_txidB\n\n\x08_feerateB\x08\n\x06_ownerB\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x0f\n\r_funding_txidB\x11\n\x0f_funding_outnumB\x12\n\x10_initial_feerateB\x0f\n\r_last_feerateB\x0f\n\r_next_feerateB\x10\n\x0e_next_fee_stepB\x0b\n\t_close_toB\n\n\x08_privateB\t\n\x07_closerB\n\n\x08_fundingB\r\n\x0b_to_us_msatB\x11\n\x0f_min_to_us_msatB\x11\n\x0f_max_to_us_msatB\r\n\x0b_total_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x12\n\x10_dust_limit_msatB\x19\n\x17_max_total_htlc_in_msatB\x15\n\x13_their_reserve_msatB\x13\n\x11_our_reserve_msatB\x11\n\x0f_spendable_msatB\x12\n\x10_receivable_msatB\x17\n\x15_minimum_htlc_in_msatB\x18\n\x16_minimum_htlc_out_msatB\x18\n\x16_maximum_htlc_out_msatB\x16\n\x14_their_to_self_delayB\x14\n\x12_our_to_self_delayB\x15\n\x13_max_accepted_htlcsB\x08\n\x06_aliasB\x16\n\x14_in_payments_offeredB\x12\n\x10_in_offered_msatB\x18\n\x16_in_payments_fulfilledB\x14\n\x12_in_fulfilled_msatB\x17\n\x15_out_payments_offeredB\x13\n\x11_out_offered_msatB\x19\n\x17_out_payments_fulfilledB\x15\n\x13_out_fulfilled_msatB\x10\n\x0e_close_to_addrB\x14\n\x12_ignore_fee_limitsB\n\n\x08_updatesB\x19\n\x17_last_stable_connectionB\r\n\x0b_lost_stateB\x10\n\x0e_reestablishedB\x13\n\x11_last_tx_fee_msatB\x0c\n\n_directionB&\n$_their_max_htlc_value_in_flight_msatB$\n\"_our_max_htlc_value_in_flight_msat\"\xa7\x01\n\x1fListpeerchannelsChannelsUpdates\x12\x38\n\x05local\x18\x01 \x01(\x0b\x32).cln.ListpeerchannelsChannelsUpdatesLocal\x12?\n\x06remote\x18\x02 \x01(\x0b\x32*.cln.ListpeerchannelsChannelsUpdatesRemoteH\x00\x88\x01\x01\x42\t\n\x07_remote\"\xda\x01\n$ListpeerchannelsChannelsUpdatesLocal\x12&\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11htlc_maximum_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x11\x63ltv_expiry_delta\x18\x03 \x01(\r\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\"\xdb\x01\n%ListpeerchannelsChannelsUpdatesRemote\x12&\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11htlc_maximum_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x11\x63ltv_expiry_delta\x18\x03 \x01(\r\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\"?\n\x1fListpeerchannelsChannelsFeerate\x12\r\n\x05perkw\x18\x01 \x01(\r\x12\r\n\x05perkb\x18\x02 \x01(\r\"\xf4\x01\n ListpeerchannelsChannelsInflight\x12\x14\n\x0c\x66unding_txid\x18\x01 \x01(\x0c\x12\x16\n\x0e\x66unding_outnum\x18\x02 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x03 \x01(\t\x12\'\n\x12total_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10our_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x0cscratch_txid\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\rsplice_amount\x18\x07 \x01(\x12\x42\x0f\n\r_scratch_txid\"\xdd\x02\n\x1fListpeerchannelsChannelsFunding\x12%\n\x0bpushed_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12%\n\x10local_funds_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11remote_funds_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\rfee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\'\n\rfee_rcvd_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x11\n\x04psbt\x18\x06 \x01(\tH\x03\x88\x01\x01\x12\x15\n\x08withheld\x18\x07 \x01(\x08H\x04\x88\x01\x01\x42\x0e\n\x0c_pushed_msatB\x10\n\x0e_fee_paid_msatB\x10\n\x0e_fee_rcvd_msatB\x07\n\x05_psbtB\x0b\n\t_withheld\"]\n\x1dListpeerchannelsChannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"\xf9\x02\n\x1dListpeerchannelsChannelsHtlcs\x12\\\n\tdirection\x18\x01 \x01(\x0e\x32I.cln.ListpeerchannelsChannelsHtlcs.ListpeerchannelsChannelsHtlcsDirection\x12\n\n\x02id\x18\x02 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06\x65xpiry\x18\x04 \x01(\r\x12\x14\n\x0cpayment_hash\x18\x05 \x01(\x0c\x12\x1a\n\rlocal_trimmed\x18\x06 \x01(\x08H\x00\x88\x01\x01\x12\x13\n\x06status\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x05state\x18\x08 \x01(\x0e\x32\x0e.cln.HtlcState\"9\n&ListpeerchannelsChannelsHtlcsDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\x42\x10\n\x0e_local_trimmedB\t\n\x07_status\"3\n\x19ListclosedchannelsRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x05\n\x03_id\"[\n\x1aListclosedchannelsResponse\x12=\n\x0e\x63losedchannels\x18\x01 \x03(\x0b\x32%.cln.ListclosedchannelsClosedchannels\"\xd0\n\n ListclosedchannelsClosedchannels\x12\x14\n\x07peer_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x01\x88\x01\x01\x12>\n\x05\x61lias\x18\x04 \x01(\x0b\x32*.cln.ListclosedchannelsClosedchannelsAliasH\x02\x88\x01\x01\x12 \n\x06opener\x18\x05 \x01(\x0e\x32\x10.cln.ChannelSide\x12%\n\x06\x63loser\x18\x06 \x01(\x0e\x32\x10.cln.ChannelSideH\x03\x88\x01\x01\x12\x0f\n\x07private\x18\x07 \x01(\x08\x12\x1f\n\x17total_local_commitments\x18\t \x01(\x04\x12 \n\x18total_remote_commitments\x18\n \x01(\x04\x12\x18\n\x10total_htlcs_sent\x18\x0b \x01(\x04\x12\x14\n\x0c\x66unding_txid\x18\x0c \x01(\x0c\x12\x16\n\x0e\x66unding_outnum\x18\r \x01(\r\x12\x0e\n\x06leased\x18\x0e \x01(\x08\x12/\n\x15\x66unding_fee_paid_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12/\n\x15\x66unding_fee_rcvd_msat\x18\x10 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12-\n\x13\x66unding_pushed_msat\x18\x11 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x1f\n\ntotal_msat\x18\x12 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x66inal_to_us_msat\x18\x13 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0emin_to_us_msat\x18\x14 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0emax_to_us_msat\x18\x15 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x14last_commitment_txid\x18\x16 \x01(\x0cH\x07\x88\x01\x01\x12\x32\n\x18last_commitment_fee_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x65\n\x0b\x63lose_cause\x18\x18 \x01(\x0e\x32P.cln.ListclosedchannelsClosedchannels.ListclosedchannelsClosedchannelsCloseCause\x12#\n\x16last_stable_connection\x18\x19 \x01(\x04H\t\x88\x01\x01\x12\x19\n\x0c\x66unding_psbt\x18\x1a \x01(\tH\n\x88\x01\x01\x12\x1d\n\x10\x66unding_withheld\x18\x1b \x01(\x08H\x0b\x88\x01\x01\"u\n*ListclosedchannelsClosedchannelsCloseCause\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05LOCAL\x10\x01\x12\x08\n\x04USER\x10\x02\x12\n\n\x06REMOTE\x10\x03\x12\x0c\n\x08PROTOCOL\x10\x04\x12\x0b\n\x07ONCHAIN\x10\x05\x42\n\n\x08_peer_idB\x13\n\x11_short_channel_idB\x08\n\x06_aliasB\t\n\x07_closerB\x18\n\x16_funding_fee_paid_msatB\x18\n\x16_funding_fee_rcvd_msatB\x16\n\x14_funding_pushed_msatB\x17\n\x15_last_commitment_txidB\x1b\n\x19_last_commitment_fee_msatB\x19\n\x17_last_stable_connectionB\x0f\n\r_funding_psbtB\x13\n\x11_funding_withheld\"e\n%ListclosedchannelsClosedchannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"\x1f\n\rDecodeRequest\x12\x0e\n\x06string\x18\x01 \x01(\t\"\xf7,\n\x0e\x44\x65\x63odeResponse\x12\x31\n\titem_type\x18\x01 \x01(\x0e\x32\x1e.cln.DecodeResponse.DecodeType\x12\r\n\x05valid\x18\x02 \x01(\x08\x12\x15\n\x08offer_id\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0coffer_chains\x18\x04 \x03(\x0c\x12\x1b\n\x0eoffer_metadata\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x1b\n\x0eoffer_currency\x18\x06 \x01(\tH\x02\x88\x01\x01\x12+\n\x1ewarning_unknown_offer_currency\x18\x07 \x01(\tH\x03\x88\x01\x01\x12 \n\x13\x63urrency_minor_unit\x18\x08 \x01(\rH\x04\x88\x01\x01\x12\x19\n\x0coffer_amount\x18\t \x01(\x04H\x05\x88\x01\x01\x12+\n\x11offer_amount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x1e\n\x11offer_description\x18\x0b \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0coffer_issuer\x18\x0c \x01(\tH\x08\x88\x01\x01\x12\x1b\n\x0eoffer_features\x18\r \x01(\x0cH\t\x88\x01\x01\x12\"\n\x15offer_absolute_expiry\x18\x0e \x01(\x04H\n\x88\x01\x01\x12\x1f\n\x12offer_quantity_max\x18\x0f \x01(\x04H\x0b\x88\x01\x01\x12*\n\x0boffer_paths\x18\x10 \x03(\x0b\x32\x15.cln.DecodeOfferPaths\x12\x1a\n\roffer_node_id\x18\x11 \x01(\x0cH\x0c\x88\x01\x01\x12*\n\x1dwarning_missing_offer_node_id\x18\x14 \x01(\tH\r\x88\x01\x01\x12.\n!warning_invalid_offer_description\x18\x15 \x01(\tH\x0e\x88\x01\x01\x12.\n!warning_missing_offer_description\x18\x16 \x01(\tH\x0f\x88\x01\x01\x12+\n\x1ewarning_invalid_offer_currency\x18\x17 \x01(\tH\x10\x88\x01\x01\x12)\n\x1cwarning_invalid_offer_issuer\x18\x18 \x01(\tH\x11\x88\x01\x01\x12\x1c\n\x0finvreq_metadata\x18\x19 \x01(\x0cH\x12\x88\x01\x01\x12\x1c\n\x0finvreq_payer_id\x18\x1a \x01(\x0cH\x13\x88\x01\x01\x12\x19\n\x0cinvreq_chain\x18\x1b \x01(\x0cH\x14\x88\x01\x01\x12,\n\x12invreq_amount_msat\x18\x1c \x01(\x0b\x32\x0b.cln.AmountH\x15\x88\x01\x01\x12\x1c\n\x0finvreq_features\x18\x1d \x01(\x0cH\x16\x88\x01\x01\x12\x1c\n\x0finvreq_quantity\x18\x1e \x01(\x04H\x17\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x1f \x01(\tH\x18\x88\x01\x01\x12&\n\x19invreq_recurrence_counter\x18 \x01(\rH\x19\x88\x01\x01\x12$\n\x17invreq_recurrence_start\x18! \x01(\rH\x1a\x88\x01\x01\x12,\n\x1fwarning_missing_invreq_metadata\x18# \x01(\tH\x1b\x88\x01\x01\x12,\n\x1fwarning_missing_invreq_payer_id\x18$ \x01(\tH\x1c\x88\x01\x01\x12.\n!warning_invalid_invreq_payer_note\x18% \x01(\tH\x1d\x88\x01\x01\x12\x36\n)warning_missing_invoice_request_signature\x18& \x01(\tH\x1e\x88\x01\x01\x12\x36\n)warning_invalid_invoice_request_signature\x18\' \x01(\tH\x1f\x88\x01\x01\x12\x1f\n\x12invoice_created_at\x18) \x01(\x04H \x88\x01\x01\x12$\n\x17invoice_relative_expiry\x18* \x01(\rH!\x88\x01\x01\x12!\n\x14invoice_payment_hash\x18+ \x01(\x0cH\"\x88\x01\x01\x12-\n\x13invoice_amount_msat\x18, \x01(\x0b\x32\x0b.cln.AmountH#\x88\x01\x01\x12\x36\n\x11invoice_fallbacks\x18- \x03(\x0b\x32\x1b.cln.DecodeInvoiceFallbacks\x12\x1d\n\x10invoice_features\x18. \x01(\x0cH$\x88\x01\x01\x12\x1c\n\x0finvoice_node_id\x18/ \x01(\x0cH%\x88\x01\x01\x12(\n\x1binvoice_recurrence_basetime\x18\x30 \x01(\x04H&\x88\x01\x01\x12*\n\x1dwarning_missing_invoice_paths\x18\x32 \x01(\tH\'\x88\x01\x01\x12/\n\"warning_missing_invoice_blindedpay\x18\x33 \x01(\tH(\x88\x01\x01\x12/\n\"warning_missing_invoice_created_at\x18\x34 \x01(\tH)\x88\x01\x01\x12\x31\n$warning_missing_invoice_payment_hash\x18\x35 \x01(\tH*\x88\x01\x01\x12+\n\x1ewarning_missing_invoice_amount\x18\x36 \x01(\tH+\x88\x01\x01\x12\x38\n+warning_missing_invoice_recurrence_basetime\x18\x37 \x01(\tH,\x88\x01\x01\x12,\n\x1fwarning_missing_invoice_node_id\x18\x38 \x01(\tH-\x88\x01\x01\x12.\n!warning_missing_invoice_signature\x18\x39 \x01(\tH.\x88\x01\x01\x12.\n!warning_invalid_invoice_signature\x18: \x01(\tH/\x88\x01\x01\x12\'\n\tfallbacks\x18; \x03(\x0b\x32\x14.cln.DecodeFallbacks\x12\x17\n\ncreated_at\x18< \x01(\x04H0\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18= \x01(\x04H1\x88\x01\x01\x12\x12\n\x05payee\x18> \x01(\x0cH2\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18? \x01(\x0cH3\x88\x01\x01\x12\x1d\n\x10\x64\x65scription_hash\x18@ \x01(\x0cH4\x88\x01\x01\x12\"\n\x15min_final_cltv_expiry\x18\x41 \x01(\rH5\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x42 \x01(\x0cH6\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x43 \x01(\x0cH7\x88\x01\x01\x12\x1f\n\x05\x65xtra\x18\x45 \x03(\x0b\x32\x10.cln.DecodeExtra\x12\x16\n\tunique_id\x18\x46 \x01(\tH8\x88\x01\x01\x12\x14\n\x07version\x18G \x01(\tH9\x88\x01\x01\x12\x13\n\x06string\x18H \x01(\tH:\x88\x01\x01\x12-\n\x0crestrictions\x18I \x03(\x0b\x32\x17.cln.DecodeRestrictions\x12&\n\x19warning_rune_invalid_utf8\x18J \x01(\tH;\x88\x01\x01\x12\x10\n\x03hex\x18K \x01(\x0cH<\x88\x01\x01\x12\x16\n\tdecrypted\x18L \x01(\x0cH=\x88\x01\x01\x12\x16\n\tsignature\x18M \x01(\tH>\x88\x01\x01\x12\x15\n\x08\x63urrency\x18N \x01(\tH?\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18O \x01(\x0b\x32\x0b.cln.AmountH@\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18P \x01(\tHA\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18Q \x01(\x0cHB\x88\x01\x01\x12-\n\x06routes\x18R \x01(\x0b\x32\x18.cln.DecodeRoutehintListHC\x88\x01\x01\x12\x1c\n\x0foffer_issuer_id\x18S \x01(\x0cHD\x88\x01\x01\x12,\n\x1fwarning_missing_offer_issuer_id\x18T \x01(\tHE\x88\x01\x01\x12,\n\x0cinvreq_paths\x18U \x03(\x0b\x32\x16.cln.DecodeInvreqPaths\x12\'\n\x1awarning_empty_blinded_path\x18V \x01(\tHF\x88\x01\x01\x12=\n\x13invreq_bip_353_name\x18W \x01(\x0b\x32\x1b.cln.DecodeInvreqBip353NameHG\x88\x01\x01\x12\x35\n(warning_invreq_bip_353_name_name_invalid\x18X \x01(\tHH\x88\x01\x01\x12\x37\n*warning_invreq_bip_353_name_domain_invalid\x18Y \x01(\tHI\x88\x01\x01\x12%\n\x18invreq_recurrence_cancel\x18Z \x01(\x08HJ\x88\x01\x01\x12=\n0warning_invreq_recurrence_cancel_without_counter\x18[ \x01(\tHK\x88\x01\x01\x12?\n2warning_invreq_recurrence_cancel_with_zero_counter\x18\\ \x01(\tHL\x88\x01\x01\x12\x1b\n\x0eproof_preimage\x18] \x01(\x0cHM\x88\x01\x01\x12\x1a\n\x12proof_omitted_tlvs\x18^ \x03(\x04\x12\x1c\n\x14proof_missing_hashes\x18_ \x03(\x0c\x12\x19\n\x11proof_leaf_hashes\x18` \x03(\x0c\x12\x17\n\nproof_note\x18\x61 \x01(\tHN\x88\x01\x01\x12\x1c\n\x0fproof_signature\x18\x62 \x01(\tHO\x88\x01\x01\x12\x42\n\x18unknown_payer_proof_tlvs\x18\x63 \x03(\x0b\x32 .cln.DecodeUnknownPayerProofTlvs\"\x9b\x01\n\nDecodeType\x12\x10\n\x0c\x42OLT12_OFFER\x10\x00\x12\x12\n\x0e\x42OLT12_INVOICE\x10\x01\x12\x1a\n\x16\x42OLT12_INVOICE_REQUEST\x10\x02\x12\x12\n\x0e\x42OLT11_INVOICE\x10\x03\x12\x08\n\x04RUNE\x10\x04\x12\x15\n\x11\x45MERGENCY_RECOVER\x10\x05\x12\x16\n\x12\x42OLT12_PAYER_PROOF\x10\x06\x42\x0b\n\t_offer_idB\x11\n\x0f_offer_metadataB\x11\n\x0f_offer_currencyB!\n\x1f_warning_unknown_offer_currencyB\x16\n\x14_currency_minor_unitB\x0f\n\r_offer_amountB\x14\n\x12_offer_amount_msatB\x14\n\x12_offer_descriptionB\x0f\n\r_offer_issuerB\x11\n\x0f_offer_featuresB\x18\n\x16_offer_absolute_expiryB\x15\n\x13_offer_quantity_maxB\x10\n\x0e_offer_node_idB \n\x1e_warning_missing_offer_node_idB$\n\"_warning_invalid_offer_descriptionB$\n\"_warning_missing_offer_descriptionB!\n\x1f_warning_invalid_offer_currencyB\x1f\n\x1d_warning_invalid_offer_issuerB\x12\n\x10_invreq_metadataB\x12\n\x10_invreq_payer_idB\x0f\n\r_invreq_chainB\x15\n\x13_invreq_amount_msatB\x12\n\x10_invreq_featuresB\x12\n\x10_invreq_quantityB\x14\n\x12_invreq_payer_noteB\x1c\n\x1a_invreq_recurrence_counterB\x1a\n\x18_invreq_recurrence_startB\"\n _warning_missing_invreq_metadataB\"\n _warning_missing_invreq_payer_idB$\n\"_warning_invalid_invreq_payer_noteB,\n*_warning_missing_invoice_request_signatureB,\n*_warning_invalid_invoice_request_signatureB\x15\n\x13_invoice_created_atB\x1a\n\x18_invoice_relative_expiryB\x17\n\x15_invoice_payment_hashB\x16\n\x14_invoice_amount_msatB\x13\n\x11_invoice_featuresB\x12\n\x10_invoice_node_idB\x1e\n\x1c_invoice_recurrence_basetimeB \n\x1e_warning_missing_invoice_pathsB%\n#_warning_missing_invoice_blindedpayB%\n#_warning_missing_invoice_created_atB\'\n%_warning_missing_invoice_payment_hashB!\n\x1f_warning_missing_invoice_amountB.\n,_warning_missing_invoice_recurrence_basetimeB\"\n _warning_missing_invoice_node_idB$\n\"_warning_missing_invoice_signatureB$\n\"_warning_invalid_invoice_signatureB\r\n\x0b_created_atB\t\n\x07_expiryB\x08\n\x06_payeeB\x0f\n\r_payment_hashB\x13\n\x11_description_hashB\x18\n\x16_min_final_cltv_expiryB\x11\n\x0f_payment_secretB\x13\n\x11_payment_metadataB\x0c\n\n_unique_idB\n\n\x08_versionB\t\n\x07_stringB\x1c\n\x1a_warning_rune_invalid_utf8B\x06\n\x04_hexB\x0c\n\n_decryptedB\x0c\n\n_signatureB\x0b\n\t_currencyB\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x0b\n\t_featuresB\t\n\x07_routesB\x12\n\x10_offer_issuer_idB\"\n _warning_missing_offer_issuer_idB\x1d\n\x1b_warning_empty_blinded_pathB\x16\n\x14_invreq_bip_353_nameB+\n)_warning_invreq_bip_353_name_name_invalidB-\n+_warning_invreq_bip_353_name_domain_invalidB\x1b\n\x19_invreq_recurrence_cancelB3\n1_warning_invreq_recurrence_cancel_without_counterB5\n3_warning_invreq_recurrence_cancel_with_zero_counterB\x11\n\x0f_proof_preimageB\r\n\x0b_proof_noteB\x12\n\x10_proof_signature\"\xec\x01\n\x10\x44\x65\x63odeOfferPaths\x12\x1a\n\rfirst_node_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\x08\x62linding\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x1b\n\x0e\x66irst_scid_dir\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0e\x66irst_path_key\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x42\x10\n\x0e_first_node_idB\x0b\n\t_blindingB\x11\n\x0f_first_scid_dirB\r\n\x0b_first_scidB\x11\n\x0f_first_path_key\"\x89\x01\n\x1e\x44\x65\x63odeOfferRecurrencePaywindow\x12\x16\n\x0eseconds_before\x18\x01 \x01(\r\x12\x15\n\rseconds_after\x18\x02 \x01(\r\x12 \n\x13proportional_amount\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x16\n\x14_proportional_amount\"\x97\x02\n\x11\x44\x65\x63odeInvreqPaths\x12\x1b\n\x0e\x66irst_scid_dir\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08\x62linding\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x1a\n\rfirst_node_id\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x04 \x01(\tH\x03\x88\x01\x01\x12(\n\x04path\x18\x05 \x03(\x0b\x32\x1a.cln.DecodeInvreqPathsPath\x12\x1b\n\x0e\x66irst_path_key\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x42\x11\n\x0f_first_scid_dirB\x0b\n\t_blindingB\x10\n\x0e_first_node_idB\r\n\x0b_first_scidB\x11\n\x0f_first_path_key\"R\n\x15\x44\x65\x63odeInvreqPathsPath\x12\x17\n\x0f\x62linded_node_id\x18\x01 \x01(\x0c\x12 \n\x18\x65ncrypted_recipient_data\x18\x02 \x01(\x0c\"T\n\x16\x44\x65\x63odeInvreqBip353Name\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x64omain\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x07\n\x05_nameB\t\n\x07_domain\"S\n\x16\x44\x65\x63odeInvoicePathsPath\x12\x17\n\x0f\x62linded_node_id\x18\x01 \x01(\x0c\x12 \n\x18\x65ncrypted_recipient_data\x18\x02 \x01(\x0c\"X\n\x16\x44\x65\x63odeInvoiceFallbacks\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x0b\n\x03hex\x18\x02 \x01(\x0c\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_address\"\xaa\x02\n\x0f\x44\x65\x63odeFallbacks\x12\x36\n)warning_invoice_fallbacks_version_invalid\x18\x01 \x01(\tH\x00\x88\x01\x01\x12;\n\titem_type\x18\x02 \x01(\x0e\x32(.cln.DecodeFallbacks.DecodeFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0b\n\x03hex\x18\x04 \x01(\x0c\"K\n\x13\x44\x65\x63odeFallbacksType\x12\t\n\x05P2PKH\x10\x00\x12\x08\n\x04P2SH\x10\x01\x12\n\n\x06P2WPKH\x10\x02\x12\t\n\x05P2WSH\x10\x03\x12\x08\n\x04P2TR\x10\x04\x42,\n*_warning_invoice_fallbacks_version_invalidB\x07\n\x05_addr\"(\n\x0b\x44\x65\x63odeExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"O\n\x1b\x44\x65\x63odeUnknownPayerProofTlvs\x12\x11\n\titem_type\x18\x01 \x01(\x04\x12\x0e\n\x06length\x18\x02 \x01(\x04\x12\r\n\x05value\x18\x03 \x01(\x0c\";\n\x12\x44\x65\x63odeRestrictions\x12\x14\n\x0c\x61lternatives\x18\x01 \x03(\t\x12\x0f\n\x07summary\x18\x02 \x01(\t\"\xc2\x01\n\rDelpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12/\n\x06status\x18\x02 \x01(\x0e\x32\x1f.cln.DelpayRequest.DelpayStatus\x12\x13\n\x06partid\x18\x03 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x01\x88\x01\x01\"(\n\x0c\x44\x65lpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x42\t\n\x07_partidB\n\n\x08_groupid\"7\n\x0e\x44\x65lpayResponse\x12%\n\x08payments\x18\x01 \x03(\x0b\x32\x13.cln.DelpayPayments\"\xb4\x05\n\x0e\x44\x65lpayPayments\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x38\n\x06status\x18\x04 \x01(\x0e\x32(.cln.DelpayPayments.DelpayPaymentsStatus\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\t \x01(\x04\x12\x1a\n\rupdated_index\x18\n \x01(\x04H\x03\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12\x14\n\x07groupid\x18\x0c \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x08\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\t\x88\x01\x01\x12\x17\n\nerroronion\x18\x11 \x01(\x0cH\n\x88\x01\x01\"=\n\x14\x44\x65lpayPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x10\n\x0e_updated_indexB\x0f\n\r_completed_atB\n\n\x08_groupidB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\r\n\x0b_erroronion\"\xb3\x01\n\x11\x44\x65lforwardRequest\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x12\n\nin_htlc_id\x18\x02 \x01(\x04\x12\x37\n\x06status\x18\x03 \x01(\x0e\x32\'.cln.DelforwardRequest.DelforwardStatus\"=\n\x10\x44\x65lforwardStatus\x12\x0b\n\x07SETTLED\x10\x00\x12\x10\n\x0cLOCAL_FAILED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"\x14\n\x12\x44\x65lforwardResponse\"\'\n\x13\x44isableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\xdc\x01\n\x14\x44isableofferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"&\n\x12\x45nableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\xdb\x01\n\x13\x45nableofferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"=\n\x11\x44isconnectRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\x05\x66orce\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x08\n\x06_force\"\x14\n\x12\x44isconnectResponse\"k\n\x0f\x46\x65\x65ratesRequest\x12\x31\n\x05style\x18\x01 \x01(\x0e\x32\".cln.FeeratesRequest.FeeratesStyle\"%\n\rFeeratesStyle\x12\t\n\x05PERKB\x10\x00\x12\t\n\x05PERKW\x10\x01\"\x9a\x02\n\x10\x46\x65\x65ratesResponse\x12%\n\x18warning_missing_feerates\x18\x01 \x01(\tH\x00\x88\x01\x01\x12&\n\x05perkb\x18\x02 \x01(\x0b\x32\x12.cln.FeeratesPerkbH\x01\x88\x01\x01\x12&\n\x05perkw\x18\x03 \x01(\x0b\x32\x12.cln.FeeratesPerkwH\x02\x88\x01\x01\x12\x44\n\x15onchain_fee_estimates\x18\x04 \x01(\x0b\x32 .cln.FeeratesOnchainFeeEstimatesH\x03\x88\x01\x01\x42\x1b\n\x19_warning_missing_feeratesB\x08\n\x06_perkbB\x08\n\x06_perkwB\x18\n\x16_onchain_fee_estimates\"\xe4\x03\n\rFeeratesPerkb\x12\x16\n\x0emin_acceptable\x18\x01 \x01(\r\x12\x16\n\x0emax_acceptable\x18\x02 \x01(\r\x12\x14\n\x07opening\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmutual_close\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1d\n\x10unilateral_close\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x1a\n\rdelayed_to_us\x18\x06 \x01(\rH\x03\x88\x01\x01\x12\x1c\n\x0fhtlc_resolution\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x14\n\x07penalty\x18\x08 \x01(\rH\x05\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkbEstimates\x12\r\n\x05\x66loor\x18\n \x01(\r\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x06\x88\x01\x01\x12\x13\n\x06splice\x18\x0c \x01(\rH\x07\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\x10\n\x0e_delayed_to_usB\x12\n\x10_htlc_resolutionB\n\n\x08_penaltyB\x1a\n\x18_unilateral_anchor_closeB\t\n\x07_splice\"W\n\x16\x46\x65\x65ratesPerkbEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"\xe4\x03\n\rFeeratesPerkw\x12\x16\n\x0emin_acceptable\x18\x01 \x01(\r\x12\x16\n\x0emax_acceptable\x18\x02 \x01(\r\x12\x14\n\x07opening\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmutual_close\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1d\n\x10unilateral_close\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x1a\n\rdelayed_to_us\x18\x06 \x01(\rH\x03\x88\x01\x01\x12\x1c\n\x0fhtlc_resolution\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x14\n\x07penalty\x18\x08 \x01(\rH\x05\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkwEstimates\x12\r\n\x05\x66loor\x18\n \x01(\r\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x06\x88\x01\x01\x12\x13\n\x06splice\x18\x0c \x01(\rH\x07\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\x10\n\x0e_delayed_to_usB\x12\n\x10_htlc_resolutionB\n\n\x08_penaltyB\x1a\n\x18_unilateral_anchor_closeB\t\n\x07_splice\"W\n\x16\x46\x65\x65ratesPerkwEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"\x99\x02\n\x1b\x46\x65\x65ratesOnchainFeeEstimates\x12 \n\x18opening_channel_satoshis\x18\x01 \x01(\x04\x12\x1d\n\x15mutual_close_satoshis\x18\x02 \x01(\x04\x12!\n\x19unilateral_close_satoshis\x18\x03 \x01(\x04\x12\x1d\n\x15htlc_timeout_satoshis\x18\x04 \x01(\x04\x12\x1d\n\x15htlc_success_satoshis\x18\x05 \x01(\x04\x12\x30\n#unilateral_close_nonanchor_satoshis\x18\x06 \x01(\x04H\x00\x88\x01\x01\x42&\n$_unilateral_close_nonanchor_satoshis\"%\n\x12\x46\x65tchbip353Request\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"X\n\x13\x46\x65tchbip353Response\x12\r\n\x05proof\x18\x01 \x01(\t\x12\x32\n\x0cinstructions\x18\x02 \x03(\x0b\x32\x1c.cln.Fetchbip353Instructions\"\xf7\x01\n\x17\x46\x65tchbip353Instructions\x12\x18\n\x0b\x64\x65scription\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05offer\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07onchain\x18\x03 \x01(\tH\x02\x88\x01\x01\x12!\n\x14offchain_amount_msat\x18\x04 \x01(\x04H\x03\x88\x01\x01\x12\x1f\n\x12onchain_amount_sat\x18\x05 \x01(\x04H\x04\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x08\n\x06_offerB\n\n\x08_onchainB\x17\n\x15_offchain_amount_msatB\x15\n\x13_onchain_amount_sat\"\xb9\x03\n\x13\x46\x65tchinvoiceRequest\x12\r\n\x05offer\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x15\n\x08quantity\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x1f\n\x12recurrence_counter\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x10recurrence_start\x18\x05 \x01(\x01H\x03\x88\x01\x01\x12\x1d\n\x10recurrence_label\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x14\n\x07timeout\x18\x07 \x01(\x01H\x05\x88\x01\x01\x12\x17\n\npayer_note\x18\x08 \x01(\tH\x06\x88\x01\x01\x12\x1b\n\x0epayer_metadata\x18\t \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62ip353\x18\n \x01(\tH\x08\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0b\n\t_quantityB\x15\n\x13_recurrence_counterB\x13\n\x11_recurrence_startB\x13\n\x11_recurrence_labelB\n\n\x08_timeoutB\r\n\x0b_payer_noteB\x11\n\x0f_payer_metadataB\t\n\x07_bip353\"\x99\x01\n\x14\x46\x65tchinvoiceResponse\x12\x0f\n\x07invoice\x18\x01 \x01(\t\x12)\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x18.cln.FetchinvoiceChanges\x12\x35\n\x0bnext_period\x18\x03 \x01(\x0b\x32\x1b.cln.FetchinvoiceNextPeriodH\x00\x88\x01\x01\x42\x0e\n\x0c_next_period\"\x82\x02\n\x13\x46\x65tchinvoiceChanges\x12!\n\x14\x64\x65scription_appended\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0evendor_removed\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06vendor\x18\x04 \x01(\tH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x42\x17\n\x15_description_appendedB\x0e\n\x0c_descriptionB\x11\n\x0f_vendor_removedB\t\n\x07_vendorB\x0e\n\x0c_amount_msat\"}\n\x16\x46\x65tchinvoiceNextPeriod\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x04\x12\x11\n\tstarttime\x18\x02 \x01(\x04\x12\x0f\n\x07\x65ndtime\x18\x03 \x01(\x04\x12\x17\n\x0fpaywindow_start\x18\x04 \x01(\x04\x12\x15\n\rpaywindow_end\x18\x05 \x01(\x04\"\xe0\x01\n\x1d\x43\x61ncelrecurringinvoiceRequest\x12\r\n\x05offer\x18\x01 \x01(\t\x12\x1a\n\x12recurrence_counter\x18\x02 \x01(\x04\x12\x18\n\x10recurrence_label\x18\x03 \x01(\t\x12\x1d\n\x10recurrence_start\x18\x04 \x01(\x01H\x00\x88\x01\x01\x12\x17\n\npayer_note\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62ip353\x18\x06 \x01(\tH\x02\x88\x01\x01\x42\x13\n\x11_recurrence_startB\r\n\x0b_payer_noteB\t\n\x07_bip353\"0\n\x1e\x43\x61ncelrecurringinvoiceResponse\x12\x0e\n\x06\x62olt12\x18\x01 \x01(\t\"&\n\x18\x46undchannelCancelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\".\n\x19\x46undchannelCancelResponse\x12\x11\n\tcancelled\x18\x01 \x01(\t\"Z\n\x1a\x46undchannelCompleteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x15\n\x08withhold\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x0b\n\t_withhold\"N\n\x1b\x46undchannelCompleteResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\"\xfb\x03\n\x12\x46undchannelRequest\x12 \n\x06\x61mount\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12#\n\tpush_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\tH\x03\x88\x01\x01\x12%\n\x0brequest_amt\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x08 \x01(\tH\x05\x88\x01\x01\x12\n\n\x02id\x18\t \x01(\x0c\x12\x14\n\x07minconf\x18\n \x01(\rH\x06\x88\x01\x01\x12\x1c\n\x05utxos\x18\x0b \x03(\x0b\x32\r.cln.Outpoint\x12\x15\n\x08mindepth\x18\x0c \x01(\rH\x07\x88\x01\x01\x12!\n\x07reserve\x18\r \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\x0e \x03(\rB\n\n\x08_feerateB\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\n\n\x08_minconfB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xce\x01\n\x13\x46undchannelResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0e\n\x06outnum\x18\x03 \x01(\r\x12\x12\n\nchannel_id\x18\x04 \x01(\x0c\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\x08mindepth\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x31\n\x0c\x63hannel_type\x18\x07 \x01(\x0b\x32\x1b.cln.FundchannelChannelTypeB\x0b\n\t_close_toB\x0b\n\t_mindepth\"K\n\x16\x46undchannelChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\xd6\x02\n\x17\x46undchannelStartRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1b\n\x06\x61mount\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\x07\x66\x65\x65rate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\tH\x02\x88\x01\x01\x12#\n\tpush_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08mindepth\x18\x07 \x01(\rH\x04\x88\x01\x01\x12!\n\x07reserve\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\t \x03(\rB\n\n\x08_feerateB\x0b\n\t_announceB\x0b\n\t_close_toB\x0c\n\n_push_msatB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xf6\x01\n\x18\x46undchannelStartResponse\x12\x17\n\x0f\x66unding_address\x18\x01 \x01(\t\x12\x14\n\x0cscriptpubkey\x18\x02 \x01(\x0c\x12;\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32 .cln.FundchannelStartChannelTypeH\x00\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x12\x15\n\rwarning_usage\x18\x05 \x01(\t\x12\x15\n\x08mindepth\x18\x06 \x01(\rH\x02\x88\x01\x01\x42\x0f\n\r_channel_typeB\x0b\n\t_close_toB\x0b\n\t_mindepth\"P\n\x1b\x46undchannelStartChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x9d\x01\n\rGetlogRequest\x12\x32\n\x05level\x18\x01 \x01(\x0e\x32\x1e.cln.GetlogRequest.GetlogLevelH\x00\x88\x01\x01\"N\n\x0bGetlogLevel\x12\n\n\x06\x42ROKEN\x10\x00\x12\x0b\n\x07UNUSUAL\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\t\n\x05\x44\x45\x42UG\x10\x03\x12\x06\n\x02IO\x10\x04\x12\t\n\x05TRACE\x10\x05\x42\x08\n\x06_level\"h\n\x0eGetlogResponse\x12\x12\n\ncreated_at\x18\x01 \x01(\t\x12\x12\n\nbytes_used\x18\x02 \x01(\r\x12\x11\n\tbytes_max\x18\x03 \x01(\r\x12\x1b\n\x03log\x18\x04 \x03(\x0b\x32\x0e.cln.GetlogLog\"\xe8\x02\n\tGetlogLog\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.GetlogLog.GetlogLogType\x12\x18\n\x0bnum_skipped\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04time\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03log\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07node_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x11\n\x04\x64\x61ta\x18\x07 \x01(\x0cH\x05\x88\x01\x01\"l\n\rGetlogLogType\x12\x0b\n\x07SKIPPED\x10\x00\x12\n\n\x06\x42ROKEN\x10\x01\x12\x0b\n\x07UNUSUAL\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\t\n\x05IO_IN\x10\x05\x12\n\n\x06IO_OUT\x10\x06\x12\t\n\x05TRACE\x10\x07\x42\x0e\n\x0c_num_skippedB\x07\n\x05_timeB\t\n\x07_sourceB\x06\n\x04_logB\n\n\x08_node_idB\x07\n\x05_data\"\xd9\x08\n\x13\x46underupdateRequest\x12@\n\x06policy\x18\x01 \x01(\x0e\x32+.cln.FunderupdateRequest.FunderupdatePolicyH\x00\x88\x01\x01\x12$\n\npolicy_mod\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0bleases_only\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12\x30\n\x16min_their_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x30\n\x16max_their_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12.\n\x14per_channel_min_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12.\n\x14per_channel_max_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12+\n\x11reserve_tank_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x12\x19\n\x0c\x66uzz_percent\x18\t \x01(\rH\x08\x88\x01\x01\x12\x1d\n\x10\x66und_probability\x18\n \x01(\rH\t\x88\x01\x01\x12-\n\x13lease_fee_base_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x12\x1c\n\x0flease_fee_basis\x18\x0c \x01(\rH\x0b\x88\x01\x01\x12\x1b\n\x0e\x66unding_weight\x18\r \x01(\rH\x0c\x88\x01\x01\x12\x33\n\x19\x63hannel_fee_max_base_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\r\x88\x01\x01\x12\x35\n(channel_fee_max_proportional_thousandths\x18\x0f \x01(\rH\x0e\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x10 \x01(\x0cH\x0f\x88\x01\x01\"9\n\x12\x46underupdatePolicy\x12\t\n\x05MATCH\x10\x00\x12\r\n\tAVAILABLE\x10\x01\x12\t\n\x05\x46IXED\x10\x02\x42\t\n\x07_policyB\r\n\x0b_policy_modB\x0e\n\x0c_leases_onlyB\x19\n\x17_min_their_funding_msatB\x19\n\x17_max_their_funding_msatB\x17\n\x15_per_channel_min_msatB\x17\n\x15_per_channel_max_msatB\x14\n\x12_reserve_tank_msatB\x0f\n\r_fuzz_percentB\x13\n\x11_fund_probabilityB\x16\n\x14_lease_fee_base_msatB\x12\n\x10_lease_fee_basisB\x11\n\x0f_funding_weightB\x1c\n\x1a_channel_fee_max_base_msatB+\n)_channel_fee_max_proportional_thousandthsB\x10\n\x0e_compact_lease\"\xdf\x06\n\x14\x46underupdateResponse\x12\x0f\n\x07summary\x18\x01 \x01(\t\x12<\n\x06policy\x18\x02 \x01(\x0e\x32,.cln.FunderupdateResponse.FunderupdatePolicy\x12\x12\n\npolicy_mod\x18\x03 \x01(\r\x12\x13\n\x0bleases_only\x18\x04 \x01(\x08\x12+\n\x16min_their_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x16max_their_funding_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12)\n\x14per_channel_min_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12)\n\x14per_channel_max_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11reserve_tank_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66uzz_percent\x18\n \x01(\r\x12\x18\n\x10\x66und_probability\x18\x0b \x01(\r\x12-\n\x13lease_fee_base_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x1c\n\x0flease_fee_basis\x18\r \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0e\x66unding_weight\x18\x0e \x01(\rH\x02\x88\x01\x01\x12\x33\n\x19\x63hannel_fee_max_base_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x35\n(channel_fee_max_proportional_thousandths\x18\x10 \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x11 \x01(\x0cH\x05\x88\x01\x01\"9\n\x12\x46underupdatePolicy\x12\t\n\x05MATCH\x10\x00\x12\r\n\tAVAILABLE\x10\x01\x12\t\n\x05\x46IXED\x10\x02\x42\x16\n\x14_lease_fee_base_msatB\x12\n\x10_lease_fee_basisB\x11\n\x0f_funding_weightB\x1c\n\x1a_channel_fee_max_base_msatB+\n)_channel_fee_max_proportional_thousandthsB\x10\n\x0e_compact_lease\"\xec\x01\n\x0fGetrouteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\nriskfactor\x18\x03 \x01(\x04\x12\x11\n\x04\x63ltv\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x13\n\x06\x66romid\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x66uzzpercent\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\x07 \x03(\t\x12\x14\n\x07maxhops\x18\x08 \x01(\rH\x03\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountB\x07\n\x05_cltvB\t\n\x07_fromidB\x0e\n\x0c_fuzzpercentB\n\n\x08_maxhops\"5\n\x10GetrouteResponse\x12!\n\x05route\x18\x01 \x03(\x0b\x32\x12.cln.GetrouteRoute\"\xc5\x01\n\rGetrouteRoute\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x11\n\tdirection\x18\x03 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\r\n\x05\x64\x65lay\x18\x05 \x01(\r\x12\x34\n\x05style\x18\x06 \x01(\x0e\x32%.cln.GetrouteRoute.GetrouteRouteStyle\"\x1d\n\x12GetrouteRouteStyle\x12\x07\n\x03TLV\x10\x00\"t\n\x14ListaddressesRequest\x12\x14\n\x07\x61\x64\x64ress\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05start\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\x42\n\n\x08_addressB\x08\n\x06_startB\x08\n\x06_limit\"G\n\x15ListaddressesResponse\x12.\n\taddresses\x18\x01 \x03(\x0b\x32\x1b.cln.ListaddressesAddresses\"d\n\x16ListaddressesAddresses\x12\x0e\n\x06keyidx\x18\x01 \x01(\x04\x12\x13\n\x06\x62\x65\x63h32\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04p2tr\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_bech32B\x07\n\x05_p2tr\"\xb7\x03\n\x13ListforwardsRequest\x12@\n\x06status\x18\x01 \x01(\x0e\x32+.cln.ListforwardsRequest.ListforwardsStatusH\x00\x88\x01\x01\x12\x17\n\nin_channel\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bout_channel\x18\x03 \x01(\tH\x02\x88\x01\x01\x12>\n\x05index\x18\x04 \x01(\x0e\x32*.cln.ListforwardsRequest.ListforwardsIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\"L\n\x12ListforwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"-\n\x11ListforwardsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\t\n\x07_statusB\r\n\x0b_in_channelB\x0e\n\x0c_out_channelB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListforwardsResponse\x12+\n\x08\x66orwards\x18\x01 \x03(\x0b\x32\x19.cln.ListforwardsForwards\"\x9d\x06\n\x14ListforwardsForwards\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x1c\n\x07in_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x44\n\x06status\x18\x03 \x01(\x0e\x32\x34.cln.ListforwardsForwards.ListforwardsForwardsStatus\x12\x15\n\rreceived_time\x18\x04 \x01(\x01\x12\x18\n\x0bout_channel\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\"\n\x08out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12G\n\x05style\x18\t \x01(\x0e\x32\x33.cln.ListforwardsForwards.ListforwardsForwardsStyleH\x03\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x18\n\x0bout_htlc_id\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0c \x01(\x04\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rresolved_time\x18\x0e \x01(\x01H\x07\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x0f \x01(\rH\x08\x88\x01\x01\x12\x17\n\nfailreason\x18\x10 \x01(\tH\t\x88\x01\x01\"T\n\x1aListforwardsForwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"0\n\x19ListforwardsForwardsStyle\x12\n\n\x06LEGACY\x10\x00\x12\x07\n\x03TLV\x10\x01\x42\x0e\n\x0c_out_channelB\x0b\n\t_fee_msatB\x0b\n\t_out_msatB\x08\n\x06_styleB\r\n\x0b_in_htlc_idB\x0e\n\x0c_out_htlc_idB\x10\n\x0e_updated_indexB\x10\n\x0e_resolved_timeB\x0b\n\t_failcodeB\r\n\x0b_failreason\"a\n\x11ListoffersRequest\x12\x15\n\x08offer_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0b\n\t_offer_idB\x0e\n\x0c_active_only\";\n\x12ListoffersResponse\x12%\n\x06offers\x18\x01 \x03(\x0b\x32\x15.cln.ListoffersOffers\"\xd8\x01\n\x10ListoffersOffers\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"\x84\x03\n\x0fListpaysRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x38\n\x06status\x18\x03 \x01(\x0e\x32#.cln.ListpaysRequest.ListpaysStatusH\x02\x88\x01\x01\x12\x36\n\x05index\x18\x04 \x01(\x0e\x32\".cln.ListpaysRequest.ListpaysIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\"7\n\x0eListpaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\")\n\rListpaysIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\t\n\x07_bolt11B\x0f\n\r_payment_hashB\t\n\x07_statusB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"3\n\x10ListpaysResponse\x12\x1f\n\x04pays\x18\x01 \x03(\x0b\x32\x11.cln.ListpaysPays\"\xdb\x05\n\x0cListpaysPays\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x34\n\x06status\x18\x02 \x01(\x0e\x32$.cln.ListpaysPays.ListpaysPaysStatus\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\ncreated_at\x18\x04 \x01(\x04\x12\x12\n\x05label\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12*\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x17\n\nerroronion\x18\n \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0b \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0c \x01(\x04H\x08\x88\x01\x01\x12\x15\n\x08preimage\x18\r \x01(\x0cH\t\x88\x01\x01\x12\x1c\n\x0fnumber_of_parts\x18\x0e \x01(\x04H\n\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x0f \x01(\x04H\x0b\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x10 \x01(\x04H\x0c\x88\x01\x01\";\n\x12ListpaysPaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x13\n\x11_amount_sent_msatB\r\n\x0b_erroronionB\x0e\n\x0c_descriptionB\x0f\n\r_completed_atB\x0b\n\t_preimageB\x12\n\x10_number_of_partsB\x10\n\x0e_created_indexB\x10\n\x0e_updated_index\"\xd6\x01\n\x10ListhtlcsRequest\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x38\n\x05index\x18\x02 \x01(\x0e\x32$.cln.ListhtlcsRequest.ListhtlcsIndexH\x01\x88\x01\x01\x12\x12\n\x05start\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12\x12\n\x05limit\x18\x04 \x01(\rH\x03\x88\x01\x01\"*\n\x0eListhtlcsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\x05\n\x03_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"7\n\x11ListhtlcsResponse\x12\"\n\x05htlcs\x18\x01 \x03(\x0b\x32\x13.cln.ListhtlcsHtlcs\"\xe5\x02\n\x0eListhtlcsHtlcs\x12\x18\n\x10short_channel_id\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x0e\n\x06\x65xpiry\x18\x03 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12>\n\tdirection\x18\x05 \x01(\x0e\x32+.cln.ListhtlcsHtlcs.ListhtlcsHtlcsDirection\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x1d\n\x05state\x18\x07 \x01(\x0e\x32\x0e.cln.HtlcState\x12\x1a\n\rcreated_index\x18\x08 \x01(\x04H\x00\x88\x01\x01\x12\x1a\n\rupdated_index\x18\t \x01(\x04H\x01\x88\x01\x01\"*\n\x17ListhtlcsHtlcsDirection\x12\x07\n\x03OUT\x10\x00\x12\x06\n\x02IN\x10\x01\x42\x10\n\x0e_created_indexB\x10\n\x0e_updated_index\"\xb2\x02\n\x17MultifundchannelRequest\x12\x37\n\x0c\x64\x65stinations\x18\x01 \x03(\x0b\x32!.cln.MultifundchannelDestinations\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\x12H\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\x18\n\x0bminchannels\x18\x05 \x01(\x12H\x02\x88\x01\x01\x12-\n\x12\x63ommitment_feerate\x18\x06 \x01(\x0b\x32\x0c.cln.FeerateH\x03\x88\x01\x01\x42\n\n\x08_feerateB\n\n\x08_minconfB\x0e\n\x0c_minchannelsB\x15\n\x13_commitment_feerate\"\x97\x01\n\x18MultifundchannelResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x34\n\x0b\x63hannel_ids\x18\x03 \x03(\x0b\x32\x1f.cln.MultifundchannelChannelIds\x12+\n\x06\x66\x61iled\x18\x04 \x03(\x0b\x32\x1b.cln.MultifundchannelFailed\"\xff\x02\n\x1cMultifundchannelDestinations\x12\n\n\x02id\x18\x01 \x01(\t\x12 \n\x06\x61mount\x18\x02 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x15\n\x08\x61nnounce\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12#\n\tpush_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\tH\x02\x88\x01\x01\x12%\n\x0brequest_amt\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x07 \x01(\tH\x04\x88\x01\x01\x12\x15\n\x08mindepth\x18\x08 \x01(\rH\x05\x88\x01\x01\x12!\n\x07reserve\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x42\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xb2\x01\n\x1aMultifundchannelChannelIds\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12\x12\n\nchannel_id\x18\x03 \x01(\x0c\x12@\n\x0c\x63hannel_type\x18\x04 \x01(\x0b\x32*.cln.MultifundchannelChannelIdsChannelType\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_close_to\"Z\n%MultifundchannelChannelIdsChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x93\x02\n\x16MultifundchannelFailed\x12\n\n\x02id\x18\x01 \x01(\x0c\x12H\n\x06method\x18\x02 \x01(\x0e\x32\x38.cln.MultifundchannelFailed.MultifundchannelFailedMethod\x12/\n\x05\x65rror\x18\x03 \x01(\x0b\x32 .cln.MultifundchannelFailedError\"r\n\x1cMultifundchannelFailedMethod\x12\x0b\n\x07\x43ONNECT\x10\x00\x12\x14\n\x10OPENCHANNEL_INIT\x10\x01\x12\x15\n\x11\x46UNDCHANNEL_START\x10\x02\x12\x18\n\x14\x46UNDCHANNEL_COMPLETE\x10\x03\"<\n\x1bMultifundchannelFailedError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x12\x12\x0f\n\x07message\x18\x02 \x01(\t\"\xa8\x01\n\x14MultiwithdrawRequest\x12 \n\x07outputs\x18\x01 \x03(\x0b\x32\x0f.cln.OutputDesc\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.OutpointB\n\n\x08_feerateB\n\n\x08_minconf\"1\n\x15MultiwithdrawResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xe2\x04\n\x0cOfferRequest\x12\x0e\n\x06\x61mount\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0cquantity_max\x18\x05 \x01(\x04H\x03\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x06 \x01(\x04H\x04\x88\x01\x01\x12\x17\n\nrecurrence\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1c\n\x0frecurrence_base\x18\x08 \x01(\tH\x06\x88\x01\x01\x12!\n\x14recurrence_paywindow\x18\t \x01(\tH\x07\x88\x01\x01\x12\x1d\n\x10recurrence_limit\x18\n \x01(\rH\x08\x88\x01\x01\x12\x17\n\nsingle_use\x18\x0b \x01(\x08H\t\x88\x01\x01\x12 \n\x13proportional_amount\x18\r \x01(\x08H\n\x88\x01\x01\x12 \n\x13optional_recurrence\x18\x0e \x01(\x08H\x0b\x88\x01\x01\x12\x16\n\x0e\x66ronting_nodes\x18\x0f \x03(\x0c\x42\x0e\n\x0c_descriptionB\t\n\x07_issuerB\x08\n\x06_labelB\x0f\n\r_quantity_maxB\x12\n\x10_absolute_expiryB\r\n\x0b_recurrenceB\x12\n\x10_recurrence_baseB\x17\n\x15_recurrence_paywindowB\x13\n\x11_recurrence_limitB\r\n\x0b_single_useB\x16\n\x14_proportional_amountB\x16\n\x14_optional_recurrence\"\xbc\x01\n\rOfferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x0f\n\x07\x63reated\x18\x06 \x01(\x08\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x01\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_force_paths\"-\n\x17OpenchannelAbortRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"X\n\x18OpenchannelAbortResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x18\n\x10\x63hannel_canceled\x18\x02 \x01(\x08\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x9e\x01\n\x16OpenchannelBumpRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0binitialpsbt\x18\x02 \x01(\t\x12*\n\x0f\x66unding_feerate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x1b\n\x06\x61mount\x18\x04 \x01(\x0b\x32\x0b.cln.AmountB\x12\n\x10_funding_feerate\"\xed\x01\n\x17OpenchannelBumpResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x35\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32\x1f.cln.OpenchannelBumpChannelType\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x00\x88\x01\x01\x42\x1c\n\x1a_requires_confirmed_inputs\"O\n\x1aOpenchannelBumpChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x9f\x03\n\x16OpenchannelInitRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x13\n\x0binitialpsbt\x18\x02 \x01(\t\x12-\n\x12\x63ommitment_feerate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12*\n\x0f\x66unding_feerate\x18\x04 \x01(\x0b\x32\x0c.cln.FeerateH\x01\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\tH\x03\x88\x01\x01\x12%\n\x0brequest_amt\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x08 \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\t \x03(\r\x12\x1b\n\x06\x61mount\x18\n \x01(\x0b\x32\x0b.cln.AmountB\x15\n\x13_commitment_feerateB\x12\n\x10_funding_feerateB\x0b\n\t_announceB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_lease\"\xed\x01\n\x17OpenchannelInitResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x35\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32\x1f.cln.OpenchannelInitChannelType\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x00\x88\x01\x01\x42\x1c\n\x1a_requires_confirmed_inputs\"O\n\x1aOpenchannelInitChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"C\n\x18OpenchannelSignedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_psbt\x18\x02 \x01(\t\"I\n\x19OpenchannelSignedResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"<\n\x18OpenchannelUpdateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"\x95\x02\n\x19OpenchannelUpdateResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x37\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32!.cln.OpenchannelUpdateChannelType\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_outnum\x18\x05 \x01(\r\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12&\n\x19requires_confirmed_inputs\x18\x07 \x01(\x08H\x01\x88\x01\x01\x42\x0b\n\t_close_toB\x1c\n\x1a_requires_confirmed_inputs\"Q\n\x1cOpenchannelUpdateChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"Y\n\x0bPingRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x03len\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x16\n\tpongbytes\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x06\n\x04_lenB\x0c\n\n_pongbytes\"\x1e\n\x0cPingResponse\x12\x0e\n\x06totlen\x18\x01 \x01(\r\"\x91\x01\n\rPluginRequest\x12)\n\nsubcommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12\x13\n\x06plugin\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tdirectory\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x07options\x18\x04 \x03(\tB\t\n\x07_pluginB\x0c\n\n_directory\"}\n\x0ePluginResponse\x12&\n\x07\x63ommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12#\n\x07plugins\x18\x02 \x03(\x0b\x32\x12.cln.PluginPlugins\x12\x13\n\x06result\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_result\">\n\rPluginPlugins\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x0f\n\x07\x64ynamic\x18\x03 \x01(\x08\"<\n\x14RenepaystatusRequest\x12\x16\n\tinvstring\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_invstring\"G\n\x15RenepaystatusResponse\x12.\n\tpaystatus\x18\x01 \x03(\x0b\x32\x1b.cln.RenepaystatusPaystatus\"\xe2\x03\n\x16RenepaystatusPaystatus\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x1d\n\x10payment_preimage\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\x0f\n\x07groupid\x18\x05 \x01(\r\x12\x12\n\x05parts\x18\x06 \x01(\rH\x01\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12*\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12H\n\x06status\x18\t \x01(\x0e\x32\x38.cln.RenepaystatusPaystatus.RenepaystatusPaystatusStatus\x12\x18\n\x0b\x64\x65stination\x18\n \x01(\x0cH\x03\x88\x01\x01\x12\r\n\x05notes\x18\x0b \x03(\t\"E\n\x1cRenepaystatusPaystatusStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x13\n\x11_payment_preimageB\x08\n\x06_partsB\x13\n\x11_amount_sent_msatB\x0e\n\x0c_destination\"\xda\x02\n\x0eRenepayRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x03\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x12\n\x05label\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1b\n\x0e\x64\x65v_use_shadow\x18\x08 \x01(\x08H\x06\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\t \x03(\tB\x0e\n\x0c_amount_msatB\t\n\x07_maxfeeB\x0b\n\t_maxdelayB\x0c\n\n_retry_forB\x0e\n\x0c_descriptionB\x08\n\x06_labelB\x11\n\x0f_dev_use_shadow\"\xa5\x03\n\x0fRenepayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\r\n\x05parts\x18\x04 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12\x32\n\x06status\x18\x07 \x01(\x0e\x32\".cln.RenepayResponse.RenepayStatus\x12\x18\n\x0b\x64\x65stination\x18\x08 \x01(\x0cH\x00\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\t \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\n \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07groupid\x18\x0b \x01(\x04H\x03\x88\x01\x01\"6\n\rRenepayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x0e\n\x0c_destinationB\t\n\x07_bolt11B\t\n\x07_bolt12B\n\n\x08_groupid\"l\n\x14ReserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\texclusive\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x14\n\x07reserve\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x0c\n\n_exclusiveB\n\n\x08_reserve\"M\n\x15ReserveinputsResponse\x12\x34\n\x0creservations\x18\x01 \x03(\x0b\x32\x1e.cln.ReserveinputsReservations\"z\n\x19ReserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\"4\n\x14SendcustommsgRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x0c\x12\x0b\n\x03msg\x18\x02 \x01(\x0c\"\'\n\x15SendcustommsgResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\"\xb0\x01\n\x12SendinvoiceRequest\x12\x0e\n\x06invreq\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08quantity\x18\x05 \x01(\x04H\x02\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\n\n\x08_timeoutB\x0b\n\t_quantity\"\xb8\x04\n\x13SendinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.SendinvoiceResponse.SendinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x15\n\rcreated_index\x18\x08 \x01(\x04\x12\x1a\n\rupdated_index\x18\t \x01(\x04H\x02\x88\x01\x01\x12\x16\n\tpay_index\x18\n \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0c \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x06\x88\x01\x01\"6\n\x11SendinvoiceStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_amount_msatB\t\n\x07_bolt12B\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\xaa\x02\n\x11SetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12!\n\x07\x66\x65\x65\x62\x61se\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x66\x65\x65ppm\x18\x03 \x01(\rH\x01\x88\x01\x01\x12!\n\x07htlcmin\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12!\n\x07htlcmax\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x19\n\x0c\x65nforcedelay\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1c\n\x0fignorefeelimits\x18\x07 \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_feebaseB\t\n\x07_feeppmB\n\n\x08_htlcminB\n\n\x08_htlcmaxB\x0f\n\r_enforcedelayB\x12\n\x10_ignorefeelimits\"?\n\x12SetchannelResponse\x12)\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x17.cln.SetchannelChannels\"\xaf\x03\n\x12SetchannelChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\x12*\n\x15minimum_htlc_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x17warning_htlcmin_too_low\x18\x07 \x01(\tH\x01\x88\x01\x01\x12*\n\x15maximum_htlc_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x18warning_htlcmax_too_high\x18\t \x01(\tH\x02\x88\x01\x01\x12\x19\n\x11ignore_fee_limits\x18\n \x01(\x08\x42\x13\n\x11_short_channel_idB\x1a\n\x18_warning_htlcmin_too_lowB\x1b\n\x19_warning_htlcmax_too_high\"b\n\x10SetconfigRequest\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x10\n\x03val\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttransient\x18\x03 \x01(\x08H\x01\x88\x01\x01\x42\x06\n\x04_valB\x0c\n\n_transient\"9\n\x11SetconfigResponse\x12$\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x14.cln.SetconfigConfig\"\xa5\x02\n\x0fSetconfigConfig\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x64ynamic\x18\x04 \x01(\x08\x12\x10\n\x03set\x18\x05 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tvalue_str\x18\x06 \x01(\tH\x02\x88\x01\x01\x12$\n\nvalue_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x16\n\tvalue_int\x18\x08 \x01(\x12H\x04\x88\x01\x01\x12\x17\n\nvalue_bool\x18\t \x01(\x08H\x05\x88\x01\x01\x42\t\n\x07_pluginB\x06\n\x04_setB\x0c\n\n_value_strB\r\n\x0b_value_msatB\x0c\n\n_value_intB\r\n\x0b_value_bool\"6\n\x15SetpsbtversionRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\r\"&\n\x16SetpsbtversionResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"\'\n\x12SigninvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\"%\n\x13SigninvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"%\n\x12SignmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"F\n\x13SignmessageResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\r\n\x05recid\x18\x02 \x01(\x0c\x12\r\n\x05zbase\x18\x03 \x01(\t\"\xc8\x01\n\x11SpliceInitRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x17\n\x0frelative_amount\x18\x02 \x01(\x12\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x65\x65rate_per_kw\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x0e\n\x0c_initialpsbtB\x11\n\x0f_feerate_per_kwB\x10\n\x0e_force_feerate\"\"\n\x12SpliceInitResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"_\n\x13SpliceSignedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x17\n\nsign_first\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_sign_first\"^\n\x14SpliceSignedResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x13\n\x06outnum\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04psbt\x18\x04 \x01(\tB\t\n\x07_outnum\"7\n\x13SpliceUpdateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"y\n\x14SpliceUpdateResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\x12\x1f\n\x12signatures_secured\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x15\n\x13_signatures_secured\"2\n\x0fSpliceinRequest\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\t\"b\n\x10SpliceinResponse\x12\x11\n\x04psbt\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"\x8b\x01\n\x10SpliceoutRequest\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\t\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x04 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_destinationB\x10\n\x0e_force_feerate\"c\n\x11SpliceoutResponse\x12\x11\n\x04psbt\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"\xc6\x01\n\x10\x44\x65vspliceRequest\x12\x16\n\x0escript_or_json\x18\x01 \x01(\t\x12\x13\n\x06\x64ryrun\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tdebug_log\x18\x04 \x01(\x08H\x02\x88\x01\x01\x12\x17\n\ndev_wetrun\x18\x05 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_dryrunB\x10\n\x0e_force_feerateB\x0c\n\n_debug_logB\r\n\x0b_dev_wetrun\"\x80\x01\n\x11\x44\x65vspliceResponse\x12\x0e\n\x06\x64ryrun\x18\x01 \x03(\t\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03log\x18\x05 \x03(\tB\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"H\n\x16UnreserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x14\n\x07reserve\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_reserve\"Q\n\x17UnreserveinputsResponse\x12\x36\n\x0creservations\x18\x01 \x03(\x0b\x32 .cln.UnreserveinputsReservations\"\x97\x01\n\x1bUnreserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x1e\n\x11reserved_to_block\x18\x05 \x01(\rH\x00\x88\x01\x01\x42\x14\n\x12_reserved_to_block\"n\n\x14UpgradewalletRequest\x12\"\n\x07\x66\x65\x65rate\x18\x01 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x17\n\nreservedok\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\n\n\x08_feerateB\r\n\x0b_reservedok\"~\n\x15UpgradewalletResponse\x12\x15\n\rupgraded_outs\x18\x01 \x01(\x04\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\x0cH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"O\n\x16WaitblockheightRequest\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\x12\x14\n\x07timeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_timeout\".\n\x17WaitblockheightResponse\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\"\xb9\x02\n\x0bWaitRequest\x12\x31\n\tsubsystem\x18\x01 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitSubsystem\x12\x31\n\tindexname\x18\x02 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitIndexname\x12\x11\n\tnextvalue\x18\x03 \x01(\x04\"y\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\x12\t\n\x05HTLCS\x10\x03\x12\x0e\n\nCHAINMOVES\x10\x04\x12\x10\n\x0c\x43HANNELMOVES\x10\x05\x12\x11\n\rNETWORKEVENTS\x10\x06\"6\n\rWaitIndexname\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x12\x0b\n\x07\x44\x45LETED\x10\x02\"\xf0\x05\n\x0cWaitResponse\x12\x32\n\tsubsystem\x18\x01 \x01(\x0e\x32\x1f.cln.WaitResponse.WaitSubsystem\x12\x14\n\x07\x63reated\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07updated\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x14\n\x07\x64\x65leted\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12&\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32\x10.cln.WaitDetailsH\x03\x88\x01\x01\x12(\n\x08\x66orwards\x18\x06 \x01(\x0b\x32\x11.cln.WaitForwardsH\x04\x88\x01\x01\x12(\n\x08invoices\x18\x07 \x01(\x0b\x32\x11.cln.WaitInvoicesH\x05\x88\x01\x01\x12(\n\x08sendpays\x18\x08 \x01(\x0b\x32\x11.cln.WaitSendpaysH\x06\x88\x01\x01\x12\"\n\x05htlcs\x18\t \x01(\x0b\x32\x0e.cln.WaitHtlcsH\x07\x88\x01\x01\x12,\n\nchainmoves\x18\n \x01(\x0b\x32\x13.cln.WaitChainmovesH\x08\x88\x01\x01\x12\x30\n\x0c\x63hannelmoves\x18\x0b \x01(\x0b\x32\x15.cln.WaitChannelmovesH\t\x88\x01\x01\x12\x32\n\rnetworkevents\x18\x0c \x01(\x0b\x32\x16.cln.WaitNetworkeventsH\n\x88\x01\x01\"y\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\x12\t\n\x05HTLCS\x10\x03\x12\x0e\n\nCHAINMOVES\x10\x04\x12\x10\n\x0c\x43HANNELMOVES\x10\x05\x12\x11\n\rNETWORKEVENTS\x10\x06\x42\n\n\x08_createdB\n\n\x08_updatedB\n\n\x08_deletedB\n\n\x08_detailsB\x0b\n\t_forwardsB\x0b\n\t_invoicesB\x0b\n\t_sendpaysB\x08\n\x06_htlcsB\r\n\x0b_chainmovesB\x0f\n\r_channelmovesB\x10\n\x0e_networkevents\"\xcb\x02\n\x0cWaitForwards\x12\x39\n\x06status\x18\x01 \x01(\x0e\x32$.cln.WaitForwards.WaitForwardsStatusH\x00\x88\x01\x01\x12\x17\n\nin_channel\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12!\n\x07in_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x18\n\x0bout_channel\x18\x05 \x01(\tH\x04\x88\x01\x01\"L\n\x12WaitForwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x12\x10\n\x0cLOCAL_FAILED\x10\x03\x42\t\n\x07_statusB\r\n\x0b_in_channelB\r\n\x0b_in_htlc_idB\n\n\x08_in_msatB\x0e\n\x0c_out_channel\"\x95\x02\n\x0cWaitInvoices\x12\x39\n\x06status\x18\x01 \x01(\x0e\x32$.cln.WaitInvoices.WaitInvoicesStatusH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x05 \x01(\tH\x04\x88\x01\x01\"7\n\x12WaitInvoicesStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\t\n\x07_statusB\x08\n\x06_labelB\x0e\n\x0c_descriptionB\t\n\x07_bolt11B\t\n\x07_bolt12\"\xff\x01\n\x0cWaitSendpays\x12\x39\n\x06status\x18\x01 \x01(\x0e\x32$.cln.WaitSendpays.WaitSendpaysStatusH\x00\x88\x01\x01\x12\x13\n\x06partid\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x14\n\x07groupid\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x04 \x01(\x0cH\x03\x88\x01\x01\";\n\x12WaitSendpaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\t\n\x07_statusB\t\n\x07_partidB\n\n\x08_groupidB\x0f\n\r_payment_hash\"\x8c\x03\n\tWaitHtlcs\x12\"\n\x05state\x18\x01 \x01(\x0e\x32\x0e.cln.HtlcStateH\x00\x88\x01\x01\x12\x14\n\x07htlc_id\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x63ltv_expiry\x18\x04 \x01(\rH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x39\n\tdirection\x18\x06 \x01(\x0e\x32!.cln.WaitHtlcs.WaitHtlcsDirectionH\x05\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x07 \x01(\x0cH\x06\x88\x01\x01\"%\n\x12WaitHtlcsDirection\x12\x07\n\x03OUT\x10\x00\x12\x06\n\x02IN\x10\x01\x42\x08\n\x06_stateB\n\n\x08_htlc_idB\x13\n\x11_short_channel_idB\x0e\n\x0c_cltv_expiryB\x0e\n\x0c_amount_msatB\x0c\n\n_directionB\x0f\n\r_payment_hash\"d\n\x0eWaitChainmoves\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"f\n\x10WaitChannelmoves\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"\x89\x02\n\x11WaitNetworkevents\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x44\n\titem_type\x18\x02 \x01(\x0e\x32,.cln.WaitNetworkevents.WaitNetworkeventsTypeH\x01\x88\x01\x01\x12\x14\n\x07peer_id\x18\x03 \x01(\x0cH\x02\x88\x01\x01\"P\n\x15WaitNetworkeventsType\x12\x0b\n\x07\x43ONNECT\x10\x00\x12\x10\n\x0c\x43ONNECT_FAIL\x10\x01\x12\x08\n\x04PING\x10\x02\x12\x0e\n\nDISCONNECT\x10\x03\x42\x10\n\x0e_created_indexB\x0c\n\n_item_typeB\n\n\x08_peer_id\"\xfc\x04\n\x0bWaitDetails\x12\x37\n\x06status\x18\x01 \x01(\x0e\x32\".cln.WaitDetails.WaitDetailsStatusH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x14\n\x07groupid\x18\x07 \x01(\x04H\x06\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x08 \x01(\x0cH\x07\x88\x01\x01\x12\x17\n\nin_channel\x18\t \x01(\tH\x08\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\t\x88\x01\x01\x12!\n\x07in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x12\x18\n\x0bout_channel\x18\x0c \x01(\tH\x0b\x88\x01\x01\"\x89\x01\n\x11WaitDetailsStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x12\x0b\n\x07PENDING\x10\x03\x12\n\n\x06\x46\x41ILED\x10\x04\x12\x0c\n\x08\x43OMPLETE\x10\x05\x12\x0b\n\x07OFFERED\x10\x06\x12\x0b\n\x07SETTLED\x10\x07\x12\x10\n\x0cLOCAL_FAILED\x10\x08\x42\t\n\x07_statusB\x08\n\x06_labelB\x0e\n\x0c_descriptionB\t\n\x07_bolt11B\t\n\x07_bolt12B\t\n\x07_partidB\n\n\x08_groupidB\x0f\n\r_payment_hashB\r\n\x0b_in_channelB\r\n\x0b_in_htlc_idB\n\n\x08_in_msatB\x0e\n\x0c_out_channel\"4\n\x12ListconfigsRequest\x12\x13\n\x06\x63onfig\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_config\"P\n\x13ListconfigsResponse\x12-\n\x07\x63onfigs\x18\x01 \x01(\x0b\x32\x17.cln.ListconfigsConfigsH\x00\x88\x01\x01\x42\n\n\x08_configs\"\xd5\x30\n\x12ListconfigsConfigs\x12.\n\x04\x63onf\x18\x01 \x01(\x0b\x32\x1b.cln.ListconfigsConfigsConfH\x00\x88\x01\x01\x12\x38\n\tdeveloper\x18\x02 \x01(\x0b\x32 .cln.ListconfigsConfigsDeveloperH\x01\x88\x01\x01\x12?\n\rclear_plugins\x18\x03 \x01(\x0b\x32#.cln.ListconfigsConfigsClearpluginsH\x02\x88\x01\x01\x12;\n\x0b\x64isable_mpp\x18\x04 \x01(\x0b\x32!.cln.ListconfigsConfigsDisablemppH\x03\x88\x01\x01\x12\x34\n\x07mainnet\x18\x05 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsMainnetH\x04\x88\x01\x01\x12\x34\n\x07regtest\x18\x06 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsRegtestH\x05\x88\x01\x01\x12\x32\n\x06signet\x18\x07 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsSignetH\x06\x88\x01\x01\x12\x34\n\x07testnet\x18\x08 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsTestnetH\x07\x88\x01\x01\x12\x45\n\x10important_plugin\x18\t \x01(\x0b\x32&.cln.ListconfigsConfigsImportantpluginH\x08\x88\x01\x01\x12\x32\n\x06plugin\x18\n \x01(\x0b\x32\x1d.cln.ListconfigsConfigsPluginH\t\x88\x01\x01\x12\x39\n\nplugin_dir\x18\x0b \x01(\x0b\x32 .cln.ListconfigsConfigsPlugindirH\n\x88\x01\x01\x12?\n\rlightning_dir\x18\x0c \x01(\x0b\x32#.cln.ListconfigsConfigsLightningdirH\x0b\x88\x01\x01\x12\x34\n\x07network\x18\r \x01(\x0b\x32\x1e.cln.ListconfigsConfigsNetworkH\x0c\x88\x01\x01\x12N\n\x15\x61llow_deprecated_apis\x18\x0e \x01(\x0b\x32*.cln.ListconfigsConfigsAllowdeprecatedapisH\r\x88\x01\x01\x12\x35\n\x08rpc_file\x18\x0f \x01(\x0b\x32\x1e.cln.ListconfigsConfigsRpcfileH\x0e\x88\x01\x01\x12\x41\n\x0e\x64isable_plugin\x18\x10 \x01(\x0b\x32$.cln.ListconfigsConfigsDisablepluginH\x0f\x88\x01\x01\x12\x44\n\x10\x61lways_use_proxy\x18\x11 \x01(\x0b\x32%.cln.ListconfigsConfigsAlwaysuseproxyH\x10\x88\x01\x01\x12\x32\n\x06\x64\x61\x65mon\x18\x12 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsDaemonH\x11\x88\x01\x01\x12\x32\n\x06wallet\x18\x13 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsWalletH\x12\x88\x01\x01\x12\x41\n\x0elarge_channels\x18\x14 \x01(\x0b\x32$.cln.ListconfigsConfigsLargechannelsH\x13\x88\x01\x01\x12P\n\x16\x65xperimental_dual_fund\x18\x15 \x01(\x0b\x32+.cln.ListconfigsConfigsExperimentaldualfundH\x14\x88\x01\x01\x12O\n\x15\x65xperimental_splicing\x18\x16 \x01(\x0b\x32+.cln.ListconfigsConfigsExperimentalsplicingH\x15\x88\x01\x01\x12Z\n\x1b\x65xperimental_onion_messages\x18\x17 \x01(\x0b\x32\x30.cln.ListconfigsConfigsExperimentalonionmessagesH\x16\x88\x01\x01\x12K\n\x13\x65xperimental_offers\x18\x18 \x01(\x0b\x32).cln.ListconfigsConfigsExperimentaloffersH\x17\x88\x01\x01\x12i\n#experimental_shutdown_wrong_funding\x18\x19 \x01(\x0b\x32\x37.cln.ListconfigsConfigsExperimentalshutdownwrongfundingH\x18\x88\x01\x01\x12V\n\x19\x65xperimental_peer_storage\x18\x1a \x01(\x0b\x32..cln.ListconfigsConfigsExperimentalpeerstorageH\x19\x88\x01\x01\x12M\n\x14\x65xperimental_anchors\x18\x1b \x01(\x0b\x32*.cln.ListconfigsConfigsExperimentalanchorsH\x1a\x88\x01\x01\x12\x45\n\x10\x64\x61tabase_upgrade\x18\x1c \x01(\x0b\x32&.cln.ListconfigsConfigsDatabaseupgradeH\x1b\x88\x01\x01\x12,\n\x03rgb\x18\x1d \x01(\x0b\x32\x1a.cln.ListconfigsConfigsRgbH\x1c\x88\x01\x01\x12\x30\n\x05\x61lias\x18\x1e \x01(\x0b\x32\x1c.cln.ListconfigsConfigsAliasH\x1d\x88\x01\x01\x12\x35\n\x08pid_file\x18\x1f \x01(\x0b\x32\x1e.cln.ListconfigsConfigsPidfileH\x1e\x88\x01\x01\x12\x46\n\x11ignore_fee_limits\x18 \x01(\x0b\x32&.cln.ListconfigsConfigsIgnorefeelimitsH\x1f\x88\x01\x01\x12\x45\n\x10watchtime_blocks\x18! \x01(\x0b\x32&.cln.ListconfigsConfigsWatchtimeblocksH \x88\x01\x01\x12J\n\x13max_locktime_blocks\x18\" \x01(\x0b\x32(.cln.ListconfigsConfigsMaxlocktimeblocksH!\x88\x01\x01\x12\x45\n\x10\x66unding_confirms\x18# \x01(\x0b\x32&.cln.ListconfigsConfigsFundingconfirmsH\"\x88\x01\x01\x12\x39\n\ncltv_delta\x18$ \x01(\x0b\x32 .cln.ListconfigsConfigsCltvdeltaH#\x88\x01\x01\x12\x39\n\ncltv_final\x18% \x01(\x0b\x32 .cln.ListconfigsConfigsCltvfinalH$\x88\x01\x01\x12;\n\x0b\x63ommit_time\x18& \x01(\x0b\x32!.cln.ListconfigsConfigsCommittimeH%\x88\x01\x01\x12\x35\n\x08\x66\x65\x65_base\x18\' \x01(\x0b\x32\x1e.cln.ListconfigsConfigsFeebaseH&\x88\x01\x01\x12\x32\n\x06rescan\x18( \x01(\x0b\x32\x1d.cln.ListconfigsConfigsRescanH\'\x88\x01\x01\x12\x42\n\x0f\x66\x65\x65_per_satoshi\x18) \x01(\x0b\x32$.cln.ListconfigsConfigsFeepersatoshiH(\x88\x01\x01\x12L\n\x14max_concurrent_htlcs\x18* \x01(\x0b\x32).cln.ListconfigsConfigsMaxconcurrenthtlcsH)\x88\x01\x01\x12\x46\n\x11htlc_minimum_msat\x18+ \x01(\x0b\x32&.cln.ListconfigsConfigsHtlcminimummsatH*\x88\x01\x01\x12\x46\n\x11htlc_maximum_msat\x18, \x01(\x0b\x32&.cln.ListconfigsConfigsHtlcmaximummsatH+\x88\x01\x01\x12X\n\x1bmax_dust_htlc_exposure_msat\x18- \x01(\x0b\x32..cln.ListconfigsConfigsMaxdusthtlcexposuremsatH,\x88\x01\x01\x12\x44\n\x10min_capacity_sat\x18. \x01(\x0b\x32%.cln.ListconfigsConfigsMincapacitysatH-\x88\x01\x01\x12.\n\x04\x61\x64\x64r\x18/ \x01(\x0b\x32\x1b.cln.ListconfigsConfigsAddrH.\x88\x01\x01\x12?\n\rannounce_addr\x18\x30 \x01(\x0b\x32#.cln.ListconfigsConfigsAnnounceaddrH/\x88\x01\x01\x12\x37\n\tbind_addr\x18\x31 \x01(\x0b\x32\x1f.cln.ListconfigsConfigsBindaddrH0\x88\x01\x01\x12\x34\n\x07offline\x18\x32 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsOfflineH1\x88\x01\x01\x12:\n\nautolisten\x18\x33 \x01(\x0b\x32!.cln.ListconfigsConfigsAutolistenH2\x88\x01\x01\x12\x30\n\x05proxy\x18\x34 \x01(\x0b\x32\x1c.cln.ListconfigsConfigsProxyH3\x88\x01\x01\x12;\n\x0b\x64isable_dns\x18\x35 \x01(\x0b\x32!.cln.ListconfigsConfigsDisablednsH4\x88\x01\x01\x12T\n\x18\x61nnounce_addr_discovered\x18\x36 \x01(\x0b\x32-.cln.ListconfigsConfigsAnnounceaddrdiscoveredH5\x88\x01\x01\x12]\n\x1d\x61nnounce_addr_discovered_port\x18\x37 \x01(\x0b\x32\x31.cln.ListconfigsConfigsAnnounceaddrdiscoveredportH6\x88\x01\x01\x12?\n\rencrypted_hsm\x18\x38 \x01(\x0b\x32#.cln.ListconfigsConfigsEncryptedhsmH7\x88\x01\x01\x12>\n\rrpc_file_mode\x18\x39 \x01(\x0b\x32\".cln.ListconfigsConfigsRpcfilemodeH8\x88\x01\x01\x12\x37\n\tlog_level\x18: \x01(\x0b\x32\x1f.cln.ListconfigsConfigsLoglevelH9\x88\x01\x01\x12\x39\n\nlog_prefix\x18; \x01(\x0b\x32 .cln.ListconfigsConfigsLogprefixH:\x88\x01\x01\x12\x35\n\x08log_file\x18< \x01(\x0b\x32\x1e.cln.ListconfigsConfigsLogfileH;\x88\x01\x01\x12\x41\n\x0elog_timestamps\x18= \x01(\x0b\x32$.cln.ListconfigsConfigsLogtimestampsH<\x88\x01\x01\x12\x41\n\x0e\x66orce_feerates\x18> \x01(\x0b\x32$.cln.ListconfigsConfigsForcefeeratesH=\x88\x01\x01\x12\x38\n\tsubdaemon\x18? \x01(\x0b\x32 .cln.ListconfigsConfigsSubdaemonH>\x88\x01\x01\x12Q\n\x16\x66\x65tchinvoice_noconnect\x18@ \x01(\x0b\x32,.cln.ListconfigsConfigsFetchinvoicenoconnectH?\x88\x01\x01\x12L\n\x14tor_service_password\x18\x42 \x01(\x0b\x32).cln.ListconfigsConfigsTorservicepasswordH@\x88\x01\x01\x12\x46\n\x11\x61nnounce_addr_dns\x18\x43 \x01(\x0b\x32&.cln.ListconfigsConfigsAnnounceaddrdnsHA\x88\x01\x01\x12T\n\x18require_confirmed_inputs\x18\x44 \x01(\x0b\x32-.cln.ListconfigsConfigsRequireconfirmedinputsHB\x88\x01\x01\x12\x39\n\ncommit_fee\x18\x45 \x01(\x0b\x32 .cln.ListconfigsConfigsCommitfeeHC\x88\x01\x01\x12N\n\x15\x63ommit_feerate_offset\x18\x46 \x01(\x0b\x32*.cln.ListconfigsConfigsCommitfeerateoffsetHD\x88\x01\x01\x12T\n\x18\x61utoconnect_seeker_peers\x18G \x01(\x0b\x32-.cln.ListconfigsConfigsAutoconnectseekerpeersHE\x88\x01\x01\x12R\n\x17\x63urrencyrate_add_source\x18J \x01(\x0b\x32,.cln.ListconfigsConfigsCurrencyrateaddsourceHF\x88\x01\x01\x12Z\n\x1b\x63urrencyrate_disable_source\x18K \x01(\x0b\x32\x30.cln.ListconfigsConfigsCurrencyratedisablesourceHG\x88\x01\x01\x42\x07\n\x05_confB\x0c\n\n_developerB\x10\n\x0e_clear_pluginsB\x0e\n\x0c_disable_mppB\n\n\x08_mainnetB\n\n\x08_regtestB\t\n\x07_signetB\n\n\x08_testnetB\x13\n\x11_important_pluginB\t\n\x07_pluginB\r\n\x0b_plugin_dirB\x10\n\x0e_lightning_dirB\n\n\x08_networkB\x18\n\x16_allow_deprecated_apisB\x0b\n\t_rpc_fileB\x11\n\x0f_disable_pluginB\x13\n\x11_always_use_proxyB\t\n\x07_daemonB\t\n\x07_walletB\x11\n\x0f_large_channelsB\x19\n\x17_experimental_dual_fundB\x18\n\x16_experimental_splicingB\x1e\n\x1c_experimental_onion_messagesB\x16\n\x14_experimental_offersB&\n$_experimental_shutdown_wrong_fundingB\x1c\n\x1a_experimental_peer_storageB\x17\n\x15_experimental_anchorsB\x13\n\x11_database_upgradeB\x06\n\x04_rgbB\x08\n\x06_aliasB\x0b\n\t_pid_fileB\x14\n\x12_ignore_fee_limitsB\x13\n\x11_watchtime_blocksB\x16\n\x14_max_locktime_blocksB\x13\n\x11_funding_confirmsB\r\n\x0b_cltv_deltaB\r\n\x0b_cltv_finalB\x0e\n\x0c_commit_timeB\x0b\n\t_fee_baseB\t\n\x07_rescanB\x12\n\x10_fee_per_satoshiB\x17\n\x15_max_concurrent_htlcsB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x1e\n\x1c_max_dust_htlc_exposure_msatB\x13\n\x11_min_capacity_satB\x07\n\x05_addrB\x10\n\x0e_announce_addrB\x0c\n\n_bind_addrB\n\n\x08_offlineB\r\n\x0b_autolistenB\x08\n\x06_proxyB\x0e\n\x0c_disable_dnsB\x1b\n\x19_announce_addr_discoveredB \n\x1e_announce_addr_discovered_portB\x10\n\x0e_encrypted_hsmB\x10\n\x0e_rpc_file_modeB\x0c\n\n_log_levelB\r\n\x0b_log_prefixB\x0b\n\t_log_fileB\x11\n\x0f_log_timestampsB\x11\n\x0f_force_feeratesB\x0c\n\n_subdaemonB\x19\n\x17_fetchinvoice_noconnectB\x17\n\x15_tor_service_passwordB\x14\n\x12_announce_addr_dnsB\x1b\n\x19_require_confirmed_inputsB\r\n\x0b_commit_feeB\x18\n\x16_commit_feerate_offsetB\x1b\n\x19_autoconnect_seeker_peersB\x1a\n\x18_currencyrate_add_sourceB\x1e\n\x1c_currencyrate_disable_source\"\xa2\x01\n\x16ListconfigsConfigsConf\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12H\n\x06source\x18\x02 \x01(\x0e\x32\x38.cln.ListconfigsConfigsConf.ListconfigsConfigsConfSource\"+\n\x1cListconfigsConfigsConfSource\x12\x0b\n\x07\x43MDLINE\x10\x00\":\n\x1bListconfigsConfigsDeveloper\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x1eListconfigsConfigsClearplugins\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"[\n\x1cListconfigsConfigsDisablempp\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"8\n\x19ListconfigsConfigsMainnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsRegtest\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"7\n\x18ListconfigsConfigsSignet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsTestnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n!ListconfigsConfigsImportantplugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"?\n\x18ListconfigsConfigsPlugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"B\n\x1bListconfigsConfigsPlugindir\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"C\n\x1eListconfigsConfigsLightningdir\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsNetwork\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"K\n%ListconfigsConfigsAllowdeprecatedapis\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsRpcfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n\x1fListconfigsConfigsDisableplugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"F\n ListconfigsConfigsAlwaysuseproxy\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"7\n\x18ListconfigsConfigsDaemon\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x18ListconfigsConfigsWallet\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x1fListconfigsConfigsLargechannels\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"E\n&ListconfigsConfigsExperimentaldualfund\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"E\n&ListconfigsConfigsExperimentalsplicing\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"J\n+ListconfigsConfigsExperimentalonionmessages\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"C\n$ListconfigsConfigsExperimentaloffers\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"Q\n2ListconfigsConfigsExperimentalshutdownwrongfunding\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n)ListconfigsConfigsExperimentalpeerstorage\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n%ListconfigsConfigsExperimentalanchors\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsDatabaseupgrade\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\":\n\x15ListconfigsConfigsRgb\x12\x11\n\tvalue_str\x18\x01 \x01(\x0c\x12\x0e\n\x06source\x18\x02 \x01(\t\"<\n\x17ListconfigsConfigsAlias\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsPidfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsIgnorefeelimits\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n!ListconfigsConfigsWatchtimeblocks\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n#ListconfigsConfigsMaxlocktimeblocks\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n!ListconfigsConfigsFundingconfirms\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCltvdelta\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCltvfinal\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"A\n\x1cListconfigsConfigsCommittime\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsFeebase\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x18ListconfigsConfigsRescan\x12\x11\n\tvalue_int\x18\x01 \x01(\x12\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n\x1fListconfigsConfigsFeepersatoshi\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"I\n$ListconfigsConfigsMaxconcurrenthtlcs\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"T\n!ListconfigsConfigsHtlcminimummsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"T\n!ListconfigsConfigsHtlcmaximummsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"\\\n)ListconfigsConfigsMaxdusthtlcexposuremsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"g\n ListconfigsConfigsMincapacitysat\x12\x11\n\tvalue_int\x18\x01 \x01(\x04\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x14\n\x07\x64ynamic\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\n\n\x08_dynamic\"=\n\x16ListconfigsConfigsAddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"E\n\x1eListconfigsConfigsAnnounceaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"A\n\x1aListconfigsConfigsBindaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"8\n\x19ListconfigsConfigsOffline\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1cListconfigsConfigsAutolisten\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"<\n\x17ListconfigsConfigsProxy\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\";\n\x1cListconfigsConfigsDisabledns\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"\x80\x02\n(ListconfigsConfigsAnnounceaddrdiscovered\x12q\n\tvalue_str\x18\x01 \x01(\x0e\x32^.cln.ListconfigsConfigsAnnounceaddrdiscovered.ListconfigsConfigsAnnounceaddrdiscoveredValueStr\x12\x0e\n\x06source\x18\x02 \x01(\t\"Q\n0ListconfigsConfigsAnnounceaddrdiscoveredValueStr\x12\x08\n\x04TRUE\x10\x00\x12\t\n\x05\x46\x41LSE\x10\x01\x12\x08\n\x04\x41UTO\x10\x02\"Q\n,ListconfigsConfigsAnnounceaddrdiscoveredport\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x1eListconfigsConfigsEncryptedhsm\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1dListconfigsConfigsRpcfilemode\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"?\n\x1aListconfigsConfigsLoglevel\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsLogprefix\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x19ListconfigsConfigsLogfile\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"E\n\x1fListconfigsConfigsLogtimestamps\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n\x1fListconfigsConfigsForcefeerates\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1bListconfigsConfigsSubdaemon\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"f\n\'ListconfigsConfigsFetchinvoicenoconnect\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"I\n$ListconfigsConfigsTorservicepassword\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsAnnounceaddrdns\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"N\n(ListconfigsConfigsRequireconfirmedinputs\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCommitfee\x12\x11\n\tvalue_int\x18\x01 \x01(\x04\x12\x0e\n\x06source\x18\x02 \x01(\t\"J\n%ListconfigsConfigsCommitfeerateoffset\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"M\n(ListconfigsConfigsAutoconnectseekerpeers\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"n\n\'ListconfigsConfigsCurrencyrateaddsource\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"r\n+ListconfigsConfigsCurrencyratedisablesource\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"\r\n\x0bStopRequest\"a\n\x0cStopResponse\x12,\n\x06result\x18\x01 \x01(\x0e\x32\x1c.cln.StopResponse.StopResult\"#\n\nStopResult\x12\x15\n\x11SHUTDOWN_COMPLETE\x10\x00\"/\n\x0bHelpRequest\x12\x14\n\x07\x63ommand\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_command\"\x95\x01\n\x0cHelpResponse\x12\x1b\n\x04help\x18\x01 \x03(\x0b\x32\r.cln.HelpHelp\x12:\n\x0b\x66ormat_hint\x18\x02 \x01(\x0e\x32 .cln.HelpResponse.HelpFormathintH\x00\x88\x01\x01\"\x1c\n\x0eHelpFormathint\x12\n\n\x06SIMPLE\x10\x00\x42\x0e\n\x0c_format_hint\"\x1b\n\x08HelpHelp\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\"g\n\x18PreapprovekeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"\x1b\n\x19PreapprovekeysendResponse\"*\n\x18PreapproveinvoiceRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"\x1b\n\x19PreapproveinvoiceResponse\"\x15\n\x13StaticbackupRequest\"#\n\x14StaticbackupResponse\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"d\n\x16\x42kprchannelsapyRequest\x12\x17\n\nstart_time\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\r\n\x0b_start_timeB\x0b\n\t_end_time\"P\n\x17\x42kprchannelsapyResponse\x12\x35\n\x0c\x63hannels_apy\x18\x01 \x03(\x0b\x32\x1f.cln.BkprchannelsapyChannelsApy\"\xf9\x06\n\x1a\x42kprchannelsapyChannelsApy\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12$\n\x0frouted_out_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0erouted_in_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12(\n\x13lease_fee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12*\n\x15lease_fee_earned_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x0fpushed_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0epushed_in_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x16our_start_balance_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12/\n\x1a\x63hannel_start_balance_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\rfees_out_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x0c\x66\x65\x65s_in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x17\n\x0futilization_out\x18\x0c \x01(\t\x12$\n\x17utilization_out_initial\x18\r \x01(\tH\x01\x88\x01\x01\x12\x16\n\x0eutilization_in\x18\x0e \x01(\t\x12#\n\x16utilization_in_initial\x18\x0f \x01(\tH\x02\x88\x01\x01\x12\x0f\n\x07\x61py_out\x18\x10 \x01(\t\x12\x1c\n\x0f\x61py_out_initial\x18\x11 \x01(\tH\x03\x88\x01\x01\x12\x0e\n\x06\x61py_in\x18\x12 \x01(\t\x12\x1b\n\x0e\x61py_in_initial\x18\x13 \x01(\tH\x04\x88\x01\x01\x12\x11\n\tapy_total\x18\x14 \x01(\t\x12\x1e\n\x11\x61py_total_initial\x18\x15 \x01(\tH\x05\x88\x01\x01\x12\x16\n\tapy_lease\x18\x16 \x01(\tH\x06\x88\x01\x01\x42\x0f\n\r_fees_in_msatB\x1a\n\x18_utilization_out_initialB\x19\n\x17_utilization_in_initialB\x12\n\x10_apy_out_initialB\x11\n\x0f_apy_in_initialB\x14\n\x12_apy_total_initialB\x0c\n\n_apy_lease\"\xd2\x01\n\x18\x42kprdumpincomecsvRequest\x12\x12\n\ncsv_format\x18\x01 \x01(\t\x12\x15\n\x08\x63sv_file\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1d\n\x10\x63onsolidate_fees\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x17\n\nstart_time\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x05 \x01(\x04H\x03\x88\x01\x01\x42\x0b\n\t_csv_fileB\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"\xd4\x01\n\x19\x42kprdumpincomecsvResponse\x12\x10\n\x08\x63sv_file\x18\x01 \x01(\t\x12M\n\ncsv_format\x18\x02 \x01(\x0e\x32\x39.cln.BkprdumpincomecsvResponse.BkprdumpincomecsvCsvFormat\"V\n\x1a\x42kprdumpincomecsvCsvFormat\x12\x0f\n\x0b\x43OINTRACKER\x10\x00\x12\n\n\x06KOINLY\x10\x01\x12\x0b\n\x07HARMONY\x10\x02\x12\x0e\n\nQUICKBOOKS\x10\x03\"%\n\x12\x42kprinspectRequest\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\"7\n\x13\x42kprinspectResponse\x12 \n\x03txs\x18\x01 \x03(\x0b\x32\x13.cln.BkprinspectTxs\"\x9a\x01\n\x0e\x42kprinspectTxs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x18\n\x0b\x62lockheight\x18\x02 \x01(\rH\x00\x88\x01\x01\x12#\n\x0e\x66\x65\x65s_paid_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x07outputs\x18\x04 \x03(\x0b\x32\x1a.cln.BkprinspectTxsOutputsB\x0e\n\x0c_blockheight\"\xbc\x03\n\x15\x42kprinspectTxsOutputs\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12&\n\x11output_value_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x04 \x01(\t\x12%\n\x0b\x63redit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12$\n\ndebit_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12 \n\x13originating_account\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x17\n\noutput_tag\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tspend_tag\x18\t \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rspending_txid\x18\n \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x42\x0e\n\x0c_credit_msatB\r\n\x0b_debit_msatB\x16\n\x14_originating_accountB\r\n\x0b_output_tagB\x0c\n\n_spend_tagB\x10\n\x0e_spending_txidB\r\n\x0b_payment_id\"h\n\x1c\x42kprlistaccounteventsRequest\x12\x14\n\x07\x61\x63\x63ount\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\npayment_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\n\n\x08_accountB\r\n\x0b_payment_id\"Q\n\x1d\x42kprlistaccounteventsResponse\x12\x30\n\x06\x65vents\x18\x01 \x03(\x0b\x32 .cln.BkprlistaccounteventsEvents\"\xcd\x05\n\x1b\x42kprlistaccounteventsEvents\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12S\n\titem_type\x18\x02 \x01(\x0e\x32@.cln.BkprlistaccounteventsEvents.BkprlistaccounteventsEventsType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\t \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\n \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x05\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x07\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x08\x88\x01\x01\x12\x19\n\x0c\x63urrencyrate\x18\x11 \x01(\x01H\t\x88\x01\x01\"J\n\x1f\x42kprlistaccounteventsEventsType\x12\x0f\n\x0bONCHAIN_FEE\x10\x00\x12\t\n\x05\x43HAIN\x10\x01\x12\x0b\n\x07\x43HANNEL\x10\x02\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0e\n\x0c_descriptionB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_idB\x0f\n\r_currencyrate\"\x19\n\x17\x42kprlistbalancesRequest\"K\n\x18\x42kprlistbalancesResponse\x12/\n\x08\x61\x63\x63ounts\x18\x01 \x03(\x0b\x32\x1d.cln.BkprlistbalancesAccounts\"\xc6\x02\n\x18\x42kprlistbalancesAccounts\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x37\n\x08\x62\x61lances\x18\x02 \x03(\x0b\x32%.cln.BkprlistbalancesAccountsBalances\x12\x14\n\x07peer_id\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x16\n\twe_opened\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x1b\n\x0e\x61\x63\x63ount_closed\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x1d\n\x10\x61\x63\x63ount_resolved\x18\x06 \x01(\x08H\x03\x88\x01\x01\x12\x1e\n\x11resolved_at_block\x18\x07 \x01(\rH\x04\x88\x01\x01\x42\n\n\x08_peer_idB\x0c\n\n_we_openedB\x11\n\x0f_account_closedB\x13\n\x11_account_resolvedB\x14\n\x12_resolved_at_block\"X\n BkprlistbalancesAccountsBalances\x12!\n\x0c\x62\x61lance_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\tcoin_type\x18\x02 \x01(\t\"\x97\x01\n\x15\x42kprlistincomeRequest\x12\x1d\n\x10\x63onsolidate_fees\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x17\n\nstart_time\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x03 \x01(\rH\x02\x88\x01\x01\x42\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"P\n\x16\x42kprlistincomeResponse\x12\x36\n\rincome_events\x18\x01 \x03(\x0b\x32\x1f.cln.BkprlistincomeIncomeEvents\"\xb4\x02\n\x1a\x42kprlistincomeIncomeEvents\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0b\n\x03tag\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x05 \x01(\t\x12\x11\n\ttimestamp\x18\x06 \x01(\r\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\n \x01(\x0cH\x03\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_outpointB\x07\n\x05_txidB\r\n\x0b_payment_id\"P\n%BkpreditdescriptionbypaymentidRequest\x12\x12\n\npayment_id\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"e\n&BkpreditdescriptionbypaymentidResponse\x12;\n\x07updated\x18\x01 \x03(\x0b\x32*.cln.BkpreditdescriptionbypaymentidUpdated\"\xa3\x05\n%BkpreditdescriptionbypaymentidUpdated\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12g\n\titem_type\x18\x02 \x01(\x0e\x32T.cln.BkpreditdescriptionbypaymentidUpdated.BkpreditdescriptionbypaymentidUpdatedType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x15\n\x08outpoint\x18\t \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\n \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\x0b \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\r \x01(\x0cH\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x06\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x07\x88\x01\x01\"C\n)BkpreditdescriptionbypaymentidUpdatedType\x12\t\n\x05\x43HAIN\x10\x00\x12\x0b\n\x07\x43HANNEL\x10\x01\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_id\"M\n$BkpreditdescriptionbyoutpointRequest\x12\x10\n\x08outpoint\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"c\n%BkpreditdescriptionbyoutpointResponse\x12:\n\x07updated\x18\x01 \x03(\x0b\x32).cln.BkpreditdescriptionbyoutpointUpdated\"\x9f\x05\n$BkpreditdescriptionbyoutpointUpdated\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x65\n\titem_type\x18\x02 \x01(\x0e\x32R.cln.BkpreditdescriptionbyoutpointUpdated.BkpreditdescriptionbyoutpointUpdatedType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x15\n\x08outpoint\x18\t \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\n \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\x0b \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\r \x01(\x0cH\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x06\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x07\x88\x01\x01\"B\n(BkpreditdescriptionbyoutpointUpdatedType\x12\t\n\x05\x43HAIN\x10\x00\x12\x0b\n\x07\x43HANNEL\x10\x01\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_id\"\xb0\x01\n\x11\x42kprreportRequest\x12\x13\n\x06\x66ormat\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07headers\x18\x02 \x03(\t\x12\x13\n\x06\x65scape\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nstart_time\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x05 \x01(\rH\x03\x88\x01\x01\x42\t\n\x07_formatB\t\n\x07_escapeB\r\n\x0b_start_timeB\x0b\n\t_end_time\"$\n\x12\x42kprreportResponse\x12\x0e\n\x06report\x18\x01 \x03(\t\"n\n\x14\x42lacklistruneRequest\x12\x12\n\x05start\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x13\n\x06relist\x18\x03 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_endB\t\n\x07_relist\"G\n\x15\x42lacklistruneResponse\x12.\n\tblacklist\x18\x01 \x03(\x0b\x32\x1b.cln.BlacklistruneBlacklist\"4\n\x16\x42lacklistruneBlacklist\x12\r\n\x05start\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\"p\n\x10\x43heckruneRequest\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x13\n\x06nodeid\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06method\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0e\n\x06params\x18\x04 \x03(\tB\t\n\x07_nodeidB\t\n\x07_method\"\"\n\x11\x43heckruneResponse\x12\r\n\x05valid\x18\x01 \x01(\x08\"E\n\x11\x43reateruneRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0crestrictions\x18\x02 \x03(\tB\x07\n\x05_rune\"{\n\x12\x43reateruneResponse\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12&\n\x19warning_unrestricted_rune\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x1c\n\x1a_warning_unrestricted_rune\".\n\x10ShowrunesRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_rune\"7\n\x11ShowrunesResponse\x12\"\n\x05runes\x18\x01 \x03(\x0b\x32\x13.cln.ShowrunesRunes\"\x9d\x02\n\x0eShowrunesRunes\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x35\n\x0crestrictions\x18\x03 \x03(\x0b\x32\x1f.cln.ShowrunesRunesRestrictions\x12\x1f\n\x17restrictions_as_english\x18\x04 \x01(\t\x12\x13\n\x06stored\x18\x05 \x01(\x08H\x00\x88\x01\x01\x12\x18\n\x0b\x62lacklisted\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tlast_used\x18\x07 \x01(\x01H\x02\x88\x01\x01\x12\x15\n\x08our_rune\x18\x08 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_storedB\x0e\n\x0c_blacklistedB\x0c\n\n_last_usedB\x0b\n\t_our_rune\"p\n\x1aShowrunesRunesRestrictions\x12\x41\n\x0c\x61lternatives\x18\x01 \x03(\x0b\x32+.cln.ShowrunesRunesRestrictionsAlternatives\x12\x0f\n\x07\x65nglish\x18\x02 \x01(\t\"n\n&ShowrunesRunesRestrictionsAlternatives\x12\x11\n\tfieldname\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x11\n\tcondition\x18\x03 \x01(\t\x12\x0f\n\x07\x65nglish\x18\x04 \x01(\t\"r\n\x17\x41skreneunreserveRequest\x12\'\n\x04path\x18\x01 \x03(\x0b\x32\x19.cln.AskreneunreservePath\x12\x1b\n\x0e\x64\x65v_remove_all\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x11\n\x0f_dev_remove_all\"\x1a\n\x18\x41skreneunreserveResponse\"t\n\x14\x41skreneunreservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1c\n\x14short_channel_id_dir\x18\x04 \x01(\t\x12\x12\n\x05layer\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"8\n\x18\x41skrenelistlayersRequest\x12\x12\n\x05layer\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"I\n\x19\x41skrenelistlayersResponse\x12,\n\x06layers\x18\x01 \x03(\x0b\x32\x1c.cln.AskrenelistlayersLayers\"\xaa\x03\n\x17\x41skrenelistlayersLayers\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x16\n\x0e\x64isabled_nodes\x18\x02 \x03(\x0c\x12\x45\n\x10\x63reated_channels\x18\x03 \x03(\x0b\x32+.cln.AskrenelistlayersLayersCreatedChannels\x12<\n\x0b\x63onstraints\x18\x04 \x03(\x0b\x32\'.cln.AskrenelistlayersLayersConstraints\x12\x12\n\npersistent\x18\x05 \x01(\x08\x12\x19\n\x11\x64isabled_channels\x18\x06 \x03(\t\x12\x43\n\x0f\x63hannel_updates\x18\x07 \x03(\x0b\x32*.cln.AskrenelistlayersLayersChannelUpdates\x12\x32\n\x06\x62iases\x18\x08 \x03(\x0b\x32\".cln.AskrenelistlayersLayersBiases\x12;\n\x0bnode_biases\x18\t \x03(\x0b\x32&.cln.AskrenelistlayersLayersNodeBiases\"\x8b\x01\n&AskrenelistlayersLayersCreatedChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\"\n\rcapacity_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\"\xa8\x03\n%AskrenelistlayersLayersChannelUpdates\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x14\n\x07\x65nabled\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12+\n\x11htlc_minimum_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1e\n\x11\x63ltv_expiry_delta\x18\x07 \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_enabledB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x14\n\x12_cltv_expiry_delta\"\xda\x01\n\"AskrenelistlayersLayersConstraints\x12&\n\x0cmaximum_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12&\n\x0cminimum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x1c\n\x14short_channel_id_dir\x18\x05 \x01(\t\x12\x16\n\ttimestamp\x18\x06 \x01(\x04H\x02\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msatB\x0c\n\n_timestamp\"\x9b\x01\n\x1d\x41skrenelistlayersLayersBiases\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x0c\n\x04\x62ias\x18\x02 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x04 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\x91\x01\n!AskrenelistlayersLayersNodeBiases\x12\x0c\n\x04node\x18\x01 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x02 \x01(\x12\x12\x10\n\x08out_bias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x42\x0e\n\x0c_description\"R\n\x19\x41skrenecreatelayerRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x17\n\npersistent\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_persistent\"K\n\x1a\x41skrenecreatelayerResponse\x12-\n\x06layers\x18\x01 \x03(\x0b\x32\x1d.cln.AskrenecreatelayerLayers\"\xb0\x03\n\x18\x41skrenecreatelayerLayers\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x12\n\npersistent\x18\x02 \x01(\x08\x12\x16\n\x0e\x64isabled_nodes\x18\x03 \x03(\x0c\x12\x19\n\x11\x64isabled_channels\x18\x04 \x03(\t\x12\x46\n\x10\x63reated_channels\x18\x05 \x03(\x0b\x32,.cln.AskrenecreatelayerLayersCreatedChannels\x12\x44\n\x0f\x63hannel_updates\x18\x06 \x03(\x0b\x32+.cln.AskrenecreatelayerLayersChannelUpdates\x12=\n\x0b\x63onstraints\x18\x07 \x03(\x0b\x32(.cln.AskrenecreatelayerLayersConstraints\x12\x33\n\x06\x62iases\x18\x08 \x03(\x0b\x32#.cln.AskrenecreatelayerLayersBiases\x12<\n\x0bnode_biases\x18\t \x03(\x0b\x32\'.cln.AskrenecreatelayerLayersNodeBiases\"\x8c\x01\n\'AskrenecreatelayerLayersCreatedChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\"\n\rcapacity_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\"\xd1\x02\n&AskrenecreatelayerLayersChannelUpdates\x12+\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x12\n\x05\x64\x65lay\x18\x05 \x01(\rH\x04\x88\x01\x01\x42\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x08\n\x06_delay\"\xc4\x01\n#AskrenecreatelayerLayersConstraints\x12\x18\n\x10short_channel_id\x18\x01 \x01(\t\x12\x11\n\tdirection\x18\x02 \x01(\r\x12&\n\x0cmaximum_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12&\n\x0cminimum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msat\"\x9c\x01\n\x1e\x41skrenecreatelayerLayersBiases\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x0c\n\x04\x62ias\x18\x02 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x04 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\x92\x01\n\"AskrenecreatelayerLayersNodeBiases\x12\x0c\n\x04node\x18\x01 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x02 \x01(\x12\x12\x10\n\x08out_bias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x42\x0e\n\x0c_description\"*\n\x19\x41skreneremovelayerRequest\x12\r\n\x05layer\x18\x01 \x01(\t\"\x1c\n\x1a\x41skreneremovelayerResponse\">\n\x15\x41skrenereserveRequest\x12%\n\x04path\x18\x01 \x03(\x0b\x32\x17.cln.AskrenereservePath\"\x18\n\x16\x41skrenereserveResponse\"r\n\x12\x41skrenereservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1c\n\x14short_channel_id_dir\x18\x04 \x01(\t\x12\x12\n\x05layer\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"2\n\x11\x41skreneageRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0e\n\x06\x63utoff\x18\x02 \x01(\x04\"8\n\x12\x41skreneageResponse\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x13\n\x0bnum_removed\x18\x02 \x01(\x04\"\xe7\x01\n\x10GetroutesRequest\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12 \n\x0bmaxfee_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\nfinal_cltv\x18\x07 \x01(\r\x12\x15\n\x08maxdelay\x18\x08 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08maxparts\x18\t \x01(\rH\x01\x88\x01\x01\x42\x0b\n\t_maxdelayB\x0b\n\t_maxparts\"R\n\x11GetroutesResponse\x12\x17\n\x0fprobability_ppm\x18\x01 \x01(\x04\x12$\n\x06routes\x18\x02 \x03(\x0b\x32\x14.cln.GetroutesRoutes\"\x88\x01\n\x0fGetroutesRoutes\x12\x17\n\x0fprobability_ppm\x18\x01 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x04path\x18\x03 \x03(\x0b\x32\x18.cln.GetroutesRoutesPath\x12\x12\n\nfinal_cltv\x18\x04 \x01(\r\"\xc8\x03\n\x13GetroutesRoutesPath\x12%\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x19\n\x0cnext_node_id\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05\x64\x65lay\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x1c\n\x14short_channel_id_dir\x18\x06 \x01(\t\x12(\n\x0e\x61mount_in_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12)\n\x0f\x61mount_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x17\n\nnode_id_in\x18\t \x01(\x0cH\x05\x88\x01\x01\x12\x18\n\x0bnode_id_out\x18\n \x01(\x0cH\x06\x88\x01\x01\x12\x14\n\x07\x63ltv_in\x18\x0b \x01(\rH\x07\x88\x01\x01\x12\x15\n\x08\x63ltv_out\x18\x0c \x01(\rH\x08\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0f\n\r_next_node_idB\x08\n\x06_delayB\x11\n\x0f_amount_in_msatB\x12\n\x10_amount_out_msatB\r\n\x0b_node_id_inB\x0e\n\x0c_node_id_outB\n\n\x08_cltv_inB\x0b\n\t_cltv_out\"8\n\x19\x41skrenedisablenodeRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\"\x1c\n\x1a\x41skrenedisablenodeResponse\"\x8a\x02\n\x1b\x41skreneinformchannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x06 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12K\n\x06inform\x18\x08 \x01(\x0e\x32;.cln.AskreneinformchannelRequest.AskreneinformchannelInform\"O\n\x1a\x41skreneinformchannelInform\x12\x0f\n\x0b\x43ONSTRAINED\x10\x00\x12\x11\n\rUNCONSTRAINED\x10\x01\x12\r\n\tSUCCEEDED\x10\x02\"Y\n\x1c\x41skreneinformchannelResponse\x12\x39\n\x0b\x63onstraints\x18\x02 \x03(\x0b\x32$.cln.AskreneinformchannelConstraints\"\xd3\x01\n\x1f\x41skreneinformchannelConstraints\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\r\n\x05layer\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\x04\x12&\n\x0cmaximum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12&\n\x0cminimum_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msat\"\x8f\x01\n\x1b\x41skrenecreatechannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x03 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x04 \x01(\t\x12\"\n\rcapacity_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"\x1e\n\x1c\x41skrenecreatechannelResponse\"\xad\x03\n\x1b\x41skreneupdatechannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x14\n\x07\x65nabled\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12+\n\x11htlc_minimum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x1e\n\x11\x63ltv_expiry_delta\x18\x08 \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_enabledB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x14\n\x12_cltv_expiry_delta\"\x1e\n\x1c\x41skreneupdatechannelResponse\"\xa4\x01\n\x19\x41skrenebiaschannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x0c\n\x04\x62ias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08relative\x18\x05 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_relative\"K\n\x1a\x41skrenebiaschannelResponse\x12-\n\x06\x62iases\x18\x01 \x03(\x0b\x32\x1d.cln.AskrenebiaschannelBiases\"\xa5\x01\n\x18\x41skrenebiaschannelBiases\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x0c\n\x04\x62ias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x05 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\xa4\x01\n\x16\x41skrenebiasnodeRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x11\n\tdirection\x18\x03 \x01(\t\x12\x0c\n\x04\x62ias\x18\x04 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08relative\x18\x06 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_relative\"N\n\x17\x41skrenebiasnodeResponse\x12\x33\n\x0bnode_biases\x18\x01 \x03(\x0b\x32\x1e.cln.AskrenebiasnodeNodeBiases\"\x98\x01\n\x19\x41skrenebiasnodeNodeBiases\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x03 \x01(\x12\x12\x10\n\x08out_bias\x18\x04 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x06 \x01(\x04\x42\x0e\n\x0c_description\" \n\x1e\x41skrenelistreservationsRequest\"a\n\x1f\x41skrenelistreservationsResponse\x12>\n\x0creservations\x18\x01 \x03(\x0b\x32(.cln.AskrenelistreservationsReservations\"\x91\x01\n#AskrenelistreservationsReservations\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x16\n\x0e\x61ge_in_seconds\x18\x03 \x01(\x04\x12\x12\n\ncommand_id\x18\x04 \x01(\t\"\xf5\x02\n\x19InjectpaymentonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x63ltv_expiry\x18\x04 \x01(\r\x12\x0e\n\x06partid\x18\x05 \x01(\x04\x12\x0f\n\x07groupid\x18\x06 \x01(\x04\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12*\n\x10\x64\x65stination_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x0b \x01(\x0cH\x04\x88\x01\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x10\n\x0e_localinvreqidB\x13\n\x11_destination_msatB\x0e\n\x0c_destination\"w\n\x1aInjectpaymentonionResponse\x12\x12\n\ncreated_at\x18\x01 \x01(\x04\x12\x14\n\x0c\x63ompleted_at\x18\x02 \x01(\x04\x12\x15\n\rcreated_index\x18\x03 \x01(\x04\x12\x18\n\x10payment_preimage\x18\x04 \x01(\x0c\">\n\x19InjectonionmessageRequest\x12\x10\n\x08path_key\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x1c\n\x1aInjectonionmessageResponse\"\xbb\x03\n\x0bXpayRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12&\n\x0cpartial_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x17\n\npayer_note\x18\x08 \x01(\tH\x05\x88\x01\x01\x12\x12\n\x05label\x18\t \x01(\tH\x06\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\n \x01(\x0cH\x07\x88\x01\x01\x12\x1b\n\x0e\x64\x65v_use_shadow\x18\x0b \x01(\x08H\x08\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0f\n\r_partial_msatB\x0b\n\t_maxdelayB\r\n\x0b_payer_noteB\x08\n\x06_labelB\x10\n\x0e_localinvreqidB\x11\n\x0f_dev_use_shadow\"\xa1\x01\n\x0cXpayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x14\n\x0c\x66\x61iled_parts\x18\x02 \x01(\x04\x12\x18\n\x10successful_parts\x18\x03 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"=\n\x19SignmessagewithkeyRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"`\n\x1aSignmessagewithkeyResponse\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\x0e\n\x06\x62\x61se64\x18\x04 \x01(\t\"\xcd\x01\n\x17ListchannelmovesRequest\x12\x46\n\x05index\x18\x01 \x01(\x0e\x32\x32.cln.ListchannelmovesRequest.ListchannelmovesIndexH\x00\x88\x01\x01\x12\x12\n\x05start\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\"$\n\x15ListchannelmovesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"S\n\x18ListchannelmovesResponse\x12\x37\n\x0c\x63hannelmoves\x18\x01 \x03(\x0b\x32!.cln.ListchannelmovesChannelmoves\"\xa9\x04\n\x1cListchannelmovesChannelmoves\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x12\n\naccount_id\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12]\n\x0bprimary_tag\x18\x06 \x01(\x0e\x32H.cln.ListchannelmovesChannelmoves.ListchannelmovesChannelmovesPrimaryTag\x12\x19\n\x0cpayment_hash\x18\x07 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x07part_id\x18\x08 \x01(\x04H\x01\x88\x01\x01\x12\x15\n\x08group_id\x18\t \x01(\x04H\x02\x88\x01\x01\x12\x1e\n\tfees_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\"\x96\x01\n&ListchannelmovesChannelmovesPrimaryTag\x12\x0b\n\x07INVOICE\x10\x00\x12\n\n\x06ROUTED\x10\x01\x12\n\n\x06PUSHED\x10\x02\x12\r\n\tLEASE_FEE\x10\x03\x12\x14\n\x10\x43HANNEL_PROPOSED\x10\x04\x12\x0f\n\x0bPENALTY_ADJ\x10\x05\x12\x11\n\rJOURNAL_ENTRY\x10\x06\x42\x0f\n\r_payment_hashB\n\n\x08_part_idB\x0b\n\t_group_id\"\xc5\x01\n\x15ListchainmovesRequest\x12\x42\n\x05index\x18\x01 \x01(\x0e\x32..cln.ListchainmovesRequest.ListchainmovesIndexH\x00\x88\x01\x01\x12\x12\n\x05start\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\"\"\n\x13ListchainmovesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"K\n\x16ListchainmovesResponse\x12\x31\n\nchainmoves\x18\x01 \x03(\x0b\x32\x1d.cln.ListchainmovesChainmoves\"\xd4\x06\n\x18ListchainmovesChainmoves\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x12\n\naccount_id\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12U\n\x0bprimary_tag\x18\x06 \x01(\x0e\x32@.cln.ListchainmovesChainmoves.ListchainmovesChainmovesPrimaryTag\x12\x14\n\x07peer_id\x18\x08 \x01(\x0cH\x00\x88\x01\x01\x12 \n\x13originating_account\x18\t \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rspending_txid\x18\n \x01(\x0cH\x02\x88\x01\x01\x12\x1b\n\x04utxo\x18\x0b \x01(\x0b\x32\r.cln.Outpoint\x12\x19\n\x0cpayment_hash\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12 \n\x0boutput_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x0coutput_count\x18\x0e \x01(\rH\x04\x88\x01\x01\x12\x13\n\x0b\x62lockheight\x18\x0f \x01(\r\x12\x12\n\nextra_tags\x18\x10 \x03(\t\"\x95\x02\n\"ListchainmovesChainmovesPrimaryTag\x12\x0b\n\x07\x44\x45POSIT\x10\x00\x12\x0e\n\nWITHDRAWAL\x10\x01\x12\x0b\n\x07PENALTY\x10\x02\x12\x10\n\x0c\x43HANNEL_OPEN\x10\x03\x12\x11\n\rCHANNEL_CLOSE\x10\x04\x12\x11\n\rDELAYED_TO_US\x10\x05\x12\x0b\n\x07HTLC_TX\x10\x06\x12\x10\n\x0cHTLC_TIMEOUT\x10\x07\x12\x10\n\x0cHTLC_FULFILL\x10\x08\x12\r\n\tTO_WALLET\x10\t\x12\n\n\x06\x41NCHOR\x10\n\x12\x0b\n\x07TO_THEM\x10\x0b\x12\r\n\tPENALIZED\x10\x0c\x12\n\n\x06STOLEN\x10\r\x12\x0b\n\x07IGNORED\x10\x0e\x12\x0c\n\x08TO_MINER\x10\x0f\x42\n\n\x08_peer_idB\x16\n\x14_originating_accountB\x10\n\x0e_spending_txidB\x0f\n\r_payment_hashB\x0f\n\r_output_count\"\xe9\x01\n\x18ListnetworkeventsRequest\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12H\n\x05index\x18\x02 \x01(\x0e\x32\x34.cln.ListnetworkeventsRequest.ListnetworkeventsIndexH\x01\x88\x01\x01\x12\x12\n\x05start\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12\x12\n\x05limit\x18\x04 \x01(\rH\x03\x88\x01\x01\"%\n\x16ListnetworkeventsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x05\n\x03_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"W\n\x19ListnetworkeventsResponse\x12:\n\rnetworkevents\x18\x01 \x03(\x0b\x32#.cln.ListnetworkeventsNetworkevents\"\xf2\x01\n\x1eListnetworkeventsNetworkevents\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x0f\n\x07peer_id\x18\x03 \x01(\x0c\x12\x11\n\titem_type\x18\x04 \x01(\t\x12\x13\n\x06reason\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rduration_nsec\x18\x06 \x01(\x04H\x01\x88\x01\x01\x12\x1e\n\x11\x63onnect_attempted\x18\x07 \x01(\x08H\x02\x88\x01\x01\x42\t\n\x07_reasonB\x10\n\x0e_duration_nsecB\x14\n\x12_connect_attempted\"/\n\x16\x44\x65lnetworkeventRequest\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\"\x19\n\x17\x44\x65lnetworkeventResponse\"\xf6\x01\n\x1a\x43lnrestregisterpathRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x12\n\nrpc_method\x18\x02 \x01(\t\x12H\n\x11rune_restrictions\x18\x03 \x01(\x0b\x32(.cln.ClnrestregisterpathRuneRestrictionsH\x00\x88\x01\x01\x12\x1a\n\rrune_required\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x0bhttp_method\x18\x05 \x01(\tH\x02\x88\x01\x01\x42\x14\n\x12_rune_restrictionsB\x10\n\x0e_rune_requiredB\x0e\n\x0c_http_method\"\x1d\n\x1b\x43lnrestregisterpathResponse\"\xda\x01\n#ClnrestregisterpathRuneRestrictions\x12\x13\n\x06nodeid\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06method\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x44\n\x06params\x18\x03 \x03(\x0b\x32\x34.cln.ClnrestregisterpathRuneRestrictions.ParamsEntry\x1a-\n\x0bParamsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07_nodeidB\t\n\x07_method\",\n\x18ListcurrencyratesRequest\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\"W\n\x19ListcurrencyratesResponse\x12:\n\rcurrencyrates\x18\x01 \x03(\x0b\x32#.cln.ListcurrencyratesCurrencyrates\"@\n\x1eListcurrencyratesCurrencyrates\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x01\":\n\x16\x43urrencyconvertRequest\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x01\x12\x10\n\x08\x63urrency\x18\x02 \x01(\t\"4\n\x17\x43urrencyconvertResponse\x12\x19\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\"\'\n\x13\x43urrencyrateRequest\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\"$\n\x14\x43urrencyrateResponse\x12\x0c\n\x04rate\x18\x01 \x01(\x01\"\x1e\n\x1cStreamBalanceSnapshotRequest\"\x86\x01\n\x1b\x42\x61lanceSnapshotNotification\x12\x0f\n\x07node_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x62lockheight\x18\x02 \x01(\r\x12\x11\n\ttimestamp\x18\x03 \x01(\r\x12.\n\x08\x61\x63\x63ounts\x18\x04 \x03(\x0b\x32\x1c.cln.BalanceSnapshotAccounts\"c\n\x17\x42\x61lanceSnapshotAccounts\x12\x12\n\naccount_id\x18\x01 \x01(\t\x12!\n\x0c\x62\x61lance_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\tcoin_type\x18\x03 \x01(\t\"\x19\n\x17StreamBlockAddedRequest\"6\n\x16\x42lockAddedNotification\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\x0e\n\x06height\x18\x02 \x01(\r\" \n\x1eStreamChannelOpenFailedRequest\"3\n\x1d\x43hannelOpenFailedNotification\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"\x1c\n\x1aStreamChannelOpenedRequest\"w\n\x19\x43hannelOpenedNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12!\n\x0c\x66unding_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\x12\x15\n\rchannel_ready\x18\x04 \x01(\x08\"\"\n StreamChannelStateChangedRequest\"\xc1\x03\n\x1f\x43hannelStateChangedNotification\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x04 \x01(\t\x12)\n\told_state\x18\x05 \x01(\x0e\x32\x11.cln.ChannelStateH\x01\x88\x01\x01\x12$\n\tnew_state\x18\x06 \x01(\x0e\x32\x11.cln.ChannelState\x12L\n\x05\x63\x61use\x18\x07 \x01(\x0e\x32=.cln.ChannelStateChangedNotification.ChannelStateChangedCause\x12\x14\n\x07message\x18\x08 \x01(\tH\x02\x88\x01\x01\"c\n\x18\x43hannelStateChangedCause\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05LOCAL\x10\x01\x12\x08\n\x04USER\x10\x02\x12\n\n\x06REMOTE\x10\x03\x12\x0c\n\x08PROTOCOL\x10\x04\x12\x0b\n\x07ONCHAIN\x10\x05\x42\x13\n\x11_short_channel_idB\x0c\n\n_old_stateB\n\n\x08_message\"\x16\n\x14StreamConnectRequest\"\xbe\x01\n\x17PeerConnectNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x44\n\tdirection\x18\x02 \x01(\x0e\x32\x31.cln.PeerConnectNotification.PeerConnectDirection\x12(\n\x07\x61\x64\x64ress\x18\x03 \x01(\x0b\x32\x17.cln.PeerConnectAddress\"\'\n\x14PeerConnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\x9a\x02\n\x12PeerConnectAddress\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.PeerConnectAddress.PeerConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"c\n\x16PeerConnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x12\r\n\tWEBSOCKET\x10\x05\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"\x1b\n\x19StreamCoinMovementRequest\"\x9f\x0b\n\x18\x43oinMovementNotification\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\tcoin_type\x18\x02 \x01(\t\x12\x0f\n\x07node_id\x18\x03 \x01(\x0c\x12\x41\n\titem_type\x18\x04 \x01(\x0e\x32..cln.CoinMovementNotification.CoinMovementType\x12\x1a\n\rcreated_index\x18\x05 \x01(\x04H\x00\x88\x01\x01\x12\x12\n\naccount_id\x18\x06 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\t \x01(\x04\x12\x0c\n\x04tags\x18\n \x03(\t\x12N\n\x0bprimary_tag\x18\x0b \x01(\x0e\x32\x34.cln.CoinMovementNotification.CoinMovementPrimaryTagH\x01\x88\x01\x01\x12\x12\n\nextra_tags\x18\x0c \x03(\t\x12\x19\n\x0cpayment_hash\x18\r \x01(\x0cH\x02\x88\x01\x01\x12\x14\n\x07part_id\x18\x0e \x01(\x04H\x03\x88\x01\x01\x12\x15\n\x08group_id\x18\x0f \x01(\x04H\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x10 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12 \n\x04utxo\x18\x11 \x01(\x0b\x32\r.cln.OutpointH\x06\x88\x01\x01\x12\x14\n\x07peer_id\x18\x12 \x01(\x0cH\x07\x88\x01\x01\x12 \n\x13originating_account\x18\x13 \x01(\tH\x08\x88\x01\x01\x12\x11\n\x04txid\x18\x14 \x01(\x0cH\t\x88\x01\x01\x12\x1a\n\rspending_txid\x18\x15 \x01(\x0cH\n\x88\x01\x01\x12\x16\n\tutxo_txid\x18\x16 \x01(\x0cH\x0b\x88\x01\x01\x12\x11\n\x04vout\x18\x17 \x01(\rH\x0c\x88\x01\x01\x12%\n\x0boutput_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\r\x88\x01\x01\x12\x19\n\x0coutput_count\x18\x19 \x01(\rH\x0e\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\x1a \x01(\rH\x0f\x88\x01\x01\"2\n\x10\x43oinMovementType\x12\x0f\n\x0b\x43HANNEL_MVT\x10\x00\x12\r\n\tCHAIN_MVT\x10\x01\"\xf7\x02\n\x16\x43oinMovementPrimaryTag\x12\x0b\n\x07\x44\x45POSIT\x10\x00\x12\x0e\n\nWITHDRAWAL\x10\x01\x12\x0b\n\x07PENALTY\x10\x02\x12\x10\n\x0c\x43HANNEL_OPEN\x10\x03\x12\x11\n\rCHANNEL_CLOSE\x10\x04\x12\x11\n\rDELAYED_TO_US\x10\x05\x12\x0b\n\x07HTLC_TX\x10\x06\x12\x10\n\x0cHTLC_TIMEOUT\x10\x07\x12\x10\n\x0cHTLC_FULFILL\x10\x08\x12\r\n\tTO_WALLET\x10\t\x12\n\n\x06\x41NCHOR\x10\n\x12\x0b\n\x07TO_THEM\x10\x0b\x12\r\n\tPENALIZED\x10\x0c\x12\n\n\x06STOLEN\x10\r\x12\x0b\n\x07IGNORED\x10\x0e\x12\x0c\n\x08TO_MINER\x10\x0f\x12\x0b\n\x07INVOICE\x10\x10\x12\n\n\x06ROUTED\x10\x11\x12\n\n\x06PUSHED\x10\x12\x12\r\n\tLEASE_FEE\x10\x13\x12\x14\n\x10\x43HANNEL_PROPOSED\x10\x14\x12\x0f\n\x0bPENALTY_ADJ\x10\x15\x12\x11\n\rJOURNAL_ENTRY\x10\x16\x42\x10\n\x0e_created_indexB\x0e\n\x0c_primary_tagB\x0f\n\r_payment_hashB\n\n\x08_part_idB\x0b\n\t_group_idB\x0c\n\n_fees_msatB\x07\n\x05_utxoB\n\n\x08_peer_idB\x16\n\x14_originating_accountB\x07\n\x05_txidB\x10\n\x0e_spending_txidB\x0c\n\n_utxo_txidB\x07\n\x05_voutB\x0e\n\x0c_output_msatB\x0f\n\r_output_countB\x0e\n\x0c_blockheight\"\x18\n\x16StreamCustomMsgRequest\"9\n\x15\x43ustomMsgNotification\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\" \n\x1eStreamDeprecatedOneshotRequest\"6\n\x1d\x44\x65precatedOneshotNotification\x12\x15\n\rdeprecated_ok\x18\x01 \x01(\x08\"\x19\n\x17StreamDisconnectRequest\"$\n\x16\x44isconnectNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\"\x1b\n\x19StreamForwardEventRequest\"\x88\x05\n\x18\x46orwardEventNotification\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x12\n\nin_channel\x18\x02 \x01(\t\x12\x18\n\x0bout_channel\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x07in_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\x08out_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12@\n\x06status\x18\x07 \x01(\x0e\x32\x30.cln.ForwardEventNotification.ForwardEventStatus\x12\x15\n\x08\x66\x61ilcode\x18\x08 \x01(\rH\x03\x88\x01\x01\x12\x17\n\nfailreason\x18\t \x01(\tH\x04\x88\x01\x01\x12\x43\n\x05style\x18\n \x01(\x0e\x32/.cln.ForwardEventNotification.ForwardEventStyleH\x05\x88\x01\x01\x12\x15\n\rreceived_time\x18\x0b \x01(\x01\x12\x1a\n\rresolved_time\x18\x0c \x01(\x01H\x06\x88\x01\x01\"L\n\x12\x46orwardEventStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"(\n\x11\x46orwardEventStyle\x12\n\n\x06LEGACY\x10\x00\x12\x07\n\x03TLV\x10\x01\x42\x0e\n\x0c_out_channelB\x0b\n\t_out_msatB\x0b\n\t_fee_msatB\x0b\n\t_failcodeB\r\n\x0b_failreasonB\x08\n\x06_styleB\x10\n\x0e_resolved_time\"\x1e\n\x1cStreamInvoiceCreationRequest\"g\n\x1bInvoiceCreationNotification\x12\x1e\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08preimage\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\tB\x07\n\x05_msat\"\x1d\n\x1bStreamInvoicePaymentRequest\"\x8b\x01\n\x1aInvoicePaymentNotification\x12\x19\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08preimage\x18\x02 \x01(\x0c\x12$\n\x08outpoint\x18\x03 \x01(\x0b\x32\r.cln.OutpointH\x00\x88\x01\x01\x12\r\n\x05label\x18\x04 \x01(\tB\x0b\n\t_outpoint\"\x12\n\x10StreamLogRequest\"\xca\x01\n\x0fLogNotification\x12,\n\x05level\x18\x01 \x01(\x0e\x32\x1d.cln.LogNotification.LogLevel\x12\x0c\n\x04time\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\t\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x0b\n\x03log\x18\x05 \x01(\t\"K\n\x08LogLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05TRACE\x10\x01\x12\t\n\x05\x44\x45\x42UG\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\x0b\n\x07UNUSUAL\x10\x04\x12\n\n\x06\x42ROKEN\x10\x05\"&\n$StreamOnionMessageForwardFailRequest\"\xef\x01\n#OnionMessageForwardFailNotification\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x10\n\x08incoming\x18\x02 \x01(\x0c\x12\x10\n\x08path_key\x18\x03 \x01(\x0c\x12\x15\n\x08outgoing\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x12\x19\n\x0cnext_node_id\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12&\n\x19next_short_channel_id_dir\x18\x06 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_outgoingB\x0f\n\r_next_node_idB\x1c\n\x1a_next_short_channel_id_dir\"\"\n StreamOpenChannelPeerSigsRequest\"J\n\x1fOpenChannelPeerSigsNotification\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_psbt\x18\x02 \x01(\t\"\x1c\n\x1aStreamPluginStartedRequest\"V\n\x19PluginStartedNotification\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\x12\x13\n\x0bplugin_path\x18\x02 \x01(\t\x12\x0f\n\x07methods\x18\x03 \x03(\t\"\x1c\n\x1aStreamPluginStoppedRequest\"V\n\x19PluginStoppedNotification\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\x12\x13\n\x0bplugin_path\x18\x02 \x01(\t\x12\x0f\n\x07methods\x18\x03 \x03(\t\"\x1d\n\x1bStreamSendPayFailureRequest\"b\n\x1aSendPayFailureNotification\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x12\x12\x0f\n\x07message\x18\x02 \x01(\t\x12%\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x17.cln.SendpayFailureData\"\xc1\t\n\x12SendpayFailureData\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x03\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x06\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x12*\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x17\n\ncreated_at\x18\n \x01(\x04H\t\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\n\x88\x01\x01\x12\x45\n\x06status\x18\x0c \x01(\x0e\x32\x30.cln.SendpayFailureData.SendpayFailureDataStatusH\x0b\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x0c\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\r\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x0e\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\x0f\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x11 \x01(\tH\x10\x88\x01\x01\x12\x17\n\nerroronion\x18\x12 \x01(\x0cH\x11\x88\x01\x01\x12\x17\n\nonionreply\x18\x13 \x01(\x0cH\x12\x88\x01\x01\x12\x19\n\x0c\x65rring_index\x18\x14 \x01(\rH\x13\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x15 \x01(\rH\x14\x88\x01\x01\x12\x19\n\x0c\x66\x61ilcodename\x18\x16 \x01(\tH\x15\x88\x01\x01\x12\x18\n\x0b\x65rring_node\x18\x17 \x01(\x0cH\x16\x88\x01\x01\x12\x1b\n\x0e\x65rring_channel\x18\x18 \x01(\tH\x17\x88\x01\x01\x12\x1d\n\x10\x65rring_direction\x18\x19 \x01(\rH\x18\x88\x01\x01\x12\x18\n\x0braw_message\x18\x1a \x01(\x0cH\x19\x88\x01\x01\"A\n\x18SendpayFailureDataStatus\x12\n\n\x06\x46\x41ILED\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x10\n\x0e_created_indexB\x05\n\x03_idB\x0f\n\r_payment_hashB\n\n\x08_groupidB\x10\n\x0e_updated_indexB\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x13\n\x11_amount_sent_msatB\r\n\x0b_created_atB\x0f\n\r_completed_atB\t\n\x07_statusB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_descriptionB\r\n\x0b_erroronionB\r\n\x0b_onionreplyB\x0f\n\r_erring_indexB\x0b\n\t_failcodeB\x0f\n\r_failcodenameB\x0e\n\x0c_erring_nodeB\x11\n\x0f_erring_channelB\x13\n\x11_erring_directionB\x0e\n\x0c_raw_message\"\x1d\n\x1bStreamSendPaySuccessRequest\"\xcc\x05\n\x1aSendPaySuccessNotification\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x0f\n\x07groupid\x18\x04 \x01(\x04\x12\x1a\n\rupdated_index\x18\x05 \x01(\x04H\x00\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x02\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12%\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\ncreated_at\x18\n \x01(\x04\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12\x44\n\x06status\x18\x0c \x01(\x0e\x32\x34.cln.SendPaySuccessNotification.SendpaySuccessStatus\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x05\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\x08\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x11 \x01(\tH\t\x88\x01\x01\x12\x17\n\nerroronion\x18\x12 \x01(\x0cH\n\x88\x01\x01\"$\n\x14SendpaySuccessStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\x10\n\x0e_updated_indexB\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x0f\n\r_completed_atB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_descriptionB\r\n\x0b_erroronion\"\x17\n\x15StreamShutdownRequest\"\x16\n\x14ShutdownNotification\"\x16\n\x14StreamWarningRequest\"\xae\x01\n\x13WarningNotification\x12\x34\n\x05level\x18\x01 \x01(\x0e\x32%.cln.WarningNotification.WarningLevel\x12\x0c\n\x04time\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\t\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x0b\n\x03log\x18\x05 \x01(\t\"#\n\x0cWarningLevel\x12\x08\n\x04WARN\x10\x00\x12\t\n\x05\x45RROR\x10\x01\"\x19\n\x17StreamPayPartEndRequest\"\xf1\x03\n\x16PayPartEndNotification\x12<\n\x06status\x18\x01 \x01(\x0e\x32,.cln.PayPartEndNotification.PayPartEndStatus\x12\x10\n\x08\x64uration\x18\x02 \x01(\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x0f\n\x07groupid\x18\x04 \x01(\x04\x12\x0e\n\x06partid\x18\x05 \x01(\x04\x12\x17\n\nfailed_msg\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x61iled_node_id\x18\x07 \x01(\x0cH\x01\x88\x01\x01\x12$\n\x17\x66\x61iled_short_channel_id\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10\x66\x61iled_direction\x18\t \x01(\rH\x03\x88\x01\x01\x12\x17\n\nerror_code\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rerror_message\x18\x0b \x01(\tH\x05\x88\x01\x01\",\n\x10PayPartEndStatus\x12\x0b\n\x07SUCCESS\x10\x00\x12\x0b\n\x07\x46\x41ILURE\x10\x01\x42\r\n\x0b_failed_msgB\x11\n\x0f_failed_node_idB\x1a\n\x18_failed_short_channel_idB\x13\n\x11_failed_directionB\r\n\x0b_error_codeB\x10\n\x0e_error_message\"\x1b\n\x19StreamPayPartStartRequest\"\xc2\x01\n\x18PayPartStartNotification\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x0e\n\x06partid\x18\x03 \x01(\x04\x12\'\n\x12total_payment_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x0c\x61ttempt_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x04hops\x18\x06 \x03(\x0b\x32\x15.cln.PayPartStartHops\"\x9f\x01\n\x10PayPartStartHops\x12\x11\n\tnext_node\x18\x01 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x02 \x01(\t\x12\x11\n\tdirection\x18\x03 \x01(\r\x12$\n\x0f\x63hannel_in_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x63hannel_out_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount2\xce\x65\n\x04Node\x12\x36\n\x07Getinfo\x12\x13.cln.GetinfoRequest\x1a\x14.cln.GetinfoResponse\"\x00\x12<\n\tListPeers\x12\x15.cln.ListpeersRequest\x1a\x16.cln.ListpeersResponse\"\x00\x12<\n\tListFunds\x12\x15.cln.ListfundsRequest\x1a\x16.cln.ListfundsResponse\"\x00\x12\x36\n\x07SendPay\x12\x13.cln.SendpayRequest\x1a\x14.cln.SendpayResponse\"\x00\x12\x45\n\x0cListChannels\x12\x18.cln.ListchannelsRequest\x1a\x19.cln.ListchannelsResponse\"\x00\x12<\n\tAddGossip\x12\x15.cln.AddgossipRequest\x1a\x16.cln.AddgossipResponse\"\x00\x12H\n\rAddPsbtOutput\x12\x19.cln.AddpsbtoutputRequest\x1a\x1a.cln.AddpsbtoutputResponse\"\x00\x12H\n\rAutoCleanOnce\x12\x19.cln.AutocleanonceRequest\x1a\x1a.cln.AutocleanonceResponse\"\x00\x12N\n\x0f\x41utoCleanStatus\x12\x1b.cln.AutocleanstatusRequest\x1a\x1c.cln.AutocleanstatusResponse\"\x00\x12\x45\n\x0c\x43heckMessage\x12\x18.cln.CheckmessageRequest\x1a\x19.cln.CheckmessageResponse\"\x00\x12\x30\n\x05\x43lose\x12\x11.cln.CloseRequest\x1a\x12.cln.CloseResponse\"\x00\x12:\n\x0b\x43onnectPeer\x12\x13.cln.ConnectRequest\x1a\x14.cln.ConnectResponse\"\x00\x12H\n\rCreateInvoice\x12\x19.cln.CreateinvoiceRequest\x1a\x1a.cln.CreateinvoiceResponse\"\x00\x12<\n\tDatastore\x12\x15.cln.DatastoreRequest\x1a\x16.cln.DatastoreResponse\"\x00\x12K\n\x0e\x44\x61tastoreUsage\x12\x1a.cln.DatastoreusageRequest\x1a\x1b.cln.DatastoreusageResponse\"\x00\x12\x42\n\x0b\x43reateOnion\x12\x17.cln.CreateonionRequest\x1a\x18.cln.CreateonionResponse\"\x00\x12\x45\n\x0c\x44\x65lDatastore\x12\x18.cln.DeldatastoreRequest\x1a\x19.cln.DeldatastoreResponse\"\x00\x12?\n\nDelInvoice\x12\x16.cln.DelinvoiceRequest\x1a\x17.cln.DelinvoiceResponse\"\x00\x12Q\n\x10\x44\x65vForgetChannel\x12\x1c.cln.DevforgetchannelRequest\x1a\x1d.cln.DevforgetchannelResponse\"\x00\x12Q\n\x10\x45mergencyRecover\x12\x1c.cln.EmergencyrecoverRequest\x1a\x1d.cln.EmergencyrecoverResponse\"\x00\x12\x66\n\x17GetEmergencyRecoverData\x12#.cln.GetemergencyrecoverdataRequest\x1a$.cln.GetemergencyrecoverdataResponse\"\x00\x12\x45\n\x0c\x45xposeSecret\x12\x18.cln.ExposesecretRequest\x1a\x19.cln.ExposesecretResponse\"\x00\x12\x36\n\x07Recover\x12\x13.cln.RecoverRequest\x1a\x14.cln.RecoverResponse\"\x00\x12K\n\x0eRecoverChannel\x12\x1a.cln.RecoverchannelRequest\x1a\x1b.cln.RecoverchannelResponse\"\x00\x12\x36\n\x07Invoice\x12\x13.cln.InvoiceRequest\x1a\x14.cln.InvoiceResponse\"\x00\x12Q\n\x14\x43reateInvoiceRequest\x12\x1a.cln.InvoicerequestRequest\x1a\x1b.cln.InvoicerequestResponse\"\x00\x12`\n\x15\x44isableInvoiceRequest\x12!.cln.DisableinvoicerequestRequest\x1a\".cln.DisableinvoicerequestResponse\"\x00\x12Z\n\x13ListInvoiceRequests\x12\x1f.cln.ListinvoicerequestsRequest\x1a .cln.ListinvoicerequestsResponse\"\x00\x12H\n\rListDatastore\x12\x19.cln.ListdatastoreRequest\x1a\x1a.cln.ListdatastoreResponse\"\x00\x12\x45\n\x0cListInvoices\x12\x18.cln.ListinvoicesRequest\x1a\x19.cln.ListinvoicesResponse\"\x00\x12<\n\tSendOnion\x12\x15.cln.SendonionRequest\x1a\x16.cln.SendonionResponse\"\x00\x12\x45\n\x0cListSendPays\x12\x18.cln.ListsendpaysRequest\x1a\x19.cln.ListsendpaysResponse\"\x00\x12Q\n\x10ListTransactions\x12\x1c.cln.ListtransactionsRequest\x1a\x1d.cln.ListtransactionsResponse\"\x00\x12?\n\nMakeSecret\x12\x16.cln.MakesecretRequest\x1a\x17.cln.MakesecretResponse\"\x00\x12*\n\x03Pay\x12\x0f.cln.PayRequest\x1a\x10.cln.PayResponse\"\x00\x12<\n\tListNodes\x12\x15.cln.ListnodesRequest\x1a\x16.cln.ListnodesResponse\"\x00\x12K\n\x0eWaitAnyInvoice\x12\x1a.cln.WaitanyinvoiceRequest\x1a\x1b.cln.WaitanyinvoiceResponse\"\x00\x12\x42\n\x0bWaitInvoice\x12\x17.cln.WaitinvoiceRequest\x1a\x18.cln.WaitinvoiceResponse\"\x00\x12\x42\n\x0bWaitSendPay\x12\x17.cln.WaitsendpayRequest\x1a\x18.cln.WaitsendpayResponse\"\x00\x12\x36\n\x07NewAddr\x12\x13.cln.NewaddrRequest\x1a\x14.cln.NewaddrResponse\"\x00\x12\x39\n\x08Withdraw\x12\x14.cln.WithdrawRequest\x1a\x15.cln.WithdrawResponse\"\x00\x12\x36\n\x07KeySend\x12\x13.cln.KeysendRequest\x1a\x14.cln.KeysendResponse\"\x00\x12\x39\n\x08\x46undPsbt\x12\x14.cln.FundpsbtRequest\x1a\x15.cln.FundpsbtResponse\"\x00\x12\x39\n\x08SendPsbt\x12\x14.cln.SendpsbtRequest\x1a\x15.cln.SendpsbtResponse\"\x00\x12\x39\n\x08SignPsbt\x12\x14.cln.SignpsbtRequest\x1a\x15.cln.SignpsbtResponse\"\x00\x12\x39\n\x08UtxoPsbt\x12\x14.cln.UtxopsbtRequest\x1a\x15.cln.UtxopsbtResponse\"\x00\x12<\n\tTxDiscard\x12\x15.cln.TxdiscardRequest\x1a\x16.cln.TxdiscardResponse\"\x00\x12<\n\tTxPrepare\x12\x15.cln.TxprepareRequest\x1a\x16.cln.TxprepareResponse\"\x00\x12\x33\n\x06TxSend\x12\x12.cln.TxsendRequest\x1a\x13.cln.TxsendResponse\"\x00\x12Q\n\x10ListPeerChannels\x12\x1c.cln.ListpeerchannelsRequest\x1a\x1d.cln.ListpeerchannelsResponse\"\x00\x12W\n\x12ListClosedChannels\x12\x1e.cln.ListclosedchannelsRequest\x1a\x1f.cln.ListclosedchannelsResponse\"\x00\x12\x33\n\x06\x44\x65\x63ode\x12\x12.cln.DecodeRequest\x1a\x13.cln.DecodeResponse\"\x00\x12\x33\n\x06\x44\x65lPay\x12\x12.cln.DelpayRequest\x1a\x13.cln.DelpayResponse\"\x00\x12?\n\nDelForward\x12\x16.cln.DelforwardRequest\x1a\x17.cln.DelforwardResponse\"\x00\x12\x45\n\x0c\x44isableOffer\x12\x18.cln.DisableofferRequest\x1a\x19.cln.DisableofferResponse\"\x00\x12\x42\n\x0b\x45nableOffer\x12\x17.cln.EnableofferRequest\x1a\x18.cln.EnableofferResponse\"\x00\x12?\n\nDisconnect\x12\x16.cln.DisconnectRequest\x1a\x17.cln.DisconnectResponse\"\x00\x12\x39\n\x08\x46\x65\x65rates\x12\x14.cln.FeeratesRequest\x1a\x15.cln.FeeratesResponse\"\x00\x12\x42\n\x0b\x46\x65tchBip353\x12\x17.cln.Fetchbip353Request\x1a\x18.cln.Fetchbip353Response\"\x00\x12\x45\n\x0c\x46\x65tchInvoice\x12\x18.cln.FetchinvoiceRequest\x1a\x19.cln.FetchinvoiceResponse\"\x00\x12\x63\n\x16\x43\x61ncelRecurringInvoice\x12\".cln.CancelrecurringinvoiceRequest\x1a#.cln.CancelrecurringinvoiceResponse\"\x00\x12T\n\x11\x46undChannelCancel\x12\x1d.cln.FundchannelCancelRequest\x1a\x1e.cln.FundchannelCancelResponse\"\x00\x12Z\n\x13\x46undChannelComplete\x12\x1f.cln.FundchannelCompleteRequest\x1a .cln.FundchannelCompleteResponse\"\x00\x12\x42\n\x0b\x46undChannel\x12\x17.cln.FundchannelRequest\x1a\x18.cln.FundchannelResponse\"\x00\x12Q\n\x10\x46undChannelStart\x12\x1c.cln.FundchannelStartRequest\x1a\x1d.cln.FundchannelStartResponse\"\x00\x12\x33\n\x06GetLog\x12\x12.cln.GetlogRequest\x1a\x13.cln.GetlogResponse\"\x00\x12\x45\n\x0c\x46underUpdate\x12\x18.cln.FunderupdateRequest\x1a\x19.cln.FunderupdateResponse\"\x00\x12\x39\n\x08GetRoute\x12\x14.cln.GetrouteRequest\x1a\x15.cln.GetrouteResponse\"\x00\x12H\n\rListAddresses\x12\x19.cln.ListaddressesRequest\x1a\x1a.cln.ListaddressesResponse\"\x00\x12\x45\n\x0cListForwards\x12\x18.cln.ListforwardsRequest\x1a\x19.cln.ListforwardsResponse\"\x00\x12?\n\nListOffers\x12\x16.cln.ListoffersRequest\x1a\x17.cln.ListoffersResponse\"\x00\x12\x39\n\x08ListPays\x12\x14.cln.ListpaysRequest\x1a\x15.cln.ListpaysResponse\"\x00\x12<\n\tListHtlcs\x12\x15.cln.ListhtlcsRequest\x1a\x16.cln.ListhtlcsResponse\"\x00\x12Q\n\x10MultiFundChannel\x12\x1c.cln.MultifundchannelRequest\x1a\x1d.cln.MultifundchannelResponse\"\x00\x12H\n\rMultiWithdraw\x12\x19.cln.MultiwithdrawRequest\x1a\x1a.cln.MultiwithdrawResponse\"\x00\x12\x30\n\x05Offer\x12\x11.cln.OfferRequest\x1a\x12.cln.OfferResponse\"\x00\x12Q\n\x10OpenChannelAbort\x12\x1c.cln.OpenchannelAbortRequest\x1a\x1d.cln.OpenchannelAbortResponse\"\x00\x12N\n\x0fOpenChannelBump\x12\x1b.cln.OpenchannelBumpRequest\x1a\x1c.cln.OpenchannelBumpResponse\"\x00\x12N\n\x0fOpenChannelInit\x12\x1b.cln.OpenchannelInitRequest\x1a\x1c.cln.OpenchannelInitResponse\"\x00\x12T\n\x11OpenChannelSigned\x12\x1d.cln.OpenchannelSignedRequest\x1a\x1e.cln.OpenchannelSignedResponse\"\x00\x12T\n\x11OpenChannelUpdate\x12\x1d.cln.OpenchannelUpdateRequest\x1a\x1e.cln.OpenchannelUpdateResponse\"\x00\x12-\n\x04Ping\x12\x10.cln.PingRequest\x1a\x11.cln.PingResponse\"\x00\x12\x33\n\x06Plugin\x12\x12.cln.PluginRequest\x1a\x13.cln.PluginResponse\"\x00\x12H\n\rRenePayStatus\x12\x19.cln.RenepaystatusRequest\x1a\x1a.cln.RenepaystatusResponse\"\x00\x12\x36\n\x07RenePay\x12\x13.cln.RenepayRequest\x1a\x14.cln.RenepayResponse\"\x00\x12H\n\rReserveInputs\x12\x19.cln.ReserveinputsRequest\x1a\x1a.cln.ReserveinputsResponse\"\x00\x12H\n\rSendCustomMsg\x12\x19.cln.SendcustommsgRequest\x1a\x1a.cln.SendcustommsgResponse\"\x00\x12\x42\n\x0bSendInvoice\x12\x17.cln.SendinvoiceRequest\x1a\x18.cln.SendinvoiceResponse\"\x00\x12?\n\nSetChannel\x12\x16.cln.SetchannelRequest\x1a\x17.cln.SetchannelResponse\"\x00\x12<\n\tSetConfig\x12\x15.cln.SetconfigRequest\x1a\x16.cln.SetconfigResponse\"\x00\x12K\n\x0eSetPsbtVersion\x12\x1a.cln.SetpsbtversionRequest\x1a\x1b.cln.SetpsbtversionResponse\"\x00\x12\x42\n\x0bSignInvoice\x12\x17.cln.SigninvoiceRequest\x1a\x18.cln.SigninvoiceResponse\"\x00\x12\x42\n\x0bSignMessage\x12\x17.cln.SignmessageRequest\x1a\x18.cln.SignmessageResponse\"\x00\x12?\n\nSpliceInit\x12\x16.cln.SpliceInitRequest\x1a\x17.cln.SpliceInitResponse\"\x00\x12\x45\n\x0cSpliceSigned\x12\x18.cln.SpliceSignedRequest\x1a\x19.cln.SpliceSignedResponse\"\x00\x12\x45\n\x0cSpliceUpdate\x12\x18.cln.SpliceUpdateRequest\x1a\x19.cln.SpliceUpdateResponse\"\x00\x12\x39\n\x08SpliceIn\x12\x14.cln.SpliceinRequest\x1a\x15.cln.SpliceinResponse\"\x00\x12<\n\tSpliceOut\x12\x15.cln.SpliceoutRequest\x1a\x16.cln.SpliceoutResponse\"\x00\x12<\n\tDevSplice\x12\x15.cln.DevspliceRequest\x1a\x16.cln.DevspliceResponse\"\x00\x12N\n\x0fUnreserveInputs\x12\x1b.cln.UnreserveinputsRequest\x1a\x1c.cln.UnreserveinputsResponse\"\x00\x12H\n\rUpgradeWallet\x12\x19.cln.UpgradewalletRequest\x1a\x1a.cln.UpgradewalletResponse\"\x00\x12N\n\x0fWaitBlockHeight\x12\x1b.cln.WaitblockheightRequest\x1a\x1c.cln.WaitblockheightResponse\"\x00\x12-\n\x04Wait\x12\x10.cln.WaitRequest\x1a\x11.cln.WaitResponse\"\x00\x12\x42\n\x0bListConfigs\x12\x17.cln.ListconfigsRequest\x1a\x18.cln.ListconfigsResponse\"\x00\x12-\n\x04Stop\x12\x10.cln.StopRequest\x1a\x11.cln.StopResponse\"\x00\x12-\n\x04Help\x12\x10.cln.HelpRequest\x1a\x11.cln.HelpResponse\"\x00\x12T\n\x11PreApproveKeysend\x12\x1d.cln.PreapprovekeysendRequest\x1a\x1e.cln.PreapprovekeysendResponse\"\x00\x12T\n\x11PreApproveInvoice\x12\x1d.cln.PreapproveinvoiceRequest\x1a\x1e.cln.PreapproveinvoiceResponse\"\x00\x12\x45\n\x0cStaticBackup\x12\x18.cln.StaticbackupRequest\x1a\x19.cln.StaticbackupResponse\"\x00\x12N\n\x0f\x42kprChannelsApy\x12\x1b.cln.BkprchannelsapyRequest\x1a\x1c.cln.BkprchannelsapyResponse\"\x00\x12T\n\x11\x42kprDumpIncomeCsv\x12\x1d.cln.BkprdumpincomecsvRequest\x1a\x1e.cln.BkprdumpincomecsvResponse\"\x00\x12\x42\n\x0b\x42kprInspect\x12\x17.cln.BkprinspectRequest\x1a\x18.cln.BkprinspectResponse\"\x00\x12`\n\x15\x42kprListAccountEvents\x12!.cln.BkprlistaccounteventsRequest\x1a\".cln.BkprlistaccounteventsResponse\"\x00\x12Q\n\x10\x42kprListBalances\x12\x1c.cln.BkprlistbalancesRequest\x1a\x1d.cln.BkprlistbalancesResponse\"\x00\x12K\n\x0e\x42kprListIncome\x12\x1a.cln.BkprlistincomeRequest\x1a\x1b.cln.BkprlistincomeResponse\"\x00\x12{\n\x1e\x42kprEditDescriptionByPaymentId\x12*.cln.BkpreditdescriptionbypaymentidRequest\x1a+.cln.BkpreditdescriptionbypaymentidResponse\"\x00\x12x\n\x1d\x42kprEditDescriptionByOutpoint\x12).cln.BkpreditdescriptionbyoutpointRequest\x1a*.cln.BkpreditdescriptionbyoutpointResponse\"\x00\x12?\n\nBkprReport\x12\x16.cln.BkprreportRequest\x1a\x17.cln.BkprreportResponse\"\x00\x12H\n\rBlacklistRune\x12\x19.cln.BlacklistruneRequest\x1a\x1a.cln.BlacklistruneResponse\"\x00\x12<\n\tCheckRune\x12\x15.cln.CheckruneRequest\x1a\x16.cln.CheckruneResponse\"\x00\x12?\n\nCreateRune\x12\x16.cln.CreateruneRequest\x1a\x17.cln.CreateruneResponse\"\x00\x12<\n\tShowRunes\x12\x15.cln.ShowrunesRequest\x1a\x16.cln.ShowrunesResponse\"\x00\x12Q\n\x10\x41skReneUnreserve\x12\x1c.cln.AskreneunreserveRequest\x1a\x1d.cln.AskreneunreserveResponse\"\x00\x12T\n\x11\x41skReneListLayers\x12\x1d.cln.AskrenelistlayersRequest\x1a\x1e.cln.AskrenelistlayersResponse\"\x00\x12W\n\x12\x41skReneCreateLayer\x12\x1e.cln.AskrenecreatelayerRequest\x1a\x1f.cln.AskrenecreatelayerResponse\"\x00\x12W\n\x12\x41skReneRemoveLayer\x12\x1e.cln.AskreneremovelayerRequest\x1a\x1f.cln.AskreneremovelayerResponse\"\x00\x12K\n\x0e\x41skReneReserve\x12\x1a.cln.AskrenereserveRequest\x1a\x1b.cln.AskrenereserveResponse\"\x00\x12?\n\nAskReneAge\x12\x16.cln.AskreneageRequest\x1a\x17.cln.AskreneageResponse\"\x00\x12<\n\tGetRoutes\x12\x15.cln.GetroutesRequest\x1a\x16.cln.GetroutesResponse\"\x00\x12W\n\x12\x41skReneDisableNode\x12\x1e.cln.AskrenedisablenodeRequest\x1a\x1f.cln.AskrenedisablenodeResponse\"\x00\x12]\n\x14\x41skReneInformChannel\x12 .cln.AskreneinformchannelRequest\x1a!.cln.AskreneinformchannelResponse\"\x00\x12]\n\x14\x41skReneCreateChannel\x12 .cln.AskrenecreatechannelRequest\x1a!.cln.AskrenecreatechannelResponse\"\x00\x12]\n\x14\x41skReneUpdateChannel\x12 .cln.AskreneupdatechannelRequest\x1a!.cln.AskreneupdatechannelResponse\"\x00\x12W\n\x12\x41skReneBiasChannel\x12\x1e.cln.AskrenebiaschannelRequest\x1a\x1f.cln.AskrenebiaschannelResponse\"\x00\x12N\n\x0f\x41skreneBiasNode\x12\x1b.cln.AskrenebiasnodeRequest\x1a\x1c.cln.AskrenebiasnodeResponse\"\x00\x12\x66\n\x17\x41skReneListReservations\x12#.cln.AskrenelistreservationsRequest\x1a$.cln.AskrenelistreservationsResponse\"\x00\x12W\n\x12InjectPaymentOnion\x12\x1e.cln.InjectpaymentonionRequest\x1a\x1f.cln.InjectpaymentonionResponse\"\x00\x12W\n\x12InjectOnionMessage\x12\x1e.cln.InjectonionmessageRequest\x1a\x1f.cln.InjectonionmessageResponse\"\x00\x12-\n\x04Xpay\x12\x10.cln.XpayRequest\x1a\x11.cln.XpayResponse\"\x00\x12W\n\x12SignMessageWithKey\x12\x1e.cln.SignmessagewithkeyRequest\x1a\x1f.cln.SignmessagewithkeyResponse\"\x00\x12Q\n\x10ListChannelMoves\x12\x1c.cln.ListchannelmovesRequest\x1a\x1d.cln.ListchannelmovesResponse\"\x00\x12K\n\x0eListChainMoves\x12\x1a.cln.ListchainmovesRequest\x1a\x1b.cln.ListchainmovesResponse\"\x00\x12T\n\x11ListNetworkEvents\x12\x1d.cln.ListnetworkeventsRequest\x1a\x1e.cln.ListnetworkeventsResponse\"\x00\x12N\n\x0f\x44\x65lNetworkEvent\x12\x1b.cln.DelnetworkeventRequest\x1a\x1c.cln.DelnetworkeventResponse\"\x00\x12Z\n\x13\x43lnrestRegisterPath\x12\x1f.cln.ClnrestregisterpathRequest\x1a .cln.ClnrestregisterpathResponse\"\x00\x12T\n\x11ListCurrencyRates\x12\x1d.cln.ListcurrencyratesRequest\x1a\x1e.cln.ListcurrencyratesResponse\"\x00\x12N\n\x0f\x43urrencyConvert\x12\x1b.cln.CurrencyconvertRequest\x1a\x1c.cln.CurrencyconvertResponse\"\x00\x12\x45\n\x0c\x43urrencyRate\x12\x18.cln.CurrencyrateRequest\x1a\x19.cln.CurrencyrateResponse\"\x00\x12\x63\n\x18SubscribeBalanceSnapshot\x12!.cln.StreamBalanceSnapshotRequest\x1a .cln.BalanceSnapshotNotification\"\x00\x30\x01\x12T\n\x13SubscribeBlockAdded\x12\x1c.cln.StreamBlockAddedRequest\x1a\x1b.cln.BlockAddedNotification\"\x00\x30\x01\x12i\n\x1aSubscribeChannelOpenFailed\x12#.cln.StreamChannelOpenFailedRequest\x1a\".cln.ChannelOpenFailedNotification\"\x00\x30\x01\x12]\n\x16SubscribeChannelOpened\x12\x1f.cln.StreamChannelOpenedRequest\x1a\x1e.cln.ChannelOpenedNotification\"\x00\x30\x01\x12o\n\x1cSubscribeChannelStateChanged\x12%.cln.StreamChannelStateChangedRequest\x1a$.cln.ChannelStateChangedNotification\"\x00\x30\x01\x12O\n\x10SubscribeConnect\x12\x19.cln.StreamConnectRequest\x1a\x1c.cln.PeerConnectNotification\"\x00\x30\x01\x12Z\n\x15SubscribeCoinMovement\x12\x1e.cln.StreamCoinMovementRequest\x1a\x1d.cln.CoinMovementNotification\"\x00\x30\x01\x12Q\n\x12SubscribeCustomMsg\x12\x1b.cln.StreamCustomMsgRequest\x1a\x1a.cln.CustomMsgNotification\"\x00\x30\x01\x12i\n\x1aSubscribeDeprecatedOneshot\x12#.cln.StreamDeprecatedOneshotRequest\x1a\".cln.DeprecatedOneshotNotification\"\x00\x30\x01\x12T\n\x13SubscribeDisconnect\x12\x1c.cln.StreamDisconnectRequest\x1a\x1b.cln.DisconnectNotification\"\x00\x30\x01\x12Z\n\x15SubscribeForwardEvent\x12\x1e.cln.StreamForwardEventRequest\x1a\x1d.cln.ForwardEventNotification\"\x00\x30\x01\x12\x63\n\x18SubscribeInvoiceCreation\x12!.cln.StreamInvoiceCreationRequest\x1a .cln.InvoiceCreationNotification\"\x00\x30\x01\x12`\n\x17SubscribeInvoicePayment\x12 .cln.StreamInvoicePaymentRequest\x1a\x1f.cln.InvoicePaymentNotification\"\x00\x30\x01\x12?\n\x0cSubscribeLog\x12\x15.cln.StreamLogRequest\x1a\x14.cln.LogNotification\"\x00\x30\x01\x12{\n SubscribeOnionMessageForwardFail\x12).cln.StreamOnionMessageForwardFailRequest\x1a(.cln.OnionMessageForwardFailNotification\"\x00\x30\x01\x12o\n\x1cSubscribeOpenChannelPeerSigs\x12%.cln.StreamOpenChannelPeerSigsRequest\x1a$.cln.OpenChannelPeerSigsNotification\"\x00\x30\x01\x12]\n\x16SubscribePluginStarted\x12\x1f.cln.StreamPluginStartedRequest\x1a\x1e.cln.PluginStartedNotification\"\x00\x30\x01\x12]\n\x16SubscribePluginStopped\x12\x1f.cln.StreamPluginStoppedRequest\x1a\x1e.cln.PluginStoppedNotification\"\x00\x30\x01\x12`\n\x17SubscribeSendPayFailure\x12 .cln.StreamSendPayFailureRequest\x1a\x1f.cln.SendPayFailureNotification\"\x00\x30\x01\x12`\n\x17SubscribeSendPaySuccess\x12 .cln.StreamSendPaySuccessRequest\x1a\x1f.cln.SendPaySuccessNotification\"\x00\x30\x01\x12N\n\x11SubscribeShutdown\x12\x1a.cln.StreamShutdownRequest\x1a\x19.cln.ShutdownNotification\"\x00\x30\x01\x12K\n\x10SubscribeWarning\x12\x19.cln.StreamWarningRequest\x1a\x18.cln.WarningNotification\"\x00\x30\x01\x12T\n\x13SubscribePayPartEnd\x12\x1c.cln.StreamPayPartEndRequest\x1a\x1b.cln.PayPartEndNotification\"\x00\x30\x01\x12Z\n\x15SubscribePayPartStart\x12\x1e.cln.StreamPayPartStartRequest\x1a\x1d.cln.PayPartStartNotification\"\x00\x30\x01\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -76,1276 +76,1276 @@ _globals['_SENDPAYRESPONSE']._serialized_end=4033 _globals['_SENDPAYRESPONSE_SENDPAYSTATUS']._serialized_start=3836 _globals['_SENDPAYRESPONSE_SENDPAYSTATUS']._serialized_end=3878 - _globals['_SENDPAYROUTE']._serialized_start=4035 - _globals['_SENDPAYROUTE']._serialized_end=4127 - _globals['_LISTCHANNELSREQUEST']._serialized_start=4130 - _globals['_LISTCHANNELSREQUEST']._serialized_end=4277 - _globals['_LISTCHANNELSRESPONSE']._serialized_start=4279 - _globals['_LISTCHANNELSRESPONSE']._serialized_end=4346 - _globals['_LISTCHANNELSCHANNELS']._serialized_start=4349 - _globals['_LISTCHANNELSCHANNELS']._serialized_end=4784 - _globals['_ADDGOSSIPREQUEST']._serialized_start=4786 - _globals['_ADDGOSSIPREQUEST']._serialized_end=4821 - _globals['_ADDGOSSIPRESPONSE']._serialized_start=4823 - _globals['_ADDGOSSIPRESPONSE']._serialized_end=4842 - _globals['_ADDPSBTOUTPUTREQUEST']._serialized_start=4845 - _globals['_ADDPSBTOUTPUTREQUEST']._serialized_end=5017 - _globals['_ADDPSBTOUTPUTRESPONSE']._serialized_start=5019 - _globals['_ADDPSBTOUTPUTRESPONSE']._serialized_end=5104 - _globals['_AUTOCLEANONCEREQUEST']._serialized_start=5106 - _globals['_AUTOCLEANONCEREQUEST']._serialized_end=5185 - _globals['_AUTOCLEANONCERESPONSE']._serialized_start=5187 - _globals['_AUTOCLEANONCERESPONSE']._serialized_end=5258 - _globals['_AUTOCLEANONCEAUTOCLEAN']._serialized_start=5261 - _globals['_AUTOCLEANONCEAUTOCLEAN']._serialized_end=5910 - _globals['_AUTOCLEANONCEAUTOCLEANSUCCEEDEDFORWARDS']._serialized_start=5912 - _globals['_AUTOCLEANONCEAUTOCLEANSUCCEEDEDFORWARDS']._serialized_end=5989 - _globals['_AUTOCLEANONCEAUTOCLEANFAILEDFORWARDS']._serialized_start=5991 - _globals['_AUTOCLEANONCEAUTOCLEANFAILEDFORWARDS']._serialized_end=6065 - _globals['_AUTOCLEANONCEAUTOCLEANSUCCEEDEDPAYS']._serialized_start=6067 - _globals['_AUTOCLEANONCEAUTOCLEANSUCCEEDEDPAYS']._serialized_end=6140 - _globals['_AUTOCLEANONCEAUTOCLEANFAILEDPAYS']._serialized_start=6142 - _globals['_AUTOCLEANONCEAUTOCLEANFAILEDPAYS']._serialized_end=6212 - _globals['_AUTOCLEANONCEAUTOCLEANPAIDINVOICES']._serialized_start=6214 - _globals['_AUTOCLEANONCEAUTOCLEANPAIDINVOICES']._serialized_end=6286 - _globals['_AUTOCLEANONCEAUTOCLEANEXPIREDINVOICES']._serialized_start=6288 - _globals['_AUTOCLEANONCEAUTOCLEANEXPIREDINVOICES']._serialized_end=6363 - _globals['_AUTOCLEANONCEAUTOCLEANNETWORKEVENTS']._serialized_start=6365 - _globals['_AUTOCLEANONCEAUTOCLEANNETWORKEVENTS']._serialized_end=6438 - _globals['_AUTOCLEANSTATUSREQUEST']._serialized_start=6440 - _globals['_AUTOCLEANSTATUSREQUEST']._serialized_end=6527 - _globals['_AUTOCLEANSTATUSRESPONSE']._serialized_start=6529 - _globals['_AUTOCLEANSTATUSRESPONSE']._serialized_end=6604 - _globals['_AUTOCLEANSTATUSAUTOCLEAN']._serialized_start=6607 - _globals['_AUTOCLEANSTATUSAUTOCLEAN']._serialized_end=7272 - _globals['_AUTOCLEANSTATUSAUTOCLEANSUCCEEDEDFORWARDS']._serialized_start=7274 - _globals['_AUTOCLEANSTATUSAUTOCLEANSUCCEEDEDFORWARDS']._serialized_end=7377 - _globals['_AUTOCLEANSTATUSAUTOCLEANFAILEDFORWARDS']._serialized_start=7379 - _globals['_AUTOCLEANSTATUSAUTOCLEANFAILEDFORWARDS']._serialized_end=7479 - _globals['_AUTOCLEANSTATUSAUTOCLEANSUCCEEDEDPAYS']._serialized_start=7481 - _globals['_AUTOCLEANSTATUSAUTOCLEANSUCCEEDEDPAYS']._serialized_end=7580 - _globals['_AUTOCLEANSTATUSAUTOCLEANFAILEDPAYS']._serialized_start=7582 - _globals['_AUTOCLEANSTATUSAUTOCLEANFAILEDPAYS']._serialized_end=7678 - _globals['_AUTOCLEANSTATUSAUTOCLEANPAIDINVOICES']._serialized_start=7680 - _globals['_AUTOCLEANSTATUSAUTOCLEANPAIDINVOICES']._serialized_end=7778 - _globals['_AUTOCLEANSTATUSAUTOCLEANEXPIREDINVOICES']._serialized_start=7780 - _globals['_AUTOCLEANSTATUSAUTOCLEANEXPIREDINVOICES']._serialized_end=7881 - _globals['_AUTOCLEANSTATUSAUTOCLEANNETWORKEVENTS']._serialized_start=7883 - _globals['_AUTOCLEANSTATUSAUTOCLEANNETWORKEVENTS']._serialized_end=7982 - _globals['_CHECKMESSAGEREQUEST']._serialized_start=7984 - _globals['_CHECKMESSAGEREQUEST']._serialized_end=8069 - _globals['_CHECKMESSAGERESPONSE']._serialized_start=8071 - _globals['_CHECKMESSAGERESPONSE']._serialized_end=8127 - _globals['_CLOSEREQUEST']._serialized_start=8130 - _globals['_CLOSEREQUEST']._serialized_end=8461 - _globals['_CLOSERESPONSE']._serialized_start=8464 - _globals['_CLOSERESPONSE']._serialized_end=8611 - _globals['_CLOSERESPONSE_CLOSETYPE']._serialized_start=8558 - _globals['_CLOSERESPONSE_CLOSETYPE']._serialized_end=8611 - _globals['_CONNECTREQUEST']._serialized_start=8613 - _globals['_CONNECTREQUEST']._serialized_end=8697 - _globals['_CONNECTRESPONSE']._serialized_start=8700 - _globals['_CONNECTRESPONSE']._serialized_end=8880 - _globals['_CONNECTRESPONSE_CONNECTDIRECTION']._serialized_start=8845 - _globals['_CONNECTRESPONSE_CONNECTDIRECTION']._serialized_end=8880 - _globals['_CONNECTADDRESS']._serialized_start=8883 - _globals['_CONNECTADDRESS']._serialized_end=9134 - _globals['_CONNECTADDRESS_CONNECTADDRESSTYPE']._serialized_start=9022 - _globals['_CONNECTADDRESS_CONNECTADDRESSTYPE']._serialized_end=9102 - _globals['_CREATEINVOICEREQUEST']._serialized_start=9136 - _globals['_CREATEINVOICEREQUEST']._serialized_end=9210 - _globals['_CREATEINVOICERESPONSE']._serialized_start=9213 - _globals['_CREATEINVOICERESPONSE']._serialized_end=9955 - _globals['_CREATEINVOICERESPONSE_CREATEINVOICESTATUS']._serialized_start=9730 - _globals['_CREATEINVOICERESPONSE_CREATEINVOICESTATUS']._serialized_end=9786 - _globals['_CREATEINVOICEPAIDOUTPOINT']._serialized_start=9957 - _globals['_CREATEINVOICEPAIDOUTPOINT']._serialized_end=10014 - _globals['_DATASTOREREQUEST']._serialized_start=10017 - _globals['_DATASTOREREQUEST']._serialized_end=10325 - _globals['_DATASTOREREQUEST_DATASTOREMODE']._serialized_start=10170 - _globals['_DATASTOREREQUEST_DATASTOREMODE']._serialized_end=10282 - _globals['_DATASTORERESPONSE']._serialized_start=10328 - _globals['_DATASTORERESPONSE']._serialized_end=10458 - _globals['_DATASTOREUSAGEREQUEST']._serialized_start=10460 - _globals['_DATASTOREUSAGEREQUEST']._serialized_end=10496 - _globals['_DATASTOREUSAGERESPONSE']._serialized_start=10498 - _globals['_DATASTOREUSAGERESPONSE']._serialized_end=10581 - _globals['_DATASTOREUSAGEDATASTOREUSAGE']._serialized_start=10583 - _globals['_DATASTOREUSAGEDATASTOREUSAGE']._serialized_end=10647 - _globals['_CREATEONIONREQUEST']._serialized_start=10650 - _globals['_CREATEONIONREQUEST']._serialized_end=10807 - _globals['_CREATEONIONRESPONSE']._serialized_start=10809 - _globals['_CREATEONIONRESPONSE']._serialized_end=10869 - _globals['_CREATEONIONHOPS']._serialized_start=10871 - _globals['_CREATEONIONHOPS']._serialized_end=10921 - _globals['_DELDATASTOREREQUEST']._serialized_start=10923 - _globals['_DELDATASTOREREQUEST']._serialized_end=10997 - _globals['_DELDATASTORERESPONSE']._serialized_start=11000 - _globals['_DELDATASTORERESPONSE']._serialized_end=11133 - _globals['_DELINVOICEREQUEST']._serialized_start=11136 - _globals['_DELINVOICEREQUEST']._serialized_end=11318 - _globals['_DELINVOICEREQUEST_DELINVOICESTATUS']._serialized_start=11252 - _globals['_DELINVOICEREQUEST_DELINVOICESTATUS']._serialized_end=11305 - _globals['_DELINVOICERESPONSE']._serialized_start=11321 - _globals['_DELINVOICERESPONSE']._serialized_end=12040 - _globals['_DELINVOICERESPONSE_DELINVOICESTATUS']._serialized_start=11252 - _globals['_DELINVOICERESPONSE_DELINVOICESTATUS']._serialized_end=11305 - _globals['_DEVFORGETCHANNELREQUEST']._serialized_start=12043 - _globals['_DEVFORGETCHANNELREQUEST']._serialized_end=12202 - _globals['_DEVFORGETCHANNELRESPONSE']._serialized_start=12204 - _globals['_DEVFORGETCHANNELRESPONSE']._serialized_end=12293 - _globals['_EMERGENCYRECOVERREQUEST']._serialized_start=12295 - _globals['_EMERGENCYRECOVERREQUEST']._serialized_end=12320 - _globals['_EMERGENCYRECOVERRESPONSE']._serialized_start=12322 - _globals['_EMERGENCYRECOVERRESPONSE']._serialized_end=12363 - _globals['_GETEMERGENCYRECOVERDATAREQUEST']._serialized_start=12365 - _globals['_GETEMERGENCYRECOVERDATAREQUEST']._serialized_end=12397 - _globals['_GETEMERGENCYRECOVERDATARESPONSE']._serialized_start=12399 - _globals['_GETEMERGENCYRECOVERDATARESPONSE']._serialized_end=12509 - _globals['_EXPOSESECRETREQUEST']._serialized_start=12511 - _globals['_EXPOSESECRETREQUEST']._serialized_end=12592 - _globals['_EXPOSESECRETRESPONSE']._serialized_start=12594 - _globals['_EXPOSESECRETRESPONSE']._serialized_end=12689 - _globals['_RECOVERREQUEST']._serialized_start=12691 - _globals['_RECOVERREQUEST']._serialized_end=12726 - _globals['_RECOVERRESPONSE']._serialized_start=12728 - _globals['_RECOVERRESPONSE']._serialized_end=12848 - _globals['_RECOVERRESPONSE_RECOVERRESULT']._serialized_start=12799 - _globals['_RECOVERRESPONSE_RECOVERRESULT']._serialized_end=12848 - _globals['_RECOVERCHANNELREQUEST']._serialized_start=12850 - _globals['_RECOVERCHANNELREQUEST']._serialized_end=12886 - _globals['_RECOVERCHANNELRESPONSE']._serialized_start=12888 - _globals['_RECOVERCHANNELRESPONSE']._serialized_end=12927 - _globals['_INVOICEREQUEST']._serialized_start=12930 - _globals['_INVOICEREQUEST']._serialized_end=13211 - _globals['_INVOICERESPONSE']._serialized_start=13214 - _globals['_INVOICERESPONSE']._serialized_end=13596 - _globals['_INVOICEREQUESTREQUEST']._serialized_start=13599 - _globals['_INVOICEREQUESTREQUEST']._serialized_end=13824 - _globals['_INVOICEREQUESTRESPONSE']._serialized_start=13827 - _globals['_INVOICEREQUESTRESPONSE']._serialized_end=13966 - _globals['_DISABLEINVOICEREQUESTREQUEST']._serialized_start=13968 - _globals['_DISABLEINVOICEREQUESTREQUEST']._serialized_end=14017 - _globals['_DISABLEINVOICEREQUESTRESPONSE']._serialized_start=14020 - _globals['_DISABLEINVOICEREQUESTRESPONSE']._serialized_end=14166 - _globals['_LISTINVOICEREQUESTSREQUEST']._serialized_start=14168 - _globals['_LISTINVOICEREQUESTSREQUEST']._serialized_end=14276 - _globals['_LISTINVOICEREQUESTSRESPONSE']._serialized_start=14278 - _globals['_LISTINVOICEREQUESTSRESPONSE']._serialized_end=14373 - _globals['_LISTINVOICEREQUESTSINVOICEREQUESTS']._serialized_start=14376 - _globals['_LISTINVOICEREQUESTSINVOICEREQUESTS']._serialized_end=14527 - _globals['_LISTDATASTOREREQUEST']._serialized_start=14529 - _globals['_LISTDATASTOREREQUEST']._serialized_end=14564 - _globals['_LISTDATASTORERESPONSE']._serialized_start=14566 - _globals['_LISTDATASTORERESPONSE']._serialized_end=14637 - _globals['_LISTDATASTOREDATASTORE']._serialized_start=14640 - _globals['_LISTDATASTOREDATASTORE']._serialized_end=14775 - _globals['_LISTINVOICESREQUEST']._serialized_start=14778 - _globals['_LISTINVOICESREQUEST']._serialized_end=15128 - _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_start=14999 - _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_end=15044 - _globals['_LISTINVOICESRESPONSE']._serialized_start=15130 - _globals['_LISTINVOICESRESPONSE']._serialized_end=15197 - _globals['_LISTINVOICESINVOICES']._serialized_start=15200 - _globals['_LISTINVOICESINVOICES']._serialized_end=16028 - _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_start=15762 - _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_end=15825 - _globals['_LISTINVOICESINVOICESPAIDOUTPOINT']._serialized_start=16030 - _globals['_LISTINVOICESINVOICESPAIDOUTPOINT']._serialized_end=16094 - _globals['_SENDONIONREQUEST']._serialized_start=16097 - _globals['_SENDONIONREQUEST']._serialized_end=16599 - _globals['_SENDONIONRESPONSE']._serialized_start=16602 - _globals['_SENDONIONRESPONSE']._serialized_end=17194 - _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_start=17024 - _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_end=17068 - _globals['_SENDONIONFIRSTHOP']._serialized_start=17196 - _globals['_SENDONIONFIRSTHOP']._serialized_end=17276 - _globals['_LISTSENDPAYSREQUEST']._serialized_start=17279 - _globals['_LISTSENDPAYSREQUEST']._serialized_end=17695 - _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_start=17520 - _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_end=17579 - _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSINDEX']._serialized_start=17581 - _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSINDEX']._serialized_end=17626 - _globals['_LISTSENDPAYSRESPONSE']._serialized_start=17697 - _globals['_LISTSENDPAYSRESPONSE']._serialized_end=17764 - _globals['_LISTSENDPAYSPAYMENTS']._serialized_start=17767 - _globals['_LISTSENDPAYSPAYMENTS']._serialized_end=18508 - _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_start=18279 - _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_end=18346 - _globals['_LISTTRANSACTIONSREQUEST']._serialized_start=18510 - _globals['_LISTTRANSACTIONSREQUEST']._serialized_end=18535 - _globals['_LISTTRANSACTIONSRESPONSE']._serialized_start=18537 - _globals['_LISTTRANSACTIONSRESPONSE']._serialized_end=18620 - _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_start=18623 - _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_end=18871 - _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_start=18873 - _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_end=18956 - _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_start=18958 - _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_end=19066 - _globals['_MAKESECRETREQUEST']._serialized_start=19068 - _globals['_MAKESECRETREQUEST']._serialized_end=19145 - _globals['_MAKESECRETRESPONSE']._serialized_start=19147 - _globals['_MAKESECRETRESPONSE']._serialized_end=19183 - _globals['_PAYREQUEST']._serialized_start=19186 - _globals['_PAYREQUEST']._serialized_end=19717 - _globals['_PAYRESPONSE']._serialized_start=19720 - _globals['_PAYRESPONSE']._serialized_end=20099 - _globals['_PAYRESPONSE_PAYSTATUS']._serialized_start=20002 - _globals['_PAYRESPONSE_PAYSTATUS']._serialized_end=20052 - _globals['_LISTNODESREQUEST']._serialized_start=20101 - _globals['_LISTNODESREQUEST']._serialized_end=20143 - _globals['_LISTNODESRESPONSE']._serialized_start=20145 - _globals['_LISTNODESRESPONSE']._serialized_end=20200 - _globals['_LISTNODESNODES']._serialized_start=20203 - _globals['_LISTNODESNODES']._serialized_end=20515 - _globals['_LISTNODESNODESOPTIONWILLFUND']._serialized_start=20518 - _globals['_LISTNODESNODESOPTIONWILLFUND']._serialized_end=20760 - _globals['_LISTNODESNODESADDRESSES']._serialized_start=20763 - _globals['_LISTNODESNODESADDRESSES']._serialized_end=20995 - _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_start=20903 - _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_end=20983 - _globals['_WAITANYINVOICEREQUEST']._serialized_start=20997 - _globals['_WAITANYINVOICEREQUEST']._serialized_end=21100 - _globals['_WAITANYINVOICERESPONSE']._serialized_start=21103 - _globals['_WAITANYINVOICERESPONSE']._serialized_end=21803 - _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_start=21596 - _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_end=21641 - _globals['_WAITANYINVOICEPAIDOUTPOINT']._serialized_start=21805 - _globals['_WAITANYINVOICEPAIDOUTPOINT']._serialized_end=21863 - _globals['_WAITINVOICEREQUEST']._serialized_start=21865 - _globals['_WAITINVOICEREQUEST']._serialized_end=21900 - _globals['_WAITINVOICERESPONSE']._serialized_start=21903 - _globals['_WAITINVOICERESPONSE']._serialized_end=22588 - _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_start=22384 - _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_end=22426 - _globals['_WAITINVOICEPAIDOUTPOINT']._serialized_start=22590 - _globals['_WAITINVOICEPAIDOUTPOINT']._serialized_end=22645 - _globals['_WAITSENDPAYREQUEST']._serialized_start=22648 - _globals['_WAITSENDPAYREQUEST']._serialized_end=22790 - _globals['_WAITSENDPAYRESPONSE']._serialized_start=22793 - _globals['_WAITSENDPAYRESPONSE']._serialized_end=23424 - _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_start=23248 - _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_end=23281 - _globals['_NEWADDRREQUEST']._serialized_start=23427 - _globals['_NEWADDRREQUEST']._serialized_end=23578 - _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_start=23511 - _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_end=23562 - _globals['_NEWADDRRESPONSE']._serialized_start=23580 - _globals['_NEWADDRRESPONSE']._serialized_end=23657 - _globals['_WITHDRAWREQUEST']._serialized_start=23660 - _globals['_WITHDRAWREQUEST']._serialized_end=23845 - _globals['_WITHDRAWRESPONSE']._serialized_start=23847 - _globals['_WITHDRAWRESPONSE']._serialized_end=23905 - _globals['_KEYSENDREQUEST']._serialized_start=23908 - _globals['_KEYSENDREQUEST']._serialized_end=24339 - _globals['_KEYSENDRESPONSE']._serialized_start=24342 - _globals['_KEYSENDRESPONSE']._serialized_end=24712 - _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_start=24636 - _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_end=24665 - _globals['_FUNDPSBTREQUEST']._serialized_start=24715 - _globals['_FUNDPSBTREQUEST']._serialized_end=25135 - _globals['_FUNDPSBTRESPONSE']._serialized_start=25138 - _globals['_FUNDPSBTRESPONSE']._serialized_end=25355 - _globals['_FUNDPSBTRESERVATIONS']._serialized_start=25357 - _globals['_FUNDPSBTRESERVATIONS']._serialized_end=25474 - _globals['_SENDPSBTREQUEST']._serialized_start=25476 - _globals['_SENDPSBTREQUEST']._serialized_end=25541 - _globals['_SENDPSBTRESPONSE']._serialized_start=25543 - _globals['_SENDPSBTRESPONSE']._serialized_end=25587 - _globals['_SIGNPSBTREQUEST']._serialized_start=25589 - _globals['_SIGNPSBTREQUEST']._serialized_end=25638 - _globals['_SIGNPSBTRESPONSE']._serialized_start=25640 - _globals['_SIGNPSBTRESPONSE']._serialized_end=25679 - _globals['_UTXOPSBTREQUEST']._serialized_start=25682 - _globals['_UTXOPSBTREQUEST']._serialized_end=26098 - _globals['_UTXOPSBTRESPONSE']._serialized_start=26101 - _globals['_UTXOPSBTRESPONSE']._serialized_end=26318 - _globals['_UTXOPSBTRESERVATIONS']._serialized_start=26320 - _globals['_UTXOPSBTRESERVATIONS']._serialized_end=26437 - _globals['_TXDISCARDREQUEST']._serialized_start=26439 - _globals['_TXDISCARDREQUEST']._serialized_end=26471 - _globals['_TXDISCARDRESPONSE']._serialized_start=26473 - _globals['_TXDISCARDRESPONSE']._serialized_end=26527 - _globals['_TXPREPAREREQUEST']._serialized_start=26530 - _globals['_TXPREPAREREQUEST']._serialized_end=26694 - _globals['_TXPREPARERESPONSE']._serialized_start=26696 - _globals['_TXPREPARERESPONSE']._serialized_end=26764 - _globals['_TXSENDREQUEST']._serialized_start=26766 - _globals['_TXSENDREQUEST']._serialized_end=26795 - _globals['_TXSENDRESPONSE']._serialized_start=26797 - _globals['_TXSENDRESPONSE']._serialized_end=26853 - _globals['_LISTPEERCHANNELSREQUEST']._serialized_start=26856 - _globals['_LISTPEERCHANNELSREQUEST']._serialized_end=26997 - _globals['_LISTPEERCHANNELSRESPONSE']._serialized_start=26999 - _globals['_LISTPEERCHANNELSRESPONSE']._serialized_end=27074 - _globals['_LISTPEERCHANNELSCHANNELS']._serialized_start=27077 - _globals['_LISTPEERCHANNELSCHANNELS']._serialized_end=30393 - _globals['_LISTPEERCHANNELSCHANNELSUPDATES']._serialized_start=30396 - _globals['_LISTPEERCHANNELSCHANNELSUPDATES']._serialized_end=30563 - _globals['_LISTPEERCHANNELSCHANNELSUPDATESLOCAL']._serialized_start=30566 - _globals['_LISTPEERCHANNELSCHANNELSUPDATESLOCAL']._serialized_end=30784 - _globals['_LISTPEERCHANNELSCHANNELSUPDATESREMOTE']._serialized_start=30787 - _globals['_LISTPEERCHANNELSCHANNELSUPDATESREMOTE']._serialized_end=31006 - _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_start=31008 - _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_end=31071 - _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_start=31074 - _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_end=31318 - _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_start=31321 - _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_end=31670 - _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_start=31672 - _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_end=31765 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_start=31768 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_end=32145 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_start=32059 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_end=32116 - _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_start=32147 - _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_end=32198 - _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_start=32200 - _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_end=32291 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_start=32294 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_end=33654 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSECAUSE']._serialized_start=33288 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSECAUSE']._serialized_end=33405 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_start=33656 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_end=33757 - _globals['_DECODEREQUEST']._serialized_start=33759 - _globals['_DECODEREQUEST']._serialized_end=33790 - _globals['_DECODERESPONSE']._serialized_start=33793 - _globals['_DECODERESPONSE']._serialized_end=39544 - _globals['_DECODERESPONSE_DECODETYPE']._serialized_start=37308 - _globals['_DECODERESPONSE_DECODETYPE']._serialized_end=37463 - _globals['_DECODEOFFERPATHS']._serialized_start=39547 - _globals['_DECODEOFFERPATHS']._serialized_end=39783 - _globals['_DECODEOFFERRECURRENCEPAYWINDOW']._serialized_start=39786 - _globals['_DECODEOFFERRECURRENCEPAYWINDOW']._serialized_end=39923 - _globals['_DECODEINVREQPATHS']._serialized_start=39926 - _globals['_DECODEINVREQPATHS']._serialized_end=40205 - _globals['_DECODEINVREQPATHSPATH']._serialized_start=40207 - _globals['_DECODEINVREQPATHSPATH']._serialized_end=40289 - _globals['_DECODEINVREQBIP353NAME']._serialized_start=40291 - _globals['_DECODEINVREQBIP353NAME']._serialized_end=40375 - _globals['_DECODEINVOICEPATHSPATH']._serialized_start=40377 - _globals['_DECODEINVOICEPATHSPATH']._serialized_end=40460 - _globals['_DECODEINVOICEFALLBACKS']._serialized_start=40462 - _globals['_DECODEINVOICEFALLBACKS']._serialized_end=40550 - _globals['_DECODEFALLBACKS']._serialized_start=40553 - _globals['_DECODEFALLBACKS']._serialized_end=40851 - _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_start=40721 - _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_end=40796 - _globals['_DECODEEXTRA']._serialized_start=40853 - _globals['_DECODEEXTRA']._serialized_end=40893 - _globals['_DECODEUNKNOWNPAYERPROOFTLVS']._serialized_start=40895 - _globals['_DECODEUNKNOWNPAYERPROOFTLVS']._serialized_end=40974 - _globals['_DECODERESTRICTIONS']._serialized_start=40976 - _globals['_DECODERESTRICTIONS']._serialized_end=41035 - _globals['_DELPAYREQUEST']._serialized_start=41038 - _globals['_DELPAYREQUEST']._serialized_end=41232 - _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_start=41169 - _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_end=41209 - _globals['_DELPAYRESPONSE']._serialized_start=41234 - _globals['_DELPAYRESPONSE']._serialized_end=41289 - _globals['_DELPAYPAYMENTS']._serialized_start=41292 - _globals['_DELPAYPAYMENTS']._serialized_end=41984 - _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_start=41765 - _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_end=41826 - _globals['_DELFORWARDREQUEST']._serialized_start=41987 - _globals['_DELFORWARDREQUEST']._serialized_end=42166 - _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_start=42105 - _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_end=42166 - _globals['_DELFORWARDRESPONSE']._serialized_start=42168 - _globals['_DELFORWARDRESPONSE']._serialized_end=42188 - _globals['_DISABLEOFFERREQUEST']._serialized_start=42190 - _globals['_DISABLEOFFERREQUEST']._serialized_end=42229 - _globals['_DISABLEOFFERRESPONSE']._serialized_start=42232 - _globals['_DISABLEOFFERRESPONSE']._serialized_end=42452 - _globals['_ENABLEOFFERREQUEST']._serialized_start=42454 - _globals['_ENABLEOFFERREQUEST']._serialized_end=42492 - _globals['_ENABLEOFFERRESPONSE']._serialized_start=42495 - _globals['_ENABLEOFFERRESPONSE']._serialized_end=42714 - _globals['_DISCONNECTREQUEST']._serialized_start=42716 - _globals['_DISCONNECTREQUEST']._serialized_end=42777 - _globals['_DISCONNECTRESPONSE']._serialized_start=42779 - _globals['_DISCONNECTRESPONSE']._serialized_end=42799 - _globals['_FEERATESREQUEST']._serialized_start=42801 - _globals['_FEERATESREQUEST']._serialized_end=42908 - _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_start=42871 - _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_end=42908 - _globals['_FEERATESRESPONSE']._serialized_start=42911 - _globals['_FEERATESRESPONSE']._serialized_end=43193 - _globals['_FEERATESPERKB']._serialized_start=43196 - _globals['_FEERATESPERKB']._serialized_end=43680 - _globals['_FEERATESPERKBESTIMATES']._serialized_start=43682 - _globals['_FEERATESPERKBESTIMATES']._serialized_end=43769 - _globals['_FEERATESPERKW']._serialized_start=43772 - _globals['_FEERATESPERKW']._serialized_end=44256 - _globals['_FEERATESPERKWESTIMATES']._serialized_start=44258 - _globals['_FEERATESPERKWESTIMATES']._serialized_end=44345 - _globals['_FEERATESONCHAINFEEESTIMATES']._serialized_start=44348 - _globals['_FEERATESONCHAINFEEESTIMATES']._serialized_end=44629 - _globals['_FETCHBIP353REQUEST']._serialized_start=44631 - _globals['_FETCHBIP353REQUEST']._serialized_end=44668 - _globals['_FETCHBIP353RESPONSE']._serialized_start=44670 - _globals['_FETCHBIP353RESPONSE']._serialized_end=44758 - _globals['_FETCHBIP353INSTRUCTIONS']._serialized_start=44761 - _globals['_FETCHBIP353INSTRUCTIONS']._serialized_end=45008 - _globals['_FETCHINVOICEREQUEST']._serialized_start=45011 - _globals['_FETCHINVOICEREQUEST']._serialized_end=45452 - _globals['_FETCHINVOICERESPONSE']._serialized_start=45455 - _globals['_FETCHINVOICERESPONSE']._serialized_end=45608 - _globals['_FETCHINVOICECHANGES']._serialized_start=45611 - _globals['_FETCHINVOICECHANGES']._serialized_end=45869 - _globals['_FETCHINVOICENEXTPERIOD']._serialized_start=45871 - _globals['_FETCHINVOICENEXTPERIOD']._serialized_end=45996 - _globals['_CANCELRECURRINGINVOICEREQUEST']._serialized_start=45999 - _globals['_CANCELRECURRINGINVOICEREQUEST']._serialized_end=46223 - _globals['_CANCELRECURRINGINVOICERESPONSE']._serialized_start=46225 - _globals['_CANCELRECURRINGINVOICERESPONSE']._serialized_end=46273 - _globals['_FUNDCHANNELCANCELREQUEST']._serialized_start=46275 - _globals['_FUNDCHANNELCANCELREQUEST']._serialized_end=46313 - _globals['_FUNDCHANNELCANCELRESPONSE']._serialized_start=46315 - _globals['_FUNDCHANNELCANCELRESPONSE']._serialized_end=46361 - _globals['_FUNDCHANNELCOMPLETEREQUEST']._serialized_start=46363 - _globals['_FUNDCHANNELCOMPLETEREQUEST']._serialized_end=46453 - _globals['_FUNDCHANNELCOMPLETERESPONSE']._serialized_start=46455 - _globals['_FUNDCHANNELCOMPLETERESPONSE']._serialized_end=46533 - _globals['_FUNDCHANNELREQUEST']._serialized_start=46536 - _globals['_FUNDCHANNELREQUEST']._serialized_end=47043 - _globals['_FUNDCHANNELRESPONSE']._serialized_start=47046 - _globals['_FUNDCHANNELRESPONSE']._serialized_end=47252 - _globals['_FUNDCHANNELCHANNELTYPE']._serialized_start=47254 - _globals['_FUNDCHANNELCHANNELTYPE']._serialized_end=47329 - _globals['_FUNDCHANNELSTARTREQUEST']._serialized_start=47332 - _globals['_FUNDCHANNELSTARTREQUEST']._serialized_end=47674 - _globals['_FUNDCHANNELSTARTRESPONSE']._serialized_start=47677 - _globals['_FUNDCHANNELSTARTRESPONSE']._serialized_end=47923 - _globals['_FUNDCHANNELSTARTCHANNELTYPE']._serialized_start=47925 - _globals['_FUNDCHANNELSTARTCHANNELTYPE']._serialized_end=48005 - _globals['_GETLOGREQUEST']._serialized_start=48008 - _globals['_GETLOGREQUEST']._serialized_end=48165 - _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_start=48077 - _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_end=48155 - _globals['_GETLOGRESPONSE']._serialized_start=48167 - _globals['_GETLOGRESPONSE']._serialized_end=48271 - _globals['_GETLOGLOG']._serialized_start=48274 - _globals['_GETLOGLOG']._serialized_end=48634 - _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_start=48461 - _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_end=48569 - _globals['_FUNDERUPDATEREQUEST']._serialized_start=48637 - _globals['_FUNDERUPDATEREQUEST']._serialized_end=49750 - _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_start=49331 - _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_end=49388 - _globals['_FUNDERUPDATERESPONSE']._serialized_start=49753 - _globals['_FUNDERUPDATERESPONSE']._serialized_end=50616 - _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_start=49331 - _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_end=49388 - _globals['_GETROUTEREQUEST']._serialized_start=50619 - _globals['_GETROUTEREQUEST']._serialized_end=50855 - _globals['_GETROUTERESPONSE']._serialized_start=50857 - _globals['_GETROUTERESPONSE']._serialized_end=50910 - _globals['_GETROUTEROUTE']._serialized_start=50913 - _globals['_GETROUTEROUTE']._serialized_end=51110 - _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_start=51081 - _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_end=51110 - _globals['_LISTADDRESSESREQUEST']._serialized_start=51112 - _globals['_LISTADDRESSESREQUEST']._serialized_end=51228 - _globals['_LISTADDRESSESRESPONSE']._serialized_start=51230 - _globals['_LISTADDRESSESRESPONSE']._serialized_end=51301 - _globals['_LISTADDRESSESADDRESSES']._serialized_start=51303 - _globals['_LISTADDRESSESADDRESSES']._serialized_end=51403 - _globals['_LISTFORWARDSREQUEST']._serialized_start=51406 - _globals['_LISTFORWARDSREQUEST']._serialized_end=51845 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_start=51650 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_end=51726 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_start=51728 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_end=51773 - _globals['_LISTFORWARDSRESPONSE']._serialized_start=51847 - _globals['_LISTFORWARDSRESPONSE']._serialized_end=51914 - _globals['_LISTFORWARDSFORWARDS']._serialized_start=51917 - _globals['_LISTFORWARDSFORWARDS']._serialized_end=52714 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_start=52433 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_end=52517 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_start=52519 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_end=52567 - _globals['_LISTOFFERSREQUEST']._serialized_start=52716 - _globals['_LISTOFFERSREQUEST']._serialized_end=52813 - _globals['_LISTOFFERSRESPONSE']._serialized_start=52815 - _globals['_LISTOFFERSRESPONSE']._serialized_end=52874 - _globals['_LISTOFFERSOFFERS']._serialized_start=52877 - _globals['_LISTOFFERSOFFERS']._serialized_end=53093 - _globals['_LISTPAYSREQUEST']._serialized_start=53096 - _globals['_LISTPAYSREQUEST']._serialized_end=53484 - _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_start=53317 - _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_end=53372 - _globals['_LISTPAYSREQUEST_LISTPAYSINDEX']._serialized_start=53374 - _globals['_LISTPAYSREQUEST_LISTPAYSINDEX']._serialized_end=53415 - _globals['_LISTPAYSRESPONSE']._serialized_start=53486 - _globals['_LISTPAYSRESPONSE']._serialized_end=53537 - _globals['_LISTPAYSPAYS']._serialized_start=53540 - _globals['_LISTPAYSPAYS']._serialized_end=54271 - _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_start=54010 - _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_end=54069 - _globals['_LISTHTLCSREQUEST']._serialized_start=54274 - _globals['_LISTHTLCSREQUEST']._serialized_end=54488 - _globals['_LISTHTLCSREQUEST_LISTHTLCSINDEX']._serialized_start=54409 - _globals['_LISTHTLCSREQUEST_LISTHTLCSINDEX']._serialized_end=54451 - _globals['_LISTHTLCSRESPONSE']._serialized_start=54490 - _globals['_LISTHTLCSRESPONSE']._serialized_end=54545 - _globals['_LISTHTLCSHTLCS']._serialized_start=54548 - _globals['_LISTHTLCSHTLCS']._serialized_end=54905 - _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_start=54827 - _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_end=54869 - _globals['_MULTIFUNDCHANNELREQUEST']._serialized_start=54908 - _globals['_MULTIFUNDCHANNELREQUEST']._serialized_end=55214 - _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_start=55217 - _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_end=55368 - _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_start=55371 - _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_end=55754 - _globals['_MULTIFUNDCHANNELCHANNELIDS']._serialized_start=55757 - _globals['_MULTIFUNDCHANNELCHANNELIDS']._serialized_end=55935 - _globals['_MULTIFUNDCHANNELCHANNELIDSCHANNELTYPE']._serialized_start=55937 - _globals['_MULTIFUNDCHANNELCHANNELIDSCHANNELTYPE']._serialized_end=56027 - _globals['_MULTIFUNDCHANNELFAILED']._serialized_start=56030 - _globals['_MULTIFUNDCHANNELFAILED']._serialized_end=56305 - _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_start=56191 - _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_end=56305 - _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_start=56307 - _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_end=56367 - _globals['_MULTIWITHDRAWREQUEST']._serialized_start=56370 - _globals['_MULTIWITHDRAWREQUEST']._serialized_end=56538 - _globals['_MULTIWITHDRAWRESPONSE']._serialized_start=56540 - _globals['_MULTIWITHDRAWRESPONSE']._serialized_end=56589 - _globals['_OFFERREQUEST']._serialized_start=56592 - _globals['_OFFERREQUEST']._serialized_end=57202 - _globals['_OFFERRESPONSE']._serialized_start=57205 - _globals['_OFFERRESPONSE']._serialized_end=57393 - _globals['_OPENCHANNELABORTREQUEST']._serialized_start=57395 - _globals['_OPENCHANNELABORTREQUEST']._serialized_end=57440 - _globals['_OPENCHANNELABORTRESPONSE']._serialized_start=57442 - _globals['_OPENCHANNELABORTRESPONSE']._serialized_end=57530 - _globals['_OPENCHANNELBUMPREQUEST']._serialized_start=57533 - _globals['_OPENCHANNELBUMPREQUEST']._serialized_end=57691 - _globals['_OPENCHANNELBUMPRESPONSE']._serialized_start=57694 - _globals['_OPENCHANNELBUMPRESPONSE']._serialized_end=57931 - _globals['_OPENCHANNELBUMPCHANNELTYPE']._serialized_start=57933 - _globals['_OPENCHANNELBUMPCHANNELTYPE']._serialized_end=58012 - _globals['_OPENCHANNELINITREQUEST']._serialized_start=58015 - _globals['_OPENCHANNELINITREQUEST']._serialized_end=58430 - _globals['_OPENCHANNELINITRESPONSE']._serialized_start=58433 - _globals['_OPENCHANNELINITRESPONSE']._serialized_end=58670 - _globals['_OPENCHANNELINITCHANNELTYPE']._serialized_start=58672 - _globals['_OPENCHANNELINITCHANNELTYPE']._serialized_end=58751 - _globals['_OPENCHANNELSIGNEDREQUEST']._serialized_start=58753 - _globals['_OPENCHANNELSIGNEDREQUEST']._serialized_end=58820 - _globals['_OPENCHANNELSIGNEDRESPONSE']._serialized_start=58822 - _globals['_OPENCHANNELSIGNEDRESPONSE']._serialized_end=58895 - _globals['_OPENCHANNELUPDATEREQUEST']._serialized_start=58897 - _globals['_OPENCHANNELUPDATEREQUEST']._serialized_end=58957 - _globals['_OPENCHANNELUPDATERESPONSE']._serialized_start=58960 - _globals['_OPENCHANNELUPDATERESPONSE']._serialized_end=59237 - _globals['_OPENCHANNELUPDATECHANNELTYPE']._serialized_start=59239 - _globals['_OPENCHANNELUPDATECHANNELTYPE']._serialized_end=59320 - _globals['_PINGREQUEST']._serialized_start=59322 - _globals['_PINGREQUEST']._serialized_end=59411 - _globals['_PINGRESPONSE']._serialized_start=59413 - _globals['_PINGRESPONSE']._serialized_end=59443 - _globals['_PLUGINREQUEST']._serialized_start=59446 - _globals['_PLUGINREQUEST']._serialized_end=59591 - _globals['_PLUGINRESPONSE']._serialized_start=59593 - _globals['_PLUGINRESPONSE']._serialized_end=59718 - _globals['_PLUGINPLUGINS']._serialized_start=59720 - _globals['_PLUGINPLUGINS']._serialized_end=59782 - _globals['_RENEPAYSTATUSREQUEST']._serialized_start=59784 - _globals['_RENEPAYSTATUSREQUEST']._serialized_end=59844 - _globals['_RENEPAYSTATUSRESPONSE']._serialized_start=59846 - _globals['_RENEPAYSTATUSRESPONSE']._serialized_end=59917 - _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_start=59920 - _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_end=60402 - _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_start=60265 - _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_end=60334 - _globals['_RENEPAYREQUEST']._serialized_start=60405 - _globals['_RENEPAYREQUEST']._serialized_end=60751 - _globals['_RENEPAYRESPONSE']._serialized_start=60754 - _globals['_RENEPAYRESPONSE']._serialized_end=61175 - _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_start=61071 - _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_end=61125 - _globals['_RESERVEINPUTSREQUEST']._serialized_start=61177 - _globals['_RESERVEINPUTSREQUEST']._serialized_end=61285 - _globals['_RESERVEINPUTSRESPONSE']._serialized_start=61287 - _globals['_RESERVEINPUTSRESPONSE']._serialized_end=61364 - _globals['_RESERVEINPUTSRESERVATIONS']._serialized_start=61366 - _globals['_RESERVEINPUTSRESERVATIONS']._serialized_end=61488 - _globals['_SENDCUSTOMMSGREQUEST']._serialized_start=61490 - _globals['_SENDCUSTOMMSGREQUEST']._serialized_end=61542 - _globals['_SENDCUSTOMMSGRESPONSE']._serialized_start=61544 - _globals['_SENDCUSTOMMSGRESPONSE']._serialized_end=61583 - _globals['_SENDINVOICEREQUEST']._serialized_start=61586 - _globals['_SENDINVOICEREQUEST']._serialized_end=61762 - _globals['_SENDINVOICERESPONSE']._serialized_start=61765 - _globals['_SENDINVOICERESPONSE']._serialized_end=62333 - _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_start=62162 - _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_end=62216 - _globals['_SETCHANNELREQUEST']._serialized_start=62336 - _globals['_SETCHANNELREQUEST']._serialized_end=62634 - _globals['_SETCHANNELRESPONSE']._serialized_start=62636 - _globals['_SETCHANNELRESPONSE']._serialized_end=62699 - _globals['_SETCHANNELCHANNELS']._serialized_start=62702 - _globals['_SETCHANNELCHANNELS']._serialized_end=63133 - _globals['_SETCONFIGREQUEST']._serialized_start=63135 - _globals['_SETCONFIGREQUEST']._serialized_end=63233 - _globals['_SETCONFIGRESPONSE']._serialized_start=63235 - _globals['_SETCONFIGRESPONSE']._serialized_end=63292 - _globals['_SETCONFIGCONFIG']._serialized_start=63295 - _globals['_SETCONFIGCONFIG']._serialized_end=63588 - _globals['_SETPSBTVERSIONREQUEST']._serialized_start=63590 - _globals['_SETPSBTVERSIONREQUEST']._serialized_end=63644 - _globals['_SETPSBTVERSIONRESPONSE']._serialized_start=63646 - _globals['_SETPSBTVERSIONRESPONSE']._serialized_end=63684 - _globals['_SIGNINVOICEREQUEST']._serialized_start=63686 - _globals['_SIGNINVOICEREQUEST']._serialized_end=63725 - _globals['_SIGNINVOICERESPONSE']._serialized_start=63727 - _globals['_SIGNINVOICERESPONSE']._serialized_end=63764 - _globals['_SIGNMESSAGEREQUEST']._serialized_start=63766 - _globals['_SIGNMESSAGEREQUEST']._serialized_end=63803 - _globals['_SIGNMESSAGERESPONSE']._serialized_start=63805 - _globals['_SIGNMESSAGERESPONSE']._serialized_end=63875 - _globals['_SPLICEINITREQUEST']._serialized_start=63878 - _globals['_SPLICEINITREQUEST']._serialized_end=64078 - _globals['_SPLICEINITRESPONSE']._serialized_start=64080 - _globals['_SPLICEINITRESPONSE']._serialized_end=64114 - _globals['_SPLICESIGNEDREQUEST']._serialized_start=64116 - _globals['_SPLICESIGNEDREQUEST']._serialized_end=64211 - _globals['_SPLICESIGNEDRESPONSE']._serialized_start=64213 - _globals['_SPLICESIGNEDRESPONSE']._serialized_end=64307 - _globals['_SPLICEUPDATEREQUEST']._serialized_start=64309 - _globals['_SPLICEUPDATEREQUEST']._serialized_end=64364 - _globals['_SPLICEUPDATERESPONSE']._serialized_start=64366 - _globals['_SPLICEUPDATERESPONSE']._serialized_end=64487 - _globals['_SPLICEINREQUEST']._serialized_start=64489 - _globals['_SPLICEINREQUEST']._serialized_end=64539 - _globals['_SPLICEINRESPONSE']._serialized_start=64541 - _globals['_SPLICEINRESPONSE']._serialized_end=64639 - _globals['_SPLICEOUTREQUEST']._serialized_start=64642 - _globals['_SPLICEOUTREQUEST']._serialized_end=64781 - _globals['_SPLICEOUTRESPONSE']._serialized_start=64783 - _globals['_SPLICEOUTRESPONSE']._serialized_end=64882 - _globals['_DEVSPLICEREQUEST']._serialized_start=64885 - _globals['_DEVSPLICEREQUEST']._serialized_end=65083 - _globals['_DEVSPLICERESPONSE']._serialized_start=65086 - _globals['_DEVSPLICERESPONSE']._serialized_end=65214 - _globals['_UNRESERVEINPUTSREQUEST']._serialized_start=65216 - _globals['_UNRESERVEINPUTSREQUEST']._serialized_end=65288 - _globals['_UNRESERVEINPUTSRESPONSE']._serialized_start=65290 - _globals['_UNRESERVEINPUTSRESPONSE']._serialized_end=65371 - _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_start=65374 - _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_end=65525 - _globals['_UPGRADEWALLETREQUEST']._serialized_start=65527 - _globals['_UPGRADEWALLETREQUEST']._serialized_end=65637 - _globals['_UPGRADEWALLETRESPONSE']._serialized_start=65639 - _globals['_UPGRADEWALLETRESPONSE']._serialized_end=65765 - _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_start=65767 - _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_end=65846 - _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_start=65848 - _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_end=65894 - _globals['_WAITREQUEST']._serialized_start=65897 - _globals['_WAITREQUEST']._serialized_end=66210 - _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_start=66033 - _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_end=66154 - _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_start=66156 - _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_end=66210 - _globals['_WAITRESPONSE']._serialized_start=66213 - _globals['_WAITRESPONSE']._serialized_end=66965 - _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_start=66033 - _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_end=66154 - _globals['_WAITFORWARDS']._serialized_start=66968 - _globals['_WAITFORWARDS']._serialized_end=67299 - _globals['_WAITFORWARDS_WAITFORWARDSSTATUS']._serialized_start=67154 - _globals['_WAITFORWARDS_WAITFORWARDSSTATUS']._serialized_end=67230 - _globals['_WAITINVOICES']._serialized_start=67302 - _globals['_WAITINVOICES']._serialized_end=67579 - _globals['_WAITINVOICES_WAITINVOICESSTATUS']._serialized_start=67465 - _globals['_WAITINVOICES_WAITINVOICESSTATUS']._serialized_end=67520 - _globals['_WAITSENDPAYS']._serialized_start=67582 - _globals['_WAITSENDPAYS']._serialized_end=67837 - _globals['_WAITSENDPAYS_WAITSENDPAYSSTATUS']._serialized_start=67727 - _globals['_WAITSENDPAYS_WAITSENDPAYSSTATUS']._serialized_end=67786 - _globals['_WAITHTLCS']._serialized_start=67840 - _globals['_WAITHTLCS']._serialized_end=68236 - _globals['_WAITHTLCS_WAITHTLCSDIRECTION']._serialized_start=68093 - _globals['_WAITHTLCS_WAITHTLCSDIRECTION']._serialized_end=68130 - _globals['_WAITCHAINMOVES']._serialized_start=68238 - _globals['_WAITCHAINMOVES']._serialized_end=68338 - _globals['_WAITCHANNELMOVES']._serialized_start=68340 - _globals['_WAITCHANNELMOVES']._serialized_end=68442 - _globals['_WAITNETWORKEVENTS']._serialized_start=68445 - _globals['_WAITNETWORKEVENTS']._serialized_end=68710 - _globals['_WAITNETWORKEVENTS_WAITNETWORKEVENTSTYPE']._serialized_start=68586 - _globals['_WAITNETWORKEVENTS_WAITNETWORKEVENTSTYPE']._serialized_end=68666 - _globals['_WAITDETAILS']._serialized_start=68713 - _globals['_WAITDETAILS']._serialized_end=69349 - _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_start=69055 - _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_end=69192 - _globals['_LISTCONFIGSREQUEST']._serialized_start=69351 - _globals['_LISTCONFIGSREQUEST']._serialized_end=69403 - _globals['_LISTCONFIGSRESPONSE']._serialized_start=69405 - _globals['_LISTCONFIGSRESPONSE']._serialized_end=69485 - _globals['_LISTCONFIGSCONFIGS']._serialized_start=69488 - _globals['_LISTCONFIGSCONFIGS']._serialized_end=75717 - _globals['_LISTCONFIGSCONFIGSCONF']._serialized_start=75720 - _globals['_LISTCONFIGSCONFIGSCONF']._serialized_end=75882 - _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_start=75839 - _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_end=75882 - _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_start=75884 - _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_end=75942 - _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_start=75944 - _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_end=76005 - _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_start=76007 - _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_end=76098 - _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_start=76100 - _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_end=76156 - _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_start=76158 - _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_end=76214 - _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_start=76216 - _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_end=76271 - _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_start=76273 - _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_end=76329 - _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_start=76331 - _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_end=76403 - _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_start=76405 - _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_end=76468 - _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_start=76470 - _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_end=76536 - _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_start=76538 - _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_end=76605 - _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_start=76607 - _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_end=76669 - _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_start=76671 - _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_end=76746 - _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_start=76748 - _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_end=76810 - _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_start=76812 - _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_end=76882 - _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_start=76884 - _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_end=76954 - _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_start=76956 - _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_end=77011 - _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_start=77013 - _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_end=77074 - _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_start=77076 - _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_end=77138 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_start=77140 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_end=77209 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_start=77211 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_end=77280 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_start=77282 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_end=77356 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_start=77358 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_end=77425 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_start=77427 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_end=77508 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_start=77510 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_end=77582 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_start=77584 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_end=77652 - _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_start=77654 - _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_end=77725 - _globals['_LISTCONFIGSCONFIGSRGB']._serialized_start=77727 - _globals['_LISTCONFIGSCONFIGSRGB']._serialized_end=77785 - _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_start=77787 - _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_end=77847 - _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_start=77849 - _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_end=77911 - _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_start=77913 - _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_end=77984 - _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_start=77986 - _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_end=78056 - _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_start=78058 - _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_end=78130 - _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_start=78132 - _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_end=78202 - _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_start=78204 - _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_end=78268 - _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_start=78270 - _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_end=78334 - _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_start=78336 - _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_end=78401 - _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_start=78403 - _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_end=78465 - _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_start=78467 - _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_end=78528 - _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_start=78530 - _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_end=78598 - _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_start=78600 - _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_end=78673 - _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_start=78675 - _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_end=78759 - _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_start=78761 - _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_end=78845 - _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_start=78847 - _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_end=78939 - _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_start=78941 - _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_end=79044 - _globals['_LISTCONFIGSCONFIGSADDR']._serialized_start=79046 - _globals['_LISTCONFIGSCONFIGSADDR']._serialized_end=79107 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_start=79109 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_end=79178 - _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_start=79180 - _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_end=79245 - _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_start=79247 - _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_end=79303 - _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_start=79305 - _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_end=79371 - _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_start=79373 - _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_end=79433 - _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_start=79435 - _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_end=79494 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_start=79497 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_end=79753 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_start=79672 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_end=79753 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_start=79755 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_end=79836 - _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_start=79838 - _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_end=79899 - _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_start=79901 - _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_end=79967 - _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_start=79969 - _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_end=80032 - _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_start=80034 - _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_end=80098 - _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_start=80100 - _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_end=80164 - _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_start=80166 - _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_end=80235 - _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_start=80237 - _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_end=80305 - _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_start=80307 - _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_end=80373 - _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_start=80375 - _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_end=80477 - _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_start=80479 - _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_end=80552 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_start=80554 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_end=80625 - _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_start=80627 - _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_end=80705 - _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_start=80707 - _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_end=80771 - _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_start=80773 - _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_end=80847 - _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_start=80849 - _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_end=80926 - _globals['_LISTCONFIGSCONFIGSCURRENCYRATEADDSOURCE']._serialized_start=80928 - _globals['_LISTCONFIGSCONFIGSCURRENCYRATEADDSOURCE']._serialized_end=81038 - _globals['_LISTCONFIGSCONFIGSCURRENCYRATEDISABLESOURCE']._serialized_start=81040 - _globals['_LISTCONFIGSCONFIGSCURRENCYRATEDISABLESOURCE']._serialized_end=81154 - _globals['_STOPREQUEST']._serialized_start=81156 - _globals['_STOPREQUEST']._serialized_end=81169 - _globals['_STOPRESPONSE']._serialized_start=81171 - _globals['_STOPRESPONSE']._serialized_end=81268 - _globals['_STOPRESPONSE_STOPRESULT']._serialized_start=81233 - _globals['_STOPRESPONSE_STOPRESULT']._serialized_end=81268 - _globals['_HELPREQUEST']._serialized_start=81270 - _globals['_HELPREQUEST']._serialized_end=81317 - _globals['_HELPRESPONSE']._serialized_start=81320 - _globals['_HELPRESPONSE']._serialized_end=81469 - _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_start=81425 - _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_end=81453 - _globals['_HELPHELP']._serialized_start=81471 - _globals['_HELPHELP']._serialized_end=81498 - _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_start=81500 - _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_end=81603 - _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_start=81605 - _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_end=81632 - _globals['_PREAPPROVEINVOICEREQUEST']._serialized_start=81634 - _globals['_PREAPPROVEINVOICEREQUEST']._serialized_end=81676 - _globals['_PREAPPROVEINVOICERESPONSE']._serialized_start=81678 - _globals['_PREAPPROVEINVOICERESPONSE']._serialized_end=81705 - _globals['_STATICBACKUPREQUEST']._serialized_start=81707 - _globals['_STATICBACKUPREQUEST']._serialized_end=81728 - _globals['_STATICBACKUPRESPONSE']._serialized_start=81730 - _globals['_STATICBACKUPRESPONSE']._serialized_end=81765 - _globals['_BKPRCHANNELSAPYREQUEST']._serialized_start=81767 - _globals['_BKPRCHANNELSAPYREQUEST']._serialized_end=81867 - _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_start=81869 - _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_end=81949 - _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_start=81952 - _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_end=82841 - _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_start=82844 - _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_end=83054 - _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_start=83057 - _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_end=83269 - _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_start=83183 - _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_end=83269 - _globals['_BKPRINSPECTREQUEST']._serialized_start=83271 - _globals['_BKPRINSPECTREQUEST']._serialized_end=83308 - _globals['_BKPRINSPECTRESPONSE']._serialized_start=83310 - _globals['_BKPRINSPECTRESPONSE']._serialized_end=83365 - _globals['_BKPRINSPECTTXS']._serialized_start=83368 - _globals['_BKPRINSPECTTXS']._serialized_end=83522 - _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_start=83525 - _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_end=83969 - _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_start=83971 - _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_end=84075 - _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_start=84077 - _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_end=84158 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_start=84161 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_end=84878 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_start=84664 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_end=84738 - _globals['_BKPRLISTBALANCESREQUEST']._serialized_start=84880 - _globals['_BKPRLISTBALANCESREQUEST']._serialized_end=84905 - _globals['_BKPRLISTBALANCESRESPONSE']._serialized_start=84907 - _globals['_BKPRLISTBALANCESRESPONSE']._serialized_end=84982 - _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_start=84985 - _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_end=85311 - _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_start=85313 - _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_end=85401 - _globals['_BKPRLISTINCOMEREQUEST']._serialized_start=85404 - _globals['_BKPRLISTINCOMEREQUEST']._serialized_end=85555 - _globals['_BKPRLISTINCOMERESPONSE']._serialized_start=85557 - _globals['_BKPRLISTINCOMERESPONSE']._serialized_end=85637 - _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_start=85640 - _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_end=85948 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_start=85950 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_end=86030 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_start=86032 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_end=86133 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_start=86136 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_end=86811 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_start=86637 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_end=86704 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_start=86813 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_end=86890 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_start=86892 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_end=86991 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_start=86994 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_end=87665 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_start=87492 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_end=87558 - _globals['_BKPRREPORTREQUEST']._serialized_start=87668 - _globals['_BKPRREPORTREQUEST']._serialized_end=87844 - _globals['_BKPRREPORTRESPONSE']._serialized_start=87846 - _globals['_BKPRREPORTRESPONSE']._serialized_end=87882 - _globals['_BLACKLISTRUNEREQUEST']._serialized_start=87884 - _globals['_BLACKLISTRUNEREQUEST']._serialized_end=87994 - _globals['_BLACKLISTRUNERESPONSE']._serialized_start=87996 - _globals['_BLACKLISTRUNERESPONSE']._serialized_end=88067 - _globals['_BLACKLISTRUNEBLACKLIST']._serialized_start=88069 - _globals['_BLACKLISTRUNEBLACKLIST']._serialized_end=88121 - _globals['_CHECKRUNEREQUEST']._serialized_start=88123 - _globals['_CHECKRUNEREQUEST']._serialized_end=88235 - _globals['_CHECKRUNERESPONSE']._serialized_start=88237 - _globals['_CHECKRUNERESPONSE']._serialized_end=88271 - _globals['_CREATERUNEREQUEST']._serialized_start=88273 - _globals['_CREATERUNEREQUEST']._serialized_end=88342 - _globals['_CREATERUNERESPONSE']._serialized_start=88344 - _globals['_CREATERUNERESPONSE']._serialized_end=88467 - _globals['_SHOWRUNESREQUEST']._serialized_start=88469 - _globals['_SHOWRUNESREQUEST']._serialized_end=88515 - _globals['_SHOWRUNESRESPONSE']._serialized_start=88517 - _globals['_SHOWRUNESRESPONSE']._serialized_end=88572 - _globals['_SHOWRUNESRUNES']._serialized_start=88575 - _globals['_SHOWRUNESRUNES']._serialized_end=88860 - _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_start=88862 - _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_end=88974 - _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_start=88976 - _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_end=89086 - _globals['_ASKRENEUNRESERVEREQUEST']._serialized_start=89088 - _globals['_ASKRENEUNRESERVEREQUEST']._serialized_end=89202 - _globals['_ASKRENEUNRESERVERESPONSE']._serialized_start=89204 - _globals['_ASKRENEUNRESERVERESPONSE']._serialized_end=89230 - _globals['_ASKRENEUNRESERVEPATH']._serialized_start=89232 - _globals['_ASKRENEUNRESERVEPATH']._serialized_end=89348 - _globals['_ASKRENELISTLAYERSREQUEST']._serialized_start=89350 - _globals['_ASKRENELISTLAYERSREQUEST']._serialized_end=89406 - _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_start=89408 - _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_end=89481 - _globals['_ASKRENELISTLAYERSLAYERS']._serialized_start=89484 - _globals['_ASKRENELISTLAYERSLAYERS']._serialized_end=89910 - _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_start=89913 - _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_end=90052 - _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_start=90055 - _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_end=90479 - _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_start=90482 - _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_end=90700 - _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_start=90703 - _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_end=90858 - _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_start=90861 - _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_end=91006 - _globals['_ASKRENECREATELAYERREQUEST']._serialized_start=91008 - _globals['_ASKRENECREATELAYERREQUEST']._serialized_end=91090 - _globals['_ASKRENECREATELAYERRESPONSE']._serialized_start=91092 - _globals['_ASKRENECREATELAYERRESPONSE']._serialized_end=91167 - _globals['_ASKRENECREATELAYERLAYERS']._serialized_start=91170 - _globals['_ASKRENECREATELAYERLAYERS']._serialized_end=91602 - _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_start=91605 - _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_end=91745 - _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_start=91748 - _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_end=92085 - _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_start=92088 - _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_end=92284 - _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_start=92287 - _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_end=92443 - _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_start=92446 - _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_end=92592 - _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_start=92594 - _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_end=92636 - _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_start=92638 - _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_end=92666 - _globals['_ASKRENERESERVEREQUEST']._serialized_start=92668 - _globals['_ASKRENERESERVEREQUEST']._serialized_end=92730 - _globals['_ASKRENERESERVERESPONSE']._serialized_start=92732 - _globals['_ASKRENERESERVERESPONSE']._serialized_end=92756 - _globals['_ASKRENERESERVEPATH']._serialized_start=92758 - _globals['_ASKRENERESERVEPATH']._serialized_end=92872 - _globals['_ASKRENEAGEREQUEST']._serialized_start=92874 - _globals['_ASKRENEAGEREQUEST']._serialized_end=92924 - _globals['_ASKRENEAGERESPONSE']._serialized_start=92926 - _globals['_ASKRENEAGERESPONSE']._serialized_end=92982 - _globals['_GETROUTESREQUEST']._serialized_start=92985 - _globals['_GETROUTESREQUEST']._serialized_end=93216 - _globals['_GETROUTESRESPONSE']._serialized_start=93218 - _globals['_GETROUTESRESPONSE']._serialized_end=93300 - _globals['_GETROUTESROUTES']._serialized_start=93303 - _globals['_GETROUTESROUTES']._serialized_end=93439 - _globals['_GETROUTESROUTESPATH']._serialized_start=93441 - _globals['_GETROUTESROUTESPATH']._serialized_end=93563 - _globals['_ASKRENEDISABLENODEREQUEST']._serialized_start=93565 - _globals['_ASKRENEDISABLENODEREQUEST']._serialized_end=93621 - _globals['_ASKRENEDISABLENODERESPONSE']._serialized_start=93623 - _globals['_ASKRENEDISABLENODERESPONSE']._serialized_end=93651 - _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_start=93654 - _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_end=93920 - _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_start=93841 - _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_end=93920 - _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_start=93922 - _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_end=94011 - _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_start=94014 - _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_end=94225 - _globals['_ASKRENECREATECHANNELREQUEST']._serialized_start=94228 - _globals['_ASKRENECREATECHANNELREQUEST']._serialized_end=94371 - _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_start=94373 - _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_end=94403 - _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_start=94406 - _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_end=94835 - _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_start=94837 - _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_end=94867 - _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_start=94870 - _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_end=95034 - _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_start=95036 - _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_end=95111 - _globals['_ASKRENEBIASCHANNELBIASES']._serialized_start=95114 - _globals['_ASKRENEBIASCHANNELBIASES']._serialized_end=95279 - _globals['_ASKRENEBIASNODEREQUEST']._serialized_start=95282 - _globals['_ASKRENEBIASNODEREQUEST']._serialized_end=95446 - _globals['_ASKRENEBIASNODERESPONSE']._serialized_start=95448 - _globals['_ASKRENEBIASNODERESPONSE']._serialized_end=95526 - _globals['_ASKRENEBIASNODENODEBIASES']._serialized_start=95529 - _globals['_ASKRENEBIASNODENODEBIASES']._serialized_end=95681 - _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_start=95683 - _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_end=95715 - _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_start=95717 - _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_end=95814 - _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_start=95817 - _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_end=95962 - _globals['_INJECTPAYMENTONIONREQUEST']._serialized_start=95965 - _globals['_INJECTPAYMENTONIONREQUEST']._serialized_end=96296 - _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_start=96298 - _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_end=96417 - _globals['_INJECTONIONMESSAGEREQUEST']._serialized_start=96419 - _globals['_INJECTONIONMESSAGEREQUEST']._serialized_end=96481 - _globals['_INJECTONIONMESSAGERESPONSE']._serialized_start=96483 - _globals['_INJECTONIONMESSAGERESPONSE']._serialized_end=96511 - _globals['_XPAYREQUEST']._serialized_start=96514 - _globals['_XPAYREQUEST']._serialized_end=96833 - _globals['_XPAYRESPONSE']._serialized_start=96836 - _globals['_XPAYRESPONSE']._serialized_end=96997 - _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_start=96999 - _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_end=97060 - _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_start=97062 - _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_end=97158 - _globals['_LISTCHANNELMOVESREQUEST']._serialized_start=97161 - _globals['_LISTCHANNELMOVESREQUEST']._serialized_end=97366 - _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_start=97300 - _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_end=97336 - _globals['_LISTCHANNELMOVESRESPONSE']._serialized_start=97368 - _globals['_LISTCHANNELMOVESRESPONSE']._serialized_end=97451 - _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_start=97454 - _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_end=98007 - _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_start=97815 - _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_end=97965 - _globals['_LISTCHAINMOVESREQUEST']._serialized_start=98010 - _globals['_LISTCHAINMOVESREQUEST']._serialized_end=98207 - _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_start=98143 - _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_end=98177 - _globals['_LISTCHAINMOVESRESPONSE']._serialized_start=98209 - _globals['_LISTCHAINMOVESRESPONSE']._serialized_end=98284 - _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_start=98287 - _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_end=99139 - _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_start=98774 - _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_end=99051 - _globals['_LISTNETWORKEVENTSREQUEST']._serialized_start=99142 - _globals['_LISTNETWORKEVENTSREQUEST']._serialized_end=99375 - _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_start=99301 - _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_end=99338 - _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_start=99377 - _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_end=99464 - _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_start=99467 - _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_end=99709 - _globals['_DELNETWORKEVENTREQUEST']._serialized_start=99711 - _globals['_DELNETWORKEVENTREQUEST']._serialized_end=99758 - _globals['_DELNETWORKEVENTRESPONSE']._serialized_start=99760 - _globals['_DELNETWORKEVENTRESPONSE']._serialized_end=99785 - _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_start=99788 - _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_end=100034 - _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_start=100036 - _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_end=100065 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_start=100068 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_end=100286 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_start=100219 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_end=100264 - _globals['_LISTCURRENCYRATESREQUEST']._serialized_start=100288 - _globals['_LISTCURRENCYRATESREQUEST']._serialized_end=100332 - _globals['_LISTCURRENCYRATESRESPONSE']._serialized_start=100334 - _globals['_LISTCURRENCYRATESRESPONSE']._serialized_end=100421 - _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_start=100423 - _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_end=100487 - _globals['_CURRENCYCONVERTREQUEST']._serialized_start=100489 - _globals['_CURRENCYCONVERTREQUEST']._serialized_end=100547 - _globals['_CURRENCYCONVERTRESPONSE']._serialized_start=100549 - _globals['_CURRENCYCONVERTRESPONSE']._serialized_end=100601 - _globals['_CURRENCYRATEREQUEST']._serialized_start=100603 - _globals['_CURRENCYRATEREQUEST']._serialized_end=100642 - _globals['_CURRENCYRATERESPONSE']._serialized_start=100644 - _globals['_CURRENCYRATERESPONSE']._serialized_end=100680 - _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_start=100682 - _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_end=100712 - _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_start=100715 - _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_end=100849 - _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_start=100851 - _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_end=100950 - _globals['_STREAMBLOCKADDEDREQUEST']._serialized_start=100952 - _globals['_STREAMBLOCKADDEDREQUEST']._serialized_end=100977 - _globals['_BLOCKADDEDNOTIFICATION']._serialized_start=100979 - _globals['_BLOCKADDEDNOTIFICATION']._serialized_end=101033 - _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_start=101035 - _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_end=101067 - _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_start=101069 - _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_end=101120 - _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_start=101122 - _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_end=101150 - _globals['_CHANNELOPENEDNOTIFICATION']._serialized_start=101152 - _globals['_CHANNELOPENEDNOTIFICATION']._serialized_end=101271 - _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_start=101273 - _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_end=101307 - _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_start=101310 - _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_end=101759 - _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_start=101613 - _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_end=101712 - _globals['_STREAMCONNECTREQUEST']._serialized_start=101761 - _globals['_STREAMCONNECTREQUEST']._serialized_end=101783 - _globals['_PEERCONNECTNOTIFICATION']._serialized_start=101786 - _globals['_PEERCONNECTNOTIFICATION']._serialized_end=101976 - _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_start=101937 - _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_end=101976 - _globals['_PEERCONNECTADDRESS']._serialized_start=101979 - _globals['_PEERCONNECTADDRESS']._serialized_end=102261 - _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_start=102130 - _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_end=102229 - _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_start=102263 - _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_end=102290 - _globals['_COINMOVEMENTNOTIFICATION']._serialized_start=102293 - _globals['_COINMOVEMENTNOTIFICATION']._serialized_end=103732 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_start=103070 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_end=103120 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_start=103123 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_end=103498 - _globals['_STREAMCUSTOMMSGREQUEST']._serialized_start=103734 - _globals['_STREAMCUSTOMMSGREQUEST']._serialized_end=103758 - _globals['_CUSTOMMSGNOTIFICATION']._serialized_start=103760 - _globals['_CUSTOMMSGNOTIFICATION']._serialized_end=103817 - _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_start=103819 - _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_end=103851 - _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_start=103853 - _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_end=103907 - _globals['_STREAMDISCONNECTREQUEST']._serialized_start=103909 - _globals['_STREAMDISCONNECTREQUEST']._serialized_end=103934 - _globals['_DISCONNECTNOTIFICATION']._serialized_start=103936 - _globals['_DISCONNECTNOTIFICATION']._serialized_end=103972 - _globals['_STREAMFORWARDEVENTREQUEST']._serialized_start=103974 - _globals['_STREAMFORWARDEVENTREQUEST']._serialized_end=104001 - _globals['_FORWARDEVENTNOTIFICATION']._serialized_start=104004 - _globals['_FORWARDEVENTNOTIFICATION']._serialized_end=104652 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_start=104436 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_end=104512 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_start=104514 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_end=104554 - _globals['_STREAMINVOICECREATIONREQUEST']._serialized_start=104654 - _globals['_STREAMINVOICECREATIONREQUEST']._serialized_end=104684 - _globals['_INVOICECREATIONNOTIFICATION']._serialized_start=104686 - _globals['_INVOICECREATIONNOTIFICATION']._serialized_end=104789 - _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_start=104791 - _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_end=104820 - _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_start=104823 - _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_end=104962 - _globals['_STREAMLOGREQUEST']._serialized_start=104964 - _globals['_STREAMLOGREQUEST']._serialized_end=104982 - _globals['_LOGNOTIFICATION']._serialized_start=104985 - _globals['_LOGNOTIFICATION']._serialized_end=105187 - _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_start=105112 - _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_end=105187 - _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_start=105189 - _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_end=105227 - _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_start=105230 - _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_end=105469 - _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_start=105471 - _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_end=105505 - _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_start=105507 - _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_end=105581 - _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_start=105583 - _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_end=105611 - _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_start=105613 - _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_end=105699 - _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_start=105701 - _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_end=105729 - _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_start=105731 - _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_end=105817 - _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_start=105819 - _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_end=105848 - _globals['_SENDPAYFAILURENOTIFICATION']._serialized_start=105850 - _globals['_SENDPAYFAILURENOTIFICATION']._serialized_end=105948 - _globals['_SENDPAYFAILUREDATA']._serialized_start=105951 - _globals['_SENDPAYFAILUREDATA']._serialized_end=107168 - _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_start=106706 - _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_end=106771 - _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_start=107170 - _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_end=107199 - _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_start=107202 - _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_end=107918 - _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_start=107720 - _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_end=107756 - _globals['_STREAMSHUTDOWNREQUEST']._serialized_start=107920 - _globals['_STREAMSHUTDOWNREQUEST']._serialized_end=107943 - _globals['_SHUTDOWNNOTIFICATION']._serialized_start=107945 - _globals['_SHUTDOWNNOTIFICATION']._serialized_end=107967 - _globals['_STREAMWARNINGREQUEST']._serialized_start=107969 - _globals['_STREAMWARNINGREQUEST']._serialized_end=107991 - _globals['_WARNINGNOTIFICATION']._serialized_start=107994 - _globals['_WARNINGNOTIFICATION']._serialized_end=108168 - _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_start=108133 - _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_end=108168 - _globals['_STREAMPAYPARTENDREQUEST']._serialized_start=108170 - _globals['_STREAMPAYPARTENDREQUEST']._serialized_end=108195 - _globals['_PAYPARTENDNOTIFICATION']._serialized_start=108198 - _globals['_PAYPARTENDNOTIFICATION']._serialized_end=108695 - _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_start=108535 - _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_end=108579 - _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_start=108697 - _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_end=108724 - _globals['_PAYPARTSTARTNOTIFICATION']._serialized_start=108727 - _globals['_PAYPARTSTARTNOTIFICATION']._serialized_end=108921 - _globals['_PAYPARTSTARTHOPS']._serialized_start=108924 - _globals['_PAYPARTSTARTHOPS']._serialized_end=109083 - _globals['_NODE']._serialized_start=109086 - _globals['_NODE']._serialized_end=122092 + _globals['_SENDPAYROUTE']._serialized_start=4036 + _globals['_SENDPAYROUTE']._serialized_end=4394 + _globals['_LISTCHANNELSREQUEST']._serialized_start=4397 + _globals['_LISTCHANNELSREQUEST']._serialized_end=4544 + _globals['_LISTCHANNELSRESPONSE']._serialized_start=4546 + _globals['_LISTCHANNELSRESPONSE']._serialized_end=4613 + _globals['_LISTCHANNELSCHANNELS']._serialized_start=4616 + _globals['_LISTCHANNELSCHANNELS']._serialized_end=5051 + _globals['_ADDGOSSIPREQUEST']._serialized_start=5053 + _globals['_ADDGOSSIPREQUEST']._serialized_end=5088 + _globals['_ADDGOSSIPRESPONSE']._serialized_start=5090 + _globals['_ADDGOSSIPRESPONSE']._serialized_end=5109 + _globals['_ADDPSBTOUTPUTREQUEST']._serialized_start=5112 + _globals['_ADDPSBTOUTPUTREQUEST']._serialized_end=5284 + _globals['_ADDPSBTOUTPUTRESPONSE']._serialized_start=5286 + _globals['_ADDPSBTOUTPUTRESPONSE']._serialized_end=5371 + _globals['_AUTOCLEANONCEREQUEST']._serialized_start=5373 + _globals['_AUTOCLEANONCEREQUEST']._serialized_end=5452 + _globals['_AUTOCLEANONCERESPONSE']._serialized_start=5454 + _globals['_AUTOCLEANONCERESPONSE']._serialized_end=5525 + _globals['_AUTOCLEANONCEAUTOCLEAN']._serialized_start=5528 + _globals['_AUTOCLEANONCEAUTOCLEAN']._serialized_end=6177 + _globals['_AUTOCLEANONCEAUTOCLEANSUCCEEDEDFORWARDS']._serialized_start=6179 + _globals['_AUTOCLEANONCEAUTOCLEANSUCCEEDEDFORWARDS']._serialized_end=6256 + _globals['_AUTOCLEANONCEAUTOCLEANFAILEDFORWARDS']._serialized_start=6258 + _globals['_AUTOCLEANONCEAUTOCLEANFAILEDFORWARDS']._serialized_end=6332 + _globals['_AUTOCLEANONCEAUTOCLEANSUCCEEDEDPAYS']._serialized_start=6334 + _globals['_AUTOCLEANONCEAUTOCLEANSUCCEEDEDPAYS']._serialized_end=6407 + _globals['_AUTOCLEANONCEAUTOCLEANFAILEDPAYS']._serialized_start=6409 + _globals['_AUTOCLEANONCEAUTOCLEANFAILEDPAYS']._serialized_end=6479 + _globals['_AUTOCLEANONCEAUTOCLEANPAIDINVOICES']._serialized_start=6481 + _globals['_AUTOCLEANONCEAUTOCLEANPAIDINVOICES']._serialized_end=6553 + _globals['_AUTOCLEANONCEAUTOCLEANEXPIREDINVOICES']._serialized_start=6555 + _globals['_AUTOCLEANONCEAUTOCLEANEXPIREDINVOICES']._serialized_end=6630 + _globals['_AUTOCLEANONCEAUTOCLEANNETWORKEVENTS']._serialized_start=6632 + _globals['_AUTOCLEANONCEAUTOCLEANNETWORKEVENTS']._serialized_end=6705 + _globals['_AUTOCLEANSTATUSREQUEST']._serialized_start=6707 + _globals['_AUTOCLEANSTATUSREQUEST']._serialized_end=6794 + _globals['_AUTOCLEANSTATUSRESPONSE']._serialized_start=6796 + _globals['_AUTOCLEANSTATUSRESPONSE']._serialized_end=6871 + _globals['_AUTOCLEANSTATUSAUTOCLEAN']._serialized_start=6874 + _globals['_AUTOCLEANSTATUSAUTOCLEAN']._serialized_end=7539 + _globals['_AUTOCLEANSTATUSAUTOCLEANSUCCEEDEDFORWARDS']._serialized_start=7541 + _globals['_AUTOCLEANSTATUSAUTOCLEANSUCCEEDEDFORWARDS']._serialized_end=7644 + _globals['_AUTOCLEANSTATUSAUTOCLEANFAILEDFORWARDS']._serialized_start=7646 + _globals['_AUTOCLEANSTATUSAUTOCLEANFAILEDFORWARDS']._serialized_end=7746 + _globals['_AUTOCLEANSTATUSAUTOCLEANSUCCEEDEDPAYS']._serialized_start=7748 + _globals['_AUTOCLEANSTATUSAUTOCLEANSUCCEEDEDPAYS']._serialized_end=7847 + _globals['_AUTOCLEANSTATUSAUTOCLEANFAILEDPAYS']._serialized_start=7849 + _globals['_AUTOCLEANSTATUSAUTOCLEANFAILEDPAYS']._serialized_end=7945 + _globals['_AUTOCLEANSTATUSAUTOCLEANPAIDINVOICES']._serialized_start=7947 + _globals['_AUTOCLEANSTATUSAUTOCLEANPAIDINVOICES']._serialized_end=8045 + _globals['_AUTOCLEANSTATUSAUTOCLEANEXPIREDINVOICES']._serialized_start=8047 + _globals['_AUTOCLEANSTATUSAUTOCLEANEXPIREDINVOICES']._serialized_end=8148 + _globals['_AUTOCLEANSTATUSAUTOCLEANNETWORKEVENTS']._serialized_start=8150 + _globals['_AUTOCLEANSTATUSAUTOCLEANNETWORKEVENTS']._serialized_end=8249 + _globals['_CHECKMESSAGEREQUEST']._serialized_start=8251 + _globals['_CHECKMESSAGEREQUEST']._serialized_end=8336 + _globals['_CHECKMESSAGERESPONSE']._serialized_start=8338 + _globals['_CHECKMESSAGERESPONSE']._serialized_end=8394 + _globals['_CLOSEREQUEST']._serialized_start=8397 + _globals['_CLOSEREQUEST']._serialized_end=8728 + _globals['_CLOSERESPONSE']._serialized_start=8731 + _globals['_CLOSERESPONSE']._serialized_end=8878 + _globals['_CLOSERESPONSE_CLOSETYPE']._serialized_start=8825 + _globals['_CLOSERESPONSE_CLOSETYPE']._serialized_end=8878 + _globals['_CONNECTREQUEST']._serialized_start=8880 + _globals['_CONNECTREQUEST']._serialized_end=8964 + _globals['_CONNECTRESPONSE']._serialized_start=8967 + _globals['_CONNECTRESPONSE']._serialized_end=9147 + _globals['_CONNECTRESPONSE_CONNECTDIRECTION']._serialized_start=9112 + _globals['_CONNECTRESPONSE_CONNECTDIRECTION']._serialized_end=9147 + _globals['_CONNECTADDRESS']._serialized_start=9150 + _globals['_CONNECTADDRESS']._serialized_end=9401 + _globals['_CONNECTADDRESS_CONNECTADDRESSTYPE']._serialized_start=9289 + _globals['_CONNECTADDRESS_CONNECTADDRESSTYPE']._serialized_end=9369 + _globals['_CREATEINVOICEREQUEST']._serialized_start=9403 + _globals['_CREATEINVOICEREQUEST']._serialized_end=9477 + _globals['_CREATEINVOICERESPONSE']._serialized_start=9480 + _globals['_CREATEINVOICERESPONSE']._serialized_end=10222 + _globals['_CREATEINVOICERESPONSE_CREATEINVOICESTATUS']._serialized_start=9997 + _globals['_CREATEINVOICERESPONSE_CREATEINVOICESTATUS']._serialized_end=10053 + _globals['_CREATEINVOICEPAIDOUTPOINT']._serialized_start=10224 + _globals['_CREATEINVOICEPAIDOUTPOINT']._serialized_end=10281 + _globals['_DATASTOREREQUEST']._serialized_start=10284 + _globals['_DATASTOREREQUEST']._serialized_end=10592 + _globals['_DATASTOREREQUEST_DATASTOREMODE']._serialized_start=10437 + _globals['_DATASTOREREQUEST_DATASTOREMODE']._serialized_end=10549 + _globals['_DATASTORERESPONSE']._serialized_start=10595 + _globals['_DATASTORERESPONSE']._serialized_end=10725 + _globals['_DATASTOREUSAGEREQUEST']._serialized_start=10727 + _globals['_DATASTOREUSAGEREQUEST']._serialized_end=10763 + _globals['_DATASTOREUSAGERESPONSE']._serialized_start=10765 + _globals['_DATASTOREUSAGERESPONSE']._serialized_end=10848 + _globals['_DATASTOREUSAGEDATASTOREUSAGE']._serialized_start=10850 + _globals['_DATASTOREUSAGEDATASTOREUSAGE']._serialized_end=10914 + _globals['_CREATEONIONREQUEST']._serialized_start=10917 + _globals['_CREATEONIONREQUEST']._serialized_end=11074 + _globals['_CREATEONIONRESPONSE']._serialized_start=11076 + _globals['_CREATEONIONRESPONSE']._serialized_end=11136 + _globals['_CREATEONIONHOPS']._serialized_start=11138 + _globals['_CREATEONIONHOPS']._serialized_end=11188 + _globals['_DELDATASTOREREQUEST']._serialized_start=11190 + _globals['_DELDATASTOREREQUEST']._serialized_end=11264 + _globals['_DELDATASTORERESPONSE']._serialized_start=11267 + _globals['_DELDATASTORERESPONSE']._serialized_end=11400 + _globals['_DELINVOICEREQUEST']._serialized_start=11403 + _globals['_DELINVOICEREQUEST']._serialized_end=11585 + _globals['_DELINVOICEREQUEST_DELINVOICESTATUS']._serialized_start=11519 + _globals['_DELINVOICEREQUEST_DELINVOICESTATUS']._serialized_end=11572 + _globals['_DELINVOICERESPONSE']._serialized_start=11588 + _globals['_DELINVOICERESPONSE']._serialized_end=12307 + _globals['_DELINVOICERESPONSE_DELINVOICESTATUS']._serialized_start=11519 + _globals['_DELINVOICERESPONSE_DELINVOICESTATUS']._serialized_end=11572 + _globals['_DEVFORGETCHANNELREQUEST']._serialized_start=12310 + _globals['_DEVFORGETCHANNELREQUEST']._serialized_end=12469 + _globals['_DEVFORGETCHANNELRESPONSE']._serialized_start=12471 + _globals['_DEVFORGETCHANNELRESPONSE']._serialized_end=12560 + _globals['_EMERGENCYRECOVERREQUEST']._serialized_start=12562 + _globals['_EMERGENCYRECOVERREQUEST']._serialized_end=12587 + _globals['_EMERGENCYRECOVERRESPONSE']._serialized_start=12589 + _globals['_EMERGENCYRECOVERRESPONSE']._serialized_end=12630 + _globals['_GETEMERGENCYRECOVERDATAREQUEST']._serialized_start=12632 + _globals['_GETEMERGENCYRECOVERDATAREQUEST']._serialized_end=12664 + _globals['_GETEMERGENCYRECOVERDATARESPONSE']._serialized_start=12666 + _globals['_GETEMERGENCYRECOVERDATARESPONSE']._serialized_end=12776 + _globals['_EXPOSESECRETREQUEST']._serialized_start=12778 + _globals['_EXPOSESECRETREQUEST']._serialized_end=12859 + _globals['_EXPOSESECRETRESPONSE']._serialized_start=12861 + _globals['_EXPOSESECRETRESPONSE']._serialized_end=12956 + _globals['_RECOVERREQUEST']._serialized_start=12958 + _globals['_RECOVERREQUEST']._serialized_end=12993 + _globals['_RECOVERRESPONSE']._serialized_start=12995 + _globals['_RECOVERRESPONSE']._serialized_end=13115 + _globals['_RECOVERRESPONSE_RECOVERRESULT']._serialized_start=13066 + _globals['_RECOVERRESPONSE_RECOVERRESULT']._serialized_end=13115 + _globals['_RECOVERCHANNELREQUEST']._serialized_start=13117 + _globals['_RECOVERCHANNELREQUEST']._serialized_end=13153 + _globals['_RECOVERCHANNELRESPONSE']._serialized_start=13155 + _globals['_RECOVERCHANNELRESPONSE']._serialized_end=13194 + _globals['_INVOICEREQUEST']._serialized_start=13197 + _globals['_INVOICEREQUEST']._serialized_end=13478 + _globals['_INVOICERESPONSE']._serialized_start=13481 + _globals['_INVOICERESPONSE']._serialized_end=13863 + _globals['_INVOICEREQUESTREQUEST']._serialized_start=13866 + _globals['_INVOICEREQUESTREQUEST']._serialized_end=14091 + _globals['_INVOICEREQUESTRESPONSE']._serialized_start=14094 + _globals['_INVOICEREQUESTRESPONSE']._serialized_end=14233 + _globals['_DISABLEINVOICEREQUESTREQUEST']._serialized_start=14235 + _globals['_DISABLEINVOICEREQUESTREQUEST']._serialized_end=14284 + _globals['_DISABLEINVOICEREQUESTRESPONSE']._serialized_start=14287 + _globals['_DISABLEINVOICEREQUESTRESPONSE']._serialized_end=14433 + _globals['_LISTINVOICEREQUESTSREQUEST']._serialized_start=14435 + _globals['_LISTINVOICEREQUESTSREQUEST']._serialized_end=14543 + _globals['_LISTINVOICEREQUESTSRESPONSE']._serialized_start=14545 + _globals['_LISTINVOICEREQUESTSRESPONSE']._serialized_end=14640 + _globals['_LISTINVOICEREQUESTSINVOICEREQUESTS']._serialized_start=14643 + _globals['_LISTINVOICEREQUESTSINVOICEREQUESTS']._serialized_end=14794 + _globals['_LISTDATASTOREREQUEST']._serialized_start=14796 + _globals['_LISTDATASTOREREQUEST']._serialized_end=14831 + _globals['_LISTDATASTORERESPONSE']._serialized_start=14833 + _globals['_LISTDATASTORERESPONSE']._serialized_end=14904 + _globals['_LISTDATASTOREDATASTORE']._serialized_start=14907 + _globals['_LISTDATASTOREDATASTORE']._serialized_end=15042 + _globals['_LISTINVOICESREQUEST']._serialized_start=15045 + _globals['_LISTINVOICESREQUEST']._serialized_end=15395 + _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_start=15266 + _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_end=15311 + _globals['_LISTINVOICESRESPONSE']._serialized_start=15397 + _globals['_LISTINVOICESRESPONSE']._serialized_end=15464 + _globals['_LISTINVOICESINVOICES']._serialized_start=15467 + _globals['_LISTINVOICESINVOICES']._serialized_end=16295 + _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_start=16029 + _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_end=16092 + _globals['_LISTINVOICESINVOICESPAIDOUTPOINT']._serialized_start=16297 + _globals['_LISTINVOICESINVOICESPAIDOUTPOINT']._serialized_end=16361 + _globals['_SENDONIONREQUEST']._serialized_start=16364 + _globals['_SENDONIONREQUEST']._serialized_end=16866 + _globals['_SENDONIONRESPONSE']._serialized_start=16869 + _globals['_SENDONIONRESPONSE']._serialized_end=17461 + _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_start=17291 + _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_end=17335 + _globals['_SENDONIONFIRSTHOP']._serialized_start=17463 + _globals['_SENDONIONFIRSTHOP']._serialized_end=17543 + _globals['_LISTSENDPAYSREQUEST']._serialized_start=17546 + _globals['_LISTSENDPAYSREQUEST']._serialized_end=17962 + _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_start=17787 + _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_end=17846 + _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSINDEX']._serialized_start=17848 + _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSINDEX']._serialized_end=17893 + _globals['_LISTSENDPAYSRESPONSE']._serialized_start=17964 + _globals['_LISTSENDPAYSRESPONSE']._serialized_end=18031 + _globals['_LISTSENDPAYSPAYMENTS']._serialized_start=18034 + _globals['_LISTSENDPAYSPAYMENTS']._serialized_end=18775 + _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_start=18546 + _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_end=18613 + _globals['_LISTTRANSACTIONSREQUEST']._serialized_start=18777 + _globals['_LISTTRANSACTIONSREQUEST']._serialized_end=18802 + _globals['_LISTTRANSACTIONSRESPONSE']._serialized_start=18804 + _globals['_LISTTRANSACTIONSRESPONSE']._serialized_end=18887 + _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_start=18890 + _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_end=19138 + _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_start=19140 + _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_end=19223 + _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_start=19225 + _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_end=19333 + _globals['_MAKESECRETREQUEST']._serialized_start=19335 + _globals['_MAKESECRETREQUEST']._serialized_end=19412 + _globals['_MAKESECRETRESPONSE']._serialized_start=19414 + _globals['_MAKESECRETRESPONSE']._serialized_end=19450 + _globals['_PAYREQUEST']._serialized_start=19453 + _globals['_PAYREQUEST']._serialized_end=19984 + _globals['_PAYRESPONSE']._serialized_start=19987 + _globals['_PAYRESPONSE']._serialized_end=20366 + _globals['_PAYRESPONSE_PAYSTATUS']._serialized_start=20269 + _globals['_PAYRESPONSE_PAYSTATUS']._serialized_end=20319 + _globals['_LISTNODESREQUEST']._serialized_start=20368 + _globals['_LISTNODESREQUEST']._serialized_end=20410 + _globals['_LISTNODESRESPONSE']._serialized_start=20412 + _globals['_LISTNODESRESPONSE']._serialized_end=20467 + _globals['_LISTNODESNODES']._serialized_start=20470 + _globals['_LISTNODESNODES']._serialized_end=20782 + _globals['_LISTNODESNODESOPTIONWILLFUND']._serialized_start=20785 + _globals['_LISTNODESNODESOPTIONWILLFUND']._serialized_end=21027 + _globals['_LISTNODESNODESADDRESSES']._serialized_start=21030 + _globals['_LISTNODESNODESADDRESSES']._serialized_end=21262 + _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_start=21170 + _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_end=21250 + _globals['_WAITANYINVOICEREQUEST']._serialized_start=21264 + _globals['_WAITANYINVOICEREQUEST']._serialized_end=21367 + _globals['_WAITANYINVOICERESPONSE']._serialized_start=21370 + _globals['_WAITANYINVOICERESPONSE']._serialized_end=22070 + _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_start=21863 + _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_end=21908 + _globals['_WAITANYINVOICEPAIDOUTPOINT']._serialized_start=22072 + _globals['_WAITANYINVOICEPAIDOUTPOINT']._serialized_end=22130 + _globals['_WAITINVOICEREQUEST']._serialized_start=22132 + _globals['_WAITINVOICEREQUEST']._serialized_end=22167 + _globals['_WAITINVOICERESPONSE']._serialized_start=22170 + _globals['_WAITINVOICERESPONSE']._serialized_end=22855 + _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_start=22651 + _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_end=22693 + _globals['_WAITINVOICEPAIDOUTPOINT']._serialized_start=22857 + _globals['_WAITINVOICEPAIDOUTPOINT']._serialized_end=22912 + _globals['_WAITSENDPAYREQUEST']._serialized_start=22915 + _globals['_WAITSENDPAYREQUEST']._serialized_end=23057 + _globals['_WAITSENDPAYRESPONSE']._serialized_start=23060 + _globals['_WAITSENDPAYRESPONSE']._serialized_end=23691 + _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_start=23515 + _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_end=23548 + _globals['_NEWADDRREQUEST']._serialized_start=23694 + _globals['_NEWADDRREQUEST']._serialized_end=23845 + _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_start=23778 + _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_end=23829 + _globals['_NEWADDRRESPONSE']._serialized_start=23847 + _globals['_NEWADDRRESPONSE']._serialized_end=23924 + _globals['_WITHDRAWREQUEST']._serialized_start=23927 + _globals['_WITHDRAWREQUEST']._serialized_end=24112 + _globals['_WITHDRAWRESPONSE']._serialized_start=24114 + _globals['_WITHDRAWRESPONSE']._serialized_end=24172 + _globals['_KEYSENDREQUEST']._serialized_start=24175 + _globals['_KEYSENDREQUEST']._serialized_end=24606 + _globals['_KEYSENDRESPONSE']._serialized_start=24609 + _globals['_KEYSENDRESPONSE']._serialized_end=24979 + _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_start=24903 + _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_end=24932 + _globals['_FUNDPSBTREQUEST']._serialized_start=24982 + _globals['_FUNDPSBTREQUEST']._serialized_end=25402 + _globals['_FUNDPSBTRESPONSE']._serialized_start=25405 + _globals['_FUNDPSBTRESPONSE']._serialized_end=25622 + _globals['_FUNDPSBTRESERVATIONS']._serialized_start=25624 + _globals['_FUNDPSBTRESERVATIONS']._serialized_end=25741 + _globals['_SENDPSBTREQUEST']._serialized_start=25743 + _globals['_SENDPSBTREQUEST']._serialized_end=25808 + _globals['_SENDPSBTRESPONSE']._serialized_start=25810 + _globals['_SENDPSBTRESPONSE']._serialized_end=25854 + _globals['_SIGNPSBTREQUEST']._serialized_start=25856 + _globals['_SIGNPSBTREQUEST']._serialized_end=25905 + _globals['_SIGNPSBTRESPONSE']._serialized_start=25907 + _globals['_SIGNPSBTRESPONSE']._serialized_end=25946 + _globals['_UTXOPSBTREQUEST']._serialized_start=25949 + _globals['_UTXOPSBTREQUEST']._serialized_end=26365 + _globals['_UTXOPSBTRESPONSE']._serialized_start=26368 + _globals['_UTXOPSBTRESPONSE']._serialized_end=26585 + _globals['_UTXOPSBTRESERVATIONS']._serialized_start=26587 + _globals['_UTXOPSBTRESERVATIONS']._serialized_end=26704 + _globals['_TXDISCARDREQUEST']._serialized_start=26706 + _globals['_TXDISCARDREQUEST']._serialized_end=26738 + _globals['_TXDISCARDRESPONSE']._serialized_start=26740 + _globals['_TXDISCARDRESPONSE']._serialized_end=26794 + _globals['_TXPREPAREREQUEST']._serialized_start=26797 + _globals['_TXPREPAREREQUEST']._serialized_end=26961 + _globals['_TXPREPARERESPONSE']._serialized_start=26963 + _globals['_TXPREPARERESPONSE']._serialized_end=27031 + _globals['_TXSENDREQUEST']._serialized_start=27033 + _globals['_TXSENDREQUEST']._serialized_end=27062 + _globals['_TXSENDRESPONSE']._serialized_start=27064 + _globals['_TXSENDRESPONSE']._serialized_end=27120 + _globals['_LISTPEERCHANNELSREQUEST']._serialized_start=27123 + _globals['_LISTPEERCHANNELSREQUEST']._serialized_end=27264 + _globals['_LISTPEERCHANNELSRESPONSE']._serialized_start=27266 + _globals['_LISTPEERCHANNELSRESPONSE']._serialized_end=27341 + _globals['_LISTPEERCHANNELSCHANNELS']._serialized_start=27344 + _globals['_LISTPEERCHANNELSCHANNELS']._serialized_end=30660 + _globals['_LISTPEERCHANNELSCHANNELSUPDATES']._serialized_start=30663 + _globals['_LISTPEERCHANNELSCHANNELSUPDATES']._serialized_end=30830 + _globals['_LISTPEERCHANNELSCHANNELSUPDATESLOCAL']._serialized_start=30833 + _globals['_LISTPEERCHANNELSCHANNELSUPDATESLOCAL']._serialized_end=31051 + _globals['_LISTPEERCHANNELSCHANNELSUPDATESREMOTE']._serialized_start=31054 + _globals['_LISTPEERCHANNELSCHANNELSUPDATESREMOTE']._serialized_end=31273 + _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_start=31275 + _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_end=31338 + _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_start=31341 + _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_end=31585 + _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_start=31588 + _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_end=31937 + _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_start=31939 + _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_end=32032 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_start=32035 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_end=32412 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_start=32326 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_end=32383 + _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_start=32414 + _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_end=32465 + _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_start=32467 + _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_end=32558 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_start=32561 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_end=33921 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSECAUSE']._serialized_start=33555 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSECAUSE']._serialized_end=33672 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_start=33923 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_end=34024 + _globals['_DECODEREQUEST']._serialized_start=34026 + _globals['_DECODEREQUEST']._serialized_end=34057 + _globals['_DECODERESPONSE']._serialized_start=34060 + _globals['_DECODERESPONSE']._serialized_end=39811 + _globals['_DECODERESPONSE_DECODETYPE']._serialized_start=37575 + _globals['_DECODERESPONSE_DECODETYPE']._serialized_end=37730 + _globals['_DECODEOFFERPATHS']._serialized_start=39814 + _globals['_DECODEOFFERPATHS']._serialized_end=40050 + _globals['_DECODEOFFERRECURRENCEPAYWINDOW']._serialized_start=40053 + _globals['_DECODEOFFERRECURRENCEPAYWINDOW']._serialized_end=40190 + _globals['_DECODEINVREQPATHS']._serialized_start=40193 + _globals['_DECODEINVREQPATHS']._serialized_end=40472 + _globals['_DECODEINVREQPATHSPATH']._serialized_start=40474 + _globals['_DECODEINVREQPATHSPATH']._serialized_end=40556 + _globals['_DECODEINVREQBIP353NAME']._serialized_start=40558 + _globals['_DECODEINVREQBIP353NAME']._serialized_end=40642 + _globals['_DECODEINVOICEPATHSPATH']._serialized_start=40644 + _globals['_DECODEINVOICEPATHSPATH']._serialized_end=40727 + _globals['_DECODEINVOICEFALLBACKS']._serialized_start=40729 + _globals['_DECODEINVOICEFALLBACKS']._serialized_end=40817 + _globals['_DECODEFALLBACKS']._serialized_start=40820 + _globals['_DECODEFALLBACKS']._serialized_end=41118 + _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_start=40988 + _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_end=41063 + _globals['_DECODEEXTRA']._serialized_start=41120 + _globals['_DECODEEXTRA']._serialized_end=41160 + _globals['_DECODEUNKNOWNPAYERPROOFTLVS']._serialized_start=41162 + _globals['_DECODEUNKNOWNPAYERPROOFTLVS']._serialized_end=41241 + _globals['_DECODERESTRICTIONS']._serialized_start=41243 + _globals['_DECODERESTRICTIONS']._serialized_end=41302 + _globals['_DELPAYREQUEST']._serialized_start=41305 + _globals['_DELPAYREQUEST']._serialized_end=41499 + _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_start=41436 + _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_end=41476 + _globals['_DELPAYRESPONSE']._serialized_start=41501 + _globals['_DELPAYRESPONSE']._serialized_end=41556 + _globals['_DELPAYPAYMENTS']._serialized_start=41559 + _globals['_DELPAYPAYMENTS']._serialized_end=42251 + _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_start=42032 + _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_end=42093 + _globals['_DELFORWARDREQUEST']._serialized_start=42254 + _globals['_DELFORWARDREQUEST']._serialized_end=42433 + _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_start=42372 + _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_end=42433 + _globals['_DELFORWARDRESPONSE']._serialized_start=42435 + _globals['_DELFORWARDRESPONSE']._serialized_end=42455 + _globals['_DISABLEOFFERREQUEST']._serialized_start=42457 + _globals['_DISABLEOFFERREQUEST']._serialized_end=42496 + _globals['_DISABLEOFFERRESPONSE']._serialized_start=42499 + _globals['_DISABLEOFFERRESPONSE']._serialized_end=42719 + _globals['_ENABLEOFFERREQUEST']._serialized_start=42721 + _globals['_ENABLEOFFERREQUEST']._serialized_end=42759 + _globals['_ENABLEOFFERRESPONSE']._serialized_start=42762 + _globals['_ENABLEOFFERRESPONSE']._serialized_end=42981 + _globals['_DISCONNECTREQUEST']._serialized_start=42983 + _globals['_DISCONNECTREQUEST']._serialized_end=43044 + _globals['_DISCONNECTRESPONSE']._serialized_start=43046 + _globals['_DISCONNECTRESPONSE']._serialized_end=43066 + _globals['_FEERATESREQUEST']._serialized_start=43068 + _globals['_FEERATESREQUEST']._serialized_end=43175 + _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_start=43138 + _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_end=43175 + _globals['_FEERATESRESPONSE']._serialized_start=43178 + _globals['_FEERATESRESPONSE']._serialized_end=43460 + _globals['_FEERATESPERKB']._serialized_start=43463 + _globals['_FEERATESPERKB']._serialized_end=43947 + _globals['_FEERATESPERKBESTIMATES']._serialized_start=43949 + _globals['_FEERATESPERKBESTIMATES']._serialized_end=44036 + _globals['_FEERATESPERKW']._serialized_start=44039 + _globals['_FEERATESPERKW']._serialized_end=44523 + _globals['_FEERATESPERKWESTIMATES']._serialized_start=44525 + _globals['_FEERATESPERKWESTIMATES']._serialized_end=44612 + _globals['_FEERATESONCHAINFEEESTIMATES']._serialized_start=44615 + _globals['_FEERATESONCHAINFEEESTIMATES']._serialized_end=44896 + _globals['_FETCHBIP353REQUEST']._serialized_start=44898 + _globals['_FETCHBIP353REQUEST']._serialized_end=44935 + _globals['_FETCHBIP353RESPONSE']._serialized_start=44937 + _globals['_FETCHBIP353RESPONSE']._serialized_end=45025 + _globals['_FETCHBIP353INSTRUCTIONS']._serialized_start=45028 + _globals['_FETCHBIP353INSTRUCTIONS']._serialized_end=45275 + _globals['_FETCHINVOICEREQUEST']._serialized_start=45278 + _globals['_FETCHINVOICEREQUEST']._serialized_end=45719 + _globals['_FETCHINVOICERESPONSE']._serialized_start=45722 + _globals['_FETCHINVOICERESPONSE']._serialized_end=45875 + _globals['_FETCHINVOICECHANGES']._serialized_start=45878 + _globals['_FETCHINVOICECHANGES']._serialized_end=46136 + _globals['_FETCHINVOICENEXTPERIOD']._serialized_start=46138 + _globals['_FETCHINVOICENEXTPERIOD']._serialized_end=46263 + _globals['_CANCELRECURRINGINVOICEREQUEST']._serialized_start=46266 + _globals['_CANCELRECURRINGINVOICEREQUEST']._serialized_end=46490 + _globals['_CANCELRECURRINGINVOICERESPONSE']._serialized_start=46492 + _globals['_CANCELRECURRINGINVOICERESPONSE']._serialized_end=46540 + _globals['_FUNDCHANNELCANCELREQUEST']._serialized_start=46542 + _globals['_FUNDCHANNELCANCELREQUEST']._serialized_end=46580 + _globals['_FUNDCHANNELCANCELRESPONSE']._serialized_start=46582 + _globals['_FUNDCHANNELCANCELRESPONSE']._serialized_end=46628 + _globals['_FUNDCHANNELCOMPLETEREQUEST']._serialized_start=46630 + _globals['_FUNDCHANNELCOMPLETEREQUEST']._serialized_end=46720 + _globals['_FUNDCHANNELCOMPLETERESPONSE']._serialized_start=46722 + _globals['_FUNDCHANNELCOMPLETERESPONSE']._serialized_end=46800 + _globals['_FUNDCHANNELREQUEST']._serialized_start=46803 + _globals['_FUNDCHANNELREQUEST']._serialized_end=47310 + _globals['_FUNDCHANNELRESPONSE']._serialized_start=47313 + _globals['_FUNDCHANNELRESPONSE']._serialized_end=47519 + _globals['_FUNDCHANNELCHANNELTYPE']._serialized_start=47521 + _globals['_FUNDCHANNELCHANNELTYPE']._serialized_end=47596 + _globals['_FUNDCHANNELSTARTREQUEST']._serialized_start=47599 + _globals['_FUNDCHANNELSTARTREQUEST']._serialized_end=47941 + _globals['_FUNDCHANNELSTARTRESPONSE']._serialized_start=47944 + _globals['_FUNDCHANNELSTARTRESPONSE']._serialized_end=48190 + _globals['_FUNDCHANNELSTARTCHANNELTYPE']._serialized_start=48192 + _globals['_FUNDCHANNELSTARTCHANNELTYPE']._serialized_end=48272 + _globals['_GETLOGREQUEST']._serialized_start=48275 + _globals['_GETLOGREQUEST']._serialized_end=48432 + _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_start=48344 + _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_end=48422 + _globals['_GETLOGRESPONSE']._serialized_start=48434 + _globals['_GETLOGRESPONSE']._serialized_end=48538 + _globals['_GETLOGLOG']._serialized_start=48541 + _globals['_GETLOGLOG']._serialized_end=48901 + _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_start=48728 + _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_end=48836 + _globals['_FUNDERUPDATEREQUEST']._serialized_start=48904 + _globals['_FUNDERUPDATEREQUEST']._serialized_end=50017 + _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_start=49598 + _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_end=49655 + _globals['_FUNDERUPDATERESPONSE']._serialized_start=50020 + _globals['_FUNDERUPDATERESPONSE']._serialized_end=50883 + _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_start=49598 + _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_end=49655 + _globals['_GETROUTEREQUEST']._serialized_start=50886 + _globals['_GETROUTEREQUEST']._serialized_end=51122 + _globals['_GETROUTERESPONSE']._serialized_start=51124 + _globals['_GETROUTERESPONSE']._serialized_end=51177 + _globals['_GETROUTEROUTE']._serialized_start=51180 + _globals['_GETROUTEROUTE']._serialized_end=51377 + _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_start=51348 + _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_end=51377 + _globals['_LISTADDRESSESREQUEST']._serialized_start=51379 + _globals['_LISTADDRESSESREQUEST']._serialized_end=51495 + _globals['_LISTADDRESSESRESPONSE']._serialized_start=51497 + _globals['_LISTADDRESSESRESPONSE']._serialized_end=51568 + _globals['_LISTADDRESSESADDRESSES']._serialized_start=51570 + _globals['_LISTADDRESSESADDRESSES']._serialized_end=51670 + _globals['_LISTFORWARDSREQUEST']._serialized_start=51673 + _globals['_LISTFORWARDSREQUEST']._serialized_end=52112 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_start=51917 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_end=51993 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_start=51995 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_end=52040 + _globals['_LISTFORWARDSRESPONSE']._serialized_start=52114 + _globals['_LISTFORWARDSRESPONSE']._serialized_end=52181 + _globals['_LISTFORWARDSFORWARDS']._serialized_start=52184 + _globals['_LISTFORWARDSFORWARDS']._serialized_end=52981 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_start=52700 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_end=52784 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_start=52786 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_end=52834 + _globals['_LISTOFFERSREQUEST']._serialized_start=52983 + _globals['_LISTOFFERSREQUEST']._serialized_end=53080 + _globals['_LISTOFFERSRESPONSE']._serialized_start=53082 + _globals['_LISTOFFERSRESPONSE']._serialized_end=53141 + _globals['_LISTOFFERSOFFERS']._serialized_start=53144 + _globals['_LISTOFFERSOFFERS']._serialized_end=53360 + _globals['_LISTPAYSREQUEST']._serialized_start=53363 + _globals['_LISTPAYSREQUEST']._serialized_end=53751 + _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_start=53584 + _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_end=53639 + _globals['_LISTPAYSREQUEST_LISTPAYSINDEX']._serialized_start=53641 + _globals['_LISTPAYSREQUEST_LISTPAYSINDEX']._serialized_end=53682 + _globals['_LISTPAYSRESPONSE']._serialized_start=53753 + _globals['_LISTPAYSRESPONSE']._serialized_end=53804 + _globals['_LISTPAYSPAYS']._serialized_start=53807 + _globals['_LISTPAYSPAYS']._serialized_end=54538 + _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_start=54277 + _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_end=54336 + _globals['_LISTHTLCSREQUEST']._serialized_start=54541 + _globals['_LISTHTLCSREQUEST']._serialized_end=54755 + _globals['_LISTHTLCSREQUEST_LISTHTLCSINDEX']._serialized_start=54676 + _globals['_LISTHTLCSREQUEST_LISTHTLCSINDEX']._serialized_end=54718 + _globals['_LISTHTLCSRESPONSE']._serialized_start=54757 + _globals['_LISTHTLCSRESPONSE']._serialized_end=54812 + _globals['_LISTHTLCSHTLCS']._serialized_start=54815 + _globals['_LISTHTLCSHTLCS']._serialized_end=55172 + _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_start=55094 + _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_end=55136 + _globals['_MULTIFUNDCHANNELREQUEST']._serialized_start=55175 + _globals['_MULTIFUNDCHANNELREQUEST']._serialized_end=55481 + _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_start=55484 + _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_end=55635 + _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_start=55638 + _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_end=56021 + _globals['_MULTIFUNDCHANNELCHANNELIDS']._serialized_start=56024 + _globals['_MULTIFUNDCHANNELCHANNELIDS']._serialized_end=56202 + _globals['_MULTIFUNDCHANNELCHANNELIDSCHANNELTYPE']._serialized_start=56204 + _globals['_MULTIFUNDCHANNELCHANNELIDSCHANNELTYPE']._serialized_end=56294 + _globals['_MULTIFUNDCHANNELFAILED']._serialized_start=56297 + _globals['_MULTIFUNDCHANNELFAILED']._serialized_end=56572 + _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_start=56458 + _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_end=56572 + _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_start=56574 + _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_end=56634 + _globals['_MULTIWITHDRAWREQUEST']._serialized_start=56637 + _globals['_MULTIWITHDRAWREQUEST']._serialized_end=56805 + _globals['_MULTIWITHDRAWRESPONSE']._serialized_start=56807 + _globals['_MULTIWITHDRAWRESPONSE']._serialized_end=56856 + _globals['_OFFERREQUEST']._serialized_start=56859 + _globals['_OFFERREQUEST']._serialized_end=57469 + _globals['_OFFERRESPONSE']._serialized_start=57472 + _globals['_OFFERRESPONSE']._serialized_end=57660 + _globals['_OPENCHANNELABORTREQUEST']._serialized_start=57662 + _globals['_OPENCHANNELABORTREQUEST']._serialized_end=57707 + _globals['_OPENCHANNELABORTRESPONSE']._serialized_start=57709 + _globals['_OPENCHANNELABORTRESPONSE']._serialized_end=57797 + _globals['_OPENCHANNELBUMPREQUEST']._serialized_start=57800 + _globals['_OPENCHANNELBUMPREQUEST']._serialized_end=57958 + _globals['_OPENCHANNELBUMPRESPONSE']._serialized_start=57961 + _globals['_OPENCHANNELBUMPRESPONSE']._serialized_end=58198 + _globals['_OPENCHANNELBUMPCHANNELTYPE']._serialized_start=58200 + _globals['_OPENCHANNELBUMPCHANNELTYPE']._serialized_end=58279 + _globals['_OPENCHANNELINITREQUEST']._serialized_start=58282 + _globals['_OPENCHANNELINITREQUEST']._serialized_end=58697 + _globals['_OPENCHANNELINITRESPONSE']._serialized_start=58700 + _globals['_OPENCHANNELINITRESPONSE']._serialized_end=58937 + _globals['_OPENCHANNELINITCHANNELTYPE']._serialized_start=58939 + _globals['_OPENCHANNELINITCHANNELTYPE']._serialized_end=59018 + _globals['_OPENCHANNELSIGNEDREQUEST']._serialized_start=59020 + _globals['_OPENCHANNELSIGNEDREQUEST']._serialized_end=59087 + _globals['_OPENCHANNELSIGNEDRESPONSE']._serialized_start=59089 + _globals['_OPENCHANNELSIGNEDRESPONSE']._serialized_end=59162 + _globals['_OPENCHANNELUPDATEREQUEST']._serialized_start=59164 + _globals['_OPENCHANNELUPDATEREQUEST']._serialized_end=59224 + _globals['_OPENCHANNELUPDATERESPONSE']._serialized_start=59227 + _globals['_OPENCHANNELUPDATERESPONSE']._serialized_end=59504 + _globals['_OPENCHANNELUPDATECHANNELTYPE']._serialized_start=59506 + _globals['_OPENCHANNELUPDATECHANNELTYPE']._serialized_end=59587 + _globals['_PINGREQUEST']._serialized_start=59589 + _globals['_PINGREQUEST']._serialized_end=59678 + _globals['_PINGRESPONSE']._serialized_start=59680 + _globals['_PINGRESPONSE']._serialized_end=59710 + _globals['_PLUGINREQUEST']._serialized_start=59713 + _globals['_PLUGINREQUEST']._serialized_end=59858 + _globals['_PLUGINRESPONSE']._serialized_start=59860 + _globals['_PLUGINRESPONSE']._serialized_end=59985 + _globals['_PLUGINPLUGINS']._serialized_start=59987 + _globals['_PLUGINPLUGINS']._serialized_end=60049 + _globals['_RENEPAYSTATUSREQUEST']._serialized_start=60051 + _globals['_RENEPAYSTATUSREQUEST']._serialized_end=60111 + _globals['_RENEPAYSTATUSRESPONSE']._serialized_start=60113 + _globals['_RENEPAYSTATUSRESPONSE']._serialized_end=60184 + _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_start=60187 + _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_end=60669 + _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_start=60532 + _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_end=60601 + _globals['_RENEPAYREQUEST']._serialized_start=60672 + _globals['_RENEPAYREQUEST']._serialized_end=61018 + _globals['_RENEPAYRESPONSE']._serialized_start=61021 + _globals['_RENEPAYRESPONSE']._serialized_end=61442 + _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_start=61338 + _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_end=61392 + _globals['_RESERVEINPUTSREQUEST']._serialized_start=61444 + _globals['_RESERVEINPUTSREQUEST']._serialized_end=61552 + _globals['_RESERVEINPUTSRESPONSE']._serialized_start=61554 + _globals['_RESERVEINPUTSRESPONSE']._serialized_end=61631 + _globals['_RESERVEINPUTSRESERVATIONS']._serialized_start=61633 + _globals['_RESERVEINPUTSRESERVATIONS']._serialized_end=61755 + _globals['_SENDCUSTOMMSGREQUEST']._serialized_start=61757 + _globals['_SENDCUSTOMMSGREQUEST']._serialized_end=61809 + _globals['_SENDCUSTOMMSGRESPONSE']._serialized_start=61811 + _globals['_SENDCUSTOMMSGRESPONSE']._serialized_end=61850 + _globals['_SENDINVOICEREQUEST']._serialized_start=61853 + _globals['_SENDINVOICEREQUEST']._serialized_end=62029 + _globals['_SENDINVOICERESPONSE']._serialized_start=62032 + _globals['_SENDINVOICERESPONSE']._serialized_end=62600 + _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_start=62429 + _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_end=62483 + _globals['_SETCHANNELREQUEST']._serialized_start=62603 + _globals['_SETCHANNELREQUEST']._serialized_end=62901 + _globals['_SETCHANNELRESPONSE']._serialized_start=62903 + _globals['_SETCHANNELRESPONSE']._serialized_end=62966 + _globals['_SETCHANNELCHANNELS']._serialized_start=62969 + _globals['_SETCHANNELCHANNELS']._serialized_end=63400 + _globals['_SETCONFIGREQUEST']._serialized_start=63402 + _globals['_SETCONFIGREQUEST']._serialized_end=63500 + _globals['_SETCONFIGRESPONSE']._serialized_start=63502 + _globals['_SETCONFIGRESPONSE']._serialized_end=63559 + _globals['_SETCONFIGCONFIG']._serialized_start=63562 + _globals['_SETCONFIGCONFIG']._serialized_end=63855 + _globals['_SETPSBTVERSIONREQUEST']._serialized_start=63857 + _globals['_SETPSBTVERSIONREQUEST']._serialized_end=63911 + _globals['_SETPSBTVERSIONRESPONSE']._serialized_start=63913 + _globals['_SETPSBTVERSIONRESPONSE']._serialized_end=63951 + _globals['_SIGNINVOICEREQUEST']._serialized_start=63953 + _globals['_SIGNINVOICEREQUEST']._serialized_end=63992 + _globals['_SIGNINVOICERESPONSE']._serialized_start=63994 + _globals['_SIGNINVOICERESPONSE']._serialized_end=64031 + _globals['_SIGNMESSAGEREQUEST']._serialized_start=64033 + _globals['_SIGNMESSAGEREQUEST']._serialized_end=64070 + _globals['_SIGNMESSAGERESPONSE']._serialized_start=64072 + _globals['_SIGNMESSAGERESPONSE']._serialized_end=64142 + _globals['_SPLICEINITREQUEST']._serialized_start=64145 + _globals['_SPLICEINITREQUEST']._serialized_end=64345 + _globals['_SPLICEINITRESPONSE']._serialized_start=64347 + _globals['_SPLICEINITRESPONSE']._serialized_end=64381 + _globals['_SPLICESIGNEDREQUEST']._serialized_start=64383 + _globals['_SPLICESIGNEDREQUEST']._serialized_end=64478 + _globals['_SPLICESIGNEDRESPONSE']._serialized_start=64480 + _globals['_SPLICESIGNEDRESPONSE']._serialized_end=64574 + _globals['_SPLICEUPDATEREQUEST']._serialized_start=64576 + _globals['_SPLICEUPDATEREQUEST']._serialized_end=64631 + _globals['_SPLICEUPDATERESPONSE']._serialized_start=64633 + _globals['_SPLICEUPDATERESPONSE']._serialized_end=64754 + _globals['_SPLICEINREQUEST']._serialized_start=64756 + _globals['_SPLICEINREQUEST']._serialized_end=64806 + _globals['_SPLICEINRESPONSE']._serialized_start=64808 + _globals['_SPLICEINRESPONSE']._serialized_end=64906 + _globals['_SPLICEOUTREQUEST']._serialized_start=64909 + _globals['_SPLICEOUTREQUEST']._serialized_end=65048 + _globals['_SPLICEOUTRESPONSE']._serialized_start=65050 + _globals['_SPLICEOUTRESPONSE']._serialized_end=65149 + _globals['_DEVSPLICEREQUEST']._serialized_start=65152 + _globals['_DEVSPLICEREQUEST']._serialized_end=65350 + _globals['_DEVSPLICERESPONSE']._serialized_start=65353 + _globals['_DEVSPLICERESPONSE']._serialized_end=65481 + _globals['_UNRESERVEINPUTSREQUEST']._serialized_start=65483 + _globals['_UNRESERVEINPUTSREQUEST']._serialized_end=65555 + _globals['_UNRESERVEINPUTSRESPONSE']._serialized_start=65557 + _globals['_UNRESERVEINPUTSRESPONSE']._serialized_end=65638 + _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_start=65641 + _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_end=65792 + _globals['_UPGRADEWALLETREQUEST']._serialized_start=65794 + _globals['_UPGRADEWALLETREQUEST']._serialized_end=65904 + _globals['_UPGRADEWALLETRESPONSE']._serialized_start=65906 + _globals['_UPGRADEWALLETRESPONSE']._serialized_end=66032 + _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_start=66034 + _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_end=66113 + _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_start=66115 + _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_end=66161 + _globals['_WAITREQUEST']._serialized_start=66164 + _globals['_WAITREQUEST']._serialized_end=66477 + _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_start=66300 + _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_end=66421 + _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_start=66423 + _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_end=66477 + _globals['_WAITRESPONSE']._serialized_start=66480 + _globals['_WAITRESPONSE']._serialized_end=67232 + _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_start=66300 + _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_end=66421 + _globals['_WAITFORWARDS']._serialized_start=67235 + _globals['_WAITFORWARDS']._serialized_end=67566 + _globals['_WAITFORWARDS_WAITFORWARDSSTATUS']._serialized_start=67421 + _globals['_WAITFORWARDS_WAITFORWARDSSTATUS']._serialized_end=67497 + _globals['_WAITINVOICES']._serialized_start=67569 + _globals['_WAITINVOICES']._serialized_end=67846 + _globals['_WAITINVOICES_WAITINVOICESSTATUS']._serialized_start=67732 + _globals['_WAITINVOICES_WAITINVOICESSTATUS']._serialized_end=67787 + _globals['_WAITSENDPAYS']._serialized_start=67849 + _globals['_WAITSENDPAYS']._serialized_end=68104 + _globals['_WAITSENDPAYS_WAITSENDPAYSSTATUS']._serialized_start=67994 + _globals['_WAITSENDPAYS_WAITSENDPAYSSTATUS']._serialized_end=68053 + _globals['_WAITHTLCS']._serialized_start=68107 + _globals['_WAITHTLCS']._serialized_end=68503 + _globals['_WAITHTLCS_WAITHTLCSDIRECTION']._serialized_start=68360 + _globals['_WAITHTLCS_WAITHTLCSDIRECTION']._serialized_end=68397 + _globals['_WAITCHAINMOVES']._serialized_start=68505 + _globals['_WAITCHAINMOVES']._serialized_end=68605 + _globals['_WAITCHANNELMOVES']._serialized_start=68607 + _globals['_WAITCHANNELMOVES']._serialized_end=68709 + _globals['_WAITNETWORKEVENTS']._serialized_start=68712 + _globals['_WAITNETWORKEVENTS']._serialized_end=68977 + _globals['_WAITNETWORKEVENTS_WAITNETWORKEVENTSTYPE']._serialized_start=68853 + _globals['_WAITNETWORKEVENTS_WAITNETWORKEVENTSTYPE']._serialized_end=68933 + _globals['_WAITDETAILS']._serialized_start=68980 + _globals['_WAITDETAILS']._serialized_end=69616 + _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_start=69322 + _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_end=69459 + _globals['_LISTCONFIGSREQUEST']._serialized_start=69618 + _globals['_LISTCONFIGSREQUEST']._serialized_end=69670 + _globals['_LISTCONFIGSRESPONSE']._serialized_start=69672 + _globals['_LISTCONFIGSRESPONSE']._serialized_end=69752 + _globals['_LISTCONFIGSCONFIGS']._serialized_start=69755 + _globals['_LISTCONFIGSCONFIGS']._serialized_end=75984 + _globals['_LISTCONFIGSCONFIGSCONF']._serialized_start=75987 + _globals['_LISTCONFIGSCONFIGSCONF']._serialized_end=76149 + _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_start=76106 + _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_end=76149 + _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_start=76151 + _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_end=76209 + _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_start=76211 + _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_end=76272 + _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_start=76274 + _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_end=76365 + _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_start=76367 + _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_end=76423 + _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_start=76425 + _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_end=76481 + _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_start=76483 + _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_end=76538 + _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_start=76540 + _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_end=76596 + _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_start=76598 + _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_end=76670 + _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_start=76672 + _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_end=76735 + _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_start=76737 + _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_end=76803 + _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_start=76805 + _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_end=76872 + _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_start=76874 + _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_end=76936 + _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_start=76938 + _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_end=77013 + _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_start=77015 + _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_end=77077 + _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_start=77079 + _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_end=77149 + _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_start=77151 + _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_end=77221 + _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_start=77223 + _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_end=77278 + _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_start=77280 + _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_end=77341 + _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_start=77343 + _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_end=77405 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_start=77407 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_end=77476 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_start=77478 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_end=77547 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_start=77549 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_end=77623 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_start=77625 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_end=77692 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_start=77694 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_end=77775 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_start=77777 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_end=77849 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_start=77851 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_end=77919 + _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_start=77921 + _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_end=77992 + _globals['_LISTCONFIGSCONFIGSRGB']._serialized_start=77994 + _globals['_LISTCONFIGSCONFIGSRGB']._serialized_end=78052 + _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_start=78054 + _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_end=78114 + _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_start=78116 + _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_end=78178 + _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_start=78180 + _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_end=78251 + _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_start=78253 + _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_end=78323 + _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_start=78325 + _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_end=78397 + _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_start=78399 + _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_end=78469 + _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_start=78471 + _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_end=78535 + _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_start=78537 + _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_end=78601 + _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_start=78603 + _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_end=78668 + _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_start=78670 + _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_end=78732 + _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_start=78734 + _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_end=78795 + _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_start=78797 + _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_end=78865 + _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_start=78867 + _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_end=78940 + _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_start=78942 + _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_end=79026 + _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_start=79028 + _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_end=79112 + _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_start=79114 + _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_end=79206 + _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_start=79208 + _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_end=79311 + _globals['_LISTCONFIGSCONFIGSADDR']._serialized_start=79313 + _globals['_LISTCONFIGSCONFIGSADDR']._serialized_end=79374 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_start=79376 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_end=79445 + _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_start=79447 + _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_end=79512 + _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_start=79514 + _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_end=79570 + _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_start=79572 + _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_end=79638 + _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_start=79640 + _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_end=79700 + _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_start=79702 + _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_end=79761 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_start=79764 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_end=80020 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_start=79939 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_end=80020 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_start=80022 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_end=80103 + _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_start=80105 + _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_end=80166 + _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_start=80168 + _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_end=80234 + _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_start=80236 + _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_end=80299 + _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_start=80301 + _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_end=80365 + _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_start=80367 + _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_end=80431 + _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_start=80433 + _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_end=80502 + _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_start=80504 + _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_end=80572 + _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_start=80574 + _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_end=80640 + _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_start=80642 + _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_end=80744 + _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_start=80746 + _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_end=80819 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_start=80821 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_end=80892 + _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_start=80894 + _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_end=80972 + _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_start=80974 + _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_end=81038 + _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_start=81040 + _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_end=81114 + _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_start=81116 + _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_end=81193 + _globals['_LISTCONFIGSCONFIGSCURRENCYRATEADDSOURCE']._serialized_start=81195 + _globals['_LISTCONFIGSCONFIGSCURRENCYRATEADDSOURCE']._serialized_end=81305 + _globals['_LISTCONFIGSCONFIGSCURRENCYRATEDISABLESOURCE']._serialized_start=81307 + _globals['_LISTCONFIGSCONFIGSCURRENCYRATEDISABLESOURCE']._serialized_end=81421 + _globals['_STOPREQUEST']._serialized_start=81423 + _globals['_STOPREQUEST']._serialized_end=81436 + _globals['_STOPRESPONSE']._serialized_start=81438 + _globals['_STOPRESPONSE']._serialized_end=81535 + _globals['_STOPRESPONSE_STOPRESULT']._serialized_start=81500 + _globals['_STOPRESPONSE_STOPRESULT']._serialized_end=81535 + _globals['_HELPREQUEST']._serialized_start=81537 + _globals['_HELPREQUEST']._serialized_end=81584 + _globals['_HELPRESPONSE']._serialized_start=81587 + _globals['_HELPRESPONSE']._serialized_end=81736 + _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_start=81692 + _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_end=81720 + _globals['_HELPHELP']._serialized_start=81738 + _globals['_HELPHELP']._serialized_end=81765 + _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_start=81767 + _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_end=81870 + _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_start=81872 + _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_end=81899 + _globals['_PREAPPROVEINVOICEREQUEST']._serialized_start=81901 + _globals['_PREAPPROVEINVOICEREQUEST']._serialized_end=81943 + _globals['_PREAPPROVEINVOICERESPONSE']._serialized_start=81945 + _globals['_PREAPPROVEINVOICERESPONSE']._serialized_end=81972 + _globals['_STATICBACKUPREQUEST']._serialized_start=81974 + _globals['_STATICBACKUPREQUEST']._serialized_end=81995 + _globals['_STATICBACKUPRESPONSE']._serialized_start=81997 + _globals['_STATICBACKUPRESPONSE']._serialized_end=82032 + _globals['_BKPRCHANNELSAPYREQUEST']._serialized_start=82034 + _globals['_BKPRCHANNELSAPYREQUEST']._serialized_end=82134 + _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_start=82136 + _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_end=82216 + _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_start=82219 + _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_end=83108 + _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_start=83111 + _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_end=83321 + _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_start=83324 + _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_end=83536 + _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_start=83450 + _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_end=83536 + _globals['_BKPRINSPECTREQUEST']._serialized_start=83538 + _globals['_BKPRINSPECTREQUEST']._serialized_end=83575 + _globals['_BKPRINSPECTRESPONSE']._serialized_start=83577 + _globals['_BKPRINSPECTRESPONSE']._serialized_end=83632 + _globals['_BKPRINSPECTTXS']._serialized_start=83635 + _globals['_BKPRINSPECTTXS']._serialized_end=83789 + _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_start=83792 + _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_end=84236 + _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_start=84238 + _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_end=84342 + _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_start=84344 + _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_end=84425 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_start=84428 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_end=85145 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_start=84931 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_end=85005 + _globals['_BKPRLISTBALANCESREQUEST']._serialized_start=85147 + _globals['_BKPRLISTBALANCESREQUEST']._serialized_end=85172 + _globals['_BKPRLISTBALANCESRESPONSE']._serialized_start=85174 + _globals['_BKPRLISTBALANCESRESPONSE']._serialized_end=85249 + _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_start=85252 + _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_end=85578 + _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_start=85580 + _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_end=85668 + _globals['_BKPRLISTINCOMEREQUEST']._serialized_start=85671 + _globals['_BKPRLISTINCOMEREQUEST']._serialized_end=85822 + _globals['_BKPRLISTINCOMERESPONSE']._serialized_start=85824 + _globals['_BKPRLISTINCOMERESPONSE']._serialized_end=85904 + _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_start=85907 + _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_end=86215 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_start=86217 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_end=86297 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_start=86299 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_end=86400 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_start=86403 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_end=87078 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_start=86904 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_end=86971 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_start=87080 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_end=87157 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_start=87159 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_end=87258 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_start=87261 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_end=87932 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_start=87759 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_end=87825 + _globals['_BKPRREPORTREQUEST']._serialized_start=87935 + _globals['_BKPRREPORTREQUEST']._serialized_end=88111 + _globals['_BKPRREPORTRESPONSE']._serialized_start=88113 + _globals['_BKPRREPORTRESPONSE']._serialized_end=88149 + _globals['_BLACKLISTRUNEREQUEST']._serialized_start=88151 + _globals['_BLACKLISTRUNEREQUEST']._serialized_end=88261 + _globals['_BLACKLISTRUNERESPONSE']._serialized_start=88263 + _globals['_BLACKLISTRUNERESPONSE']._serialized_end=88334 + _globals['_BLACKLISTRUNEBLACKLIST']._serialized_start=88336 + _globals['_BLACKLISTRUNEBLACKLIST']._serialized_end=88388 + _globals['_CHECKRUNEREQUEST']._serialized_start=88390 + _globals['_CHECKRUNEREQUEST']._serialized_end=88502 + _globals['_CHECKRUNERESPONSE']._serialized_start=88504 + _globals['_CHECKRUNERESPONSE']._serialized_end=88538 + _globals['_CREATERUNEREQUEST']._serialized_start=88540 + _globals['_CREATERUNEREQUEST']._serialized_end=88609 + _globals['_CREATERUNERESPONSE']._serialized_start=88611 + _globals['_CREATERUNERESPONSE']._serialized_end=88734 + _globals['_SHOWRUNESREQUEST']._serialized_start=88736 + _globals['_SHOWRUNESREQUEST']._serialized_end=88782 + _globals['_SHOWRUNESRESPONSE']._serialized_start=88784 + _globals['_SHOWRUNESRESPONSE']._serialized_end=88839 + _globals['_SHOWRUNESRUNES']._serialized_start=88842 + _globals['_SHOWRUNESRUNES']._serialized_end=89127 + _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_start=89129 + _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_end=89241 + _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_start=89243 + _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_end=89353 + _globals['_ASKRENEUNRESERVEREQUEST']._serialized_start=89355 + _globals['_ASKRENEUNRESERVEREQUEST']._serialized_end=89469 + _globals['_ASKRENEUNRESERVERESPONSE']._serialized_start=89471 + _globals['_ASKRENEUNRESERVERESPONSE']._serialized_end=89497 + _globals['_ASKRENEUNRESERVEPATH']._serialized_start=89499 + _globals['_ASKRENEUNRESERVEPATH']._serialized_end=89615 + _globals['_ASKRENELISTLAYERSREQUEST']._serialized_start=89617 + _globals['_ASKRENELISTLAYERSREQUEST']._serialized_end=89673 + _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_start=89675 + _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_end=89748 + _globals['_ASKRENELISTLAYERSLAYERS']._serialized_start=89751 + _globals['_ASKRENELISTLAYERSLAYERS']._serialized_end=90177 + _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_start=90180 + _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_end=90319 + _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_start=90322 + _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_end=90746 + _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_start=90749 + _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_end=90967 + _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_start=90970 + _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_end=91125 + _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_start=91128 + _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_end=91273 + _globals['_ASKRENECREATELAYERREQUEST']._serialized_start=91275 + _globals['_ASKRENECREATELAYERREQUEST']._serialized_end=91357 + _globals['_ASKRENECREATELAYERRESPONSE']._serialized_start=91359 + _globals['_ASKRENECREATELAYERRESPONSE']._serialized_end=91434 + _globals['_ASKRENECREATELAYERLAYERS']._serialized_start=91437 + _globals['_ASKRENECREATELAYERLAYERS']._serialized_end=91869 + _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_start=91872 + _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_end=92012 + _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_start=92015 + _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_end=92352 + _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_start=92355 + _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_end=92551 + _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_start=92554 + _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_end=92710 + _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_start=92713 + _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_end=92859 + _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_start=92861 + _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_end=92903 + _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_start=92905 + _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_end=92933 + _globals['_ASKRENERESERVEREQUEST']._serialized_start=92935 + _globals['_ASKRENERESERVEREQUEST']._serialized_end=92997 + _globals['_ASKRENERESERVERESPONSE']._serialized_start=92999 + _globals['_ASKRENERESERVERESPONSE']._serialized_end=93023 + _globals['_ASKRENERESERVEPATH']._serialized_start=93025 + _globals['_ASKRENERESERVEPATH']._serialized_end=93139 + _globals['_ASKRENEAGEREQUEST']._serialized_start=93141 + _globals['_ASKRENEAGEREQUEST']._serialized_end=93191 + _globals['_ASKRENEAGERESPONSE']._serialized_start=93193 + _globals['_ASKRENEAGERESPONSE']._serialized_end=93249 + _globals['_GETROUTESREQUEST']._serialized_start=93252 + _globals['_GETROUTESREQUEST']._serialized_end=93483 + _globals['_GETROUTESRESPONSE']._serialized_start=93485 + _globals['_GETROUTESRESPONSE']._serialized_end=93567 + _globals['_GETROUTESROUTES']._serialized_start=93570 + _globals['_GETROUTESROUTES']._serialized_end=93706 + _globals['_GETROUTESROUTESPATH']._serialized_start=93709 + _globals['_GETROUTESROUTESPATH']._serialized_end=94165 + _globals['_ASKRENEDISABLENODEREQUEST']._serialized_start=94167 + _globals['_ASKRENEDISABLENODEREQUEST']._serialized_end=94223 + _globals['_ASKRENEDISABLENODERESPONSE']._serialized_start=94225 + _globals['_ASKRENEDISABLENODERESPONSE']._serialized_end=94253 + _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_start=94256 + _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_end=94522 + _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_start=94443 + _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_end=94522 + _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_start=94524 + _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_end=94613 + _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_start=94616 + _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_end=94827 + _globals['_ASKRENECREATECHANNELREQUEST']._serialized_start=94830 + _globals['_ASKRENECREATECHANNELREQUEST']._serialized_end=94973 + _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_start=94975 + _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_end=95005 + _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_start=95008 + _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_end=95437 + _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_start=95439 + _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_end=95469 + _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_start=95472 + _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_end=95636 + _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_start=95638 + _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_end=95713 + _globals['_ASKRENEBIASCHANNELBIASES']._serialized_start=95716 + _globals['_ASKRENEBIASCHANNELBIASES']._serialized_end=95881 + _globals['_ASKRENEBIASNODEREQUEST']._serialized_start=95884 + _globals['_ASKRENEBIASNODEREQUEST']._serialized_end=96048 + _globals['_ASKRENEBIASNODERESPONSE']._serialized_start=96050 + _globals['_ASKRENEBIASNODERESPONSE']._serialized_end=96128 + _globals['_ASKRENEBIASNODENODEBIASES']._serialized_start=96131 + _globals['_ASKRENEBIASNODENODEBIASES']._serialized_end=96283 + _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_start=96285 + _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_end=96317 + _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_start=96319 + _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_end=96416 + _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_start=96419 + _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_end=96564 + _globals['_INJECTPAYMENTONIONREQUEST']._serialized_start=96567 + _globals['_INJECTPAYMENTONIONREQUEST']._serialized_end=96940 + _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_start=96942 + _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_end=97061 + _globals['_INJECTONIONMESSAGEREQUEST']._serialized_start=97063 + _globals['_INJECTONIONMESSAGEREQUEST']._serialized_end=97125 + _globals['_INJECTONIONMESSAGERESPONSE']._serialized_start=97127 + _globals['_INJECTONIONMESSAGERESPONSE']._serialized_end=97155 + _globals['_XPAYREQUEST']._serialized_start=97158 + _globals['_XPAYREQUEST']._serialized_end=97601 + _globals['_XPAYRESPONSE']._serialized_start=97604 + _globals['_XPAYRESPONSE']._serialized_end=97765 + _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_start=97767 + _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_end=97828 + _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_start=97830 + _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_end=97926 + _globals['_LISTCHANNELMOVESREQUEST']._serialized_start=97929 + _globals['_LISTCHANNELMOVESREQUEST']._serialized_end=98134 + _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_start=98068 + _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_end=98104 + _globals['_LISTCHANNELMOVESRESPONSE']._serialized_start=98136 + _globals['_LISTCHANNELMOVESRESPONSE']._serialized_end=98219 + _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_start=98222 + _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_end=98775 + _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_start=98583 + _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_end=98733 + _globals['_LISTCHAINMOVESREQUEST']._serialized_start=98778 + _globals['_LISTCHAINMOVESREQUEST']._serialized_end=98975 + _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_start=98911 + _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_end=98945 + _globals['_LISTCHAINMOVESRESPONSE']._serialized_start=98977 + _globals['_LISTCHAINMOVESRESPONSE']._serialized_end=99052 + _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_start=99055 + _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_end=99907 + _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_start=99542 + _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_end=99819 + _globals['_LISTNETWORKEVENTSREQUEST']._serialized_start=99910 + _globals['_LISTNETWORKEVENTSREQUEST']._serialized_end=100143 + _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_start=100069 + _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_end=100106 + _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_start=100145 + _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_end=100232 + _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_start=100235 + _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_end=100477 + _globals['_DELNETWORKEVENTREQUEST']._serialized_start=100479 + _globals['_DELNETWORKEVENTREQUEST']._serialized_end=100526 + _globals['_DELNETWORKEVENTRESPONSE']._serialized_start=100528 + _globals['_DELNETWORKEVENTRESPONSE']._serialized_end=100553 + _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_start=100556 + _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_end=100802 + _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_start=100804 + _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_end=100833 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_start=100836 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_end=101054 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_start=100987 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_end=101032 + _globals['_LISTCURRENCYRATESREQUEST']._serialized_start=101056 + _globals['_LISTCURRENCYRATESREQUEST']._serialized_end=101100 + _globals['_LISTCURRENCYRATESRESPONSE']._serialized_start=101102 + _globals['_LISTCURRENCYRATESRESPONSE']._serialized_end=101189 + _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_start=101191 + _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_end=101255 + _globals['_CURRENCYCONVERTREQUEST']._serialized_start=101257 + _globals['_CURRENCYCONVERTREQUEST']._serialized_end=101315 + _globals['_CURRENCYCONVERTRESPONSE']._serialized_start=101317 + _globals['_CURRENCYCONVERTRESPONSE']._serialized_end=101369 + _globals['_CURRENCYRATEREQUEST']._serialized_start=101371 + _globals['_CURRENCYRATEREQUEST']._serialized_end=101410 + _globals['_CURRENCYRATERESPONSE']._serialized_start=101412 + _globals['_CURRENCYRATERESPONSE']._serialized_end=101448 + _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_start=101450 + _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_end=101480 + _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_start=101483 + _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_end=101617 + _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_start=101619 + _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_end=101718 + _globals['_STREAMBLOCKADDEDREQUEST']._serialized_start=101720 + _globals['_STREAMBLOCKADDEDREQUEST']._serialized_end=101745 + _globals['_BLOCKADDEDNOTIFICATION']._serialized_start=101747 + _globals['_BLOCKADDEDNOTIFICATION']._serialized_end=101801 + _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_start=101803 + _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_end=101835 + _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_start=101837 + _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_end=101888 + _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_start=101890 + _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_end=101918 + _globals['_CHANNELOPENEDNOTIFICATION']._serialized_start=101920 + _globals['_CHANNELOPENEDNOTIFICATION']._serialized_end=102039 + _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_start=102041 + _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_end=102075 + _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_start=102078 + _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_end=102527 + _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_start=102381 + _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_end=102480 + _globals['_STREAMCONNECTREQUEST']._serialized_start=102529 + _globals['_STREAMCONNECTREQUEST']._serialized_end=102551 + _globals['_PEERCONNECTNOTIFICATION']._serialized_start=102554 + _globals['_PEERCONNECTNOTIFICATION']._serialized_end=102744 + _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_start=102705 + _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_end=102744 + _globals['_PEERCONNECTADDRESS']._serialized_start=102747 + _globals['_PEERCONNECTADDRESS']._serialized_end=103029 + _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_start=102898 + _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_end=102997 + _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_start=103031 + _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_end=103058 + _globals['_COINMOVEMENTNOTIFICATION']._serialized_start=103061 + _globals['_COINMOVEMENTNOTIFICATION']._serialized_end=104500 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_start=103838 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_end=103888 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_start=103891 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_end=104266 + _globals['_STREAMCUSTOMMSGREQUEST']._serialized_start=104502 + _globals['_STREAMCUSTOMMSGREQUEST']._serialized_end=104526 + _globals['_CUSTOMMSGNOTIFICATION']._serialized_start=104528 + _globals['_CUSTOMMSGNOTIFICATION']._serialized_end=104585 + _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_start=104587 + _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_end=104619 + _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_start=104621 + _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_end=104675 + _globals['_STREAMDISCONNECTREQUEST']._serialized_start=104677 + _globals['_STREAMDISCONNECTREQUEST']._serialized_end=104702 + _globals['_DISCONNECTNOTIFICATION']._serialized_start=104704 + _globals['_DISCONNECTNOTIFICATION']._serialized_end=104740 + _globals['_STREAMFORWARDEVENTREQUEST']._serialized_start=104742 + _globals['_STREAMFORWARDEVENTREQUEST']._serialized_end=104769 + _globals['_FORWARDEVENTNOTIFICATION']._serialized_start=104772 + _globals['_FORWARDEVENTNOTIFICATION']._serialized_end=105420 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_start=105204 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_end=105280 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_start=105282 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_end=105322 + _globals['_STREAMINVOICECREATIONREQUEST']._serialized_start=105422 + _globals['_STREAMINVOICECREATIONREQUEST']._serialized_end=105452 + _globals['_INVOICECREATIONNOTIFICATION']._serialized_start=105454 + _globals['_INVOICECREATIONNOTIFICATION']._serialized_end=105557 + _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_start=105559 + _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_end=105588 + _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_start=105591 + _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_end=105730 + _globals['_STREAMLOGREQUEST']._serialized_start=105732 + _globals['_STREAMLOGREQUEST']._serialized_end=105750 + _globals['_LOGNOTIFICATION']._serialized_start=105753 + _globals['_LOGNOTIFICATION']._serialized_end=105955 + _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_start=105880 + _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_end=105955 + _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_start=105957 + _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_end=105995 + _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_start=105998 + _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_end=106237 + _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_start=106239 + _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_end=106273 + _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_start=106275 + _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_end=106349 + _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_start=106351 + _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_end=106379 + _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_start=106381 + _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_end=106467 + _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_start=106469 + _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_end=106497 + _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_start=106499 + _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_end=106585 + _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_start=106587 + _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_end=106616 + _globals['_SENDPAYFAILURENOTIFICATION']._serialized_start=106618 + _globals['_SENDPAYFAILURENOTIFICATION']._serialized_end=106716 + _globals['_SENDPAYFAILUREDATA']._serialized_start=106719 + _globals['_SENDPAYFAILUREDATA']._serialized_end=107936 + _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_start=107474 + _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_end=107539 + _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_start=107938 + _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_end=107967 + _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_start=107970 + _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_end=108686 + _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_start=108488 + _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_end=108524 + _globals['_STREAMSHUTDOWNREQUEST']._serialized_start=108688 + _globals['_STREAMSHUTDOWNREQUEST']._serialized_end=108711 + _globals['_SHUTDOWNNOTIFICATION']._serialized_start=108713 + _globals['_SHUTDOWNNOTIFICATION']._serialized_end=108735 + _globals['_STREAMWARNINGREQUEST']._serialized_start=108737 + _globals['_STREAMWARNINGREQUEST']._serialized_end=108759 + _globals['_WARNINGNOTIFICATION']._serialized_start=108762 + _globals['_WARNINGNOTIFICATION']._serialized_end=108936 + _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_start=108901 + _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_end=108936 + _globals['_STREAMPAYPARTENDREQUEST']._serialized_start=108938 + _globals['_STREAMPAYPARTENDREQUEST']._serialized_end=108963 + _globals['_PAYPARTENDNOTIFICATION']._serialized_start=108966 + _globals['_PAYPARTENDNOTIFICATION']._serialized_end=109463 + _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_start=109303 + _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_end=109347 + _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_start=109465 + _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_end=109492 + _globals['_PAYPARTSTARTNOTIFICATION']._serialized_start=109495 + _globals['_PAYPARTSTARTNOTIFICATION']._serialized_end=109689 + _globals['_PAYPARTSTARTHOPS']._serialized_start=109692 + _globals['_PAYPARTSTARTHOPS']._serialized_end=109851 + _globals['_NODE']._serialized_start=109854 + _globals['_NODE']._serialized_end=122860 # @@protoc_insertion_point(module_scope) diff --git a/contrib/pyln-testing/pyln/testing/btcproxy.py b/contrib/pyln-testing/pyln/testing/btcproxy.py index 6c599479140d..5a24d7bacbff 100644 --- a/contrib/pyln-testing/pyln/testing/btcproxy.py +++ b/contrib/pyln-testing/pyln/testing/btcproxy.py @@ -47,7 +47,10 @@ def _handle_request(self, r): return ret elif method in self.mocks and callable(self.mocks[method]): self.mock_counts[method] += 1 - return self.mocks[method](r) + # If a mock returns "None" it means "call the real one" + ret = self.mocks[method](r) + if ret is not None: + return ret try: reply = { diff --git a/contrib/pyln-testing/pyln/testing/grpc2py.py b/contrib/pyln-testing/pyln/testing/grpc2py.py index 2317d1471f8b..659d4655b0cc 100644 --- a/contrib/pyln-testing/pyln/testing/grpc2py.py +++ b/contrib/pyln-testing/pyln/testing/grpc2py.py @@ -3204,9 +3204,15 @@ def askrene_age2py(m): def getroutes_routes_path2py(m): return remove_default({ + "amount_in_msat": amount2msat(m.amount_in_msat), # PrimitiveField in generate_composite "amount_msat": amount2msat(m.amount_msat), # PrimitiveField in generate_composite + "amount_out_msat": amount2msat(m.amount_out_msat), # PrimitiveField in generate_composite + "cltv_in": m.cltv_in, # PrimitiveField in generate_composite + "cltv_out": m.cltv_out, # PrimitiveField in generate_composite "delay": m.delay, # PrimitiveField in generate_composite "next_node_id": hexlify(m.next_node_id), # PrimitiveField in generate_composite + "node_id_in": hexlify(m.node_id_in), # PrimitiveField in generate_composite + "node_id_out": hexlify(m.node_id_out), # PrimitiveField in generate_composite "short_channel_id_dir": m.short_channel_id_dir, # PrimitiveField in generate_composite }) diff --git a/contrib/pyln-testing/pyln/testing/utils.py b/contrib/pyln-testing/pyln/testing/utils.py index 861afcea2c76..1065838c5867 100644 --- a/contrib/pyln-testing/pyln/testing/utils.py +++ b/contrib/pyln-testing/pyln/testing/utils.py @@ -1363,7 +1363,7 @@ def wait_for_route(self, destination, timeout=TIMEOUT): start_time = time.time() while time.time() < start_time + timeout: try: - self.rpc.getroute(destination.info['id'], 1, 1) + self.single_route(destination.info['id'], 1) return True except Exception: time.sleep(1) @@ -1383,20 +1383,10 @@ def wait_for_htlcs(self, scids=None): wait_for(lambda: len(self.rpc.listpeerchannels(peer["id"])['channels'][idx]['htlcs']) == 0) # This sends money to a directly connected peer - # if `route` is `True`, it can also send over the network. - def pay(self, dst, amt, label=None, route=False): + def pay(self, dst, amt, label=None): if not label: label = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(20)) - if route is True: - invoice = dst.rpc.invoice(amt, label, "desc") - route = self.rpc.getroute(dst.info["id"], amt, riskfactor=0, fuzzpercent=0) - self.rpc.sendpay(route["route"], invoice["payment_hash"], payment_secret=invoice.get('payment_secret')) - result = self.rpc.waitsendpay(invoice["payment_hash"]) - assert result.get('status') == 'complete' - self.wait_for_htlcs() - return - # check we are connected dst_id = dst.info['id'] assert len(self.rpc.listpeers(dst_id).get('peers')) == 1 @@ -1428,6 +1418,16 @@ def pay(self, dst, amt, label=None, route=False): # Make sure they're all settled, in case we quickly mine blocks! dst.wait_for_htlcs() + def single_route(self, node_id, amount_msat, cltv=9): + """Similar to the getroute() call (different output though!)""" + return only_one(self.rpc.getroutes(source=self.info['id'], + destination=node_id, + amount_msat=amount_msat, + layers=["auto.localchans", "auto.sourcefree"], + maxfee_msat=10000000, + final_cltv=cltv, + maxparts=1)['routes'])['path'] + # This helper sends all money to a peer until even 1 msat can't get through. def drain(self, peer): total = 0 diff --git a/doc/Makefile b/doc/Makefile index 81e3fc479f62..39e6929d58c7 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -159,6 +159,7 @@ MARKDOWNPAGES := doc/addgossip.7 \ doc/wait.7 \ doc/waitsendpay.7 \ doc/withdraw.7 \ + doc/xkeysend.7 \ doc/xpay.7 NOTIFICATION_SCHEMAS := $(wildcard doc/schemas/notification/*.json) diff --git a/doc/developers-guide/deprecated-features.md b/doc/developers-guide/deprecated-features.md index acbb3184e8b4..e536c10c4e0b 100644 --- a/doc/developers-guide/deprecated-features.md +++ b/doc/developers-guide/deprecated-features.md @@ -23,6 +23,17 @@ privacy: | channel_state_changed.null_message | Notification Field | v25.12 | v26.12 | In channel_state_changed notification, `message` will be missing instead of `null` | | hsmtool.getcodexsecret | Command | v25.12.1 | v26.12 | Doesn't work on nodes using mnemonic secrets (v25.12 or later). Use `getsecret` instead. | | experimental_splicing | Config | v26.04 | v27.04 | Splicing is now enabled by default | +| getroutes.layers.auto.no_mpp_support | Parameter | v26.06 | v27.03 | Use `maxparts=1` instead (since v25.09) | +| getroutes.next_node_id | Field | v26.06 | v27.06 | Use `node_id_out` instead (since v26.06) | +| getroutes.amount_msat | Field | v26.06 | v27.06 | Use `amount_in_msat` instead (since v26.06) | +| getroutes.delay | Field | v26.06 | v27.06 | Use `cltv_in` instead (since v26.06) | +| pay | Command | v26.06 | v27.03 | Use the more sophisticated and effective "xpay" command instead (since v24.11). | +| paystatus | Command | v26.06 | v27.03 | Uses internal pay structures, doesn't work with xpay, doesn't work across restarts. | +| getroute | Command | v26.06 | v27.03 | Less flexible than `getroutes` which takes an actual fee budget and can do multiple paths at once. | +| keysend | Command | v26.06 | v27.03 | Replaced by more powerful `xkeysend`. | +| renepay | Command | v26.06 | v27.03 | Use `xpay` instead. | +| renepaystatus | Command | v26.06 | v27.03 | Use `xpay` notifications and `listpays` or `listsendpays` instead. | + Inevitably there are features which need to change: either to be generalized, or removed when they can no longer be supported. Types of deprecation: diff --git a/doc/index.rst b/doc/index.rst index 96c3443e9365..26d38b631897 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -215,5 +215,6 @@ Core Lightning Documentation waitinvoice waitsendpay withdraw + xkeysend xpay .. block_end manpages diff --git a/doc/schemas/addgossip.json b/doc/schemas/addgossip.json index 232f3d7eb727..087f06c6e2e5 100644 --- a/doc/schemas/addgossip.json +++ b/doc/schemas/addgossip.json @@ -32,7 +32,7 @@ "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." ], "see_also": [ - "lightning-pay(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" diff --git a/doc/schemas/decode.json b/doc/schemas/decode.json index 022d5f028590..edc6a1678997 100644 --- a/doc/schemas/decode.json +++ b/doc/schemas/decode.json @@ -3097,7 +3097,7 @@ "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." ], "see_also": [ - "lightning-pay(7)", + "lightning-xpay(7)", "lightning-offer(7)", "lightning-fetchinvoice(7)", "lightning-sendinvoice(7)", diff --git a/doc/schemas/delpay.json b/doc/schemas/delpay.json index 8cef968ec155..723e73dd0292 100644 --- a/doc/schemas/delpay.json +++ b/doc/schemas/delpay.json @@ -202,7 +202,7 @@ "see_also": [ "lightning-listpays(7)", "lightning-listsendpays(7)", - "lightning-paystatus(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" diff --git a/doc/schemas/fetchinvoice.json b/doc/schemas/fetchinvoice.json index 909d7d83699d..a69442a37f9d 100644 --- a/doc/schemas/fetchinvoice.json +++ b/doc/schemas/fetchinvoice.json @@ -199,7 +199,7 @@ ], "see_also": [ "lightning-sendinvoice(7)", - "lightning-pay(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" diff --git a/doc/schemas/getroute.json b/doc/schemas/getroute.json index 404d53906d3f..b6bdd2c456f8 100644 --- a/doc/schemas/getroute.json +++ b/doc/schemas/getroute.json @@ -4,6 +4,8 @@ "rpc": "getroute", "title": "Command for routing a payment (low-level)", "description": [ + "NOTE: As of v26.06, getroute is deprecated in favor of **getroutes**. The usual equivalent is to use getroutes with `layers` including `auto.localchans`, `auto.sourcefree` and `maxparts` set to 1.", + "", "The **getroute** RPC command attempts to find the best route for the payment of *amount_msat* to lightning node *id*, such that the payment will arrive at *id* with *cltv*.", "", "There are two considerations for how good a route is: how low the fees are, and how long your payment will get stuck in a delayed output if a node goes down during the process. ." diff --git a/doc/schemas/getroutes.json b/doc/schemas/getroutes.json index 04f502e2890b..d6b22256537d 100644 --- a/doc/schemas/getroutes.json +++ b/doc/schemas/getroutes.json @@ -11,7 +11,7 @@ "", "Layers are generally maintained by plugins, either to contain persistent information about capacities which have been discovered, or to contain transient information for this particular payment (such as blinded paths or routehints).", "", - "There are four automatic layers: *auto.localchans* contains information on local channels from this node (including non-public ones), and their exact current spendable capacities. *auto.sourcefree* overrides all channels (including those from previous layers) leading out of the *source* to be zero fee and zero delay. These are both useful in the case where the source is the current node. *auto.no_mpp_support* forces getroutes to return a single path solution which is useful for payments for which MPP is not supported. And *auto.include_fees* that fixes the send amount and deducts fee from there, ie. the receiver pays for fees instead of the sender." + "There are some automatic layers: *auto.localchans* contains information on local channels from this node (including non-public ones), and their exact current spendable capacities. *auto.sourcefree* overrides all channels (including those from previous layers) leading out of the *source* to be zero fee and zero delay. These are both useful in the case where the source is the current node. *auto.include_fees* that fixes the send amount and deducts fee from there, ie. the receiver pays for fees instead of the sender. *auto.no_mpp_support* is deprecated in v26.06: use `maxparts=1` instead." ], "categories": [ "readonly" @@ -137,9 +137,12 @@ "additionalProperties": false, "required": [ "short_channel_id_dir", - "next_node_id", - "amount_msat", - "delay" + "node_id_in", + "node_id_out", + "amount_in_msat", + "amount_out_msat", + "cltv_in", + "cltv_out" ], "properties": { "short_channel_id_dir": { @@ -148,22 +151,76 @@ "The channel and direction joining these nodes." ] }, + "amount_in_msat": { + "added": "v26.06", + "type": "msat", + "description": [ + "The amount to send into this hop." + ] + }, + "amount_out_msat": { + "added": "v26.06", + "type": "msat", + "description": [ + "The amount which arrives at the far end of this hop." + ] + }, + "node_id_in": { + "added": "v26.06", + "type": "pubkey", + "description": [ + "The peer id at the start of this hop." + ] + }, + "node_id_out": { + "added": "v26.06", + "type": "pubkey", + "description": [ + "The peer id at the end of this hop." + ] + }, + "cltv_in": { + "added": "v26.06", + "type": "u32", + "description": [ + "The total CLTV expected by the node at the start of this hop." + ] + }, + "cltv_out": { + "added": "v26.06", + "type": "u32", + "description": [ + "The total CLTV expected by the node at the end of this hop." + ] + }, "amount_msat": { "type": "msat", "description": [ "The amount to send into this hop." + ], + "deprecated": [ + "v26.06", + "v27.06" ] }, "next_node_id": { "type": "pubkey", "description": [ "The peer id at the end of this hop." + ], + "deprecated": [ + "v26.06", + "v27.06" ] }, "delay": { "type": "u32", "description": [ "The total CLTV expected by the node at the start of this hop." + ], + "deprecated": [ + "v26.06", + "v27.06" ] } } @@ -174,6 +231,13 @@ } } }, + "errors": [ + "The following error codes may occur:", + "", + "- -1: Catchall nonspecific error.", + "- 205: Unable to find a route.", + "- 206: Route too expensive. Either the max_delay or maxfee_msat was exceeded." + ], "author": [ "[lagrang3@protonmail.com](mailto:lagrang3@protonmail.com) wrote the minimum-cost-flow solver, Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) wrote the API and this documentation." ], diff --git a/doc/schemas/injectpaymentonion.json b/doc/schemas/injectpaymentonion.json index b551705f30a6..7089c36b56b3 100644 --- a/doc/schemas/injectpaymentonion.json +++ b/doc/schemas/injectpaymentonion.json @@ -79,6 +79,13 @@ "description": [ "Amount that is actually delivered to the destination (i.e. `amount_msat` minus fees), for showing in listsendpays (confusingly, as `amount_msat`)." ] + }, + "destination": { + "type": "pubkey", + "added": "v26.06", + "description": [ + "Destination id (for *waitsendpay* and *listsendpays*). If not set, will be extracted if possible from *invstring*." + ] } } }, diff --git a/doc/schemas/invoice.json b/doc/schemas/invoice.json index 2462f039bcb6..396d1a86a918 100644 --- a/doc/schemas/invoice.json +++ b/doc/schemas/invoice.json @@ -195,7 +195,7 @@ "see_also": [ "lightning-listinvoices(7)", "lightning-delinvoice(7)", - "lightning-pay(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" diff --git a/doc/schemas/keysend.json b/doc/schemas/keysend.json index fdb6615c499a..13d34a3bfc0f 100644 --- a/doc/schemas/keysend.json +++ b/doc/schemas/keysend.json @@ -4,6 +4,8 @@ "rpc": "keysend", "title": "Send funds to a node without an invoice", "description": [ + "WARNING: deprecated: use *xkeysend* which uses askrene for better route calculation (and learns from previous payments).", + "", "The **keysend** RPC command attempts to find a route to the given destination, and send the specified amount to it. Unlike the `pay` RPC command the `keysend` command does not require an invoice, instead it uses the `destination` node ID, and `amount` to find a route to the specified node.", "", "In order for the destination to be able to claim the payment, the `payment_key` is randomly generated by the sender and included in the encrypted payload for the destination. As a consequence there is not proof-of-payment, like there is with an invoice where the `payment_key` is generated on the destination, and the only way sender could have it is by sending a payment. Please ensure that this matches your use-case when using `keysend`.", @@ -221,6 +223,7 @@ "Christian Decker [decker@blockstream.com](mailto:decker@blockstream.com) is mainly responsible." ], "see_also": [ + "lightning-xkeysend(7)", "lightning-listpays(7)", "lightning-decode(7)", "lightning-listinvoices(7)", diff --git a/doc/schemas/listpays.json b/doc/schemas/listpays.json index e2917ed89bc8..201c48f2741d 100644 --- a/doc/schemas/listpays.json +++ b/doc/schemas/listpays.json @@ -266,7 +266,7 @@ "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." ], "see_also": [ - "lightning-pay(7)", + "lightning-xpay(7)", "lightning-paystatus(7)", "lightning-listsendpays(7)" ], diff --git a/doc/schemas/pay.json b/doc/schemas/pay.json index 4c35386973df..c8f8b45b3e86 100644 --- a/doc/schemas/pay.json +++ b/doc/schemas/pay.json @@ -2,9 +2,11 @@ "$schema": "../rpc-schema-draft.json", "type": "object", "rpc": "pay", - "title": "Command for sending a payment to a BOLT11 invoice", + "title": "Command for sending a payment to a BOLT11/BOLT12 invoice", "description": [ - "The **pay** RPC command attempts to find a route to the given destination, and send the funds it asks for. .", + "NOTE: As of v26.06, xpay transparantly handles most **pay** invocations, and **pay** is deprecated.", + "", + "The **pay** RPC command attempts to find a route to the given destination, and send the funds it asks for.", "", "The response will occur when the payment fails or succeeds. Once a payment has succeeded, calls to **pay** with the same *bolt11* will succeed immediately.", "", @@ -19,6 +21,8 @@ "bolt11": { "type": "string", "description": [ + "NOTE: `invstring` is an alternate name for this parameter, since v26.06, for xpay compatibility.", + "", "Bolt11 or bolt12 invoice (such as one received from lightningd-fetchinvoice(7)). For a bolt11 invoice, if it does not contain an amount, *amount_msat* is required, otherwise if it is specified it must be *null*." ] }, @@ -228,6 +232,7 @@ "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." ], "see_also": [ + "lightning-xpay(7)", "lightning-listpays(7)", "lightning-decode(7)", "lightning-listinvoices(7)", diff --git a/doc/schemas/preapproveinvoice.json b/doc/schemas/preapproveinvoice.json index a74a88957239..5cc3542d82c7 100644 --- a/doc/schemas/preapproveinvoice.json +++ b/doc/schemas/preapproveinvoice.json @@ -38,7 +38,7 @@ "Ken Sedgwick [ken@bonsai.com](mailto:ken@bonsai.com) is mainly responsible." ], "see_also": [ - "lightning-pay(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" diff --git a/doc/schemas/renepay.json b/doc/schemas/renepay.json index 8169c387fc29..32a7d44b26a3 100644 --- a/doc/schemas/renepay.json +++ b/doc/schemas/renepay.json @@ -5,6 +5,8 @@ "title": "Command for sending a payment to a BOLT11 invoice", "added": "v23.08", "description": [ + "WARNING: Deprecated, scheduled for removal in v27.03", + "", "**renepay** is a new payment plugin based on Pickhardt-Richter optimization method for Multi-Path-Payments. This implementation has not been thoroughly tested and it should be used with caution.", "", "The response will occur when the payment fails or succeeds. Once a payment has succeeded, calls to **renepay** with the same *invstring* will not lead to a new payment attempt, but instead it will succeed immediately.", diff --git a/doc/schemas/renepaystatus.json b/doc/schemas/renepaystatus.json index 7bfe47747a0a..e50928a9eabc 100644 --- a/doc/schemas/renepaystatus.json +++ b/doc/schemas/renepaystatus.json @@ -5,6 +5,8 @@ "title": "Command for quering the status of previous renepay attempts", "added": "v23.08", "description": [ + "WARNING: Deprecated, scheduled for removal in v27.03", + "", "The **renepaystatus** RPC command queries the payment plugin **renepay** for the status of previous payment attempts.", "", "This command always succeeds." diff --git a/doc/schemas/sendpay.json b/doc/schemas/sendpay.json index 2e67709c7113..fc1a98ae1e14 100644 --- a/doc/schemas/sendpay.json +++ b/doc/schemas/sendpay.json @@ -6,7 +6,7 @@ "description": [ "The **sendpay** RPC command attempts to send funds associated with the given *payment_hash*, along a route to the final destination in the route.", "", - "Generally, a client would call lightning-getroute(7) to resolve a route, then use **sendpay** to send it. If it fails, it would call lightning-getroute(7) again to retry. If the route is empty, a payment-to-self is attempted.", + "Generally, a client would call lightning-getroute(7) or lightning-getroutes(7) to resolve a route, then use **sendpay** to send it. This is why *sendpay*'s route ignores unknown members: it uses the fields from either of those commands and ignored others. If it fails, it would call lightning-getroutes(7) again to retry. If the route is empty, a payment-to-self is attempted.", "", "The response will occur when the payment is on its way to the destination. The **sendpay** RPC command does not wait for definite success or definite failure of the payment (except for already-succeeded payments, or to-self payments). Instead, use the **waitsendpay** RPC command to poll or wait for definite success or definite failure.", "", @@ -23,36 +23,58 @@ "type": "array", "items": { "type": "object", - "required": [ - "amount_msat", - "id", - "delay", - "channel" - ], "additionalProperties": true, "properties": { - "id": { + "short_channel_id_dir": { + "type": "short_channel_id_dir", + "added": "v26.06", + "description": [ + "The channel joining these nodes." + ] + }, + "node_id_out": { "type": "pubkey", + "added": "v26.06", "description": [ "The node at the end of this hop." ] }, + "amount_out_msat": { + "added": "v26.06", + "type": "msat", + "description": [ + "The amount expected at the far end of this hop." + ] + }, + "cltv_out": { + "added": "v26.06", + "type": "u32", + "description": [ + "The total CLTV expected by the node at the end of this hop." + ] + }, + "id": { + "type": "pubkey", + "description": [ + "The node at the end of this hop (older name for `node_id_out`)." + ] + }, "channel": { "type": "short_channel_id", "description": [ - "The channel joining these nodes." + "The channel joining these nodes (older name for `short_channel_id_dir`)" ] }, "delay": { "type": "u32", "description": [ - "The total CLTV expected by the node at the end of this hop." + "The total CLTV expected by the node at the end of this hop (older name for `cltv_out`)." ] }, "amount_msat": { "type": "msat", "description": [ - "The amount expected by the node at the end of this hop." + "The amount expected by the node at the end of this hop (older name for `amount_out_msat`)." ] } } @@ -353,7 +375,7 @@ "lightning-delinvoice(7)", "lightning-getroute(7)", "lightning-invoice(7)", - "lightning-pay(7)", + "lightning-xpay(7)", "lightning-waitsendpay(7)" ], "resources": [ diff --git a/doc/schemas/waitsendpay.json b/doc/schemas/waitsendpay.json index ebd071674b91..d252b0ad3cfa 100644 --- a/doc/schemas/waitsendpay.json +++ b/doc/schemas/waitsendpay.json @@ -227,7 +227,7 @@ ], "see_also": [ "lightning-sendpay(7)", - "lightning-pay(7)" + "lightning-xpay(7)" ], "resources": [ "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" diff --git a/doc/schemas/xkeysend.json b/doc/schemas/xkeysend.json new file mode 100644 index 000000000000..e45983ba835b --- /dev/null +++ b/doc/schemas/xkeysend.json @@ -0,0 +1,136 @@ +{ + "$schema": "../rpc-schema-draft.json", + "type": "object", + "rpc": "xkeysend", + "title": "Send funds to a node without an invoice", + "added": "v26.06", + "description": [ + "The **xkeysend** RPC command attempts to find a route to the given destination, and send the specified amount to it. Unlike the `xpay` RPC command the `xkeysend` command does not require an invoice, instead it uses the `destination` node ID, and `amount` to find a route to the specified node.", + "", + "In order for the destination to be able to claim the payment, the `payment_key` is randomly generated by the sender and included in the encrypted payload for the destination. As a consequence there is not proof-of-payment, like there is with an invoice where the `payment_key` is generated on the destination, and the only way sender could have it is by sending a payment. Please ensure that this matches your use-case when using `xkeysend`.", + "", + "This replaces the older `keysend` command." + ], + "request": { + "required": [ + "destination", + "amount_msat" + ], + "additionalProperties": false, + "properties": { + "destination": { + "type": "pubkey", + "description": [ + "The 33 byte, hex-encoded, node ID of the node that the payment should go to." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "A whole number, or a whole number with suffix `msat` or `sat`, or a three decimal point number with suffix `sat`, or an 1 to 11 decimal point number suffixed by `btc`." + ] + }, + "label": { + "type": "string", + "description": [ + "Attach a label to the payment for which is returned in `listpays` and `listsendpays`. This is for your own use: it is not visible to the recipient." + ] + }, + "maxfee": { + "type": "msat", + "description": [ + "*maxfee* creates an absolute limit on what fee we will pay." + ] + }, + "layers": { + "type": "array", + "description": [ + "These are askrene layers to apply: these can alter the topology or provide additional information on the lightning network. See askrene-create-layer." + ], + "items": { + "type": "string", + "description": [ + "name of an existing layer" + ] + } + }, + "retry_for": { + "type": "u32", + "description": [ + "Until *retry_for* seconds passes, the command will keep finding routes and retrying the payment. However, a payment may be delayed for up to `maxdelay` blocks by another node; clients should be prepared for this worst case." + ], + "default": "60 seconds" + }, + "maxdelay": { + "type": "u32", + "description": [ + "Number of blocks the payment may be delayed." + ] + }, + "extratlvs": { + "type": "object", + "additionalProperties": true, + "required": [], + "description": [ + "Dictionary of additional fields to insert into the final tlv. The format is 'fieldnumber': 'hexstring'." + ] + } + } + }, + "response": { + "required": [ + "payment_preimage", + "failed_parts", + "successful_parts", + "amount_msat", + "amount_sent_msat" + ], + "properties": { + "payment_preimage": { + "type": "secret", + "description": [ + "The proof of payment: SHA256 of this **payment_hash**." + ] + }, + "failed_parts": { + "type": "u64", + "description": [ + "How many separate payment parts failed." + ] + }, + "successful_parts": { + "type": "u64", + "description": [ + "How many separate payment parts succeeded (or are anticipated to succeed). This will be at least one." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "Amount the recipient received." + ] + }, + "amount_sent_msat": { + "type": "msat", + "description": [ + "Total amount we sent (including fees)." + ] + } + }, + "post_return_value_notes": [ + "Note that the return is the same as it is for `xpay`." + ] + }, + "author": [ + "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." + ], + "see_also": [ + "lightning-listpays(7)", + "lightning-askrene-create-layer(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-update-channel(7)" + ], + "resources": [ + "Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning)" + ] +} diff --git a/doc/schemas/xpay.json b/doc/schemas/xpay.json index 24959a79577a..474752fd0106 100644 --- a/doc/schemas/xpay.json +++ b/doc/schemas/xpay.json @@ -4,11 +4,11 @@ "added": "v24.11", "additionalProperties": false, "rpc": "xpay", - "title": "Command for sending a payment for an invoice", + "title": "Command for sending a payment", "description": [ - "The **xpay** RPC command attempts to find routes to the given destination, and send the funds it asks for.", + "The **xpay** RPC command attempts to make the specified payment: it can look up BIP353 names (such as â‚¿rusty@blockstream.com), it can resolve simple offers (lno1...), and pay bolt11 (lnbc...) and bolt12 invoices (lni1...).", "", - "This plugin is simpler and more sophisticated than the older 'pay' plugin, but does not have all the same features." + "This plugin is both simpler and more sophisticated than the older 'pay' plugin." ], "request": { "required": [ @@ -37,7 +37,7 @@ "layers": { "type": "array", "description": [ - "These are askrene layers to apply in addition to xpay's own: these can alter the topology or provide additional information on the lightning network. See askrene-create-layer." + "These are askrene layers to apply in addition to xpay's own: these can alter the topology or provide additional information on the lightning network. This lets you exclude particular nodes or channels, or bias against them: see askrene-create-layer." ], "items": { "type": "string", @@ -73,6 +73,23 @@ "description": [ "A message that a payer is willing to send to a payee within an invoice request." ] + }, + "label": { + "type": "string", + "description": [ + "Attach a label to payments for which is returned in `listpays` and `listsendpays`. This is for your own use: it is not visible to the recipient." + ] + }, + "localinvreqid": { + "type": "hex", + "description": [ + "`localinvreqid` is used by offers to link a payment attempt to a local `invoice_request` offer created by lightningd-invoicerequest(7). This ensures that we only make a single payment for an offer, and that the offer is marked `used` once paid." + ] + }, + "dev_use_shadow": { + "hidden": true, + "type": "boolean", + "added": "v26.06" } } }, @@ -131,7 +148,7 @@ "Rusty Russell [rusty@rustcorp.com.au](mailto:rusty@rustcorp.com.au) is mainly responsible." ], "see_also": [ - "lightning-pay(7)", + "lightning-listpays(7)", "lightning-decode(7)" ], "resources": [ diff --git a/lightningd/pay.c b/lightningd/pay.c index 3f9a0128ffef..1abf7585a7e1 100644 --- a/lightningd/pay.c +++ b/lightningd/pay.c @@ -1393,19 +1393,22 @@ AUTODATA(json_command, &sendonion_command); JSON-RPC sendpay interface -----------------------------------------------------------------------------*/ -/* FIXME: We accept his parameter for now, will deprecate eventually */ -static struct command_result *param_route_hop_style(struct command *cmd, - const char *name, - const char *buffer, - const jsmntok_t *tok, - int **unused) +static struct command_result *either(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + const char *name1, + const char *name2, + const jsmntok_t **ret) { - if (json_tok_streq(buffer, tok, "tlv")) { + *ret = json_get_member(buffer, tok, name1); + if (*ret) + return NULL; + *ret = json_get_member(buffer, tok, name2); + if (*ret) return NULL; - } - return command_fail_badparam(cmd, name, buffer, tok, - "should be 'tlv' ('legacy' not supported)"); + tal_fmt(tmpctx, "must have either %s or %s", name1, name2)); } static struct command_result *param_route_hops(struct command *cmd, @@ -1418,32 +1421,45 @@ static struct command_result *param_route_hops(struct command *cmd, const jsmntok_t *t; if (tok->type != JSMN_ARRAY) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "%s must be an array", name); + return command_fail_badparam(cmd, name, buffer, tok, "must be an array"); *hops = tal_arr(cmd, struct route_hop, tok->size); json_for_each_arr(i, t, tok) { - struct amount_msat *amount_msat; - struct node_id *id; - struct short_channel_id *channel; - unsigned *delay, *direction; - int *ignored; - - if (!param(cmd, buffer, t, - p_req("amount_msat", param_msat, &amount_msat), - p_req("id", param_node_id, &id), - p_req("delay", param_number, &delay), - p_req("channel", param_short_channel_id, &channel), - /* Allowed (getroute supplies it) but ignored */ - p_opt("direction", param_number, &direction), - p_opt("style", param_route_hop_style, &ignored), - NULL)) - return command_param_failed(); - - (*hops)[i].amount = *amount_msat; - (*hops)[i].node_id = *id; - (*hops)[i].delay = *delay; - (*hops)[i].scid = *channel; + struct command_result *ret; + const jsmntok_t *member; + struct short_channel_id_dir scidd; + + ret = either(cmd, name, buffer, t, "short_channel_id_dir", "channel", &member); + if (ret) + return ret; + if (!json_to_short_channel_id_dir(buffer, member, &scidd) + && !json_to_short_channel_id(buffer, member, &scidd.scid)) { + return command_fail_badparam(cmd, name, buffer, member, + "bad short_channel_id"); + } + /* We don't actually need the direction */ + (*hops)[i].scid = scidd.scid; + ret = either(cmd, name, buffer, t, "node_id_out", "id", &member); + if (ret) + return ret; + if (!json_to_node_id(buffer, member, &(*hops)[i].node_id)) { + return command_fail_badparam(cmd, name, buffer, member, + "bad node_id"); + } + ret = either(cmd, name, buffer, t, "amount_out_msat", "amount_msat", &member); + if (ret) + return ret; + if (!json_to_msat(buffer, member, &(*hops)[i].amount)) { + return command_fail_badparam(cmd, name, buffer, member, + "bad amount"); + } + ret = either(cmd, name, buffer, t, "cltv_out", "delay", &member); + if (ret) + return ret; + if (!json_to_u32(buffer, member, &(*hops)[i].delay)) { + return command_fail_badparam(cmd, name, buffer, member, + "bad cltv_out/delay"); + } } return NULL; @@ -1867,6 +1883,7 @@ static struct command_result *json_injectpaymentonion(struct command *cmd, p_opt("invstring", param_invstring, &invstring), p_opt("localinvreqid", param_sha256, &local_invreq_id), p_opt_def("destination_msat", param_msat, &destination_msat, AMOUNT_MSAT(0)), + p_opt("destination", param_node_id, &destination), NULL)) return command_param_failed(); @@ -1936,26 +1953,21 @@ static struct command_result *json_injectpaymentonion(struct command *cmd, } /* If we have and can decode invstring, we extract destination for listsendpays */ - if (invstring) { + if (invstring && !destination) { + struct tlv_invoice *b12; struct bolt11 *b11; const char *fail; - b11 = bolt11_decode(cmd, invstring, NULL, NULL, NULL, &fail); - if (b11) { + if ((b11 = bolt11_decode(cmd, invstring, + NULL, NULL, NULL, &fail)) != NULL) { destination = &b11->receiver_id; - } else { - struct tlv_invoice *b12; - - b12 = invoice_decode(cmd, invstring, strlen(invstring), - NULL, NULL, &fail); - if (b12 && b12->invoice_node_id) { - destination = tal(cmd, struct node_id); - node_id_from_pubkey(destination, b12->invoice_node_id); - } else - destination = NULL; + } else if ((b12 = invoice_decode(cmd, invstring, strlen(invstring), + NULL, NULL, &fail)) != NULL + && b12->invoice_node_id) { + destination = tal(cmd, struct node_id); + node_id_from_pubkey(destination, b12->invoice_node_id); } - } else - destination = NULL; + } if (payload->final) { struct selfpay *selfpay; @@ -1990,6 +2002,8 @@ static struct command_result *json_injectpaymentonion(struct command *cmd, /* If they use scid, we use exactly the channel they tell us to here! */ if (payload->forward_channel) { + log_debug(cmd->ld->log, "injectpaymentonion: sending to channel %s", + fmt_short_channel_id(tmpctx, *payload->forward_channel)); next = any_channel_by_scid(cmd->ld, *payload->forward_channel, true); @@ -2011,6 +2025,8 @@ static struct command_result *json_injectpaymentonion(struct command *cmd, struct peer *next_peer; node_id_from_pubkey(&nid, payload->forward_node_id); + log_debug(cmd->ld->log, "injectpaymentonion: sending to peer %s", + fmt_node_id(tmpctx, &nid)); next_peer = peer_by_id(cmd->ld, &nid); if (!next_peer) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, diff --git a/lightningd/plugin.c b/lightningd/plugin.c index a9098ad0a81c..ca4a2f645198 100644 --- a/lightningd/plugin.c +++ b/lightningd/plugin.c @@ -190,23 +190,15 @@ struct command_result *plugin_register_all_complete(struct lightningd *ld, static void tell_connectd_custommsgs(struct plugins *plugins) { struct plugin *p; - size_t n = 0; - u16 *all_msgs = tal_arr(tmpctx, u16, n); + u16 *all_msgs = tal_arr(tmpctx, u16, 0); /* Not when shutting down */ if (!plugins->ld->connectd) return; /* Gather from all plugins. */ - list_for_each(&plugins->plugins, p, list) { - size_t num = tal_count(p->custom_msgs); - /* Blah blah blah memcpy NULL blah blah */ - if (num == 0) - continue; - tal_resize(&all_msgs, n + num); - memcpy(all_msgs + n, p->custom_msgs, num * sizeof(*p->custom_msgs)); - n += num; - } + list_for_each(&plugins->plugins, p, list) + tal_arr_append(&all_msgs, p->custom_msgs); /* Don't bother sorting or uniquifying. If plugins are dumb, they deserve it. */ subd_send_msg(plugins->ld->connectd, diff --git a/plugins/askrene/askrene.c b/plugins/askrene/askrene.c index 54219e5ea39d..27b4f54546cb 100644 --- a/plugins/askrene/askrene.c +++ b/plugins/askrene/askrene.c @@ -114,10 +114,15 @@ static struct command_result *param_layer_names(struct command *cmd, /* Must be a known layer name */ if (streq((*arr)[i], "auto.localchans") - || streq((*arr)[i], "auto.no_mpp_support") || streq((*arr)[i], "auto.sourcefree") || streq((*arr)[i], "auto.include_fees")) continue; + + if (streq((*arr)[i], "auto.no_mpp_support") + && command_deprecated_in_ok(cmd, "layers.auto.no_mpp_support", + "v26.06", "v27.03")) + continue; + if (!find_layer(get_askrene(cmd->plugin), (*arr)[i])) { return command_fail_badparam(cmd, name, buffer, t, "unknown layer"); @@ -264,7 +269,8 @@ static struct layer *remove_small_channel_layer(const tal_t *ctx, struct amount_msat min_amount, struct gossmap_localmods *localmods) { - struct layer *layer = new_temp_layer(ctx, askrene, "auto.no_mpp_support"); + /* We use the prefix auto. to avoid clashing */ + struct layer *layer = new_temp_layer(ctx, askrene, "auto.remove_small_channels"); struct gossmap *gossmap = askrene->gossmap; struct gossmap_chan *c; @@ -355,12 +361,26 @@ struct getroutes_info { u32 maxparts; }; +static void add_layer(const struct layer ***layers, + const struct layer *l, + const struct gossmap *gossmap, + struct gossmap_localmods *localmods, + fp16_t *capacities) +{ + tal_arr_expand(layers, l); + /* FIXME: Implement localmods_merge, and cache this in layer? */ + layer_add_localmods(l, gossmap, localmods); + + /* Clear any entries in capacities array if we + * override them (incl local channels) */ + layer_clear_overridden_capacities(l, gossmap, capacities); +} + /* Gather layers, clear capacities where layers contains info */ static const struct layer **apply_layers(const tal_t *ctx, struct askrene *askrene, struct command *cmd, const struct node_id *source, - struct amount_msat amount, struct gossmap_localmods *localmods, const char **layernames, const struct layer *local_layer, @@ -375,8 +395,8 @@ static const struct layer **apply_layers(const tal_t *ctx, cmd_log(tmpctx, cmd, LOG_DBG, "Adding auto.localchans"); l = local_layer; } else if (streq(layernames[i], "auto.no_mpp_support")) { - cmd_log(tmpctx, cmd, LOG_DBG, "Adding auto.no_mpp_support, sorry"); - l = remove_small_channel_layer(layernames, askrene, amount, localmods); + /* deprecated */ + continue; } else if (streq(layernames[i], "auto.include_fees")) { cmd_log(tmpctx, cmd, LOG_DBG, "Adding auto.include_fees"); /* This layer takes effect when converting flows @@ -388,15 +408,9 @@ static const struct layer **apply_layers(const tal_t *ctx, l = source_free_layer(layernames, askrene, source, localmods); } } - - tal_arr_expand(&layers, l); - /* FIXME: Implement localmods_merge, and cache this in layer? */ - layer_add_localmods(l, askrene->gossmap, localmods); - - /* Clear any entries in capacities array if we - * override them (incl local channels) */ - layer_clear_overridden_capacities(l, askrene->gossmap, capacities); + add_layer(&layers, l, askrene->gossmap, localmods, capacities); } + return layers; } @@ -405,6 +419,7 @@ static struct command_result *reap_child(struct router_child *child) int child_status; struct timerel time_delta; const char *err; + enum jsonrpc_errcode ecode; waitpid(child->pid, &child_status, 0); time_delta = timemono_between(time_mono(), child->start); @@ -422,7 +437,17 @@ static struct command_result *reap_child(struct router_child *child) /* This is how it indicates an error message */ if (WEXITSTATUS(child_status) != 0 && child->reply_bytes) { - err = tal_strndup(child, child->reply_buf, child->reply_bytes); + if (child->reply_bytes <= sizeof(ecode)) { + plugin_log(child->cmd->plugin, LOG_BROKEN, "Truncated child reply (%zu) bytes, exited %i", + child->reply_bytes, WEXITSTATUS(child_status)); + ecode = LIGHTNINGD; + err = "Truncated child result"; + } else { + memcpy(&ecode, child->reply_buf, sizeof(ecode)); + err = tal_strndup(child, + child->reply_buf + sizeof(ecode), + child->reply_bytes - sizeof(ecode)); + } goto fail; } if (child->reply_bytes == 0) { @@ -437,10 +462,11 @@ static struct command_result *reap_child(struct router_child *child) fail_broken: plugin_log(child->cmd->plugin, LOG_BROKEN, "%s", err); + ecode = LIGHTNINGD; fail: assert(err); /* Frees child, since it's a child of cmd */ - return command_fail(child->cmd, PAY_ROUTE_NOT_FOUND, "%s", err); + return command_fail(child->cmd, ecode, "%s", err); } /* Last one out finalizes */ @@ -529,6 +555,7 @@ static struct command_result *do_getroutes(struct command *cmd, const struct layer **layers; s8 *biases; fp16_t *capacities; + bool include_next_node_id, include_amount_msat, include_delay; /* update the gossmap */ if (gossmap_refresh(askrene->gossmap)) { @@ -564,11 +591,26 @@ static struct command_result *do_getroutes(struct command *cmd, } } + /* auto.no_mpp_support layer forces maxparts == 1. */ + if (have_layer(info->layers, "auto.no_mpp_support")) { + cmd_log(tmpctx, cmd, LOG_DBG, "Adding auto.no_mpp_support, sorry"); + info->maxparts = 1; + } + /* apply selected layers to the localmods */ layers = apply_layers(cmd, askrene, cmd, - &info->source, info->amount, localmods, + &info->source, localmods, info->layers, info->local_layer, capacities); + + /* no parallel payments means we can drop any smaller channels */ + if (info->maxparts == 1) { + add_layer(&layers, + remove_small_channel_layer(layers, askrene, info->amount, localmods), + askrene->gossmap, + localmods, capacities); + } + /* Clear scids with reservations, too, so we don't have to look up * all the time! */ reserves_clear_capacities(askrene->reserved, askrene->gossmap, @@ -605,14 +647,6 @@ static struct command_result *do_getroutes(struct command *cmd, goto fail; } - /* auto.no_mpp_support layer overrides any choice of algorithm. */ - if (have_layer(info->layers, "auto.no_mpp_support") && - info->dev_algo != ALGO_SINGLE_PATH) { - info->dev_algo = ALGO_SINGLE_PATH; - cmd_log(tmpctx, cmd, LOG_DBG, - "Layer no_mpp_support is active we switch to a " - "single path algorithm."); - } if (info->maxparts == 1 && info->dev_algo != ALGO_SINGLE_PATH) { info->dev_algo = ALGO_SINGLE_PATH; @@ -622,6 +656,19 @@ static struct command_result *do_getroutes(struct command *cmd, include_fees = have_layer(info->layers, "auto.include_fees"); + /* Figure out what deprecated fields to include */ + include_next_node_id = notification_deprecated_out_ok(askrene->plugin, + "getroutes", + "next_node_id", + "v26.06", "v27.06"); + include_amount_msat = notification_deprecated_out_ok(askrene->plugin, + "getroutes", + "amount_msat", + "v26.06", "v27.06"); + include_delay = notification_deprecated_out_ok(askrene->plugin, + "getroutes", + "delay", + "v26.06", "v27.06"); child = tal(cmd, struct router_child); child->start = time_mono(); deadline = timemono_add(child->start, @@ -671,7 +718,11 @@ static struct command_result *do_getroutes(struct command *cmd, deadline, srcnode, dstnode, info->amount, info->maxfee, info->finalcltv, info->maxdelay, info->maxparts, include_fees, - cmd->id, cmd->filter, replyfds[1]); + cmd->id, cmd->filter, + include_next_node_id, + include_amount_msat, + include_delay, + replyfds[1]); abort(); } diff --git a/plugins/askrene/child/child.c b/plugins/askrene/child/child.c index 8a4363d5fdb8..72aecd68dfd8 100644 --- a/plugins/askrene/child/child.c +++ b/plugins/askrene/child/child.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include @@ -12,122 +12,128 @@ #include #include +struct hop { + /* Via this channel */ + struct short_channel_id_dir scidd; + /* Nodes at each end */ + struct node_id node_in, node_out; + /* This is amount the node needs (including fees) */ + struct amount_msat amount_in; + /* ... to send this amount */ + struct amount_msat amount_out; + /* This is the delay, including delay across node */ + u32 cltv_value_in; + /* This is the delay, out from node. */ + u32 cltv_value_out; +}; + /* A single route. */ struct route { /* Actual path to take */ - struct route_hop *hops; + struct hop *hops; /* Probability estimate (0-1) */ double success_prob; }; -static const char *fmt_route(const tal_t *ctx, - const struct route *route, - struct amount_msat delivers, - u32 final_cltv) +static const struct hop *final_hop(const struct hop *hops) +{ + assert(tal_count(hops) > 0); + + return &hops[tal_count(hops) - 1]; +} + +static const char *fmt_route(const tal_t *ctx, const struct route *route) { char *str = tal_strdup(ctx, ""); + const struct hop *final = final_hop(route->hops); for (size_t i = 0; i < tal_count(route->hops); i++) { - struct short_channel_id_dir scidd; - scidd.scid = route->hops[i].scid; - scidd.dir = route->hops[i].direction; tal_append_fmt(&str, "%s/%u %s -> ", - fmt_amount_msat(tmpctx, route->hops[i].amount), - route->hops[i].delay, - fmt_short_channel_id_dir(tmpctx, &scidd)); + fmt_amount_msat(tmpctx, route->hops[i].amount_in), + route->hops[i].cltv_value_in, + fmt_short_channel_id_dir(tmpctx, &route->hops[i].scidd)); } - tal_append_fmt(&str, "%s/%u", - fmt_amount_msat(tmpctx, delivers), final_cltv); + tal_append_fmt(&str, "%s/%u (prob=%0.3f%%)", + fmt_amount_msat(tmpctx, final->amount_out), + final->cltv_value_out, + route->success_prob * 100); return str; } /* Convert back into routes, with delay and other information fixed */ static struct route **convert_flows_to_routes(const tal_t *ctx, - struct route_query *rq, + const struct route_query *rq, u32 finalcltv, struct flow **flows, - struct amount_msat **amounts, bool include_fees) { - struct route **routes; - routes = tal_arr(ctx, struct route *, tal_count(flows)); - *amounts = tal_arr(ctx, struct amount_msat, tal_count(flows)); + struct route **routes = tal_arr(ctx, struct route *, tal_count(flows)); for (size_t i = 0; i < tal_count(flows); i++) { struct route *r; struct amount_msat msat; - u32 delay; + u32 cltv_value; routes[i] = r = tal(routes, struct route); r->success_prob = flow_probability(flows[i], rq); - r->hops = tal_arr(r, struct route_hop, tal_count(flows[i]->path)); + r->hops = tal_arr(r, struct hop, tal_count(flows[i]->path)); msat = flows[i]->delivers; - delay = finalcltv; + cltv_value = finalcltv; + + /* Fill in backwards to calculate delay */ + for (int j = tal_count(flows[i]->path) - 1; j >= 0; j--) { + struct hop *hop = &r->hops[j]; + struct gossmap_node *n; + const struct half_chan *h = flow_edge(flows[i], j); + + hop->cltv_value_out = cltv_value; + cltv_value += h->delay; + hop->cltv_value_in = cltv_value; + + hop->scidd.scid = gossmap_chan_scid(rq->gossmap, + flows[i]->path[j]); + hop->scidd.dir = flows[i]->dirs[j]; + n = gossmap_nth_node(rq->gossmap, + flows[i]->path[j], + flows[i]->dirs[j]); + gossmap_node_get_id(rq->gossmap, n, &hop->node_in); + n = gossmap_nth_node(rq->gossmap, + flows[i]->path[j], + !flows[i]->dirs[j]); + gossmap_node_get_id(rq->gossmap, n, &hop->node_out); + } if (!include_fees) { - /* Fill in backwards to calc amount and delay */ + /* Fill in backwards to calc amount */ for (int j = tal_count(flows[i]->path) - 1; j >= 0; j--) { - struct route_hop *rh = &r->hops[j]; - struct gossmap_node *far_end; + struct hop *hop = &r->hops[j]; const struct half_chan *h = flow_edge(flows[i], j); + hop->amount_out = msat; if (!amount_msat_add_fee(&msat, h->base_fee, h->proportional_fee)) abort(); - delay += h->delay; - - rh->scid = gossmap_chan_scid(rq->gossmap, - flows[i]->path[j]); - rh->direction = flows[i]->dirs[j]; - far_end = gossmap_nth_node(rq->gossmap, - flows[i]->path[j], - !flows[i]->dirs[j]); - gossmap_node_get_id(rq->gossmap, far_end, - &rh->node_id); - rh->amount = msat; - rh->delay = delay; + hop->amount_in = msat; } - (*amounts)[i] = flows[i]->delivers; } else { - /* Fill in backwards to calc delay */ - for (int j = tal_count(flows[i]->path) - 1; j >= 0; - j--) { - struct route_hop *rh = &r->hops[j]; - struct gossmap_node *far_end; - const struct half_chan *h = - flow_edge(flows[i], j); - - delay += h->delay; - - rh->scid = gossmap_chan_scid(rq->gossmap, - flows[i]->path[j]); - rh->direction = flows[i]->dirs[j]; - far_end = gossmap_nth_node(rq->gossmap, - flows[i]->path[j], - !flows[i]->dirs[j]); - gossmap_node_get_id(rq->gossmap, far_end, - &rh->node_id); - rh->delay = delay; - } /* Compute fees forward */ for (int j = 0; j < tal_count(flows[i]->path); j++) { - struct route_hop *rh = &r->hops[j]; + struct hop *hop = &r->hops[j]; const struct half_chan *h = flow_edge(flows[i], j); - rh->amount = msat; + hop->amount_in = msat; msat = amount_msat_sub_fee(msat, h->base_fee, h->proportional_fee); + hop->amount_out = msat; } - (*amounts)[i] = msat; } child_log(tmpctx, LOG_INFORM, "Flow %zu/%zu: %s", - i, tal_count(flows), - fmt_route(tmpctx, r, (*amounts)[i], finalcltv)); + i, tal_count(flows), fmt_route(tmpctx, r)); } return routes; @@ -135,30 +141,39 @@ static struct route **convert_flows_to_routes(const tal_t *ctx, static void json_add_getroutes(struct json_stream *js, struct route **routes, - const struct amount_msat *amounts, double probability, - u32 final_cltv) + bool include_next_node_id, + bool include_amount_msat, + bool include_delay) { json_add_u64(js, "probability_ppm", (u64)(probability * 1000000)); json_array_start(js, "routes"); for (size_t i = 0; i < tal_count(routes); i++) { + const struct hop *final = final_hop(routes[i]->hops); json_object_start(js, NULL); json_add_u64(js, "probability_ppm", (u64)(routes[i]->success_prob * 1000000)); - json_add_amount_msat(js, "amount_msat", amounts[i]); - json_add_u32(js, "final_cltv", final_cltv); + json_add_amount_msat(js, "amount_msat", final->amount_out); + json_add_u32(js, "final_cltv", final->cltv_value_out); json_array_start(js, "path"); for (size_t j = 0; j < tal_count(routes[i]->hops); j++) { - struct short_channel_id_dir scidd; - const struct route_hop *r = &routes[i]->hops[j]; + const struct hop *hop = &routes[i]->hops[j]; json_object_start(js, NULL); - scidd.scid = r->scid; - scidd.dir = r->direction; json_add_short_channel_id_dir( - js, "short_channel_id_dir", scidd); - json_add_node_id(js, "next_node_id", &r->node_id); - json_add_amount_msat(js, "amount_msat", r->amount); - json_add_u32(js, "delay", r->delay); + js, "short_channel_id_dir", hop->scidd); + json_add_node_id(js, "node_id_in", &hop->node_in); + json_add_node_id(js, "node_id_out", &hop->node_out); + json_add_amount_msat(js, "amount_in_msat", hop->amount_in); + json_add_amount_msat(js, "amount_out_msat", hop->amount_out); + json_add_u32(js, "cltv_in", hop->cltv_value_in); + json_add_u32(js, "cltv_out", hop->cltv_value_out); + + if (include_next_node_id) + json_add_node_id(js, "next_node_id", &hop->node_out); + if (include_amount_msat) + json_add_amount_msat(js, "amount_msat", hop->amount_in); + if (include_delay) + json_add_u32(js, "delay", hop->cltv_value_in); json_object_end(js); } json_array_end(js); @@ -208,15 +223,18 @@ void run_child(const struct gossmap *gossmap, bool include_fees, const char *cmd_id, struct json_filter *cmd_filter, + bool include_next_node_id, + bool include_amount_msat, + bool include_delay, int replyfd) { double probability; struct flow **flows; struct route **routes; - struct amount_msat *amounts; const char *err, *p; size_t len; struct route_query *rq; + enum jsonrpc_errcode ecode; /* We exit below, so we don't bother freeing this */ rq = new_route_query(NULL, gossmap, cmd_id, layers, @@ -225,13 +243,14 @@ void run_child(const struct gossmap *gossmap, if (single_path) { err = single_path_routes(rq, rq, deadline, srcnode, dstnode, amount, maxfee, finalcltv, - maxdelay, &flows, &probability); + maxdelay, &flows, &probability, &ecode); } else { err = default_routes(rq, rq, deadline, srcnode, dstnode, amount, maxfee, finalcltv, maxdelay, - maxparts, &flows, &probability); + maxparts, &flows, &probability, &ecode); } if (err) { + write_all(replyfd, &ecode, sizeof(ecode)); write_all(replyfd, err, strlen(err)); /* Non-zero exit tells parent this is an error string. */ exit(1); @@ -243,10 +262,8 @@ void run_child(const struct gossmap *gossmap, tal_count(flows)); /* convert flows to routes */ - routes = convert_flows_to_routes(rq, rq, finalcltv, flows, - &amounts, include_fees); + routes = convert_flows_to_routes(rq, rq, finalcltv, flows, include_fees); assert(tal_count(routes) == tal_count(flows)); - assert(tal_count(amounts) == tal_count(flows)); /* output the results */ struct json_stream *js = new_json_stream(tmpctx, NULL, NULL); @@ -256,7 +273,10 @@ void run_child(const struct gossmap *gossmap, json_object_start(js, "result"); if (cmd_filter) json_stream_attach_filter(js, cmd_filter); - json_add_getroutes(js, routes, amounts, probability, finalcltv); + json_add_getroutes(js, routes, probability, + include_next_node_id, + include_amount_msat, + include_delay); /* Detach filter before it complains about closing object it never saw */ if (cmd_filter) { diff --git a/plugins/askrene/child/child.h b/plugins/askrene/child/child.h index 847bda99dab5..5cb6688e52be 100644 --- a/plugins/askrene/child/child.h +++ b/plugins/askrene/child/child.h @@ -10,6 +10,7 @@ struct additional_cost_htable; struct gossmap; +struct gossmap_node; struct json_filter; struct layer; struct reserve_htable; @@ -30,6 +31,9 @@ void run_child(const struct gossmap *gossmap, bool include_fees, const char *cmd_id, struct json_filter *cmd_filter, + bool include_next_node_id, + bool include_amount_msat, + bool include_delay, int reply_fd) NORETURN; #endif /* LIGHTNING_PLUGINS_ASKRENE_CHILD_CHILD_H */ diff --git a/plugins/askrene/child/explain_failure.c b/plugins/askrene/child/explain_failure.c index d97ecd01c0c8..364e41d0a49f 100644 --- a/plugins/askrene/child/explain_failure.c +++ b/plugins/askrene/child/explain_failure.c @@ -137,7 +137,7 @@ static const char *check_capacity(const tal_t *ctx, if (amount_msat_greater(amount, stats.total.capacity)) { return child_log(ctx, LOG_DBG, NO_USABLE_PATHS_STRING - " Total %s capacity is only %s" + " Total %s capacity is only %s" " (in %zu channels).", name, fmt_amount_msat(tmpctx, stats.total.capacity), @@ -146,7 +146,7 @@ static const char *check_capacity(const tal_t *ctx, if (amount_msat_greater(amount, stats.gossip_known.capacity)) { return child_log(ctx, LOG_DBG, NO_USABLE_PATHS_STRING - " Missing gossip for %s: only known %zu/%zu channels, leaving capacity only %s of %s.", + " Missing gossip for %s: only known %zu/%zu channels, leaving capacity only %s of %s.", name, stats.gossip_known.num_channels, stats.total.num_channels, @@ -154,12 +154,20 @@ static const char *check_capacity(const tal_t *ctx, fmt_amount_msat(tmpctx, stats.total.capacity)); } if (amount_msat_greater(amount, stats.enabled.capacity)) { + /* Common case: one channel, disabled */ + if (stats.enabled.num_channels == 0) { + return child_log(ctx, LOG_DBG, + NO_USABLE_PATHS_STRING + " All %zu channels to the %s are disabled.", + stats.total.num_channels, + name); + } return child_log(ctx, LOG_DBG, NO_USABLE_PATHS_STRING - " The %s has disabled %zu of %zu channels, leaving capacity only %s of %s.", - name, + " %zu of %zu channels to %s are disabled, leaving capacity only %s of %s.", stats.total.num_channels - stats.enabled.num_channels, stats.total.num_channels, + name, fmt_amount_msat(tmpctx, stats.enabled.capacity), fmt_amount_msat(tmpctx, stats.total.capacity)); } @@ -272,7 +280,7 @@ const char *explain_failure(const tal_t *ctx, fmt_amount_msat(tmpctx, rolling_amount)); return child_log(ctx, LOG_INFORM, NO_USABLE_PATHS_STRING - " The shortest path is %s, but %s %s", + " The shortest path is %s, but %s %s", path, fmt_short_channel_id_dir(tmpctx, &scidd), explanation); @@ -313,7 +321,7 @@ const char *explain_failure(const tal_t *ctx, return child_log(ctx, LOG_INFORM, NO_USABLE_PATHS_STRING - " The shortest path is %s, but %s %s", + " The shortest path is %s, but %s %s", path, fmt_short_channel_id_dir(tmpctx, &scidd), explanation); diff --git a/plugins/askrene/child/mcf.c b/plugins/askrene/child/mcf.c index 41594c501897..dde97f02250e 100644 --- a/plugins/askrene/child/mcf.c +++ b/plugins/askrene/child/mcf.c @@ -1343,6 +1343,7 @@ linear_routes(const tal_t *ctx, struct route_query *rq, struct amount_msat maxfee, u32 finalcltv, u32 maxdelay, size_t maxparts, struct flow ***flows, double *probability, + enum jsonrpc_errcode *ecode, struct flow **(*solver)(const tal_t *, const struct route_query *, const struct gossmap_node *, const struct gossmap_node *, @@ -1373,6 +1374,7 @@ linear_routes(const tal_t *ctx, struct route_query *rq, error_message = child_log(ctx, LOG_BROKEN, "%s: timed out after deadline", __func__); + *ecode = PAY_STOPPED_RETRYING; goto fail; } @@ -1400,13 +1402,16 @@ linear_routes(const tal_t *ctx, struct route_query *rq, if (!new_flows) { error_message = explain_failure( ctx, rq, srcnode, dstnode, amount_to_deliver); + *ecode = PAY_ROUTE_NOT_FOUND; goto fail; } error_message = refine_flows(ctx, rq, amount_to_deliver, &new_flows); - if (error_message) + if (error_message) { + *ecode = PAY_ROUTE_NOT_FOUND; goto fail; + } /* we finished removing flows and excess */ all_deliver = flowset_delivers(new_flows); @@ -1450,6 +1455,7 @@ linear_routes(const tal_t *ctx, struct route_query *rq, "fraction (%lf)", __func__, fmt_amount_msat(tmpctx, feebudget), deliver_fraction); + *ecode = PAY_ROUTE_NOT_FOUND; goto fail; } if (amount_msat_greater(all_fees, partial_feebudget)) { @@ -1476,6 +1482,7 @@ linear_routes(const tal_t *ctx, struct route_query *rq, child_log(ctx, LOG_UNUSUAL, "Could not find route without " "excessive cost"); + *ecode = PAY_ROUTE_TOO_EXPENSIVE; goto fail; } else { /* mu cannot be increased but at least all_fees @@ -1499,6 +1506,7 @@ linear_routes(const tal_t *ctx, struct route_query *rq, child_log(ctx, LOG_UNUSUAL, "Could not find route without " "excessive delays"); + *ecode = PAY_ROUTE_TOO_EXPENSIVE; goto fail; } @@ -1538,6 +1546,7 @@ linear_routes(const tal_t *ctx, struct route_query *rq, "%s: unexpected arithmetic operation " "failure on amount_msat", __func__); + *ecode = PAY_ROUTE_NOT_FOUND; goto fail; } } @@ -1558,6 +1567,7 @@ linear_routes(const tal_t *ctx, struct route_query *rq, error_message = reduce_num_flows(rq, rq, flows, amount, maxparts); if (error_message) { *flows = tal_free(*flows); + *ecode = PAY_ROUTE_NOT_FOUND; return error_message; } @@ -1572,6 +1582,7 @@ linear_routes(const tal_t *ctx, struct route_query *rq, fmt_amount_msat(tmpctx, fee), fmt_amount_msat(tmpctx, maxfee)); *flows = tal_free(*flows); + *ecode = PAY_ROUTE_TOO_EXPENSIVE; return error_message; } } @@ -1588,16 +1599,19 @@ linear_routes(const tal_t *ctx, struct route_query *rq, child_log(rq, LOG_BROKEN, "%s: check_htlc_min_limits failed", __func__); *flows = tal_free(*flows); + *ecode = PAY_ROUTE_NOT_FOUND; return error_message; } if (!check_htlc_max_limits(rq, *flows)) { *flows = tal_free(*flows); + *ecode = PAY_ROUTE_NOT_FOUND; return child_log(rq, LOG_BROKEN, "%s: check_htlc_max_limits failed", __func__); } if (tal_count(*flows) > maxparts) { size_t num_flows = tal_count(*flows); *flows = tal_free(*flows); + *ecode = PAY_ROUTE_NOT_FOUND; return child_log(rq, LOG_BROKEN, "%s: the number of flows (%zu) exceeds the limit set " "on payment parts (%zu), please submit a bug report", @@ -1620,10 +1634,12 @@ const char *default_routes(const tal_t *ctx, struct route_query *rq, struct amount_msat amount, struct amount_msat maxfee, u32 finalcltv, u32 maxdelay, size_t maxparts, struct flow ***flows, - double *probability) + double *probability, + enum jsonrpc_errcode *ecode) { return linear_routes(ctx, rq, deadline, srcnode, dstnode, amount, maxfee, - finalcltv, maxdelay, maxparts, flows, probability, minflow); + finalcltv, maxdelay, maxparts, flows, probability, ecode, + minflow); } const char *single_path_routes(const tal_t *ctx, struct route_query *rq, @@ -1633,9 +1649,10 @@ const char *single_path_routes(const tal_t *ctx, struct route_query *rq, struct amount_msat amount, struct amount_msat maxfee, u32 finalcltv, u32 maxdelay, struct flow ***flows, - double *probability) + double *probability, + enum jsonrpc_errcode *ecode) { return linear_routes(ctx, rq, deadline, srcnode, dstnode, amount, maxfee, - finalcltv, maxdelay, 1, flows, probability, + finalcltv, maxdelay, 1, flows, probability, ecode, single_path_flow); } diff --git a/plugins/askrene/child/mcf.h b/plugins/askrene/child/mcf.h index 27538c522992..9cceac32af31 100644 --- a/plugins/askrene/child/mcf.h +++ b/plugins/askrene/child/mcf.h @@ -6,6 +6,7 @@ #include #include #include +#include struct route_query; @@ -18,7 +19,8 @@ const char *default_routes(const tal_t *ctx, struct route_query *rq, struct amount_msat amount, struct amount_msat maxfee, u32 finalcltv, u32 maxdelay, size_t maxparts, struct flow ***flows, - double *probability); + double *probability, + enum jsonrpc_errcode *ecode); /* A wrapper to the single-path constrained solver. */ const char *single_path_routes(const tal_t *ctx, struct route_query *rq, @@ -28,6 +30,7 @@ const char *single_path_routes(const tal_t *ctx, struct route_query *rq, struct amount_msat amount, struct amount_msat maxfee, u32 finalcltv, u32 maxdelay, struct flow ***flows, - double *probability); + double *probability, + enum jsonrpc_errcode *ecode); #endif /* LIGHTNING_PLUGINS_ASKRENE_CHILD_MCF_H */ diff --git a/plugins/bkpr/test/run-currencyrate_str.c b/plugins/bkpr/test/run-currencyrate_str.c index b19a5ba32f4c..7902d0fc72fd 100644 --- a/plugins/bkpr/test/run-currencyrate_str.c +++ b/plugins/bkpr/test/run-currencyrate_str.c @@ -101,7 +101,6 @@ void command_log(struct command *cmd UNNEEDED, enum log_level level UNNEEDED, { fprintf(stderr, "command_log called!\n"); abort(); } /* Generated stub for command_param_failed */ struct command_result *command_param_failed(void) - { fprintf(stderr, "command_param_failed called!\n"); abort(); } /* Generated stub for command_set_usage */ void command_set_usage(struct command *cmd UNNEEDED, const char *usage UNNEEDED) @@ -260,7 +259,8 @@ struct out_req *jsonrpc_request_start_(struct command *cmd UNNEEDED, const char *buf UNNEEDED, const jsmntok_t *result UNNEEDED, void *arg) UNNEEDED, - void *arg UNNEEDED) + void *arg) + { fprintf(stderr, "jsonrpc_request_start_ called!\n"); abort(); } /* Generated stub for jsonrpc_request_sync */ const jsmntok_t *jsonrpc_request_sync(const tal_t *ctx UNNEEDED, diff --git a/plugins/commando.c b/plugins/commando.c index d0d2e91c8bd0..a256f0b0f8ad 100644 --- a/plugins/commando.c +++ b/plugins/commando.c @@ -102,8 +102,7 @@ static void append_contents(struct commando *commando, const u8 *msg, size_t msg return; } - tal_resize(&commando->contents, len + msglen); - memcpy(commando->contents + len, msg, msglen); + tal_arr_appendn(&commando->contents, msg, msglen); } struct reply { diff --git a/plugins/keysend.c b/plugins/keysend.c index 92246bec65b9..99495373d4d5 100644 --- a/plugins/keysend.c +++ b/plugins/keysend.c @@ -296,7 +296,8 @@ static struct command_result *json_keysend(struct command *cmd, const char *buf, static const struct plugin_command commands[] = { { "keysend", - json_keysend + json_keysend, + "v26.06", "v27.03", }, }; diff --git a/plugins/offers_inv_hook.c b/plugins/offers_inv_hook.c index ff2014e339e1..3e5d6cc1fa74 100644 --- a/plugins/offers_inv_hook.c +++ b/plugins/offers_inv_hook.c @@ -194,9 +194,9 @@ static struct command_result *listinvreqs_done(struct command *cmd, fmt_amount_msat(tmpctx, amt), fmt_sha256(tmpctx, &inv->invreq_id)); - req = jsonrpc_request_start(cmd, "pay", + req = jsonrpc_request_start(cmd, "xpay", pay_done, pay_error, inv); - json_add_string(req->js, "bolt11", invoice_encode(tmpctx, inv->inv)); + json_add_string(req->js, "invstring", invoice_encode(tmpctx, inv->inv)); json_add_sha256(req->js, "localinvreqid", &inv->invreq_id); return send_outreq(req); } diff --git a/plugins/pay.c b/plugins/pay.c index 64bc4879cfae..f13d5ff93cce 100644 --- a/plugins/pay.c +++ b/plugins/pay.c @@ -228,393 +228,6 @@ static struct command_result *json_paystatus(struct command *cmd, return command_finished(cmd, ret); } -static bool attempt_ongoing(const struct sha256 *payment_hash) -{ - struct payment *root; - struct payment_tree_result res; - enum payment_step diff, - final_states = PAYMENT_STEP_FAILED | PAYMENT_STEP_SUCCESS; - - list_for_each(&payments, root, list) { - if (!sha256_eq(payment_hash, root->payment_hash)) - continue; - res = payment_collect_result(root); - diff = res.leafstates & ~final_states; - return diff != 0; - } - return false; -} - -/* A unique key for each payment attempt, even if the same invoice was - * attempted multiple times. */ -struct pay_sort_key { - const struct sha256 *payment_hash; - u64 groupid; -}; - -/* We consolidate multi-part payments into a single entry. */ -struct pay_mpp { - /* payment_hash from the invoice and lookup key */ - const struct sha256 *payment_hash; - - /* This is the bolt11/bolt12 string */ - const char *invstring; - - /* Accumulated states of all sendpay commands involved. */ - enum payment_result_state state; - - /* Optional label (of first one!) */ - const jsmntok_t *label; - /* Optional description (used for bolt11 with description_hash) */ - const jsmntok_t *description; - /* Optional preimage (iff status is successful) */ - const jsmntok_t *preimage; - /* Only counts "complete" or "pending" payments. */ - size_t num_nonfailed_parts; - /* Total amount sent ("complete" or "pending" only). */ - struct amount_msat amount_sent; - - /* Total amount received by the recipient ("complete" or "pending" - * only). Null if we have any part for which we didn't know the - * amount. */ - struct amount_msat *amount; - - /* Timestamp of the first part */ - u32 timestamp; - - /* Completion timestamp. The lowest `completed_at` value for a - * successful part. */ - u64 success_at; - - /* The destination of the payment, if specified. */ - const jsmntok_t *destination; - - /* Which sendpay group is this? Necessary for invoices that have been - * attempted multiple times. */ - struct pay_sort_key sortkey; - - /* 1-based index indicating order this payment was created in. */ - u64 created_index; - /* 1-based index indicating order this payment was changed - * (only present if it has changed since creation). */ - u64 updated_index; -}; - -static const struct pay_sort_key *pay_mpp_key(const struct pay_mpp *pm) -{ - return &pm->sortkey; -} - -static size_t pay_mpp_hash(const struct pay_sort_key *key) -{ - struct siphash24_ctx ctx; - siphash24_init(&ctx, siphash_seed()); - siphash24_update(&ctx, key->payment_hash, sizeof(struct sha256)); - siphash24_update(&ctx, &key->groupid, sizeof(u64)); - return siphash24_done(&ctx); -} - -static bool pay_mpp_eq(const struct pay_mpp *pm, const struct pay_sort_key *key) -{ - return sha256_eq(pm->sortkey.payment_hash, key->payment_hash) - && pm->sortkey.groupid == key->groupid; -} - -HTABLE_DEFINE_NODUPS_TYPE(struct pay_mpp, pay_mpp_key, pay_mpp_hash, pay_mpp_eq, - pay_map); - -static void add_amount_sent(struct plugin *p, - const char *invstring, - struct pay_mpp *mpp, - const char *buf, - const jsmntok_t *t) -{ - struct amount_msat sent, recv; - const jsmntok_t *msattok; - - - json_to_msat(buf, json_get_member(buf, t, "amount_sent_msat"), &sent); - if (!amount_msat_accumulate(&mpp->amount_sent, sent)) - plugin_log(p, LOG_BROKEN, - "Cannot add amount_sent_msat for %s: %s + %s", - invstring, - fmt_amount_msat(tmpctx, mpp->amount_sent), - fmt_amount_msat(tmpctx, sent)); - - msattok = json_get_member(buf, t, "amount_msat"); - - /* If this is an unannotated partial payment we drop out estimate for - * all parts. */ - if (msattok == NULL) { - mpp->amount = tal_free(mpp->amount); - return; - } - - /* If we had a part of this multi-part payment for which we don't know - * the amount, then this is NULL. No point in summing up if we don't - * have the exact value.*/ - if (mpp->amount == NULL) - return; - - if (!json_to_msat(buf, msattok, &recv)) - plugin_err(p, "Cannot convert amount_sat %.*s", - json_tok_full_len(msattok), - json_tok_full(buf, msattok)); - - if (!amount_msat_accumulate(mpp->amount, recv)) - plugin_log(p, LOG_BROKEN, - "Cannot add amount_msat for %s: %s + %s", - invstring, - fmt_amount_msat(tmpctx, *mpp->amount), - fmt_amount_msat(tmpctx, sent)); -} - -static void add_new_entry(struct json_stream *ret, - const char *buf, - const struct pay_mpp *pm) -{ - json_object_start(ret, NULL); - if (pm->invstring) - json_add_invstring(ret, pm->invstring); - if (pm->description) - json_add_tok(ret, "description", pm->description, buf); - if (pm->destination) - json_add_tok(ret, "destination", pm->destination, buf); - - json_add_sha256(ret, "payment_hash", pm->payment_hash); - - if (pm->state & PAYMENT_COMPLETE) - json_add_string(ret, "status", "complete"); - else if (pm->state & PAYMENT_PENDING || attempt_ongoing(pm->payment_hash)) - json_add_string(ret, "status", "pending"); - else - json_add_string(ret, "status", "failed"); - - json_add_u32(ret, "created_at", pm->timestamp); - - if (pm->success_at < UINT64_MAX) - json_add_u64(ret, "completed_at", pm->success_at); - - if (pm->label) - json_add_tok(ret, "label", pm->label, buf); - if (pm->preimage) - json_add_tok(ret, "preimage", pm->preimage, buf); - - /* This is only tallied for pending and successful payments, not - * failures. */ - if (pm->amount != NULL && pm->num_nonfailed_parts > 0) - json_add_amount_msat(ret, "amount_msat", *pm->amount); - - json_add_amount_msat(ret, "amount_sent_msat", pm->amount_sent); - - if (pm->num_nonfailed_parts > 1) - json_add_u64(ret, "number_of_parts", - pm->num_nonfailed_parts); - - json_add_u64(ret, "created_index", pm->created_index); - - if(pm->updated_index) - json_add_u64(ret, "updated_index", pm->updated_index); - json_object_end(ret); -} - -static struct command_result *listsendpays_done(struct command *cmd, - const char *method, - const char *buf, - const jsmntok_t *result, - char *invstring) -{ - size_t i; - const jsmntok_t *t, *arr; - struct json_stream *ret; - struct pay_map *pay_map; - struct pay_mpp *pm; - struct pay_sort_key *order = tal_arr(tmpctx, struct pay_sort_key, 0); - - pay_map = tal(cmd, struct pay_map); - pay_map_init(pay_map); - - arr = json_get_member(buf, result, "payments"); - if (!arr || arr->type != JSMN_ARRAY) - return command_fail(cmd, LIGHTNINGD, - "Unexpected non-array result from listsendpays"); - - json_for_each_arr(i, t, arr) { - const jsmntok_t *status, *invstrtok, *hashtok, *createdtok, - *completedtok, *grouptok, *created_indextok, *updated_indextok; - const char *invstr = invstring; - struct sha256 payment_hash; - u32 created_at; - u64 completed_at; - u64 groupid; - struct pay_sort_key key; - u64 created_index; - u64 updated_index; - - invstrtok = json_get_member(buf, t, "bolt11"); - if (!invstrtok) - invstrtok = json_get_member(buf, t, "bolt12"); - hashtok = json_get_member(buf, t, "payment_hash"); - createdtok = json_get_member(buf, t, "created_at"); - completedtok = json_get_member(buf, t, "completed_at"); - assert(hashtok != NULL); - assert(createdtok != NULL); - - if (completedtok != NULL) - json_to_u64(buf, completedtok, &completed_at); - else - completed_at = UINT64_MAX; - - grouptok = json_get_member(buf, t, "groupid"); - if (grouptok != NULL) - json_to_u64(buf, grouptok, &groupid); - else - groupid = 0; - - json_to_sha256(buf, hashtok, &payment_hash); - json_to_u32(buf, createdtok, &created_at); - if (invstrtok) - invstr = json_strdup(cmd, buf, invstrtok); - - key.payment_hash = &payment_hash; - key.groupid = groupid; - - created_indextok = json_get_member(buf, t, "created_index"); - updated_indextok = json_get_member(buf, t, "updated_index"); - assert(created_indextok != NULL); - json_to_u64(buf, created_indextok, &created_index); - if (updated_indextok != NULL) - json_to_u64(buf, updated_indextok, &updated_index); - else - updated_index = 0; - - pm = pay_map_get(pay_map, &key); - if (!pm) { - pm = tal(cmd, struct pay_mpp); - pm->state = 0; - pm->payment_hash = tal_dup(pm, struct sha256, &payment_hash); - pm->invstring = tal_steal(pm, invstr); - pm->destination = json_get_member(buf, t, "destination"); - pm->label = json_get_member(buf, t, "label"); - pm->description = json_get_member(buf, t, "description"); - pm->preimage = NULL; - pm->amount_sent = AMOUNT_MSAT(0); - pm->amount = talz(pm, struct amount_msat); - pm->num_nonfailed_parts = 0; - pm->timestamp = created_at; - pm->sortkey.payment_hash = pm->payment_hash; - pm->sortkey.groupid = groupid; - pm->success_at = UINT64_MAX; - pm->created_index = created_index; - pm->updated_index = updated_index; - pay_map_add(pay_map, pm); - // First time we see the groupid we add it to the order - // array, so we can retrieve them in the correct order. - tal_arr_expand(&order, pm->sortkey); - } else { - /* Not all payments have bolt11/bolt12 or - * description, as an optimization */ - if (!pm->invstring) - pm->invstring = tal_steal(pm, invstr); - if (!pm->description) - pm->description = json_get_member(buf, t, "description"); - /* What's the "created_index" of the merged record? - * We take the *lowest*, since that will never change - * (unless they delete payments!). */ - if (created_index < pm->created_index) - pm->created_index = created_index; - /* On the other hand, we take the *highest* - * updated_index, so we see any changes. */ - if (updated_index > pm->updated_index) - pm->updated_index = updated_index; - } - - status = json_get_member(buf, t, "status"); - if (json_tok_streq(buf, status, "complete")) { - add_amount_sent(cmd->plugin, pm->invstring, pm, buf, t); - pm->num_nonfailed_parts++; - pm->preimage - = json_get_member(buf, t, "payment_preimage"); - pm->state |= PAYMENT_COMPLETE; - - /* We count down from UINT64_MAX. */ - if (pm->success_at > completed_at) - pm->success_at = completed_at; - - } else if (json_tok_streq(buf, status, "pending")) { - add_amount_sent(cmd->plugin, pm->invstring, pm, buf, t); - pm->num_nonfailed_parts++; - pm->state |= PAYMENT_PENDING; - } else { - pm->state |= PAYMENT_FAILED; - } - } - - ret = jsonrpc_stream_success(cmd); - json_array_start(ret, "pays"); - for (i = 0; i < tal_count(order); i++) { - pm = pay_map_get(pay_map, &order[i]); - assert(pm != NULL); - add_new_entry(ret, buf, pm); - } - json_array_end(ret); - return command_finished(cmd, ret); -} - -static struct command_result *json_listpays(struct command *cmd, - const char *buf, - const jsmntok_t *params) -{ - const char *invstring, *status_str; - struct sha256 *payment_hash; - struct out_req *req; - const char *listindex; - u64 *liststart; - u32 *listlimit; - - /* FIXME: would be nice to parse as a bolt11 so check worked in future */ - if (!param(cmd, buf, params, - /* FIXME: parameter should be invstring now */ - p_opt("bolt11", param_invstring, &invstring), - p_opt("payment_hash", param_sha256, &payment_hash), - p_opt("status", param_string, &status_str), - p_opt("index", param_string, &listindex), - p_opt_def("start", param_u64, &liststart, 0), - p_opt("limit", param_u32, &listlimit), - NULL)) - return command_param_failed(); - - if (*liststart != 0 && !listindex) { - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "Can only specify {start} with {index}"); - } - if (listlimit && !listindex) { - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "Can only specify {limit} with {index}"); - } - - req = jsonrpc_request_start(cmd, "listsendpays", - listsendpays_done, forward_error, - cast_const(char *, invstring)); - if (invstring) - json_add_string(req->js, "bolt11", invstring); - - if (payment_hash) - json_add_sha256(req->js, "payment_hash", payment_hash); - - if (status_str) - json_add_string(req->js, "status", status_str); - - if (listindex){ - json_add_string(req->js, "index", listindex); - if (liststart) - json_add_u64(req->js, "start", *liststart); - if (listlimit) - json_add_u32(req->js, "limit", *listlimit); - } - return send_outreq(req); -} - static void memleak_mark_payments(struct plugin *p, struct htable *memtable) { memleak_scan_list_head(memtable, &payments); @@ -1274,6 +887,7 @@ static struct command_result *json_pay(struct command *cmd, struct out_req *req; struct route_exclusion **exclusions; bool *dev_use_shadow; + bool use_invstring; /* If any of the modifiers need to add params to the JSON-RPC call we * would add them to the `param()` call below, and have them be @@ -1285,9 +899,10 @@ static struct command_result *json_pay(struct command *cmd, * deployed by Lightning implementations. */ /* FIXME: Typo in spec for CLTV in descripton! But it breaks our spelling check, so we omit it above */ + /* We accept invstring, too (and use it in the help message) */ + use_invstring = (!params || (params->type == JSMN_OBJECT && json_get_member(buf, params, "invstring"))); if (!param_check(cmd, buf, params, - /* FIXME: parameter should be invstring now */ - p_req("bolt11", param_invstring, &b11str), + p_req_var(use_invstring ? "invstring" : "bolt11", param_invstring, &b11str), p_opt("amount_msat", param_msat, &msat), p_opt("label", param_string, &label), p_opt_def("riskfactor", param_millionths, @@ -1307,6 +922,12 @@ static struct command_result *json_pay(struct command *cmd, NULL)) return command_param_failed(); + /* We can't just mark this command deprecated, as that prevents + * xpay from overriding (lightningd stops it first!) */ + if (!command_deprecated_in_ok(cmd, NULL, "v26.06", "v27.03")) + return command_fail(cmd, JSONRPC2_METHOD_NOT_FOUND, + "Command \"pay\" is deprecated"); + p = payment_new(cmd, cmd, NULL /* No parent */, global_hints, paymod_mods); p->invstring = tal_steal(p, b11str); p->description = tal_steal(p, description); @@ -1542,10 +1163,8 @@ static struct command_result *handle_channel_hint_update(struct command *cmd, static const struct plugin_command commands[] = { { "paystatus", - json_paystatus - }, { - "listpays", - json_listpays + json_paystatus, + "v26.06", "v27.03", }, { "pay", diff --git a/plugins/renepay/main.c b/plugins/renepay/main.c index 8c2d72e09c27..71276041b175 100644 --- a/plugins/renepay/main.c +++ b/plugins/renepay/main.c @@ -445,11 +445,13 @@ static struct command_result *json_renepay(struct command *cmd, const char *buf, static const struct plugin_command commands[] = { { "renepaystatus", - json_renepaystatus + json_renepaystatus, + "v26.06", "v27.03", }, { "renepay", - json_renepay + json_renepay, + "v26.06", "v27.03", }, }; diff --git a/plugins/topology.c b/plugins/topology.c index 5990bbe752f2..8c1ba598cdb9 100644 --- a/plugins/topology.c +++ b/plugins/topology.c @@ -616,6 +616,7 @@ static const struct plugin_command commands[] = { { "getroute", json_getroute, + "v26.06", "v27.03", }, { "listchannels", diff --git a/plugins/xpay/Makefile b/plugins/xpay/Makefile index 922d3a171e0e..33f22eb117b2 100644 --- a/plugins/xpay/Makefile +++ b/plugins/xpay/Makefile @@ -1,4 +1,5 @@ PLUGIN_XPAY_SRC := \ + plugins/xpay/listpays.c \ plugins/xpay/xpay.c PLUGIN_XPAY_HDRS := diff --git a/plugins/xpay/listpays.c b/plugins/xpay/listpays.c new file mode 100644 index 000000000000..e1c9de5a8a11 --- /dev/null +++ b/plugins/xpay/listpays.c @@ -0,0 +1,390 @@ +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* A unique key for each payment attempt, even if the same invoice was + * attempted multiple times. */ +struct pay_sort_key { + const struct sha256 *payment_hash; + u64 groupid; +}; + +enum payment_result_state { + PAYMENT_PENDING = 1, + PAYMENT_COMPLETE = 2, + PAYMENT_FAILED = 4, +}; + +/* We consolidate multi-part payments into a single entry. */ +struct pay_mpp { + /* payment_hash from the invoice and lookup key */ + const struct sha256 *payment_hash; + + /* This is the bolt11/bolt12 string */ + const char *invstring; + + /* Accumulated states of all sendpay commands involved. */ + enum payment_result_state state; + + /* Optional label (of first one!) */ + const jsmntok_t *label; + /* Optional description (used for bolt11 with description_hash) */ + const jsmntok_t *description; + /* Optional preimage (iff status is successful) */ + const jsmntok_t *preimage; + /* Only counts "complete" or "pending" payments. */ + size_t num_nonfailed_parts; + /* Total amount sent ("complete" or "pending" only). */ + struct amount_msat amount_sent; + + /* Total amount received by the recipient ("complete" or "pending" + * only). Null if we have any part for which we didn't know the + * amount. */ + struct amount_msat *amount; + + /* Timestamp of the first part */ + u32 timestamp; + + /* Completion timestamp. The lowest `completed_at` value for a + * successful part. */ + u64 success_at; + + /* The destination of the payment, if specified. */ + const jsmntok_t *destination; + + /* Which sendpay group is this? Necessary for invoices that have been + * attempted multiple times. */ + struct pay_sort_key sortkey; + + /* 1-based index indicating order this payment was created in. */ + u64 created_index; + /* 1-based index indicating order this payment was changed + * (only present if it has changed since creation). */ + u64 updated_index; +}; + +static const struct pay_sort_key *pay_mpp_key(const struct pay_mpp *pm) +{ + return &pm->sortkey; +} + +static size_t pay_mpp_hash(const struct pay_sort_key *key) +{ + struct siphash24_ctx ctx; + siphash24_init(&ctx, siphash_seed()); + siphash24_update(&ctx, key->payment_hash, sizeof(struct sha256)); + siphash24_update(&ctx, &key->groupid, sizeof(u64)); + return siphash24_done(&ctx); +} + +static bool pay_mpp_eq(const struct pay_mpp *pm, const struct pay_sort_key *key) +{ + return sha256_eq(pm->sortkey.payment_hash, key->payment_hash) + && pm->sortkey.groupid == key->groupid; +} + +HTABLE_DEFINE_NODUPS_TYPE(struct pay_mpp, pay_mpp_key, pay_mpp_hash, pay_mpp_eq, + pay_map); + +static void add_amount_sent(struct plugin *p, + const char *invstring, + struct pay_mpp *mpp, + const char *buf, + const jsmntok_t *t) +{ + struct amount_msat sent, recv; + const jsmntok_t *msattok; + + + json_to_msat(buf, json_get_member(buf, t, "amount_sent_msat"), &sent); + if (!amount_msat_accumulate(&mpp->amount_sent, sent)) + plugin_log(p, LOG_BROKEN, + "Cannot add amount_sent_msat for %s: %s + %s", + invstring, + fmt_amount_msat(tmpctx, mpp->amount_sent), + fmt_amount_msat(tmpctx, sent)); + + msattok = json_get_member(buf, t, "amount_msat"); + + /* If this is an unannotated partial payment we drop out estimate for + * all parts. */ + if (msattok == NULL) { + mpp->amount = tal_free(mpp->amount); + return; + } + + /* If we had a part of this multi-part payment for which we don't know + * the amount, then this is NULL. No point in summing up if we don't + * have the exact value.*/ + if (mpp->amount == NULL) + return; + + if (!json_to_msat(buf, msattok, &recv)) + plugin_err(p, "Cannot convert amount_sat %.*s", + json_tok_full_len(msattok), + json_tok_full(buf, msattok)); + + if (!amount_msat_accumulate(mpp->amount, recv)) + plugin_log(p, LOG_BROKEN, + "Cannot add amount_msat for %s: %s + %s", + invstring, + fmt_amount_msat(tmpctx, *mpp->amount), + fmt_amount_msat(tmpctx, sent)); +} + +static void add_new_entry(struct plugin *plugin, + struct json_stream *ret, + const char *buf, + const struct pay_mpp *pm) +{ + json_object_start(ret, NULL); + if (pm->invstring) + json_add_invstring(ret, pm->invstring); + if (pm->description) + json_add_tok(ret, "description", pm->description, buf); + if (pm->destination) + json_add_tok(ret, "destination", pm->destination, buf); + + json_add_sha256(ret, "payment_hash", pm->payment_hash); + + if (pm->state & PAYMENT_COMPLETE) + json_add_string(ret, "status", "complete"); + else if (pm->state & PAYMENT_PENDING || attempt_ongoing(plugin, pm->payment_hash)) + json_add_string(ret, "status", "pending"); + else + json_add_string(ret, "status", "failed"); + + json_add_u32(ret, "created_at", pm->timestamp); + + if (pm->success_at < UINT64_MAX) + json_add_u64(ret, "completed_at", pm->success_at); + + if (pm->label) + json_add_tok(ret, "label", pm->label, buf); + if (pm->preimage) + json_add_tok(ret, "preimage", pm->preimage, buf); + + /* This is only tallied for pending and successful payments, not + * failures. */ + if (pm->amount != NULL && pm->num_nonfailed_parts > 0) + json_add_amount_msat(ret, "amount_msat", *pm->amount); + + json_add_amount_msat(ret, "amount_sent_msat", pm->amount_sent); + + if (pm->num_nonfailed_parts > 1) + json_add_u64(ret, "number_of_parts", + pm->num_nonfailed_parts); + + json_add_u64(ret, "created_index", pm->created_index); + + if(pm->updated_index) + json_add_u64(ret, "updated_index", pm->updated_index); + json_object_end(ret); +} + +static struct command_result *listsendpays_done(struct command *cmd, + const char *method, + const char *buf, + const jsmntok_t *result, + char *invstring) +{ + size_t i; + const jsmntok_t *t, *arr; + struct json_stream *ret; + struct pay_map *pay_map; + struct pay_mpp *pm; + struct pay_sort_key *order = tal_arr(tmpctx, struct pay_sort_key, 0); + + pay_map = tal(cmd, struct pay_map); + pay_map_init(pay_map); + + arr = json_get_member(buf, result, "payments"); + if (!arr || arr->type != JSMN_ARRAY) + return command_fail(cmd, LIGHTNINGD, + "Unexpected non-array result from listsendpays"); + + json_for_each_arr(i, t, arr) { + const jsmntok_t *status, *invstrtok, *hashtok, *createdtok, + *completedtok, *grouptok, *created_indextok, *updated_indextok; + const char *invstr = invstring; + struct sha256 payment_hash; + u32 created_at; + u64 completed_at; + u64 groupid; + struct pay_sort_key key; + u64 created_index; + u64 updated_index; + + invstrtok = json_get_member(buf, t, "bolt11"); + if (!invstrtok) + invstrtok = json_get_member(buf, t, "bolt12"); + hashtok = json_get_member(buf, t, "payment_hash"); + createdtok = json_get_member(buf, t, "created_at"); + completedtok = json_get_member(buf, t, "completed_at"); + assert(hashtok != NULL); + assert(createdtok != NULL); + + if (completedtok != NULL) + json_to_u64(buf, completedtok, &completed_at); + else + completed_at = UINT64_MAX; + + grouptok = json_get_member(buf, t, "groupid"); + if (grouptok != NULL) + json_to_u64(buf, grouptok, &groupid); + else + groupid = 0; + + json_to_sha256(buf, hashtok, &payment_hash); + json_to_u32(buf, createdtok, &created_at); + if (invstrtok) + invstr = json_strdup(cmd, buf, invstrtok); + + key.payment_hash = &payment_hash; + key.groupid = groupid; + + created_indextok = json_get_member(buf, t, "created_index"); + updated_indextok = json_get_member(buf, t, "updated_index"); + assert(created_indextok != NULL); + json_to_u64(buf, created_indextok, &created_index); + if (updated_indextok != NULL) + json_to_u64(buf, updated_indextok, &updated_index); + else + updated_index = 0; + + pm = pay_map_get(pay_map, &key); + if (!pm) { + pm = tal(cmd, struct pay_mpp); + pm->state = 0; + pm->payment_hash = tal_dup(pm, struct sha256, &payment_hash); + pm->invstring = tal_steal(pm, invstr); + pm->destination = json_get_member(buf, t, "destination"); + pm->label = json_get_member(buf, t, "label"); + pm->description = json_get_member(buf, t, "description"); + pm->preimage = NULL; + pm->amount_sent = AMOUNT_MSAT(0); + pm->amount = talz(pm, struct amount_msat); + pm->num_nonfailed_parts = 0; + pm->timestamp = created_at; + pm->sortkey.payment_hash = pm->payment_hash; + pm->sortkey.groupid = groupid; + pm->success_at = UINT64_MAX; + pm->created_index = created_index; + pm->updated_index = updated_index; + pay_map_add(pay_map, pm); + // First time we see the groupid we add it to the order + // array, so we can retrieve them in the correct order. + tal_arr_expand(&order, pm->sortkey); + } else { + /* Not all payments have bolt11/bolt12 or + * description, as an optimization */ + if (!pm->invstring) + pm->invstring = tal_steal(pm, invstr); + if (!pm->description) + pm->description = json_get_member(buf, t, "description"); + /* What's the "created_index" of the merged record? + * We take the *lowest*, since that will never change + * (unless they delete payments!). */ + if (created_index < pm->created_index) + pm->created_index = created_index; + /* On the other hand, we take the *highest* + * updated_index, so we see any changes. */ + if (updated_index > pm->updated_index) + pm->updated_index = updated_index; + } + + status = json_get_member(buf, t, "status"); + if (json_tok_streq(buf, status, "complete")) { + add_amount_sent(cmd->plugin, pm->invstring, pm, buf, t); + pm->num_nonfailed_parts++; + pm->preimage + = json_get_member(buf, t, "payment_preimage"); + pm->state |= PAYMENT_COMPLETE; + + /* We count down from UINT64_MAX. */ + if (pm->success_at > completed_at) + pm->success_at = completed_at; + + } else if (json_tok_streq(buf, status, "pending")) { + add_amount_sent(cmd->plugin, pm->invstring, pm, buf, t); + pm->num_nonfailed_parts++; + pm->state |= PAYMENT_PENDING; + } else { + pm->state |= PAYMENT_FAILED; + } + } + + ret = jsonrpc_stream_success(cmd); + json_array_start(ret, "pays"); + for (i = 0; i < tal_count(order); i++) { + pm = pay_map_get(pay_map, &order[i]); + assert(pm != NULL); + add_new_entry(cmd->plugin, ret, buf, pm); + } + json_array_end(ret); + return command_finished(cmd, ret); +} + +struct command_result *json_listpays(struct command *cmd, + const char *buf, + const jsmntok_t *params) +{ + const char *invstring, *status_str; + struct sha256 *payment_hash; + struct out_req *req; + const char *listindex; + u64 *liststart; + u32 *listlimit; + + /* FIXME: would be nice to parse as a bolt11 so check worked in future */ + if (!param(cmd, buf, params, + /* FIXME: parameter should be invstring now */ + p_opt("bolt11", param_invstring, &invstring), + p_opt("payment_hash", param_sha256, &payment_hash), + p_opt("status", param_string, &status_str), + p_opt("index", param_string, &listindex), + p_opt_def("start", param_u64, &liststart, 0), + p_opt("limit", param_u32, &listlimit), + NULL)) + return command_param_failed(); + + if (*liststart != 0 && !listindex) { + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Can only specify {start} with {index}"); + } + if (listlimit && !listindex) { + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Can only specify {limit} with {index}"); + } + + req = jsonrpc_request_start(cmd, "listsendpays", + listsendpays_done, forward_error, + cast_const(char *, invstring)); + if (invstring) + json_add_string(req->js, "bolt11", invstring); + + if (payment_hash) + json_add_sha256(req->js, "payment_hash", payment_hash); + + if (status_str) + json_add_string(req->js, "status", status_str); + + if (listindex){ + json_add_string(req->js, "index", listindex); + if (liststart) + json_add_u64(req->js, "start", *liststart); + if (listlimit) + json_add_u32(req->js, "limit", *listlimit); + } + return send_outreq(req); +} diff --git a/plugins/xpay/listpays.h b/plugins/xpay/listpays.h new file mode 100644 index 000000000000..9c06b2f827e6 --- /dev/null +++ b/plugins/xpay/listpays.h @@ -0,0 +1,13 @@ +#ifndef LIGHTNING_PLUGINS_XPAY_LISTPAYS_H +#define LIGHTNING_PLUGINS_XPAY_LISTPAYS_H +#include "config.h" +#include + +struct command; + +/* listpays was in the original pay plugin: with those functions deprecated, + * we moved it into xpay for want of a better home */ +struct command_result *json_listpays(struct command *cmd, + const char *buf, + const jsmntok_t *params); +#endif /* LIGHTNING_PLUGINS_XPAY_LISTPAYS_H */ diff --git a/plugins/xpay/xpay.c b/plugins/xpay/xpay.c index 43f76d971838..d7655f77ea62 100644 --- a/plugins/xpay/xpay.c +++ b/plugins/xpay/xpay.c @@ -19,16 +19,24 @@ #include #include #include +#include #include #include #include #include #include +#include +#include #include +#define PREIMAGE_TLV_TYPE 5482373484 + /* For the whole plugin */ struct xpay { + /* This is me. */ struct pubkey local_id; + /* These are my struct payments */ + struct list_head payments; /* Access via get_gossmap() */ struct gossmap *global_gossmap; /* Creates unique layer names */ @@ -59,6 +67,8 @@ static struct gossmap *get_gossmap(struct xpay *xpay) /* The unifies bolt11 and bolt12 handling */ struct payment { + /* Inside xpay->payments */ + struct list_node list; struct plugin *plugin; /* Stop sending new payments after this */ struct timemono deadline; @@ -69,7 +79,7 @@ struct payment { struct command *cmd; /* Unique id */ u64 unique_id; - /* For logging, and for sendpays */ + /* For logging, and for sendpays: NULL for xkeysend! */ const char *invstring; /* Explicit layers they told us to include */ const char **layers; @@ -83,12 +93,14 @@ struct payment { struct amount_msat full_amount; /* Maximum fee we're prepare to pay */ struct amount_msat maxfee; + /* local invreqid to asociate with this payment, for atomicity. */ + const struct sha256 *localinvreqid; + /* Optional label the user wants attached to these payments. */ + const struct json_escape *label; /* Maximum delay on the route we're ok with */ u32 maxdelay; /* If non-zero: maximum number of payment routes that can be pending. */ u32 maxparts; - /* Do we have to do it all in a single part? */ - bool disable_mpp; /* BOLT-11 payment secret (NULL for BOLT-12, it uses blinded paths) */ const struct secret *payment_secret; /* BOLT-11 payment metadata (NULL for BOLT-12, it uses blinded paths) */ @@ -112,6 +124,9 @@ struct payment { struct blinded_path **paths; struct blinded_payinfo **payinfos; + /* Any extra tlvs to include in final payload (keysend) */ + const u8 *extra_tlvs; + /* Current attempts, waiting for injectpaymentonion. */ struct list_head current_attempts; @@ -132,6 +147,9 @@ struct payment { bool pay_compat; /* When did we start? */ struct timeabs start_time; + + /* Are we to add a shadow route? */ + bool use_shadow; }; /* One step in a path. */ @@ -181,6 +199,9 @@ static struct command_result *xpay_core(struct command *cmd, u32 retryfor, const struct amount_msat *partial, u32 maxdelay, + const struct json_escape *label, + const struct sha256 *local_invreq_id, + bool use_shadow, bool as_pay); /* Wrapper for pending commands (ignores return) */ @@ -645,6 +666,200 @@ static u32 error_blockheight(const u8 *errmsg) return height; } +/* Return true if this contained a channel_update which (potentially) changed something. */ +static bool process_channel_update_from_onion_error(struct command *aux_cmd, + struct attempt *attempt, + const u8 *onion_message, + const char *errname) +{ + u8 *channel_update; + struct amount_msat unused_msat; + u32 unused32; + secp256k1_ecdsa_signature signature; + struct bitcoin_blkid chain_hash; + struct short_channel_id_dir scidd; + u32 timestamp; + u8 message_flags, channel_flags; + u16 cltv_expiry_delta; + struct amount_msat htlc_minimum_msat, htlc_maximum_msat; + u32 fee_base_msat, fee_proportional_millionths; + struct out_req *req; + const struct gossmap *gossmap; + const struct gossmap_chan *c; + + /* Identify failcodes that have some channel_update. + * + * TODO > BOLT 1.0: Add new failcodes when updating to a + * new BOLT version. */ + if (!fromwire_temporary_channel_failure(tmpctx, + onion_message, + &channel_update) && + !fromwire_amount_below_minimum(tmpctx, + onion_message, &unused_msat, + &channel_update) && + !fromwire_fee_insufficient(tmpctx, + onion_message, &unused_msat, + &channel_update) && + !fromwire_incorrect_cltv_expiry(tmpctx, + onion_message, &unused32, + &channel_update) && + !fromwire_expiry_too_soon(tmpctx, + onion_message, + &channel_update)) + /* No channel update. */ + return false; + + /* LND before v0.18 (May 2024) would not include the + * WIRE_CHANNEL_UPDATE type field, but now they do. */ + if (!fromwire_channel_update(channel_update, + &signature, + &chain_hash, + &scidd.scid, + ×tamp, + &message_flags, + &channel_flags, + &cltv_expiry_delta, + &htlc_minimum_msat, + &fee_base_msat, + &fee_proportional_millionths, + &htlc_maximum_msat)) + return false; + + scidd.dir = (channel_flags & ROUTING_FLAGS_DIRECTION); + + /* If this is substantially the same as the one we already have, ignore it. */ + gossmap = get_gossmap(xpay_of(aux_cmd->plugin)); + c = gossmap_find_chan(gossmap, &scidd.scid); + if (c) { + const struct half_chan *hc = &c->half[scidd.dir]; + if (gossmap_chan_set(c, scidd.dir) + && hc->enabled == !(channel_flags & ROUTING_FLAGS_DISABLED) + /* We convert the same way gossmap.c does */ + && u64_to_fp16(htlc_minimum_msat.millisatoshis, false) == hc->htlc_min /* Raw: convert */ + && u64_to_fp16(htlc_maximum_msat.millisatoshis, true) == hc->htlc_max /* Raw: convert */ + && fee_base_msat == hc->base_fee + && fee_proportional_millionths == hc->proportional_fee + && cltv_expiry_delta == hc->delay) { + return false; + } + } + + attempt_log(attempt, LOG_DBG, "Got channel_update from error for %s: %s", + fmt_short_channel_id_dir(tmpctx, &scidd), + tal_hex(tmpctx, channel_update)); + + /* Update our local layer so it applies to this payment *only*. We + * don't bother checking the signature; we don't even check what + * channel it is! */ + req = payment_ignored_req(aux_cmd, attempt, "askrene-update-channel"); + json_add_string(req->js, "layer", attempt->payment->private_layer); + json_add_short_channel_id_dir(req->js, + "short_channel_id_dir", + scidd); + json_add_bool(req->js, "enabled", !(channel_flags & ROUTING_FLAGS_DISABLED)); + json_add_amount_msat(req->js, "htlc_minimum_msat", htlc_minimum_msat); + json_add_amount_msat(req->js, "htlc_maximum_msat", htlc_maximum_msat); + json_add_u32(req->js, "fee_base_msat", fee_base_msat); + json_add_u32(req->js, "fee_proportional_millionths", fee_proportional_millionths); + json_add_u32(req->js, "cltv_expiry_delta", cltv_expiry_delta); + send_payment_req(aux_cmd, attempt->payment, req); + + /* We also bias *against* the channel. This should help if the node is + * stuck somehow, or trying to track us. */ + req = payment_ignored_req(aux_cmd, attempt, "askrene-bias-channel"); + json_add_string(req->js, "layer", attempt->payment->private_layer); + json_add_short_channel_id_dir(req->js, + "short_channel_id_dir", + scidd); + json_add_s32(req->js, "bias", -1); + json_add_string(req->js, "description", + tal_fmt(tmpctx, "negative bias due to channel_update in error %s", + errname)); + json_add_bool(req->js, "relative", true); + send_payment_req(aux_cmd, attempt->payment, req); + return true; +} + +/* pay used to "work" if you asked it to pay again. */ +static struct command_result * +payment_listsendpays_previous(struct command *cmd, + const char *method, + const char *buf, + const jsmntok_t *result, + struct payment *payment) +{ + size_t i; + const jsmntok_t *t, *arr; + size_t parts = 0; + struct preimage preimage; + struct amount_msat sent, msat; + u32 created_at; + + arr = json_get_member(buf, result, "payments"); + json_for_each_arr(i, t, arr) { + const jsmntok_t *status = json_get_member(buf, t, "status"); + if (!json_tok_streq(buf, status, "complete")) + continue; + + if (parts == 0) { + json_scan(tmpctx, buf, t, + "{created_at:%" + ",amount_msat:%" + ",amount_sent_msat:%" + ",payment_preimage:%}", + JSON_SCAN(json_to_u32, &created_at), + JSON_SCAN(json_to_msat, &msat), + JSON_SCAN(json_to_msat, &sent), + JSON_SCAN(json_to_preimage, &preimage)); + } else { + struct amount_msat diff_msat, diff_sent; + json_scan(tmpctx, buf, t, + "{amount_msat:%" + ",amount_sent_msat:%}", + JSON_SCAN(json_to_msat, &diff_msat), + JSON_SCAN(json_to_msat, &diff_sent)); + if (!amount_msat_accumulate(&msat, diff_msat) || + !amount_msat_accumulate(&sent, diff_sent)) + plugin_err(cmd->plugin, + "msat overflow adding up parts"); + } + parts++; + } + + /* Avoid terminating twice */ + payment->cmd = NULL; + /* Shouldn't happen! */ + if (parts == 0) { + return command_fail(cmd, + PAY_INJECTPAYMENTONION_ALREADY_PAID, + "Already paid this invoice successfully"); + } else { + struct json_stream *js = jsonrpc_stream_success(cmd); + json_add_preimage(js, "payment_preimage", &preimage); + json_add_string(js, "status", "complete"); + json_add_amount_msat(js, "amount_msat", msat); + json_add_amount_msat(js, "amount_sent_msat", sent); + json_add_pubkey(js, "destination", &payment->destination); + json_add_sha256(js, "payment_hash", &payment->payment_hash); + json_add_u32(js, "created_at", created_at); + json_add_num(js, "parts", parts); + return command_finished(cmd, js); + } +} + +static void payment_already_paid(struct payment *payment) +{ + struct out_req *req; + + req = jsonrpc_request_start(payment->cmd, "listsendpays", + payment_listsendpays_previous, + payment_listsendpays_previous, + payment); + + json_add_sha256(req->js, "payment_hash", &payment->payment_hash); + send_outreq(req); +} + static void update_knowledge_from_error(struct command *aux_cmd, const char *buf, const jsmntok_t *error, @@ -666,8 +881,13 @@ static void update_knowledge_from_error(struct command *aux_cmd, json_tok_full_len(error), json_tok_full(buf, error)); if (ecode == PAY_INJECTPAYMENTONION_ALREADY_PAID) { + /* pay was OK when this happened, so we fake it up. */ + if (attempt->payment->pay_compat && attempt->payment->cmd) { + payment_already_paid(attempt->payment); + return; + } payment_give_up(aux_cmd, attempt->payment, - PAY_INJECTPAYMENTONION_FAILED, + PAY_INJECTPAYMENTONION_ALREADY_PAID, "Already paid this invoice successfully"); return; } @@ -725,7 +945,14 @@ static void update_knowledge_from_error(struct command *aux_cmd, send_payment_req(aux_cmd, attempt->payment, req); } - from_final = (index == tal_count(attempt->hops)); + /* Because we might include blinded paths, final node is end of route, OR destination node id */ + if (index == tal_count(attempt->hops)) { + from_final = true; + } else if (index > 0 && pubkey_eq(&attempt->hops[index-1].next_node, + &attempt->payment->destination)) { + from_final = true; + } else + from_final = false; failcode = fromwire_peektype(replymsg); failcode_name = onion_wire_name(failcode); if (strstarts(failcode_name, "WIRE_")) @@ -761,6 +988,16 @@ static void update_knowledge_from_error(struct command *aux_cmd, */ if (from_final) { switch (failcode) { + /* This is possible if we're keysending */ + case WIRE_INVALID_ONION_PAYLOAD: + if (!attempt->payment->invstring) { + payment_give_up(aux_cmd, attempt->payment, + PAY_DESTINATION_PERM_FAIL, + "Destination reported %s (likely doesn't support keysend)", + errmsg); + return; + } + /* Fall thru */ /* These two are deprecated */ case WIRE_FINAL_INCORRECT_CLTV_EXPIRY: case WIRE_FINAL_INCORRECT_HTLC_AMOUNT: @@ -769,7 +1006,6 @@ static void update_knowledge_from_error(struct command *aux_cmd, case WIRE_INVALID_ONION_VERSION: case WIRE_INVALID_ONION_HMAC: case WIRE_INVALID_ONION_KEY: - case WIRE_INVALID_ONION_PAYLOAD: /* These should not be sent by final node */ case WIRE_TEMPORARY_CHANNEL_FAILURE: @@ -819,6 +1055,15 @@ static void update_knowledge_from_error(struct command *aux_cmd, } } else { /* Non-final node */ + if (process_channel_update_from_onion_error(aux_cmd, attempt, + replymsg, errmsg)) { + add_result_summary(attempt, LOG_DBG, + "We got %s for %s, containing a channel_update:" + " updating our map", + errmsg, describe_scidd(attempt, index)); + goto check_previous_success; + } + switch (failcode) { /* These ones are weird any time (did we encode wrongly?) */ case WIRE_INVALID_ONION_VERSION: @@ -1070,6 +1315,29 @@ static void append_blinded_payloads(struct sphinx_path *sp, } } +/* hop has size prepended, so this isn't a simple "append" */ +static void hop_append(u8 **hop, const u8 *appendme) +{ + bigsize_t prepended_len; + const u8 *cursor = *hop; + size_t tlvs_len = tal_bytelen(*hop); + u8 *result; + + /* Pull off length */ + prepended_len = fromwire_bigsize(&cursor, &tlvs_len); + assert(cursor); + assert(prepended_len == tlvs_len); + + /* Rewrite: length + contents */ + result = tal_arr(tal_parent(*hop), u8, 0); + towire_bigsize(&result, tlvs_len + tal_bytelen(appendme)); + towire(&result, cursor, tlvs_len); + towire(&result, appendme, tal_bytelen(appendme)); + + tal_free(*hop); + *hop = result; +} + static const u8 *create_onion(const tal_t *ctx, struct attempt *attempt, u32 effective_bheight) @@ -1110,13 +1378,14 @@ static const u8 *create_onion(const tal_t *ctx, /* If we use a blinded path, final has to be special, so * that's done in append_blinded_payloads. */ if (!blinded_path) { - sphinx_add_hop_has_length(sp, node, - take(onion_final_hop(NULL, - attempt->delivers, - attempt->payment->final_cltv + effective_bheight, - attempt->payment->full_amount, - attempt->payment->payment_secret, - attempt->payment->payment_metadata))); + u8 *final = onion_final_hop(NULL, + attempt->delivers, + attempt->payment->final_cltv + effective_bheight, + attempt->payment->full_amount, + attempt->payment->payment_secret, + attempt->payment->payment_metadata); + hop_append(&final, attempt->payment->extra_tlvs); + sphinx_add_hop_has_length(sp, node, take(final)); } /* Fails if would be too long */ @@ -1162,8 +1431,16 @@ static struct command_result *do_inject(struct command *aux_cmd, json_add_u32(req->js, "cltv_expiry", initial_cltv_delta(attempt) + effective_bheight); json_add_u64(req->js, "partid", attempt->partid); json_add_u64(req->js, "groupid", attempt->payment->group_id); - json_add_string(req->js, "invstring", attempt->payment->invstring); + /* Use invstring for payments, destination directly for keysend */ + if (attempt->payment->invstring) + json_add_string(req->js, "invstring", attempt->payment->invstring); + else + json_add_pubkey(req->js, "destination", &attempt->payment->destination); json_add_amount_msat(req->js, "destination_msat", attempt->delivers); + if (attempt->payment->localinvreqid) + json_add_sha256(req->js, "localinvreqid", attempt->payment->localinvreqid); + if (attempt->payment->label) + json_add_escaped_string(req->js, "label", attempt->payment->label); return send_payment_req(aux_cmd, attempt->payment, req); } @@ -1208,6 +1485,72 @@ static struct attempt *new_attempt(struct payment *payment, return attempt; } +/* BOLT #7: + * + * In order to create a plausible offset, the origin node MAY start a limited + * random walk on the graph, starting from the intended recipient and summing the + * `cltv_expiry_delta`s, and use the resulting sum as the offset. + * This effectively creates a _shadow route extension_ to the actual route and + * provides better protection against this attack vector than simply picking a + * random offset would. + */ +static void add_cltv_shadow(struct payment *payment, + struct gossmap *gossmap, + struct hop *hops) +{ + struct node_id last_node; + + assert(tal_count(hops) > 0); + node_id_from_pubkey(&last_node, &hops[tal_count(hops) - 1].next_node); + + /* Coinflip up to three times to extend. */ + for (size_t i = 0; i < 3; i++) { + const struct gossmap_node *n; + const struct gossmap_chan *c; + int dir; + struct short_channel_id_dir scidd; + + if (pseudorand(2) == 0) { + payment_log(payment, LOG_DBG, "shadow #%zu: stopping", i); + break; + } + + n = gossmap_find_node(gossmap, &last_node); + if (!n) { + payment_log(payment, LOG_DBG, "shadow #%zu: can't find node %s", + i, fmt_node_id(tmpctx, &last_node)); + break; + } + + /* Pick random channel as shadow */ + c = gossmap_nth_chan(gossmap, n, pseudorand(n->num_chans), &dir); + scidd.scid = gossmap_chan_scid(gossmap, c); + scidd.dir = dir; + + if (!gossmap_chan_set(c, dir)) { + payment_log(payment, LOG_DBG, "shadow #%zu: %s no channel_update", + i, fmt_short_channel_id_dir(tmpctx, &scidd)); + break; + } + + if (hops[0].cltv_value_in + c->half[dir].delay > payment->maxdelay) { + payment_log(payment, LOG_DBG, "shadow #%zu: %s adds too much delay (%u)", + i, fmt_short_channel_id_dir(tmpctx, &scidd), + c->half[dir].delay); + break; + } + + gossmap_node_get_id(gossmap, gossmap_nth_node(gossmap, c, !dir), &last_node); + payment_log(payment, LOG_DBG, "shadow #%zu: adding %s to %s", + i, fmt_short_channel_id_dir(tmpctx, &scidd), + fmt_node_id(tmpctx, &last_node)); + for (size_t j = 0; j < tal_count(hops); j++) { + hops[j].cltv_value_in += c->half[dir].delay; + hops[j].cltv_value_out += c->half[dir].delay; + } + } +} + static struct command_result *getroutes_done(struct command *aux_cmd, const char *method, const char *buf, @@ -1274,25 +1617,27 @@ static struct command_result *getroutes_done(struct command *aux_cmd, struct hop *hop = &hops[j]; err = json_scan(tmpctx, buf, hoptok, "{short_channel_id_dir:%" - ",amount_msat:%" - ",next_node_id:%" - ",delay:%}", + ",amount_in_msat:%" + ",amount_out_msat:%" + ",node_id_out:%" + ",cltv_in:%" + ",cltv_out:%}", JSON_SCAN(json_to_short_channel_id_dir, &hop->scidd), JSON_SCAN(json_to_msat, &hop->amount_in), + JSON_SCAN(json_to_msat, &hop->amount_out), JSON_SCAN(json_to_pubkey, &hop->next_node), - JSON_SCAN(json_to_u32, &hop->cltv_value_in)); + JSON_SCAN(json_to_u32, &hop->cltv_value_in), + JSON_SCAN(json_to_u32, &hop->cltv_value_out)); if (err) plugin_err(aux_cmd->plugin, "Malformed routes: %s", err); hop->fake_channel = !gossmap_find_chan(gossmap, &hop->scidd.scid); - if (j > 0) { - hops[j-1].amount_out = hop->amount_in; - hops[j-1].cltv_value_out = hop->cltv_value_in; - } } - hops[j-1].amount_out = delivers; - hops[j-1].cltv_value_out = payment->final_cltv; + + if (payment->use_shadow) + add_cltv_shadow(payment, gossmap, hops); + attempt = new_attempt(payment, delivers, take(hops)); /* Reserve this route */ @@ -1483,8 +1828,6 @@ static struct command_result *getroutes_for(struct command *aux_cmd, /* Add user-specified layers */ for (size_t i = 0; i < tal_count(payment->layers); i++) json_add_string(req->js, NULL, payment->layers[i]); - if (payment->disable_mpp) - json_add_string(req->js, NULL, "auto.no_mpp_support"); json_array_end(req->js); json_add_amount_msat(req->js, "maxfee_msat", maxfee); json_add_u32(req->js, "final_cltv", payment->final_cltv); @@ -1745,21 +2088,11 @@ preapproveinvoice_succeed(struct command *cmd, const jsmntok_t *result, struct payment *payment) { - struct xpay *xpay = xpay_of(cmd->plugin); - /* Now we can conclude `check` command */ if (command_check_only(cmd)) { return command_check_done(cmd); } - payment->unique_id = xpay->counter++; - payment->private_layer = tal_fmt(payment, - "xpay-%"PRIu64, payment->unique_id); - - /* Now unique_id is set, we can log this message */ - if (payment->disable_mpp) - payment_log(payment, LOG_INFORM, "No MPP support: this is going to be hard to pay"); - return populate_private_layer(cmd, payment); } @@ -1807,6 +2140,7 @@ struct xpay_params { u32 maxdelay; const char *bip353; const char *payer_note; + struct json_escape *label; }; static struct command_result * @@ -1822,7 +2156,7 @@ invoice_fetched(struct command *cmd, return xpay_core(cmd, take(to_canonical_invstr(NULL, take(inv))), NULL, params->maxfee, params->layers, params->retryfor, params->partial, params->maxdelay, - false); + params->label, NULL, false, false); } static struct command_result * @@ -1889,8 +2223,11 @@ static struct command_result *json_xpay_params(struct command *cmd, u32 *maxdelay; const char *payer_note; unsigned int *retryfor; + struct sha256 *localinvreqid; + struct json_escape *label; struct out_req *req; struct xpay_params *xparams; + bool *dev_use_shadow; if (!param_check(cmd, buffer, params, p_req("invstring", param_invstring, &invstring), @@ -1900,7 +2237,10 @@ static struct command_result *json_xpay_params(struct command *cmd, p_opt_def("retry_for", param_number, &retryfor, 60), p_opt("partial_msat", param_msat, &partial), p_opt_def("maxdelay", param_u32, &maxdelay, 2016), - p_opt("payer_note", param_string, &payer_note), + p_opt("payer_note", param_string, &payer_note), + p_opt("label", param_label, &label), + p_opt("localinvreqid", param_sha256, &localinvreqid), + p_opt_dev("dev_use_shadow", param_bool, &dev_use_shadow, true), NULL)) return command_param_failed(); @@ -1912,6 +2252,14 @@ static struct command_result *json_xpay_params(struct command *cmd, if (ret) return ret; + if (localinvreqid) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Cannot use localinvreqid with offer payment"); + + if (*dev_use_shadow == false) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Cannot use dev_use_shadow=false with offer payment"); + if (command_check_only(cmd)) return command_check_done(cmd); @@ -1924,12 +2272,24 @@ static struct command_result *json_xpay_params(struct command *cmd, xparams->maxdelay = *maxdelay; xparams->bip353 = NULL; xparams->payer_note = payer_note; + xparams->label = label; return do_fetchinvoice(cmd, invstring, xparams); } /* BIP353? */ if (!as_pay && strchr(invstring, '@')) { + if (localinvreqid) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Cannot use localinvreqid with BIP353 payment"); + + if (*dev_use_shadow == false) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Cannot use dev_use_shadow=false with BIP353 payment"); + + if (command_check_only(cmd)) + return command_check_done(cmd); + xparams = tal(cmd, struct xpay_params); xparams->msat = msat; xparams->maxfee = maxfee; @@ -1939,6 +2299,7 @@ static struct command_result *json_xpay_params(struct command *cmd, xparams->maxdelay = *maxdelay; xparams->bip353 = invstring; xparams->payer_note = payer_note; + xparams->label = label; req = jsonrpc_request_start(cmd, "fetchbip353", bip353_fetched, @@ -1949,7 +2310,126 @@ static struct command_result *json_xpay_params(struct command *cmd, return xpay_core(cmd, invstring, msat, maxfee, layers, *retryfor, partial, *maxdelay, - as_pay); + label, localinvreqid, *dev_use_shadow, as_pay); +} + +static void destroy_payment(struct payment *payment) +{ + struct xpay *xpay = xpay_of(payment->plugin); + + list_del_from(&xpay->payments, &payment->list); +} + +/* Does NOT set: + * ->maxparts + * ->use_shadow + * + * On bad settings, return NULL and sets *err. + */ +static struct payment *new_payment(const tal_t *ctx, + struct command *cmd, + u32 retryfor, + u32 maxdelay, + const char **layers, + const char *invstring, + const struct pubkey *destination, + const struct sha256 *payment_hash, + struct amount_msat full_amount, + /* If set, we're not paying full_amount */ + const struct amount_msat *partial, + /* If unset, based on amount we're paying */ + const struct amount_msat *maxfee, + const struct secret *payment_secret, + const u8 *payment_metadata, + u32 final_cltv, + const struct json_escape *label, + const struct sha256 *localinvreqid, + bool as_pay, + const char **err) +{ + struct xpay *xpay = xpay_of(cmd->plugin); + struct payment *payment = tal(ctx, struct payment); + + payment->plugin = cmd->plugin; + payment->deadline = timemono_add(time_mono(), time_from_sec(retryfor)); + payment->start_blockheight = xpay->blockheight; + payment->cmd = cmd; + payment->invstring = tal_strdup_or_null(payment, invstring); + payment->localinvreqid = tal_dup_or_null(payment, struct sha256, localinvreqid); + if (label) + payment->label = json_escape_dup(payment, label); + else + payment->label = NULL; + if (layers) + payment->layers = tal_dup_talarr(payment, const char *, layers); + else + payment->layers = NULL; + payment->destination = *destination; + payment->payment_hash = *payment_hash; + payment->full_amount = full_amount; + if (partial) { + payment->amount = *partial; + if (amount_msat_greater(payment->amount, payment->full_amount)) { + *err = tal_fmt(ctx, "partial_msat must be less or equal to total amount %s", + fmt_amount_msat(tmpctx, payment->full_amount)); + return tal_free(payment); + } + if (amount_msat_is_zero(payment->amount)) { + *err = tal_fmt(ctx, "partial_msat must be non-zero"); + return tal_free(payment); + } + } else { + payment->amount = payment->full_amount; + } + if (maxfee) { + payment->maxfee = *maxfee; + } else { + if (!amount_msat_fee(&payment->maxfee, payment->amount, 0, 1000000 / 100)) { + *err = tal_fmt(ctx, "Invalid amount: fee overflows"); + return tal_free(payment); + } + payment->maxfee = amount_msat_max(payment->maxfee, + AMOUNT_MSAT(5000)); + } + payment->maxdelay = maxdelay; + payment->payment_secret = tal_dup_or_null(payment, struct secret, payment_secret); + payment->payment_metadata = tal_dup_talarr(payment, u8, payment_metadata); + payment->final_cltv = final_cltv; + payment->group_id = pseudorand(INT64_MAX); + payment->total_num_attempts = payment->num_failures = 0; + + /* Filled in by caller if necessary */ + payment->route_hints = NULL; + payment->paths = NULL; + payment->payinfos = NULL; + payment->extra_tlvs = NULL; + + list_head_init(&payment->current_attempts); + list_head_init(&payment->past_attempts); + payment->amount_being_routed = AMOUNT_MSAT(0); + payment->prior_results = tal_strdup(payment, ""); + payment->requests = tal_arr(payment, struct out_req *, 0); + payment->start_time = clock_time(); + payment->pay_compat = as_pay; + payment->unique_id = xpay->counter++; + payment->private_layer = tal_fmt(payment, + "xpay-%"PRIu64, payment->unique_id); + + list_add_tail(&xpay->payments, &payment->list); + tal_add_destructor(payment, destroy_payment); + return payment; +} + +bool attempt_ongoing(struct plugin *plugin, const struct sha256 *payment_hash) +{ + struct xpay *xpay = xpay_of(plugin); + const struct payment *payment; + + list_for_each(&xpay->payments, payment, list) { + if (sha256_eq(&payment->payment_hash, payment_hash)) + return true; + } + return false; } static struct command_result *xpay_core(struct command *cmd, @@ -1960,65 +2440,69 @@ static struct command_result *xpay_core(struct command *cmd, u32 retryfor, const struct amount_msat *partial, u32 maxdelay, + const struct json_escape *label, + const struct sha256 *localinvreqid, + bool use_shadow, bool as_pay) { - struct payment *payment = tal(cmd, struct payment); + struct payment *payment; struct xpay *xpay = xpay_of(cmd->plugin); struct gossmap *gossmap = get_gossmap(xpay); struct node_id dstid; + bool disable_mpp; u64 now, invexpiry; struct out_req *req; const char *err; - list_head_init(&payment->current_attempts); - list_head_init(&payment->past_attempts); - payment->plugin = cmd->plugin; - payment->cmd = cmd; - payment->amount_being_routed = AMOUNT_MSAT(0); - payment->group_id = pseudorand(INT64_MAX); - payment->total_num_attempts = payment->num_failures = 0; - payment->requests = tal_arr(payment, struct out_req *, 0); - payment->prior_results = tal_strdup(payment, ""); - payment->deadline = timemono_add(time_mono(), time_from_sec(retryfor)); - payment->start_time = clock_time(); - payment->start_blockheight = xpay->blockheight; - payment->pay_compat = as_pay; - payment->invstring = tal_strdup(payment, invstring); - if (layers) - payment->layers = tal_dup_talarr(payment, const char *, layers); - else - payment->layers = NULL; - payment->maxdelay = maxdelay; - - if (bolt12_has_prefix(payment->invstring)) { + if (bolt12_has_prefix(invstring)) { struct tlv_invoice *b12inv - = invoice_decode(tmpctx, payment->invstring, - strlen(payment->invstring), + = invoice_decode(tmpctx, invstring, + strlen(invstring), plugin_feature_set(cmd->plugin), chainparams, &err); if (!b12inv) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "Invalid bolt12 invoice: %s", err); - invexpiry = invoice_expiry(b12inv); - payment->full_amount = amount_msat(*b12inv->invoice_amount); if (msat) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "Cannot override amount for bolt12 invoices"); /* FIXME: This is actually spec legal, since invoice_amount is * the *minumum* it will accept. We could change this to * 1msat if required. */ - if (amount_msat_is_zero(payment->full_amount)) + if (amount_msat_is_zero(amount_msat(*b12inv->invoice_amount))) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "Invalid bolt12 invoice with zero amount"); + invexpiry = invoice_expiry(b12inv); - payment->route_hints = NULL; - payment->payment_secret = NULL; - payment->payment_metadata = NULL; + payment = new_payment(cmd, cmd, + retryfor, + maxdelay, + layers, + invstring, + b12inv->invoice_node_id, + b12inv->invoice_payment_hash, + amount_msat(*b12inv->invoice_amount), + partial, + maxfee, + /* No payment_secret, payment_metdata + * for bolt12 */ + NULL, NULL, + /* We don't actually know the final_cltv + * for blinded paths, we just know the + * cltv we use to enter the final + * hop. */ + 0, + label, + localinvreqid, + as_pay, + &err); + if (!payment) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "%s", err); payment->paths = tal_steal(payment, b12inv->invoice_paths); payment->payinfos = tal_steal(payment, b12inv->invoice_blindedpay); - payment->payment_hash = *b12inv->invoice_payment_hash; - payment->destination = *b12inv->invoice_node_id; + /* Resolve introduction points if possible */ for (size_t i = 0; i < tal_count(payment->paths); i++) { if (!gossmap_scidd_pubkey(gossmap, &payment->paths[i]->first_node_id)) { @@ -2037,10 +2521,14 @@ static struct command_result *xpay_core(struct command *cmd, "Could not resolve any paths: unknown short_channel_id"); } - /* We don't actually know the final_cltv for blinded - * paths, we just know the cltv we use to enter the - * final hop. */ - payment->final_cltv = 0; + /* We DO NOT use a shadow path if there's a non-self blinded path */ + if (tal_count(payment->paths) > 1 + || !pubkey_eq(&payment->paths[0]->first_node_id.pubkey, b12inv->invoice_node_id)) { + payment_log(payment, LOG_DBG, + "Non-trivial blinded path: not using shadow routing"); + use_shadow = false; + } + /* BOLT #12: * - if `invoice_features` contains the MPP/compulsory bit: * - MUST pay the invoice via multiple separate blinded paths. @@ -2049,78 +2537,75 @@ static struct command_result *xpay_core(struct command *cmd, * - otherwise: * - MUST NOT use multiple parts to pay the invoice. */ - payment->disable_mpp = !feature_offered(b12inv->invoice_features, OPT_BASIC_MPP); + disable_mpp = !feature_offered(b12inv->invoice_features, OPT_BASIC_MPP); } else { + struct pubkey dst; struct bolt11 *b11 - = bolt11_decode(tmpctx, payment->invstring, + = bolt11_decode(tmpctx, invstring, plugin_feature_set(cmd->plugin), NULL, chainparams, &err); if (!b11) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "Invalid bolt11 invoice: %s", err); - payment->route_hints = tal_steal(payment, b11->routes); - payment->paths = NULL; - payment->payinfos = NULL; - if (!pubkey_from_node_id(&payment->destination, &b11->receiver_id)) + + if (localinvreqid) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Cannot use localinvreqid with BOLT11 payment"); + + if (!pubkey_from_node_id(&dst, &b11->receiver_id)) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "Invalid destination id %s", fmt_node_id(tmpctx, &b11->receiver_id)); - - payment->final_cltv = b11->min_final_cltv_expiry; - payment->payment_hash = b11->payment_hash; - payment->payment_secret = tal_steal(payment, b11->payment_secret); if (!b11->payment_secret) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "need payment_secret"); - payment->payment_metadata = tal_steal(payment, b11->metadata); - if (!b11->msat && !msat) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "amount_msat required"); - if (b11->msat && msat) + if (!b11->msat) { + if (!msat) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "amount_msat required"); + } else { + if (msat) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "amount_msat unnecessary"); + msat = b11->msat; + } + payment = new_payment(cmd, cmd, + retryfor, + maxdelay, + layers, + invstring, + &dst, + &b11->payment_hash, + *msat, + partial, + maxfee, + b11->payment_secret, + b11->metadata, + b11->min_final_cltv_expiry, + label, + localinvreqid, + as_pay, + &err); + if (!payment) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "amount_msat unnecessary"); - if (b11->msat) - payment->full_amount = *b11->msat; - else - payment->full_amount = *msat; + "%s", err); - payment->disable_mpp = !feature_offered(b11->features, OPT_BASIC_MPP); + payment->route_hints = tal_steal(payment, b11->routes); + disable_mpp = !feature_offered(b11->features, OPT_BASIC_MPP); if (amount_msat_is_zero(payment->full_amount)) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "Cannot pay bolt11 invoice with zero amount"); invexpiry = b11->timestamp + b11->expiry; } + payment->use_shadow = use_shadow; now = clock_time().ts.tv_sec; if (now > invexpiry) return command_fail(cmd, PAY_INVOICE_EXPIRED, "Invoice expired %"PRIu64" seconds ago", now - invexpiry); - if (partial) { - payment->amount = *partial; - if (amount_msat_greater(payment->amount, payment->full_amount)) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "partial_msat must be less or equal to total amount %s", - fmt_amount_msat(tmpctx, payment->full_amount)); - if (amount_msat_is_zero(payment->amount)) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "partial_msat must be non-zero"); - } else { - payment->amount = payment->full_amount; - } - - /* Default is 5sats, or 1%, whatever is greater */ - if (!maxfee) { - if (!amount_msat_fee(&payment->maxfee, payment->amount, 0, 1000000 / 100)) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "Invalid amount: fee overflows"); - payment->maxfee = amount_msat_max(payment->maxfee, - AMOUNT_MSAT(5000)); - } else - payment->maxfee = *maxfee; - /* If we are using an unannounced channel, we assume we can * only do 6 HTLCs at a time. This is currently true for * Phoenix, which is a large and significant node. */ @@ -2130,6 +2615,11 @@ static struct command_result *xpay_core(struct command *cmd, else payment->maxparts = 0; + if (disable_mpp) { + payment->maxparts = 1; + payment_log(payment, LOG_INFORM, "No MPP support: this is going to be hard to pay"); + } + /* Now preapprove, then start payment. */ if (command_check_only(cmd)) { req = jsonrpc_request_start(cmd, "check", @@ -2241,6 +2731,118 @@ static struct command_result *xpay_layer_created(struct command *aux_cmd, return aux_command_done(aux_cmd); } +static struct command_result * +preapprovekeysend_succeed(struct command *cmd, + const char *method, + const char *buf, + const jsmntok_t *result, + struct payment *payment) +{ + /* Now we can conclude `check` command */ + if (command_check_only(cmd)) { + return command_check_done(cmd); + } + + /* Actually we don't need a private layer, but unification is easy. */ + return populate_private_layer(cmd, payment); +} + +static struct command_result *json_xkeysend(struct command *cmd, + const char *buf, + const jsmntok_t *params) +{ + struct xpay *xpay = xpay_of(cmd->plugin); + struct amount_msat *msat, *maxfee; + struct pubkey *dst; + u32 *maxdelay; + unsigned int *retryfor; + struct payment *payment; + struct json_escape *label; + const char *err; + struct preimage preimage; + struct sha256 payment_hash; + const char **layers; + struct tlv_field *extra_fields; + u8 *tlvs; + struct out_req *req; + + if (!param_check(cmd, buf, params, + p_req("destination", param_pubkey, &dst), + p_req("amount_msat", param_msat, &msat), + p_opt("label", param_label, &label), + p_opt("maxfee", param_msat, &maxfee), + p_opt("layers", param_string_array, &layers), + p_opt_def("retry_for", param_number, &retryfor, 60), + p_opt_def("maxdelay", param_number, &maxdelay, 2016), + p_opt("extratlvs", param_extra_tlvs, &extra_fields), + NULL)) + return command_param_failed(); + + randbytes(&preimage, sizeof(preimage)); + sha256(&payment_hash, &preimage, sizeof(preimage)); + + /* We explicitly prohibit self-keysends */ + if (pubkey_eq(&xpay->local_id, dst)) { + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "We are the destination. Keysend cannot be used to send funds to yourself"); + } + + payment = new_payment(cmd, cmd, + *retryfor, + *maxdelay, + layers, + NULL, /* NULL invstring is the marker of a keysend vs pay */ + dst, + &payment_hash, + *msat, + NULL, + maxfee, + NULL, NULL, + // 22 is the Rust-Lightning default and the + // highest minimum CLTV we know of. + 22, + label, + NULL, + false, + &err); + if (!payment) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "%s", err); + + if (!extra_fields) + extra_fields = tal_arr(cmd, struct tlv_field, 0); + tlvstream_set_raw(&extra_fields, PREIMAGE_TLV_TYPE, + &preimage, sizeof(struct preimage)); + + /* Keysend only supports a single part, usually (we support multi!) */ + payment->maxparts = 1; + + /* Single payments should always use shadow routes */ + payment->use_shadow = true; + + /* Convert tlvs into their array representation for appending (assumes + * they're greater than any TLV we set!) */ + tlvs = tal_arr(payment, u8, 0); + towire_tlvstream_raw(&tlvs, extra_fields); + payment->extra_tlvs = tlvs; + + /* We do pre-approval immediately (note: even if command_check_only!) */ + if (command_check_only(cmd)) { + req = jsonrpc_request_start(cmd, "check", + preapprovekeysend_succeed, + forward_error, payment); + json_add_string(req->js, "command_to_check", "preapprovekeysend"); + } else { + req = jsonrpc_request_start(cmd, "preapprovekeysend", + preapprovekeysend_succeed, + forward_error, payment); + } + json_add_pubkey(req->js, "destination", &payment->destination); + json_add_sha256(req->js, "payment_hash", &payment->payment_hash); + json_add_amount_msat(req->js, "amount_msat", payment->amount); + return send_outreq(req); +} + static const char *init(struct command *init_cmd, const char *buf UNUSED, const jsmntok_t *config UNUSED) { @@ -2293,6 +2895,14 @@ static const struct plugin_command commands[] = { "xpay-as-pay", json_xpay_as_pay, }, + { + "xkeysend", + json_xkeysend, + }, + { + "listpays", + json_listpays + }, }; static struct command_result *handle_block_added(struct command *cmd, @@ -2414,7 +3024,7 @@ static struct command_result *handle_rpc_command(struct command *cmd, struct xpay *xpay = xpay_of(cmd->plugin); const jsmntok_t *rpc_tok, *method_tok, *params_tok, *id_tok, *bolt11 = NULL, *amount_msat = NULL, - *partial_msat = NULL, *retry_for = NULL, *maxdelay = NULL; + *partial_msat = NULL, *retry_for = NULL, *maxdelay = NULL, *localinvreqid = NULL, *label = NULL; const char *maxfee = NULL; struct json_stream *response; @@ -2475,6 +3085,10 @@ static struct command_result *handle_rpc_command(struct command *cmd, exemptfee = t + 1; else if (json_tok_streq(buf, t, "maxdelay")) maxdelay = t + 1; + else if (json_tok_streq(buf, t, "label")) + label = t + 1; + else if (json_tok_streq(buf, t, "localinvreqid")) + localinvreqid = t + 1; else { plugin_log(cmd->plugin, LOG_INFORM, "Unknown arg %.*s, xpay will ignore it.", @@ -2521,6 +3135,10 @@ static struct command_result *handle_rpc_command(struct command *cmd, json_add_tok(response, "partial_msat", partial_msat, buf); if (maxdelay) json_add_tok(response, "maxdelay", maxdelay, buf); + if (label) + json_add_tok(response, "label", label, buf); + if (localinvreqid) + json_add_tok(response, "localinvreqid", localinvreqid, buf); json_object_end(response); json_object_end(response); return command_finished(cmd, response); @@ -2551,9 +3169,10 @@ int main(int argc, char *argv[]) setup_locale(); xpay = tal(NULL, struct xpay); - xpay->take_over_pay = false; + xpay->take_over_pay = true; xpay->slow_mode = false; xpay->dev_no_age = false; + list_head_init(&xpay->payments); plugin_main(argv, init, take(xpay), PLUGIN_RESTARTABLE, true, NULL, commands, ARRAY_SIZE(commands), diff --git a/plugins/xpay/xpay.h b/plugins/xpay/xpay.h new file mode 100644 index 000000000000..886380d5c49f --- /dev/null +++ b/plugins/xpay/xpay.h @@ -0,0 +1,12 @@ +#ifndef LIGHTNING_PLUGINS_XPAY_XPAY_H +#define LIGHTNING_PLUGINS_XPAY_XPAY_H +#include "config.h" +#include + +struct plugin; +struct sha256; + +/* Are we still attempting this payment? If so, we won't list is as failed. */ +bool attempt_ongoing(struct plugin *plugin, const struct sha256 *payment_hash); + +#endif /* LIGHTNING_PLUGINS_XPAY_XPAY_H */ diff --git a/tests/benchmark.py b/tests/benchmark.py index 6b50282eb493..4259d12cba40 100644 --- a/tests/benchmark.py +++ b/tests/benchmark.py @@ -58,7 +58,7 @@ def test_single_hop(node_factory, executor): inv = l2.rpc.invoice(1000, 'invoice-%d' % (i), 'desc') invoices.append((inv['payment_hash'], inv['payment_secret'])) - route = l1.rpc.getroute(l2.rpc.getinfo()['id'], 1000, 1)['route'] + route = l1.single_route(l2.rpc.getinfo()['id'], 1000) print("Sending payments") start_time = time() @@ -82,7 +82,7 @@ def test_single_payment(node_factory, benchmark): def do_pay(l1, l2): invoice = l2.rpc.invoice(1000, 'invoice-{}'.format(random.random()), 'desc')['bolt11'] - l1.rpc.pay(invoice) + l1.rpc.xpay(invoice) benchmark(do_pay, l1, l2) @@ -92,7 +92,7 @@ def test_forward_payment(node_factory, benchmark): def do_pay(src, dest): invoice = dest.rpc.invoice(1000, 'invoice-{}'.format(random.random()), 'desc')['bolt11'] - src.rpc.pay(invoice) + src.rpc.xpay(invoice) benchmark(do_pay, l1, l3) @@ -102,7 +102,7 @@ def test_long_forward_payment(node_factory, benchmark): def do_pay(src, dest): invoice = dest.rpc.invoice(1000, 'invoice-{}'.format(random.random()), 'desc')['bolt11'] - src.rpc.pay(invoice) + src.rpc.xpay(invoice) benchmark(do_pay, nodes[0], nodes[-1]) @@ -125,7 +125,7 @@ def test_pay(node_factory, benchmark): invoices.append(invoice) def do_pay(l1, l2): - l1.rpc.pay(invoices.pop()) + l1.rpc.xpay(invoices.pop()) benchmark(do_pay, l1, l2) diff --git a/tests/test_askrene.py b/tests/test_askrene.py index 1a655bbf764c..52db13e2b023 100644 --- a/tests/test_askrene.py +++ b/tests/test_askrene.py @@ -81,7 +81,7 @@ def test_reserve(node_factory): time.sleep(2) # Reservations can be in either order. - with pytest.raises(RpcError, match=rf'We could not find a usable set of paths. The shortest path is {scid12}->{scid23}, but {scid12dir} already reserved 10000000*msat by command ".*" \([0-9]* seconds ago\), 10000000*msat by command ".*" \([0-9]* seconds ago\)'): + with pytest.raises(RpcError, match=rf'We could not find a usable set of paths. The shortest path is {scid12}->{scid23}, but {scid12dir} already reserved 10000000*msat by command ".*" \([0-9]* seconds ago\), 10000000*msat by command ".*" \([0-9]* seconds ago\)'): l1.rpc.getroutes(source=l1.info['id'], destination=l3.info['id'], amount_msat=1000000, @@ -539,8 +539,8 @@ def test_node_bias_routes(node_factory): ) assert len(r["routes"]) == 1 assert len(r["routes"][0]["path"]) == 3 - assert r["routes"][0]["path"][0]["next_node_id"] == nodemap[2] - assert r["routes"][0]["path"][2]["next_node_id"] == nodemap[1] + assert r["routes"][0]["path"][0]["node_id_out"] == nodemap[2] + assert r["routes"][0]["path"][2]["node_id_out"] == nodemap[1] # by using the layer that penalizes node 2, we end up routing through node 3 r = l1.rpc.getroutes( @@ -553,8 +553,8 @@ def test_node_bias_routes(node_factory): ) assert len(r["routes"]) == 1 assert len(r["routes"][0]["path"]) == 2 - assert r["routes"][0]["path"][0]["next_node_id"] == nodemap[3] - assert r["routes"][0]["path"][1]["next_node_id"] == nodemap[1] + assert r["routes"][0]["path"][0]["node_id_out"] == nodemap[3] + assert r["routes"][0]["path"][1]["node_id_out"] == nodemap[1] def test_layer_persistence(node_factory): @@ -661,6 +661,7 @@ def check_getroute_paths(node, destination, amount_msat, paths, + maxparts=50, layers=[], maxfee_msat=1000, final_cltv=99): @@ -670,7 +671,8 @@ def check_getroute_paths(node, amount_msat=amount_msat, layers=layers, maxfee_msat=maxfee_msat, - final_cltv=final_cltv) + final_cltv=final_cltv, + maxparts=maxparts) assert getroutes['probability_ppm'] <= 1000000 # Total delivered should be amount we told it to send. @@ -692,7 +694,7 @@ def test_getroutes(node_factory): # Too much should give a decent explanation. dir01 = direction(nodemap[0], nodemap[1]) - with pytest.raises(RpcError, match=rf"We could not find a usable set of paths\. The shortest path is 0x1x0, but 0x1x0/{dir01} isn't big enough to carry 1000000001msat\."): + with pytest.raises(RpcError, match=rf"We could not find a usable set of paths\. The shortest path is 0x1x0, but 0x1x0/{dir01} isn't big enough to carry 1000000001msat\."): l1.rpc.getroutes(source=nodemap[0], destination=nodemap[1], amount_msat=1000000001, @@ -701,7 +703,7 @@ def test_getroutes(node_factory): final_cltv=99) # This should tell us source doesn't have enough. - with pytest.raises(RpcError, match=r"We could not find a usable set of paths\. Total source capacity is only 1019000000msat \(in 3 channels\)\."): + with pytest.raises(RpcError, match=r"We could not find a usable set of paths\. Total source capacity is only 1019000000msat \(in 3 channels\)\."): l1.rpc.getroutes(source=nodemap[0], destination=nodemap[1], amount_msat=2000000001, @@ -710,7 +712,7 @@ def test_getroutes(node_factory): final_cltv=99) # This should tell us dest doesn't have enough. - with pytest.raises(RpcError, match=r"We could not find a usable set of paths\. Total destination capacity is only 1000000000msat \(in 1 channels\)\."): + with pytest.raises(RpcError, match=r"We could not find a usable set of paths\. Total destination capacity is only 1000000000msat \(in 1 channels\)\."): l1.rpc.getroutes(source=nodemap[0], destination=nodemap[4], amount_msat=1000000001, @@ -724,7 +726,7 @@ def test_getroutes(node_factory): l1.rpc.askrene_update_channel(layer="chans_disabled", short_channel_id_dir=f'0x1x0/{dir01}', enabled=False) - with pytest.raises(RpcError, match=rf"We could not find a usable set of paths\. The shortest path is 0x1x0, but 0x1x0/{dir01} marked disabled by layer chans_disabled\."): + with pytest.raises(RpcError, match=rf"We could not find a usable set of paths\. The shortest path is 0x1x0, but 0x1x0/{dir01} marked disabled by layer chans_disabled\."): l1.rpc.getroutes(source=nodemap[0], destination=nodemap[1], amount_msat=1000, @@ -744,9 +746,12 @@ def test_getroutes(node_factory): 'final_cltv': 99, 'amount_msat': 1000, 'path': [{'short_channel_id_dir': f'0x1x0/{dir01}', - 'next_node_id': nodemap[1], - 'amount_msat': 1010, - 'delay': 99 + 6}]}]} + 'node_id_in': nodemap[0], + 'node_id_out': nodemap[1], + 'amount_in_msat': 1010, + 'amount_out_msat': 1000, + 'cltv_in': 99 + 6, + 'cltv_out': 99}]}]} # Two hop, still easy. dir13 = direction(nodemap[1], nodemap[3]) assert l1.rpc.getroutes(source=nodemap[0], @@ -759,13 +764,19 @@ def test_getroutes(node_factory): 'final_cltv': 99, 'amount_msat': 100000, 'path': [{'short_channel_id_dir': f'0x1x0/{dir01}', - 'next_node_id': nodemap[1], - 'amount_msat': 103020, - 'delay': 99 + 6 + 6}, + 'node_id_in': nodemap[0], + 'node_id_out': nodemap[1], + 'amount_in_msat': 103020, + 'amount_out_msat': 102000, + 'cltv_in': 99 + 6 + 6, + 'cltv_out': 99 + 6}, {'short_channel_id_dir': f'3x3x2/{dir13}', - 'next_node_id': nodemap[3], - 'amount_msat': 102000, - 'delay': 99 + 6} + 'node_id_in': nodemap[1], + 'node_id_out': nodemap[3], + 'amount_in_msat': 102000, + 'amount_out_msat': 100000, + 'cltv_in': 99 + 6, + 'cltv_out': 99} ]}]} # Too expensive @@ -804,9 +815,12 @@ def test_getroutes(node_factory): 'final_cltv': 99, 'amount_msat': 1000000, 'path': [{'short_channel_id_dir': f'3x2x3/{dir02}', - 'next_node_id': nodemap[2], - 'amount_msat': 1000001, - 'delay': 99 + 6}]}]} + 'node_id_in': nodemap[0], + 'node_id_out': nodemap[2], + 'amount_in_msat': 1000001, + 'amount_out_msat': 1000000, + 'cltv_in': 99 + 6, + 'cltv_out': 99}]}]} # For 10000 sats, we will split. check_getroute_paths(l1, @@ -814,13 +828,19 @@ def test_getroutes(node_factory): nodemap[2], 10000000, [[{'short_channel_id_dir': f'1x2x1/{dir02}', - 'next_node_id': nodemap[2], - 'amount_msat': 4500004, - 'delay': 99 + 6}], + 'node_id_in': nodemap[0], + 'node_id_out': nodemap[2], + 'amount_in_msat': 4500004, + 'amount_out_msat': 4500000, + 'cltv_in': 99 + 6, + 'cltv_out': 99}], [{'short_channel_id_dir': f'3x2x3/{dir02}', - 'next_node_id': nodemap[2], - 'amount_msat': 5500005, - 'delay': 99 + 6}]]) + 'node_id_in': nodemap[0], + 'node_id_out': nodemap[2], + 'amount_in_msat': 5500005, + 'amount_out_msat': 5500000, + 'cltv_in': 99 + 6, + 'cltv_out': 99}]]) def test_getroutes_single_path(node_factory): @@ -843,7 +863,8 @@ def test_getroutes_single_path(node_factory): source=nodemap[1], destination=nodemap[2], amount_msat=10000001, - layers=["auto.no_mpp_support"], + layers=[], + maxparts=1, maxfee_msat=1000, final_cltv=99, ) @@ -858,13 +879,13 @@ def test_getroutes_single_path(node_factory): [ { "short_channel_id_dir": "3x2x2/1", - "next_node_id": nodemap[2], - "amount_msat": 10000010, - "delay": 99 + 6, + "node_id_out": nodemap[2], + "amount_in_msat": 10000010, + "cltv_in": 99 + 6, } ] ], - layers=["auto.no_mpp_support"], + maxparts=1, ) # To be able to route this amount two parts are needed, therefore a single @@ -875,7 +896,8 @@ def test_getroutes_single_path(node_factory): source=nodemap[0], destination=nodemap[2], amount_msat=10000001, - layers=["auto.no_mpp_support"], + layers=[], + maxparts=1, maxfee_msat=1000, final_cltv=99, ) @@ -890,19 +912,19 @@ def test_getroutes_single_path(node_factory): [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 10000020, - "delay": 99 + 6 + 6, + "node_id_out": nodemap[1], + "amount_in_msat": 10000020, + "cltv_in": 99 + 6 + 6, }, { "short_channel_id_dir": "3x2x2/1", - "next_node_id": nodemap[2], - "amount_msat": 10000010, - "delay": 99 + 6, + "node_id_out": nodemap[2], + "amount_in_msat": 10000010, + "cltv_in": 99 + 6, }, ] ], - layers=["auto.no_mpp_support"], + maxparts=1, ) @@ -975,9 +997,12 @@ def test_getroutes_auto_sourcefree(node_factory): 'final_cltv': 99, 'amount_msat': 1000, 'path': [{'short_channel_id_dir': f'0x1x0/{dir01}', - 'next_node_id': nodemap[1], - 'amount_msat': 1010, - 'delay': 105}]}]} + 'node_id_in': nodemap[0], + 'node_id_out': nodemap[1], + 'amount_in_msat': 1010, + 'amount_out_msat': 1000, + 'cltv_in': 105, + 'cltv_out': 99}]}]} # Start easy assert l1.rpc.getroutes(source=nodemap[0], @@ -990,9 +1015,12 @@ def test_getroutes_auto_sourcefree(node_factory): 'final_cltv': 99, 'amount_msat': 1000, 'path': [{'short_channel_id_dir': f'0x1x0/{dir01}', - 'next_node_id': nodemap[1], - 'amount_msat': 1000, - 'delay': 99}]}]} + 'node_id_in': nodemap[0], + 'node_id_out': nodemap[1], + 'amount_in_msat': 1000, + 'amount_out_msat': 1000, + 'cltv_in': 99, + 'cltv_out': 99}]}]} # Two hop, still easy. dir13 = direction(nodemap[1], nodemap[3]) assert l1.rpc.getroutes(source=nodemap[0], @@ -1005,13 +1033,19 @@ def test_getroutes_auto_sourcefree(node_factory): 'final_cltv': 99, 'amount_msat': 100000, 'path': [{'short_channel_id_dir': f'0x1x0/{dir01}', - 'next_node_id': nodemap[1], - 'amount_msat': 102000, - 'delay': 99 + 6}, + 'node_id_in': nodemap[0], + 'node_id_out': nodemap[1], + 'amount_in_msat': 102000, + 'amount_out_msat': 102000, + 'cltv_in': 99 + 6, + 'cltv_out': 99 + 6}, {'short_channel_id_dir': f'3x3x2/{dir13}', - 'next_node_id': nodemap[3], - 'amount_msat': 102000, - 'delay': 99 + 6} + 'node_id_in': nodemap[1], + 'node_id_out': nodemap[3], + 'amount_in_msat': 102000, + 'amount_out_msat': 100000, + 'cltv_in': 99 + 6, + 'cltv_out': 99} ]}]} # Too expensive @@ -1058,9 +1092,12 @@ def test_getroutes_maxdelay(node_factory): 'final_cltv': 99, 'amount_msat': 1000, 'path': [{'short_channel_id_dir': f'0x1x0/{dir01}', - 'next_node_id': nodemap[1], - 'amount_msat': 1010, - 'delay': 179}]}]} + 'node_id_in': nodemap[0], + 'node_id_out': nodemap[1], + 'amount_in_msat': 1010, + 'amount_out_msat': 1000, + 'cltv_in': 179, + 'cltv_out': 99}]}]} # But use the channel with lower delay when needed assert l1.rpc.getroutes(source=nodemap[0], @@ -1074,9 +1111,12 @@ def test_getroutes_maxdelay(node_factory): 'final_cltv': 99, 'amount_msat': 1000, 'path': [{'short_channel_id_dir': f'1x1x1/{dir01}', - 'next_node_id': nodemap[1], - 'amount_msat': 1020, - 'delay': 139}]}]} + 'node_id_in': nodemap[0], + 'node_id_out': nodemap[1], + 'amount_in_msat': 1020, + 'amount_out_msat': 1000, + 'cltv_in': 139, + 'cltv_out': 99}]}]} # Excessive maxdelay parameter with pytest.raises(RpcError, match="maximum delay allowed is 2016"): @@ -1122,9 +1162,9 @@ def test_getroutes_auto_localchans(node_factory): 100000, maxfee_msat=100000, layers=['auto.localchans'], - paths=[[{'short_channel_id_dir': scid21dir, 'amount_msat': 102012, 'delay': 99 + 6 + 6 + 6}, - {'short_channel_id_dir': f'0x1x0/{dir01}', 'amount_msat': 102010, 'delay': 99 + 6 + 6}, - {'short_channel_id_dir': f'2x2x1/{dir12}', 'amount_msat': 101000, 'delay': 99 + 6}]]) + paths=[[{'short_channel_id_dir': scid21dir, 'amount_in_msat': 102012, 'cltv_in': 99 + 6 + 6 + 6}, + {'short_channel_id_dir': f'0x1x0/{dir01}', 'amount_in_msat': 102010, 'cltv_in': 99 + 6 + 6}, + {'short_channel_id_dir': f'2x2x1/{dir12}', 'amount_in_msat': 101000, 'cltv_in': 99 + 6}]]) # This should get self-discount correct check_getroute_paths(l2, @@ -1133,9 +1173,9 @@ def test_getroutes_auto_localchans(node_factory): 100000, maxfee_msat=100000, layers=['auto.localchans', 'auto.sourcefree'], - paths=[[{'short_channel_id_dir': scid21dir, 'amount_msat': 102010, 'delay': 99 + 6 + 6}, - {'short_channel_id_dir': f'0x1x0/{dir01}', 'amount_msat': 102010, 'delay': 99 + 6 + 6}, - {'short_channel_id_dir': f'2x2x1/{dir12}', 'amount_msat': 101000, 'delay': 99 + 6}]]) + paths=[[{'short_channel_id_dir': scid21dir, 'amount_in_msat': 102010, 'cltv_in': 99 + 6 + 6}, + {'short_channel_id_dir': f'0x1x0/{dir01}', 'amount_in_msat': 102010, 'cltv_in': 99 + 6 + 6}, + {'short_channel_id_dir': f'2x2x1/{dir12}', 'amount_in_msat': 101000, 'cltv_in': 99 + 6}]]) def test_fees_dont_exceed_constraints(node_factory): @@ -1166,7 +1206,7 @@ def test_fees_dont_exceed_constraints(node_factory): assert len(routes) == 2 for hop in routes[0]['path'] + routes[1]['path']: if hop['short_channel_id_dir'] == f"{chan['short_channel_id']}/{chan['direction']}": - amount = hop['amount_msat'] + amount = hop['amount_in_msat'] assert amount <= max_msat @@ -1201,7 +1241,7 @@ def test_sourcefree_on_mods(node_factory, bitcoind): final_cltv=99)['routes'] # Expect no fee. check_route_as_expected(routes, [[{'short_channel_id_dir': f'0x3x3/{dir03}', - 'amount_msat': 1000000, 'delay': 99}]]) + 'amount_in_msat': 1000000, 'cltv_in': 99}]]) # NOT if we specify layers in the other order! routes = l1.rpc.getroutes(source=nodemap[0], @@ -1212,7 +1252,7 @@ def test_sourcefree_on_mods(node_factory, bitcoind): final_cltv=99)['routes'] # Expect no fee. check_route_as_expected(routes, [[{'short_channel_id_dir': f'0x3x3/{dir03}', - 'amount_msat': 1003000, 'delay': 117}]]) + 'amount_in_msat': 1003000, 'cltv_in': 117}]]) def test_live_spendable(node_factory, bitcoind): @@ -1254,7 +1294,7 @@ def test_live_spendable(node_factory, bitcoind): num_htlcs = {} for r in routes["routes"]: key = r["path"][0]["short_channel_id_dir"] - path_total[key] = path_total.get(key, 0) + r["path"][0]["amount_msat"] + path_total[key] = path_total.get(key, 0) + r["path"][0]["amount_in_msat"] num_htlcs[key] = num_htlcs.get(key, 0) + 1 # Take into account 645000msat (3750 feerate x 172 weight) per-HTLC reduction in capacity. @@ -1332,7 +1372,7 @@ def test_limits_fake_gossmap(node_factory, bitcoind): path_total = {} for r in routes["routes"]: key = r["path"][0]["short_channel_id_dir"] - path_total[key] = path_total.get(key, 0) + r["path"][0]["amount_msat"] + path_total[key] = path_total.get(key, 0) + r["path"][0]["amount_in_msat"] exceeded = {} for scidd in spendable.keys(): @@ -1380,8 +1420,8 @@ def test_max_htlc(node_factory, bitcoind): dir01 = direction(nodemap[0], nodemap[1]) check_route_as_expected(routes['routes'], - [[{'short_channel_id_dir': f'0x1x0/{dir01}', 'amount_msat': 1_000_001, 'delay': 10 + 6}], - [{'short_channel_id_dir': f'1x1x1/{dir01}', 'amount_msat': 19_000_019, 'delay': 10 + 6}]]) + [[{'short_channel_id_dir': f'0x1x0/{dir01}', 'amount_in_msat': 1_000_001, 'cltv_in': 10 + 6}], + [{'short_channel_id_dir': f'1x1x1/{dir01}', 'amount_in_msat': 19_000_019, 'cltv_in': 10 + 6}]]) # If we can't use channel 2, we fail. l1.rpc.askrene_create_layer('removechan2') @@ -1390,7 +1430,7 @@ def test_max_htlc(node_factory, bitcoind): amount_msat=1, inform='constrained') - with pytest.raises(RpcError, match=rf"We could not find a usable set of paths. The shortest path is 0x1x0, but 0x1x0/{dir01} exceeds htlc_maximum_msat ~1000448msat"): + with pytest.raises(RpcError, match=rf"We could not find a usable set of paths. The shortest path is 0x1x0, but 0x1x0/{dir01} exceeds htlc_maximum_msat ~1000448msat"): l1.rpc.getroutes(source=nodemap[0], destination=nodemap[1], amount_msat=20_000_000, @@ -1415,7 +1455,7 @@ def test_min_htlc(node_factory, bitcoind): dir01 = direction(nodemap[0], nodemap[1]) check_route_as_expected(routes['routes'], - [[{'short_channel_id_dir': f'1x1x1/{dir01}', 'amount_msat': 1_000, 'delay': 10 + 6}]]) + [[{'short_channel_id_dir': f'1x1x1/{dir01}', 'amount_in_msat': 1_000, 'cltv_in': 10 + 6}]]) def test_min_htlc_after_excess(node_factory, bitcoind): @@ -1424,7 +1464,7 @@ def test_min_htlc_after_excess(node_factory, bitcoind): l1 = node_factory.get_node(gossip_store_file=gsfile.name) dir01 = direction(nodemap[0], nodemap[1]) - with pytest.raises(RpcError, match=rf"We could not find a usable set of paths. The shortest path is 0x1x0, but 0x1x0/{dir01} below htlc_minumum_msat ~2000msat"): + with pytest.raises(RpcError, match=rf"We could not find a usable set of paths. The shortest path is 0x1x0, but 0x1x0/{dir01} below htlc_minumum_msat ~2000msat"): l1.rpc.getroutes(source=nodemap[0], destination=nodemap[1], amount_msat=1999, @@ -1435,11 +1475,11 @@ def test_min_htlc_after_excess(node_factory, bitcoind): # These were obviously having a bad day at the time of the snapshot: canned_gossmap_badnodes = { - 19: "We could not find a usable set of paths. The shortest path is 103x1x0->0x2134x0->988x333x988->16188x333x16169, but 0x2134x0/0 exceeds htlc_maximum_msat ~1000448msat", - 53: "We could not find a usable set of paths. The destination has disabled 177 of 177 channels, leaving capacity only 0msat of 4003677000msat.", - 69: "We could not find a usable set of paths. The destination has disabled 151 of 151 channels, leaving capacity only 0msat of 9092303000msat.", - 72: "We could not find a usable set of paths. The destination has disabled 146 of 146 channels, leaving capacity only 0msat of 1996000000msat.", - 86: "We could not find a usable set of paths. The destination has disabled 131 of 131 channels, leaving capacity only 0msat of 162000000msat.", + 19: "We could not find a usable set of paths. The shortest path is 103x1x0->0x2134x0->988x333x988->16188x333x16169, but 0x2134x0/0 exceeds htlc_maximum_msat ~1000448msat", + 53: r"We could not find a usable set of paths\. All 177 channels to the destination are disabled\.", + 69: r"We could not find a usable set of paths\. All 151 channels to the destination are disabled\.", + 72: r"We could not find a usable set of paths\. All 146 channels to the destination are disabled\.", + 86: r"We could not find a usable set of paths\. All 131 channels to the destination are disabled\.", } @@ -1508,7 +1548,7 @@ def test_real_data(node_factory, bitcoind, executor): futs = {} for n, prev in prevs.items(): # Record fees - fees[n].append(sum([r['path'][0]['amount_msat'] for r in prev['routes']]) - AMOUNT) + fees[n].append(sum([r['path'][0]['amount_in_msat'] for r in prev['routes']]) - AMOUNT) # Now stress it, by asking it to spend 1msat less! futs[n] = executor.submit(l1.rpc.getroutes, source=l1.info['id'], @@ -1526,7 +1566,7 @@ def test_real_data(node_factory, bitcoind, executor): del prevs[n] continue - fee = sum([r['path'][0]['amount_msat'] for r in routes['routes']]) - AMOUNT + fee = sum([r['path'][0]['amount_in_msat'] for r in routes['routes']]) - AMOUNT # Should get less expensive assert fee < fees[n][-1] @@ -1628,7 +1668,7 @@ def amount_through_chan(chan, routes): for r in routes: for p in r['path']: if p['short_channel_id_dir'] == chan: - total += p['amount_msat'] + total += p['amount_in_msat'] return total amount_before = amount_through_chan(chan, route['routes']) @@ -1672,6 +1712,7 @@ def amount_through_chan(chan, routes): @pytest.mark.slow_test +@unittest.skipIf(TEST_NETWORK != 'regtest', "FIXME: fails on elements") def test_askrene_fake_channeld(node_factory, bitcoind): outfile = tempfile.NamedTemporaryFile(prefix='gossip-store-') nodeids = subprocess.check_output(['devtools/gossmap-compress', @@ -1721,50 +1762,37 @@ def test_askrene_fake_channeld(node_factory, bitcoind): preimage_hex = f'{n:02}' + '00' * 31 hash_hex = sha256(bytes.fromhex(preimage_hex)).hexdigest() - paths = {} - # Sendpay wants a different format, so we convert. for i, r in enumerate(routes['routes']): - paths[i] = [{'id': h['next_node_id'], - 'channel': h['short_channel_id_dir'].split('/')[0], - 'direction': int(h['short_channel_id_dir'].split('/')[1])} - for h in r['path']] - - # delay and amount_msat for sendpay are amounts at *end* of hop, not start! - with_end = r['path'] + [{'amount_msat': r['amount_msat'], 'delay': r['final_cltv']}] - for n, h in enumerate(paths[i]): - h['delay'] = with_end[n + 1]['delay'] - h['amount_msat'] = with_end[n + 1]['amount_msat'] - - l1.rpc.sendpay(paths[i], hash_hex, + l1.rpc.sendpay(r['path'], hash_hex, amount_msat=AMOUNT, payment_secret='00' * 32, partid=i + 1, groupid=1) - for i, p in paths.items(): + for i, r in enumerate(routes['routes']): # Worst-case timeout is 1 second per hop, + 60 seconds if MPP timeout! try: - if l1.rpc.waitsendpay(hash_hex, timeout=TIMEOUT + len(p) + 60, partid=i + 1, groupid=1): + if l1.rpc.waitsendpay(hash_hex, timeout=TIMEOUT + len(r['path']) + 60, partid=i + 1, groupid=1): success = True except RpcError as err: # Timeout means this one succeeded! if err.error['data']['failcode'] == MPP_TIMEOUT: - for h in p: + for h in r['path']: l1.rpc.askrene_inform_channel('test_askrene_fake_channeld', - f"{h['channel']}/{h['direction']}", - h['amount_msat'], + h['short_channel_id_dir'], + h['amount_in_msat'], 'unconstrained') elif err.error['data']['failcode'] == TEMPORARY_CHANNEL_FAILURE: # We succeeded up to here failpoint = err.error['data']['erring_index'] - for h in p[:failpoint]: + for h in r['path'][:failpoint]: l1.rpc.askrene_inform_channel('test_askrene_fake_channeld', - f"{h['channel']}/{h['direction']}", - h['amount_msat'], + h['short_channel_id_dir'], + h['amount_in_msat'], 'unconstrained') - h = p[failpoint] + h = r['path'][failpoint] l1.rpc.askrene_inform_channel('test_askrene_fake_channeld', - f"{h['channel']}/{h['direction']}", - h['amount_msat'], + h['short_channel_id_dir'], + h['amount_in_msat'], 'constrained') else: raise err @@ -2055,7 +2083,7 @@ def test_askrene_reserve_clash(node_factory, bitcoind): }]) # We can't use this on layer 1 anymore, only 50000 msat left. - with pytest.raises(RpcError, match=r"We could not find a usable set of paths. The shortest path is 0x0x0, but 0x0x0/1 already reserved 950000msat by command"): + with pytest.raises(RpcError, match=r"We could not find a usable set of paths. The shortest path is 0x0x0, but 0x0x0/1 already reserved 950000msat by command"): l1.rpc.getroutes(source=l1.info['id'], destination=node1, amount_msat=500000, @@ -2143,9 +2171,10 @@ def test_excessive_fee_cost(node_factory): source=l1.info["id"], destination=node1, amount_msat=one_btc // 2, - layers=["mylayer", "auto.no_mpp_support"], + layers=["mylayer"], maxfee_msat=1000, final_cltv=5, + maxparts=1, ) @@ -2243,9 +2272,9 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1011, - "delay": 99 + 5, + "node_id_out": nodemap[1], + "amount_in_msat": 1011, + "cltv_in": 99 + 5, } ], } @@ -2264,15 +2293,15 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1033, - "delay": 99 + 5 + 5, + "node_id_out": nodemap[1], + "amount_in_msat": 1033, + "cltv_in": 99 + 5 + 5, }, { "short_channel_id_dir": "2x2x1/1", - "next_node_id": nodemap[2], - "amount_msat": 1022, - "delay": 99 + 5, + "node_id_out": nodemap[2], + "amount_in_msat": 1022, + "cltv_in": 99 + 5, }, ], } @@ -2291,21 +2320,21 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1066, - "delay": 99 + 5 + 5 + 5, + "node_id_out": nodemap[1], + "amount_in_msat": 1066, + "cltv_in": 99 + 5 + 5 + 5, }, { "short_channel_id_dir": "2x2x1/1", - "next_node_id": nodemap[2], - "amount_msat": 1055, - "delay": 99 + 5 + 5, + "node_id_out": nodemap[2], + "amount_in_msat": 1055, + "cltv_in": 99 + 5 + 5, }, { "short_channel_id_dir": "4x3x2/0", - "next_node_id": nodemap[3], - "amount_msat": 1033, - "delay": 99 + 5, + "node_id_out": nodemap[3], + "amount_in_msat": 1033, + "cltv_in": 99 + 5, }, ], } @@ -2326,9 +2355,9 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1000, - "delay": 99 + 5, + "node_id_out": nodemap[1], + "amount_in_msat": 1000, + "cltv_in": 99 + 5, } ], } @@ -2347,15 +2376,15 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1000, - "delay": 99 + 5 + 5, + "node_id_out": nodemap[1], + "amount_in_msat": 1000, + "cltv_in": 99 + 5 + 5, }, { "short_channel_id_dir": "2x2x1/1", - "next_node_id": nodemap[2], - "amount_msat": 990, - "delay": 99 + 5, + "node_id_out": nodemap[2], + "amount_in_msat": 990, + "cltv_in": 99 + 5, }, ], } @@ -2374,21 +2403,21 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1000, - "delay": 99 + 5 + 5 + 5, + "node_id_out": nodemap[1], + "amount_in_msat": 1000, + "cltv_in": 99 + 5 + 5 + 5, }, { "short_channel_id_dir": "2x2x1/1", - "next_node_id": nodemap[2], - "amount_msat": 990, - "delay": 99 + 5 + 5, + "node_id_out": nodemap[2], + "amount_in_msat": 990, + "cltv_in": 99 + 5 + 5, }, { "short_channel_id_dir": "4x3x2/0", - "next_node_id": nodemap[3], - "amount_msat": 969, - "delay": 99 + 5, + "node_id_out": nodemap[3], + "amount_in_msat": 969, + "cltv_in": 99 + 5, }, ], } @@ -2408,9 +2437,9 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1000, - "delay": 99, + "node_id_out": nodemap[1], + "amount_in_msat": 1000, + "cltv_in": 99, } ], } @@ -2429,15 +2458,15 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1022, - "delay": 99 + 5, + "node_id_out": nodemap[1], + "amount_in_msat": 1022, + "cltv_in": 99 + 5, }, { "short_channel_id_dir": "2x2x1/1", - "next_node_id": nodemap[2], - "amount_msat": 1022, - "delay": 99 + 5, + "node_id_out": nodemap[2], + "amount_in_msat": 1022, + "cltv_in": 99 + 5, }, ], } @@ -2456,21 +2485,21 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1055, - "delay": 99 + 5 + 5, + "node_id_out": nodemap[1], + "amount_in_msat": 1055, + "cltv_in": 99 + 5 + 5, }, { "short_channel_id_dir": "2x2x1/1", - "next_node_id": nodemap[2], - "amount_msat": 1055, - "delay": 99 + 5 + 5, + "node_id_out": nodemap[2], + "amount_in_msat": 1055, + "cltv_in": 99 + 5 + 5, }, { "short_channel_id_dir": "4x3x2/0", - "next_node_id": nodemap[3], - "amount_msat": 1033, - "delay": 99 + 5, + "node_id_out": nodemap[3], + "amount_in_msat": 1033, + "cltv_in": 99 + 5, }, ], } @@ -2490,9 +2519,9 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1000, - "delay": 99, + "node_id_out": nodemap[1], + "amount_in_msat": 1000, + "cltv_in": 99, } ], } @@ -2511,15 +2540,15 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1000, - "delay": 99 + 5, + "node_id_out": nodemap[1], + "amount_in_msat": 1000, + "cltv_in": 99 + 5, }, { "short_channel_id_dir": "2x2x1/1", - "next_node_id": nodemap[2], - "amount_msat": 1000, - "delay": 99 + 5, + "node_id_out": nodemap[2], + "amount_in_msat": 1000, + "cltv_in": 99 + 5, }, ], } @@ -2538,21 +2567,21 @@ def test_includefees(node_factory): "path": [ { "short_channel_id_dir": "0x1x0/1", - "next_node_id": nodemap[1], - "amount_msat": 1000, - "delay": 99 + 5 + 5, + "node_id_out": nodemap[1], + "amount_in_msat": 1000, + "cltv_in": 99 + 5 + 5, }, { "short_channel_id_dir": "2x2x1/1", - "next_node_id": nodemap[2], - "amount_msat": 1000, - "delay": 99 + 5 + 5, + "node_id_out": nodemap[2], + "amount_in_msat": 1000, + "cltv_in": 99 + 5 + 5, }, { "short_channel_id_dir": "4x3x2/0", - "next_node_id": nodemap[3], - "amount_msat": 979, - "delay": 99 + 5, + "node_id_out": nodemap[3], + "amount_in_msat": 979, + "cltv_in": 99 + 5, }, ], } @@ -2609,7 +2638,7 @@ def test_impossible_payment(node_factory): ) with pytest.raises( RpcError, - match=r"We could not find a usable set of paths. The shortest path is 0x0x1->0x0x2, but 0x0x1/0 exceeds htlc_maximum_msat", + match=r"We could not find a usable set of paths. The shortest path is 0x0x1->0x0x2, but 0x0x1/0 exceeds htlc_maximum_msat", ): l1.rpc.getroutes( source=node1, @@ -2621,13 +2650,14 @@ def test_impossible_payment(node_factory): ) with pytest.raises( RpcError, - match=r"We could not find a usable set of paths. The shortest path is 0x0x1->0x0x2, but 0x0x1/0 exceeds htlc_maximum_msat", + match=r"We could not find a usable set of paths. The shortest path is 0x0x1->0x0x2, but 0x0x1/0 exceeds htlc_maximum_msat", ): l1.rpc.getroutes( source=node1, destination=node3, amount_msat=pay_amt, - layers=["mylayer", "auto.no_mpp_support"], + layers=["mylayer"], maxfee_msat=2 * pay_amt, final_cltv=5, + maxparts=1, ) diff --git a/tests/test_bookkeeper.py b/tests/test_bookkeeper.py index 1883c1251a1a..de8b28c91608 100644 --- a/tests/test_bookkeeper.py +++ b/tests/test_bookkeeper.py @@ -684,7 +684,8 @@ def test_bookkeeping_descriptions(node_factory, bitcoind, chainparams): bolt12_desc = 'test "bolt12" description, 🥰🪢' offer = l1.rpc.call('offer', [100, bolt12_desc]) invoice = l2.rpc.call('fetchinvoice', {'offer': offer['bolt12']}) - paid = l2.rpc.pay(invoice['invoice']) + payment_hash = l2.rpc.decode(invoice['invoice'])['invoice_payment_hash'] + l2.rpc.xpay(invoice['invoice']) wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) wait_for(lambda: only_one(l2.rpc.listpeerchannels()['channels'])['htlcs'] == []) l1_inc_ev = l1.rpc.bkpr_listincome()['income_events'] @@ -693,12 +694,12 @@ def test_bookkeeping_descriptions(node_factory, bitcoind, chainparams): l2.daemon.wait_for_log('coin_move .* [(]invoice[)] 0msat -100msat') # Test paying an offer (bolt12) (rcvr) - inv = only_one([ev for ev in l1_inc_ev if 'payment_id' in ev and ev['payment_id'] == paid['payment_hash']]) + inv = only_one([ev for ev in l1_inc_ev if 'payment_id' in ev and ev['payment_id'] == payment_hash]) assert inv['description'] == bolt12_desc # Test paying an offer (bolt12) (sender) l2_inc_ev = l2.rpc.bkpr_listincome()['income_events'] - inv = only_one([ev for ev in l2_inc_ev if 'payment_id' in ev and ev['payment_id'] == paid['payment_hash'] and ev['tag'] == 'invoice']) + inv = only_one([ev for ev in l2_inc_ev if 'payment_id' in ev and ev['payment_id'] == payment_hash and ev['tag'] == 'invoice']) assert inv['description'] == bolt12_desc # Check the CSVs look groovy @@ -720,7 +721,7 @@ def test_bookkeeping_descriptions(node_factory, bitcoind, chainparams): # Test that we can update the description, payment id edited_desc_payid = 'edited payment_id description' for node in [l1, l2]: - results = node.rpc.bkpr_editdescriptionbypaymentid(paid['payment_hash'], edited_desc_payid) + results = node.rpc.bkpr_editdescriptionbypaymentid(payment_hash, edited_desc_payid) assert only_one(results['updated'])['description'] == edited_desc_payid # Test that we can update the description, outpoint @@ -1245,7 +1246,7 @@ def test_bkpr_report_tags_and_fallback(node_factory): l1, l2 = node_factory.line_graph(2, opts={'bkpr-currency': 'USD'}) inv = l2.rpc.invoice(100000, "test_bkpr_report_tags_and_fallback", 'desc with "quotes"') - l1.rpc.pay(inv["bolt11"]) + l1.rpc.xpay(inv["bolt11"]) wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['htlcs'] == []) res = l1.rpc.call( @@ -1332,7 +1333,7 @@ def test_bkpr_report_lightning_cli_csv(node_factory): # Give desc something awkward so CSV escaping matters if it shows up. inv = l2.rpc.invoice(100000, "test_bkpr_report_lightning_cli_csv", 'hello, "csv"') - l1.rpc.pay(inv["bolt11"]) + l1.rpc.xpay(inv["bolt11"]) wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['htlcs'] == []) # Single-column CSV is enough to validate the CLI path and escaping. diff --git a/tests/test_cln_lsps.py b/tests/test_cln_lsps.py index 7eb2d4ffd197..c72c46c559ea 100644 --- a/tests/test_cln_lsps.py +++ b/tests/test_cln_lsps.py @@ -346,7 +346,7 @@ def test_lsps2_non_approved_zero_conf(node_factory, bitcoind): )["bolt11"] with pytest.raises(ValueError): - l3.rpc.pay(bolt11, amount_msat=10000000) + l3.rpc.xpay(bolt11, amount_msat=10000000) # l1 shouldn't have a new channel. chs = l1.rpc.listpeerchannels()["channels"] diff --git a/tests/test_cln_rs.py b/tests/test_cln_rs.py index d49089128ed7..ea76002cd0e8 100644 --- a/tests/test_cln_rs.py +++ b/tests/test_cln_rs.py @@ -306,8 +306,8 @@ def test_cln_plugin_reentrant(node_factory, executor): i1 = l1.rpc.invoice(label='lbl1', amount_msat='42sat', description='desc')['bolt11'] i2 = l1.rpc.invoice(label='lbl2', amount_msat='31337sat', description='desc')['bolt11'] - f1 = executor.submit(l2.rpc.pay, i1) - f2 = executor.submit(l2.rpc.pay, i2) + f1 = executor.submit(l2.rpc.xpay, i1) + f2 = executor.submit(l2.rpc.xpay, i2) l1.daemon.wait_for_logs(["plugin-cln-plugin-reentrant: Holding on to incoming HTLC Object"] * 2) @@ -328,6 +328,7 @@ def test_grpc_keysend_routehint(bitcoind, node_factory): l1, l2, l3 = node_factory.line_graph( 3, announce_channels=True, # Do not enforce scid-alias + opts={'allow-deprecated-apis': True} ) bitcoind.generate_block(3) sync_blockheight(bitcoind, [l1, l2, l3]) diff --git a/tests/test_closing.py b/tests/test_closing.py index 9dec96d7f92e..355ecc707f89 100644 --- a/tests/test_closing.py +++ b/tests/test_closing.py @@ -857,7 +857,7 @@ def test_channel_lease_post_expiry(node_factory, bitcoind, chainparams): # send some payments, mine a block or two inv = l2.rpc.invoice(10**4, '1', 'no_1') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) # make sure it's completely resolved before we generate blocks, # otherwise it can close HTLC! @@ -974,9 +974,9 @@ def test_channel_lease_unilat_closes(node_factory, bitcoind): # send some payments, mine a block or two inv = l2.rpc.invoice(10**4, '1', 'no_1') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) inv = l2.rpc.invoice(10**4, '3', 'no_3') - l3.rpc.pay(inv['bolt11']) + l3.rpc.xpay(inv['bolt11']) bitcoind.generate_block(2) sync_blockheight(bitcoind, [l1, l2, l3]) @@ -1079,7 +1079,7 @@ def test_channel_lease_lessor_cheat(node_factory, bitcoind, chainparams): wait_for(lambda: [c['active'] for c in l2.rpc.listchannels(l2.get_channel_scid(l1))['channels']] == [True, True]) # send some payments, mine a block or two inv = l2.rpc.invoice(10**4, '1', 'no_1') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) bitcoind.generate_block(1) @@ -1094,7 +1094,7 @@ def test_channel_lease_lessor_cheat(node_factory, bitcoind, chainparams): # push some money from l2->l1, so the commit counter advances inv = l1.rpc.invoice(10**5, '2', 'no_2') - l2.rpc.pay(inv['bolt11']) + l2.rpc.xpay(inv['bolt11']) # stop both nodes, roll back l2's database l2.stop() @@ -1151,7 +1151,7 @@ def test_channel_lease_lessee_cheat(node_factory, bitcoind, chainparams): wait_for(lambda: [c['active'] for c in l2.rpc.listchannels(l2.get_channel_scid(l1))['channels']] == [True, True]) # send some payments, mine a block or two inv = l2.rpc.invoice(10**4, '1', 'no_1') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) bitcoind.generate_block(1) @@ -1166,7 +1166,7 @@ def test_channel_lease_lessee_cheat(node_factory, bitcoind, chainparams): # push some money from l2->l1, so the commit counter advances inv = l1.rpc.invoice(10**5, '2', 'no_2') - l2.rpc.pay(inv['bolt11']) + l2.rpc.xpay(inv['bolt11']) # stop both nodes, roll back l1's database l1.stop() @@ -1246,19 +1246,17 @@ def test_penalty_htlc_tx_fulfill(node_factory, bitcoind, chainparams, anchors): # push some money so that 1 + 4 can both send htlcs inv = l2.rpc.invoice(10**9 // 2, '1', 'balancer') - l1.rpc.pay(inv['bolt11']) - l1.rpc.waitsendpay(inv['payment_hash']) + l1.rpc.xpay(inv['bolt11']) wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) inv = l4.rpc.invoice(10**9 // 2, '1', 'balancer') - l2.rpc.pay(inv['bolt11']) - l2.rpc.waitsendpay(inv['payment_hash']) + l2.rpc.xpay(inv['bolt11']) wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) # now we send one 'sticky' htlc: l4->l1 amt = 10**8 // 2 sticky_inv = l1.rpc.invoice(amt, '2', 'sticky') - route = l4.rpc.getroute(l1.info['id'], amt, 1)['route'] + route = l4.single_route(l1.info['id'], amt) l4.rpc.sendpay(route, sticky_inv['payment_hash'], payment_secret=sticky_inv['payment_secret']) l1.daemon.wait_for_log('dev_disconnect: -WIRE_UPDATE_FULFILL_HTLC') @@ -1277,7 +1275,7 @@ def test_penalty_htlc_tx_fulfill(node_factory, bitcoind, chainparams, anchors): inv = l3.rpc.invoice(10**4, '1', 'push') # Make sure gossipd in l2 knows it's active wait_for(lambda: [c['active'] for c in l2.rpc.listchannels(l2.get_channel_scid(l3))['channels']] == [True, True]) - l2.rpc.pay(inv['bolt11']) + l2.rpc.xpay(inv['bolt11']) # stop both nodes, roll back l2's database l2.stop() @@ -1441,20 +1439,20 @@ def test_penalty_htlc_tx_timeout(node_factory, bitcoind, chainparams, anchors): # push some money so that 1 + 4 can both send htlcs inv = l2.rpc.invoice(10**9 // 2, '1', 'balancer') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) inv = l4.rpc.invoice(10**9 // 2, '1', 'balancer') - l2.rpc.pay(inv['bolt11']) + l2.rpc.xpay(inv['bolt11']) # now we send two 'sticky' htlcs, l1->l5 + l4->l1 amt = 10**8 // 2 sticky_inv_1 = l5.rpc.invoice(amt, '2', 'sticky') - route = l1.rpc.getroute(l5.info['id'], amt, 1)['route'] + route = l1.single_route(l5.info['id'], amt) l1.rpc.sendpay(route, sticky_inv_1['payment_hash'], payment_secret=sticky_inv_1['payment_secret']) l5.daemon.wait_for_log('dev_disconnect: -WIRE_UPDATE_FULFILL_HTLC') sticky_inv_2 = l1.rpc.invoice(amt, '2', 'sticky') - route = l4.rpc.getroute(l1.info['id'], amt, 1)['route'] + route = l4.single_route(l1.info['id'], amt) l4.rpc.sendpay(route, sticky_inv_2['payment_hash'], payment_secret=sticky_inv_2['payment_secret']) l1.daemon.wait_for_log('dev_disconnect: -WIRE_UPDATE_FULFILL_HTLC') @@ -1478,7 +1476,7 @@ def test_penalty_htlc_tx_timeout(node_factory, bitcoind, chainparams, anchors): inv = l3.rpc.invoice(10**4, '1', 'push') # Make sure gossipd in l2 knows it's active wait_for(lambda: [c['active'] for c in l2.rpc.listchannels(l2.get_channel_scid(l3))['channels']] == [True, True]) - l2.rpc.pay(inv['bolt11']) + l2.rpc.xpay(inv['bolt11']) # stop both nodes, roll back l2's database l2.stop() @@ -2121,7 +2119,7 @@ def test_onchain_middleman_simple(node_factory, bitcoind, chainparams, anchors): inv = l3.rpc.invoice(10**8, 'middleman', 'desc') rhash = inv['payment_hash'] - route = l1.rpc.getroute(l3.info['id'], 10**8, 1)["route"] + route = l1.single_route(l3.info['id'], 10**8) assert len(route) == 2 q = queue.Queue() @@ -2260,7 +2258,7 @@ def test_onchain_middleman_their_unilateral_in(node_factory, bitcoind, chainpara inv = l3.rpc.invoice(10**8, 'middleman', 'desc') rhash = inv['payment_hash'] - route = l1.rpc.getroute(l3.info['id'], 10**8, 1)["route"] + route = l1.single_route(l3.info['id'], 10**8) assert len(route) == 2 q = queue.Queue() @@ -2368,7 +2366,7 @@ def test_onchain_their_unilateral_out(node_factory, bitcoind, chainparams, ancho {**opts, **{'disconnect': disconnects}}]) channel_id = first_channel_id(l1, l2) - route = l1.rpc.getroute(l2.info['id'], 10**8, 1)["route"] + route = l1.single_route(l2.info['id'], 10**8) assert len(route) == 1 q = queue.Queue() @@ -3706,7 +3704,7 @@ def test_onchain_close_upstream(node_factory, bitcoind): ph1 = l3.rpc.invoice(amount_msat="10000sat", label='x1', description='desc2')['payment_hash'] ph2 = l3.rpc.invoice(amount_msat="10000sat", label='x2', description='desc2')['payment_hash'] - route = l1.rpc.getroute(l3.info['id'], 1, 1)['route'] + route = l1.single_route(l3.info['id'], 1) # Start a payment l1.rpc.sendpay(route, ph1) @@ -3989,7 +3987,7 @@ def test_closing_tx_valid(node_factory, bitcoind): def test_closing_minfee(node_factory, bitcoind): l1, l2 = node_factory.line_graph(2, opts={'feerates': None}) - l1.rpc.pay(l2.rpc.invoice(10000000, 'test', 'test')['bolt11']) + l1.rpc.xpay(l2.rpc.invoice(10000000, 'test', 'test')['bolt11']) wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) @@ -4028,7 +4026,7 @@ def test_peer_anchor_push(node_factory, bitcoind, executor, chainparams): # Get HTLC stuck, so l2 has reason to push commitment tx. amt = 100_000_000 sticky_inv = l3.rpc.invoice(amt, 'sticky', 'sticky') - route = l1.rpc.getroute(l3.info['id'], amt, 1)['route'] + route = l1.single_route(l3.info['id'], amt) l1.rpc.sendpay(route, sticky_inv['payment_hash'], payment_secret=sticky_inv['payment_secret']) l3.daemon.wait_for_log('dev_disconnect: -WIRE_UPDATE_FULFILL_HTLC') @@ -4093,7 +4091,7 @@ def test_closing_cpfp(node_factory, bitcoind): change = only_one(l1.rpc.listfunds()['outputs']) # Make sure both sides have some output - l1.rpc.pay(l2.rpc.invoice(10000000, 'test', 'test')['bolt11']) + l1.rpc.xpay(l2.rpc.invoice(10000000, 'test', 'test')['bolt11']) # Mutual close close_txid = only_one(l1.rpc.close(l2.info['id'])['txids']) @@ -4201,7 +4199,7 @@ def test_anchorspend_using_to_remote(node_factory, bitcoind, anchors): # l4 disconnects after receiving fulfill. It then unilaterally # closes, l2 gets to-remote with its output. - l4.rpc.pay(l2.rpc.invoice(100000000, 'test', 'test')['bolt11']) + l4.rpc.xpay(l2.rpc.invoice(100000000, 'test', 'test')['bolt11']) wait_for(lambda: only_one(l4.rpc.listpeerchannels()['channels'])['htlcs'] != []) wait_for(lambda: only_one(l4.rpc.listpeers()['peers'])['connected'] is False) @@ -4223,13 +4221,13 @@ def test_anchorspend_using_to_remote(node_factory, bitcoind, anchors): for n in (l1, l2, l3): wait_for(lambda: len(n.rpc.listchannels()['channels']) == 4) - l3.rpc.pay(l2.rpc.invoice(200000000, 'test2', 'test2')['bolt11']) + l3.rpc.xpay(l2.rpc.invoice(200000000, 'test2', 'test2')['bolt11']) wait_for(lambda: only_one(l2.rpc.listpeerchannels(l3.info['id'])['channels'])['htlcs'] == []) # Get HTLC stuck, so l2 has reason to push commitment tx. amt = 100_000_000 sticky_inv = l3.rpc.invoice(amt, 'sticky', 'sticky') - route = l1.rpc.getroute(l3.info['id'], amt, 1)['route'] + route = l1.single_route(l3.info['id'], amt) l1.rpc.sendpay(route, sticky_inv['payment_hash'], payment_secret=sticky_inv['payment_secret']) l3.daemon.wait_for_log('dev_disconnect: -WIRE_UPDATE_FULFILL_HTLC') @@ -4283,7 +4281,7 @@ def test_onchain_reestablish_reply(node_factory, bitcoind, executor): # For l2->l2, try: # 1. are not in the initial state, and # 2. actually onchain. - l2.rpc.pay(l3.rpc.invoice(200000000, 'test', 'test')['bolt11']) + l2.rpc.xpay(l3.rpc.invoice(200000000, 'test', 'test')['bolt11']) # We block l3 from seeing close, so it will try to reestablish. def no_new_blocks(req): @@ -4378,7 +4376,7 @@ def no_new_blocks(req): l2.daemon.rpcproxy.mock_rpc('getblockhash', no_new_blocks) # Make a payment, make sure it's entirely finished before we close. - l1.rpc.pay(l2.rpc.invoice(200000000, 'test', 'test')['bolt11']) + l1.rpc.xpay(l2.rpc.invoice(200000000, 'test', 'test')['bolt11']) wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) # l1 closes, unilaterally. diff --git a/tests/test_connection.py b/tests/test_connection.py index 6a0b38aa7c50..a4ed0c1aafbf 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -1191,8 +1191,8 @@ def test_v2_open(node_factory, bitcoind, chainparams): # Send a payment over the channel p = l2.rpc.invoice(100000, 'testpayment', 'desc') - l1.rpc.pay(p['bolt11']) - result = l1.rpc.waitsendpay(p['payment_hash']) + l1.rpc.xpay(p['bolt11']) + result = only_one(l1.rpc.listsendpays(payment_hash=p['payment_hash'])['payments']) assert(result['status'] == 'complete') @@ -1708,7 +1708,7 @@ def _close(src, dst, addr=None): # check that remote peer closing works as expected (and that remote's close_to works) _fundchannel(l1, l2, amt_addr, addr) # send some money to remote so that they have a closeout - l1.rpc.pay(l2.rpc.invoice((amt_addr // 2) * 1000, 'test_remote_close_to', 'desc')['bolt11']) + l1.rpc.xpay(l2.rpc.invoice((amt_addr // 2) * 1000, 'test_remote_close_to', 'desc')['bolt11']) assert l2.rpc.listpeerchannels()['channels'][-1]['close_to_addr'] == remote_valid_addr # The tx outputs must be one of the two permutations assert _close(l2, l1) in ([addr, remote_valid_addr], [remote_valid_addr, addr]) @@ -1857,7 +1857,7 @@ def test_multifunding_v1_v2_mixed(node_factory, bitcoind): for ldest in [l2, l3, l4]: inv = ldest.rpc.invoice(5000, 'inv', 'inv')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') @@ -1899,12 +1899,12 @@ def test_multifunding_v2_exclusive(node_factory, bitcoind): # For dual-funded channels, pay from accepter to initiator for ldest in [l2, l3]: inv = l1.rpc.invoice(5000, 'inv' + ldest.info['id'], 'inv')['bolt11'] - ldest.rpc.pay(inv) + ldest.rpc.xpay(inv) # Then pay other direction for ldest in [l2, l3, l4]: inv = ldest.rpc.invoice(10000, 'inv', 'inv')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) @pytest.mark.openchannel('v1') @@ -1935,7 +1935,7 @@ def test_multifunding_simple(node_factory, bitcoind): for ldest in [l2, l3, l4]: inv = ldest.rpc.invoice(5000, 'inv', 'inv')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) @pytest.mark.openchannel('v1') @@ -1994,7 +1994,7 @@ def test_multifunding_one(node_factory, bitcoind): for ldest in [l2, l3]: inv = ldest.rpc.invoice(5000, 'inv', 'inv')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) @pytest.mark.openchannel('v1') @@ -2231,7 +2231,7 @@ def test_multifunding_best_effort(node_factory, bitcoind): # There should be working channels to l2 and l4. for ldest in [l2, l4]: inv = ldest.rpc.invoice(5000, 'i{}'.format(i), 'i{}'.format(i))['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) # Function to find the SCID of the channel that is # currently open. @@ -2598,7 +2598,7 @@ def test_update_fee_dynamic(node_factory, bitcoind): # It will send UPDATE_FEE when it tries to send HTLC. inv = l2.rpc.invoice(5000, 'test_update_fee_dynamic', 'test_update_fee_dynamic')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) l2.daemon.wait_for_log('peer_in.*UPDATE_FEE') @@ -2610,7 +2610,7 @@ def test_update_fee_dynamic(node_factory, bitcoind): time.sleep(2) inv = l2.rpc.invoice(5000, 'test_update_fee_dynamic2', 'test_update_fee_dynamic2')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) # Won't update fee. assert not l2.daemon.is_in_log('peer_in.*UPDATE_FEE', @@ -2621,7 +2621,7 @@ def test_update_fee_dynamic(node_factory, bitcoind): # It will send UPDATE_FEE when it tries to send HTLC. inv = l2.rpc.invoice(5000, 'test_update_fee_dynamic3', 'test_update_fee_dynamic')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) l2.daemon.wait_for_log('peer_in.*UPDATE_FEE') @@ -3264,7 +3264,7 @@ def test_fulfill_incoming_first(node_factory, bitcoind): wait_for_announce=True) # This succeeds. - l1.rpc.pay(l3.rpc.invoice(200000000, 'test_fulfill_incoming_first', 'desc')['bolt11']) + l1.rpc.xpay(l3.rpc.invoice(200000000, 'test_fulfill_incoming_first', 'desc')['bolt11']) # l1 can shutdown, fine. l1.rpc.close(l2.info['id']) @@ -3620,7 +3620,7 @@ def test_wumbo_channels(node_factory, bitcoind): inv = l2.rpc.invoice(str(1 << 24) + "sat", "test_wumbo_channels", "wumbo payment") assert 'warning_mpp' not in inv - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) # Done in a single shot! assert len(l1.rpc.listsendpays()['payments']) == 1 @@ -3845,6 +3845,7 @@ def test_multichan_stress(node_factory, executor, bitcoind): l1, l2, l3 = node_factory.line_graph(3, opts={'may_reconnect': True, 'dev-no-reconnect': None}) + scid23 = first_scid(l2, l3) # Now fund *second* channel l2->l3 (slightly larger) bitcoind.rpc.sendtoaddress(l2.rpc.newaddr('bech32')['bech32'], 0.1) bitcoind.generate_block(1) @@ -3857,19 +3858,38 @@ def test_multichan_stress(node_factory, executor, bitcoind): mine_funding_to_announce(bitcoind, [l1, l2, l3], num_blocks=6, wait_for_mempool=1) wait_for(lambda: len(l1.rpc.listchannels(source=l3.info['id'])['channels']) == 2) + # We use sendpay directly here, because xpay learns and refuses to pay! + route = [{'amount_msat': 101, + 'id': l2.info['id'], + 'delay': 16, + 'channel': first_scid(l1, l2)}, + {'amount_msat': 100, + 'id': l3.info['id'], + 'delay': 10, + # We say this, but l2 will choose. + 'channel': scid23}] + def send_many_payments(): - for i in range(30): - inv = l3.rpc.invoice(100, "label-" + str(i), "desc")['bolt11'] + passes = 0 + fails = 0 + # Make sure we try many times, and get at least one pass and fail. + while passes == 0 or fails == 0 or passes + fails < 30: + inv = l3.rpc.invoice(100, "label-" + str(passes + fails), "desc") + l1.rpc.sendpay(route, inv['payment_hash'], payment_secret=inv['payment_secret']) + time.sleep(0.05) try: - l1.rpc.pay(inv) + l1.rpc.waitsendpay(inv['payment_hash']) + passes += 1 except RpcError: + fails += 1 pass # Send a heap of payments, while reconnecting... fut = executor.submit(send_many_payments) - for i in range(10): + for _ in range(30): l3.rpc.disconnect(l2.info['id'], force=True) + time.sleep(0.1) l3.rpc.connect(l2.info['id'], 'localhost', l2.port) fut.result(TIMEOUT) @@ -4124,7 +4144,7 @@ def test_multichan(node_factory, executor, bitcoind): wait_for(lambda: only_one(l3.rpc.listpeers(l2.info['id'])['peers'])['connected']) inv4 = l3.rpc.invoice(100000000, "invoice4", "invoice4") - l1.rpc.pay(inv4['bolt11']) + l1.rpc.xpay(inv4['bolt11'], dev_use_shadow=False) # A good place to test listhtlcs! wait_for(lambda: all([h['state'] == 'RCVD_REMOVE_ACK_REVOCATION' for h in l1.rpc.listhtlcs()['htlcs']])) @@ -4198,7 +4218,7 @@ def send_many_payments(): "desc" )['bolt11'] try: - l1.rpc.pay(inv) + l1.rpc.xpay(inv) except RpcError: pass @@ -4228,7 +4248,7 @@ def send_many_payments(): wait_for(lambda: only_one(l1.rpc.listpeers(l2.info['id'])['peers'])['connected']) inv = l2.rpc.invoice(100000000, "invoice4", "invoice4") - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) def test_no_reconnect_awating_unilateral(node_factory, bitcoind): diff --git a/tests/test_currencyrate.py b/tests/test_currencyrate.py index afb758511ae5..8769ba115f97 100644 --- a/tests/test_currencyrate.py +++ b/tests/test_currencyrate.py @@ -320,7 +320,7 @@ def test_bkpr_listaccountevents_currencyrate(node_factory, fake_rateserver): l1, l2 = node_factory.line_graph(2, opts=opts) inv = l2.rpc.invoice(100000, "test-bkpr-currency", "desc") - l1.rpc.pay(inv["bolt11"]) + l1.rpc.xpay(inv["bolt11"]) # We want this event in the list, so wait until it's totally closed. wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) @@ -353,7 +353,7 @@ def test_bkpr_listaccountevents_realtime(node_factory, fake_rateserver): old_median = (fake_rateserver["state"]["fast"] + fake_rateserver["state"]["slow"]) / 2 inv = l2.rpc.invoice(100000, "test_bkpr_listaccountevents_realtime", "desc") - l1.rpc.pay(inv["bolt11"]) + l1.rpc.xpay(inv["bolt11"]) # We want this event in the list, so wait until it's totally closed. wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) @@ -391,7 +391,7 @@ def test_bkpr_currency_dynamic(node_factory, fake_rateserver): median_rate = (fake_rateserver["state"]["fast"] + fake_rateserver["state"]["slow"]) / 2 inv1 = l2.rpc.invoice(100000, "test_bkpr_currency_dynamic_1", "desc") - l1.rpc.pay(inv1["bolt11"]) + l1.rpc.xpay(inv1["bolt11"]) # We want this event in the list, so wait until it's totally closed. wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) @@ -406,7 +406,7 @@ def test_bkpr_currency_dynamic(node_factory, fake_rateserver): l1.rpc.setconfig("bkpr-currency", "USD") inv2 = l2.rpc.invoice(100000, "test_bkpr_currency_dynamic_2", "desc") - l1.rpc.pay(inv2["bolt11"]) + l1.rpc.xpay(inv2["bolt11"]) wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) events = l1.rpc.bkpr_listaccountevents()["events"] @@ -422,7 +422,7 @@ def test_bkpr_currency_dynamic(node_factory, fake_rateserver): l1.rpc.setconfig("bkpr-currency", "") inv3 = l2.rpc.invoice(100000, "test_bkpr_currency_dynamic_3", "desc") - l1.rpc.pay(inv3["bolt11"]) + l1.rpc.xpay(inv3["bolt11"]) # If we don't wait here, we can get a spurious error from # cln-currencyrate as fixture gets torn down! wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) @@ -455,7 +455,7 @@ def test_bkpr_currencyrate_persisted(node_factory, fake_rateserver): old_median = (fake_rateserver["state"]["fast"] + fake_rateserver["state"]["slow"]) / 2 inv = l2.rpc.invoice(100000, "test_bkpr_currencyrate_persisted", "desc") - l1.rpc.pay(inv["bolt11"]) + l1.rpc.xpay(inv["bolt11"]) # Make sure it's fully resolved so we get all events now. wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['htlcs'] == []) @@ -476,7 +476,7 @@ def test_bkpr_currencyrate_persisted(node_factory, fake_rateserver): # And we can add more. inv2 = l2.rpc.invoice(100000, "test_bkpr_currencyrate_persisted2", "desc") - l1.rpc.pay(inv2["bolt11"]) + l1.rpc.xpay(inv2["bolt11"]) wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['htlcs'] == []) new_events = l1.rpc.bkpr_listaccountevents()["events"] @@ -524,7 +524,7 @@ def test_bkpr_currencyrate_warns_for_old_events(node_factory, fake_rateserver): # 1. Create old events before bkpr-currency is enabled. inv1 = l2.rpc.invoice(100000, "test_bkpr_currencyrate_warns_old_1", "desc") - l1.rpc.pay(inv1["bolt11"]) + l1.rpc.xpay(inv1["bolt11"]) wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['htlcs'] == []) events = l1.rpc.bkpr_listaccountevents()["events"] assert events @@ -536,7 +536,7 @@ def test_bkpr_currencyrate_warns_for_old_events(node_factory, fake_rateserver): # New events. inv2 = l2.rpc.invoice(100000, "test_bkpr_currencyrate_warns_old_2", "desc") - l1.rpc.pay(inv2["bolt11"]) + l1.rpc.xpay(inv2["bolt11"]) wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['htlcs'] == []) # It does NOT complain about records before we set currency at all. @@ -552,7 +552,7 @@ def test_bkpr_currencyrate_warns_for_old_events(node_factory, fake_rateserver): # 4. Create new events while bookkeeper is stopped, then let them go stale. inv3 = l2.rpc.invoice(100000, "test_bkpr_currencyrate_warns_old_3", "desc") - l1.rpc.pay(inv3["bolt11"]) + l1.rpc.xpay(inv3["bolt11"]) wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['htlcs'] == []) time.sleep(61) @@ -592,7 +592,7 @@ def test_bkpr_currencyrate_ranges(node_factory, fake_rateserver): time.sleep(1) inv1 = l2.rpc.invoice(100000, "test_bkpr_currencyrate_ranges_1", "desc") - l1.rpc.pay(inv1["bolt11"]) + l1.rpc.xpay(inv1["bolt11"]) wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['htlcs'] == []) # Now we change the rate (and make sure time goes forward so it re-checks!) @@ -606,7 +606,7 @@ def test_bkpr_currencyrate_ranges(node_factory, fake_rateserver): l1.connect(l2) inv2 = l2.rpc.invoice(100000, "test_bkpr_currencyrate_ranges_2", "desc") - l1.rpc.pay(inv2["bolt11"]) + l1.rpc.xpay(inv2["bolt11"]) wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['htlcs'] == []) # Calling this here makes sure it's finished processing currencyrates diff --git a/tests/test_gossip.py b/tests/test_gossip.py index e55492cddd6f..326a4391af40 100644 --- a/tests/test_gossip.py +++ b/tests/test_gossip.py @@ -398,7 +398,7 @@ def test_gossip_jsonrpc(node_factory): 'peer_in WIRE_ANNOUNCEMENT_SIGNATURES']) # Make sure we can route through the channel, will raise on failure - l1.rpc.getroute(l2.info['id'], 100, 1) + l1.single_route(l2.info['id'], 100) # Channels not should be activated locally assert l1.rpc.listchannels() == {'channels': []} @@ -979,7 +979,7 @@ def test_report_routing_failure(node_factory, bitcoind): # Test inv = l4.rpc.invoice(1234567, 'inv', 'for testing')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) def test_query_short_channel_id(node_factory, bitcoind, chainparams): @@ -1474,7 +1474,8 @@ def test_getroute_exclude_duplicate(node_factory): in the exclude list will not have permanent effects. """ - l1, l2 = node_factory.line_graph(2, wait_for_announce=True) + l1, l2 = node_factory.line_graph(2, wait_for_announce=True, + opts={'allow-deprecated-apis': True}) # Starting route route = l1.rpc.getroute(l2.info['id'], 1, 1)['route'] @@ -1506,7 +1507,8 @@ def test_getroute_exclude_duplicate(node_factory): def test_getroute_exclude(node_factory, bitcoind): """Test getroute's exclude argument""" - l1, l2, l3, l4, l5 = node_factory.get_nodes(5) + l1, l2, l3, l4, l5 = node_factory.get_nodes(5, + opts={'allow-deprecated-apis': True}) node_factory.join_nodes([l1, l2, l3, l4], wait_for_announce=True) # This should work diff --git a/tests/test_invoices.py b/tests/test_invoices.py index 161fbd08931e..92077b65ea81 100644 --- a/tests/test_invoices.py +++ b/tests/test_invoices.py @@ -141,7 +141,7 @@ def test_invoice_preimage(node_factory): # Make invoice and pay it inv = l2.rpc.invoice(amount_msat=123456, label="inv", description="?", preimage=invoice_preimage) - payment = l1.rpc.pay(inv['bolt11']) + payment = l1.rpc.xpay(inv['bolt11']) # Check preimage was given. payment_preimage = payment['payment_preimage'] @@ -176,7 +176,7 @@ def test_invoice_routeboost(node_factory, bitcoind): assert r['cltv_expiry_delta'] == 6 # Pay it (and make sure it's fully resolved before we take l2 offline!) - l2.rpc.pay(inv['bolt11']) + l2.rpc.xpay(inv['bolt11']) wait_channel_quiescent(l2, l3) # Due to reserve & fees, l2 doesn't have capacity to pay this. @@ -386,8 +386,8 @@ def test_invoice_expiry(node_factory, executor): inv = l2.rpc.invoice(amount_msat=123000, label='test_pay', description='description', expiry=1)['bolt11'] time.sleep(2) - with pytest.raises(RpcError): - l1.rpc.pay(inv) + with pytest.raises(RpcError, match='Invoice expired [1-9] seconds ago'): + l1.rpc.xpay(inv) invoices = l2.rpc.listinvoices('test_pay')['invoices'] assert len(invoices) == 1 @@ -460,7 +460,7 @@ def test_waitinvoice(node_factory, executor): time.sleep(1) assert not f.done() # Pay invoice 2 - l1.rpc.pay(inv2['bolt11']) + l1.rpc.xpay(inv2['bolt11']) # Waiter should stil be blocked time.sleep(1) assert not f.done() @@ -468,7 +468,7 @@ def test_waitinvoice(node_factory, executor): r = executor.submit(l2.rpc.waitinvoice, 'inv2').result(timeout=5) assert r['label'] == 'inv2' # Pay invoice 1 - l1.rpc.pay(inv1['bolt11']) + l1.rpc.xpay(inv1['bolt11']) # Waiter for invoice 1 should now finish r = f.result(timeout=5) assert r['label'] == 'inv1' @@ -494,8 +494,8 @@ def test_waitanyinvoice(node_factory, executor): assert not f.done() # Now pay the first two invoices and make sure we notice - l1.rpc.pay(inv1['bolt11']) - l1.rpc.pay(inv2['bolt11']) + l1.rpc.xpay(inv1['bolt11']) + l1.rpc.xpay(inv2['bolt11']) r = f.result(timeout=5) assert r['label'] == 'inv1' pay_index = r['pay_index'] @@ -509,7 +509,7 @@ def test_waitanyinvoice(node_factory, executor): f = executor.submit(l2.rpc.waitanyinvoice, pay_index) time.sleep(1) assert not f.done() - l1.rpc.pay(inv3['bolt11']) + l1.rpc.xpay(inv3['bolt11']) r = f.result(timeout=5) assert r['label'] == 'inv3' pay_index = r['pay_index'] @@ -521,7 +521,7 @@ def test_waitanyinvoice(node_factory, executor): # If timeout is 0 but a paid invoice is available # anyway, it should return successfully immediately. - l1.rpc.pay(inv4['bolt11']) + l1.rpc.xpay(inv4['bolt11']) r = executor.submit(l2.rpc.waitanyinvoice, pay_index, 0).result(timeout=5) assert r['label'] == 'inv4' @@ -556,13 +556,13 @@ def test_waitanyinvoice_reversed(node_factory, executor): # Pay inv2, wait, pay inv1, wait # Pay inv2 - l1.rpc.pay(inv2['bolt11']) + l1.rpc.xpay(inv2['bolt11']) # Wait - should not block, should return inv2 r = executor.submit(l2.rpc.waitanyinvoice).result(timeout=5) assert r['label'] == 'inv2' pay_index = r['pay_index'] # Pay inv1 - l1.rpc.pay(inv1['bolt11']) + l1.rpc.xpay(inv1['bolt11']) # Wait inv2 - should not block, should return inv1 r = executor.submit(l2.rpc.waitanyinvoice, pay_index).result(timeout=5) assert r['label'] == 'inv1' @@ -602,7 +602,7 @@ def test_amountless_invoice(node_factory): details = l1.rpc.decode(inv) assert('msatoshi' not in details) - l1.rpc.pay(inv, amount_msat=1337) + l1.rpc.xpay(inv, amount_msat=1337) i = l2.rpc.listinvoices()['invoices'] assert(len(i) == 1) @@ -692,7 +692,7 @@ def test_wait_invoices(node_factory, executor): waitfut = executor.submit(l2.rpc.call, 'wait', {'subsystem': 'invoices', 'indexname': 'updated', 'nextvalue': 1}) l2.daemon.wait_for_log('waiting on invoices updated 1') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) waitres = waitfut.result(TIMEOUT) assert waitres == {'subsystem': 'invoices', 'updated': 1, @@ -776,7 +776,9 @@ def test_wait_invoices(node_factory, executor): def test_invoice_deschash(node_factory, chainparams): - l1, l2 = node_factory.line_graph(2) + # xpay ignores description, so use real pay. + l1, l2 = node_factory.line_graph(2, opts={'xpay-handle-pay': False, + 'allow-deprecated-apis': True}) # BOLT #11: # * `h`: tagged field: hash of description @@ -836,7 +838,7 @@ def test_listinvoices_index(node_factory): # Pay 10 of them, in reverse order. These will be the last ones in the 'updated' index. for i in range(70, 60, -1): - l1.rpc.pay(invs[i]['bolt11']) + l1.rpc.xpay(invs[i]['bolt11']) # Make sure it's fully resolved! wait_for(lambda: only_one(l2.rpc.listpeerchannels()['channels'])['htlcs'] == []) diff --git a/tests/test_misc.py b/tests/test_misc.py index 3fcf133e9dae..09a0974a39c2 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -453,20 +453,12 @@ def test_htlc_out_timeout(node_factory, bitcoind, executor): inv = l2.rpc.invoice(amt, 'test_htlc_out_timeout', 'desc')['bolt11'] assert only_one(l2.rpc.listinvoices('test_htlc_out_timeout')['invoices'])['status'] == 'unpaid' - executor.submit(l1.dev_pay, inv, dev_use_shadow=False) + executor.submit(l1.rpc.xpay, inv) # l1 will disconnect, and not reconnect. l1.daemon.wait_for_log('dev_disconnect: -WIRE_REVOKE_AND_ACK') - # Takes 6 blocks to timeout (cltv-final + 1), but we also give grace period of 1 block. - # shadow route can add extra blocks! - status = only_one(l1.rpc.call('paystatus')['pay']) - if 'shadow' in status: - shadowlen = 6 * status['shadow'].count('Added 6 cltv delay for shadow') - else: - shadowlen = 0 - - bitcoind.generate_block(5 + 1 + shadowlen) + bitcoind.generate_block(5 + 1) time.sleep(3) assert not l1.daemon.is_in_log('hit deadline') bitcoind.generate_block(1) @@ -533,19 +525,12 @@ def test_htlc_in_timeout(node_factory, bitcoind, executor): inv = l2.rpc.invoice(amt, 'test_htlc_in_timeout', 'desc')['bolt11'] assert only_one(l2.rpc.listinvoices('test_htlc_in_timeout')['invoices'])['status'] == 'unpaid' - executor.submit(l1.dev_pay, inv, dev_use_shadow=False) + executor.submit(l1.rpc.xpay, inv) # l1 will disconnect and not reconnect. l1.daemon.wait_for_log('dev_disconnect: -WIRE_REVOKE_AND_ACK') - # Deadline HTLC expiry minus 1/2 cltv-expiry delta (rounded up) (== cltv - 3). cltv is 5+1. - # shadow route can add extra blocks! - status = only_one(l1.rpc.call('paystatus')['pay']) - if 'shadow' in status: - shadowlen = 6 * status['shadow'].count('Added 6 cltv delay for shadow') - else: - shadowlen = 0 - bitcoind.generate_block(2 + shadowlen) + bitcoind.generate_block(2) assert not l2.daemon.is_in_log('hit deadline') bitcoind.generate_block(1) @@ -555,7 +540,7 @@ def test_htlc_in_timeout(node_factory, bitcoind, executor): l2.daemon.wait_for_log(' to ONCHAIN') l1.daemon.wait_for_log(' to ONCHAIN') - # L2 will collect HTLC (iff no shadow route) + # L2 will collect HTLC _, txid, blocks = l2.wait_for_onchaind_tx('OUR_HTLC_SUCCESS_TX', 'OUR_UNILATERAL/THEIR_HTLC') assert blocks == 0 @@ -2149,14 +2134,14 @@ def test_bad_onion(node_factory, bitcoind): opts={'log-level': 'io'}) inv = l4.rpc.invoice(123000, 'test_bad_onion', 'description') - route = l1.rpc.getroute(l4.info['id'], 123000, 1)['route'] + route = l1.single_route(l4.info['id'], 123000) assert len(route) == 3 mangled_nodeid = '0265b6ab5ec860cd257865d61ef0bbf5b3339c36cbda8b26b74e7f1dca490b6518' # Replace id with a different pubkey, so onion encoded badly at third hop. - route[2]['id'] = mangled_nodeid + route[2]['node_id_out'] = mangled_nodeid l1.rpc.sendpay(route, inv['payment_hash'], payment_secret=inv['payment_secret']) with pytest.raises(RpcError) as err: l1.rpc.waitsendpay(inv['payment_hash']) @@ -2168,7 +2153,7 @@ def test_bad_onion(node_factory, bitcoind): WIRE_INVALID_ONION_HMAC = 0x8000 | 0x4000 | 5 assert err.value.error['data']['failcode'] == WIRE_INVALID_ONION_HMAC assert err.value.error['data']['erring_node'] == mangled_nodeid - assert err.value.error['data']['erring_channel'] == route[2]['channel'] + assert err.value.error['data']['erring_channel'] == route[2]['short_channel_id_dir'].split('/')[0] # We should see a WIRE_UPDATE_FAIL_MALFORMED_HTLC from l4. line = l4.daemon.is_in_log(r'\[OUT\] 0087') @@ -2180,7 +2165,7 @@ def test_bad_onion(node_factory, bitcoind): l1.daemon.wait_for_log(r'failcode .* from onionreply .*{sha}'.format(sha=sha)) # Replace id with a different pubkey, so onion encoded badly at second hop. - route[1]['id'] = mangled_nodeid + route[1]['node_id_out'] = mangled_nodeid l1.rpc.sendpay(route, inv['payment_hash'], payment_secret=inv['payment_secret']) with pytest.raises(RpcError) as err: l1.rpc.waitsendpay(inv['payment_hash']) @@ -2190,7 +2175,7 @@ def test_bad_onion(node_factory, bitcoind): assert err.value.error['code'] == PAY_TRY_OTHER_ROUTE assert err.value.error['data']['failcode'] == WIRE_INVALID_ONION_HMAC assert err.value.error['data']['erring_node'] == mangled_nodeid - assert err.value.error['data']['erring_channel'] == route[1]['channel'] + assert err.value.error['data']['erring_channel'] == route[1]['short_channel_id_dir'].split('/')[0] def test_bad_onion_immediate_peer(node_factory, bitcoind): @@ -2198,7 +2183,7 @@ def test_bad_onion_immediate_peer(node_factory, bitcoind): l1, l2 = node_factory.line_graph(2, opts=[{}, {'dev-fail-process-onionpacket': None}]) inv = l2.rpc.invoice(123000, 'test_bad_onion_immediate_peer', 'description') - route = l1.rpc.getroute(l2.info['id'], 123000, 1)['route'] + route = l1.single_route(l2.info['id'], 123000) assert len(route) == 1 l1.rpc.sendpay(route, inv['payment_hash'], payment_secret=inv['payment_secret']) @@ -3102,11 +3087,11 @@ def test_emergencyrecoverpenaltytxn(node_factory, bitcoind): stubs = l1.rpc.emergencyrecover()["stubs"] assert l1.daemon.is_in_log('channel {} already exists!'.format(_['channel_id'])) - l2.rpc.pay(l1.rpc.invoice(25000000, 'lbl1', 'desc1')['bolt11']) + l2.rpc.xpay(l1.rpc.invoice(25000000, 'lbl1', 'desc1')['bolt11']) tx = l2.rpc.dev_sign_last_tx(l1.info['id'])['tx'] - l2.rpc.pay(l1.rpc.invoice(25000000, 'lbl2', 'desc2')['bolt11']) + l2.rpc.xpay(l1.rpc.invoice(25000000, 'lbl2', 'desc2')['bolt11']) l1.stop() @@ -3222,7 +3207,7 @@ def test_recover_plugin(node_factory, bitcoind): # successful payments i31 = l1.rpc.invoice(10000, 'i31', 'desc') - l2.rpc.pay(i31['bolt11']) + l2.rpc.xpay(i31['bolt11']) # Now, move l2 back in time. l2.stop() @@ -3396,7 +3381,7 @@ def test_listforwards_and_listhtlcs(node_factory, bitcoind): # successful payments i31 = l3.rpc.invoice(1000, 'i31', 'desc') - l1.rpc.pay(i31['bolt11']) + l1.rpc.xpay(i31['bolt11']) # 1 htlc in, 1 htlc out. assert len(l2.rpc.listhtlcs()['htlcs']) == 2 @@ -3415,11 +3400,11 @@ def test_listforwards_and_listhtlcs(node_factory, bitcoind): assert len(l2.rpc.listhtlcs(id=c12, index='updated', start=1, limit=1)['htlcs']) == 1 i41 = l4.rpc.invoice(2000, 'i41', 'desc') - l1.rpc.pay(i41['bolt11']) + l1.rpc.xpay(i41['bolt11']) # failed payment failed_inv = l3.rpc.invoice(4000, 'failed', 'desc') - failed_route = l1.rpc.getroute(l3.info['id'], 4000, 1)['route'] + failed_route = l1.single_route(l3.info['id'], 4000) l2.rpc.close(c23) @@ -3585,7 +3570,7 @@ def test_listforwards_wait(node_factory, executor): amt1 = 1000 inv1 = l3.rpc.invoice(amt1, 'inv1', 'desc') - l1.rpc.pay(inv1['bolt11']) + l1.rpc.xpay(inv1['bolt11'], dev_use_shadow=False) waitres = waitcreate.result(TIMEOUT) assert waitres == {'subsystem': 'forwards', @@ -3614,8 +3599,8 @@ def test_listforwards_wait(node_factory, executor): l2.daemon.wait_for_logs(['waiting on forwards created 2', 'waiting on forwards updated 2']) time.sleep(1) - with pytest.raises(RpcError, match="WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS"): - l1.rpc.pay(inv2['bolt11']) + with pytest.raises(RpcError, match="incorrect_or_unknown_payment_details"): + l1.rpc.xpay(inv2['bolt11']) waitres = waitcreate.result(TIMEOUT) assert waitres == {'subsystem': 'forwards', @@ -3674,7 +3659,7 @@ def test_listhtlcs_wait(node_factory, bitcoind, executor): amt1 = 1000 inv1 = l3.rpc.invoice(amt1, 'inv1', 'desc') - l1.rpc.pay(inv1['bolt11']) + l1.rpc.xpay(invstring=inv1['bolt11'], dev_use_shadow=False) waitres = waitcreate.result(TIMEOUT) assert waitres == {'subsystem': 'htlcs', @@ -3708,8 +3693,8 @@ def test_listhtlcs_wait(node_factory, bitcoind, executor): waitcreate = executor.submit(l2.rpc.wait, subsystem='htlcs', indexname='created', nextvalue=4) l2.daemon.wait_for_log('waiting on htlcs created 4') - with pytest.raises(RpcError, match="WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS"): - l1.rpc.pay(inv2['bolt11']) + with pytest.raises(RpcError, match="incorrect_or_unknown_payment_details"): + l1.rpc.xpay(inv2['bolt11'], dev_use_shadow=False) waitres = waitcreate.result(TIMEOUT) assert waitres == {'subsystem': 'htlcs', @@ -3744,7 +3729,7 @@ def test_listforwards_ancient(node_factory, bitcoind): amt1 = 1000 inv1 = l3.rpc.invoice(amt1, 'inv1', 'desc') - l1.rpc.pay(inv1['bolt11']) + l1.rpc.xpay(inv1['bolt11']) forwards = l2.rpc.listforwards()['forwards'] assert len(forwards) == 1 @@ -4877,9 +4862,11 @@ def test_preapprove(node_factory, bitcoind, preapprove): l1.daemon.wait_for_log("preapprove_keysend: check_only=0") -def test_preapprove_use(node_factory, bitcoind): +@pytest.mark.parametrize("xkeysend", [False, True]) +def test_preapprove_use(node_factory, bitcoind, xkeysend): """Test preapprove calls implicitly made by pay and keysend""" - l1, l2 = node_factory.line_graph(2, opts=[{}, {'dev-hsmd-fail-preapprove': None}]) + l1, l2 = node_factory.line_graph(2, opts=[{}, {'dev-hsmd-fail-preapprove': None, + 'allow-deprecated-apis': True}]) # Create some balance, make sure it's entirely settled. l1.pay(l2, 200000000) @@ -4888,17 +4875,23 @@ def test_preapprove_use(node_factory, bitcoind): # This will fail at the preapprove step. inv = l1.rpc.invoice(123000, 'label', 'description', 3700)['bolt11'] with pytest.raises(RpcError, match='invoice was declined'): - l2.rpc.pay(inv) + l2.rpc.xpay(inv) # This will fail the same way with pytest.raises(RpcError, match='invoice was declined'): - l2.rpc.check('pay', bolt11=inv) + l2.rpc.check('xpay', invstring=inv) # Now keysend. with pytest.raises(RpcError, match='keysend was declined'): - l2.rpc.keysend(l1.info['id'], 1000) + if xkeysend: + l2.rpc.xkeysend(l1.info['id'], 1000) + else: + l2.rpc.keysend(l1.info['id'], 1000) with pytest.raises(RpcError, match='keysend was declined'): - l2.rpc.check('keysend', destination=l1.info['id'], amount_msat=1000) + if xkeysend: + l2.rpc.check('xkeysend', destination=l1.info['id'], amount_msat=1000) + else: + l2.rpc.check('keysend', destination=l1.info['id'], amount_msat=1000) def test_badparam_discretion(node_factory): diff --git a/tests/test_opening.py b/tests/test_opening.py index 4954c31b87b4..918e37bbda44 100644 --- a/tests/test_opening.py +++ b/tests/test_opening.py @@ -100,7 +100,7 @@ def test_multifunding_v2_best_effort(node_factory, bitcoind): working_chans = [l4] if failed_sign else [l2, l4] for ldest in working_chans: inv = ldest.rpc.invoice(5000, 'i{}'.format(i), 'i{}'.format(i))['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) # Function to find the SCID of the channel that is # currently open. @@ -653,7 +653,7 @@ def test_v2_rbf_liquidity_ad(node_factory, bitcoind, chainparams): # send some payments, mine a block or two inv = l2.rpc.invoice(10**4, '1', 'no_1') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) # l2 attempts to close a channel that it leased, should succeed # (channel isnt leased) @@ -1646,7 +1646,7 @@ def test_zeroconf_open(bitcoind, node_factory): l2alias = only_one(l2.rpc.listpeerchannels(l3.info['id'])['channels'])['alias']['local'] assert(hop['pubkey'] == l2.info['id']) # l2 is the entrypoint assert(hop['short_channel_id'] == l2alias) # Alias has to make sense to entrypoint - l2.rpc.pay(inv) + l2.rpc.xpay(inv) # Ensure lightningd knows about the balance change before # attempting the other way around. @@ -1654,7 +1654,7 @@ def test_zeroconf_open(bitcoind, node_factory): # Inverse payments should work too inv = l2.rpc.invoice(10**5, 'lbl', 'desc')['bolt11'] - l3.rpc.pay(inv) + l3.rpc.xpay(inv) def test_zeroconf_public(bitcoind, node_factory, chainparams): @@ -1792,7 +1792,7 @@ def test_zeroconf_forward(node_factory, bitcoind): # Make sure (esp in non-dev-mode) blockheights agree so we don't WIRE_EXPIRY_TOO_SOON... sync_blockheight(bitcoind, [l1, l2, l3]) inv = l3.rpc.invoice(42 * 10**6, 'inv1', 'desc')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) # And now try the other way around: zeroconf channel first # followed by a public one. @@ -1803,7 +1803,7 @@ def test_zeroconf_forward(node_factory, bitcoind): wait_for(lambda: (p['htlcs'] == [] for p in l2.rpc.listpeerchannels()['channels'])) inv = l1.rpc.invoice(42, 'back1', 'desc')['bolt11'] - l3.rpc.pay(inv) + l3.rpc.xpay(inv) def test_zeroconf_refusal(bitcoind, node_factory, chainparams): @@ -2068,7 +2068,7 @@ def test_zeroconf_multichan_forward(node_factory): l2.daemon.wait_for_log(r'peer_in WIRE_CHANNEL_READY') l3.daemon.wait_for_log(r'peer_in WIRE_CHANNEL_READY') - l1.rpc.pay(inv) + l1.rpc.xpay(inv) for c in l2.rpc.listpeerchannels(l3.info['id'])['channels']: if c['channel_id'] == zeroconf_cid: @@ -2143,7 +2143,7 @@ def test_zeroreserve(node_factory, bitcoind): # Now do some drain tests on c1, as that should be drainable # completely by l2 being the fundee - l1.rpc.keysend(l2.info['id'], 10 * 7) # Something above dust for sure + l1.rpc.xkeysend(l2.info['id'], 10 * 7) # Something above dust for sure l2.drain(l1) # Remember that this is the reserve l1 imposed on l2, so l2 can drain completely @@ -2682,10 +2682,10 @@ def test_multifunding_all_amount(node_factory, bitcoind): wait_for(lambda: [c['state'] for c in (l1.rpc.listpeerchannels()['channels'])] == ['CHANNELD_NORMAL', 'CHANNELD_NORMAL']) inv = l2.rpc.invoice(5000, 'i1', 'i1')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) inv2 = l3.rpc.invoice(100000, 'i2', 'i2')['bolt11'] - l1.rpc.pay(inv2) + l1.rpc.xpay(inv2) @pytest.mark.parametrize("dopay", [True, False]) # Whether to send a payment or not @@ -2734,7 +2734,7 @@ def censoring_sendrawtx(tx): # risking any of our funds. if dopay: inv = l2.rpc.invoice(1, "payme", "my stake in the unconfirmed channel") - l1.rpc.pay(inv["bolt11"]) + l1.rpc.xpay(inv["bolt11"]) wait_for(lambda: only_one(l2.rpc.listpeerchannels()['channels'])['to_us_msat'] == 1) # We need *another* channel to make it forget the first though! (One block later, otherwise diff --git a/tests/test_pay.py b/tests/test_pay.py index 5294e175761a..76aff48dfb05 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -11,7 +11,6 @@ tu64_encode ) import copy -import json import os import pytest import random @@ -85,6 +84,14 @@ def test_pay(node_factory): assert apys_1[0]['routed_in_msat'] == apys_2[0]['routed_out_msat'] +def test_pay_invstring(node_factory): + l1, l2 = node_factory.line_graph(2, opts={'allow-deprecated-apis': True}) + + l1.rpc.check_request_schemas = False + inv = l2.rpc.invoice(123000, 'test_pay_invstring', 'description')['bolt11'] + l1.rpc.call('pay', {'invstring': inv}) + + def test_pay_amounts(node_factory): l1, l2 = node_factory.line_graph(2) inv = l2.rpc.invoice(Millisatoshi("123sat"), 'test_pay_amounts', 'description')['bolt11'] @@ -103,51 +110,33 @@ def test_pay_limits(node_factory): """Test that we enforce fee max percentage and max delay""" l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True) - # FIXME: pylightning should define these! - PAY_STOPPED_RETRYING = 210 + # FIXME: pylightning should define this! + PAY_ROUTE_TOO_EXPENSIVE = 206 inv = l3.rpc.invoice("any", "any", 'description') # Fee too high. - err = r'Fee exceeds our fee budget: [1-9]msat > 0msat, discarding route' + err = r'Could not find route without excessive cost' with pytest.raises(RpcError, match=err) as err: - l1.rpc.call('pay', {'bolt11': inv['bolt11'], 'amount_msat': 100000, 'maxfeepercent': 0.0001, 'exemptfee': 0}) - - assert err.value.error['code'] == PAY_STOPPED_RETRYING + l1.rpc.call('xpay', {'invstring': inv['bolt11'], 'amount_msat': 100000, 'maxfee': 1}) - # It should have retried two more times (one without routehint and one with routehint) - status = l1.rpc.call('paystatus', {'bolt11': inv['bolt11']})['pay'][0]['attempts'] + assert err.value.error['code'] == PAY_ROUTE_TOO_EXPENSIVE - # We have an internal test to see if we can reach the destination directly - # without a routehint, that will enable a NULL-routehint. We will then try - # with the provided routehint, and the NULL routehint, resulting in 2 - # attempts. - assert(len(status) == 2) - assert(status[0]['failure']['code'] == 205) - - failmsg = r'CLTV delay exceeds our CLTV budget' + failmsg = r'Could not find route without excessive delays' # Delay too high. with pytest.raises(RpcError, match=failmsg) as err: - l1.rpc.call('pay', {'bolt11': inv['bolt11'], 'amount_msat': 100000, 'maxdelay': 0}) - - assert err.value.error['code'] == PAY_STOPPED_RETRYING - # Should also have retried two more times. - status = l1.rpc.call('paystatus', {'bolt11': inv['bolt11']})['pay'][1]['attempts'] + l1.rpc.call('xpay', {'invstring': inv['bolt11'], 'amount_msat': 100000, 'maxdelay': 0}) - assert(len(status) == 2) - assert(status[0]['failure']['code'] == 205) + assert err.value.error['code'] == PAY_ROUTE_TOO_EXPENSIVE # This fails! - err = r'Fee exceeds our fee budget: 2msat > 1msat, discarding route' + err = r'Could not find route without excessive cost' with pytest.raises(RpcError, match=err) as err: - l1.rpc.pay(bolt11=inv['bolt11'], amount_msat=100000, maxfee=1) + l1.rpc.xpay(invstring=inv['bolt11'], amount_msat=100000, maxfee=1) # This works, because fee is less than exemptfee. l1.dev_pay(inv['bolt11'], amount_msat=100000, maxfeepercent=0.0001, exemptfee=2000, dev_use_shadow=False) - status = l1.rpc.call('paystatus', {'bolt11': inv['bolt11']})['pay'][3]['attempts'] - assert len(status) == 1 - assert status[0]['strategy'] == "Initial attempt" def test_pay_maxdelay_direct_channel(node_factory): @@ -157,8 +146,8 @@ def test_pay_maxdelay_direct_channel(node_factory): inv = l2.rpc.invoice('10000msat', 'test_pay_maxdelay_direct', 'description')['bolt11'] # Delay too low for direct channel. - with pytest.raises(RpcError, match=r'CLTV delay exceeds our CLTV budget'): - l1.rpc.call('pay', {'bolt11': inv, 'maxdelay': 1}) + with pytest.raises(RpcError, match=r'Could not find route without excessive delays'): + l1.rpc.call('xpay', {'invstring': inv, 'maxdelay': 1}) def test_pay_exclude_node(node_factory, bitcoind): @@ -178,19 +167,10 @@ def test_pay_exclude_node(node_factory, bitcoind): amount = 10**8 inv = l3.rpc.invoice(amount, "test1", 'description')['bolt11'] - with pytest.raises(RpcError): + # It should have eliminated route hint. + with pytest.raises(RpcError, match=r"Failed after 1 attempts. We got a weird error \(temporary_node_failure\) for the invoice's route hint \([0-9x]*/0\): disabling it for this payment. Then routing failed: We could not find a usable set of paths. All 1 channels to the destination are disabled."): l1.rpc.pay(inv) - # It should have retried (once without routehint, too) - status = l1.rpc.call('paystatus', {'bolt11': inv})['pay'][0]['attempts'] - - # Excludes channel, then ignores routehint which includes that, then - # it excludes other channel. - assert len(status) == 2 - assert status[0]['strategy'] == "Initial attempt" - assert status[0]['failure']['data']['failcodename'] == 'WIRE_TEMPORARY_NODE_FAILURE' - assert 'failure' in status[1] - # Get a fresh invoice, but do it before other routes exist, so routehint # will be via l2. inv = l3.rpc.invoice(amount, "test2", 'description')['bolt11'] @@ -223,15 +203,7 @@ def test_pay_exclude_node(node_factory, bitcoind): # This `pay` will work l1.rpc.pay(inv) - # It should have retried (once without routehint, too) - status = l1.rpc.call('paystatus', {'bolt11': inv})['pay'][0]['attempts'] - - # Excludes channel, then ignores routehint which includes that, then - # it excludes other channel. - assert len(status) == 2 - assert status[0]['strategy'] == "Initial attempt" - assert status[0]['failure']['data']['failcodename'] == 'WIRE_TEMPORARY_NODE_FAILURE' - assert 'success' in status[1] + [p['status'] for p in l1.rpc.listsendpays()['payments']] == ['failed', 'failed', 'complete'] def test_pay0(node_factory): @@ -270,7 +242,7 @@ def test_pay_disconnect(node_factory, bitcoind): rhash = inv['payment_hash'] # Can't use `pay` since that'd notice that we can't route, due to disabling channel_update - route = l1.rpc.getroute(l2.info['id'], 123000, 1)["route"] + route = l1.single_route(l2.info['id'], 123000) l2.stop() # Make sure channeld has exited! @@ -310,38 +282,6 @@ def test_pay_disconnect(node_factory, bitcoind): l1.daemon.wait_for_log('ONCHAIN') -def test_pay_get_error_with_update(node_factory): - """We should process an update inside a temporary_channel_failure""" - l1, l2, l3 = node_factory.line_graph(3, opts={'log-level': 'io'}, fundchannel=True, wait_for_announce=True) - chanid2 = l2.get_channel_scid(l3) - - inv = l3.rpc.invoice(123000, 'test_pay_get_error_with_update', 'description') - - # Make sure it's not doing startup any more (where it doesn't disable channels!) - l2.daemon.wait_for_log("channel_gossip: no longer in startup mode", timeout=70) - - # Make sure l2 doesn't tell l1 directly that channel is disabled. - l2.rpc.dev_suppress_gossip() - l3.stop() - - # Make sure that l2 has seen disconnect, considers channel disabled. - wait_for(lambda: only_one(l2.rpc.listpeerchannels(l3.info['id'])['channels'])['peer_connected'] is False) - - assert(l1.is_channel_active(chanid2)) - - with pytest.raises(RpcError, match=r'WIRE_TEMPORARY_CHANNEL_FAILURE'): - l1.rpc.pay(inv['bolt11']) - - # Make sure we get an onionreply, without the type prefix of the nested - # channel_update, and it should patch it to include a type prefix. The - # prefix 0x0102 should be in the channel_update, but not in the - # onionreply (negation of 0x0102 in the RE) - l1.daemon.wait_for_log(r'Extracted channel_update 0102.*from onionreply 1007008a[0-9a-fA-F]{276}$') - - # And now monitor for l1 to apply the channel_update we just extracted - wait_for(lambda: not l1.is_channel_active(chanid2)) - - def test_pay_error_update_fees(node_factory): """We should process an update inside a temporary_channel_failure""" l1, l2, l3 = node_factory.line_graph(3, fundchannel=True, wait_for_announce=True) @@ -359,19 +299,16 @@ def test_pay_error_update_fees(node_factory): l2.rpc.setchannel(l3.info['id'], 1337, 137, enforcedelay=0) # Should bounce off and retry... - l1.rpc.pay(inv1['bolt11']) - attempts = only_one(l1.rpc.paystatus(inv1['bolt11'])['pay'])['attempts'] - assert len(attempts) == 2 - # WIRE_FEE_INSUFFICIENT = UPDATE|12 - assert attempts[0]['failure']['data']['failcode'] == 4108 + ret = l1.rpc.pay(inv1['bolt11']) + assert ret['parts'] == 2 + payments = l1.rpc.listsendpays(inv1['bolt11'])['payments'] + assert len(payments) == 2 - # FIXME: We *DO NOT* handle misleading routehints! - # # Should ignore old routehint and do the same... - # l1.rpc.pay(inv2['bolt11']) - # attempts = only_one(l1.rpc.paystatus(inv2['bolt11'])['pay'])['attempts'] - # assert len(attempts) == 2 - # # WIRE_FEE_INSUFFICIENT = UPDATE|12 - # assert attempts[0]['failure']['data']['failcode'] == 4108 + # Should ignore old routehint and do the same... + ret = l1.rpc.pay(inv2['bolt11']) + assert ret['parts'] == 2 + payments = l1.rpc.listsendpays(inv2['bolt11'])['payments'] + assert len(payments) == 2 def test_pay_optional_args(node_factory): @@ -445,15 +382,6 @@ def test_payment_success_persistence(node_factory, bitcoind, executor): assert len(payments) == 1 and payments[0]['status'] == 'complete' assert len(invoices) == 1 and invoices[0]['status'] == 'paid' - l1.wait_local_channel_active(chanid) - - # A duplicate should succeed immediately (nop) and return correct preimage. - preimage = l1.dev_pay( - inv1['bolt11'], - dev_use_shadow=False - )['payment_preimage'] - assert l1.rpc.dev_rhash(preimage)['rhash'] == inv1['payment_hash'] - @pytest.mark.openchannel('v1') @pytest.mark.openchannel('v2') @@ -503,7 +431,7 @@ def test_payment_failed_persistence(node_factory, executor): assert len(payments) == 1 and payments[0]['status'] == 'failed' # Another attempt should also fail. - with pytest.raises(RpcError): + with pytest.raises(RpcError, match='Invoice expired'): l1.rpc.pay(inv1['bolt11']) @@ -519,7 +447,7 @@ def test_payment_duplicate_uncommitted(node_factory, executor): inv1 = l2.rpc.invoice(1000, 'inv1', 'inv1') # Start first payment, but not yet in db. - fut = executor.submit(l1.rpc.pay, inv1['bolt11']) + fut = executor.submit(l1.rpc.xpay, inv1['bolt11']) # Make sure that's started... l1.daemon.wait_for_log('peer_out WIRE_UPDATE_ADD_HTLC') @@ -529,15 +457,16 @@ def test_payment_duplicate_uncommitted(node_factory, executor): assert len(payments) == 1 assert payments[0]['status'] == 'pending' and payments[0]['payment_hash'] == inv1['payment_hash'] - # Second one will succeed eventually. - fut2 = executor.submit(l1.rpc.pay, inv1['bolt11']) + # Second one will be stopped. + fut2 = executor.submit(l1.rpc.xpay, inv1['bolt11']) # Now, let it commit. l1.rpc.dev_reenable_commit(l2.info['id']) - # These should succeed. + # First should succeed, second should be denied. fut.result(TIMEOUT) - fut2.result(TIMEOUT) + with pytest.raises(RpcError, match="Payment with groupid=[0-9]* still in progress, cannot retry before that completes"): + fut2.result(TIMEOUT) def test_pay_maxfee_shadow(node_factory): @@ -1323,7 +1252,7 @@ def test_forward_different_fees_and_cltv(node_factory, bitcoind): # FIXME: Add shadow route shadow_route = 0 - route = l2.rpc.getroute(l3.info['id'], 4999999, 1, cltv=18)["route"] + route = l2.single_route(l3.info['id'], 4999999, cltv=18) assert len(route) == 1 # BOLT #7: @@ -1334,8 +1263,8 @@ def test_forward_different_fees_and_cltv(node_factory, bitcoind): # * `amt_to_forward` = 4999999 # * `outgoing_cltv_value` = current-block-height + 18 + 42 # - assert route[0]['amount_msat'] == 4999999 - assert route[0]['delay'] == 18 + shadow_route + assert route[0]['amount_out_msat'] == 4999999 + assert route[0]['cltv_out'] == 18 + shadow_route # BOLT #7: # If A were to send 4,999,999 millisatoshi to C via B, it needs to @@ -1352,13 +1281,13 @@ def test_forward_different_fees_and_cltv(node_factory, bitcoind): # * `onion_routing_packet`: # * `amt_to_forward` = 4999999 # * `outgoing_cltv_value` = current-block-height + 18 + 42 - route = l1.rpc.getroute(l3.info['id'], 4999999, 1, cltv=18)["route"] + route = l1.single_route(l3.info['id'], 4999999, cltv=18) assert len(route) == 2 - assert route[0]['amount_msat'] == 5010198 - assert route[0]['delay'] == 20 + 18 + shadow_route - assert route[1]['amount_msat'] == 4999999 - assert route[1]['delay'] == 18 + shadow_route + assert route[0]['amount_out_msat'] == 5010198 + assert route[0]['cltv_out'] == 20 + 18 + shadow_route + assert route[1]['amount_out_msat'] == 4999999 + assert route[1]['cltv_out'] == 18 + shadow_route inv = l3.rpc.invoice(4999999, 'test_forward_different_fees_and_cltv', 'desc') rhash = inv['payment_hash'] @@ -1416,19 +1345,19 @@ def test_forward_pad_fees_and_cltv(node_factory, bitcoind): l1.wait_channel_active(c1) l1.wait_channel_active(c2) - route = l1.rpc.getroute(l3.info['id'], 4999999, 1)["route"] + route = l1.single_route(l3.info['id'], 4999999) assert len(route) == 2 - assert route[0]['amount_msat'] == 5010198 - assert route[0]['delay'] == 20 + 9 - assert route[1]['amount_msat'] == 4999999 - assert route[1]['delay'] == 9 + assert route[0]['amount_out_msat'] == 5010198 + assert route[0]['cltv_out'] == 20 + 9 + assert route[1]['amount_out_msat'] == 4999999 + assert route[1]['cltv_out'] == 9 # Modify so we overpay, overdo the cltv. - route[0]['amount_msat'] += 2000 - route[0]['delay'] += 20 - route[1]['amount_msat'] += 1000 - route[1]['delay'] += 10 + route[0]['amount_out_msat'] += 2000 + route[0]['cltv_out'] += 20 + route[1]['amount_out_msat'] += 1000 + route[1]['cltv_out'] += 10 # This should work. inv = l3.rpc.invoice(4999999, 'test_forward_pad_fees_and_cltv', 'desc') @@ -1479,13 +1408,13 @@ def test_forward_stats(node_factory, bitcoind): inv = l3.rpc.invoice(amount, "first", "desc") payment_hash = inv['payment_hash'] - route = l1.rpc.getroute(l3.info['id'], amount, 1)['route'] + route = l1.single_route(l3.info['id'], amount) l1.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) l1.rpc.waitsendpay(payment_hash) # l4 rejects since it doesn't know the payment_hash - route = l1.rpc.getroute(l4.info['id'], amount, 1)['route'] + route = l1.single_route(l4.info['id'], amount) payment_hash = "F" * 64 with pytest.raises(RpcError): l1.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) @@ -1493,7 +1422,7 @@ def test_forward_stats(node_factory, bitcoind): # l5 will hold the HTLC hostage. l5.rpc.dev_ignore_htlcs(id=l2.info['id'], ignore=True) - route = l1.rpc.getroute(l5.info['id'], amount, 1)['route'] + route = l1.single_route(l5.info['id'], amount) inv = l5.rpc.invoice(amount, "first", "desc") payment_hash = inv['payment_hash'] l1.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) @@ -1618,7 +1547,7 @@ def test_forward_local_failed_stats(node_factory, bitcoind, executor): inv = l3.rpc.invoice(amount, "first", "desc") payment_hash = inv['payment_hash'] - route = l1.rpc.getroute(l3.info['id'], amount, 1)['route'] + route = l1.single_route(l3.info['id'], amount) l2.rpc.close(c23, 1) @@ -1689,12 +1618,12 @@ def test_forward_local_failed_stats(node_factory, bitcoind, executor): inv = l4.rpc.invoice(amount, 'fourth', 'desc') payment_hash = inv['payment_hash'] - route = l6.rpc.getroute(l4.info['id'], amount, 1)['route'] + route = l6.single_route(l4.info['id'], amount) mangled_nodeid = '0265b6ab5ec860cd257865d61ef0bbf5b3339c36cbda8b26b74e7f1dca490b6510' # Replace id with a different pubkey, so onion encoded badly at l2 hop. - route[1]['id'] = mangled_nodeid + route[1]['node_id_out'] = mangled_nodeid with pytest.raises(RpcError): l6.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) @@ -1777,7 +1706,7 @@ def test_htlcs_cltv_only_difference(node_factory, bitcoind): l4.rpc.dev_ignore_htlcs(id=l3.info['id'], ignore=True) # L2 tries to pay - r = l2.rpc.getroute(l4.info['id'], 10**8, 1)["route"] + r = l2.single_route(l4.info['id'], 10**8) l2.rpc.sendpay(r, h, payment_secret=inv['payment_secret']) # Now increment CLTV @@ -1785,7 +1714,7 @@ def test_htlcs_cltv_only_difference(node_factory, bitcoind): sync_blockheight(bitcoind, [l1, l2, l3, l4]) # L1 tries to pay - r = l1.rpc.getroute(l4.info['id'], 10**8, 1)["route"] + r = l1.single_route(l4.info['id'], 10**8) l1.rpc.sendpay(r, h, payment_secret=inv['payment_secret']) # Now increment CLTV @@ -1793,7 +1722,7 @@ def test_htlcs_cltv_only_difference(node_factory, bitcoind): sync_blockheight(bitcoind, [l1, l2, l3, l4]) # L3 tries to pay - r = l3.rpc.getroute(l4.info['id'], 10**8, 1)["route"] + r = l3.single_route(l4.info['id'], 10**8) l3.rpc.sendpay(r, h, payment_secret=inv['payment_secret']) # Give them time to go through. @@ -1920,11 +1849,10 @@ def listpays_nofail(b11): # It will try l1->l2->l3->l4->l5, which fails. # Finally, fails to find a route. inv = l5.rpc.invoice(10**8, 'test_retry2', 'test_retry2')['bolt11'] - with pytest.raises(RpcError, match=r'4 attempts'): + with pytest.raises(RpcError, match=r'Failed after [0-9]* attempts'): l1.dev_pay(inv, dev_use_shadow=False) -@pytest.mark.slow_test def test_pay_avoid_low_fee_chan(node_factory, bitcoind, executor, chainparams): """Make sure we're able to route around a low fee depleted channel """ @@ -1932,34 +1860,39 @@ def test_pay_avoid_low_fee_chan(node_factory, bitcoind, executor, chainparams): # probably means it needs to be fixed! # Setup: - # sender - router --------- dest - # \ / - # - randomnode - - # router is connected to the destination - # randomnode is also connected to router and the destination, with a low fee + # l1 - l2 ------ l4 + # \ / + # - l3 - + # l2 is connected to the destination + # l3 is also connected to l2 and the destination, with a low fee # path. The channel however, is depleted. - sender, router, randomnode, dest = node_factory.get_nodes(4) - sender.rpc.connect(router.info['id'], 'localhost', router.port) - sender.fundchannel(router, 200000, wait_for_active=True) - router.rpc.connect(dest.info['id'], 'localhost', dest.port) - router_dest_scid, _ = router.fundchannel(dest, 10**6, wait_for_active=True) - randomnode.rpc.connect(dest.info['id'], 'localhost', dest.port) - randomnode_dest_scid, _ = randomnode.fundchannel(dest, 10**6, wait_for_active=True) - - # Router has a depleted channel to randomnode. Mimic this by opening the + l1, l2, l3, l4 = node_factory.get_nodes(4) + node_factory.join_nodes([l1, l2, l4]) + + # l2 has a depleted channel to l3. Mimic this by opening the # channel the other way around. - randomnode.rpc.connect(router.info['id'], 'localhost', router.port) - scid_router_random, _ = randomnode.fundchannel(router, 10**6, wait_for_active=True) + node_factory.join_nodes([l3, l2]) + node_factory.join_nodes([l3, l4]) + + l2l3_scid = first_scid(l2, l3) + l2l4_scid = first_scid(l2, l4) + l3l4_scid = first_scid(l3, l4) # Set relevant fees: - # - High fee from router to dest - # - Low fee from router to randomnode and randomnode to dest - router.rpc.setchannel(router_dest_scid, feebase=0, feeppm=2000, htlcmin=1) - router.rpc.setchannel(scid_router_random, feebase=0, feeppm=1, htlcmin=1) - randomnode.rpc.setchannel(randomnode_dest_scid, feebase=0, feeppm=1, htlcmin=1) + # - High fee from l2 to l4 + # - Low fee from l2 to l3 and l3 to l4 + l2.rpc.setchannel(l2l4_scid, feebase=0, feeppm=2000, htlcmin=1) + l2.rpc.setchannel(l2l3_scid, feebase=0, feeppm=1, htlcmin=1) + l3.rpc.setchannel(l3l4_scid, feebase=0, feeppm=1, htlcmin=1) + + # Make sure l1 sees all the channels. + mine_funding_to_announce(bitcoind, [l1, l2, l3, l4]) def has_gossip(): - channels = sender.rpc.listchannels()['channels'] + channels = l1.rpc.listchannels()['channels'] + if len(channels) != 4 * 2: + return False + if sum(1 for c in channels if c['fee_per_millionth'] == 1) != 2: return False @@ -1968,26 +1901,24 @@ def has_gossip(): return True - # Make sure all relevant gossip reached the sender. - mine_funding_to_announce(bitcoind, [sender, router, randomnode, dest]) wait_for(has_gossip) def listpays_nofail(b11): while True: - pays = sender.rpc.listpays(b11)['pays'] + pays = l1.rpc.listpays(b11)['pays'] if len(pays) != 0: if only_one(pays)['status'] == 'complete': return assert only_one(pays)['status'] != 'failed' - inv = dest.rpc.invoice(100000000, 'test_low_fee', 'test_low_fee') + inv = l4.rpc.invoice(100000000, 'test_low_fee', 'test_low_fee') # Make sure listpays doesn't transiently show failure while pay # is retrying. fut = executor.submit(listpays_nofail, inv['bolt11']) # Pay sender->dest should succeed via non-depleted channel - sender.dev_pay(inv['bolt11'], dev_use_shadow=False) + l1.dev_pay(inv['bolt11'], dev_use_shadow=False) fut.result() @@ -2008,11 +1939,8 @@ def test_pay_routeboost(node_factory, bitcoind): l1, l2 = node_factory.line_graph(2, announce_channels=True, wait_for_announce=True) l3, l4, l5 = node_factory.line_graph(3, announce_channels=False, wait_for_announce=False) - # This should a "could not find a route" because that's true. - error = r'Destination [a-f0-9]{66} is not reachable directly and all routehints were unusable' - - with pytest.raises(RpcError, match=error): - l1.rpc.pay(l5.rpc.invoice(10**8, 'test_retry', 'test_retry')['bolt11']) + with pytest.raises(RpcError, match=rf"Failed: Unknown destination node {l5.info['id']}"): + l1.rpc.xpay(l5.rpc.invoice(10**8, 'test_retry', 'test_retry')['bolt11']) l2.rpc.connect(l3.info['id'], 'localhost', l3.port) scidl2l3, _ = l2.fundchannel(l3, 10**6) @@ -2037,25 +1965,12 @@ def test_pay_routeboost(node_factory, bitcoind): assert only_one(only_one(l1.rpc.decode(inv['bolt11'])['routes'])) # Now we should be able to pay it. - l1.dev_pay(inv['bolt11'], dev_use_shadow=False) - - # Status should show all the gory details. - status = l1.rpc.call('paystatus', [inv['bolt11']]) - assert only_one(status['pay'])['bolt11'] == inv['bolt11'] - assert only_one(status['pay'])['amount_msat'] == Millisatoshi(10**5) - assert only_one(status['pay'])['destination'] == l4.info['id'] - assert 'label' not in only_one(status['pay']) - assert 'routehint_modifications' not in only_one(status['pay']) - assert 'local_exclusions' not in only_one(status['pay']) - attempts = only_one(status['pay'])['attempts'] - scid34 = l3.rpc.listpeerchannels(l4.info['id'])['channels'][0]['alias']['local'] - assert(len(attempts) == 1) - a = attempts[0] - assert(a['strategy'] == "Initial attempt") - assert('success' in a) - assert('payment_preimage' in a['success']) + ret = l1.rpc.xpay(inv['bolt11'], dev_use_shadow=False) + assert ret['failed_parts'] == 0 + assert ret['successful_parts'] == 1 # With dev-route option we can test longer routehints. + scid34 = l3.rpc.listpeerchannels(l4.info['id'])['channels'][0]['alias']['local'] scid45 = l4.rpc.listpeerchannels(l5.info['id'])['channels'][0]['alias']['local'] routel3l4l5 = [{'id': l3.info['id'], 'short_channel_id': scid34, @@ -2071,13 +1986,9 @@ def test_pay_routeboost(node_factory, bitcoind): label='test_pay_routeboost2', description='test_pay_routeboost2', dev_routes=[routel3l4l5]) - l1.dev_pay(inv['bolt11'], dev_use_shadow=False) - status = l1.rpc.call('paystatus', [inv['bolt11']]) - pay = only_one(status['pay']) - attempts = pay['attempts'] - assert(len(attempts) == 1) - assert 'failure' not in attempts[0] - assert 'success' in attempts[0] + ret = l1.rpc.xpay(inv['bolt11'], dev_use_shadow=False) + assert ret['failed_parts'] == 0 + assert ret['successful_parts'] == 1 # Finally, it should fall back to second routehint if first fails. # (Note, this is not public because it's not 6 deep). To test this @@ -2107,24 +2018,10 @@ def test_pay_routeboost(node_factory, bitcoind): label='test_pay_routeboost5', description='test_pay_routeboost5', dev_routes=[routel3l4l5, routel3l5]) - l1.dev_pay(inv['bolt11'], label="paying test_pay_routeboost5", - dev_use_shadow=False) - - status = l1.rpc.call('paystatus', [inv['bolt11']]) - assert only_one(status['pay'])['bolt11'] == inv['bolt11'] - assert only_one(status['pay'])['destination'] == l5.info['id'] - assert only_one(status['pay'])['label'] == "paying test_pay_routeboost5" - assert 'routehint_modifications' not in only_one(status['pay']) - assert 'local_exclusions' not in only_one(status['pay']) - attempts = only_one(status['pay'])['attempts'] - - # First routehint in the invoice fails, we may retry that one - # unsuccessfully before switching, hence the >2 instead of =2 - assert len(attempts) >= 2 - assert 'success' not in attempts[0] - assert 'success' in attempts[-1] - # TODO Add assertion on the routehint once we add them to the pay - # output + ret = l1.rpc.xpay(inv['bolt11'], label="paying test_pay_routeboost5", + dev_use_shadow=False) + assert ret['failed_parts'] == 0 + assert ret['successful_parts'] == 1 def test_setchannel_usage(node_factory, bitcoind): @@ -2413,28 +2310,27 @@ def test_setchannel_routing(node_factory, bitcoind): # Since it rounds up, it will use 4001792 as max capacity. # Should refuse to route this! - with pytest.raises(RpcError, match=r'Could not find a route'): - l1.rpc.getroute(l3.info['id'], 4001793, 1, fuzzpercent=0)["route"] + with pytest.raises(RpcError, match=r'feasible|exceeds htlc_maximum_msat'): + l1.rpc.getroutes(l1.info['id'], l3.info['id'], 4001793, layers=['auto.localchans', 'auto.sourcefree'], maxfee_msat=10000000, final_cltv=9, maxparts=1) # We should consider this unroutable! (MPP is disabled!) inv = l3.dev_invoice(amount_msat=4001793, label='test_setchannel_1', description='desc', dev_routes=[]) - with pytest.raises(RpcError) as routefail: + with pytest.raises(RpcError, match=f'The shortest path is [0-9x]*->{scid}, but {scid}/0 exceeds htlc_maximum_msat ~4001792msat'): l1.dev_pay(inv['bolt11'], dev_use_shadow=False) - assert routefail.value.error['attempts'][0]['failreason'] == 'No path found' # 1337 + 4000000 * 137 / 1000000 = 1885 - route_ok = l1.rpc.getroute(l3.info['id'], 4000000, 1)["route"] + route_ok = l1.single_route(l3.info['id'], 4000000) assert len(route_ok) == 2 - assert route_ok[0]['amount_msat'] == 4001885 - assert route_ok[1]['amount_msat'] == 4000000 + assert route_ok[0]['amount_out_msat'] == 4001885 + assert route_ok[1]['amount_out_msat'] == 4000000 # Make variant that tries to pay more than allowed htlc! route_bad = copy.deepcopy(route_ok) - route_bad[0]['amount_msat'] = Millisatoshi(4001887) - route_bad[1]['amount_msat'] = Millisatoshi(4000001) + route_bad[0]['amount_out_msat'] = Millisatoshi(4001887) + route_bad[1]['amount_out_msat'] = Millisatoshi(4000001) assert route_bad != route_ok # In case l3 includes a routehint, we need to make sure they also know @@ -2457,14 +2353,14 @@ def test_setchannel_routing(node_factory, bitcoind): l1.rpc.waitsendpay(inv['payment_hash']) # Now try below minimum - route_ok = l1.rpc.getroute(l3.info['id'], 17, 1)["route"] + route_ok = l1.single_route(l3.info['id'], 17) assert len(route_ok) == 2 - assert route_ok[0]['amount_msat'] == 1337 + 17 - assert route_ok[1]['amount_msat'] == 17 + assert route_ok[0]['amount_out_msat'] == 1337 + 17 + assert route_ok[1]['amount_out_msat'] == 17 route_bad = copy.deepcopy(route_ok) - route_bad[0]['amount_msat'] = Millisatoshi(1337 + 16) - route_bad[1]['amount_msat'] = Millisatoshi(16) + route_bad[0]['amount_out_msat'] = Millisatoshi(1337 + 16) + route_bad[1]['amount_out_msat'] = Millisatoshi(16) assert route_bad != route_ok inv = l3.rpc.invoice(17, 'test_setchannel_3', 'desc') @@ -2510,10 +2406,10 @@ def test_setchannel_zero(node_factory, bitcoind): wait_for(lambda: [c['fee_per_millionth'] for c in l1.rpc.listchannels(scid)['channels']] == [0, DEF_PPM]) # test if zero fees are applied - route = l1.rpc.getroute(l3.info['id'], 4999999, 1)["route"] + route = l1.single_route(l3.info['id'], 4999999) assert len(route) == 2 - assert route[0]['amount_msat'] == 4999999 - assert route[1]['amount_msat'] == 4999999 + assert route[0]['amount_out_msat'] == 4999999 + assert route[1]['amount_out_msat'] == 4999999 # Wait for l3 to know about our low-balling, otherwise they'll add a wrong # routehint to the invoice. @@ -2672,7 +2568,14 @@ def test_channel_spendable(node_factory, bitcoind, anchors): # We should be able to spend this much, and not one msat more! amount = l1.rpc.listpeerchannels()['channels'][0]['spendable_msat'] - route = l1.rpc.getroute(l2.info['id'], amount + 1, riskfactor=1, fuzzpercent=0)['route'] + # auto.localchans would refuse amount+1, so bypass it to test sendpay failure + route = only_one(l1.rpc.getroutes(source=l1.info['id'], + destination=l2.info['id'], + amount_msat=amount + 1, + layers=["auto.sourcefree"], + maxfee_msat=10000000, + final_cltv=9, + maxparts=1)['routes'])['path'] l1.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) # This should fail locally with "capacity exceeded" @@ -2680,7 +2583,7 @@ def test_channel_spendable(node_factory, bitcoind, anchors): l1.rpc.waitsendpay(payment_hash, TIMEOUT) # Exact amount should succeed. - route = l1.rpc.getroute(l2.info['id'], amount, riskfactor=1, fuzzpercent=0)['route'] + route = l1.single_route(l2.info['id'], amount) l1.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) # Amount should drop to 0 once HTLC is sent; we have time, thanks to @@ -2699,7 +2602,14 @@ def test_channel_spendable(node_factory, bitcoind, anchors): amount = l2.rpc.listpeerchannels()['channels'][0]['spendable_msat'] # Turns out we won't route this, as it's over max - reserve: - route = l2.rpc.getroute(l1.info['id'], amount + 1, riskfactor=1, fuzzpercent=0)['route'] + # auto.localchans would refuse amount+1, so bypass it to test sendpay failure + route = only_one(l2.rpc.getroutes(source=l2.info['id'], + destination=l1.info['id'], + amount_msat=amount + 1, + layers=["auto.sourcefree"], + maxfee_msat=10000000, + final_cltv=9, + maxparts=1)['routes'])['path'] l2.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) # This should fail locally with "capacity exceeded" @@ -2707,7 +2617,7 @@ def test_channel_spendable(node_factory, bitcoind, anchors): l2.rpc.waitsendpay(payment_hash, TIMEOUT) # Exact amount should succeed. - route = l2.rpc.getroute(l1.info['id'], amount, riskfactor=1, fuzzpercent=0)['route'] + route = l2.single_route(l1.info['id'], amount) l2.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) # Amount should drop to 0 once HTLC is sent; we have time, thanks to @@ -2729,7 +2639,15 @@ def test_channel_receivable(node_factory, bitcoind): # We should be able to receive this much, and not one msat more! amount = l2.rpc.listpeerchannels()['channels'][0]['receivable_msat'] - route = l1.rpc.getroute(l2.info['id'], amount + 1, riskfactor=1, fuzzpercent=0)['route'] + # If we get askrene to use the auto.localchans layer, it will know! + # So use getroutes without that + route = only_one(l1.rpc.getroutes(source=l1.info['id'], + destination=l2.info['id'], + amount_msat=amount + 1, + layers=["auto.sourcefree"], + maxfee_msat=10000000, + final_cltv=9, + maxparts=1)['routes'])['path'] l1.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) # This should fail locally with "capacity exceeded" @@ -2737,7 +2655,13 @@ def test_channel_receivable(node_factory, bitcoind): l1.rpc.waitsendpay(payment_hash, TIMEOUT) # Exact amount should succeed. - route = l1.rpc.getroute(l2.info['id'], amount, riskfactor=1, fuzzpercent=0)['route'] + route = only_one(l1.rpc.getroutes(source=l1.info['id'], + destination=l2.info['id'], + amount_msat=amount, + layers=["auto.sourcefree"], + maxfee_msat=10000000, + final_cltv=9, + maxparts=1)['routes'])['path'] l1.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) # Amount should drop to 0 once HTLC is sent; we have time, thanks to @@ -2756,7 +2680,13 @@ def test_channel_receivable(node_factory, bitcoind): amount = l1.rpc.listpeerchannels()['channels'][0]['receivable_msat'] # Turns out we won't route this, as it's over max - reserve: - route = l2.rpc.getroute(l1.info['id'], amount + 1, riskfactor=1, fuzzpercent=0)['route'] + route = only_one(l2.rpc.getroutes(source=l2.info['id'], + destination=l1.info['id'], + amount_msat=amount + 1, + layers=["auto.sourcefree"], + maxfee_msat=10000000, + final_cltv=9, + maxparts=1)['routes'])['path'] l2.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) # This should fail locally with "capacity exceeded" @@ -2764,7 +2694,7 @@ def test_channel_receivable(node_factory, bitcoind): l2.rpc.waitsendpay(payment_hash, TIMEOUT) # Exact amount should succeed. - route = l2.rpc.getroute(l1.info['id'], amount, riskfactor=1, fuzzpercent=0)['route'] + route = l2.single_route(l1.info['id'], amount) l2.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) # Amount should drop to 0 once HTLC is sent; we have time, thanks to @@ -2800,12 +2730,12 @@ def test_channel_spendable_large(node_factory, bitcoind): # route or waitsendpay fill fail. with pytest.raises(RpcError): - route = l1.rpc.getroute(l2.info['id'], spendable + 1, riskfactor=1, fuzzpercent=0)['route'] + route = l1.single_route(l2.info['id'], spendable + 1) l1.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) l1.rpc.waitsendpay(payment_hash, TIMEOUT) # Exact amount should succeed. - route = l1.rpc.getroute(l2.info['id'], spendable, riskfactor=1, fuzzpercent=0)['route'] + route = l1.single_route(l2.info['id'], spendable) l1.rpc.sendpay(route, payment_hash, payment_secret=inv['payment_secret']) open(os.path.join(l2.daemon.lightning_dir, TEST_NETWORK, "unhold"), "w").close() l1.rpc.waitsendpay(payment_hash, TIMEOUT) @@ -2841,7 +2771,7 @@ def test_htlc_too_dusty_outgoing(node_factory, bitcoind, chainparams): num_dusty_htlcs = max_dust_limit_sat // htlc_val_sat # add a some non-dusty htlcs, these will fail when we raise the dust limit - route = l1.rpc.getroute(l2.info['id'], non_dust_htlc_val_sat * 1000, 1)['route'] + route = l1.single_route(l2.info['id'], non_dust_htlc_val_sat * 1000) for i in range(0, 3): inv = l2.rpc.invoice((non_dust_htlc_val_sat * 1000), str(i + 100), str(i + 100)) l1.rpc.sendpay(route, inv['payment_hash'], payment_secret=inv['payment_secret']) @@ -2850,7 +2780,7 @@ def test_htlc_too_dusty_outgoing(node_factory, bitcoind, chainparams): assert res['status'] == 'pending' # add some dusty-htlcs - route = l1.rpc.getroute(l2.info['id'], htlc_val_msat, 1)['route'] + route = l1.single_route(l2.info['id'], htlc_val_msat) for i in range(0, num_dusty_htlcs): inv = l2.rpc.invoice(htlc_val_msat, str(i), str(i)) l1.rpc.sendpay(route, inv['payment_hash'], payment_secret=inv['payment_secret']) @@ -2865,7 +2795,7 @@ def test_htlc_too_dusty_outgoing(node_factory, bitcoind, chainparams): wait_for(lambda: only_one(l1.rpc.listsendpays(payment_hash=inv['payment_hash'])['payments'])['status'] == 'failed') # but we can still add a non dust htlc - route = l1.rpc.getroute(l2.info['id'], non_dust_htlc_val_sat * 1000, 1)['route'] + route = l1.single_route(l2.info['id'], non_dust_htlc_val_sat * 1000) inv = l2.rpc.invoice((10000 * 1000), str(120), str(120)) l1.rpc.sendpay(route, inv['payment_hash'], payment_secret=inv['payment_secret']) l2.daemon.wait_for_log(r'their htlc .* dev_ignore_htlcs') @@ -2893,7 +2823,7 @@ def test_htlc_too_dusty_incoming(node_factory, bitcoind): htlc_val_sat = 250 htlc_val_msat = htlc_val_sat * 1000 num_dusty_htlcs = max_dust_limit_sat // htlc_val_sat - route = l1.rpc.getroute(l3.info['id'], htlc_val_msat, 1)['route'] + route = l1.single_route(l3.info['id'], htlc_val_msat) # l1 sends as much money as it can for i in range(0, num_dusty_htlcs): @@ -2941,13 +2871,13 @@ def test_pay_no_secret(node_factory, bitcoind): # Produced from modified version (different secret!). inv_badsecret = 'lnbcrt1u1pwuedm6pp5ve584t0cv27hwmy0cx9ca8uwyqyfw9y9dm3r8vus9fv36r2l9yjsdqaw3jhxazlwpshjhmwda0hxetrwfjhgxq8pmnt9qqcqp9sp52au0npwmw4xxv2rfrat04kh9p3jlmklgavhfxqukx0l05pw5tccs9qypqsqa286dmt2xh3jy8cd8ndeyr845q8a7nhgjkerdqjns76jraux6j25ddx9f5k5r2ey0kk942x3uhaff66794kyjxxcd48uevf7p6ja53gqjj5ur7' - with pytest.raises(RpcError, match=r"INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS.*'erring_index': 1"): - l1.rpc.pay(inv_badsecret) + with pytest.raises(RpcError, match=r"Destination said it doesn't know invoice: incorrect_or_unknown_payment_details"): + l1.rpc.xpay(inv_badsecret) # Produced from old version (no secret!) inv_nosecret = 'lnbcrt1u1pwue4vapp5ve584t0cv27hwmy0cx9ca8uwyqyfw9y9dm3r8vus9fv36r2l9yjsdqaw3jhxazlwpshjhmwda0hxetrwfjhgxq8pmnt9qqcqp9570xsjyykvssa6ty8fjth6f2y8h09myngad9utesttwjwclv95fz3lgd402f9e5yzpnxmkypg55rkvpg522gcz4ymsjl2w3m4jhw4jsp55m7tl' - with pytest.raises(RpcError, match=r"Invalid bolt11: Missing required payment secret \(s field\)"): - l1.rpc.pay(inv_nosecret) + with pytest.raises(RpcError, match=r"Invalid bolt11 invoice: Missing required payment secret \(s field\)"): + l1.rpc.xpay(inv_nosecret) def test_shadow_routing(node_factory): @@ -3008,10 +2938,10 @@ def test_createonion_rpc(node_factory): def test_sendonion_rpc(node_factory): l1, l2, l3, l4 = node_factory.line_graph(4, wait_for_announce=True) amt = 10**3 - route = l1.rpc.getroute(l4.info['id'], 10**3, 10)['route'] + route = l1.single_route(l4.info['id'], 10**3) inv = l4.rpc.invoice(amt, "lbl", "desc") - first_hop = route[0] + first_hop = {'id': route[0]['node_id_out'], 'amount_msat': route[0]['amount_out_msat'], 'delay': route[0]['cltv_out']} blockheight = l1.rpc.getinfo()['blockheight'] # Need to shift the parameters by one hop @@ -3019,14 +2949,14 @@ def test_sendonion_rpc(node_factory): for h, n in zip(route[:-1], route[1:]): # We tell the node h about the parameters to use for n (a.k.a. h + 1) hops.append({ - "pubkey": h['id'], - "payload": serialize_payload_tlv(n['amount_msat'], n['delay'], n['channel'], blockheight).hex() + "pubkey": h['node_id_out'], + "payload": serialize_payload_tlv(n['amount_out_msat'], n['cltv_out'], n['short_channel_id_dir'].rsplit('/', 1)[0], blockheight).hex() }) # The last hop has a special payload: hops.append({ - "pubkey": route[-1]['id'], - "payload": serialize_payload_final_tlv(route[-1]['amount_msat'], route[-1]['delay'], route[-1]['amount_msat'], blockheight, inv['payment_secret']).hex() + "pubkey": route[-1]['node_id_out'], + "payload": serialize_payload_final_tlv(route[-1]['amount_out_msat'], route[-1]['cltv_out'], route[-1]['amount_out_msat'], blockheight, inv['payment_secret']).hex() }) onion = l1.rpc.createonion(hops=hops, assocdata=inv['payment_hash']) @@ -3110,8 +3040,17 @@ def test_partial_payment(node_factory, bitcoind, executor): paysecret = l4.rpc.decode(inv['bolt11'])['payment_secret'] # Separate routes for each part of the payment. - r134 = l1.rpc.getroute(l4.info['id'], 501, 1, exclude=[scid24 + '/0', scid24 + '/1'])['route'] - r124 = l1.rpc.getroute(l4.info['id'], 499, 1, exclude=[scid34 + '/0', scid34 + '/1'])['route'] + l1.rpc.askrene_create_layer(layer='excl_l2l4') + l1.rpc.askrene_update_channel(layer='excl_l2l4', short_channel_id_dir=scid24 + '/0', enabled=False) + l1.rpc.askrene_update_channel(layer='excl_l2l4', short_channel_id_dir=scid24 + '/1', enabled=False) + r134 = only_one(l1.rpc.getroutes(l1.info['id'], l4.info['id'], 501, layers=['excl_l2l4', 'auto.localchans', 'auto.sourcefree'], maxfee_msat=10000000, final_cltv=9, maxparts=1)['routes'])['path'] + l1.rpc.askrene_remove_layer(layer='excl_l2l4') + + l1.rpc.askrene_create_layer(layer='excl_l3l4') + l1.rpc.askrene_update_channel(layer='excl_l3l4', short_channel_id_dir=scid34 + '/0', enabled=False) + l1.rpc.askrene_update_channel(layer='excl_l3l4', short_channel_id_dir=scid34 + '/1', enabled=False) + r124 = only_one(l1.rpc.getroutes(l1.info['id'], l4.info['id'], 499, layers=['excl_l3l4', 'auto.localchans', 'auto.sourcefree'], maxfee_msat=10000000, final_cltv=9, maxparts=1)['routes'])['path'] + l1.rpc.askrene_remove_layer(layer='excl_l3l4') # These can happen in parallel. l1.rpc.sendpay( @@ -3259,7 +3198,7 @@ def test_partial_payment_timeout(node_factory, bitcoind): inv = l2.rpc.invoice(1000, 'inv', 'inv') paysecret = l2.rpc.decode(inv['bolt11'])['payment_secret'] - route = l1.rpc.getroute(l2.info['id'], 500, 1)['route'] + route = l1.single_route(l2.info['id'], 500) l1.rpc.sendpay( route=route, payment_hash=inv['payment_hash'], @@ -3314,7 +3253,7 @@ def test_partial_payment_restart(node_factory, bitcoind): inv = l3.rpc.invoice(1000, 'inv', 'inv') paysecret = l3.rpc.decode(inv['bolt11'])['payment_secret'] - route = l1.rpc.getroute(l3.info['id'], 500, 1)['route'] + route = l1.single_route(l3.info['id'], 500) l1.rpc.sendpay( route=route, @@ -3359,7 +3298,7 @@ def test_partial_payment_htlc_loss(node_factory, bitcoind): inv = l3.rpc.invoice(1000, 'inv', 'inv') paysecret = l3.rpc.decode(inv['bolt11'])['payment_secret'] - route = l1.rpc.getroute(l3.info['id'], 500, 1)['route'] + route = l1.single_route(l3.info['id'], 500) l1.rpc.sendpay(route=route, payment_hash=inv['payment_hash'], amount_msat=1000, bolt11=inv['bolt11'], payment_secret=paysecret, partid=1) @@ -3431,18 +3370,18 @@ def test_sendpay_msatoshi_arg(node_factory): with pytest.raises(RpcError, match=r'Do not specify msatoshi \(1001msat\) without' ' partid: if you do, it must be exactly' r' the final amount \(1000msat\)'): - l1.rpc.sendpay(route=l1.rpc.getroute(l2.info['id'], 1000, 1)['route'], payment_hash=inv['payment_hash'], amount_msat=1001, bolt11=inv['bolt11'], payment_secret=inv['payment_secret']) + l1.rpc.sendpay(route=l1.single_route(l2.info['id'], 1000), payment_hash=inv['payment_hash'], amount_msat=1001, bolt11=inv['bolt11'], payment_secret=inv['payment_secret']) with pytest.raises(RpcError, match=r'Do not specify msatoshi \(999msat\) without' ' partid: if you do, it must be exactly' r' the final amount \(1000msat\)'): - l1.rpc.sendpay(route=l1.rpc.getroute(l2.info['id'], 1000, 1)['route'], payment_hash=inv['payment_hash'], amount_msat=999, bolt11=inv['bolt11'], payment_secret=inv['payment_secret']) + l1.rpc.sendpay(route=l1.single_route(l2.info['id'], 1000), payment_hash=inv['payment_hash'], amount_msat=999, bolt11=inv['bolt11'], payment_secret=inv['payment_secret']) # Can't send MPP payment which pays any more than amount. with pytest.raises(RpcError, match=r'Final amount 1001msat is greater than 1000msat, despite MPP'): - l1.rpc.sendpay(route=l1.rpc.getroute(l2.info['id'], 1001, 1)['route'], payment_hash=inv['payment_hash'], amount_msat=1000, bolt11=inv['bolt11'], partid=1, payment_secret=inv['payment_secret']) + l1.rpc.sendpay(route=l1.single_route(l2.info['id'], 1001), payment_hash=inv['payment_hash'], amount_msat=1000, bolt11=inv['bolt11'], partid=1, payment_secret=inv['payment_secret']) # But this works - l1.rpc.sendpay(route=l1.rpc.getroute(l2.info['id'], 1001, 1)['route'], payment_hash=inv['payment_hash'], amount_msat=1001, bolt11=inv['bolt11'], payment_secret=inv['payment_secret']) + l1.rpc.sendpay(route=l1.single_route(l2.info['id'], 1001), payment_hash=inv['payment_hash'], amount_msat=1001, bolt11=inv['bolt11'], payment_secret=inv['payment_secret']) l1.rpc.waitsendpay(inv['payment_hash']) inv = only_one(l2.rpc.listinvoices('inv')['invoices']) @@ -3460,10 +3399,10 @@ def test_reject_invalid_payload(node_factory): l1, l2 = node_factory.line_graph(2) amt = 10**3 - route = l1.rpc.getroute(l2.info['id'], amt, 10)['route'] + route = l1.single_route(l2.info['id'], amt) inv = l2.rpc.invoice(amt, "lbl", "desc") - first_hop = route[0] + first_hop = {'id': route[0]['node_id_out'], 'amount_msat': route[0]['amount_out_msat'], 'delay': route[0]['cltv_out']} # A TLV payload with an unknown even type: payload = TlvPayload() @@ -3498,19 +3437,29 @@ def test_excluded_adjacent_routehint(node_factory, bitcoind): wait_for(lambda: 'remote' in only_one(l1.rpc.listpeerchannels()['channels'])['updates']) # This will make it reject the routehint. - err = r'Fee exceeds our fee budget: 1msat > 0msat, discarding route' + err = 'Failed: Could not find route without excessive cost' with pytest.raises(RpcError, match=err): l1.rpc.pay(bolt11=inv['bolt11'], maxfeepercent=0, exemptfee=0) -def test_keysend(node_factory): +@pytest.mark.parametrize("keysendcmd", ["keysend", "xkeysend"]) +def test_keysend(node_factory, keysendcmd): amt = 10000 + if keysendcmd == 'keysend': + opts = {'allow-deprecated-apis': True} + else: + opts = {} l1, l2, l3, l4 = node_factory.line_graph( 4, wait_for_announce=True, - opts=[{}, {}, {}, {'disable-plugin': 'keysend'}] + opts=[opts, {}, opts, {'disable-plugin': 'keysend'}] ) + if keysendcmd == 'xkeysend': + l1keysend = l1.rpc.xkeysend + else: + l1keysend = l1.rpc.keysend + # The keysend featurebit must be set in the announcement, i.e., l1 should # learn that l3 supports keysends. features = l1.rpc.listnodes(l3.info['id'])['nodes'][0]['features'] @@ -3523,10 +3472,10 @@ def test_keysend(node_factory): # Self-sends are not allowed (see #4438) with pytest.raises(RpcError, match=r'We are the destination.'): - l1.rpc.keysend(l1.info['id'], amt) + l1keysend(l1.info['id'], amt) # Send an indirect one from l1 to l3 - l1.rpc.keysend(l3.info['id'], amt) + l1keysend(l3.info['id'], amt) invs = l3.rpc.listinvoices()['invoices'] assert(len(invs) == 1) @@ -3535,7 +3484,7 @@ def test_keysend(node_factory): assert(inv['amount_received_msat'] >= Millisatoshi(amt)) # Now send a direct one instead from l1 to l2 - l1.rpc.keysend(l2.info['id'], amt) + l1keysend(l2.info['id'], amt) invs = l2.rpc.listinvoices()['invoices'] assert(len(invs) == 1) @@ -3544,34 +3493,51 @@ def test_keysend(node_factory): # And finally try to send a keysend payment to l4, which doesn't # support it. It MUST fail. - with pytest.raises(RpcError, match=r"Recipient [0-9a-f]{66} reported an invalid payload"): - l3.rpc.keysend(l4.info['id'], amt) + if keysendcmd == 'xkeysend': + with pytest.raises(RpcError, match=r"Destination reported invalid_onion_payload \(likely doesn't support keysend\)"): + l3.rpc.xkeysend(l4.info['id'], amt) + else: + with pytest.raises(RpcError, match=r"Recipient [0-9a-f]{66} reported an invalid payload"): + l3.rpc.keysend(l4.info['id'], amt) -def test_keysend_strip_tlvs(node_factory): +@pytest.mark.parametrize("keysendcmd", ["keysend", "xkeysend"]) +def test_keysend_strip_tlvs(node_factory, keysendcmd): """Use the extratlvs option to deliver a message with sphinx' TLV type, which keysend strips. """ amt = 10**7 + opts = [ + { + # Not needed, just for listconfigs test. + 'accept-htlc-tlv-type': [133773310, 99990], + "plugin": os.path.join(os.path.dirname(__file__), "plugins/sphinx-receiver.py"), + }, + { + "plugin": os.path.join(os.path.dirname(__file__), "plugins/sphinx-receiver.py"), + }, + ] + if keysendcmd == 'keysend': + opts[0]['allow-deprecated-apis'] = True + opts[1]['allow-deprecated-apis'] = True + l1, l2 = node_factory.line_graph( 2, wait_for_announce=True, - opts=[ - { - # Not needed, just for listconfigs test. - 'accept-htlc-tlv-type': [133773310, 99990], - "plugin": os.path.join(os.path.dirname(__file__), "plugins/sphinx-receiver.py"), - }, - { - "plugin": os.path.join(os.path.dirname(__file__), "plugins/sphinx-receiver.py"), - }, - ] + opts=opts, ) + if keysendcmd == 'xkeysend': + l1keysend = l1.rpc.xkeysend + l2keysend = l2.rpc.xkeysend + else: + l1keysend = l1.rpc.keysend + l2keysend = l2.rpc.keysend + # Make sure listconfigs works here assert l1.rpc.listconfigs('accept-htlc-tlv-type')['configs']['accept-htlc-tlv-type']['values_int'] == [133773310, 99990] # l1 is configured to accept, so l2 should still filter them out - l1.rpc.keysend(l2.info['id'], amt, extratlvs={133773310: 'FEEDC0DE'}) + l1keysend(l2.info['id'], amt, extratlvs={133773310: 'FEEDC0DE'}) inv = only_one(l2.rpc.listinvoices()['invoices']) assert not l2.daemon.is_in_log(r'plugin-sphinx-receiver.py.*extratlvs.*133773310.*feedc0de') @@ -3580,14 +3546,14 @@ def test_keysend_strip_tlvs(node_factory): l2.rpc.delinvoice(inv['label'], 'paid') # Now try again with the TLV type in extra_tlvs as string: - l1.rpc.keysend(l2.info['id'], amt, extratlvs={133773310: b'hello there'.hex()}) + l1keysend(l2.info['id'], amt, extratlvs={133773310: b'hello there'.hex()}) inv = only_one(l2.rpc.listinvoices()['invoices']) assert inv['description'] == 'keysend: hello there' l2.daemon.wait_for_log('Keysend payment uses illegal even field 133773310: stripping') l2.rpc.delinvoice(inv['label'], 'paid') # We can (just!) fit a giant description in. - l1.rpc.keysend(l2.info['id'], amt, extratlvs={133773310: (b'a' * 1100).hex()}) + l1keysend(l2.info['id'], amt, extratlvs={133773310: (b'a' * 1100).hex()}) inv = only_one(l2.rpc.listinvoices()['invoices']) assert inv['description'] == 'keysend: ' + 'a' * 1100 l2.rpc.delinvoice(inv['label'], 'paid') @@ -3598,14 +3564,14 @@ def test_keysend_strip_tlvs(node_factory): More info """ # Since we're at it, use this to test string-keyed TLVs - l1.rpc.keysend(l2.info['id'], amt, extratlvs={"133773310": bytes(ksinfo, encoding='utf8').hex()}) + l1keysend(l2.info['id'], amt, extratlvs={"133773310": bytes(ksinfo, encoding='utf8').hex()}) inv = only_one(l2.rpc.listinvoices()['invoices']) assert inv['description'] == 'keysend: ' + ksinfo l2.daemon.wait_for_log('Keysend payment uses illegal even field 133773310: stripping') # Now reverse the direction. l1 accepts 133773310, but filters out # other even unknown types (like 133773312). - l2.rpc.keysend(l1.info['id'], amt, extratlvs={ + l2keysend(l1.info['id'], amt, extratlvs={ "133773310": b"helloworld".hex(), # This one is allowlisted "133773312": b"filterme".hex(), # This one will get stripped }) @@ -3620,7 +3586,7 @@ def test_keysend_routehint(node_factory): """Test whether we can deliver a keysend by adding a routehint on the cli """ amt = 10000 - l1, l2 = node_factory.line_graph(2, wait_for_announce=True) + l1, l2 = node_factory.line_graph(2, wait_for_announce=True, opts={'allow-deprecated-apis': True}) l3 = node_factory.get_node() l2.connect(l3) l2.fundchannel(l3, announce_channel=False) @@ -3663,33 +3629,94 @@ def test_keysend_routehint(node_factory): assert(inv['amount_received_msat'] >= Millisatoshi(amt)) -def test_keysend_maxfee(node_factory): +def test_xkeysend_layer(node_factory): + """Test whether we can deliver a keysend by adding layer (vs keyhint's routehints) + """ + amt = 10000 + l1, l2 = node_factory.line_graph(2, wait_for_announce=True) + l3 = node_factory.get_node() + l2.connect(l3) + l2.fundchannel(l3, announce_channel=False) + + dest = l3.info['id'] + chan = only_one(l3.rpc.listpeerchannels()['channels']) + l1.rpc.askrene_create_layer('test_xkeysend_layer1') + l1.rpc.askrene_create_channel('test_xkeysend_layer1', + l2.info['id'], + dest, + chan['alias']['remote'], + '1000000sat') + l1.rpc.askrene_update_channel(layer='test_xkeysend_layer1', + short_channel_id_dir=f"{chan['alias']['remote']}/{chan['direction'] ^ 1}", + htlc_minimum_msat=100, + htlc_maximum_msat=900000000, + fee_base_msat=1, + fee_proportional_millionths=2, + cltv_expiry_delta=18, + enabled=True) + + # Dummy one + l1.rpc.askrene_create_layer('test_xkeysend_layer2') + l1.rpc.askrene_create_channel('test_xkeysend_layer2', + l2.info['id'], + '02' * 33, + '1x2x3', + '1000000sat') + for scidd in ('1x2x3/0', '1x2x3/1'): + l1.rpc.askrene_update_channel(layer='test_xkeysend_layer2', + short_channel_id_dir=scidd, + htlc_minimum_msat=100, + htlc_maximum_msat=900000000, + fee_base_msat=1, + fee_proportional_millionths=2, + cltv_expiry_delta=18, + enabled=True) + + # Without any extra information we should fail: + with pytest.raises(RpcError): + l1.rpc.call("xkeysend", payload={'destination': dest, 'amount_msat': amt}) + + # We should also fail with only non-useful layers: + with pytest.raises(RpcError): + l1.rpc.call("xkeysend", payload={'destination': dest, 'amount_msat': amt, 'layers': ['test_xkeysend_layer2']}) + + l1.rpc.call("xkeysend", payload={'destination': dest, 'amount_msat': amt, 'layers': ['test_xkeysend_layer1', 'test_xkeysend_layer2']}) + inv = only_one(l3.rpc.listinvoices()['invoices']) + assert inv['amount_received_msat'] == amt + + +@pytest.mark.parametrize("keysendcmd", ["keysend", "xkeysend"]) +def test_keysend_maxfee(node_factory, keysendcmd): + opts = [{}, {'fee-base': 50, 'fee-per-satoshi': 0}, {}] + if keysendcmd == 'keysend': + opts[0]['allow-deprecated-apis'] = True l1, l2, l3 = node_factory.line_graph( 3, wait_for_announce=True, - opts=[{}, {'fee-base': 50, 'fee-per-satoshi': 0}, {}] + opts=opts, ) - # We should fail because maxfee and exemptfee cannot be set simultaneously. - with pytest.raises(RpcError): - l1.rpc.call("keysend", payload={'destination': l3.info['id'], 'amount_msat': 1, 'maxfee': 1, 'exemptfee': 5000}) + if keysendcmd == 'keysend': + # We should fail because maxfee and exemptfee cannot be set simultaneously. + with pytest.raises(RpcError): + l1.rpc.call(keysendcmd, payload={'destination': l3.info['id'], 'amount_msat': 1, 'maxfee': 1, 'exemptfee': 5000}) - # We should fail because maxfee and maxfeepercent cannot be set simultaneously. - with pytest.raises(RpcError): - l1.rpc.call("keysend", payload={'destination': l3.info['id'], 'amount_msat': 1, 'maxfee': 1, 'maxfeepercent': 0.0001}) + # We should fail because maxfee and maxfeepercent cannot be set simultaneously. + with pytest.raises(RpcError): + l1.rpc.call(keysendcmd, payload={'destination': l3.info['id'], 'amount_msat': 1, 'maxfee': 1, 'maxfeepercent': 0.0001}) # We should fail because 50msat base fee on l2 exceeds maxfee of 1msat. - with pytest.raises(RpcError): - l1.rpc.call("keysend", payload={'destination': l3.info['id'], 'amount_msat': 1, 'maxfee': 1}) + with pytest.raises(RpcError, match='Fee exceeds our fee budget|excessive cost'): + l1.rpc.call(keysendcmd, payload={'destination': l3.info['id'], 'amount_msat': 1, 'maxfee': 1}) assert len(l3.rpc.listinvoices()['invoices']) == 0 # Perform a normal keysend with maxfee. - l1.rpc.call("keysend", payload={'destination': l3.info['id'], 'amount_msat': 1, 'maxfee': 50}) + l1.rpc.call(keysendcmd, payload={'destination': l3.info['id'], 'amount_msat': 1, 'maxfee': 50}) assert len(l3.rpc.listinvoices()['invoices']) == 1 -@pytest.mark.parametrize("tlv_payload_length", [638, 639, 640, 641, 1022, 1023, 1024]) -def test_keysend_description_size_limit(node_factory, tlv_payload_length): +@pytest.mark.parametrize("keysendcmd", ["keysend", "xkeysend"]) +def test_keysend_description_size_limit(node_factory, keysendcmd): """ Test keysend description handling near BOLT11 field size limits. @@ -3698,18 +3725,33 @@ def test_keysend_description_size_limit(node_factory, tlv_payload_length): See common/bolt11.h: BOLT11_FIELD_BYTE_LIMIT. """ - l1, l2 = node_factory.line_graph(2, wait_for_announce=True) + if keysendcmd == 'keysend': + opts = {'allow-deprecated-apis': True} + else: + opts = {} + l1, l2 = node_factory.line_graph(2, wait_for_announce=True, opts=opts) amt = 10000 - prefix = 'keysend: {"message": ""}' + prefix = 'keysend: ' base_len = len(prefix) - # Prep TLV payload with test length - body_len = tlv_payload_length - base_len - tlv_payload = json.dumps({"message": "a" * body_len}).encode().hex() + if keysendcmd == 'xkeysend': + l1keysend = l1.rpc.xkeysend + else: + l1keysend = l1.rpc.keysend + + tlv_lens = [638, 639, 640, 641, 1022, 1023, 1024] + expected = set() + for tlv_payload_length in tlv_lens: + # Prep TLV payload with test length + body_len = tlv_payload_length - base_len + tlv_payload = ("a" * body_len).encode().hex() + expected.add(prefix + "a" * body_len) + + # Send keysend payment with test payload + l1keysend(l2.info["id"], amt, extratlvs={7629169: tlv_payload}) - # Send keysend payment with test payload - l1.rpc.keysend(l2.info["id"], amt, extratlvs={7629169: tlv_payload}) - assert len(l2.rpc.listinvoices()["invoices"]) == 1 + assert set(inv['description'] for inv in l2.rpc.listinvoices()["invoices"]) == expected + assert all(inv['amount_received_msat'] == amt for inv in l2.rpc.listinvoices()["invoices"]) def test_invalid_onion_channel_update(node_factory): @@ -3756,7 +3798,7 @@ def test_pay_exemptfee(node_factory): wait_for_announce=True ) - err = r'Ran out of routes to try' + err = r'Could not find route without excessive cost' with pytest.raises(RpcError, match=err): l1.dev_pay(l3.rpc.invoice(1, "lbl1", "desc")['bolt11'], dev_use_shadow=False) @@ -3834,7 +3876,7 @@ def test_mpp_adaptive(node_factory, bitcoind): } """ amt = 10**7 - 1 - l1, l2, l3, l4 = node_factory.get_nodes(4) + l1, l2, l3, l4 = node_factory.get_nodes(4, opts={'allow-deprecated-apis': True}) l1.connect(l2) l2.connect(l4) @@ -3900,8 +3942,6 @@ def all_htlcs(n): # You were supposed to mpp! assert count > 1 - # Not every one should have the bolt11 string - assert bolt11s < count # listpays() shows bolt11 string assert 'bolt11' in only_one(l1.rpc.listpays()['pays']) @@ -4042,23 +4082,27 @@ def test_delpay_mixed_status(node_factory, bitcoind): assert len(l1.rpc.listsendpays()['payments']) == 1 -def test_listpay_result_with_paymod(node_factory, bitcoind): +@pytest.mark.parametrize("keysendcmd", ["keysend", "xkeysend"]) +def test_listpay_result_with_paymod(node_factory, bitcoind, keysendcmd): """ The object of this test is to verify the correct behavior of the RPC command listpay e with two different type of payment, such as: keysend (without invoice) and pay (with invoice). - l1 -> keysend -> l2 - l2 -> pay invoice -> l3 + l1 -> pay invoice -> l2 + l2 -> keysend -> l3 """ - amount_sat = 10 ** 6 - l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True) + if keysendcmd == 'keysend': + opts = {'allow-deprecated-apis': True} + else: + opts = {} + l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, opts=opts) invl2 = l2.rpc.invoice(amount_sat * 2, "inv_l2", "inv_l2") l1.rpc.pay(invl2['bolt11']) - l2.rpc.keysend(l3.info['id'], amount_sat * 2, "keysend_l3") + l2.rpc.call(keysendcmd, payload=[l3.info['id'], amount_sat * 2]) assert 'bolt11' in l1.rpc.listpays()['pays'][0] assert 'bolt11' not in l2.rpc.listpays()['pays'][0] @@ -4589,7 +4633,7 @@ def test_fetchinvoice(node_factory, bitcoind): l1.rpc.pay(inv1['invoice']) # We can't pay the other one now. - with pytest.raises(RpcError, match="INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS.*'erring_node': '{}'".format(l3.info['id'])): + with pytest.raises(RpcError, match="Destination said it doesn't know invoice: incorrect_or_unknown_payment_details"): l1.rpc.pay(inv2['invoice']) # We can't reuse the offer, either. @@ -4805,7 +4849,7 @@ def test_fetchinvoice_autoconnect(node_factory, bitcoind): invreq = l2.rpc.call('invoicerequest', {'amount': '2msat', 'description': 'simple test'}) # Ofc l2 can't actually pay it! - with pytest.raises(RpcError, match='pay attempt failed: "Ran out of routes to try'): + with pytest.raises(RpcError, match='pay attempt failed: "Failed: There is no connection between source and destination at all"'): l3.rpc.call('sendinvoice', {'invreq': invreq['bolt12'], 'label': 'payme!'}) assert l3.rpc.listpeers(l2.info['id'])['peers'] != [] @@ -4870,13 +4914,20 @@ def test_pay_blockheight_mismatch(node_factory, bitcoind): """ - send, direct, recv = node_factory.line_graph(3, wait_for_announce=True) + send, direct, recv = node_factory.line_graph(3, + wait_for_announce=True, + opts={'may_reconnect': True}) sync_blockheight(bitcoind, [send, recv]) + height = bitcoind.rpc.getblockchaininfo()['blocks'] + # Pin `send` at the current height. by not returning the next # blockhash. This error is special-cased not to count as the # backend failing since it is used to poll for the next block. def mock_getblockhash(req): + # Allow old blocks, for restart. + if int(req['params'][0]) <= height: + return None return { "id": req['id'], "error": { @@ -4889,6 +4940,10 @@ def mock_getblockhash(req): bitcoind.generate_block(100) sync_blockheight(bitcoind, [recv]) + # For xpay, it doesn't poll the blockheight, only handles case where + # it's behind at the start. + send.restart() + send.rpc.connect(direct.info['id'], 'localhost', direct.port) inv = recv.rpc.invoice(42, 'lbl', 'desc')['bolt11'] send.rpc.pay(inv) @@ -4907,15 +4962,11 @@ def test_pay_waitblockheight_timeout(node_factory, bitcoind): sync_blockheight(bitcoind, [l1, l2]) inv = l2.rpc.invoice(42, 'lbl', 'desc')['bolt11'] - with pytest.raises(RpcError, match=r'WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS'): - l1.rpc.pay(inv) - - # Post mortem checks that we tried only once. - status = l1.rpc.paystatus(inv) + with pytest.raises(RpcError, match=r'Timed out waiting for blockheight 2147483647\.'): + l1.rpc.xpay(inv) # Should have only one attempt that triggered the wait, which then failed. - assert len(status['pay']) == 1 - assert len(status['pay'][0]['attempts']) == 1 + assert len(l1.rpc.listsendpays()['payments']) == 1 def test_dev_rawrequest(node_factory): @@ -5017,7 +5068,9 @@ def test_self_pay(node_factory): """Repro test for issue 4345: pay ourselves via the pay plugin. """ - l1, l2 = node_factory.line_graph(2, wait_for_announce=True) + l1, l2 = node_factory.line_graph(2, wait_for_announce=True, + opts={'xpay-handle-pay': False, + 'allow-deprecated-apis': True}) inv = l1.rpc.invoice(10000, 'test', 'test')['bolt11'] l1.rpc.pay(inv) @@ -5062,14 +5115,8 @@ def test_unreachable_routehint(node_factory, bitcoind): assert('routes' in decoded and len(decoded['routes']) == 1) - with pytest.raises(RpcError, match=r'Destination [a-f0-9]{66} is not reachable'): - l1.rpc.pay(invoice) - - l1.daemon.wait_for_log( - r"Removed routehint 0 because entrypoint {entrypoint} is unknown.".format( - entrypoint=entrypoint - ) - ) + with pytest.raises(RpcError, match=r'Failed: There is no connection between source and destination at all'): + l1.rpc.xpay(invoice) # Now connect l2 to l3 to create a bridge, but without a # channel. The entrypoint will become known, but still @@ -5078,20 +5125,11 @@ def test_unreachable_routehint(node_factory, bitcoind): l2.connect(l3) wait_for(lambda: len(l1.rpc.listnodes(entrypoint)['nodes']) == 1) - with pytest.raises(RpcError, match=r'Destination [a-f0-9]{66} is not reachable') as excinfo: + with pytest.raises(RpcError, match=r'Failed: There is no connection between source and destination at all'): l1.rpc.pay(invoice) - # Verify that we failed for the correct reason. - l1.daemon.wait_for_log( - r"Removed routehint 0 because entrypoint {entrypoint} is unreachable.".format( - entrypoint=entrypoint - ) - ) - - # Since we aborted once we realized the destination is unreachable - # both directly, and via the routehints we should now just have a - # single attempt. - assert(len(excinfo.value.error['attempts']) == 1) + # Make sure we didn't try to pay it. + assert l1.rpc.listsendpays() == {'payments': []} def test_routehint_tous(node_factory, bitcoind): @@ -5115,8 +5153,8 @@ def test_routehint_tous(node_factory, bitcoind): == only_one(l3.rpc.listpeerchannels()['channels'])['alias']['remote']) l3.stop() - with pytest.raises(RpcError, match=r'Destination .* is not reachable directly and all routehints were unusable'): - l2.rpc.pay(inv) + with pytest.raises(RpcError, match=r'Failed: We could not find a usable set of paths. All 1 channels to the destination are disabled.'): + l2.rpc.xpay(inv) def test_setchannel_enforcement_delay(node_factory, bitcoind): @@ -5230,20 +5268,14 @@ def test_sendpay_grouping(node_factory, bitcoind): assert(len(l1.db.query("SELECT * FROM payments")) == 0) assert(len(l1.rpc.listpays()['pays']) == 0) - with pytest.raises(RpcError, match=r'Ran out of routes to try after [0-9]+ attempts'): - l1.rpc.pay(inv, amount_msat='100002msat') + with pytest.raises(RpcError, match=r'Failed after 1 attempts'): + l1.rpc.xpay(inv, amount_msat='100002msat') # After this one invocation we have one entry in `listpays` assert(len(l1.rpc.listpays()['pays']) == 1) - # Pay learns, and sometimes now refuses to even attempt. Give it a new channel. - l3.start() - node_factory.join_nodes([l2, l3], wait_for_announce=True) - wait_for(lambda: len(l1.rpc.listchannels()['channels']) == 6) - l3.stop() - - with pytest.raises(RpcError, match=r'Ran out of routes to try after [0-9]+ attempts'): - l1.rpc.pay(inv, amount_msat='100001msat') + with pytest.raises(RpcError, match=r'Failed after 1 attempts'): + l1.rpc.xpay(inv, amount_msat='100001msat') # Surprise: we should have 2 entries after 2 invocations assert(len(l1.rpc.listpays()['pays']) == 2) @@ -5266,7 +5298,9 @@ def test_sendpay_grouping(node_factory, bitcoind): @pytest.mark.flaky(reruns=2) def test_pay_manual_exclude(node_factory, bitcoind): - l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True) + l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, + opts={'xpay-handle-pay': False, + 'allow-deprecated-apis': True}) l1_id = l1.rpc.getinfo()['id'] l2_id = l2.rpc.getinfo()['id'] l3_id = l3.rpc.getinfo()['id'] @@ -5309,8 +5343,8 @@ def test_pay_bolt11_metadata(node_factory, bitcoind): # Make l2 "know" about this invoice. l2.rpc.invoice(amount_msat=123000, label='label1', description='desc', preimage='00' * 32) - with pytest.raises(RpcError, match=r'WIRE_INVALID_ONION_PAYLOAD'): - l1.rpc.pay(inv) + with pytest.raises(RpcError, match=r'Unexpected error \(invalid_onion_payload\) from final node'): + l1.rpc.xpay(inv) l2.daemon.wait_for_log("Unexpected payment_metadata {}".format(b'this is metadata'.hex())) @@ -5604,14 +5638,16 @@ def test_sendpays_wait(node_factory, executor): l1.daemon.wait_for_log('waiting on sendpays created 1') inv1 = l2.rpc.invoice(42, 'invlabel', 'invdesc') - l1.rpc.pay(inv1['bolt11']) + l1.rpc.xpay(inv1['bolt11']) waitres = waitfut.result(TIMEOUT) + # groupid is random + groupid = waitres['sendpays']['groupid'] assert waitres == {'subsystem': 'sendpays', 'created': 1, 'sendpays': {'status': 'pending', - 'partid': 0, - 'groupid': 1, + 'partid': 1, + 'groupid': groupid, 'payment_hash': inv1['payment_hash']}} assert only_one(l1.rpc.listsendpays(bolt11=inv1['bolt11'])['payments'])['created_index'] == 1 assert only_one(l1.rpc.listsendpays(bolt11=inv1['bolt11'])['payments'])['updated_index'] == 1 @@ -5630,13 +5666,14 @@ def test_sendpays_wait(node_factory, executor): waitfut = executor.submit(l1.rpc.wait, subsystem='sendpays', indexname='updated', nextvalue=2) l1.daemon.wait_for_log('waiting on sendpays updated 2') - l1.rpc.pay(inv2['bolt11']) + l1.rpc.xpay(inv2['bolt11']) waitres = waitfut.result(TIMEOUT) + groupid = waitres['sendpays']['groupid'] assert waitres == {'subsystem': 'sendpays', 'updated': 2, 'sendpays': {'status': 'complete', - 'partid': 0, - 'groupid': 1, + 'partid': 1, + 'groupid': groupid, 'payment_hash': inv2['payment_hash']}} assert only_one(l1.rpc.listsendpays(bolt11=inv2['bolt11'])['payments'])['created_index'] == 2 assert only_one(l1.rpc.listsendpays(bolt11=inv2['bolt11'])['payments'])['updated_index'] == 2 @@ -5652,15 +5689,16 @@ def test_sendpays_wait(node_factory, executor): waitfut = executor.submit(l1.rpc.wait, subsystem='sendpays', indexname='updated', nextvalue=3) l1.daemon.wait_for_log('waiting on sendpays updated 3') - with pytest.raises(RpcError, match="WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS"): - l1.rpc.pay(inv3['bolt11']) + with pytest.raises(RpcError, match="Destination said it doesn't know invoice: incorrect_or_unknown_payment_details"): + l1.rpc.xpay(inv3['bolt11']) waitres = waitfut.result(TIMEOUT) + groupid = waitres['sendpays']['groupid'] assert waitres == {'subsystem': 'sendpays', 'updated': 3, 'sendpays': {'status': 'failed', - 'partid': 0, - 'groupid': 1, + 'partid': 1, + 'groupid': groupid, 'payment_hash': inv3['payment_hash']}} # Order and pagination. @@ -5681,14 +5719,14 @@ def test_sendpays_wait(node_factory, executor): waitfut = executor.submit(l1.rpc.wait, subsystem='sendpays', indexname='deleted', nextvalue=1) l1.daemon.wait_for_log('waiting on sendpays deleted 1') - l1.rpc.delpay(inv3['payment_hash'], 'failed', 0, 1) + l1.rpc.delpay(inv3['payment_hash'], 'failed', 1, groupid) waitres = waitfut.result(TIMEOUT) assert waitres == {'subsystem': 'sendpays', 'deleted': 1, 'sendpays': {'status': 'failed', - 'partid': 0, - 'groupid': 1, + 'partid': 1, + 'groupid': groupid, 'payment_hash': inv3['payment_hash']}} @@ -5714,14 +5752,13 @@ def test_pay_routehint_minhtlc(node_factory, bitcoind): # You should be able to pay the invoice! l1.rpc.pay(inv['bolt11']) - # And you should also be able to getroute (and have it ignore htlc_min/max constraints!) - l1.rpc.getroute(l3.info['id'], amount_msat=0, riskfactor=1) - @pytest.mark.openchannel('v1') @pytest.mark.openchannel('v2') def test_pay_partial_msat(node_factory, executor): - l1, l2, l3 = node_factory.line_graph(3) + l1, l2, l3 = node_factory.line_graph(3, + opts={'xpay-handle-pay': False, + 'allow-deprecated-apis': True}) inv = l3.rpc.invoice(100000000, "inv", "inv") @@ -5979,7 +6016,7 @@ def test_offer_path_self(node_factory): l2.rpc.pay(inv) # It should have mapped the hop. - l2.daemon.wait_for_log(f"Mapped decrypted next hop from {scid} -> {l3.info['id']}") + l2.daemon.wait_for_log(f"injectpaymentonion: sending to channel {scid}") def test_offer_selfpay(node_factory): @@ -6132,7 +6169,9 @@ def diamond_network(node_factory): ``` """ opts = [ - {'fee-per-satoshi': 0, 'fee-base': 0}, # Sender + {'fee-per-satoshi': 0, 'fee-base': 0, # Sender + 'xpay-handle-pay': False, + 'allow-deprecated-apis': True}, {'fee-per-satoshi': 0, 'fee-base': 0}, # Low fee, but exhausted channel {'fee-per-satoshi': 5000, 'fee-base': 0}, # Disincentivize using fw2 {'fee-per-satoshi': 0, 'fee-base': 0}, # Recipient @@ -6264,13 +6303,15 @@ def test_injectpaymentonion_mpp(node_factory, executor): blockheight + 18 + 6, 1, 0) + # Test destination storage while we're here. fut2 = executor.submit(l1.rpc.injectpaymentonion, - onion2['onion'], - inv2['payment_hash'], - 2000, - blockheight + 18 + 6, - 2, - 0) + onion=onion2['onion'], + payment_hash=inv2['payment_hash'], + amount_msat=2000, + cltv_expiry=blockheight + 18 + 6, + partid=2, + groupid=0, + destination=l2.info['id']) # Now both should complete. ret = fut1.result(TIMEOUT) @@ -6286,6 +6327,10 @@ def test_injectpaymentonion_mpp(node_factory, executor): assert lsp['payment_hash'] == inv2['payment_hash'] assert lsp['status'] == 'complete' assert 'amount_msat' not in lsp + if lsp['partid'] == 1: + assert 'destination' not in lsp + else: + assert lsp['destination'] == l2.info['id'] assert len(lsps) == 2 @@ -6984,8 +7029,8 @@ def test_sendonion_sendpay(node_factory, bitcoind): # First case, do not overpay a pending MPP payment invstr = l3.rpc.invoice("10000sat", "inv", "description")["bolt11"] inv = l1.rpc.decode(invstr) - route2 = l1.rpc.getroute(inv["payee"], "2000sat", 10)["route"] - route8 = l1.rpc.getroute(inv["payee"], "8000sat", 10)["route"] + route2 = l1.single_route(inv["payee"], "2000sat") + route8 = l1.single_route(inv["payee"], "8000sat") def pay_with_sendpay(invoice, route, groupid, partid): l1.rpc.sendpay( @@ -7005,19 +7050,19 @@ def pay_with_sendonion(invoice, route, groupid, partid): # We tell the node h about the parameters to use for n (a.k.a. h + 1) hops.append( { - "pubkey": h["id"], + "pubkey": h["node_id_out"], "payload": serialize_payload_tlv( - n["amount_msat"], n["delay"], n["channel"], blockheight + n["amount_out_msat"], n["cltv_out"], n["short_channel_id_dir"].rsplit("/", 1)[0], blockheight ).hex(), } ) # The last hop has a special payload: hops.append( { - "pubkey": route[-1]["id"], + "pubkey": route[-1]["node_id_out"], "payload": serialize_payload_final_tlv( - route[-1]["amount_msat"], - route[-1]["delay"], + route[-1]["amount_out_msat"], + route[-1]["cltv_out"], invoice["amount_msat"], blockheight, invoice["payment_secret"], @@ -7030,7 +7075,7 @@ def pay_with_sendonion(invoice, route, groupid, partid): { "onion": onion["onion"], "shared_secrets": onion["shared_secrets"], - "first_hop": route[0], + "first_hop": {"id": route[0]["node_id_out"], "amount_msat": route[0]["amount_out_msat"], "delay": route[0]["cltv_out"]}, "payment_hash": invoice["payment_hash"], "total_amount_msat": invoice["amount_msat"], "groupid": groupid, diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 2a40d4757995..877088850b21 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -441,7 +441,7 @@ def test_pay_plugin(node_factory): l1.rpc.call('pay') # Make sure usage messages are present. - msg = 'pay bolt11 [amount_msat] [label] [riskfactor] [maxfeepercent] '\ + msg = 'pay invstring [amount_msat] [label] [riskfactor] [maxfeepercent] '\ '[retry_for] [maxdelay] [exemptfee] [localinvreqid] [exclude] '\ '[maxfee] [description] [partial_msat]' # We run with --developer: @@ -450,13 +450,13 @@ def test_pay_plugin(node_factory): def test_keysend_plugin(node_factory): - l1, l2 = node_factory.line_graph(2) + l1, l2 = node_factory.line_graph(2, opts={'allow-deprecated-apis': True}) with pytest.raises(RpcError, match=r'missing required parameter'): l1.rpc.call('keysend') # Make sure usage messages are present. - msg = 'keysend destination amount_msat [label] [maxfeepercent] [retry_for] '\ + msg = 'keysend (DEPRECATED!) destination amount_msat [label] [maxfeepercent] [retry_for] '\ '[maxdelay] [exemptfee] [extratlvs] [routehints] [maxfee]' # We run with --developer: msg += ' [dev_use_shadow]' @@ -669,7 +669,7 @@ def test_invoice_payment_hook(node_factory): # This one works inv1 = l2.rpc.invoice(1230, 'label', 'description', preimage='1' * 64) - l1.rpc.pay(inv1['bolt11']) + l1.rpc.xpay(inv1['bolt11']) l2.daemon.wait_for_log('label=label') l2.daemon.wait_for_log('msat=') @@ -677,11 +677,8 @@ def test_invoice_payment_hook(node_factory): # This one will be rejected. inv2 = l2.rpc.invoice(1230, 'label2', 'description', preimage='0' * 64) - with pytest.raises(RpcError): - l1.rpc.pay(inv2['bolt11']) - - pstatus = l1.rpc.call('paystatus', [inv2['bolt11']])['pay'][0] - assert pstatus['attempts'][-1]['failure']['data']['failcodename'] == 'WIRE_TEMPORARY_NODE_FAILURE' + with pytest.raises(RpcError, match=r'Unexpected error \(temporary_node_failure\) from final node'): + l1.rpc.xpay(inv2['bolt11']) l2.daemon.wait_for_log('label=label2') l2.daemon.wait_for_log('msat=') @@ -697,7 +694,7 @@ def test_invoice_payment_hook_hold(node_factory, executor): inv1 = l2.rpc.invoice(1230, 'label', 'description', preimage='1' * 64) # This should block. - f = executor.submit(l1.rpc.pay, inv1['bolt11']) + f = executor.submit(l1.rpc.xpay, inv1['bolt11']) time.sleep(5) assert not f.done() @@ -1202,7 +1199,7 @@ def test_htlc_accepted_hook_fail(node_factory): # This must fail inv = l2.rpc.invoice(1000, "lbl", "desc") phash = inv['payment_hash'] - route = l1.rpc.getroute(l2.info['id'], 1000, 1)['route'] + route = l1.single_route(l2.info['id'], 1000) # Here shouldn't use `pay` command because l2 rejects with WIRE_TEMPORARY_NODE_FAILURE, # then it will be excluded when l1 try another pay attempt. @@ -1220,8 +1217,8 @@ def test_htlc_accepted_hook_fail(node_factory): # Now try with forwarded HTLCs: l2 should still fail them # This must fail inv = l3.rpc.invoice(1000, "lbl", "desc")['bolt11'] - with pytest.raises(RpcError): - l1.rpc.pay(inv) + with pytest.raises(RpcError, match=r"We got a weird error \(temporary_node_failure\) for the invoice's route hint"): + l1.rpc.xpay(inv) # And the invoice must still be unpaid inv = l3.rpc.listinvoices("lbl")['invoices'] @@ -1238,7 +1235,7 @@ def test_htlc_accepted_hook_resolve(node_factory): ], wait_for_announce=True) inv = l3.rpc.invoice(amount_msat=1000, label="lbl", description="desc", preimage="00" * 32)['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) # And the invoice must still be unpaid inv = l3.rpc.listinvoices("lbl")['invoices'] @@ -1255,7 +1252,7 @@ def test_htlc_accepted_hook_direct_restart(node_factory, executor): ]) i1 = l2.rpc.invoice(amount_msat=1000, label="direct", description="desc")['bolt11'] - f1 = executor.submit(l1.rpc.pay, i1) + f1 = executor.submit(l1.rpc.xpay, i1) l2.daemon.wait_for_log(r'Holding onto an incoming htlc for 10 seconds') @@ -1507,14 +1504,14 @@ def test_forward_event_notification(node_factory, bitcoind, executor): inv = l3.rpc.invoice(amount, "first", "desc") payment_hash13 = inv['payment_hash'] - route = l1.rpc.getroute(l3.info['id'], amount, 1)['route'] + route = l1.single_route(l3.info['id'], amount) # status: offered -> settled l1.rpc.sendpay(route, payment_hash13, payment_secret=inv['payment_secret']) l1.rpc.waitsendpay(payment_hash13) # status: offered -> failed - route = l1.rpc.getroute(l4.info['id'], amount, 1)['route'] + route = l1.single_route(l4.info['id'], amount) payment_hash14 = "f" * 64 with pytest.raises(RpcError): l1.rpc.sendpay(route, payment_hash14, payment_secret="f" * 64) @@ -1622,7 +1619,7 @@ def test_sendpay_notifications(node_factory, bitcoind): payment_hash1 = inv1['payment_hash'] inv2 = l3.rpc.invoice(amount, "second", "desc") payment_hash2 = inv2['payment_hash'] - route = l1.rpc.getroute(l3.info['id'], amount, 1)['route'] + route = l1.single_route(l3.info['id'], amount) l1.rpc.sendpay(route, payment_hash1, payment_secret=inv1['payment_secret']) response1 = l1.rpc.waitsendpay(payment_hash1) @@ -1653,7 +1650,7 @@ def test_sendpay_notifications_nowaiter(node_factory): payment_hash1 = inv1['payment_hash'] inv2 = l3.rpc.invoice(amount, "second", "desc") payment_hash2 = inv2['payment_hash'] - route = l1.rpc.getroute(l3.info['id'], amount, 1)['route'] + route = l1.single_route(l3.info['id'], amount) l1.rpc.sendpay(route, payment_hash1, payment_secret=inv1['payment_secret']) l1.daemon.wait_for_log(r'Received a sendpay_success') @@ -1940,7 +1937,7 @@ def test_hook_chaining(node_factory): inv = l2.rpc.invoice(123, 'odd', "Odd payment handled by the first plugin", preimage="AA" * 32)['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) # The first plugin will handle this, the second one should not be called. assert(l2.daemon.is_in_log( @@ -1956,7 +1953,7 @@ def test_hook_chaining(node_factory): inv = l2.rpc.invoice( 123, 'even', "Even payment handled by the second plugin", preimage="BB" * 32 )['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) assert(l2.daemon.is_in_log( r'plugin-hook-chain-odd.py: htlc_accepted called for payment_hash {}'.format(hash2) )) @@ -1968,7 +1965,7 @@ def test_hook_chaining(node_factory): # by the internal invoice handling. inv = l2.rpc.invoice(123, 'neither', "Neither plugin handles this", preimage="CC" * 32)['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) assert(l2.daemon.is_in_log( r'plugin-hook-chain-odd.py: htlc_accepted called for payment_hash {}'.format(hash3) )) @@ -2255,7 +2252,7 @@ def test_hook_crash(node_factory, executor, bitcoind): futures = [] for n in nodes: inv = n.rpc.invoice(123, "lbl", "desc")['bolt11'] - futures.append(executor.submit(l1.rpc.pay, inv)) + futures.append(executor.submit(l1.rpc.xpay, inv)) for n in nodes: n.daemon.wait_for_logs([ @@ -2298,14 +2295,14 @@ def test_replacement_payload(node_factory): # Replace with an invalid payload. l2.rpc.call('setpayload', ['0000']) inv = l2.rpc.invoice(123, 'test_replacement_payload', 'test_replacement_payload')['bolt11'] - with pytest.raises(RpcError, match=r"WIRE_INVALID_ONION_PAYLOAD \(reply from remote\)"): - l1.rpc.pay(inv) + with pytest.raises(RpcError, match=r"Unexpected error \(invalid_onion_payload\) from final node"): + l1.rpc.xpay(inv) # Replace with valid payload, but corrupt payment_secret l2.rpc.call('setpayload', ['corrupt_secret']) - with pytest.raises(RpcError, match=r"WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS \(reply from remote\)"): - l1.rpc.pay(inv) + with pytest.raises(RpcError, match=r"Destination said it doesn't know invoice: incorrect_or_unknown_payment_details"): + l1.rpc.xpay(inv) assert l2.daemon.wait_for_log("Attempt to pay.*with wrong payment_secret") @@ -2329,12 +2326,12 @@ def test_watchtower(node_factory, bitcoind, directory, chainparams): channel_id = l1.rpc.listpeerchannels()['channels'][0]['channel_id'] # Force a new commitment - l1.rpc.pay(l2.rpc.invoice(25000000, 'lbl1', 'desc1')['bolt11']) + l1.rpc.xpay(l2.rpc.invoice(25000000, 'lbl1', 'desc1')['bolt11']) tx = l1.rpc.dev_sign_last_tx(l2.info['id'])['tx'] # Now make sure it is out of date - l1.rpc.pay(l2.rpc.invoice(25000000, 'lbl2', 'desc2')['bolt11']) + l1.rpc.xpay(l2.rpc.invoice(25000000, 'lbl2', 'desc2')['bolt11']) # l2 stops watching the chain, allowing the watchtower to react l2.stop() @@ -2446,14 +2443,14 @@ def test_coin_movement_notices(node_factory, bitcoind, chainparams): inv = l3.rpc.invoice(amount, "first", "desc") payment_hash13 = inv['payment_hash'] - route = l1.rpc.getroute(l3.info['id'], amount, 1)['route'] + route = l1.single_route(l3.info['id'], amount) # status: offered -> settled l1.rpc.sendpay(route, payment_hash13, payment_secret=inv['payment_secret']) l1.rpc.waitsendpay(payment_hash13) # status: offered -> failed - route = l1.rpc.getroute(l3.info['id'], amount, 1)['route'] + route = l1.single_route(l3.info['id'], amount) payment_hash13 = "f" * 64 with pytest.raises(RpcError): l1.rpc.sendpay(route, payment_hash13, payment_secret=inv['payment_secret']) @@ -2462,14 +2459,14 @@ def test_coin_movement_notices(node_factory, bitcoind, chainparams): # go the other direction inv = l1.rpc.invoice(amount // 2, "first", "desc") payment_hash31 = inv['payment_hash'] - route = l3.rpc.getroute(l1.info['id'], amount // 2, 1)['route'] + route = l3.single_route(l1.info['id'], amount // 2) l3.rpc.sendpay(route, payment_hash31, payment_secret=inv['payment_secret']) l3.rpc.waitsendpay(payment_hash31) # receive a payment (endpoint) inv = l2.rpc.invoice(amount, "first", "desc") payment_hash12 = inv['payment_hash'] - route = l1.rpc.getroute(l2.info['id'], amount, 1)['route'] + route = l1.single_route(l2.info['id'], amount) l1.rpc.sendpay(route, payment_hash12, payment_secret=inv['payment_secret']) l1.rpc.waitsendpay(payment_hash12) @@ -2478,7 +2475,7 @@ def test_coin_movement_notices(node_factory, bitcoind, chainparams): payment_hash21 = inv['payment_hash'] # Make sure previous completely settled wait_for(lambda: only_one(l2.rpc.listpeerchannels(l1.info['id'])['channels'])['htlcs'] == []) - route = l2.rpc.getroute(l1.info['id'], amount // 2, 1)['route'] + route = l2.single_route(l1.info['id'], amount // 2) l2.rpc.sendpay(route, payment_hash21, payment_secret=inv['payment_secret']) l2.rpc.waitsendpay(payment_hash21) @@ -2610,15 +2607,15 @@ def test_htlc_accepted_hook_crash(node_factory, executor): # This should still succeed - f = executor.submit(l1.rpc.pay, i) + f = executor.submit(l1.rpc.xpay, i) l2.daemon.wait_for_log(r'Crashing on purpose...') l2.daemon.wait_for_log( r'Hook handler for htlc_accepted failed with an exception.' ) - with pytest.raises(RpcError, match=r'failed: WIRE_TEMPORARY_NODE_FAILURE'): - f.result(10) + with pytest.raises(RpcError, match=r'Unexpected error \(temporary_node_failure\) from final node: disabling'): + f.result(TIMEOUT) def test_notify(node_factory): @@ -2693,17 +2690,17 @@ def test_htlc_accepted_hook_failmsg(node_factory): # First let's test the newer failure_message, which should get passed # through without being mapped. tests = { - '2002': 'WIRE_TEMPORARY_NODE_FAILURE', - '400F' + 12 * '00': 'WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS', - '4009': 'WIRE_REQUIRED_CHANNEL_FEATURE_MISSING', - '4016' + 3 * '00': 'WIRE_INVALID_ONION_PAYLOAD', + '2002': 'temporary_node_failure', + '400F' + 12 * '00': 'incorrect_or_unknown_payment_details', + '4009': 'required_channel_feature_missing', + '4016' + 3 * '00': 'invalid_onion_payload', } for failmsg, expected in tests.items(): l2.rpc.setfailmsg(msg=failmsg) inv = l2.rpc.invoice(42, 'failmsg{}'.format(failmsg), '')['bolt11'] - with pytest.raises(RpcError, match=r'failcodename.: .{}.'.format(expected)): - l1.rpc.pay(inv) + with pytest.raises(RpcError, match=expected): + l1.rpc.xpay(inv) def test_htlc_accepted_hook_customtlvs(node_factory): @@ -2718,14 +2715,14 @@ def test_htlc_accepted_hook_customtlvs(node_factory): single_tlv = "fe00010001012a" # represents type: 65537, lenght: 1, value: 42 l2.rpc.setcustomtlvs(tlvs=single_tlv) inv = l3.rpc.invoice(1000, 'customtlvs-singletlv', '')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) l3.daemon.wait_for_log(f"called htlc accepted hook with extra_tlvs: {single_tlv}") # Mutliple tlvs - Check that we recieve multiple extra tlvs at l3 attached by l2. multi_tlv = "fdffff012afe00010001020539" # represents type: 65535, length: 1, value: 42 and type: 65537, length: 2, value: 1337 l2.rpc.setcustomtlvs(tlvs=multi_tlv) inv = l3.rpc.invoice(1000, 'customtlvs-multitlvs', '')['bolt11'] - l1.rpc.pay(inv) + l1.rpc.xpay(inv) l3.daemon.wait_for_log(f"called htlc accepted hook with extra_tlvs: {multi_tlv}") @@ -2741,7 +2738,7 @@ def test_htlc_accepted_hook_malformedtlvs(node_factory): l2.rpc.setcustomtlvs(tlvs=mal_tlv) inv = l3.rpc.invoice(1000, 'customtlvs-maltlvs', '') phash = inv['payment_hash'] - route = l1.rpc.getroute(l3.info['id'], 1000, 1)['route'] + route = l1.single_route(l3.info['id'], 1000) # Here shouldn't use `pay` command because l2 should fail with a broken log. l1.rpc.sendpay(route, phash, payment_secret=inv['payment_secret']) @@ -2825,7 +2822,7 @@ def test_htlc_accepted_hook_failonion(node_factory): l2.rpc.setfailonion('0' * (292 * 2)) inv = l2.rpc.invoice(42, 'failonion000', '')['bolt11'] with pytest.raises(RpcError): - l1.rpc.pay(inv) + l1.rpc.xpay(inv) @pytest.mark.slow_test # VALGRIND running generally too slow to trigger race we need. @@ -2867,14 +2864,14 @@ def test_htlc_accepted_hook_fwdto(node_factory): l1, l2, l3 = node_factory.line_graph(3, opts=[{}, {'plugin': plugin}, {}], wait_for_announce=True) # Add some balance - l1.rpc.pay(l2.rpc.invoice(10**9 // 2, 'balance', '')['bolt11']) + l1.rpc.xpay(l2.rpc.invoice(10**9 // 2, 'balance', '')['bolt11']) wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) # make it forward back down same channel. l2.rpc.setfwdto(only_one(l1.rpc.listpeerchannels()['channels'])['channel_id']) inv = l3.rpc.invoice(42, 'fwdto', '')['bolt11'] - with pytest.raises(RpcError, match="WIRE_INVALID_ONION_HMAC"): - l1.rpc.pay(inv) + with pytest.raises(RpcError, match=r"Unexpected error \(invalid_onion_hmac\) from intermediate node: disabling the invoice's route hint"): + l1.rpc.xpay(inv) assert l2.rpc.listforwards()['forwards'][0]['out_channel'] == only_one(l1.rpc.listpeerchannels()['channels'])['short_channel_id'] @@ -2954,32 +2951,6 @@ def test_self_disable(node_factory): l1.rpc.plugin_start(p2, selfdisable=True) -def test_custom_notification_topics(node_factory): - plugin = os.path.join( - os.path.dirname(__file__), "plugins", "custom_notifications.py" - ) - l1, l2 = node_factory.line_graph(2, opts=[{'plugin': plugin}, {}]) - l1.rpc.emit() - l1.daemon.wait_for_log("Got a custom notification Hello world from plugin custom_notifications.py") - - inv = l2.rpc.invoice(42, "lbl", "desc")['bolt11'] - l1.rpc.pay(inv) - - l1.daemon.wait_for_log(r'Got a pay_success notification from plugin pay for payment_hash [0-9a-f]{64}') - - # And now make sure that we drop unannounced notifications - l1.rpc.faulty_emit() - l1.daemon.wait_for_log( - r"Plugin attempted to send a notification to topic .* not forwarding" - ) - time.sleep(1) - assert not l1.daemon.is_in_log(r'Got the ididntannouncethis event') - - # The plugin just dist what previously was a fatal mistake (emit - # an unknown notification), make sure we didn't kill it. - assert str(plugin) in [p['name'] for p in l1.rpc.plugin_list()['plugins']] - - def test_restart_on_update(node_factory): """Tests if plugin rescan restarts modified plugins """ @@ -3292,12 +3263,12 @@ def test_autoclean(node_factory): # Reconnect, l1 pays invoice, we test paid expiry. l2.rpc.connect(l3.info['id'], 'localhost', l3.port) - l1.rpc.pay(inv4['bolt11']) + l1.rpc.xpay(inv4['bolt11']) # We manually delete inv5 so we can have l1 fail a payment. l3.rpc.delinvoice('inv5', 'unpaid') - with pytest.raises(RpcError, match='WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS'): - l1.rpc.pay(inv5['bolt11']) + with pytest.raises(RpcError, match="Destination said it doesn't know invoice: incorrect_or_unknown_payment_details"): + l1.rpc.xpay(inv5['bolt11']) assert l3.rpc.autoclean_status()['autoclean']['paidinvoices']['enabled'] is False assert l3.rpc.autoclean_status()['autoclean']['paidinvoices']['cleaned'] == 0 @@ -3373,10 +3344,10 @@ def test_autoclean_once(node_factory): inv2 = l3.rpc.invoice(amount_msat=12300, label='inv2', description='description4') inv3 = l3.rpc.invoice(amount_msat=12300, label='inv3', description='description5') - l1.rpc.pay(inv2['bolt11']) + l1.rpc.xpay(inv2['bolt11']) l3.rpc.delinvoice('inv3', 'unpaid') - with pytest.raises(RpcError, match='WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS'): - l1.rpc.pay(inv3['bolt11']) + with pytest.raises(RpcError, match="Destination said it doesn't know invoice: incorrect_or_unknown_payment_details"): + l1.rpc.xpay(inv3['bolt11']) # Default status default_status = {'autoclean': {'failedpays': {'enabled': False, @@ -4242,17 +4213,17 @@ def test_sql(node_factory, bitcoind): wait_for(lambda: l2.rpc.listnodes(l1.info['id'])['nodes'] != []) # This should create a forward through l2 - l1.rpc.pay(l3.rpc.invoice(amount_msat=12300, label='inv1', description='description')['bolt11']) + l1.rpc.xpay(l3.rpc.invoice(amount_msat=12300, label='inv1', description='description')['bolt11']) # Very rough checks of other list commands (make sure l2 has one of each) l2.rpc.offer(1, 'desc') l2.rpc.invoice(1, 'label', 'desc') - l2.rpc.pay(l3.rpc.invoice(amount_msat=12300, label='inv2', description='description')['bolt11']) + l2.rpc.xpay(l3.rpc.invoice(amount_msat=12300, label='inv2', description='description')['bolt11']) # And I need at least one HTLC in-flight so listpeers.channels.htlcs isn't empty: l3.rpc.plugin_start(os.path.join(os.getcwd(), 'tests/plugins/hold_invoice.py')) inv = l3.rpc.invoice(amount_msat=12300, label='inv3', description='description') - route = l1.rpc.getroute(l3.info['id'], 12300, 1)['route'] + route = l1.single_route(l3.info['id'], 12300) l1.rpc.sendpay(route, inv['payment_hash'], payment_secret=inv['payment_secret']) # And an in-flight channel open... l2.openchannel(l3, confirm=False, wait_for_announce=False) @@ -4370,7 +4341,7 @@ def test_sql(node_factory, bitcoind): # Test json functions scidl1l3, _ = l1.fundchannel(l3) - l1.rpc.pay(l3.rpc.invoice(amount_msat=1000000, label='inv1000', description='description 1000 msat')['bolt11']) + l1.rpc.xpay(l3.rpc.invoice(amount_msat=1000000, label='inv1000', description='description 1000 msat')['bolt11']) # Two channels, l1->l3 *may* have an HTLC in flight. ret = l1.rpc.sql("SELECT json_object('peer_id', hex(pc.peer_id), 'alias', alias, 'scid', short_channel_id, 'htlcs'," @@ -4929,12 +4900,11 @@ def test_peer_storage(node_factory, bitcoind): assert not l2.daemon.is_in_log(r'PeerStorageFailed') -@pytest.mark.parametrize("deprecated", [False, True]) -def test_pay_plugin_notifications(node_factory, bitcoind, chainparams, deprecated): +def test_pay_plugin_notifications(node_factory, bitcoind, chainparams): plugin = os.path.join(os.getcwd(), 'tests/plugins/all_notifications.py') - opts = {"plugin": plugin} - if deprecated: - opts['allow-deprecated-apis'] = True + opts = {"plugin": plugin, + "xpay-handle-pay": False, + "allow-deprecated-apis": True} l1, l2, l3 = node_factory.line_graph(3, opts=[opts, {}, {}], wait_for_announce=True) @@ -4967,9 +4937,8 @@ def zero_timestamps(obj): 'enabled': True} channel_hint_update = {'origin': 'pay', 'channel_hint_update': channel_hint_update_core} - if deprecated: - # pyln-client's plugin.py duplicated payload into same name as update. - channel_hint_update['payload'] = {'channel_hint': channel_hint_update_core} + # pyln-client's plugin.py duplicated payload into same name as update. + channel_hint_update['payload'] = {'channel_hint': channel_hint_update_core} assert data == channel_hint_update @@ -4981,9 +4950,8 @@ def zero_timestamps(obj): 'bolt11': inv1['bolt11']} success = {'origin': 'pay', 'pay_success': success_core} - if deprecated: - # pyln-client's plugin.py duplicated payload into same name as update. - success['payload'] = success_core + # pyln-client's plugin.py duplicated payload into same name as update. + success['payload'] = success_core assert data == success inv2 = l3.rpc.invoice(10000, "second", "desc") @@ -4997,9 +4965,8 @@ def zero_timestamps(obj): failure_core = {'payment_hash': inv2['payment_hash'], 'bolt11': inv2['bolt11'], 'error': {'message': 'failed: WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS (reply from remote)'}} failure = {'origin': 'pay', 'pay_failure': failure_core} - if deprecated: - # pyln-client's plugin.py duplicated payload into same name as update. - failure['payload'] = failure_core + # pyln-client's plugin.py duplicated payload into same name as update. + failure['payload'] = failure_core assert data == failure diff --git a/tests/test_renepay.py b/tests/test_renepay.py index c30bde0145bc..3d1c1da3f8ca 100644 --- a/tests/test_renepay.py +++ b/tests/test_renepay.py @@ -19,7 +19,7 @@ def test_simple(node_factory): """Testing simply paying a peer.""" - l1, l2 = node_factory.line_graph(2) + l1, l2 = node_factory.line_graph(2, opts={'allow-deprecated-apis': True}) inv = l2.rpc.invoice(123000, "test_renepay", "description")["bolt11"] details = l1.rpc.call("renepay", {"invstring": inv}) assert details["status"] == "complete" @@ -33,7 +33,7 @@ def test_direction_matters(node_factory): 3, wait_for_announce=True, opts=[ - {}, + {'allow-deprecated-apis': True}, {"fee-base": 2000, "fee-per-satoshi": 20, "cltv-delta": 20}, {"fee-base": 3000, "fee-per-satoshi": 30, "cltv-delta": 30}, ], @@ -53,7 +53,8 @@ def test_shadow_routing(node_factory): """ # We need l3 for random walk l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, - opts={'dev-allow-localhost': None}) + opts={'allow-deprecated-apis': True, + 'dev-allow-localhost': None}) amount = 10000 total_amount = 0 @@ -77,7 +78,7 @@ def test_mpp(node_factory): Try paying 1.2M sats from 1 to 6. """ opts = [ - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'dev-allow-localhost': None}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'dev-allow-localhost': None, 'allow-deprecated-apis': True}, ] l1, l2, l3, l4, l5, l6 = node_factory.get_nodes(6, opts=opts * 6) node_factory.join_nodes( @@ -97,7 +98,7 @@ def test_mpp(node_factory): def test_errors(node_factory, bitcoind): opts = [ - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, ] l1, l2, l3, l4, l5, l6 = node_factory.get_nodes(6, opts=opts * 6) send_amount = Millisatoshi("21sat") @@ -147,7 +148,7 @@ def test_errors(node_factory, bitcoind): @pytest.mark.openchannel("v1") @pytest.mark.openchannel("v2") def test_pay(node_factory): - l1, l2 = node_factory.line_graph(2) + l1, l2 = node_factory.line_graph(2, opts={'allow-deprecated-apis': True}) inv = l2.rpc.invoice(123000, "test_pay", "description")["bolt11"] before = int(time.time()) @@ -230,7 +231,7 @@ def test_amounts(node_factory): """ Check that the amount received matches the amount requested in the invoice. """ - l1, l2 = node_factory.line_graph(2) + l1, l2 = node_factory.line_graph(2, opts={'allow-deprecated-apis': True}) inv = l2.rpc.invoice(Millisatoshi(123456), "test_pay_amounts", "description")[ "bolt11" ] @@ -257,7 +258,7 @@ def test_limits(node_factory): - probability of success is too low. """ opts = [ - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 100}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 100, 'allow-deprecated-apis': True}, ] l1, l2, l3, l4, l5, l6 = node_factory.get_nodes(6, opts=opts * 6) node_factory.join_nodes( @@ -365,7 +366,7 @@ def test_hardmpp(node_factory): we build the network capacities. """ opts = [ - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, ] l1, l2, l3, l4, l5, l6 = node_factory.get_nodes(6, opts=opts * 6) start_channels( @@ -409,7 +410,7 @@ def test_hardmpp(node_factory): @pytest.mark.flaky(reruns=2) def test_self_pay(node_factory): - l1, l2 = node_factory.line_graph(2, wait_for_announce=True) + l1, l2 = node_factory.line_graph(2, wait_for_announce=True, opts={'allow-deprecated-apis': True}) inv = l1.rpc.invoice(10000, "test", "test")["bolt11"] l1.rpc.call("renepay", {"invstring": inv}) @@ -443,6 +444,7 @@ def test_fee_allocation(node_factory): "fee-base": 1000, "fee-per-satoshi": 30000, "plugin": os.path.join(os.getcwd(), "tests/plugins/no_fail.py"), + 'allow-deprecated-apis': True, }, ] l1, l2, l3, l4 = node_factory.get_nodes(4, opts=opts * 4) @@ -468,22 +470,24 @@ def test_htlc_max(node_factory): 3----5----6 """ opts = [ - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, { "disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, "htlc-maximum-msat": 500000000, + 'allow-deprecated-apis': True, }, { "disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, "htlc-maximum-msat": 500000000, + 'allow-deprecated-apis': True, }, - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, ] l1, l2, l3, l4, l5, l6 = node_factory.get_nodes(6, opts=opts) start_channels( @@ -511,7 +515,7 @@ def test_previous_sendpays(node_factory, bitcoind): Check that renepay can complete a payment that already started """ opts = [ - {"disable-mpp": None, "fee-base": 1000, "fee-per-satoshi": 1000}, + {"disable-mpp": None, "fee-base": 1000, "fee-per-satoshi": 1000, 'allow-deprecated-apis': True}, ] l1, l2, l3, l4 = node_factory.line_graph(4, wait_for_announce=True, opts=opts * 4) @@ -605,12 +609,12 @@ def test_fees(node_factory): """ # made up some random fees for every node opts = [ - {"disable-mpp": None, "fee-base": 1000, "fee-per-satoshi": 100}, - {"disable-mpp": None, "fee-base": 2222, "fee-per-satoshi": 203}, - {"disable-mpp": None, "fee-base": 3333, "fee-per-satoshi": 300}, - {"disable-mpp": None, "fee-base": 2012, "fee-per-satoshi": 200}, - {"disable-mpp": None, "fee-base": 1010, "fee-per-satoshi": 100}, - {"disable-mpp": None, "fee-base": 1050, "fee-per-satoshi": 100}, + {"disable-mpp": None, "fee-base": 1000, "fee-per-satoshi": 100, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 2222, "fee-per-satoshi": 203, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 3333, "fee-per-satoshi": 300, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 2012, "fee-per-satoshi": 200, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 1010, "fee-per-satoshi": 100, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 1050, "fee-per-satoshi": 100, 'allow-deprecated-apis': True}, ] nodes = node_factory.line_graph(len(opts), wait_for_announce=True, opts=opts) source = nodes[0] @@ -637,7 +641,7 @@ def test_fees(node_factory): def test_local_htlcmax0(node_factory): """Testing a simple pay route when local channels have htlcmax=0.""" - l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True) + l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, opts={'allow-deprecated-apis': True}) l1.rpc.setchannel(l2.info["id"], htlcmax=0) inv = l3.rpc.invoice(123000, "test_renepay", "description")["bolt11"] details = l1.rpc.call("renepay", {"invstring": inv}) @@ -655,22 +659,24 @@ def test_htlcmax0(node_factory): Tests the plugin when some routes have htlc_max=0. """ opts = [ - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, { "disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, "htlc-maximum-msat": 0, + 'allow-deprecated-apis': True, }, { "disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, "htlc-maximum-msat": 800000000, + 'allow-deprecated-apis': True, }, - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, ] l1, l2, l3, l4, l5, l6 = node_factory.get_nodes(6, opts=opts) start_channels( @@ -693,7 +699,7 @@ def test_htlcmax0(node_factory): def test_concurrency(node_factory): - l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, opts=[{}, {}, {}]) + l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, opts={'allow-deprecated-apis': True}) inv = l3.rpc.invoice("1000sat", "test_renepay", "description")["bolt11"] p1 = subprocess.Popen( [ @@ -735,10 +741,10 @@ def test_privatechan(node_factory, bitcoind): Tests if a payment can get through a private channel. """ opts = [ - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 100}, - {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 100, 'allow-deprecated-apis': True}, + {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 0, 'allow-deprecated-apis': True}, ] l1, l2, l3, l4 = node_factory.get_nodes(4, opts=opts) @@ -771,7 +777,7 @@ def test_privatechan(node_factory, bitcoind): @unittest.skipIf(TEST_NETWORK == 'liquid-regtest', "broken for some reason") def test_hardmpp2(node_factory, bitcoind): """Credits to @daywalker90 for this test case.""" - opts = {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 10} + opts = {"disable-mpp": None, "fee-base": 0, "fee-per-satoshi": 10, 'allow-deprecated-apis': True} l1, l2, l3 = node_factory.get_nodes(3, opts=opts) start_channels( [ @@ -797,7 +803,7 @@ def test_hardmpp2(node_factory, bitcoind): def test_description(node_factory): """Test the processing of the payment description interface.""" - l1, l2 = node_factory.line_graph(2) + l1, l2 = node_factory.line_graph(2, opts={'allow-deprecated-apis': True}) # do not provide description in the command line, all payments should be # fine @@ -840,7 +846,7 @@ def test_description(node_factory): def test_offers(node_factory): l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, - opts={'dev-allow-localhost': None}) + opts={'dev-allow-localhost': None, 'allow-deprecated-apis': True}) offer = l3.rpc.offer("1000sat", "test_renepay_offers")['bolt12'] invoice = l1.rpc.fetchinvoice(offer)['invoice'] response = l1.rpc.call("renepay", {"invstring": invoice}) @@ -849,14 +855,14 @@ def test_offers(node_factory): def test_offer_selfpay(node_factory): """We can fetch an pay our own offer""" - l1 = node_factory.get_node() + l1 = node_factory.get_node(options={'allow-deprecated-apis': True}) offer = l1.rpc.offer(amount="2msat", description="test_offer_path_self")["bolt12"] inv = l1.rpc.fetchinvoice(offer)["invoice"] l1.rpc.call("renepay", {"invstring": inv}) def test_unannounced(node_factory): - l1, l2 = node_factory.line_graph(2, announce_channels=False) + l1, l2 = node_factory.line_graph(2, announce_channels=False, opts={'allow-deprecated-apis': True}) # BOLT-11 direct peer b11 = l2.rpc.invoice( "100sat", "test_renepay_unannounced", "test_renepay_unannounced" diff --git a/tests/test_splice.py b/tests/test_splice.py index 39ee8293c164..b4658051934e 100644 --- a/tests/test_splice.py +++ b/tests/test_splice.py @@ -566,7 +566,7 @@ def make_chans(node_factory, qty=2, fundamount=1000000, balanced=True): nodes[i].daemon.wait_for_log(' to CHANNELD_NORMAL') if balanced: inv = nodes[i + 1].rpc.invoice(1000 * fundamount // 2, 'balance', 'balance') - nodes[i].rpc.pay(inv['bolt11']) + nodes[i].rpc.xpay(inv['bolt11']) chanids.insert(0, nodes[1].get_channel_id(nodes[0])) if qty > 1: diff --git a/tests/test_splicing.py b/tests/test_splicing.py index f713ff7ba14e..826a7f7dc856 100644 --- a/tests/test_splicing.py +++ b/tests/test_splicing.py @@ -40,7 +40,7 @@ def test_splice(node_factory, bitcoind): l1.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_NORMAL') inv = l2.rpc.invoice(10**2, '3', 'no_3') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) # Check that the splice doesn't generate a unilateral close transaction time.sleep(5) @@ -114,10 +114,10 @@ def test_two_chan_splice_in(node_factory, bitcoind): l1.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_NORMAL') inv = l2.rpc.invoice(10**2, '1', 'no_1') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) inv = l3.rpc.invoice(10**2, '2', 'no_2') - l2.rpc.pay(inv['bolt11']) + l2.rpc.xpay(inv['bolt11']) @pytest.mark.openchannel('v1') @@ -146,7 +146,7 @@ def test_splice_rbf(node_factory, bitcoind): assert result['txid'] in list(mempool.keys()) inv = l2.rpc.invoice(10**2, '1', 'no_1') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) funds_result = l1.rpc.addpsbtoutput(100000) @@ -162,7 +162,7 @@ def test_splice_rbf(node_factory, bitcoind): l1.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_AWAITING_SPLICE') inv = l2.rpc.invoice(10**2, '2', 'no_2') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) # Make sure l1 doesn't unilateral close if HTLC hasn't completely settled before deadline. wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['htlcs'] == []) @@ -173,7 +173,7 @@ def test_splice_rbf(node_factory, bitcoind): l1.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_NORMAL') inv = l2.rpc.invoice(10**2, '3', 'no_3') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) # Check that the splice doesn't generate a unilateral close transaction time.sleep(5) @@ -335,7 +335,7 @@ def test_splice_out(node_factory, bitcoind): l1.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_NORMAL') inv = l2.rpc.invoice(10**2, '3', 'no_3') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) # Check that the splice doesn't generate a unilateral close transaction time.sleep(5) @@ -392,7 +392,7 @@ def test_invalid_splice(node_factory, bitcoind): l1.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_NORMAL') inv = l2.rpc.invoice(10**2, '3', 'no_3') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) # Check that the splice doesn't generate a unilateral close transaction time.sleep(5) @@ -443,7 +443,7 @@ def test_commit_crash_splice(node_factory, bitcoind): assert l1.db_query("SELECT count(*) as c FROM channel_funding_inflights;")[0]['c'] == 0 inv = l2.rpc.invoice(10**2, '3', 'no_3') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) # Check that the splice doesn't generate a unilateral close transaction time.sleep(5) @@ -459,7 +459,7 @@ def test_splice_stuck_htlc(node_factory, bitcoind, executor): l3.rpc.dev_ignore_htlcs(id=l2.info['id'], ignore=True) inv = l3.rpc.invoice(10000000, '1', 'no_1') - executor.submit(l1.rpc.pay, inv['bolt11']) + executor.submit(l1.rpc.xpay, inv['bolt11']) l3.daemon.wait_for_log('their htlc 0 dev_ignore_htlcs') # Now we should have a stuck invoice between l1 -> l2 @@ -510,7 +510,7 @@ def test_route_by_old_scid(node_factory, bitcoind): # Get pre-splice route. inv = l3.rpc.invoice(10000000, 'test_route_by_old_scid', 'test_route_by_old_scid') inv2 = l3.rpc.invoice(10000000, 'test_route_by_old_scid2', 'test_route_by_old_scid2') - route = l1.rpc.getroute(l3.info['id'], 10000000, 1, cltv=16)['route'] + route = l1.single_route(l3.info['id'], 10000000, cltv=16) # Do a splice funds_result = l2.rpc.fundpsbt("105790sat", 0, 0, excess_as_change=True) diff --git a/tests/test_splicing_disconnect.py b/tests/test_splicing_disconnect.py index 11830a4064ba..9995fb0434e7 100644 --- a/tests/test_splicing_disconnect.py +++ b/tests/test_splicing_disconnect.py @@ -59,7 +59,7 @@ def test_splice_disconnect_sig(node_factory, bitcoind): l2.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_NORMAL') inv = l2.rpc.invoice(10**2, '3', 'no_3') - l1.rpc.pay(inv['bolt11']) + l1.rpc.xpay(inv['bolt11']) # Check that the splice doesn't generate a unilateral close transaction time.sleep(5) diff --git a/tests/test_xpay.py b/tests/test_xpay.py index 1f9106e14629..9373cc2f4997 100644 --- a/tests/test_xpay.py +++ b/tests/test_xpay.py @@ -3,7 +3,7 @@ from pyln.client import RpcError from pyln.testing.utils import FUNDAMOUNT, only_one from utils import ( - TIMEOUT, first_scid, GenChannel, generate_gossip_store, wait_for, + TIMEOUT, first_scid, first_scidd, GenChannel, generate_gossip_store, wait_for, sync_blockheight, ) @@ -16,6 +16,7 @@ from hashlib import sha256 from pathlib import Path import tempfile +import time import unittest @@ -155,10 +156,12 @@ def test_xpay_simple(node_factory): assert ret['amount_msat'] == 10000 assert ret['amount_sent_msat'] == 10000 + PAY_INJECTPAYMENTONION_ALREADY_PAID = 219 # Fails if we try to pay again b11_paid = b11 - with pytest.raises(RpcError, match="Already paid"): + with pytest.raises(RpcError, match="Already paid") as err: l1.rpc.xpay(b11_paid) + assert err.value.error['code'] == PAY_INJECTPAYMENTONION_ALREADY_PAID # BOLT-11, indirect peer b11 = l3.rpc.invoice('10000msat', 'test_xpay_simple', 'test_xpay_simple bolt11')['bolt11'] @@ -197,11 +200,11 @@ def test_xpay_simple(node_factory): # Failure from l3 (with routehint) l4.stop() - with pytest.raises(RpcError, match=r"Failed after 1 attempts\. We got temporary_channel_failure for the invoice's route hint \([0-9x]*/[01]\), assuming it can't carry 10000msat\. Then routing failed: We could not find a usable set of paths\. The shortest path is [0-9x]*->[0-9x]*->[0-9x]*, but [0-9x]*/[01]\ layer xpay-7 says max is 9999msat"): + with pytest.raises(RpcError, match=r"Failed after 1 attempts\. We got temporary_channel_failure for the invoice's route hint \([0-9x]*/[01]\), assuming it can't carry 10000msat\. Then routing failed: We could not find a usable set of paths\. The shortest path is [0-9x]*->[0-9x]*->[0-9x]*, but [0-9x]*/[01]\ layer xpay-15 says max is 9999msat"): l1.rpc.xpay(b11) # Failure from l3 (with blinded path) - with pytest.raises(RpcError, match=r"Failed after 1 attempts. We got an error from inside the blinded path 0x0x0/1: we assume it means insufficient capacity. Then routing failed: We could not find a usable set of paths. The shortest path is [0-9x]*->[0-9x]*->0x0x0, but 0x0x0/1 layer xpay-8 says max is 99999msat"): + with pytest.raises(RpcError, match=r"Failed after 1 attempts. We got an error from inside the blinded path 0x0x0/1: we assume it means insufficient capacity. Then routing failed: We could not find a usable set of paths. The shortest path is [0-9x]*->[0-9x]*->0x0x0, but 0x0x0/1 layer xpay-17 says max is 99999msat"): l1.rpc.xpay(b12) # Restart, try pay already paid one again. @@ -397,7 +400,8 @@ def test_xpay_partial_msat(node_factory, executor): def test_xpay_takeover(node_factory, executor): l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, - opts={'xpay-handle-pay': True}) + opts={'xpay-handle-pay': True, + 'allow-deprecated-apis': True}) # Simple bolt11/bolt12 payment. inv = l3.rpc.invoice(100000, "test_xpay_takeover1", "test_xpay_takeover1")['bolt11'] @@ -460,12 +464,13 @@ def test_xpay_takeover(node_factory, executor): inv, "10000", 'label']) l1.daemon.wait_for_log(r'Not redirecting pay \(only handle 1 or 2 args\): ') - # Other args are ignored. + # Label gets maintained. inv = l3.rpc.invoice('any', "test_xpay_takeover7", "test_xpay_takeover7") l1.rpc.pay(inv['bolt11'], amount_msat=10000, label='test_xpay_takeover7') - l1.daemon.wait_for_log('Unknown arg "label", xpay will ignore it.') l1.daemon.wait_for_log('Redirecting pay->xpay') + assert any(p.get('label') == 'test_xpay_takeover7' for p in l1.rpc.listsendpays()['payments']) + # Other args are ignored. inv = l3.rpc.invoice('any', "test_xpay_takeover8", "test_xpay_takeover8") l1.rpc.pay(inv['bolt11'], amount_msat=10000, riskfactor=1) l1.daemon.wait_for_log('Unknown arg "riskfactor", xpay will ignore it.') @@ -714,7 +719,7 @@ def test_fail_after_success(node_factory, bitcoind, executor, slow_mode): wait_for(lambda: len(l1.rpc.listchannels()['channels']) == 10) inv = l5.rpc.invoice(800000000, 'test_xpay_slow_mode', 'test_xpay_slow_mode', preimage='00' * 32)['bolt11'] - fut = executor.submit(l1.rpc.xpay, invstring=inv, retry_for=0) + fut = executor.submit(l1.rpc.xpay, invstring=inv, retry_for=0, dev_use_shadow=False) # Part via l3 is fine. Part via l4 is stuck, so we kill l4 and mine # blocks to make l2 force close. @@ -984,6 +989,32 @@ def test_xpay_bip353(node_factory): l2.rpc.xpay('fake@fake.com', 100) +def test_xpay_shadow_cltv(node_factory, bitcoind): + """Shadow CLTV: dev_use_shadow=False gives exact CLTV; errors for offer/BIP353.""" + l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True) + scidd_21 = first_scidd(l2, l1) + scidd_23 = first_scidd(l2, l3) + scidd_32 = first_scidd(l3, l2) + + # One in 4 chance that it adds two shadow routes... + i = 0 + while True: + inv = l3.rpc.invoice('10000msat', f'with_shadow {i}', f'with shadow {i}')['bolt11'] + l1.rpc.xpay(invstring=inv) + if l1.daemon.is_in_log(r'shadow #2: stopping'): + break + i += 1 + + # First one must be the one to l2. + assert l1.daemon.is_in_log(f"shadow #0: adding {scidd_32} to {l2.info['id']}") + # Second one could be back to l3 or to l1. + assert l1.daemon.is_in_log(f"shadow #1: adding {scidd_23} to {l3.info['id']}") or l1.daemon.is_in_log(f"shadow #1: adding {scidd_21} to {l1.info['id']}") + + # Final cltv is 5, then two shadow hops and one padding. + expected_cltv = bitcoind.rpc.getblockchaininfo()['blocks'] + 5 + 1 + 6 * 2 + assert l2.daemon.is_in_log(f"Adding HTLC .* amount=10000msat cltv={expected_cltv} gave CHANNEL_ERR_ADD_OK") + + def test_xpay_limited_max_accepted_htlcs(node_factory): """xpay should try to reduce flows to 6 if there is an unannounced channel, and only try more if that fails""" CHANNEL_SIZE_SATS = 10**6 @@ -1063,10 +1094,10 @@ def mock_getblockhash(req): # This will wait, then fail. with pytest.raises(RpcError, match=f'Timed out waiting for blockheight {l3_height}'): - l1.rpc.xpay(invstring=inv, retry_for=10) + l1.rpc.xpay(invstring=inv, retry_for=10, dev_use_shadow=False) # This will succeed, because we wait for the blocks. - fut = executor.submit(l1.rpc.xpay, invstring=inv, retry_for=60) + fut = executor.submit(l1.rpc.xpay, invstring=inv, retry_for=60, dev_use_shadow=False) l1.daemon.wait_for_log(fr"Our blockheight may be too low: waiting .* seconds for height {l3_height} \(we are at {l1_height}\)") # Now let it catch up, and it will retry, and succeed. @@ -1074,6 +1105,88 @@ def mock_getblockhash(req): fut.result(TIMEOUT) +def test_xpay_get_error_with_update(node_factory): + """We should process an update inside a temporary_channel_failure""" + l1, l2, l3 = node_factory.line_graph(3, opts={'log-level': 'io'}, fundchannel=True, wait_for_announce=True) + chanid2 = l2.get_channel_scid(l3) + + inv = l3.rpc.invoice(123000, 'test_xpay_get_error_with_update', 'description') + + # Make sure it's not doing startup any more (where it doesn't disable channels!) + l2.daemon.wait_for_log("channel_gossip: no longer in startup mode", timeout=70) + + # Make sure l2 doesn't tell l1 directly that channel is disabled. + l2.rpc.dev_suppress_gossip() + l3.stop() + + # Make sure that l2 has seen disconnect, considers channel disabled. + wait_for(lambda: only_one(l2.rpc.listpeerchannels(l3.info['id'])['channels'])['peer_connected'] is False) + + assert(l1.is_channel_active(chanid2)) + + with pytest.raises(RpcError, match=r'temporary_channel_failure'): + l1.rpc.xpay(inv['bolt11']) + + # Make sure we get an onionreply, without the type prefix of the nested + # channel_update, and it should patch it to include a type prefix. The + # prefix 0x0102 should be in the channel_update, but not in the + # onionreply (negation of 0x0102 in the RE) + l1.daemon.wait_for_log(rf'Got channel_update from error for {chanid2}/0: 0102') + + # But this update is only for this one, not future ones! + time.sleep(5) + assert l1.is_channel_active(chanid2) + + +def test_xpay_error_update_fees(node_factory): + """We should process an update inside a temporary_channel_failure""" + l1, l2, l3 = node_factory.line_graph(3, fundchannel=True, wait_for_announce=True) + + # Don't include any routehints in first invoice. + inv1 = l3.dev_invoice(amount_msat=123000, + label='test_xpay_error_update_fees', + description='description', + dev_routes=[]) + + inv2 = l3.rpc.invoice(123000, 'test_xpay_error_update_fees2', 'desc') + assert 'routes' not in l1.rpc.decode(inv1['bolt11']) + assert 'routes' in l1.rpc.decode(inv2['bolt11']) + + # Make sure l2 doesn't tell l1 directly that channel fee is changed. + l2.rpc.dev_suppress_gossip() + l2.rpc.setchannel(l3.info['id'], 1337, 137, enforcedelay=0) + + # Should bounce off and retry... + ret = l1.rpc.xpay(inv1['bolt11']) + assert ret["failed_parts"] == 1 + assert ret["successful_parts"] == 1 + l1.daemon.wait_for_log('We got fee_insufficient for .*, containing a channel_update: updating our map') + + # This will have to do the same, since we don't remember such updates. It will + # even fix the routehint which is (now) wrong. + ret = l1.rpc.xpay(inv2['bolt11']) + assert ret["failed_parts"] == 1 + assert ret["successful_parts"] == 1 + l1.daemon.wait_for_log('We got fee_insufficient for .*, containing a channel_update: updating our map') + + +def test_error_messages(node_factory): + """Nicer error messages when we disable the only channel to the destination.""" + plugin = os.path.join(os.path.dirname(__file__), 'plugins/replace_payload.py') + l1, l2 = node_factory.line_graph( + 2, + opts=[{}, {"plugin": plugin}], + wait_for_announce=True + ) + + # Replace with an invalid payload. + l2.rpc.call('setpayload', ['0000']) + inv = l2.rpc.invoice(123, 'test_error_messages', 'test_error_messages')['bolt11'] + scidd = first_scidd(l1, l2) + with pytest.raises(RpcError, match=rf"Failed after 1 attempts\. Unexpected error \(invalid_onion_payload\) from final node: disabling {scidd} for this payment\. Then routing failed: We could not find a usable set of paths\. All 1 channels to the source are disabled."): + l1.rpc.xpay(inv) + + def test_blinded_path_fees(node_factory): """Test that we don't send the amount+fees to our direct peer (we should only send the required amount) when the sending node is the entry point in diff --git a/tools/lightning-downgrade.c b/tools/lightning-downgrade.c index 70a8f2206e5b..a1fc9beb7b0f 100644 --- a/tools/lightning-downgrade.c +++ b/tools/lightning-downgrade.c @@ -41,10 +41,7 @@ struct layer { static void copy_data(u8 **out, const u8 *in, size_t len) { - size_t oldlen = tal_bytelen(*out); - - tal_resize(out, oldlen + len); - memcpy(*out + oldlen, in, len); + tal_arr_appendn(out, in, len); } /* askrene added DSTORE_CHANNEL_BIAS_V2 (convertable) and diff --git a/tools/mockup.sh b/tools/mockup.sh index c98215c79292..ab479922911d 100755 --- a/tools/mockup.sh +++ b/tools/mockup.sh @@ -44,7 +44,7 @@ for SYMBOL; do # If there are multiple declarations, pick first (eg. common/memleak.h # has notleak_ as a declaration, and then an inline). # Also, prefer local headers over generic ones. - WHERE=$(shopt -s nullglob; grep -nH "^[a-zA-Z0-9_ (),]* [*]*$SYMBOL(" "$UPDIRNAME"/*.h ./*/*.h | head -n1) + WHERE=$(shopt -s nullglob; grep -nH "^[a-zA-Z0-9_ (),]* [*]*$SYMBOL(" "$UPDIRNAME"/*.h "$UPDIRNAME"/../*.h ./*/*.h | head -n1) if [ -z "$WHERE" ]; then WHERE=$(shopt -s nullglob; grep -nH "^extern [a-zA-Z0-9_ (),]* [*]*$SYMBOL;" "$UPDIRNAME"/*.h ./*/*.h | head -n1) STUB=";"