diff --git a/.msggen.json b/.msggen.json index 69c6b3e16ece..eb2deba509be 100644 --- a/.msggen.json +++ b/.msggen.json @@ -1546,7 +1546,8 @@ }, "ExposesecretResponse": { "ExposeSecret.codex32": 2, - "ExposeSecret.identifier": 1 + "ExposeSecret.identifier": 1, + "ExposeSecret.mnemonic": 3 }, "FeeratesOnchainFeeEstimates": { "Feerates.onchain_fee_estimates.htlc_success_satoshis": 5, @@ -6760,6 +6761,10 @@ "added": "v24.11", "deprecated": null }, + "ExposeSecret.mnemonic": { + "added": "v25.12", + "deprecated": null + }, "ExposeSecret.passphrase": { "added": "v24.11", "deprecated": null diff --git a/ccan/README b/ccan/README index 0710c5f11eac..022df6bf65a6 100644 --- a/ccan/README +++ b/ccan/README @@ -1,3 +1,3 @@ CCAN imported from http://ccodearchive.net. -CCAN version: init-2602-gfd3fd70c +CCAN version: init-2605-gc47bf0d9 diff --git a/ccan/ccan/cdump/_info b/ccan/ccan/cdump/_info index c79d013b2c8a..5c2acee75d39 100644 --- a/ccan/ccan/cdump/_info +++ b/ccan/ccan/cdump/_info @@ -33,7 +33,7 @@ * size_t j; * * // Read code from stdin. - * code = grab_file(NULL, NULL); + * code = grab_file_str(NULL, NULL); * * defs = cdump_extract(NULL, code, &problems); * if (!defs) diff --git a/ccan/ccan/cdump/tools/cdump-enumstr.c b/ccan/ccan/cdump/tools/cdump-enumstr.c index f0b70ecdb574..147f2a231fd9 100644 --- a/ccan/ccan/cdump/tools/cdump-enumstr.c +++ b/ccan/ccan/cdump/tools/cdump-enumstr.c @@ -27,7 +27,7 @@ int main(int argc, char *argv[]) if (argc < 2) errx(1, "Usage: cdump-enumstr [...]"); - code = grab_file(NULL, streq(argv[1], "-") ? NULL : argv[1]); + code = grab_file_str(NULL, streq(argv[1], "-") ? NULL : argv[1]); if (!code) err(1, "Reading %s", argv[1]); diff --git a/ccan/ccan/crc32c/benchmark/bench.c b/ccan/ccan/crc32c/benchmark/bench.c index 54b2d97aa249..e584ae71ba43 100644 --- a/ccan/ccan/crc32c/benchmark/bench.c +++ b/ccan/ccan/crc32c/benchmark/bench.c @@ -31,7 +31,7 @@ int main(int argc, char *argv[]) if (argc < 2 || (runs = atol(argv[1])) == 0) errx(1, "Usage: bench []"); - p = grab_file(NULL, argv[2]); + p = grab_file_str(NULL, argv[2]); if (!p) err(1, "Reading %s", argv[2] ? argv[2] : ""); len = tal_count(p) - 1; diff --git a/ccan/ccan/htable/tools/hsearchspeed.c b/ccan/ccan/htable/tools/hsearchspeed.c index 88280114f384..bed6f859dc1d 100644 --- a/ccan/ccan/htable/tools/hsearchspeed.c +++ b/ccan/ccan/htable/tools/hsearchspeed.c @@ -29,7 +29,7 @@ int main(int argc, char *argv[]) char **w; ENTRY *words, *misswords; - w = tal_strsplit(NULL, grab_file(NULL, + w = tal_strsplit(NULL, grab_file_str(NULL, argv[1] ? argv[1] : "/usr/share/dict/words"), "\n", STR_NO_EMPTY); num = tal_count(w) - 1; printf("%zu words\n", num); diff --git a/ccan/ccan/htable/tools/stringspeed.c b/ccan/ccan/htable/tools/stringspeed.c index 5f30359a585e..24eb15877f0d 100644 --- a/ccan/ccan/htable/tools/stringspeed.c +++ b/ccan/ccan/htable/tools/stringspeed.c @@ -48,7 +48,7 @@ int main(int argc, char *argv[]) struct htable_str ht; char **words, **misswords; - words = tal_strsplit(NULL, grab_file(NULL, + words = tal_strsplit(NULL, grab_file_str(NULL, argv[1] ? argv[1] : "/usr/share/dict/words"), "\n", STR_NO_EMPTY); htable_str_init(&ht); diff --git a/ccan/ccan/rune/test/run.c b/ccan/ccan/rune/test/run.c index d90b701c609c..85cb6903b84d 100644 --- a/ccan/ccan/rune/test/run.c +++ b/ccan/ccan/rune/test/run.c @@ -39,7 +39,7 @@ int main(void) mr = rune_new(NULL, secret_zero, sizeof(secret_zero), NULL); /* Python runes library generates test vectors */ - vecs = grab_file(mr, "test/test_vectors.csv"); + vecs = grab_file_str(mr, "test/test_vectors.csv"); assert(vecs); lines = tal_strsplit(mr, take(vecs), "\n", STR_NO_EMPTY); diff --git a/ccan/ccan/strset/_info b/ccan/ccan/strset/_info index 982a9c0f851a..bcd261b92e90 100644 --- a/ccan/ccan/strset/_info +++ b/ccan/ccan/strset/_info @@ -32,7 +32,7 @@ * char *file, *word; * * strset_init(&words); - * file = grab_fd(NULL, 0); + * file = grab_fd_str(NULL, 0); * if (!file) * err(1, "Reading stdin"); * diff --git a/ccan/ccan/strset/tools/cbspeed.c b/ccan/ccan/strset/tools/cbspeed.c index 5d551b6e2c7f..88ce981a2858 100644 --- a/ccan/ccan/strset/tools/cbspeed.c +++ b/ccan/ccan/strset/tools/cbspeed.c @@ -395,7 +395,7 @@ int main(int argc, char *argv[]) critbit0_tree ct; char **words, **misswords; - words = tal_strsplit(NULL, grab_file(NULL, + words = tal_strsplit(NULL, grab_file_str(NULL, argv[1] ? argv[1] : "/usr/share/dict/words"), "\n", STR_NO_EMPTY); ct.root = NULL; num = tal_count(words) - 1; diff --git a/ccan/ccan/strset/tools/speed.c b/ccan/ccan/strset/tools/speed.c index 325b3a888d63..70a43c2569f9 100644 --- a/ccan/ccan/strset/tools/speed.c +++ b/ccan/ccan/strset/tools/speed.c @@ -46,7 +46,7 @@ int main(int argc, char *argv[]) struct strset set; char **words, **misswords; - words = tal_strsplit(NULL, grab_file(NULL, + words = tal_strsplit(NULL, grab_file_str(NULL, argv[1] ? argv[1] : "/usr/share/dict/words"), "\n", STR_NO_EMPTY); strset_init(&set); diff --git a/ccan/ccan/tal/grab_file/_info b/ccan/ccan/tal/grab_file/_info index 056f10990b08..9b130a5fba9f 100644 --- a/ccan/ccan/tal/grab_file/_info +++ b/ccan/ccan/tal/grab_file/_info @@ -20,7 +20,7 @@ * * if (argc > 2) * err(1, "Takes 0 or 1 arguments"); - * file = grab_file(NULL, argv[1]); + * file = grab_file_str(NULL, argv[1]); * if (!file) * err(1, "Could not read file %s", argv[1]); * if (strlen(file)+1 != tal_count(file)) @@ -45,6 +45,7 @@ int main(int argc, char *argv[]) return 1; if (strcmp(argv[1], "depends") == 0) { + printf("ccan/compiler\n"); printf("ccan/tal\n"); printf("ccan/noerr\n"); return 0; diff --git a/ccan/ccan/tal/grab_file/grab_file.c b/ccan/ccan/tal/grab_file/grab_file.c index 6528780a6781..fcadc8334362 100644 --- a/ccan/ccan/tal/grab_file/grab_file.c +++ b/ccan/ccan/tal/grab_file/grab_file.c @@ -8,7 +8,7 @@ #include #include -void *grab_fd(const void *ctx, int fd) +static void *grab_fd_internal(const void *ctx, int fd, bool add_nul_term) { int ret; size_t max, size; @@ -22,7 +22,7 @@ void *grab_fd(const void *ctx, int fd) else max = 16384; - buffer = tal_arr(ctx, char, max+1); + buffer = tal_arr(ctx, char, max+add_nul_term); while ((ret = read(fd, buffer + size, max - size)) != 0) { if (ret < 0) { if (errno == EINTR) @@ -35,19 +35,20 @@ void *grab_fd(const void *ctx, int fd) if (extra > 1024 * 1024) extra = 1024 * 1024; - if (!tal_resize(&buffer, max+extra+1)) + if (!tal_resize(&buffer, max+extra+add_nul_term)) return NULL; max += extra; } } - buffer[size] = '\0'; - tal_resize(&buffer, size+1); + if (add_nul_term) + buffer[size] = '\0'; + tal_resize(&buffer, size+add_nul_term); return buffer; } -void *grab_file(const void *ctx, const char *filename) +static void *grab_file_internal(const void *ctx, const char *filename, bool add_nul_term) { int fd; char *buffer; @@ -60,7 +61,27 @@ void *grab_file(const void *ctx, const char *filename) if (fd < 0) return NULL; - buffer = grab_fd(ctx, fd); + buffer = grab_fd_internal(ctx, fd, add_nul_term); close_noerr(fd); return buffer; } + +void *grab_fd_raw(const void *ctx, int fd) +{ + return grab_fd_internal(ctx, fd, false); +} + +void *grab_fd_str(const void *ctx, int fd) +{ + return grab_fd_internal(ctx, fd, true); +} + +void *grab_file_str(const void *ctx, const char *filename) +{ + return grab_file_internal(ctx, filename, true); +} + +void *grab_file_raw(const void *ctx, const char *filename) +{ + return grab_file_internal(ctx, filename, false); +} diff --git a/ccan/ccan/tal/grab_file/grab_file.h b/ccan/ccan/tal/grab_file/grab_file.h index 2eb1a0082ef7..f2f7e6731a43 100644 --- a/ccan/ccan/tal/grab_file/grab_file.h +++ b/ccan/ccan/tal/grab_file/grab_file.h @@ -2,9 +2,31 @@ #ifndef CCAN_TAL_GRAB_FILE_H #define CCAN_TAL_GRAB_FILE_H #include // For size_t +#include /** - * grab_fd - read all of a file descriptor into memory + * grab_fd_raw - read all of a file descriptor into memory WITHOUT adding a nul. + * @ctx: the context to tallocate from (often NULL) + * @fd: the file descriptor to read from + * @size: the (optional) size of the file + * + * This function reads from the given file descriptor until no more + * input is available. The content is talloced off @ctx, and the + * tal_count() is the size in bytes. + * + * Note that this does *not* currently exit on EINTR, but continues + * reading. * + * Example: + * // Return the first line. + * static char *read_stdin_all(void) + * { + * return grab_fd_raw(NULL, 0); + * } + */ +void *grab_fd_raw(const void *ctx, int fd); + +/** + * grab_fd_str - read all of a file descriptor into memory with a NUL terminator. * @ctx: the context to tallocate from (often NULL) * @fd: the file descriptor to read from * @@ -25,7 +47,7 @@ * { * char **lines, *all; * - * all = grab_fd(NULL, 0); + * all = grab_fd_str(NULL, 0); * if (!all) * return NULL; * lines = tal_strsplit(NULL, all, "\n", STR_EMPTY_OK); @@ -33,10 +55,18 @@ * return lines; * } */ -void *grab_fd(const void *ctx, int fd); +void *grab_fd_str(const void *ctx, int fd); + +/* Deprecated synonym for grab_fd_str */ +static inline void *grab_fd(const void *ctx, int fd) + WARN_DEPRECATED; +static inline void *grab_fd(const void *ctx, int fd) +{ + return grab_fd_str(ctx, fd); +} /** - * grab_file - read all of a file (or stdin) into memory + * grab_file_str - read all of a file (or stdin) into memory with a NUL terminator * @ctx: the context to tallocate from (often NULL) * @filename: the file to read (NULL for stdin) * @@ -51,7 +81,7 @@ void *grab_fd(const void *ctx, int fd); * { * char **lines, *all; * - * all = grab_file(NULL, filename); + * all = grab_file_str(NULL, filename); * if (!all) * return NULL; * lines = tal_strsplit(NULL, all, "\n", STR_EMPTY_OK); @@ -59,5 +89,32 @@ void *grab_fd(const void *ctx, int fd); * return lines; * } */ -void *grab_file(const void *ctx, const char *filename); +void *grab_file_str(const void *ctx, const char *filename); + +/** + * grab_file_raw - read all of a file (or stdin) into memory WITHOUT a NUL terminator + * @ctx: the context to tallocate from (often NULL) + * @filename: the file to read (NULL for stdin) + * @size: the (optional) size of the file + * + * This function reads from the given file until no more input is + * available. The content is talloced off @ctx, and the tal_count() + * is the size in bytes. + * + * Example: + * static char *read_file_all(const char *filename) + * { + * return grab_file_raw(NULL, filename); + * } + */ +void *grab_file_raw(const void *ctx, const char *filename); + +/* Deprecated synonym for grab_file_str */ +static inline void *grab_file(const void *ctx, const char *filename) + WARN_DEPRECATED; +static inline void *grab_file(const void *ctx, const char *filename) +{ + return grab_file_str(ctx, filename); +} + #endif /* CCAN_TAL_GRAB_FILE_H */ diff --git a/ccan/ccan/tal/grab_file/test/run-grab.c b/ccan/ccan/tal/grab_file/test/run-grab.c index ddb5ca307a48..02e78aca719e 100644 --- a/ccan/ccan/tal/grab_file/test/run-grab.c +++ b/ccan/ccan/tal/grab_file/test/run-grab.c @@ -1,4 +1,4 @@ -/* This is test for grab_file() function +/* This is test for grab_file_str() and grab_file_raw() functions */ #include #include @@ -13,25 +13,31 @@ int main(void) { unsigned int i; - char **split, *str; + char **split, *str, *raw; int length; struct stat st; - str = grab_file(NULL, "test/run-grab.c"); + plan_tests(5); + str = grab_file_str(NULL, "test/run-grab.c"); split = tal_strsplit(str, str, "\n", STR_EMPTY_OK); length = strlen(split[0]); - ok1(!strcmp(split[0], "/* This is test for grab_file() function")); + ok1(!strcmp(split[0], "This is test for grab_file_str() and grab_file_raw() functions")); for (i = 1; split[i]; i++) length += strlen(split[i]); - ok1(!strcmp(split[i-1], "/* End of grab_file() test */")); + ok1(!strcmp(split[i-1], "/* End of grab_file.c test */")); if (stat("test/run-grab.c", &st) != 0) /* FIXME: ditto */ if (stat("ccan/tal/grab_file/test/run-grab.c", &st) != 0) err(1, "Could not stat self"); ok1(st.st_size == length + i); + + /* Raw does not nul term */ + raw = grab_file_raw(str, "test/run-grab.c"); + ok1(tal_count(raw) + 1 == tal_count(str)); + ok1(memcmp(raw, str, tal_bytelen(raw)) == 0); tal_free(str); return 0; } -/* End of grab_file() test */ +/* End of grab_file.c test */ diff --git a/ccan/ccan/tal/str/_info b/ccan/ccan/tal/str/_info index 9b9c70b6be7f..83e089e717e9 100644 --- a/ccan/ccan/tal/str/_info +++ b/ccan/ccan/tal/str/_info @@ -25,7 +25,7 @@ * if (argc > 2) * errx(1, "Takes 0 or 1 arguments"); * // Grab lines in file. - * textfile = grab_file(NULL, argv[1]); + * textfile = grab_file_str(NULL, argv[1]); * if (!textfile) * err(1, "Failed reading %s", argv[1]); * lines = tal_strsplit(textfile, textfile, "\n", STR_EMPTY_OK); diff --git a/ccan/tools/configurator/configurator.c b/ccan/tools/configurator/configurator.c index 4efeaba35ac5..085034fd0eec 100644 --- a/ccan/tools/configurator/configurator.c +++ b/ccan/tools/configurator/configurator.c @@ -137,8 +137,8 @@ static const struct test base_tests[] = { "DEFINES_FUNC", NULL, NULL, "static int __attribute__((const)) func(int x) { return x; }" }, { "HAVE_ATTRIBUTE_DEPRECATED", "__attribute__((deprecated)) support", - "DEFINES_FUNC", NULL, NULL, - "static int __attribute__((deprecated)) func(int x) { return x; }" }, + "OUTSIDE_MAIN", NULL, NULL, + "int __attribute__((deprecated)) depr(int x);" }, { "HAVE_ATTRIBUTE_NONNULL", "__attribute__((nonnull)) support", "DEFINES_FUNC", NULL, NULL, "static char *__attribute__((nonnull)) func(char *p) { return p; }" }, diff --git a/cln-grpc/proto/node.proto b/cln-grpc/proto/node.proto index 8a27e150aafc..ec0d8d30e04d 100644 --- a/cln-grpc/proto/node.proto +++ b/cln-grpc/proto/node.proto @@ -740,6 +740,7 @@ message ExposesecretRequest { message ExposesecretResponse { string identifier = 1; string codex32 = 2; + optional string mnemonic = 3; } message RecoverRequest { diff --git a/cln-grpc/src/convert.rs b/cln-grpc/src/convert.rs index 8fb46d61f3e9..d7a666d92088 100644 --- a/cln-grpc/src/convert.rs +++ b/cln-grpc/src/convert.rs @@ -616,6 +616,7 @@ impl From for pb::ExposesecretResponse { Self { codex32: c.codex32, // Rule #2 for type string identifier: c.identifier, // Rule #2 for type string + mnemonic: c.mnemonic, // Rule #2 for type string? } } } diff --git a/cln-rpc/src/model.rs b/cln-rpc/src/model.rs index 8fc527527afa..45c099024e4e 100644 --- a/cln-rpc/src/model.rs +++ b/cln-rpc/src/model.rs @@ -5937,6 +5937,8 @@ pub mod responses { #[derive(Clone, Debug, Deserialize, Serialize)] pub struct ExposesecretResponse { + #[serde(skip_serializing_if = "Option::is_none")] + pub mnemonic: Option, pub codex32: String, pub identifier: String, } diff --git a/common/Makefile b/common/Makefile index 2c407e7d8482..cfc099d8a26b 100644 --- a/common/Makefile +++ b/common/Makefile @@ -45,7 +45,7 @@ COMMON_SRC_NOGEN := \ common/hash_u5.c \ common/hmac.c \ common/hsm_capable.c \ - common/hsm_encryption.c \ + common/hsm_secret.c \ common/htlc_state.c \ common/htlc_trim.c \ common/htlc_tx.c \ diff --git a/common/configdir.c b/common/configdir.c index b4e401a11c59..dbb494ee9359 100644 --- a/common/configdir.c +++ b/common/configdir.c @@ -62,7 +62,7 @@ static struct configvar **gather_file_configvars(const tal_t *ctx, char *contents, **lines; struct configvar **cvs = tal_arr(ctx, struct configvar *, 0); - contents = grab_file(tmpctx, filename); + contents = grab_file_str(tmpctx, filename); /* The default config doesn't have to exist, but if the config was * specified on the command line it has to exist. */ diff --git a/common/daemon.c b/common/daemon.c index c3adac2a0255..6515828386be 100644 --- a/common/daemon.c +++ b/common/daemon.c @@ -1,5 +1,8 @@ #include "config.h" #include +/*~ This is Ian Lance Taylor's libbacktrace. It turns out that it's + * horrifically difficult to obtain a decent backtrace in C; the standard + * backtrace function is useless in most programs. */ #include #include #include diff --git a/common/hsm_encryption.c b/common/hsm_encryption.c deleted file mode 100644 index 3486773dd4f3..000000000000 --- a/common/hsm_encryption.c +++ /dev/null @@ -1,158 +0,0 @@ -#include "config.h" -#include -#include -#include -#include -#include - -int hsm_secret_encryption_key_with_exitcode(const char *pass, struct secret *key, - const char **err_msg) -{ - u8 salt[16] = "c-lightning\0\0\0\0\0"; - - /* Don't swap the encryption key ! */ - if (sodium_mlock(key->data, sizeof(key->data)) != 0) { - if (err_msg) - *err_msg = "Could not lock hsm_secret encryption key memory."; - return EXITCODE_HSM_GENERIC_ERROR; - } - - /* Check bounds. */ - if (strlen(pass) < crypto_pwhash_argon2id_PASSWD_MIN) { - if (err_msg) - *err_msg = "Password too short to be able to derive a key from it."; - return EXITCODE_HSM_BAD_PASSWORD; - } else if (strlen(pass) > crypto_pwhash_argon2id_PASSWD_MAX) { - if (err_msg) - *err_msg = "Password too long to be able to derive a key from it."; - return EXITCODE_HSM_BAD_PASSWORD; - } - - /* Now derive the key. */ - if (crypto_pwhash(key->data, sizeof(key->data), pass, strlen(pass), salt, - /* INTERACTIVE needs 64 MiB of RAM, MODERATE needs 256, - * and SENSITIVE needs 1024. */ - crypto_pwhash_argon2id_OPSLIMIT_MODERATE, - crypto_pwhash_argon2id_MEMLIMIT_MODERATE, - crypto_pwhash_ALG_ARGON2ID13) != 0) { - if (err_msg) - *err_msg = "Could not derive a key from the password."; - return EXITCODE_HSM_BAD_PASSWORD; - } - - return 0; -} - -bool encrypt_hsm_secret(const struct secret *encryption_key, - const struct secret *hsm_secret, - struct encrypted_hsm_secret *output) -{ - crypto_secretstream_xchacha20poly1305_state crypto_state; - - if (crypto_secretstream_xchacha20poly1305_init_push(&crypto_state, output->data, - encryption_key->data) != 0) - return false; - if (crypto_secretstream_xchacha20poly1305_push(&crypto_state, - output->data + HS_HEADER_LEN, - NULL, hsm_secret->data, - sizeof(hsm_secret->data), - /* Additional data and tag */ - NULL, 0, 0)) - return false; - - return true; -} - -bool decrypt_hsm_secret(const struct secret *encryption_key, - const struct encrypted_hsm_secret *cipher, - struct secret *output) -{ - crypto_secretstream_xchacha20poly1305_state crypto_state; - - /* The header part */ - if (crypto_secretstream_xchacha20poly1305_init_pull(&crypto_state, cipher->data, - encryption_key->data) != 0) - return false; - /* The ciphertext part */ - if (crypto_secretstream_xchacha20poly1305_pull(&crypto_state, output->data, - NULL, 0, - cipher->data + HS_HEADER_LEN, - HS_CIPHERTEXT_LEN, - NULL, 0) != 0) - return false; - - return true; -} - -/* Returns -1 on error (and sets errno), 0 if not encrypted, 1 if it is */ -int is_hsm_secret_encrypted(const char *path) -{ - struct stat st; - - if (stat(path, &st) != 0) - return -1; - - return st.st_size == ENCRYPTED_HSM_SECRET_LEN; -} - -void discard_key(struct secret *key TAKES) -{ - /* sodium_munlock() also zeroes the memory. */ - sodium_munlock(key->data, sizeof(key->data)); - if (taken(key)) - tal_free(key); -} - -/* Read a line from stdin, do not take the newline character into account. */ -static bool getline_stdin_pass(char **passwd, size_t *passwd_size) -{ - if (getline(passwd, passwd_size, stdin) < 0) - return false; - - if ((*passwd)[strlen(*passwd) - 1] == '\n') - (*passwd)[strlen(*passwd) - 1] = '\0'; - - return true; -} - -char *read_stdin_pass_with_exit_code(const char **reason, int *exit_code) -{ - struct termios current_term, temp_term; - char *passwd = NULL; - size_t passwd_size = 0; - - if (isatty(fileno(stdin))) { - /* Set a temporary term, same as current but with ECHO disabled. */ - if (tcgetattr(fileno(stdin), ¤t_term) != 0) { - *reason = "Could not get current terminal options."; - *exit_code = EXITCODE_HSM_PASSWORD_INPUT_ERR; - return NULL; - } - temp_term = current_term; - temp_term.c_lflag &= ~ECHO; - if (tcsetattr(fileno(stdin), TCSANOW, &temp_term) != 0) { - *reason = "Could not disable pass echoing."; - *exit_code = EXITCODE_HSM_PASSWORD_INPUT_ERR; - return NULL; - } - - if (!getline_stdin_pass(&passwd, &passwd_size)) { - *reason = "Could not read pass from stdin."; - *exit_code = EXITCODE_HSM_PASSWORD_INPUT_ERR; - return NULL; - } - - /* Restore the original terminal */ - if (tcsetattr(fileno(stdin), TCSANOW, ¤t_term) != 0) { - *reason = "Could not restore terminal options."; - free(passwd); - *exit_code = EXITCODE_HSM_PASSWORD_INPUT_ERR; - return NULL; - } - } else if (!getline_stdin_pass(&passwd, &passwd_size)) { - *reason = "Could not read pass from stdin."; - *exit_code = EXITCODE_HSM_PASSWORD_INPUT_ERR; - return NULL; - } - return passwd; -} diff --git a/common/hsm_encryption.h b/common/hsm_encryption.h deleted file mode 100644 index af67701adead..000000000000 --- a/common/hsm_encryption.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef LIGHTNING_COMMON_HSM_ENCRYPTION_H -#define LIGHTNING_COMMON_HSM_ENCRYPTION_H -#include "config.h" -#include -#include - -/* Length of the encrypted hsm secret header. */ -#define HS_HEADER_LEN crypto_secretstream_xchacha20poly1305_HEADERBYTES -/* From libsodium: "The ciphertext length is guaranteed to always be message - * length + ABYTES" */ -#define HS_CIPHERTEXT_LEN \ - (sizeof(struct secret) + crypto_secretstream_xchacha20poly1305_ABYTES) -/* Total length of an encrypted hsm_secret */ -#define ENCRYPTED_HSM_SECRET_LEN (HS_HEADER_LEN + HS_CIPHERTEXT_LEN) - -struct encrypted_hsm_secret { - u8 data[ENCRYPTED_HSM_SECRET_LEN]; -}; - -/** Derive the hsm_secret encryption key from a passphrase. - * @pass: the passphrase string. - * @encryption_key: the output key derived from the passphrase. - * @err_msg: if not NULL the error message contains the reason of the failure. - * - * On success, 0 is returned, on error a value > 0 is returned and it can be used as exit code. - */ -int hsm_secret_encryption_key_with_exitcode(const char *pass, struct secret *key, - const char **err_msg); - -/** Encrypt the hsm_secret using a previously derived encryption key. - * @encryption_key: the key derived from the passphrase. - * @hsm_secret: the plaintext hsm_secret to encrypt. - * @output: the resulting encrypted hsm_secret. - * - * Return false on encryption failure. - */ -bool encrypt_hsm_secret(const struct secret *encryption_key, - const struct secret *hsm_secret, - struct encrypted_hsm_secret *output); - -/** Decrypt the hsm_secret using a previously derived encryption key. - * @encryption_key: the key derived from the passphrase. - * @cipher: the encrypted hsm_secret to decrypt. - * @output: the resulting hsm_secret. - * - * Return false on decryption failure. - */ -bool decrypt_hsm_secret(const struct secret *encryption_key, - const struct encrypted_hsm_secret *cipher, - struct secret *output); - -/** Unlock and zeroize the encryption key memory after use. - * @key: the encryption key. If taken, it will be tal_free'd - */ -void discard_key(struct secret *key TAKES); - -/** Read hsm_secret encryption pass from stdin, disabling echoing. - * @reason: if NULL is returned, will point to the human-readable error, - * and the correct exit code is returned by the exit_code parameter. - * - * Caller must free the string as it does tal-reallocate getline's output. - */ -char *read_stdin_pass_with_exit_code(const char **reason, int *exit_code); - -/** Returns -1 on error (and sets errno), 0 if not encrypted, 1 if it is */ -int is_hsm_secret_encrypted(const char *path); -#endif /* LIGHTNING_COMMON_HSM_ENCRYPTION_H */ diff --git a/common/hsm_secret.c b/common/hsm_secret.c new file mode 100644 index 000000000000..62348627f3d3 --- /dev/null +++ b/common/hsm_secret.c @@ -0,0 +1,511 @@ +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* HSM secret size constants */ +#define HSM_SECRET_PLAIN_SIZE 32 +#define HSM_SECRET_MNEMONIC_SIZE 64 + +/* Length of the encrypted hsm secret header. */ +#define HS_HEADER_LEN crypto_secretstream_xchacha20poly1305_HEADERBYTES +/* From libsodium: "The ciphertext length is guaranteed to always be message + * length + ABYTES" */ +#define HS_CIPHERTEXT_LEN \ + (sizeof(struct secret) + crypto_secretstream_xchacha20poly1305_ABYTES) +/* Total length of an encrypted hsm_secret */ +#define ENCRYPTED_HSM_SECRET_LEN (HS_HEADER_LEN + HS_CIPHERTEXT_LEN) +#define PASSPHRASE_HASH_LEN 32 +#define HSM_SECRET_PLAIN_SIZE 32 + +/* Helper function to validate a mnemonic string */ +static bool validate_mnemonic(const char *mnemonic, enum hsm_secret_error *err) +{ + struct words *words; + bool ok; + + tal_wally_start(); + if (bip39_get_wordlist("en", &words) != WALLY_OK) { + abort(); + } + + ok = (bip39_mnemonic_validate(words, mnemonic) == WALLY_OK); + + /* Wordlists can persist, so provide a common context! */ + tal_wally_end(notleak_with_children(tal(NULL, char))); + + if (!ok) { + *err = HSM_SECRET_ERR_INVALID_MNEMONIC; + return false; + } + + return true; +} + +struct secret *get_encryption_key(const tal_t *ctx, const char *passphrase) +{ + struct secret *secret = tal(ctx, struct secret); + const u8 salt[16] = "c-lightning\0\0\0\0\0"; + + /* Check bounds. */ + if (strlen(passphrase) < crypto_pwhash_argon2id_PASSWD_MIN) { + return tal_free(secret); + } else if (strlen(passphrase) > crypto_pwhash_argon2id_PASSWD_MAX) { + return tal_free(secret); + } + + /* Don't swap the encryption key ! */ + mlock_tal_memory(secret); + + /* Now derive the key. */ + if (crypto_pwhash(secret->data, sizeof(secret->data), passphrase, strlen(passphrase), salt, + /* INTERACTIVE needs 64 MiB of RAM, MODERATE needs 256, + * and SENSITIVE needs 1024. */ + crypto_pwhash_argon2id_OPSLIMIT_MODERATE, + crypto_pwhash_argon2id_MEMLIMIT_MODERATE, + crypto_pwhash_ALG_ARGON2ID13) != 0) { + return tal_free(secret); + } + + return secret; +} + +bool hsm_secret_needs_passphrase(const u8 *hsm_secret, size_t len) +{ + switch (detect_hsm_secret_type(hsm_secret, len)) { + case HSM_SECRET_ENCRYPTED: + case HSM_SECRET_MNEMONIC_WITH_PASS: + return true; + case HSM_SECRET_PLAIN: + case HSM_SECRET_MNEMONIC_NO_PASS: + case HSM_SECRET_INVALID: + return false; + } + abort(); +} + +enum hsm_secret_type detect_hsm_secret_type(const u8 *hsm_secret, size_t len) +{ + /* Check for invalid cases first and return early */ + if (len < HSM_SECRET_PLAIN_SIZE) + return HSM_SECRET_INVALID; + + /* Legacy 32-byte plain format */ + if (len == HSM_SECRET_PLAIN_SIZE) + return HSM_SECRET_PLAIN; + + /* Legacy 73-byte encrypted format */ + if (len == ENCRYPTED_HSM_SECRET_LEN) + return HSM_SECRET_ENCRYPTED; + + /* Since HSM_SECRET_PLAIN_SIZE == 32, this must be true! */ + assert(len >= sizeof(struct sha256)); + + /* First 32 bytes are the hash of the resulting seed: all 0 + * for "no passphrase" */ + if (memeqzero(hsm_secret, sizeof(struct sha256))) + return HSM_SECRET_MNEMONIC_NO_PASS; + else + return HSM_SECRET_MNEMONIC_WITH_PASS; +} + +struct bip32_seed { + u8 seed[BIP39_SEED_LEN_512]; +}; + +static bool mnemonic_to_seed(const char *mnemonic, const char *passphrase, + struct bip32_seed *bip32_seed) +{ + size_t len; + + tal_wally_start(); + if (bip39_mnemonic_to_seed(mnemonic, passphrase, + bip32_seed->seed, sizeof(bip32_seed->seed), + &len) != WALLY_OK) { + tal_wally_end(tmpctx); + return false; + } + /* libwally only allocate the salt temporarily, so context + * doesn't matter. */ + tal_wally_end(tmpctx); + + assert(len == sizeof(bip32_seed->seed)); + return true; +} + +/* Helper function to derive seed hash from mnemonic + passphrase */ +bool derive_seed_hash(const char *mnemonic, const char *passphrase, struct sha256 *seed_hash) +{ + struct bip32_seed bip32_seed; + + if (!passphrase) { + /* No passphrase - return zero hash */ + memset(seed_hash, 0, sizeof(*seed_hash)); + return true; + } + + if (!mnemonic_to_seed(mnemonic, passphrase, &bip32_seed)) + return false; + + sha256(seed_hash, bip32_seed.seed, sizeof(bip32_seed.seed)); + return true; +} + +static bool decrypt_hsm_secret(const struct secret *encryption_key, + const u8 *cipher, + struct secret *output) +{ + crypto_secretstream_xchacha20poly1305_state crypto_state; + + /* The header part */ + if (crypto_secretstream_xchacha20poly1305_init_pull(&crypto_state, cipher, + encryption_key->data) != 0) + return false; + /* The ciphertext part */ + if (crypto_secretstream_xchacha20poly1305_pull(&crypto_state, output->data, + NULL, 0, + cipher + HS_HEADER_LEN, + HS_CIPHERTEXT_LEN, + NULL, 0) != 0) + return false; + + return true; +} + +/* Helper function to convert error codes to human-readable messages */ +const char *hsm_secret_error_str(enum hsm_secret_error err) +{ + switch (err) { + case HSM_SECRET_OK: + return "Success"; + case HSM_SECRET_ERR_PASSPHRASE_REQUIRED: + return "Passphrase required but not provided"; + case HSM_SECRET_ERR_PASSPHRASE_NOT_NEEDED: + return "Passphrase provided but not needed"; + case HSM_SECRET_ERR_WRONG_PASSPHRASE: + return "Wrong passphrase"; + case HSM_SECRET_ERR_INVALID_MNEMONIC: + return "Invalid mnemonic"; + case HSM_SECRET_ERR_ENCRYPTION_FAILED: + return "Encryption failed"; + case HSM_SECRET_ERR_SEED_DERIVATION_FAILED: + return "Could not derive seed from mnemonic"; + case HSM_SECRET_ERR_INVALID_FORMAT: + return "Invalid hsm_secret format"; + case HSM_SECRET_ERR_TERMINAL: + return "Terminal error"; + } + return "Unknown error"; +} + +static struct hsm_secret *extract_plain_secret(const tal_t *ctx, + const u8 *hsm_secret, + size_t len, + enum hsm_secret_error *err) +{ + struct hsm_secret *hsms = tal(ctx, struct hsm_secret); + + assert(len == HSM_SECRET_PLAIN_SIZE); + hsms->type = HSM_SECRET_PLAIN; + hsms->mnemonic = NULL; + + /* Allocate and populate secret_data (new field) */ + hsms->secret_data = tal_dup_arr(hsms, u8, hsm_secret, HSM_SECRET_PLAIN_SIZE, 0); + + *err = HSM_SECRET_OK; + return hsms; +} + +static struct hsm_secret *extract_encrypted_secret(const tal_t *ctx, + const u8 *hsm_secret, + size_t len, + const char *passphrase, + enum hsm_secret_error *err) +{ + struct hsm_secret *hsms = tal(ctx, struct hsm_secret); + struct secret *encryption_key; + bool decrypt_success; + + if (!passphrase) { + *err = HSM_SECRET_ERR_PASSPHRASE_REQUIRED; + return tal_free(hsms); + } + encryption_key = get_encryption_key(tmpctx, passphrase); + if (!encryption_key) { + *err = HSM_SECRET_ERR_WRONG_PASSPHRASE; + return tal_free(hsms); + } + + /* Attempt decryption */ + struct secret temp_secret; + decrypt_success = decrypt_hsm_secret(encryption_key, hsm_secret, &temp_secret); + if (!decrypt_success) { + *err = HSM_SECRET_ERR_WRONG_PASSPHRASE; + return tal_free(hsms); + } + + /* Duplicate decrypted secret data */ + hsms->secret_data = tal_dup_arr(hsms, u8, temp_secret.data, HSM_SECRET_PLAIN_SIZE, 0); + + hsms->type = HSM_SECRET_ENCRYPTED; + hsms->mnemonic = NULL; + + *err = HSM_SECRET_OK; + return hsms; +} + +static struct hsm_secret *extract_mnemonic_secret(const tal_t *ctx, + const u8 *hsm_secret, + size_t len, + const char *passphrase, + enum hsm_secret_type type, + enum hsm_secret_error *err) +{ + struct hsm_secret *hsms = tal(ctx, struct hsm_secret); + const u8 *mnemonic_start; + size_t mnemonic_len; + struct bip32_seed bip32_seed; + + assert(type == HSM_SECRET_MNEMONIC_NO_PASS || type == HSM_SECRET_MNEMONIC_WITH_PASS); + hsms->type = type; + + /* Extract mnemonic portion (skip first 32 bytes which are passphrase hash) */ + mnemonic_start = hsm_secret + PASSPHRASE_HASH_LEN; + + assert(len > PASSPHRASE_HASH_LEN); + mnemonic_len = len - PASSPHRASE_HASH_LEN; + + /* Copy into convenient string form */ + hsms->mnemonic = tal_strndup(hsms, (const char *)mnemonic_start, mnemonic_len); + + /* Validate passphrase if required */ + if (type == HSM_SECRET_MNEMONIC_WITH_PASS) { + if (!passphrase) { + *err = HSM_SECRET_ERR_PASSPHRASE_REQUIRED; + return tal_free(hsms); + } + + /* Validate passphrase by comparing stored hash with computed hash */ + struct sha256 stored_hash, computed_hash; + memcpy(&stored_hash, hsm_secret, sizeof(stored_hash)); + if (!derive_seed_hash(hsms->mnemonic, passphrase, &computed_hash)) { + *err = HSM_SECRET_ERR_SEED_DERIVATION_FAILED; + return tal_free(hsms); + } + if (!sha256_eq(&stored_hash, &computed_hash)) { + *err = HSM_SECRET_ERR_WRONG_PASSPHRASE; + return tal_free(hsms); + } + } else { + if (passphrase) { + *err = HSM_SECRET_ERR_PASSPHRASE_NOT_NEEDED; + return tal_free(hsms); + } + } + + /* Validate mnemonic */ + if (!validate_mnemonic(hsms->mnemonic, err)) { + return tal_free(hsms); + } + + if (!mnemonic_to_seed(hsms->mnemonic, passphrase, &bip32_seed)) { + *err = HSM_SECRET_ERR_SEED_DERIVATION_FAILED; + return tal_free(hsms); + } + + /* Allocate and populate secret_data with full 64-byte seed */ + hsms->secret_data = tal_dup_arr(hsms, u8, bip32_seed.seed, sizeof(bip32_seed.seed), 0); + + *err = HSM_SECRET_OK; + return hsms; +} + +/* If hsm_secret_needs_passphrase, passphrase must not be NULL. + * Returns NULL on failure. */ +struct hsm_secret *extract_hsm_secret(const tal_t *ctx, + const u8 *hsm_secret, size_t len, + const char *passphrase, + enum hsm_secret_error *err) +{ + enum hsm_secret_type type = detect_hsm_secret_type(hsm_secret, len); + + /* Switch will cause gcc to complain if a type isn't handled. */ + switch (type) { + case HSM_SECRET_PLAIN: + return extract_plain_secret(ctx, hsm_secret, len, err); + + case HSM_SECRET_ENCRYPTED: + return extract_encrypted_secret(ctx, hsm_secret, len, passphrase, err); + + case HSM_SECRET_MNEMONIC_NO_PASS: + case HSM_SECRET_MNEMONIC_WITH_PASS: + return extract_mnemonic_secret(ctx, hsm_secret, len, passphrase, type, err); + + case HSM_SECRET_INVALID: + *err = HSM_SECRET_ERR_INVALID_FORMAT; + return NULL; + } + + /* detect_hsm_secret_type promised to return a valid type. */ + abort(); +} + +bool encrypt_legacy_hsm_secret(const struct secret *encryption_key, + const struct secret *hsm_secret, + u8 *output) +{ + crypto_secretstream_xchacha20poly1305_state crypto_state; + + if (crypto_secretstream_xchacha20poly1305_init_push(&crypto_state, output, + encryption_key->data) != 0) + return false; + if (crypto_secretstream_xchacha20poly1305_push(&crypto_state, + output + HS_HEADER_LEN, + NULL, hsm_secret->data, + sizeof(hsm_secret->data), + /* Additional data and tag */ + NULL, 0, 0)) + return false; + + return true; +} + +/* Disable terminal echo if needed */ +static bool disable_echo(struct termios *saved_term) +{ + if (!isatty(fileno(stdin))) + return false; + + if (tcgetattr(fileno(stdin), saved_term) != 0) + return false; + + struct termios tmp = *saved_term; + tmp.c_lflag &= ~ECHO; + + if (tcsetattr(fileno(stdin), TCSANOW, &tmp) != 0) + return false; + + return true; +} + +/* Restore terminal echo if it was disabled */ +static void restore_echo(const struct termios *saved_term) +{ + tcsetattr(fileno(stdin), TCSANOW, saved_term); +} + +/* Read line from stdin (uses tal allocation) */ +static const char *read_line(const tal_t *ctx) +{ + char *line = NULL; + size_t size = 0; + + if (getline(&line, &size, stdin) < 0) { + free(line); + return NULL; + } + + /* Strip newline */ + size_t len = strlen(line); + if (strends(line, "\n")) + len--; + + /* Convert to tal string */ + char *result = tal_strndup(ctx, line, len); + free(line); + return result; +} + +const char *read_stdin_pass(const tal_t *ctx, enum hsm_secret_error *err) +{ + struct termios saved_term; + bool echo_disabled = disable_echo(&saved_term); + if (isatty(fileno(stdin)) && !echo_disabled) { + *err = HSM_SECRET_ERR_TERMINAL; + return NULL; + } + + const char *input = read_line(ctx); + if (!input) { + if (echo_disabled) + restore_echo(&saved_term); + *err = HSM_SECRET_ERR_INVALID_FORMAT; + return NULL; + } + + mlock_tal_memory(input); + + if (echo_disabled) + restore_echo(&saved_term); + + *err = HSM_SECRET_OK; + return input; +} + +const char *read_stdin_mnemonic(const tal_t *ctx, enum hsm_secret_error *err) +{ + printf("Introduce your BIP39 word list separated by space (at least 12 words):\n"); + fflush(stdout); + + const char *line = read_line(ctx); + if (!line) { + *err = HSM_SECRET_ERR_INVALID_FORMAT; + return NULL; + } + + /* Validate mnemonic */ + if (!validate_mnemonic(line, err)) { + return NULL; + } + + *err = HSM_SECRET_OK; + return line; +} + +int is_legacy_hsm_secret_encrypted(const char *path) +{ + struct stat st; + + if (stat(path, &st) != 0) + return -1; + + return st.st_size == ENCRYPTED_HSM_SECRET_LEN; +} + +const char *format_type_name(enum hsm_secret_type type) +{ + switch (type) { + case HSM_SECRET_PLAIN: + return "plain (32-byte binary)"; + case HSM_SECRET_ENCRYPTED: + return "encrypted (73-byte binary)"; + case HSM_SECRET_MNEMONIC_NO_PASS: + return "mnemonic (no password)"; + case HSM_SECRET_MNEMONIC_WITH_PASS: + return "mnemonic (with password)"; + case HSM_SECRET_INVALID: + return "invalid"; + } + return "unknown"; +} + +bool is_mnemonic_secret(size_t secret_len) +{ + return secret_len == HSM_SECRET_MNEMONIC_SIZE; +} + +bool use_bip86_derivation(size_t secret_len) +{ + /* BIP86 was introduced alongside mnemonic support, so they're available together */ + return is_mnemonic_secret(secret_len); +} diff --git a/common/hsm_secret.h b/common/hsm_secret.h new file mode 100644 index 000000000000..740f2ebc058e --- /dev/null +++ b/common/hsm_secret.h @@ -0,0 +1,178 @@ +#ifndef LIGHTNING_COMMON_HSM_SECRET_H +#define LIGHTNING_COMMON_HSM_SECRET_H +#include "config.h" +#include +#include +#include +#include +#include +#include + +/* Length constants for encrypted HSM secret files */ +#define HS_HEADER_LEN crypto_secretstream_xchacha20poly1305_HEADERBYTES +#define HS_CIPHERTEXT_LEN \ + (sizeof(struct secret) + crypto_secretstream_xchacha20poly1305_ABYTES) +#define ENCRYPTED_HSM_SECRET_LEN (HS_HEADER_LEN + HS_CIPHERTEXT_LEN) + +enum hsm_secret_type { + HSM_SECRET_PLAIN = 0, /* Legacy 32-byte format */ + HSM_SECRET_ENCRYPTED = 1, /* Legacy 73-byte encrypted format */ + HSM_SECRET_MNEMONIC_NO_PASS = 2, /* Mnemonic without passphrase */ + HSM_SECRET_MNEMONIC_WITH_PASS = 3, /* Mnemonic with passphrase */ + HSM_SECRET_INVALID = 4, /* When all else fails, blame the user */ +}; + +enum hsm_secret_error { + HSM_SECRET_OK = 0, + HSM_SECRET_ERR_PASSPHRASE_REQUIRED, + HSM_SECRET_ERR_PASSPHRASE_NOT_NEEDED, + HSM_SECRET_ERR_WRONG_PASSPHRASE, + HSM_SECRET_ERR_INVALID_MNEMONIC, + HSM_SECRET_ERR_ENCRYPTION_FAILED, + HSM_SECRET_ERR_SEED_DERIVATION_FAILED, + HSM_SECRET_ERR_INVALID_FORMAT, + HSM_SECRET_ERR_TERMINAL, +}; + +/** + * Represents the content of the hsm_secret file, either a raw seed or a mnemonic. + */ +struct hsm_secret { + enum hsm_secret_type type; + const u8 *secret_data; /* Variable length: 32 bytes (legacy) or 64 bytes (mnemonic) */ + const char *mnemonic; /* NULL if not derived from mnemonic */ +}; + + +/** + * Check if this HSM secret is mnemonic-based (64-byte seed). + * Returns true for mnemonic-derived secrets, false for legacy 32-byte secrets. + */ +bool is_mnemonic_secret(size_t secret_len); + +/** + * Check if we should use BIP86 derivation for this HSM secret. + * BIP86 was introduced alongside mnemonic support, so they're available together. + * Returns true if mnemonic-based secret is available, false otherwise. + */ +bool use_bip86_derivation(size_t secret_len); + +/** + * Checks whether the hsm_secret data requires a passphrase to decrypt. + * Handles legacy, encrypted, and mnemonic-based formats. + */ +bool hsm_secret_needs_passphrase(const u8 *hsm_secret, size_t len); + +/** + * Parse and decrypt an hsm_secret file. + * + * @ctx - a tal context + * @hsm_secret - raw file contents + * @len - length of file + * @passphrase - passphrase, or NULL if not needed + * @err - pointer to set error code on failure + * + * Returns parsed `struct hsm_secret` or NULL on error. + */ +struct hsm_secret *extract_hsm_secret(const tal_t *ctx, + const u8 *hsm_secret, size_t len, + const char *passphrase, + enum hsm_secret_error *err); + + +/** + * get_encryption_key - Derive encryption key from passphrase using Argon2. + * @ctx - tal context for allocation + * @passphrase - the passphrase to derive from + * + * Returns derived encryption key, or NULL on error. + * The returned key is memory-locked and has a destructor to clear it. + */ +struct secret *get_encryption_key(const tal_t *ctx, const char *passphrase); + +/** + * Encrypt a given hsm_secret using a provided encryption key. + * @encryption_key - derived from passphrase (via Argon2) + * @hsm_secret - plaintext secret to encrypt + * @output - output buffer for encrypted data (must be ENCRYPTED_HSM_SECRET_LEN bytes) + * + * Returns true on success. + */ +bool encrypt_legacy_hsm_secret(const struct secret *encryption_key, + const struct secret *hsm_secret, + u8 *output); + +/** + * Reads a passphrase from stdin, disabling terminal echo. + * Returns a newly allocated string on success, NULL on error. + * @ctx - tal context for allocation + * @err - on failure, this will be set to the error code + * + * Returns allocated passphrase or NULL on error. + */ +const char *read_stdin_pass(const tal_t *ctx, enum hsm_secret_error *err); + +/** + * Convert error code to human-readable string. + * @err - the error code to convert + * + * Returns a string describing the error. + */ +const char *hsm_secret_error_str(enum hsm_secret_error err); + +/** + * Detect the type of hsm_secret based on its content and length. + * @hsm_secret - raw file contents + * @len - length of file + * + * Returns the detected type. + */ +enum hsm_secret_type detect_hsm_secret_type(const u8 *hsm_secret, size_t len); + +/** + * Reads a BIP39 mnemonic from stdin with validation. + * Returns a newly allocated string on success, NULL on error. + * @ctx - tal context for allocation + * @err - optional pointer to set error code on failure + * + * Returns tal-allocated mnemonic string or NULL on error. + */ +const char *read_stdin_mnemonic(const tal_t *ctx, enum hsm_secret_error *err); + +/** + * Derive seed hash from mnemonic + passphrase. + * @mnemonic - the BIP39 mnemonic + * @passphrase - the passphrase (can be NULL) + * @seed_hash - output parameter for the derived seed hash + * + * Returns true on success, false on failure. + */ +bool derive_seed_hash(const char *mnemonic, const char *passphrase, struct sha256 *seed_hash); + +/** + * Check if hsm_secret file is encrypted (legacy format only). + * @path - path to the hsm_secret file + * + * Returns 1 if encrypted, 0 if not encrypted, -1 on error. + */ +int is_legacy_hsm_secret_encrypted(const char *path); + +/** + * Convert hsm_secret_type enum to human-readable string. + * @type - the hsm_secret_type to convert + * + * Returns a string describing the type. + */ +const char *format_type_name(enum hsm_secret_type type); + +/** + * Derive encryption key from passphrase using Argon2. + * @ctx - tal context for allocation + * @passphrase - the passphrase to derive from + * + * Returns derived encryption key, or NULL on error. + * The returned key is memory-locked and has a destructor to clear it. + */ +struct secret *get_encryption_key(const tal_t *ctx, const char *passphrase); + +#endif /* LIGHTNING_COMMON_HSM_SECRET_H */ diff --git a/common/hsm_version.h b/common/hsm_version.h index 920dc77ee34e..8b6c54bdfa51 100644 --- a/common/hsm_version.h +++ b/common/hsm_version.h @@ -29,6 +29,10 @@ * v6 with sign_bolt12_2 (tweak using node id): 8fcb731279a10af3f95aeb8be1da6b2ced76a1984afa18c5f46a03515d70ea0e * v6 with dev_warn_on_overgrind: a273b68e19336073e551c01a78bcd1e1f8cc510da7d0dde3afc45e249f9830cc * v6 with bip137_sign_message: 4bfe28b02e92aae276b8eca2228e32f32d5dee8d5381639e7364939fa2fa1370 + * v6 with hsm_passphrase changes: c646d557d7561dd885df3cad5b99c82895cda4b040699f3853980ec61b2873fa + * v6 with hsm_secret struct cleanup: 06c56396fe42f4f47911d7f865dd0004d264fc1348f89547743755b6b33fec90 + * v6 with hsm_secret_type TLV: 7bb5deb2367482feb084d304ee14b2373d42910ad56484fbf47614dbb3d4cb74 + * v6 with bip86_base in TLV: 6bb6e6ee256f22a6fb41856c90feebde3065a9074e79a46731e453a932be83f0 */ #define HSM_MIN_VERSION 5 #define HSM_MAX_VERSION 6 diff --git a/common/test/run-bigsize.c b/common/test/run-bigsize.c index 9b181261e6c6..8ff40e5497a6 100644 --- a/common/test/run-bigsize.c +++ b/common/test/run-bigsize.c @@ -333,8 +333,8 @@ int main(int argc, char *argv[]) common_setup(argv[0]); - lines = tal_strsplit(tmpctx, grab_file(tmpctx, tal_fmt(tmpctx, "%s.c", - argv[0])), + lines = tal_strsplit(tmpctx, grab_file_str(tmpctx, tal_fmt(tmpctx, "%s.c", + argv[0])), "\n", STR_NO_EMPTY); for (size_t i = 0; lines[i]; i++) { diff --git a/common/test/run-bolt12-offer-decode.c b/common/test/run-bolt12-offer-decode.c index 5296e8fd6c22..6febbb3637b5 100644 --- a/common/test/run-bolt12-offer-decode.c +++ b/common/test/run-bolt12-offer-decode.c @@ -131,13 +131,13 @@ int main(int argc, char *argv[]) common_setup(argv[0]); if (argv[1]) - json = grab_file(tmpctx, argv[1]); + json = grab_file_str(tmpctx, argv[1]); else { char *dir = getenv("BOLTDIR"); - json = grab_file(tmpctx, - path_join(tmpctx, - dir ? dir : ".tmp.lightningrfc", - "bolt12/offers-test.json")); + json = grab_file_str(tmpctx, + path_join(tmpctx, + dir ? dir : ".tmp.lightningrfc", + "bolt12/offers-test.json")); if (!json) { printf("test file not found, skipping\n"); goto out; diff --git a/common/test/run-bolt12_decode.c b/common/test/run-bolt12_decode.c index 6f0fa2a55faf..9e5333b33f3b 100644 --- a/common/test/run-bolt12_decode.c +++ b/common/test/run-bolt12_decode.c @@ -168,13 +168,13 @@ int main(int argc, char *argv[]) common_setup(argv[0]); if (argv[1]) - json = grab_file(tmpctx, argv[1]); + json = grab_file_str(tmpctx, argv[1]); else { char *dir = getenv("BOLTDIR"); - json = grab_file(tmpctx, - path_join(tmpctx, - dir ? dir : ".tmp.lightningrfc", - "bolt12/format-string-test.json")); + json = grab_file_str(tmpctx, + path_join(tmpctx, + dir ? dir : ".tmp.lightningrfc", + "bolt12/format-string-test.json")); if (!json) { printf("test file not found, skipping\n"); goto out; diff --git a/common/test/run-bolt12_merkle-json.c b/common/test/run-bolt12_merkle-json.c index dba66a2957f8..3c7d5a047661 100644 --- a/common/test/run-bolt12_merkle-json.c +++ b/common/test/run-bolt12_merkle-json.c @@ -110,13 +110,13 @@ int main(int argc, char *argv[]) common_setup(argv[0]); if (argv[1]) - json = grab_file(tmpctx, argv[1]); + json = grab_file_str(tmpctx, argv[1]); else { char *dir = getenv("BOLTDIR"); - json = grab_file(tmpctx, - path_join(tmpctx, - dir ? dir : ".tmp.lightningrfc", - "bolt12/merkle-test.json")); + json = grab_file_str(tmpctx, + path_join(tmpctx, + dir ? dir : ".tmp.lightningrfc", + "bolt12/merkle-test.json")); if (!json) { printf("test file not found, skipping\n"); goto out; diff --git a/common/test/run-bolt12_period.c b/common/test/run-bolt12_period.c index 514e47fe734f..e4daf72f5d90 100644 --- a/common/test/run-bolt12_period.c +++ b/common/test/run-bolt12_period.c @@ -174,13 +174,13 @@ int main(int argc, char *argv[]) common_setup(argv[0]); if (argv[1]) - json = grab_file(tmpctx, argv[1]); + json = grab_file_str(tmpctx, argv[1]); else { char *dir = getenv("BOLTDIR"); - json = grab_file(tmpctx, - path_join(tmpctx, - dir ? dir : ".tmp.lightningrfc", - "bolt12/offer-period-test.json")); + json = grab_file_str(tmpctx, + path_join(tmpctx, + dir ? dir : ".tmp.lightningrfc", + "bolt12/offer-period-test.json")); if (!json) { printf("test file not found, skipping\n"); common_shutdown(); diff --git a/common/test/run-onion-test-vector.c b/common/test/run-onion-test-vector.c index 064537109138..842c96c5da47 100644 --- a/common/test/run-onion-test-vector.c +++ b/common/test/run-onion-test-vector.c @@ -144,13 +144,13 @@ int main(int argc, char *argv[]) common_setup(argv[0]); if (argv[1]) - json = grab_file(tmpctx, argv[1]); + json = grab_file_str(tmpctx, argv[1]); else { char *dir = getenv("BOLTDIR"); - json = grab_file(tmpctx, - path_join(tmpctx, - dir ? dir : ".tmp.lightningrfc", - "bolt04/onion-test.json")); + json = grab_file_str(tmpctx, + path_join(tmpctx, + dir ? dir : ".tmp.lightningrfc", + "bolt04/onion-test.json")); if (!json) { printf("test file not found, skipping\n"); goto out; diff --git a/common/test/run-route_blinding_onion_test.c b/common/test/run-route_blinding_onion_test.c index 0dfc0d23ed21..d3b26db4b65c 100644 --- a/common/test/run-route_blinding_onion_test.c +++ b/common/test/run-route_blinding_onion_test.c @@ -86,13 +86,13 @@ int main(int argc, char *argv[]) common_setup(argv[0]); if (argv[1]) - json = grab_file(tmpctx, argv[1]); + json = grab_file_str(tmpctx, argv[1]); else { char *dir = getenv("BOLTDIR"); - json = grab_file(tmpctx, - path_join(tmpctx, - dir ? dir : ".tmp.lightningrfc", - "bolt04/blinded-payment-onion-test.json")); + json = grab_file_str(tmpctx, + path_join(tmpctx, + dir ? dir : ".tmp.lightningrfc", + "bolt04/blinded-payment-onion-test.json")); if (!json) { printf("test file not found, skipping\n"); goto out; diff --git a/common/test/run-route_blinding_test.c b/common/test/run-route_blinding_test.c index 3358319dfae3..049e2a585f88 100644 --- a/common/test/run-route_blinding_test.c +++ b/common/test/run-route_blinding_test.c @@ -164,13 +164,13 @@ int main(int argc, char *argv[]) common_setup(argv[0]); if (argv[1]) - json = grab_file(tmpctx, argv[1]); + json = grab_file_str(tmpctx, argv[1]); else { char *dir = getenv("BOLTDIR"); - json = grab_file(tmpctx, - path_join(tmpctx, - dir ? dir : ".tmp.lightningrfc", - "bolt04/route-blinding-test.json")); + json = grab_file_str(tmpctx, + path_join(tmpctx, + dir ? dir : ".tmp.lightningrfc", + "bolt04/route-blinding-test.json")); if (!json) { printf("test file not found, skipping\n"); goto out; diff --git a/common/utils.c b/common/utils.c index 01047ea571a7..fa434cf11181 100644 --- a/common/utils.c +++ b/common/utils.c @@ -10,6 +10,7 @@ #include #include #include +#include const tal_t *wally_tal_ctx = NULL; secp256k1_context *secp256k1_ctx; @@ -33,6 +34,13 @@ void tal_wally_start(void) wally_tal_ctx = tal_arr(NULL, char, 0); } +void tal_wally_discard(void) +{ + assert(wally_tal_ctx); + assert(tal_first(wally_tal_ctx) == NULL); + wally_tal_ctx = tal_free(wally_tal_ctx); +} + void tal_wally_end(const tal_t *parent) { tal_t *p; @@ -85,6 +93,18 @@ u8 *tal_hexdata(const tal_t *ctx, const void *str, size_t len) return data; } +static void destroy_munlock(const tal_t *ptr) +{ + sodium_munlock((void *)ptr, tal_bytelen(ptr)); +} + +void mlock_tal_memory(const tal_t *ptr) +{ + if (sodium_mlock((void *)ptr, tal_bytelen(ptr)) != 0) + abort(); + tal_add_destructor(ptr, destroy_munlock); +} + bool tal_arr_eq_(const void *a, const void *b, size_t unused) { return memeq(a, tal_bytelen(a), b, tal_bytelen(b)); diff --git a/common/utils.h b/common/utils.h index 45b91f87f827..8da75fca44ce 100644 --- a/common/utils.h +++ b/common/utils.h @@ -53,6 +53,16 @@ char *tal_hex(const tal_t *ctx, const tal_t *data); /* Allocate and fill a buffer with the data of this hex string. */ u8 *tal_hexdata(const tal_t *ctx, const void *str, size_t len); +/** + * mlock_tal_memory - lock a tal-allocated memory with sodium_mlock. + * @ptr - the tal-allocated memory to lock + * + * This is a generic function to replace the pattern of sodium_mlock + tal_add_destructor. + * + * Aborts on failure (memory locking is mandatory for security). + */ +void mlock_tal_memory(const tal_t *ptr); + /* Note: p is never a complex expression, otherwise this multi-evaluates! */ #define tal_arr_expand(p, s) \ do { \ @@ -145,6 +155,9 @@ void tal_wally_end_onto_(const tal_t *parent, tal_t *from_wally, const char *from_wally_name); +/* ... or this if libwally only used temporary allocations. */ +void tal_wally_discard(void); + /* Define sha256_eq. */ STRUCTEQ_DEF(sha256, 0, u); diff --git a/connectd/tor_autoservice.c b/connectd/tor_autoservice.c index 4b08f9235f82..fef93a80fad5 100644 --- a/connectd/tor_autoservice.c +++ b/connectd/tor_autoservice.c @@ -231,18 +231,15 @@ static void negotiate_auth(struct rbuf *rbuf, const char *tor_password) /* If we can't access this, try other methods */ cookiefile = tal_strdup(tmpctx, p); - contents = grab_file(tmpctx, p); + contents = grab_file_raw(tmpctx, p); if (!contents) { cookiefileerrno = errno; continue; } - assert(tal_count(contents) != 0); discard_remaining_response(rbuf); tor_send_cmd(rbuf, tal_fmt(tmpctx, "AUTHENTICATE %s", - tal_hexstr(tmpctx, - contents, - tal_count(contents)-1))); + tal_hex(tmpctx, contents))); discard_remaining_response(rbuf); return; } diff --git a/contrib/msggen/msggen/schema.json b/contrib/msggen/msggen/schema.json index a0f42b9c8d4f..4b214a702b18 100644 --- a/contrib/msggen/msggen/schema.json +++ b/contrib/msggen/msggen/schema.json @@ -11785,6 +11785,13 @@ "description": [ "The full codex32-encoded (i.e. BIP-93 encoded) HSM secret." ] + }, + "mnemonic": { + "type": "string", + "added": "v25.12", + "description": [ + "The BIP39 mnemonic phrase for the HSM secret (only present for mnemonic-based secrets)." + ] } } }, @@ -11824,6 +11831,20 @@ "identifier": "cln2", "codex32": "cl10cln2sd35kw6r5de5kueedxyesqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqn9lcvcu7cez4s" } + }, + { + "request": { + "id": "example:exposesecret#3", + "method": "exposesecret", + "params": { + "passphrase": "test_exposesecret" + } + }, + "response": { + "identifier": "peev", + "codex32": "cl10peevst6cqh0wu7p5ssjyf4z4ez42ks9jlt3zneju9uuypr2hddak6tlqsjhsks4laxts8q", + "mnemonic": "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" + } } ] }, diff --git a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py index 9a8609f0e910..bb457becc52e 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\"\xc0\x04\n\x0fGetinfoResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\x05\x61lias\x18\x02 \x01(\tH\x00\x88\x01\x01\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\x01\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\x02\x88\x01\x01\x12$\n\x17warning_lightningd_sync\x18\x11 \x01(\tH\x03\x88\x01\x01\x42\x08\n\x06_aliasB\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\"\xdf\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\x19\n\x0cnum_channels\x18\x08 \x01(\rH\x02\x88\x01\x01\x42\x0b\n\t_featuresB\x0e\n\x0c_remote_addrB\x0f\n\r_num_channels\"\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\"\xab\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\x17\n\nchannel_id\x18\t \x01(\x0cH\x01\x88\x01\x01\x42\x13\n\x11_short_channel_idB\r\n\x0b_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\"\xad\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\x1a\n\rcreated_index\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\x0b\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_created_indexB\x10\n\x0e_updated_index\"\\\n\x0cSendpayRoute\x12\n\n\x02id\x18\x02 \x01(\x0c\x12\r\n\x05\x64\x65lay\x18\x03 \x01(\r\x12\x0f\n\x07\x63hannel\x18\x04 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"\x93\x01\n\x13ListchannelsRequest\x12\x1d\n\x10short_channel_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06source\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\t\n\x07_sourceB\x0e\n\x0c_destination\"C\n\x14ListchannelsResponse\x12+\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x19.cln.ListchannelsChannels\"\xb3\x03\n\x14ListchannelsChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\x0e\n\x06public\x18\x04 \x01(\x08\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\rmessage_flags\x18\x06 \x01(\r\x12\x15\n\rchannel_flags\x18\x07 \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x08 \x01(\x08\x12\x13\n\x0blast_update\x18\t \x01(\r\x12\x1d\n\x15\x62\x61se_fee_millisatoshi\x18\n \x01(\r\x12\x19\n\x11\x66\x65\x65_per_millionth\x18\x0b \x01(\r\x12\r\n\x05\x64\x65lay\x18\x0c \x01(\r\x12&\n\x11htlc_minimum_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x11htlc_maximum_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x0f \x01(\x0c\x12\x11\n\tdirection\x18\x10 \x01(\rB\x14\n\x12_htlc_maximum_msat\"#\n\x10\x41\x64\x64gossipRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x13\n\x11\x41\x64\x64gossipResponse\"\xac\x01\n\x14\x41\x64\x64psbtoutputRequest\x12\x1c\n\x07satoshi\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\x08locktime\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_locktimeB\x0e\n\x0c_initialpsbtB\x0e\n\x0c_destination\"U\n\x15\x41\x64\x64psbtoutputResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1e\n\x16\x65stimated_added_weight\x18\x02 \x01(\r\x12\x0e\n\x06outnum\x18\x03 \x01(\r\"O\n\x14\x41utocleanonceRequest\x12*\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystem\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x04\"G\n\x15\x41utocleanonceResponse\x12.\n\tautoclean\x18\x01 \x01(\x0b\x32\x1b.cln.AutocleanonceAutoclean\"\xb1\x04\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\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoices\"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\"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\"\xbf\x04\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\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoices\"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\"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\"\xc7\x01\n\rCloseResponse\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.CloseResponse.CloseType\x12\x0f\n\x02tx\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\x0cH\x01\x88\x01\x01\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\x42\x05\n\x03_txB\x07\n\x05_txid\"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\"\xfd\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\x1a\n\rcreated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\x12:\n\rpaid_outpoint\x18\x11 \x01(\x0b\x32\x1e.cln.CreateinvoicePaidOutpointH\n\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_created_indexB\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\"\xe6\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\x1a\n\rcreated_index\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x16\n\tpay_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\t\x88\x01\x01\x12\x14\n\x07paid_at\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x11 \x01(\x0cH\x0b\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_created_indexB\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\"3\n\x1fGetemergencyrecoverdataResponse\x12\x10\n\x08\x66iledata\x18\x01 \x01(\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\"#\n\x0eRecoverRequest\x12\x11\n\thsmsecret\x18\x01 \x01(\t\"\x88\x01\n\x0fRecoverResponse\x12\x37\n\x06result\x18\x01 \x01(\x0e\x32\".cln.RecoverResponse.RecoverResultH\x00\x88\x01\x01\"1\n\rRecoverResult\x12 \n\x1cRECOVERY_RESTART_IN_PROGRESS\x10\x00\x42\t\n\x07_result\"$\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\"\x95\x03\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\x1a\n\rcreated_index\x18\n \x01(\x04H\x05\x88\x01\x01\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_mppB\x10\n\x0e_created_index\"\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\"\xd3\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\x1a\n\rcreated_index\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\x0b\x88\x01\x01\x12\x41\n\rpaid_outpoint\x18\x12 \x01(\x0b\x32%.cln.ListinvoicesInvoicesPaidOutpointH\x0c\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_created_indexB\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\"\xe7\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\x1a\n\rcreated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0f \x01(\x04H\t\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_created_indexB\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\"\xfc\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\x1a\n\rcreated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x12 \x01(\x04H\x0b\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_created_indexB\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\"\xd3\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\x1a\n\rcreated_index\x18\r \x01(\x04H\x08\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\t\x88\x01\x01\x12;\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1f.cln.WaitanyinvoicePaidOutpointH\n\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_created_indexB\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\"\xc4\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\x1a\n\rcreated_index\x18\r \x01(\x04H\x08\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\t\x88\x01\x01\x12\x38\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1c.cln.WaitinvoicePaidOutpointH\n\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_created_indexB\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\"\x8e\x05\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\x1a\n\rcreated_index\x18\x0f \x01(\x04H\t\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x10 \x01(\x04H\n\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_created_indexB\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\"e\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\x42\x05\n\x03_idB\x13\n\x11_short_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\"\x8b\x02\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\x1a\n\rsplice_amount\x18\x07 \x01(\x12H\x01\x88\x01\x01\x42\x0f\n\r_scratch_txidB\x10\n\x0e_splice_amount\"\x9d\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\x42\x0e\n\x0c_pushed_msatB\x10\n\x0e_fee_paid_msatB\x10\n\x0e_fee_rcvd_msat\"]\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\"\xf0\t\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\"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_connection\"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\"L\n\x10\x44\x65\x63odepayRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_description\"\xc7\x04\n\x11\x44\x65\x63odepayResponse\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\x12\x12\n\ncreated_at\x18\x02 \x01(\x04\x12\x0e\n\x06\x65xpiry\x18\x03 \x01(\x04\x12\r\n\x05payee\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x11\n\tsignature\x18\x07 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10\x64\x65scription_hash\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x1d\n\x15min_final_cltv_expiry\x18\n \x01(\r\x12\x1b\n\x0epayment_secret\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\r \x01(\x0cH\x05\x88\x01\x01\x12*\n\tfallbacks\x18\x0e \x03(\x0b\x32\x17.cln.DecodepayFallbacks\x12\"\n\x05\x65xtra\x18\x10 \x03(\x0b\x32\x13.cln.DecodepayExtra\x12-\n\x06routes\x18\x11 \x01(\x0b\x32\x18.cln.DecodeRoutehintListH\x06\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x13\n\x11_description_hashB\x11\n\x0f_payment_secretB\x0b\n\t_featuresB\x13\n\x11_payment_metadataB\t\n\x07_routes\"\xd0\x01\n\x12\x44\x65\x63odepayFallbacks\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.DecodepayFallbacks.DecodepayFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0b\n\x03hex\x18\x03 \x01(\x0c\"N\n\x16\x44\x65\x63odepayFallbacksType\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\x07\n\x05_addr\"+\n\x0e\x44\x65\x63odepayExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x1f\n\rDecodeRequest\x12\x0e\n\x06string\x18\x01 \x01(\t\"\x8c(\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\"\x83\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\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_invalid\"\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\";\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\"\xcb\x05\n\x0e\x44\x65lpayPayments\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\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\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\x12\n\ncreated_at\x18\t \x01(\x04\x12\x1a\n\rupdated_index\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x14\n\x07groupid\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x08\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\t\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\n\x88\x01\x01\x12\x17\n\nerroronion\x18\x11 \x01(\x0cH\x0b\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\x10\n\x0e_created_indexB\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\"\x88\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\x42\x08\n\x06_label\"&\n\x12\x45nableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\x87\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\x42\x08\n\x06_label\"=\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\"\xd3\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\x12\n\x05\x66loor\x18\n \x01(\rH\x06\x88\x01\x01\x12$\n\x17unilateral_anchor_close\x18\x0b \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\x08\n\x06_floorB\x1a\n\x18_unilateral_anchor_close\"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\"\xd3\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\x12\n\x05\x66loor\x18\n \x01(\rH\x06\x88\x01\x01\x12$\n\x17unilateral_anchor_close\x18\x0b \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\x08\n\x06_floorB\x1a\n\x18_unilateral_anchor_close\"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\"&\n\x18\x46undchannelCancelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\".\n\x19\x46undchannelCancelResponse\x12\x11\n\tcancelled\x18\x01 \x01(\t\"6\n\x1a\x46undchannelCompleteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"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\"\xe4\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\x36\n\x0c\x63hannel_type\x18\x07 \x01(\x0b\x32\x1b.cln.FundchannelChannelTypeH\x02\x88\x01\x01\x42\x0b\n\t_close_toB\x0b\n\t_mindepthB\x0f\n\r_channel_type\"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\"\xb4\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\x1a\n\rcreated_index\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1a\n\rresolved_time\x18\x0e \x01(\x01H\x08\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x0f \x01(\rH\t\x88\x01\x01\x12\x17\n\nfailreason\x18\x10 \x01(\tH\n\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_created_indexB\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\"\x84\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\x42\x08\n\x06_label\"\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\"\xc8\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\x45\n\x0c\x63hannel_type\x18\x04 \x01(\x0b\x32*.cln.MultifundchannelChannelIdsChannelTypeH\x00\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\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\"\xca\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\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\"\x92\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\x42\x08\n\x06_label\"-\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\"\x83\x02\n\x17OpenchannelBumpResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12:\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32\x1f.cln.OpenchannelBumpChannelTypeH\x00\x88\x01\x01\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\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\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\"\x83\x02\n\x17OpenchannelInitResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12:\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32\x1f.cln.OpenchannelInitChannelTypeH\x00\x88\x01\x01\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\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\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\"\xab\x02\n\x19OpenchannelUpdateResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12<\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32!.cln.OpenchannelUpdateChannelTypeH\x00\x88\x01\x01\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\x01\x88\x01\x01\x12&\n\x19requires_confirmed_inputs\x18\x07 \x01(\x08H\x02\x88\x01\x01\x42\x0f\n\r_channel_typeB\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\"\xcf\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\x1a\n\rcreated_index\x18\x08 \x01(\x04H\x02\x88\x01\x01\x12\x1a\n\rupdated_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\n \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\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_created_indexB\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\"\xca\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\x1e\n\x11ignore_fee_limits\x18\n \x01(\x08H\x03\x88\x01\x01\x42\x13\n\x11_short_channel_idB\x1a\n\x18_warning_htlcmin_too_lowB\x1b\n\x19_warning_htlcmax_too_highB\x14\n\x12_ignore_fee_limits\"b\n\x10SetconfigRequest\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x10\n\x03val\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttransient\x18\x03 \x01(\x08H\x01\x88\x01\x01\x42\x06\n\x04_valB\x0c\n\n_transient\"9\n\x11SetconfigResponse\x12$\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x14.cln.SetconfigConfig\"\xa5\x02\n\x0fSetconfigConfig\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x64ynamic\x18\x04 \x01(\x08\x12\x10\n\x03set\x18\x05 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tvalue_str\x18\x06 \x01(\tH\x02\x88\x01\x01\x12$\n\nvalue_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x16\n\tvalue_int\x18\x08 \x01(\x12H\x04\x88\x01\x01\x12\x17\n\nvalue_bool\x18\t \x01(\x08H\x05\x88\x01\x01\x42\t\n\x07_pluginB\x06\n\x04_setB\x0c\n\n_value_strB\r\n\x0b_value_msatB\x0c\n\n_value_intB\r\n\x0b_value_bool\"6\n\x15SetpsbtversionRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\r\"&\n\x16SetpsbtversionResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"\'\n\x12SigninvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\"%\n\x13SigninvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"%\n\x12SignmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"F\n\x13SignmessageResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\r\n\x05recid\x18\x02 \x01(\x0c\x12\r\n\x05zbase\x18\x03 \x01(\t\"\xc8\x01\n\x11SpliceInitRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x17\n\x0frelative_amount\x18\x02 \x01(\x12\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x65\x65rate_per_kw\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x0e\n\x0c_initialpsbtB\x11\n\x0f_feerate_per_kwB\x10\n\x0e_force_feerate\"\"\n\x12SpliceInitResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"_\n\x13SpliceSignedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x17\n\nsign_first\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_sign_first\"^\n\x14SpliceSignedResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x13\n\x06outnum\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04psbt\x18\x04 \x01(\tB\t\n\x07_outnum\"7\n\x13SpliceUpdateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"y\n\x14SpliceUpdateResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\x12\x1f\n\x12signatures_secured\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x15\n\x13_signatures_secured\"\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\"\x95\x01\n\x15UpgradewalletResponse\x12\x1a\n\rupgraded_outs\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\x0cH\x03\x88\x01\x01\x42\x10\n\x0e_upgraded_outsB\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\"\xa6\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\"f\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\"6\n\rWaitIndexname\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x12\x0b\n\x07\x44\x45LETED\x10\x02\"\x97\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\"f\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\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_channelmoves\"\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\"\xa8\x07\n\tWaitHtlcs\x12\x31\n\x05state\x18\x01 \x01(\x0e\x32\x1d.cln.WaitHtlcs.WaitHtlcsStateH\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\"\x8a\x04\n\x0eWaitHtlcsState\x12\x11\n\rSENT_ADD_HTLC\x10\x00\x12\x13\n\x0fSENT_ADD_COMMIT\x10\x01\x12\x17\n\x13RCVD_ADD_REVOCATION\x10\x02\x12\x17\n\x13RCVD_ADD_ACK_COMMIT\x10\x03\x12\x1b\n\x17SENT_ADD_ACK_REVOCATION\x10\x04\x12\x14\n\x10RCVD_REMOVE_HTLC\x10\x05\x12\x16\n\x12RCVD_REMOVE_COMMIT\x10\x06\x12\x1a\n\x16SENT_REMOVE_REVOCATION\x10\x07\x12\x1a\n\x16SENT_REMOVE_ACK_COMMIT\x10\x08\x12\x1e\n\x1aRCVD_REMOVE_ACK_REVOCATION\x10\t\x12\x11\n\rRCVD_ADD_HTLC\x10\n\x12\x13\n\x0fRCVD_ADD_COMMIT\x10\x0b\x12\x17\n\x13SENT_ADD_REVOCATION\x10\x0c\x12\x17\n\x13SENT_ADD_ACK_COMMIT\x10\r\x12\x1b\n\x17RCVD_ADD_ACK_REVOCATION\x10\x0e\x12\x14\n\x10SENT_REMOVE_HTLC\x10\x0f\x12\x16\n\x12SENT_REMOVE_COMMIT\x10\x10\x12\x1a\n\x16RCVD_REMOVE_REVOCATION\x10\x11\x12\x1a\n\x16RCVD_REMOVE_ACK_COMMIT\x10\x12\x12\x1e\n\x1aSENT_REMOVE_ACK_REVOCATION\x10\x13\"%\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\"\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\"\xe9.\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\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_peers\"\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\"\r\n\x0bStopRequest\"q\n\x0cStopResponse\x12\x31\n\x06result\x18\x01 \x01(\x0e\x32\x1c.cln.StopResponse.StopResultH\x00\x88\x01\x01\"#\n\nStopResult\x12\x15\n\x11SHUTDOWN_COMPLETE\x10\x00\x42\t\n\x07_result\"/\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\"\xa1\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\"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_id\"\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\"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\"B\n\x17\x41skreneunreserveRequest\x12\'\n\x04path\x18\x01 \x03(\x0b\x32\x19.cln.AskreneunreservePath\"\x1a\n\x18\x41skreneunreserveResponse\"t\n\x14\x41skreneunreservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x14short_channel_id_dir\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x17\n\x15_short_channel_id_dir\"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\"\x81\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\x17\n\npersistent\x18\x05 \x01(\x08H\x00\x88\x01\x01\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.AskrenelistlayersLayersBiasesB\r\n\x0b_persistent\"\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\"\xf8\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!\n\x14short_channel_id_dir\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x16\n\ttimestamp\x18\x06 \x01(\x04H\x03\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msatB\x17\n\x15_short_channel_id_dirB\x0c\n\n_timestamp\"u\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\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\"\xf2\x02\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\"\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\"v\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\x42\x0e\n\x0c_description\"*\n\x19\x41skreneremovelayerRequest\x12\r\n\x05layer\x18\x01 \x01(\t\"\x1c\n\x1a\x41skreneremovelayerResponse\">\n\x15\x41skrenereserveRequest\x12%\n\x04path\x18\x01 \x03(\x0b\x32\x17.cln.AskrenereservePath\"\x18\n\x16\x41skrenereserveResponse\"r\n\x12\x41skrenereservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x14short_channel_id_dir\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x17\n\x15_short_channel_id_dir\"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\"\xfb\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\x17\n\nfinal_cltv\x18\x07 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x08 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08maxparts\x18\t \x01(\rH\x02\x88\x01\x01\x42\r\n\x0b_final_cltvB\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\"\x9c\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\x17\n\nfinal_cltv\x18\x04 \x01(\rH\x00\x88\x01\x01\x42\r\n\x0b_final_cltv\"\x98\x01\n\x13GetroutesRoutesPath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0cnext_node_id\x18\x04 \x01(\x0c\x12\r\n\x05\x64\x65lay\x18\x05 \x01(\r\x12!\n\x14short_channel_id_dir\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x17\n\x15_short_channel_id_dir\"8\n\x19\x41skrenedisablenodeRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\"\x1c\n\x1a\x41skrenedisablenodeResponse\"\xcd\x02\n\x1b\x41skreneinformchannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12!\n\x14short_channel_id_dir\x18\x06 \x01(\tH\x00\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12P\n\x06inform\x18\x08 \x01(\x0e\x32;.cln.AskreneinformchannelRequest.AskreneinformchannelInformH\x02\x88\x01\x01\"O\n\x1a\x41skreneinformchannelInform\x12\x0f\n\x0b\x43ONSTRAINED\x10\x00\x12\x11\n\rUNCONSTRAINED\x10\x01\x12\r\n\tSUCCEEDED\x10\x02\x42\x17\n\x15_short_channel_id_dirB\x0e\n\x0c_amount_msatB\t\n\x07_inform\"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\"\x7f\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\x42\x0e\n\x0c_description\" \n\x1e\x41skrenelistreservationsRequest\"a\n\x1f\x41skrenelistreservationsResponse\x12>\n\x0creservations\x18\x01 \x03(\x0b\x32(.cln.AskrenelistreservationsReservations\"\x91\x01\n#AskrenelistreservationsReservations\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x16\n\x0e\x61ge_in_seconds\x18\x03 \x01(\x04\x12\x12\n\ncommand_id\x18\x04 \x01(\t\"\xcb\x02\n\x19InjectpaymentonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x63ltv_expiry\x18\x04 \x01(\r\x12\x0e\n\x06partid\x18\x05 \x01(\x04\x12\x0f\n\x07groupid\x18\x06 \x01(\x04\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12*\n\x10\x64\x65stination_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x10\n\x0e_localinvreqidB\x13\n\x11_destination_msat\"w\n\x1aInjectpaymentonionResponse\x12\x12\n\ncreated_at\x18\x01 \x01(\x04\x12\x14\n\x0c\x63ompleted_at\x18\x02 \x01(\x04\x12\x15\n\rcreated_index\x18\x03 \x01(\x04\x12\x18\n\x10payment_preimage\x18\x04 \x01(\x0c\">\n\x19InjectonionmessageRequest\x12\x10\n\x08path_key\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x1c\n\x1aInjectonionmessageResponse\"\x97\x02\n\x0bXpayRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12&\n\x0cpartial_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x07 \x01(\rH\x04\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0f\n\r_partial_msatB\x0b\n\t_maxdelay\"\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\"\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\"\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\"\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 StreamChannelStateChangedRequest\"\xb0\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\x0f\n\x07message\x18\x08 \x01(\t\"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_state2\xe9P\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<\n\tDecodePay\x12\x15.cln.DecodepayRequest\x1a\x16.cln.DecodepayResponse\"\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\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<\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\x12H\n\rBlacklistRune\x12\x19.cln.BlacklistruneRequest\x1a\x1a.cln.BlacklistruneResponse\"\x00\x12<\n\tCheckRune\x12\x15.cln.CheckruneRequest\x1a\x16.cln.CheckruneResponse\"\x00\x12?\n\nCreateRune\x12\x16.cln.CreateruneRequest\x1a\x17.cln.CreateruneResponse\"\x00\x12<\n\tShowRunes\x12\x15.cln.ShowrunesRequest\x1a\x16.cln.ShowrunesResponse\"\x00\x12Q\n\x10\x41skReneUnreserve\x12\x1c.cln.AskreneunreserveRequest\x1a\x1d.cln.AskreneunreserveResponse\"\x00\x12T\n\x11\x41skReneListLayers\x12\x1d.cln.AskrenelistlayersRequest\x1a\x1e.cln.AskrenelistlayersResponse\"\x00\x12W\n\x12\x41skReneCreateLayer\x12\x1e.cln.AskrenecreatelayerRequest\x1a\x1f.cln.AskrenecreatelayerResponse\"\x00\x12W\n\x12\x41skReneRemoveLayer\x12\x1e.cln.AskreneremovelayerRequest\x1a\x1f.cln.AskreneremovelayerResponse\"\x00\x12K\n\x0e\x41skReneReserve\x12\x1a.cln.AskrenereserveRequest\x1a\x1b.cln.AskrenereserveResponse\"\x00\x12?\n\nAskReneAge\x12\x16.cln.AskreneageRequest\x1a\x17.cln.AskreneageResponse\"\x00\x12<\n\tGetRoutes\x12\x15.cln.GetroutesRequest\x1a\x16.cln.GetroutesResponse\"\x00\x12W\n\x12\x41skReneDisableNode\x12\x1e.cln.AskrenedisablenodeRequest\x1a\x1f.cln.AskrenedisablenodeResponse\"\x00\x12]\n\x14\x41skReneInformChannel\x12 .cln.AskreneinformchannelRequest\x1a!.cln.AskreneinformchannelResponse\"\x00\x12]\n\x14\x41skReneCreateChannel\x12 .cln.AskrenecreatechannelRequest\x1a!.cln.AskrenecreatechannelResponse\"\x00\x12]\n\x14\x41skReneUpdateChannel\x12 .cln.AskreneupdatechannelRequest\x1a!.cln.AskreneupdatechannelResponse\"\x00\x12W\n\x12\x41skReneBiasChannel\x12\x1e.cln.AskrenebiaschannelRequest\x1a\x1f.cln.AskrenebiaschannelResponse\"\x00\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\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\x10SubscribeConnect\x12\x19.cln.StreamConnectRequest\x1a\x1c.cln.PeerConnectNotification\"\x00\x30\x01\x12Q\n\x12SubscribeCustomMsg\x12\x1b.cln.StreamCustomMsgRequest\x1a\x1a.cln.CustomMsgNotification\"\x00\x30\x01\x12o\n\x1cSubscribeChannelStateChanged\x12%.cln.StreamChannelStateChangedRequest\x1a$.cln.ChannelStateChangedNotification\"\x00\x30\x01\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nnode.proto\x12\x03\x63ln\x1a\x10primitives.proto\"\x10\n\x0eGetinfoRequest\"\xc0\x04\n\x0fGetinfoResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\x05\x61lias\x18\x02 \x01(\tH\x00\x88\x01\x01\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\x01\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\x02\x88\x01\x01\x12$\n\x17warning_lightningd_sync\x18\x11 \x01(\tH\x03\x88\x01\x01\x42\x08\n\x06_aliasB\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\"\xdf\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\x19\n\x0cnum_channels\x18\x08 \x01(\rH\x02\x88\x01\x01\x42\x0b\n\t_featuresB\x0e\n\x0c_remote_addrB\x0f\n\r_num_channels\"\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\"\xab\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\x17\n\nchannel_id\x18\t \x01(\x0cH\x01\x88\x01\x01\x42\x13\n\x11_short_channel_idB\r\n\x0b_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\"\xad\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\x1a\n\rcreated_index\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\x0b\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_created_indexB\x10\n\x0e_updated_index\"\\\n\x0cSendpayRoute\x12\n\n\x02id\x18\x02 \x01(\x0c\x12\r\n\x05\x64\x65lay\x18\x03 \x01(\r\x12\x0f\n\x07\x63hannel\x18\x04 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"\x93\x01\n\x13ListchannelsRequest\x12\x1d\n\x10short_channel_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06source\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\t\n\x07_sourceB\x0e\n\x0c_destination\"C\n\x14ListchannelsResponse\x12+\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x19.cln.ListchannelsChannels\"\xb3\x03\n\x14ListchannelsChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\x0e\n\x06public\x18\x04 \x01(\x08\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\rmessage_flags\x18\x06 \x01(\r\x12\x15\n\rchannel_flags\x18\x07 \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x08 \x01(\x08\x12\x13\n\x0blast_update\x18\t \x01(\r\x12\x1d\n\x15\x62\x61se_fee_millisatoshi\x18\n \x01(\r\x12\x19\n\x11\x66\x65\x65_per_millionth\x18\x0b \x01(\r\x12\r\n\x05\x64\x65lay\x18\x0c \x01(\r\x12&\n\x11htlc_minimum_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x11htlc_maximum_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x0f \x01(\x0c\x12\x11\n\tdirection\x18\x10 \x01(\rB\x14\n\x12_htlc_maximum_msat\"#\n\x10\x41\x64\x64gossipRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x13\n\x11\x41\x64\x64gossipResponse\"\xac\x01\n\x14\x41\x64\x64psbtoutputRequest\x12\x1c\n\x07satoshi\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\x08locktime\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_locktimeB\x0e\n\x0c_initialpsbtB\x0e\n\x0c_destination\"U\n\x15\x41\x64\x64psbtoutputResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1e\n\x16\x65stimated_added_weight\x18\x02 \x01(\r\x12\x0e\n\x06outnum\x18\x03 \x01(\r\"O\n\x14\x41utocleanonceRequest\x12*\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystem\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x04\"G\n\x15\x41utocleanonceResponse\x12.\n\tautoclean\x18\x01 \x01(\x0b\x32\x1b.cln.AutocleanonceAutoclean\"\xb1\x04\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\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoices\"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\"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\"\xbf\x04\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\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoices\"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\"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\"\xc7\x01\n\rCloseResponse\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.CloseResponse.CloseType\x12\x0f\n\x02tx\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\x0cH\x01\x88\x01\x01\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\x42\x05\n\x03_txB\x07\n\x05_txid\"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\"\xfd\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\x1a\n\rcreated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\x12:\n\rpaid_outpoint\x18\x11 \x01(\x0b\x32\x1e.cln.CreateinvoicePaidOutpointH\n\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_created_indexB\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\"\xe6\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\x1a\n\rcreated_index\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x16\n\tpay_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\t\x88\x01\x01\x12\x14\n\x07paid_at\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x11 \x01(\x0cH\x0b\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_created_indexB\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\"3\n\x1fGetemergencyrecoverdataResponse\x12\x10\n\x08\x66iledata\x18\x01 \x01(\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\"\x88\x01\n\x0fRecoverResponse\x12\x37\n\x06result\x18\x01 \x01(\x0e\x32\".cln.RecoverResponse.RecoverResultH\x00\x88\x01\x01\"1\n\rRecoverResult\x12 \n\x1cRECOVERY_RESTART_IN_PROGRESS\x10\x00\x42\t\n\x07_result\"$\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\"\x95\x03\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\x1a\n\rcreated_index\x18\n \x01(\x04H\x05\x88\x01\x01\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_mppB\x10\n\x0e_created_index\"\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\"\xd3\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\x1a\n\rcreated_index\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\x0b\x88\x01\x01\x12\x41\n\rpaid_outpoint\x18\x12 \x01(\x0b\x32%.cln.ListinvoicesInvoicesPaidOutpointH\x0c\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_created_indexB\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\"\xe7\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\x1a\n\rcreated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0f \x01(\x04H\t\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_created_indexB\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\"\xfc\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\x1a\n\rcreated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x12 \x01(\x04H\x0b\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_created_indexB\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\"\xd3\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\x1a\n\rcreated_index\x18\r \x01(\x04H\x08\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\t\x88\x01\x01\x12;\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1f.cln.WaitanyinvoicePaidOutpointH\n\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_created_indexB\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\"\xc4\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\x1a\n\rcreated_index\x18\r \x01(\x04H\x08\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\t\x88\x01\x01\x12\x38\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1c.cln.WaitinvoicePaidOutpointH\n\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_created_indexB\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\"\x8e\x05\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\x1a\n\rcreated_index\x18\x0f \x01(\x04H\t\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x10 \x01(\x04H\n\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_created_indexB\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\"e\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\x42\x05\n\x03_idB\x13\n\x11_short_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\"\x8b\x02\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\x1a\n\rsplice_amount\x18\x07 \x01(\x12H\x01\x88\x01\x01\x42\x0f\n\r_scratch_txidB\x10\n\x0e_splice_amount\"\x9d\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\x42\x0e\n\x0c_pushed_msatB\x10\n\x0e_fee_paid_msatB\x10\n\x0e_fee_rcvd_msat\"]\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\"\xf0\t\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\"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_connection\"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\"L\n\x10\x44\x65\x63odepayRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_description\"\xc7\x04\n\x11\x44\x65\x63odepayResponse\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\x12\x12\n\ncreated_at\x18\x02 \x01(\x04\x12\x0e\n\x06\x65xpiry\x18\x03 \x01(\x04\x12\r\n\x05payee\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x11\n\tsignature\x18\x07 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10\x64\x65scription_hash\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x1d\n\x15min_final_cltv_expiry\x18\n \x01(\r\x12\x1b\n\x0epayment_secret\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\r \x01(\x0cH\x05\x88\x01\x01\x12*\n\tfallbacks\x18\x0e \x03(\x0b\x32\x17.cln.DecodepayFallbacks\x12\"\n\x05\x65xtra\x18\x10 \x03(\x0b\x32\x13.cln.DecodepayExtra\x12-\n\x06routes\x18\x11 \x01(\x0b\x32\x18.cln.DecodeRoutehintListH\x06\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x13\n\x11_description_hashB\x11\n\x0f_payment_secretB\x0b\n\t_featuresB\x13\n\x11_payment_metadataB\t\n\x07_routes\"\xd0\x01\n\x12\x44\x65\x63odepayFallbacks\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.DecodepayFallbacks.DecodepayFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0b\n\x03hex\x18\x03 \x01(\x0c\"N\n\x16\x44\x65\x63odepayFallbacksType\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\x07\n\x05_addr\"+\n\x0e\x44\x65\x63odepayExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x1f\n\rDecodeRequest\x12\x0e\n\x06string\x18\x01 \x01(\t\"\x8c(\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\"\x83\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\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_invalid\"\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\";\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\"\xcb\x05\n\x0e\x44\x65lpayPayments\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\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\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\x12\n\ncreated_at\x18\t \x01(\x04\x12\x1a\n\rupdated_index\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x14\n\x07groupid\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x08\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\t\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\n\x88\x01\x01\x12\x17\n\nerroronion\x18\x11 \x01(\x0cH\x0b\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\x10\n\x0e_created_indexB\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\"\x88\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\x42\x08\n\x06_label\"&\n\x12\x45nableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\x87\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\x42\x08\n\x06_label\"=\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\"\xd3\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\x12\n\x05\x66loor\x18\n \x01(\rH\x06\x88\x01\x01\x12$\n\x17unilateral_anchor_close\x18\x0b \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\x08\n\x06_floorB\x1a\n\x18_unilateral_anchor_close\"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\"\xd3\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\x12\n\x05\x66loor\x18\n \x01(\rH\x06\x88\x01\x01\x12$\n\x17unilateral_anchor_close\x18\x0b \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\x08\n\x06_floorB\x1a\n\x18_unilateral_anchor_close\"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\"&\n\x18\x46undchannelCancelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\".\n\x19\x46undchannelCancelResponse\x12\x11\n\tcancelled\x18\x01 \x01(\t\"6\n\x1a\x46undchannelCompleteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"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\"\xe4\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\x36\n\x0c\x63hannel_type\x18\x07 \x01(\x0b\x32\x1b.cln.FundchannelChannelTypeH\x02\x88\x01\x01\x42\x0b\n\t_close_toB\x0b\n\t_mindepthB\x0f\n\r_channel_type\"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\"\xb4\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\x1a\n\rcreated_index\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1a\n\rresolved_time\x18\x0e \x01(\x01H\x08\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x0f \x01(\rH\t\x88\x01\x01\x12\x17\n\nfailreason\x18\x10 \x01(\tH\n\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_created_indexB\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\"\x84\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\x42\x08\n\x06_label\"\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\"\xc8\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\x45\n\x0c\x63hannel_type\x18\x04 \x01(\x0b\x32*.cln.MultifundchannelChannelIdsChannelTypeH\x00\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\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\"\xca\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\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\"\x92\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\x42\x08\n\x06_label\"-\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\"\x83\x02\n\x17OpenchannelBumpResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12:\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32\x1f.cln.OpenchannelBumpChannelTypeH\x00\x88\x01\x01\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\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\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\"\x83\x02\n\x17OpenchannelInitResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12:\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32\x1f.cln.OpenchannelInitChannelTypeH\x00\x88\x01\x01\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\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\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\"\xab\x02\n\x19OpenchannelUpdateResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12<\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32!.cln.OpenchannelUpdateChannelTypeH\x00\x88\x01\x01\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\x01\x88\x01\x01\x12&\n\x19requires_confirmed_inputs\x18\x07 \x01(\x08H\x02\x88\x01\x01\x42\x0f\n\r_channel_typeB\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\"\xcf\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\x1a\n\rcreated_index\x18\x08 \x01(\x04H\x02\x88\x01\x01\x12\x1a\n\rupdated_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\n \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\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_created_indexB\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\"\xca\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\x1e\n\x11ignore_fee_limits\x18\n \x01(\x08H\x03\x88\x01\x01\x42\x13\n\x11_short_channel_idB\x1a\n\x18_warning_htlcmin_too_lowB\x1b\n\x19_warning_htlcmax_too_highB\x14\n\x12_ignore_fee_limits\"b\n\x10SetconfigRequest\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x10\n\x03val\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttransient\x18\x03 \x01(\x08H\x01\x88\x01\x01\x42\x06\n\x04_valB\x0c\n\n_transient\"9\n\x11SetconfigResponse\x12$\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x14.cln.SetconfigConfig\"\xa5\x02\n\x0fSetconfigConfig\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x64ynamic\x18\x04 \x01(\x08\x12\x10\n\x03set\x18\x05 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tvalue_str\x18\x06 \x01(\tH\x02\x88\x01\x01\x12$\n\nvalue_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x16\n\tvalue_int\x18\x08 \x01(\x12H\x04\x88\x01\x01\x12\x17\n\nvalue_bool\x18\t \x01(\x08H\x05\x88\x01\x01\x42\t\n\x07_pluginB\x06\n\x04_setB\x0c\n\n_value_strB\r\n\x0b_value_msatB\x0c\n\n_value_intB\r\n\x0b_value_bool\"6\n\x15SetpsbtversionRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\r\"&\n\x16SetpsbtversionResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"\'\n\x12SigninvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\"%\n\x13SigninvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"%\n\x12SignmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"F\n\x13SignmessageResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\r\n\x05recid\x18\x02 \x01(\x0c\x12\r\n\x05zbase\x18\x03 \x01(\t\"\xc8\x01\n\x11SpliceInitRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x17\n\x0frelative_amount\x18\x02 \x01(\x12\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x65\x65rate_per_kw\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x0e\n\x0c_initialpsbtB\x11\n\x0f_feerate_per_kwB\x10\n\x0e_force_feerate\"\"\n\x12SpliceInitResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"_\n\x13SpliceSignedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x17\n\nsign_first\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_sign_first\"^\n\x14SpliceSignedResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x13\n\x06outnum\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04psbt\x18\x04 \x01(\tB\t\n\x07_outnum\"7\n\x13SpliceUpdateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"y\n\x14SpliceUpdateResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\x12\x1f\n\x12signatures_secured\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x15\n\x13_signatures_secured\"\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\"\x95\x01\n\x15UpgradewalletResponse\x12\x1a\n\rupgraded_outs\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\x0cH\x03\x88\x01\x01\x42\x10\n\x0e_upgraded_outsB\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\"\xa6\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\"f\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\"6\n\rWaitIndexname\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x12\x0b\n\x07\x44\x45LETED\x10\x02\"\x97\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\"f\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\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_channelmoves\"\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\"\xa8\x07\n\tWaitHtlcs\x12\x31\n\x05state\x18\x01 \x01(\x0e\x32\x1d.cln.WaitHtlcs.WaitHtlcsStateH\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\"\x8a\x04\n\x0eWaitHtlcsState\x12\x11\n\rSENT_ADD_HTLC\x10\x00\x12\x13\n\x0fSENT_ADD_COMMIT\x10\x01\x12\x17\n\x13RCVD_ADD_REVOCATION\x10\x02\x12\x17\n\x13RCVD_ADD_ACK_COMMIT\x10\x03\x12\x1b\n\x17SENT_ADD_ACK_REVOCATION\x10\x04\x12\x14\n\x10RCVD_REMOVE_HTLC\x10\x05\x12\x16\n\x12RCVD_REMOVE_COMMIT\x10\x06\x12\x1a\n\x16SENT_REMOVE_REVOCATION\x10\x07\x12\x1a\n\x16SENT_REMOVE_ACK_COMMIT\x10\x08\x12\x1e\n\x1aRCVD_REMOVE_ACK_REVOCATION\x10\t\x12\x11\n\rRCVD_ADD_HTLC\x10\n\x12\x13\n\x0fRCVD_ADD_COMMIT\x10\x0b\x12\x17\n\x13SENT_ADD_REVOCATION\x10\x0c\x12\x17\n\x13SENT_ADD_ACK_COMMIT\x10\r\x12\x1b\n\x17RCVD_ADD_ACK_REVOCATION\x10\x0e\x12\x14\n\x10SENT_REMOVE_HTLC\x10\x0f\x12\x16\n\x12SENT_REMOVE_COMMIT\x10\x10\x12\x1a\n\x16RCVD_REMOVE_REVOCATION\x10\x11\x12\x1a\n\x16RCVD_REMOVE_ACK_COMMIT\x10\x12\x12\x1e\n\x1aSENT_REMOVE_ACK_REVOCATION\x10\x13\"%\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\"\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\"\xe9.\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\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_peers\"\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\"\r\n\x0bStopRequest\"q\n\x0cStopResponse\x12\x31\n\x06result\x18\x01 \x01(\x0e\x32\x1c.cln.StopResponse.StopResultH\x00\x88\x01\x01\"#\n\nStopResult\x12\x15\n\x11SHUTDOWN_COMPLETE\x10\x00\x42\t\n\x07_result\"/\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\"\xa1\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\"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_id\"\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\"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\"B\n\x17\x41skreneunreserveRequest\x12\'\n\x04path\x18\x01 \x03(\x0b\x32\x19.cln.AskreneunreservePath\"\x1a\n\x18\x41skreneunreserveResponse\"t\n\x14\x41skreneunreservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x14short_channel_id_dir\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x17\n\x15_short_channel_id_dir\"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\"\x81\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\x17\n\npersistent\x18\x05 \x01(\x08H\x00\x88\x01\x01\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.AskrenelistlayersLayersBiasesB\r\n\x0b_persistent\"\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\"\xf8\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!\n\x14short_channel_id_dir\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x16\n\ttimestamp\x18\x06 \x01(\x04H\x03\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msatB\x17\n\x15_short_channel_id_dirB\x0c\n\n_timestamp\"u\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\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\"\xf2\x02\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\"\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\"v\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\x42\x0e\n\x0c_description\"*\n\x19\x41skreneremovelayerRequest\x12\r\n\x05layer\x18\x01 \x01(\t\"\x1c\n\x1a\x41skreneremovelayerResponse\">\n\x15\x41skrenereserveRequest\x12%\n\x04path\x18\x01 \x03(\x0b\x32\x17.cln.AskrenereservePath\"\x18\n\x16\x41skrenereserveResponse\"r\n\x12\x41skrenereservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x14short_channel_id_dir\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x17\n\x15_short_channel_id_dir\"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\"\xfb\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\x17\n\nfinal_cltv\x18\x07 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x08 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08maxparts\x18\t \x01(\rH\x02\x88\x01\x01\x42\r\n\x0b_final_cltvB\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\"\x9c\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\x17\n\nfinal_cltv\x18\x04 \x01(\rH\x00\x88\x01\x01\x42\r\n\x0b_final_cltv\"\x98\x01\n\x13GetroutesRoutesPath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0cnext_node_id\x18\x04 \x01(\x0c\x12\r\n\x05\x64\x65lay\x18\x05 \x01(\r\x12!\n\x14short_channel_id_dir\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x17\n\x15_short_channel_id_dir\"8\n\x19\x41skrenedisablenodeRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\"\x1c\n\x1a\x41skrenedisablenodeResponse\"\xcd\x02\n\x1b\x41skreneinformchannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12!\n\x14short_channel_id_dir\x18\x06 \x01(\tH\x00\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12P\n\x06inform\x18\x08 \x01(\x0e\x32;.cln.AskreneinformchannelRequest.AskreneinformchannelInformH\x02\x88\x01\x01\"O\n\x1a\x41skreneinformchannelInform\x12\x0f\n\x0b\x43ONSTRAINED\x10\x00\x12\x11\n\rUNCONSTRAINED\x10\x01\x12\r\n\tSUCCEEDED\x10\x02\x42\x17\n\x15_short_channel_id_dirB\x0e\n\x0c_amount_msatB\t\n\x07_inform\"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\"\x7f\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\x42\x0e\n\x0c_description\" \n\x1e\x41skrenelistreservationsRequest\"a\n\x1f\x41skrenelistreservationsResponse\x12>\n\x0creservations\x18\x01 \x03(\x0b\x32(.cln.AskrenelistreservationsReservations\"\x91\x01\n#AskrenelistreservationsReservations\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x16\n\x0e\x61ge_in_seconds\x18\x03 \x01(\x04\x12\x12\n\ncommand_id\x18\x04 \x01(\t\"\xcb\x02\n\x19InjectpaymentonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x63ltv_expiry\x18\x04 \x01(\r\x12\x0e\n\x06partid\x18\x05 \x01(\x04\x12\x0f\n\x07groupid\x18\x06 \x01(\x04\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12*\n\x10\x64\x65stination_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x10\n\x0e_localinvreqidB\x13\n\x11_destination_msat\"w\n\x1aInjectpaymentonionResponse\x12\x12\n\ncreated_at\x18\x01 \x01(\x04\x12\x14\n\x0c\x63ompleted_at\x18\x02 \x01(\x04\x12\x15\n\rcreated_index\x18\x03 \x01(\x04\x12\x18\n\x10payment_preimage\x18\x04 \x01(\x0c\">\n\x19InjectonionmessageRequest\x12\x10\n\x08path_key\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x1c\n\x1aInjectonionmessageResponse\"\x97\x02\n\x0bXpayRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12&\n\x0cpartial_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x07 \x01(\rH\x04\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0f\n\r_partial_msatB\x0b\n\t_maxdelay\"\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\"\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\"\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\"\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 StreamChannelStateChangedRequest\"\xb0\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\x0f\n\x07message\x18\x08 \x01(\t\"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_state2\xe9P\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<\n\tDecodePay\x12\x15.cln.DecodepayRequest\x1a\x16.cln.DecodepayResponse\"\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\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<\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\x12H\n\rBlacklistRune\x12\x19.cln.BlacklistruneRequest\x1a\x1a.cln.BlacklistruneResponse\"\x00\x12<\n\tCheckRune\x12\x15.cln.CheckruneRequest\x1a\x16.cln.CheckruneResponse\"\x00\x12?\n\nCreateRune\x12\x16.cln.CreateruneRequest\x1a\x17.cln.CreateruneResponse\"\x00\x12<\n\tShowRunes\x12\x15.cln.ShowrunesRequest\x1a\x16.cln.ShowrunesResponse\"\x00\x12Q\n\x10\x41skReneUnreserve\x12\x1c.cln.AskreneunreserveRequest\x1a\x1d.cln.AskreneunreserveResponse\"\x00\x12T\n\x11\x41skReneListLayers\x12\x1d.cln.AskrenelistlayersRequest\x1a\x1e.cln.AskrenelistlayersResponse\"\x00\x12W\n\x12\x41skReneCreateLayer\x12\x1e.cln.AskrenecreatelayerRequest\x1a\x1f.cln.AskrenecreatelayerResponse\"\x00\x12W\n\x12\x41skReneRemoveLayer\x12\x1e.cln.AskreneremovelayerRequest\x1a\x1f.cln.AskreneremovelayerResponse\"\x00\x12K\n\x0e\x41skReneReserve\x12\x1a.cln.AskrenereserveRequest\x1a\x1b.cln.AskrenereserveResponse\"\x00\x12?\n\nAskReneAge\x12\x16.cln.AskreneageRequest\x1a\x17.cln.AskreneageResponse\"\x00\x12<\n\tGetRoutes\x12\x15.cln.GetroutesRequest\x1a\x16.cln.GetroutesResponse\"\x00\x12W\n\x12\x41skReneDisableNode\x12\x1e.cln.AskrenedisablenodeRequest\x1a\x1f.cln.AskrenedisablenodeResponse\"\x00\x12]\n\x14\x41skReneInformChannel\x12 .cln.AskreneinformchannelRequest\x1a!.cln.AskreneinformchannelResponse\"\x00\x12]\n\x14\x41skReneCreateChannel\x12 .cln.AskrenecreatechannelRequest\x1a!.cln.AskrenecreatechannelResponse\"\x00\x12]\n\x14\x41skReneUpdateChannel\x12 .cln.AskreneupdatechannelRequest\x1a!.cln.AskreneupdatechannelResponse\"\x00\x12W\n\x12\x41skReneBiasChannel\x12\x1e.cln.AskrenebiaschannelRequest\x1a\x1f.cln.AskrenebiaschannelResponse\"\x00\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\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\x10SubscribeConnect\x12\x19.cln.StreamConnectRequest\x1a\x1c.cln.PeerConnectNotification\"\x00\x30\x01\x12Q\n\x12SubscribeCustomMsg\x12\x1b.cln.StreamCustomMsgRequest\x1a\x1a.cln.CustomMsgNotification\"\x00\x30\x01\x12o\n\x1cSubscribeChannelStateChanged\x12%.cln.StreamChannelStateChangedRequest\x1a$.cln.ChannelStateChangedNotification\"\x00\x30\x01\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -199,973 +199,973 @@ _globals['_EXPOSESECRETREQUEST']._serialized_start=12276 _globals['_EXPOSESECRETREQUEST']._serialized_end=12357 _globals['_EXPOSESECRETRESPONSE']._serialized_start=12359 - _globals['_EXPOSESECRETRESPONSE']._serialized_end=12418 - _globals['_RECOVERREQUEST']._serialized_start=12420 - _globals['_RECOVERREQUEST']._serialized_end=12455 - _globals['_RECOVERRESPONSE']._serialized_start=12458 - _globals['_RECOVERRESPONSE']._serialized_end=12594 - _globals['_RECOVERRESPONSE_RECOVERRESULT']._serialized_start=12534 - _globals['_RECOVERRESPONSE_RECOVERRESULT']._serialized_end=12583 - _globals['_RECOVERCHANNELREQUEST']._serialized_start=12596 - _globals['_RECOVERCHANNELREQUEST']._serialized_end=12632 - _globals['_RECOVERCHANNELRESPONSE']._serialized_start=12634 - _globals['_RECOVERCHANNELRESPONSE']._serialized_end=12673 - _globals['_INVOICEREQUEST']._serialized_start=12676 - _globals['_INVOICEREQUEST']._serialized_end=12957 - _globals['_INVOICERESPONSE']._serialized_start=12960 - _globals['_INVOICERESPONSE']._serialized_end=13365 - _globals['_INVOICEREQUESTREQUEST']._serialized_start=13368 - _globals['_INVOICEREQUESTREQUEST']._serialized_end=13593 - _globals['_INVOICEREQUESTRESPONSE']._serialized_start=13596 - _globals['_INVOICEREQUESTRESPONSE']._serialized_end=13735 - _globals['_DISABLEINVOICEREQUESTREQUEST']._serialized_start=13737 - _globals['_DISABLEINVOICEREQUESTREQUEST']._serialized_end=13786 - _globals['_DISABLEINVOICEREQUESTRESPONSE']._serialized_start=13789 - _globals['_DISABLEINVOICEREQUESTRESPONSE']._serialized_end=13935 - _globals['_LISTINVOICEREQUESTSREQUEST']._serialized_start=13937 - _globals['_LISTINVOICEREQUESTSREQUEST']._serialized_end=14045 - _globals['_LISTINVOICEREQUESTSRESPONSE']._serialized_start=14047 - _globals['_LISTINVOICEREQUESTSRESPONSE']._serialized_end=14142 - _globals['_LISTINVOICEREQUESTSINVOICEREQUESTS']._serialized_start=14145 - _globals['_LISTINVOICEREQUESTSINVOICEREQUESTS']._serialized_end=14296 - _globals['_LISTDATASTOREREQUEST']._serialized_start=14298 - _globals['_LISTDATASTOREREQUEST']._serialized_end=14333 - _globals['_LISTDATASTORERESPONSE']._serialized_start=14335 - _globals['_LISTDATASTORERESPONSE']._serialized_end=14406 - _globals['_LISTDATASTOREDATASTORE']._serialized_start=14409 - _globals['_LISTDATASTOREDATASTORE']._serialized_end=14544 - _globals['_LISTINVOICESREQUEST']._serialized_start=14547 - _globals['_LISTINVOICESREQUEST']._serialized_end=14897 - _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_start=14768 - _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_end=14813 - _globals['_LISTINVOICESRESPONSE']._serialized_start=14899 - _globals['_LISTINVOICESRESPONSE']._serialized_end=14966 - _globals['_LISTINVOICESINVOICES']._serialized_start=14969 - _globals['_LISTINVOICESINVOICES']._serialized_end=15820 - _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_start=15536 - _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_end=15599 - _globals['_LISTINVOICESINVOICESPAIDOUTPOINT']._serialized_start=15822 - _globals['_LISTINVOICESINVOICESPAIDOUTPOINT']._serialized_end=15886 - _globals['_SENDONIONREQUEST']._serialized_start=15889 - _globals['_SENDONIONREQUEST']._serialized_end=16391 - _globals['_SENDONIONRESPONSE']._serialized_start=16394 - _globals['_SENDONIONRESPONSE']._serialized_end=17009 - _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_start=16821 - _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_end=16865 - _globals['_SENDONIONFIRSTHOP']._serialized_start=17011 - _globals['_SENDONIONFIRSTHOP']._serialized_end=17091 - _globals['_LISTSENDPAYSREQUEST']._serialized_start=17094 - _globals['_LISTSENDPAYSREQUEST']._serialized_end=17510 - _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_start=17335 - _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_end=17394 - _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSINDEX']._serialized_start=17396 - _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSINDEX']._serialized_end=17441 - _globals['_LISTSENDPAYSRESPONSE']._serialized_start=17512 - _globals['_LISTSENDPAYSRESPONSE']._serialized_end=17579 - _globals['_LISTSENDPAYSPAYMENTS']._serialized_start=17582 - _globals['_LISTSENDPAYSPAYMENTS']._serialized_end=18346 - _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_start=18099 - _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_end=18166 - _globals['_LISTTRANSACTIONSREQUEST']._serialized_start=18348 - _globals['_LISTTRANSACTIONSREQUEST']._serialized_end=18373 - _globals['_LISTTRANSACTIONSRESPONSE']._serialized_start=18375 - _globals['_LISTTRANSACTIONSRESPONSE']._serialized_end=18458 - _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_start=18461 - _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_end=18709 - _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_start=18711 - _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_end=18794 - _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_start=18796 - _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_end=18904 - _globals['_MAKESECRETREQUEST']._serialized_start=18906 - _globals['_MAKESECRETREQUEST']._serialized_end=18983 - _globals['_MAKESECRETRESPONSE']._serialized_start=18985 - _globals['_MAKESECRETRESPONSE']._serialized_end=19021 - _globals['_PAYREQUEST']._serialized_start=19024 - _globals['_PAYREQUEST']._serialized_end=19555 - _globals['_PAYRESPONSE']._serialized_start=19558 - _globals['_PAYRESPONSE']._serialized_end=19937 - _globals['_PAYRESPONSE_PAYSTATUS']._serialized_start=19840 - _globals['_PAYRESPONSE_PAYSTATUS']._serialized_end=19890 - _globals['_LISTNODESREQUEST']._serialized_start=19939 - _globals['_LISTNODESREQUEST']._serialized_end=19981 - _globals['_LISTNODESRESPONSE']._serialized_start=19983 - _globals['_LISTNODESRESPONSE']._serialized_end=20038 - _globals['_LISTNODESNODES']._serialized_start=20041 - _globals['_LISTNODESNODES']._serialized_end=20353 - _globals['_LISTNODESNODESOPTIONWILLFUND']._serialized_start=20356 - _globals['_LISTNODESNODESOPTIONWILLFUND']._serialized_end=20598 - _globals['_LISTNODESNODESADDRESSES']._serialized_start=20601 - _globals['_LISTNODESNODESADDRESSES']._serialized_end=20833 - _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_start=20741 - _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_end=20821 - _globals['_WAITANYINVOICEREQUEST']._serialized_start=20835 - _globals['_WAITANYINVOICEREQUEST']._serialized_end=20938 - _globals['_WAITANYINVOICERESPONSE']._serialized_start=20941 - _globals['_WAITANYINVOICERESPONSE']._serialized_end=21664 - _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_start=21439 - _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_end=21484 - _globals['_WAITANYINVOICEPAIDOUTPOINT']._serialized_start=21666 - _globals['_WAITANYINVOICEPAIDOUTPOINT']._serialized_end=21724 - _globals['_WAITINVOICEREQUEST']._serialized_start=21726 - _globals['_WAITINVOICEREQUEST']._serialized_end=21761 - _globals['_WAITINVOICERESPONSE']._serialized_start=21764 - _globals['_WAITINVOICERESPONSE']._serialized_end=22472 - _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_start=22250 - _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_end=22292 - _globals['_WAITINVOICEPAIDOUTPOINT']._serialized_start=22474 - _globals['_WAITINVOICEPAIDOUTPOINT']._serialized_end=22529 - _globals['_WAITSENDPAYREQUEST']._serialized_start=22532 - _globals['_WAITSENDPAYREQUEST']._serialized_end=22674 - _globals['_WAITSENDPAYRESPONSE']._serialized_start=22677 - _globals['_WAITSENDPAYRESPONSE']._serialized_end=23331 - _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_start=23137 - _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_end=23170 - _globals['_NEWADDRREQUEST']._serialized_start=23334 - _globals['_NEWADDRREQUEST']._serialized_end=23485 - _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_start=23418 - _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_end=23469 - _globals['_NEWADDRRESPONSE']._serialized_start=23487 - _globals['_NEWADDRRESPONSE']._serialized_end=23564 - _globals['_WITHDRAWREQUEST']._serialized_start=23567 - _globals['_WITHDRAWREQUEST']._serialized_end=23752 - _globals['_WITHDRAWRESPONSE']._serialized_start=23754 - _globals['_WITHDRAWRESPONSE']._serialized_end=23812 - _globals['_KEYSENDREQUEST']._serialized_start=23815 - _globals['_KEYSENDREQUEST']._serialized_end=24246 - _globals['_KEYSENDRESPONSE']._serialized_start=24249 - _globals['_KEYSENDRESPONSE']._serialized_end=24619 - _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_start=24543 - _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_end=24572 - _globals['_FUNDPSBTREQUEST']._serialized_start=24622 - _globals['_FUNDPSBTREQUEST']._serialized_end=25042 - _globals['_FUNDPSBTRESPONSE']._serialized_start=25045 - _globals['_FUNDPSBTRESPONSE']._serialized_end=25262 - _globals['_FUNDPSBTRESERVATIONS']._serialized_start=25264 - _globals['_FUNDPSBTRESERVATIONS']._serialized_end=25381 - _globals['_SENDPSBTREQUEST']._serialized_start=25383 - _globals['_SENDPSBTREQUEST']._serialized_end=25448 - _globals['_SENDPSBTRESPONSE']._serialized_start=25450 - _globals['_SENDPSBTRESPONSE']._serialized_end=25494 - _globals['_SIGNPSBTREQUEST']._serialized_start=25496 - _globals['_SIGNPSBTREQUEST']._serialized_end=25545 - _globals['_SIGNPSBTRESPONSE']._serialized_start=25547 - _globals['_SIGNPSBTRESPONSE']._serialized_end=25586 - _globals['_UTXOPSBTREQUEST']._serialized_start=25589 - _globals['_UTXOPSBTREQUEST']._serialized_end=26005 - _globals['_UTXOPSBTRESPONSE']._serialized_start=26008 - _globals['_UTXOPSBTRESPONSE']._serialized_end=26225 - _globals['_UTXOPSBTRESERVATIONS']._serialized_start=26227 - _globals['_UTXOPSBTRESERVATIONS']._serialized_end=26344 - _globals['_TXDISCARDREQUEST']._serialized_start=26346 - _globals['_TXDISCARDREQUEST']._serialized_end=26378 - _globals['_TXDISCARDRESPONSE']._serialized_start=26380 - _globals['_TXDISCARDRESPONSE']._serialized_end=26434 - _globals['_TXPREPAREREQUEST']._serialized_start=26437 - _globals['_TXPREPAREREQUEST']._serialized_end=26601 - _globals['_TXPREPARERESPONSE']._serialized_start=26603 - _globals['_TXPREPARERESPONSE']._serialized_end=26671 - _globals['_TXSENDREQUEST']._serialized_start=26673 - _globals['_TXSENDREQUEST']._serialized_end=26702 - _globals['_TXSENDRESPONSE']._serialized_start=26704 - _globals['_TXSENDRESPONSE']._serialized_end=26760 - _globals['_LISTPEERCHANNELSREQUEST']._serialized_start=26762 - _globals['_LISTPEERCHANNELSREQUEST']._serialized_end=26863 - _globals['_LISTPEERCHANNELSRESPONSE']._serialized_start=26865 - _globals['_LISTPEERCHANNELSRESPONSE']._serialized_end=26940 - _globals['_LISTPEERCHANNELSCHANNELS']._serialized_start=26943 - _globals['_LISTPEERCHANNELSCHANNELS']._serialized_end=30259 - _globals['_LISTPEERCHANNELSCHANNELSUPDATES']._serialized_start=30262 - _globals['_LISTPEERCHANNELSCHANNELSUPDATES']._serialized_end=30429 - _globals['_LISTPEERCHANNELSCHANNELSUPDATESLOCAL']._serialized_start=30432 - _globals['_LISTPEERCHANNELSCHANNELSUPDATESLOCAL']._serialized_end=30650 - _globals['_LISTPEERCHANNELSCHANNELSUPDATESREMOTE']._serialized_start=30653 - _globals['_LISTPEERCHANNELSCHANNELSUPDATESREMOTE']._serialized_end=30872 - _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_start=30874 - _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_end=30937 - _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_start=30940 - _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_end=31207 - _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_start=31210 - _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_end=31495 - _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_start=31497 - _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_end=31590 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_start=31593 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_end=31970 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_start=31884 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_end=31941 - _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_start=31972 - _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_end=32023 - _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_start=32025 - _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_end=32116 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_start=32119 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_end=33383 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSECAUSE']._serialized_start=33055 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSECAUSE']._serialized_end=33172 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_start=33385 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_end=33486 - _globals['_DECODEPAYREQUEST']._serialized_start=33488 - _globals['_DECODEPAYREQUEST']._serialized_end=33564 - _globals['_DECODEPAYRESPONSE']._serialized_start=33567 - _globals['_DECODEPAYRESPONSE']._serialized_end=34150 - _globals['_DECODEPAYFALLBACKS']._serialized_start=34153 - _globals['_DECODEPAYFALLBACKS']._serialized_end=34361 - _globals['_DECODEPAYFALLBACKS_DECODEPAYFALLBACKSTYPE']._serialized_start=34274 - _globals['_DECODEPAYFALLBACKS_DECODEPAYFALLBACKSTYPE']._serialized_end=34352 - _globals['_DECODEPAYEXTRA']._serialized_start=34363 - _globals['_DECODEPAYEXTRA']._serialized_end=34406 - _globals['_DECODEREQUEST']._serialized_start=34408 - _globals['_DECODEREQUEST']._serialized_end=34439 - _globals['_DECODERESPONSE']._serialized_start=34442 - _globals['_DECODERESPONSE']._serialized_end=39574 - _globals['_DECODERESPONSE_DECODETYPE']._serialized_start=37553 - _globals['_DECODERESPONSE_DECODETYPE']._serialized_end=37684 - _globals['_DECODEOFFERPATHS']._serialized_start=39577 - _globals['_DECODEOFFERPATHS']._serialized_end=39813 - _globals['_DECODEOFFERRECURRENCEPAYWINDOW']._serialized_start=39816 - _globals['_DECODEOFFERRECURRENCEPAYWINDOW']._serialized_end=39953 - _globals['_DECODEINVREQPATHS']._serialized_start=39956 - _globals['_DECODEINVREQPATHS']._serialized_end=40235 - _globals['_DECODEINVREQPATHSPATH']._serialized_start=40237 - _globals['_DECODEINVREQPATHSPATH']._serialized_end=40319 - _globals['_DECODEINVREQBIP353NAME']._serialized_start=40321 - _globals['_DECODEINVREQBIP353NAME']._serialized_end=40405 - _globals['_DECODEINVOICEPATHSPATH']._serialized_start=40407 - _globals['_DECODEINVOICEPATHSPATH']._serialized_end=40490 - _globals['_DECODEINVOICEFALLBACKS']._serialized_start=40492 - _globals['_DECODEINVOICEFALLBACKS']._serialized_end=40580 - _globals['_DECODEFALLBACKS']._serialized_start=40583 - _globals['_DECODEFALLBACKS']._serialized_end=40881 - _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_start=40751 - _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_end=40826 - _globals['_DECODEEXTRA']._serialized_start=40883 - _globals['_DECODEEXTRA']._serialized_end=40923 - _globals['_DECODERESTRICTIONS']._serialized_start=40925 - _globals['_DECODERESTRICTIONS']._serialized_end=40984 - _globals['_DELPAYREQUEST']._serialized_start=40987 - _globals['_DELPAYREQUEST']._serialized_end=41181 - _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_start=41118 - _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_end=41158 - _globals['_DELPAYRESPONSE']._serialized_start=41183 - _globals['_DELPAYRESPONSE']._serialized_end=41238 - _globals['_DELPAYPAYMENTS']._serialized_start=41241 - _globals['_DELPAYPAYMENTS']._serialized_end=41956 - _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_start=41719 - _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_end=41780 - _globals['_DELFORWARDREQUEST']._serialized_start=41959 - _globals['_DELFORWARDREQUEST']._serialized_end=42138 - _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_start=42077 - _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_end=42138 - _globals['_DELFORWARDRESPONSE']._serialized_start=42140 - _globals['_DELFORWARDRESPONSE']._serialized_end=42160 - _globals['_DISABLEOFFERREQUEST']._serialized_start=42162 - _globals['_DISABLEOFFERREQUEST']._serialized_end=42201 - _globals['_DISABLEOFFERRESPONSE']._serialized_start=42204 - _globals['_DISABLEOFFERRESPONSE']._serialized_end=42340 - _globals['_ENABLEOFFERREQUEST']._serialized_start=42342 - _globals['_ENABLEOFFERREQUEST']._serialized_end=42380 - _globals['_ENABLEOFFERRESPONSE']._serialized_start=42383 - _globals['_ENABLEOFFERRESPONSE']._serialized_end=42518 - _globals['_DISCONNECTREQUEST']._serialized_start=42520 - _globals['_DISCONNECTREQUEST']._serialized_end=42581 - _globals['_DISCONNECTRESPONSE']._serialized_start=42583 - _globals['_DISCONNECTRESPONSE']._serialized_end=42603 - _globals['_FEERATESREQUEST']._serialized_start=42605 - _globals['_FEERATESREQUEST']._serialized_end=42712 - _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_start=42675 - _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_end=42712 - _globals['_FEERATESRESPONSE']._serialized_start=42715 - _globals['_FEERATESRESPONSE']._serialized_end=42997 - _globals['_FEERATESPERKB']._serialized_start=43000 - _globals['_FEERATESPERKB']._serialized_end=43467 - _globals['_FEERATESPERKBESTIMATES']._serialized_start=43469 - _globals['_FEERATESPERKBESTIMATES']._serialized_end=43556 - _globals['_FEERATESPERKW']._serialized_start=43559 - _globals['_FEERATESPERKW']._serialized_end=44026 - _globals['_FEERATESPERKWESTIMATES']._serialized_start=44028 - _globals['_FEERATESPERKWESTIMATES']._serialized_end=44115 - _globals['_FEERATESONCHAINFEEESTIMATES']._serialized_start=44118 - _globals['_FEERATESONCHAINFEEESTIMATES']._serialized_end=44399 - _globals['_FETCHBIP353REQUEST']._serialized_start=44401 - _globals['_FETCHBIP353REQUEST']._serialized_end=44438 - _globals['_FETCHBIP353RESPONSE']._serialized_start=44440 - _globals['_FETCHBIP353RESPONSE']._serialized_end=44528 - _globals['_FETCHBIP353INSTRUCTIONS']._serialized_start=44531 - _globals['_FETCHBIP353INSTRUCTIONS']._serialized_end=44778 - _globals['_FETCHINVOICEREQUEST']._serialized_start=44781 - _globals['_FETCHINVOICEREQUEST']._serialized_end=45222 - _globals['_FETCHINVOICERESPONSE']._serialized_start=45225 - _globals['_FETCHINVOICERESPONSE']._serialized_end=45378 - _globals['_FETCHINVOICECHANGES']._serialized_start=45381 - _globals['_FETCHINVOICECHANGES']._serialized_end=45639 - _globals['_FETCHINVOICENEXTPERIOD']._serialized_start=45641 - _globals['_FETCHINVOICENEXTPERIOD']._serialized_end=45766 - _globals['_FUNDCHANNELCANCELREQUEST']._serialized_start=45768 - _globals['_FUNDCHANNELCANCELREQUEST']._serialized_end=45806 - _globals['_FUNDCHANNELCANCELRESPONSE']._serialized_start=45808 - _globals['_FUNDCHANNELCANCELRESPONSE']._serialized_end=45854 - _globals['_FUNDCHANNELCOMPLETEREQUEST']._serialized_start=45856 - _globals['_FUNDCHANNELCOMPLETEREQUEST']._serialized_end=45910 - _globals['_FUNDCHANNELCOMPLETERESPONSE']._serialized_start=45912 - _globals['_FUNDCHANNELCOMPLETERESPONSE']._serialized_end=45990 - _globals['_FUNDCHANNELREQUEST']._serialized_start=45993 - _globals['_FUNDCHANNELREQUEST']._serialized_end=46500 - _globals['_FUNDCHANNELRESPONSE']._serialized_start=46503 - _globals['_FUNDCHANNELRESPONSE']._serialized_end=46731 - _globals['_FUNDCHANNELCHANNELTYPE']._serialized_start=46733 - _globals['_FUNDCHANNELCHANNELTYPE']._serialized_end=46808 - _globals['_FUNDCHANNELSTARTREQUEST']._serialized_start=46811 - _globals['_FUNDCHANNELSTARTREQUEST']._serialized_end=47153 - _globals['_FUNDCHANNELSTARTRESPONSE']._serialized_start=47156 - _globals['_FUNDCHANNELSTARTRESPONSE']._serialized_end=47402 - _globals['_FUNDCHANNELSTARTCHANNELTYPE']._serialized_start=47404 - _globals['_FUNDCHANNELSTARTCHANNELTYPE']._serialized_end=47484 - _globals['_GETLOGREQUEST']._serialized_start=47487 - _globals['_GETLOGREQUEST']._serialized_end=47644 - _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_start=47556 - _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_end=47634 - _globals['_GETLOGRESPONSE']._serialized_start=47646 - _globals['_GETLOGRESPONSE']._serialized_end=47750 - _globals['_GETLOGLOG']._serialized_start=47753 - _globals['_GETLOGLOG']._serialized_end=48113 - _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_start=47940 - _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_end=48048 - _globals['_FUNDERUPDATEREQUEST']._serialized_start=48116 - _globals['_FUNDERUPDATEREQUEST']._serialized_end=49229 - _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_start=48810 - _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_end=48867 - _globals['_FUNDERUPDATERESPONSE']._serialized_start=49232 - _globals['_FUNDERUPDATERESPONSE']._serialized_end=50095 - _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_start=48810 - _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_end=48867 - _globals['_GETROUTEREQUEST']._serialized_start=50098 - _globals['_GETROUTEREQUEST']._serialized_end=50334 - _globals['_GETROUTERESPONSE']._serialized_start=50336 - _globals['_GETROUTERESPONSE']._serialized_end=50389 - _globals['_GETROUTEROUTE']._serialized_start=50392 - _globals['_GETROUTEROUTE']._serialized_end=50589 - _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_start=50560 - _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_end=50589 - _globals['_LISTADDRESSESREQUEST']._serialized_start=50591 - _globals['_LISTADDRESSESREQUEST']._serialized_end=50707 - _globals['_LISTADDRESSESRESPONSE']._serialized_start=50709 - _globals['_LISTADDRESSESRESPONSE']._serialized_end=50780 - _globals['_LISTADDRESSESADDRESSES']._serialized_start=50782 - _globals['_LISTADDRESSESADDRESSES']._serialized_end=50882 - _globals['_LISTFORWARDSREQUEST']._serialized_start=50885 - _globals['_LISTFORWARDSREQUEST']._serialized_end=51324 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_start=51129 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_end=51205 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_start=51207 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_end=51252 - _globals['_LISTFORWARDSRESPONSE']._serialized_start=51326 - _globals['_LISTFORWARDSRESPONSE']._serialized_end=51393 - _globals['_LISTFORWARDSFORWARDS']._serialized_start=51396 - _globals['_LISTFORWARDSFORWARDS']._serialized_end=52216 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_start=51917 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_end=52001 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_start=52003 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_end=52051 - _globals['_LISTOFFERSREQUEST']._serialized_start=52218 - _globals['_LISTOFFERSREQUEST']._serialized_end=52315 - _globals['_LISTOFFERSRESPONSE']._serialized_start=52317 - _globals['_LISTOFFERSRESPONSE']._serialized_end=52376 - _globals['_LISTOFFERSOFFERS']._serialized_start=52379 - _globals['_LISTOFFERSOFFERS']._serialized_end=52511 - _globals['_LISTPAYSREQUEST']._serialized_start=52514 - _globals['_LISTPAYSREQUEST']._serialized_end=52902 - _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_start=52735 - _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_end=52790 - _globals['_LISTPAYSREQUEST_LISTPAYSINDEX']._serialized_start=52792 - _globals['_LISTPAYSREQUEST_LISTPAYSINDEX']._serialized_end=52833 - _globals['_LISTPAYSRESPONSE']._serialized_start=52904 - _globals['_LISTPAYSRESPONSE']._serialized_end=52955 - _globals['_LISTPAYSPAYS']._serialized_start=52958 - _globals['_LISTPAYSPAYS']._serialized_end=53689 - _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_start=53428 - _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_end=53487 - _globals['_LISTHTLCSREQUEST']._serialized_start=53692 - _globals['_LISTHTLCSREQUEST']._serialized_end=53906 - _globals['_LISTHTLCSREQUEST_LISTHTLCSINDEX']._serialized_start=53827 - _globals['_LISTHTLCSREQUEST_LISTHTLCSINDEX']._serialized_end=53869 - _globals['_LISTHTLCSRESPONSE']._serialized_start=53908 - _globals['_LISTHTLCSRESPONSE']._serialized_end=53963 - _globals['_LISTHTLCSHTLCS']._serialized_start=53966 - _globals['_LISTHTLCSHTLCS']._serialized_end=54323 - _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_start=54245 - _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_end=54287 - _globals['_MULTIFUNDCHANNELREQUEST']._serialized_start=54326 - _globals['_MULTIFUNDCHANNELREQUEST']._serialized_end=54632 - _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_start=54635 - _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_end=54786 - _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_start=54789 - _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_end=55172 - _globals['_MULTIFUNDCHANNELCHANNELIDS']._serialized_start=55175 - _globals['_MULTIFUNDCHANNELCHANNELIDS']._serialized_end=55375 - _globals['_MULTIFUNDCHANNELCHANNELIDSCHANNELTYPE']._serialized_start=55377 - _globals['_MULTIFUNDCHANNELCHANNELIDSCHANNELTYPE']._serialized_end=55467 - _globals['_MULTIFUNDCHANNELFAILED']._serialized_start=55470 - _globals['_MULTIFUNDCHANNELFAILED']._serialized_end=55745 - _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_start=55631 - _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_end=55745 - _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_start=55747 - _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_end=55807 - _globals['_MULTIWITHDRAWREQUEST']._serialized_start=55810 - _globals['_MULTIWITHDRAWREQUEST']._serialized_end=55978 - _globals['_MULTIWITHDRAWRESPONSE']._serialized_start=55980 - _globals['_MULTIWITHDRAWRESPONSE']._serialized_end=56029 - _globals['_OFFERREQUEST']._serialized_start=56032 - _globals['_OFFERREQUEST']._serialized_end=56618 - _globals['_OFFERRESPONSE']._serialized_start=56621 - _globals['_OFFERRESPONSE']._serialized_end=56767 - _globals['_OPENCHANNELABORTREQUEST']._serialized_start=56769 - _globals['_OPENCHANNELABORTREQUEST']._serialized_end=56814 - _globals['_OPENCHANNELABORTRESPONSE']._serialized_start=56816 - _globals['_OPENCHANNELABORTRESPONSE']._serialized_end=56904 - _globals['_OPENCHANNELBUMPREQUEST']._serialized_start=56907 - _globals['_OPENCHANNELBUMPREQUEST']._serialized_end=57065 - _globals['_OPENCHANNELBUMPRESPONSE']._serialized_start=57068 - _globals['_OPENCHANNELBUMPRESPONSE']._serialized_end=57327 - _globals['_OPENCHANNELBUMPCHANNELTYPE']._serialized_start=57329 - _globals['_OPENCHANNELBUMPCHANNELTYPE']._serialized_end=57408 - _globals['_OPENCHANNELINITREQUEST']._serialized_start=57411 - _globals['_OPENCHANNELINITREQUEST']._serialized_end=57826 - _globals['_OPENCHANNELINITRESPONSE']._serialized_start=57829 - _globals['_OPENCHANNELINITRESPONSE']._serialized_end=58088 - _globals['_OPENCHANNELINITCHANNELTYPE']._serialized_start=58090 - _globals['_OPENCHANNELINITCHANNELTYPE']._serialized_end=58169 - _globals['_OPENCHANNELSIGNEDREQUEST']._serialized_start=58171 - _globals['_OPENCHANNELSIGNEDREQUEST']._serialized_end=58238 - _globals['_OPENCHANNELSIGNEDRESPONSE']._serialized_start=58240 - _globals['_OPENCHANNELSIGNEDRESPONSE']._serialized_end=58313 - _globals['_OPENCHANNELUPDATEREQUEST']._serialized_start=58315 - _globals['_OPENCHANNELUPDATEREQUEST']._serialized_end=58375 - _globals['_OPENCHANNELUPDATERESPONSE']._serialized_start=58378 - _globals['_OPENCHANNELUPDATERESPONSE']._serialized_end=58677 - _globals['_OPENCHANNELUPDATECHANNELTYPE']._serialized_start=58679 - _globals['_OPENCHANNELUPDATECHANNELTYPE']._serialized_end=58760 - _globals['_PINGREQUEST']._serialized_start=58762 - _globals['_PINGREQUEST']._serialized_end=58851 - _globals['_PINGRESPONSE']._serialized_start=58853 - _globals['_PINGRESPONSE']._serialized_end=58883 - _globals['_PLUGINREQUEST']._serialized_start=58886 - _globals['_PLUGINREQUEST']._serialized_end=59031 - _globals['_PLUGINRESPONSE']._serialized_start=59033 - _globals['_PLUGINRESPONSE']._serialized_end=59158 - _globals['_PLUGINPLUGINS']._serialized_start=59160 - _globals['_PLUGINPLUGINS']._serialized_end=59222 - _globals['_RENEPAYSTATUSREQUEST']._serialized_start=59224 - _globals['_RENEPAYSTATUSREQUEST']._serialized_end=59284 - _globals['_RENEPAYSTATUSRESPONSE']._serialized_start=59286 - _globals['_RENEPAYSTATUSRESPONSE']._serialized_end=59357 - _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_start=59360 - _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_end=59842 - _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_start=59705 - _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_end=59774 - _globals['_RENEPAYREQUEST']._serialized_start=59845 - _globals['_RENEPAYREQUEST']._serialized_end=60191 - _globals['_RENEPAYRESPONSE']._serialized_start=60194 - _globals['_RENEPAYRESPONSE']._serialized_end=60615 - _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_start=60511 - _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_end=60565 - _globals['_RESERVEINPUTSREQUEST']._serialized_start=60617 - _globals['_RESERVEINPUTSREQUEST']._serialized_end=60725 - _globals['_RESERVEINPUTSRESPONSE']._serialized_start=60727 - _globals['_RESERVEINPUTSRESPONSE']._serialized_end=60804 - _globals['_RESERVEINPUTSRESERVATIONS']._serialized_start=60806 - _globals['_RESERVEINPUTSRESERVATIONS']._serialized_end=60928 - _globals['_SENDCUSTOMMSGREQUEST']._serialized_start=60930 - _globals['_SENDCUSTOMMSGREQUEST']._serialized_end=60982 - _globals['_SENDCUSTOMMSGRESPONSE']._serialized_start=60984 - _globals['_SENDCUSTOMMSGRESPONSE']._serialized_end=61023 - _globals['_SENDINVOICEREQUEST']._serialized_start=61026 - _globals['_SENDINVOICEREQUEST']._serialized_end=61202 - _globals['_SENDINVOICERESPONSE']._serialized_start=61205 - _globals['_SENDINVOICERESPONSE']._serialized_end=61796 - _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_start=61607 - _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_end=61661 - _globals['_SETCHANNELREQUEST']._serialized_start=61799 - _globals['_SETCHANNELREQUEST']._serialized_end=62097 - _globals['_SETCHANNELRESPONSE']._serialized_start=62099 - _globals['_SETCHANNELRESPONSE']._serialized_end=62162 - _globals['_SETCHANNELCHANNELS']._serialized_start=62165 - _globals['_SETCHANNELCHANNELS']._serialized_end=62623 - _globals['_SETCONFIGREQUEST']._serialized_start=62625 - _globals['_SETCONFIGREQUEST']._serialized_end=62723 - _globals['_SETCONFIGRESPONSE']._serialized_start=62725 - _globals['_SETCONFIGRESPONSE']._serialized_end=62782 - _globals['_SETCONFIGCONFIG']._serialized_start=62785 - _globals['_SETCONFIGCONFIG']._serialized_end=63078 - _globals['_SETPSBTVERSIONREQUEST']._serialized_start=63080 - _globals['_SETPSBTVERSIONREQUEST']._serialized_end=63134 - _globals['_SETPSBTVERSIONRESPONSE']._serialized_start=63136 - _globals['_SETPSBTVERSIONRESPONSE']._serialized_end=63174 - _globals['_SIGNINVOICEREQUEST']._serialized_start=63176 - _globals['_SIGNINVOICEREQUEST']._serialized_end=63215 - _globals['_SIGNINVOICERESPONSE']._serialized_start=63217 - _globals['_SIGNINVOICERESPONSE']._serialized_end=63254 - _globals['_SIGNMESSAGEREQUEST']._serialized_start=63256 - _globals['_SIGNMESSAGEREQUEST']._serialized_end=63293 - _globals['_SIGNMESSAGERESPONSE']._serialized_start=63295 - _globals['_SIGNMESSAGERESPONSE']._serialized_end=63365 - _globals['_SPLICEINITREQUEST']._serialized_start=63368 - _globals['_SPLICEINITREQUEST']._serialized_end=63568 - _globals['_SPLICEINITRESPONSE']._serialized_start=63570 - _globals['_SPLICEINITRESPONSE']._serialized_end=63604 - _globals['_SPLICESIGNEDREQUEST']._serialized_start=63606 - _globals['_SPLICESIGNEDREQUEST']._serialized_end=63701 - _globals['_SPLICESIGNEDRESPONSE']._serialized_start=63703 - _globals['_SPLICESIGNEDRESPONSE']._serialized_end=63797 - _globals['_SPLICEUPDATEREQUEST']._serialized_start=63799 - _globals['_SPLICEUPDATEREQUEST']._serialized_end=63854 - _globals['_SPLICEUPDATERESPONSE']._serialized_start=63856 - _globals['_SPLICEUPDATERESPONSE']._serialized_end=63977 - _globals['_DEVSPLICEREQUEST']._serialized_start=63980 - _globals['_DEVSPLICEREQUEST']._serialized_end=64178 - _globals['_DEVSPLICERESPONSE']._serialized_start=64181 - _globals['_DEVSPLICERESPONSE']._serialized_end=64309 - _globals['_UNRESERVEINPUTSREQUEST']._serialized_start=64311 - _globals['_UNRESERVEINPUTSREQUEST']._serialized_end=64383 - _globals['_UNRESERVEINPUTSRESPONSE']._serialized_start=64385 - _globals['_UNRESERVEINPUTSRESPONSE']._serialized_end=64466 - _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_start=64469 - _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_end=64620 - _globals['_UPGRADEWALLETREQUEST']._serialized_start=64622 - _globals['_UPGRADEWALLETREQUEST']._serialized_end=64732 - _globals['_UPGRADEWALLETRESPONSE']._serialized_start=64735 - _globals['_UPGRADEWALLETRESPONSE']._serialized_end=64884 - _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_start=64886 - _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_end=64965 - _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_start=64967 - _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_end=65013 - _globals['_WAITREQUEST']._serialized_start=65016 - _globals['_WAITREQUEST']._serialized_end=65310 - _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_start=65152 - _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_end=65254 - _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_start=65256 - _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_end=65310 - _globals['_WAITRESPONSE']._serialized_start=65313 - _globals['_WAITRESPONSE']._serialized_end=65976 - _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_start=65152 - _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_end=65254 - _globals['_WAITFORWARDS']._serialized_start=65979 - _globals['_WAITFORWARDS']._serialized_end=66310 - _globals['_WAITFORWARDS_WAITFORWARDSSTATUS']._serialized_start=66165 - _globals['_WAITFORWARDS_WAITFORWARDSSTATUS']._serialized_end=66241 - _globals['_WAITINVOICES']._serialized_start=66313 - _globals['_WAITINVOICES']._serialized_end=66590 - _globals['_WAITINVOICES_WAITINVOICESSTATUS']._serialized_start=66476 - _globals['_WAITINVOICES_WAITINVOICESSTATUS']._serialized_end=66531 - _globals['_WAITSENDPAYS']._serialized_start=66593 - _globals['_WAITSENDPAYS']._serialized_end=66848 - _globals['_WAITSENDPAYS_WAITSENDPAYSSTATUS']._serialized_start=66738 - _globals['_WAITSENDPAYS_WAITSENDPAYSSTATUS']._serialized_end=66797 - _globals['_WAITHTLCS']._serialized_start=66851 - _globals['_WAITHTLCS']._serialized_end=67787 - _globals['_WAITHTLCS_WAITHTLCSSTATE']._serialized_start=67120 - _globals['_WAITHTLCS_WAITHTLCSSTATE']._serialized_end=67642 - _globals['_WAITHTLCS_WAITHTLCSDIRECTION']._serialized_start=67644 - _globals['_WAITHTLCS_WAITHTLCSDIRECTION']._serialized_end=67681 - _globals['_WAITCHAINMOVES']._serialized_start=67789 - _globals['_WAITCHAINMOVES']._serialized_end=67889 - _globals['_WAITCHANNELMOVES']._serialized_start=67891 - _globals['_WAITCHANNELMOVES']._serialized_end=67993 - _globals['_WAITDETAILS']._serialized_start=67996 - _globals['_WAITDETAILS']._serialized_end=68632 - _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_start=68338 - _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_end=68475 - _globals['_LISTCONFIGSREQUEST']._serialized_start=68634 - _globals['_LISTCONFIGSREQUEST']._serialized_end=68686 - _globals['_LISTCONFIGSRESPONSE']._serialized_start=68688 - _globals['_LISTCONFIGSRESPONSE']._serialized_end=68768 - _globals['_LISTCONFIGSCONFIGS']._serialized_start=68771 - _globals['_LISTCONFIGSCONFIGS']._serialized_end=74764 - _globals['_LISTCONFIGSCONFIGSCONF']._serialized_start=74767 - _globals['_LISTCONFIGSCONFIGSCONF']._serialized_end=74929 - _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_start=74886 - _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_end=74929 - _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_start=74931 - _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_end=74989 - _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_start=74991 - _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_end=75052 - _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_start=75054 - _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_end=75145 - _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_start=75147 - _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_end=75203 - _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_start=75205 - _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_end=75261 - _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_start=75263 - _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_end=75318 - _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_start=75320 - _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_end=75376 - _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_start=75378 - _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_end=75450 - _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_start=75452 - _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_end=75515 - _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_start=75517 - _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_end=75583 - _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_start=75585 - _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_end=75652 - _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_start=75654 - _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_end=75716 - _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_start=75718 - _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_end=75793 - _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_start=75795 - _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_end=75857 - _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_start=75859 - _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_end=75929 - _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_start=75931 - _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_end=76001 - _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_start=76003 - _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_end=76058 - _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_start=76060 - _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_end=76121 - _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_start=76123 - _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_end=76185 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_start=76187 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_end=76256 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_start=76258 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_end=76327 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_start=76329 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_end=76403 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_start=76405 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_end=76472 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_start=76474 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_end=76555 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_start=76557 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_end=76629 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_start=76631 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_end=76699 - _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_start=76701 - _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_end=76772 - _globals['_LISTCONFIGSCONFIGSRGB']._serialized_start=76774 - _globals['_LISTCONFIGSCONFIGSRGB']._serialized_end=76832 - _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_start=76834 - _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_end=76894 - _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_start=76896 - _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_end=76958 - _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_start=76960 - _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_end=77031 - _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_start=77033 - _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_end=77103 - _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_start=77105 - _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_end=77177 - _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_start=77179 - _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_end=77249 - _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_start=77251 - _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_end=77315 - _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_start=77317 - _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_end=77381 - _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_start=77383 - _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_end=77448 - _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_start=77450 - _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_end=77512 - _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_start=77514 - _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_end=77575 - _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_start=77577 - _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_end=77645 - _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_start=77647 - _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_end=77720 - _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_start=77722 - _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_end=77806 - _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_start=77808 - _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_end=77892 - _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_start=77894 - _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_end=77986 - _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_start=77988 - _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_end=78091 - _globals['_LISTCONFIGSCONFIGSADDR']._serialized_start=78093 - _globals['_LISTCONFIGSCONFIGSADDR']._serialized_end=78154 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_start=78156 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_end=78225 - _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_start=78227 - _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_end=78292 - _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_start=78294 - _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_end=78350 - _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_start=78352 - _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_end=78418 - _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_start=78420 - _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_end=78480 - _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_start=78482 - _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_end=78541 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_start=78544 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_end=78800 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_start=78719 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_end=78800 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_start=78802 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_end=78883 - _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_start=78885 - _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_end=78946 - _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_start=78948 - _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_end=79014 - _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_start=79016 - _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_end=79079 - _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_start=79081 - _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_end=79145 - _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_start=79147 - _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_end=79211 - _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_start=79213 - _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_end=79282 - _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_start=79284 - _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_end=79352 - _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_start=79354 - _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_end=79420 - _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_start=79422 - _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_end=79524 - _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_start=79526 - _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_end=79599 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_start=79601 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_end=79672 - _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_start=79674 - _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_end=79752 - _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_start=79754 - _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_end=79818 - _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_start=79820 - _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_end=79894 - _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_start=79896 - _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_end=79973 - _globals['_STOPREQUEST']._serialized_start=79975 - _globals['_STOPREQUEST']._serialized_end=79988 - _globals['_STOPRESPONSE']._serialized_start=79990 - _globals['_STOPRESPONSE']._serialized_end=80103 - _globals['_STOPRESPONSE_STOPRESULT']._serialized_start=80057 - _globals['_STOPRESPONSE_STOPRESULT']._serialized_end=80092 - _globals['_HELPREQUEST']._serialized_start=80105 - _globals['_HELPREQUEST']._serialized_end=80152 - _globals['_HELPRESPONSE']._serialized_start=80155 - _globals['_HELPRESPONSE']._serialized_end=80304 - _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_start=80260 - _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_end=80288 - _globals['_HELPHELP']._serialized_start=80306 - _globals['_HELPHELP']._serialized_end=80333 - _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_start=80335 - _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_end=80438 - _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_start=80440 - _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_end=80467 - _globals['_PREAPPROVEINVOICEREQUEST']._serialized_start=80469 - _globals['_PREAPPROVEINVOICEREQUEST']._serialized_end=80511 - _globals['_PREAPPROVEINVOICERESPONSE']._serialized_start=80513 - _globals['_PREAPPROVEINVOICERESPONSE']._serialized_end=80540 - _globals['_STATICBACKUPREQUEST']._serialized_start=80542 - _globals['_STATICBACKUPREQUEST']._serialized_end=80563 - _globals['_STATICBACKUPRESPONSE']._serialized_start=80565 - _globals['_STATICBACKUPRESPONSE']._serialized_end=80600 - _globals['_BKPRCHANNELSAPYREQUEST']._serialized_start=80602 - _globals['_BKPRCHANNELSAPYREQUEST']._serialized_end=80702 - _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_start=80704 - _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_end=80784 - _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_start=80787 - _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_end=81676 - _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_start=81679 - _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_end=81889 - _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_start=81892 - _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_end=82104 - _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_start=82018 - _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_end=82104 - _globals['_BKPRINSPECTREQUEST']._serialized_start=82106 - _globals['_BKPRINSPECTREQUEST']._serialized_end=82143 - _globals['_BKPRINSPECTRESPONSE']._serialized_start=82145 - _globals['_BKPRINSPECTRESPONSE']._serialized_end=82200 - _globals['_BKPRINSPECTTXS']._serialized_start=82203 - _globals['_BKPRINSPECTTXS']._serialized_end=82357 - _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_start=82360 - _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_end=82804 - _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_start=82806 - _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_end=82910 - _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_start=82912 - _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_end=82993 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_start=82996 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_end=83669 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_start=83472 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_end=83546 - _globals['_BKPRLISTBALANCESREQUEST']._serialized_start=83671 - _globals['_BKPRLISTBALANCESREQUEST']._serialized_end=83696 - _globals['_BKPRLISTBALANCESRESPONSE']._serialized_start=83698 - _globals['_BKPRLISTBALANCESRESPONSE']._serialized_end=83773 - _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_start=83776 - _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_end=84102 - _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_start=84104 - _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_end=84192 - _globals['_BKPRLISTINCOMEREQUEST']._serialized_start=84195 - _globals['_BKPRLISTINCOMEREQUEST']._serialized_end=84346 - _globals['_BKPRLISTINCOMERESPONSE']._serialized_start=84348 - _globals['_BKPRLISTINCOMERESPONSE']._serialized_end=84428 - _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_start=84431 - _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_end=84739 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_start=84741 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_end=84821 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_start=84823 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_end=84924 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_start=84927 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_end=85602 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_start=85428 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_end=85495 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_start=85604 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_end=85681 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_start=85683 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_end=85782 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_start=85785 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_end=86456 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_start=86283 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_end=86349 - _globals['_BLACKLISTRUNEREQUEST']._serialized_start=86458 - _globals['_BLACKLISTRUNEREQUEST']._serialized_end=86568 - _globals['_BLACKLISTRUNERESPONSE']._serialized_start=86570 - _globals['_BLACKLISTRUNERESPONSE']._serialized_end=86641 - _globals['_BLACKLISTRUNEBLACKLIST']._serialized_start=86643 - _globals['_BLACKLISTRUNEBLACKLIST']._serialized_end=86695 - _globals['_CHECKRUNEREQUEST']._serialized_start=86697 - _globals['_CHECKRUNEREQUEST']._serialized_end=86809 - _globals['_CHECKRUNERESPONSE']._serialized_start=86811 - _globals['_CHECKRUNERESPONSE']._serialized_end=86845 - _globals['_CREATERUNEREQUEST']._serialized_start=86847 - _globals['_CREATERUNEREQUEST']._serialized_end=86916 - _globals['_CREATERUNERESPONSE']._serialized_start=86918 - _globals['_CREATERUNERESPONSE']._serialized_end=87041 - _globals['_SHOWRUNESREQUEST']._serialized_start=87043 - _globals['_SHOWRUNESREQUEST']._serialized_end=87089 - _globals['_SHOWRUNESRESPONSE']._serialized_start=87091 - _globals['_SHOWRUNESRESPONSE']._serialized_end=87146 - _globals['_SHOWRUNESRUNES']._serialized_start=87149 - _globals['_SHOWRUNESRUNES']._serialized_end=87434 - _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_start=87436 - _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_end=87548 - _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_start=87550 - _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_end=87660 - _globals['_ASKRENEUNRESERVEREQUEST']._serialized_start=87662 - _globals['_ASKRENEUNRESERVEREQUEST']._serialized_end=87728 - _globals['_ASKRENEUNRESERVERESPONSE']._serialized_start=87730 - _globals['_ASKRENEUNRESERVERESPONSE']._serialized_end=87756 - _globals['_ASKRENEUNRESERVEPATH']._serialized_start=87758 - _globals['_ASKRENEUNRESERVEPATH']._serialized_end=87874 - _globals['_ASKRENELISTLAYERSREQUEST']._serialized_start=87876 - _globals['_ASKRENELISTLAYERSREQUEST']._serialized_end=87932 - _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_start=87934 - _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_end=88007 - _globals['_ASKRENELISTLAYERSLAYERS']._serialized_start=88010 - _globals['_ASKRENELISTLAYERSLAYERS']._serialized_end=88395 - _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_start=88398 - _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_end=88537 - _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_start=88540 - _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_end=88964 - _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_start=88967 - _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_end=89215 - _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_start=89217 - _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_end=89334 - _globals['_ASKRENECREATELAYERREQUEST']._serialized_start=89336 - _globals['_ASKRENECREATELAYERREQUEST']._serialized_end=89418 - _globals['_ASKRENECREATELAYERRESPONSE']._serialized_start=89420 - _globals['_ASKRENECREATELAYERRESPONSE']._serialized_end=89495 - _globals['_ASKRENECREATELAYERLAYERS']._serialized_start=89498 - _globals['_ASKRENECREATELAYERLAYERS']._serialized_end=89868 - _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_start=89871 - _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_end=90011 - _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_start=90014 - _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_end=90351 - _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_start=90354 - _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_end=90550 - _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_start=90552 - _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_end=90670 - _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_start=90672 - _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_end=90714 - _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_start=90716 - _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_end=90744 - _globals['_ASKRENERESERVEREQUEST']._serialized_start=90746 - _globals['_ASKRENERESERVEREQUEST']._serialized_end=90808 - _globals['_ASKRENERESERVERESPONSE']._serialized_start=90810 - _globals['_ASKRENERESERVERESPONSE']._serialized_end=90834 - _globals['_ASKRENERESERVEPATH']._serialized_start=90836 - _globals['_ASKRENERESERVEPATH']._serialized_end=90950 - _globals['_ASKRENEAGEREQUEST']._serialized_start=90952 - _globals['_ASKRENEAGEREQUEST']._serialized_end=91002 - _globals['_ASKRENEAGERESPONSE']._serialized_start=91004 - _globals['_ASKRENEAGERESPONSE']._serialized_end=91060 - _globals['_GETROUTESREQUEST']._serialized_start=91063 - _globals['_GETROUTESREQUEST']._serialized_end=91314 - _globals['_GETROUTESRESPONSE']._serialized_start=91316 - _globals['_GETROUTESRESPONSE']._serialized_end=91398 - _globals['_GETROUTESROUTES']._serialized_start=91401 - _globals['_GETROUTESROUTES']._serialized_end=91557 - _globals['_GETROUTESROUTESPATH']._serialized_start=91560 - _globals['_GETROUTESROUTESPATH']._serialized_end=91712 - _globals['_ASKRENEDISABLENODEREQUEST']._serialized_start=91714 - _globals['_ASKRENEDISABLENODEREQUEST']._serialized_end=91770 - _globals['_ASKRENEDISABLENODERESPONSE']._serialized_start=91772 - _globals['_ASKRENEDISABLENODERESPONSE']._serialized_end=91800 - _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_start=91803 - _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_end=92136 - _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_start=92005 - _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_end=92084 - _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_start=92138 - _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_end=92227 - _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_start=92230 - _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_end=92441 - _globals['_ASKRENECREATECHANNELREQUEST']._serialized_start=92444 - _globals['_ASKRENECREATECHANNELREQUEST']._serialized_end=92587 - _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_start=92589 - _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_end=92619 - _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_start=92622 - _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_end=93051 - _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_start=93053 - _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_end=93083 - _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_start=93086 - _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_end=93250 - _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_start=93252 - _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_end=93327 - _globals['_ASKRENEBIASCHANNELBIASES']._serialized_start=93329 - _globals['_ASKRENEBIASCHANNELBIASES']._serialized_end=93456 - _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_start=93458 - _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_end=93490 - _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_start=93492 - _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_end=93589 - _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_start=93592 - _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_end=93737 - _globals['_INJECTPAYMENTONIONREQUEST']._serialized_start=93740 - _globals['_INJECTPAYMENTONIONREQUEST']._serialized_end=94071 - _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_start=94073 - _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_end=94192 - _globals['_INJECTONIONMESSAGEREQUEST']._serialized_start=94194 - _globals['_INJECTONIONMESSAGEREQUEST']._serialized_end=94256 - _globals['_INJECTONIONMESSAGERESPONSE']._serialized_start=94258 - _globals['_INJECTONIONMESSAGERESPONSE']._serialized_end=94286 - _globals['_XPAYREQUEST']._serialized_start=94289 - _globals['_XPAYREQUEST']._serialized_end=94568 - _globals['_XPAYRESPONSE']._serialized_start=94571 - _globals['_XPAYRESPONSE']._serialized_end=94732 - _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_start=94734 - _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_end=94795 - _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_start=94797 - _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_end=94893 - _globals['_STREAMBLOCKADDEDREQUEST']._serialized_start=94895 - _globals['_STREAMBLOCKADDEDREQUEST']._serialized_end=94920 - _globals['_BLOCKADDEDNOTIFICATION']._serialized_start=94922 - _globals['_BLOCKADDEDNOTIFICATION']._serialized_end=94976 - _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_start=94978 - _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_end=95010 - _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_start=95012 - _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_end=95063 - _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_start=95065 - _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_end=95093 - _globals['_CHANNELOPENEDNOTIFICATION']._serialized_start=95095 - _globals['_CHANNELOPENEDNOTIFICATION']._serialized_end=95214 - _globals['_STREAMCONNECTREQUEST']._serialized_start=95216 - _globals['_STREAMCONNECTREQUEST']._serialized_end=95238 - _globals['_PEERCONNECTNOTIFICATION']._serialized_start=95241 - _globals['_PEERCONNECTNOTIFICATION']._serialized_end=95431 - _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_start=95392 - _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_end=95431 - _globals['_PEERCONNECTADDRESS']._serialized_start=95434 - _globals['_PEERCONNECTADDRESS']._serialized_end=95716 - _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_start=95585 - _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_end=95684 - _globals['_STREAMCUSTOMMSGREQUEST']._serialized_start=95718 - _globals['_STREAMCUSTOMMSGREQUEST']._serialized_end=95742 - _globals['_CUSTOMMSGNOTIFICATION']._serialized_start=95744 - _globals['_CUSTOMMSGNOTIFICATION']._serialized_end=95801 - _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_start=95803 - _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_end=95837 - _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_start=95840 - _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_end=96272 - _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_start=96138 - _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_end=96237 - _globals['_NODE']._serialized_start=96275 - _globals['_NODE']._serialized_end=106620 + _globals['_EXPOSESECRETRESPONSE']._serialized_end=12454 + _globals['_RECOVERREQUEST']._serialized_start=12456 + _globals['_RECOVERREQUEST']._serialized_end=12491 + _globals['_RECOVERRESPONSE']._serialized_start=12494 + _globals['_RECOVERRESPONSE']._serialized_end=12630 + _globals['_RECOVERRESPONSE_RECOVERRESULT']._serialized_start=12570 + _globals['_RECOVERRESPONSE_RECOVERRESULT']._serialized_end=12619 + _globals['_RECOVERCHANNELREQUEST']._serialized_start=12632 + _globals['_RECOVERCHANNELREQUEST']._serialized_end=12668 + _globals['_RECOVERCHANNELRESPONSE']._serialized_start=12670 + _globals['_RECOVERCHANNELRESPONSE']._serialized_end=12709 + _globals['_INVOICEREQUEST']._serialized_start=12712 + _globals['_INVOICEREQUEST']._serialized_end=12993 + _globals['_INVOICERESPONSE']._serialized_start=12996 + _globals['_INVOICERESPONSE']._serialized_end=13401 + _globals['_INVOICEREQUESTREQUEST']._serialized_start=13404 + _globals['_INVOICEREQUESTREQUEST']._serialized_end=13629 + _globals['_INVOICEREQUESTRESPONSE']._serialized_start=13632 + _globals['_INVOICEREQUESTRESPONSE']._serialized_end=13771 + _globals['_DISABLEINVOICEREQUESTREQUEST']._serialized_start=13773 + _globals['_DISABLEINVOICEREQUESTREQUEST']._serialized_end=13822 + _globals['_DISABLEINVOICEREQUESTRESPONSE']._serialized_start=13825 + _globals['_DISABLEINVOICEREQUESTRESPONSE']._serialized_end=13971 + _globals['_LISTINVOICEREQUESTSREQUEST']._serialized_start=13973 + _globals['_LISTINVOICEREQUESTSREQUEST']._serialized_end=14081 + _globals['_LISTINVOICEREQUESTSRESPONSE']._serialized_start=14083 + _globals['_LISTINVOICEREQUESTSRESPONSE']._serialized_end=14178 + _globals['_LISTINVOICEREQUESTSINVOICEREQUESTS']._serialized_start=14181 + _globals['_LISTINVOICEREQUESTSINVOICEREQUESTS']._serialized_end=14332 + _globals['_LISTDATASTOREREQUEST']._serialized_start=14334 + _globals['_LISTDATASTOREREQUEST']._serialized_end=14369 + _globals['_LISTDATASTORERESPONSE']._serialized_start=14371 + _globals['_LISTDATASTORERESPONSE']._serialized_end=14442 + _globals['_LISTDATASTOREDATASTORE']._serialized_start=14445 + _globals['_LISTDATASTOREDATASTORE']._serialized_end=14580 + _globals['_LISTINVOICESREQUEST']._serialized_start=14583 + _globals['_LISTINVOICESREQUEST']._serialized_end=14933 + _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_start=14804 + _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_end=14849 + _globals['_LISTINVOICESRESPONSE']._serialized_start=14935 + _globals['_LISTINVOICESRESPONSE']._serialized_end=15002 + _globals['_LISTINVOICESINVOICES']._serialized_start=15005 + _globals['_LISTINVOICESINVOICES']._serialized_end=15856 + _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_start=15572 + _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_end=15635 + _globals['_LISTINVOICESINVOICESPAIDOUTPOINT']._serialized_start=15858 + _globals['_LISTINVOICESINVOICESPAIDOUTPOINT']._serialized_end=15922 + _globals['_SENDONIONREQUEST']._serialized_start=15925 + _globals['_SENDONIONREQUEST']._serialized_end=16427 + _globals['_SENDONIONRESPONSE']._serialized_start=16430 + _globals['_SENDONIONRESPONSE']._serialized_end=17045 + _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_start=16857 + _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_end=16901 + _globals['_SENDONIONFIRSTHOP']._serialized_start=17047 + _globals['_SENDONIONFIRSTHOP']._serialized_end=17127 + _globals['_LISTSENDPAYSREQUEST']._serialized_start=17130 + _globals['_LISTSENDPAYSREQUEST']._serialized_end=17546 + _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_start=17371 + _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_end=17430 + _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSINDEX']._serialized_start=17432 + _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSINDEX']._serialized_end=17477 + _globals['_LISTSENDPAYSRESPONSE']._serialized_start=17548 + _globals['_LISTSENDPAYSRESPONSE']._serialized_end=17615 + _globals['_LISTSENDPAYSPAYMENTS']._serialized_start=17618 + _globals['_LISTSENDPAYSPAYMENTS']._serialized_end=18382 + _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_start=18135 + _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_end=18202 + _globals['_LISTTRANSACTIONSREQUEST']._serialized_start=18384 + _globals['_LISTTRANSACTIONSREQUEST']._serialized_end=18409 + _globals['_LISTTRANSACTIONSRESPONSE']._serialized_start=18411 + _globals['_LISTTRANSACTIONSRESPONSE']._serialized_end=18494 + _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_start=18497 + _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_end=18745 + _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_start=18747 + _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_end=18830 + _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_start=18832 + _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_end=18940 + _globals['_MAKESECRETREQUEST']._serialized_start=18942 + _globals['_MAKESECRETREQUEST']._serialized_end=19019 + _globals['_MAKESECRETRESPONSE']._serialized_start=19021 + _globals['_MAKESECRETRESPONSE']._serialized_end=19057 + _globals['_PAYREQUEST']._serialized_start=19060 + _globals['_PAYREQUEST']._serialized_end=19591 + _globals['_PAYRESPONSE']._serialized_start=19594 + _globals['_PAYRESPONSE']._serialized_end=19973 + _globals['_PAYRESPONSE_PAYSTATUS']._serialized_start=19876 + _globals['_PAYRESPONSE_PAYSTATUS']._serialized_end=19926 + _globals['_LISTNODESREQUEST']._serialized_start=19975 + _globals['_LISTNODESREQUEST']._serialized_end=20017 + _globals['_LISTNODESRESPONSE']._serialized_start=20019 + _globals['_LISTNODESRESPONSE']._serialized_end=20074 + _globals['_LISTNODESNODES']._serialized_start=20077 + _globals['_LISTNODESNODES']._serialized_end=20389 + _globals['_LISTNODESNODESOPTIONWILLFUND']._serialized_start=20392 + _globals['_LISTNODESNODESOPTIONWILLFUND']._serialized_end=20634 + _globals['_LISTNODESNODESADDRESSES']._serialized_start=20637 + _globals['_LISTNODESNODESADDRESSES']._serialized_end=20869 + _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_start=20777 + _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_end=20857 + _globals['_WAITANYINVOICEREQUEST']._serialized_start=20871 + _globals['_WAITANYINVOICEREQUEST']._serialized_end=20974 + _globals['_WAITANYINVOICERESPONSE']._serialized_start=20977 + _globals['_WAITANYINVOICERESPONSE']._serialized_end=21700 + _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_start=21475 + _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_end=21520 + _globals['_WAITANYINVOICEPAIDOUTPOINT']._serialized_start=21702 + _globals['_WAITANYINVOICEPAIDOUTPOINT']._serialized_end=21760 + _globals['_WAITINVOICEREQUEST']._serialized_start=21762 + _globals['_WAITINVOICEREQUEST']._serialized_end=21797 + _globals['_WAITINVOICERESPONSE']._serialized_start=21800 + _globals['_WAITINVOICERESPONSE']._serialized_end=22508 + _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_start=22286 + _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_end=22328 + _globals['_WAITINVOICEPAIDOUTPOINT']._serialized_start=22510 + _globals['_WAITINVOICEPAIDOUTPOINT']._serialized_end=22565 + _globals['_WAITSENDPAYREQUEST']._serialized_start=22568 + _globals['_WAITSENDPAYREQUEST']._serialized_end=22710 + _globals['_WAITSENDPAYRESPONSE']._serialized_start=22713 + _globals['_WAITSENDPAYRESPONSE']._serialized_end=23367 + _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_start=23173 + _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_end=23206 + _globals['_NEWADDRREQUEST']._serialized_start=23370 + _globals['_NEWADDRREQUEST']._serialized_end=23521 + _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_start=23454 + _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_end=23505 + _globals['_NEWADDRRESPONSE']._serialized_start=23523 + _globals['_NEWADDRRESPONSE']._serialized_end=23600 + _globals['_WITHDRAWREQUEST']._serialized_start=23603 + _globals['_WITHDRAWREQUEST']._serialized_end=23788 + _globals['_WITHDRAWRESPONSE']._serialized_start=23790 + _globals['_WITHDRAWRESPONSE']._serialized_end=23848 + _globals['_KEYSENDREQUEST']._serialized_start=23851 + _globals['_KEYSENDREQUEST']._serialized_end=24282 + _globals['_KEYSENDRESPONSE']._serialized_start=24285 + _globals['_KEYSENDRESPONSE']._serialized_end=24655 + _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_start=24579 + _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_end=24608 + _globals['_FUNDPSBTREQUEST']._serialized_start=24658 + _globals['_FUNDPSBTREQUEST']._serialized_end=25078 + _globals['_FUNDPSBTRESPONSE']._serialized_start=25081 + _globals['_FUNDPSBTRESPONSE']._serialized_end=25298 + _globals['_FUNDPSBTRESERVATIONS']._serialized_start=25300 + _globals['_FUNDPSBTRESERVATIONS']._serialized_end=25417 + _globals['_SENDPSBTREQUEST']._serialized_start=25419 + _globals['_SENDPSBTREQUEST']._serialized_end=25484 + _globals['_SENDPSBTRESPONSE']._serialized_start=25486 + _globals['_SENDPSBTRESPONSE']._serialized_end=25530 + _globals['_SIGNPSBTREQUEST']._serialized_start=25532 + _globals['_SIGNPSBTREQUEST']._serialized_end=25581 + _globals['_SIGNPSBTRESPONSE']._serialized_start=25583 + _globals['_SIGNPSBTRESPONSE']._serialized_end=25622 + _globals['_UTXOPSBTREQUEST']._serialized_start=25625 + _globals['_UTXOPSBTREQUEST']._serialized_end=26041 + _globals['_UTXOPSBTRESPONSE']._serialized_start=26044 + _globals['_UTXOPSBTRESPONSE']._serialized_end=26261 + _globals['_UTXOPSBTRESERVATIONS']._serialized_start=26263 + _globals['_UTXOPSBTRESERVATIONS']._serialized_end=26380 + _globals['_TXDISCARDREQUEST']._serialized_start=26382 + _globals['_TXDISCARDREQUEST']._serialized_end=26414 + _globals['_TXDISCARDRESPONSE']._serialized_start=26416 + _globals['_TXDISCARDRESPONSE']._serialized_end=26470 + _globals['_TXPREPAREREQUEST']._serialized_start=26473 + _globals['_TXPREPAREREQUEST']._serialized_end=26637 + _globals['_TXPREPARERESPONSE']._serialized_start=26639 + _globals['_TXPREPARERESPONSE']._serialized_end=26707 + _globals['_TXSENDREQUEST']._serialized_start=26709 + _globals['_TXSENDREQUEST']._serialized_end=26738 + _globals['_TXSENDRESPONSE']._serialized_start=26740 + _globals['_TXSENDRESPONSE']._serialized_end=26796 + _globals['_LISTPEERCHANNELSREQUEST']._serialized_start=26798 + _globals['_LISTPEERCHANNELSREQUEST']._serialized_end=26899 + _globals['_LISTPEERCHANNELSRESPONSE']._serialized_start=26901 + _globals['_LISTPEERCHANNELSRESPONSE']._serialized_end=26976 + _globals['_LISTPEERCHANNELSCHANNELS']._serialized_start=26979 + _globals['_LISTPEERCHANNELSCHANNELS']._serialized_end=30295 + _globals['_LISTPEERCHANNELSCHANNELSUPDATES']._serialized_start=30298 + _globals['_LISTPEERCHANNELSCHANNELSUPDATES']._serialized_end=30465 + _globals['_LISTPEERCHANNELSCHANNELSUPDATESLOCAL']._serialized_start=30468 + _globals['_LISTPEERCHANNELSCHANNELSUPDATESLOCAL']._serialized_end=30686 + _globals['_LISTPEERCHANNELSCHANNELSUPDATESREMOTE']._serialized_start=30689 + _globals['_LISTPEERCHANNELSCHANNELSUPDATESREMOTE']._serialized_end=30908 + _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_start=30910 + _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_end=30973 + _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_start=30976 + _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_end=31243 + _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_start=31246 + _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_end=31531 + _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_start=31533 + _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_end=31626 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_start=31629 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_end=32006 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_start=31920 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_end=31977 + _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_start=32008 + _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_end=32059 + _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_start=32061 + _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_end=32152 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_start=32155 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_end=33419 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSECAUSE']._serialized_start=33091 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSECAUSE']._serialized_end=33208 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_start=33421 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_end=33522 + _globals['_DECODEPAYREQUEST']._serialized_start=33524 + _globals['_DECODEPAYREQUEST']._serialized_end=33600 + _globals['_DECODEPAYRESPONSE']._serialized_start=33603 + _globals['_DECODEPAYRESPONSE']._serialized_end=34186 + _globals['_DECODEPAYFALLBACKS']._serialized_start=34189 + _globals['_DECODEPAYFALLBACKS']._serialized_end=34397 + _globals['_DECODEPAYFALLBACKS_DECODEPAYFALLBACKSTYPE']._serialized_start=34310 + _globals['_DECODEPAYFALLBACKS_DECODEPAYFALLBACKSTYPE']._serialized_end=34388 + _globals['_DECODEPAYEXTRA']._serialized_start=34399 + _globals['_DECODEPAYEXTRA']._serialized_end=34442 + _globals['_DECODEREQUEST']._serialized_start=34444 + _globals['_DECODEREQUEST']._serialized_end=34475 + _globals['_DECODERESPONSE']._serialized_start=34478 + _globals['_DECODERESPONSE']._serialized_end=39610 + _globals['_DECODERESPONSE_DECODETYPE']._serialized_start=37589 + _globals['_DECODERESPONSE_DECODETYPE']._serialized_end=37720 + _globals['_DECODEOFFERPATHS']._serialized_start=39613 + _globals['_DECODEOFFERPATHS']._serialized_end=39849 + _globals['_DECODEOFFERRECURRENCEPAYWINDOW']._serialized_start=39852 + _globals['_DECODEOFFERRECURRENCEPAYWINDOW']._serialized_end=39989 + _globals['_DECODEINVREQPATHS']._serialized_start=39992 + _globals['_DECODEINVREQPATHS']._serialized_end=40271 + _globals['_DECODEINVREQPATHSPATH']._serialized_start=40273 + _globals['_DECODEINVREQPATHSPATH']._serialized_end=40355 + _globals['_DECODEINVREQBIP353NAME']._serialized_start=40357 + _globals['_DECODEINVREQBIP353NAME']._serialized_end=40441 + _globals['_DECODEINVOICEPATHSPATH']._serialized_start=40443 + _globals['_DECODEINVOICEPATHSPATH']._serialized_end=40526 + _globals['_DECODEINVOICEFALLBACKS']._serialized_start=40528 + _globals['_DECODEINVOICEFALLBACKS']._serialized_end=40616 + _globals['_DECODEFALLBACKS']._serialized_start=40619 + _globals['_DECODEFALLBACKS']._serialized_end=40917 + _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_start=40787 + _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_end=40862 + _globals['_DECODEEXTRA']._serialized_start=40919 + _globals['_DECODEEXTRA']._serialized_end=40959 + _globals['_DECODERESTRICTIONS']._serialized_start=40961 + _globals['_DECODERESTRICTIONS']._serialized_end=41020 + _globals['_DELPAYREQUEST']._serialized_start=41023 + _globals['_DELPAYREQUEST']._serialized_end=41217 + _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_start=41154 + _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_end=41194 + _globals['_DELPAYRESPONSE']._serialized_start=41219 + _globals['_DELPAYRESPONSE']._serialized_end=41274 + _globals['_DELPAYPAYMENTS']._serialized_start=41277 + _globals['_DELPAYPAYMENTS']._serialized_end=41992 + _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_start=41755 + _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_end=41816 + _globals['_DELFORWARDREQUEST']._serialized_start=41995 + _globals['_DELFORWARDREQUEST']._serialized_end=42174 + _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_start=42113 + _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_end=42174 + _globals['_DELFORWARDRESPONSE']._serialized_start=42176 + _globals['_DELFORWARDRESPONSE']._serialized_end=42196 + _globals['_DISABLEOFFERREQUEST']._serialized_start=42198 + _globals['_DISABLEOFFERREQUEST']._serialized_end=42237 + _globals['_DISABLEOFFERRESPONSE']._serialized_start=42240 + _globals['_DISABLEOFFERRESPONSE']._serialized_end=42376 + _globals['_ENABLEOFFERREQUEST']._serialized_start=42378 + _globals['_ENABLEOFFERREQUEST']._serialized_end=42416 + _globals['_ENABLEOFFERRESPONSE']._serialized_start=42419 + _globals['_ENABLEOFFERRESPONSE']._serialized_end=42554 + _globals['_DISCONNECTREQUEST']._serialized_start=42556 + _globals['_DISCONNECTREQUEST']._serialized_end=42617 + _globals['_DISCONNECTRESPONSE']._serialized_start=42619 + _globals['_DISCONNECTRESPONSE']._serialized_end=42639 + _globals['_FEERATESREQUEST']._serialized_start=42641 + _globals['_FEERATESREQUEST']._serialized_end=42748 + _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_start=42711 + _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_end=42748 + _globals['_FEERATESRESPONSE']._serialized_start=42751 + _globals['_FEERATESRESPONSE']._serialized_end=43033 + _globals['_FEERATESPERKB']._serialized_start=43036 + _globals['_FEERATESPERKB']._serialized_end=43503 + _globals['_FEERATESPERKBESTIMATES']._serialized_start=43505 + _globals['_FEERATESPERKBESTIMATES']._serialized_end=43592 + _globals['_FEERATESPERKW']._serialized_start=43595 + _globals['_FEERATESPERKW']._serialized_end=44062 + _globals['_FEERATESPERKWESTIMATES']._serialized_start=44064 + _globals['_FEERATESPERKWESTIMATES']._serialized_end=44151 + _globals['_FEERATESONCHAINFEEESTIMATES']._serialized_start=44154 + _globals['_FEERATESONCHAINFEEESTIMATES']._serialized_end=44435 + _globals['_FETCHBIP353REQUEST']._serialized_start=44437 + _globals['_FETCHBIP353REQUEST']._serialized_end=44474 + _globals['_FETCHBIP353RESPONSE']._serialized_start=44476 + _globals['_FETCHBIP353RESPONSE']._serialized_end=44564 + _globals['_FETCHBIP353INSTRUCTIONS']._serialized_start=44567 + _globals['_FETCHBIP353INSTRUCTIONS']._serialized_end=44814 + _globals['_FETCHINVOICEREQUEST']._serialized_start=44817 + _globals['_FETCHINVOICEREQUEST']._serialized_end=45258 + _globals['_FETCHINVOICERESPONSE']._serialized_start=45261 + _globals['_FETCHINVOICERESPONSE']._serialized_end=45414 + _globals['_FETCHINVOICECHANGES']._serialized_start=45417 + _globals['_FETCHINVOICECHANGES']._serialized_end=45675 + _globals['_FETCHINVOICENEXTPERIOD']._serialized_start=45677 + _globals['_FETCHINVOICENEXTPERIOD']._serialized_end=45802 + _globals['_FUNDCHANNELCANCELREQUEST']._serialized_start=45804 + _globals['_FUNDCHANNELCANCELREQUEST']._serialized_end=45842 + _globals['_FUNDCHANNELCANCELRESPONSE']._serialized_start=45844 + _globals['_FUNDCHANNELCANCELRESPONSE']._serialized_end=45890 + _globals['_FUNDCHANNELCOMPLETEREQUEST']._serialized_start=45892 + _globals['_FUNDCHANNELCOMPLETEREQUEST']._serialized_end=45946 + _globals['_FUNDCHANNELCOMPLETERESPONSE']._serialized_start=45948 + _globals['_FUNDCHANNELCOMPLETERESPONSE']._serialized_end=46026 + _globals['_FUNDCHANNELREQUEST']._serialized_start=46029 + _globals['_FUNDCHANNELREQUEST']._serialized_end=46536 + _globals['_FUNDCHANNELRESPONSE']._serialized_start=46539 + _globals['_FUNDCHANNELRESPONSE']._serialized_end=46767 + _globals['_FUNDCHANNELCHANNELTYPE']._serialized_start=46769 + _globals['_FUNDCHANNELCHANNELTYPE']._serialized_end=46844 + _globals['_FUNDCHANNELSTARTREQUEST']._serialized_start=46847 + _globals['_FUNDCHANNELSTARTREQUEST']._serialized_end=47189 + _globals['_FUNDCHANNELSTARTRESPONSE']._serialized_start=47192 + _globals['_FUNDCHANNELSTARTRESPONSE']._serialized_end=47438 + _globals['_FUNDCHANNELSTARTCHANNELTYPE']._serialized_start=47440 + _globals['_FUNDCHANNELSTARTCHANNELTYPE']._serialized_end=47520 + _globals['_GETLOGREQUEST']._serialized_start=47523 + _globals['_GETLOGREQUEST']._serialized_end=47680 + _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_start=47592 + _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_end=47670 + _globals['_GETLOGRESPONSE']._serialized_start=47682 + _globals['_GETLOGRESPONSE']._serialized_end=47786 + _globals['_GETLOGLOG']._serialized_start=47789 + _globals['_GETLOGLOG']._serialized_end=48149 + _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_start=47976 + _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_end=48084 + _globals['_FUNDERUPDATEREQUEST']._serialized_start=48152 + _globals['_FUNDERUPDATEREQUEST']._serialized_end=49265 + _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_start=48846 + _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_end=48903 + _globals['_FUNDERUPDATERESPONSE']._serialized_start=49268 + _globals['_FUNDERUPDATERESPONSE']._serialized_end=50131 + _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_start=48846 + _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_end=48903 + _globals['_GETROUTEREQUEST']._serialized_start=50134 + _globals['_GETROUTEREQUEST']._serialized_end=50370 + _globals['_GETROUTERESPONSE']._serialized_start=50372 + _globals['_GETROUTERESPONSE']._serialized_end=50425 + _globals['_GETROUTEROUTE']._serialized_start=50428 + _globals['_GETROUTEROUTE']._serialized_end=50625 + _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_start=50596 + _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_end=50625 + _globals['_LISTADDRESSESREQUEST']._serialized_start=50627 + _globals['_LISTADDRESSESREQUEST']._serialized_end=50743 + _globals['_LISTADDRESSESRESPONSE']._serialized_start=50745 + _globals['_LISTADDRESSESRESPONSE']._serialized_end=50816 + _globals['_LISTADDRESSESADDRESSES']._serialized_start=50818 + _globals['_LISTADDRESSESADDRESSES']._serialized_end=50918 + _globals['_LISTFORWARDSREQUEST']._serialized_start=50921 + _globals['_LISTFORWARDSREQUEST']._serialized_end=51360 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_start=51165 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_end=51241 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_start=51243 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_end=51288 + _globals['_LISTFORWARDSRESPONSE']._serialized_start=51362 + _globals['_LISTFORWARDSRESPONSE']._serialized_end=51429 + _globals['_LISTFORWARDSFORWARDS']._serialized_start=51432 + _globals['_LISTFORWARDSFORWARDS']._serialized_end=52252 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_start=51953 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_end=52037 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_start=52039 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_end=52087 + _globals['_LISTOFFERSREQUEST']._serialized_start=52254 + _globals['_LISTOFFERSREQUEST']._serialized_end=52351 + _globals['_LISTOFFERSRESPONSE']._serialized_start=52353 + _globals['_LISTOFFERSRESPONSE']._serialized_end=52412 + _globals['_LISTOFFERSOFFERS']._serialized_start=52415 + _globals['_LISTOFFERSOFFERS']._serialized_end=52547 + _globals['_LISTPAYSREQUEST']._serialized_start=52550 + _globals['_LISTPAYSREQUEST']._serialized_end=52938 + _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_start=52771 + _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_end=52826 + _globals['_LISTPAYSREQUEST_LISTPAYSINDEX']._serialized_start=52828 + _globals['_LISTPAYSREQUEST_LISTPAYSINDEX']._serialized_end=52869 + _globals['_LISTPAYSRESPONSE']._serialized_start=52940 + _globals['_LISTPAYSRESPONSE']._serialized_end=52991 + _globals['_LISTPAYSPAYS']._serialized_start=52994 + _globals['_LISTPAYSPAYS']._serialized_end=53725 + _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_start=53464 + _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_end=53523 + _globals['_LISTHTLCSREQUEST']._serialized_start=53728 + _globals['_LISTHTLCSREQUEST']._serialized_end=53942 + _globals['_LISTHTLCSREQUEST_LISTHTLCSINDEX']._serialized_start=53863 + _globals['_LISTHTLCSREQUEST_LISTHTLCSINDEX']._serialized_end=53905 + _globals['_LISTHTLCSRESPONSE']._serialized_start=53944 + _globals['_LISTHTLCSRESPONSE']._serialized_end=53999 + _globals['_LISTHTLCSHTLCS']._serialized_start=54002 + _globals['_LISTHTLCSHTLCS']._serialized_end=54359 + _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_start=54281 + _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_end=54323 + _globals['_MULTIFUNDCHANNELREQUEST']._serialized_start=54362 + _globals['_MULTIFUNDCHANNELREQUEST']._serialized_end=54668 + _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_start=54671 + _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_end=54822 + _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_start=54825 + _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_end=55208 + _globals['_MULTIFUNDCHANNELCHANNELIDS']._serialized_start=55211 + _globals['_MULTIFUNDCHANNELCHANNELIDS']._serialized_end=55411 + _globals['_MULTIFUNDCHANNELCHANNELIDSCHANNELTYPE']._serialized_start=55413 + _globals['_MULTIFUNDCHANNELCHANNELIDSCHANNELTYPE']._serialized_end=55503 + _globals['_MULTIFUNDCHANNELFAILED']._serialized_start=55506 + _globals['_MULTIFUNDCHANNELFAILED']._serialized_end=55781 + _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_start=55667 + _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_end=55781 + _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_start=55783 + _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_end=55843 + _globals['_MULTIWITHDRAWREQUEST']._serialized_start=55846 + _globals['_MULTIWITHDRAWREQUEST']._serialized_end=56014 + _globals['_MULTIWITHDRAWRESPONSE']._serialized_start=56016 + _globals['_MULTIWITHDRAWRESPONSE']._serialized_end=56065 + _globals['_OFFERREQUEST']._serialized_start=56068 + _globals['_OFFERREQUEST']._serialized_end=56654 + _globals['_OFFERRESPONSE']._serialized_start=56657 + _globals['_OFFERRESPONSE']._serialized_end=56803 + _globals['_OPENCHANNELABORTREQUEST']._serialized_start=56805 + _globals['_OPENCHANNELABORTREQUEST']._serialized_end=56850 + _globals['_OPENCHANNELABORTRESPONSE']._serialized_start=56852 + _globals['_OPENCHANNELABORTRESPONSE']._serialized_end=56940 + _globals['_OPENCHANNELBUMPREQUEST']._serialized_start=56943 + _globals['_OPENCHANNELBUMPREQUEST']._serialized_end=57101 + _globals['_OPENCHANNELBUMPRESPONSE']._serialized_start=57104 + _globals['_OPENCHANNELBUMPRESPONSE']._serialized_end=57363 + _globals['_OPENCHANNELBUMPCHANNELTYPE']._serialized_start=57365 + _globals['_OPENCHANNELBUMPCHANNELTYPE']._serialized_end=57444 + _globals['_OPENCHANNELINITREQUEST']._serialized_start=57447 + _globals['_OPENCHANNELINITREQUEST']._serialized_end=57862 + _globals['_OPENCHANNELINITRESPONSE']._serialized_start=57865 + _globals['_OPENCHANNELINITRESPONSE']._serialized_end=58124 + _globals['_OPENCHANNELINITCHANNELTYPE']._serialized_start=58126 + _globals['_OPENCHANNELINITCHANNELTYPE']._serialized_end=58205 + _globals['_OPENCHANNELSIGNEDREQUEST']._serialized_start=58207 + _globals['_OPENCHANNELSIGNEDREQUEST']._serialized_end=58274 + _globals['_OPENCHANNELSIGNEDRESPONSE']._serialized_start=58276 + _globals['_OPENCHANNELSIGNEDRESPONSE']._serialized_end=58349 + _globals['_OPENCHANNELUPDATEREQUEST']._serialized_start=58351 + _globals['_OPENCHANNELUPDATEREQUEST']._serialized_end=58411 + _globals['_OPENCHANNELUPDATERESPONSE']._serialized_start=58414 + _globals['_OPENCHANNELUPDATERESPONSE']._serialized_end=58713 + _globals['_OPENCHANNELUPDATECHANNELTYPE']._serialized_start=58715 + _globals['_OPENCHANNELUPDATECHANNELTYPE']._serialized_end=58796 + _globals['_PINGREQUEST']._serialized_start=58798 + _globals['_PINGREQUEST']._serialized_end=58887 + _globals['_PINGRESPONSE']._serialized_start=58889 + _globals['_PINGRESPONSE']._serialized_end=58919 + _globals['_PLUGINREQUEST']._serialized_start=58922 + _globals['_PLUGINREQUEST']._serialized_end=59067 + _globals['_PLUGINRESPONSE']._serialized_start=59069 + _globals['_PLUGINRESPONSE']._serialized_end=59194 + _globals['_PLUGINPLUGINS']._serialized_start=59196 + _globals['_PLUGINPLUGINS']._serialized_end=59258 + _globals['_RENEPAYSTATUSREQUEST']._serialized_start=59260 + _globals['_RENEPAYSTATUSREQUEST']._serialized_end=59320 + _globals['_RENEPAYSTATUSRESPONSE']._serialized_start=59322 + _globals['_RENEPAYSTATUSRESPONSE']._serialized_end=59393 + _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_start=59396 + _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_end=59878 + _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_start=59741 + _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_end=59810 + _globals['_RENEPAYREQUEST']._serialized_start=59881 + _globals['_RENEPAYREQUEST']._serialized_end=60227 + _globals['_RENEPAYRESPONSE']._serialized_start=60230 + _globals['_RENEPAYRESPONSE']._serialized_end=60651 + _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_start=60547 + _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_end=60601 + _globals['_RESERVEINPUTSREQUEST']._serialized_start=60653 + _globals['_RESERVEINPUTSREQUEST']._serialized_end=60761 + _globals['_RESERVEINPUTSRESPONSE']._serialized_start=60763 + _globals['_RESERVEINPUTSRESPONSE']._serialized_end=60840 + _globals['_RESERVEINPUTSRESERVATIONS']._serialized_start=60842 + _globals['_RESERVEINPUTSRESERVATIONS']._serialized_end=60964 + _globals['_SENDCUSTOMMSGREQUEST']._serialized_start=60966 + _globals['_SENDCUSTOMMSGREQUEST']._serialized_end=61018 + _globals['_SENDCUSTOMMSGRESPONSE']._serialized_start=61020 + _globals['_SENDCUSTOMMSGRESPONSE']._serialized_end=61059 + _globals['_SENDINVOICEREQUEST']._serialized_start=61062 + _globals['_SENDINVOICEREQUEST']._serialized_end=61238 + _globals['_SENDINVOICERESPONSE']._serialized_start=61241 + _globals['_SENDINVOICERESPONSE']._serialized_end=61832 + _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_start=61643 + _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_end=61697 + _globals['_SETCHANNELREQUEST']._serialized_start=61835 + _globals['_SETCHANNELREQUEST']._serialized_end=62133 + _globals['_SETCHANNELRESPONSE']._serialized_start=62135 + _globals['_SETCHANNELRESPONSE']._serialized_end=62198 + _globals['_SETCHANNELCHANNELS']._serialized_start=62201 + _globals['_SETCHANNELCHANNELS']._serialized_end=62659 + _globals['_SETCONFIGREQUEST']._serialized_start=62661 + _globals['_SETCONFIGREQUEST']._serialized_end=62759 + _globals['_SETCONFIGRESPONSE']._serialized_start=62761 + _globals['_SETCONFIGRESPONSE']._serialized_end=62818 + _globals['_SETCONFIGCONFIG']._serialized_start=62821 + _globals['_SETCONFIGCONFIG']._serialized_end=63114 + _globals['_SETPSBTVERSIONREQUEST']._serialized_start=63116 + _globals['_SETPSBTVERSIONREQUEST']._serialized_end=63170 + _globals['_SETPSBTVERSIONRESPONSE']._serialized_start=63172 + _globals['_SETPSBTVERSIONRESPONSE']._serialized_end=63210 + _globals['_SIGNINVOICEREQUEST']._serialized_start=63212 + _globals['_SIGNINVOICEREQUEST']._serialized_end=63251 + _globals['_SIGNINVOICERESPONSE']._serialized_start=63253 + _globals['_SIGNINVOICERESPONSE']._serialized_end=63290 + _globals['_SIGNMESSAGEREQUEST']._serialized_start=63292 + _globals['_SIGNMESSAGEREQUEST']._serialized_end=63329 + _globals['_SIGNMESSAGERESPONSE']._serialized_start=63331 + _globals['_SIGNMESSAGERESPONSE']._serialized_end=63401 + _globals['_SPLICEINITREQUEST']._serialized_start=63404 + _globals['_SPLICEINITREQUEST']._serialized_end=63604 + _globals['_SPLICEINITRESPONSE']._serialized_start=63606 + _globals['_SPLICEINITRESPONSE']._serialized_end=63640 + _globals['_SPLICESIGNEDREQUEST']._serialized_start=63642 + _globals['_SPLICESIGNEDREQUEST']._serialized_end=63737 + _globals['_SPLICESIGNEDRESPONSE']._serialized_start=63739 + _globals['_SPLICESIGNEDRESPONSE']._serialized_end=63833 + _globals['_SPLICEUPDATEREQUEST']._serialized_start=63835 + _globals['_SPLICEUPDATEREQUEST']._serialized_end=63890 + _globals['_SPLICEUPDATERESPONSE']._serialized_start=63892 + _globals['_SPLICEUPDATERESPONSE']._serialized_end=64013 + _globals['_DEVSPLICEREQUEST']._serialized_start=64016 + _globals['_DEVSPLICEREQUEST']._serialized_end=64214 + _globals['_DEVSPLICERESPONSE']._serialized_start=64217 + _globals['_DEVSPLICERESPONSE']._serialized_end=64345 + _globals['_UNRESERVEINPUTSREQUEST']._serialized_start=64347 + _globals['_UNRESERVEINPUTSREQUEST']._serialized_end=64419 + _globals['_UNRESERVEINPUTSRESPONSE']._serialized_start=64421 + _globals['_UNRESERVEINPUTSRESPONSE']._serialized_end=64502 + _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_start=64505 + _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_end=64656 + _globals['_UPGRADEWALLETREQUEST']._serialized_start=64658 + _globals['_UPGRADEWALLETREQUEST']._serialized_end=64768 + _globals['_UPGRADEWALLETRESPONSE']._serialized_start=64771 + _globals['_UPGRADEWALLETRESPONSE']._serialized_end=64920 + _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_start=64922 + _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_end=65001 + _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_start=65003 + _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_end=65049 + _globals['_WAITREQUEST']._serialized_start=65052 + _globals['_WAITREQUEST']._serialized_end=65346 + _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_start=65188 + _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_end=65290 + _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_start=65292 + _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_end=65346 + _globals['_WAITRESPONSE']._serialized_start=65349 + _globals['_WAITRESPONSE']._serialized_end=66012 + _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_start=65188 + _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_end=65290 + _globals['_WAITFORWARDS']._serialized_start=66015 + _globals['_WAITFORWARDS']._serialized_end=66346 + _globals['_WAITFORWARDS_WAITFORWARDSSTATUS']._serialized_start=66201 + _globals['_WAITFORWARDS_WAITFORWARDSSTATUS']._serialized_end=66277 + _globals['_WAITINVOICES']._serialized_start=66349 + _globals['_WAITINVOICES']._serialized_end=66626 + _globals['_WAITINVOICES_WAITINVOICESSTATUS']._serialized_start=66512 + _globals['_WAITINVOICES_WAITINVOICESSTATUS']._serialized_end=66567 + _globals['_WAITSENDPAYS']._serialized_start=66629 + _globals['_WAITSENDPAYS']._serialized_end=66884 + _globals['_WAITSENDPAYS_WAITSENDPAYSSTATUS']._serialized_start=66774 + _globals['_WAITSENDPAYS_WAITSENDPAYSSTATUS']._serialized_end=66833 + _globals['_WAITHTLCS']._serialized_start=66887 + _globals['_WAITHTLCS']._serialized_end=67823 + _globals['_WAITHTLCS_WAITHTLCSSTATE']._serialized_start=67156 + _globals['_WAITHTLCS_WAITHTLCSSTATE']._serialized_end=67678 + _globals['_WAITHTLCS_WAITHTLCSDIRECTION']._serialized_start=67680 + _globals['_WAITHTLCS_WAITHTLCSDIRECTION']._serialized_end=67717 + _globals['_WAITCHAINMOVES']._serialized_start=67825 + _globals['_WAITCHAINMOVES']._serialized_end=67925 + _globals['_WAITCHANNELMOVES']._serialized_start=67927 + _globals['_WAITCHANNELMOVES']._serialized_end=68029 + _globals['_WAITDETAILS']._serialized_start=68032 + _globals['_WAITDETAILS']._serialized_end=68668 + _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_start=68374 + _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_end=68511 + _globals['_LISTCONFIGSREQUEST']._serialized_start=68670 + _globals['_LISTCONFIGSREQUEST']._serialized_end=68722 + _globals['_LISTCONFIGSRESPONSE']._serialized_start=68724 + _globals['_LISTCONFIGSRESPONSE']._serialized_end=68804 + _globals['_LISTCONFIGSCONFIGS']._serialized_start=68807 + _globals['_LISTCONFIGSCONFIGS']._serialized_end=74800 + _globals['_LISTCONFIGSCONFIGSCONF']._serialized_start=74803 + _globals['_LISTCONFIGSCONFIGSCONF']._serialized_end=74965 + _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_start=74922 + _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_end=74965 + _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_start=74967 + _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_end=75025 + _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_start=75027 + _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_end=75088 + _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_start=75090 + _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_end=75181 + _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_start=75183 + _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_end=75239 + _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_start=75241 + _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_end=75297 + _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_start=75299 + _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_end=75354 + _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_start=75356 + _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_end=75412 + _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_start=75414 + _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_end=75486 + _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_start=75488 + _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_end=75551 + _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_start=75553 + _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_end=75619 + _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_start=75621 + _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_end=75688 + _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_start=75690 + _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_end=75752 + _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_start=75754 + _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_end=75829 + _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_start=75831 + _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_end=75893 + _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_start=75895 + _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_end=75965 + _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_start=75967 + _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_end=76037 + _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_start=76039 + _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_end=76094 + _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_start=76096 + _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_end=76157 + _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_start=76159 + _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_end=76221 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_start=76223 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_end=76292 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_start=76294 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_end=76363 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_start=76365 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_end=76439 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_start=76441 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_end=76508 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_start=76510 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_end=76591 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_start=76593 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_end=76665 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_start=76667 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_end=76735 + _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_start=76737 + _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_end=76808 + _globals['_LISTCONFIGSCONFIGSRGB']._serialized_start=76810 + _globals['_LISTCONFIGSCONFIGSRGB']._serialized_end=76868 + _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_start=76870 + _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_end=76930 + _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_start=76932 + _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_end=76994 + _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_start=76996 + _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_end=77067 + _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_start=77069 + _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_end=77139 + _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_start=77141 + _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_end=77213 + _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_start=77215 + _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_end=77285 + _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_start=77287 + _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_end=77351 + _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_start=77353 + _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_end=77417 + _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_start=77419 + _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_end=77484 + _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_start=77486 + _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_end=77548 + _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_start=77550 + _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_end=77611 + _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_start=77613 + _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_end=77681 + _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_start=77683 + _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_end=77756 + _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_start=77758 + _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_end=77842 + _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_start=77844 + _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_end=77928 + _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_start=77930 + _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_end=78022 + _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_start=78024 + _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_end=78127 + _globals['_LISTCONFIGSCONFIGSADDR']._serialized_start=78129 + _globals['_LISTCONFIGSCONFIGSADDR']._serialized_end=78190 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_start=78192 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_end=78261 + _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_start=78263 + _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_end=78328 + _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_start=78330 + _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_end=78386 + _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_start=78388 + _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_end=78454 + _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_start=78456 + _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_end=78516 + _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_start=78518 + _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_end=78577 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_start=78580 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_end=78836 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_start=78755 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_end=78836 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_start=78838 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_end=78919 + _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_start=78921 + _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_end=78982 + _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_start=78984 + _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_end=79050 + _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_start=79052 + _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_end=79115 + _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_start=79117 + _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_end=79181 + _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_start=79183 + _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_end=79247 + _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_start=79249 + _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_end=79318 + _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_start=79320 + _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_end=79388 + _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_start=79390 + _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_end=79456 + _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_start=79458 + _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_end=79560 + _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_start=79562 + _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_end=79635 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_start=79637 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_end=79708 + _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_start=79710 + _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_end=79788 + _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_start=79790 + _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_end=79854 + _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_start=79856 + _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_end=79930 + _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_start=79932 + _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_end=80009 + _globals['_STOPREQUEST']._serialized_start=80011 + _globals['_STOPREQUEST']._serialized_end=80024 + _globals['_STOPRESPONSE']._serialized_start=80026 + _globals['_STOPRESPONSE']._serialized_end=80139 + _globals['_STOPRESPONSE_STOPRESULT']._serialized_start=80093 + _globals['_STOPRESPONSE_STOPRESULT']._serialized_end=80128 + _globals['_HELPREQUEST']._serialized_start=80141 + _globals['_HELPREQUEST']._serialized_end=80188 + _globals['_HELPRESPONSE']._serialized_start=80191 + _globals['_HELPRESPONSE']._serialized_end=80340 + _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_start=80296 + _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_end=80324 + _globals['_HELPHELP']._serialized_start=80342 + _globals['_HELPHELP']._serialized_end=80369 + _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_start=80371 + _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_end=80474 + _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_start=80476 + _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_end=80503 + _globals['_PREAPPROVEINVOICEREQUEST']._serialized_start=80505 + _globals['_PREAPPROVEINVOICEREQUEST']._serialized_end=80547 + _globals['_PREAPPROVEINVOICERESPONSE']._serialized_start=80549 + _globals['_PREAPPROVEINVOICERESPONSE']._serialized_end=80576 + _globals['_STATICBACKUPREQUEST']._serialized_start=80578 + _globals['_STATICBACKUPREQUEST']._serialized_end=80599 + _globals['_STATICBACKUPRESPONSE']._serialized_start=80601 + _globals['_STATICBACKUPRESPONSE']._serialized_end=80636 + _globals['_BKPRCHANNELSAPYREQUEST']._serialized_start=80638 + _globals['_BKPRCHANNELSAPYREQUEST']._serialized_end=80738 + _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_start=80740 + _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_end=80820 + _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_start=80823 + _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_end=81712 + _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_start=81715 + _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_end=81925 + _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_start=81928 + _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_end=82140 + _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_start=82054 + _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_end=82140 + _globals['_BKPRINSPECTREQUEST']._serialized_start=82142 + _globals['_BKPRINSPECTREQUEST']._serialized_end=82179 + _globals['_BKPRINSPECTRESPONSE']._serialized_start=82181 + _globals['_BKPRINSPECTRESPONSE']._serialized_end=82236 + _globals['_BKPRINSPECTTXS']._serialized_start=82239 + _globals['_BKPRINSPECTTXS']._serialized_end=82393 + _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_start=82396 + _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_end=82840 + _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_start=82842 + _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_end=82946 + _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_start=82948 + _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_end=83029 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_start=83032 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_end=83705 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_start=83508 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_end=83582 + _globals['_BKPRLISTBALANCESREQUEST']._serialized_start=83707 + _globals['_BKPRLISTBALANCESREQUEST']._serialized_end=83732 + _globals['_BKPRLISTBALANCESRESPONSE']._serialized_start=83734 + _globals['_BKPRLISTBALANCESRESPONSE']._serialized_end=83809 + _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_start=83812 + _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_end=84138 + _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_start=84140 + _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_end=84228 + _globals['_BKPRLISTINCOMEREQUEST']._serialized_start=84231 + _globals['_BKPRLISTINCOMEREQUEST']._serialized_end=84382 + _globals['_BKPRLISTINCOMERESPONSE']._serialized_start=84384 + _globals['_BKPRLISTINCOMERESPONSE']._serialized_end=84464 + _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_start=84467 + _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_end=84775 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_start=84777 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_end=84857 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_start=84859 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_end=84960 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_start=84963 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_end=85638 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_start=85464 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_end=85531 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_start=85640 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_end=85717 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_start=85719 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_end=85818 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_start=85821 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_end=86492 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_start=86319 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_end=86385 + _globals['_BLACKLISTRUNEREQUEST']._serialized_start=86494 + _globals['_BLACKLISTRUNEREQUEST']._serialized_end=86604 + _globals['_BLACKLISTRUNERESPONSE']._serialized_start=86606 + _globals['_BLACKLISTRUNERESPONSE']._serialized_end=86677 + _globals['_BLACKLISTRUNEBLACKLIST']._serialized_start=86679 + _globals['_BLACKLISTRUNEBLACKLIST']._serialized_end=86731 + _globals['_CHECKRUNEREQUEST']._serialized_start=86733 + _globals['_CHECKRUNEREQUEST']._serialized_end=86845 + _globals['_CHECKRUNERESPONSE']._serialized_start=86847 + _globals['_CHECKRUNERESPONSE']._serialized_end=86881 + _globals['_CREATERUNEREQUEST']._serialized_start=86883 + _globals['_CREATERUNEREQUEST']._serialized_end=86952 + _globals['_CREATERUNERESPONSE']._serialized_start=86954 + _globals['_CREATERUNERESPONSE']._serialized_end=87077 + _globals['_SHOWRUNESREQUEST']._serialized_start=87079 + _globals['_SHOWRUNESREQUEST']._serialized_end=87125 + _globals['_SHOWRUNESRESPONSE']._serialized_start=87127 + _globals['_SHOWRUNESRESPONSE']._serialized_end=87182 + _globals['_SHOWRUNESRUNES']._serialized_start=87185 + _globals['_SHOWRUNESRUNES']._serialized_end=87470 + _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_start=87472 + _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_end=87584 + _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_start=87586 + _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_end=87696 + _globals['_ASKRENEUNRESERVEREQUEST']._serialized_start=87698 + _globals['_ASKRENEUNRESERVEREQUEST']._serialized_end=87764 + _globals['_ASKRENEUNRESERVERESPONSE']._serialized_start=87766 + _globals['_ASKRENEUNRESERVERESPONSE']._serialized_end=87792 + _globals['_ASKRENEUNRESERVEPATH']._serialized_start=87794 + _globals['_ASKRENEUNRESERVEPATH']._serialized_end=87910 + _globals['_ASKRENELISTLAYERSREQUEST']._serialized_start=87912 + _globals['_ASKRENELISTLAYERSREQUEST']._serialized_end=87968 + _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_start=87970 + _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_end=88043 + _globals['_ASKRENELISTLAYERSLAYERS']._serialized_start=88046 + _globals['_ASKRENELISTLAYERSLAYERS']._serialized_end=88431 + _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_start=88434 + _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_end=88573 + _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_start=88576 + _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_end=89000 + _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_start=89003 + _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_end=89251 + _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_start=89253 + _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_end=89370 + _globals['_ASKRENECREATELAYERREQUEST']._serialized_start=89372 + _globals['_ASKRENECREATELAYERREQUEST']._serialized_end=89454 + _globals['_ASKRENECREATELAYERRESPONSE']._serialized_start=89456 + _globals['_ASKRENECREATELAYERRESPONSE']._serialized_end=89531 + _globals['_ASKRENECREATELAYERLAYERS']._serialized_start=89534 + _globals['_ASKRENECREATELAYERLAYERS']._serialized_end=89904 + _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_start=89907 + _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_end=90047 + _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_start=90050 + _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_end=90387 + _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_start=90390 + _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_end=90586 + _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_start=90588 + _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_end=90706 + _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_start=90708 + _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_end=90750 + _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_start=90752 + _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_end=90780 + _globals['_ASKRENERESERVEREQUEST']._serialized_start=90782 + _globals['_ASKRENERESERVEREQUEST']._serialized_end=90844 + _globals['_ASKRENERESERVERESPONSE']._serialized_start=90846 + _globals['_ASKRENERESERVERESPONSE']._serialized_end=90870 + _globals['_ASKRENERESERVEPATH']._serialized_start=90872 + _globals['_ASKRENERESERVEPATH']._serialized_end=90986 + _globals['_ASKRENEAGEREQUEST']._serialized_start=90988 + _globals['_ASKRENEAGEREQUEST']._serialized_end=91038 + _globals['_ASKRENEAGERESPONSE']._serialized_start=91040 + _globals['_ASKRENEAGERESPONSE']._serialized_end=91096 + _globals['_GETROUTESREQUEST']._serialized_start=91099 + _globals['_GETROUTESREQUEST']._serialized_end=91350 + _globals['_GETROUTESRESPONSE']._serialized_start=91352 + _globals['_GETROUTESRESPONSE']._serialized_end=91434 + _globals['_GETROUTESROUTES']._serialized_start=91437 + _globals['_GETROUTESROUTES']._serialized_end=91593 + _globals['_GETROUTESROUTESPATH']._serialized_start=91596 + _globals['_GETROUTESROUTESPATH']._serialized_end=91748 + _globals['_ASKRENEDISABLENODEREQUEST']._serialized_start=91750 + _globals['_ASKRENEDISABLENODEREQUEST']._serialized_end=91806 + _globals['_ASKRENEDISABLENODERESPONSE']._serialized_start=91808 + _globals['_ASKRENEDISABLENODERESPONSE']._serialized_end=91836 + _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_start=91839 + _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_end=92172 + _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_start=92041 + _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_end=92120 + _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_start=92174 + _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_end=92263 + _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_start=92266 + _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_end=92477 + _globals['_ASKRENECREATECHANNELREQUEST']._serialized_start=92480 + _globals['_ASKRENECREATECHANNELREQUEST']._serialized_end=92623 + _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_start=92625 + _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_end=92655 + _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_start=92658 + _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_end=93087 + _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_start=93089 + _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_end=93119 + _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_start=93122 + _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_end=93286 + _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_start=93288 + _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_end=93363 + _globals['_ASKRENEBIASCHANNELBIASES']._serialized_start=93365 + _globals['_ASKRENEBIASCHANNELBIASES']._serialized_end=93492 + _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_start=93494 + _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_end=93526 + _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_start=93528 + _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_end=93625 + _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_start=93628 + _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_end=93773 + _globals['_INJECTPAYMENTONIONREQUEST']._serialized_start=93776 + _globals['_INJECTPAYMENTONIONREQUEST']._serialized_end=94107 + _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_start=94109 + _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_end=94228 + _globals['_INJECTONIONMESSAGEREQUEST']._serialized_start=94230 + _globals['_INJECTONIONMESSAGEREQUEST']._serialized_end=94292 + _globals['_INJECTONIONMESSAGERESPONSE']._serialized_start=94294 + _globals['_INJECTONIONMESSAGERESPONSE']._serialized_end=94322 + _globals['_XPAYREQUEST']._serialized_start=94325 + _globals['_XPAYREQUEST']._serialized_end=94604 + _globals['_XPAYRESPONSE']._serialized_start=94607 + _globals['_XPAYRESPONSE']._serialized_end=94768 + _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_start=94770 + _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_end=94831 + _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_start=94833 + _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_end=94929 + _globals['_STREAMBLOCKADDEDREQUEST']._serialized_start=94931 + _globals['_STREAMBLOCKADDEDREQUEST']._serialized_end=94956 + _globals['_BLOCKADDEDNOTIFICATION']._serialized_start=94958 + _globals['_BLOCKADDEDNOTIFICATION']._serialized_end=95012 + _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_start=95014 + _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_end=95046 + _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_start=95048 + _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_end=95099 + _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_start=95101 + _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_end=95129 + _globals['_CHANNELOPENEDNOTIFICATION']._serialized_start=95131 + _globals['_CHANNELOPENEDNOTIFICATION']._serialized_end=95250 + _globals['_STREAMCONNECTREQUEST']._serialized_start=95252 + _globals['_STREAMCONNECTREQUEST']._serialized_end=95274 + _globals['_PEERCONNECTNOTIFICATION']._serialized_start=95277 + _globals['_PEERCONNECTNOTIFICATION']._serialized_end=95467 + _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_start=95428 + _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_end=95467 + _globals['_PEERCONNECTADDRESS']._serialized_start=95470 + _globals['_PEERCONNECTADDRESS']._serialized_end=95752 + _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_start=95621 + _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_end=95720 + _globals['_STREAMCUSTOMMSGREQUEST']._serialized_start=95754 + _globals['_STREAMCUSTOMMSGREQUEST']._serialized_end=95778 + _globals['_CUSTOMMSGNOTIFICATION']._serialized_start=95780 + _globals['_CUSTOMMSGNOTIFICATION']._serialized_end=95837 + _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_start=95839 + _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_end=95873 + _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_start=95876 + _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_end=96308 + _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_start=96174 + _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_end=96273 + _globals['_NODE']._serialized_start=96311 + _globals['_NODE']._serialized_end=106656 # @@protoc_insertion_point(module_scope) diff --git a/contrib/pyln-testing/pyln/testing/grpc2py.py b/contrib/pyln-testing/pyln/testing/grpc2py.py index 041d4f3c0465..1e9fe3b6c5a9 100644 --- a/contrib/pyln-testing/pyln/testing/grpc2py.py +++ b/contrib/pyln-testing/pyln/testing/grpc2py.py @@ -451,6 +451,7 @@ def exposesecret2py(m): return remove_default({ "codex32": m.codex32, # PrimitiveField in generate_composite "identifier": m.identifier, # PrimitiveField in generate_composite + "mnemonic": m.mnemonic, # PrimitiveField in generate_composite }) diff --git a/devtools/checkchannels.c b/devtools/checkchannels.c index 144646f3a9ed..1ca9babcf2c4 100644 --- a/devtools/checkchannels.c +++ b/devtools/checkchannels.c @@ -144,7 +144,7 @@ int main(int argc, char *argv[]) errx(1, "failed to open database %s: %s", dbfile, sqlite3_errstr(dberr)); - hsm_secret = grab_file(hsmfile, hsmfile); + hsm_secret = grab_file_raw(hsmfile, hsmfile); if (!hsm_secret) err(1, "failed to read %s", hsmfile); diff --git a/devtools/decodemsg.c b/devtools/decodemsg.c index 390a40930861..9a31f3a6fd8e 100644 --- a/devtools/decodemsg.c +++ b/devtools/decodemsg.c @@ -83,7 +83,7 @@ int main(int argc, char *argv[]) ok &= printwire(m); } } else { - u8 *f = grab_fd(NULL, STDIN_FILENO); + u8 *f = grab_fd_str(NULL, STDIN_FILENO); size_t off = 0; while (off != tal_count(f)) { diff --git a/devtools/onion.c b/devtools/onion.c index 461494af0e8b..9627b2da3a2c 100644 --- a/devtools/onion.c +++ b/devtools/onion.c @@ -141,7 +141,7 @@ static void do_decode(int argc, char **argv, const u8 *assocdata) opt_usage_exit_fail("Expect an filename and privkey with 'decode' method"); /* "-" means stdin, which is NULL for grab_file */ - char *hextemp = grab_file(ctx, streq(argv[2], "-") ? NULL : argv[2]); + char *hextemp = grab_file_str(ctx, streq(argv[2], "-") ? NULL : argv[2]); size_t hexlen = strlen(hextemp); // trim trailing whitespace @@ -193,7 +193,7 @@ static char *opt_set_node_id(const char *arg, struct node_id *node_id) static void runtest(const char *filename) { const tal_t *ctx = tal(NULL, u8); - char *buffer = grab_file(ctx, filename); + char *buffer = grab_file_str(ctx, filename); const jsmntok_t *toks, *session_key_tok, *associated_data_tok, *gentok, *hopstok, *hop, *payloadtok, *pubkeytok, *typetok, *oniontok, *decodetok; const u8 *associated_data, *session_key_raw, *payload, *serialized, *onion; diff --git a/doc/developers-guide/deprecated-features.md b/doc/developers-guide/deprecated-features.md index 81455d2a02f0..086738795821 100644 --- a/doc/developers-guide/deprecated-features.md +++ b/doc/developers-guide/deprecated-features.md @@ -21,6 +21,7 @@ hidden: false | channel_state_changed.null_scid | Notification Field | v25.09 | v26.09 | In channel_state_changed notification, `short_channel_id` will be missing instead of `null` | | notification.payload | Notification Field | v25.09 | v26.09 | Notifications from plugins used to have fields in `payload` sub-object, now they are not (just like normal notifications) | | pay_notifications.raw_fields | Field | v25.09 | v26.09 | `channel_hint_update`, `pay_failure` and `pay_success` notifications now wrap members in an object of the same name | +| encrypted_hsm | Config | v25.12 | v26.12 | `hsm-passphrase` is a name which also makes sense for modern hsm_secrets which use BIP 39 | Inevitably there are features which need to change: either to be generalized, or removed when they can no longer be supported. diff --git a/doc/lightningd-config.5.md b/doc/lightningd-config.5.md index cc5fa08ba5a0..631dd35f48a1 100644 --- a/doc/lightningd-config.5.md +++ b/doc/lightningd-config.5.md @@ -293,14 +293,29 @@ authenticate with username `user` and password `pass`, and then use the database `db_name`. The database must exist, but the schema will be managed automatically by `lightningd`. -* **encrypted-hsm** - - If set, you will be prompted to enter a password used to encrypt the `hsm_secret`. -Note that once you encrypt the `hsm_secret` this option will be mandatory for -`lightningd` to start. -If there is no `hsm_secret` yet, `lightningd` will create a new encrypted secret. -If you have an unencrypted `hsm_secret` you want to encrypt on-disk, or vice versa, -see lightning-hsmtool(8). +* **hsm-passphrase** + + If set, you will be prompted to enter a passphrase for your HSM secret. + This option supports both legacy 32-byte `hsm_secret` files (where the passphrase + encrypts the secret) and new BIP39 mnemonic-based secrets (where the passphrase + is used as additional entropy during seed derivation according to the BIP39 standard). + + Note that once you set a passphrase, this option will be mandatory for + `lightningd` to start. If there is no HSM secret yet, `lightningd` will create + a new mnemonic-based secret that will be secured with your passphrase following + BIP39 specifications. + + For legacy users: If you have an existing encrypted `hsm_secret` that was created + with the deprecated `encrypted-hsm` option, this will continue to work seamlessly. + + For new mnemonic-based secrets: The passphrase becomes part of the seed derivation + process as specified in BIP39, providing an additional factor of security. The + mnemonic words alone are not sufficient to derive the seed without the passphrase. + + If you have an unencrypted legacy `hsm_secret` you want to encrypt, or need to + manage your HSM secrets, see lightning-hsmtool(8). + + (Note: This option replaces the deprecated `encrypted-hsm` option.) * **grpc-host**=*HOST* [plugin `cln-grpc`] diff --git a/doc/schemas/exposesecret.json b/doc/schemas/exposesecret.json index fa69a1586036..6d29f3b6c736 100644 --- a/doc/schemas/exposesecret.json +++ b/doc/schemas/exposesecret.json @@ -43,6 +43,13 @@ "description": [ "The full codex32-encoded (i.e. BIP-93 encoded) HSM secret." ] + }, + "mnemonic": { + "type": "string", + "added": "v25.12", + "description": [ + "The BIP39 mnemonic phrase for the HSM secret (only present for mnemonic-based secrets)." + ] } } }, @@ -82,6 +89,20 @@ "identifier": "cln2", "codex32": "cl10cln2sd35kw6r5de5kueedxyesqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqn9lcvcu7cez4s" } + }, + { + "request": { + "id": "example:exposesecret#3", + "method": "exposesecret", + "params": { + "passphrase": "test_exposesecret" + } + }, + "response": { + "identifier": "peev", + "codex32": "cl10peevst6cqh0wu7p5ssjyf4z4ez42ks9jlt3zneju9uuypr2hddak6tlqsjhsks4laxts8q", + "mnemonic": "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" + } } ] } diff --git a/hsmd/hsmd.c b/hsmd/hsmd.c index 56f22836e771..708fa84b388b 100644 --- a/hsmd/hsmd.c +++ b/hsmd/hsmd.c @@ -12,9 +12,10 @@ #include #include #include +#include #include #include -#include +#include #include #include #include @@ -25,7 +26,11 @@ /*~ _wiregen files are autogenerated by tools/generate-wire.py */ #include #include +#include #include +#include +#include +#include #include /*~ Each subdaemon is started with stdin connected to lightningd (for status @@ -35,7 +40,7 @@ #define REQ_FD 3 /* Temporary storage for the secret until we pass it to `hsmd_init` */ -struct secret hsm_secret; +struct hsm_secret *hsm_secret; /*~ We keep track of clients, but there's not much to keep. */ struct client { @@ -270,33 +275,87 @@ static struct io_plan *req_reply(struct io_conn *conn, return io_write_wire(conn, msg_out, client_read_next, c); } -/*~ This encrypts the content of the `struct secret hsm_secret` and - * stores it in hsm_secret, this is called instead of create_hsm() if - * `lightningd` is started with --encrypted-hsm. - */ -static void create_encrypted_hsm(int fd, const struct secret *encryption_key) +/* Send an init reply failure message to lightningd and then call status_failed */ +static void hsmd_send_init_reply_failure(enum hsm_secret_error error_code, enum status_failreason reason, const char *error_msg, ...) { - struct encrypted_hsm_secret cipher; + u8 *msg; + va_list ap; + char *formatted_msg; - if (!encrypt_hsm_secret(encryption_key, &hsm_secret, - &cipher)) - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "Encrypting hsm_secret"); - if (!write_all(fd, cipher.data, ENCRYPTED_HSM_SECRET_LEN)) { - unlink_noerr("hsm_secret"); - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "Writing encrypted hsm_secret: %s", strerror(errno)); + va_start(ap, error_msg); + formatted_msg = tal_vfmt(tmpctx, error_msg, ap); + va_end(ap); + + /* Send the init reply failure first */ + msg = towire_hsmd_init_reply_failure(NULL, error_code, formatted_msg); + if (msg) { + /* Send directly to lightningd via REQ_FD */ + write_all(REQ_FD, msg, tal_bytelen(msg)); + tal_free(msg); } + + /* Then call status_failed with the error message */ + status_failed(reason, "%s", formatted_msg); } -static void create_hsm(int fd) +static void create_hsm(int fd, const char *passphrase) { - /*~ ccan/read_write_all has a more convenient return than write() where - * we'd have to check the return value == the length we gave: write() - * can return short on normal files if we run out of disk space. */ - if (!write_all(fd, &hsm_secret, sizeof(hsm_secret))) { - /* ccan/noerr contains useful routines like this, which don't - * clobber errno, so we can use it in our error report. */ + u8 *hsm_secret_data; + int ret; + /* Always create a mnemonic-based hsm_secret */ + u8 entropy[BIP39_ENTROPY_LEN_128]; + char *mnemonic = NULL; + struct sha256 seed_hash; + + /* Initialize wally tal context for libwally operations */ + + /* Generate random entropy for new mnemonic */ + randombytes_buf(entropy, sizeof(entropy)); + + /* Generate mnemonic from entropy */ + tal_wally_start(); + ret = bip39_mnemonic_from_bytes(NULL, entropy, sizeof(entropy), &mnemonic); + tal_wally_end(tmpctx); + + if (ret != WALLY_OK) { + unlink_noerr("hsm_secret"); + hsmd_send_init_reply_failure(HSM_SECRET_ERR_SEED_DERIVATION_FAILED, STATUS_FAIL_INTERNAL_ERROR, + "Failed to generate mnemonic from entropy"); + } + + if (!mnemonic) { + unlink_noerr("hsm_secret"); + hsmd_send_init_reply_failure(HSM_SECRET_ERR_SEED_DERIVATION_FAILED, STATUS_FAIL_INTERNAL_ERROR, + "Failed to get generated mnemonic"); + } + + /* Derive seed hash from mnemonic + passphrase (or zero if no passphrase) */ + if (!derive_seed_hash(mnemonic, passphrase, &seed_hash)) { + unlink_noerr("hsm_secret"); + hsmd_send_init_reply_failure(HSM_SECRET_ERR_SEED_DERIVATION_FAILED, STATUS_FAIL_INTERNAL_ERROR, + "Failed to derive seed hash from mnemonic"); + } + + /* Create hsm_secret format: seed_hash (32 bytes) + mnemonic */ + hsm_secret_data = tal_arr(tmpctx, u8, 0); + towire_sha256(&hsm_secret_data, &seed_hash); + towire(&hsm_secret_data, mnemonic, strlen(mnemonic)); + + /* Derive the actual secret from mnemonic + passphrase for our global hsm_secret */ + u8 bip32_seed[BIP39_SEED_LEN_512]; + size_t bip32_seed_len; + + tal_wally_start(); + ret = bip39_mnemonic_to_seed(mnemonic, passphrase, bip32_seed, sizeof(bip32_seed), &bip32_seed_len); + tal_wally_end(tmpctx); + if (ret != WALLY_OK) { + unlink_noerr("hsm_secret"); + hsmd_send_init_reply_failure(HSM_SECRET_ERR_SEED_DERIVATION_FAILED, STATUS_FAIL_INTERNAL_ERROR, + "Failed to derive seed from mnemonic"); + } + + /* Write the hsm_secret data to file */ + if (!write_all(fd, hsm_secret_data, tal_count(hsm_secret_data))) { unlink_noerr("hsm_secret"); status_failed(STATUS_FAIL_INTERNAL_ERROR, "writing: %s", strerror(errno)); @@ -304,9 +363,12 @@ static void create_hsm(int fd) } /*~ We store our root secret in a "hsm_secret" file (like all of Core Lightning, - * we run in the user's .lightning directory). */ -static void maybe_create_new_hsm(const struct secret *encryption_key, - bool random_hsm) + * we run in the user's .lightning directory). + * + * NOTE: This function no longer creates encrypted 32-byte secrets. New hsm_secret + * files will use mnemonic format with passphrases. + */ +static void maybe_create_new_hsm(const char *passphrase) { /*~ Note that this is opened for write-only, even though the permissions * are set to read-only. That's perfectly valid! */ @@ -319,17 +381,10 @@ static void maybe_create_new_hsm(const struct secret *encryption_key, "creating: %s", strerror(errno)); } - /*~ This is libsodium's cryptographic randomness routine: we assume - * it's doing a good job. */ - if (random_hsm) - randombytes_buf(&hsm_secret, sizeof(hsm_secret)); - /*~ If an encryption_key was provided, store an encrypted seed. */ - if (encryption_key) - create_encrypted_hsm(fd, encryption_key); - /*~ Otherwise store the seed in clear.. */ - else - create_hsm(fd); + /*~ Store the seed in clear. New hsm_secret files will use mnemonic format + * with passphrases, not encrypted 32-byte secrets. */ + create_hsm(fd, passphrase); /*~ fsync (mostly!) ensures that the file has reached the disk. */ if (fsync(fd) != 0) { unlink_noerr("hsm_secret"); @@ -367,62 +422,36 @@ static void maybe_create_new_hsm(const struct secret *encryption_key, /*~ We always load the HSM file, even if we just created it above. This * both unifies the code paths, and provides a nice sanity check that the * file contents are as they will be for future invocations. */ -static void load_hsm(const struct secret *encryption_key) +static void load_hsm(const char *passphrase) { - struct stat st; - int fd = open("hsm_secret", O_RDONLY); - if (fd < 0) - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "opening: %s", strerror(errno)); - if (stat("hsm_secret", &st) != 0) - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "stating: %s", strerror(errno)); + u8 *hsm_secret_contents; + struct hsm_secret *hsms; + enum hsm_secret_error err; + + /* Read the hsm_secret file */ + hsm_secret_contents = grab_file_raw(tmpctx, "hsm_secret"); + if (!hsm_secret_contents) { + hsmd_send_init_reply_failure(HSM_SECRET_ERR_INVALID_FORMAT, STATUS_FAIL_INTERNAL_ERROR, + "Could not read hsm_secret: %s", strerror(errno)); + } - /* If the seed is stored in clear. */ - if (st.st_size == 32) { - if (!read_all(fd, &hsm_secret, sizeof(hsm_secret))) - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "reading: %s", strerror(errno)); - /* If an encryption key was passed with a not yet encrypted hsm_secret, - * remove the old one and create an encrypted one. */ - if (encryption_key) { - if (close(fd) != 0) - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "closing: %s", strerror(errno)); - if (remove("hsm_secret") != 0) - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "removing clear hsm_secret: %s", strerror(errno)); - maybe_create_new_hsm(encryption_key, false); - fd = open("hsm_secret", O_RDONLY); - if (fd < 0) - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "opening: %s", strerror(errno)); - } + /* Extract the secret using the new hsm_secret module */ + hsms = extract_hsm_secret(tmpctx, hsm_secret_contents, + tal_bytelen(hsm_secret_contents), + passphrase, &err); + if (!hsms) { + hsmd_send_init_reply_failure(err, STATUS_FAIL_INTERNAL_ERROR, + "Failed to load hsm_secret: %s", hsm_secret_error_str(err)); } - /* If an encryption key was passed and the `hsm_secret` is stored - * encrypted, recover the seed from the cipher. */ - else if (st.st_size == ENCRYPTED_HSM_SECRET_LEN) { - struct encrypted_hsm_secret encrypted_secret; - /* hsm_control must have checked it! */ - assert(encryption_key); + /* Allocate and populate our global hsm_secret */ + hsm_secret = tal(NULL, struct hsm_secret); + hsm_secret->secret_data = tal_steal(hsm_secret, hsms->secret_data); + hsm_secret->type = hsms->type; + hsm_secret->mnemonic = tal_steal(hsm_secret, hsms->mnemonic); - if (!read_all(fd, encrypted_secret.data, ENCRYPTED_HSM_SECRET_LEN)) - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "Reading encrypted hsm_secret: %s", strerror(errno)); - if (!decrypt_hsm_secret(encryption_key, &encrypted_secret, - &hsm_secret)) { - /* Exit but don't throw a backtrace when the user made a mistake in typing - * its password. Instead exit and `lightningd` will be able to give - * an error message. */ - exit(1); - } - } - else - status_failed(STATUS_FAIL_INTERNAL_ERROR, "Invalid hsm_secret, " - "no plaintext nor encrypted" - " seed."); - close(fd); + /*~ Don't swap this secret data to disk for security. */ + mlock_tal_memory(hsm_secret->secret_data); } /*~ We have a pre-init call in developer mode, to set dev flags */ @@ -460,7 +489,9 @@ static struct io_plan *init_hsm(struct io_conn *conn, struct secret *hsm_encryption_key; struct bip32_key_version bip32_key_version; u32 minversion, maxversion; + struct tlv_hsmd_init_tlvs *tlvs; const u32 our_minversion = 4, our_maxversion = 6; + const char *hsm_passphrase; /* This must be lightningd. */ assert(is_lightningd(c)); @@ -475,7 +506,7 @@ static struct io_plan *init_hsm(struct io_conn *conn, &dev_force_bip32_seed, &dev_force_channel_secrets, &dev_force_channel_secrets_shaseed, - &minversion, &maxversion)) + &minversion, &maxversion, &tlvs)) return bad_req(conn, c, msg_in); /*~ Usually we don't worry about API breakage between internal daemons, @@ -487,14 +518,18 @@ static struct io_plan *init_hsm(struct io_conn *conn, minversion, maxversion, our_minversion, our_maxversion); - /*~ The memory is actually copied in towire(), so lock the `hsm_secret` - * encryption key (new) memory again here. */ - if (hsm_encryption_key && sodium_mlock(hsm_encryption_key, - sizeof(hsm_encryption_key)) != 0) - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "Could not lock memory for hsm_secret encryption key."); - /*~ Don't swap this. */ - sodium_mlock(hsm_secret.data, sizeof(hsm_secret.data)); + /*~ We used to have lightningd hand us the encryption key derived from + * the passphrase which was used to encrypt the `hsm_secret` file. Then + * Rusty gave me the thankless task of introducing BIP-39 mnemonics. I + * think this is some kind of obscure CLN hazing ritual? Anyway, the + * passphrase needs to be *appended* to the mnemonic, so the HSM needs + * the raw passphrase. To avoid a compatibility break, I put it inside + * the TLV, and left the old "hsm_encryption_key" field in place (and lightningd + * never sets that anymore), and we use the TLV instead. */ + if (tlvs->hsm_passphrase) + hsm_passphrase = tlvs->hsm_passphrase; + else + hsm_passphrase = NULL; if (!developer) { assert(!dev_force_privkey); @@ -506,17 +541,18 @@ static struct io_plan *init_hsm(struct io_conn *conn, /* Once we have read the init message we know which params the master * will use */ c->chainparams = chainparams; - maybe_create_new_hsm(hsm_encryption_key, true); - load_hsm(hsm_encryption_key); - - /*~ We don't need the hsm_secret encryption key anymore. */ - if (hsm_encryption_key) - discard_key(take(hsm_encryption_key)); + maybe_create_new_hsm(hsm_passphrase); + load_hsm(hsm_passphrase); /* Define the minimum common max version for the hsmd one */ hsmd_mutual_version = maxversion < our_maxversion ? maxversion : our_maxversion; - return req_reply(conn, c, hsmd_init(hsm_secret, hsmd_mutual_version, - bip32_key_version)); + + /* This was tallocated off NULL, and memleak complains if we don't free it */ + tal_free(tlvs); + return req_reply(conn, c, hsmd_init(hsm_secret->secret_data, + tal_bytelen(hsm_secret->secret_data), + hsmd_mutual_version, + bip32_key_version, hsm_secret->type)); } /*~ Since we process requests then service them in strict order, and because @@ -596,6 +632,7 @@ static struct io_plan *handle_memleak(struct io_conn *conn, memleak_scan_region(memtable, dbid_zero_clients, sizeof(dbid_zero_clients)); memleak_scan_uintmap(memtable, &clients); memleak_scan_obj(memtable, status_conn); + memleak_scan_obj(memtable, hsm_secret); memleak_ptr(memtable, dev_force_privkey); memleak_ptr(memtable, dev_force_bip32_seed); @@ -643,6 +680,40 @@ void hsmd_status_failed(enum status_failreason reason, const char *fmt, ...) status_send_fatal(take(towire_status_fail(NULL, reason, str))); } +/* Handle BIP86 pubkey check request */ +static struct io_plan *handle_check_bip86_pubkey(struct io_conn *conn, + struct client *c, + const u8 *msg_in) +{ + u32 index; + struct pubkey their_pubkey, our_pubkey; + struct privkey our_privkey; + u8 *reply; + + if (!fromwire_hsmd_check_bip86_pubkey(msg_in, &index, &their_pubkey)) + return bad_req(conn, c, msg_in); + + /* Check if we have a mnemonic-based HSM secret */ + if (!use_bip86_derivation(tal_bytelen(hsm_secret->secret_data))) { + return bad_req_fmt(conn, c, msg_in, + "BIP86 derivation requires mnemonic-based HSM secret"); + } + + /* We abort if lightningd asks for a stupid index. */ + bip86_key(&our_privkey, &our_pubkey, index); + if (!pubkey_eq(&our_pubkey, &their_pubkey)) { + status_failed(STATUS_FAIL_INTERNAL_ERROR, + "BIP86 derivation index %u differed:" + " they got %s, we got %s", + index, + fmt_pubkey(tmpctx, &their_pubkey), + fmt_pubkey(tmpctx, &our_pubkey)); + } + + reply = towire_hsmd_check_bip86_pubkey_reply(NULL, true); + return req_reply(conn, c, take(reply)); +} + /*~ This is the core of the HSM daemon: handling requests. */ static struct io_plan *handle_client(struct io_conn *conn, struct client *c) { @@ -669,10 +740,14 @@ static struct io_plan *handle_client(struct io_conn *conn, struct client *c) case WIRE_HSMD_CLIENT_HSMFD: return pass_client_hsmfd(conn, c, c->msg_in); + case WIRE_HSMD_CHECK_BIP86_PUBKEY: + return handle_check_bip86_pubkey(conn, c, c->msg_in); + case WIRE_HSMD_DEV_MEMLEAK: - if (developer) - return handle_memleak(conn, c, c->msg_in); - /* fall thru */ + if (!developer) + break; + return handle_memleak(conn, c, c->msg_in); + case WIRE_HSMD_NEW_CHANNEL: case WIRE_HSMD_SETUP_CHANNEL: case WIRE_HSMD_CHECK_OUTPOINT: @@ -736,6 +811,7 @@ static struct io_plan *handle_client(struct io_conn *conn, struct client *c) case WIRE_HSMD_SIGN_WITHDRAWAL_REPLY: case WIRE_HSMD_SIGN_INVOICE_REPLY: case WIRE_HSMD_INIT_REPLY_V4: + case WIRE_HSMD_INIT_REPLY_FAILURE: case WIRE_HSMD_DERIVE_SECRET_REPLY: case WIRE_HSMSTATUS_CLIENT_BAD_REQUEST: case WIRE_HSMD_SIGN_COMMITMENT_TX_REPLY: @@ -758,6 +834,7 @@ static struct io_plan *handle_client(struct io_conn *conn, struct client *c) case WIRE_HSMD_PREAPPROVE_INVOICE_CHECK_REPLY: case WIRE_HSMD_PREAPPROVE_KEYSEND_CHECK_REPLY: case WIRE_HSMD_CHECK_PUBKEY_REPLY: + case WIRE_HSMD_CHECK_BIP86_PUBKEY_REPLY: case WIRE_HSMD_SIGN_ANCHORSPEND_REPLY: case WIRE_HSMD_SIGN_HTLC_TX_MINGLE_REPLY: case WIRE_HSMD_SIGN_ANY_CANNOUNCEMENT_REPLY: diff --git a/hsmd/hsmd_wire.csv b/hsmd/hsmd_wire.csv index 4f4a40d1e3fd..7336feef4900 100644 --- a/hsmd/hsmd_wire.csv +++ b/hsmd/hsmd_wire.csv @@ -29,8 +29,12 @@ msgdata,hsmd_init,dev_force_channel_secrets,?secrets, msgdata,hsmd_init,dev_force_channel_secrets_shaseed,?sha256, msgdata,hsmd_init,hsm_wire_min_version,u32, msgdata,hsmd_init,hsm_wire_max_version,u32, +msgdata,hsmd_init,tlvs,hsmd_init_tlvs, +tlvtype,hsmd_init_tlvs,hsm_passphrase,1 +tlvdata,hsmd_init_tlvs,hsm_passphrase,passphrase,wirestring, #include +#include # Sorry: I should have put version in v2 :( msgtype,hsmd_init_reply_v4,114 # This gets upgraded when the wire protocol changes in incompatible @@ -43,6 +47,17 @@ msgdata,hsmd_init_reply_v4,hsm_capabilities,u32,num_hsm_capabilities msgdata,hsmd_init_reply_v4,node_id,node_id, msgdata,hsmd_init_reply_v4,bip32,ext_key, msgdata,hsmd_init_reply_v4,bolt12,pubkey, +msgdata,hsmd_init_reply_v4,tlvs,hsmd_init_reply_v4_tlvs, +# TLV to indicate HSM secret type +tlvtype,hsmd_init_reply_v4_tlvs,hsm_secret_type,1 +tlvdata,hsmd_init_reply_v4_tlvs,hsm_secret_type,hsm_type,u8, +tlvtype,hsmd_init_reply_v4_tlvs,bip86_base,2 +tlvdata,hsmd_init_reply_v4_tlvs,bip86_base,base,ext_key, + +# HSM initialization failure response +msgtype,hsmd_init_reply_failure,115 +msgdata,hsmd_init_reply_failure,error_code,u32, +msgdata,hsmd_init_reply_failure,error_message,wirestring, # Declare a new channel. msgtype,hsmd_new_channel,30 @@ -439,6 +454,14 @@ msgdata,hsmd_check_pubkey,pubkey,pubkey, msgtype,hsmd_check_pubkey_reply,128 msgdata,hsmd_check_pubkey_reply,ok,bool, +# Sanity check this BIP86 pubkey derivation is correct (unhardened only) +msgtype,hsmd_check_bip86_pubkey,56 +msgdata,hsmd_check_bip86_pubkey,index,u32, +msgdata,hsmd_check_bip86_pubkey,pubkey,pubkey, + +msgtype,hsmd_check_bip86_pubkey_reply,156 +msgdata,hsmd_check_bip86_pubkey_reply,ok,bool, + msgtype,hsmd_sign_anchorspend,147 msgdata,hsmd_sign_anchorspend,peerid,node_id, msgdata,hsmd_sign_anchorspend,channel_dbid,u64, diff --git a/hsmd/libhsmd.c b/hsmd/libhsmd.c index f459f03f1577..5488302e91ea 100644 --- a/hsmd/libhsmd.c +++ b/hsmd/libhsmd.c @@ -1,13 +1,18 @@ #include "config.h" +#include #include #include #include +#include #include #include #include #include +#include #include #include +#include +#include #include #include #include @@ -15,6 +20,9 @@ #include #include #include +#include +#include +#include #include /* The negotiated protocol version ends up in here. */ @@ -25,11 +33,11 @@ struct privkey *dev_force_privkey; /* If they specify --dev-force-bip32-seed it ends up in here. */ struct secret *dev_force_bip32_seed; -/*~ Nobody will ever find it here! hsm_secret is our root secret, the bip32 +/*~ Nobody will ever find it here! bip32_seed is our root secret, the bip32 * tree, bolt12 payer_id keys and derived_secret are derived from that, and * cached here. */ struct { - struct secret hsm_secret; + u8 *bip32_seed; /* Variable length: 32 bytes (legacy) or 64 bytes (mnemonic) */ struct ext_key bip32; struct secret bolt12; struct secret derived_secret; @@ -38,6 +46,10 @@ struct { /* Have we initialized the secretstuff? */ bool initialized = false; +/* BIP32 key version for network compatibility */ +static struct bip32_key_version network_bip32_key_version; + + /* Do we fail all preapprove requests? */ bool dev_fail_preapprove = false; bool dev_no_preapprove_check = false; @@ -126,6 +138,7 @@ bool hsmd_check_client_capabilities(struct hsmd_client *client, case WIRE_HSMD_LOCK_OUTPOINT: return (client->capabilities & HSM_PERM_LOCK_OUTPOINT) != 0; + case WIRE_HSMD_CHECK_BIP86_PUBKEY: case WIRE_HSMD_INIT: case WIRE_HSMD_DEV_PREINIT: case WIRE_HSMD_NEW_CHANNEL: @@ -172,6 +185,7 @@ bool hsmd_check_client_capabilities(struct hsmd_client *client, case WIRE_HSMD_SIGN_WITHDRAWAL_REPLY: case WIRE_HSMD_SIGN_INVOICE_REPLY: case WIRE_HSMD_INIT_REPLY_V4: + case WIRE_HSMD_INIT_REPLY_FAILURE: case WIRE_HSMSTATUS_CLIENT_BAD_REQUEST: case WIRE_HSMD_SIGN_COMMITMENT_TX_REPLY: case WIRE_HSMD_VALIDATE_COMMITMENT_TX_REPLY: @@ -194,6 +208,7 @@ bool hsmd_check_client_capabilities(struct hsmd_client *client, case WIRE_HSMD_PREAPPROVE_KEYSEND_CHECK_REPLY: case WIRE_HSMD_DERIVE_SECRET_REPLY: case WIRE_HSMD_CHECK_PUBKEY_REPLY: + case WIRE_HSMD_CHECK_BIP86_PUBKEY_REPLY: case WIRE_HSMD_SIGN_ANCHORSPEND_REPLY: case WIRE_HSMD_SIGN_HTLC_TX_MINGLE_REPLY: case WIRE_HSMD_SIGN_ANY_CANNOUNCEMENT_REPLY: @@ -250,8 +265,8 @@ static void node_key(struct privkey *node_privkey, struct pubkey *node_id) * leaks somehow, the other keys are not compromised. */ hkdf_sha256(node_privkey, sizeof(*node_privkey), &salt, sizeof(salt), - &secretstuff.hsm_secret, - sizeof(secretstuff.hsm_secret), + secretstuff.bip32_seed, + 32, /* Use first 32 bytes for node key derivation */ "nodeid", 6); salt++; } while (!secp256k1_ec_pubkey_create(secp256k1_ctx, &node_id->pubkey, @@ -284,7 +299,7 @@ static void node_schnorrkey(secp256k1_keypair *node_keypair) static void hsm_channel_secret_base(struct secret *channel_seed_base) { hkdf_sha256(channel_seed_base, sizeof(struct secret), NULL, 0, - &secretstuff.hsm_secret, sizeof(secretstuff.hsm_secret), + secretstuff.bip32_seed, 32, /* Use first 32 bytes */ /*~ Initially, we didn't support multiple channels per * peer at all: a channel had to be completely forgotten * before another could exist. That was slightly relaxed, @@ -525,8 +540,15 @@ static void hsm_key_for_utxo(struct privkey *privkey, struct pubkey *pubkey, hsmd_status_debug("Derived public key %s from unilateral close", fmt_pubkey(tmpctx, pubkey)); } else { - /* Simple case: just get derive via HD-derivation */ - bitcoin_key(privkey, pubkey, utxo->keyindex); + /* Modern HSMs use bip86 for p2tr. */ + if (is_p2tr(utxo->scriptPubkey, tal_bytelen(utxo->scriptPubkey), NULL) + && use_bip86_derivation(tal_bytelen(secretstuff.bip32_seed))) { + /* Use BIP86 derivation */ + bip86_key(privkey, pubkey, utxo->keyindex); + } else { + /* Simple case: just get derive via HD-derivation */ + bitcoin_key(privkey, pubkey, utxo->keyindex); + } } } @@ -2275,6 +2297,13 @@ u8 *hsmd_handle_client_message(const tal_t *ctx, struct hsmd_client *client, return handle_derive_secret(client, msg); case WIRE_HSMD_CHECK_PUBKEY: return handle_check_pubkey(client, msg); + case WIRE_HSMD_CHECK_BIP86_PUBKEY: + /* This should be handled by hsmd.c, not libhsmd */ + return hsmd_status_bad_request_fmt( + client, msg, + "Message of type %s should be handled externally to " + "libhsmd", + hsmd_wire_name(fromwire_peektype(msg))); case WIRE_HSMD_SIGN_ANY_DELAYED_PAYMENT_TO_US: return handle_sign_any_delayed_payment_to_us(client, msg); case WIRE_HSMD_SIGN_ANY_REMOTE_HTLC_TO_US: @@ -2303,6 +2332,7 @@ u8 *hsmd_handle_client_message(const tal_t *ctx, struct hsmd_client *client, case WIRE_HSMD_SIGN_WITHDRAWAL_REPLY: case WIRE_HSMD_SIGN_INVOICE_REPLY: case WIRE_HSMD_INIT_REPLY_V4: + case WIRE_HSMD_INIT_REPLY_FAILURE: case WIRE_HSMSTATUS_CLIENT_BAD_REQUEST: case WIRE_HSMD_SIGN_COMMITMENT_TX_REPLY: case WIRE_HSMD_VALIDATE_COMMITMENT_TX_REPLY: @@ -2324,6 +2354,7 @@ u8 *hsmd_handle_client_message(const tal_t *ctx, struct hsmd_client *client, case WIRE_HSMD_PREAPPROVE_INVOICE_CHECK_REPLY: case WIRE_HSMD_PREAPPROVE_KEYSEND_CHECK_REPLY: case WIRE_HSMD_CHECK_PUBKEY_REPLY: + case WIRE_HSMD_CHECK_BIP86_PUBKEY_REPLY: case WIRE_HSMD_SIGN_ANCHORSPEND_REPLY: case WIRE_HSMD_SIGN_HTLC_TX_MINGLE_REPLY: case WIRE_HSMD_SIGN_ANY_CANNOUNCEMENT_REPLY: @@ -2332,8 +2363,73 @@ u8 *hsmd_handle_client_message(const tal_t *ctx, struct hsmd_client *client, return hsmd_status_bad_request(client, msg, "Unknown request"); } -u8 *hsmd_init(struct secret hsm_secret, const u64 hsmd_version, - struct bip32_key_version bip32_key_version) +/* BIP86 key derivation functions moved from hsmd.c */ +void derive_bip86_base_key(struct ext_key *bip86_base) +{ + /* Check if we have the full BIP32 seed available */ + if (!use_bip86_derivation(tal_bytelen(secretstuff.bip32_seed))) { + hsmd_status_failed(STATUS_FAIL_INTERNAL_ERROR, + "BIP86 derivation requires full 64-byte BIP32 seed (not available in legacy format)"); + } + + /* First create the master key from the seed */ + struct ext_key master_key; + + if (bip32_key_from_seed(secretstuff.bip32_seed, tal_bytelen(secretstuff.bip32_seed), network_bip32_key_version.bip32_privkey_version, 0, &master_key) != WALLY_OK) { + hsmd_status_failed(STATUS_FAIL_INTERNAL_ERROR, + "Failed to create master key from BIP32 seed"); + } + + /* Set up the BIP86 base path: m/86'/0'/0' */ + u32 base_path[3]; + base_path[0] = 86 | 0x80000000; /* 86' */ + base_path[1] = 0x80000000; /* 0' */ + base_path[2] = 0x80000000; /* 0' */ + + /* Derive the BIP86 base key */ + if (bip32_key_from_parent_path(&master_key, base_path, 3, BIP32_FLAG_KEY_PRIVATE, bip86_base) != WALLY_OK) { + hsmd_status_failed(STATUS_FAIL_INTERNAL_ERROR, + "Failed to derive BIP86 base key"); + } +} + +/*~ Get the BIP86 keys for this given index: if privkey is NULL, we + * don't fill it in. This derives the full path: m/86'/0'/0'/0/index */ +void bip86_key(struct privkey *privkey, struct pubkey *pubkey, u32 index) +{ + struct privkey unused_priv; + + if (privkey == NULL) + privkey = &unused_priv; + + if (index >= BIP32_INITIAL_HARDENED_CHILD) + hsmd_status_failed(STATUS_FAIL_MASTER_IO, "Index %u too great", index); + + /* Derive the BIP86 base key using the helper function */ + struct ext_key bip86_base; + derive_bip86_base_key(&bip86_base); + + /* Now derive the specific index: m/86'/0'/0'/0/index */ + u32 final_path[2]; + final_path[0] = 0; /* change (0 for receive) */ + final_path[1] = index; /* address_index */ + + struct ext_key final_key; + if (bip32_key_from_parent_path(&bip86_base, final_path, 2, BIP32_FLAG_KEY_PRIVATE, &final_key) != WALLY_OK) { + hsmd_status_failed(STATUS_FAIL_INTERNAL_ERROR, + "BIP86 derivation of index %u failed", index); + } + + /* Convert to our format */ + memcpy(privkey->secret.data, final_key.priv_key+1, 32); + if (!secp256k1_ec_pubkey_create(secp256k1_ctx, &pubkey->pubkey, + privkey->secret.data)) + hsmd_status_failed(STATUS_FAIL_INTERNAL_ERROR, + "BIP86 pubkey %u create failed", index); +} + +u8 *hsmd_init(const u8 *secret_data, size_t secret_len, const u64 hsmd_version, + struct bip32_key_version bip32_key_version, u8 hsm_secret_type) { u8 bip32_seed[BIP32_ENTROPY_LEN_256]; struct pubkey key, bolt12; @@ -2342,6 +2438,7 @@ u8 *hsmd_init(struct secret hsm_secret, const u64 hsmd_version, struct node_id node_id; static const u32 capabilities[] = { WIRE_HSMD_CHECK_PUBKEY, + WIRE_HSMD_CHECK_BIP86_PUBKEY, WIRE_HSMD_SIGN_ANY_DELAYED_PAYMENT_TO_US, WIRE_HSMD_SIGN_ANCHORSPEND, WIRE_HSMD_SIGN_HTLC_TX_MINGLE, @@ -2354,10 +2451,12 @@ u8 *hsmd_init(struct secret hsm_secret, const u64 hsmd_version, }; u32 *caps; - /*~ Don't swap this. */ - sodium_mlock(secretstuff.hsm_secret.data, - sizeof(secretstuff.hsm_secret.data)); - memcpy(secretstuff.hsm_secret.data, hsm_secret.data, sizeof(hsm_secret.data)); + /*~ Store the BIP32 key version for network compatibility */ + network_bip32_key_version = bip32_key_version; + + /*~ Store the secret (32 or 64 bytes) - use NULL context for persistence */ + secretstuff.bip32_seed = notleak(tal_dup_arr(NULL, u8, secret_data, secret_len, 0)); + mlock_tal_memory(secretstuff.bip32_seed); assert(bip32_key_version.bip32_pubkey_version == BIP32_VER_MAIN_PUBLIC || bip32_key_version.bip32_pubkey_version == BIP32_VER_TEST_PUBLIC); @@ -2372,8 +2471,8 @@ u8 *hsmd_init(struct secret hsm_secret, const u64 hsmd_version, do { hkdf_sha256(bip32_seed, sizeof(bip32_seed), &salt, sizeof(salt), - &secretstuff.hsm_secret, - sizeof(secretstuff.hsm_secret), + secretstuff.bip32_seed, + tal_bytelen(secretstuff.bip32_seed), "bip32 seed", strlen("bip32 seed")); salt++; } while (bip32_key_from_seed(bip32_seed, sizeof(bip32_seed), @@ -2471,7 +2570,7 @@ u8 *hsmd_init(struct secret hsm_secret, const u64 hsmd_version, /* We derive the derived_secret key for generating pseudorandom keys * by taking input string from the makesecret RPC */ hkdf_sha256(&secretstuff.derived_secret, sizeof(struct secret), NULL, 0, - &secretstuff.hsm_secret, sizeof(secretstuff.hsm_secret), + secretstuff.bip32_seed, tal_bytelen(secretstuff.bip32_seed), "derived secrets", strlen("derived secrets")); /* Capabilities arg needs to be a tal array */ @@ -2488,8 +2587,18 @@ u8 *hsmd_init(struct secret hsm_secret, const u64 hsmd_version, * And version is 4: we offer limited compatibility (or at least, * incompatibility detection) with alternate implementations. */ + /* Create TLV with HSM secret type */ + struct tlv_hsmd_init_reply_v4_tlvs *tlvs = tlv_hsmd_init_reply_v4_tlvs_new(tmpctx); + tlvs->hsm_secret_type = tal_dup(tlvs, u8, &hsm_secret_type); + + /* If we have a mnemonic-based HSM, include the BIP86 base key */ + if (use_bip86_derivation(tal_bytelen(secretstuff.bip32_seed))) { + tlvs->bip86_base = tal(tlvs, struct ext_key); + derive_bip86_base_key(tlvs->bip86_base); + } + return take(towire_hsmd_init_reply_v4( - NULL, hsmd_version, caps, - &node_id, &secretstuff.bip32, - &bolt12)); + NULL, hsmd_version, caps, + &node_id, &secretstuff.bip32, + &bolt12, tlvs)); } diff --git a/hsmd/libhsmd.h b/hsmd/libhsmd.h index 652340e212a5..484089d2c009 100644 --- a/hsmd/libhsmd.h +++ b/hsmd/libhsmd.h @@ -38,7 +38,7 @@ struct hsmd_client { /* Given the (unencrypted) base secret, intialize all derived secrets. * * While we ensure that the memory the internal secrets are stored in - * is secure (mlock), the caller must make sure that the `hsm_secret` + * is secure (mlock), the caller must make sure that the `secret_data` * argument is handled securely before this call to avoid potential * issues. The function copies the secret, so the caller can free the * secret after the call. @@ -46,8 +46,8 @@ struct hsmd_client { * Returns the `hsmd_init_reply` with the information required by * `lightningd`. */ -u8 *hsmd_init(struct secret hsm_secret, const u64 hsmd_version, - struct bip32_key_version bip32_key_version); +u8 *hsmd_init(const u8 *secret_data, size_t secret_len, const u64 hsmd_version, + struct bip32_key_version bip32_key_version, u8 hsm_secret_type); struct hsmd_client *hsmd_client_new_main(const tal_t *ctx, u64 capabilities, void *extra); @@ -88,6 +88,11 @@ void hsmd_status_failed(enum status_failreason code, bool hsmd_check_client_capabilities(struct hsmd_client *client, enum hsmd_wire t); + +/* BIP86 key derivation functions */ +void derive_bip86_base_key(struct ext_key *bip86_base); +void bip86_key(struct privkey *privkey, struct pubkey *pubkey, u32 index); + /* The negotiated protocol version ends up in here. */ extern u64 hsmd_mutual_version; diff --git a/lightningd/configs.c b/lightningd/configs.c index 553dafff6a0a..8482a78f3b0d 100644 --- a/lightningd/configs.c +++ b/lightningd/configs.c @@ -357,7 +357,7 @@ static size_t append_to_file(struct lightningd *ld, } /* Note: always nul terminates */ - buffer = grab_fd(tmpctx, fd); + buffer = grab_fd_str(tmpctx, fd); if (!buffer) fatal("Error reading %s: %s", fname, strerror(errno)); @@ -387,7 +387,7 @@ static const char *grab_and_check(const tal_t *ctx, { char *contents; - contents = grab_file(tmpctx, fname); + contents = grab_file_str(tmpctx, fname); if (!contents) return tal_fmt(ctx, "Could not load configfile %s: %s", fname, strerror(errno)); diff --git a/lightningd/hsm_control.c b/lightningd/hsm_control.c index 599ef4081222..1f0a2192fe64 100644 --- a/lightningd/hsm_control.c +++ b/lightningd/hsm_control.c @@ -1,10 +1,11 @@ #include "config.h" #include #include +#include #include #include #include -#include +#include #include #include #include @@ -95,15 +96,6 @@ struct ext_key *hsm_init(struct lightningd *ld) if (!ld->hsm) err(EXITCODE_HSM_GENERIC_ERROR, "Could not subd hsm"); - /* If hsm_secret is encrypted and the --encrypted-hsm startup option is - * not passed, don't let hsmd use the first 32 bytes of the cypher as the - * actual secret. */ - if (!ld->config.keypass) { - if (is_hsm_secret_encrypted("hsm_secret") == 1) - errx(EXITCODE_HSM_ERROR_IS_ENCRYPT, "hsm_secret is encrypted, you need to pass the " - "--encrypted-hsm startup option."); - } - ld->hsm_fd = fds[0]; if (ld->developer) { @@ -122,30 +114,48 @@ struct ext_key *hsm_init(struct lightningd *ld) err(EXITCODE_HSM_GENERIC_ERROR, "Writing preinit msg to hsm"); } + /* Create TLV for passphrase if needed */ + struct tlv_hsmd_init_tlvs *tlv = NULL; + if (ld->hsm_passphrase) { + tlv = tlv_hsmd_init_tlvs_new(tmpctx); + tlv->hsm_passphrase = tal_strdup(tlv, ld->hsm_passphrase); + } + if (!wire_sync_write(ld->hsm_fd, towire_hsmd_init(tmpctx, &chainparams->bip32_key_version, chainparams, - ld->config.keypass, + NULL, ld->dev_force_privkey, ld->dev_force_bip32_seed, ld->dev_force_channel_secrets, ld->dev_force_channel_secrets_shaseed, HSM_MIN_VERSION, - HSM_MAX_VERSION))) + HSM_MAX_VERSION, + tlv))) err(EXITCODE_HSM_GENERIC_ERROR, "Writing init msg to hsm"); bip32_base = tal(ld, struct ext_key); msg = wire_sync_read(tmpctx, ld->hsm_fd); + + /* Check for init reply failure first */ + u32 error_code; + char *error_message; + if (fromwire_hsmd_init_reply_failure(tmpctx, msg, &error_code, &error_message)) { + /* HSM initialization failed: tell user the error (particularly to give feedback if it's a bad passphrase! */ + errx(error_code, "HSM initialization failed: %s", error_message); + } + + /* Check for successful init reply */ + struct tlv_hsmd_init_reply_v4_tlvs *tlvs; if (fromwire_hsmd_init_reply_v4(ld, msg, &hsm_version, &ld->hsm_capabilities, &ld->our_nodeid, bip32_base, - &unused)) { + &unused, &tlvs)) { /* nothing to do. */ } else { - if (ld->config.keypass) - errx(EXITCODE_HSM_BAD_PASSWORD, "Wrong password for encrypted hsm_secret."); - errx(EXITCODE_HSM_GENERIC_ERROR, "HSM did not give init reply"); + /* Unknown message type */ + errx(EXITCODE_HSM_GENERIC_ERROR, "HSM sent unknown message type"); } if (!pubkey_from_node_id(&ld->our_pubkey, &ld->our_nodeid)) @@ -179,6 +189,20 @@ struct ext_key *hsm_init(struct lightningd *ld) fatal("--experimental-splicing needs HSM capable of signing splices!"); } + /* Check if we have a mnemonic-based HSM secret from TLV */ + if (tlvs->bip86_base) { + ld->bip86_base = tal_steal(ld, tlvs->bip86_base); + log_info(ld->log, "Using BIP86 for new addresses, BIP32 for channels (mnemonic HSM secret)"); + } else { + /* Legacy HSM secret - don't attempt BIP86 derivation */ + log_info(ld->log, "Using BIP32 derivation for all operations (legacy HSM secret)"); + ld->bip86_base = NULL; + } + + /* Free the TLV structure to prevent memory leak */ + if (tlvs) + tal_free(tlvs); + /* This is equivalent to makesecret("bolt12-invoice-base") */ msg = towire_hsmd_derive_secret(NULL, tal_dup_arr(tmpctx, u8, (const u8 *)BOLT12_ID_BASE_STRING, @@ -204,6 +228,11 @@ struct ext_key *hsm_init(struct lightningd *ld) return bip32_base; } +/*~ There was a nasty LND bug report where the user issued an address which it + * couldn't spend, presumably due to a bitflip. We check every address using our + * hsm, to be sure it's valid. Expensive, but not as expensive as losing BTC! */ +/* Verify a derived public key with the HSM */ + /*~ There was a nasty LND bug report where the user issued an address which it * couldn't spend, presumably due to a bitflip. We check every address using our * hsm, to be sure it's valid. Expensive, but not as expensive as losing BTC! */ @@ -213,7 +242,7 @@ void bip32_pubkey(struct lightningd *ld, struct pubkey *pubkey, u32 index) struct ext_key ext; if (index >= BIP32_INITIAL_HARDENED_CHILD) - fatal("Can't derive keu %u (too large!)", index); + fatal("Can't derive key %u (too large!)", index); if (bip32_key_from_parent(ld->bip32_base, index, flags, &ext) != WALLY_OK) fatal("Can't derive key %u", index); @@ -229,12 +258,50 @@ void bip32_pubkey(struct lightningd *ld, struct pubkey *pubkey, u32 index) msg = hsm_sync_req(tmpctx, ld, take(msg)); if (!fromwire_hsmd_check_pubkey_reply(msg, &ok)) fatal("Invalid check_pubkey_reply from hsm"); + if (!ok) fatal("HSM said key derivation of %u != %s", index, fmt_pubkey(tmpctx, pubkey)); } } +/* Derive BIP86 public key from the base key */ +void bip86_pubkey(struct lightningd *ld, struct pubkey *pubkey, u32 index) +{ + const uint32_t flags = BIP32_FLAG_KEY_PUBLIC | BIP32_FLAG_SKIP_HASH; + struct ext_key ext; + u32 path[2]; + + if (index >= BIP32_INITIAL_HARDENED_CHILD) + fatal("Can't derive key %u (too large!)", index); + + /* BIP86 path: m/86'/0'/0'/0/index */ + path[0] = 0; /* change (0 for receive) */ + path[1] = index; /* address_index */ + + assert(ld->bip86_base != NULL); + + if (bip32_key_from_parent_path(ld->bip86_base, path, 2, flags, &ext) != WALLY_OK) + fatal("Can't derive key %u", index); + + if (!secp256k1_ec_pubkey_parse(secp256k1_ctx, &pubkey->pubkey, + ext.pub_key, sizeof(ext.pub_key))) + fatal("Can't parse derived key %u", index); + + /* Don't assume hsmd supports it! */ + if (hsm_capable(ld, WIRE_HSMD_CHECK_BIP86_PUBKEY)) { + bool ok; + const u8 *msg = towire_hsmd_check_bip86_pubkey(NULL, index, pubkey); + msg = hsm_sync_req(tmpctx, ld, take(msg)); + if (!fromwire_hsmd_check_bip86_pubkey_reply(msg, &ok)) + fatal("Invalid check_bip86_pubkey_reply from hsm"); + + if (!ok) + fatal("HSM said BIP86 key derivation of %u != %s", + index, fmt_pubkey(tmpctx, pubkey)); + } +} + const u8 *hsm_sync_req(const tal_t *ctx, struct lightningd *ld, const u8 *msg) { int type = fromwire_peektype(msg); diff --git a/lightningd/hsm_control.h b/lightningd/hsm_control.h index 355f8bd51e45..f1262e9a8abd 100644 --- a/lightningd/hsm_control.h +++ b/lightningd/hsm_control.h @@ -27,7 +27,7 @@ const u8 *hsm_sync_req(const tal_t *ctx, struct lightningd *ld, const u8 *msg TAKES); -/* Get (and check!) a bip32 derived pubkey */ void bip32_pubkey(struct lightningd *ld, struct pubkey *pubkey, u32 index); +void bip86_pubkey(struct lightningd *ld, struct pubkey *pubkey, u32 index); #endif /* LIGHTNING_LIGHTNINGD_HSM_CONTROL_H */ diff --git a/lightningd/lightningd.c b/lightningd/lightningd.c index 8eb3acc9cac5..4a843726fc28 100644 --- a/lightningd/lightningd.c +++ b/lightningd/lightningd.c @@ -21,9 +21,8 @@ * before anything else. */ #include "config.h" -/*~ This is Ian Lance Taylor's libbacktrace. It turns out that it's - * horrifically difficult to obtain a decent backtrace in C; the standard - * backtrace function is useless in most programs. */ +/*~ Various bitcoin-related helpers live in the bitcoin/ directory */ +#include /*~ These headers are from CCAN: http://ccodearchive.net. * @@ -51,13 +50,13 @@ #include #include #include -#include +#include #include #include #include #include -#include +#include #include #include #include @@ -239,6 +238,7 @@ static struct lightningd *new_lightningd(const tal_t *ctx) ld->alias = NULL; ld->rgb = NULL; ld->recover = NULL; + ld->hsm_passphrase = NULL; list_head_init(&ld->connects); list_head_init(&ld->waitsendpay_commands); list_head_init(&ld->close_commands); @@ -317,10 +317,10 @@ static struct lightningd *new_lightningd(const tal_t *ctx) /*~ This is set when a JSON RPC command comes in to shut us down. */ ld->stop_conn = NULL; - /*~ This is used to signal that `hsm_secret` is encrypted, and will - * be set to `true` if the `--encrypted-hsm` option is passed at startup. + /*~ This is used to store the passphrase for hsm_secret if needed. + * It will be set if the `--hsm-passphrase` option is passed at startup. */ - ld->encrypted_hsm = false; + ld->hsm_passphrase = NULL; /* This is used to override subdaemons */ strmap_init(&ld->alt_subdaemons); @@ -487,8 +487,8 @@ void test_subdaemons(const struct lightningd *ld) err(EXITCODE_SUBDAEMON_FAIL, "Could not run %s", dpath); /*~ CCAN's grab_file module contains a routine to read into a - * tallocated buffer until EOF */ - verstring = grab_fd(tmpctx, outfd); + * tallocated buffer until EOF (with nul appended!) */ + verstring = grab_fd_str(tmpctx, outfd); /*~ Like many CCAN modules, it set errno on failure, which * err (ccan/err, but usually just the BSD ) prints */ if (!verstring) @@ -683,7 +683,7 @@ static void init_txfilter(struct wallet *w, struct ext_key ext; /*~ Note the use of ccan/short_types u64 rather than uint64_t. * Thank me later. */ - u64 bip32_max_index; + u64 bip32_max_index, bip86_max_index; bip32_max_index = db_get_intvar(w->db, "bip32_max_index", 0); /*~ One of the C99 things I unequivocally approve: for-loop scope. */ @@ -693,6 +693,17 @@ static void init_txfilter(struct wallet *w, } txfilter_add_derkey(filter, ext.pub_key); } + + /* If BIP86 is enabled, also add BIP86-derived keys to the filter */ + if (w->ld->bip86_base) { + bip86_max_index = db_get_intvar(w->db, "bip86_max_index", 0); + for (u64 i = 0; i <= bip86_max_index + w->keyscan_gap; i++) { + struct pubkey pubkey; + bip86_pubkey(w->ld, &pubkey, i); + u8 *script = scriptpubkey_p2tr(tmpctx, &pubkey); + txfilter_add_scriptpubkey(filter, take(script)); + } + } } /*~ The normal advice for daemons is to move into the root directory, so you @@ -1313,11 +1324,6 @@ int main(int argc, char *argv[]) /*~ This is the ccan/io central poll override from above. */ io_poll_override(io_poll_lightningd); - /*~ If hsm_secret is encrypted, we don't need its encryption key - * anymore. Note that sodium_munlock() also zeroes the memory.*/ - if (ld->config.keypass) - discard_key(take(ld->config.keypass)); - /*~ Our default color and alias are derived from our node id, so we * can only set those now (if not set by config options). */ setup_color_and_alias(ld); diff --git a/lightningd/lightningd.h b/lightningd/lightningd.h index ce8b62b017a6..6415e6598903 100644 --- a/lightningd/lightningd.h +++ b/lightningd/lightningd.h @@ -69,9 +69,6 @@ struct config { /* Minimal amount of effective funding_satoshis for accepting channels */ u64 min_capacity_sat; - /* This is the key we use to encrypt `hsm_secret`. */ - struct secret *keypass; - /* How long before we give up waiting for INIT msg */ u32 connection_timeout_secs; @@ -239,6 +236,8 @@ struct lightningd { /* Derive all our keys from here (see bip32_pubkey) */ struct ext_key *bip32_base; + /* Derive all our BIP86 keys from here */ + struct ext_key *bip86_base; struct wallet *wallet; /* Outstanding waitsendpay commands. */ @@ -387,7 +386,9 @@ struct lightningd { char *old_bookkeeper_dir; char *old_bookkeeper_db; - bool encrypted_hsm; + /* HSM passphrase for any format that needs it */ + char *hsm_passphrase; + /* What (additional) messages the HSM accepts */ u32 *hsm_capabilities; diff --git a/lightningd/options.c b/lightningd/options.c index 1ef5d1fa2e96..2175d434196b 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include @@ -552,19 +552,65 @@ static void prompt(struct lightningd *ld, const char *str) fflush(stdout); } +/* Read HSM passphrase from user input */ +static char *read_hsm_passphrase(struct lightningd *ld) +{ + const char *passphrase, *passphrase_confirmation; + enum hsm_secret_error err; + + prompt(ld, "The hsm_secret requires a passphrase. In order to " + "access it and start the node you must provide the passphrase."); + prompt(ld, "Enter hsm_secret passphrase:"); + + passphrase = read_stdin_pass(tmpctx, &err); + if (err != HSM_SECRET_OK) { + opt_exitcode = EXITCODE_HSM_PASSWORD_INPUT_ERR; + return tal_strdup(tmpctx, hsm_secret_error_str(err)); + } + + /* We need confirmation if the hsm_secret file doesn't exist yet */ + if (!path_is_file("hsm_secret")) { + prompt(ld, "Confirm hsm_secret passphrase:"); + fflush(stdout); + passphrase_confirmation = read_stdin_pass(tmpctx, &err); + if (err != HSM_SECRET_OK) { + opt_exitcode = EXITCODE_HSM_PASSWORD_INPUT_ERR; + return tal_strdup(tmpctx, hsm_secret_error_str(err)); + } + + if (!streq(passphrase, passphrase_confirmation)) { + opt_exitcode = EXITCODE_HSM_BAD_PASSWORD; + return "Passphrase confirmation mismatch."; + } + } + + /* Store passphrase in lightningd struct */ + ld->hsm_passphrase = tal_strdup(ld, passphrase); + + /* Encryption key derivation is handled by hsmd internally */ + + return NULL; +} + /* Prompt the user to enter a password, from which will be derived the key used * for `hsm_secret` encryption. * The algorithm used to derive the key is Argon2(id), to which libsodium * defaults. However argon2id-specific constants are used in case someone runs it * with a libsodium version which default constants differs (typically <1.0.9). + * + * DEPRECATED: Use --hsm-passphrase instead. */ static char *opt_set_hsm_password(struct lightningd *ld) { - char *passwd, *passwd_confirmation; - const char *err_msg; int is_encrypted; - is_encrypted = is_hsm_secret_encrypted("hsm_secret"); + /* Show deprecation warning */ + if (!opt_deprecated_ok(ld, "encrypted_hsm", + "Use --hsm-passphrase instead", + "v25.12", "v26.12")) + return "--encrypted-hsm was removed, use --hsm-passphrase instead"; + + is_encrypted = is_legacy_hsm_secret_encrypted("hsm_secret"); /* While lightningd is performing the first initialization * this check is always true because the file does not exist. * @@ -575,40 +621,18 @@ static char *opt_set_hsm_password(struct lightningd *ld) log_info(ld->log, "'hsm_secret' does not exist (%s)", strerror(errno)); - prompt(ld, "The hsm_secret is encrypted with a password. In order to " - "decrypt it and start the node you must provide the password."); - prompt(ld, "Enter hsm_secret password:"); - - passwd = read_stdin_pass_with_exit_code(&err_msg, &opt_exitcode); - if (!passwd) - return cast_const(char *, err_msg); - if (!is_encrypted) { - prompt(ld, "Confirm hsm_secret password:"); - fflush(stdout); - passwd_confirmation = read_stdin_pass_with_exit_code(&err_msg, &opt_exitcode); - if (!passwd_confirmation) - return cast_const(char *, err_msg); - - if (!streq(passwd, passwd_confirmation)) { - opt_exitcode = EXITCODE_HSM_BAD_PASSWORD; - return "Passwords confirmation mismatch."; - } - free(passwd_confirmation); - } - prompt(ld, ""); - - ld->config.keypass = tal(NULL, struct secret); - - opt_exitcode = hsm_secret_encryption_key_with_exitcode(passwd, ld->config.keypass, &err_msg); - if (opt_exitcode > 0) - return cast_const(char *, err_msg); - - ld->encrypted_hsm = true; - free(passwd); + return read_hsm_passphrase(ld); +} - return NULL; +/* Set flag to indicate hsm_secret needs a passphrase. + * This replaces the old --encrypted-hsm option which was for legacy encrypted secrets. + */ +static char *opt_set_hsm_passphrase(struct lightningd *ld) +{ + return read_hsm_passphrase(ld); } + static char *opt_force_privkey(const char *optarg, struct lightningd *ld) { tal_free(ld->dev_force_privkey); @@ -1523,9 +1547,12 @@ static void register_opts(struct lightningd *ld) opt_register_early_noarg("--disable-dns", opt_set_invbool, &ld->config.use_dns, "Disable DNS lookups of peers"); + /* Deprecated: use --hsm-passphrase instead */ opt_register_noarg("--encrypted-hsm", opt_set_hsm_password, ld, - "Set the password to encrypt hsm_secret with. If no password is passed through command line, " - "you will be prompted to enter it."); + opt_hidden); + + opt_register_noarg("--hsm-passphrase", opt_set_hsm_passphrase, ld, + "Prompt for passphrase for encrypted hsm_secret (replaces --encrypted-hsm)"); opt_register_arg("--rpc-file-mode", &opt_set_mode, &opt_show_mode, &ld->rpc_filemode, @@ -1841,5 +1868,6 @@ bool is_known_opt_cb_arg(char *(*cb_arg)(const char *, void *)) || cb_arg == (void *)opt_force_privkey || cb_arg == (void *)opt_force_bip32_seed || cb_arg == (void *)opt_force_channel_secrets - || cb_arg == (void *)opt_force_tmp_channel_id; + || cb_arg == (void *)opt_force_tmp_channel_id + || cb_arg == (void *)opt_set_hsm_passphrase; } diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 7ecd01a6ba15..7daff0d7d916 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -210,7 +210,12 @@ u8 *p2tr_for_keyidx(const tal_t *ctx, struct lightningd *ld, u64 keyidx) { struct pubkey shutdownkey; - bip32_pubkey(ld, &shutdownkey, keyidx); + /* Use BIP86 derivation if wallet has BIP86 base, otherwise use BIP32 */ + if (ld->bip86_base) { + bip86_pubkey(ld, &shutdownkey, keyidx); + } else { + bip32_pubkey(ld, &shutdownkey, keyidx); + } return scriptpubkey_p2tr(ctx, &shutdownkey); } diff --git a/lightningd/plugin.c b/lightningd/plugin.c index cb38c848483f..ee588ed6e065 100644 --- a/lightningd/plugin.c +++ b/lightningd/plugin.c @@ -321,7 +321,7 @@ static u32 file_checksum(struct lightningd *ld, const char *path) if (ld->dev_no_plugin_checksum) return 0; - content = grab_file(tmpctx, path); + content = grab_file_raw(tmpctx, path); crc = crc32c(0, content, tal_count(content)); /* We could leave this around, but we checksum many files in a loop, * causing 450MB of allocations at startup! */ diff --git a/lightningd/test/run-find_my_abspath.c b/lightningd/test/run-find_my_abspath.c index 7f15dc1b8e76..14a3998e9872 100644 --- a/lightningd/test/run-find_my_abspath.c +++ b/lightningd/test/run-find_my_abspath.c @@ -12,6 +12,9 @@ int unused_main(int argc, char *argv[]); /* Generated stub for begin_topology */ void begin_topology(struct chain_topology *topo UNNEEDED) { fprintf(stderr, "begin_topology called!\n"); abort(); } +/* Generated stub for bip86_pubkey */ +void bip86_pubkey(struct lightningd *ld UNNEEDED, struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) +{ fprintf(stderr, "bip86_pubkey called!\n"); abort(); } /* Generated stub for channel_gossip_notify_new_block */ void channel_gossip_notify_new_block(struct lightningd *ld UNNEEDED) { fprintf(stderr, "channel_gossip_notify_new_block called!\n"); abort(); } @@ -209,6 +212,9 @@ u8 *towire_hsmd_ecdh_req(const tal_t *ctx UNNEEDED, const struct pubkey *point U void txfilter_add_derkey(struct txfilter *filter UNNEEDED, const u8 derkey[PUBKEY_CMPR_LEN]) { fprintf(stderr, "txfilter_add_derkey called!\n"); abort(); } +/* Generated stub for txfilter_add_scriptpubkey */ +void txfilter_add_scriptpubkey(struct txfilter *filter UNNEEDED, const u8 *script TAKES UNNEEDED) +{ fprintf(stderr, "txfilter_add_scriptpubkey called!\n"); abort(); } /* Generated stub for txfilter_new */ struct txfilter *txfilter_new(const tal_t *ctx UNNEEDED) { fprintf(stderr, "txfilter_new called!\n"); abort(); } diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 91b074482bfe..dfadd25fbe6e 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -17,6 +17,9 @@ struct channel *any_channel_by_scid(struct lightningd *ld UNNEEDED, /* Generated stub for bip32_pubkey */ void bip32_pubkey(struct lightningd *ld UNNEEDED, struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) { fprintf(stderr, "bip32_pubkey called!\n"); abort(); } +/* Generated stub for bip86_pubkey */ +void bip86_pubkey(struct lightningd *ld UNNEEDED, struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) +{ fprintf(stderr, "bip86_pubkey called!\n"); abort(); } /* Generated stub for bitcoind_getutxout_ */ void bitcoind_getutxout_(const tal_t *ctx UNNEEDED, struct bitcoind *bitcoind UNNEEDED, diff --git a/plugins/bcli.c b/plugins/bcli.c index 656df9ffad43..5203022f18ea 100644 --- a/plugins/bcli.c +++ b/plugins/bcli.c @@ -1066,7 +1066,7 @@ static void wait_and_check_bitcoind(struct plugin *p) plugin_err(p, "%s exec failed: %s", cmd[0], strerror(errno)); } - output = grab_fd(cmd, from); + output = grab_fd_str(cmd, from); waitpid(child, &status, 0); diff --git a/plugins/chanbackup.c b/plugins/chanbackup.c index de298ec30f44..4eeb7261cf88 100644 --- a/plugins/chanbackup.c +++ b/plugins/chanbackup.c @@ -242,13 +242,9 @@ static void maybe_create_new_scb(struct plugin *p, static u8 *get_file_data(const tal_t *ctx, struct plugin *p) { - u8 *scb = grab_file(ctx, FILENAME); - if (!scb) { + u8 *scb = grab_file_raw(ctx, FILENAME); + if (!scb) plugin_err(p, "Cannot read emergency.recover: %s", strerror(errno)); - } else { - /* grab_file adds nul term */ - tal_resize(&scb, tal_bytelen(scb) - 1); - } return scb; } diff --git a/plugins/exposesecret.c b/plugins/exposesecret.c index ed944cd6de0d..c46c4ee08f85 100644 --- a/plugins/exposesecret.c +++ b/plugins/exposesecret.c @@ -5,8 +5,11 @@ #include #include #include +#include #include #include +#include +#include #include #include @@ -44,8 +47,9 @@ static struct command_result *json_exposesecret(struct command *cmd, const struct exposesecret *exposesecret = exposesecret_data(cmd->plugin); struct json_stream *js; u8 *contents; - const char *id, *passphrase, *err; - struct secret hsm_secret; + const char *id, *passphrase; + enum hsm_secret_error err; + struct hsm_secret *hsms; struct privkey node_privkey; struct pubkey node_id; char *bip93; @@ -64,22 +68,26 @@ static struct command_result *json_exposesecret(struct command *cmd, if (!compare_passphrases(exposesecret->exposure_passphrase, passphrase)) return command_fail(cmd, LIGHTNINGD, "passphrase does not match exposesecrets-passphrase"); - contents = grab_file(tmpctx, "hsm_secret"); + contents = grab_file_raw(tmpctx, "hsm_secret"); if (!contents) return command_fail(cmd, LIGHTNINGD, "Could not open hsm_secret: %s", strerror(errno)); - /* grab_file adds a \0 byte at the end for convenience */ - if (tal_bytelen(contents) == sizeof(hsm_secret) + 1) { - memcpy(&hsm_secret, contents, sizeof(hsm_secret)); - } else { - return command_fail(cmd, LIGHTNINGD, "Not a valid hsm_secret file? Bad length (maybe encrypted?)"); + /* Check if the HSM secret needs a passphrase */ + if (hsm_secret_needs_passphrase(contents, tal_bytelen(contents))) { + return command_fail(cmd, LIGHTNINGD, "Secret with passphrase is not supported"); } + /* Extract the HSM secret without passphrase */ + hsms = extract_hsm_secret(tmpctx, contents, tal_bytelen(contents), NULL, &err); + + if (!hsms) + return command_fail(cmd, LIGHTNINGD, "Could not parse hsm_secret: %s", hsm_secret_error_str(err)); + /* Before we expose it, check it's correct! */ hkdf_sha256(&node_privkey, sizeof(node_privkey), &salt, sizeof(salt), - &hsm_secret, - sizeof(hsm_secret), + hsms->secret_data, + 32, "nodeid", 6); /* Should not happen! */ @@ -113,9 +121,9 @@ static struct command_result *json_exposesecret(struct command *cmd, } /* This also cannot fail! */ - err = codex32_secret_encode(tmpctx, "cl", id, 0, hsm_secret.data, 32, &bip93); - if (err) - return command_fail(cmd, LIGHTNINGD, "Unexpected failure encoding hsm_secret: %s", err); + const char *encode_err = codex32_secret_encode(tmpctx, "cl", id, 0, hsms->secret_data, 32, &bip93); + if (encode_err) + return command_fail(cmd, LIGHTNINGD, "Unexpected failure encoding hsm_secret: %s", encode_err); /* If we're just checking, stop */ if (command_check_only(cmd)) @@ -124,6 +132,8 @@ static struct command_result *json_exposesecret(struct command *cmd, js = jsonrpc_stream_success(cmd); json_add_string(js, "identifier", id); json_add_string(js, "codex32", bip93); + if (hsms->mnemonic) + json_add_string(js, "mnemonic", hsms->mnemonic); return command_finished(cmd, js); } diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/010a57daa7433703ddc639f51f53d01a74afdba8 b/tests/fuzz/corpora/fuzz-hsm_secret/010a57daa7433703ddc639f51f53d01a74afdba8 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/010a57daa7433703ddc639f51f53d01a74afdba8 rename to tests/fuzz/corpora/fuzz-hsm_secret/010a57daa7433703ddc639f51f53d01a74afdba8 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/010a7169be4dc57b1df48a71f8292af8a692b2b3 b/tests/fuzz/corpora/fuzz-hsm_secret/010a7169be4dc57b1df48a71f8292af8a692b2b3 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/010a7169be4dc57b1df48a71f8292af8a692b2b3 rename to tests/fuzz/corpora/fuzz-hsm_secret/010a7169be4dc57b1df48a71f8292af8a692b2b3 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/019f9573207b9765047f660f11cd19bbd48309e2 b/tests/fuzz/corpora/fuzz-hsm_secret/019f9573207b9765047f660f11cd19bbd48309e2 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/019f9573207b9765047f660f11cd19bbd48309e2 rename to tests/fuzz/corpora/fuzz-hsm_secret/019f9573207b9765047f660f11cd19bbd48309e2 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/086d57f3fa5ff9c9b7eb765ff8b88a2d797ca946 b/tests/fuzz/corpora/fuzz-hsm_secret/086d57f3fa5ff9c9b7eb765ff8b88a2d797ca946 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/086d57f3fa5ff9c9b7eb765ff8b88a2d797ca946 rename to tests/fuzz/corpora/fuzz-hsm_secret/086d57f3fa5ff9c9b7eb765ff8b88a2d797ca946 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/11daf937510fff8519d131daf36160fb39cfba15 b/tests/fuzz/corpora/fuzz-hsm_secret/11daf937510fff8519d131daf36160fb39cfba15 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/11daf937510fff8519d131daf36160fb39cfba15 rename to tests/fuzz/corpora/fuzz-hsm_secret/11daf937510fff8519d131daf36160fb39cfba15 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/11f4de6b8b45cf8051b1d17fa4cde9ad935cea41 b/tests/fuzz/corpora/fuzz-hsm_secret/11f4de6b8b45cf8051b1d17fa4cde9ad935cea41 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/11f4de6b8b45cf8051b1d17fa4cde9ad935cea41 rename to tests/fuzz/corpora/fuzz-hsm_secret/11f4de6b8b45cf8051b1d17fa4cde9ad935cea41 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/176cbd4490560d179030137a21c904027fea3935 b/tests/fuzz/corpora/fuzz-hsm_secret/176cbd4490560d179030137a21c904027fea3935 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/176cbd4490560d179030137a21c904027fea3935 rename to tests/fuzz/corpora/fuzz-hsm_secret/176cbd4490560d179030137a21c904027fea3935 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/24c823bc3c38d3de37f789f5ecafaa8408c93757 b/tests/fuzz/corpora/fuzz-hsm_secret/24c823bc3c38d3de37f789f5ecafaa8408c93757 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/24c823bc3c38d3de37f789f5ecafaa8408c93757 rename to tests/fuzz/corpora/fuzz-hsm_secret/24c823bc3c38d3de37f789f5ecafaa8408c93757 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/260031bd67c9814ad538fb29634fa783c82ccfe3 b/tests/fuzz/corpora/fuzz-hsm_secret/260031bd67c9814ad538fb29634fa783c82ccfe3 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/260031bd67c9814ad538fb29634fa783c82ccfe3 rename to tests/fuzz/corpora/fuzz-hsm_secret/260031bd67c9814ad538fb29634fa783c82ccfe3 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/26dfa419dd7a4e2049feff895b829dda48f425ac b/tests/fuzz/corpora/fuzz-hsm_secret/26dfa419dd7a4e2049feff895b829dda48f425ac similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/26dfa419dd7a4e2049feff895b829dda48f425ac rename to tests/fuzz/corpora/fuzz-hsm_secret/26dfa419dd7a4e2049feff895b829dda48f425ac diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/2756db15a535e07f2ac3498d97d7bb2be248a172 b/tests/fuzz/corpora/fuzz-hsm_secret/2756db15a535e07f2ac3498d97d7bb2be248a172 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/2756db15a535e07f2ac3498d97d7bb2be248a172 rename to tests/fuzz/corpora/fuzz-hsm_secret/2756db15a535e07f2ac3498d97d7bb2be248a172 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/29d842a6375afe12348b81f1742c708169f6796b b/tests/fuzz/corpora/fuzz-hsm_secret/29d842a6375afe12348b81f1742c708169f6796b similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/29d842a6375afe12348b81f1742c708169f6796b rename to tests/fuzz/corpora/fuzz-hsm_secret/29d842a6375afe12348b81f1742c708169f6796b diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/3bc15c8aae3e4124dd409035f32ea2fd6835efc9 b/tests/fuzz/corpora/fuzz-hsm_secret/3bc15c8aae3e4124dd409035f32ea2fd6835efc9 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/3bc15c8aae3e4124dd409035f32ea2fd6835efc9 rename to tests/fuzz/corpora/fuzz-hsm_secret/3bc15c8aae3e4124dd409035f32ea2fd6835efc9 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/44fdfd93ea706488b4817f55435dde2bf0048eb5 b/tests/fuzz/corpora/fuzz-hsm_secret/44fdfd93ea706488b4817f55435dde2bf0048eb5 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/44fdfd93ea706488b4817f55435dde2bf0048eb5 rename to tests/fuzz/corpora/fuzz-hsm_secret/44fdfd93ea706488b4817f55435dde2bf0048eb5 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/48748e3a570fbe79b28fa52b048ecc9d73b6d3b1 b/tests/fuzz/corpora/fuzz-hsm_secret/48748e3a570fbe79b28fa52b048ecc9d73b6d3b1 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/48748e3a570fbe79b28fa52b048ecc9d73b6d3b1 rename to tests/fuzz/corpora/fuzz-hsm_secret/48748e3a570fbe79b28fa52b048ecc9d73b6d3b1 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/4d9636304829eca44744fa3f960c076fa247d875 b/tests/fuzz/corpora/fuzz-hsm_secret/4d9636304829eca44744fa3f960c076fa247d875 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/4d9636304829eca44744fa3f960c076fa247d875 rename to tests/fuzz/corpora/fuzz-hsm_secret/4d9636304829eca44744fa3f960c076fa247d875 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/59d2945e40bfcbb2ac91ce0334a06689abe21fb7 b/tests/fuzz/corpora/fuzz-hsm_secret/59d2945e40bfcbb2ac91ce0334a06689abe21fb7 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/59d2945e40bfcbb2ac91ce0334a06689abe21fb7 rename to tests/fuzz/corpora/fuzz-hsm_secret/59d2945e40bfcbb2ac91ce0334a06689abe21fb7 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/5dbe749bb6c6027a0022430f2514824f47097269 b/tests/fuzz/corpora/fuzz-hsm_secret/5dbe749bb6c6027a0022430f2514824f47097269 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/5dbe749bb6c6027a0022430f2514824f47097269 rename to tests/fuzz/corpora/fuzz-hsm_secret/5dbe749bb6c6027a0022430f2514824f47097269 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/712bad91ff51f19b892122cbba365a0f4b3147fb b/tests/fuzz/corpora/fuzz-hsm_secret/712bad91ff51f19b892122cbba365a0f4b3147fb similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/712bad91ff51f19b892122cbba365a0f4b3147fb rename to tests/fuzz/corpora/fuzz-hsm_secret/712bad91ff51f19b892122cbba365a0f4b3147fb diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/7618428f8d106024bd6e27dfada6d9dbb2f05a9b b/tests/fuzz/corpora/fuzz-hsm_secret/7618428f8d106024bd6e27dfada6d9dbb2f05a9b similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/7618428f8d106024bd6e27dfada6d9dbb2f05a9b rename to tests/fuzz/corpora/fuzz-hsm_secret/7618428f8d106024bd6e27dfada6d9dbb2f05a9b diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/7c191aae1d3d9a8a8a9c70959f8ac14ba22e7c83 b/tests/fuzz/corpora/fuzz-hsm_secret/7c191aae1d3d9a8a8a9c70959f8ac14ba22e7c83 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/7c191aae1d3d9a8a8a9c70959f8ac14ba22e7c83 rename to tests/fuzz/corpora/fuzz-hsm_secret/7c191aae1d3d9a8a8a9c70959f8ac14ba22e7c83 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/82db6048fae4a5953f671f416b59afe4004380ec b/tests/fuzz/corpora/fuzz-hsm_secret/82db6048fae4a5953f671f416b59afe4004380ec similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/82db6048fae4a5953f671f416b59afe4004380ec rename to tests/fuzz/corpora/fuzz-hsm_secret/82db6048fae4a5953f671f416b59afe4004380ec diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/85b3c5e8a553adee68f94a2c5770f59acf41308f b/tests/fuzz/corpora/fuzz-hsm_secret/85b3c5e8a553adee68f94a2c5770f59acf41308f similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/85b3c5e8a553adee68f94a2c5770f59acf41308f rename to tests/fuzz/corpora/fuzz-hsm_secret/85b3c5e8a553adee68f94a2c5770f59acf41308f diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/85e53271e14006f0265921d02d4d736cdc580b0b b/tests/fuzz/corpora/fuzz-hsm_secret/85e53271e14006f0265921d02d4d736cdc580b0b similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/85e53271e14006f0265921d02d4d736cdc580b0b rename to tests/fuzz/corpora/fuzz-hsm_secret/85e53271e14006f0265921d02d4d736cdc580b0b diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/878e4439b591edc28ebb2691979661037bc5cde1 b/tests/fuzz/corpora/fuzz-hsm_secret/878e4439b591edc28ebb2691979661037bc5cde1 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/878e4439b591edc28ebb2691979661037bc5cde1 rename to tests/fuzz/corpora/fuzz-hsm_secret/878e4439b591edc28ebb2691979661037bc5cde1 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/8efd4d04bba8942cef9293af1a778e66fe6d0e7d b/tests/fuzz/corpora/fuzz-hsm_secret/8efd4d04bba8942cef9293af1a778e66fe6d0e7d similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/8efd4d04bba8942cef9293af1a778e66fe6d0e7d rename to tests/fuzz/corpora/fuzz-hsm_secret/8efd4d04bba8942cef9293af1a778e66fe6d0e7d diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/922d91b16cc923561d58979900554de2af4762d8 b/tests/fuzz/corpora/fuzz-hsm_secret/922d91b16cc923561d58979900554de2af4762d8 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/922d91b16cc923561d58979900554de2af4762d8 rename to tests/fuzz/corpora/fuzz-hsm_secret/922d91b16cc923561d58979900554de2af4762d8 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/92b6e6612209872ccc8bb6b45b617558125e092a b/tests/fuzz/corpora/fuzz-hsm_secret/92b6e6612209872ccc8bb6b45b617558125e092a similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/92b6e6612209872ccc8bb6b45b617558125e092a rename to tests/fuzz/corpora/fuzz-hsm_secret/92b6e6612209872ccc8bb6b45b617558125e092a diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/974098cfbcc636d36e3a8e64dd8018fc8b83ec89 b/tests/fuzz/corpora/fuzz-hsm_secret/974098cfbcc636d36e3a8e64dd8018fc8b83ec89 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/974098cfbcc636d36e3a8e64dd8018fc8b83ec89 rename to tests/fuzz/corpora/fuzz-hsm_secret/974098cfbcc636d36e3a8e64dd8018fc8b83ec89 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/9842926af7ca0a8cca12604f945414f07b01e13d b/tests/fuzz/corpora/fuzz-hsm_secret/9842926af7ca0a8cca12604f945414f07b01e13d similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/9842926af7ca0a8cca12604f945414f07b01e13d rename to tests/fuzz/corpora/fuzz-hsm_secret/9842926af7ca0a8cca12604f945414f07b01e13d diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/9ca6d4b8e2b357f4996c432067304c1f626720eb b/tests/fuzz/corpora/fuzz-hsm_secret/9ca6d4b8e2b357f4996c432067304c1f626720eb similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/9ca6d4b8e2b357f4996c432067304c1f626720eb rename to tests/fuzz/corpora/fuzz-hsm_secret/9ca6d4b8e2b357f4996c432067304c1f626720eb diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/9e350e370dc6f75a337009f44ef5d0ecf5ed610e b/tests/fuzz/corpora/fuzz-hsm_secret/9e350e370dc6f75a337009f44ef5d0ecf5ed610e similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/9e350e370dc6f75a337009f44ef5d0ecf5ed610e rename to tests/fuzz/corpora/fuzz-hsm_secret/9e350e370dc6f75a337009f44ef5d0ecf5ed610e diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/a4921de93678886f2666fe9240f55356038ac16e b/tests/fuzz/corpora/fuzz-hsm_secret/a4921de93678886f2666fe9240f55356038ac16e similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/a4921de93678886f2666fe9240f55356038ac16e rename to tests/fuzz/corpora/fuzz-hsm_secret/a4921de93678886f2666fe9240f55356038ac16e diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/a71b3c25b54d5c8eb084084f1ef9f9b27931d5ff b/tests/fuzz/corpora/fuzz-hsm_secret/a71b3c25b54d5c8eb084084f1ef9f9b27931d5ff similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/a71b3c25b54d5c8eb084084f1ef9f9b27931d5ff rename to tests/fuzz/corpora/fuzz-hsm_secret/a71b3c25b54d5c8eb084084f1ef9f9b27931d5ff diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/af030542a4125d670351df40131a4265e29b7447 b/tests/fuzz/corpora/fuzz-hsm_secret/af030542a4125d670351df40131a4265e29b7447 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/af030542a4125d670351df40131a4265e29b7447 rename to tests/fuzz/corpora/fuzz-hsm_secret/af030542a4125d670351df40131a4265e29b7447 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/b0adf074d207869cad9d349b0bf943d532c5e765 b/tests/fuzz/corpora/fuzz-hsm_secret/b0adf074d207869cad9d349b0bf943d532c5e765 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/b0adf074d207869cad9d349b0bf943d532c5e765 rename to tests/fuzz/corpora/fuzz-hsm_secret/b0adf074d207869cad9d349b0bf943d532c5e765 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/b166167155f161a697affe07e3a018901bf00c7f b/tests/fuzz/corpora/fuzz-hsm_secret/b166167155f161a697affe07e3a018901bf00c7f similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/b166167155f161a697affe07e3a018901bf00c7f rename to tests/fuzz/corpora/fuzz-hsm_secret/b166167155f161a697affe07e3a018901bf00c7f diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/b6a060bc39f6f35a41d503cf5c32adae7540e2d4 b/tests/fuzz/corpora/fuzz-hsm_secret/b6a060bc39f6f35a41d503cf5c32adae7540e2d4 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/b6a060bc39f6f35a41d503cf5c32adae7540e2d4 rename to tests/fuzz/corpora/fuzz-hsm_secret/b6a060bc39f6f35a41d503cf5c32adae7540e2d4 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/b714e28e82cb02857771f0ef8a3a1fc91f7d578c b/tests/fuzz/corpora/fuzz-hsm_secret/b714e28e82cb02857771f0ef8a3a1fc91f7d578c similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/b714e28e82cb02857771f0ef8a3a1fc91f7d578c rename to tests/fuzz/corpora/fuzz-hsm_secret/b714e28e82cb02857771f0ef8a3a1fc91f7d578c diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/c1554cfd9efc6515e42d6ea45c85131217dc48c6 b/tests/fuzz/corpora/fuzz-hsm_secret/c1554cfd9efc6515e42d6ea45c85131217dc48c6 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/c1554cfd9efc6515e42d6ea45c85131217dc48c6 rename to tests/fuzz/corpora/fuzz-hsm_secret/c1554cfd9efc6515e42d6ea45c85131217dc48c6 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/ca06da040976f32f8453a8737c15ea1b800d0255 b/tests/fuzz/corpora/fuzz-hsm_secret/ca06da040976f32f8453a8737c15ea1b800d0255 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/ca06da040976f32f8453a8737c15ea1b800d0255 rename to tests/fuzz/corpora/fuzz-hsm_secret/ca06da040976f32f8453a8737c15ea1b800d0255 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/d2c778022a38b46327e74b61341dc384402580ec b/tests/fuzz/corpora/fuzz-hsm_secret/d2c778022a38b46327e74b61341dc384402580ec similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/d2c778022a38b46327e74b61341dc384402580ec rename to tests/fuzz/corpora/fuzz-hsm_secret/d2c778022a38b46327e74b61341dc384402580ec diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/d5fc363735dc945c877052ef2b7ebe383208afe1 b/tests/fuzz/corpora/fuzz-hsm_secret/d5fc363735dc945c877052ef2b7ebe383208afe1 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/d5fc363735dc945c877052ef2b7ebe383208afe1 rename to tests/fuzz/corpora/fuzz-hsm_secret/d5fc363735dc945c877052ef2b7ebe383208afe1 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/d7d64e916ef78eb838273ae25a308aaf217980d8 b/tests/fuzz/corpora/fuzz-hsm_secret/d7d64e916ef78eb838273ae25a308aaf217980d8 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/d7d64e916ef78eb838273ae25a308aaf217980d8 rename to tests/fuzz/corpora/fuzz-hsm_secret/d7d64e916ef78eb838273ae25a308aaf217980d8 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/d9a56f6dabaf3b4cc0776f9ee65b1d64a69aa7e4 b/tests/fuzz/corpora/fuzz-hsm_secret/d9a56f6dabaf3b4cc0776f9ee65b1d64a69aa7e4 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/d9a56f6dabaf3b4cc0776f9ee65b1d64a69aa7e4 rename to tests/fuzz/corpora/fuzz-hsm_secret/d9a56f6dabaf3b4cc0776f9ee65b1d64a69aa7e4 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/da424c425994ded6390738b342cf7c853c6aa51f b/tests/fuzz/corpora/fuzz-hsm_secret/da424c425994ded6390738b342cf7c853c6aa51f similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/da424c425994ded6390738b342cf7c853c6aa51f rename to tests/fuzz/corpora/fuzz-hsm_secret/da424c425994ded6390738b342cf7c853c6aa51f diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/dd4c2e570f6c9506840c00001570479aff75fe09 b/tests/fuzz/corpora/fuzz-hsm_secret/dd4c2e570f6c9506840c00001570479aff75fe09 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/dd4c2e570f6c9506840c00001570479aff75fe09 rename to tests/fuzz/corpora/fuzz-hsm_secret/dd4c2e570f6c9506840c00001570479aff75fe09 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/de48b44d9fdbb12c895bc256198d61caf24eacbe b/tests/fuzz/corpora/fuzz-hsm_secret/de48b44d9fdbb12c895bc256198d61caf24eacbe similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/de48b44d9fdbb12c895bc256198d61caf24eacbe rename to tests/fuzz/corpora/fuzz-hsm_secret/de48b44d9fdbb12c895bc256198d61caf24eacbe diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/ded4d55b7202b767c7bd76edf6dfd6f15d2a7592 b/tests/fuzz/corpora/fuzz-hsm_secret/ded4d55b7202b767c7bd76edf6dfd6f15d2a7592 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/ded4d55b7202b767c7bd76edf6dfd6f15d2a7592 rename to tests/fuzz/corpora/fuzz-hsm_secret/ded4d55b7202b767c7bd76edf6dfd6f15d2a7592 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/df58248c414f342c81e056b40bee12d17a08bf61 b/tests/fuzz/corpora/fuzz-hsm_secret/df58248c414f342c81e056b40bee12d17a08bf61 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/df58248c414f342c81e056b40bee12d17a08bf61 rename to tests/fuzz/corpora/fuzz-hsm_secret/df58248c414f342c81e056b40bee12d17a08bf61 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/e31d31820dd73683cc2858c3fe3deb567b469c36 b/tests/fuzz/corpora/fuzz-hsm_secret/e31d31820dd73683cc2858c3fe3deb567b469c36 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/e31d31820dd73683cc2858c3fe3deb567b469c36 rename to tests/fuzz/corpora/fuzz-hsm_secret/e31d31820dd73683cc2858c3fe3deb567b469c36 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/e3a039a6cfc87ae1503145a859bd03ea0a675524 b/tests/fuzz/corpora/fuzz-hsm_secret/e3a039a6cfc87ae1503145a859bd03ea0a675524 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/e3a039a6cfc87ae1503145a859bd03ea0a675524 rename to tests/fuzz/corpora/fuzz-hsm_secret/e3a039a6cfc87ae1503145a859bd03ea0a675524 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/ead8514f2be42cdd84c9dd7aee05c3e378f9d8e8 b/tests/fuzz/corpora/fuzz-hsm_secret/ead8514f2be42cdd84c9dd7aee05c3e378f9d8e8 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/ead8514f2be42cdd84c9dd7aee05c3e378f9d8e8 rename to tests/fuzz/corpora/fuzz-hsm_secret/ead8514f2be42cdd84c9dd7aee05c3e378f9d8e8 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/eb408af63c99aa3224d25ff6c74990e56635d5ef b/tests/fuzz/corpora/fuzz-hsm_secret/eb408af63c99aa3224d25ff6c74990e56635d5ef similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/eb408af63c99aa3224d25ff6c74990e56635d5ef rename to tests/fuzz/corpora/fuzz-hsm_secret/eb408af63c99aa3224d25ff6c74990e56635d5ef diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/eb6a2e7996ecfbca0aad0988a7c36d11bf0884d2 b/tests/fuzz/corpora/fuzz-hsm_secret/eb6a2e7996ecfbca0aad0988a7c36d11bf0884d2 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/eb6a2e7996ecfbca0aad0988a7c36d11bf0884d2 rename to tests/fuzz/corpora/fuzz-hsm_secret/eb6a2e7996ecfbca0aad0988a7c36d11bf0884d2 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/ee129cbcf727b0afd5a7f3b79a4fa333417033d9 b/tests/fuzz/corpora/fuzz-hsm_secret/ee129cbcf727b0afd5a7f3b79a4fa333417033d9 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/ee129cbcf727b0afd5a7f3b79a4fa333417033d9 rename to tests/fuzz/corpora/fuzz-hsm_secret/ee129cbcf727b0afd5a7f3b79a4fa333417033d9 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/f0054c92049c5e3706f7c45082065e67f9ea8ea0 b/tests/fuzz/corpora/fuzz-hsm_secret/f0054c92049c5e3706f7c45082065e67f9ea8ea0 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/f0054c92049c5e3706f7c45082065e67f9ea8ea0 rename to tests/fuzz/corpora/fuzz-hsm_secret/f0054c92049c5e3706f7c45082065e67f9ea8ea0 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/f44634b586d683d6c27e5997fa674574683e267a b/tests/fuzz/corpora/fuzz-hsm_secret/f44634b586d683d6c27e5997fa674574683e267a similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/f44634b586d683d6c27e5997fa674574683e267a rename to tests/fuzz/corpora/fuzz-hsm_secret/f44634b586d683d6c27e5997fa674574683e267a diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/f4cb666c221192e9a9a2010e114ec8847f038051 b/tests/fuzz/corpora/fuzz-hsm_secret/f4cb666c221192e9a9a2010e114ec8847f038051 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/f4cb666c221192e9a9a2010e114ec8847f038051 rename to tests/fuzz/corpora/fuzz-hsm_secret/f4cb666c221192e9a9a2010e114ec8847f038051 diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/f98aef5540e4bcf21b7292adb1b9de01669d7e7b b/tests/fuzz/corpora/fuzz-hsm_secret/f98aef5540e4bcf21b7292adb1b9de01669d7e7b similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/f98aef5540e4bcf21b7292adb1b9de01669d7e7b rename to tests/fuzz/corpora/fuzz-hsm_secret/f98aef5540e4bcf21b7292adb1b9de01669d7e7b diff --git a/tests/fuzz/corpora/fuzz-hsm_encryption/fe7b328bfc4adc6daa6d5de3eba6273832803783 b/tests/fuzz/corpora/fuzz-hsm_secret/fe7b328bfc4adc6daa6d5de3eba6273832803783 similarity index 100% rename from tests/fuzz/corpora/fuzz-hsm_encryption/fe7b328bfc4adc6daa6d5de3eba6273832803783 rename to tests/fuzz/corpora/fuzz-hsm_secret/fe7b328bfc4adc6daa6d5de3eba6273832803783 diff --git a/tests/fuzz/fuzz-hsm_encryption.c b/tests/fuzz/fuzz-hsm_secret.c similarity index 58% rename from tests/fuzz/fuzz-hsm_encryption.c rename to tests/fuzz/fuzz-hsm_secret.c index 39f92fa7f252..8c5ccc8bf6c4 100644 --- a/tests/fuzz/fuzz-hsm_encryption.c +++ b/tests/fuzz/fuzz-hsm_secret.c @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -23,10 +23,11 @@ void run(const uint8_t *data, size_t size) /* 4294967295 is crypto_pwhash_argon2id_PASSWD_MAX. libfuzzer won't * generate inputs that large in practice, but hey. */ if (size > 32 && size < 4294967295) { - struct secret *hsm_secret, decrypted_hsm_secret, encryption_key; + struct secret *hsm_secret, *encryption_key; char *passphrase; - struct encrypted_hsm_secret encrypted_secret; - const char *emsg; + u8 encrypted_data[ENCRYPTED_HSM_SECRET_LEN]; + struct hsm_secret *decrypted_hsm; + enum hsm_secret_error err; /* Take the first 32 bytes as the plaintext hsm_secret seed, * and the remaining ones as the passphrase. */ @@ -34,17 +35,22 @@ void run(const uint8_t *data, size_t size) passphrase = to_string(NULL, data + 32, size - 32); /* A valid seed, a valid passphrase. This should not fail. */ - assert(!hsm_secret_encryption_key_with_exitcode(passphrase, &encryption_key, &emsg)); - /* Roundtrip */ - assert(encrypt_hsm_secret(&encryption_key, hsm_secret, - &encrypted_secret)); - assert(decrypt_hsm_secret(&encryption_key, &encrypted_secret, - &decrypted_hsm_secret)); + encryption_key = get_encryption_key(NULL, passphrase); + assert(encryption_key); + + /* Roundtrip: encrypt then decrypt */ + assert(encrypt_legacy_hsm_secret(encryption_key, hsm_secret, encrypted_data)); + decrypted_hsm = extract_hsm_secret(NULL, encrypted_data, ENCRYPTED_HSM_SECRET_LEN, + passphrase, &err); + assert(decrypted_hsm); + assert(err == HSM_SECRET_OK); + assert(decrypted_hsm->type == HSM_SECRET_ENCRYPTED); assert(memeq(hsm_secret->data, sizeof(hsm_secret->data), - decrypted_hsm_secret.data, - sizeof(decrypted_hsm_secret.data))); + decrypted_hsm->secret_data, sizeof(hsm_secret->data))); tal_free(hsm_secret); tal_free(passphrase); + tal_free(encryption_key); + tal_free(decrypted_hsm); } } diff --git a/tests/fuzz/libfuzz.c b/tests/fuzz/libfuzz.c index 78ee0064a20b..aada6f8ceee4 100644 --- a/tests/fuzz/libfuzz.c +++ b/tests/fuzz/libfuzz.c @@ -146,9 +146,9 @@ int main(int argc, char *argv[]) u8 *contents; if (streq(di->d_name, ".") || streq(di->d_name, "..")) continue; - contents = grab_file(tmpctx, di->d_name); + contents = grab_file_raw(tmpctx, di->d_name); assert(contents); - run(contents, tal_bytelen(contents)-1); + run(contents, tal_bytelen(contents)); } closedir(d); common_shutdown(); diff --git a/tests/test_misc.py b/tests/test_misc.py index a4d355b12b72..126bce4a7f60 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -562,12 +562,12 @@ def test_htlc_in_timeout(node_factory, bitcoind, executor): @unittest.skipIf(TEST_NETWORK == 'liquid-regtest', 'must be on bitcoin network') -def test_bech32_funding(node_factory, chainparams): +def test_p2tr_funding(node_factory, chainparams): # Don't get any funds from previous runs. l1, l2 = node_factory.line_graph(2, opts={'random_hsm': True}, fundchannel=False) - # fund a bech32 address and then open a channel with it - res = l1.openchannel(l2, 25000, 'bech32') + # fund a p2tr address and then open a channel with it + res = l1.openchannel(l2, 25000, 'p2tr') address = res['address'] assert address.startswith(chainparams['bip173_prefix']) @@ -577,14 +577,15 @@ def test_bech32_funding(node_factory, chainparams): wallettx = l1.bitcoin.rpc.getrawtransaction(wallettxid, True) fundingtx = l1.bitcoin.rpc.decoderawtransaction(res['fundingtx']) - def is_p2wpkh(output): - return output['type'] == 'witness_v0_keyhash' and \ + def is_p2tr(output): + return output['type'] == 'witness_v1_taproot' and \ address == scriptpubkey_addr(output) - assert any(is_p2wpkh(output['scriptPubKey']) for output in wallettx['vout']) + assert any(is_p2tr(output['scriptPubKey']) for output in wallettx['vout']) assert only_one(fundingtx['vin'])['txid'] == res['wallettxid'] +@unittest.skipIf(TEST_NETWORK == 'liquid-regtest', "P2TR not yet supported on Elements") def test_withdraw_misc(node_factory, bitcoind, chainparams): def dont_spend_outputs(n, txid): """Reserve both outputs (we assume there are two!) in case any our ours, so we don't spend change: wrecks accounting checks""" @@ -602,7 +603,7 @@ def dont_spend_outputs(n, txid): options={'plugin': coin_mvt_plugin}, feerates=(7500, 7500, 7500, 7500)) l2 = node_factory.get_node(random_hsm=True) - addr = l1.rpc.newaddr()['bech32'] + addr = l1.rpc.newaddr('p2tr')['p2tr'] # Add some funds to withdraw later for i in range(10): @@ -644,7 +645,7 @@ def dont_spend_outputs(n, txid): dont_spend_outputs(l1, out['txid']) # Now send some money to l2. - waddr = l2.rpc.newaddr('bech32')['bech32'] + waddr = l2.rpc.newaddr('p2tr')['p2tr'] out = l1.rpc.withdraw(waddr, amount) bitcoind.generate_block(1) @@ -732,7 +733,7 @@ def dont_spend_outputs(n, txid): l1.rpc.unreserveinputs(bitcoind.rpc.createpsbt(inputs, [])) # Test withdrawal to self. - l1.rpc.withdraw(l1.rpc.newaddr('bech32')['bech32'], 'all', minconf=0) + l1.rpc.withdraw(l1.rpc.newaddr('p2tr')['p2tr'], 'all', minconf=0) bitcoind.generate_block(1) assert l1.db_query('SELECT COUNT(*) as c FROM outputs WHERE status=0')[0]['c'] == 1 @@ -747,12 +748,13 @@ def dont_spend_outputs(n, txid): sync_blockheight(bitcoind, [l1]) assert account_balance(l1, 'wallet') == 0 + # randomHsm now uses p2tr addresses and have a different transaction weight than non-p2tr addresses external_moves = [ {'type': 'chain_mvt', 'credit_msat': 2000000000, 'debit_msat': 0, 'tags': ['deposit']}, {'type': 'chain_mvt', 'credit_msat': 2000000000, 'debit_msat': 0, 'tags': ['deposit']}, {'type': 'chain_mvt', 'credit_msat': 2000000000, 'debit_msat': 0, 'tags': ['deposit']}, {'type': 'chain_mvt', 'credit_msat': 2000000000, 'debit_msat': 0, 'tags': ['deposit']}, - {'type': 'chain_mvt', 'credit_msat': 11957393000, 'debit_msat': 0, 'tags': ['deposit']}, + {'type': 'chain_mvt', 'credit_msat': 11960055000, 'debit_msat': 0, 'tags': ['deposit']}, ] check_coin_moves(l1, 'external', external_moves, chainparams) @@ -1339,7 +1341,7 @@ def test_blockchaintrack(node_factory, bitcoind): """Check that we track the blockchain correctly across reorgs """ l1 = node_factory.get_node(random_hsm=True) - addr = l1.rpc.newaddr(addresstype='all')['bech32'] + addr = l1.rpc.newaddr(addresstype='all')['p2tr'] ###################################################################### # First failure scenario: rollback on startup doesn't work, diff --git a/tests/test_plugin.py b/tests/test_plugin.py index a9345140ea74..bc3e6c9178f5 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -12,6 +12,7 @@ check_coin_moves, first_channel_id, EXPERIMENTAL_DUAL_FUND, mine_funding_to_announce, VALGRIND, first_scid ) +from tests.test_wallet import HsmTool, write_all, WAIT_TIMEOUT import ast import json @@ -4375,28 +4376,95 @@ def test_exposesecret(node_factory): assert l1.rpc.exposesecret(passphrase='test_exposesecret') == {'codex32': 'cl10junxsd35kw6r5de5kueedxyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq6mdtn5lql6p8m', 'identifier': 'junx'} - # Test with encrypted-hsm (fails!) - password = 'test_exposesecret' - l1.stop() - # We need to simulate a terminal to use termios in `lightningd`. - master_fd, slave_fd = os.openpty() - def write_all(fd, bytestr): - """Wrapper, since os.write can do partial writes""" - off = 0 - while off < len(bytestr): - off += os.write(fd, bytestr[off:]) - - l1.daemon.opts.update({"encrypted-hsm": None}) - l1.daemon.start(stdin=slave_fd, wait_for_initialized=False) - l1.daemon.wait_for_log(r'Enter hsm_secret password') - write_all(master_fd, (password + '\n').encode("utf-8")) - l1.daemon.wait_for_log(r'Confirm hsm_secret password') - write_all(master_fd, (password + '\n').encode("utf-8")) +@unittest.skipIf(VALGRIND, "It does not play well with prompt and key derivation.") +def test_exposesecret_with_hsm_passphrase(node_factory): + """Test that exposesecret plugin correctly handles hsm-passphrase option""" + # Create a node with exposesecret-passphrase option + l1 = node_factory.get_node(options={ + 'exposesecret-passphrase': "test_exposesecret", + }, start=False) + + hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + if os.path.exists(hsm_path): + os.remove(hsm_path) + + # Generate hsm_secret with mnemonic and passphrase using hsmtool + mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" + hsm_passphrase = "test_hsm_passphrase" # Any passphrase, since we expect exposesecret to fail + expected_format = "mnemonic with passphrase" + + hsmtool = HsmTool(node_factory.directory, "generatehsm", hsm_path) + master_fd, slave_fd = os.openpty() + hsmtool.start(stdin=slave_fd) + hsmtool.wait_for_log(r"Introduce your BIP39 word list") + write_all(master_fd, f"{mnemonic}\n".encode("utf-8")) + hsmtool.wait_for_log(r"Enter your passphrase:") + write_all(master_fd, f"{hsm_passphrase}\n".encode("utf-8")) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + hsmtool.is_in_log(r"New hsm_secret file created") + hsmtool.is_in_log(f"Format: {expected_format}") + os.close(master_fd) + os.close(slave_fd) + + # Add --hsm-passphrase option to trigger interactive prompting + l1.daemon.opts["hsm-passphrase"] = None + + # Create a pty to handle the interactive passphrase prompt + master_fd2, slave_fd2 = os.openpty() + l1.daemon.start(stdin=slave_fd2, wait_for_initialized=False) + + # Wait for the passphrase prompt and provide it + l1.daemon.wait_for_log("Enter hsm_secret passphrase:") + print(f"DEBUG: About to send passphrase: '{hsm_passphrase}'") + passphrase_bytes = f"{hsm_passphrase}\n".encode("utf-8") + print(f"DEBUG: Passphrase bytes: {passphrase_bytes}") + write_all(master_fd2, passphrase_bytes) + print("DEBUG: Passphrase sent!") + + # Wait for the node to be ready l1.daemon.wait_for_log("Server started with public key") - with pytest.raises(RpcError, match="maybe encrypted"): - l1.rpc.exposesecret(passphrase=password) + os.close(master_fd2) + os.close(slave_fd2) + + # Test that exposesecret fails with mnemonic+passphrase format since it needs a passphrase + with pytest.raises(RpcError, match="Secret with passphrase is not supported"): + l1.rpc.exposesecret(passphrase="test_exposesecret") + + +@unittest.skipIf(VALGRIND, "It does not play well with prompt and key derivation.") +def test_exposesecret_with_mnemonic_no_passphrase(node_factory): + """Test that exposesecret plugin works correctly with mnemonic-based hsm_secret without passphrase""" + # Create a node with exposesecret-passphrase option + l1 = node_factory.get_node(options={ + 'exposesecret-passphrase': "test_exposesecret", + }, start=False) + hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + if os.path.exists(hsm_path): + os.remove(hsm_path) + + # Generate hsm_secret with mnemonic and no passphrase using hsmtool + mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" + hsmtool = HsmTool(node_factory.directory, "generatehsm", hsm_path) + master_fd, slave_fd = os.openpty() + hsmtool.start(stdin=slave_fd) + hsmtool.wait_for_log(r"Introduce your BIP39 word list") + write_all(master_fd, f"{mnemonic}\n".encode("utf-8")) + hsmtool.wait_for_log(r"Enter your passphrase:") + write_all(master_fd, "\n".encode("utf-8")) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + + # Start the daemon normally (no hsm-passphrase option needed for mnemonic without passphrase) + l1.start() + + # Test that exposesecret works correctly with mnemonic-based hsm_secret without passphrase + result = l1.rpc.exposesecret(passphrase="test_exposesecret") + assert result == { + 'codex32': 'cl10peevst6cqh0wu7p5ssjyf4z4ez42ks9jlt3zneju9uuypr2hddak6tlqsjhsks4laxts8q', + 'identifier': 'peev', + 'mnemonic': 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about' + } def test_peer_storage(node_factory, bitcoind): diff --git a/tests/test_wallet.py b/tests/test_wallet.py index b26679b1856c..42aaedc7224b 100644 --- a/tests/test_wallet.py +++ b/tests/test_wallet.py @@ -2,7 +2,6 @@ from decimal import Decimal from fixtures import * # noqa: F401,F403 from fixtures import TEST_NETWORK -from pathlib import Path from pyln.client import RpcError, Millisatoshi from utils import ( only_one, wait_for, sync_blockheight, @@ -14,7 +13,6 @@ import pytest import subprocess import sys -import time import unittest @@ -26,13 +24,20 @@ HSM_BAD_PASSWORD = 22 +def good_addrtype(): + """Elements doesn't support p2tr""" + if TEST_NETWORK == 'regtest': + return "p2tr" + return "bech32" + + @unittest.skipIf(TEST_NETWORK != 'regtest', "Test relies on a number of example addresses valid only in regtest") def test_withdraw(node_factory, bitcoind): amount = 1000000 # Don't get any funds from previous runs. l1 = node_factory.get_node(random_hsm=True, options={'log-level': 'io'}) l2 = node_factory.get_node(random_hsm=True) - addr = l1.rpc.newaddr()['bech32'] + addr = l1.rpc.newaddr('p2tr')['p2tr'] # Add some funds to withdraw later for i in range(10): @@ -82,8 +87,8 @@ def test_withdraw(node_factory, bitcoind): assert l1.db_query('SELECT COUNT(*) as c FROM outputs WHERE status=2')[0]['c'] == 2 # Now send some money to l2. - # lightningd uses P2SH-P2WPKH - waddr = l2.rpc.newaddr('bech32')['bech32'] + # BIP86 wallets use P2TR addresses + waddr = l2.rpc.newaddr('p2tr')['p2tr'] l1.rpc.withdraw(waddr, 2 * amount) # Now make sure an additional two of them were marked as reserved @@ -159,11 +164,11 @@ def test_withdraw(node_factory, bitcoind): with pytest.raises(RpcError): l1.rpc.withdraw('tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv', 2 * amount) - # Should have 6 outputs available. + # Should have 6 outputs available: 2 original unspent + 4 change outputs from withdrawals assert l1.db_query('SELECT COUNT(*) as c FROM outputs WHERE status=0')[0]['c'] == 6 # Test withdrawal to self. - l1.rpc.withdraw(l1.rpc.newaddr('bech32')['bech32'], 'all', minconf=0) + l1.rpc.withdraw(l1.rpc.newaddr('p2tr')['p2tr'], 'all', minconf=0) bitcoind.generate_block(1) assert l1.db_query('SELECT COUNT(*) as c FROM outputs WHERE status=0')[0]['c'] == 1 @@ -195,14 +200,14 @@ def test_withdraw(node_factory, bitcoind): assert utxo in vins # Try passing unconfirmed utxos - unconfirmed_utxos = [l1.rpc.withdraw(l1.rpc.newaddr()["bech32"], 10**5) + unconfirmed_utxos = [l1.rpc.withdraw(l1.rpc.newaddr("p2tr")["p2tr"], 10**5) for _ in range(5)] uutxos = [u["txid"] + ":0" for u in unconfirmed_utxos] l1.rpc.withdraw(waddr, "all", minconf=0, utxos=uutxos) # Try passing minimum feerates (for relay) - l1.rpc.withdraw(l1.rpc.newaddr()["bech32"], 10**5, feerate="253perkw") - l1.rpc.withdraw(l1.rpc.newaddr()["bech32"], 10**5, feerate="1000perkb") + l1.rpc.withdraw(l1.rpc.newaddr("p2tr")["p2tr"], 10**5, feerate="253perkw") + l1.rpc.withdraw(l1.rpc.newaddr("p2tr")["p2tr"], 10**5, feerate="1000perkb") def test_minconf_withdraw(node_factory, bitcoind): @@ -217,7 +222,7 @@ def test_minconf_withdraw(node_factory, bitcoind): amount = 1000000 # Don't get any funds from previous runs. l1 = node_factory.get_node(random_hsm=True) - addr = l1.rpc.newaddr()['bech32'] + addr = l1.rpc.newaddr(good_addrtype())[good_addrtype()] # Add some funds to withdraw later for i in range(10): @@ -233,6 +238,7 @@ def test_minconf_withdraw(node_factory, bitcoind): l1.rpc.withdraw(destination=addr, satoshi=10000, feerate='normal', minconf=9999999) +@unittest.skipIf(TEST_NETWORK == 'liquid-regtest', "BIP86 random_hsm not compatible with liquid-regtest bech32") def test_addfunds_from_block(node_factory, bitcoind): """Send funds to the daemon without telling it explicitly """ @@ -240,7 +246,7 @@ def test_addfunds_from_block(node_factory, bitcoind): coin_plugin = os.path.join(os.getcwd(), 'tests/plugins/coin_movements.py') l1 = node_factory.get_node(random_hsm=True, options={'plugin': coin_plugin}) - addr = l1.rpc.newaddr()['bech32'] + addr = l1.rpc.newaddr(good_addrtype())[good_addrtype()] bitcoind.rpc.sendtoaddress(addr, 0.1) bitcoind.generate_block(1) @@ -277,7 +283,7 @@ def test_txprepare_multi(node_factory, bitcoind): amount = 10000000 l1 = node_factory.get_node(random_hsm=True) - bitcoind.rpc.sendtoaddress(l1.rpc.newaddr()['bech32'], amount / 10**8) + bitcoind.rpc.sendtoaddress(l1.rpc.newaddr('all')[good_addrtype()], amount / 10**8) bitcoind.generate_block(1) wait_for(lambda: len(l1.rpc.listfunds()['outputs']) == 1) @@ -305,6 +311,7 @@ def feerate_from_psbt(chainparams, bitcoind, node, psbt): return fee / weight * 1000 +@unittest.skipIf(TEST_NETWORK == 'liquid-regtest', "BIP86 random_hsm not compatible with liquid-regtest bech32") def test_txprepare(node_factory, bitcoind, chainparams): amount = 1000000 l1 = node_factory.get_node(random_hsm=True, options={'dev-warn-on-overgrind': None}, @@ -313,7 +320,7 @@ def test_txprepare(node_factory, bitcoind, chainparams): # Add some funds to withdraw later for i in range(10): - bitcoind.rpc.sendtoaddress(l1.rpc.newaddr()['bech32'], + bitcoind.rpc.sendtoaddress(l1.rpc.newaddr(good_addrtype())[good_addrtype()], amount / 10**8) bitcoind.generate_block(1) @@ -1198,6 +1205,7 @@ def test_sign_and_send_psbt(node_factory, bitcoind, chainparams): check_coin_moves(l1, 'wallet', wallet_coin_mvts, chainparams) +@unittest.skipIf(TEST_NETWORK == 'liquid-regtest', "BIP86 random_hsm not compatible with liquid-regtest bech32") def test_txsend(node_factory, bitcoind, chainparams): amount = 1000000 l1 = node_factory.get_node(random_hsm=True) @@ -1205,7 +1213,7 @@ def test_txsend(node_factory, bitcoind, chainparams): # Add some funds to withdraw later for i in range(10): - bitcoind.rpc.sendtoaddress(l1.rpc.newaddr()['bech32'], + bitcoind.rpc.sendtoaddress(l1.rpc.newaddr(good_addrtype())[good_addrtype()], amount / 10**8) bitcoind.generate_block(1) wait_for(lambda: len(l1.rpc.listfunds()['outputs']) == 10) @@ -1247,60 +1255,6 @@ def write_all(fd, bytestr): off += os.write(fd, bytestr[off:]) -@unittest.skipIf(VALGRIND, "It does not play well with prompt and key derivation.") -def test_hsm_secret_encryption(node_factory): - l1 = node_factory.get_node(may_fail=True) # May fail when started without key - password = "reckful&é🍕\n" - # We need to simulate a terminal to use termios in `lightningd`. - master_fd, slave_fd = os.openpty() - - # Test we can encrypt an already-existing and not encrypted hsm_secret - l1.stop() - l1.daemon.opts.update({"encrypted-hsm": None}) - l1.daemon.start(stdin=slave_fd, wait_for_initialized=False) - l1.daemon.wait_for_log(r'Enter hsm_secret password') - write_all(master_fd, password.encode("utf-8")) - l1.daemon.wait_for_log(r'Confirm hsm_secret password') - write_all(master_fd, password.encode("utf-8")) - l1.daemon.wait_for_log("Server started with public key") - id = l1.rpc.getinfo()["id"] - l1.stop() - - # Test we cannot start the same wallet without specifying --encrypted-hsm - l1.daemon.opts.pop("encrypted-hsm") - with pytest.raises(subprocess.CalledProcessError, match=r'returned non-zero exit status {}'.format(HSM_ERROR_IS_ENCRYPT)): - subprocess.check_call(l1.daemon.cmd_line) - - # Test we cannot restore the same wallet with another password - l1.daemon.opts.update({"encrypted-hsm": None}) - l1.daemon.start(stdin=slave_fd, wait_for_initialized=False, stderr_redir=True) - l1.daemon.wait_for_log(r'Enter hsm_secret password') - write_all(master_fd, password[2:].encode("utf-8")) - assert(l1.daemon.proc.wait(WAIT_TIMEOUT) == HSM_BAD_PASSWORD) - assert(l1.daemon.is_in_stderr("Wrong password for encrypted hsm_secret.")) - - # Not sure why this helps, but seems to reduce flakiness where - # tail() thread in testing/utils.py gets 'ValueError: readline of - # closed file' and we get `ValueError: Process died while waiting for logs` - # when waiting for "Server started with public key" below. - time.sleep(10) - - # Test we can restore the same wallet with the same password - l1.daemon.start(stdin=slave_fd, wait_for_initialized=False) - l1.daemon.wait_for_log(r'The hsm_secret is encrypted') - write_all(master_fd, password.encode("utf-8")) - l1.daemon.wait_for_log("Server started with public key") - assert id == l1.rpc.getinfo()["id"] - l1.stop() - - # We can restore the same wallet with the same password provided through stdin - l1.daemon.start(stdin=subprocess.PIPE, wait_for_initialized=False) - l1.daemon.proc.stdin.write(password.encode("utf-8")) - l1.daemon.proc.stdin.flush() - l1.daemon.wait_for_log("Server started with public key") - assert id == l1.rpc.getinfo()["id"] - - class HsmTool(TailableProc): """Helper for testing the hsmtool as a subprocess""" def __init__(self, directory, *args): @@ -1312,47 +1266,23 @@ def __init__(self, directory, *args): @unittest.skipIf(VALGRIND, "It does not play well with prompt and key derivation.") def test_hsmtool_secret_decryption(node_factory): - l1 = node_factory.get_node() - password = "reckless123#{ù}\n" + """Test that we can encrypt and decrypt hsm_secret using hsmtool""" + l1 = node_factory.get_node(start=False) # Don't start the node + password = "test_password\n" hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") - # We need to simulate a terminal to use termios in `lightningd`. - master_fd, slave_fd = os.openpty() - - # Encrypt the master seed - l1.stop() - l1.daemon.opts.update({"encrypted-hsm": None}) - l1.daemon.start(stdin=slave_fd, wait_for_initialized=False) - l1.daemon.wait_for_log(r'Enter hsm_secret password') - write_all(master_fd, password.encode("utf-8")) - l1.daemon.wait_for_log(r'Confirm hsm_secret password') - write_all(master_fd, password.encode("utf-8")) - l1.daemon.wait_for_log("Server started with public key") - node_id = l1.rpc.getinfo()["id"] - l1.stop() - # We can't use a wrong password ! - master_fd, slave_fd = os.openpty() - hsmtool = HsmTool(node_factory.directory, "decrypt", hsm_path) - hsmtool.start(stdin=slave_fd) - hsmtool.wait_for_log(r"Enter hsm_secret password:") - write_all(master_fd, "A wrong pass\n\n".encode("utf-8")) - hsmtool.proc.wait(WAIT_TIMEOUT) - hsmtool.is_in_log(r"Wrong password") - - # Decrypt it with hsmtool - master_fd, slave_fd = os.openpty() - hsmtool.start(stdin=slave_fd) - hsmtool.wait_for_log(r"Enter hsm_secret password:") - write_all(master_fd, password.encode("utf-8")) - assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + # Write a known 32-byte key to hsm_secret + known_secret = b'\x01' * 32 # 32 bytes of 0x01 + with open(hsm_path, 'wb') as f: + f.write(known_secret) - # Then test we can now start it without password - l1.daemon.opts.pop("encrypted-hsm") - l1.daemon.start(stdin=slave_fd, wait_for_initialized=True) - assert node_id == l1.rpc.getinfo()["id"] - l1.stop() + # Read the hsm_secret to verify it's what we expect + with open(hsm_path, 'rb') as f: + content = f.read() + assert content == known_secret, f"Expected {known_secret}, got {content}" + assert len(content) == 32, f"Expected 32 bytes, got {len(content)}" - # Test we can encrypt it offline + # Encrypt it using hsmtool master_fd, slave_fd = os.openpty() hsmtool = HsmTool(node_factory.directory, "encrypt", hsm_path) hsmtool.start(stdin=slave_fd) @@ -1361,51 +1291,28 @@ def test_hsmtool_secret_decryption(node_factory): hsmtool.wait_for_log(r"Confirm hsm_secret password:") write_all(master_fd, password.encode("utf-8")) assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 - # Now we need to pass the encrypted-hsm startup option - l1.stop() - with pytest.raises(subprocess.CalledProcessError, match=r'returned non-zero exit status {}'.format(HSM_ERROR_IS_ENCRYPT)): - subprocess.check_call(l1.daemon.cmd_line) + hsmtool.is_in_log(r"Successfully encrypted") - l1.daemon.opts.update({"encrypted-hsm": None}) - master_fd, slave_fd = os.openpty() - l1.daemon.start(stdin=slave_fd, - wait_for_initialized=False) + # Read the hsm_secret again - it should now be encrypted (73 bytes) + with open(hsm_path, 'rb') as f: + encrypted_content = f.read() + assert len(encrypted_content) == 73, f"Expected 73 bytes after encryption, got {len(encrypted_content)}" + assert encrypted_content != known_secret, "File should be encrypted and different from original" - l1.daemon.wait_for_log(r'The hsm_secret is encrypted') - write_all(master_fd, password.encode("utf-8")) - l1.daemon.wait_for_log("Server started with public key") - print(node_id, l1.rpc.getinfo()["id"]) - assert node_id == l1.rpc.getinfo()["id"] - l1.stop() - - # And finally test that we can also decrypt if encrypted with hsmtool + # Decrypt it using hsmtool master_fd, slave_fd = os.openpty() hsmtool = HsmTool(node_factory.directory, "decrypt", hsm_path) hsmtool.start(stdin=slave_fd) hsmtool.wait_for_log(r"Enter hsm_secret password:") write_all(master_fd, password.encode("utf-8")) assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 - l1.daemon.opts.pop("encrypted-hsm") - l1.daemon.start(stdin=slave_fd, wait_for_initialized=True) - assert node_id == l1.rpc.getinfo()["id"] - - # We can roundtrip encryption and decryption using a password provided - # through stdin. - hsmtool = HsmTool(node_factory.directory, "encrypt", hsm_path) - hsmtool.start(stdin=subprocess.PIPE) - hsmtool.proc.stdin.write(password.encode("utf-8")) - hsmtool.proc.stdin.write(password.encode("utf-8")) - hsmtool.proc.stdin.flush() - hsmtool.wait_for_log("Successfully encrypted") - assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + hsmtool.is_in_log(r"Successfully decrypted") - master_fd, slave_fd = os.openpty() - hsmtool = HsmTool(node_factory.directory, "decrypt", hsm_path) - hsmtool.start(stdin=slave_fd) - hsmtool.wait_for_log("Enter hsm_secret password:") - write_all(master_fd, password.encode("utf-8")) - hsmtool.wait_for_log("Successfully decrypted") - assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + # Read the hsm_secret again - it should now be back to the original 32 bytes + with open(hsm_path, 'rb') as f: + decrypted_content = f.read() + assert decrypted_content == known_secret, f"Expected {known_secret}, got {decrypted_content}" + assert len(decrypted_content) == 32, f"Expected 32 bytes after decryption, got {len(decrypted_content)}" @unittest.skipIf(TEST_NETWORK == 'liquid-regtest', '') @@ -1447,100 +1354,686 @@ def test_hsmtool_dump_descriptors(node_factory, bitcoind): assert res["total_amount"] == Decimal('0.00001000') -def test_hsmtool_generatehsm(node_factory): +@pytest.mark.parametrize("mnemonic,passphrase,expected_format", [ + ("ritual idle hat sunny universe pluck key alpha wing cake have wedding", "test_passphrase", "mnemonic with passphrase"), + ("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", "", "mnemonic without passphrase"), +]) +def test_hsmtool_generatehsm_variants(node_factory, mnemonic, passphrase, expected_format): + """Test generating mnemonic-based hsm_secret with various configurations""" + # Only set hsm-passphrase option if there's actually a passphrase + node_options = {'hsm-passphrase': None} if passphrase else {} + l1 = node_factory.get_node(start=False, options=node_options) + hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + os.remove(hsm_path) # Remove the auto-generated one + + # Generate hsm_secret with mnemonic and passphrase + hsmtool = HsmTool(node_factory.directory, "generatehsm", hsm_path) + master_fd, slave_fd = os.openpty() + hsmtool.start(stdin=slave_fd) + hsmtool.wait_for_log(r"Introduce your BIP39 word list separated by space") + write_all(master_fd, f"{mnemonic}\n".encode("utf-8")) + hsmtool.wait_for_log(r"Enter your passphrase:") + write_all(master_fd, f"{passphrase}\n".encode("utf-8")) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + hsmtool.is_in_log(r"New hsm_secret file created") + hsmtool.is_in_log(f"Format: {expected_format}") + + # Verify file format + with open(hsm_path, 'rb') as f: + content = f.read() + if passphrase: + # First 32 bytes should NOT be zeros (has passphrase hash) + assert content[:32] != b'\x00' * 32 + assert mnemonic.encode('utf-8') in content[32:] + else: + # First 32 bytes should be zeros (no passphrase) + assert content[:32] == b'\x00' * 32 + # Rest should be the mnemonic + mnemonic_part = content[32:].decode('utf-8') + assert mnemonic in mnemonic_part + + # Verify Lightning node can use it + if passphrase: + # For passphrase case, start with hsm-passphrase option and handle prompt + master_fd, slave_fd = os.openpty() + l1.daemon.start(stdin=slave_fd, wait_for_initialized=False) + # Wait for the passphrase prompt + l1.daemon.wait_for_log("Enter hsm_secret passphrase:") + write_all(master_fd, f"{passphrase}\n".encode("utf-8")) + l1.daemon.wait_for_log("Server started with public key") + else: + # For no passphrase case, start normally without expecting a prompt + l1.daemon.start(wait_for_initialized=False) + l1.daemon.wait_for_log("Server started with public key") + + node_id = l1.rpc.getinfo()['id'] + print(f"Node ID for mnemonic '{mnemonic}' with passphrase '{passphrase}': {node_id}") + assert len(node_id) == 66 # Valid node ID + + # Expected node IDs for deterministic testing + expected_node_ids = { + ("ritual idle hat sunny universe pluck key alpha wing cake have wedding", "test_passphrase"): "039020371fb803cd4ce1e9a909b502d7b0a9e0f10cccc35c3e9be959c52d3ba6bd", + ("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", ""): "03653e90c1ce4660fd8505dd6d643356e93cfe202af109d382787639dd5890e87d", + } + + expected_id = expected_node_ids.get((mnemonic, passphrase)) + if expected_id: + assert node_id == expected_id, f"Expected node ID {expected_id}, got {node_id}" + else: + print(f"No expected node ID found for this combination, got: {node_id}") + + +@pytest.mark.parametrize("test_case", [ + pytest.param({ + "name": "with_passphrase", + "mnemonic": "ritual idle hat sunny universe pluck key alpha wing cake have wedding", + "passphrase": "secret_passphrase", + "check_passphrase": "secret_passphrase", + "check_mnemonic": "ritual idle hat sunny universe pluck key alpha wing cake have wedding", + "expected_exit": 0, + "expected_log": "OK" + }, id="correct_mnemonic_with_passphrase"), + pytest.param({ + "name": "no_passphrase", + "mnemonic": "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + "passphrase": "", + "check_passphrase": "", + "check_mnemonic": "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + "expected_exit": 0, + "expected_log": "OK" + }, id="correct_mnemonic_no_passphrase"), + pytest.param({ + "name": "wrong_passphrase", + "mnemonic": "ritual idle hat sunny universe pluck key alpha wing cake have wedding", + "passphrase": "correct_passphrase", + "check_passphrase": "wrong_passphrase", + "check_mnemonic": "ritual idle hat sunny universe pluck key alpha wing cake have wedding", + "expected_exit": 5, # ERROR_KEYDERIV + "expected_log": "resulting hsm_secret did not match" + }, id="wrong_passphrase_should_fail"), + pytest.param({ + "name": "wrong_mnemonic", + "mnemonic": "ritual idle hat sunny universe pluck key alpha wing cake have wedding", + "passphrase": "", + "check_passphrase": "", + "check_mnemonic": "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + "expected_exit": 5, # ERROR_KEYDERIV + "expected_log": "resulting hsm_secret did not match" + }, id="wrong_mnemonic_should_fail") +]) +def test_hsmtool_checkhsm_variants(node_factory, test_case): + """Test checkhsm with various configurations""" l1 = node_factory.get_node(start=False) - hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, - "hsm_secret") + hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + os.remove(hsm_path) + # Create hsm_secret with known mnemonic and passphrase hsmtool = HsmTool(node_factory.directory, "generatehsm", hsm_path) + master_fd, slave_fd = os.openpty() + hsmtool.start(stdin=slave_fd) + hsmtool.wait_for_log(r"Introduce your BIP39 word list separated by space") + write_all(master_fd, f"{test_case['mnemonic']}\n".encode("utf-8")) + hsmtool.wait_for_log(r"Enter your passphrase:") + write_all(master_fd, f"{test_case['passphrase']}\n".encode("utf-8")) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 - # You cannot re-generate an already existing hsm_secret + # Test checkhsm with credentials + hsmtool = HsmTool(node_factory.directory, "checkhsm", hsm_path) master_fd, slave_fd = os.openpty() hsmtool.start(stdin=slave_fd) - assert hsmtool.proc.wait(WAIT_TIMEOUT) == 2 + + # If the original had a passphrase, we need to unlock the file first + if test_case['passphrase']: + hsmtool.wait_for_log(r"Enter hsm_secret password:") # Decrypt file + write_all(master_fd, f"{test_case['passphrase']}\n".encode("utf-8")) + + hsmtool.wait_for_log(r"Enter your mnemonic passphrase:") # Backup verification + write_all(master_fd, f"{test_case['check_passphrase']}\n".encode("utf-8")) + hsmtool.wait_for_log(r"Introduce your BIP39 word list separated by space") + write_all(master_fd, f"{test_case['check_mnemonic']}\n".encode("utf-8")) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == test_case['expected_exit'] + hsmtool.is_in_log(test_case['expected_log']) + + +def test_hsmtool_checkhsm_legacy_encrypted_with_mnemonic_no_passphrase(node_factory): + """Test checkhsm with legacy encrypted hsm_secret containing mnemonic without passphrase""" + l1 = node_factory.get_node(start=False) + hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") os.remove(hsm_path) + seed_hex = "31bb58d1180831868fd5f562bb74659dca1e9673d034af635df53d677b9e5f03" + seed_bytes = bytes.fromhex(seed_hex) + + # Write the 32-byte seed directly to file (simulating old generatehsm output) + # Make sure we write exactly 32 bytes with no newline + assert len(seed_bytes) == 32, f"Seed should be exactly 32 bytes, got {len(seed_bytes)}" + with open(hsm_path, 'wb') as f: + f.write(seed_bytes) + + # Verify it's exactly 32 bytes + with open(hsm_path, 'rb') as f: + content = f.read() + print(content) + assert content == seed_bytes, "File content doesn't match expected seed" + + # Now encrypt it using the legacy encrypt command + encryption_password = "encryption_password" + hsmtool = HsmTool(node_factory.directory, "encrypt", hsm_path) + master_fd, slave_fd = os.openpty() + hsmtool.start(stdin=slave_fd) + hsmtool.wait_for_log(r"Enter hsm_secret password:") + write_all(master_fd, f"{encryption_password}\n".encode("utf-8")) + hsmtool.wait_for_log(r"Confirm hsm_secret password:") + write_all(master_fd, f"{encryption_password}\n".encode("utf-8")) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + hsmtool.is_in_log(r"Successfully encrypted") + + # Verify the file is now encrypted (73 bytes) + with open(hsm_path, 'rb') as f: + content = f.read() + assert len(content) == 73, f"Expected 73 bytes after encryption, got {len(content)}" - # We can generate a valid hsm_secret from a wordlist and a "passphrase" + # Test checkhsm - should prompt for encryption password first, then mnemonic passphrase + hsmtool = HsmTool(node_factory.directory, "checkhsm", hsm_path) master_fd, slave_fd = os.openpty() hsmtool.start(stdin=slave_fd) - hsmtool.wait_for_log(r"Select your language:") - write_all(master_fd, "0\n".encode("utf-8")) - hsmtool.wait_for_log(r"Introduce your BIP39 word list") - write_all(master_fd, "ritual idle hat sunny universe pluck key alpha wing " - "cake have wedding\n".encode("utf-8")) - hsmtool.wait_for_log(r"Enter your passphrase:") - write_all(master_fd, "This is actually not a passphrase\n".encode("utf-8")) - if hsmtool.proc.wait(WAIT_TIMEOUT) != 0: - hsmtool.logs_catchup() - print("hsmtool failure! Logs:") - for l in hsmtool.logs: - print(' ' + l) - assert False - hsmtool.is_in_log(r"New hsm_secret file created") + hsmtool.wait_for_log(r"Enter hsm_secret password:") # Encryption password + write_all(master_fd, f"{encryption_password}\n".encode("utf-8")) + hsmtool.wait_for_log(r"Enter your mnemonic passphrase:") # Mnemonic passphrase (empty) + write_all(master_fd, "\n".encode("utf-8")) # Empty passphrase + hsmtool.wait_for_log(r"Introduce your BIP39 word list separated by space") + write_all(master_fd, "blame expire peanut sell door zoo bundle motor truth outside artist siren\n".encode("utf-8")) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + hsmtool.is_in_log(r"OK") + + +def test_hsmtool_checkhsm_legacy_encrypted_with_mnemonic_passphrase(node_factory): + """Test checkhsm with legacy encrypted hsm_secret containing mnemonic with passphrase""" + l1 = node_factory.get_node(start=False) + hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + os.remove(hsm_path) + + # Directly write the 32-byte seed from mnemonic with passphrase + # Mnemonic: "blame expire peanut sell door zoo bundle motor truth outside artist siren" + # Passphrase: "passphrase" + # Expected BIP39 seed (first 32 bytes): 161d740bcfd3c5e2a1769159bee86868ab35e7544e83e825042a43b929ad950c + seed_hex = "161d740bcfd3c5e2a1769159bee86868ab35e7544e83e825042a43b929ad950c" + seed_bytes = bytes.fromhex(seed_hex) - # Check should pass. + # Write the 32-byte seed directly to file (simulating old generatehsm output) + with open(hsm_path, 'wb') as f: + f.write(seed_bytes) + + # Verify it's 32 bytes + with open(hsm_path, 'rb') as f: + content = f.read() + assert len(content) == 32, f"Expected 32 bytes, got {len(content)}" + + # Now encrypt it using the legacy encrypt command + encryption_password = "encryption_password" + hsmtool = HsmTool(node_factory.directory, "encrypt", hsm_path) + master_fd, slave_fd = os.openpty() + hsmtool.start(stdin=slave_fd) + hsmtool.wait_for_log(r"Enter hsm_secret password:") + write_all(master_fd, f"{encryption_password}\n".encode("utf-8")) + hsmtool.wait_for_log(r"Confirm hsm_secret password:") + write_all(master_fd, f"{encryption_password}\n".encode("utf-8")) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + hsmtool.is_in_log(r"Successfully encrypted") + + # Verify the file is now encrypted (73 bytes) + with open(hsm_path, 'rb') as f: + content = f.read() + assert len(content) == 73, f"Expected 73 bytes after encryption, got {len(content)}" + + # Test checkhsm - should prompt for encryption password first, then mnemonic passphrase hsmtool = HsmTool(node_factory.directory, "checkhsm", hsm_path) master_fd, slave_fd = os.openpty() hsmtool.start(stdin=slave_fd) - hsmtool.wait_for_log(r"Enter your passphrase:") - write_all(master_fd, "This is actually not a passphrase\n".encode("utf-8")) - hsmtool.wait_for_log(r"Select your language:") - write_all(master_fd, "0\n".encode("utf-8")) - hsmtool.wait_for_log(r"Introduce your BIP39 word list") - write_all(master_fd, "ritual idle hat sunny universe pluck key alpha wing " - "cake have wedding\n".encode("utf-8")) + hsmtool.wait_for_log(r"Enter hsm_secret password:") # Encryption password + write_all(master_fd, f"{encryption_password}\n".encode("utf-8")) + hsmtool.wait_for_log(r"Enter your mnemonic passphrase:") # Mnemonic passphrase + write_all(master_fd, "passphrase\n".encode("utf-8")) + hsmtool.wait_for_log(r"Introduce your BIP39 word list separated by space") + write_all(master_fd, "blame expire peanut sell door zoo bundle motor truth outside artist siren\n".encode("utf-8")) assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 hsmtool.is_in_log(r"OK") - # Wrong mnemonic will fail. + +def test_hsmtool_generatehsm_file_exists_error(node_factory): + """Test that generatehsm fails if file already exists""" + l1 = node_factory.get_node(start=False) + hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + + # File already exists from node creation + hsmtool = HsmTool(node_factory.directory, "generatehsm", hsm_path) + master_fd, slave_fd = os.openpty() + hsmtool.start(stdin=slave_fd) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 2 # ERROR_USAGE + hsmtool.is_in_log(r"hsm_secret file.*already exists") + + +def test_hsmtool_all_commands_work_with_mnemonic_formats(node_factory): + """Test that all hsmtool commands work with mnemonic formats""" + l1 = node_factory.get_node(start=False) + hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + os.remove(hsm_path) + + # Create a mnemonic-based hsm_secret (no passphrase for simplicity) + hsmtool = HsmTool(node_factory.directory, "generatehsm", hsm_path) master_fd, slave_fd = os.openpty() hsmtool.start(stdin=slave_fd) - hsmtool.wait_for_log(r"Enter your passphrase:") - write_all(master_fd, "This is actually not a passphrase\n".encode("utf-8")) - hsmtool.wait_for_log(r"Select your language:") - write_all(master_fd, "0\n".encode("utf-8")) hsmtool.wait_for_log(r"Introduce your BIP39 word list") write_all(master_fd, "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about\n".encode("utf-8")) - assert hsmtool.proc.wait(WAIT_TIMEOUT) == 5 - hsmtool.is_in_log(r"resulting hsm_secret did not match") + hsmtool.wait_for_log(r"Enter your passphrase:") + write_all(master_fd, "\n".encode("utf-8")) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + + # Test various commands work with mnemonic format + test_commands = [ + (["getnodeid", hsm_path], "03653e90c1ce4660fd8505dd6d643356e93cfe202af109d382787639dd5890e87d"), + (["getcodexsecret", hsm_path, "test"], "cl10testst6cqh0wu7p5ssjyf4z4ez42ks9jlt3zneju9uuypr2hddak6tlqsghuxusm6m6azq"), + (["makerune", hsm_path], "6VkrWMI2hm2a2UTkg-EyUrrBJN0RcuPB80I1pCVkTD89MA=="), + (["dumponchaindescriptors", hsm_path], "wpkh(xpub661MyMwAqRbcG9kjo3mdWQuSDbtdJzsd3K2mvifyeUMF3GhLcBAfELqjuxCvxUkYqQVe6rJ9SzmpipoUedb5MD79MJaLL8RME2A3J3Fw6Zd/0/0/*)#2jtshmk0\nsh(wpkh(xpub661MyMwAqRbcG9kjo3mdWQuSDbtdJzsd3K2mvifyeUMF3GhLcBAfELqjuxCvxUkYqQVe6rJ9SzmpipoUedb5MD79MJaLL8RME2A3J3Fw6Zd/0/0/*))#u6am4was\ntr(xpub661MyMwAqRbcG9kjo3mdWQuSDbtdJzsd3K2mvifyeUMF3GhLcBAfELqjuxCvxUkYqQVe6rJ9SzmpipoUedb5MD79MJaLL8RME2A3J3Fw6Zd/0/0/*)#v9hf4756"), + ] + + for cmd_args, expected_output in test_commands: + cmd_line = ["tools/hsmtool"] + cmd_args + out = subprocess.check_output(cmd_line).decode("utf8") + actual_output = out.strip() + assert actual_output == expected_output, f"Command {cmd_args[0]} output mismatch" + + +def test_hsmtool_deterministic_node_ids(node_factory): + """Test that HSM daemon creates deterministic node IDs in new mnemonic format""" + # Create a node and start it to trigger HSM daemon to create new format + l1 = node_factory.get_node(start=False) + hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + + # Delete any existing hsm_secret so HSM daemon creates it in new format + if os.path.exists(hsm_path): + os.remove(hsm_path) + + # Start the node to get its node ID (this will create a new hsm_secret in new format) + l1.start() + normal_node_id = l1.rpc.getinfo()['id'] + l1.stop() + + # Verify the hsm_secret was created in the new mnemonic format + with open(hsm_path, 'rb') as f: + content = f.read() + # Should be longer than 32 bytes (new format has 32-byte hash + mnemonic) + assert len(content) > 32, f"Expected new mnemonic format, got {len(content)} bytes" + + # First 32 bytes should be the passphrase hash (likely zeros for no passphrase) + passphrase_hash = content[:32] + assert passphrase_hash == b'\x00' * 32 + mnemonic_bytes = content[32:] - # Wrong passphrase will fail. + # Decode the mnemonic bytes + mnemonic = mnemonic_bytes.decode('utf-8').strip() + + # Verify it's a valid mnemonic (should be 12 words) + words = mnemonic.split() + assert len(words) == 12, f"Expected 12 words, got {len(words)}: {mnemonic}" + + # Create a second node and use generatehsm with the mnemonic from the first node + l2 = node_factory.get_node(start=False) + hsm_path2 = os.path.join(l2.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + + # Delete any existing hsm_secret for the second node + if os.path.exists(hsm_path2): + os.remove(hsm_path2) + + # Generate hsm_secret with the mnemonic from the first node + hsmtool = HsmTool(node_factory.directory, "generatehsm", hsm_path2) master_fd, slave_fd = os.openpty() hsmtool.start(stdin=slave_fd) + hsmtool.wait_for_log(r"Introduce your BIP39 word list") + write_all(master_fd, f"{mnemonic}\n".encode("utf-8")) hsmtool.wait_for_log(r"Enter your passphrase:") - write_all(master_fd, "This is actually not a passphrase \n".encode("utf-8")) - hsmtool.wait_for_log(r"Select your language:") - write_all(master_fd, "0\n".encode("utf-8")) + write_all(master_fd, "\n".encode("utf-8")) + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + + # Get the node ID from the generated hsm_secret + cmd_line = ["tools/hsmtool", "getnodeid", hsm_path2] + generated_node_id = subprocess.check_output(cmd_line).decode("utf8").strip() + + # Verify both node IDs are identical + assert normal_node_id == generated_node_id, f"Node IDs don't match: {normal_node_id} != {generated_node_id}" + + +def setup_bip86_node(node_factory, mnemonic="abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"): + """Helper function to set up a node with BIP86 support using a mnemonic-based HSM secret""" + l1 = node_factory.get_node(start=False) + + # Set up node with a mnemonic HSM secret + hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + if os.path.exists(hsm_path): + os.remove(hsm_path) + + # Generate hsm_secret with the specified mnemonic + hsmtool = HsmTool(node_factory.directory, "generatehsm", hsm_path) + master_fd, slave_fd = os.openpty() + hsmtool.start(stdin=slave_fd) hsmtool.wait_for_log(r"Introduce your BIP39 word list") - write_all(master_fd, "ritual idle hat sunny universe pluck key alpha wing " - "cake have wedding\n".encode("utf-8")) - assert hsmtool.proc.wait(WAIT_TIMEOUT) == 5 - hsmtool.is_in_log(r"resulting hsm_secret did not match") + write_all(master_fd, f"{mnemonic}\n".encode("utf-8")) + hsmtool.wait_for_log(r"Enter your passphrase:") + write_all(master_fd, "\n".encode("utf-8")) # No passphrase + assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 + os.close(master_fd) + os.close(slave_fd) - # We can start the node with this hsm_secret l1.start() - assert l1.info['id'] == '02244b73339edd004bc6dfbb953a87984c88e9e7c02ca14ef6ec593ca6be622ba7' - l1.stop() + return l1 + + +@unittest.skipIf(TEST_NETWORK != 'regtest', "BIP86 tests are regtest-specific") +def test_bip86_newaddr_rpc(node_factory, chainparams): + """Test that BIP86 addresses can be generated via newaddr RPC""" + l1 = setup_bip86_node(node_factory) + + # Test BIP86 address generation + bip86_addr = l1.rpc.newaddr(addresstype="p2tr") + assert 'p2tr' in bip86_addr + assert 'bech32' not in bip86_addr + + # Verify address format (taproot addresses are longer) + p2tr_addr = bip86_addr['p2tr'] + assert len(p2tr_addr) > 50 + + # In regtest, should start with bcrt1p (or appropriate prefix) + assert p2tr_addr.startswith('bcrt1p') + + # Test that we're using the correct 64-byte seed from the mnemonic + # Expected seed for "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about": + # "5eb00bbddcf069084889a8ab9155568165f5c453ccb85e70811aaed6f6da5fc19a5ac40b389cd370d086206dec8aa6c43daea6690f20ad3d8d48b2d2ce9e38e4" + + # Test that our BIP86 implementation follows the correct derivation path m/86'/0'/0'/0/index + # Generate the same address again and verify it's identical + bip86_addr2 = l1.rpc.newaddr(addresstype="p2tr") + p2tr_addr2 = bip86_addr2['p2tr'] + + # The second address should be different (next index) + assert p2tr_addr != p2tr_addr2, "Consecutive BIP86 addresses should be different" + + # Test against known test vectors for the exact derivation path + # The mainnet test vectors are: + # m/86'/0'/0'/0/0: bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr + # m/86'/0'/0'/0/1: bc1p4qhjn9zdvkux4e44uhx8tc55attvtyu358kutcqkudyccelu0was9fqzwh + # m/86'/0'/0'/0/2: bc1p0d0rhyynq0awa9m8cqrcr8f5nxqx3aw29w4ru5u9my3h0sfygnzs9khxz8 + + # For regtest, the addresses should be the same but with bcrt1p prefix + # Our addresses are for indices 1 and 2, so they should match the regtest versions + expected_regtest_addr_1 = "bcrt1p4qhjn9zdvkux4e44uhx8tc55attvtyu358kutcqkudyccelu0waslcutpz" # index 1 + expected_regtest_addr_2 = "bcrt1p0d0rhyynq0awa9m8cqrcr8f5nxqx3aw29w4ru5u9my3h0sfygnzsl8t0dj" # index 2 + + # Assert on the exact test vectors since we have the correct seed + assert p2tr_addr == expected_regtest_addr_1, f"First address should match test vector for index 1. Expected: {expected_regtest_addr_1}, Got: {p2tr_addr}" + assert p2tr_addr2 == expected_regtest_addr_2, f"Second address should match test vector for index 2. Expected: {expected_regtest_addr_2}, Got: {p2tr_addr2}" + + +@unittest.skipIf(TEST_NETWORK != 'regtest', "BIP86 tests are regtest-specific") +def test_bip86_listaddresses(node_factory, chainparams): + """Test that listaddresses includes BIP86 addresses and verifies first 10 addresses""" + l1 = setup_bip86_node(node_factory) + + # Expected addresses for the first 10 indices (m/86'/0'/0'/0/1 through m/86'/0'/0'/0/10) + # These are derived from the test mnemonic "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" + # Note: newaddr starts from index 1, not 0 + # Actual regtest addresses generated by the implementation + expected_addrs = [ + "bcrt1p4qhjn9zdvkux4e44uhx8tc55attvtyu358kutcqkudyccelu0waslcutpz", # index 1 + "bcrt1p0d0rhyynq0awa9m8cqrcr8f5nxqx3aw29w4ru5u9my3h0sfygnzsl8t0dj", # index 2 + "bcrt1py0vryk8aqusz65yzuudypggvswzkcpwtau8q0sjm0stctwup0xlqv86kkk", # index 3 + "bcrt1pjpp8nwqvhkx6kdna6vpujdqglvz2304twfd308ve5ppyxpmcjufsy8x0tk", # index 4 + "bcrt1pl4frjws098l3nslfjlnry6jxt46w694kuexvs5ar0cmkvxyahfkq42fumu", # index 5 + "bcrt1p5sxs429uz2s2yn6tt98sf67qwytwvffae4dqnzracq586cu0t6zsn63pre", # index 6 + "bcrt1pxsvy7ep2awd5x9lg90tgm4xre8wxcuj5cpgun8hmzwqnltqha8pqv84cl7", # index 7 + "bcrt1ptk8pqtszta5pv5tymccfqkezf3f2q39765q4fj8zcr79np6wmj6qeek4z3", # index 8 + "bcrt1p7pkeudt8wq7fc6nzj6yxkqmnrjg25fu4s9l777ca3w3qrxanjehq4tphz0", # index 9 + "bcrt1pzhnqyfvxe08zl0d9e592t62pwvp3l2xwhau5a8dsfjcker6xmjuqppvxka", # index 10 + ] - # We can do the entire thing non-interactive! - os.remove(hsm_path) - subprocess.check_output(["tools/hsmtool", - "generatehsm", hsm_path, - "en", - "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"]) - assert Path(hsm_path).read_bytes().hex() == "5eb00bbddcf069084889a8ab9155568165f5c453ccb85e70811aaed6f6da5fc1" + # Generate the first 10 BIP86 addresses and verify they match expected values + for i in range(10): + addr_result = l1.rpc.newaddr('p2tr') + assert addr_result['p2tr'] == expected_addrs[i] - # Including passphrase - os.remove(hsm_path) - subprocess.check_output(["tools/hsmtool", - "generatehsm", hsm_path, - "en", - "ritual idle hat sunny universe pluck key alpha wing cake have wedding", - "This is actually not a passphrase"]) + # Use listaddresses with start and limit parameters to verify the addresses were generated + addrs = l1.rpc.listaddresses(start=1, limit=10) + assert len(addrs['addresses']) == 10, f"Expected 10 addresses, got {len(addrs['addresses'])}" - l1.start() - assert l1.info['id'] == '02244b73339edd004bc6dfbb953a87984c88e9e7c02ca14ef6ec593ca6be622ba7' - l1.stop() + # Verify that listaddresses returns the correct addresses and key indices + for i, addr_info in enumerate(addrs['addresses']): + assert addr_info['keyidx'] == i + 1, f"Expected keyidx {i + 1}, got {addr_info['keyidx']}" + # BIP86 addresses should have a p2tr field with the correct address + assert 'p2tr' in addr_info, f"BIP86 address should have p2tr field, got: {addr_info}" + assert addr_info['p2tr'] == expected_addrs[i], f"Address mismatch at index {i + 1}: expected {expected_addrs[i]}, got {addr_info['p2tr']}" + # BIP86 addresses should NOT have a bech32 field (they're P2TR only) + assert 'bech32' not in addr_info, f"BIP86 address should not have bech32 field, got: {addr_info}" + + +@unittest.skipIf(TEST_NETWORK != 'regtest', "BIP86 tests are regtest-specific") +def test_bip86_deterministic_addresses(node_factory): + """Test that BIP86 addresses are deterministic and unique""" + # Create two nodes with the same mnemonic + mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" + + l1 = setup_bip86_node(node_factory, mnemonic) + l2 = setup_bip86_node(node_factory, mnemonic) + + # Generate addresses with the same index + addr1_0 = l1.rpc.newaddr('p2tr')['p2tr'] + addr2_0 = l2.rpc.newaddr('p2tr')['p2tr'] + + addr1_1 = l1.rpc.newaddr('p2tr')['p2tr'] + addr2_1 = l2.rpc.newaddr('p2tr')['p2tr'] + + # Addresses should be identical for the same index + assert addr1_0 == addr2_0, f"Addresses for index 0 don't match: {addr1_0} != {addr2_0}" + assert addr1_1 == addr2_1, f"Addresses for index 1 don't match: {addr1_1} != {addr2_1}" + + # Addresses should be different for different indices + assert addr1_0 != addr1_1, f"Addresses for different indices should be different" + + +@unittest.skipIf(TEST_NETWORK != 'regtest', "BIP86 tests are regtest-specific") +def test_bip86_vs_regular_p2tr(node_factory): + """Test that BIP86 addresses are different from regular P2TR addresses""" + l1 = setup_bip86_node(node_factory) + + # Generate addresses of both types + bip86_addr = l1.rpc.newaddr('p2tr')['p2tr'] + p2tr_addr = l1.rpc.newaddr('p2tr')['p2tr'] + + # They should be different + assert bip86_addr != p2tr_addr, "BIP86 and regular P2TR addresses should be different" + + # Both should be valid Taproot addresses (start with bcrt1p for regtest) + assert bip86_addr.startswith('bcrt1p') + assert p2tr_addr.startswith('bcrt1p') + + +@unittest.skipIf(TEST_NETWORK != 'regtest', "BIP86 tests are regtest-specific") +def test_bip86_full_bitcoin_integration(node_factory, bitcoind): + """Test full Bitcoin integration: generate addresses, receive funds, list outputs""" + l1 = setup_bip86_node(node_factory) + + # Generate a BIP86 address + bip86_addr = l1.rpc.newaddr('p2tr')['p2tr'] + + # Send funds to the BIP86 address + amount = 1000000 # 0.01 BTC + bitcoind.rpc.sendtoaddress(bip86_addr, amount / 10**8) + + # Mine a block to confirm the transaction + bitcoind.generate_block(1) + + # Wait for the node to see the transaction + wait_for(lambda: len(l1.rpc.listfunds()['outputs']) > 0) + + # Check that the funds are visible + funds = l1.rpc.listfunds() + bip86_outputs = [out for out in funds['outputs'] if out['address'] == bip86_addr] + + assert len(bip86_outputs) == 1, f"Expected 1 output, got {len(bip86_outputs)}" + assert bip86_outputs[0]['amount_msat'] == amount * 1000, f"Amount mismatch: {bip86_outputs[0]['amount_msat']} != {amount * 1000}" + assert bip86_outputs[0]['status'] == 'confirmed' + + # Test withdrawal from BIP86 address + # Use bitcoind to generate withdrawal address since this node only supports BIP86 + withdraw_addr = bitcoind.rpc.getnewaddress() + withdraw_amount = 500000 # 0.005 BTC + + l1.rpc.withdraw(withdraw_addr, withdraw_amount) + + # Mine another block + bitcoind.generate_block(1) + + # Check that the withdrawal worked + wait_for(lambda: len([out for out in l1.rpc.listfunds()['outputs'] if out['address'] == bip86_addr and out['status'] == 'confirmed']) == 0) + + +@unittest.skipIf(TEST_NETWORK != 'regtest', "BIP86 tests are regtest-specific") +def test_bip86_mnemonic_recovery(node_factory, bitcoind): + """Test that funds can be recovered using the same mnemonic in a new wallet""" + # Use a known mnemonic for predictable recovery + mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" + + # Create first node and fund it + l1 = setup_bip86_node(node_factory, mnemonic) + bip86_addr = l1.rpc.newaddr('p2tr')['p2tr'] + + # Send funds + amount = 1000000 # 0.01 BTC + bitcoind.rpc.sendtoaddress(bip86_addr, amount / 10**8) + bitcoind.generate_block(1) + + # Wait for funds to be visible + wait_for(lambda: len(l1.rpc.listfunds()['outputs']) > 0) + + # Create a second node with the same mnemonic + l2 = setup_bip86_node(node_factory, mnemonic) + + # Wait for it to sync and see the funds + wait_for(lambda: len(l2.rpc.listfunds()['outputs']) > 0) + + # Check that the second node can see the same funds + funds2 = l2.rpc.listfunds() + bip86_outputs2 = [out for out in funds2['outputs'] if out['address'] == bip86_addr] + + assert len(bip86_outputs2) == 1, f"Expected 1 output in recovered wallet, got {len(bip86_outputs2)}" + assert bip86_outputs2[0]['amount_msat'] == amount * 1000, f"Amount mismatch in recovered wallet: {bip86_outputs2[0]['amount_msat']} != {amount * 1000}" + + +@unittest.skipIf(TEST_NETWORK != 'regtest', "BIP86 tests are regtest-specific") +def test_bip86_index_boundaries(node_factory): + """Test BIP86 behavior at index boundaries""" + l1 = setup_bip86_node(node_factory) + + # Test that we can generate multiple addresses in sequence + # This tests the internal index management + addresses = [] + for i in range(5): + addr = l1.rpc.newaddr('p2tr')['p2tr'] + addresses.append(addr) + # Each address should be unique + assert addr not in addresses[:-1], f"Duplicate address generated: {addr}" + + # Test that addresses are deterministic - same node should generate same sequence + l2 = setup_bip86_node(node_factory) # Same mnemonic + + addresses2 = [] + for i in range(5): + addr = l2.rpc.newaddr('p2tr')['p2tr'] + addresses2.append(addr) + + # Should generate the same addresses in the same order + assert addresses == addresses2, "BIP86 addresses not deterministic across nodes with same mnemonic" + + # Test generating a large number of addresses to check for any overflow issues + # Generate 100 more addresses to test higher indices + for i in range(100): + addr = l1.rpc.newaddr('p2tr')['p2tr'] + assert addr.startswith('bcrt1p'), f"Invalid BIP86 address format: {addr}" + assert len(addr) > 50, f"BIP86 address too short: {addr}" + + +@unittest.skipIf(TEST_NETWORK != 'regtest', "BIP86 tests are regtest-specific") +def test_bip86_psbt_integration(node_factory, bitcoind, chainparams): + """Test BIP86 addresses in PSBT workflows""" + l1 = setup_bip86_node(node_factory) + + # Fund BIP86 address + bip86_addr = l1.rpc.newaddr('p2tr')['p2tr'] + amount_sats = 1000000 # 0.01 BTC + + # Send funds to the BIP86 address + bitcoind.rpc.sendtoaddress(bip86_addr, amount_sats / 10**8) + bitcoind.generate_block(1) + + # Wait for the node to see the transaction + wait_for(lambda: len(l1.rpc.listfunds()['outputs']) > 0) + + # Verify the funds are visible and confirmed + funds = l1.rpc.listfunds() + bip86_outputs = [out for out in funds['outputs'] if out['address'] == bip86_addr] + assert len(bip86_outputs) == 1, f"Expected 1 BIP86 output, got {len(bip86_outputs)}" + assert bip86_outputs[0]['amount_msat'] == amount_sats * 1000 + assert bip86_outputs[0]['status'] == 'confirmed' + + # Create PSBT with BIP86 input + dest_addr = bitcoind.rpc.getnewaddress() + send_amount = 500000 # 0.005 BTC + + # Use txprepare to create a PSBT + psbt_result = l1.rpc.txprepare([{dest_addr: send_amount}]) + psbt_str = psbt_result['psbt'] + + # Verify PSBT was created successfully + assert psbt_str is not None and len(psbt_str) > 0, "PSBT creation failed" + + # Sign the PSBT + signed_result = l1.rpc.signpsbt(psbt_str) + assert 'signed_psbt' in signed_result, "PSBT signing failed - no signed_psbt returned" + assert len(signed_result['signed_psbt']) > 0, "PSBT signing failed - empty signed_psbt" + + # Send the signed PSBT + send_result = l1.rpc.sendpsbt(signed_result['signed_psbt']) + sent_txid = send_result['txid'] + + # Mine the transaction + bitcoind.generate_block(1) + + # Wait for the transaction to be confirmed (blockheight > 0) + wait_for(lambda: len([tx for tx in l1.rpc.listtransactions()['transactions'] + if tx['hash'] == sent_txid and tx['blockheight'] > 0]) > 0) + + # Verify the transaction exists in the blockchain and is confirmed + transactions = l1.rpc.listtransactions()['transactions'] + sent_tx = [tx for tx in transactions if tx['hash'] == sent_txid][0] + assert sent_tx['blockheight'] > 0, "Transaction should be confirmed in a block" + + +@unittest.skipIf(TEST_NETWORK != 'regtest', "BIP86 tests are regtest-specific") +def test_bip86_address_type_validation(node_factory): + """Test address type validation for BIP86 addresses""" + l1 = setup_bip86_node(node_factory) + + # Test that 'p2tr' automatically uses BIP86 for mnemonic wallets + bip86_addr = l1.rpc.newaddr('p2tr')['p2tr'] + + # Test that we can list addresses + addrs = l1.rpc.listaddresses() + assert len(addrs['addresses']) >= 1, "No addresses found in listaddresses" + + # Verify the address structure + for addr in addrs['addresses']: + assert 'keyidx' in addr + assert isinstance(addr['keyidx'], int) + + # We can find our address right? + assert bip86_addr in [a.get('p2tr') for a in addrs['addresses']] # this test does a 'listtransactions' on a yet unconfirmed channel @@ -1744,23 +2237,29 @@ def test_withdraw_bech32m(node_factory, bitcoind): def test_p2tr_deposit_withdrawal(node_factory, bitcoind): # Don't get any funds from previous runs. - l1 = node_factory.get_node(random_hsm=True) + # Use BIP86 node to ensure consistent derivation for both P2TR and P2WPKH + l1 = setup_bip86_node(node_factory) # Can fetch p2tr addresses through 'all' or specifically deposit_addrs = [l1.rpc.newaddr('all')] * 3 withdrawal_addr = l1.rpc.newaddr('p2tr') - # Add some funds to withdraw - for addr_type in ['p2tr', 'bech32']: - for i in range(3): - l1.bitcoin.rpc.sendtoaddress(deposit_addrs[i][addr_type], 1) + # Add some funds to withdraw - only use P2TR to avoid derivation conflicts + for i in range(6): + if i < 3: + l1.bitcoin.rpc.sendtoaddress(deposit_addrs[i]['p2tr'], 1) + else: + # Create additional P2TR addresses for more inputs + addr = l1.rpc.newaddr('p2tr') + l1.bitcoin.rpc.sendtoaddress(addr['p2tr'], 1) bitcoind.generate_block(1) wait_for(lambda: len(l1.rpc.listfunds()['outputs']) == 6) - for i in range(3): - assert l1.rpc.listfunds()['outputs'][i]['address'] == deposit_addrs[i]['p2tr'] - assert l1.rpc.listfunds()['outputs'][i + 3]['address'] == deposit_addrs[i]['bech32'] + # Verify we have P2TR outputs + funds = l1.rpc.listfunds() + for output in funds['outputs']: + assert 'address' in output l1.rpc.withdraw(withdrawal_addr['p2tr'], 100000000 * 5) wait_for(lambda: len(bitcoind.rpc.getrawmempool()) == 1) raw_tx = bitcoind.rpc.getrawtransaction(bitcoind.rpc.getrawmempool()[0], 1) @@ -1778,6 +2277,70 @@ def test_p2tr_deposit_withdrawal(node_factory, bitcoind): # make sure tap derivation is embedded in PSBT output +@unittest.skipIf(TEST_NETWORK != 'regtest', "Elements-based schnorr is not yet supported") +def test_p2tr_deposit_withdrawal_with_bip86(node_factory, bitcoind): + """Test P2TR deposit and withdrawal with BIP86 derivation (default for mnemonic nodes)""" + + # Set up a node with BIP86 support (mnemonic-based HSM secret) + l1 = setup_bip86_node(node_factory) + + # Generate a BIP86 P2TR address for deposit + deposit_addr = l1.rpc.newaddr('p2tr') + + # Send some funds to the P2TR address (uses BIP86 for mnemonic wallets) + l1.bitcoin.rpc.sendtoaddress(deposit_addr['p2tr'], 1) + bitcoind.generate_block(1) + + # Wait for the deposit to be visible + wait_for(lambda: len(l1.rpc.listfunds()['outputs']) == 1) + + # Check that we have the deposit + funds = l1.rpc.listfunds() + assert len(funds['outputs']) == 1 + assert funds['outputs'][0]['amount_msat'] == 100000000000 # 1 BTC in msat + + # Generate another P2TR address for withdrawal (uses BIP86 for mnemonic wallets) + withdrawal_addr = l1.rpc.newaddr('p2tr') + + # Withdraw to the new P2TR address + l1.rpc.withdraw(withdrawal_addr['p2tr'], 50000000) # 0.5 BTC + wait_for(lambda: len(bitcoind.rpc.getrawmempool()) == 1) + + # Check the withdrawal transaction + raw_tx = bitcoind.rpc.getrawtransaction(bitcoind.rpc.getrawmempool()[0], 1) + assert len(raw_tx['vin']) == 1 # Should use our 1 BTC input + assert len(raw_tx['vout']) == 2 # Withdrawal output + change + + # Both outputs should be P2TR (BIP86) + for output in raw_tx['vout']: + assert output["scriptPubKey"]["type"] == "witness_v1_taproot" + + bitcoind.generate_block(1) + + # After withdrawal, we should have 2 outputs: the withdrawal destination + change + # Both belong to the same node since we withdrew to our own BIP86 address + wait_for(lambda: len(l1.rpc.listfunds()['outputs']) == 2) + funds = l1.rpc.listfunds() + + # Check that we have exactly the addresses we expect + fund_addresses = [output['address'] for output in funds['outputs']] + assert withdrawal_addr['p2tr'] in fund_addresses, f"Withdrawal address {withdrawal_addr['p2tr']} not found in {fund_addresses}" + + # Find the withdrawal and change outputs + withdrawal_output = next(output for output in funds['outputs'] if output['address'] == withdrawal_addr['p2tr']) + change_output = next(output for output in funds['outputs'] if output['address'] != withdrawal_addr['p2tr']) + + # Verify amounts + assert withdrawal_output['amount_msat'] == 50000000000 # Exactly 0.5 BTC + assert change_output['amount_msat'] < 50000000000 # Less than 0.5 BTC due to fees + assert change_output['amount_msat'] > 49000000000 # But more than 0.49 BTC + + # Verify total is close to original 1 BTC minus fees + total_amount = sum(output['amount_msat'] for output in funds['outputs']) + assert total_amount < 100000000000 # Less than 1 BTC due to fees + assert total_amount > 99000000000 # But more than 0.99 BTC + + @unittest.skipIf(TEST_NETWORK != 'regtest', "Address is network specific") def test_upgradewallet(node_factory, bitcoind): # Make sure bitcoind doesn't think it's going backwards @@ -1828,39 +2391,6 @@ def test_upgradewallet(node_factory, bitcoind): assert upgrade['upgraded_outs'] == 0 -def test_hsmtool_makerune(node_factory): - """Test we can make a valid rune before the node really exists""" - l1 = node_factory.get_node(start=False, options={ - 'allow-deprecated-apis': True, - }) - - # get_node() creates a secret, but in usual case we generate one. - hsm_path = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") - os.remove(hsm_path) - - hsmtool = HsmTool(node_factory.directory, "generatehsm", hsm_path) - master_fd, slave_fd = os.openpty() - hsmtool.start(stdin=slave_fd) - hsmtool.wait_for_log(r"Select your language:") - write_all(master_fd, "0\n".encode("utf-8")) - hsmtool.wait_for_log(r"Introduce your BIP39 word list") - write_all(master_fd, "ritual idle hat sunny universe pluck key alpha wing " - "cake have wedding\n".encode("utf-8")) - hsmtool.wait_for_log(r"Enter your passphrase:") - write_all(master_fd, "This is actually not a passphrase\n".encode("utf-8")) - assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0 - hsmtool.is_in_log(r"New hsm_secret file created") - - cmd_line = ["tools/hsmtool", "makerune", hsm_path] - out = subprocess.check_output(cmd_line).decode("utf8").split("\n")[0] - - l1.start() - - # We have to generate a rune now, for commando to even start processing! - rune = l1.rpc.createrune()['rune'] - assert rune == out - - def test_hsmtool_getnodeid(node_factory): l1 = node_factory.get_node() diff --git a/tools/check-bolt.c b/tools/check-bolt.c index 01e47cc16a05..95addc5915b9 100644 --- a/tools/check-bolt.c +++ b/tools/check-bolt.c @@ -74,9 +74,9 @@ static bool get_files(const char *dir, const char *subdir, bf.prefix = tal_strndup(*files, e->d_name, preflen); bf.contents - = canonicalize(grab_file(*files, - path_join(path, path, - e->d_name))); + = canonicalize(grab_file_str(*files, + path_join(path, path, + e->d_name))); tal_arr_expand(files, bf); } closedir(d); @@ -308,7 +308,7 @@ int main(int argc, char *argv[]) bolts = get_bolt_files(argv[1]); for (i = 2; i < argc; i++) { - char *f = grab_file(NULL, argv[i]), *p, *bolt; + char *f = grab_file_str(NULL, argv[i]), *p, *bolt; size_t len; if (!f) err(1, "Loading %s", argv[i]); diff --git a/tools/headerversions.c b/tools/headerversions.c index 15100bdef5f8..8cee70adf8e3 100644 --- a/tools/headerversions.c +++ b/tools/headerversions.c @@ -49,7 +49,7 @@ int main(int argc, char *argv[]) if (argc != 2) errx(1, "Usage: %s ", argv[0]); - file = grab_file(NULL, argv[1]); + file = grab_file_str(NULL, argv[1]); if (!file && errno != ENOENT) err(1, "Reading %s", argv[1]); diff --git a/tools/hsmtool.c b/tools/hsmtool.c index 1352bd807207..a3f487a10262 100644 --- a/tools/hsmtool.c +++ b/tools/hsmtool.c @@ -14,8 +14,9 @@ #include #include #include -#include +#include #include +#include #include #include #include @@ -33,19 +34,25 @@ #define ERROR_LANG_NOT_SUPPORTED 6 #define ERROR_TERM 7 +/* We don't implement leak detection, since we don't persist. */ +void *notleak_(void *ptr, bool plus_children) +{ + return ptr; +} + static void show_usage(const char *progname) { printf("%s [arguments]\n", progname); printf("methods:\n"); - printf(" - decrypt \n"); - printf(" - encrypt \n"); + printf(" - decrypt [LEGACY - binary format only]\n"); + printf(" - encrypt [LEGACY - binary format only]\n"); printf(" - dumpcommitments " - "\n"); + "\n"); printf(" - guesstoremote " - "\n"); + "\n"); + printf(" - generatehsm \n"); printf(" - derivetoremote [] " "\n"); - printf(" - generatehsm [ []]\n"); printf(" - checkhsm \n"); printf(" - dumponchaindescriptors [--show-secrets] [network]\n"); printf(" - makerune \n"); @@ -77,165 +84,71 @@ static bool ensure_hsm_secret_exists(int fd, const char *path) tal_free(config_dir); return true; } - -static void grab_hsm_file(const char *hsm_secret_path, - void *dst, size_t dstlen) +/* Load hsm_secret using the unified interface */ +static struct hsm_secret *load_hsm_secret(const tal_t *ctx, const char *hsm_secret_path) { - u8 *contents = grab_file(tmpctx, hsm_secret_path); - if (!contents) - errx(EXITCODE_ERROR_HSM_FILE, "Reading hsm_secret"); - - /* grab_file always appends a NUL char for convenience */ - if (tal_bytelen(contents) != dstlen + 1) - errx(EXITCODE_ERROR_HSM_FILE, - "hsm_secret invalid length %zu (expected %zu)", - tal_bytelen(contents)-1, dstlen); - memcpy(dst, contents, dstlen); -} - -static void get_unencrypted_hsm_secret(struct secret *hsm_secret, - const char *hsm_secret_path) -{ - grab_hsm_file(hsm_secret_path, hsm_secret, sizeof(*hsm_secret)); -} - -/* Derive the encryption key from the password provided, and try to decrypt - * the cipher. */ -static void get_encrypted_hsm_secret(struct secret *hsm_secret, - const char *hsm_secret_path, - const char *passwd) -{ - struct secret key; - struct encrypted_hsm_secret encrypted_secret; - const char *err; - int exit_code; - - grab_hsm_file(hsm_secret_path, - &encrypted_secret, sizeof(encrypted_secret)); + u8 *contents = grab_file_raw(tmpctx, hsm_secret_path); + const char *passphrase = NULL; + struct hsm_secret *hsms; + enum hsm_secret_error error; - exit_code = hsm_secret_encryption_key_with_exitcode(passwd, &key, &err); - if (exit_code > 0) - errx(exit_code, "%s", err); - if (!decrypt_hsm_secret(&key, &encrypted_secret, hsm_secret)) - errx(ERROR_LIBSODIUM, "Could not retrieve the seed. Wrong password ?"); -} - -/* Taken from hsmd. */ -static void get_channel_seed(struct secret *channel_seed, const struct node_id *peer_id, - u64 dbid, struct secret *hsm_secret) -{ - struct secret channel_base; - u8 input[sizeof(peer_id->k) + sizeof(dbid)]; - /*~ Again, "per-peer" should be "per-channel", but Hysterical Raisins */ - const char *info = "per-peer seed"; + if (!contents) + err(EXITCODE_ERROR_HSM_FILE, "Reading hsm_secret"); - /*~ We use the DER encoding of the pubkey, because it's platform - * independent. Since the dbid is unique, however, it's completely - * unnecessary, but again, existing users can't be broken. */ - /* FIXME: lnd has a nicer BIP32 method for deriving secrets which we - * should migrate to. */ - hkdf_sha256(&channel_base, sizeof(struct secret), NULL, 0, - hsm_secret, sizeof(*hsm_secret), - /*~ Initially, we didn't support multiple channels per - * peer at all: a channel had to be completely forgotten - * before another could exist. That was slightly relaxed, - * but the phrase "peer seed" is wired into the seed - * generation here, so we need to keep it that way for - * existing clients, rather than using "channel seed". */ - "peer seed", strlen("peer seed")); - memcpy(input, peer_id->k, sizeof(peer_id->k)); - BUILD_ASSERT(sizeof(peer_id->k) == PUBKEY_CMPR_LEN); - /*~ For all that talk about platform-independence, note that this - * field is endian-dependent! But let's face it, little-endian won. - * In related news, we don't support EBCDIC or middle-endian. */ - memcpy(input + PUBKEY_CMPR_LEN, &dbid, sizeof(dbid)); + /* Get passphrase if needed */ + if (hsm_secret_needs_passphrase(contents, tal_bytelen(contents))) { + printf("Enter hsm_secret password:\n"); + fflush(stdout); + passphrase = read_stdin_pass(tmpctx, &error); + if (!passphrase) + errx(EXITCODE_ERROR_HSM_FILE, "Could not read password: %s", hsm_secret_error_str(error)); + } - hkdf_sha256(channel_seed, sizeof(*channel_seed), - input, sizeof(input), - &channel_base, sizeof(channel_base), - info, strlen(info)); + hsms = extract_hsm_secret(ctx, contents, tal_bytelen(contents), passphrase, &error); + if (!hsms) { + err(EXITCODE_ERROR_HSM_FILE, "%s", hsm_secret_error_str(error)); + } + return hsms; } -/* We detect an encrypted hsm_secret as a hsm_secret which is 73-bytes long. */ -static bool hsm_secret_is_encrypted(const char *hsm_secret_path) +/* Legacy function - only works with binary encrypted format */ +static void decrypt_hsm(const char *hsm_secret_path) { - switch (is_hsm_secret_encrypted(hsm_secret_path)) { - case -1: - err(EXITCODE_ERROR_HSM_FILE, "Cannot open '%s'", hsm_secret_path); - case 1: - return true; - case 0: { - /* Extra sanity check on HSM file! */ - struct stat st; - stat(hsm_secret_path, &st); - if (st.st_size != 32) - errx(EXITCODE_ERROR_HSM_FILE, - "Invalid hsm_secret '%s' (neither plaintext " - "nor encrypted).", hsm_secret_path); - return false; - } - } + int fd; + struct hsm_secret *hsms; + const char *dir, *backup; - abort(); -} + /* Check if it's a format we can decrypt */ + u8 *contents = grab_file_raw(tmpctx, hsm_secret_path); + if (!contents) + err(EXITCODE_ERROR_HSM_FILE, "Reading hsm_secret"); -/* If encrypted, ask for a passphrase */ -static void get_hsm_secret(struct secret *hsm_secret, - const char *hsm_secret_path) -{ - /* This checks the file existence, too. */ - if (hsm_secret_is_encrypted(hsm_secret_path)) { - int exit_code; - char *passwd; - const char *err; + enum hsm_secret_type type = detect_hsm_secret_type(contents, tal_bytelen(contents)); - printf("Enter hsm_secret password:\n"); - fflush(stdout); - passwd = read_stdin_pass_with_exit_code(&err, &exit_code); - if (!passwd) - errx(exit_code, "%s", err); - get_encrypted_hsm_secret(hsm_secret, hsm_secret_path, passwd); - free(passwd); - } else { - get_unencrypted_hsm_secret(hsm_secret, hsm_secret_path); + if (type != HSM_SECRET_ENCRYPTED) { + errx(ERROR_USAGE, "decrypt command only works on legacy encrypted binary format (73 bytes).\n" + "Current file is: %s\n" + "For mnemonic formats, use the generatehsm command to create a new hsm_secret instead.", + format_type_name(type)); } -} -static int decrypt_hsm(const char *hsm_secret_path) -{ - int fd; - struct secret hsm_secret; - char *passwd; - const char *dir, *backup, *err; - int exit_code = 0; - /* This checks the file existence, too. */ - if (!hsm_secret_is_encrypted(hsm_secret_path)) - errx(ERROR_USAGE, "hsm_secret is not encrypted"); - printf("Enter hsm_secret password:\n"); - fflush(stdout); - passwd = read_stdin_pass_with_exit_code(&err, &exit_code); - if (!passwd) - errx(exit_code, "%s", err); + /* Load the hsm_secret */ + hsms = load_hsm_secret(tmpctx, hsm_secret_path); dir = path_dirname(NULL, hsm_secret_path); backup = path_join(dir, dir, "hsm_secret.backup"); - get_encrypted_hsm_secret(&hsm_secret, hsm_secret_path, passwd); - /* Once the encryption key derived, we don't need it anymore. */ - if (passwd) - free(passwd); - /* Create a backup file, "just in case". */ rename(hsm_secret_path, backup); fd = open(hsm_secret_path, O_CREAT|O_EXCL|O_WRONLY, 0400); if (fd < 0) - errx(EXITCODE_ERROR_HSM_FILE, "Could not open new hsm_secret"); + err(EXITCODE_ERROR_HSM_FILE, "Could not open new hsm_secret"); - if (!write_all(fd, &hsm_secret, sizeof(hsm_secret))) { + if (!write_all(fd, hsms->secret_data, tal_bytelen(hsms->secret_data))) { unlink_noerr(hsm_secret_path); close(fd); rename("hsm_secret.backup", hsm_secret_path); - errx(EXITCODE_ERROR_HSM_FILE, + err(EXITCODE_ERROR_HSM_FILE, "Failure writing plaintext seed to hsm_secret."); } @@ -250,102 +163,76 @@ static int decrypt_hsm(const char *hsm_secret_path) tal_free(dir); printf("Successfully decrypted hsm_secret, be careful now :-).\n"); - return 0; } -static int make_codexsecret(const char *hsm_secret_path, - const char *id) +/* Legacy function - only works with binary plain format */ +static void encrypt_hsm(const char *hsm_secret_path) { - struct secret hsm_secret; - char *bip93; - const char *err; - get_hsm_secret(&hsm_secret, hsm_secret_path); - - err = codex32_secret_encode(tmpctx, "cl", id, 0, hsm_secret.data, 32, &bip93); - if (err) - errx(ERROR_USAGE, "%s", err); + int fd; + struct hsm_secret *hsms; + u8 encrypted_hsm_secret[ENCRYPTED_HSM_SECRET_LEN]; + const char *passwd, *passwd_confirmation; + const char *dir, *backup; + enum hsm_secret_error pass_err; + + /* Check if it's a format we can encrypt */ + u8 *contents = grab_file_raw(tmpctx, hsm_secret_path); + if (!contents) + err(EXITCODE_ERROR_HSM_FILE, "Reading hsm_secret"); - printf("%s\n", bip93); - return 0; -} + enum hsm_secret_type type = detect_hsm_secret_type(contents, tal_bytelen(contents)); -static int getemergencyrecover(const char *emer_rec_path) -{ - u8 *scb = grab_file(tmpctx, emer_rec_path); - char *output, *hrp = "clnemerg"; - if (!scb) { - errx(EXITCODE_ERROR_HSM_FILE, "Reading emergency.recover"); - } else { - /* grab_file adds nul term */ - tal_resize(&scb, tal_bytelen(scb) - 1); + if (type != HSM_SECRET_PLAIN) { + errx(ERROR_USAGE, "encrypt command only works on legacy plain binary format (32 bytes).\n" + "Current file is: %s\n" + "For mnemonic formats, the passphrase is already integrated into the format.", + format_type_name(type)); } - u5 *data = tal_arr(tmpctx, u5, 0); - - bech32_push_bits(&data, scb, tal_bytelen(scb) * 8); - output = tal_arr(tmpctx, char, strlen(hrp) + tal_count(data) + 8); - bech32_encode(output, hrp, data, tal_count(data), (size_t)-1, - BECH32_ENCODING_BECH32); - - printf("%s\n", output); - return 0; -} - -static int encrypt_hsm(const char *hsm_secret_path) -{ - int fd; - struct secret key, hsm_secret; - struct encrypted_hsm_secret encrypted_hsm_secret; - char *passwd, *passwd_confirmation; - const char *err, *dir, *backup; - int exit_code = 0; - - /* This checks the file existence, too. */ - if (hsm_secret_is_encrypted(hsm_secret_path)) - errx(ERROR_USAGE, "hsm_secret is already encrypted"); + /* Load the hsm_secret */ + hsms = load_hsm_secret(tmpctx, hsm_secret_path); printf("Enter hsm_secret password:\n"); fflush(stdout); - passwd = read_stdin_pass_with_exit_code(&err, &exit_code); + passwd = read_stdin_pass(tmpctx, &pass_err); if (!passwd) - errx(exit_code, "%s", err); + errx(EXITCODE_ERROR_HSM_FILE, "Could not read password: %s", hsm_secret_error_str(pass_err)); + printf("Confirm hsm_secret password:\n"); fflush(stdout); - passwd_confirmation = read_stdin_pass_with_exit_code(&err, &exit_code); + passwd_confirmation = read_stdin_pass(tmpctx, &pass_err); if (!passwd_confirmation) - errx(exit_code, "%s", err); + errx(EXITCODE_ERROR_HSM_FILE, "Could not read password: %s", hsm_secret_error_str(pass_err)); + if (!streq(passwd, passwd_confirmation)) errx(ERROR_USAGE, "Passwords confirmation mismatch."); - get_unencrypted_hsm_secret(&hsm_secret, hsm_secret_path); dir = path_dirname(NULL, hsm_secret_path); backup = path_join(dir, dir, "hsm_secret.backup"); - /* Derive the encryption key from the password provided, and try to encrypt - * the seed. */ - exit_code = hsm_secret_encryption_key_with_exitcode(passwd, &key, &err); - if (exit_code > 0) - errx(exit_code, "%s", err); - if (!encrypt_hsm_secret(&key, &hsm_secret, &encrypted_hsm_secret)) - errx(ERROR_LIBSODIUM, "Could not encrypt the hsm_secret seed."); + /* Create encryption key and encrypt */ + struct secret *encryption_key = get_encryption_key(tmpctx, passwd); + if (!encryption_key) + errx(ERROR_LIBSODIUM, "Could not derive encryption key"); - /* Once the encryption key derived, we don't need it anymore. */ - free(passwd); - free(passwd_confirmation); + struct secret legacy_secret; + memcpy(legacy_secret.data, hsms->secret_data, 32); + if (!encrypt_legacy_hsm_secret(encryption_key, &legacy_secret, encrypted_hsm_secret)) + errx(ERROR_LIBSODIUM, "Could not encrypt the hsm_secret seed."); /* Create a backup file, "just in case". */ rename(hsm_secret_path, backup); fd = open(hsm_secret_path, O_CREAT|O_EXCL|O_WRONLY, 0400); if (fd < 0) - errx(EXITCODE_ERROR_HSM_FILE, "Could not open new hsm_secret"); + err(EXITCODE_ERROR_HSM_FILE, "Could not open new hsm_secret"); /* Write the encrypted hsm_secret. */ - if (!write_all(fd, encrypted_hsm_secret.data, - sizeof(encrypted_hsm_secret.data))) { + if (!write_all(fd, encrypted_hsm_secret, + ENCRYPTED_HSM_SECRET_LEN)) { unlink_noerr(hsm_secret_path); close(fd); rename(backup, hsm_secret_path); - errx(EXITCODE_ERROR_HSM_FILE, "Failure writing cipher to hsm_secret."); + err(EXITCODE_ERROR_HSM_FILE, "Failure writing cipher to hsm_secret."); } /* Be as paranoïd as in hsmd with the file state on disk. */ @@ -359,17 +246,72 @@ static int encrypt_hsm(const char *hsm_secret_path) printf("Successfully encrypted hsm_secret. You'll now have to pass the " "--encrypted-hsm startup option.\n"); - return 0; } -static int dump_commitments_infos(struct node_id *node_id, u64 channel_id, - u64 depth, char *hsm_secret_path) +/* Taken from hsmd. */ +static void get_channel_seed(struct secret *channel_seed, const struct node_id *peer_id, + u64 dbid, struct secret *hsm_secret) +{ + struct secret channel_base; + u8 input[sizeof(peer_id->k) + sizeof(dbid)]; + const char *info = "per-peer seed"; + + hkdf_sha256(&channel_base, sizeof(struct secret), NULL, 0, + hsm_secret, sizeof(*hsm_secret), + "peer seed", strlen("peer seed")); + memcpy(input, peer_id->k, sizeof(peer_id->k)); + BUILD_ASSERT(sizeof(peer_id->k) == PUBKEY_CMPR_LEN); + memcpy(input + PUBKEY_CMPR_LEN, &dbid, sizeof(dbid)); + + hkdf_sha256(channel_seed, sizeof(*channel_seed), + input, sizeof(input), + &channel_base, sizeof(channel_base), + info, strlen(info)); +} + +static void print_codexsecret(const char *hsm_secret_path, const char *id) +{ + struct secret hsm_secret; + char *bip93; + const char *err; + struct hsm_secret *hsms = load_hsm_secret(tmpctx, hsm_secret_path); + /* Extract first 32 bytes for legacy compatibility */ + memcpy(hsm_secret.data, hsms->secret_data, 32); + + err = codex32_secret_encode(tmpctx, "cl", id, 0, hsm_secret.data, 32, &bip93); + if (err) + errx(ERROR_USAGE, "%s", err); + + printf("%s\n", bip93); +} + +static void print_emergencyrecover(const char *emer_rec_path) +{ + u8 *scb = grab_file_raw(tmpctx, emer_rec_path); + char *output, *hrp = "clnemerg"; + if (!scb) { + err(EXITCODE_ERROR_HSM_FILE, "Reading emergency.recover"); + } + u5 *data = tal_arr(tmpctx, u5, 0); + + bech32_push_bits(&data, scb, tal_bytelen(scb) * 8); + output = tal_arr(tmpctx, char, strlen(hrp) + tal_count(data) + 8); + + bech32_encode(output, hrp, data, tal_count(data), (size_t)-1, + BECH32_ENCODING_BECH32); + + printf("%s\n", output); +} + +static void dump_commitments_infos(struct node_id *node_id, u64 channel_id, + u64 depth, char *hsm_secret_path) { struct sha256 shaseed; struct secret hsm_secret, channel_seed, per_commitment_secret; struct pubkey per_commitment_point; - - get_hsm_secret(&hsm_secret, hsm_secret_path); + struct hsm_secret *hsms = load_hsm_secret(tmpctx, hsm_secret_path); + /* Extract first 32 bytes for legacy compatibility */ + memcpy(hsm_secret.data, hsms->secret_data, 32); get_channel_seed(&channel_seed, node_id, channel_id, &hsm_secret); derive_shaseed(&channel_seed, &shaseed); @@ -385,35 +327,15 @@ static int dump_commitments_infos(struct node_id *node_id, u64 channel_id, printf("commit point #%"PRIu64": %s\n", i, fmt_pubkey(tmpctx, &per_commitment_point)); } - - return 0; } -/* In case of an unilateral close from the remote side while we suffered a - * loss of data, this tries to recover the private key from the `to_remote` - * output. - * This basically iterates over every `dbid` to derive the channel_seed and - * then derives the payment basepoint to compare to the pubkey hash specified - * in the witness programm. - * Note that since a node generates the key for the to_remote output from its - * *local* per_commitment_point, there is nothing we can do if - * `option_static_remotekey` was not negotiated. - * - * :param address: The bech32 address of the v0 P2WPKH witness programm - * :param node_id: The id of the node with which the channel was established - * :param tries: How many dbids to try. - * :param hsm_secret_path: The path to the hsm_secret - * :param passwd: The *optional* hsm_secret password - */ -static int guess_to_remote(const char *address, struct node_id *node_id, - u64 tries, char *hsm_secret_path) +static void guess_to_remote(const char *address, struct node_id *node_id, + u64 tries, char *hsm_secret_path) { struct secret hsm_secret, channel_seed, basepoint_secret; struct pubkey basepoint; struct ripemd160 pubkeyhash; - /* We only support P2WPKH, hence 20. */ u8 goal_pubkeyhash[20]; - /* See common/bech32.h for buffer size. */ char hrp[strlen(address) - 6]; int witver; size_t witlen; @@ -424,7 +346,8 @@ static int guess_to_remote(const char *address, struct node_id *node_id, if (segwit_addr_decode(&witver, goal_pubkeyhash, &witlen, hrp, address) != 1) errx(ERROR_USAGE, "Wrong bech32 address"); - get_hsm_secret(&hsm_secret, hsm_secret_path); + struct hsm_secret *hsms = load_hsm_secret(tmpctx, hsm_secret_path); + memcpy(hsm_secret.data, hsms->secret_data, 32); for (u64 dbid = 1; dbid < tries ; dbid++) { get_channel_seed(&channel_seed, node_id, dbid, &hsm_secret); @@ -438,188 +361,104 @@ static int guess_to_remote(const char *address, struct node_id *node_id, if (memcmp(pubkeyhash.u.u8, goal_pubkeyhash, 20) == 0) { printf("bech32 : %s\n", address); printf("pubkey hash : %s\n", - tal_hexstr(tmpctx, pubkeyhash.u.u8, 20)); + tal_hexstr(tmpctx, pubkeyhash.u.u8, 20)); printf("pubkey : %s \n", - fmt_pubkey(tmpctx, &basepoint)); + fmt_pubkey(tmpctx, &basepoint)); printf("privkey : %s \n", - fmt_secret(tmpctx, &basepoint_secret)); - return 0; + fmt_secret(tmpctx, &basepoint_secret)); + return; } } - printf("Could not find any basepoint matching the provided witness programm.\n" - "Are you sure that the channel used `option_static_remotekey` ?\n"); - return 1; -} - -static int derive_to_remote(const struct unilateral_close_info *info, const char *hsm_secret_path) -{ - struct secret hsm_secret, channel_seed, basepoint_secret; - struct pubkey basepoint; - struct privkey privkey; - - secp256k1_ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY - | SECP256K1_CONTEXT_SIGN); - - get_hsm_secret(&hsm_secret, hsm_secret_path); - get_channel_seed(&channel_seed, &info->peer_id, info->channel_id, &hsm_secret); - if (!derive_payment_basepoint(&channel_seed, &basepoint, &basepoint_secret)) - errx(ERROR_KEYDERIV, "Could not derive basepoints for dbid %"PRIu64 - " and channel seed %s.", info->channel_id, - fmt_secret(tmpctx, &channel_seed)); - if (!info->commitment_point) - privkey.secret = basepoint_secret; - else if (!derive_simple_privkey(&basepoint_secret, &basepoint, info->commitment_point, &privkey)) - errx(ERROR_KEYDERIV, "Could not derive simple privkey for dbid %"PRIu64 - ", channel seed %s, and commitment point %s.", info->channel_id, - fmt_secret(tmpctx, &channel_seed), - fmt_pubkey(tmpctx, info->commitment_point)); - printf("privkey : %s\n", fmt_secret(tmpctx, &privkey.secret)); - return 0; + errx(ERROR_USAGE, "Could not find any basepoint matching the provided witness programm.\n" + "Are you sure that the channel used `option_static_remotekey` ?"); } -struct wordlist_lang { - char *abbr; - char *name; -}; - -struct wordlist_lang languages[] = { - {"en", "English"}, - {"es", "Spanish"}, - {"fr", "French"}, - {"it", "Italian"}, - {"jp", "Japanese"}, - {"zhs", "Chinese Simplified"}, - {"zht", "Chinese Traditional"}, -}; - -static bool check_lang(const char *abbr) +static void generate_hsm(const char *hsm_secret_path) { - for (size_t i = 0; i < ARRAY_SIZE(languages); i++) { - if (streq(abbr, languages[i].abbr)) - return true; - } - return false; -} - -static void get_words(struct words **words) { + const char *mnemonic, *passphrase; + enum hsm_secret_error error; - printf("Select your language:\n"); - for (size_t i = 0; i < ARRAY_SIZE(languages); i++) { - printf(" %zu) %s (%s)\n", i, languages[i].name, languages[i].abbr); - } - printf("Select [0-%zu]: ", ARRAY_SIZE(languages)-1); - fflush(stdout); - - char *selected = NULL; - size_t size = 0; - size_t characters = getline(&selected, &size, stdin); - if (characters < 0) - errx(ERROR_USAGE, "Could not read line from stdin."); - - /* To distinguish success/failure after call */ - errno = 0; - char *endptr; - long val = strtol(selected, &endptr, 10); - if (errno == ERANGE || (errno != 0 && val == 0) || endptr == selected || val < 0 || val >= ARRAY_SIZE(languages)) - errx(ERROR_USAGE, "Invalid language selection, select one from the list [0-6]."); - - free(selected); - bip39_get_wordlist(languages[val].abbr, words); -} + /* Get mnemonic from user using consistent interface */ + mnemonic = read_stdin_mnemonic(tmpctx, &error); + if (!mnemonic) + errx(EXITCODE_ERROR_HSM_FILE, "Could not read mnemonic: %s", hsm_secret_error_str(error)); -static char *get_mnemonic(void) { - char *line = NULL; - size_t line_size = 0; - - printf("Introduce your BIP39 word list separated by space (at least 12 words):\n"); + /* Get optional passphrase */ + printf("Warning: remember that different passphrases yield different " + "bitcoin wallets.\n"); + printf("If left empty, no password is used (echo is disabled).\n"); + printf("Enter your passphrase: \n"); fflush(stdout); - size_t characters = getline(&line, &line_size, stdin); - if (characters < 0) - errx(ERROR_USAGE, "Could not read line from stdin."); - line[characters-1] = '\0'; - return line; -} - -static char *read_mnemonic(void) { - /* Get words for the mnemonic language */ - struct words *words; - get_words(&words); - - /* Get mnemonic */ - char *mnemonic; - mnemonic = get_mnemonic(); - - if (bip39_mnemonic_validate(words, mnemonic) != 0) { - errx(ERROR_USAGE, "Invalid mnemonic: \"%s\"", mnemonic); + passphrase = read_stdin_pass(tmpctx, &error); + if (!passphrase) + errx(EXITCODE_ERROR_HSM_FILE, "Could not read passphrase: %s", hsm_secret_error_str(error)); + if (streq(passphrase, "")) { + passphrase = NULL; } - return mnemonic; -} - -static int generate_hsm(const char *hsm_secret_path, - const char *lang_id, - char *mnemonic, - char *passphrase) -{ - const char *err; - int exit_code = 0; - - if (lang_id == NULL) { - mnemonic = read_mnemonic(); - printf("Warning: remember that different passphrases yield different " - "bitcoin wallets.\n"); - printf("If left empty, no password is used (echo is disabled).\n"); - printf("Enter your passphrase: \n"); - fflush(stdout); - passphrase = read_stdin_pass_with_exit_code(&err, &exit_code); - if (!passphrase) - errx(exit_code, "%s", err); - if (strlen(passphrase) == 0) { - free(passphrase); - passphrase = NULL; - } - } else { - struct words *words; - - bip39_get_wordlist(lang_id, &words); - if (bip39_mnemonic_validate(words, mnemonic) != 0) - errx(ERROR_USAGE, "Invalid mnemonic: \"%s\"", mnemonic); + /* Write to file using your new mnemonic format */ + int fd = open(hsm_secret_path, O_CREAT|O_EXCL|O_WRONLY, 0400); + if (fd < 0) { + err(ERROR_USAGE, "Unable to create hsm_secret file"); } - u8 bip32_seed[BIP39_SEED_LEN_512]; - size_t bip32_seed_len; + /* Hash the derived seed for validation */ + struct sha256 seed_hash; + if (!derive_seed_hash(mnemonic, passphrase, &seed_hash)) + errx(ERROR_USAGE, "Error deriving seed from mnemonic"); - if (bip39_mnemonic_to_seed(mnemonic, passphrase, bip32_seed, sizeof(bip32_seed), &bip32_seed_len) != WALLY_OK) - errx(ERROR_LIBWALLY, "Unable to derive BIP32 seed from BIP39 mnemonic"); + /* Write seed hash (32 bytes) + mnemonic */ + if (!write_all(fd, &seed_hash, sizeof(seed_hash))) + err(ERROR_USAGE, "Error writing seed hash to hsm_secret file"); - int fd = open(hsm_secret_path, O_CREAT|O_EXCL|O_WRONLY, 0400); - if (fd < 0) { - errx(ERROR_USAGE, "Unable to create hsm_secret file"); - } - /* Write only the first 32 bytes, length of the (plaintext) seed in the - * hsm_secret. */ - if (!write_all(fd, bip32_seed, 32)) - errx(ERROR_USAGE, "Error writing secret to hsm_secret file"); + /* Write the mnemonic */ + if (!write_all(fd, mnemonic, strlen(mnemonic))) + err(ERROR_USAGE, "Error writing mnemonic to hsm_secret file"); if (fsync(fd) != 0) - errx(ERROR_USAGE, "Error fsyncing hsm_secret file"); + err(ERROR_USAGE, "Error fsyncing hsm_secret file"); - /* This should never fail if fsync succeeded. But paranoia is good, and bugs exist */ if (close(fd) != 0) - errx(ERROR_USAGE, "Error closing hsm_secret file"); + err(ERROR_USAGE, "Error closing hsm_secret file"); printf("New hsm_secret file created at %s\n", hsm_secret_path); - printf("Use the `encrypt` command to encrypt the BIP32 seed if needed\n"); + printf("Format: %s\n", passphrase ? "mnemonic with passphrase" : "mnemonic without passphrase"); + if (passphrase) { + printf("Remember your passphrase - it's required to use this hsm_secret!\n"); + } - free(mnemonic); - free(passphrase); - return 0; + /* passphrase and mnemonic will be automatically cleaned up by tmpctx */ } -static int dumponchaindescriptors(const char *hsm_secret_path, - const char *old_passwd UNUSED, - const u32 version, bool show_secrets) +static void derive_to_remote(const struct unilateral_close_info *info, const char *hsm_secret_path) +{ + struct secret hsm_secret, channel_seed, basepoint_secret; + struct pubkey basepoint; + struct privkey privkey; + + secp256k1_ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY + | SECP256K1_CONTEXT_SIGN); + + struct hsm_secret *hsms = load_hsm_secret(tmpctx, hsm_secret_path); + /* Copy first 32 bytes of secret_data to the local secret struct */ + memcpy(hsm_secret.data, hsms->secret_data, sizeof(hsm_secret.data)); + get_channel_seed(&channel_seed, &info->peer_id, info->channel_id, &hsm_secret); + if (!derive_payment_basepoint(&channel_seed, &basepoint, &basepoint_secret)) + errx(ERROR_KEYDERIV, "Could not derive basepoints for dbid %"PRIu64 + " and channel seed %s.", info->channel_id, + fmt_secret(tmpctx, &channel_seed)); + if (!info->commitment_point) + privkey.secret = basepoint_secret; + else if (!derive_simple_privkey(&basepoint_secret, &basepoint, info->commitment_point, &privkey)) + errx(ERROR_KEYDERIV, "Could not derive simple privkey for dbid %"PRIu64 + ", channel seed %s, and commitment point %s.", info->channel_id, + fmt_secret(tmpctx, &channel_seed), + fmt_pubkey(tmpctx, info->commitment_point)); + printf("privkey : %s\n", fmt_secret(tmpctx, &privkey.secret)); +} +static void dumponchaindescriptors(const char *hsm_secret_path, + const u32 version, bool show_secrets) { struct secret hsm_secret; u8 bip32_seed[BIP32_ENTROPY_LEN_256]; @@ -627,10 +466,9 @@ static int dumponchaindescriptors(const char *hsm_secret_path, struct ext_key master_extkey; char *enc_xkey, *descriptor; struct descriptor_checksum checksum; - - get_hsm_secret(&hsm_secret, hsm_secret_path); - - /* We use m/0/0/k as the derivation tree for onchain funds. */ + struct hsm_secret *hsms = load_hsm_secret(tmpctx, hsm_secret_path); + /* Extract first 32 bytes for legacy compatibility */ + memcpy(hsm_secret.data, hsms->secret_data, 32); /* The root seed is derived from hsm_secret using hkdf.. */ do { @@ -675,57 +513,61 @@ static int dumponchaindescriptors(const char *hsm_secret_path, tal_free(descriptor); wally_free_string(enc_xkey); - - return 0; } -static int check_hsm(const char *hsm_secret_path) +/* Check HSM secret by comparing with backup mnemonic */ +static void check_hsm(const char *hsm_secret_path) { - char *mnemonic; - struct secret hsm_secret; + struct secret file_secret, derived_secret; u8 bip32_seed[BIP39_SEED_LEN_512]; size_t bip32_seed_len; - int exit_code; - char *passphrase; - const char *err; + const char *mnemonic_passphrase, *mnemonic; + enum hsm_secret_error err; - get_hsm_secret(&hsm_secret, hsm_secret_path); + /* Load the hsm_secret (handles decryption automatically if needed) */ + struct hsm_secret *hsms = load_hsm_secret(tmpctx, hsm_secret_path); + /* Extract first 32 bytes for legacy compatibility */ + memcpy(file_secret.data, hsms->secret_data, 32); + /* Ask user for their backup mnemonic passphrase */ printf("Warning: remember that different passphrases yield different " "bitcoin wallets.\n"); printf("If left empty, no password is used (echo is disabled).\n"); - printf("Enter your passphrase: \n"); + printf("Enter your mnemonic passphrase: \n"); fflush(stdout); - passphrase = read_stdin_pass_with_exit_code(&err, &exit_code); - if (!passphrase) - errx(exit_code, "%s", err); - if (strlen(passphrase) == 0) { - free(passphrase); - passphrase = NULL; + mnemonic_passphrase = read_stdin_pass(tmpctx, &err); + if (!mnemonic_passphrase) + errx(EXITCODE_ERROR_HSM_FILE, "Could not read passphrase: %s", hsm_secret_error_str(err)); + if (streq(mnemonic_passphrase, "")) { + mnemonic_passphrase = NULL; } - mnemonic = read_mnemonic(); - if (bip39_mnemonic_to_seed(mnemonic, passphrase, bip32_seed, sizeof(bip32_seed), &bip32_seed_len) != WALLY_OK) + /* Ask user for their backup mnemonic using consistent interface */ + mnemonic = read_stdin_mnemonic(tmpctx, &err); + if (!mnemonic) + errx(EXITCODE_ERROR_HSM_FILE, "Could not read mnemonic: %s", hsm_secret_error_str(err)); + + /* Derive seed from user's backup mnemonic + passphrase */ + if (bip39_mnemonic_to_seed(mnemonic, mnemonic_passphrase, bip32_seed, sizeof(bip32_seed), &bip32_seed_len) != WALLY_OK) errx(ERROR_LIBWALLY, "Unable to derive BIP32 seed from BIP39 mnemonic"); - /* We only use first 32 bytes */ - if (memcmp(bip32_seed, hsm_secret.data, sizeof(hsm_secret.data)) != 0) + /* Copy first 32 bytes to our secret for comparison */ + memcpy(derived_secret.data, bip32_seed, sizeof(derived_secret.data)); + + /* Compare the seeds */ + if (memcmp(derived_secret.data, file_secret.data, sizeof(file_secret.data)) != 0) errx(ERROR_KEYDERIV, "resulting hsm_secret did not match"); printf("OK\n"); - - free(mnemonic); - free(passphrase); - return 0; } -static int make_rune(const char *hsm_secret_path) +static void make_rune(const char *hsm_secret_path) { struct secret hsm_secret, derived_secret, rune_secret; struct rune *master_rune, *rune; - - /* Get hsm_secret */ - get_hsm_secret(&hsm_secret, hsm_secret_path); + struct hsm_secret *hsms = load_hsm_secret(tmpctx, hsm_secret_path); + /* Extract first 32 bytes for legacy compatibility */ + memcpy(hsm_secret.data, hsms->secret_data, 32); /* HSM derives a root secret for `makesecret` */ hkdf_sha256(&derived_secret, sizeof(struct secret), NULL, 0, @@ -743,18 +585,17 @@ static int make_rune(const char *hsm_secret_path) NULL); rune = rune_derive_start(tmpctx, master_rune, "0"); printf("%s\n", rune_to_base64(tmpctx, rune)); - return 0; } -static int get_node_id(const char *hsm_secret_path) +static void print_node_id(const char *hsm_secret_path) { u32 salt = 0; struct secret hsm_secret; struct privkey node_privkey; struct pubkey node_id; - - /* Get hsm_secret */ - get_hsm_secret(&hsm_secret, hsm_secret_path); + struct hsm_secret *hsms = load_hsm_secret(tmpctx, hsm_secret_path); + /* Extract first 32 bytes for legacy compatibility */ + memcpy(hsm_secret.data, hsms->secret_data, 32); /*~ So, there is apparently a 1 in 2^127 chance that a random value is * not a valid private key, so this never actually loops. */ @@ -772,7 +613,6 @@ static int get_node_id(const char *hsm_secret_path) node_privkey.secret.data)); printf("%s\n", fmt_pubkey(tmpctx, &node_id)); - return 0; } int main(int argc, char *argv[]) @@ -791,38 +631,33 @@ int main(int argc, char *argv[]) if (streq(method, "decrypt")) { if (argc < 3) show_usage(argv[0]); - return decrypt_hsm(argv[2]); - } - - if (streq(method, "encrypt")) { + decrypt_hsm(argv[2]); + } else if (streq(method, "encrypt")) { if (argc < 3) show_usage(argv[0]); - return encrypt_hsm(argv[2]); - } + encrypt_hsm(argv[2]); - if (streq(method, "dumpcommitments")) { + } else if (streq(method, "dumpcommitments")) { /* node_id channel_id depth hsm_secret */ if (argc < 6) show_usage(argv[0]); struct node_id node_id; if (!node_id_from_hexstr(argv[2], strlen(argv[2]), &node_id)) errx(ERROR_USAGE, "Bad node id"); - return dump_commitments_infos(&node_id, atol(argv[3]), atol(argv[4]), - argv[5]); - } + dump_commitments_infos(&node_id, atol(argv[3]), atol(argv[4]), + argv[5]); - if (streq(method, "guesstoremote")) { + } else if (streq(method, "guesstoremote")) { /* address node_id depth hsm_secret */ if (argc < 6) show_usage(argv[0]); struct node_id node_id; if (!node_id_from_hexstr(argv[3], strlen(argv[3]), &node_id)) errx(ERROR_USAGE, "Bad node id"); - return guess_to_remote(argv[2], &node_id, atol(argv[4]), - argv[5]); - } + guess_to_remote(argv[2], &node_id, atol(argv[4]), + argv[5]); - if (streq(method, "derivetoremote")) { + } else if (streq(method, "derivetoremote")) { /* node_id channel_id [commitment_point] hsm_secret */ if (argc < 5 || argc > 6) show_usage(argv[0]); @@ -836,16 +671,13 @@ int main(int argc, char *argv[]) errx(ERROR_USAGE, "Bad commitment point"); info.commitment_point = &commitment_point; } - return derive_to_remote(&info, argv[argc - 1]); - } + derive_to_remote(&info, argv[argc - 1]); - if (streq(method, "generatehsm")) { - // argv[2] file, argv[3] lang_id, argv[4] word list, argv[5] passphrase - if (argc < 3 || argc > 6 || argc == 4) + } else if (streq(method, "generatehsm")) { + if (argc != 3) show_usage(argv[0]); char *hsm_secret_path = argv[2]; - char *lang_id, *word_list, *passphrase; /* if hsm_secret already exists we abort the process * we do not want to lose someone else's funds */ @@ -853,18 +685,8 @@ int main(int argc, char *argv[]) if (stat(hsm_secret_path, &st) == 0) errx(ERROR_USAGE, "hsm_secret file at %s already exists", hsm_secret_path); - lang_id = (argc > 3 ? argv[3] : NULL); - if (lang_id && !check_lang(lang_id)) - show_usage(argv[0]); - - /* generate_hsm expects to free these, so use strdup */ - word_list = (argc > 4 ? strdup(argv[4]) : NULL); - passphrase = (argc > 5 ? strdup(argv[5]) : NULL); - - return generate_hsm(hsm_secret_path, lang_id, word_list, passphrase); - } - - if (streq(method, "dumponchaindescriptors")) { + generate_hsm(hsm_secret_path); + } else if (streq(method, "dumponchaindescriptors")) { char *fname = NULL; char *net = NULL; bool show_secrets = false; @@ -914,38 +736,30 @@ int main(int argc, char *argv[]) else version = BIP32_VER_MAIN_PRIVATE; - return dumponchaindescriptors(fname, NULL, version, show_secrets); - } - - if (streq(method, "checkhsm")) { + dumponchaindescriptors(fname, version, show_secrets); + } else if (streq(method, "checkhsm")) { if (argc < 3) show_usage(argv[0]); - return check_hsm(argv[2]); - } - - if (streq(method, "makerune")) { + check_hsm(argv[2]); + } else if (streq(method, "makerune")) { if (argc < 3) show_usage(argv[0]); - return make_rune(argv[2]); - } - - if(streq(method, "getcodexsecret")) { + make_rune(argv[2]); + } else if(streq(method, "getcodexsecret")) { if (argc < 4) show_usage(argv[0]); - return make_codexsecret(argv[2], argv[3]); - } - - if(streq(method, "getemergencyrecover")) { + print_codexsecret(argv[2], argv[3]); + } else if(streq(method, "getemergencyrecover")) { if (argc < 3) show_usage(argv[0]); - return getemergencyrecover(argv[2]); - } - - if (streq(method, "getnodeid")) { + print_emergencyrecover(argv[2]); + } else if (streq(method, "getnodeid")) { if (argc < 3) show_usage(argv[0]); - return get_node_id(argv[2]); + print_node_id(argv[2]); + } else { + show_usage(argv[0]); } - show_usage(argv[0]); + return 0; } diff --git a/wallet/test/run-chain_moves_duplicate-detect.c b/wallet/test/run-chain_moves_duplicate-detect.c index 3a7134f797ad..69f09785ff97 100644 --- a/wallet/test/run-chain_moves_duplicate-detect.c +++ b/wallet/test/run-chain_moves_duplicate-detect.c @@ -28,6 +28,9 @@ static void db_log_(struct logger *log UNUSED, enum log_level level UNUSED, cons /* Generated stub for bip32_pubkey */ void bip32_pubkey(struct lightningd *ld UNNEEDED, struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) { fprintf(stderr, "bip32_pubkey called!\n"); abort(); } +/* Generated stub for bip86_pubkey */ +void bip86_pubkey(struct lightningd *ld UNNEEDED, struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) +{ fprintf(stderr, "bip86_pubkey called!\n"); abort(); } /* Generated stub for bitcoind_getrawblockbyheight_ */ void bitcoind_getrawblockbyheight_(const tal_t *ctx UNNEEDED, struct bitcoind *bitcoind UNNEEDED, diff --git a/wallet/test/run-db.c b/wallet/test/run-db.c index 1c71c42699e9..3c2b9340fe89 100644 --- a/wallet/test/run-db.c +++ b/wallet/test/run-db.c @@ -25,6 +25,9 @@ static void db_log_(struct logger *log UNUSED, enum log_level level UNUSED, cons /* Generated stub for bip32_pubkey */ void bip32_pubkey(struct lightningd *ld UNNEEDED, struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) { fprintf(stderr, "bip32_pubkey called!\n"); abort(); } +/* Generated stub for bip86_pubkey */ +void bip86_pubkey(struct lightningd *ld UNNEEDED, struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) +{ fprintf(stderr, "bip86_pubkey called!\n"); abort(); } /* Generated stub for bitcoind_getrawblockbyheight_ */ void bitcoind_getrawblockbyheight_(const tal_t *ctx UNNEEDED, struct bitcoind *bitcoind UNNEEDED, diff --git a/wallet/test/run-migrate_remove_chain_moves_duplicates.c b/wallet/test/run-migrate_remove_chain_moves_duplicates.c index 62b4606308bc..276cccbf74de 100644 --- a/wallet/test/run-migrate_remove_chain_moves_duplicates.c +++ b/wallet/test/run-migrate_remove_chain_moves_duplicates.c @@ -29,6 +29,9 @@ static void db_log_(struct logger *log UNUSED, enum log_level level UNUSED, cons /* Generated stub for bip32_pubkey */ void bip32_pubkey(struct lightningd *ld UNNEEDED, struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) { fprintf(stderr, "bip32_pubkey called!\n"); abort(); } +/* Generated stub for bip86_pubkey */ +void bip86_pubkey(struct lightningd *ld UNNEEDED, struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) +{ fprintf(stderr, "bip86_pubkey called!\n"); abort(); } /* Generated stub for bitcoind_getrawblockbyheight_ */ void bitcoind_getrawblockbyheight_(const tal_t *ctx UNNEEDED, struct bitcoind *bitcoind UNNEEDED, diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index 6371dfb263db..945d81243ca3 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -305,6 +305,9 @@ bool fromwire_dualopend_dev_memleak_reply(const void *p UNNEEDED, bool *leak UNN /* Generated stub for fromwire_gossipd_addgossip_reply */ bool fromwire_gossipd_addgossip_reply(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, wirestring **err UNNEEDED) { fprintf(stderr, "fromwire_gossipd_addgossip_reply called!\n"); abort(); } +/* Generated stub for fromwire_hsmd_check_bip86_pubkey_reply */ +bool fromwire_hsmd_check_bip86_pubkey_reply(const void *p UNNEEDED, bool *ok UNNEEDED) +{ fprintf(stderr, "fromwire_hsmd_check_bip86_pubkey_reply called!\n"); abort(); } /* Generated stub for fromwire_hsmd_check_pubkey_reply */ bool fromwire_hsmd_check_pubkey_reply(const void *p UNNEEDED, bool *ok UNNEEDED) { fprintf(stderr, "fromwire_hsmd_check_pubkey_reply called!\n"); abort(); } @@ -326,8 +329,11 @@ bool fromwire_hsmd_forget_channel_reply(const void *p UNNEEDED) /* Generated stub for fromwire_hsmd_get_output_scriptpubkey_reply */ bool fromwire_hsmd_get_output_scriptpubkey_reply(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, u8 **script UNNEEDED) { fprintf(stderr, "fromwire_hsmd_get_output_scriptpubkey_reply called!\n"); abort(); } +/* Generated stub for fromwire_hsmd_init_reply_failure */ +bool fromwire_hsmd_init_reply_failure(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, u32 *error_code UNNEEDED, wirestring **error_message UNNEEDED) +{ fprintf(stderr, "fromwire_hsmd_init_reply_failure called!\n"); abort(); } /* Generated stub for fromwire_hsmd_init_reply_v4 */ -bool fromwire_hsmd_init_reply_v4(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, u32 *hsm_version UNNEEDED, u32 **hsm_capabilities UNNEEDED, struct node_id *node_id UNNEEDED, struct ext_key *bip32 UNNEEDED, struct pubkey *bolt12 UNNEEDED) +bool fromwire_hsmd_init_reply_v4(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, u32 *hsm_version UNNEEDED, u32 **hsm_capabilities UNNEEDED, struct node_id *node_id UNNEEDED, struct ext_key *bip32 UNNEEDED, struct pubkey *bolt12 UNNEEDED, struct tlv_hsmd_init_reply_v4_tlvs **tlvs UNNEEDED) { fprintf(stderr, "fromwire_hsmd_init_reply_v4 called!\n"); abort(); } /* Generated stub for fromwire_hsmd_new_channel_reply */ bool fromwire_hsmd_new_channel_reply(const void *p UNNEEDED) @@ -635,6 +641,9 @@ void tell_connectd_peer_importance(struct peer *peer UNNEEDED, /* Generated stub for tlv_hsmd_dev_preinit_tlvs_new */ struct tlv_hsmd_dev_preinit_tlvs *tlv_hsmd_dev_preinit_tlvs_new(const tal_t *ctx UNNEEDED) { fprintf(stderr, "tlv_hsmd_dev_preinit_tlvs_new called!\n"); abort(); } +/* Generated stub for tlv_hsmd_init_tlvs_new */ +struct tlv_hsmd_init_tlvs *tlv_hsmd_init_tlvs_new(const tal_t *ctx UNNEEDED) +{ fprintf(stderr, "tlv_hsmd_init_tlvs_new called!\n"); abort(); } /* Generated stub for topology_add_sync_waiter_ */ void topology_add_sync_waiter_(const tal_t *ctx UNNEEDED, struct chain_topology *topo UNNEEDED, @@ -681,6 +690,9 @@ u8 *towire_dualopend_dev_memleak(const tal_t *ctx UNNEEDED) /* Generated stub for towire_gossipd_addgossip */ u8 *towire_gossipd_addgossip(const tal_t *ctx UNNEEDED, const u8 *msg UNNEEDED, struct amount_sat *known_channel UNNEEDED) { fprintf(stderr, "towire_gossipd_addgossip called!\n"); abort(); } +/* Generated stub for towire_hsmd_check_bip86_pubkey */ +u8 *towire_hsmd_check_bip86_pubkey(const tal_t *ctx UNNEEDED, u32 index UNNEEDED, const struct pubkey *pubkey UNNEEDED) +{ fprintf(stderr, "towire_hsmd_check_bip86_pubkey called!\n"); abort(); } /* Generated stub for towire_hsmd_check_pubkey */ u8 *towire_hsmd_check_pubkey(const tal_t *ctx UNNEEDED, u32 index UNNEEDED, const struct pubkey *pubkey UNNEEDED) { fprintf(stderr, "towire_hsmd_check_pubkey called!\n"); abort(); } @@ -706,7 +718,7 @@ u8 *towire_hsmd_forget_channel(const tal_t *ctx UNNEEDED, const struct node_id * u8 *towire_hsmd_get_output_scriptpubkey(const tal_t *ctx UNNEEDED, u64 channel_id UNNEEDED, const struct node_id *peer_id UNNEEDED, const struct pubkey *commitment_point UNNEEDED) { fprintf(stderr, "towire_hsmd_get_output_scriptpubkey called!\n"); abort(); } /* Generated stub for towire_hsmd_init */ -u8 *towire_hsmd_init(const tal_t *ctx UNNEEDED, const struct bip32_key_version *bip32_key_version UNNEEDED, const struct chainparams *chainparams UNNEEDED, const struct secret *hsm_encryption_key UNNEEDED, const struct privkey *dev_force_privkey UNNEEDED, const struct secret *dev_force_bip32_seed UNNEEDED, const struct secrets *dev_force_channel_secrets UNNEEDED, const struct sha256 *dev_force_channel_secrets_shaseed UNNEEDED, u32 hsm_wire_min_version UNNEEDED, u32 hsm_wire_max_version UNNEEDED) +u8 *towire_hsmd_init(const tal_t *ctx UNNEEDED, const struct bip32_key_version *bip32_key_version UNNEEDED, const struct chainparams *chainparams UNNEEDED, const struct secret *hsm_encryption_key UNNEEDED, const struct privkey *dev_force_privkey UNNEEDED, const struct secret *dev_force_bip32_seed UNNEEDED, const struct secrets *dev_force_channel_secrets UNNEEDED, const struct sha256 *dev_force_channel_secrets_shaseed UNNEEDED, u32 hsm_wire_min_version UNNEEDED, u32 hsm_wire_max_version UNNEEDED, const struct tlv_hsmd_init_tlvs *tlvs UNNEEDED) { fprintf(stderr, "towire_hsmd_init called!\n"); abort(); } /* Generated stub for towire_hsmd_new_channel */ u8 *towire_hsmd_new_channel(const tal_t *ctx UNNEEDED, const struct node_id *id UNNEEDED, u64 dbid UNNEEDED) diff --git a/wallet/wallet.c b/wallet/wallet.c index d2dc7d08b14a..e77205b04d2f 100644 --- a/wallet/wallet.c +++ b/wallet/wallet.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -113,64 +114,51 @@ static void our_addresses_add(struct wallet_address_htable *our_addresses, static void our_addresses_add_for_index(struct wallet *w, u32 i) { - struct ext_key ext; + struct pubkey pubkey; enum addrtype addrtype; const u8 *scriptpubkey; - const u32 flags = BIP32_FLAG_KEY_PUBLIC | BIP32_FLAG_SKIP_HASH; + bool legacy = (w->ld->bip86_base == NULL); - if (bip32_key_from_parent(w->ld->bip32_base, i, - flags, &ext) != WALLY_OK) { - abort(); + /* Choose derivation method based on wallet type */ + if (w->ld->bip86_base) { + bip86_pubkey(w->ld, &pubkey, i); + } else { + bip32_pubkey(w->ld, &pubkey, i); } - /* If we don't know (prior to 24.11), just add all - * possibilities. */ - /* FIXME: We could deprecate P2SH once we don't see - * any, since we stopped publishing them in 24.02 */ + /* Determine which address types to generate */ if (!wallet_get_addrtype(w, i, &addrtype)) { - const u8 *addr; - scriptpubkey = scriptpubkey_p2wpkh_derkey(NULL, ext.pub_key); - addr = scriptpubkey_p2sh(NULL, scriptpubkey); - our_addresses_add(w->our_addresses, - i, take(addr), tal_bytelen(addr), - ADDR_P2SH_SEGWIT); - our_addresses_add(w->our_addresses, - i, - take(scriptpubkey), tal_bytelen(scriptpubkey), - ADDR_BECH32); - scriptpubkey = scriptpubkey_p2tr_derkey(NULL, ext.pub_key); - our_addresses_add(w->our_addresses, - i, - take(scriptpubkey), tal_bytelen(scriptpubkey), - ADDR_P2TR); - return; + /* Unknown (prior to 24.11): add all possibilities */ + //assert(legacy); + addrtype = ADDR_ALL; } - switch (addrtype) { + /* Generate scripts based on address type */ + if (addrtype == ADDR_P2SH_SEGWIT) { /* This doesn't happen */ - case ADDR_P2SH_SEGWIT: abort(); - case ADDR_BECH32: - case ADDR_ALL: - scriptpubkey = scriptpubkey_p2wpkh_derkey(NULL, ext.pub_key); - our_addresses_add(w->our_addresses, - i, - take(scriptpubkey), - tal_bytelen(scriptpubkey), - ADDR_BECH32); - if (addrtype != ADDR_ALL) - return; - /* Fall thru */ - case ADDR_P2TR: - scriptpubkey = scriptpubkey_p2tr_derkey(NULL, ext.pub_key); - our_addresses_add(w->our_addresses, - i, - take(scriptpubkey), - tal_bytelen(scriptpubkey), - ADDR_P2TR); - return; } - abort(); + + if (addrtype & ADDR_BECH32) { + scriptpubkey = scriptpubkey_p2wpkh(NULL, &pubkey); + + /* Add P2SH-wrapped version for legacy compatibility */ + if (addrtype == ADDR_ALL && legacy) { + const u8 *addr = scriptpubkey_p2sh(NULL, scriptpubkey); + our_addresses_add(w->our_addresses, i, take(addr), + tal_bytelen(addr), ADDR_P2SH_SEGWIT); + } + + /* Add native BECH32 */ + our_addresses_add(w->our_addresses, i, take(scriptpubkey), + tal_bytelen(scriptpubkey), ADDR_BECH32); + } + + if (addrtype & ADDR_P2TR) { + scriptpubkey = scriptpubkey_p2tr(NULL, &pubkey); + our_addresses_add(w->our_addresses, i, take(scriptpubkey), + tal_bytelen(scriptpubkey), ADDR_P2TR); + } } static void our_addresses_init(struct wallet *w) @@ -179,7 +167,12 @@ static void our_addresses_init(struct wallet *w) w->our_addresses = tal(w, struct wallet_address_htable); wallet_address_htable_init(w->our_addresses); - our_addresses_add_for_index(w, w->our_addresses_maxindex); + /* Prefill the address table up to keyscan_gap so rescans immediately + * include scripts without needing prior address allocations. */ + for (u32 i = 0; i <= w->keyscan_gap; i++) { + our_addresses_add_for_index(w, i); + } + w->our_addresses_maxindex = w->keyscan_gap; } static void outpointfilters_init(struct wallet *w) @@ -985,13 +978,17 @@ bool wallet_add_onchaind_utxo(struct wallet *w, bool wallet_can_spend(struct wallet *w, const u8 *script, size_t script_len, u32 *index, enum addrtype *addrtype) { - u64 bip32_max_index; + u64 bip32_max_index, bip86_max_index; const struct wallet_address *waddr; struct script_with_len scriptwl = {script, script_len}; /* Update hash table if we need to */ bip32_max_index = db_get_intvar(w->db, "bip32_max_index", 0); - while (w->our_addresses_maxindex < bip32_max_index + w->keyscan_gap) + bip86_max_index = db_get_intvar(w->db, "bip86_max_index", 0); + + /* Scan both BIP32 and BIP86 addresses */ + u64 max_index = (bip32_max_index > bip86_max_index) ? bip32_max_index : bip86_max_index; + while (w->our_addresses_maxindex < max_index + w->keyscan_gap) our_addresses_add_for_index(w, ++w->our_addresses_maxindex); waddr = wallet_address_htable_get(w->our_addresses, &scriptwl); @@ -1000,8 +997,15 @@ bool wallet_can_spend(struct wallet *w, const u8 *script, size_t script_len, /* If we found a used key in the keyscan_gap we should * remember that. */ - if (waddr->index > bip32_max_index) - db_set_intvar(w->db, "bip32_max_index", waddr->index); + if (w->ld->bip86_base) { + /* BIP86-based wallet: all addresses use BIP86 derivation */ + if (waddr->index > bip86_max_index) + db_set_intvar(w->db, "bip86_max_index", waddr->index); + } else { + /* Legacy wallet: all addresses use BIP32 derivation */ + if (waddr->index > bip32_max_index) + db_set_intvar(w->db, "bip32_max_index", waddr->index); + } *index = waddr->index; if (addrtype) @@ -1012,12 +1016,22 @@ bool wallet_can_spend(struct wallet *w, const u8 *script, size_t script_len, s64 wallet_get_newindex(struct lightningd *ld, enum addrtype addrtype) { struct db_stmt *stmt; - u64 newidx = db_get_intvar(ld->wallet->db, "bip32_max_index", 0) + 1; + u64 newidx; + const char *index_var; + + /* Choose index variable based on wallet type */ + if (ld->bip86_base) { + index_var = "bip86_max_index"; + } else { + index_var = "bip32_max_index"; + } + + newidx = db_get_intvar(ld->wallet->db, index_var, 0) + 1; if (newidx == BIP32_INITIAL_HARDENED_CHILD) return -1; - db_set_intvar(ld->wallet->db, "bip32_max_index", newidx); + db_set_intvar(ld->wallet->db, index_var, newidx); stmt = db_prepare_v2(ld->wallet->db, SQL("INSERT INTO addresses (" " keyidx" @@ -1030,6 +1044,7 @@ s64 wallet_get_newindex(struct lightningd *ld, enum addrtype addrtype) return newidx; } + bool wallet_get_addrtype(struct wallet *wallet, u64 idx, enum addrtype *addrtype) { diff --git a/wallet/wallet.h b/wallet/wallet.h index 7eb1a51c0f59..4fd8b10acc18 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -614,6 +614,7 @@ bool wallet_can_spend(struct wallet *w, */ s64 wallet_get_newindex(struct lightningd *ld, enum addrtype addrtype); + /** * wallet_get_addrtype - get the address types for this key. * @wallet: (in) wallet diff --git a/wallet/walletrpc.c b/wallet/walletrpc.c index 6155c899ed53..101141986d70 100644 --- a/wallet/walletrpc.c +++ b/wallet/walletrpc.c @@ -109,21 +109,31 @@ bool WARN_UNUSED_RESULT newaddr_inner(struct command *cmd, struct pubkey *pubkey s64 keyidx; u8 *b32script; u8 *p2tr_script; + bool use_bip86_base = (cmd->ld->bip86_base != NULL); + /* Get new index - wallet_get_newindex now handles both BIP32 and BIP86 */ keyidx = wallet_get_newindex(cmd->ld, addrtype); - if (keyidx < 0) { - // return command_fail(cmd, LIGHTNINGD, "Keys exhausted "); - return false; - } + if (keyidx < 0) return false; - bip32_pubkey(cmd->ld, pubkey, keyidx); + /* Choose derivation method based on wallet type */ + if (use_bip86_base) { + /* Wallet has mnemonic - use BIP86 derivation */ + bip86_pubkey(cmd->ld, pubkey, keyidx); + } else { + /* Legacy wallet - use BIP32 derivation */ + bip32_pubkey(cmd->ld, pubkey, keyidx); + } + /* Generate scripts from pubkey (same logic for both wallet types) */ b32script = scriptpubkey_p2wpkh(tmpctx, pubkey); p2tr_script = scriptpubkey_p2tr(tmpctx, pubkey); + + /* Add scripts to filter based on requested address type */ if (addrtype & ADDR_BECH32) txfilter_add_scriptpubkey(cmd->ld->owned_txfilter, b32script); if (addrtype & ADDR_P2TR) txfilter_add_scriptpubkey(cmd->ld->owned_txfilter, p2tr_script); + return true; } @@ -147,6 +157,9 @@ static struct command_result *json_newaddr(struct command *cmd, return command_fail(cmd, LIGHTNINGD, "Keys exhausted "); }; + response = json_stream_success(cmd); + + /* Generate addresses based on requested type */ bech32 = encode_pubkey_to_addr(cmd, &pubkey, ADDR_BECH32, NULL); p2tr = encode_pubkey_to_addr(cmd, &pubkey, ADDR_P2TR, NULL); if (!bech32 || !p2tr) { @@ -154,7 +167,6 @@ static struct command_result *json_newaddr(struct command *cmd, "p2wpkh address encoding failure."); } - response = json_stream_success(cmd); if (*addrtype & ADDR_BECH32) json_add_string(response, "bech32", bech32); if (*addrtype & ADDR_P2TR) @@ -171,7 +183,8 @@ AUTODATA(json_command, &newaddr_command); static void json_add_address_details(struct json_stream *response, const u64 keyidx, const char *out_p2wpkh, - const char *out_p2tr) + const char *out_p2tr, + enum addrtype addrtype) { json_object_start(response, NULL); json_add_u64(response, "keyidx", keyidx); @@ -216,7 +229,14 @@ static struct command_result *json_listaddresses(struct command *cmd, if (listaddrtypes[i].keyidx == BIP32_INITIAL_HARDENED_CHILD){ break; } - bip32_pubkey(cmd->ld, &pubkey, listaddrtypes[i].keyidx); + /* Use appropriate derivation based on wallet type */ + if (cmd->ld->bip86_base) { + /* Mnemonic wallet - use BIP86 derivation */ + bip86_pubkey(cmd->ld, &pubkey, listaddrtypes[i].keyidx); + } else { + /* Legacy wallet - use BIP32 derivation */ + bip32_pubkey(cmd->ld, &pubkey, listaddrtypes[i].keyidx); + } char *out_p2wpkh = ""; char *out_p2tr = ""; if (listaddrtypes[i].addrtype == ADDR_BECH32 || listaddrtypes[i].addrtype == ADDR_ALL) { @@ -239,7 +259,7 @@ static struct command_result *json_listaddresses(struct command *cmd, } } if (!addr || streq(addr, out_p2wpkh) || streq(addr, out_p2tr)) { - json_add_address_details(response, listaddrtypes[i].keyidx, out_p2wpkh, out_p2tr); + json_add_address_details(response, listaddrtypes[i].keyidx, out_p2wpkh, out_p2tr, listaddrtypes[i].addrtype); if (addr) { break; }