diff --git a/.msggen.json b/.msggen.json index 68753b380e65..c8ed3a44af0b 100644 --- a/.msggen.json +++ b/.msggen.json @@ -752,6 +752,7 @@ "AskRene-Create-Layer.layers[].created_channels[]": 5, "AskRene-Create-Layer.layers[].disabled_channels[]": 4, "AskRene-Create-Layer.layers[].disabled_nodes[]": 3, + "AskRene-Create-Layer.layers[].impressions[]": 10, "AskRene-Create-Layer.layers[].layer": 1, "AskRene-Create-Layer.layers[].node_biases[]": 9, "AskRene-Create-Layer.layers[].persistent": 2 @@ -781,6 +782,11 @@ "AskRene-Create-Layer.layers[].created_channels[].short_channel_id": 3, "AskRene-Create-Layer.layers[].created_channels[].source": 1 }, + "Askrene-create-layerLayersImpressions": { + "AskRene-Create-Layer.layers[].impressions[].amount_msat": 3, + "AskRene-Create-Layer.layers[].impressions[].short_channel_id_dir": 1, + "AskRene-Create-Layer.layers[].impressions[].timestamp": 2 + }, "Askrene-create-layerLayersNodeBiases": { "AskRene-Create-Layer.layers[].node_biases[].description": 4, "AskRene-Create-Layer.layers[].node_biases[].in_bias": 2, @@ -813,6 +819,12 @@ "AskRene-Inform-Channel.constraints[].short_channel_id_dir": 1, "AskRene-Inform-Channel.constraints[].timestamp": 3 }, + "Askrene-inform-channelImpressions": { + "AskRene-Inform-Channel.impressions[].amount_msat": 4, + "AskRene-Inform-Channel.impressions[].layer": 2, + "AskRene-Inform-Channel.impressions[].short_channel_id_dir": 1, + "AskRene-Inform-Channel.impressions[].timestamp": 3 + }, "Askrene-inform-channelRequest": { "AskRene-Inform-Channel.amount_msat": 7, "AskRene-Inform-Channel.direction": 3, @@ -825,7 +837,8 @@ }, "Askrene-inform-channelResponse": { "AskRene-Inform-Channel.constraint": 1, - "AskRene-Inform-Channel.constraints[]": 2 + "AskRene-Inform-Channel.constraints[]": 2, + "AskRene-Inform-Channel.impressions[]": 3 }, "Askrene-listlayersLayers": { "AskRene-ListLayers.layers[].biases[]": 8, @@ -834,6 +847,7 @@ "AskRene-ListLayers.layers[].created_channels[]": 3, "AskRene-ListLayers.layers[].disabled_channels[]": 6, "AskRene-ListLayers.layers[].disabled_nodes[]": 2, + "AskRene-ListLayers.layers[].impressions[]": 10, "AskRene-ListLayers.layers[].layer": 1, "AskRene-ListLayers.layers[].node_biases[]": 9, "AskRene-ListLayers.layers[].persistent": 5 @@ -872,6 +886,11 @@ "AskRene-ListLayers.layers[].created_channels[].short_channel_id": 3, "AskRene-ListLayers.layers[].created_channels[].source": 1 }, + "Askrene-listlayersLayersImpressions": { + "AskRene-ListLayers.layers[].impressions[].amount_msat": 3, + "AskRene-ListLayers.layers[].impressions[].short_channel_id_dir": 1, + "AskRene-ListLayers.layers[].impressions[].timestamp": 2 + }, "Askrene-listlayersLayersNodeBiases": { "AskRene-ListLayers.layers[].node_biases[].description": 4, "AskRene-ListLayers.layers[].node_biases[].in_bias": 2, @@ -4745,6 +4764,22 @@ "added": "v24.11", "deprecated": null }, + "AskRene-Create-Layer.layers[].impressions[]": { + "added": "v26.09", + "deprecated": null + }, + "AskRene-Create-Layer.layers[].impressions[].amount_msat": { + "added": "v26.09", + "deprecated": null + }, + "AskRene-Create-Layer.layers[].impressions[].short_channel_id_dir": { + "added": "v26.09", + "deprecated": null + }, + "AskRene-Create-Layer.layers[].impressions[].timestamp": { + "added": "v26.09", + "deprecated": null + }, "AskRene-Create-Layer.layers[].layer": { "added": "v24.11", "deprecated": null @@ -4853,6 +4888,26 @@ "added": "v24.11", "deprecated": null }, + "AskRene-Inform-Channel.impressions[]": { + "added": "v26.09", + "deprecated": null + }, + "AskRene-Inform-Channel.impressions[].amount_msat": { + "added": "v26.09", + "deprecated": null + }, + "AskRene-Inform-Channel.impressions[].layer": { + "added": "v26.09", + "deprecated": null + }, + "AskRene-Inform-Channel.impressions[].short_channel_id_dir": { + "added": "v26.09", + "deprecated": null + }, + "AskRene-Inform-Channel.impressions[].timestamp": { + "added": "v26.09", + "deprecated": null + }, "AskRene-Inform-Channel.inform": { "added": "v24.11", "deprecated": null @@ -5017,6 +5072,22 @@ "added": "v24.11", "deprecated": null }, + "AskRene-ListLayers.layers[].impressions[]": { + "added": "v26.09", + "deprecated": null + }, + "AskRene-ListLayers.layers[].impressions[].amount_msat": { + "added": "v26.09", + "deprecated": null + }, + "AskRene-ListLayers.layers[].impressions[].short_channel_id_dir": { + "added": "v26.09", + "deprecated": null + }, + "AskRene-ListLayers.layers[].impressions[].timestamp": { + "added": "v26.09", + "deprecated": null + }, "AskRene-ListLayers.layers[].layer": { "added": "v24.11", "deprecated": null diff --git a/cln-grpc/proto/node.proto b/cln-grpc/proto/node.proto index d1e3ec921c42..031061a9c9c8 100644 --- a/cln-grpc/proto/node.proto +++ b/cln-grpc/proto/node.proto @@ -3928,6 +3928,7 @@ message AskrenelistlayersLayers { repeated AskrenelistlayersLayersChannelUpdates channel_updates = 7; repeated AskrenelistlayersLayersBiases biases = 8; repeated AskrenelistlayersLayersNodeBiases node_biases = 9; + repeated AskrenelistlayersLayersImpressions impressions = 10; } message AskrenelistlayersLayersCreatedChannels { @@ -3954,6 +3955,12 @@ message AskrenelistlayersLayersConstraints { optional uint64 timestamp = 6; } +message AskrenelistlayersLayersImpressions { + string short_channel_id_dir = 1; + uint64 timestamp = 2; + Amount amount_msat = 3; +} + message AskrenelistlayersLayersBiases { string short_channel_id_dir = 1; sint64 bias = 2; @@ -3988,6 +3995,7 @@ message AskrenecreatelayerLayers { repeated AskrenecreatelayerLayersConstraints constraints = 7; repeated AskrenecreatelayerLayersBiases biases = 8; repeated AskrenecreatelayerLayersNodeBiases node_biases = 9; + repeated AskrenecreatelayerLayersImpressions impressions = 10; } message AskrenecreatelayerLayersCreatedChannels { @@ -4012,6 +4020,12 @@ message AskrenecreatelayerLayersConstraints { optional Amount minimum_msat = 4; } +message AskrenecreatelayerLayersImpressions { + string short_channel_id_dir = 1; + uint64 timestamp = 2; + Amount amount_msat = 3; +} + message AskrenecreatelayerLayersBiases { string short_channel_id_dir = 1; sint64 bias = 2; @@ -4124,6 +4138,7 @@ message AskreneinformchannelRequest { message AskreneinformchannelResponse { repeated AskreneinformchannelConstraints constraints = 2; + repeated AskreneinformchannelImpressions impressions = 3; } message AskreneinformchannelConstraints { @@ -4134,6 +4149,13 @@ message AskreneinformchannelConstraints { optional Amount minimum_msat = 5; } +message AskreneinformchannelImpressions { + string short_channel_id_dir = 1; + string layer = 2; + uint64 timestamp = 3; + Amount amount_msat = 4; +} + message AskrenecreatechannelRequest { string layer = 1; bytes source = 2; diff --git a/cln-grpc/src/convert.rs b/cln-grpc/src/convert.rs index 54f8bd5e6e3c..628a0d1ba112 100644 --- a/cln-grpc/src/convert.rs +++ b/cln-grpc/src/convert.rs @@ -4171,6 +4171,17 @@ impl From for pb::Askrenelist } } +#[allow(unused_variables)] +impl From for pb::AskrenelistlayersLayersImpressions { + fn from(c: responses::AskrenelistlayersLayersImpressions) -> Self { + Self { + amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat + short_channel_id_dir: c.short_channel_id_dir.to_string(), // Rule #2 for type short_channel_id_dir + timestamp: c.timestamp, // Rule #2 for type u64 + } + } +} + #[allow(unused_variables)] impl From for pb::AskrenelistlayersLayersNodeBiases { fn from(c: responses::AskrenelistlayersLayersNodeBiases) -> Self { @@ -4200,6 +4211,8 @@ impl From for pb::AskrenelistlayersLayers { disabled_channels: c.disabled_channels.map(|arr| arr.into_iter().map(|i| i.to_string()).collect()).unwrap_or(vec![]), // Rule #3 // Field: AskRene-ListLayers.layers[].disabled_nodes[] disabled_nodes: c.disabled_nodes.into_iter().map(|i| i.serialize().to_vec()).collect(), // Rule #3 for type pubkey + // Field: AskRene-ListLayers.layers[].impressions[] + impressions: c.impressions.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 layer: c.layer, // Rule #2 for type string // Field: AskRene-ListLayers.layers[].node_biases[] node_biases: c.node_biases.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 @@ -4267,6 +4280,17 @@ impl From for pb::Askrenecre } } +#[allow(unused_variables)] +impl From for pb::AskrenecreatelayerLayersImpressions { + fn from(c: responses::AskrenecreatelayerLayersImpressions) -> Self { + Self { + amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat + short_channel_id_dir: c.short_channel_id_dir.to_string(), // Rule #2 for type short_channel_id_dir + timestamp: c.timestamp, // Rule #2 for type u64 + } + } +} + #[allow(unused_variables)] impl From for pb::AskrenecreatelayerLayersNodeBiases { fn from(c: responses::AskrenecreatelayerLayersNodeBiases) -> Self { @@ -4296,6 +4320,8 @@ impl From for pb::AskrenecreatelayerLayers disabled_channels: c.disabled_channels.map(|arr| arr.into_iter().map(|i| i.to_string()).collect()).unwrap_or(vec![]), // Rule #3 // Field: AskRene-Create-Layer.layers[].disabled_nodes[] disabled_nodes: c.disabled_nodes.into_iter().map(|i| i.serialize().to_vec()).collect(), // Rule #3 for type pubkey + // Field: AskRene-Create-Layer.layers[].impressions[] + impressions: c.impressions.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 layer: c.layer, // Rule #2 for type string // Field: AskRene-Create-Layer.layers[].node_biases[] node_biases: c.node_biases.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 @@ -4414,12 +4440,26 @@ impl From for pb::Askreneinformchann } } +#[allow(unused_variables)] +impl From for pb::AskreneinformchannelImpressions { + fn from(c: responses::AskreneinformchannelImpressions) -> Self { + Self { + amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat + layer: c.layer, // Rule #2 for type string + short_channel_id_dir: c.short_channel_id_dir.to_string(), // Rule #2 for type short_channel_id_dir + timestamp: c.timestamp, // Rule #2 for type u64 + } + } +} + #[allow(unused_variables)] impl From for pb::AskreneinformchannelResponse { fn from(c: responses::AskreneinformchannelResponse) -> Self { Self { // Field: AskRene-Inform-Channel.constraints[] constraints: c.constraints.into_iter().map(|i| i.into()).collect(), // Rule #3 for type AskreneinformchannelConstraints + // Field: AskRene-Inform-Channel.impressions[] + impressions: c.impressions.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 } } } diff --git a/cln-rpc/src/model.rs b/cln-rpc/src/model.rs index 42f11ef336ea..bd8f92ad76eb 100644 --- a/cln-rpc/src/model.rs +++ b/cln-rpc/src/model.rs @@ -4686,7 +4686,7 @@ pub mod requests { "askrene-disable-node" } } - /// ['Whether this payment passed (implying capacity of at least that amount), failed (implying maximum capacity of one msat less), or succeeded (implying capacity has been reduced in this direction)'] + /// ['Whether this payment passed (implying capacity of at least that amount), failed (implying maximum capacity of one msat less), or succeeded (implying capacity has been reduced in this direction)', 'If `succeeded`, then an `impression` is created and returned, otherwise a `constraint` is created and returned.'] #[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] #[allow(non_camel_case_types)] pub enum AskreneinformchannelInform { @@ -12078,6 +12078,13 @@ pub mod responses { pub short_channel_id_dir: ShortChannelIdDir, } + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct AskrenelistlayersLayersImpressions { + pub amount_msat: Amount, + pub short_channel_id_dir: ShortChannelIdDir, + pub timestamp: u64, + } + #[derive(Clone, Debug, Deserialize, Serialize)] pub struct AskrenelistlayersLayersNodeBiases { #[serde(skip_serializing_if = "Option::is_none")] @@ -12131,6 +12138,8 @@ pub mod responses { #[serde(skip_serializing_if = "crate::is_none_or_empty")] pub disabled_channels: Option>, #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub impressions: Option>, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] pub node_biases: Option>, pub channel_updates: Vec, pub constraints: Vec, @@ -12166,6 +12175,13 @@ pub mod responses { pub short_channel_id_dir: ShortChannelIdDir, } + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct AskrenecreatelayerLayersImpressions { + pub amount_msat: Amount, + pub short_channel_id_dir: ShortChannelIdDir, + pub timestamp: u64, + } + #[derive(Clone, Debug, Deserialize, Serialize)] pub struct AskrenecreatelayerLayersNodeBiases { #[serde(skip_serializing_if = "Option::is_none")] @@ -12215,6 +12231,8 @@ pub mod responses { #[serde(skip_serializing_if = "crate::is_none_or_empty")] pub disabled_channels: Option>, #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub impressions: Option>, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] pub node_biases: Option>, pub channel_updates: Vec, pub constraints: Vec, @@ -12368,6 +12386,14 @@ pub mod responses { } } + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct AskreneinformchannelImpressions { + pub amount_msat: Amount, + pub layer: String, + pub short_channel_id_dir: ShortChannelIdDir, + pub timestamp: u64, + } + #[derive(Clone, Debug, Deserialize, Serialize)] pub struct AskreneinformchannelConstraints { #[serde(skip_serializing_if = "Option::is_none")] @@ -12381,6 +12407,8 @@ pub mod responses { #[derive(Clone, Debug, Deserialize, Serialize)] pub struct AskreneinformchannelResponse { + #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub impressions: Option>, pub constraints: Vec, } diff --git a/common/Makefile b/common/Makefile index 69befa168f6b..d60606420807 100644 --- a/common/Makefile +++ b/common/Makefile @@ -121,6 +121,7 @@ COMMON_HEADERS_NOGEN := $(COMMON_SRC_NOGEN:.c=.h) \ common/ecdh.h \ common/errcode.h \ common/gossip_constants.h \ + common/hash_str.h \ common/hsm_version.h \ common/htlc.h \ common/jsonrpc_errors.h \ diff --git a/common/hash_str.h b/common/hash_str.h new file mode 100644 index 000000000000..111073e93334 --- /dev/null +++ b/common/hash_str.h @@ -0,0 +1,11 @@ +#ifndef LIGHTNING_COMMON_HASH_STR_H +#define LIGHTNING_COMMON_HASH_STR_H +#include "config.h" +#include + +static inline size_t hash_str(const char *str) +{ + return siphash24(siphash_seed(), str, strlen(str)); +} + +#endif /* LIGHTNING_COMMON_HASH_STR_H */ diff --git a/common/iso4217.c b/common/iso4217.c index a164e91c4c04..25da13f4e3d5 100644 --- a/common/iso4217.c +++ b/common/iso4217.c @@ -1,7 +1,11 @@ #include "config.h" #include #include +#include +#include #include +#include +#include /* Wikipedia leads me to: https://www.currency-iso.org/en/home/tables/table-a1.html @@ -202,3 +206,86 @@ const struct iso4217_name_and_divisor *find_iso4217(const utf8 *prefix, } return NULL; } + +static bool msat_or_any(const tal_t *ctx, + const char *buf, + size_t buflen, + u64 **amount) +{ + struct amount_msat msat; + + if (memeqstr(buf, buflen, "any")) { + *amount = NULL; + return true; + } + + if (!parse_amount_msat(&msat, buf, buflen)) + return false; + + *amount = tal_dup(ctx, u64, &msat.millisatoshis); /* Raw: parsing */ + return true; +} + +const char *parse_currency_amount(const tal_t *ctx, + const char *buf, + size_t buflen, + const struct iso4217_name_and_divisor **isocode, + u64 **amount) +{ + const char *dot; + size_t wholelen; + u64 cents; + u64 total; + + if (msat_or_any(ctx, buf, buflen, amount)) { + *isocode = NULL; + return NULL; + } + + /* BOLT #12: + * + * - MUST specify `offer_currency` `iso4217` as an ISO 4217 three-letter code. + * - MUST specify `offer_amount` in the currency unit adjusted by the ISO 4217 + * exponent (e.g. USD cents). + */ + if (buflen < ISO4217_NAMELEN) + return tal_fmt(ctx, "Not a number, and too short for currency"); + + *isocode = find_iso4217(buf + buflen - ISO4217_NAMELEN, ISO4217_NAMELEN); + if (!*isocode) + return tal_fmt(ctx, "Unknown currency suffix %.*s", + ISO4217_NAMELEN, + buf + buflen - ISO4217_NAMELEN); + + buflen -= ISO4217_NAMELEN; + dot = memchr(buf, '.', buflen); + if (!dot) { + wholelen = buflen; + cents = 0; + } else { + const char *afterdot = dot + 1; + size_t partlen = buf + buflen - afterdot; + wholelen = dot - buf; + if (partlen != (*isocode)->minor_unit) + return tal_fmt(ctx, "Currency %s requires %u minor units", + (*isocode)->name, (*isocode)->minor_unit); + if (!str_to_u64(afterdot, partlen, ¢s)) + return tal_fmt(ctx, "Bad minor units number"); + } + + if (!str_to_u64(buf, wholelen, &total)) + return tal_fmt(ctx, "Not a valid number"); + + for (size_t i = 0; i < (*isocode)->minor_unit; i++) { + if (mul_overflows_u64(total, 10)) + return tal_fmt(ctx, "excessively large value"); + total *= 10; + } + + if (add_overflows_u64(total, cents)) + return tal_fmt(ctx, "excessively large value"); + + total += cents; + *amount = tal_dup(ctx, u64, &total); + return NULL; +} diff --git a/common/iso4217.h b/common/iso4217.h index e57c5baae054..a77a6d9fd077 100644 --- a/common/iso4217.h +++ b/common/iso4217.h @@ -18,4 +18,17 @@ struct iso4217_name_and_divisor { const struct iso4217_name_and_divisor *find_iso4217(const utf8 *prefix, size_t len); + +/** + * parse_currency_amount - convert msat amount, any, or currency amount. + * + * Returns error message or NULL. On success: + * if *iso4217 == NULL: currency is BTC. If *amount == NULL, "any". + * if *iso4217 != NULL: *amount is amount in cents in that currency, never NULL. + */ +const char *parse_currency_amount(const tal_t *ctx, + const char *buf, + size_t buflen, + const struct iso4217_name_and_divisor **iso4217, + u64 **amount); #endif /* LIGHTNING_COMMON_ISO4217_H */ diff --git a/common/json_parse_simple.c b/common/json_parse_simple.c index fbb2b12c67b5..7e0e299c9dfa 100644 --- a/common/json_parse_simple.c +++ b/common/json_parse_simple.c @@ -61,35 +61,19 @@ char *json_strdup(const tal_t *ctx, const char *buffer, const jsmntok_t *tok) bool json_to_u64(const char *buffer, const jsmntok_t *tok, u64 *num) { - char *end; - unsigned long long l; - - errno = 0; - l = strtoull(buffer + tok->start, &end, 0); - if (end != buffer + tok->end) - return false; - - BUILD_ASSERT(sizeof(l) >= sizeof(*num)); - *num = l; - - /* Check for overflow */ - if (l == ULLONG_MAX && errno == ERANGE) - return false; - - if (*num != l) - return false; - - return true; + return str_to_u64(buffer + tok->start, tok->end - tok->start, num); } +/* Uncommon, we don't optimize these */ bool json_to_s64(const char *buffer, const jsmntok_t *tok, s64 *num) { + const char *tmpbuf = json_strdup(tmpctx, buffer, tok); char *end; long long l; errno = 0; - l = strtoll(buffer + tok->start, &end, 0); - if (end != buffer + tok->end) + l = strtoll(tmpbuf, &end, 0); + if (tmpbuf[0] == '\0' || *end != '\0') return false; BUILD_ASSERT(sizeof(l) >= sizeof(*num)); @@ -109,11 +93,12 @@ bool json_to_s64(const char *buffer, const jsmntok_t *tok, s64 *num) bool json_to_double(const char *buffer, const jsmntok_t *tok, double *num) { + const char *tmpbuf = json_strdup(tmpctx, buffer, tok); char *end; errno = 0; - *num = strtod(buffer + tok->start, &end); - if (end != buffer + tok->end) + *num = strtod(tmpbuf, &end); + if (tmpbuf[0] == '\0' || *end != '\0') return false; /* Check for overflow/underflow */ @@ -228,17 +213,6 @@ const jsmntok_t *json_get_arr(const jsmntok_t tok[], size_t index) return NULL; } -const char *json_get_id(const tal_t *ctx, - const char *buffer, const jsmntok_t *obj) -{ - const jsmntok_t *idtok = json_get_member(buffer, obj, "id"); - if (!idtok) - return NULL; - return tal_strndup(ctx, - json_tok_full(buffer, idtok), - json_tok_full_len(idtok)); -} - /*----------------------------------------------------------------------------- JSMN Result Validation Starts -----------------------------------------------------------------------------*/ diff --git a/common/json_parse_simple.h b/common/json_parse_simple.h index 56f97e2c14a1..653a36790e04 100644 --- a/common/json_parse_simple.h +++ b/common/json_parse_simple.h @@ -83,10 +83,6 @@ static inline const jsmntok_t *json_get_member(const char *buffer, /* Get index'th array member. */ const jsmntok_t *json_get_arr(const jsmntok_t tok[], size_t index); -/* Helper to get "id" field from object (including any quotes!). */ -const char *json_get_id(const tal_t *ctx, - const char *buffer, const jsmntok_t *obj); - /* Allocate a starter array of tokens for json_parse_input */ jsmntok_t *toks_alloc(const tal_t *ctx); diff --git a/common/jsonrpc_errors.h b/common/jsonrpc_errors.h index 4108701ed757..ac29cb663159 100644 --- a/common/jsonrpc_errors.h +++ b/common/jsonrpc_errors.h @@ -52,6 +52,7 @@ enum jsonrpc_errcode { PAY_USER_ERROR = 217, PAY_INJECTPAYMENTONION_FAILED = 218, PAY_INJECTPAYMENTONION_ALREADY_PAID = 219, + PAY_DESTINATION_INSUFFICIENT_CAPACITY = 220, /* `fundchannel` or `withdraw` errors */ FUND_MAX_EXCEEDED = 300, diff --git a/common/utils.c b/common/utils.c index 860cd446a4d4..1a0799007546 100644 --- a/common/utils.c +++ b/common/utils.c @@ -254,3 +254,22 @@ void *membuf_tal_resize(struct membuf *mb, void *rawelems, size_t newsize) return p; } +bool str_to_u64(const char *buf, size_t buflen, u64 *num) +{ + u64 val = 0; + + if (buflen == 0) + return false; + + for (size_t i = 0; i < buflen; i++) { + u64 digit; + if (buf[i] < '0' || buf[i] > '9') + return false; + digit = buf[i] - '0'; + if (val > (UINT64_MAX - digit) / 10) + return false; + val = val * 10 + digit; + } + *num = val; + return true; +} diff --git a/common/utils.h b/common/utils.h index 7a5c98aa0cf9..560ec9f50022 100644 --- a/common/utils.h +++ b/common/utils.h @@ -119,6 +119,9 @@ static inline void tal_free_if_taken(const tal_t *p) void tal_arr_append_(void *p, const void *append TAKES); void tal_arr_appendn_(void *p, const void *append TAKES, size_t bytes); +/* Parse a decimal u64 from exactly buflen bytes; false on bad chars or overflow */ +bool str_to_u64(const char *buf, size_t buflen, u64 *num); + /* Check for valid UTF-8 */ bool utf8_check(const void *buf, size_t buflen); diff --git a/contrib/msggen/msggen/schema.json b/contrib/msggen/msggen/schema.json index 1d49a41f728b..e65877a23ff9 100644 --- a/contrib/msggen/msggen/schema.json +++ b/contrib/msggen/msggen/schema.json @@ -753,7 +753,8 @@ "disabled_nodes", "created_channels", "channel_updates", - "constraints" + "constraints", + "impressions" ], "properties": { "layer": { @@ -904,6 +905,39 @@ } } }, + "impressions": { + "added": "v26.09", + "type": "array", + "items": { + "type": "object", + "required": [ + "short_channel_id_dir", + "timestamp", + "amount_msat" + ], + "additionalProperties": false, + "properties": { + "short_channel_id_dir": { + "type": "short_channel_id_dir", + "description": [ + "The short channel id and direction." + ] + }, + "timestamp": { + "type": "u64", + "description": [ + "The UNIX timestamp when this constraint was created." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount we successfully sent through this channel (implying its capacity is that much less, and the reverse direction that much more)" + ] + } + } + } + }, "biases": { "type": "array", "items": { @@ -1031,6 +1065,7 @@ "created_channels": [], "channel_updates": [], "constraints": [], + "impressions": [], "biases": [], "node_biases": [] } @@ -1145,14 +1180,16 @@ "succeeded" ], "description": [ - "Whether this payment passed (implying capacity of at least that amount), failed (implying maximum capacity of one msat less), or succeeded (implying capacity has been reduced in this direction)" + "Whether this payment passed (implying capacity of at least that amount), failed (implying maximum capacity of one msat less), or succeeded (implying capacity has been reduced in this direction)", + "If `succeeded`, then an `impression` is created and returned, otherwise a `constraint` is created and returned." ] } } }, "response": { "required": [ - "constraints" + "constraints", + "impressions" ], "additionalProperties": false, "properties": { @@ -1199,6 +1236,46 @@ } } } + }, + "impressions": { + "added": "v26.09", + "type": "array", + "items": { + "type": "object", + "required": [ + "layer", + "short_channel_id_dir", + "timestamp", + "amount_msat" + ], + "additionalProperties": false, + "properties": { + "short_channel_id_dir": { + "type": "short_channel_id_dir", + "description": [ + "The short channel id and direction." + ] + }, + "layer": { + "type": "string", + "description": [ + "The name of the layer to apply this change to." + ] + }, + "timestamp": { + "type": "u64", + "description": [ + "The UNIX timestamp when this constraint was created." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount we successfully sent through this channel (implying its capacity is that much less, and the reverse direction that much more)" + ] + } + } + } } } }, @@ -1278,6 +1355,7 @@ "disabled_nodes", "created_channels", "channel_updates", + "impressions", "constraints" ], "properties": { @@ -1440,6 +1518,39 @@ } } }, + "impressions": { + "added": "v26.09", + "type": "array", + "items": { + "type": "object", + "required": [ + "short_channel_id_dir", + "timestamp", + "amount_msat" + ], + "additionalProperties": false, + "properties": { + "short_channel_id_dir": { + "type": "short_channel_id_dir", + "description": [ + "The short channel id and direction." + ] + }, + "timestamp": { + "type": "u64", + "description": [ + "The UNIX timestamp when this constraint was created." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount we successfully sent through this channel (implying its capacity is that much less, and the reverse direction that much more)" + ] + } + } + } + }, "biases": { "type": "array", "items": { @@ -16911,7 +17022,9 @@ "", "- -1: Catchall nonspecific error.", "- 205: Unable to find a route.", - "- 206: Route too expensive. Either the max_delay or maxfee_msat was exceeded." + "- 206: Route too expensive. Either the max_delay or maxfee_msat was exceeded.", + "- 215: We don't have enough funds in all our channels to pay this.", + "- 220: We can't find sufficient capacity into the destination." ], "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/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py index e9efbdacc447..66161b94a244 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\"\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\"\xda\x02\n\x0fSetconfigConfig\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x13\n\x06source\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x07\x64ynamic\x18\x04 \x01(\x08\x12\x10\n\x03set\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x16\n\tvalue_str\x18\x06 \x01(\tH\x03\x88\x01\x01\x12$\n\nvalue_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x16\n\tvalue_int\x18\x08 \x01(\x12H\x05\x88\x01\x01\x12\x17\n\nvalue_bool\x18\t \x01(\x08H\x06\x88\x01\x01\x12\x0f\n\x07sources\x18\n \x03(\t\x12\x12\n\nvalues_str\x18\x0b \x03(\tB\t\n\x07_sourceB\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\"P\n!AskreneremovechannelupdateRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\"$\n\"AskreneremovechannelupdateResponse\">\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\"G\n\x13\x43urrencyrateRequest\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\x12\x13\n\x06source\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_source\"$\n\x14\x43urrencyrateResponse\x12\x0c\n\x04rate\x18\x01 \x01(\x01\"\x95\x02\n\x11SendamountRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x17\n\npayer_note\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x12\n\x05label\x18\x08 \x01(\tH\x04\x88\x01\x01\x42\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\r\n\x0b_payer_noteB\x08\n\x06_label\"\xa7\x01\n\x12SendamountResponse\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\"\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\x80g\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\x12o\n\x1a\x41skReneRemoveChannelUpdate\x12&.cln.AskreneremovechannelupdateRequest\x1a\'.cln.AskreneremovechannelupdateResponse\"\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?\n\nSendAmount\x12\x16.cln.SendamountRequest\x1a\x17.cln.SendamountResponse\"\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\"\xda\x02\n\x0fSetconfigConfig\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x13\n\x06source\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x07\x64ynamic\x18\x04 \x01(\x08\x12\x10\n\x03set\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x16\n\tvalue_str\x18\x06 \x01(\tH\x03\x88\x01\x01\x12$\n\nvalue_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x16\n\tvalue_int\x18\x08 \x01(\x12H\x05\x88\x01\x01\x12\x17\n\nvalue_bool\x18\t \x01(\x08H\x06\x88\x01\x01\x12\x0f\n\x07sources\x18\n \x03(\t\x12\x12\n\nvalues_str\x18\x0b \x03(\tB\t\n\x07_sourceB\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\"\xe8\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\x12<\n\x0bimpressions\x18\n \x03(\x0b\x32\'.cln.AskrenelistlayersLayersImpressions\"\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\"w\n\"AskrenelistlayersLayersImpressions\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"\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\"\xef\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\x12=\n\x0bimpressions\x18\n \x03(\x0b\x32(.cln.AskrenecreatelayerLayersImpressions\"\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\"x\n#AskrenecreatelayerLayersImpressions\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"\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\"P\n!AskreneremovechannelupdateRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\"$\n\"AskreneremovechannelupdateResponse\">\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\"\x94\x01\n\x1c\x41skreneinformchannelResponse\x12\x39\n\x0b\x63onstraints\x18\x02 \x03(\x0b\x32$.cln.AskreneinformchannelConstraints\x12\x39\n\x0bimpressions\x18\x03 \x03(\x0b\x32$.cln.AskreneinformchannelImpressions\"\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\"\x83\x01\n\x1f\x41skreneinformchannelImpressions\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\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\"\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\"G\n\x13\x43urrencyrateRequest\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\x12\x13\n\x06source\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_source\"$\n\x14\x43urrencyrateResponse\x12\x0c\n\x04rate\x18\x01 \x01(\x01\"\x95\x02\n\x11SendamountRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x17\n\npayer_note\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x12\n\x05label\x18\x08 \x01(\tH\x04\x88\x01\x01\x42\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\r\n\x0b_payer_noteB\x08\n\x06_label\"\xa7\x01\n\x12SendamountResponse\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\"\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\x80g\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\x12o\n\x1a\x41skReneRemoveChannelUpdate\x12&.cln.AskreneremovechannelupdateRequest\x1a\'.cln.AskreneremovechannelupdateResponse\"\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?\n\nSendAmount\x12\x16.cln.SendamountRequest\x1a\x17.cln.SendamountResponse\"\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) @@ -1061,299 +1061,305 @@ _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_start=89728 _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_end=89801 _globals['_ASKRENELISTLAYERSLAYERS']._serialized_start=89804 - _globals['_ASKRENELISTLAYERSLAYERS']._serialized_end=90230 - _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_start=90233 - _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_end=90372 - _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_start=90375 - _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_end=90799 - _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_start=90802 - _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_end=91020 - _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_start=91023 - _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_end=91178 - _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_start=91181 - _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_end=91326 - _globals['_ASKRENECREATELAYERREQUEST']._serialized_start=91328 - _globals['_ASKRENECREATELAYERREQUEST']._serialized_end=91410 - _globals['_ASKRENECREATELAYERRESPONSE']._serialized_start=91412 - _globals['_ASKRENECREATELAYERRESPONSE']._serialized_end=91487 - _globals['_ASKRENECREATELAYERLAYERS']._serialized_start=91490 - _globals['_ASKRENECREATELAYERLAYERS']._serialized_end=91922 - _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_start=91925 - _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_end=92065 - _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_start=92068 - _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_end=92405 - _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_start=92408 - _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_end=92604 - _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_start=92607 - _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_end=92763 - _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_start=92766 - _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_end=92912 - _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_start=92914 - _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_end=92956 - _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_start=92958 - _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_end=92986 - _globals['_ASKRENEREMOVECHANNELUPDATEREQUEST']._serialized_start=92988 - _globals['_ASKRENEREMOVECHANNELUPDATEREQUEST']._serialized_end=93068 - _globals['_ASKRENEREMOVECHANNELUPDATERESPONSE']._serialized_start=93070 - _globals['_ASKRENEREMOVECHANNELUPDATERESPONSE']._serialized_end=93106 - _globals['_ASKRENERESERVEREQUEST']._serialized_start=93108 - _globals['_ASKRENERESERVEREQUEST']._serialized_end=93170 - _globals['_ASKRENERESERVERESPONSE']._serialized_start=93172 - _globals['_ASKRENERESERVERESPONSE']._serialized_end=93196 - _globals['_ASKRENERESERVEPATH']._serialized_start=93198 - _globals['_ASKRENERESERVEPATH']._serialized_end=93312 - _globals['_ASKRENEAGEREQUEST']._serialized_start=93314 - _globals['_ASKRENEAGEREQUEST']._serialized_end=93364 - _globals['_ASKRENEAGERESPONSE']._serialized_start=93366 - _globals['_ASKRENEAGERESPONSE']._serialized_end=93422 - _globals['_GETROUTESREQUEST']._serialized_start=93425 - _globals['_GETROUTESREQUEST']._serialized_end=93656 - _globals['_GETROUTESRESPONSE']._serialized_start=93658 - _globals['_GETROUTESRESPONSE']._serialized_end=93740 - _globals['_GETROUTESROUTES']._serialized_start=93743 - _globals['_GETROUTESROUTES']._serialized_end=93879 - _globals['_GETROUTESROUTESPATH']._serialized_start=93882 - _globals['_GETROUTESROUTESPATH']._serialized_end=94338 - _globals['_ASKRENEDISABLENODEREQUEST']._serialized_start=94340 - _globals['_ASKRENEDISABLENODEREQUEST']._serialized_end=94396 - _globals['_ASKRENEDISABLENODERESPONSE']._serialized_start=94398 - _globals['_ASKRENEDISABLENODERESPONSE']._serialized_end=94426 - _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_start=94429 - _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_end=94695 - _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_start=94616 - _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_end=94695 - _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_start=94697 - _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_end=94786 - _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_start=94789 - _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_end=95000 - _globals['_ASKRENECREATECHANNELREQUEST']._serialized_start=95003 - _globals['_ASKRENECREATECHANNELREQUEST']._serialized_end=95146 - _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_start=95148 - _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_end=95178 - _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_start=95181 - _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_end=95610 - _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_start=95612 - _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_end=95642 - _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_start=95645 - _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_end=95809 - _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_start=95811 - _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_end=95886 - _globals['_ASKRENEBIASCHANNELBIASES']._serialized_start=95889 - _globals['_ASKRENEBIASCHANNELBIASES']._serialized_end=96054 - _globals['_ASKRENEBIASNODEREQUEST']._serialized_start=96057 - _globals['_ASKRENEBIASNODEREQUEST']._serialized_end=96221 - _globals['_ASKRENEBIASNODERESPONSE']._serialized_start=96223 - _globals['_ASKRENEBIASNODERESPONSE']._serialized_end=96301 - _globals['_ASKRENEBIASNODENODEBIASES']._serialized_start=96304 - _globals['_ASKRENEBIASNODENODEBIASES']._serialized_end=96456 - _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_start=96458 - _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_end=96490 - _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_start=96492 - _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_end=96589 - _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_start=96592 - _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_end=96737 - _globals['_INJECTPAYMENTONIONREQUEST']._serialized_start=96740 - _globals['_INJECTPAYMENTONIONREQUEST']._serialized_end=97113 - _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_start=97115 - _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_end=97234 - _globals['_INJECTONIONMESSAGEREQUEST']._serialized_start=97236 - _globals['_INJECTONIONMESSAGEREQUEST']._serialized_end=97298 - _globals['_INJECTONIONMESSAGERESPONSE']._serialized_start=97300 - _globals['_INJECTONIONMESSAGERESPONSE']._serialized_end=97328 - _globals['_XPAYREQUEST']._serialized_start=97331 - _globals['_XPAYREQUEST']._serialized_end=97774 - _globals['_XPAYRESPONSE']._serialized_start=97777 - _globals['_XPAYRESPONSE']._serialized_end=97938 - _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_start=97940 - _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_end=98001 - _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_start=98003 - _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_end=98099 - _globals['_LISTCHANNELMOVESREQUEST']._serialized_start=98102 - _globals['_LISTCHANNELMOVESREQUEST']._serialized_end=98307 - _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_start=98241 - _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_end=98277 - _globals['_LISTCHANNELMOVESRESPONSE']._serialized_start=98309 - _globals['_LISTCHANNELMOVESRESPONSE']._serialized_end=98392 - _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_start=98395 - _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_end=98948 - _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_start=98756 - _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_end=98906 - _globals['_LISTCHAINMOVESREQUEST']._serialized_start=98951 - _globals['_LISTCHAINMOVESREQUEST']._serialized_end=99148 - _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_start=99084 - _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_end=99118 - _globals['_LISTCHAINMOVESRESPONSE']._serialized_start=99150 - _globals['_LISTCHAINMOVESRESPONSE']._serialized_end=99225 - _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_start=99228 - _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_end=100080 - _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_start=99715 - _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_end=99992 - _globals['_LISTNETWORKEVENTSREQUEST']._serialized_start=100083 - _globals['_LISTNETWORKEVENTSREQUEST']._serialized_end=100316 - _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_start=100242 - _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_end=100279 - _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_start=100318 - _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_end=100405 - _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_start=100408 - _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_end=100650 - _globals['_DELNETWORKEVENTREQUEST']._serialized_start=100652 - _globals['_DELNETWORKEVENTREQUEST']._serialized_end=100699 - _globals['_DELNETWORKEVENTRESPONSE']._serialized_start=100701 - _globals['_DELNETWORKEVENTRESPONSE']._serialized_end=100726 - _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_start=100729 - _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_end=100975 - _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_start=100977 - _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_end=101006 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_start=101009 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_end=101227 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_start=101160 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_end=101205 - _globals['_LISTCURRENCYRATESREQUEST']._serialized_start=101229 - _globals['_LISTCURRENCYRATESREQUEST']._serialized_end=101273 - _globals['_LISTCURRENCYRATESRESPONSE']._serialized_start=101275 - _globals['_LISTCURRENCYRATESRESPONSE']._serialized_end=101362 - _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_start=101364 - _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_end=101428 - _globals['_CURRENCYCONVERTREQUEST']._serialized_start=101430 - _globals['_CURRENCYCONVERTREQUEST']._serialized_end=101488 - _globals['_CURRENCYCONVERTRESPONSE']._serialized_start=101490 - _globals['_CURRENCYCONVERTRESPONSE']._serialized_end=101542 - _globals['_CURRENCYRATEREQUEST']._serialized_start=101544 - _globals['_CURRENCYRATEREQUEST']._serialized_end=101615 - _globals['_CURRENCYRATERESPONSE']._serialized_start=101617 - _globals['_CURRENCYRATERESPONSE']._serialized_end=101653 - _globals['_SENDAMOUNTREQUEST']._serialized_start=101656 - _globals['_SENDAMOUNTREQUEST']._serialized_end=101933 - _globals['_SENDAMOUNTRESPONSE']._serialized_start=101936 - _globals['_SENDAMOUNTRESPONSE']._serialized_end=102103 - _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_start=102105 - _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_end=102135 - _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_start=102138 - _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_end=102272 - _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_start=102274 - _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_end=102373 - _globals['_STREAMBLOCKADDEDREQUEST']._serialized_start=102375 - _globals['_STREAMBLOCKADDEDREQUEST']._serialized_end=102400 - _globals['_BLOCKADDEDNOTIFICATION']._serialized_start=102402 - _globals['_BLOCKADDEDNOTIFICATION']._serialized_end=102456 - _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_start=102458 - _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_end=102490 - _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_start=102492 - _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_end=102543 - _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_start=102545 - _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_end=102573 - _globals['_CHANNELOPENEDNOTIFICATION']._serialized_start=102575 - _globals['_CHANNELOPENEDNOTIFICATION']._serialized_end=102694 - _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_start=102696 - _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_end=102730 - _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_start=102733 - _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_end=103182 - _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_start=103036 - _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_end=103135 - _globals['_STREAMCONNECTREQUEST']._serialized_start=103184 - _globals['_STREAMCONNECTREQUEST']._serialized_end=103206 - _globals['_PEERCONNECTNOTIFICATION']._serialized_start=103209 - _globals['_PEERCONNECTNOTIFICATION']._serialized_end=103399 - _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_start=103360 - _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_end=103399 - _globals['_PEERCONNECTADDRESS']._serialized_start=103402 - _globals['_PEERCONNECTADDRESS']._serialized_end=103684 - _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_start=103553 - _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_end=103652 - _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_start=103686 - _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_end=103713 - _globals['_COINMOVEMENTNOTIFICATION']._serialized_start=103716 - _globals['_COINMOVEMENTNOTIFICATION']._serialized_end=105155 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_start=104493 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_end=104543 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_start=104546 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_end=104921 - _globals['_STREAMCUSTOMMSGREQUEST']._serialized_start=105157 - _globals['_STREAMCUSTOMMSGREQUEST']._serialized_end=105181 - _globals['_CUSTOMMSGNOTIFICATION']._serialized_start=105183 - _globals['_CUSTOMMSGNOTIFICATION']._serialized_end=105240 - _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_start=105242 - _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_end=105274 - _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_start=105276 - _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_end=105330 - _globals['_STREAMDISCONNECTREQUEST']._serialized_start=105332 - _globals['_STREAMDISCONNECTREQUEST']._serialized_end=105357 - _globals['_DISCONNECTNOTIFICATION']._serialized_start=105359 - _globals['_DISCONNECTNOTIFICATION']._serialized_end=105395 - _globals['_STREAMFORWARDEVENTREQUEST']._serialized_start=105397 - _globals['_STREAMFORWARDEVENTREQUEST']._serialized_end=105424 - _globals['_FORWARDEVENTNOTIFICATION']._serialized_start=105427 - _globals['_FORWARDEVENTNOTIFICATION']._serialized_end=106075 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_start=105859 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_end=105935 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_start=105937 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_end=105977 - _globals['_STREAMINVOICECREATIONREQUEST']._serialized_start=106077 - _globals['_STREAMINVOICECREATIONREQUEST']._serialized_end=106107 - _globals['_INVOICECREATIONNOTIFICATION']._serialized_start=106109 - _globals['_INVOICECREATIONNOTIFICATION']._serialized_end=106212 - _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_start=106214 - _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_end=106243 - _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_start=106246 - _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_end=106385 - _globals['_STREAMLOGREQUEST']._serialized_start=106387 - _globals['_STREAMLOGREQUEST']._serialized_end=106405 - _globals['_LOGNOTIFICATION']._serialized_start=106408 - _globals['_LOGNOTIFICATION']._serialized_end=106610 - _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_start=106535 - _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_end=106610 - _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_start=106612 - _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_end=106650 - _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_start=106653 - _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_end=106892 - _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_start=106894 - _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_end=106928 - _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_start=106930 - _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_end=107004 - _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_start=107006 - _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_end=107034 - _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_start=107036 - _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_end=107122 - _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_start=107124 - _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_end=107152 - _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_start=107154 - _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_end=107240 - _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_start=107242 - _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_end=107271 - _globals['_SENDPAYFAILURENOTIFICATION']._serialized_start=107273 - _globals['_SENDPAYFAILURENOTIFICATION']._serialized_end=107371 - _globals['_SENDPAYFAILUREDATA']._serialized_start=107374 - _globals['_SENDPAYFAILUREDATA']._serialized_end=108591 - _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_start=108129 - _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_end=108194 - _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_start=108593 - _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_end=108622 - _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_start=108625 - _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_end=109341 - _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_start=109143 - _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_end=109179 - _globals['_STREAMSHUTDOWNREQUEST']._serialized_start=109343 - _globals['_STREAMSHUTDOWNREQUEST']._serialized_end=109366 - _globals['_SHUTDOWNNOTIFICATION']._serialized_start=109368 - _globals['_SHUTDOWNNOTIFICATION']._serialized_end=109390 - _globals['_STREAMWARNINGREQUEST']._serialized_start=109392 - _globals['_STREAMWARNINGREQUEST']._serialized_end=109414 - _globals['_WARNINGNOTIFICATION']._serialized_start=109417 - _globals['_WARNINGNOTIFICATION']._serialized_end=109591 - _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_start=109556 - _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_end=109591 - _globals['_STREAMPAYPARTENDREQUEST']._serialized_start=109593 - _globals['_STREAMPAYPARTENDREQUEST']._serialized_end=109618 - _globals['_PAYPARTENDNOTIFICATION']._serialized_start=109621 - _globals['_PAYPARTENDNOTIFICATION']._serialized_end=110118 - _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_start=109958 - _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_end=110002 - _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_start=110120 - _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_end=110147 - _globals['_PAYPARTSTARTNOTIFICATION']._serialized_start=110150 - _globals['_PAYPARTSTARTNOTIFICATION']._serialized_end=110344 - _globals['_PAYPARTSTARTHOPS']._serialized_start=110347 - _globals['_PAYPARTSTARTHOPS']._serialized_end=110506 - _globals['_NODE']._serialized_start=110509 - _globals['_NODE']._serialized_end=123693 + _globals['_ASKRENELISTLAYERSLAYERS']._serialized_end=90292 + _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_start=90295 + _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_end=90434 + _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_start=90437 + _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_end=90861 + _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_start=90864 + _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_end=91082 + _globals['_ASKRENELISTLAYERSLAYERSIMPRESSIONS']._serialized_start=91084 + _globals['_ASKRENELISTLAYERSLAYERSIMPRESSIONS']._serialized_end=91203 + _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_start=91206 + _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_end=91361 + _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_start=91364 + _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_end=91509 + _globals['_ASKRENECREATELAYERREQUEST']._serialized_start=91511 + _globals['_ASKRENECREATELAYERREQUEST']._serialized_end=91593 + _globals['_ASKRENECREATELAYERRESPONSE']._serialized_start=91595 + _globals['_ASKRENECREATELAYERRESPONSE']._serialized_end=91670 + _globals['_ASKRENECREATELAYERLAYERS']._serialized_start=91673 + _globals['_ASKRENECREATELAYERLAYERS']._serialized_end=92168 + _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_start=92171 + _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_end=92311 + _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_start=92314 + _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_end=92651 + _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_start=92654 + _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_end=92850 + _globals['_ASKRENECREATELAYERLAYERSIMPRESSIONS']._serialized_start=92852 + _globals['_ASKRENECREATELAYERLAYERSIMPRESSIONS']._serialized_end=92972 + _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_start=92975 + _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_end=93131 + _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_start=93134 + _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_end=93280 + _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_start=93282 + _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_end=93324 + _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_start=93326 + _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_end=93354 + _globals['_ASKRENEREMOVECHANNELUPDATEREQUEST']._serialized_start=93356 + _globals['_ASKRENEREMOVECHANNELUPDATEREQUEST']._serialized_end=93436 + _globals['_ASKRENEREMOVECHANNELUPDATERESPONSE']._serialized_start=93438 + _globals['_ASKRENEREMOVECHANNELUPDATERESPONSE']._serialized_end=93474 + _globals['_ASKRENERESERVEREQUEST']._serialized_start=93476 + _globals['_ASKRENERESERVEREQUEST']._serialized_end=93538 + _globals['_ASKRENERESERVERESPONSE']._serialized_start=93540 + _globals['_ASKRENERESERVERESPONSE']._serialized_end=93564 + _globals['_ASKRENERESERVEPATH']._serialized_start=93566 + _globals['_ASKRENERESERVEPATH']._serialized_end=93680 + _globals['_ASKRENEAGEREQUEST']._serialized_start=93682 + _globals['_ASKRENEAGEREQUEST']._serialized_end=93732 + _globals['_ASKRENEAGERESPONSE']._serialized_start=93734 + _globals['_ASKRENEAGERESPONSE']._serialized_end=93790 + _globals['_GETROUTESREQUEST']._serialized_start=93793 + _globals['_GETROUTESREQUEST']._serialized_end=94024 + _globals['_GETROUTESRESPONSE']._serialized_start=94026 + _globals['_GETROUTESRESPONSE']._serialized_end=94108 + _globals['_GETROUTESROUTES']._serialized_start=94111 + _globals['_GETROUTESROUTES']._serialized_end=94247 + _globals['_GETROUTESROUTESPATH']._serialized_start=94250 + _globals['_GETROUTESROUTESPATH']._serialized_end=94706 + _globals['_ASKRENEDISABLENODEREQUEST']._serialized_start=94708 + _globals['_ASKRENEDISABLENODEREQUEST']._serialized_end=94764 + _globals['_ASKRENEDISABLENODERESPONSE']._serialized_start=94766 + _globals['_ASKRENEDISABLENODERESPONSE']._serialized_end=94794 + _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_start=94797 + _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_end=95063 + _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_start=94984 + _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_end=95063 + _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_start=95066 + _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_end=95214 + _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_start=95217 + _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_end=95428 + _globals['_ASKRENEINFORMCHANNELIMPRESSIONS']._serialized_start=95431 + _globals['_ASKRENEINFORMCHANNELIMPRESSIONS']._serialized_end=95562 + _globals['_ASKRENECREATECHANNELREQUEST']._serialized_start=95565 + _globals['_ASKRENECREATECHANNELREQUEST']._serialized_end=95708 + _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_start=95710 + _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_end=95740 + _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_start=95743 + _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_end=96172 + _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_start=96174 + _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_end=96204 + _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_start=96207 + _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_end=96371 + _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_start=96373 + _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_end=96448 + _globals['_ASKRENEBIASCHANNELBIASES']._serialized_start=96451 + _globals['_ASKRENEBIASCHANNELBIASES']._serialized_end=96616 + _globals['_ASKRENEBIASNODEREQUEST']._serialized_start=96619 + _globals['_ASKRENEBIASNODEREQUEST']._serialized_end=96783 + _globals['_ASKRENEBIASNODERESPONSE']._serialized_start=96785 + _globals['_ASKRENEBIASNODERESPONSE']._serialized_end=96863 + _globals['_ASKRENEBIASNODENODEBIASES']._serialized_start=96866 + _globals['_ASKRENEBIASNODENODEBIASES']._serialized_end=97018 + _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_start=97020 + _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_end=97052 + _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_start=97054 + _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_end=97151 + _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_start=97154 + _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_end=97299 + _globals['_INJECTPAYMENTONIONREQUEST']._serialized_start=97302 + _globals['_INJECTPAYMENTONIONREQUEST']._serialized_end=97675 + _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_start=97677 + _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_end=97796 + _globals['_INJECTONIONMESSAGEREQUEST']._serialized_start=97798 + _globals['_INJECTONIONMESSAGEREQUEST']._serialized_end=97860 + _globals['_INJECTONIONMESSAGERESPONSE']._serialized_start=97862 + _globals['_INJECTONIONMESSAGERESPONSE']._serialized_end=97890 + _globals['_XPAYREQUEST']._serialized_start=97893 + _globals['_XPAYREQUEST']._serialized_end=98336 + _globals['_XPAYRESPONSE']._serialized_start=98339 + _globals['_XPAYRESPONSE']._serialized_end=98500 + _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_start=98502 + _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_end=98563 + _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_start=98565 + _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_end=98661 + _globals['_LISTCHANNELMOVESREQUEST']._serialized_start=98664 + _globals['_LISTCHANNELMOVESREQUEST']._serialized_end=98869 + _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_start=98803 + _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_end=98839 + _globals['_LISTCHANNELMOVESRESPONSE']._serialized_start=98871 + _globals['_LISTCHANNELMOVESRESPONSE']._serialized_end=98954 + _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_start=98957 + _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_end=99510 + _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_start=99318 + _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_end=99468 + _globals['_LISTCHAINMOVESREQUEST']._serialized_start=99513 + _globals['_LISTCHAINMOVESREQUEST']._serialized_end=99710 + _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_start=99646 + _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_end=99680 + _globals['_LISTCHAINMOVESRESPONSE']._serialized_start=99712 + _globals['_LISTCHAINMOVESRESPONSE']._serialized_end=99787 + _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_start=99790 + _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_end=100642 + _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_start=100277 + _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_end=100554 + _globals['_LISTNETWORKEVENTSREQUEST']._serialized_start=100645 + _globals['_LISTNETWORKEVENTSREQUEST']._serialized_end=100878 + _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_start=100804 + _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_end=100841 + _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_start=100880 + _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_end=100967 + _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_start=100970 + _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_end=101212 + _globals['_DELNETWORKEVENTREQUEST']._serialized_start=101214 + _globals['_DELNETWORKEVENTREQUEST']._serialized_end=101261 + _globals['_DELNETWORKEVENTRESPONSE']._serialized_start=101263 + _globals['_DELNETWORKEVENTRESPONSE']._serialized_end=101288 + _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_start=101291 + _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_end=101537 + _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_start=101539 + _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_end=101568 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_start=101571 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_end=101789 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_start=101722 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_end=101767 + _globals['_LISTCURRENCYRATESREQUEST']._serialized_start=101791 + _globals['_LISTCURRENCYRATESREQUEST']._serialized_end=101835 + _globals['_LISTCURRENCYRATESRESPONSE']._serialized_start=101837 + _globals['_LISTCURRENCYRATESRESPONSE']._serialized_end=101924 + _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_start=101926 + _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_end=101990 + _globals['_CURRENCYCONVERTREQUEST']._serialized_start=101992 + _globals['_CURRENCYCONVERTREQUEST']._serialized_end=102050 + _globals['_CURRENCYCONVERTRESPONSE']._serialized_start=102052 + _globals['_CURRENCYCONVERTRESPONSE']._serialized_end=102104 + _globals['_CURRENCYRATEREQUEST']._serialized_start=102106 + _globals['_CURRENCYRATEREQUEST']._serialized_end=102177 + _globals['_CURRENCYRATERESPONSE']._serialized_start=102179 + _globals['_CURRENCYRATERESPONSE']._serialized_end=102215 + _globals['_SENDAMOUNTREQUEST']._serialized_start=102218 + _globals['_SENDAMOUNTREQUEST']._serialized_end=102495 + _globals['_SENDAMOUNTRESPONSE']._serialized_start=102498 + _globals['_SENDAMOUNTRESPONSE']._serialized_end=102665 + _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_start=102667 + _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_end=102697 + _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_start=102700 + _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_end=102834 + _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_start=102836 + _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_end=102935 + _globals['_STREAMBLOCKADDEDREQUEST']._serialized_start=102937 + _globals['_STREAMBLOCKADDEDREQUEST']._serialized_end=102962 + _globals['_BLOCKADDEDNOTIFICATION']._serialized_start=102964 + _globals['_BLOCKADDEDNOTIFICATION']._serialized_end=103018 + _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_start=103020 + _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_end=103052 + _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_start=103054 + _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_end=103105 + _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_start=103107 + _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_end=103135 + _globals['_CHANNELOPENEDNOTIFICATION']._serialized_start=103137 + _globals['_CHANNELOPENEDNOTIFICATION']._serialized_end=103256 + _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_start=103258 + _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_end=103292 + _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_start=103295 + _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_end=103744 + _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_start=103598 + _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_end=103697 + _globals['_STREAMCONNECTREQUEST']._serialized_start=103746 + _globals['_STREAMCONNECTREQUEST']._serialized_end=103768 + _globals['_PEERCONNECTNOTIFICATION']._serialized_start=103771 + _globals['_PEERCONNECTNOTIFICATION']._serialized_end=103961 + _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_start=103922 + _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_end=103961 + _globals['_PEERCONNECTADDRESS']._serialized_start=103964 + _globals['_PEERCONNECTADDRESS']._serialized_end=104246 + _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_start=104115 + _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_end=104214 + _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_start=104248 + _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_end=104275 + _globals['_COINMOVEMENTNOTIFICATION']._serialized_start=104278 + _globals['_COINMOVEMENTNOTIFICATION']._serialized_end=105717 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_start=105055 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_end=105105 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_start=105108 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_end=105483 + _globals['_STREAMCUSTOMMSGREQUEST']._serialized_start=105719 + _globals['_STREAMCUSTOMMSGREQUEST']._serialized_end=105743 + _globals['_CUSTOMMSGNOTIFICATION']._serialized_start=105745 + _globals['_CUSTOMMSGNOTIFICATION']._serialized_end=105802 + _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_start=105804 + _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_end=105836 + _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_start=105838 + _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_end=105892 + _globals['_STREAMDISCONNECTREQUEST']._serialized_start=105894 + _globals['_STREAMDISCONNECTREQUEST']._serialized_end=105919 + _globals['_DISCONNECTNOTIFICATION']._serialized_start=105921 + _globals['_DISCONNECTNOTIFICATION']._serialized_end=105957 + _globals['_STREAMFORWARDEVENTREQUEST']._serialized_start=105959 + _globals['_STREAMFORWARDEVENTREQUEST']._serialized_end=105986 + _globals['_FORWARDEVENTNOTIFICATION']._serialized_start=105989 + _globals['_FORWARDEVENTNOTIFICATION']._serialized_end=106637 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_start=106421 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_end=106497 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_start=106499 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_end=106539 + _globals['_STREAMINVOICECREATIONREQUEST']._serialized_start=106639 + _globals['_STREAMINVOICECREATIONREQUEST']._serialized_end=106669 + _globals['_INVOICECREATIONNOTIFICATION']._serialized_start=106671 + _globals['_INVOICECREATIONNOTIFICATION']._serialized_end=106774 + _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_start=106776 + _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_end=106805 + _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_start=106808 + _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_end=106947 + _globals['_STREAMLOGREQUEST']._serialized_start=106949 + _globals['_STREAMLOGREQUEST']._serialized_end=106967 + _globals['_LOGNOTIFICATION']._serialized_start=106970 + _globals['_LOGNOTIFICATION']._serialized_end=107172 + _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_start=107097 + _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_end=107172 + _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_start=107174 + _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_end=107212 + _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_start=107215 + _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_end=107454 + _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_start=107456 + _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_end=107490 + _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_start=107492 + _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_end=107566 + _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_start=107568 + _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_end=107596 + _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_start=107598 + _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_end=107684 + _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_start=107686 + _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_end=107714 + _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_start=107716 + _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_end=107802 + _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_start=107804 + _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_end=107833 + _globals['_SENDPAYFAILURENOTIFICATION']._serialized_start=107835 + _globals['_SENDPAYFAILURENOTIFICATION']._serialized_end=107933 + _globals['_SENDPAYFAILUREDATA']._serialized_start=107936 + _globals['_SENDPAYFAILUREDATA']._serialized_end=109153 + _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_start=108691 + _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_end=108756 + _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_start=109155 + _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_end=109184 + _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_start=109187 + _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_end=109903 + _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_start=109705 + _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_end=109741 + _globals['_STREAMSHUTDOWNREQUEST']._serialized_start=109905 + _globals['_STREAMSHUTDOWNREQUEST']._serialized_end=109928 + _globals['_SHUTDOWNNOTIFICATION']._serialized_start=109930 + _globals['_SHUTDOWNNOTIFICATION']._serialized_end=109952 + _globals['_STREAMWARNINGREQUEST']._serialized_start=109954 + _globals['_STREAMWARNINGREQUEST']._serialized_end=109976 + _globals['_WARNINGNOTIFICATION']._serialized_start=109979 + _globals['_WARNINGNOTIFICATION']._serialized_end=110153 + _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_start=110118 + _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_end=110153 + _globals['_STREAMPAYPARTENDREQUEST']._serialized_start=110155 + _globals['_STREAMPAYPARTENDREQUEST']._serialized_end=110180 + _globals['_PAYPARTENDNOTIFICATION']._serialized_start=110183 + _globals['_PAYPARTENDNOTIFICATION']._serialized_end=110680 + _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_start=110520 + _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_end=110564 + _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_start=110682 + _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_end=110709 + _globals['_PAYPARTSTARTNOTIFICATION']._serialized_start=110712 + _globals['_PAYPARTSTARTNOTIFICATION']._serialized_end=110906 + _globals['_PAYPARTSTARTHOPS']._serialized_start=110909 + _globals['_PAYPARTSTARTHOPS']._serialized_end=111068 + _globals['_NODE']._serialized_start=111071 + _globals['_NODE']._serialized_end=124255 # @@protoc_insertion_point(module_scope) diff --git a/contrib/pyln-testing/pyln/testing/grpc2py.py b/contrib/pyln-testing/pyln/testing/grpc2py.py index 6e9bb23d4d69..e48f25466949 100644 --- a/contrib/pyln-testing/pyln/testing/grpc2py.py +++ b/contrib/pyln-testing/pyln/testing/grpc2py.py @@ -3090,6 +3090,14 @@ def askrene_listlayers_layers_created_channels2py(m): }) +def askrene_listlayers_layers_impressions2py(m): + return remove_default({ + "amount_msat": amount2msat(m.amount_msat), # PrimitiveField in generate_composite + "short_channel_id_dir": m.short_channel_id_dir, # PrimitiveField in generate_composite + "timestamp": m.timestamp, # PrimitiveField in generate_composite + }) + + def askrene_listlayers_layers_node_biases2py(m): return remove_default({ "description": m.description, # PrimitiveField in generate_composite @@ -3108,6 +3116,7 @@ def askrene_listlayers_layers2py(m): "created_channels": [askrene_listlayers_layers_created_channels2py(i) for i in m.created_channels], # ArrayField[composite] in generate_composite "disabled_channels": [m.disabled_channels for i in m.disabled_channels], # ArrayField[primitive] in generate_composite "disabled_nodes": [hexlify(m.disabled_nodes) for i in hexlify(m.disabled_nodes)], # ArrayField[primitive] in generate_composite + "impressions": [askrene_listlayers_layers_impressions2py(i) for i in m.impressions], # ArrayField[composite] in generate_composite "node_biases": [askrene_listlayers_layers_node_biases2py(i) for i in m.node_biases], # ArrayField[composite] in generate_composite "layer": m.layer, # PrimitiveField in generate_composite "persistent": m.persistent, # PrimitiveField in generate_composite @@ -3157,6 +3166,14 @@ def askrene_create_layer_layers_created_channels2py(m): }) +def askrene_create_layer_layers_impressions2py(m): + return remove_default({ + "amount_msat": amount2msat(m.amount_msat), # PrimitiveField in generate_composite + "short_channel_id_dir": m.short_channel_id_dir, # PrimitiveField in generate_composite + "timestamp": m.timestamp, # PrimitiveField in generate_composite + }) + + def askrene_create_layer_layers_node_biases2py(m): return remove_default({ "description": m.description, # PrimitiveField in generate_composite @@ -3175,6 +3192,7 @@ def askrene_create_layer_layers2py(m): "created_channels": [askrene_create_layer_layers_created_channels2py(i) for i in m.created_channels], # ArrayField[composite] in generate_composite "disabled_channels": [m.disabled_channels for i in m.disabled_channels], # ArrayField[primitive] in generate_composite "disabled_nodes": [hexlify(m.disabled_nodes) for i in hexlify(m.disabled_nodes)], # ArrayField[primitive] in generate_composite + "impressions": [askrene_create_layer_layers_impressions2py(i) for i in m.impressions], # ArrayField[composite] in generate_composite "node_biases": [askrene_create_layer_layers_node_biases2py(i) for i in m.node_biases], # ArrayField[composite] in generate_composite "layer": m.layer, # PrimitiveField in generate_composite "persistent": m.persistent, # PrimitiveField in generate_composite @@ -3255,9 +3273,19 @@ def askrene_inform_channel_constraints2py(m): }) +def askrene_inform_channel_impressions2py(m): + return remove_default({ + "amount_msat": amount2msat(m.amount_msat), # PrimitiveField in generate_composite + "layer": m.layer, # PrimitiveField in generate_composite + "short_channel_id_dir": m.short_channel_id_dir, # PrimitiveField in generate_composite + "timestamp": m.timestamp, # PrimitiveField in generate_composite + }) + + def askrene_inform_channel2py(m): return remove_default({ "constraints": [askrene_inform_channel_constraints2py(i) for i in m.constraints], # ArrayField[composite] in generate_composite + "impressions": [askrene_inform_channel_impressions2py(i) for i in m.impressions], # ArrayField[composite] in generate_composite }) diff --git a/contrib/pyln-testing/pyln/testing/inline-plugin.py b/contrib/pyln-testing/pyln/testing/inline-plugin.py new file mode 100755 index 000000000000..5f595b6dc9fb --- /dev/null +++ b/contrib/pyln-testing/pyln/testing/inline-plugin.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +"""Generic inline plugin shim: bridges lightningd stdio <-> inline-plugin.sock in cwd. +Used by inline_plugin() in pyln/testing/utils.py.""" +import os +import socket +import sys +import threading + + +def _stdin_to_sock(conn): + while chunk := sys.stdin.buffer.read1(4096): + conn.sendall(chunk) + # Stdin closed means lightningd is done with us: exit immediately so the + # OS closes the socket and the serve thread can accept the next connection. + os._exit(0) + + +conn = socket.socket(socket.AF_UNIX) +conn.connect('inline-plugin.sock') + +threading.Thread(target=_stdin_to_sock, args=(conn,), daemon=True).start() + +while chunk := conn.recv(4096): + sys.stdout.buffer.write(chunk) + sys.stdout.buffer.flush() diff --git a/contrib/pyln-testing/pyln/testing/utils.py b/contrib/pyln-testing/pyln/testing/utils.py index 1065838c5867..e484b11f9162 100644 --- a/contrib/pyln-testing/pyln/testing/utils.py +++ b/contrib/pyln-testing/pyln/testing/utils.py @@ -11,6 +11,7 @@ from pyln.client import LightningRpc from pyln.client import Millisatoshi from pyln.client import NodeVersion +from pyln.client import Plugin import ephemeral_port_reserve # type: ignore import json @@ -22,6 +23,7 @@ import random import re import shutil +import socket import sqlite3 import string import struct @@ -29,6 +31,7 @@ import sys import threading import time +import types import warnings BITCOIND_CONFIG = { @@ -78,6 +81,8 @@ def env(name, default=None): VALGRIND = env("VALGRIND") == "1" TEST_NETWORK = env("TEST_NETWORK", 'regtest') TEST_DEBUG = env("TEST_DEBUG", "0") == "1" + +INLINE_PLUGIN_PATH = os.path.join(os.path.dirname(__file__), 'inline-plugin.py') SLOW_MACHINE = env("SLOW_MACHINE", "0") == "1" DEPRECATED_APIS = env("DEPRECATED_APIS", "0") == "1" TIMEOUT = int(env("TIMEOUT", 180 if SLOW_MACHINE else 60)) @@ -1786,7 +1791,8 @@ def get_nodes(self, num_nodes, opts=None): def get_node(self, node_id=None, options=None, dbfile=None, bkpr_dbfile=None, feerates=(15000, 11000, 7500, 3750), start=True, wait_for_bitcoind_sync=True, may_fail=False, - expect_fail=False, cleandir=True, gossip_store_file=None, unused_grpc_port=True, **kwargs): + expect_fail=False, cleandir=True, gossip_store_file=None, unused_grpc_port=True, + inline_plugin=None, **kwargs): node_id = self.get_node_id() if not node_id else node_id port = reserve_unused_port() grpc_port = self.get_unused_port() if unused_grpc_port else None @@ -1830,6 +1836,11 @@ def get_node(self, node_id=None, options=None, dbfile=None, shutil.copy(gossip_store_file, os.path.join(node.daemon.lightning_dir, TEST_NETWORK, 'gossip_store')) + if inline_plugin is not None: + if 'plugin' not in node.daemon.opts: + node.daemon.opts['plugin'] = INLINE_PLUGIN_PATH + _inline_plugin(node, inline_plugin) + if start: try: node.start(wait_for_bitcoind_sync) @@ -1944,3 +1955,65 @@ def killall(self, expected_successes): drop_unused_port(p) return not unexpected_fail, err_msgs + + +def _inline_plugin(node, setup_fn): + """Set up an inline plugin serve thread for a not-yet-started node. + + Normally called via get_node(inline_plugin=setup_fn). The plugin's cwd + (set by lightningd) is node.daemon.lightning_dir/TEST_NETWORK/, which is + where the shim looks for inline-plugin.sock. + + Example:: + + def setup(plugin): + @plugin.method('greet') + def greet(name, plugin): + return {'message': f'hello {name}'} + + l1 = node_factory.get_node(inline_plugin=setup) + assert l1.rpc.greet('world') == {'message': 'hello world'} + """ + sock_path = os.path.join(node.daemon.lightning_dir, TEST_NETWORK, 'inline-plugin.sock') + srv = socket.socket(socket.AF_UNIX) + srv.bind(sock_path) + srv.listen(1) + + plugin = Plugin(autopatch=False) + setup_fn(plugin) + + def serve(): + while True: + conn, _ = srv.accept() + + class _SockWriter: + def write(self, data): + try: + conn.sendall(data) + except OSError: + pass + + def flush(self): + pass + + writer = _SockWriter() + plugin.stdout = types.SimpleNamespace(buffer=writer, flush=writer.flush) + + partial = b"" + while True: + try: + chunk = conn.recv(4096) + except OSError: + break + if not chunk: + break + partial += chunk + msgs = partial.split(b'\n\n') + if len(msgs) < 2: + continue + try: + partial = plugin._multi_dispatch(msgs) + except Exception: + break + + threading.Thread(target=serve, daemon=True).start() diff --git a/doc/schemas/askrene-create-layer.json b/doc/schemas/askrene-create-layer.json index 8f2b967c5d6b..cec59e4d87c8 100644 --- a/doc/schemas/askrene-create-layer.json +++ b/doc/schemas/askrene-create-layer.json @@ -45,7 +45,8 @@ "disabled_nodes", "created_channels", "channel_updates", - "constraints" + "constraints", + "impressions" ], "properties": { "layer": { @@ -196,6 +197,39 @@ } } }, + "impressions": { + "added": "v26.09", + "type": "array", + "items": { + "type": "object", + "required": [ + "short_channel_id_dir", + "timestamp", + "amount_msat" + ], + "additionalProperties": false, + "properties": { + "short_channel_id_dir": { + "type": "short_channel_id_dir", + "description": [ + "The short channel id and direction." + ] + }, + "timestamp": { + "type": "u64", + "description": [ + "The UNIX timestamp when this constraint was created." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount we successfully sent through this channel (implying its capacity is that much less, and the reverse direction that much more)" + ] + } + } + } + }, "biases": { "type": "array", "items": { @@ -323,6 +357,7 @@ "created_channels": [], "channel_updates": [], "constraints": [], + "impressions": [], "biases": [], "node_biases": [] } diff --git a/doc/schemas/askrene-inform-channel.json b/doc/schemas/askrene-inform-channel.json index 4450e9af2920..8e0b5bd64750 100644 --- a/doc/schemas/askrene-inform-channel.json +++ b/doc/schemas/askrene-inform-channel.json @@ -42,14 +42,16 @@ "succeeded" ], "description": [ - "Whether this payment passed (implying capacity of at least that amount), failed (implying maximum capacity of one msat less), or succeeded (implying capacity has been reduced in this direction)" + "Whether this payment passed (implying capacity of at least that amount), failed (implying maximum capacity of one msat less), or succeeded (implying capacity has been reduced in this direction)", + "If `succeeded`, then an `impression` is created and returned, otherwise a `constraint` is created and returned." ] } } }, "response": { "required": [ - "constraints" + "constraints", + "impressions" ], "additionalProperties": false, "properties": { @@ -96,6 +98,46 @@ } } } + }, + "impressions": { + "added": "v26.09", + "type": "array", + "items": { + "type": "object", + "required": [ + "layer", + "short_channel_id_dir", + "timestamp", + "amount_msat" + ], + "additionalProperties": false, + "properties": { + "short_channel_id_dir": { + "type": "short_channel_id_dir", + "description": [ + "The short channel id and direction." + ] + }, + "layer": { + "type": "string", + "description": [ + "The name of the layer to apply this change to." + ] + }, + "timestamp": { + "type": "u64", + "description": [ + "The UNIX timestamp when this constraint was created." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount we successfully sent through this channel (implying its capacity is that much less, and the reverse direction that much more)" + ] + } + } + } } } }, diff --git a/doc/schemas/askrene-listlayers.json b/doc/schemas/askrene-listlayers.json index 8531cb72bd7e..73c33cba92ac 100644 --- a/doc/schemas/askrene-listlayers.json +++ b/doc/schemas/askrene-listlayers.json @@ -36,6 +36,7 @@ "disabled_nodes", "created_channels", "channel_updates", + "impressions", "constraints" ], "properties": { @@ -198,6 +199,39 @@ } } }, + "impressions": { + "added": "v26.09", + "type": "array", + "items": { + "type": "object", + "required": [ + "short_channel_id_dir", + "timestamp", + "amount_msat" + ], + "additionalProperties": false, + "properties": { + "short_channel_id_dir": { + "type": "short_channel_id_dir", + "description": [ + "The short channel id and direction." + ] + }, + "timestamp": { + "type": "u64", + "description": [ + "The UNIX timestamp when this constraint was created." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount we successfully sent through this channel (implying its capacity is that much less, and the reverse direction that much more)" + ] + } + } + } + }, "biases": { "type": "array", "items": { diff --git a/doc/schemas/getroutes.json b/doc/schemas/getroutes.json index d6b22256537d..1e389923b310 100644 --- a/doc/schemas/getroutes.json +++ b/doc/schemas/getroutes.json @@ -236,7 +236,9 @@ "", "- -1: Catchall nonspecific error.", "- 205: Unable to find a route.", - "- 206: Route too expensive. Either the max_delay or maxfee_msat was exceeded." + "- 206: Route too expensive. Either the max_delay or maxfee_msat was exceeded.", + "- 215: We don't have enough funds in all our channels to pay this.", + "- 220: We can't find sufficient capacity into the destination." ], "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/lightningd/jsonrpc.c b/lightningd/jsonrpc.c index cf8f68a20f3e..53ad0b666482 100644 --- a/lightningd/jsonrpc.c +++ b/lightningd/jsonrpc.c @@ -1553,7 +1553,6 @@ struct jsonrpc_request *jsonrpc_request_start_( struct jsonrpc_request *r = tal(ctx, struct jsonrpc_request); static u64 next_request_id = 0; - r->id_is_string = true; if (id_prefix) { /* Strip "" and otherwise sanity-check */ if (strstarts(id_prefix, "\"") @@ -1567,10 +1566,10 @@ struct jsonrpc_request *jsonrpc_request_start_( if (json_escape_needed(id_prefix, strlen(id_prefix))) id_prefix = "weird-id"; - r->id = tal_fmt(r, "\"%s/cln:%s#%"PRIu64"\"", + r->id = tal_fmt(r, "%s/cln:%s#%"PRIu64, id_prefix, method, next_request_id); } else { - r->id = tal_fmt(r, "\"cln:%s#%"PRIu64"\"", method, next_request_id); + r->id = tal_fmt(r, "cln:%s#%"PRIu64, method, next_request_id); } tal_free_if_taken(id_prefix); next_request_id++; @@ -1586,7 +1585,7 @@ struct jsonrpc_request *jsonrpc_request_start_( if (add_header) { json_object_start(r->stream, NULL); json_add_string(r->stream, "jsonrpc", "2.0"); - json_add_id(r->stream, r->id); + json_add_string(r->stream, "id", r->id); json_add_string(r->stream, "method", method); json_object_start(r->stream, "params"); } diff --git a/lightningd/jsonrpc.h b/lightningd/jsonrpc.h index e5a5edfa3539..ab3b07ee6317 100644 --- a/lightningd/jsonrpc.h +++ b/lightningd/jsonrpc.h @@ -78,7 +78,6 @@ struct jsonrpc_notification { struct jsonrpc_request { const char *id; - bool id_is_string; const char *method; struct json_stream *stream; void (*notify_cb)(const char *buffer, diff --git a/lightningd/offer.c b/lightningd/offer.c index 1ba82d784cb0..44e6bcdeb134 100644 --- a/lightningd/offer.c +++ b/lightningd/offer.c @@ -313,101 +313,6 @@ static const struct json_command enableoffer_command = { }; AUTODATA(json_command, &enableoffer_command); - -/* We do some sanity checks now, since we're looking up prev payment anyway, - * but our main purpose is to fill in prev_basetime tweak. */ -static struct command_result *prev_payment(struct command *cmd, - const struct json_escape *label, - const struct tlv_invoice_request *invreq, - u64 **prev_basetime) -{ - struct sha256 invreq_oid; - u64 last_recurrence = UINT64_MAX; - bool prev_unpaid = false; - - invreq_offer_id(invreq, &invreq_oid); - - for (struct db_stmt *stmt = payments_by_label(cmd->ld->wallet, label); - stmt; - stmt = payments_next(cmd->ld->wallet, stmt)) { - const struct wallet_payment *payment; - const struct tlv_invoice *inv; - const char *fail; - struct sha256 inv_oid; - - payment = payment_get_details(tmpctx, stmt); - if (!payment->invstring) - continue; - - inv = invoice_decode(tmpctx, payment->invstring, - strlen(payment->invstring), - NULL, chainparams, &fail); - if (!inv) - continue; - - /* They can reuse labels across different offers. */ - invoice_offer_id(inv, &inv_oid); - if (!sha256_eq(&inv_oid, &invreq_oid)) - continue; - - /* Be paranoid, in case someone inserts their own - * clashing label! */ - if (!inv->invreq_recurrence_counter) - continue; - - /* BOLT-recurrence #12: - * - if `offer_recurrence_base` is present: - * - MUST include `invreq_recurrence_start` - * - MUST set `period_offset` to the period the sender wants for the - * initial request - * - MUST set `period_offset` to the same value on all following requests. - */ - if (inv->invreq_recurrence_start - && invreq->invreq_recurrence_start - && *inv->invreq_recurrence_start != *invreq->invreq_recurrence_start) { - tal_free(stmt); - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "recurrence_start was" - " previously %u", - *inv->invreq_recurrence_start); - } - - /* They should all have the same basetime */ - if (!*prev_basetime) - *prev_basetime = tal_dup(cmd, u64, inv->invoice_recurrence_basetime); - - /* Track highest one for better diagnostics */ - if (last_recurrence == UINT64_MAX - || last_recurrence < *inv->invreq_recurrence_counter) { - last_recurrence = *inv->invreq_recurrence_counter; - } - - if (*inv->invreq_recurrence_counter == *invreq->invreq_recurrence_counter-1) { - /* Got it! */ - if (payment->status == PAYMENT_COMPLETE) { - tal_free(stmt); - return NULL; - } else - prev_unpaid = true; - } - } - - /* We found one, but it didn't succeed */ - if (prev_unpaid) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "previous invoice payment did not succeed"); - - /* We found one, but it was not the previus one */ - if (last_recurrence != UINT64_MAX) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "previous invoice has not been paid (last was %"PRIu64")", - last_recurrence); - - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "No previous payment attempted for this" - " label and offer"); -} - /* FIXME(vincenzopalazzo): move this to comm/bolt12.h */ static struct command_result *param_b12_invreq(struct command *cmd, const char *name, @@ -483,7 +388,7 @@ static struct command_result *json_createinvoicerequest(struct command *cmd, if (!param_check(cmd, buffer, params, p_req("bolt12", param_b12_invreq, &invreq), p_req("savetodb", param_bool, &save), - p_opt("recurrence_label", param_label, &label), + p_opt("label", param_label, &label), p_opt_def("single_use", param_bool, &single_use, true), NULL)) return command_param_failed(); @@ -493,21 +398,6 @@ static struct command_result *json_createinvoicerequest(struct command *cmd, else status = OFFER_MULTIPLE_USE_UNUSED; - /* If it's a recurring payment, we look for previous to copy basetime */ - if (invreq->invreq_recurrence_counter) { - if (!label) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "Need payment label for recurring payments"); - - if (*invreq->invreq_recurrence_counter != 0) { - struct command_result *err - = prev_payment(cmd, label, invreq, - &prev_basetime); - if (err) - return err; - } - } - /* If the payer_id is not our node id, we sanity check that it * correctly maps from invreq_metadata */ if (!pubkey_eq(invreq->invreq_payer_id, &cmd->ld->our_pubkey)) { diff --git a/lightningd/plugin.c b/lightningd/plugin.c index 444c626e136e..745e0728fb8d 100644 --- a/lightningd/plugin.c +++ b/lightningd/plugin.c @@ -232,7 +232,7 @@ static void plugin_terminated_fail_req(struct plugin *plugin, buf = tal_fmt(plugin, "{\"jsonrpc\": \"2.0\"," - "\"id\": %s," + "\"id\": \"%s\"," "\"error\":" " {\"code\":%i, \"message\":\"%s\"}" "}\n\n", @@ -549,10 +549,9 @@ static const char *plugin_notify_handle(struct plugin *plugin, "JSON-RPC notify \"id\"-field is not present"); } - /* Include any "" in id */ request = strmap_getn(&plugin->pending_requests, - json_tok_full(buffer, idtok), - json_tok_full_len(idtok)); + buffer + idtok->start, + idtok->end - idtok->start); if (!request) { return NULL; } @@ -675,8 +674,8 @@ static void plugin_response_handle(struct plugin *plugin, const tal_t *ctx; request = strmap_getn(&plugin->pending_requests, - json_tok_full(buffer, idtok), - json_tok_full_len(idtok)); + buffer + idtok->start, + idtok->end - idtok->start); /* Can happen if request was freed before plugin responded */ if (!request) { return; @@ -1188,8 +1187,8 @@ static void json_stream_forward_change_id(struct json_stream *stream, const char *buffer, const jsmntok_t *toks, const jsmntok_t *idtok, - /* Full token, including "" */ - const char *new_id) + const char *new_id, + bool make_new_id_a_string) { /* We copy everything, but replace the id. Special care has to * be taken when the id that is being replaced is a string. If @@ -1203,7 +1202,11 @@ static void json_stream_forward_change_id(struct json_stream *stream, json_stream_append(stream, buffer + toks->start, id_start - (buffer + toks->start)); + if (make_new_id_a_string) + json_stream_append(stream, "\"", 1); json_stream_append(stream, new_id, strlen(new_id)); + if (make_new_id_a_string) + json_stream_append(stream, "\"", 1); json_stream_append(stream, id_end, (buffer + toks->end) - id_end); } @@ -1215,7 +1218,8 @@ static void plugin_rpcmethod_cb(const char *buffer, struct json_stream *response; response = json_stream_raw_for_cmd(cmd); - json_stream_forward_change_id(response, buffer, toks, idtok, cmd->id); + /* cmd->id is a complete JSON token, quotes and all (if a string) */ + json_stream_forward_change_id(response, buffer, toks, idtok, cmd->id, false); json_stream_double_cr(response); command_raw_complete(cmd, response); } @@ -1236,8 +1240,9 @@ static void plugin_notify_cb(const char *buffer, json_add_string(response, "jsonrpc", "2.0"); json_add_tok(response, "method", methodtok, buffer); json_stream_append(response, ",\"params\":", strlen(",\"params\":")); + /* cmd->id is a complete JSON token, quotes and all (if a string) */ json_stream_forward_change_id(response, buffer, - paramtoks, idtok, cmd->id); + paramtoks, idtok, cmd->id, false); json_object_end(response); json_stream_double_cr(response); @@ -1293,7 +1298,7 @@ static struct command_result *plugin_rpcmethod_check(struct command *cmd, plugin_notify_cb, plugin_rpcmethod_cb, cmd); - json_stream_forward_change_id(req->stream, buffer, toks, idtok, req->id); + json_stream_forward_change_id(req->stream, buffer, toks, idtok, req->id, true); json_stream_double_cr(req->stream); plugin_request_send(plugin, req); req->stream = NULL; @@ -1337,7 +1342,7 @@ static struct command_result *plugin_rpcmethod_dispatch(struct command *cmd, plugin_notify_cb, plugin_rpcmethod_cb, cmd); - json_stream_forward_change_id(req->stream, buffer, toks, idtok, req->id); + json_stream_forward_change_id(req->stream, buffer, toks, idtok, req->id, true); json_stream_double_cr(req->stream); plugin_request_send(plugin, req); req->stream = NULL; diff --git a/lightningd/plugin.h b/lightningd/plugin.h index b7f033604af0..5bc0c3af8339 100644 --- a/lightningd/plugin.h +++ b/lightningd/plugin.h @@ -2,6 +2,7 @@ #define LIGHTNING_LIGHTNINGD_PLUGIN_H #include "config.h" #include +#include #include #include @@ -24,11 +25,6 @@ struct plugin_subscription { const char *topic; }; -static inline size_t hash_str(const char *str) -{ - return siphash24(siphash_seed(), str, strlen(str)); -} - static inline const char *plugin_subscription_key(const struct plugin_subscription *ps) { return ps->topic; diff --git a/plugins/askrene/askrene.c b/plugins/askrene/askrene.c index 490e1ce4cd34..b77bbd144ea1 100644 --- a/plugins/askrene/askrene.c +++ b/plugins/askrene/askrene.c @@ -317,7 +317,7 @@ static const char *cmd_log(const tal_t *ctx, if (level != LOG_DBG) plugin_log(cmd->plugin, level == LOG_BROKEN ? level : level - 1, - "%s: %s", cmd->id, msg); + "%s: %s", cmd->idstr, msg); return msg; } @@ -718,7 +718,7 @@ 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, + cmd->idstr, cmd->filter, include_next_node_id, include_amount_msat, include_delay, @@ -984,7 +984,7 @@ static struct command_result *json_askrene_reserve(struct command *cmd, json_tok_full_len(params), json_tok_full(buffer, params)); for (size_t i = 0; i < tal_count(path); i++) - reserve_add(askrene->reserved, &path[i], cmd->id); + reserve_add(askrene->reserved, &path[i], cmd->idstr); response = jsonrpc_stream_success(cmd); return command_finished(cmd, response); @@ -1174,6 +1174,7 @@ static struct command_result *json_askrene_inform_channel(struct command *cmd, struct amount_msat *amount; enum inform *inform; const struct constraint *c; + const struct impression *imp; if (!param_check(cmd, buffer, params, p_req("layer", param_known_layer, &layer), @@ -1196,6 +1197,7 @@ static struct command_result *json_askrene_inform_channel(struct command *cmd, *amount = AMOUNT_MSAT(0); if (command_check_only(cmd)) return command_check_done(cmd); + imp = NULL; c = layer_add_constraint(layer, scidd, clock_time().ts.tv_sec, NULL, amount); goto output; @@ -1204,12 +1206,16 @@ static struct command_result *json_askrene_inform_channel(struct command *cmd, * that no reserves were used) */ if (command_check_only(cmd)) return command_check_done(cmd); + imp = NULL; c = layer_add_constraint(layer, scidd, clock_time().ts.tv_sec, amount, NULL); goto output; case INFORM_SUCCEEDED: - /* FIXME: We could do something useful here! */ + if (command_check_only(cmd)) + return command_check_done(cmd); c = NULL; + imp = layer_add_impression(layer, scidd, clock_time().ts.tv_sec, + *amount); goto output; } abort(); @@ -1220,6 +1226,10 @@ static struct command_result *json_askrene_inform_channel(struct command *cmd, if (c) json_add_constraint(response, NULL, c, layer); json_array_end(response); + json_array_start(response, "impressions"); + if (imp) + json_add_impression(response, NULL, imp, layer); + json_array_end(response); return command_finished(cmd, response); } diff --git a/plugins/askrene/child/child.c b/plugins/askrene/child/child.c index 72aecd68dfd8..7b9dcdc928a9 100644 --- a/plugins/askrene/child/child.c +++ b/plugins/askrene/child/child.c @@ -269,7 +269,7 @@ void run_child(const struct gossmap *gossmap, struct json_stream *js = new_json_stream(tmpctx, NULL, NULL); json_object_start(js, NULL); json_add_string(js, "jsonrpc", "2.0"); - json_add_id(js, cmd_id); + json_add_string(js, "id", cmd_id); json_object_start(js, "result"); if (cmd_filter) json_stream_attach_filter(js, cmd_filter); diff --git a/plugins/askrene/child/explain_failure.c b/plugins/askrene/child/explain_failure.c index 364e41d0a49f..a11179d14e77 100644 --- a/plugins/askrene/child/explain_failure.c +++ b/plugins/askrene/child/explain_failure.c @@ -83,7 +83,7 @@ struct stat { }; struct node_stats { - struct stat total, gossip_known, enabled; + struct stat total, gossip_known, max_capacity_known, enabled; }; enum node_direction { @@ -99,42 +99,104 @@ static void add_stat(struct stat *stat, abort(); } -static void node_stats(const struct route_query *rq, - const struct gossmap_node *node, - enum node_direction node_direction, - struct node_stats *stats) +static bool layer_in_array(const struct layer **layers, + const struct layer *layer) { + for (size_t i = 0; i < tal_count(layers); i++) { + if (layers[i] == layer) + return true; + } + return false; +} + +/* Returns most constraining layers, if any */ +static const struct layer **node_stats(const tal_t *ctx, + const struct route_query *rq, + const struct gossmap_node *node, + enum node_direction node_direction, + const struct layer **layers, + struct node_stats *stats) +{ + const struct layer **most_constraining = tal_arr(ctx, const struct layer *, 0); + memset(stats, 0, sizeof(*stats)); for (size_t i = 0; i < node->num_chans; i++) { - int dir; + struct short_channel_id_dir scidd; struct gossmap_chan *c; - struct amount_msat cap_msat; + struct amount_msat min, max, cap_msat; + const struct layer *constrainer; - c = gossmap_nth_chan(rq->gossmap, node, i, &dir); + c = gossmap_nth_chan(rq->gossmap, node, i, &scidd.dir); + scidd.scid = gossmap_chan_scid(rq->gossmap, c); cap_msat = gossmap_chan_get_capacity(rq->gossmap, c); if (node_direction == INTO_NODE) - dir = !dir; + scidd.dir = !scidd.dir; add_stat(&stats->total, cap_msat); - if (gossmap_chan_set(c, dir)) + if (gossmap_chan_set(c, scidd.dir)) { add_stat(&stats->gossip_known, cap_msat); - if (c->half[dir].enabled) - add_stat(&stats->enabled, cap_msat); + if (c->half[scidd.dir].enabled) + add_stat(&stats->enabled, cap_msat); + } + + min = AMOUNT_MSAT(0); + max = cap_msat; + constrainer = NULL; + for (size_t j = 0; j < tal_count(layers); j++) { + struct amount_msat old_max = max; + layer_apply_constraints(layers[j], &scidd, &min, &max); + if (!amount_msat_eq(max, old_max)) + constrainer = layers[j]; + } + if (constrainer && !layer_in_array(most_constraining, constrainer)) + tal_arr_expand(&most_constraining, constrainer); + add_stat(&stats->max_capacity_known, max); } + return most_constraining; } +static const char *format_layer_names(const tal_t *ctx, const struct layer **layers) +{ + char *ret; + + /* Shouldn't happen! */ + if (tal_count(layers) == 0) + return "UNKNOWN"; + if (tal_count(layers) == 1) + return layer_name(layers[0]); + + ret = tal_strdup(ctx, "layers"); + + for (size_t i = 0; i < tal_count(layers); i++) { + const char *prefix; + if (i == 0) + prefix = " "; + else if (i + 1 == tal_count(layers)) + prefix = " and "; + else + prefix = ", "; + tal_append_fmt(&ret, "%s%s", prefix, layer_name(layers[i])); + } + return ret; +} + +/* On non-NULL return, *total_capacity_failure is true if there's not + * sufficient capacity at all to make this payment */ static const char *check_capacity(const tal_t *ctx, const struct route_query *rq, const struct gossmap_node *node, enum node_direction node_direction, struct amount_msat amount, - const char *name) + const char *name, + bool *total_capacity_failure) { struct node_stats stats; + const struct layer **most_constraining; - node_stats(rq, node, node_direction, &stats); + most_constraining = node_stats(tmpctx, rq, node, node_direction, rq->layers, &stats); if (amount_msat_greater(amount, stats.total.capacity)) { + *total_capacity_failure = true; return child_log(ctx, LOG_DBG, NO_USABLE_PATHS_STRING " Total %s capacity is only %s" @@ -143,7 +205,19 @@ static const char *check_capacity(const tal_t *ctx, fmt_amount_msat(tmpctx, stats.total.capacity), stats.total.num_channels); } + if (amount_msat_greater(amount, stats.max_capacity_known.capacity)) { + *total_capacity_failure = true; + return child_log(ctx, LOG_DBG, + NO_USABLE_PATHS_STRING + " We know from %s that %s has maximum capacity %s" + " (in %zu channels).", + format_layer_names(tmpctx, most_constraining), + name, + fmt_amount_msat(tmpctx, stats.max_capacity_known.capacity), + stats.max_capacity_known.num_channels); + } if (amount_msat_greater(amount, stats.gossip_known.capacity)) { + *total_capacity_failure = false; 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.", @@ -154,6 +228,7 @@ static const char *check_capacity(const tal_t *ctx, fmt_amount_msat(tmpctx, stats.total.capacity)); } if (amount_msat_greater(amount, stats.enabled.capacity)) { + *total_capacity_failure = false; /* Common case: one channel, disabled */ if (stats.enabled.num_channels == 0) { return child_log(ctx, LOG_DBG, @@ -219,7 +294,8 @@ const char *explain_failure(const tal_t *ctx, const struct route_query *rq, const struct gossmap_node *srcnode, const struct gossmap_node *dstnode, - struct amount_msat amount) + struct amount_msat amount, + enum jsonrpc_errcode *ecode) { const struct route_hop *hops; const struct dijkstra *dij; @@ -230,18 +306,28 @@ const char *explain_failure(const tal_t *ctx, struct gossmap_chan *c; struct amount_msat rolling_amount; struct amount_msat *path_amount; + bool total_capacity_failure; + + /* The default answer */ + *ecode = PAY_ROUTE_NOT_FOUND; /* Do we have enough funds? */ cap_check = check_capacity(ctx, rq, srcnode, OUT_OF_NODE, - amount, "source"); - if (cap_check) + amount, "source", &total_capacity_failure); + if (cap_check) { + if (total_capacity_failure) + *ecode = PAY_INSUFFICIENT_FUNDS; return cap_check; + } /* Does destination have enough capacity? */ cap_check = check_capacity(ctx, rq, dstnode, INTO_NODE, - amount, "destination"); - if (cap_check) + amount, "destination", &total_capacity_failure); + if (cap_check) { + if (total_capacity_failure) + *ecode = PAY_DESTINATION_INSUFFICIENT_CAPACITY; return cap_check; + } /* OK, fall back to telling them why didn't shortest path * work. This covers the "but I have a direct channel!" diff --git a/plugins/askrene/child/explain_failure.h b/plugins/askrene/child/explain_failure.h index 2914b9eede54..5a2b121dddfc 100644 --- a/plugins/askrene/child/explain_failure.h +++ b/plugins/askrene/child/explain_failure.h @@ -2,6 +2,7 @@ #define LIGHTNING_PLUGINS_ASKRENE_CHILD_EXPLAIN_FAILURE_H #include "config.h" #include +#include struct route_query; struct gossmap_node; @@ -11,6 +12,7 @@ const char *explain_failure(const tal_t *ctx, const struct route_query *rq, const struct gossmap_node *srcnode, const struct gossmap_node *dstnode, - struct amount_msat amount); + struct amount_msat amount, + enum jsonrpc_errcode *ecode); #endif /* LIGHTNING_PLUGINS_ASKRENE_CHILD_EXPLAIN_FAILURE_H */ diff --git a/plugins/askrene/child/mcf.c b/plugins/askrene/child/mcf.c index dde97f02250e..3c455b852822 100644 --- a/plugins/askrene/child/mcf.c +++ b/plugins/askrene/child/mcf.c @@ -1401,8 +1401,7 @@ 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; + ctx, rq, srcnode, dstnode, amount_to_deliver, ecode); goto fail; } diff --git a/plugins/askrene/child/route_query.c b/plugins/askrene/child/route_query.c index f6366eaf354d..fd9511d0b961 100644 --- a/plugins/askrene/child/route_query.c +++ b/plugins/askrene/child/route_query.c @@ -33,20 +33,18 @@ void get_constraints(const struct route_query *rq, return; } + /* Might be here because it's reserved, but capacity is normal. */ + *max = gossmap_chan_get_capacity(rq->gossmap, chan); + /* Naive implementation! */ scidd.scid = gossmap_chan_scid(rq->gossmap, chan); scidd.dir = dir; - *max = AMOUNT_MSAT(-1ULL); /* Look through layers for any constraints (might be dummy * ones, for created channels!) */ for (size_t i = 0; i < tal_count(rq->layers); i++) layer_apply_constraints(rq->layers[i], &scidd, min, max); - /* Might be here because it's reserved, but capacity is normal. */ - if (amount_msat_eq(*max, AMOUNT_MSAT(-1ULL))) - *max = gossmap_chan_get_capacity(rq->gossmap, chan); - /* Finally, if any is in use, subtract that! */ reserve_sub(rq->reserved, &scidd, rq->layers, min); reserve_sub(rq->reserved, &scidd, rq->layers, max); diff --git a/plugins/askrene/datastore_wire.c b/plugins/askrene/datastore_wire.c index 022b7a60a762..7b8c5e4699d6 100644 --- a/plugins/askrene/datastore_wire.c +++ b/plugins/askrene/datastore_wire.c @@ -216,6 +216,35 @@ void towire_dstore_channel_constraint(u8 **data, towire_opt_amount_msat(data, max); } +bool fromwire_dstore_channel_impression(const tal_t *ctx, + const u8 **cursor, size_t *len, + struct short_channel_id_dir *scidd, + u64 *timestamp, + struct amount_msat *amount) +{ + if (fromwire_u16(cursor, len) != DSTORE_CHANNEL_IMPRESSION) { + fromwire_fail(cursor, len); + return false; + } + + fromwire_short_channel_id_dir(cursor, len, scidd); + *timestamp = fromwire_u64(cursor, len); + *amount = fromwire_amount_msat(cursor, len); + + return *cursor != NULL; +} + +void towire_dstore_channel_impression(u8 **data, + const struct short_channel_id_dir *scidd, + u64 timestamp, + struct amount_msat amount) +{ + towire_u16(data, DSTORE_CHANNEL_IMPRESSION); + towire_short_channel_id_dir(data, scidd); + towire_u64(data, timestamp); + towire_amount_msat(data, amount); +} + bool fromwire_dstore_channel_bias(const tal_t *ctx, const u8 **cursor, size_t *len, struct short_channel_id_dir *scidd, diff --git a/plugins/askrene/datastore_wire.h b/plugins/askrene/datastore_wire.h index 70282ad3f3b2..bf78cf276a53 100644 --- a/plugins/askrene/datastore_wire.h +++ b/plugins/askrene/datastore_wire.h @@ -17,6 +17,7 @@ enum dstore_layer_type { DSTORE_DISABLED_NODE = 5, DSTORE_CHANNEL_BIAS_V2 = 6, DSTORE_NODE_BIAS = 7, + DSTORE_CHANNEL_IMPRESSION = 8, }; bool fromwire_dstore_channel(const u8 **cursor, size_t *len, @@ -60,6 +61,16 @@ void towire_dstore_channel_constraint(u8 **data, const struct amount_msat *min, const struct amount_msat *max); +bool fromwire_dstore_channel_impression(const tal_t *ctx, + const u8 **cursor, size_t *len, + struct short_channel_id_dir *scidd, + u64 *timestamp, + struct amount_msat *amount); +void towire_dstore_channel_impression(u8 **data, + const struct short_channel_id_dir *scidd, + u64 timestamp, + struct amount_msat amount); + bool fromwire_dstore_channel_bias(const tal_t *ctx, const u8 **cursor, size_t *len, struct short_channel_id_dir *scidd, diff --git a/plugins/askrene/layer.c b/plugins/askrene/layer.c index 610b3ce027d3..77e39dcc530d 100644 --- a/plugins/askrene/layer.c +++ b/plugins/askrene/layer.c @@ -45,6 +45,15 @@ struct constraint { struct amount_msat max; }; +/* An impression reflects something we did to a channel (successful payments) */ +struct impression { + /* This is the direction of the payment, but it affects both ways */ + struct short_channel_id_dir scidd; + /* Time this constraint was last updated */ + u64 timestamp; + struct amount_msat amount; +}; + /* A bias, for special-effects (user-controlled) */ struct bias { struct short_channel_id_dir scidd; @@ -60,20 +69,29 @@ struct node_bias { u64 timestamp; }; -static const struct short_channel_id_dir * -constraint_scidd(const struct constraint *c) +/* A timestamp-ordered list of impresssion and constraint */ +struct channel_intel { + /* Only one is set */ + const struct impression *impression; + const struct constraint *constraint; +}; + +static struct short_channel_id +channel_intel_scid(const struct channel_intel *intelarr) { - return &c->scidd; + if (intelarr[0].impression) + return intelarr[0].impression->scidd.scid; + return intelarr[0].constraint->scidd.scid; } -static inline bool constraint_eq_scidd(const struct constraint *c, - const struct short_channel_id_dir *scidd) +static inline bool channel_intel_eq_scid(const struct channel_intel *intelarr, + struct short_channel_id scid) { - return short_channel_id_dir_eq(scidd, &c->scidd); + return short_channel_id_eq(scid, channel_intel_scid(intelarr)); } -HTABLE_DEFINE_DUPS_TYPE(struct constraint, constraint_scidd, hash_scidd, - constraint_eq_scidd, constraint_hash); +HTABLE_DEFINE_NODUPS_TYPE(struct channel_intel, channel_intel_scid, hash_scid, + channel_intel_eq_scid, channel_intel_hash); static struct short_channel_id local_channel_scid(const struct local_channel *lc) @@ -155,8 +173,8 @@ struct layer { /* Modifications to channels, indexed by scidd */ struct local_update_hash *local_updates; - /* Additional info, indexed by scid+dir */ - struct constraint_hash *constraints; + /* Constraints and impressions, indexed by scid */ + struct channel_intel_hash *channel_intels; /* Bias, indexed by scid+dir */ struct bias_hash *biases; @@ -196,7 +214,7 @@ struct layer *new_temp_layer(const tal_t *ctx, struct askrene *askrene, const ch l->persistent = false; l->local_channels = new_htable(l, local_channel_hash); l->local_updates = new_htable(l, local_update_hash); - l->constraints = new_htable(l, constraint_hash); + l->channel_intels = new_htable(l, channel_intel_hash); l->biases = new_htable(l, bias_hash); l->node_biases = new_htable(l, node_bias_hash); l->disabled_nodes = tal_arr(l, struct node_id, 0); @@ -292,13 +310,59 @@ static struct local_update *add_update_channel(struct layer *layer, return lu; } +static u64 channel_intel_timestamp(const struct channel_intel *intel) +{ + if (intel->constraint) + return intel->constraint->timestamp; + return intel->impression->timestamp; +} + +/* Insert this constraint/impression in htable, maintaining timestamp order */ +static void add_channel_intel(struct layer *layer, + const struct constraint *constraint STEALS, + const struct impression *impression STEALS) +{ + struct channel_intel intel, *intelarr; + + intel.impression = impression; + intel.constraint = constraint; + /* Exactly one is set */ + if (constraint) + assert(!impression); + else + assert(impression); + + intelarr = channel_intel_hash_get(layer->channel_intels, channel_intel_scid(&intel)); + if (!intelarr) { + intelarr = tal_dup(layer->channel_intels, struct channel_intel, &intel); + goto done; + } + + /* Insert in timestamp order, then insertion order. Realloc + * mean we have to delete, readd */ + channel_intel_hash_del(layer->channel_intels, intelarr); + for (size_t i = 0; i < tal_count(intelarr); i++) { + if (channel_intel_timestamp(&intel) < channel_intel_timestamp(&intelarr[i])) { + tal_arr_insert(&intelarr, i, intel); + goto done; + } + } + tal_arr_expand(&intelarr, intel); + +done: + channel_intel_hash_add(layer->channel_intels, intelarr); + /* Make sure array owns the impression/constraint, to avoid memleak */ + tal_steal(intelarr, intel.impression); + tal_steal(intelarr, intel.constraint); +} + static const struct constraint *add_constraint(struct layer *layer, const struct short_channel_id_dir *scidd, u64 timestamp, const struct amount_msat *min, const struct amount_msat *max) { - struct constraint *c = tal(layer, struct constraint); + struct constraint *c = tal(NULL, struct constraint); c->scidd = *scidd; if (min) @@ -311,10 +375,24 @@ static const struct constraint *add_constraint(struct layer *layer, c->max = AMOUNT_MSAT(UINT64_MAX); c->timestamp = timestamp; - constraint_hash_add(layer->constraints, c); + add_channel_intel(layer, c, NULL); return c; } +static const struct impression *add_impression(struct layer *layer, + const struct short_channel_id_dir *scidd, + u64 timestamp, + struct amount_msat amount) +{ + struct impression *imp = tal(NULL, struct impression); + imp->scidd = *scidd; + imp->amount = amount; + imp->timestamp = timestamp; + + add_channel_intel(layer, NULL, imp); + return imp; +} + static const struct bias *set_bias(struct layer *layer, const struct short_channel_id_dir *scidd, const char *description TAKES, @@ -564,6 +642,38 @@ static void load_channel_constraint(struct plugin *plugin, add_constraint(layer, &scidd, timestamp, min, max); } +static void towire_save_channel_impression(u8 **data, const struct impression *imp) +{ + towire_dstore_channel_impression(data, &imp->scidd, imp->timestamp, imp->amount); +} + +static void save_channel_impression(struct layer *layer, const struct impression *imp) +{ + u8 *data; + + if (!layer->persistent) + return; + + data = tal_arr(tmpctx, u8, 0); + towire_save_channel_impression(&data, imp); + append_layer_datastore(layer, data); +} + +static void load_channel_impression(struct plugin *plugin, + struct layer *layer, + const u8 **cursor, + size_t *len) +{ + struct short_channel_id_dir scidd; + struct amount_msat amount; + u64 timestamp; + + if (fromwire_dstore_channel_impression(tmpctx, cursor, len, + &scidd, ×tamp, + &amount)) + add_impression(layer, &scidd, timestamp, amount); +} + static void towire_save_channel_bias(u8 **data, const struct bias *bias) { towire_dstore_channel_bias_v2(data, @@ -699,8 +809,8 @@ static void save_complete_layer(struct layer *layer) const struct local_channel *lc; const struct local_update *lu; struct local_update_hash_iter luit; - struct constraint_hash_iter conit; - const struct constraint *c; + const struct channel_intel *intelarr; + struct channel_intel_hash_iter intelit; struct bias_hash_iter biasit; const struct bias *b; struct node_bias_hash_iter nbiasit; @@ -725,13 +835,19 @@ static void save_complete_layer(struct layer *layer) lu = local_update_hash_next(layer->local_updates, &luit)) { towire_save_channel_update(&data, lu); } - for (c = constraint_hash_first(layer->constraints, &conit); - c; - c = constraint_hash_next(layer->constraints, &conit)) { - /* Don't save ones we generated internally */ - if (c->timestamp == UINT64_MAX) - continue; - towire_save_channel_constraint(&data, c); + for (intelarr = channel_intel_hash_first(layer->channel_intels, &intelit); + intelarr; + intelarr = channel_intel_hash_next(layer->channel_intels, &intelit)) { + for (size_t i = 0; i < tal_count(intelarr); i++) { + if (intelarr[i].constraint) { + /* Don't save ones we generated internally */ + if (intelarr[i].constraint->timestamp == UINT64_MAX) + continue; + towire_save_channel_constraint(&data, intelarr[i].constraint); + } else { + towire_save_channel_impression(&data, intelarr[i].impression); + } + } } for (b = bias_hash_first(layer->biases, &biasit); b; @@ -793,6 +909,9 @@ static void populate_layer(struct askrene *askrene, case DSTORE_NODE_BIAS: load_node_bias(askrene->plugin, layer, &data, &len); continue; + case DSTORE_CHANNEL_IMPRESSION: + load_channel_impression(askrene->plugin, layer, &data, &len); + continue; } plugin_err(askrene->plugin, "Invalid type %i in datastore: layer %s %s", type, layer->name, tal_hexstr(tmpctx, data, len)); @@ -997,15 +1116,33 @@ void layer_apply_constraints(const struct layer *layer, struct amount_msat *min, struct amount_msat *max) { - struct constraint *c; - struct constraint_hash_iter cit; - - /* We can have more than one: apply them all! */ - for (c = constraint_hash_getfirst(layer->constraints, scidd, &cit); - c; - c = constraint_hash_getnext(layer->constraints, scidd, &cit)) { - *min = amount_msat_max(*min, c->min); - *max = amount_msat_min(*max, c->max); + const struct channel_intel *intelarr; + + /* Apply any intel we have, in order */ + intelarr = channel_intel_hash_get(layer->channel_intels, scidd->scid); + for (size_t i = 0; i < tal_count(intelarr); i++) { + if (intelarr[i].constraint) { + const struct constraint *c = intelarr[i].constraint; + if (c->scidd.dir == scidd->dir) { + *min = amount_msat_max(*min, c->min); + *max = amount_msat_min(*max, c->max); + } + } else { + const struct impression *imp = intelarr[i].impression; + /* We made payment along this channel? Capacity has reduced */ + if (imp->scidd.dir == scidd->dir) { + if (!amount_msat_sub(min, *min, imp->amount)) + *min = AMOUNT_MSAT(0); + if (!amount_msat_sub(max, *max, imp->amount)) + *max = AMOUNT_MSAT(0); + } else { + /* We made the other way? Capacity has increased */ + if (!amount_msat_add(min, *min, imp->amount)) + *min = AMOUNT_MSAT(-1ULL); + if (!amount_msat_add(max, *max, imp->amount)) + *max = AMOUNT_MSAT(-1ULL); + } + } } } @@ -1022,17 +1159,30 @@ const struct constraint *layer_add_constraint(struct layer *layer, return c; } +const struct impression *layer_add_impression(struct layer *layer, + const struct short_channel_id_dir *scidd, + u64 timestamp, + struct amount_msat amount) +{ + const struct impression *imp; + + imp = add_impression(layer, scidd, timestamp, amount); + save_channel_impression(layer, imp); + return imp; +} + void layer_clear_overridden_capacities(const struct layer *layer, const struct gossmap *gossmap, fp16_t *capacities) { - struct constraint_hash_iter conit; - struct constraint *con; + struct channel_intel_hash_iter intelit; + const struct channel_intel *intelarr; - for (con = constraint_hash_first(layer->constraints, &conit); - con; - con = constraint_hash_next(layer->constraints, &conit)) { - struct gossmap_chan *c = gossmap_find_chan(gossmap, &con->scidd.scid); + for (intelarr = channel_intel_hash_first(layer->channel_intels, &intelit); + intelarr; + intelarr = channel_intel_hash_next(layer->channel_intels, &intelit)) { + const struct short_channel_id scid = channel_intel_scid(intelarr); + struct gossmap_chan *c = gossmap_find_chan(gossmap, &scid); size_t idx; if (!c) continue; @@ -1045,20 +1195,37 @@ void layer_clear_overridden_capacities(const struct layer *layer, size_t layer_trim_constraints(struct layer *layer, u64 cutoff) { size_t num_removed = 0; - struct constraint_hash_iter conit; - struct constraint *con; + struct channel_intel_hash_iter intelit; + const struct channel_intel *intelarr; struct bias_hash_iter biasit; struct bias *bias; struct node_bias_hash_iter node_it; struct node_bias *node_bias; - for (con = constraint_hash_first(layer->constraints, &conit); - con; - con = constraint_hash_next(layer->constraints, &conit)) { - if (con->timestamp < cutoff) { - constraint_hash_delval(layer->constraints, &conit); - tal_free(con); + for (intelarr = channel_intel_hash_first(layer->channel_intels, &intelit); + intelarr; + intelarr = channel_intel_hash_next(layer->channel_intels, &intelit)) { + bool changed = false; + for (size_t i = 0; i < tal_count(intelarr); i++) { + if (channel_intel_timestamp(&intelarr[i]) >= cutoff) + continue; + /* Remove from table before realloc! */ + if (!changed) + channel_intel_hash_del(layer->channel_intels, intelarr); + tal_arr_remove(&intelarr, i); + changed = true; num_removed++; + i--; + } + if (!changed) + continue; + + /* We emptied it, just free. */ + if (tal_count(intelarr) == 0) + tal_free(intelarr); + else { + /* Still has members, put it back. */ + channel_intel_hash_add(layer->channel_intels, intelarr); } } @@ -1215,6 +1382,20 @@ void json_add_constraint(struct json_stream *js, json_object_end(js); } +void json_add_impression(struct json_stream *js, + const char *fieldname, + const struct impression *imp, + const struct layer *layer) +{ + json_object_start(js, fieldname); + if (layer) + json_add_string(js, "layer", layer->name); + json_add_short_channel_id_dir(js, "short_channel_id_dir", imp->scidd); + json_add_u64(js, "timestamp", imp->timestamp); + json_add_amount_msat(js, "amount_msat", imp->amount); + json_object_end(js); +} + void json_add_bias(struct json_stream *js, const char *fieldname, const struct bias *b, @@ -1256,8 +1437,8 @@ static void json_add_layer(struct json_stream *js, const struct local_channel *lc; const struct local_update *lu; struct local_update_hash_iter luit; - struct constraint_hash_iter conit; - const struct constraint *c; + struct channel_intel_hash_iter intelit; + const struct channel_intel *intelarr; struct bias_hash_iter biasit; const struct bias *b; struct node_bias_hash_iter node_it; @@ -1285,13 +1466,28 @@ static void json_add_layer(struct json_stream *js, } json_array_end(js); json_array_start(js, "constraints"); - for (c = constraint_hash_first(layer->constraints, &conit); - c; - c = constraint_hash_next(layer->constraints, &conit)) { - /* Don't show ones we generated internally */ - if (c->timestamp == UINT64_MAX) - continue; - json_add_constraint(js, NULL, c, NULL); + for (intelarr = channel_intel_hash_first(layer->channel_intels, &intelit); + intelarr; + intelarr = channel_intel_hash_next(layer->channel_intels, &intelit)) { + for (size_t i = 0; i < tal_count(intelarr); i++) { + if (!intelarr[i].constraint) + continue; + /* Don't show ones we generated internally */ + if (intelarr[i].constraint->timestamp == UINT64_MAX) + continue; + json_add_constraint(js, NULL, intelarr[i].constraint, NULL); + } + } + json_array_end(js); + json_array_start(js, "impressions"); + for (intelarr = channel_intel_hash_first(layer->channel_intels, &intelit); + intelarr; + intelarr = channel_intel_hash_next(layer->channel_intels, &intelit)) { + for (size_t i = 0; i < tal_count(intelarr); i++) { + if (!intelarr[i].impression) + continue; + json_add_impression(js, NULL, intelarr[i].impression, NULL); + } } json_array_end(js); json_array_start(js, "biases"); diff --git a/plugins/askrene/layer.h b/plugins/askrene/layer.h index 547ed8da11ee..e179f60e1de7 100644 --- a/plugins/askrene/layer.h +++ b/plugins/askrene/layer.h @@ -107,13 +107,19 @@ void layer_apply_biases(const struct layer *layer, const struct gossmap *gossmap, s8 *biases); -/* Add one or more constraints on a layer. */ +/* Add a constraint to a layer. */ const struct constraint *layer_add_constraint(struct layer *layer, const struct short_channel_id_dir *scidd, u64 timestamp, const struct amount_msat *min, const struct amount_msat *max); +/* Add a usage constraint to a layer: a successful payment has given us more info */ +const struct impression *layer_add_impression(struct layer *layer, + const struct short_channel_id_dir *scidd, + u64 timestamp, + struct amount_msat amount); + /* Add local channels from this layer. */ void layer_add_localmods(const struct layer *layer, const struct gossmap *gossmap, @@ -137,6 +143,12 @@ void json_add_constraint(struct json_stream *js, const struct constraint *c, const struct layer *layer); +/* Print a usage constraint */ +void json_add_impression(struct json_stream *js, + const char *fieldname, + const struct impression *imp, + const struct layer *layer); + /* Print a single bias */ void json_add_bias(struct json_stream *js, const char *fieldname, diff --git a/plugins/bkpr/account.c b/plugins/bkpr/account.c index c8b074689773..c01bafefdc99 100644 --- a/plugins/bkpr/account.c +++ b/plugins/bkpr/account.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -14,11 +15,6 @@ #include #include -static size_t hash_str(const char *str) -{ - return siphash24(siphash_seed(), str, strlen(str)); -} - static const char *account_key(const struct account *account) { return account->name; diff --git a/plugins/bkpr/onchain_fee.c b/plugins/bkpr/onchain_fee.c index 79b6f15a7d20..8a6cc14ba9fd 100644 --- a/plugins/bkpr/onchain_fee.c +++ b/plugins/bkpr/onchain_fee.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -57,11 +58,6 @@ struct ordered_ofees { struct onchain_fee **ofs; }; -static size_t hash_acctname(const char *str) -{ - return siphash24(siphash_seed(), str, strlen(str)); -} - static const char *onchain_fees_keyof(const struct ordered_ofees *ofees) { return ofees->ofs[0]->acct_name; @@ -75,7 +71,7 @@ static bool onchain_account_eq(const struct ordered_ofees *ofees, HTABLE_DEFINE_NODUPS_TYPE(struct ordered_ofees, onchain_fees_keyof, - hash_acctname, + hash_str, onchain_account_eq, ofees_hash); diff --git a/plugins/commando.c b/plugins/commando.c index a256f0b0f8ad..e7eb9b3a57d2 100644 --- a/plugins/commando.c +++ b/plugins/commando.c @@ -673,7 +673,7 @@ static struct command_result *json_commando(struct command *cmd, ocmd = new_commando(cmd, cmd, peer, oid); ocmd->contents = tal_arr(ocmd, u8, 0); - ocmd->json_id = tal_strdup(ocmd, cmd->id); + ocmd->json_id = tal_fmt(ocmd, "\"%s\"", cmd->idstr); tal_arr_expand(&outgoing_commands, ocmd); tal_add_destructor2(ocmd, destroy_commando, &outgoing_commands); diff --git a/plugins/fetchinvoice.c b/plugins/fetchinvoice.c index 8ff374d5715b..48a52a051f39 100644 --- a/plugins/fetchinvoice.c +++ b/plugins/fetchinvoice.c @@ -1,4 +1,5 @@ #include "config.h" +#include #include #include #include @@ -683,7 +684,6 @@ static struct command_result *invreq_done(struct command *cmd, struct tlv_onionmsg_tlv *payload; const jsmntok_t *t; const char *fail; - const struct recurrence *recurrence; /* Get invoice request */ t = json_get_member(buf, result, "bolt12"); @@ -712,71 +712,6 @@ static struct command_result *invreq_done(struct command *cmd, json_tok_full(buf, t), fail); - recurrence = invreq_recurrence(sent->invreq); - /* Now that's given us the previous base, check this is an OK time - * to request an invoice. */ - if (sent->invreq->invreq_recurrence_counter) { - u64 *base; - const jsmntok_t *pbtok; - u64 period_idx = *sent->invreq->invreq_recurrence_counter; - - if (sent->invreq->invreq_recurrence_start) - period_idx += *sent->invreq->invreq_recurrence_start; - - /* BOLT-recurrence #12: - * - if `offer_recurrence_limit` is present: - * - MUST NOT send an `invoice_request` for a period index greater than - * `max_period_index` - */ - if (sent->invreq->offer_recurrence_limit - && period_idx > *sent->invreq->offer_recurrence_limit) - return command_fail(cmd, LIGHTNINGD, - "Can't send invreq for period %" - PRIu64" (limit %u)", - period_idx, - *sent->invreq->offer_recurrence_limit); - - /* BOLT-recurrence #12: - * - SHOULD NOT send an `invoice_request` for a period which has - * already passed. - */ - /* If there's no recurrence_base, we need a previous payment - * for this: fortunately createinvoicerequest does that - * lookup. */ - pbtok = json_get_member(buf, result, "previous_basetime"); - if (pbtok) { - base = tal(tmpctx, u64); - json_to_u64(buf, pbtok, base); - } else if (sent->invreq->offer_recurrence_base) - base = &sent->invreq->offer_recurrence_base->basetime; - else { - /* happens with *recurrence_base == 0 */ - assert(*sent->invreq->invreq_recurrence_counter == 0); - base = NULL; - } - - if (base) { - u64 period_start, period_end, now = clock_time().ts.tv_sec; - offer_period_paywindow(recurrence, - sent->invreq->offer_recurrence_paywindow, - sent->invreq->offer_recurrence_base, - *base, period_idx, - &period_start, &period_end); - if (now < period_start) - return command_fail(cmd, LIGHTNINGD, - "Too early: can't send until time %" - PRIu64" (in %"PRIu64" secs)", - period_start, - period_start - now); - if (now > period_end) - return command_fail(cmd, LIGHTNINGD, - "Too late: expired time %" - PRIu64" (%"PRIu64" secs ago)", - period_end, - now - period_end); - } - } - payload = tlv_onionmsg_tlv_new(sent); payload->invoice_request = tal_arr(payload, u8, 0); towire_tlv_invoice_request(&payload->invoice_request, sent->invreq); @@ -857,7 +792,7 @@ static bool payer_key(const struct offers_data *od, static u8 *recurrence_invreq_metadata(const tal_t *ctx, const struct tlv_invoice_request *invreq, const struct secret *nodealias_base, - const char *rec_label) + const struct json_escape *rec_label) { struct sha256 offer_id, tweak; u8 *tweak_input; @@ -865,11 +800,11 @@ static u8 *recurrence_invreq_metadata(const tal_t *ctx, /* Use "offer_id || label" as tweak input */ invreq_offer_id(invreq, &offer_id); tweak_input = tal_arr(tmpctx, u8, - sizeof(offer_id) + strlen(rec_label)); + sizeof(offer_id) + strlen(rec_label->s)); memcpy(tweak_input, &offer_id, sizeof(offer_id)); memcpy(tweak_input + sizeof(offer_id), - rec_label, - strlen(rec_label)); + rec_label->s, + strlen(rec_label->s)); bolt12_alias_tweak(nodealias_base, tweak_input, @@ -920,7 +855,8 @@ struct command_result *json_fetchinvoice(struct command *cmd, { const struct offers_data *od = get_offers_data(cmd->plugin); struct amount_msat *msat; - const char *rec_label, *payer_note; + const char *payer_note; + struct json_escape *rec_label; u8 *payer_metadata; struct out_req *req; struct tlv_invoice_request *invreq; @@ -936,7 +872,7 @@ struct command_result *json_fetchinvoice(struct command *cmd, p_opt("quantity", param_u64, &quantity), p_opt("recurrence_counter", param_number, &recurrence_counter), p_opt("recurrence_start", param_number, &recurrence_start), - p_opt("recurrence_label", param_string, &rec_label), + p_opt("recurrence_label", param_label, &rec_label), p_opt_def("timeout", param_number, &timeout, 60), p_opt("payer_note", param_string, &payer_note), p_opt("payer_metadata", param_bin_from_hex, &payer_metadata), @@ -1162,7 +1098,7 @@ struct command_result *json_fetchinvoice(struct command *cmd, json_add_string(req->js, "bolt12", invrequest_encode(tmpctx, invreq)); json_add_bool(req->js, "savetodb", false); if (rec_label) - json_add_string(req->js, "recurrence_label", rec_label); + json_add_escaped_string(req->js, "label", rec_label); return send_outreq(req); } @@ -1171,7 +1107,8 @@ struct command_result *json_cancelrecurringinvoice(struct command *cmd, const jsmntok_t *params) { const struct offers_data *od = get_offers_data(cmd->plugin); - const char *rec_label, *payer_note; + const char *payer_note; + struct json_escape *rec_label; struct out_req *req; struct tlv_invoice_request *invreq; struct sent *sent = tal(cmd, struct sent); @@ -1181,7 +1118,7 @@ struct command_result *json_cancelrecurringinvoice(struct command *cmd, if (!param_check(cmd, buffer, params, p_req("offer", param_offer, &sent->offer), p_req("recurrence_counter", param_number, &recurrence_counter), - p_req("recurrence_label", param_string, &rec_label), + p_req("recurrence_label", param_label, &rec_label), p_opt("recurrence_start", param_number, &recurrence_start), p_opt("payer_note", param_string, &payer_note), p_opt("bip353", param_bip353, &bip353), @@ -1316,7 +1253,7 @@ struct command_result *json_cancelrecurringinvoice(struct command *cmd, /* We don't want this is the database: that's only for ones we publish */ json_add_string(req->js, "bolt12", invrequest_encode(tmpctx, invreq)); json_add_bool(req->js, "savetodb", false); - json_add_string(req->js, "recurrence_label", rec_label); + json_add_escaped_string(req->js, "label", rec_label); return send_outreq(req); } diff --git a/plugins/libplugin-pay.c b/plugins/libplugin-pay.c index 9504950a7ec8..2527ec9cc0a9 100644 --- a/plugins/libplugin-pay.c +++ b/plugins/libplugin-pay.c @@ -181,10 +181,7 @@ struct payment *payment_root(struct payment *p) static const char *paymod_log_header(const tal_t *ctx, struct payment *p) { - const char *id = payment_cmd(p)->id; - if (strstarts(id, "\"")) - return tal_strndup(ctx, id+1, strlen(id+1)-1); - return tal_strdup(ctx, id); + return tal_strdup(ctx, payment_cmd(p)->idstr); } void diff --git a/plugins/libplugin.c b/plugins/libplugin.c index 2bc153f6e8f9..d720979cc027 100644 --- a/plugins/libplugin.c +++ b/plugins/libplugin.c @@ -1,5 +1,6 @@ #include "config.h" #include +#include #include #include #include @@ -175,7 +176,7 @@ static struct command *new_command(const tal_t *ctx, cmd->type = type; cmd->filter = NULL; cmd->methodname = tal_strdup(cmd, methodname); - cmd->id = tal_strdup(cmd, id); + cmd->idstr = tal_strdup(cmd, id); return cmd; } @@ -208,11 +209,11 @@ static void complain_deprecated(const char *feature, /* Mild log message for disallowing */ plugin_log(cmd->plugin, LOG_DBG, "Note: disallowing deprecated %s for %s", - feature, cmd->id); + feature, cmd->idstr); } else { plugin_log(cmd->plugin, LOG_BROKEN, "DEPRECATED API USED: %s by %s", - feature, cmd->id); + feature, cmd->idstr); } } @@ -342,27 +343,16 @@ struct command_result *plugin_broken_cb(struct command *cmd, static const char *json_id(const tal_t *ctx, struct plugin *plugin, const char *method, const char *prefix) { - const char *rawid; - int rawidlen; - - /* Strip quotes! */ - if (strstarts(prefix, "\"")) { - assert(strlen(prefix) >= 2); - assert(strends(prefix, "\"")); - rawid = prefix + 1; - rawidlen = strlen(prefix) - 2; - } else { - rawid = prefix; - rawidlen = strlen(prefix); - } - - return tal_fmt(ctx, "\"%.*s/%s:%s#%"PRIu64"\"", - rawidlen, rawid, plugin->id, method, plugin->next_outreq_id++); + /* Don't create weird IDs, they will get escaped and we won't match the reply. */ + if (json_escape_needed(method, strlen(method))) + method = "!weird!"; + return tal_fmt(ctx, "%s/%s:%s#%"PRIu64, + prefix, plugin->id, method, plugin->next_outreq_id++); } static void destroy_out_req(struct out_req *out_req, struct plugin *plugin) { - strmap_del(&plugin->out_reqs, out_req->id, NULL); + strmap_del(&plugin->out_reqs, out_req->idstr, NULL); } /* FIXME: Move lightningd/jsonrpc to common/ ? */ @@ -389,18 +379,18 @@ jsonrpc_request_start_(struct command *cmd, assert(cmd); out = tal(cmd, struct out_req); out->method = tal_strdup(out, method); - out->id = json_id(out, cmd->plugin, method, id_prefix ? id_prefix : cmd->id); + out->idstr = json_id(out, cmd->plugin, method, id_prefix ? id_prefix : cmd->idstr); out->cmd = cmd; out->cb = cb; out->errcb = errcb; out->arg = arg; - strmap_add(&cmd->plugin->out_reqs, out->id, out); + strmap_add(&cmd->plugin->out_reqs, out->idstr, out); tal_add_destructor2(out, destroy_out_req, cmd->plugin); out->js = new_json_stream(NULL, cmd, NULL); json_object_start(out->js, NULL); json_add_string(out->js, "jsonrpc", "2.0"); - json_add_id(out->js, out->id); + json_add_string(out->js, "id", out->idstr); json_add_string(out->js, "method", method); if (filter) { /* This is raw JSON, so paste, don't escape! */ @@ -432,7 +422,7 @@ static struct json_stream *jsonrpc_stream_start(struct command *cmd) json_object_start(js, NULL); json_add_string(js, "jsonrpc", "2.0"); - json_add_id(js, cmd->id); + json_add_string(js, "id", cmd->idstr); return js; } @@ -781,8 +771,7 @@ static const jsmntok_t *sync_req(const tal_t *ctx, json_out_start(jout, NULL, '{'); json_out_addstr(jout, "jsonrpc", "2.0"); - /* Copy in id *literally* */ - memcpy(json_out_member_direct(jout, "id", strlen(id)), id, strlen(id)); + json_out_addstr(jout, "id", id); json_out_addstr(jout, "method", method); if (params) json_out_add_splice(jout, "params", params); @@ -1051,9 +1040,16 @@ static void handle_rpc_reply(const tal_t *working_ctx, /* FIXME: Don't simply ignore notifications! */ return; + if (idtok->type != JSMN_STRING) { + plugin_log(plugin, LOG_BROKEN, "JSON reply with non-string id '%.*s'", + json_tok_full_len(toks), + json_tok_full(buf, toks)); + return; + } + out = strmap_getn(&plugin->out_reqs, - json_tok_full(buf, idtok), - json_tok_full_len(idtok)); + buf + idtok->start, + idtok->end - idtok->start); if (!out) { /* This can actually happen, if they free req! */ plugin_log(plugin, LOG_DBG, "JSON reply with unknown id '%.*s'", @@ -1119,7 +1115,7 @@ send_outreq(const struct out_req *req) * result to pass to either the error or the success * callback. */ trace_span_start("jsonrpc", req); - trace_span_tag(req, "id", req->id); + trace_span_tag(req, "id", req->idstr); trace_span_suspend_may_free(req); ld_rpc_send(req->cmd->plugin, req->js); @@ -1824,7 +1820,7 @@ struct plugin_timer *command_timer_(struct command *cmd, void *cb_arg) { return new_timer(cmd, cmd->plugin, - take(tal_fmt(NULL, "%s-timer", cmd->id)), + take(tal_fmt(NULL, "%s-timer", cmd->idstr)), t, cb, cb_arg); } @@ -1907,7 +1903,7 @@ struct json_stream *plugin_notify_start(struct command *cmd, const char *method) json_add_string(js, "method", method); json_object_start(js, "params"); - json_add_id(js, cmd->id); + json_add_string(js, "id", cmd->idstr); return js; } @@ -2067,7 +2063,7 @@ static void ld_command_handle(struct plugin *plugin, const char *buffer, const jsmntok_t *toks) { - const jsmntok_t *methtok, *paramstok, *filtertok; + const jsmntok_t *methtok, *paramstok, *filtertok, *idtok; const char *methodname; struct command *cmd; const char *id; @@ -2076,6 +2072,7 @@ static void ld_command_handle(struct plugin *plugin, methtok = json_get_member(buffer, toks, "method"); paramstok = json_get_member(buffer, toks, "params"); filtertok = json_get_member(buffer, toks, "filter"); + idtok = json_get_member(buffer, toks, "id"); if (!methtok || !paramstok) plugin_err(plugin, "Malformed JSON-RPC notification missing " @@ -2084,14 +2081,21 @@ static void ld_command_handle(struct plugin *plugin, json_tok_full(buffer, toks)); methodname = json_strdup(NULL, buffer, methtok); - id = json_get_id(tmpctx, buffer, toks); - if (!id) + if (!idtok) { type = COMMAND_TYPE_NOTIFICATION; - else if (streq(methodname, "check")) - type = COMMAND_TYPE_CHECK; - else - type = COMMAND_TYPE_NORMAL; + id = NULL; + } else { + if (idtok->type != JSMN_STRING) + plugin_err(plugin, "Malformed JSON-RPC id is not a string: %.*s", + json_tok_full_len(toks), + json_tok_full(buffer, toks)); + id = json_strdup(tmpctx, buffer, idtok); + if (streq(methodname, "check")) + type = COMMAND_TYPE_CHECK; + else + type = COMMAND_TYPE_NORMAL; + } cmd = new_command(plugin, plugin, id ? id : tal_fmt(tmpctx, "notification-%s", methodname), @@ -2662,7 +2666,7 @@ command_hook_success(struct command *cmd) struct command *aux_command(const struct command *cmd) { - return new_command(cmd->plugin, cmd->plugin, cmd->id, + return new_command(cmd->plugin, cmd->plugin, cmd->idstr, cmd->methodname, COMMAND_TYPE_AUX); } diff --git a/plugins/libplugin.h b/plugins/libplugin.h index 9134d2a28075..79bb423d5bf2 100644 --- a/plugins/libplugin.h +++ b/plugins/libplugin.h @@ -21,7 +21,7 @@ enum plugin_restartability { struct out_req { /* The unique id of this request. */ - const char *id; + const char *idstr; /* The command which is why we're calling this rpc. */ struct command *cmd; /* The method this is calling */ @@ -60,7 +60,7 @@ enum command_type { }; struct command { - const char *id; + const char *idstr; const char *methodname; enum command_type type; struct plugin *plugin; diff --git a/plugins/offers.c b/plugins/offers.c index 2e8d6ffd07b8..2cd0c97f1a87 100644 --- a/plugins/offers.c +++ b/plugins/offers.c @@ -1995,6 +1995,7 @@ int main(int argc, char *argv[]) od->disable_connect = false; od->dev_invoice_bpath_scid = false; od->dev_invoice_internal_scid = NULL; + od->dev_currency_expiry = 600; od->global_gossmap_ = NULL; /* We deal in UTC; mktime() uses local time */ @@ -2013,5 +2014,8 @@ int main(int argc, char *argv[]) plugin_option_dev("dev-invoice-internal-scid", "string", "Use short_channel_id instead of pubkey when creating a blinded payment path", scid_option, scid_jsonfmt, &od->dev_invoice_internal_scid), + plugin_option_dev_dynamic("dev-currency-expiry", "int", + "Max invoice expiry (seconds) for currency-denominated recurring offers", + u32_option, u32_jsonfmt, &od->dev_currency_expiry), NULL); } diff --git a/plugins/offers.h b/plugins/offers.h index 88f9ceb2df9c..4bc2af32cedc 100644 --- a/plugins/offers.h +++ b/plugins/offers.h @@ -29,6 +29,8 @@ struct offers_data { bool dev_invoice_bpath_scid; /* --dev-invoice-internal-scid */ struct short_channel_id *dev_invoice_internal_scid; + /* --dev-currency-expiry: max invoice expiry for currency offers (default 600) */ + u32 dev_currency_expiry; /* Use get_gossmap() to access this! */ struct gossmap *global_gossmap_; }; diff --git a/plugins/offers_invreq_hook.c b/plugins/offers_invreq_hook.c index f9672b0680a6..b6202d33eba1 100644 --- a/plugins/offers_invreq_hook.c +++ b/plugins/offers_invreq_hook.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -132,17 +133,22 @@ test_field(struct command *cmd, * number of seconds after `invoice_created_at` that payment for this period * will be accepted. */ -static void set_recurring_inv_expiry(struct tlv_invoice *inv, u64 last_pay) +static void set_recurring_inv_expiry(struct command *cmd, + struct tlv_invoice *inv, u64 last_pay) { + const struct offers_data *od = get_offers_data(cmd->plugin); + inv->invoice_relative_expiry = tal(inv, u32); - /* Don't give them a 0 second invoice, even if it's true. */ + /* Don't give them a 0 second invoice, even if it's true: that's how we mark cancellations! */ if (last_pay <= *inv->invoice_created_at) *inv->invoice_relative_expiry = 1; else *inv->invoice_relative_expiry = last_pay - *inv->invoice_created_at; - /* FIXME: Shorten expiry if we're doing currency conversion! */ + /* Shorten to dev_currency_expiry (default 10 minutes) for currency conversion. */ + if (inv->offer_currency && *inv->invoice_relative_expiry > od->dev_currency_expiry) + *inv->invoice_relative_expiry = od->dev_currency_expiry; } /* We rely on label forms for uniqueness. */ @@ -209,6 +215,19 @@ static struct command_result *createinvoice_done(struct command *cmd, return send_onion_reply(cmd, ir->reply_path, payload); } +static struct command_result *create_invoicereq(struct command *cmd, + struct invreq *ir); + +static struct command_result *delinvoice_done(struct command *cmd, + const char *method, + const char *buf, + const jsmntok_t *result, + struct invreq *ir) +{ + /* Old stale-rate invoice deleted; recreate with current rate. */ + return create_invoicereq(cmd, ir); +} + static struct command_result *createinvoice_error(struct command *cmd, const char *method, const char *buf, @@ -216,19 +235,43 @@ static struct command_result *createinvoice_error(struct command *cmd, struct invreq *ir) { u32 code; - const char *status; + const char *status, *invstring; /* If it already exists, we can reuse its bolt12 directly. */ if (json_scan(tmpctx, buf, err, - "{code:%,data:{status:%}}", + "{code:%,data:{status:%,bolt12:%}}", JSON_SCAN(json_to_u32, &code), - JSON_SCAN_TAL(tmpctx, json_strdup, &status)) == NULL + JSON_SCAN_TAL(tmpctx, json_strdup, &status), + JSON_SCAN_TAL(tmpctx, json_strdup, &invstring)) == NULL && code == INVOICE_LABEL_ALREADY_EXISTS) { if (streq(status, "unpaid")) return createinvoice_done(cmd, method, buf, json_get_member(buf, err, "data"), ir); - if (streq(status, "expired")) - return fail_invreq(cmd, ir, "invoice expired (cancelled?)"); + if (streq(status, "expired")) { + struct out_req *req; + const char *fail; + const struct tlv_invoice *inv; + + inv = invoice_decode(tmpctx, invstring, strlen(invstring), + plugin_feature_set(cmd->plugin), + chainparams, &fail); + /* 0 relative expiry means "they cancelled it" */ + if (inv && inv->invoice_relative_expiry && *inv->invoice_relative_expiry == 0) + return fail_invreq(cmd, ir, "invoice cancelled"); + + /* Happens when we shortened expiry for currency + * changes. Delete and retry */ + req = jsonrpc_request_start(cmd, "delinvoice", + delinvoice_done, + error, ir); + json_add_label(req->js, &ir->offer_id, + ir->inv->invreq_payer_id, + ir->inv->invreq_recurrence_counter + ? *ir->inv->invreq_recurrence_counter + : 0); + json_add_string(req->js, "status", "expired"); + return send_outreq(req); + } } return error(cmd, method, buf, err, ir); } @@ -238,9 +281,6 @@ static struct command_result *create_invoicereq(struct command *cmd, { struct out_req *req; - /* FIXME: We should add a real blinded path, and we *need to* - * if we don't have public channels! */ - /* Now, write invoice to db (returns the signed version) */ req = jsonrpc_request_start(cmd, "createinvoice", createinvoice_done, createinvoice_error, ir); @@ -506,7 +546,7 @@ static struct command_result *check_period(struct command *cmd, paywindow_end); } - set_recurring_inv_expiry(ir->inv, paywindow_end); + set_recurring_inv_expiry(cmd, ir->inv, paywindow_end); /* BOLT-recurrence #12: * @@ -705,6 +745,9 @@ static struct command_result *handle_amount_and_recurrence(struct command *cmd, struct invreq *ir, struct amount_msat base_inv_amount) { + const struct offers_data *od = get_offers_data(cmd->plugin); + u32 rel_expiry = BOLT12_DEFAULT_REL_EXPIRY; + /* BOLT #12: * - if `invreq_amount` is present: * - MUST reject the invoice request if `invreq_amount`.`msat` is less than the @@ -745,8 +788,29 @@ static struct command_result *handle_amount_and_recurrence(struct command *cmd, if (ir->inv->invreq_recurrence_counter) { return check_previous_invoice(cmd, ir); } - /* We're happy with 2 hours timeout (default): they can always - * request another. */ + + /* Don't allow invoices past expiry of offer. */ + if (ir->invreq->offer_absolute_expiry) { + u64 until = *ir->invreq->offer_absolute_expiry + - *ir->inv->invoice_created_at; + if (until < rel_expiry) + rel_expiry = until; + } + + /* And keep them short if currency conversion is involved */ + if (ir->invreq->offer_currency && od->dev_currency_expiry < rel_expiry) + rel_expiry = od->dev_currency_expiry; + + /* BOLT #12: + * + * - if the expiry for accepting payment is not 7200 seconds after + * `invoice_created_at`: + * - MUST set `invoice_relative_expiry`.`seconds_from_creation` to + * the number of seconds after `invoice_created_at` that payment + * of this invoice should not be attempted. + */ + if (rel_expiry != BOLT12_DEFAULT_REL_EXPIRY) + ir->inv->invoice_relative_expiry = tal_dup(ir->inv, u32, &rel_expiry); /* FIXME: Fallbacks? */ return add_blindedpaths(cmd, ir); diff --git a/plugins/offers_offer.c b/plugins/offers_offer.c index 59570e2608a6..0bd87ad726ba 100644 --- a/plugins/offers_offer.c +++ b/plugins/offers_offer.c @@ -13,87 +13,27 @@ #include #include -static bool msat_or_any(const char *buffer, - const jsmntok_t *tok, - struct tlv_offer *offer) -{ - struct amount_msat msat; - if (json_tok_streq(buffer, tok, "any")) - return true; - - if (!parse_amount_msat(&msat, - buffer + tok->start, tok->end - tok->start)) - return false; - - offer->offer_amount = tal_dup(offer, u64, - &msat.millisatoshis); /* Raw: other currencies */ - return true; -} - static struct command_result *param_amount(struct command *cmd, const char *name, const char *buffer, const jsmntok_t *tok, struct tlv_offer *offer) { + const char *err; const struct iso4217_name_and_divisor *isocode; - jsmntok_t number, whole, frac; - u64 cents; - - if (msat_or_any(buffer, tok, offer)) - return NULL; - offer->offer_amount = tal(offer, u64); - - /* BOLT #12: - * - * - MUST specify `offer_currency` `iso4217` as an ISO 4217 three-letter code. - * - MUST specify `offer_amount` in the currency unit adjusted by the ISO 4217 - * exponent (e.g. USD cents). - */ - if (tok->end - tok->start < ISO4217_NAMELEN) - return command_fail_badparam(cmd, name, buffer, tok, - "should be 'any', msatoshis or [.]"); - - isocode = find_iso4217(buffer + tok->end - ISO4217_NAMELEN, ISO4217_NAMELEN); - if (!isocode) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "Unknown currency suffix %.*s", - ISO4217_NAMELEN, - buffer + tok->end - ISO4217_NAMELEN); - - offer->offer_currency - = tal_dup_arr(offer, utf8, isocode->name, ISO4217_NAMELEN, 0); - - number = *tok; - number.end -= ISO4217_NAMELEN; - if (!split_tok(buffer, &number, '.', &whole, &frac)) { - whole = number; - cents = 0; - } else { - if (frac.end - frac.start != isocode->minor_unit) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "Currency %s requires %u minor units", - isocode->name, isocode->minor_unit); - if (!json_to_u64(buffer, &frac, ¢s)) - return command_fail_badparam(cmd, name, buffer, - &number, - "Bad minor units"); + err = parse_currency_amount(offer, + buffer + tok->start, + tok->end - tok->start, + &isocode, + &offer->offer_amount); + if (err) + return command_fail_badparam(cmd, name, buffer, tok, err); + + if (isocode) { + offer->offer_currency + = tal_dup_arr(offer, utf8, isocode->name, ISO4217_NAMELEN, 0); } - - if (!json_to_u64(buffer, &whole, offer->offer_amount)) - return command_fail_badparam(cmd, name, buffer, tok, - "should be 'any', msatoshis or [.]"); - - for (size_t i = 0; i < isocode->minor_unit; i++) { - if (mul_overflows_u64(*offer->offer_amount, 10)) - return command_fail_badparam(cmd, name, buffer, - &whole, - "excessively large value"); - *offer->offer_amount *= 10; - } - - *offer->offer_amount += cents; return NULL; } @@ -667,7 +607,7 @@ static struct command_result *call_createinvoicerequest(struct command *cmd, json_add_bool(req->js, "savetodb", true); json_add_bool(req->js, "single_use", single_use); if (label) - json_add_string(req->js, "recurrence_label", label); + json_add_string(req->js, "label", label); return send_outreq(req); } diff --git a/plugins/spender/multifundchannel.c b/plugins/spender/multifundchannel.c index c7223867c612..7c74bd137a47 100644 --- a/plugins/spender/multifundchannel.c +++ b/plugins/spender/multifundchannel.c @@ -1998,9 +1998,6 @@ json_multifundchannel(struct command *cmd, NULL)) return command_param_failed(); - /* Should exist; it would only nonexist if it were a notification. */ - assert(cmd->id); - mfc->id = ++mfc_id; mfc->cmd = cmd; diff --git a/plugins/spender/multiwithdraw.c b/plugins/spender/multiwithdraw.c index 7950d1d1c980..c647bf7c95a7 100644 --- a/plugins/spender/multiwithdraw.c +++ b/plugins/spender/multiwithdraw.c @@ -17,6 +17,9 @@ Command Access -----------------------------------------------------------------------------*/ +/* Global counter to create unique md->id values */ +static u64 mw_id; + static struct command_result * json_multiwithdraw(struct command *cmd, const char *buf, @@ -173,8 +176,7 @@ json_multiwithdraw(struct command *cmd, return command_param_failed(); mw->cmd = cmd; - assert(cmd->id); - mw->id = *cmd->id; + mw->id = mw_id++; mw->psbt = NULL; if (!mw->feerate) diff --git a/plugins/test/run-decode_guess_type.c b/plugins/test/run-decode_guess_type.c index 038f3124f440..bbd1629f4922 100644 --- a/plugins/test/run-decode_guess_type.c +++ b/plugins/test/run-decode_guess_type.c @@ -220,6 +220,13 @@ void rpc_scan(struct command *cmd UNNEEDED, /* Generated stub for send_outreq */ struct command_result *send_outreq(const struct out_req *req UNNEEDED) { fprintf(stderr, "send_outreq called!\n"); abort(); } +/* Generated stub for u32_jsonfmt */ +bool u32_jsonfmt(struct command *cmd UNNEEDED, struct json_stream *js UNNEEDED, const char *fieldname UNNEEDED, + u32 *i UNNEEDED) +{ fprintf(stderr, "u32_jsonfmt called!\n"); abort(); } +/* Generated stub for u32_option */ +char *u32_option(struct command *cmd UNNEEDED, const char *arg UNNEEDED, bool check_only UNNEEDED, u32 *i UNNEEDED) +{ fprintf(stderr, "u32_option called!\n"); abort(); } /* AUTOGENERATED MOCKS END */ struct likely_test { diff --git a/plugins/xpay/xpay.c b/plugins/xpay/xpay.c index 6a0ff3093876..0ef1b3b52494 100644 --- a/plugins/xpay/xpay.c +++ b/plugins/xpay/xpay.c @@ -1313,6 +1313,25 @@ static struct command_result *injectpaymentonion_succeeded(struct command *aux_c plugin_err(aux_cmd->plugin, "Invalid injectpaymentonion result '%.*s'", json_tok_full_len(result), json_tok_full(buf, result)); + /* We don't tell it about payment success for the local channel, since + * auto.localchans is exact: adding an offset would make it worse! */ + for (size_t i = 1; i < tal_count(attempt->hops); i++) { + struct out_req *req; + req = payment_ignored_req(aux_cmd, attempt, "askrene-inform-channel"); + /* Put what we learned in xpay, unless it's a fake channel */ + json_add_string(req->js, "layer", + attempt->hops[i].fake_channel + ? attempt->payment->private_layer + : "xpay"); + json_add_short_channel_id_dir(req->js, + "short_channel_id_dir", + attempt->hops[i].scidd); + json_add_amount_msat(req->js, "amount_msat", + attempt->hops[i].amount_out); + json_add_string(req->js, "inform", "succeeded"); + send_payment_req(aux_cmd, attempt->payment, req); + } + outgoing_notify_success(attempt); /* Move from current_attempts to past_attempts */ diff --git a/tests/plugins/block_added.py b/tests/plugins/block_added.py deleted file mode 100755 index 9da46587e087..000000000000 --- a/tests/plugins/block_added.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 - -from pyln.client import Plugin - - -plugin = Plugin() - -blocks_catched = [] - - -@plugin.subscribe("block_added") -def notify_block_added(plugin, block_added, **kwargs): - blocks_catched.append(block_added["height"]) - - -@plugin.method("blockscatched") -def return_moves(plugin): - return blocks_catched - - -plugin.run() diff --git a/tests/plugins/currencyUSDAUD5000.py b/tests/plugins/currencyUSDAUD5000.py index 3a2f99e9aa80..ba0de479073c 100755 --- a/tests/plugins/currencyUSDAUD5000.py +++ b/tests/plugins/currencyUSDAUD5000.py @@ -5,14 +5,23 @@ from pyln.client import Plugin, Millisatoshi plugin = Plugin() +_rate = 5000 # msat per unit @plugin.method("currencyconvert") def currencyconvert(plugin, amount, currency): """Converts currency using given APIs.""" if currency in ('USD', 'AUD'): - return {"msat": Millisatoshi(round(amount * 5000))} + return {"msat": Millisatoshi(round(amount * _rate))} raise Exception("No values available for currency {}".format(currency.upper())) +@plugin.method("setcurrencyrate") +def setcurrencyrate(plugin, msat_per_unit): + """Change the msat-per-unit rate (for testing).""" + global _rate + _rate = msat_per_unit + return {"msat_per_unit": _rate} + + plugin.run() diff --git a/tests/plugins/custom_notifications.py b/tests/plugins/custom_notifications.py deleted file mode 100755 index 1a3d92f18fc7..000000000000 --- a/tests/plugins/custom_notifications.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 -from pyln.client import Plugin - - -plugin = Plugin() - - -@plugin.subscribe("custom") -def on_custom_notification(origin, message, **kwargs): - plugin.log("Got a custom notification {} from plugin {}".format(message, origin)) - - -@plugin.method("emit") -def emit(plugin): - """Emit a simple string notification to topic "custom" - """ - plugin.notify("custom", {'message': "Hello world"}) - - -@plugin.method("faulty-emit") -def faulty_emit(plugin): - """Emit a simple string notification to topic "custom" - """ - plugin.notify("ididntannouncethis", {'message': "Hello world"}) - - -@plugin.subscribe("pay_success") -def on_pay_success(origin, pay_success, **kwargs): - plugin.log( - "Got a pay_success notification from plugin {} for payment_hash {}".format( - origin, - pay_success['payment_hash'] - ) - ) - - -@plugin.subscribe("pay_part_start") -def on_pay_part_start(origin, **kwargs): - plugin.log("Got pay_part_start: {}".format(kwargs)) - - -@plugin.subscribe("pay_part_end") -def on_pay_part_end(origin, **kwargs): - plugin.log("Got pay_part_end: {}".format(kwargs)) - - -@plugin.subscribe("ididntannouncethis") -def on_faulty_emit(origin, payload, **kwargs): - """We should never receive this as it gets dropped. - """ - plugin.log("Got the ididntannouncethis event") - - -plugin.add_notification_topic("custom") -plugin.run() diff --git a/tests/plugins/fail_htlcs_invalid.py b/tests/plugins/fail_htlcs_invalid.py deleted file mode 100755 index 95881d8b756d..000000000000 --- a/tests/plugins/fail_htlcs_invalid.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python3 - -from pyln.client import Plugin - -plugin = Plugin() - - -@plugin.hook("htlc_accepted") -def on_htlc_accepted(onion, plugin, **kwargs): - plugin.log("Failing htlc on purpose with invalid onion failure") - plugin.log("onion: %r" % (onion)) - # WIRE_TEMPORARY_CHANNEL_FAILURE = 0x1007 - # This failure code should be followed by a - # `channel_update`; we deliberately return - # a 0-length `channel_update` to trigger - # issue #3757 reported by @sumBTC. - return {"result": "fail", "failure_message": "10070000"} - - -plugin.run() diff --git a/tests/plugins/multiline-help.py b/tests/plugins/multiline-help.py deleted file mode 100755 index 4b8b3a7f87f4..000000000000 --- a/tests/plugins/multiline-help.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python3 -from pyln.client import Plugin, Millisatoshi - - -plugin = Plugin() - - -@plugin.method("helpme") -def helpme(plugin, msat: Millisatoshi): - """This is a message which consumes multiple lines and thus should - be well-formatted by lightning-cli help - - """ - return {'help': msat} - - -plugin.run() diff --git a/tests/plugins/onionmessage_forward_fail_notification.py b/tests/plugins/onionmessage_forward_fail_notification.py deleted file mode 100755 index 69606e2334e2..000000000000 --- a/tests/plugins/onionmessage_forward_fail_notification.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python3 - -""" We get an onionmessage_forward_fail notification, and open a connection -""" -from pyln.client import Plugin - -plugin = Plugin() - - -@plugin.subscribe("onionmessage_forward_fail") -def on_onionmessage_forward_fail(onionmessage_forward_fail, **kwargs): - plugin.log(f"Received onionmessage_forward_fail {onionmessage_forward_fail}") - - plugin.rpc.connect(onionmessage_forward_fail['next_node_id']) - # injectonionmessage expects to unwrap, so hand it *incoming* - plugin.rpc.injectonionmessage(onionmessage_forward_fail['path_key'], - onionmessage_forward_fail['incoming']) - - -plugin.run() diff --git a/tests/plugins/openchannel_hook_delay.py b/tests/plugins/openchannel_hook_delay.py deleted file mode 100755 index 09ec2abdc335..000000000000 --- a/tests/plugins/openchannel_hook_delay.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 -"""Plugin to test openchannel_hook - -Will simply accept any channel. Useful fot testing chained hook. -""" - -from pyln.client import Plugin -import time - -plugin = Plugin() - - -@plugin.hook('openchannel') -def on_openchannel(openchannel, plugin, **kwargs): - delaytime = float(plugin.get_option('delaytime')) - msg = f'delaying WIRE_ACCEPT_CHANNEL for {delaytime}s' - plugin.log(msg) - time.sleep(delaytime) - return {'result': 'continue'} - - -@plugin.hook('openchannel2') -def on_openchannel2(openchannel2, plugin, **kwargs): - delaytime = float(plugin.get_option('delaytime')) - msg = f'delaying WIRE_ACCEPT_CHANNEL for {delaytime}s' - plugin.log(msg) - time.sleep(delaytime) - return {'result': 'continue'} - - -plugin.add_option('delaytime', '10', 'How long to hold the WIRE_OPEN_CHANNEL.') -plugin.run() diff --git a/tests/plugins/pretend_badlog.py b/tests/plugins/pretend_badlog.py deleted file mode 100755 index a255fe11874b..000000000000 --- a/tests/plugins/pretend_badlog.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 -"""This plugin is used to check that warning(unusual/broken level log) calls are working correctly. -""" -from pyln.client import Plugin - -plugin = Plugin() - - -@plugin.init() -def init(configuration, options, plugin): - plugin.log("initialized") - - -@plugin.subscribe("warning") -def notify_warning(plugin, warning, **kwargs): - plugin.log("Received warning") - plugin.log("level: {}".format(warning['level'])) - plugin.log("time: {}".format(warning['time'])) - plugin.log("source: {}".format(warning['source'])) - plugin.log("log: {}".format(warning['log'])) - - -@plugin.method("pretendbad") -def pretend_bad(event, level, plugin): - """Log an specified level entry. - And in plugin, we use 'warn'/'error' instead of - 'unusual'/'broken' - """ - plugin.log("{}".format(event), level) - - -plugin.run() diff --git a/tests/plugins/print_htlc_onion.py b/tests/plugins/print_htlc_onion.py deleted file mode 100755 index f1557dd20190..000000000000 --- a/tests/plugins/print_htlc_onion.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python3 -"""Plugin that prints out HTLC onions. - -We use this to check whether they're TLV or not - -""" - -from pyln.client import Plugin - -plugin = Plugin() - - -@plugin.hook("htlc_accepted") -def on_htlc_accepted(htlc, onion, plugin, **kwargs): - plugin.log("Got onion {}".format(onion)) - return {'result': 'continue'} - - -plugin.run() diff --git a/tests/plugins/reject_odd_funding_amounts.py b/tests/plugins/reject_odd_funding_amounts.py deleted file mode 100755 index fc4d67a338b6..000000000000 --- a/tests/plugins/reject_odd_funding_amounts.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python3 -"""Simple plugin to test the openchannel_hook. - -We just refuse to let them open channels with an odd amount of millisatoshis. -""" - -from pyln.client import Plugin, Millisatoshi - -plugin = Plugin() - - -def run_check(funding_amt_str): - if Millisatoshi(funding_amt_str).to_satoshi() % 2 == 1: - return {'result': 'reject', 'error_message': "I don't like odd amounts"} - - return {'result': 'continue'} - - -@plugin.hook('openchannel') -def on_openchannel(openchannel, plugin, **kwargs): - print("{} VARS".format(len(openchannel.keys()))) - for k in sorted(openchannel.keys()): - print("{}={}".format(k, openchannel[k])) - return run_check(openchannel['funding_msat']) - - -@plugin.hook('openchannel2') -def on_openchannel2(openchannel2, plugin, **kwargs): - print("{} VARS".format(len(openchannel2.keys()))) - for k in sorted(openchannel2.keys()): - print("{}={}".format(k, openchannel2[k])) - - return run_check(openchannel2['their_funding_msat']) - - -plugin.run() diff --git a/tests/plugins/reject_some_invoices.py b/tests/plugins/reject_some_invoices.py deleted file mode 100755 index 321e4e7a2d52..000000000000 --- a/tests/plugins/reject_some_invoices.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env python3 -"""Simple plugin to test the invoice_payment_hook. - -We just refuse to let them pay invoices with preimages divisible by 16. -""" - -from pyln.client import Plugin - -plugin = Plugin() - - -@plugin.hook('invoice_payment') -def on_payment(payment, plugin, **kwargs): - print("label={}".format(payment['label'])) - print("msat={}".format(payment['msat'])) - print("preimage={}".format(payment['preimage'])) - - if payment['preimage'].endswith('0'): - # WIRE_TEMPORARY_NODE_FAILURE = 0x2002 - return {'failure_message': "2002"} - - return {'result': 'continue'} - - -plugin.run() diff --git a/tests/plugins/sendpay_notifications.py b/tests/plugins/sendpay_notifications.py deleted file mode 100755 index 0f83290d24a5..000000000000 --- a/tests/plugins/sendpay_notifications.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -"""This plugin is used to check that sendpay_success and sendpay_failure calls are working correctly. -""" -from pyln.client import Plugin - -plugin = Plugin() - - -@plugin.init() -def init(configuration, options, plugin): - plugin.success_list = [] - plugin.failure_list = [] - - -@plugin.subscribe("sendpay_success") -def notify_sendpay_success(plugin, sendpay_success): - plugin.log("Received a sendpay_success: id={}, payment_hash={}".format(sendpay_success['id'], sendpay_success['payment_hash'])) - plugin.success_list.append(sendpay_success) - - -@plugin.subscribe("sendpay_failure") -def notify_sendpay_failure(plugin, sendpay_failure): - plugin.log("Received a sendpay_failure: id={}, payment_hash={}".format(sendpay_failure['data']['id'], - sendpay_failure['data']['payment_hash'])) - plugin.failure_list.append(sendpay_failure) - - -@plugin.method('listsendpays_plugin') -def record_lookup(plugin): - return {'sendpay_success': plugin.success_list, - 'sendpay_failure': plugin.failure_list} - - -plugin.run() diff --git a/tests/plugins/shortcircuit.py b/tests/plugins/shortcircuit.py deleted file mode 100755 index bdb088c15c58..000000000000 --- a/tests/plugins/shortcircuit.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python3 - -from pyln.client import Plugin - -plugin = Plugin() - - -@plugin.hook("htlc_accepted") -def on_htlc_accepted(onion, htlc, plugin, **kwargs): - return {"result": "resolve", "payment_key": "00" * 32} - - -plugin.run() diff --git a/tests/plugins/utf8.py b/tests/plugins/utf8.py deleted file mode 100755 index 16c3afe45083..000000000000 --- a/tests/plugins/utf8.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 -from pyln.client import Plugin - - -plugin = Plugin() - - -@plugin.method("utf8") -def echo(plugin, utf8): - assert '\\u' not in utf8 - return {'utf8': utf8} - - -plugin.run() diff --git a/tests/plugins/validatejson.py b/tests/plugins/validatejson.py deleted file mode 100755 index 8c32d4da6398..000000000000 --- a/tests/plugins/validatejson.py +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env python3 -from pyln.client import Plugin - -plugin = Plugin() - - -@plugin.method('validate-json-rpc') -def validate_json_rpc(plugin, *args, **kwargs): - return {} - - -plugin.run() diff --git a/tests/test_askrene.py b/tests/test_askrene.py index 9fbc9e708672..25f3e9ac0e6f 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 [-/#:a-zA-Z0-9]* \([0-9]* seconds ago\), 10000000*msat by command [-/#:a-zA-Z0-9]* \([0-9]* seconds ago\)'): l1.rpc.getroutes(source=l1.info['id'], destination=l3.info['id'], amount_msat=1000000, @@ -144,6 +144,7 @@ def test_layers(node_factory): 'created_channels': [], 'channel_updates': [], 'constraints': [], + 'impressions': [], 'biases': [], 'node_biases': []} l2.rpc.askrene_create_layer('test_layers') @@ -272,6 +273,29 @@ def test_layers(node_factory): listlayers = l2.rpc.askrene_listlayers('test_layers') assert listlayers == {'layers': [expect]} + # Test succeeded inform creates an impression (not a constraint). + first_timestamp = int(time.time()) + r = l2.rpc.askrene_inform_channel('test_layers', scid12dir, 50000, 'succeeded') + last_timestamp = int(time.time()) + 1 + assert r['constraints'] == [] + assert len(r['impressions']) == 1 + assert r['impressions'][0]['amount_msat'] == 50000 + + listlayers = l2.rpc.askrene_listlayers('test_layers') + ts_imp = only_one(only_one(listlayers['layers'])['impressions'])['timestamp'] + assert first_timestamp <= ts_imp <= last_timestamp + expect['impressions'] = [{'short_channel_id_dir': scid12dir, + 'timestamp': ts_imp, + 'amount_msat': 50000}] + assert listlayers == {'layers': [expect]} + + # Impression aging: ts_imp does nothing. + assert l2.rpc.askrene_age('test_layers', ts_imp) == {'layer': 'test_layers', 'num_removed': 0} + # ts_imp+1 removes it. + assert l2.rpc.askrene_age('test_layers', ts_imp + 1) == {'layer': 'test_layers', 'num_removed': 1} + expect['impressions'] = [] + assert l2.rpc.askrene_listlayers('test_layers') == {'layers': [expect]} + with pytest.raises(RpcError, match="Unknown layer"): l2.rpc.askrene_remove_layer('test_layers_unknown') @@ -347,6 +371,7 @@ def test_node_bias_rpc(node_factory): "created_channels": [], "channel_updates": [], "constraints": [], + "impressions": [], "biases": [], "node_biases": [], } @@ -455,6 +480,7 @@ def test_node_bias_persistence(node_factory): "created_channels": [], "channel_updates": [], "constraints": [], + "impressions": [], "biases": [], "node_biases": [], } @@ -579,6 +605,7 @@ def test_layer_persistence(node_factory): 'created_channels': [], 'channel_updates': [], 'constraints': [], + 'impressions': [], 'biases': [], 'node_biases': []} assert l1.rpc.askrene_listlayers('test_layer_persistence') == {'layers': [expect]} @@ -620,6 +647,10 @@ def test_layer_persistence(node_factory): short_channel_id_dir=scid12dir, amount_msat=12341235, inform='constrained') + l1.rpc.askrene_inform_channel(layer='test_layer_persistence', + short_channel_id_dir=scid12dir, + amount_msat=50000, + inform='succeeded') expect = l1.rpc.askrene_listlayers('test_layer_persistence') @@ -2667,3 +2698,120 @@ def test_impossible_payment(node_factory): final_cltv=5, maxparts=1, ) + + +def test_explain_source_dest_failures(node_factory, bitcoind): + """askrene should give intelligent failure reasons when source or destination don't have + capacity""" + # l1 --100k--> l2 --200k--> l3 + # | + # 50k + # v + # l4 + l1, l2, l3, l4 = node_factory.get_nodes(4) + node_factory.join_nodes([l1, l2], fundamount=100000) + node_factory.join_nodes([l2, l3], fundamount=200000) + node_factory.join_nodes([l2, l4], fundamount=50000) + + # Make sure everyone knows everything + bitcoind.generate_block(5) + wait_for(lambda: all([len(n.rpc.listchannels()['channels']) == 6 for n in [l1, l2, l3, l4]])) + + # We can't afford this + with pytest.raises(RpcError, + match=r"We could not find a usable set of paths. Total source capacity is only 100000000msat \(in 1 channels\)"): + l1.rpc.getroutes(source=l1.info['id'], + destination=l3.info['id'], + amount_msat='100001sat', + layers=['auto.localchans', 'auto.sourcefree'], + maxfee_msat=10000, + final_cltv=5) + + # They can't afford this + with pytest.raises(RpcError, + match=r"We could not find a usable set of paths. Total destination capacity is only 50000000msat \(in 1 channels\)"): + l1.rpc.getroutes(source=l1.info['id'], + destination=l4.info['id'], + amount_msat='50001sat', + layers=['auto.localchans', 'auto.sourcefree'], + maxfee_msat=10000, + final_cltv=5) + + # Add some information, and we should know that too. + l1.rpc.xpay(l4.rpc.invoice('30000sat', 'test_explain_simple_failures2', 'test_explain_simple_failures2')['bolt11']) + + # This is actually just auto.localchans knowing the capacity! + with pytest.raises(RpcError, + match=r"We could not find a usable set of paths. We know from auto.localchans that source has maximum capacity [0-9]*msat \(in 1 channels\)") as err: + l1.rpc.getroutes(source=l1.info['id'], + destination=l3.info['id'], + amount_msat='80001sat', + layers=['auto.localchans', 'auto.sourcefree', 'xpay'], + maxfee_msat=10000, + final_cltv=5) + PAY_INSUFFICIENT_FUNDS = 215 + assert err.value.error['code'] == PAY_INSUFFICIENT_FUNDS + + # This is the impression in the xpay layer telling us 30,000sat is already gone (of 50,000). + with pytest.raises(RpcError, + match=r"We could not find a usable set of paths. We know from xpay that destination has maximum capacity [0-9]*msat \(in 1 channels\)") as err: + l1.rpc.getroutes(source=l1.info['id'], + destination=l4.info['id'], + amount_msat='20001sat', + layers=['auto.localchans', 'auto.sourcefree', 'xpay'], + maxfee_msat=10000, + final_cltv=5) + + PAY_DESTINATION_INSUFFICIENT_CAPACITY = 220 + assert err.value.error['code'] == PAY_DESTINATION_INSUFFICIENT_CAPACITY + + +def test_constraint_impression_ordering(node_factory): + """Constraints and impressions must be applied in timestamp order. + + An impression at T1 (older) followed by a constraint at T2 (newer) means + the constraint supersedes the impression: the impression is applied on the + unconstrained capacity and the constraint then clamps the result. A + constraint at T1 followed by an impression at T2 means the impression + reduces the constrained capacity. + """ + # Single channel 0->1 with 1000 sat capacity + cap_msat = 1_000_000 + gsfile, nodemap = generate_gossip_store([GenChannel(0, 1, capacity_sats=cap_msat // 1000)]) + l1 = node_factory.get_node(gossip_store_file=gsfile.name, opts={'disable-plugin': 'cln-xpay'}) + + chan_dir = scid_dir(nodemap, 0, 1, 0) + + # --- Case 1: impression (T1, older) then tighter constraint (T2, newer) --- + # Impression says 300k was sent. Constraint says max is 600k (newer info). + # Correct ordering: impression applied to unconstrained ∞, then constraint + # clamps to 600k. Routing 400k should succeed. + l1.rpc.askrene_create_layer('test_ordering') + l1.rpc.askrene_inform_channel('test_ordering', chan_dir, 300_000, 'succeeded') + time.sleep(2) + l1.rpc.askrene_inform_channel('test_ordering', chan_dir, 600_001, 'constrained') + + # Should succeed: effective max is 600k (constraint is newer, wins over impression) + routes = l1.rpc.getroutes(source=nodemap[0], destination=nodemap[1], + amount_msat=400_000, layers=['test_ordering'], + maxfee_msat=100_000, final_cltv=5) + assert routes['probability_ppm'] > 0 + + l1.rpc.askrene_remove_layer('test_ordering') + + # --- Case 2: tighter constraint (T3, older) then impression (T4, newer) --- + # Constraint says max is 600k. Impression says 300k was sent after that. + # Correct ordering: constraint applied first (max=600k), impression then + # reduces it to 300k. Routing 400k should fail. + l1.rpc.askrene_create_layer('test_ordering') + l1.rpc.askrene_inform_channel('test_ordering', chan_dir, 600_001, 'constrained') + time.sleep(2) + l1.rpc.askrene_inform_channel('test_ordering', chan_dir, 300_000, 'succeeded') + + # Should fail: effective max is 300k (impression is newer, reduces constrained capacity) + with pytest.raises(RpcError, match=r"We could not find a usable set of paths"): + l1.rpc.getroutes(source=nodemap[0], destination=nodemap[1], + amount_msat=400_000, layers=['test_ordering'], + maxfee_msat=100_000, final_cltv=5) + + l1.rpc.askrene_remove_layer('test_ordering') diff --git a/tests/test_connection.py b/tests/test_connection.py index 19135be79167..b65b5956efd2 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -257,8 +257,7 @@ def test_connect_standard_addr(node_factory): def test_reconnect_channel_peers(node_factory, executor): - l1 = node_factory.get_node(may_reconnect=True) - l2 = node_factory.get_node(may_reconnect=True) + l1, l2 = node_factory.get_nodes(2, {'may_reconnect': True}) l1.rpc.connect(l2.info['id'], 'localhost', l2.port) l1.fundchannel(l2, 10**6) @@ -1202,8 +1201,7 @@ def test_funding_push(node_factory, bitcoind, chainparams): # We track balances, to verify that accounting is ok. coin_mvt_plugin = os.path.join(os.getcwd(), 'tests/plugins/coin_movements.py') - l1 = node_factory.get_node(options={'plugin': coin_mvt_plugin}) - l2 = node_factory.get_node(options={'plugin': coin_mvt_plugin}) + l1, l2 = node_factory.get_nodes(2, {'plugin': coin_mvt_plugin}) l1.rpc.connect(l2.info['id'], 'localhost', l2.port) @@ -2677,8 +2675,7 @@ def test_update_fee_reconnect(node_factory, bitcoind): def test_multiple_channels(node_factory): - l1 = node_factory.get_node() - l2 = node_factory.get_node() + l1, l2 = node_factory.get_nodes(2) ret = l1.rpc.connect(l2.info['id'], 'localhost', l2.port) assert ret['id'] == l2.info['id'] @@ -2705,8 +2702,7 @@ def test_multiple_channels(node_factory): @pytest.mark.openchannel('v1') @pytest.mark.openchannel('v2') def test_forget_channel(node_factory): - l1 = node_factory.get_node() - l2 = node_factory.get_node() + l1, l2 = node_factory.get_nodes(2) l1.fundwallet(10**6) l1.rpc.connect(l2.info['id'], 'localhost', l2.port) l1.rpc.fundchannel(l2.info['id'], 10**5) @@ -4597,16 +4593,24 @@ def test_connect_ratelimit(node_factory, bitcoind): def test_onionmessage_forward_fail(node_factory, bitcoind): # The plugin will try to connect to l3, so it needs an advertized address. - l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, - opts=[{}, - {'dev-allow-localhost': None, - 'may_reconnect': True, - 'dev-no-reconnect': None, - 'plugin': os.path.join(os.getcwd(), 'tests/plugins/onionmessage_forward_fail_notification.py'), - }, - {'dev-allow-localhost': None, - 'dev-no-reconnect': None, - 'may_reconnect': True}]) + def setup(plugin): + @plugin.subscribe("onionmessage_forward_fail") + def on_onionmessage_forward_fail(onionmessage_forward_fail, **kwargs): + plugin.log(f"Received onionmessage_forward_fail {onionmessage_forward_fail}") + plugin.rpc.connect(onionmessage_forward_fail['next_node_id']) + # injectonionmessage expects to unwrap, so hand it *incoming* + plugin.rpc.injectonionmessage(onionmessage_forward_fail['path_key'], + onionmessage_forward_fail['incoming']) + + l1 = node_factory.get_node() + l2 = node_factory.get_node(inline_plugin=setup, + options={'dev-allow-localhost': None, + 'dev-no-reconnect': None}, + may_reconnect=True) + l3 = node_factory.get_node(options={'dev-allow-localhost': None, + 'dev-no-reconnect': None}, + may_reconnect=True) + node_factory.join_nodes([l1, l2, l3], wait_for_announce=True) offer = l3.rpc.offer(300, "test_onionmessage_forward_fail") l2.rpc.disconnect(l3.info['id'], force=True) @@ -4614,7 +4618,7 @@ def test_onionmessage_forward_fail(node_factory, bitcoind): # The plugin in l2 fixes up the connection, so this works! l1.rpc.fetchinvoice(offer['bolt12']) - l2.daemon.is_in_log('plugin-onionmessage_forward_fail_notification.py: Received onionmessage_forward_fail') + l2.daemon.is_in_log('plugin-inline-plugin.py: Received onionmessage_forward_fail') def test_private_channel_no_reconnect(node_factory): diff --git a/tests/test_invoices.py b/tests/test_invoices.py index 92077b65ea81..f85c3023b3cf 100644 --- a/tests/test_invoices.py +++ b/tests/test_invoices.py @@ -21,7 +21,7 @@ def test_invoice(node_factory, chainparams): # Side note: invoice calls out to listincoming, so check JSON id is as expected myname = os.path.splitext(os.path.basename(sys.argv[0]))[0] - l1.daemon.wait_for_log(r': "{}:invoice#[0-9]*/cln:listincoming#[0-9]*"\[OUT\]'.format(myname)) + l1.daemon.wait_for_log(r': {}:invoice#[0-9]*/cln:listincoming#[0-9]*\[OUT\]'.format(myname)) after = int(time.time()) b11 = l1.rpc.decode(inv['bolt11']) diff --git a/tests/test_misc.py b/tests/test_misc.py index 4154ad6eba7f..16d249ead3dd 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -999,12 +999,12 @@ def test_malformed_rpc(node_factory): def test_valid_json_cli(node_factory): """Make sure lightning-cli passes valid json values, so that rust and python plugins don't crash.""" - l1 = node_factory.get_node( - options={ - "log-level": "io", - "plugin": os.path.join(os.getcwd(), "tests/plugins/validatejson.py"), - } - ) + def setup(plugin): + @plugin.method('validate-json-rpc') + def validate_json_rpc(plugin, *args, **kwargs): + return {} + + l1 = node_factory.get_node(options={"log-level": "io"}, inline_plugin=setup) # If passed as a literal number rust's serde_json::from_str will fail as the # leading zero makes it invalid for an integer. nodeid = "030000000000000000000000000000000000000000000000000000000000000001" @@ -1203,7 +1203,18 @@ def test_cli(node_factory): def test_cli_multiline_help(node_factory): - l1 = node_factory.get_node(options={'plugin': os.path.join(os.getcwd(), 'tests/plugins/multiline-help.py')}) + def setup(plugin): + from pyln.client import Millisatoshi + + @plugin.method("helpme") + def helpme(plugin, msat: Millisatoshi): + """This is a message which consumes multiple lines and thus should + be well-formatted by lightning-cli help + + """ + return {'help': msat} + + l1 = node_factory.get_node(inline_plugin=setup) out = subprocess.check_output(['cli/lightning-cli', '--network={}'.format(TEST_NETWORK), @@ -1235,7 +1246,8 @@ def test_cli_commando(node_factory): '--network={}'.format(TEST_NETWORK), '--lightning-dir={}' .format(l1.daemon.lightning_dir), - 'help']) + 'help'], + timeout=TIMEOUT) assert val.returncode == 3 # Valid peer id, but needs rune! @@ -1244,7 +1256,8 @@ def test_cli_commando(node_factory): '--network={}'.format(TEST_NETWORK), '--lightning-dir={}' .format(l1.daemon.lightning_dir), - 'help']) + 'help'], + timeout=TIMEOUT) assert val.returncode == 1 # This works! @@ -1253,7 +1266,8 @@ def test_cli_commando(node_factory): '--network={}'.format(TEST_NETWORK), '--lightning-dir={}' .format(l1.daemon.lightning_dir), - 'help']).decode('utf-8') + 'help'], + timeout=TIMEOUT).decode('utf-8') # Test some known output. assert 'addgossip message\n\naddoutpointwatch' in out @@ -1270,7 +1284,8 @@ def test_cli_commando(node_factory): '--lightning-dir={}' .format(l1.daemon.lightning_dir), '-J', '-k', - 'help', 'command=help']).decode('utf-8') + 'help', 'command=help'], + timeout=TIMEOUT).decode('utf-8') j, _ = json.JSONDecoder().raw_decode(out) assert 'help [command]' in j['help'][0]['command'] @@ -1281,7 +1296,8 @@ def test_cli_commando(node_factory): '--lightning-dir={}' .format(l1.daemon.lightning_dir), '-J', '-o', - 'help', 'help']).decode('utf-8') + 'help', 'help'], + timeout=TIMEOUT).decode('utf-8') j, _ = json.JSONDecoder().raw_decode(out) assert 'help [command]' in j['help'][0]['command'] @@ -1292,7 +1308,8 @@ def test_cli_commando(node_factory): '--lightning-dir={}' .format(l1.daemon.lightning_dir), '-J', '--filter={"help":[{"command":true}]}', - 'help', 'help']).decode('utf-8') + 'help', 'help'], + timeout=TIMEOUT).decode('utf-8') j, _ = json.JSONDecoder().raw_decode(out) assert j == {'help': [{'command': 'help [command]'}]} @@ -1306,7 +1323,8 @@ def test_cli_commando(node_factory): '--lightning-dir={}' .format(l1.daemon.lightning_dir), '-J', '-o', - 'sendpay']).decode('utf-8') + 'sendpay'], + timeout=TIMEOUT).decode('utf-8') except Exception: pass @@ -1318,7 +1336,8 @@ def test_cli_commando(node_factory): '--lightning-dir={}' .format(l1.daemon.lightning_dir), 'x"[]{}'], - stdout=subprocess.PIPE) + stdout=subprocess.PIPE, + timeout=TIMEOUT) assert 'Unknown command' in out.stdout.decode('utf-8') subprocess.check_output(['cli/lightning-cli', @@ -1326,7 +1345,8 @@ def test_cli_commando(node_factory): '--network={}'.format(TEST_NETWORK), '--lightning-dir={}' .format(l1.daemon.lightning_dir), - 'invoice', '123000', 'l"[]{}', 'd"[]{}']).decode('utf-8') + 'invoice', '123000', 'l"[]{}', 'd"[]{}'], + timeout=TIMEOUT).decode('utf-8') # Check label is correct, and also that cli's keyword parsing works. out = subprocess.check_output(['cli/lightning-cli', '--commando={}:{}'.format(l2.info['id'], rune), @@ -1334,7 +1354,8 @@ def test_cli_commando(node_factory): '--lightning-dir={}' .format(l1.daemon.lightning_dir), '-k', - 'listinvoices', 'label=l"[]{}']).decode('utf-8') + 'listinvoices', 'label=l"[]{}'], + timeout=TIMEOUT).decode('utf-8') j = json.loads(out) assert only_one(j['invoices'])['label'] == 'l"[]{}' @@ -1431,15 +1452,40 @@ def test_funding_reorg_private(node_factory, bitcoind): """ # Rescan to detect reorg at restart and may_reconnect so channeld # will restart. Reorg can cause bad gossip msg. - opts = {'funding-confirms': 2, 'rescan': 10, 'may_reconnect': True, - 'allow_bad_gossip': True, - # gossipd send lightning update for original channel. - 'allow_warning': True, - 'dev-fast-reconnect': None, - # if it's not zeroconf, we'll terminate on reorg. - 'plugin': os.path.join(os.getcwd(), 'tests/plugins/zeroconf-selective.py'), - 'zeroconf_allow': 'any'} - l1, l2 = node_factory.line_graph(2, fundchannel=False, opts=opts) + def setup(plugin): + plugin.add_option( + 'zeroconf_allow', + '03864ef025fde8fb587d989186ce6a4a186895ee44a926bfc370e2c366597a3f8f', + 'A node_id to allow zeroconf channels from', + ) + plugin.add_option( + 'zeroconf_mindepth', + 0, + 'Number of confirmations to require from allowlisted peers', + ) + + @plugin.hook('openchannel') + def on_openchannel(openchannel, plugin, **kwargs): + plugin.log(repr(openchannel)) + mindepth = int(plugin.options['zeroconf_mindepth']['value']) + + if openchannel['id'] == plugin.options['zeroconf_allow']['value'] or plugin.options['zeroconf_allow']['value'] == 'any': + plugin.log(f"This peer is in the zeroconf allowlist, setting mindepth={mindepth}") + return {'result': 'continue', 'mindepth': mindepth} + else: + return {'result': 'continue'} + + cli_opts = {'funding-confirms': 2, 'rescan': 10, + 'dev-fast-reconnect': None, + # if it's not zeroconf, we'll terminate on reorg. + 'zeroconf_allow': 'any'} + node_opts = {'may_reconnect': True, + 'allow_bad_gossip': True, + # gossipd send lightning update for original channel. + 'allow_warning': True} + l1 = node_factory.get_node(inline_plugin=setup, options=cli_opts, **node_opts) + l2 = node_factory.get_node(inline_plugin=setup, options=cli_opts, **node_opts) + node_factory.join_nodes([l1, l2], fundchannel=False) l1.fundwallet(10000000) sync_blockheight(bitcoind, [l1]) # height 102 bitcoind.generate_block(3) # heights 103-105 @@ -1477,12 +1523,36 @@ def test_funding_reorg_remote_lags(node_factory, bitcoind): """Nodes may disagree about short_channel_id before channel announcement """ # may_reconnect so channeld will restart; bad gossip can happen due to reorg - opts = {'funding-confirms': 1, 'may_reconnect': True, 'allow_bad_gossip': True, - 'allow_warning': True, 'dev-fast-reconnect': None, - # if it's not zeroconf, l2 will terminate on reorg. - 'plugin': os.path.join(os.getcwd(), 'tests/plugins/zeroconf-selective.py'), - 'zeroconf_allow': 'any'} - l1, l2 = node_factory.line_graph(2, fundchannel=False, opts=opts) + def setup(plugin): + plugin.add_option( + 'zeroconf_allow', + '03864ef025fde8fb587d989186ce6a4a186895ee44a926bfc370e2c366597a3f8f', + 'A node_id to allow zeroconf channels from', + ) + plugin.add_option( + 'zeroconf_mindepth', + 0, + 'Number of confirmations to require from allowlisted peers', + ) + + @plugin.hook('openchannel') + def on_openchannel(openchannel, plugin, **kwargs): + plugin.log(repr(openchannel)) + mindepth = int(plugin.options['zeroconf_mindepth']['value']) + + if openchannel['id'] == plugin.options['zeroconf_allow']['value'] or plugin.options['zeroconf_allow']['value'] == 'any': + plugin.log(f"This peer is in the zeroconf allowlist, setting mindepth={mindepth}") + return {'result': 'continue', 'mindepth': mindepth} + else: + return {'result': 'continue'} + + cli_opts = {'funding-confirms': 1, 'dev-fast-reconnect': None, + # if it's not zeroconf, l2 will terminate on reorg. + 'zeroconf_allow': 'any'} + node_opts = {'may_reconnect': True, 'allow_bad_gossip': True, 'allow_warning': True} + l1 = node_factory.get_node(inline_plugin=setup, options=cli_opts, **node_opts) + l2 = node_factory.get_node(inline_plugin=setup, options=cli_opts, **node_opts) + node_factory.join_nodes([l1, l2], fundchannel=False) l1.fundwallet(10000000) sync_blockheight(bitcoind, [l1]) # height 102 @@ -2808,11 +2878,11 @@ def test_new_node_is_mainnet(node_factory): def test_unicode_rpc(node_factory, executor, bitcoind): - node = node_factory.get_node() + l1 = node_factory.get_node() desc = "Some candy 🍬 and a nice glass of milk 🥛." - node.rpc.invoice(amount_msat=42, label=desc, description=desc) - invoices = node.rpc.listinvoices()['invoices'] + l1.rpc.invoice(amount_msat=42, label=desc, description=desc) + invoices = l1.rpc.listinvoices()['invoices'] assert(len(invoices) == 1) assert(invoices[0]['description'] == desc) assert(invoices[0]['label'] == desc) @@ -2837,29 +2907,29 @@ def test_unix_socket_path_length(node_factory, bitcoind, directory, executor, db def test_waitblockheight(node_factory, executor, bitcoind): - node = node_factory.get_node() + l1 = node_factory.get_node() - sync_blockheight(bitcoind, [node]) + sync_blockheight(bitcoind, [l1]) - blockheight = node.rpc.getinfo()['blockheight'] + blockheight = l1.rpc.getinfo()['blockheight'] # Should succeed without waiting. - node.rpc.waitblockheight(blockheight - 2) - node.rpc.waitblockheight(blockheight - 1) - node.rpc.waitblockheight(blockheight) + l1.rpc.waitblockheight(blockheight - 2) + l1.rpc.waitblockheight(blockheight - 1) + l1.rpc.waitblockheight(blockheight) # Developer mode polls bitcoind every second, so 60 seconds is plenty. time = 60 # Should not succeed yet. - fut2 = executor.submit(node.rpc.waitblockheight, blockheight + 2, time) - fut1 = executor.submit(node.rpc.waitblockheight, blockheight + 1, time) + fut2 = executor.submit(l1.rpc.waitblockheight, blockheight + 2, time) + fut1 = executor.submit(l1.rpc.waitblockheight, blockheight + 1, time) assert not fut1.done() assert not fut2.done() # Should take about ~1second and time out. with pytest.raises(RpcError): - node.rpc.waitblockheight(blockheight + 2, 1) + l1.rpc.waitblockheight(blockheight + 2, 1) # Others should still not be done. assert not fut1.done() @@ -2867,13 +2937,13 @@ def test_waitblockheight(node_factory, executor, bitcoind): # Trigger just one more block. bitcoind.generate_block(1) - sync_blockheight(bitcoind, [node]) + sync_blockheight(bitcoind, [l1]) fut1.result(5) assert not fut2.done() # Trigger two blocks. bitcoind.generate_block(1) - sync_blockheight(bitcoind, [node]) + sync_blockheight(bitcoind, [l1]) fut2.result(5) diff --git a/tests/test_pay.py b/tests/test_pay.py index 76aff48dfb05..765b8ba0c91c 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -3020,7 +3020,16 @@ def test_sendonion_rpc(node_factory): @pytest.mark.openchannel('v2') def test_partial_payment(node_factory, bitcoind, executor): # We want to test two payments at the same time, before we send commit - l1, l2, l3, l4 = node_factory.get_nodes(4, [{}] + [{'dev-disable-commit-after': 0, 'dev-no-htlc-timeout': None}] * 2 + [{'plugin': os.path.join(os.getcwd(), 'tests/plugins/print_htlc_onion.py')}]) + def setup(plugin): + @plugin.hook("htlc_accepted") + def on_htlc_accepted(htlc, onion, plugin, **kwargs): + plugin.log("Got onion {}".format(onion)) + return {'result': 'continue'} + + l1 = node_factory.get_node() + l2 = node_factory.get_node(options={'dev-disable-commit-after': 0, 'dev-no-htlc-timeout': None}) + l3 = node_factory.get_node(options={'dev-disable-commit-after': 0, 'dev-no-htlc-timeout': None}) + l4 = node_factory.get_node(inline_plugin=setup) # Two routes to l4: one via l2, and one via l3. l1.rpc.connect(l2.info['id'], 'localhost', l2.port) @@ -3156,7 +3165,7 @@ def test_partial_payment(node_factory, bitcoind, executor): assert res['partid'] == 2 for i in range(2): - line = l4.daemon.wait_for_log('print_htlc_onion.py: Got onion') + line = l4.daemon.wait_for_log('inline-plugin.py: Got onion') assert "'type': 'tlv'" in line assert "'forward_msat': 499" in line or "'forward_msat': 501" in line assert "'total_msat': 1000" in line @@ -3762,12 +3771,22 @@ def test_invalid_onion_channel_update(node_factory): even if some remote node does not send the required `channel_update`. ''' - plugin = os.path.join(os.getcwd(), 'tests/plugins/fail_htlcs_invalid.py') - l1, l2, l3 = node_factory.line_graph(3, - opts=[{}, - {'plugin': plugin}, - {}], - wait_for_announce=True) + def setup(plugin): + @plugin.hook("htlc_accepted") + def on_htlc_accepted(onion, plugin, **kwargs): + plugin.log("Failing htlc on purpose with invalid onion failure") + plugin.log("onion: %r" % (onion)) + # WIRE_TEMPORARY_CHANNEL_FAILURE = 0x1007 + # This failure code should be followed by a + # `channel_update`; we deliberately return + # a 0-length `channel_update` to trigger + # issue #3757 reported by @sumBTC. + return {"result": "fail", "failure_message": "10070000"} + + l1 = node_factory.get_node() + l2 = node_factory.get_node(inline_plugin=setup) + l3 = node_factory.get_node() + node_factory.join_nodes([l1, l2, l3], wait_for_announce=True) l1id = l1.info['id'] @@ -4530,6 +4549,30 @@ def test_offer(node_factory, bitcoind): assert enable_ret['description'] == offer_desc +def test_recurrence_escaped_label(node_factory, bitcoind): + l1, l2 = node_factory.line_graph(2) + + # Recurring offer. + offer = l2.rpc.offer(amount='1msat', + description='test_recurrence_escaped_label', + recurrence='1minutes')['bolt12'] + # Works the first time + weird_label = 'label \\ " \t \n' + ret = l1.rpc.fetchinvoice(offer=offer, + recurrence_counter=0, + recurrence_label=weird_label) + l1.rpc.xpay(invstring=ret['invoice']) + # Works the second time to match + l1.rpc.fetchinvoice(offer=offer, + recurrence_counter=1, + recurrence_label=weird_label) + + # Works to cancel. + l1.rpc.cancelrecurringinvoice(offer=offer, + recurrence_counter=2, + recurrence_label=weird_label) + + def test_offer_deprecated_api(node_factory, bitcoind): l1, l2 = node_factory.line_graph(2, opts={'allow-deprecated-apis': True}) @@ -4713,6 +4756,34 @@ def test_fetchinvoice(node_factory, bitcoind): l1.rpc.call('fetchinvoice', {'offer': offer1['bolt12'], 'timeout': 10}) +def test_fetchinvoice_invoice_expiry(node_factory, bitcoind): + """Non-recurring invoices get a relative_expiry iff the offer has an + absolute_expiry or uses a currency (whose conversion rate can change).""" + plugin = os.path.join(os.path.dirname(__file__), 'plugins/currencyUSDAUD5000.py') + # l2 is the offer node; dev-currency-expiry=2 makes the currency window short. + l1, l2 = node_factory.line_graph(2, + opts=[{}, + {'plugin': plugin, + 'dev-currency-expiry': 10}]) + + # Plain msat offer: no currency, no absolute expiry → default expiry (7200). + offer_plain = l2.rpc.offer(amount='1msat', description='plain') + inv_plain = l1.rpc.fetchinvoice(offer=offer_plain['bolt12']) + assert l1.rpc.decode(inv_plain['invoice'])['invoice_relative_expiry'] == 7200 + + # Currency offer: invoice must expire within dev_currency_expiry seconds. + offer_usd = l2.rpc.offer(amount='1USD', description='usd') + inv_usd = l1.rpc.fetchinvoice(offer=offer_usd['bolt12']) + assert l1.rpc.decode(inv_usd['invoice'])['invoice_relative_expiry'] <= 10 + + # Absolute-expiry offer: invoice relative_expiry must not exceed time-to-expiry. + abs_expiry = int(time.time()) + 10 + offer_abs = l2.rpc.offer(amount='1msat', description='abs', + absolute_expiry=abs_expiry) + inv_abs = l1.rpc.fetchinvoice(offer=offer_abs['bolt12']) + assert l1.rpc.decode(inv_abs['invoice'])['invoice_relative_expiry'] <= 10 + + def test_fetchinvoice_recurrence(node_factory, bitcoind): """Test for our recurrence extension""" l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, @@ -4748,7 +4819,7 @@ def test_fetchinvoice_recurrence(node_factory, bitcoind): assert period2['paywindow_end'] == period2['endtime'] # Can't request 2 before paying 1. - with pytest.raises(RpcError, match='previous invoice has not been paid'): + with pytest.raises(RpcError, match='Remote node sent failure message.*Previous invoice #1 status "unpaid"'): l1.rpc.call('fetchinvoice', {'offer': offer3['bolt12'], 'recurrence_counter': 2, 'recurrence_label': 'test recurrence'}) @@ -4756,7 +4827,7 @@ def test_fetchinvoice_recurrence(node_factory, bitcoind): l1.rpc.pay(ret['invoice'], label='test recurrence') # Now we can, but it's too early: - with pytest.raises(RpcError, match="Too early: can't send until time {}".format(period1['starttime'])): + with pytest.raises(RpcError, match=fr"Remote node sent failure message.*period_index 2 too early \(start {period1['starttime']}\)"): l1.rpc.call('fetchinvoice', {'offer': offer3['bolt12'], 'recurrence_counter': 2, 'recurrence_label': 'test recurrence'}) @@ -4801,7 +4872,7 @@ def test_fetchinvoice_recurrence(node_factory, bitcoind): while int(time.time()) <= period3['paywindow_end']: time.sleep(1) - with pytest.raises(RpcError, match="Too late: expired time {}".format(period3['paywindow_end'])): + with pytest.raises(RpcError, match=fr"Remote node sent failure message.*period_index 1 too late \(ended {period3['paywindow_end']}\)"): l1.rpc.call('fetchinvoice', {'offer': offer, 'recurrence_counter': 1, 'recurrence_label': 'test paywindow'}) @@ -4827,6 +4898,53 @@ def test_recurrence_expired_offer(node_factory, bitcoind): l1.rpc.pay(ret['invoice'], label='test_recurrence_expired_offer') +def test_recurring_currency_invoice_refresh(node_factory): + """After currency-expiry seconds, a new invoice request gets a + fresh invoice at the current rate; a request within that window + returns the cached invoice. + + """ + plugin = os.path.join(os.path.dirname(__file__), 'plugins/currencyUSDAUD5000.py') + # l2 hosts the offer with a 10-second currency expiry (normally 600s) + l1, l2 = node_factory.line_graph(2, + opts={'disable-plugin': 'cln-currencyrate', + 'plugin': plugin, + 'dev-currency-expiry': 10}) + + # Period is much longer than the currency expiry so we stay in period 0. + offer = l2.rpc.call('offer', {'amount': '1USD', + 'description': 'refresh', + 'recurrence': '1000seconds'})['bolt12'] + + # First fetch: server creates a fresh invoice (1 USD = 5000 msat). + inv1 = l1.rpc.call('fetchinvoice', {'offer': offer, + 'recurrence_counter': 0, + 'recurrence_label': 'refresh'})['invoice'] + + # Second fetch within the 10-second window: server returns the same invoice. + inv2 = l1.rpc.call('fetchinvoice', {'offer': offer, + 'recurrence_counter': 0, + 'recurrence_label': 'refresh'})['invoice'] + assert inv1 == inv2, "Expected identical invoice within currency-expiry window" + + # Change the rate on l2 before the window expires (1 USD = 2500 msat now). + l2.rpc.call('setcurrencyrate', {'msat_per_unit': 2500}) + + # Wait for the 10-second currency expiry to lapse. + time.sleep(11) + + # Third fetch after expiry: server issues a fresh invoice at the new rate. + inv3 = l1.rpc.call('fetchinvoice', {'offer': offer, + 'recurrence_counter': 0, + 'recurrence_label': 'refresh'})['invoice'] + assert inv3 != inv1, "Expected a fresh invoice after currency-expiry elapsed" + + dec1 = l1.rpc.decode(inv1) + dec3 = l1.rpc.decode(inv3) + assert dec1['invoice_amount_msat'] == 5000 + assert dec3['invoice_amount_msat'] == 2500 + + def test_fetchinvoice_autoconnect(node_factory, bitcoind): """We should autoconnect if we need to, to route.""" @@ -4848,8 +4966,8 @@ def test_fetchinvoice_autoconnect(node_factory, bitcoind): l3.rpc.disconnect(l2.info['id']) 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: "Failed: There is no connection between source and destination at all"'): + # Ofc l3 can't actually pay it! + with pytest.raises(RpcError, match=r'pay attempt failed: "Failed: We could not find a usable set of paths. We know from auto.localchans that source has maximum capacity 0msat \(in 1 channels\)."'): l3.rpc.call('sendinvoice', {'invreq': invreq['bolt12'], 'label': 'payme!'}) assert l3.rpc.listpeers(l2.info['id'])['peers'] != [] @@ -5880,11 +5998,26 @@ def test_blinded_reply_path_scid(node_factory): def test_pay_while_opening_channel(node_factory, bitcoind, executor): - delay_plugin = {'plugin': os.path.join(os.getcwd(), - 'tests/plugins/openchannel_hook_delay.py'), - 'delaytime': '10'} + def setup(plugin): + import time + plugin.add_option('delaytime', '10', 'How long to hold the WIRE_OPEN_CHANNEL.') + + @plugin.hook('openchannel') + def on_openchannel(openchannel, plugin, **kwargs): + delaytime = float(plugin.get_option('delaytime')) + plugin.log(f'delaying WIRE_ACCEPT_CHANNEL for {delaytime}s') + time.sleep(delaytime) + return {'result': 'continue'} + + @plugin.hook('openchannel2') + def on_openchannel2(openchannel2, plugin, **kwargs): + delaytime = float(plugin.get_option('delaytime')) + plugin.log(f'delaying WIRE_ACCEPT_CHANNEL for {delaytime}s') + time.sleep(delaytime) + return {'result': 'continue'} + l1, l2 = node_factory.line_graph(2, fundamount=10**6, wait_for_announce=True) - l3 = node_factory.get_node(options=delay_plugin) + l3 = node_factory.get_node(inline_plugin=setup, options={'delaytime': '10'}) l1.connect(l3) executor.submit(l1.rpc.fundchannel, l3.info['id'], 100000) wait_for(lambda: l1.rpc.listpeerchannels(l3.info['id'])['channels'] != []) @@ -7107,9 +7240,6 @@ def test_cancel_recurrence(node_factory): with pytest.raises(RpcError, match="recurrence_counter: Must be non-zero"): l1.rpc.cancelrecurringinvoice(offer['bolt12'], 0, 'test_cancel_recurrence') - with pytest.raises(RpcError, match="No previous payment attempted for this label and offer"): - l1.rpc.cancelrecurringinvoice(offer['bolt12'], 1, 'test_cancel_recurrence') - # Fetch and pay first one ret = l1.rpc.fetchinvoice(offer=offer['bolt12'], recurrence_counter=0, @@ -7119,10 +7249,6 @@ def test_cancel_recurrence(node_factory): decoded = l1.rpc.decode(m.group(1)) assert 'invreq_recurrence_cancel' not in decoded - # Cancel counter must be correct! - with pytest.raises(RpcError, match=r"previous invoice has not been paid \(last was 0\)"): - l1.rpc.cancelrecurringinvoice(offer['bolt12'], 2, 'test_cancel_recurrence') - # Cancel second one. l1.rpc.cancelrecurringinvoice(offer=offer['bolt12'], recurrence_counter=1, @@ -7134,7 +7260,7 @@ def test_cancel_recurrence(node_factory): assert decoded['invreq_recurrence_cancel'] is True # Now we cannot fetch second one! - with pytest.raises(RpcError, match=r"invoice expired \(cancelled\?\)"): + with pytest.raises(RpcError, match=r"invoice cancelled"): l1.rpc.fetchinvoice(offer=offer['bolt12'], recurrence_counter=1, recurrence_label='test_cancel_recurrence') diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 62bf2c790e22..65c9000818d3 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -75,8 +75,8 @@ def test_option_passthrough(node_factory, directory): # Now try to see if it gets accepted, would fail to start if the # option didn't exist - n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Ciao'}) - n.stop() + l1 = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Ciao'}) + l1.stop() with pytest.raises(subprocess.CalledProcessError): err_out = subprocess.run([ @@ -96,34 +96,34 @@ def test_option_types(node_factory): respected in output """ plugin_path = os.path.join(os.getcwd(), 'tests/plugins/options.py') - n = node_factory.get_node(options={ + l1 = node_factory.get_node(options={ 'plugin': plugin_path, 'str_opt': 'ok', 'int_opt': 22, 'bool_opt': True, }) - assert n.daemon.is_in_log(r"option str_opt ok ") - assert n.daemon.is_in_log(r"option int_opt 22 ") - assert n.daemon.is_in_log(r"option bool_opt True ") + assert l1.daemon.is_in_log(r"option str_opt ok ") + assert l1.daemon.is_in_log(r"option int_opt 22 ") + assert l1.daemon.is_in_log(r"option bool_opt True ") # flag options aren't passed through if not flagged on - assert not n.daemon.is_in_log(r"option flag_opt") - n.stop() + assert not l1.daemon.is_in_log(r"option flag_opt") + l1.stop() # A blank bool_opt should default to false - n = node_factory.get_node(options={ + l1 = node_factory.get_node(options={ 'plugin': plugin_path, 'str_opt': 'ok', 'int_opt': 22, 'bool_opt': 'true', 'flag_opt': None, }) - assert n.daemon.is_in_log(r"option bool_opt True ") - assert n.daemon.is_in_log(r"option flag_opt True ") - n.stop() + assert l1.daemon.is_in_log(r"option bool_opt True ") + assert l1.daemon.is_in_log(r"option flag_opt True ") + l1.stop() # What happens if we give it a bad bool-option? - n = node_factory.get_node(options={ + l1 = node_factory.get_node(options={ 'plugin': plugin_path, 'str_opt': 'ok', 'int_opt': 22, @@ -131,12 +131,12 @@ def test_option_types(node_factory): }, may_fail=True, start=False) # the node should fail after start, and we get a stderr msg - n.daemon.start(wait_for_initialized=False, stderr_redir=True) - assert n.daemon.wait() == 1 - wait_for(lambda: n.daemon.is_in_stderr("--bool_opt=!: Invalid argument '!'")) + l1.daemon.start(wait_for_initialized=False, stderr_redir=True) + assert l1.daemon.wait() == 1 + wait_for(lambda: l1.daemon.is_in_stderr("--bool_opt=!: Invalid argument '!'")) # What happens if we give it a bad int-option? - n = node_factory.get_node(options={ + l1 = node_factory.get_node(options={ 'plugin': plugin_path, 'str_opt': 'ok', 'int_opt': 'notok', @@ -144,24 +144,24 @@ def test_option_types(node_factory): }, may_fail=True, start=False) # the node should fail after start, and we get a stderr msg - n.daemon.start(wait_for_initialized=False, stderr_redir=True) - assert n.daemon.wait() == 1 - assert n.daemon.is_in_stderr("--int_opt=notok: 'notok' is not a number") + l1.daemon.start(wait_for_initialized=False, stderr_redir=True) + assert l1.daemon.wait() == 1 + assert l1.daemon.is_in_stderr("--int_opt=notok: 'notok' is not a number") # We no longer allow '1' or '0' as boolean options - n = node_factory.get_node(options={ + l1 = node_factory.get_node(options={ 'plugin': plugin_path, 'str_opt': 'ok', 'bool_opt': '1', }, may_fail=True, start=False) # the node should fail after start, and we get a stderr msg - n.daemon.start(wait_for_initialized=False, stderr_redir=True) - assert n.daemon.wait() == 1 - assert n.daemon.is_in_stderr("--bool_opt=1: Invalid argument '1'") + l1.daemon.start(wait_for_initialized=False, stderr_redir=True) + assert l1.daemon.wait() == 1 + assert l1.daemon.is_in_stderr("--bool_opt=1: Invalid argument '1'") # Flag opts shouldn't allow any input - n = node_factory.get_node(options={ + l1 = node_factory.get_node(options={ 'plugin': plugin_path, 'str_opt': 'ok', 'int_opt': 11, @@ -170,33 +170,33 @@ def test_option_types(node_factory): }, may_fail=True, start=False) # the node should fail after start, and we get a stderr msg - n.daemon.start(wait_for_initialized=False, stderr_redir=True) - assert n.daemon.wait() == 1 - assert n.daemon.is_in_stderr("--flag_opt=True: doesn't allow an argument") + l1.daemon.start(wait_for_initialized=False, stderr_redir=True) + assert l1.daemon.wait() == 1 + assert l1.daemon.is_in_stderr("--flag_opt=True: doesn't allow an argument") - n = node_factory.get_node(options={ + l1 = node_factory.get_node(options={ 'plugin': plugin_path, 'str_optm': ['ok', 'ok2'], 'int_optm': [11, 12, 13], }) - assert n.daemon.is_in_log(r"option str_optm \['ok', 'ok2'\] ") - assert n.daemon.is_in_log(r"option int_optm \[11, 12, 13\] ") - n.stop() + assert l1.daemon.is_in_log(r"option str_optm \['ok', 'ok2'\] ") + assert l1.daemon.is_in_log(r"option int_optm \[11, 12, 13\] ") + l1.stop() def test_millisatoshi_passthrough(node_factory): """ Ensure that Millisatoshi arguments and return work. """ plugin_path = os.path.join(os.getcwd(), 'tests/plugins/millisatoshis.py') - n = node_factory.get_node(options={'plugin': plugin_path, 'log-level': 'io'}) + l1 = node_factory.get_node(options={'plugin': plugin_path, 'log-level': 'io'}) # By keyword (plugin literally returns Millisatoshi, which becomes a string) - ret = n.rpc.call('echo', {'msat': Millisatoshi(17), 'not_an_msat': '22msat'})['echo_msat'] + ret = l1.rpc.call('echo', {'msat': Millisatoshi(17), 'not_an_msat': '22msat'})['echo_msat'] assert Millisatoshi(ret) == Millisatoshi(17) # By position - ret = n.rpc.call('echo', [Millisatoshi(18), '22msat'])['echo_msat'] + ret = l1.rpc.call('echo', [Millisatoshi(18), '22msat'])['echo_msat'] assert Millisatoshi(ret) == Millisatoshi(18) @@ -208,29 +208,29 @@ def test_rpc_passthrough(node_factory): """ plugin_path = os.path.join(os.getcwd(), 'contrib/plugins/helloworld.py') - n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Ciao'}) + l1 = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Ciao'}) # Make sure that the 'hello' command that the helloworld.py plugin # has registered is available. - cmd = [hlp for hlp in n.rpc.help()['help'] if 'hello' in hlp['command']] + cmd = [hlp for hlp in l1.rpc.help()['help'] if 'hello' in hlp['command']] assert(len(cmd) == 1) # Make sure usage message is present. - assert only_one(n.rpc.help('hello')['help'])['command'].startswith('hello [name]') + assert only_one(l1.rpc.help('hello')['help'])['command'].startswith('hello [name]') # While we're at it, let's check that helloworld.py is logging # correctly via the notifications plugin->lightningd - assert n.daemon.is_in_log('Plugin helloworld.py initialized') + assert l1.daemon.is_in_log('Plugin helloworld.py initialized') # Now try to call it and see what it returns: - greet = n.rpc.hello(name='World') + greet = l1.rpc.hello(name='World') assert(greet == "Ciao World") with pytest.raises(RpcError): - n.rpc.fail() + l1.rpc.fail() # Try to call a method without enough arguments with pytest.raises(RpcError, match="processing bye: missing a required" " argument"): - n.rpc.bye() + l1.rpc.bye() def test_plugin_dir(node_factory): @@ -242,91 +242,91 @@ def test_plugin_dir(node_factory): def test_plugin_slowinit(node_factory): """Tests that the 'plugin' RPC command times out if plugin doesnt respond""" os.environ['SLOWINIT_TIME'] = '121' - n = node_factory.get_node() + l1 = node_factory.get_node() with pytest.raises(RpcError, match=': timed out before replying to init'): - n.rpc.plugin_start(os.path.join(os.getcwd(), "tests/plugins/slow_init.py")) + l1.rpc.plugin_start(os.path.join(os.getcwd(), "tests/plugins/slow_init.py")) # It's not actually configured yet, see what happens; # make sure 'rescan' and 'list' controls dont crash - n.rpc.plugin_rescan() - n.rpc.plugin_list() + l1.rpc.plugin_rescan() + l1.rpc.plugin_list() def test_plugin_command(node_factory): """Tests the 'plugin' RPC command""" - n = node_factory.get_node() + l1 = node_factory.get_node() # Make sure that the 'hello' command from the helloworld.py plugin # is not available. - cmd = [hlp for hlp in n.rpc.help()["help"] if "hello" in hlp["command"]] + cmd = [hlp for hlp in l1.rpc.help()["help"] if "hello" in hlp["command"]] assert(len(cmd) == 0) # Add the 'contrib/plugins' test dir - n.rpc.plugin_startdir(directory=os.path.join(os.getcwd(), "contrib/plugins")) + l1.rpc.plugin_startdir(directory=os.path.join(os.getcwd(), "contrib/plugins")) # Make sure that the 'hello' command from the helloworld.py plugin # is now available. - cmd = [hlp for hlp in n.rpc.help()["help"] if "hello" in hlp["command"]] + cmd = [hlp for hlp in l1.rpc.help()["help"] if "hello" in hlp["command"]] assert(len(cmd) == 1) # Make sure 'rescan' and 'list' subcommands dont crash - n.rpc.plugin_rescan() - n.rpc.plugin_list() + l1.rpc.plugin_rescan() + l1.rpc.plugin_list() # Make sure the plugin behaves normally after stop and restart assert("Successfully stopped helloworld.py." - == n.rpc.plugin_stop(plugin="helloworld.py")["result"]) - n.daemon.wait_for_log(r"Killing plugin: stopped by lightningd via RPC") - n.rpc.plugin_start(plugin=os.path.join(os.getcwd(), "contrib/plugins/helloworld.py")) - n.daemon.wait_for_log(r"Plugin helloworld.py initialized") - assert("Hello world" == n.rpc.call(method="hello")) + == l1.rpc.plugin_stop(plugin="helloworld.py")["result"]) + l1.daemon.wait_for_log(r"Killing plugin: stopped by lightningd via RPC") + l1.rpc.plugin_start(plugin=os.path.join(os.getcwd(), "contrib/plugins/helloworld.py")) + l1.daemon.wait_for_log(r"Plugin helloworld.py initialized") + assert("Hello world" == l1.rpc.call(method="hello")) # Now stop the helloworld plugin assert("Successfully stopped helloworld.py." - == n.rpc.plugin_stop(plugin="helloworld.py")["result"]) - n.daemon.wait_for_log(r"Killing plugin: stopped by lightningd via RPC") + == l1.rpc.plugin_stop(plugin="helloworld.py")["result"]) + l1.daemon.wait_for_log(r"Killing plugin: stopped by lightningd via RPC") # Make sure that the 'hello' command from the helloworld.py plugin # is not available anymore. - cmd = [hlp for hlp in n.rpc.help()["help"] if "hello" in hlp["command"]] + cmd = [hlp for hlp in l1.rpc.help()["help"] if "hello" in hlp["command"]] assert(len(cmd) == 0) # Test that we cannot start a plugin with 'dynamic' set to False in # getmanifest with pytest.raises(RpcError, match=r"Not a dynamic plugin"): - n.rpc.plugin_start(plugin=os.path.join(os.getcwd(), "tests/plugins/static.py")) + l1.rpc.plugin_start(plugin=os.path.join(os.getcwd(), "tests/plugins/static.py")) # Test that we cannot stop a started plugin with 'dynamic' flag set to # False - n2 = node_factory.get_node(options={ + l2 = node_factory.get_node(options={ "plugin": os.path.join(os.getcwd(), "tests/plugins/static.py") }) with pytest.raises(RpcError, match=r"static.py cannot be managed when lightningd is up"): - n2.rpc.plugin_stop(plugin="static.py") + l2.rpc.plugin_stop(plugin="static.py") # Test that we don't crash when starting a broken plugin with pytest.raises(RpcError, match=r": exited before replying to getmanifest"): - n2.rpc.plugin_start(plugin=os.path.join(os.getcwd(), "tests/plugins/broken.py")) + l2.rpc.plugin_start(plugin=os.path.join(os.getcwd(), "tests/plugins/broken.py")) with pytest.raises(RpcError, match=r': timed out before replying to getmanifest'): - n2.rpc.plugin_start(os.path.join(os.getcwd(), 'contrib/plugins/fail/failtimeout.py')) + l2.rpc.plugin_start(os.path.join(os.getcwd(), 'contrib/plugins/fail/failtimeout.py')) # Test that we can add a directory with more than one new plugin in it. try: - n.rpc.plugin_startdir(os.path.join(os.getcwd(), "contrib/plugins")) + l1.rpc.plugin_startdir(os.path.join(os.getcwd(), "contrib/plugins")) except RpcError: pass # Usually, it crashes after the above return. - n.rpc.stop() + l1.rpc.stop() def test_plugin_fail_on_startup(node_factory): for crash in ('during_init', 'before_start', 'during_getmanifest'): os.environ['BROKEN_CRASH'] = crash - n = node_factory.get_node(options={'plugin': os.path.join(os.getcwd(), "tests/plugins/broken.py")}) + l1 = node_factory.get_node(options={'plugin': os.path.join(os.getcwd(), "tests/plugins/broken.py")}) # This can happen before 'Server started with public key' msg - n.daemon.logsearch_start = 0 - n.daemon.wait_for_log('plugin-broken.py: Traceback') + l1.daemon.logsearch_start = 0 + l1.daemon.wait_for_log('plugin-broken.py: Traceback') # Make sure they don't die *after* the message! time.sleep(30) @@ -336,64 +336,64 @@ def test_plugin_disable(node_factory): """--disable-plugin works""" plugin_dir = os.path.join(os.getcwd(), 'contrib/plugins') # We used to need plugin-dir before disable-plugin! - n = node_factory.get_node(options=OrderedDict([('plugin-dir', plugin_dir), - ('disable-plugin', - '{}/helloworld.py' - .format(plugin_dir))])) + l1 = node_factory.get_node(options=OrderedDict([('plugin-dir', plugin_dir), + ('disable-plugin', + '{}/helloworld.py' + .format(plugin_dir))])) with pytest.raises(RpcError): - n.rpc.hello(name='Sun') - assert n.daemon.is_in_log('helloworld.py: disabled via disable-plugin') - n.stop() + l1.rpc.hello(name='Sun') + assert l1.daemon.is_in_log('helloworld.py: disabled via disable-plugin') + l1.stop() # Also works by basename. - n = node_factory.get_node(options=OrderedDict([('plugin-dir', plugin_dir), - ('disable-plugin', - 'helloworld.py')])) + l1 = node_factory.get_node(options=OrderedDict([('plugin-dir', plugin_dir), + ('disable-plugin', + 'helloworld.py')])) with pytest.raises(RpcError): - n.rpc.hello(name='Sun') - assert n.daemon.is_in_log('helloworld.py: disabled via disable-plugin') - n.stop() + l1.rpc.hello(name='Sun') + assert l1.daemon.is_in_log('helloworld.py: disabled via disable-plugin') + l1.stop() # Other order also works! - n = node_factory.get_node(options=OrderedDict([('disable-plugin', - 'helloworld.py'), - ('plugin-dir', plugin_dir)])) + l1 = node_factory.get_node(options=OrderedDict([('disable-plugin', + 'helloworld.py'), + ('plugin-dir', plugin_dir)])) with pytest.raises(RpcError): - n.rpc.hello(name='Sun') - assert n.daemon.is_in_log('helloworld.py: disabled via disable-plugin') - n.stop() + l1.rpc.hello(name='Sun') + assert l1.daemon.is_in_log('helloworld.py: disabled via disable-plugin') + l1.stop() # Both orders of explicit specification work. - n = node_factory.get_node(options=OrderedDict([('disable-plugin', - 'helloworld.py'), - ('plugin', - '{}/helloworld.py' - .format(plugin_dir))])) + l1 = node_factory.get_node(options=OrderedDict([('disable-plugin', + 'helloworld.py'), + ('plugin', + '{}/helloworld.py' + .format(plugin_dir))])) with pytest.raises(RpcError): - n.rpc.hello(name='Sun') - assert n.daemon.is_in_log('helloworld.py: disabled via disable-plugin') - n.stop() + l1.rpc.hello(name='Sun') + assert l1.daemon.is_in_log('helloworld.py: disabled via disable-plugin') + l1.stop() # Both orders of explicit specification work. - n = node_factory.get_node(options=OrderedDict([('plugin', - '{}/helloworld.py' - .format(plugin_dir)), - ('disable-plugin', - 'helloworld.py')])) + l1 = node_factory.get_node(options=OrderedDict([('plugin', + '{}/helloworld.py' + .format(plugin_dir)), + ('disable-plugin', + 'helloworld.py')])) with pytest.raises(RpcError): - n.rpc.hello(name='Sun') - assert n.daemon.is_in_log('helloworld.py: disabled via disable-plugin') + l1.rpc.hello(name='Sun') + assert l1.daemon.is_in_log('helloworld.py: disabled via disable-plugin') # Still disabled if we load directory. - n.rpc.plugin_startdir(directory=os.path.join(os.getcwd(), "contrib/plugins")) - n.daemon.wait_for_log('helloworld.py: disabled via disable-plugin') - n.stop() + l1.rpc.plugin_startdir(directory=os.path.join(os.getcwd(), "contrib/plugins")) + l1.daemon.wait_for_log('helloworld.py: disabled via disable-plugin') + l1.stop() # Check that list works - n = node_factory.get_node(options={'disable-plugin': - ['something-else.py', 'helloworld.py']}) + l1 = node_factory.get_node(options={'disable-plugin': + ['something-else.py', 'helloworld.py']}) - assert n.rpc.listconfigs()['configs']['disable-plugin'] == {'values_str': ['something-else.py', 'helloworld.py'], 'sources': ['cmdline', 'cmdline']} + assert l1.rpc.listconfigs()['configs']['disable-plugin'] == {'values_str': ['something-else.py', 'helloworld.py'], 'sources': ['cmdline', 'cmdline']} def test_plugin_hook(node_factory, executor): @@ -667,8 +667,13 @@ def test_db_hook_multiple(node_factory, executor): def test_utf8_passthrough(node_factory, executor): - l1 = node_factory.get_node(options={'plugin': os.path.join(os.getcwd(), 'tests/plugins/utf8.py'), - 'log-level': 'io'}) + def setup(plugin): + @plugin.method("utf8") + def echo(plugin, utf8): + assert '\\u' not in utf8 + return {'utf8': utf8} + + l1 = node_factory.get_node(inline_plugin=setup, options={'log-level': 'io'}) # This works because Python unmangles. res = l1.rpc.call('utf8', ['ナンセンス 1杯']) @@ -688,8 +693,22 @@ def test_utf8_passthrough(node_factory, executor): def test_invoice_payment_hook(node_factory): """ l1 uses the reject-payment plugin to reject invoices with odd preimages. """ - opts = [{}, {'plugin': os.path.join(os.getcwd(), 'tests/plugins/reject_some_invoices.py')}] - l1, l2 = node_factory.line_graph(2, opts=opts) + def setup(plugin): + @plugin.hook('invoice_payment') + def on_payment(payment, plugin, **kwargs): + plugin.log("label={}".format(payment['label'])) + plugin.log("msat={}".format(payment['msat'])) + plugin.log("preimage={}".format(payment['preimage'])) + + if payment['preimage'].endswith('0'): + # WIRE_TEMPORARY_NODE_FAILURE = 0x2002 + return {'failure_message': "2002"} + + return {'result': 'continue'} + + l1 = node_factory.get_node() + l2 = node_factory.get_node(inline_plugin=setup) + node_factory.join_nodes([l1, l2]) # This one works inv1 = l2.rpc.invoice(1230, 'label', 'description', preimage='1' * 64) @@ -731,8 +750,31 @@ def test_invoice_payment_hook_hold(node_factory, executor): def test_openchannel_hook(node_factory, bitcoind): """ l2 uses the reject_odd_funding_amounts plugin to reject some openings. """ - opts = [{}, {'plugin': os.path.join(os.getcwd(), 'tests/plugins/reject_odd_funding_amounts.py')}] - l1, l2 = node_factory.line_graph(2, fundchannel=False, opts=opts) + def setup(plugin): + from pyln.client import Millisatoshi + + def run_check(funding_amt_str): + if Millisatoshi(funding_amt_str).to_satoshi() % 2 == 1: + return {'result': 'reject', 'error_message': "I don't like odd amounts"} + return {'result': 'continue'} + + @plugin.hook('openchannel') + def on_openchannel(openchannel, plugin, **kwargs): + plugin.log("{} VARS".format(len(openchannel.keys()))) + for k in sorted(openchannel.keys()): + plugin.log("{}={}".format(k, openchannel[k])) + return run_check(openchannel['funding_msat']) + + @plugin.hook('openchannel2') + def on_openchannel2(openchannel2, plugin, **kwargs): + plugin.log("{} VARS".format(len(openchannel2.keys()))) + for k in sorted(openchannel2.keys()): + plugin.log("{}={}".format(k, openchannel2[k])) + return run_check(openchannel2['their_funding_msat']) + + l1 = node_factory.get_node() + l2 = node_factory.get_node(inline_plugin=setup) + node_factory.join_nodes([l1, l2], fundchannel=False) l1.fundwallet(10**6) # Even amount: works. @@ -776,9 +818,9 @@ def test_openchannel_hook(node_factory, bitcoind): 'push_msat': 0, }) - l2.daemon.wait_for_log('reject_odd_funding_amounts.py: {} VARS'.format(len(expected))) + l2.daemon.wait_for_log('inline-plugin.py: {} VARS'.format(len(expected))) for k, v in expected.items(): - assert l2.daemon.is_in_log('reject_odd_funding_amounts.py: {}={}'.format(k, v)) + assert l2.daemon.is_in_log('inline-plugin.py: {}={}'.format(k, v)) # Close it. txid = only_one(l1.rpc.close(l2.info['id'])['txids']) @@ -1252,11 +1294,15 @@ def test_htlc_accepted_hook_fail(node_factory): def test_htlc_accepted_hook_resolve(node_factory): """l3 creates an invoice, l2 knows the preimage and will shortcircuit. """ - l1, l2, l3 = node_factory.line_graph(3, opts=[ - {}, - {'plugin': os.path.join(os.getcwd(), 'tests/plugins/shortcircuit.py')}, - {} - ], wait_for_announce=True) + def setup(plugin): + @plugin.hook("htlc_accepted") + def on_htlc_accepted(onion, htlc, plugin, **kwargs): + return {"result": "resolve", "payment_key": "00" * 32} + + l1 = node_factory.get_node() + l2 = node_factory.get_node(inline_plugin=setup) + l3 = node_factory.get_node() + node_factory.join_nodes([l1, l2, l3], wait_for_announce=True) inv = l3.rpc.invoice(amount_msat=1000, label="lbl", description="desc", preimage="00" * 32)['bolt11'] l1.rpc.xpay(inv) @@ -1408,41 +1454,62 @@ def test_htlc_accepted_hook_forward_restart(node_factory, executor): def test_warning_notification(node_factory): """ test 'warning' notifications """ - l1 = node_factory.get_node(options={'plugin': os.path.join(os.getcwd(), 'tests/plugins/pretend_badlog.py')}, broken_log=r'Test warning notification\(for broken event\)|LINE[12]') + def setup(plugin): + @plugin.init() + def init(configuration, options, plugin): + plugin.log("initialized") + + @plugin.subscribe("warning") + def notify_warning(plugin, warning, **kwargs): + plugin.log("Received warning") + plugin.log("level: {}".format(warning['level'])) + plugin.log("time: {}".format(warning['time'])) + plugin.log("source: {}".format(warning['source'])) + plugin.log("log: {}".format(warning['log'])) + + @plugin.method("pretendbad") + def pretend_bad(event, level, plugin): + """Log an specified level entry. + And in plugin, we use 'warn'/'error' instead of + 'unusual'/'broken' + """ + plugin.log("{}".format(event), level) + + l1 = node_factory.get_node(inline_plugin=setup, broken_log=r'Test warning notification\(for broken event\)|LINE[12]') # 1. test 'warn' level event = "Test warning notification(for unusual event)" l1.rpc.call('pretendbad', {'event': event, 'level': 'warn'}) # ensure an unusual log_entry was produced by 'pretendunusual' method - l1.daemon.wait_for_log('plugin-pretend_badlog.py: Test warning notification\\(for unusual event\\)') + l1.daemon.wait_for_log('plugin-inline-plugin.py: Test warning notification\\(for unusual event\\)') # now wait for notification - l1.daemon.wait_for_log('plugin-pretend_badlog.py: Received warning') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: level: warn') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: time: *') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: source: plugin-pretend_badlog.py') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: log: Test warning notification\\(for unusual event\\)') + l1.daemon.wait_for_log('plugin-inline-plugin.py: Received warning') + l1.daemon.wait_for_log('plugin-inline-plugin.py: level: warn') + l1.daemon.wait_for_log('plugin-inline-plugin.py: time: *') + l1.daemon.wait_for_log('plugin-inline-plugin.py: source: plugin-inline-plugin.py') + l1.daemon.wait_for_log('plugin-inline-plugin.py: log: Test warning notification\\(for unusual event\\)') # 2. test 'error' level, steps like above event = "Test warning notification(for broken event)" l1.rpc.call('pretendbad', {'event': event, 'level': 'error'}) - l1.daemon.wait_for_log(r'\*\*BROKEN\*\* plugin-pretend_badlog.py: Test warning notification\(for broken event\)') + l1.daemon.wait_for_log(r'\*\*BROKEN\*\* plugin-inline-plugin.py: Test warning notification\(for broken event\)') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: Received warning') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: level: error') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: time: *') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: source: plugin-pretend_badlog.py') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: log: Test warning notification\\(for broken event\\)') + l1.daemon.wait_for_log('plugin-inline-plugin.py: Received warning') + l1.daemon.wait_for_log('plugin-inline-plugin.py: level: error') + l1.daemon.wait_for_log('plugin-inline-plugin.py: time: *') + l1.daemon.wait_for_log('plugin-inline-plugin.py: source: plugin-inline-plugin.py') + l1.daemon.wait_for_log('plugin-inline-plugin.py: log: Test warning notification\\(for broken event\\)') # Test linesplitting while we're here l1.rpc.call('pretendbad', {'event': 'LINE1\nLINE2', 'level': 'error'}) - l1.daemon.wait_for_log(r'\*\*BROKEN\*\* plugin-pretend_badlog.py: LINE1') - l1.daemon.wait_for_log(r'\*\*BROKEN\*\* plugin-pretend_badlog.py: LINE2') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: Received warning') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: log: LINE1') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: Received warning') - l1.daemon.wait_for_log('plugin-pretend_badlog.py: log: LINE2') + l1.daemon.wait_for_log(r'\*\*BROKEN\*\* plugin-inline-plugin.py: LINE1') + l1.daemon.wait_for_log(r'\*\*BROKEN\*\* plugin-inline-plugin.py: LINE2') + l1.daemon.wait_for_log('plugin-inline-plugin.py: Received warning') + l1.daemon.wait_for_log('plugin-inline-plugin.py: log: LINE1') + l1.daemon.wait_for_log('plugin-inline-plugin.py: Received warning') + l1.daemon.wait_for_log('plugin-inline-plugin.py: log: LINE2') def test_invoice_payment_notification(node_factory): @@ -1632,11 +1699,33 @@ def test_forward_event_notification(node_factory, bitcoind, executor): def test_sendpay_notifications(node_factory, bitcoind): """ test 'sendpay_success' and 'sendpay_failure' notifications """ + def setup(plugin): + @plugin.init() + def init(configuration, options, plugin): + plugin.success_list = [] + plugin.failure_list = [] + + @plugin.subscribe("sendpay_success") + def notify_sendpay_success(plugin, sendpay_success): + plugin.log("Received a sendpay_success: id={}, payment_hash={}".format(sendpay_success['id'], sendpay_success['payment_hash'])) + plugin.success_list.append(sendpay_success) + + @plugin.subscribe("sendpay_failure") + def notify_sendpay_failure(plugin, sendpay_failure): + plugin.log("Received a sendpay_failure: id={}, payment_hash={}".format(sendpay_failure['data']['id'], + sendpay_failure['data']['payment_hash'])) + plugin.failure_list.append(sendpay_failure) + + @plugin.method('listsendpays_plugin') + def record_lookup(plugin): + return {'sendpay_success': plugin.success_list, + 'sendpay_failure': plugin.failure_list} + amount = 10**8 - opts = [{'plugin': os.path.join(os.getcwd(), 'tests/plugins/sendpay_notifications.py')}, - {}, - {'may_reconnect': False}] - l1, l2, l3 = node_factory.line_graph(3, opts=opts, wait_for_announce=True) + l1 = node_factory.get_node(inline_plugin=setup) + l2 = node_factory.get_node() + l3 = node_factory.get_node(may_reconnect=False) + node_factory.join_nodes([l1, l2, l3], wait_for_announce=True) chanid23 = l2.get_channel_scid(l3) inv1 = l3.rpc.invoice(amount, "first", "desc") @@ -1663,10 +1752,32 @@ def test_sendpay_notifications(node_factory, bitcoind): def test_sendpay_notifications_nowaiter(node_factory): - opts = [{'plugin': os.path.join(os.getcwd(), 'tests/plugins/sendpay_notifications.py')}, - {}, - {'may_reconnect': False}] - l1, l2, l3 = node_factory.line_graph(3, opts=opts, wait_for_announce=True) + def setup(plugin): + @plugin.init() + def init(configuration, options, plugin): + plugin.success_list = [] + plugin.failure_list = [] + + @plugin.subscribe("sendpay_success") + def notify_sendpay_success(plugin, sendpay_success): + plugin.log("Received a sendpay_success: id={}, payment_hash={}".format(sendpay_success['id'], sendpay_success['payment_hash'])) + plugin.success_list.append(sendpay_success) + + @plugin.subscribe("sendpay_failure") + def notify_sendpay_failure(plugin, sendpay_failure): + plugin.log("Received a sendpay_failure: id={}, payment_hash={}".format(sendpay_failure['data']['id'], + sendpay_failure['data']['payment_hash'])) + plugin.failure_list.append(sendpay_failure) + + @plugin.method('listsendpays_plugin') + def record_lookup(plugin): + return {'sendpay_success': plugin.success_list, + 'sendpay_failure': plugin.failure_list} + + l1 = node_factory.get_node(inline_plugin=setup) + l2 = node_factory.get_node() + l3 = node_factory.get_node(may_reconnect=False) + node_factory.join_nodes([l1, l2, l3], wait_for_announce=True) chanid23 = l2.get_channel_scid(l3) amount = 10**8 @@ -1782,7 +1893,7 @@ def test_libplugin(node_factory): myname = os.path.splitext(os.path.basename(sys.argv[0]))[0] # getmanifest assumes everyone handles string-based JSON ids: - l1.daemon.wait_for_log(r'test_libplugin: "[-A-Za-z0-9:#]*/cln:getmanifest#[0-9]*"\[OUT\]') + l1.daemon.wait_for_log(r'test_libplugin: [-A-Za-z0-9:#]*/cln:getmanifest#[0-9]*\[OUT\]') l1.daemon.wait_for_log("String name from datastore:.*object does not have member string") l1.daemon.wait_for_log("Hex name from datastore: 00010203") @@ -1809,7 +1920,7 @@ def test_libplugin(node_factory): # Test hooks and notifications (add plugin, so we can test hook id) l2 = node_factory.get_node(options={"plugin": plugin, 'log-level': 'io'}) l2.connect(l1) - l2.daemon.wait_for_log(r': "{}:connect#[0-9]*/cln:peer_connected#[0-9]*"\[OUT\]'.format(myname)) + l2.daemon.wait_for_log(r': {}:connect#[0-9]*/cln:peer_connected#[0-9]*\[OUT\]'.format(myname)) l1.daemon.wait_for_log("{} peer_connected".format(l2.info["id"])) l1.daemon.wait_for_log("{} connected".format(l2.info["id"])) @@ -2551,66 +2662,66 @@ def test_important_plugin(node_factory): # Cache it here. pluginsdir = os.path.join(os.path.dirname(__file__), "plugins") - n = node_factory.get_node(options={"important-plugin": os.path.join(pluginsdir, "nonexistent")}, - may_fail=True, expect_fail=True, - # Other plugins can complain as lightningd stops suddenly: - broken_log='Plugin marked as important, shutting down lightningd|Reading sync lightningd: Connection reset by peer|Lost connection to the RPC socket|Plugin terminated before replying to RPC call|plugin-cln-xpay: askrene-create-layer failed with.*Unknown command', - start=False) + l1 = node_factory.get_node(options={"important-plugin": os.path.join(pluginsdir, "nonexistent")}, + may_fail=True, expect_fail=True, + # Other plugins can complain as lightningd stops suddenly: + broken_log='Plugin marked as important, shutting down lightningd|Reading sync lightningd: Connection reset by peer|Lost connection to the RPC socket|Plugin terminated before replying to RPC call|plugin-cln-xpay: askrene-create-layer failed with.*Unknown command', + start=False) - n.daemon.start(wait_for_initialized=False, stderr_redir=True) + l1.daemon.start(wait_for_initialized=False, stderr_redir=True) # Will exit with failure code. - assert n.daemon.wait() == 1 - assert n.daemon.is_in_stderr(r"Failed to register .*nonexistent: No such file or directory") + assert l1.daemon.wait() == 1 + assert l1.daemon.is_in_stderr(r"Failed to register .*nonexistent: No such file or directory") # Check we exit if the important plugin dies. - n.daemon.opts['important-plugin'] = os.path.join(pluginsdir, "fail_by_itself.py") + l1.daemon.opts['important-plugin'] = os.path.join(pluginsdir, "fail_by_itself.py") - n.daemon.start(wait_for_initialized=False) + l1.daemon.start(wait_for_initialized=False) # Will exit with failure code. - assert n.daemon.wait() == 1 - n.daemon.wait_for_log(r'fail_by_itself.py: Plugin marked as important, shutting down lightningd') + assert l1.daemon.wait() == 1 + l1.daemon.wait_for_log(r'fail_by_itself.py: Plugin marked as important, shutting down lightningd') # Check if the important plugin is disabled, we run as normal. - n.daemon.opts['disable-plugin'] = "fail_by_itself.py" - n.daemon.start() + l1.daemon.opts['disable-plugin'] = "fail_by_itself.py" + l1.daemon.start() # Make sure we can call into a plugin RPC (this is from `bcli`) even # if fail_by_itself.py is disabled. - n.rpc.call("estimatefees", {}) - n.stop() + l1.rpc.call("estimatefees", {}) + l1.stop() # Check if an important plugin dies later, we fail. - del n.daemon.opts['disable-plugin'] - n.daemon.opts['important-plugin'] = os.path.join(pluginsdir, "suicidal_plugin.py") + del l1.daemon.opts['disable-plugin'] + l1.daemon.opts['important-plugin'] = os.path.join(pluginsdir, "suicidal_plugin.py") - n.start() + l1.start() with pytest.raises(RpcError): - n.rpc.call("die", {}) + l1.rpc.call("die", {}) # Should exit with exitcode 1 - n.daemon.wait_for_log('suicidal_plugin.py: Plugin marked as important, shutting down lightningd') - assert n.daemon.wait() == 1 - n.stop() + l1.daemon.wait_for_log('suicidal_plugin.py: Plugin marked as important, shutting down lightningd') + assert l1.daemon.wait() == 1 + l1.stop() # Check that if a builtin plugin dies, we fail. - start = n.daemon.logsearch_start - n.start() + start = l1.daemon.logsearch_start + l1.start() # Reset logsearch_start, since this will predate message that start() looks for. - n.daemon.logsearch_start = start - line = n.daemon.wait_for_log(r'.*started\([0-9]*\).*plugins/pay') + l1.daemon.logsearch_start = start + line = l1.daemon.wait_for_log(r'.*started\([0-9]*\).*plugins/pay') pidstr = re.search(r'.*started\(([0-9]*)\).*plugins/pay', line).group(1) # Kill pay. os.kill(int(pidstr), signal.SIGKILL) - n.daemon.wait_for_log('pay: Plugin marked as important, shutting down lightningd') + l1.daemon.wait_for_log('pay: Plugin marked as important, shutting down lightningd') # Should exit with exitcode 1 - assert n.daemon.wait() == 1 - n.stop() + assert l1.daemon.wait() == 1 + l1.stop() def test_dev_builtin_plugins_unimportant(node_factory): - n = node_factory.get_node(options={"dev-builtin-plugins-unimportant": None}) - n.rpc.plugin_stop(plugin="pay") + l1 = node_factory.get_node(options={"dev-builtin-plugins-unimportant": None}) + l1.rpc.plugin_stop(plugin="pay") def test_htlc_accepted_hook_crash(node_factory, executor): @@ -2990,11 +3101,11 @@ def init(options, configuration, plugin): """ # get a node that is not started so we can put a plugin in its lightning_dir - n = node_factory.get_node(start=False) - if "dev-no-plugin-checksum" in n.daemon.opts: - del n.daemon.opts["dev-no-plugin-checksum"] + l1 = node_factory.get_node(start=False) + if "dev-no-plugin-checksum" in l1.daemon.opts: + del l1.daemon.opts["dev-no-plugin-checksum"] - lndir = n.daemon.lightning_dir + lndir = l1.daemon.lightning_dir # write hello world plugin to lndir/plugins os.makedirs(os.path.join(lndir, 'plugins'), exist_ok=True) @@ -3004,13 +3115,13 @@ def init(options, configuration, plugin): os.chmod(path, os.stat(path).st_mode | stat.S_IEXEC) # now fire up the node and wait for the plugin to print hello - n.daemon.start() - n.daemon.logsearch_start = 0 - n.daemon.wait_for_log(r"test_restart_on_update 1") + l1.daemon.start() + l1.daemon.logsearch_start = 0 + l1.daemon.wait_for_log(r"test_restart_on_update 1") # a rescan should not yet reload the plugin on the same file - n.rpc.plugin_rescan() - assert not n.daemon.is_in_log(r"Plugin changed, needs restart.") + l1.rpc.plugin_rescan() + assert not l1.daemon.is_in_log(r"Plugin changed, needs restart.") # modify the file with open(path, 'w+') as file: @@ -3018,10 +3129,10 @@ def init(options, configuration, plugin): os.chmod(path, os.stat(path).st_mode | stat.S_IEXEC) # rescan and check - n.rpc.plugin_rescan() - n.daemon.wait_for_log(r"Plugin changed, needs restart.") - n.daemon.wait_for_log(r"test_restart_on_update 2") - n.stop() + l1.rpc.plugin_rescan() + l1.daemon.wait_for_log(r"Plugin changed, needs restart.") + l1.daemon.wait_for_log(r"test_restart_on_update 2") + l1.stop() def test_plugin_shutdown(node_factory): @@ -3078,7 +3189,7 @@ def test_commando(node_factory, executor): # Check JSON id is as expected (unfortunately pytest does not use a reliable name # for itself: with -k it calls itself `-c` here, instead of `pytest`). - l2.daemon.wait_for_log(r'plugin-commando: "[^:/]*:commando#[0-9]*/cln:commando#[0-9]*"\[OUT\]') + l2.daemon.wait_for_log(r'plugin-commando: [^:/]*:commando#[0-9]*/cln:commando#[0-9]*\[OUT\]') l1.daemon.wait_for_log(r'jsonrpc#[0-9]*: "[^:/]*:commando#[0-9]*/cln:commando#[0-9]*/commando:listpeers#[0-9]*"\[IN\]') res = l2.rpc.call(method='commando', @@ -3428,10 +3539,26 @@ def test_autoclean_once(node_factory): def test_block_added_notifications(node_factory, bitcoind): """Test if a plugin gets notifications when a new block is found""" base = bitcoind.rpc.getblockchaininfo()["blocks"] - plugin = [ - os.path.join(os.getcwd(), "tests/plugins/block_added.py"), - ] - l1 = node_factory.get_node(options={"plugin": plugin}) + + def make_setup(): + blocks_catched = [] + + def setup(plugin): + @plugin.init() + def on_init(plugin, options, configuration, **kwargs): + blocks_catched.clear() + + @plugin.subscribe("block_added") + def notify_block_added(plugin, block_added, **kwargs): + blocks_catched.append(block_added["height"]) + + @plugin.method("blockscatched") + def return_moves(plugin): + return blocks_catched + + return setup + + l1 = node_factory.get_node(inline_plugin=make_setup()) ret = l1.rpc.call("blockscatched") assert len(ret) == 1 and ret[0] == base + 0 @@ -3440,7 +3567,7 @@ def test_block_added_notifications(node_factory, bitcoind): ret = l1.rpc.call("blockscatched") assert len(ret) == 3 and ret[0] == base + 0 and ret[2] == base + 2 - l2 = node_factory.get_node(options={"plugin": plugin}) + l2 = node_factory.get_node(inline_plugin=make_setup()) ret = l2.rpc.call("blockscatched") assert len(ret) == 1 and ret[0] == base + 2 @@ -4489,25 +4616,25 @@ def test_all_subscription(node_factory, directory): def test_dynamic_option_python_plugin(node_factory): plugin = os.path.join(os.getcwd(), "tests/plugins/dynamic_option.py") - ln = node_factory.get_node(options={"plugin": plugin}) - result = ln.rpc.listconfigs("test-dynamic-config") + l1 = node_factory.get_node(options={"plugin": plugin}) + result = l1.rpc.listconfigs("test-dynamic-config") assert result["configs"]["test-dynamic-config"]["value_str"] == "initial" - assert ln.rpc.dynamic_option_report() == {'test-dynamic-config': 'initial'} - result = ln.rpc.setconfig("test-dynamic-config", "changed") + assert l1.rpc.dynamic_option_report() == {'test-dynamic-config': 'initial'} + result = l1.rpc.setconfig("test-dynamic-config", "changed") assert result["config"]["value_str"] == "changed" - assert ln.rpc.dynamic_option_report() == {'test-dynamic-config': 'changed'} + assert l1.rpc.dynamic_option_report() == {'test-dynamic-config': 'changed'} - ln.daemon.wait_for_log( + l1.daemon.wait_for_log( 'dynamic_option.py:.*Setting config test-dynamic-config to changed' ) with pytest.raises(RpcError, match="I don't like bad values!"): - ln.rpc.setconfig("test-dynamic-config", "bad value") + l1.rpc.setconfig("test-dynamic-config", "bad value") # Does not alter value! - assert ln.rpc.dynamic_option_report() == {'test-dynamic-config': 'changed'} + assert l1.rpc.dynamic_option_report() == {'test-dynamic-config': 'changed'} def test_renepay_not_important(node_factory): diff --git a/tests/test_wallet.py b/tests/test_wallet.py index 651eb0e5dc8c..33b700d8a673 100644 --- a/tests/test_wallet.py +++ b/tests/test_wallet.py @@ -69,7 +69,7 @@ def test_withdraw(node_factory, bitcoind): # Side note: sendrawtransaction will trace back to withdrawl myname = os.path.splitext(os.path.basename(sys.argv[0]))[0] - l1.daemon.wait_for_log(r': "{}:withdraw#[0-9]*/cln:withdraw#[0-9]*/txprepare:sendpsbt#[0-9]*/cln:sendrawtransaction#[0-9]*"\[OUT\]'.format(myname)) + l1.daemon.wait_for_log(r': {}:withdraw#[0-9]*/cln:withdraw#[0-9]*/txprepare:sendpsbt#[0-9]*/cln:sendrawtransaction#[0-9]*\[OUT\]'.format(myname)) # Make sure bitcoind received the withdrawal unspent = l1.bitcoin.rpc.listunspent(0) diff --git a/tests/test_xpay.py b/tests/test_xpay.py index c419589ecc9c..6a839f805ca4 100644 --- a/tests/test_xpay.py +++ b/tests/test_xpay.py @@ -7,7 +7,6 @@ sync_blockheight, ) -import ast import os import pytest import re @@ -290,6 +289,10 @@ def test_xpay_fake_channeld(node_factory, bitcoind, chainparams, slow_mode): f"amount={AMOUNT}msat"]).decode('utf-8').strip() assert l1.rpc.decode(inv)['payee'] == nodeids[n] failed_parts.append(l1.rpc.xpay(inv)['failed_parts']) + # FIXME: We fail on #10, due mainly to a buildup of usage on 0x2134x0/0: + # Failed: We could not find a usable set of paths. The shortest path is 103x1x0->0x2134x0->1725x11x1725, but 0x2134x0/0 exceeds htlc_maximum_msat ~1000448msat + # So we "age" the xpay layer to forget old successful payments. + l1.rpc.askrene_age('xpay', 1) # Should be no reservations left (clean up happens after return though) wait_for(lambda: l1.rpc.askrene_listreservations() == {'reservations': []}) @@ -826,9 +829,46 @@ def zero_fields(obj, fieldnames): # other types are ignored return obj - plugin_path = os.path.join(os.getcwd(), 'tests/plugins/custom_notifications.py') - l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, - opts=[{"plugin": plugin_path}, {}, {}]) + part_starts = [] + part_ends = [] + + def setup(plugin): + @plugin.subscribe("pay_part_start") + def on_pay_part_start(origin, **kwargs): + part_starts.append(kwargs) + + @plugin.subscribe("pay_part_end") + def on_pay_part_end(origin, **kwargs): + part_ends.append(kwargs) + + @plugin.subscribe("pay_success") + def on_pay_success(origin, pay_success, **kwargs): + pass + + @plugin.subscribe("custom") + def on_custom_notification(origin, message, **kwargs): + pass + + @plugin.subscribe("ididntannouncethis") + def on_faulty_emit(origin, payload, **kwargs): + pass + + @plugin.method("emit") + def emit(plugin): + """Emit a simple string notification to topic "custom" """ + plugin.notify("custom", {'message': "Hello world"}) + + @plugin.method("faulty-emit") + def faulty_emit(plugin): + """Emit a simple string notification to topic "custom" """ + plugin.notify("ididntannouncethis", {'message': "Hello world"}) + + plugin.add_notification_topic("custom") + + l1 = node_factory.get_node(inline_plugin=setup) + l2 = node_factory.get_node() + l3 = node_factory.get_node() + node_factory.join_nodes([l1, l2, l3], wait_for_announce=True) scid12 = only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['short_channel_id'] scid12_dir = only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['direction'] @@ -837,9 +877,8 @@ def zero_fields(obj, fieldnames): inv1 = l3.rpc.invoice(5000000, 'test_attempt_notifications1', 'test_attempt_notifications1') l1.rpc.xpay(inv1['bolt11']) - line = l1.daemon.wait_for_log("plugin-custom_notifications.py: Got pay_part_start: ") - dict_str = line.split("Got pay_part_start: ", 1)[1] - data = zero_fields(ast.literal_eval(dict_str), ['groupid']) + wait_for(lambda: len(part_starts) >= 1) + data = zero_fields(part_starts.pop(0), ['groupid']) expected = {'pay_part_start': {'payment_hash': inv1['payment_hash'], 'groupid': 0, @@ -858,9 +897,8 @@ def zero_fields(obj, fieldnames): 'channel_out_msat': 5000000}]}} assert data == expected - line = l1.daemon.wait_for_log("plugin-custom_notifications.py: Got pay_part_end: ") - dict_str = line.split("Got pay_part_end: ", 1)[1] - data = zero_fields(ast.literal_eval(dict_str), ('duration', 'groupid')) + wait_for(lambda: len(part_ends) >= 1) + data = zero_fields(part_ends.pop(0), ('duration', 'groupid')) expected = {'pay_part_end': {'payment_hash': inv1['payment_hash'], 'status': 'success', @@ -876,9 +914,8 @@ def zero_fields(obj, fieldnames): with pytest.raises(RpcError, match=r"Destination said it doesn't know invoice: incorrect_or_unknown_payment_details"): l1.rpc.xpay(inv2['bolt11']) - line = l1.daemon.wait_for_log("plugin-custom_notifications.py: Got pay_part_start: ") - dict_str = line.split("Got pay_part_start: ", 1)[1] - data = zero_fields(ast.literal_eval(dict_str), ['groupid']) + wait_for(lambda: len(part_starts) >= 1) + data = zero_fields(part_starts.pop(0), ['groupid']) expected = {'pay_part_start': {'payment_hash': inv2['payment_hash'], 'groupid': 0, @@ -897,9 +934,8 @@ def zero_fields(obj, fieldnames): 'channel_out_msat': 10000000}]}} assert data == expected - line = l1.daemon.wait_for_log("plugin-custom_notifications.py: Got pay_part_end: ") - dict_str = line.split("Got pay_part_end: ", 1)[1] - data = zero_fields(ast.literal_eval(dict_str), ('duration', 'groupid')) + wait_for(lambda: len(part_ends) >= 1) + data = zero_fields(part_ends.pop(0), ('duration', 'groupid')) expected = {'pay_part_end': {'payment_hash': inv2['payment_hash'], 'status': 'failure', @@ -917,9 +953,8 @@ def zero_fields(obj, fieldnames): with pytest.raises(RpcError, match=r"Failed after 1 attempts"): l1.rpc.xpay(inv2['bolt11']) - line = l1.daemon.wait_for_log("plugin-custom_notifications.py: Got pay_part_start: ") - dict_str = line.split("Got pay_part_start: ", 1)[1] - data = zero_fields(ast.literal_eval(dict_str), ['groupid']) + wait_for(lambda: len(part_starts) >= 1) + data = zero_fields(part_starts.pop(0), ['groupid']) expected = {'pay_part_start': {'payment_hash': inv2['payment_hash'], 'groupid': 0, @@ -938,9 +973,8 @@ def zero_fields(obj, fieldnames): 'channel_out_msat': 10000000}]}} assert data == expected - line = l1.daemon.wait_for_log("plugin-custom_notifications.py: Got pay_part_end: ") - dict_str = line.split("Got pay_part_end: ", 1)[1] - data = zero_fields(ast.literal_eval(dict_str), ('duration', 'groupid', 'failed_msg')) + wait_for(lambda: len(part_ends) >= 1) + data = zero_fields(part_ends.pop(0), ('duration', 'groupid', 'failed_msg')) expected = {'pay_part_end': {'payment_hash': inv2['payment_hash'], 'status': 'failure', @@ -1341,6 +1375,23 @@ def test_sendamount(node_factory): ret = l1.rpc.sendamount(b12, "100sat") +def test_xpay_informs_askrene_on_success(node_factory): + """After a successful payment, xpay should add an impression to the xpay askrene layer.""" + l1, l2, l3 = node_factory.get_nodes(3) + node_factory.join_nodes([l1, l2, l3], wait_for_announce=True) + + inv = l3.rpc.invoice(100000, "test-inform", "test inform")["bolt11"] + l1.rpc.xpay(inv) + + # xpay skips the local channel (hops[0]), so only the l2->l3 hop gets an impression + scid23dir = first_scidd(l2, l3) + layers = l1.rpc.askrene_listlayers('xpay')['layers'] + impressions = only_one(layers)['impressions'] + assert len(impressions) == 1 + assert impressions[0]['short_channel_id_dir'] == scid23dir + assert impressions[0]['amount_msat'] == 100000 + + def test_sendamount_bip353(node_factory): fakebip353_plugin = Path(__file__).parent / "plugins" / "fakebip353.py" diff --git a/tools/lightning-downgrade.c b/tools/lightning-downgrade.c index a1fc9beb7b0f..abe8b04dec74 100644 --- a/tools/lightning-downgrade.c +++ b/tools/lightning-downgrade.c @@ -44,12 +44,16 @@ static void copy_data(u8 **out, const u8 *in, size_t len) tal_arr_appendn(out, in, len); } -/* askrene added DSTORE_CHANNEL_BIAS_V2 (convertable) and - * DSTORE_NODE_BIAS (not convertable) */ +/* v25.12: askrene added DSTORE_CHANNEL_BIAS_V2 (convertable) and + * DSTORE_NODE_BIAS (not convertable) + * v26.09: askrene added DSTORE_CHANNEL_IMPRESSION. + */ static const char *convert_layer_data(const tal_t *ctx, const char *layername, const u8 *data_in, - const u8 **data_out) + const u8 **data_out, + bool convert_bias, + bool convert_impression) { size_t len = tal_bytelen(data_in); struct node_id n; @@ -107,12 +111,29 @@ static const char *convert_layer_data(const tal_t *ctx, if (fromwire_dstore_channel_bias_v2(tmpctx, &data_in, &len, &scidd, &bias, &string, ×tamp)) { - towire_dstore_channel_bias(&out, &scidd, bias, string); + if (convert_bias) + towire_dstore_channel_bias(&out, &scidd, bias, string); + else + copy_data(&out, data_in, olddata - data_in); } continue; case DSTORE_NODE_BIAS: - return "Askrene has a node bias, which is not supported in v25.09"; + if (convert_bias) + return "Askrene has a node bias, which is not supported in v25.09"; + if (fromwire_dstore_node_bias(tmpctx, &data_in, &len, + &n, &string, &bias, &bias, ×tamp)) + copy_data(&out, data_in, olddata - data_in); + continue; + + case DSTORE_CHANNEL_IMPRESSION: + if (fromwire_dstore_channel_impression(tmpctx, &data_in, &len, + &scidd, ×tamp, &msat)) { + /* We don't convert, just omit these */ + if (!convert_impression) + copy_data(&out, data_in, olddata - data_in); + } + continue; } return tal_fmt(ctx, "Unknown askrene layer record %u in %s", type, layername); @@ -125,7 +146,10 @@ static const char *convert_layer_data(const tal_t *ctx, return NULL; } -static const char *downgrade_askrene_layers(const tal_t *ctx, struct db *db) +static const char *downgrade_askrene_layers(const tal_t *ctx, struct db *db, + bool convert_bias, + bool convert_impression) + { const char **base, **k; const u8 *data; @@ -149,7 +173,8 @@ static const char *downgrade_askrene_layers(const tal_t *ctx, struct db *db) continue; layer = tal(layers, struct layer); layer->key = tal_steal(layer, k); - err = convert_layer_data(layer, k[2], data, &layer->data); + err = convert_layer_data(layer, k[2], data, &layer->data, + convert_bias, convert_impression); if (err) { tal_free(stmt); return err; @@ -163,10 +188,21 @@ static const char *downgrade_askrene_layers(const tal_t *ctx, struct db *db) return NULL; } +static const char *downgrade_askrene_layers_bias(const tal_t *ctx, struct db *db) +{ + return downgrade_askrene_layers(ctx, db, true, true); +} + +static const char *downgrade_askrene_layers_impressions(const tal_t *ctx, struct db *db) +{ + return downgrade_askrene_layers(ctx, db, false, true); +} + static const struct db_version db_versions[] = { - { "v25.09", 276, downgrade_askrene_layers, false }, + { "v25.09", 276, downgrade_askrene_layers_bias, false }, { "v25.12", 280, NULL, false }, { "v26.04", 282, NULL, false }, + { "v26.06", 282, downgrade_askrene_layers_impressions, false }, }; static const struct db_version *version_db(const char *version)