diff --git a/.github/workflows/readme-rpc-sync.yml b/.github/workflows/readme-rpc-sync.yml index 855815b1fe9a..4bd99202b62c 100644 --- a/.github/workflows/readme-rpc-sync.yml +++ b/.github/workflows/readme-rpc-sync.yml @@ -12,7 +12,6 @@ on: - 'doc/*.5.md' - 'doc/*.8.md' - 'doc/lightningd-*.7.md' - - 'doc/reckless.7.md' workflow_dispatch: jobs: diff --git a/.msggen.json b/.msggen.json index db2953ab1a12..67b4889f4ca0 100644 --- a/.msggen.json +++ b/.msggen.json @@ -556,6 +556,43 @@ "startdir": 3, "stop": 1 }, + "RecklessCommand": { + "disable": 6, + "enable": 5, + "help": 9, + "install": 0, + "listavailable": 3, + "listinstalled": 4, + "source": 7, + "tip": 8, + "uninstall": 2, + "update": 1 + }, + "RecklessListavailableInstaller": { + "Custom": 9, + "Go": 8, + "Nodejs": 6, + "PoetryVenv": 3, + "PyprojectViaPip": 4, + "Python": 5, + "PythonUv": 0, + "PythonUvLegacy": 2, + "PythonUvShebang": 1, + "Rust": 7 + }, + "RecklessLogLevel": { + "broken": 5, + "debug": 2, + "info": 3, + "io": 0, + "trace": 1, + "unusual": 4 + }, + "RecklessSubcommand": { + "add": 0, + "list": 1, + "remove": 2 + }, "RecoverResult": { "Recovery restart in progress": 0 }, @@ -2576,6 +2613,7 @@ "ListConfigs.configs.plugin": 10, "ListConfigs.configs.plugin-dir": 11, "ListConfigs.configs.proxy": 52, + "ListConfigs.configs.reckless-dir": 85, "ListConfigs.configs.recover": 84, "ListConfigs.configs.regtest": 6, "ListConfigs.configs.require-confirmed-inputs": 68, @@ -2881,6 +2919,10 @@ "ListConfigs.configs.proxy.source": 2, "ListConfigs.configs.proxy.value_str": 1 }, + "ListconfigsConfigsReckless-dir": { + "ListConfigs.configs.reckless-dir.source": 1, + "ListConfigs.configs.reckless-dir.value_str": 2 + }, "ListconfigsConfigsRecover": { "ListConfigs.configs.recover.source": 1, "ListConfigs.configs.recover.value_str": 2 @@ -3917,6 +3959,84 @@ "PreApproveKeysend.destination": 1, "PreApproveKeysend.payment_hash": 2 }, + "RecklessDisable": { + "Reckless.disable.plugin_name": 1 + }, + "RecklessEnable": { + "Reckless.enable.plugin_name": 1 + }, + "RecklessInstall": { + "Reckless.install.enabled": 1, + "Reckless.install.installed_commit": 2, + "Reckless.install.plugin_name": 3 + }, + "RecklessListavailable": { + "Reckless.listavailable[].installer": 1, + "Reckless.listavailable[].manifest": 2, + "Reckless.listavailable[].origin": 3, + "Reckless.listavailable[].plugin_name": 4 + }, + "RecklessListavailableManifest": { + "Reckless.listavailable[].manifest.dependencies[]": 1, + "Reckless.listavailable[].manifest.entrypoint": 2, + "Reckless.listavailable[].manifest.install_cmd[]": 3, + "Reckless.listavailable[].manifest.installable": 4, + "Reckless.listavailable[].manifest.long_description": 5, + "Reckless.listavailable[].manifest.offer": 6, + "Reckless.listavailable[].manifest.required_options[]": 7, + "Reckless.listavailable[].manifest.short_description": 8 + }, + "RecklessListinstalled": { + "Reckless.listinstalled[].installation_date": 1, + "Reckless.listinstalled[].installation_time": 2, + "Reckless.listinstalled[].installed_commit": 3, + "Reckless.listinstalled[].original_source": 4, + "Reckless.listinstalled[].plugin_name": 5, + "Reckless.listinstalled[].requested_commit": 6 + }, + "RecklessLogNotification": { + "reckless_log.level": 1, + "reckless_log.log": 2, + "reckless_log.time": 3, + "reckless_log.timestamp": 4 + }, + "RecklessRequest": { + "Reckless.amount_msat": 1, + "Reckless.command": 2, + "Reckless.developer": 3, + "Reckless.options[]": 4, + "Reckless.payer_note": 5, + "Reckless.subcommand": 6, + "Reckless.target": 7, + "Reckless.verbose": 8 + }, + "RecklessResponse": { + "Reckless.disable": 1, + "Reckless.enable": 2, + "Reckless.install": 3, + "Reckless.listavailable[]": 4, + "Reckless.listinstalled[]": 5, + "Reckless.log[]": 6, + "Reckless.sources[]": 7, + "Reckless.tip": 8, + "Reckless.uninstall": 9, + "Reckless.update[]": 10 + }, + "RecklessTip": { + "Reckless.tip.amount_msat": 1, + "Reckless.tip.amount_sent_msat": 2, + "Reckless.tip.failed_parts": 3, + "Reckless.tip.payment_preimage": 4, + "Reckless.tip.successful_parts": 5 + }, + "RecklessUninstall": { + "Reckless.uninstall.plugin_name": 1 + }, + "RecklessUpdate": { + "Reckless.update[].enabled": 1, + "Reckless.update[].installed_commit": 2, + "Reckless.update[].plugin_name": 3 + }, "RecoverRequest": { "Recover.hsmsecret": 1 }, @@ -10637,6 +10757,18 @@ "added": "v23.08", "deprecated": null }, + "ListConfigs.configs.reckless-dir": { + "added": "v26.09", + "deprecated": null + }, + "ListConfigs.configs.reckless-dir.source": { + "added": "v26.09", + "deprecated": null + }, + "ListConfigs.configs.reckless-dir.value_str": { + "added": "v26.09", + "deprecated": null + }, "ListConfigs.configs.recover": { "added": "v23.11", "deprecated": null @@ -13453,6 +13585,210 @@ "added": "v23.02", "deprecated": null }, + "Reckless": { + "added": "v22.11", + "deprecated": null + }, + "Reckless.amount_msat": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.command": { + "added": "v22.11", + "deprecated": null + }, + "Reckless.developer": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.disable": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.disable.plugin_name": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.enable": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.enable.plugin_name": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.install": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.install.enabled": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.install.installed_commit": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.install.plugin_name": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[]": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].installer": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].manifest": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].manifest.dependencies[]": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].manifest.entrypoint": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].manifest.install_cmd[]": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].manifest.installable": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].manifest.long_description": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].manifest.offer": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].manifest.required_options[]": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].manifest.short_description": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].origin": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listavailable[].plugin_name": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listinstalled[]": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listinstalled[].installation_date": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listinstalled[].installation_time": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listinstalled[].installed_commit": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listinstalled[].original_source": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listinstalled[].plugin_name": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.listinstalled[].requested_commit": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.log[]": { + "added": "v22.11", + "deprecated": null + }, + "Reckless.options[]": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.payer_note": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.sources[]": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.subcommand": { + "added": "v22.11", + "deprecated": null + }, + "Reckless.target": { + "added": "v22.11", + "deprecated": null + }, + "Reckless.tip": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.tip.amount_msat": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.tip.amount_sent_msat": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.tip.failed_parts": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.tip.payment_preimage": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.tip.successful_parts": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.uninstall": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.uninstall.plugin_name": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.update[]": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.update[].enabled": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.update[].installed_commit": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.update[].plugin_name": { + "added": "v26.09", + "deprecated": null + }, + "Reckless.verbose": { + "added": "v26.09", + "deprecated": null + }, "Recover": { "added": "pre-v0.10.1", "deprecated": null @@ -16725,6 +17061,26 @@ "added": "pre-v0.10.1", "deprecated": null }, + "reckless_log": { + "added": "v26.09", + "deprecated": null + }, + "reckless_log.level": { + "added": "v26.09", + "deprecated": null + }, + "reckless_log.log": { + "added": "v26.09", + "deprecated": null + }, + "reckless_log.time": { + "added": "v26.09", + "deprecated": null + }, + "reckless_log.timestamp": { + "added": "v26.09", + "deprecated": null + }, "recover_hook": { "added": "v23.08", "deprecated": null diff --git a/Cargo.lock b/Cargo.lock index 1edbce5194b7..f0d743f6f70e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -436,6 +436,46 @@ dependencies = [ "windows-link", ] +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + [[package]] name = "cln-bip353" version = "0.1.0" @@ -549,6 +589,28 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "cln-reckless" +version = "0.1.0" +dependencies = [ + "anyhow", + "chrono", + "clap", + "cln-plugin", + "cln-rpc", + "futures", + "hex", + "log", + "log-panics", + "serde", + "serde_json", + "sha2", + "tokio", + "tokio-util", + "url", + "which", +] + [[package]] name = "cln-rpc" version = "0.7.0" @@ -2965,6 +3027,12 @@ dependencies = [ "loom", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.6.1" @@ -3731,6 +3799,15 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "which" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459" +dependencies = [ + "libc", +] + [[package]] name = "winapi-util" version = "0.1.11" diff --git a/Cargo.toml b/Cargo.toml index 6f476f0c16c9..f0be9353b25b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ members = [ "plugins/wss-proxy-plugin", "plugins/bip353-plugin", "plugins/currencyrate-plugin", + "plugins/reckless-plugin", ] [workspace.dependencies] diff --git a/Makefile b/Makefile index fb1f068d7fe6..08b2af49bcee 100644 --- a/Makefile +++ b/Makefile @@ -461,8 +461,7 @@ ALL_NONGEN_SRCFILES := $(ALL_NONGEN_HEADERS) $(ALL_NONGEN_SOURCES) BIN_PROGRAMS = \ cli/lightning-cli \ lightningd/lightningd \ - tools/lightning-hsmtool\ - tools/reckless + tools/lightning-hsmtool PKGLIBEXEC_PROGRAMS = \ lightningd/lightning_channeld \ lightningd/lightning_closingd \ @@ -882,7 +881,7 @@ clean: obsclean # See doc/contribute-to-core-lightning/contributor-workflow.md PYLNS=client proto testing -update-versions: update-pyln-versions update-reckless-version update-dot-version # FIXME: update-doc-examples +update-versions: update-pyln-versions update-dot-version # FIXME: update-doc-examples @uv lock update-pyln-versions: $(PYLNS:%=update-pyln-version-%) @@ -920,11 +919,6 @@ pyln-build-all: pyln-build pyln-build-bolts pyln-build-grpc-proto pyln-build-wss update-lock: uv sync --all-extras --all-groups -update-reckless-version: - @if [ -z "$(NEW_VERSION)" ]; then echo "Set NEW_VERSION!" >&2; exit 1; fi - @echo "Updating tools/reckless to $(NEW_VERSION)" - @$(SED) -i.bak "s/__VERSION__ = '.*'/__VERSION__ = '$(NEW_VERSION)'/" tools/reckless && rm tools/reckless.bak - update-dot-version: @if [ -z "$(NEW_VERSION)" ]; then echo "Set NEW_VERSION!" >&2; exit 1; fi echo $(NEW_VERSION) > .version @@ -1197,6 +1191,6 @@ canned-gossmap: devtools/gossmap-compress print-binary-sizes: $(ALL_PROGRAMS) $(ALL_TEST_PROGRAMS) $(BIN_PROGRAMS) @echo User programs: - @size -t $(PKGLIBEXEC_PROGRAMS) $(filter-out tools/reckless,$(BIN_PROGRAMS)) $(PLUGINS) + @size -t $(PKGLIBEXEC_PROGRAMS) $(BIN_PROGRAMS) $(PLUGINS) @echo All programs: @size -t $(ALL_PROGRAMS) $(ALL_TEST_PROGRAMS) | tail -n1 diff --git a/cln-grpc/proto/node.proto b/cln-grpc/proto/node.proto index e313afa2ae6b..0ce3b85a928b 100644 --- a/cln-grpc/proto/node.proto +++ b/cln-grpc/proto/node.proto @@ -161,6 +161,7 @@ service Node { rpc CreateProof(CreateproofRequest) returns (CreateproofResponse) {} rpc Xkeysend(XkeysendRequest) returns (XkeysendResponse) {} rpc Graceful(GracefulRequest) returns (GracefulResponse) {} + rpc Reckless(RecklessRequest) returns (RecklessResponse) {} rpc SubscribeBalanceSnapshot(StreamBalanceSnapshotRequest) returns (stream BalanceSnapshotNotification) {} rpc SubscribeBlockAdded(StreamBlockAddedRequest) returns (stream BlockAddedNotification) {} @@ -186,6 +187,7 @@ service Node { rpc SubscribeWarning(StreamWarningRequest) returns (stream WarningNotification) {} rpc SubscribePayPartEnd(StreamPayPartEndRequest) returns (stream PayPartEndNotification) {} rpc SubscribePayPartStart(StreamPayPartStartRequest) returns (stream PayPartStartNotification) {} + rpc SubscribeRecklessLog(StreamRecklessLogRequest) returns (stream RecklessLogNotification) {} } message GetinfoRequest { @@ -3247,6 +3249,7 @@ message ListconfigsConfigs { optional ListconfigsConfigsMinemergencymsat min_emergency_msat = 82; optional ListconfigsConfigsPaymentfrontingnode payment_fronting_node = 83; optional ListconfigsConfigsRecover recover = 84; + optional ListconfigsConfigsRecklessdir reckless_dir = 85; } message ListconfigsConfigsAccepthtlctlvtype { @@ -3594,6 +3597,11 @@ message ListconfigsConfigsProxy { string source = 2; } +message ListconfigsConfigsRecklessdir { + string source = 1; + string value_str = 2; +} + message ListconfigsConfigsRecover { string source = 1; string value_str = 2; @@ -4633,6 +4641,121 @@ message GracefulResponse { repeated bytes pending_peers = 2; } +message RecklessRequest { + // Reckless.command + enum RecklessCommand { + INSTALL = 0; + UPDATE = 1; + UNINSTALL = 2; + LISTAVAILABLE = 3; + LISTINSTALLED = 4; + ENABLE = 5; + DISABLE = 6; + SOURCE = 7; + TIP = 8; + HELP = 9; + } + // Reckless.subcommand + enum RecklessSubcommand { + ADD = 0; + LIST = 1; + REMOVE = 2; + } + optional Amount amount_msat = 1; + RecklessCommand command = 2; + optional bool developer = 3; + repeated string options = 4; + optional string payer_note = 5; + optional RecklessSubcommand subcommand = 6; + optional string target = 7; + optional bool verbose = 8; +} + +message RecklessResponse { + optional RecklessDisable disable = 1; + optional RecklessEnable enable = 2; + optional RecklessInstall install = 3; + repeated RecklessListavailable listavailable = 4; + repeated RecklessListinstalled listinstalled = 5; + repeated string log = 6; + repeated string sources = 7; + optional RecklessTip tip = 8; + optional RecklessUninstall uninstall = 9; + repeated RecklessUpdate update = 10; +} + +message RecklessDisable { + string plugin_name = 1; +} + +message RecklessEnable { + string plugin_name = 1; +} + +message RecklessInstall { + bool enabled = 1; + optional string installed_commit = 2; + string plugin_name = 3; +} + +message RecklessListavailable { + // Reckless.listavailable[].installer + enum RecklessListavailableInstaller { + PYTHONUV = 0; + PYTHONUVSHEBANG = 1; + PYTHONUVLEGACY = 2; + POETRYVENV = 3; + PYPROJECTVIAPIP = 4; + PYTHON = 5; + NODEJS = 6; + RUST = 7; + GO = 8; + CUSTOM = 9; + } + RecklessListavailableInstaller installer = 1; + RecklessListavailableManifest manifest = 2; + string origin = 3; + string plugin_name = 4; +} + +message RecklessListavailableManifest { + repeated string dependencies = 1; + string entrypoint = 2; + repeated string install_cmd = 3; + optional bool installable = 4; + optional string long_description = 5; + optional string offer = 6; + repeated string required_options = 7; + optional string short_description = 8; +} + +message RecklessListinstalled { + string installation_date = 1; + double installation_time = 2; + optional string installed_commit = 3; + string original_source = 4; + string plugin_name = 5; + optional string requested_commit = 6; +} + +message RecklessTip { + Amount amount_msat = 1; + Amount amount_sent_msat = 2; + uint64 failed_parts = 3; + bytes payment_preimage = 4; + uint64 successful_parts = 5; +} + +message RecklessUninstall { + string plugin_name = 1; +} + +message RecklessUpdate { + bool enabled = 1; + optional string installed_commit = 2; + string plugin_name = 3; +} + message StreamBalanceSnapshotRequest { } @@ -5055,3 +5178,22 @@ message PayPartStartHops { Amount channel_in_msat = 4; Amount channel_out_msat = 5; } + +message StreamRecklessLogRequest { +} + +message RecklessLogNotification { + // reckless_log.level + enum RecklessLogLevel { + IO = 0; + TRACE = 1; + DEBUG = 2; + INFO = 3; + UNUSUAL = 4; + BROKEN = 5; + } + RecklessLogLevel level = 1; + string log = 2; + string time = 3; + string timestamp = 4; +} diff --git a/cln-grpc/src/convert.rs b/cln-grpc/src/convert.rs index 99fdd53af67b..18b41fe27471 100644 --- a/cln-grpc/src/convert.rs +++ b/cln-grpc/src/convert.rs @@ -3757,6 +3757,16 @@ impl From for pb::ListconfigsConfigsProxy { } } +#[allow(unused_variables)] +impl From for pb::ListconfigsConfigsRecklessdir { + fn from(c: responses::ListconfigsConfigsRecklessdir) -> Self { + Self { + source: c.source, // Rule #2 for type string + value_str: c.value_str, // Rule #2 for type string + } + } +} + #[allow(unused_variables)] impl From for pb::ListconfigsConfigsRecover { fn from(c: responses::ListconfigsConfigsRecover) -> Self { @@ -3959,6 +3969,7 @@ impl From for pb::ListconfigsConfigs { plugin: c.plugin.map(|v| v.into()), plugin_dir: c.plugin_dir.map(|v| v.into()), proxy: c.proxy.map(|v| v.into()), + reckless_dir: c.reckless_dir.map(|v| v.into()), recover: c.recover.map(|v| v.into()), regtest: c.regtest.map(|v| v.into()), require_confirmed_inputs: c.require_confirmed_inputs.map(|v| v.into()), @@ -5045,6 +5056,136 @@ impl From for pb::GracefulResponse { } } +#[allow(unused_variables)] +impl From for pb::RecklessDisable { + fn from(c: responses::RecklessDisable) -> Self { + Self { + plugin_name: c.plugin_name, // Rule #2 for type string + } + } +} + +#[allow(unused_variables)] +impl From for pb::RecklessEnable { + fn from(c: responses::RecklessEnable) -> Self { + Self { + plugin_name: c.plugin_name, // Rule #2 for type string + } + } +} + +#[allow(unused_variables)] +impl From for pb::RecklessInstall { + fn from(c: responses::RecklessInstall) -> Self { + Self { + enabled: c.enabled, // Rule #2 for type boolean + installed_commit: c.installed_commit, // Rule #2 for type string? + plugin_name: c.plugin_name, // Rule #2 for type string + } + } +} + +#[allow(unused_variables)] +impl From for pb::RecklessListavailableManifest { + fn from(c: responses::RecklessListavailableManifest) -> Self { + Self { + // Field: Reckless.listavailable[].manifest.dependencies[] + dependencies: c.dependencies.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 + entrypoint: c.entrypoint, // Rule #2 for type string + // Field: Reckless.listavailable[].manifest.install_cmd[] + install_cmd: c.install_cmd.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 + installable: c.installable, // Rule #2 for type boolean? + long_description: c.long_description, // Rule #2 for type string? + offer: c.offer, // Rule #2 for type string? + // Field: Reckless.listavailable[].manifest.required_options[] + required_options: c.required_options.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 + short_description: c.short_description, // Rule #2 for type string? + } + } +} + +#[allow(unused_variables)] +impl From for pb::RecklessListavailable { + fn from(c: responses::RecklessListavailable) -> Self { + Self { + installer: c.installer as i32, + manifest: Some(c.manifest.into()), + origin: c.origin, // Rule #2 for type string + plugin_name: c.plugin_name, // Rule #2 for type string + } + } +} + +#[allow(unused_variables)] +impl From for pb::RecklessListinstalled { + fn from(c: responses::RecklessListinstalled) -> Self { + Self { + installation_date: c.installation_date, // Rule #2 for type string + installation_time: c.installation_time, // Rule #2 for type number + installed_commit: c.installed_commit, // Rule #2 for type string? + original_source: c.original_source, // Rule #2 for type string + plugin_name: c.plugin_name, // Rule #2 for type string + requested_commit: c.requested_commit, // Rule #2 for type string? + } + } +} + +#[allow(unused_variables)] +impl From for pb::RecklessTip { + fn from(c: responses::RecklessTip) -> Self { + Self { + amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat + amount_sent_msat: Some(c.amount_sent_msat.into()), // Rule #2 for type msat + failed_parts: c.failed_parts, // Rule #2 for type u64 + payment_preimage: c.payment_preimage.to_vec(), // Rule #2 for type secret + successful_parts: c.successful_parts, // Rule #2 for type u64 + } + } +} + +#[allow(unused_variables)] +impl From for pb::RecklessUninstall { + fn from(c: responses::RecklessUninstall) -> Self { + Self { + plugin_name: c.plugin_name, // Rule #2 for type string + } + } +} + +#[allow(unused_variables)] +impl From for pb::RecklessUpdate { + fn from(c: responses::RecklessUpdate) -> Self { + Self { + enabled: c.enabled, // Rule #2 for type boolean + installed_commit: c.installed_commit, // Rule #2 for type string? + plugin_name: c.plugin_name, // Rule #2 for type string + } + } +} + +#[allow(unused_variables)] +impl From for pb::RecklessResponse { + fn from(c: responses::RecklessResponse) -> Self { + Self { + disable: c.disable.map(|v| v.into()), + enable: c.enable.map(|v| v.into()), + install: c.install.map(|v| v.into()), + // Field: Reckless.listavailable[] + listavailable: c.listavailable.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 + // Field: Reckless.listinstalled[] + listinstalled: c.listinstalled.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 + // Field: Reckless.log[] + log: c.log.into_iter().map(|i| i.into()).collect(), // Rule #3 for type string + // Field: Reckless.sources[] + sources: c.sources.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 + tip: c.tip.map(|v| v.into()), + uninstall: c.uninstall.map(|v| v.into()), + // Field: Reckless.update[] + update: c.update.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 + } + } +} + #[allow(unused_variables)] impl From for pb::BalanceSnapshotAccounts { fn from(c: notifications::BalanceSnapshotAccounts) -> Self { @@ -5450,6 +5591,18 @@ impl From for pb::PayPartStartNotificat } } +#[allow(unused_variables)] +impl From for pb::RecklessLogNotification { + fn from(c: notifications::RecklessLogNotification) -> Self { + Self { + level: c.level as i32, + log: c.log, // Rule #2 for type string + time: c.time, // Rule #2 for type string + timestamp: c.timestamp, // Rule #2 for type string + } + } +} + #[allow(unused_variables)] impl From for pb::GetinfoRequest { fn from(c: requests::GetinfoRequest) -> Self { @@ -7390,6 +7543,23 @@ impl From for pb::GracefulRequest { } } +#[allow(unused_variables)] +impl From for pb::RecklessRequest { + fn from(c: requests::RecklessRequest) -> Self { + Self { + amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat? + command: c.command as i32, + developer: c.developer, // Rule #2 for type boolean? + // Field: Reckless.options[] + options: c.options.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 + payer_note: c.payer_note, // Rule #2 for type string? + subcommand: c.subcommand.map(|v| v as i32), + target: c.target, // Rule #2 for type string? + verbose: c.verbose, // Rule #2 for type boolean? + } + } +} + #[allow(unused_variables)] impl From for pb::StreamBalanceSnapshotRequest { fn from(c: notifications::requests::StreamBalanceSnapshotRequest) -> Self { @@ -7582,6 +7752,14 @@ impl From for pb::StreamPayP } } +#[allow(unused_variables)] +impl From for pb::StreamRecklessLogRequest { + fn from(c: notifications::requests::StreamRecklessLogRequest) -> Self { + Self { + } + } +} + #[allow(unused_variables)] impl From for requests::GetinfoRequest { @@ -9446,6 +9624,22 @@ impl From for requests::GracefulRequest { } } +#[allow(unused_variables)] +impl From for requests::RecklessRequest { + fn from(c: pb::RecklessRequest) -> Self { + Self { + amount_msat: c.amount_msat.map(|a| a.into()), // Rule #1 for type msat? + command: c.command.try_into().unwrap(), + developer: c.developer, // Rule #1 for type boolean? + options: Some(c.options.into_iter().map(|s| s.into()).collect()), // Rule #4 + payer_note: c.payer_note, // Rule #1 for type string? + subcommand: c.subcommand.map(|v| v.try_into().unwrap()), + target: c.target, // Rule #1 for type string? + verbose: c.verbose, // Rule #1 for type boolean? + } + } +} + #[allow(unused_variables)] impl From for notifications::requests::StreamBalanceSnapshotRequest { fn from(c: pb::StreamBalanceSnapshotRequest) -> Self { @@ -9638,3 +9832,11 @@ impl From for notifications::requests::StreamPayP } } +#[allow(unused_variables)] +impl From for notifications::requests::StreamRecklessLogRequest { + fn from(c: pb::StreamRecklessLogRequest) -> Self { + Self { + } + } +} + diff --git a/cln-grpc/src/server.rs b/cln-grpc/src/server.rs index 0bc2d6eb727a..f1d8315c2d31 100644 --- a/cln-grpc/src/server.rs +++ b/cln-grpc/src/server.rs @@ -4983,6 +4983,38 @@ impl Node for Server } + async fn reckless( + &self, + request: tonic::Request, + ) -> Result, tonic::Status> { + let req = request.into_inner(); + let req: requests::RecklessRequest = req.into(); + debug!("Client asked for reckless"); + trace!("reckless request: {:?}", req); + let mut rpc = ClnRpc::new(&self.rpc_path) + .await + .map_err(|e| Status::new(Code::Internal, e.to_string()))?; + let result = rpc.call(Request::Reckless(req)) + .await + .map_err(|e| Status::new( + Code::Unknown, + format!("Error calling method Reckless: {:?}", e)))?; + match result { + Response::Reckless(r) => { + trace!("reckless response: {:?}", r); + Ok(tonic::Response::new(r.into())) + }, + r => Err(Status::new( + Code::Internal, + format!( + "Unexpected result {:?} to method call Reckless", + r + ) + )), + } + + } + type SubscribeBalanceSnapshotStream = NotificationStream; @@ -5583,4 +5615,29 @@ impl Node for Server }; Ok(tonic::Response::new(result)) } + + + type SubscribeRecklessLogStream = NotificationStream; + + async fn subscribe_reckless_log( + &self, + _request : tonic::Request + ) -> Result, tonic::Status> { + let receiver = self.events.subscribe(); + let stream = BroadcastStream::new(receiver); + let boxed = Box::pin(stream); + + let result = NotificationStream { + inner : boxed, + fn_filter_map : |x| { + match x { + Notification::RecklessLog(x) => { + Some(x.into()) + } + _ => None + } + } + }; + Ok(tonic::Response::new(result)) + } } \ No newline at end of file diff --git a/cln-rpc/src/model.rs b/cln-rpc/src/model.rs index e752ffcd2e69..e8d47a2d1485 100644 --- a/cln-rpc/src/model.rs +++ b/cln-rpc/src/model.rs @@ -210,6 +210,7 @@ pub enum Request { CreateProof(requests::CreateproofRequest), Xkeysend(requests::XkeysendRequest), Graceful(requests::GracefulRequest), + Reckless(requests::RecklessRequest), } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -408,6 +409,7 @@ pub enum Response { CreateProof(responses::CreateproofResponse), Xkeysend(responses::XkeysendResponse), Graceful(responses::GracefulResponse), + Reckless(responses::RecklessResponse), } @@ -5474,6 +5476,139 @@ pub mod requests { "graceful" } } + /// ['A subcommand. Only in combination with *command* **source**.'] + #[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] + #[allow(non_camel_case_types)] + pub enum RecklessSubcommand { + #[serde(rename = "add")] + ADD = 0, + #[serde(rename = "list")] + LIST = 1, + #[serde(rename = "remove")] + REMOVE = 2, + } + + impl TryFrom for RecklessSubcommand { + type Error = anyhow::Error; + fn try_from(c: i32) -> Result { + match c { + 0 => Ok(RecklessSubcommand::ADD), + 1 => Ok(RecklessSubcommand::LIST), + 2 => Ok(RecklessSubcommand::REMOVE), + o => Err(anyhow::anyhow!("Unknown variant {} for enum RecklessSubcommand", o)), + } + } + } + + impl ToString for RecklessSubcommand { + fn to_string(&self) -> String { + match self { + RecklessSubcommand::ADD => "ADD", + RecklessSubcommand::LIST => "LIST", + RecklessSubcommand::REMOVE => "REMOVE", + }.to_string() + } + } + + /// ['Determines which command to pass to reckless', ' - *command* **install** takes a *plugin_name* to search for and install a named plugin.', ' - *command* **uninstall** takes a *plugin_name* and attempts to uninstall a plugin of the same name.', ' - *command* **help** takes a *command* to display help for (plain text).', '...'] + #[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] + #[allow(non_camel_case_types)] + pub enum RecklessCommand { + #[serde(rename = "install")] + INSTALL = 0, + #[serde(rename = "update")] + UPDATE = 1, + #[serde(rename = "uninstall")] + UNINSTALL = 2, + #[serde(rename = "listavailable")] + LISTAVAILABLE = 3, + #[serde(rename = "listinstalled")] + LISTINSTALLED = 4, + #[serde(rename = "enable")] + ENABLE = 5, + #[serde(rename = "disable")] + DISABLE = 6, + #[serde(rename = "source")] + SOURCE = 7, + #[serde(rename = "tip")] + TIP = 8, + #[serde(rename = "help")] + HELP = 9, + } + + impl TryFrom for RecklessCommand { + type Error = anyhow::Error; + fn try_from(c: i32) -> Result { + match c { + 0 => Ok(RecklessCommand::INSTALL), + 1 => Ok(RecklessCommand::UPDATE), + 2 => Ok(RecklessCommand::UNINSTALL), + 3 => Ok(RecklessCommand::LISTAVAILABLE), + 4 => Ok(RecklessCommand::LISTINSTALLED), + 5 => Ok(RecklessCommand::ENABLE), + 6 => Ok(RecklessCommand::DISABLE), + 7 => Ok(RecklessCommand::SOURCE), + 8 => Ok(RecklessCommand::TIP), + 9 => Ok(RecklessCommand::HELP), + o => Err(anyhow::anyhow!("Unknown variant {} for enum RecklessCommand", o)), + } + } + } + + impl ToString for RecklessCommand { + fn to_string(&self) -> String { + match self { + RecklessCommand::INSTALL => "INSTALL", + RecklessCommand::UPDATE => "UPDATE", + RecklessCommand::UNINSTALL => "UNINSTALL", + RecklessCommand::LISTAVAILABLE => "LISTAVAILABLE", + RecklessCommand::LISTINSTALLED => "LISTINSTALLED", + RecklessCommand::ENABLE => "ENABLE", + RecklessCommand::DISABLE => "DISABLE", + RecklessCommand::SOURCE => "SOURCE", + RecklessCommand::TIP => "TIP", + RecklessCommand::HELP => "HELP", + }.to_string() + } + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessRequest { + #[serde(skip_serializing_if = "Option::is_none")] + pub amount_msat: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub developer: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub payer_note: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub subcommand: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub target: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub verbose: Option, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub options: Option>, + // Path `Reckless.command` + pub command: RecklessCommand, + } + + impl From for Request { + fn from(r: RecklessRequest) -> Self { + Request::Reckless(r) + } + } + + impl IntoRequest for RecklessRequest { + type Response = super::responses::RecklessResponse; + } + + impl TypedRequest for RecklessRequest { + type Response = super::responses::RecklessResponse; + + fn method(&self) -> &str { + "reckless" + } + } } @@ -11354,6 +11489,12 @@ pub mod responses { pub values_str: Vec, } + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct ListconfigsConfigsRecklessdir { + pub source: String, + pub value_str: String, + } + #[derive(Clone, Debug, Deserialize, Serialize)] pub struct ListconfigsConfigsRequireconfirmedinputs { pub source: String, @@ -11697,6 +11838,9 @@ pub mod responses { #[serde(rename = "plugin-dir")] #[serde(skip_serializing_if = "Option::is_none")] pub plugin_dir: Option, + #[serde(rename = "reckless-dir")] + #[serde(skip_serializing_if = "Option::is_none")] + pub reckless_dir: Option, #[serde(rename = "require-confirmed-inputs")] #[serde(skip_serializing_if = "Option::is_none")] pub require_confirmed_inputs: Option, @@ -13416,5 +13560,181 @@ pub mod responses { } } + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessDisable { + pub plugin_name: String, + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessEnable { + pub plugin_name: String, + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessInstall { + #[serde(skip_serializing_if = "Option::is_none")] + pub installed_commit: Option, + pub enabled: bool, + pub plugin_name: String, + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessTip { + pub amount_msat: Amount, + pub amount_sent_msat: Amount, + pub failed_parts: u64, + pub payment_preimage: Secret, + pub successful_parts: u64, + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessUninstall { + pub plugin_name: String, + } + + /// ['The name of the plugin installer that will be used.'] + #[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] + #[allow(non_camel_case_types)] + pub enum RecklessListavailableInstaller { + #[serde(rename = "PythonUv")] + PYTHONUV = 0, + #[serde(rename = "PythonUvShebang")] + PYTHONUVSHEBANG = 1, + #[serde(rename = "PythonUvLegacy")] + PYTHONUVLEGACY = 2, + #[serde(rename = "PoetryVenv")] + POETRYVENV = 3, + #[serde(rename = "PyprojectViaPip")] + PYPROJECTVIAPIP = 4, + #[serde(rename = "Python")] + PYTHON = 5, + #[serde(rename = "Nodejs")] + NODEJS = 6, + #[serde(rename = "Rust")] + RUST = 7, + #[serde(rename = "Go")] + GO = 8, + #[serde(rename = "Custom")] + CUSTOM = 9, + } + + impl TryFrom for RecklessListavailableInstaller { + type Error = anyhow::Error; + fn try_from(c: i32) -> Result { + match c { + 0 => Ok(RecklessListavailableInstaller::PYTHONUV), + 1 => Ok(RecklessListavailableInstaller::PYTHONUVSHEBANG), + 2 => Ok(RecklessListavailableInstaller::PYTHONUVLEGACY), + 3 => Ok(RecklessListavailableInstaller::POETRYVENV), + 4 => Ok(RecklessListavailableInstaller::PYPROJECTVIAPIP), + 5 => Ok(RecklessListavailableInstaller::PYTHON), + 6 => Ok(RecklessListavailableInstaller::NODEJS), + 7 => Ok(RecklessListavailableInstaller::RUST), + 8 => Ok(RecklessListavailableInstaller::GO), + 9 => Ok(RecklessListavailableInstaller::CUSTOM), + o => Err(anyhow::anyhow!("Unknown variant {} for enum RecklessListavailableInstaller", o)), + } + } + } + + impl ToString for RecklessListavailableInstaller { + fn to_string(&self) -> String { + match self { + RecklessListavailableInstaller::PYTHONUV => "PYTHONUV", + RecklessListavailableInstaller::PYTHONUVSHEBANG => "PYTHONUVSHEBANG", + RecklessListavailableInstaller::PYTHONUVLEGACY => "PYTHONUVLEGACY", + RecklessListavailableInstaller::POETRYVENV => "POETRYVENV", + RecklessListavailableInstaller::PYPROJECTVIAPIP => "PYPROJECTVIAPIP", + RecklessListavailableInstaller::PYTHON => "PYTHON", + RecklessListavailableInstaller::NODEJS => "NODEJS", + RecklessListavailableInstaller::RUST => "RUST", + RecklessListavailableInstaller::GO => "GO", + RecklessListavailableInstaller::CUSTOM => "CUSTOM", + }.to_string() + } + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessListavailableManifest { + #[serde(skip_serializing_if = "Option::is_none")] + pub installable: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub long_description: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub offer: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub short_description: Option, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub dependencies: Option>, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub install_cmd: Option>, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub required_options: Option>, + pub entrypoint: String, + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessListavailable { + // Path `Reckless.listavailable[].installer` + pub installer: RecklessListavailableInstaller, + pub manifest: RecklessListavailableManifest, + pub origin: String, + pub plugin_name: String, + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessListinstalled { + #[serde(skip_serializing_if = "Option::is_none")] + pub installed_commit: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub requested_commit: Option, + pub installation_date: String, + pub installation_time: f64, + pub original_source: String, + pub plugin_name: String, + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessUpdate { + #[serde(skip_serializing_if = "Option::is_none")] + pub installed_commit: Option, + pub enabled: bool, + pub plugin_name: String, + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct RecklessResponse { + #[serde(skip_serializing_if = "Option::is_none")] + pub disable: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub enable: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub install: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub tip: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub uninstall: Option, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub listavailable: Option>, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub listinstalled: Option>, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub sources: Option>, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub update: Option>, + pub log: Vec, + } + + impl TryFrom for RecklessResponse { + type Error = super::TryFromResponseError; + + fn try_from(response: Response) -> Result { + match response { + Response::Reckless(response) => Ok(response), + _ => Err(TryFromResponseError) + } + } + } + } diff --git a/cln-rpc/src/notifications.rs b/cln-rpc/src/notifications.rs index 41d70605ee55..30b07355813a 100644 --- a/cln-rpc/src/notifications.rs +++ b/cln-rpc/src/notifications.rs @@ -55,6 +55,8 @@ pub enum Notification { PayPartEnd(PayPartEndNotification), #[serde(rename = "pay_part_start")] PayPartStart(PayPartStartNotification), + #[serde(rename = "reckless_log")] + RecklessLog(RecklessLogNotification), } @@ -938,6 +940,61 @@ pub struct PayPartStartNotification { pub total_payment_msat: Amount, } +/// ['The log level of the emitted message.'] +#[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] +#[allow(non_camel_case_types)] +pub enum RecklessLogLevel { + #[serde(rename = "io")] + IO = 0, + #[serde(rename = "trace")] + TRACE = 1, + #[serde(rename = "debug")] + DEBUG = 2, + #[serde(rename = "info")] + INFO = 3, + #[serde(rename = "unusual")] + UNUSUAL = 4, + #[serde(rename = "broken")] + BROKEN = 5, +} + +impl TryFrom for RecklessLogLevel { + type Error = anyhow::Error; + fn try_from(c: i32) -> Result { + match c { + 0 => Ok(RecklessLogLevel::IO), + 1 => Ok(RecklessLogLevel::TRACE), + 2 => Ok(RecklessLogLevel::DEBUG), + 3 => Ok(RecklessLogLevel::INFO), + 4 => Ok(RecklessLogLevel::UNUSUAL), + 5 => Ok(RecklessLogLevel::BROKEN), + o => Err(anyhow::anyhow!("Unknown variant {} for enum RecklessLogLevel", o)), + } + } +} + +impl ToString for RecklessLogLevel { + fn to_string(&self) -> String { + match self { + RecklessLogLevel::IO => "IO", + RecklessLogLevel::TRACE => "TRACE", + RecklessLogLevel::DEBUG => "DEBUG", + RecklessLogLevel::INFO => "INFO", + RecklessLogLevel::UNUSUAL => "UNUSUAL", + RecklessLogLevel::BROKEN => "BROKEN", + }.to_string() + } +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct RecklessLogNotification { + // Path `reckless_log.level` + pub level: RecklessLogLevel, + pub log: String, + pub time: String, + pub timestamp: String, +} + pub mod requests{ use serde::{Serialize, Deserialize}; @@ -1037,4 +1094,8 @@ use serde::{Serialize, Deserialize}; pub struct StreamPayPartStartRequest { } + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct StreamRecklessLogRequest { + } + } diff --git a/contrib/msggen/msggen/schema.json b/contrib/msggen/msggen/schema.json index 741c2b612788..3377eb877882 100644 --- a/contrib/msggen/msggen/schema.json +++ b/contrib/msggen/msggen/schema.json @@ -22406,6 +22406,31 @@ ] } } + }, + "reckless-dir": { + "added": "v26.09", + "type": "object", + "additionalProperties": false, + "required": [ + "value_str", + "source" + ], + "properties": { + "value_str": { + "added": "v26.09", + "type": "string", + "description": [ + "Field from config or cmdline, or default." + ] + }, + "source": { + "added": "v26.09", + "type": "string", + "description": [ + "Source of configuration setting." + ] + } + } } } } @@ -33091,11 +33116,6 @@ "active": true, "dynamic": true }, - { - "name": "/usr/local/libexec/plugins/recklessrpc", - "active": true, - "dynamic": true - }, { "name": "/usr/local/libexec/plugins/recover", "active": true, @@ -33146,6 +33166,11 @@ "active": true, "dynamic": true }, + { + "name": "/usr/local/libexec/plugins/cln-reckless", + "active": true, + "dynamic": true + }, { "name": "/usr/local/libexec/plugins/bookkeeper", "active": true, @@ -33239,11 +33264,6 @@ "active": true, "dynamic": true }, - { - "name": "/usr/local/libexec/plugins/recklessrpc", - "active": true, - "dynamic": true - }, { "name": "/usr/local/libexec/plugins/recover", "active": true, @@ -33294,6 +33314,11 @@ "active": true, "dynamic": true }, + { + "name": "/usr/local/libexec/plugins/cln-reckless", + "active": true, + "dynamic": true + }, { "name": "/usr/local/libexec/plugins/bookkeeper", "active": true, @@ -33465,10 +33490,11 @@ "reckless.json": { "$schema": "../rpc-schema-draft.json", "type": "object", + "added": "v22.11", "rpc": "reckless", - "title": "Issue a command to the reckless plugin manager utility", + "title": "Reckless, a plugin manager", "description": [ - "The **reckless** RPC starts a reckless process with the *command* and *target* provided. Node configuration, network, and lightning direrctory are automatically passed to the reckless utility." + "The **reckless** RPC lets you manage plugins. It has multiple commands available, best described in the **help** command." ], "request": { "required": [ @@ -33480,63 +33506,411 @@ "type": "string", "enum": [ "install", + "update", "uninstall", - "search", + "listavailable", + "listinstalled", "enable", "disable", "source", - "--version" + "tip", + "help" ], "description": [ "Determines which command to pass to reckless", " - *command* **install** takes a *plugin_name* to search for and install a named plugin.", " - *command* **uninstall** takes a *plugin_name* and attempts to uninstall a plugin of the same name.", - " - *command* **search** takes a *plugin_name* to search for a named plugin.", + " - *command* **help** takes a *command* to display help for (plain text).", "..." ] }, - "target/subcommand": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "array" - } + "subcommand": { + "type": "string", + "enum": [ + "add", + "list", + "remove" ], "description": [ - "Target of a reckless command or a subcommand." + "A subcommand. Only in combination with *command* **source**." ] }, "target": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "array" - } - ], + "type": "string", + "description": [ + "*name* of a plugin to install/update/uninstall/listavailable/enable/disable or source to add/remove. Can also have a git ref added with `@` to install a specific version." + ] + }, + "options": { + "type": "array", + "added": "v26.09", + "items": { + "type": "string" + }, "description": [ - "*name* of a plugin to install/uninstall/search/enable/disable or source to add/remove." + "Plugin options to be used with the commands **install**/**update**/**enable** in the form of `key=value`." + ] + }, + "amount_msat": { + "type": "msat", + "added": "v26.09", + "description": [ + "The amount of msat to send when using the *command* **tip**." + ] + }, + "payer_note": { + "type": "string", + "added": "v26.09", + "description": [ + "A message that a payer is willing to send to a payee when using the *command* **tip**." + ] + }, + "verbose": { + "type": "boolean", + "added": "v26.09", + "description": [ + "Verbose output for all logging outputs for this command." + ] + }, + "developer": { + "type": "boolean", + "added": "v26.09", + "description": [ + "Build plugins in debug mode and do not clean up build files where applicable." ] } } }, "response": { "required": [ - "log", - "result" + "log" ], "additionalProperties": false, "properties": { - "result": { + "install": { + "type": "object", + "added": "v26.09", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was installed." + ] + }, + "enabled": { + "type": "boolean", + "description": [ + "Whether the plugin was enabled or not." + ] + }, + "installed_commit": { + "type": "string", + "description": [ + "The git ref that was installed. Only present if source is a remote git repository." + ] + } + }, + "required": [ + "plugin_name", + "enabled" + ], + "additionalProperties": false + }, + "update": { + "type": "array", + "added": "v26.09", + "items": { + "type": "object", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was updated." + ] + }, + "enabled": { + "type": "boolean", + "description": [ + "Whether the plugin was enabled or not." + ] + }, + "installed_commit": { + "type": "string", + "description": [ + "The git ref that the plugin was updated to. Only present if source is a remote git repository." + ] + } + }, + "required": [ + "plugin_name", + "enabled" + ], + "additionalProperties": false + } + }, + "uninstall": { + "type": "object", + "added": "v26.09", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was uninstalled." + ] + } + }, + "required": [ + "plugin_name" + ], + "additionalProperties": false + }, + "enable": { + "type": "object", + "added": "v26.09", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was enabled." + ] + } + }, + "required": [ + "plugin_name" + ], + "additionalProperties": false + }, + "disable": { + "type": "object", + "added": "v26.09", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was disabled." + ] + } + }, + "required": [ + "plugin_name" + ], + "additionalProperties": false + }, + "listavailable": { + "type": "array", + "added": "v26.09", + "items": { + "type": "object", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was listed." + ] + }, + "installer": { + "type": "string", + "enum": [ + "PythonUv", + "PythonUvShebang", + "PythonUvLegacy", + "PoetryVenv", + "PyprojectViaPip", + "Python", + "Nodejs", + "Rust", + "Go", + "Custom" + ], + "description": [ + "The name of the plugin installer that will be used." + ] + }, + "manifest": { + "type": "object", + "properties": { + "short_description": { + "type": "string", + "description": [ + "A short description of the plugin." + ] + }, + "long_description": { + "type": "string", + "description": [ + "A long description of the plugin." + ] + }, + "entrypoint": { + "type": "string", + "description": [ + "The entrypoint for the plugin." + ] + }, + "dependencies": { + "type": "array", + "items": { + "type": "string" + }, + "description": [ + "Programs needed to install this plugin." + ] + }, + "install_cmd": { + "type": "array", + "items": { + "type": "string" + }, + "description": [ + "Custom commands needed to install this plugin, if the default installers do not work." + ] + }, + "required_options": { + "type": "array", + "items": { + "type": "string" + }, + "description": [ + "Options needed to install this plugin." + ] + }, + "offer": { + "type": "string", + "description": [ + "An offer for users to tip for this plugin." + ] + }, + "installable": { + "type": "boolean", + "description": [ + "Whether this plugin is reckless-installable." + ] + } + }, + "required": [ + "entrypoint" + ], + "additionalProperties": false + }, + "origin": { + "type": "string", + "description": [ + "The origin of the plugin." + ] + } + }, + "required": [ + "plugin_name", + "installer", + "manifest", + "origin" + ], + "additionalProperties": false + } + }, + "listinstalled": { + "type": "array", + "added": "v26.09", + "items": { + "type": "object", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was listed." + ] + }, + "installation_date": { + "type": "string", + "description": [ + "The date the plugin was installed." + ] + }, + "installation_time": { + "type": "number", + "description": [ + "The timestamp the plugin was installed." + ] + }, + "original_source": { + "type": "string", + "description": [ + "The original source of the plugin." + ] + }, + "requested_commit": { + "type": "string", + "description": [ + "The git ref that was requested to be installed." + ] + }, + "installed_commit": { + "type": "string", + "description": [ + "The git ref that was installed." + ] + } + }, + "required": [ + "plugin_name", + "installation_date", + "installation_time", + "original_source" + ], + "additionalProperties": false + } + }, + "sources": { "type": "array", + "added": "v26.09", "items": { "type": "string" }, "description": [ - "Output of the requested reckless command." + "The list of current sources." + ] + }, + "tip": { + "type": "object", + "added": "v26.09", + "properties": { + "payment_preimage": { + "type": "secret", + "description": [ + "The proof of payment: SHA256 of this **payment_hash**." + ] + }, + "failed_parts": { + "type": "u64", + "description": [ + "How many separate payment parts failed." + ] + }, + "successful_parts": { + "type": "u64", + "description": [ + "How many separate payment parts succeeded (or are anticipated to succeed). This will be at least one." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "Amount the recipient received." + ] + }, + "amount_sent_msat": { + "type": "msat", + "description": [ + "Total amount we sent (including fees)." + ] + } + }, + "required": [ + "payment_preimage", + "failed_parts", + "successful_parts", + "amount_msat", + "amount_sent_msat" ] }, "log": { @@ -33545,13 +33919,14 @@ "type": "string" }, "description": [ - "Verbose log entries of the requested reckless command." + "Log entries of the requested reckless command." ] } } }, "author": [ - "Alex Myers [alex@endothermic.dev](mailto:alex@endothermic.dev) is mainly responsible." + "Alex Myers [alex@endothermic.dev](mailto:alex@endothermic.dev) is mainly responsible for the original python reckless.", + "daywalker90 [daywalker990@gmx.de](mailto:daywalker990@gmx.de) is mainly responsible for the current rust reckless." ], "see_also": [ "reckless(1)" @@ -33565,90 +33940,82 @@ "id": "example:reckless#1", "method": "reckless", "params": { - "command": "search", - "target/subcommand": "backup" + "command": "install", + "target": "summary" } }, "response": { - "result": [ - "https://github.com/lightningd/plugins" - ], + "install": { + "enabled": false, + "installed_commit": "002761088174c151237e8a847c50603db20d5abf", + "plugin_name": "summary" + }, "log": [ - "DEBUG: Warning: Reckless requires write access", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/contents/", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/git/trees/294f93d7060799439c994daa84f534c4d1458325", - "INFO: found backup in source: https://github.com/lightningd/plugins", - "DEBUG: entry: None", - "DEBUG: sub-directory: backup" + "INFO: running command: `git clone --recursive https://github.com/lightningd/plugins /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins`", + "", + "INFO: running command: `git submodule sync --recursive` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins)", + "", + "INFO: running command: `git submodule update --init --recursive` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins)", + "WARNING: could not detect installer for /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins: entryfile not found", + "INFO: Plugins matching 'summary':", + "INFO: summary (https://github.com/lightningd/plugins)", + "INFO: found summary in source: https://github.com/lightningd/plugins", + "INFO: running command: `git pull --ff-only` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins)", + "INFO: Already up to date.", + "INFO: running command: `git submodule sync --recursive` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins)", + "", + "INFO: running command: `git submodule update --init --recursive` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins)", + "INFO: running command: `git checkout HEAD` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins/summary)", + "INFO: Your branch is up to date with 'origin/master'.", + "INFO: using installer pythonuvshebang", + "INFO: running command: `git rev-parse HEAD` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins/summary)", + "INFO: 002761088174c151237e8a847c50603db20d5abf", + "INFO: plugin installed: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/summary/summary.py", + "WARNING: plugin exited before sending getmanifest response", + "WARNING: summary failed to start, it may require options, read the logs!" ] } }, { "request": { - "id": "example:reckless#2", + "id": "example:reckless#1", "method": "reckless", "params": { - "command": "install", - "target/subcommand": [ - "summars", - "currecyrate" - ] + "command": "tip", + "target": "summary", + "amount_msat": 1000, + "payer_note": "thanks!" } }, "response": { - "result": [ - "/tmp/l1/reckless/summars", - "/tmp/l1/reckless/currencyrate" - ], + "tip": { + "amount_msat": 1000, + "amount_sent_msat": 1000, + "failed_parts": 0, + "payment_preimage": "940148d45ce964205c289a215d2b45e7bad32caa4318eb1977184fe424d04a00", + "successful_parts": 1 + }, "log": [ - "DEBUG: Searching for summars", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/contents/", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/git/trees/294f93d7060799439c994daa84f534c4d1458325", - "INFO: found summars in source: https://github.com/lightningd/plugins", - "DEBUG: entry: None", - "DEBUG: sub-directory: summars", - "DEBUG: Retrieving summars from https://github.com/lightningd/plugins", - "DEBUG: Install requested from InstInfo(summars, https://github.com/lightningd/plugins, None, None, None, summars).", - "INFO: cloning Source.GITHUB_REPO InstInfo(summars, https://github.com/lightningd/plugins, None, None, None, summars)", - "DEBUG: cloned_src: InstInfo(summars, /tmp/reckless-726255950dyifh_fh/clone, None, Cargo.toml, Cargo.toml, summars/summars)", - "DEBUG: using latest commit of default branch", - "DEBUG: checked out HEAD: 5e449468bd57db7d0f33178fe0dc867e0da94133", - "DEBUG: using installer rust", - "DEBUG: creating /tmp/l1/reckless/summars", - "DEBUG: creating /tmp/l1/reckless/summars/source", - "DEBUG: copying /tmp/reckless-726255950dyifh_fh/clone/summars/summars tree to /tmp/l1/reckless/summars/source/summars", - "DEBUG: linking source /tmp/l1/reckless/summars/source/summars/Cargo.toml to /tmp/l1/reckless/summars/Cargo.toml", - "DEBUG: InstInfo(summars, /tmp/l1/reckless/summars, None, Cargo.toml, Cargo.toml, source/summars)", - "DEBUG: cargo installing from /tmp/l1/reckless/summars/source/summars", - "DEBUG: rust project compiled successfully", - "INFO: plugin installed: /tmp/l1/reckless/summars", - "DEBUG: activating summars", - "INFO: summars enabled", - "DEBUG: Searching for currencyrate", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/contents/", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/git/trees/294f93d7060799439c994daa84f534c4d1458325", - "INFO: found currencyrate in source: https://github.com/lightningd/plugins", - "DEBUG: entry: None", - "DEBUG: sub-directory: currencyrate", - "DEBUG: Retrieving currencyrate from https://github.com/lightningd/plugins", - "DEBUG: Install requested from InstInfo(currencyrate, https://github.com/lightningd/plugins, None, None, None, currencyrate).", - "INFO: cloning Source.GITHUB_REPO InstInfo(currencyrate, https://github.com/lightningd/plugins, None, None, None, currencyrate)", - "DEBUG: cloned_src: InstInfo(currencyrate, /tmp/reckless-192564272t478naxn/clone, None, currencyrate.py, requirements.txt, currencyrate/currencyrate)", - "DEBUG: using latest commit of default branch", - "DEBUG: checked out HEAD: 5e449468bd57db7d0f33178fe0dc867e0da94133", - "DEBUG: using installer python3venv", - "DEBUG: creating /tmp/l1/reckless/currencyrate", - "DEBUG: creating /tmp/l1/reckless/currencyrate/source", - "DEBUG: copying /tmp/reckless-192564272t478naxn/clone/currencyrate/currencyrate tree to /tmp/l1/reckless/currencyrate/source/currencyrate", - "DEBUG: linking source /tmp/l1/reckless/currencyrate/source/currencyrate/currencyrate.py to /tmp/l1/reckless/currencyrate/currencyrate.py", - "DEBUG: InstInfo(currencyrate, /tmp/l1/reckless/currencyrate, None, currencyrate.py, requirements.txt, source/currencyrate)", - "DEBUG: configuring a python virtual environment (pip) in /tmp/l1/reckless/currencyrate/.venv", - "DEBUG: virtual environment created in /tmp/l1/reckless/currencyrate/.venv.", - "INFO: dependencies installed successfully", - "DEBUG: virtual environment for cloned plugin: .venv", - "INFO: plugin installed: /tmp/l1/reckless/currencyrate", - "DEBUG: activating currencyrate", - "INFO: currencyrate enabled" + "WARNING: summary is not installed", + "INFO: summary not installed, searching in sources...", + "INFO: running command: `git remote set-head origin -a` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "INFO: origin/HEAD set to master", + "INFO: running command: `git symbolic-ref refs/remotes/origin/HEAD --short` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "INFO: origin/master", + "INFO: running command: `git checkout master` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "WARNING: Already on 'master'", + "INFO: Your branch is up to date with 'origin/master'.", + "INFO: running command: `git pull --ff-only` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "INFO: Already up to date.", + "INFO: running command: `git submodule sync --recursive` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "", + "INFO: running command: `git submodule update --init --recursive` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "WARNING: could not detect installer for /tmp/l1/reckless/lightningd/plugins: entryfile not found", + "INFO: Plugins matching 'summary':", + "INFO: summary (/media/addonssd/dev/plugins/summary)", + "INFO: found summary in source: /media/addonssd/dev/plugins/summary", + "INFO: Sending 1000msat to summary author...", + "INFO: Successfully sent 1000msat to summary author!" ] } } @@ -42443,6 +42810,60 @@ } } }, + "reckless_log.json": { + "$schema": "../../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "notification": "reckless_log", + "title": "Notification for reckless log events", + "description": [ + "The **reckless_log** notification informs whenever the reckless plugin emits a log message during **install** or **update**" + ], + "added": "v26.09", + "request": {}, + "response": { + "required": [ + "level", + "time", + "timestamp", + "log" + ], + "properties": { + "level": { + "type": "string", + "enum": [ + "io", + "trace", + "debug", + "info", + "unusual", + "broken" + ], + "description": [ + "The log level of the emitted message." + ] + }, + "time": { + "type": "string", + "description": [ + "The event time as seconds since epoch with subsecond precision." + ] + }, + "timestamp": { + "type": "string", + "description": [ + "The event time in ISO 8601 format." + ] + }, + "log": { + "type": "string", + "description": [ + "The original log message." + ] + } + } + } + }, "sendpay_failure.json": { "$schema": "../../rpc-schema-draft.json", "type": "object", diff --git a/contrib/msggen/msggen/utils/utils.py b/contrib/msggen/msggen/utils/utils.py index 84260309ae9f..3b86b436a602 100644 --- a/contrib/msggen/msggen/utils/utils.py +++ b/contrib/msggen/msggen/utils/utils.py @@ -163,6 +163,7 @@ "CreateProof", "Xkeysend", "Graceful", + "Reckless", ] grpc_notification_names = [ @@ -198,6 +199,7 @@ "schema_name": "xpay_pay_part_start", "typename": "PayPartStart", }, + {"name": "reckless_log", "typename": "RecklessLog"}, ] hook_names = [ diff --git a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py index 39695b729bfc..dd4e4730ecb2 100644 --- a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py +++ b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py @@ -25,7 +25,7 @@ from pyln.grpc import primitives_pb2 as primitives__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nnode.proto\x12\x03\x63ln\x1a\x10primitives.proto\"\x10\n\x0eGetinfoRequest\"\xb1\x04\n\x0fGetinfoResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05\x61lias\x18\x02 \x01(\t\x12\r\n\x05\x63olor\x18\x03 \x01(\x0c\x12\x11\n\tnum_peers\x18\x04 \x01(\r\x12\x1c\n\x14num_pending_channels\x18\x05 \x01(\r\x12\x1b\n\x13num_active_channels\x18\x06 \x01(\r\x12\x1d\n\x15num_inactive_channels\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\t\x12\x15\n\rlightning_dir\x18\t \x01(\t\x12\x32\n\x0cour_features\x18\n \x01(\x0b\x32\x17.cln.GetinfoOurFeaturesH\x00\x88\x01\x01\x12\x13\n\x0b\x62lockheight\x18\x0b \x01(\r\x12\x0f\n\x07network\x18\x0c \x01(\t\x12(\n\x13\x66\x65\x65s_collected_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x07\x61\x64\x64ress\x18\x0e \x03(\x0b\x32\x13.cln.GetinfoAddress\x12$\n\x07\x62inding\x18\x0f \x03(\x0b\x32\x13.cln.GetinfoBinding\x12\"\n\x15warning_bitcoind_sync\x18\x10 \x01(\tH\x01\x88\x01\x01\x12$\n\x17warning_lightningd_sync\x18\x11 \x01(\tH\x02\x88\x01\x01\x42\x0f\n\r_our_featuresB\x18\n\x16_warning_bitcoind_syncB\x1a\n\x18_warning_lightningd_sync\"\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\"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\"\xb5\x01\n\x10ListpeersRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x38\n\x05level\x18\x02 \x01(\x0e\x32$.cln.ListpeersRequest.ListpeersLevelH\x01\x88\x01\x01\"E\n\x0eListpeersLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\x0b\n\x07UNUSUAL\x10\x03\x12\t\n\x05TRACE\x10\x04\x42\x05\n\x03_idB\x08\n\x06_level\"7\n\x11ListpeersResponse\x12\"\n\x05peers\x18\x01 \x03(\x0b\x32\x13.cln.ListpeersPeers\"\xc9\x01\n\x0eListpeersPeers\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x11\n\tconnected\x18\x02 \x01(\x08\x12#\n\x03log\x18\x03 \x03(\x0b\x32\x16.cln.ListpeersPeersLog\x12\x0f\n\x07netaddr\x18\x05 \x03(\t\x12\x15\n\x08\x66\x65\x61tures\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0bremote_addr\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x0cnum_channels\x18\x08 \x01(\rB\x0b\n\t_featuresB\x0e\n\x0c_remote_addr\"\x88\x03\n\x11ListpeersPeersLog\x12?\n\titem_type\x18\x01 \x01(\x0e\x32,.cln.ListpeersPeersLog.ListpeersPeersLogType\x12\x18\n\x0bnum_skipped\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04time\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03log\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07node_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x11\n\x04\x64\x61ta\x18\x07 \x01(\x0cH\x05\x88\x01\x01\"t\n\x15ListpeersPeersLogType\x12\x0b\n\x07SKIPPED\x10\x00\x12\n\n\x06\x42ROKEN\x10\x01\x12\x0b\n\x07UNUSUAL\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\t\n\x05IO_IN\x10\x05\x12\n\n\x06IO_OUT\x10\x06\x12\t\n\x05TRACE\x10\x07\x42\x0e\n\x0c_num_skippedB\x07\n\x05_timeB\t\n\x07_sourceB\x06\n\x04_logB\n\n\x08_node_idB\x07\n\x05_data\"0\n\x10ListfundsRequest\x12\x12\n\x05spent\x18\x01 \x01(\x08H\x00\x88\x01\x01\x42\x08\n\x06_spent\"e\n\x11ListfundsResponse\x12&\n\x07outputs\x18\x01 \x03(\x0b\x32\x15.cln.ListfundsOutputs\x12(\n\x08\x63hannels\x18\x02 \x03(\x0b\x32\x16.cln.ListfundsChannels\"\x97\x02\n\x11ListfundsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12$\n\x0four_amount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x04 \x01(\x0c\x12\x16\n\x0e\x66unding_output\x18\x05 \x01(\r\x12\x11\n\tconnected\x18\x06 \x01(\x08\x12 \n\x05state\x18\x07 \x01(\x0e\x32\x11.cln.ChannelState\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x12\n\nchannel_id\x18\t \x01(\x0c\x42\x13\n\x11_short_channel_id\"\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\"\xbb\x03\n\x0eSendpayRequest\x12 \n\x05route\x18\x01 \x03(\x0b\x32\x11.cln.SendpayRoute\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x13\n\x06partid\x18\x07 \x01(\x04H\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\t \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x08\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_bolt11B\x11\n\x0f_payment_secretB\t\n\x07_partidB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x13\n\x11_payment_metadataB\x0e\n\x0c_description\"\x96\x05\n\x0fSendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x32\n\x06status\x18\x04 \x01(\x0e\x32\".cln.SendpayResponse.SendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x14\n\x07message\x18\x0e \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0f \x01(\x04H\t\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\"*\n\rSendpayStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\x0f\n\r_completed_atB\x10\n\x0e_updated_index\"\xe6\x02\n\x0cSendpayRoute\x12\x0f\n\x02id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05\x64\x65lay\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x14\n\x07\x63hannel\x18\x04 \x01(\tH\x02\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12!\n\x14short_channel_id_dir\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x18\n\x0bnode_id_out\x18\x07 \x01(\x0cH\x05\x88\x01\x01\x12)\n\x0f\x61mount_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x15\n\x08\x63ltv_out\x18\t \x01(\rH\x07\x88\x01\x01\x42\x05\n\x03_idB\x08\n\x06_delayB\n\n\x08_channelB\x0e\n\x0c_amount_msatB\x17\n\x15_short_channel_id_dirB\x0e\n\x0c_node_id_outB\x12\n\x10_amount_out_msatB\x0b\n\t_cltv_out\"\x93\x01\n\x13ListchannelsRequest\x12\x1d\n\x10short_channel_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06source\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\t\n\x07_sourceB\x0e\n\x0c_destination\"C\n\x14ListchannelsResponse\x12+\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x19.cln.ListchannelsChannels\"\xb3\x03\n\x14ListchannelsChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\x0e\n\x06public\x18\x04 \x01(\x08\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\rmessage_flags\x18\x06 \x01(\r\x12\x15\n\rchannel_flags\x18\x07 \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x08 \x01(\x08\x12\x13\n\x0blast_update\x18\t \x01(\r\x12\x1d\n\x15\x62\x61se_fee_millisatoshi\x18\n \x01(\r\x12\x19\n\x11\x66\x65\x65_per_millionth\x18\x0b \x01(\r\x12\r\n\x05\x64\x65lay\x18\x0c \x01(\r\x12&\n\x11htlc_minimum_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x11htlc_maximum_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x0f \x01(\x0c\x12\x11\n\tdirection\x18\x10 \x01(\rB\x14\n\x12_htlc_maximum_msat\"#\n\x10\x41\x64\x64gossipRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x13\n\x11\x41\x64\x64gossipResponse\"\xaf\x01\n\x14\x41\x64\x64psbtoutputRequest\x12\x1f\n\x07satoshi\x18\x01 \x01(\x0b\x32\x0e.cln.AmountSat\x12\x15\n\x08locktime\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_locktimeB\x0e\n\x0c_initialpsbtB\x0e\n\x0c_destination\"U\n\x15\x41\x64\x64psbtoutputResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1e\n\x16\x65stimated_added_weight\x18\x02 \x01(\r\x12\x0e\n\x06outnum\x18\x03 \x01(\r\"O\n\x14\x41utocleanonceRequest\x12*\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystem\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x04\"G\n\x15\x41utocleanonceResponse\x12.\n\tautoclean\x18\x01 \x01(\x0b\x32\x1b.cln.AutocleanonceAutoclean\"\x89\x05\n\x16\x41utocleanonceAutoclean\x12L\n\x11succeededforwards\x18\x01 \x01(\x0b\x32,.cln.AutocleanonceAutocleanSucceededforwardsH\x00\x88\x01\x01\x12\x46\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32).cln.AutocleanonceAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x44\n\rsucceededpays\x18\x03 \x01(\x0b\x32(.cln.AutocleanonceAutocleanSucceededpaysH\x02\x88\x01\x01\x12>\n\nfailedpays\x18\x04 \x01(\x0b\x32%.cln.AutocleanonceAutocleanFailedpaysH\x03\x88\x01\x01\x12\x42\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32\'.cln.AutocleanonceAutocleanPaidinvoicesH\x04\x88\x01\x01\x12H\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32*.cln.AutocleanonceAutocleanExpiredinvoicesH\x05\x88\x01\x01\x12\x44\n\rnetworkevents\x18\x07 \x01(\x0b\x32(.cln.AutocleanonceAutocleanNetworkeventsH\x06\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoicesB\x10\n\x0e_networkevents\"K\n%AutocleanonceAutocleanExpiredinvoices\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\"F\n AutocleanonceAutocleanFailedpays\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"I\n#AutocleanonceAutocleanNetworkevents\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"H\n\"AutocleanonceAutocleanPaidinvoices\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"M\n\'AutocleanonceAutocleanSucceededforwards\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\"W\n\x16\x41utocleanstatusRequest\x12/\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystemH\x00\x88\x01\x01\x42\x0c\n\n_subsystem\"K\n\x17\x41utocleanstatusResponse\x12\x30\n\tautoclean\x18\x01 \x01(\x0b\x32\x1d.cln.AutocleanstatusAutoclean\"\x99\x05\n\x18\x41utocleanstatusAutoclean\x12N\n\x11succeededforwards\x18\x01 \x01(\x0b\x32..cln.AutocleanstatusAutocleanSucceededforwardsH\x00\x88\x01\x01\x12H\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32+.cln.AutocleanstatusAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x46\n\rsucceededpays\x18\x03 \x01(\x0b\x32*.cln.AutocleanstatusAutocleanSucceededpaysH\x02\x88\x01\x01\x12@\n\nfailedpays\x18\x04 \x01(\x0b\x32\'.cln.AutocleanstatusAutocleanFailedpaysH\x03\x88\x01\x01\x12\x44\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32).cln.AutocleanstatusAutocleanPaidinvoicesH\x04\x88\x01\x01\x12J\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32,.cln.AutocleanstatusAutocleanExpiredinvoicesH\x05\x88\x01\x01\x12\x46\n\rnetworkevents\x18\x07 \x01(\x0b\x32*.cln.AutocleanstatusAutocleanNetworkeventsH\x06\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoicesB\x10\n\x0e_networkevents\"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\"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\"`\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\"c\n%AutocleanstatusAutocleanNetworkevents\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"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\"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\"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\"U\n\x13\x43heckmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\r\n\x05zbase\x18\x02 \x01(\t\x12\x13\n\x06pubkey\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x42\t\n\x07_pubkey\"8\n\x14\x43heckmessageResponse\x12\x10\n\x08verified\x18\x01 \x01(\x08\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\"\xcb\x02\n\x0c\x43loseRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1e\n\x11unilateraltimeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\tH\x01\x88\x01\x01\x12!\n\x14\x66\x65\x65_negotiation_step\x18\x04 \x01(\tH\x02\x88\x01\x01\x12)\n\rwrong_funding\x18\x05 \x01(\x0b\x32\r.cln.OutpointH\x03\x88\x01\x01\x12\x1f\n\x12\x66orce_lease_closed\x18\x06 \x01(\x08H\x04\x88\x01\x01\x12\x1e\n\x08\x66\x65\x65range\x18\x07 \x03(\x0b\x32\x0c.cln.FeerateB\x14\n\x12_unilateraltimeoutB\x0e\n\x0c_destinationB\x17\n\x15_fee_negotiation_stepB\x10\n\x0e_wrong_fundingB\x15\n\x13_force_lease_closed\"\x93\x01\n\rCloseResponse\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.CloseResponse.CloseType\x12\x0b\n\x03txs\x18\x04 \x03(\x0c\x12\r\n\x05txids\x18\x05 \x03(\x0c\"5\n\tCloseType\x12\n\n\x06MUTUAL\x10\x00\x12\x0e\n\nUNILATERAL\x10\x01\x12\x0c\n\x08UNOPENED\x10\x02\"T\n\x0e\x43onnectRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\x04host\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04port\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x07\n\x05_hostB\x07\n\x05_port\"\xb4\x01\n\x0f\x43onnectResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0c\x12\x38\n\tdirection\x18\x03 \x01(\x0e\x32%.cln.ConnectResponse.ConnectDirection\x12$\n\x07\x61\x64\x64ress\x18\x04 \x01(\x0b\x32\x13.cln.ConnectAddress\"#\n\x10\x43onnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\xfb\x01\n\x0e\x43onnectAddress\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.ConnectAddress.ConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"P\n\x12\x43onnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"J\n\x14\x43reateinvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x10\n\x08preimage\x18\x03 \x01(\x0c\"\xe6\x05\n\x15\x43reateinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12>\n\x06status\x18\x06 \x01(\x0e\x32..cln.CreateinvoiceResponse.CreateinvoiceStatus\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x16\n\tpay_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x06\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12:\n\rpaid_outpoint\x18\x11 \x01(\x0b\x32\x1e.cln.CreateinvoicePaidOutpointH\t\x88\x01\x01\"8\n\x13\x43reateinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_paid_outpoint\"9\n\x19\x43reateinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xb4\x02\n\x10\x44\x61tastoreRequest\x12\x10\n\x03hex\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x36\n\x04mode\x18\x03 \x01(\x0e\x32#.cln.DatastoreRequest.DatastoreModeH\x01\x88\x01\x01\x12\x17\n\ngeneration\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\t\x12\x13\n\x06string\x18\x06 \x01(\tH\x03\x88\x01\x01\"p\n\rDatastoreMode\x12\x0f\n\x0bMUST_CREATE\x10\x00\x12\x10\n\x0cMUST_REPLACE\x10\x01\x12\x15\n\x11\x43REATE_OR_REPLACE\x10\x02\x12\x0f\n\x0bMUST_APPEND\x10\x03\x12\x14\n\x10\x43REATE_OR_APPEND\x10\x04\x42\x06\n\x04_hexB\x07\n\x05_modeB\r\n\x0b_generationB\t\n\x07_string\"\x82\x01\n\x11\x44\x61tastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"$\n\x15\x44\x61tastoreusageRequest\x12\x0b\n\x03key\x18\x01 \x03(\t\"S\n\x16\x44\x61tastoreusageResponse\x12\x39\n\x0e\x64\x61tastoreusage\x18\x01 \x01(\x0b\x32!.cln.DatastoreusageDatastoreusage\"@\n\x1c\x44\x61tastoreusageDatastoreusage\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x13\n\x0btotal_bytes\x18\x02 \x01(\x04\"\x9d\x01\n\x12\x43reateonionRequest\x12\"\n\x04hops\x18\x01 \x03(\x0b\x32\x14.cln.CreateonionHops\x12\x11\n\tassocdata\x18\x02 \x01(\x0c\x12\x18\n\x0bsession_key\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x17\n\nonion_size\x18\x04 \x01(\rH\x01\x88\x01\x01\x42\x0e\n\x0c_session_keyB\r\n\x0b_onion_size\"<\n\x13\x43reateonionResponse\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x16\n\x0eshared_secrets\x18\x02 \x03(\x0c\"2\n\x0f\x43reateonionHops\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"J\n\x13\x44\x65ldatastoreRequest\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x03 \x03(\tB\r\n\x0b_generation\"\x85\x01\n\x14\x44\x65ldatastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xb6\x01\n\x11\x44\x65linvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\x12\x37\n\x06status\x18\x02 \x01(\x0e\x32\'.cln.DelinvoiceRequest.DelinvoiceStatus\x12\x15\n\x08\x64\x65sconly\x18\x03 \x01(\x08H\x00\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\x0b\n\t_desconly\"\xcf\x05\n\x12\x44\x65linvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x38\n\x06status\x18\x07 \x01(\x0e\x32(.cln.DelinvoiceResponse.DelinvoiceStatus\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0c \x01(\x04\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x06\x88\x01\x01\x12\x16\n\tpay_index\x18\x0e \x01(\x04H\x07\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x14\n\x07paid_at\x18\x10 \x01(\x04H\t\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x11 \x01(\x0cH\n\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\x9f\x01\n\x17\x44\x65vforgetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nchannel_id\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05\x66orce\x18\x04 \x01(\x08H\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x08\n\x06_force\"Y\n\x18\x44\x65vforgetchannelResponse\x12\x0e\n\x06\x66orced\x18\x01 \x01(\x08\x12\x17\n\x0f\x66unding_unspent\x18\x02 \x01(\x08\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\"\x19\n\x17\x45mergencyrecoverRequest\")\n\x18\x45mergencyrecoverResponse\x12\r\n\x05stubs\x18\x01 \x03(\x0c\" \n\x1eGetemergencyrecoverdataRequest\"\x8a\x01\n\x1fGetemergencyrecoverdataResponse\x12\x10\n\x08\x66iledata\x18\x01 \x01(\x0c\x12\x1f\n\x12\x63\x61n_create_penalty\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x1d\n\x15\x62\x61\x63ked_up_channel_ids\x18\x03 \x03(\x0c\x42\x15\n\x13_can_create_penalty\"Q\n\x13\x45xposesecretRequest\x12\x12\n\npassphrase\x18\x01 \x01(\t\x12\x17\n\nidentifier\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\r\n\x0b_identifier\"_\n\x14\x45xposesecretResponse\x12\x12\n\nidentifier\x18\x01 \x01(\t\x12\x0f\n\x07\x63odex32\x18\x02 \x01(\t\x12\x15\n\x08mnemonic\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x0b\n\t_mnemonic\"#\n\x0eRecoverRequest\x12\x11\n\thsmsecret\x18\x01 \x01(\t\"x\n\x0fRecoverResponse\x12\x32\n\x06result\x18\x01 \x01(\x0e\x32\".cln.RecoverResponse.RecoverResult\"1\n\rRecoverResult\x12 \n\x1cRECOVERY_RESTART_IN_PROGRESS\x10\x00\"$\n\x15RecoverchannelRequest\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"\'\n\x16RecoverchannelResponse\x12\r\n\x05stubs\x18\x01 \x03(\t\"\x99\x02\n\x0eInvoiceRequest\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05label\x18\x03 \x01(\t\x12\x11\n\tfallbacks\x18\x04 \x03(\t\x12\x15\n\x08preimage\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x11\n\x04\x63ltv\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18\x07 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x15\x65xposeprivatechannels\x18\x08 \x03(\t\x12\x19\n\x0c\x64\x65schashonly\x18\t \x01(\x08H\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x10.cln.AmountOrAnyB\x0b\n\t_preimageB\x07\n\x05_cltvB\t\n\x07_expiryB\x0f\n\r_deschashonly\"\xfe\x02\n\x0fInvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x16\n\x0epayment_secret\x18\x03 \x01(\x0c\x12\x12\n\nexpires_at\x18\x04 \x01(\x04\x12\x1d\n\x10warning_capacity\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x0fwarning_offline\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10warning_deadends\x18\x07 \x01(\tH\x02\x88\x01\x01\x12#\n\x16warning_private_unused\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x0bwarning_mpp\x18\t \x01(\tH\x04\x88\x01\x01\x12\x15\n\rcreated_index\x18\n \x01(\x04\x42\x13\n\x11_warning_capacityB\x12\n\x10_warning_offlineB\x13\n\x11_warning_deadendsB\x19\n\x17_warning_private_unusedB\x0e\n\x0c_warning_mpp\"\xe1\x01\n\x15InvoicerequestRequest\x12\x1b\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x05 \x01(\x04H\x02\x88\x01\x01\x12\x17\n\nsingle_use\x18\x06 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_issuerB\x08\n\x06_labelB\x12\n\x10_absolute_expiryB\r\n\x0b_single_use\"\x8b\x01\n\x16InvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"1\n\x1c\x44isableinvoicerequestRequest\x12\x11\n\tinvreq_id\x18\x01 \x01(\t\"\x92\x01\n\x1d\x44isableinvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"l\n\x1aListinvoicerequestsRequest\x12\x16\n\tinvreq_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0c\n\n_invreq_idB\x0e\n\x0c_active_only\"_\n\x1bListinvoicerequestsResponse\x12@\n\x0finvoicerequests\x18\x01 \x03(\x0b\x32\'.cln.ListinvoicerequestsInvoicerequests\"\x97\x01\n\"ListinvoicerequestsInvoicerequests\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"#\n\x14ListdatastoreRequest\x12\x0b\n\x03key\x18\x02 \x03(\t\"G\n\x15ListdatastoreResponse\x12.\n\tdatastore\x18\x01 \x03(\x0b\x32\x1b.cln.ListdatastoreDatastore\"\x87\x01\n\x16ListdatastoreDatastore\x12\x0b\n\x03key\x18\x01 \x03(\t\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xde\x02\n\x13ListinvoicesRequest\x12\x12\n\x05label\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x15\n\x08offer_id\x18\x04 \x01(\tH\x03\x88\x01\x01\x12>\n\x05index\x18\x05 \x01(\x0e\x32*.cln.ListinvoicesRequest.ListinvoicesIndexH\x04\x88\x01\x01\x12\x12\n\x05start\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x12\n\x05limit\x18\x07 \x01(\rH\x06\x88\x01\x01\"-\n\x11ListinvoicesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x0f\n\r_payment_hashB\x0b\n\t_offer_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListinvoicesResponse\x12+\n\x08invoices\x18\x01 \x03(\x0b\x32\x19.cln.ListinvoicesInvoices\"\xbc\x06\n\x14ListinvoicesInvoices\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListinvoicesInvoices.ListinvoicesInvoicesStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x16\n\tpay_index\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x14\n\x07paid_at\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0e \x01(\x0cH\x08\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\t\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\x12\x41\n\rpaid_outpoint\x18\x12 \x01(\x0b\x32%.cln.ListinvoicesInvoicesPaidOutpointH\x0b\x88\x01\x01\"?\n\x1aListinvoicesInvoicesStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x11\n\x0f_local_offer_idB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"@\n ListinvoicesInvoicesPaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xf6\x03\n\x10SendonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12)\n\tfirst_hop\x18\x02 \x01(\x0b\x32\x16.cln.SendonionFirstHop\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\x05label\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x16\n\x0eshared_secrets\x18\x05 \x03(\x0c\x12\x13\n\x06partid\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\t \x01(\x0cH\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x12+\n\x11total_amount_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\x0e\n\x0c_destinationB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x0e\n\x0c_descriptionB\x14\n\x12_total_amount_msat\"\xd0\x04\n\x11SendonionResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x36\n\x06status\x18\x03 \x01(\x0e\x32&.cln.SendonionResponse.SendonionStatus\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x06 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\n \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0b \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x07message\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06partid\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0e \x01(\x04\x12\x1a\n\rupdated_index\x18\x0f \x01(\x04H\x08\x88\x01\x01\",\n\x0fSendonionStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\t\n\x07_partidB\x10\n\x0e_updated_index\"P\n\x11SendonionFirstHop\x12\n\n\x02id\x18\x01 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\r\n\x05\x64\x65lay\x18\x03 \x01(\r\"\xa0\x03\n\x13ListsendpaysRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12@\n\x06status\x18\x03 \x01(\x0e\x32+.cln.ListsendpaysRequest.ListsendpaysStatusH\x02\x88\x01\x01\x12>\n\x05index\x18\x04 \x01(\x0e\x32*.cln.ListsendpaysRequest.ListsendpaysIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\"-\n\x11ListsendpaysIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\";\n\x12ListsendpaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\t\n\x07_bolt11B\x0f\n\r_payment_hashB\t\n\x07_statusB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListsendpaysResponse\x12+\n\x08payments\x18\x01 \x03(\x0b\x32\x19.cln.ListsendpaysPayments\"\xe5\x05\n\x14ListsendpaysPayments\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListsendpaysPayments.ListsendpaysPaymentsStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\n \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0b \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\nerroronion\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06partid\x18\x0f \x01(\x04H\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\t\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x12 \x01(\x04H\n\x88\x01\x01\"C\n\x1aListsendpaysPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\r\n\x0b_erroronionB\x0e\n\x0c_descriptionB\t\n\x07_partidB\x10\n\x0e_updated_indexB\x0f\n\r_completed_at\"\x19\n\x17ListtransactionsRequest\"S\n\x18ListtransactionsResponse\x12\x37\n\x0ctransactions\x18\x01 \x03(\x0b\x32!.cln.ListtransactionsTransactions\"\xf8\x01\n\x1cListtransactionsTransactions\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\r\n\x05rawtx\x18\x02 \x01(\x0c\x12\x13\n\x0b\x62lockheight\x18\x03 \x01(\r\x12\x0f\n\x07txindex\x18\x04 \x01(\r\x12\x10\n\x08locktime\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x37\n\x06inputs\x18\t \x03(\x0b\x32\'.cln.ListtransactionsTransactionsInputs\x12\x39\n\x07outputs\x18\n \x03(\x0b\x32(.cln.ListtransactionsTransactionsOutputs\"S\n\"ListtransactionsTransactionsInputs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\r\n\x05index\x18\x02 \x01(\r\x12\x10\n\x08sequence\x18\x03 \x01(\r\"l\n#ListtransactionsTransactionsOutputs\x12\r\n\x05index\x18\x01 \x01(\r\x12\x14\n\x0cscriptPubKey\x18\x03 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\"M\n\x11MakesecretRequest\x12\x10\n\x03hex\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x13\n\x06string\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x06\n\x04_hexB\t\n\x07_string\"$\n\x12MakesecretResponse\x12\x0e\n\x06secret\x18\x01 \x01(\x0c\"\xc7\x04\n\nPayRequest\x12\x12\n\x06\x62olt11\x18\x01 \x01(\tB\x02\x18\x01\x12\x16\n\x05label\x18\x03 \x01(\tB\x02\x18\x01H\x00\x88\x01\x01\x12\x1e\n\rmaxfeepercent\x18\x04 \x01(\x01\x42\x02\x18\x01H\x01\x88\x01\x01\x12\x1a\n\tretry_for\x18\x05 \x01(\rB\x02\x18\x01H\x02\x88\x01\x01\x12\x19\n\x08maxdelay\x18\x06 \x01(\rB\x02\x18\x01H\x03\x88\x01\x01\x12\'\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x04\x88\x01\x01\x12\x1b\n\nriskfactor\x18\x08 \x01(\x01\x42\x02\x18\x01H\x05\x88\x01\x01\x12\x13\n\x07\x65xclude\x18\n \x03(\tB\x02\x18\x01\x12$\n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x06\x88\x01\x01\x12\x1c\n\x0b\x64\x65scription\x18\x0c \x01(\tB\x02\x18\x01H\x07\x88\x01\x01\x12)\n\x0b\x61mount_msat\x18\r \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x08\x88\x01\x01\x12\x1e\n\rlocalinvreqid\x18\x0e \x01(\x0c\x42\x02\x18\x01H\t\x88\x01\x01\x12*\n\x0cpartial_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\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\"\xab\x03\n\x0bPayResponse\x12\x1c\n\x10payment_preimage\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x1c\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x42\x02\x18\x01H\x00\x88\x01\x01\x12\x18\n\x0cpayment_hash\x18\x03 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\ncreated_at\x18\x04 \x01(\x01\x42\x02\x18\x01\x12\x11\n\x05parts\x18\x05 \x01(\rB\x02\x18\x01\x12$\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12)\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12+\n\x1awarning_partial_completion\x18\x08 \x01(\tB\x02\x18\x01H\x01\x88\x01\x01\x12.\n\x06status\x18\t \x01(\x0e\x32\x1a.cln.PayResponse.PayStatusB\x02\x18\x01\">\n\tPayStatus\x12\x10\n\x08\x43OMPLETE\x10\x00\x1a\x02\x08\x01\x12\x0f\n\x07PENDING\x10\x01\x1a\x02\x08\x01\x12\x0e\n\x06\x46\x41ILED\x10\x02\x1a\x02\x08\x01\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\"\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\"\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\"g\n\x15WaitanyinvoiceRequest\x12\x1a\n\rlastpay_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\x10\n\x0e_lastpay_indexB\n\n\x08_timeout\"\xbc\x05\n\x16WaitanyinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12@\n\x06status\x18\x04 \x01(\x0e\x32\x30.cln.WaitanyinvoiceResponse.WaitanyinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\t \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\r \x01(\x04\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12;\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1f.cln.WaitanyinvoicePaidOutpointH\t\x88\x01\x01\"-\n\x14WaitanyinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\":\n\x1aWaitanyinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"#\n\x12WaitinvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\"\xad\x05\n\x13WaitinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.WaitinvoiceResponse.WaitinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\t \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\r \x01(\x04\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12\x38\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1c.cln.WaitinvoicePaidOutpointH\t\x88\x01\x01\"*\n\x11WaitinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"7\n\x17WaitinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\x8e\x01\n\x12WaitsendpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x13\n\x06partid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x02\x88\x01\x01\x42\t\n\x07_partidB\n\n\x08_timeoutB\n\n\x08_groupid\"\xf7\x04\n\x13WaitsendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.WaitsendpayResponse.WaitsendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0e \x01(\x01H\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0f \x01(\x04\x12\x1a\n\rupdated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\"!\n\x11WaitsendpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\x0f\n\r_completed_atB\x10\n\x0e_updated_index\"\x97\x01\n\x0eNewaddrRequest\x12@\n\x0b\x61\x64\x64resstype\x18\x01 \x01(\x0e\x32&.cln.NewaddrRequest.NewaddrAddresstypeH\x00\x88\x01\x01\"3\n\x12NewaddrAddresstype\x12\n\n\x06\x42\x45\x43H32\x10\x00\x12\x07\n\x03\x41LL\x10\x02\x12\x08\n\x04P2TR\x10\x03\x42\x0e\n\x0c_addresstype\"M\n\x0fNewaddrResponse\x12\x13\n\x06\x62\x65\x63h32\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04p2tr\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_bech32B\x07\n\x05_p2tr\"\xbc\x01\n\x0fWithdrawRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\t\x12$\n\x07satoshi\x18\x02 \x01(\x0b\x32\x13.cln.AmountSatOrAll\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\"\xd7\x03\n\x0eKeysendRequest\x12\x17\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\x05label\x18\x03 \x01(\tB\x02\x18\x01H\x00\x88\x01\x01\x12\x1e\n\rmaxfeepercent\x18\x04 \x01(\x01\x42\x02\x18\x01H\x01\x88\x01\x01\x12\x1a\n\tretry_for\x18\x05 \x01(\rB\x02\x18\x01H\x02\x88\x01\x01\x12\x19\n\x08maxdelay\x18\x06 \x01(\rB\x02\x18\x01H\x03\x88\x01\x01\x12\'\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x04\x88\x01\x01\x12/\n\nroutehints\x18\x08 \x01(\x0b\x32\x12.cln.RoutehintListB\x02\x18\x01H\x05\x88\x01\x01\x12*\n\textratlvs\x18\t \x01(\x0b\x32\x0e.cln.TlvStreamB\x02\x18\x01H\x06\x88\x01\x01\x12$\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12$\n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\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\"\x9a\x03\n\x0fKeysendResponse\x12\x1c\n\x10payment_preimage\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x1c\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x42\x02\x18\x01H\x00\x88\x01\x01\x12\x18\n\x0cpayment_hash\x18\x03 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\ncreated_at\x18\x04 \x01(\x01\x42\x02\x18\x01\x12\x11\n\x05parts\x18\x05 \x01(\rB\x02\x18\x01\x12$\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12)\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12+\n\x1awarning_partial_completion\x18\x08 \x01(\tB\x02\x18\x01H\x01\x88\x01\x01\x12\x36\n\x06status\x18\t \x01(\x0e\x32\".cln.KeysendResponse.KeysendStatusB\x02\x18\x01\"!\n\rKeysendStatus\x12\x10\n\x08\x43OMPLETE\x10\x00\x1a\x02\x08\x01\x42\x0e\n\x0c_destinationB\x1d\n\x1b_warning_partial_completion\"\xa7\x03\n\x0f\x46undpsbtRequest\x12$\n\x07satoshi\x18\x01 \x01(\x0b\x32\x13.cln.AmountSatOrAll\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\"\xa3\x03\n\x0fUtxopsbtRequest\x12$\n\x07satoshi\x18\x01 \x01(\x0b\x32\x13.cln.AmountSatOrAll\x12\x1d\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.Feerate\x12\x13\n\x0bstartweight\x18\x03 \x01(\r\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\x14\n\x07reserve\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08locktime\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1f\n\x12min_witness_weight\x18\x07 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nreservedok\x18\x08 \x01(\x08H\x03\x88\x01\x01\x12\x1d\n\x10\x65xcess_as_change\x18\t \x01(\x08H\x04\x88\x01\x01\x12#\n\x16opening_anchor_channel\x18\n \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_reserveB\x0b\n\t_locktimeB\x15\n\x13_min_witness_weightB\r\n\x0b_reservedokB\x13\n\x11_excess_as_changeB\x19\n\x17_opening_anchor_channel\"\xd9\x01\n\x10UtxopsbtResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\x0e\x66\x65\x65rate_per_kw\x18\x02 \x01(\r\x12\x1e\n\x16\x65stimated_final_weight\x18\x03 \x01(\r\x12 \n\x0b\x65xcess_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1a\n\rchange_outnum\x18\x05 \x01(\rH\x00\x88\x01\x01\x12/\n\x0creservations\x18\x06 \x03(\x0b\x32\x19.cln.UtxopsbtReservationsB\x10\n\x0e_change_outnum\"u\n\x14UtxopsbtReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\" \n\x10TxdiscardRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"6\n\x11TxdiscardResponse\x12\x13\n\x0bunsigned_tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xa4\x01\n\x10TxprepareRequest\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12 \n\x07outputs\x18\x05 \x03(\x0b\x32\x0f.cln.OutputDescB\n\n\x08_feerateB\n\n\x08_minconf\"D\n\x11TxprepareResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x13\n\x0bunsigned_tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"\x1d\n\rTxsendRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"8\n\x0eTxsendResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"\x8d\x01\n\x17ListpeerchannelsRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nchannel_id\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x05\n\x03_idB\x13\n\x11_short_channel_idB\r\n\x0b_channel_id\"K\n\x18ListpeerchannelsResponse\x12/\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1d.cln.ListpeerchannelsChannels\"\xd1\x1a\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\x43\n\x0c\x63hannel_type\x18\x05 \x01(\x0b\x32(.cln.ListpeerchannelsChannelsChannelTypeH\x01\x88\x01\x01\x12:\n\x07\x66\x65\x65rate\x18\x06 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFeerateH\x02\x88\x01\x01\x12\x12\n\x05owner\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x04\x88\x01\x01\x12\x17\n\nchannel_id\x18\t \x01(\x0cH\x05\x88\x01\x01\x12\x19\n\x0c\x66unding_txid\x18\n \x01(\x0cH\x06\x88\x01\x01\x12\x1b\n\x0e\x66unding_outnum\x18\x0b \x01(\rH\x07\x88\x01\x01\x12\x1c\n\x0finitial_feerate\x18\x0c \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0clast_feerate\x18\r \x01(\tH\t\x88\x01\x01\x12\x19\n\x0cnext_feerate\x18\x0e \x01(\tH\n\x88\x01\x01\x12\x1a\n\rnext_fee_step\x18\x0f \x01(\rH\x0b\x88\x01\x01\x12\x37\n\x08inflight\x18\x10 \x03(\x0b\x32%.cln.ListpeerchannelsChannelsInflight\x12\x15\n\x08\x63lose_to\x18\x11 \x01(\x0cH\x0c\x88\x01\x01\x12\x14\n\x07private\x18\x12 \x01(\x08H\r\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\x0e\x88\x01\x01\x12:\n\x07\x66unding\x18\x16 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFundingH\x0f\x88\x01\x01\x12$\n\nto_us_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x10\x88\x01\x01\x12(\n\x0emin_to_us_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\x11\x88\x01\x01\x12(\n\x0emax_to_us_msat\x18\x19 \x01(\x0b\x32\x0b.cln.AmountH\x12\x88\x01\x01\x12$\n\ntotal_msat\x18\x1a \x01(\x0b\x32\x0b.cln.AmountH\x13\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x1b \x01(\x0b\x32\x0b.cln.AmountH\x14\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x1c \x01(\rH\x15\x88\x01\x01\x12)\n\x0f\x64ust_limit_msat\x18\x1d \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@\n\rstate_changes\x18* \x03(\x0b\x32).cln.ListpeerchannelsChannelsStateChanges\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\x12\x10\n\x08\x66\x65\x61tures\x18? \x03(\tB\x0f\n\r_scratch_txidB\x0f\n\r_channel_typeB\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\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\"]\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\"X\n#ListpeerchannelsChannelsChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"?\n\x1fListpeerchannelsChannelsFeerate\x12\r\n\x05perkw\x18\x01 \x01(\r\x12\r\n\x05perkb\x18\x02 \x01(\r\"\xdd\x02\n\x1fListpeerchannelsChannelsFunding\x12%\n\x0bpushed_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12%\n\x10local_funds_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11remote_funds_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\rfee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\'\n\rfee_rcvd_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x11\n\x04psbt\x18\x06 \x01(\tH\x03\x88\x01\x01\x12\x15\n\x08withheld\x18\x07 \x01(\x08H\x04\x88\x01\x01\x42\x0e\n\x0c_pushed_msatB\x10\n\x0e_fee_paid_msatB\x10\n\x0e_fee_rcvd_msatB\x07\n\x05_psbtB\x0b\n\t_withheld\"\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\"\xf4\x01\n ListpeerchannelsChannelsInflight\x12\x14\n\x0c\x66unding_txid\x18\x01 \x01(\x0c\x12\x16\n\x0e\x66unding_outnum\x18\x02 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x03 \x01(\t\x12\'\n\x12total_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10our_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x0cscratch_txid\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\rsplice_amount\x18\x07 \x01(\x12\x42\x0f\n\r_scratch_txid\"\xf0\x02\n$ListpeerchannelsChannelsStateChanges\x12\x11\n\ttimestamp\x18\x01 \x01(\t\x12$\n\told_state\x18\x02 \x01(\x0e\x32\x11.cln.ChannelState\x12$\n\tnew_state\x18\x03 \x01(\x0e\x32\x11.cln.ChannelState\x12\x62\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32S.cln.ListpeerchannelsChannelsStateChanges.ListpeerchannelsChannelsStateChangesCause\x12\x0f\n\x07message\x18\x05 \x01(\t\"t\n)ListpeerchannelsChannelsStateChangesCause\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\"\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\"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\"\xae\x0b\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\x12K\n\x0c\x63hannel_type\x18\x08 \x01(\x0b\x32\x30.cln.ListclosedchannelsClosedchannelsChannelTypeH\x04\x88\x01\x01\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\x05\x88\x01\x01\x12/\n\x15\x66unding_fee_rcvd_msat\x18\x10 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12-\n\x13\x66unding_pushed_msat\x18\x11 \x01(\x0b\x32\x0b.cln.AmountH\x07\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\x08\x88\x01\x01\x12\x32\n\x18last_commitment_fee_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\t\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\n\x88\x01\x01\x12\x19\n\x0c\x66unding_psbt\x18\x1a \x01(\tH\x0b\x88\x01\x01\x12\x1d\n\x10\x66unding_withheld\x18\x1b \x01(\x08H\x0c\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\x0f\n\r_channel_typeB\x18\n\x16_funding_fee_paid_msatB\x18\n\x16_funding_fee_rcvd_msatB\x16\n\x14_funding_pushed_msatB\x17\n\x15_last_commitment_txidB\x1b\n\x19_last_commitment_fee_msatB\x19\n\x17_last_stable_connectionB\x0f\n\r_funding_psbtB\x13\n\x11_funding_withheld\"e\n%ListclosedchannelsClosedchannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"`\n+ListclosedchannelsClosedchannelsChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x1f\n\rDecodeRequest\x12\x0e\n\x06string\x18\x01 \x01(\t\"\xbd.\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\x39\n\x10offer_recurrence\x18\x12 \x01(\x0b\x32\x1a.cln.DecodeOfferRecurrenceH\x0c\x88\x01\x01\x12\x37\n\x12unknown_offer_tlvs\x18\x13 \x03(\x0b\x32\x1b.cln.DecodeUnknownOfferTlvs\x12.\n!warning_invalid_offer_description\x18\x15 \x01(\tH\r\x88\x01\x01\x12.\n!warning_missing_offer_description\x18\x16 \x01(\tH\x0e\x88\x01\x01\x12+\n\x1ewarning_invalid_offer_currency\x18\x17 \x01(\tH\x0f\x88\x01\x01\x12)\n\x1cwarning_invalid_offer_issuer\x18\x18 \x01(\tH\x10\x88\x01\x01\x12\x1c\n\x0finvreq_metadata\x18\x19 \x01(\x0cH\x11\x88\x01\x01\x12\x1c\n\x0finvreq_payer_id\x18\x1a \x01(\x0cH\x12\x88\x01\x01\x12\x19\n\x0cinvreq_chain\x18\x1b \x01(\x0cH\x13\x88\x01\x01\x12,\n\x12invreq_amount_msat\x18\x1c \x01(\x0b\x32\x0b.cln.AmountH\x14\x88\x01\x01\x12\x1c\n\x0finvreq_features\x18\x1d \x01(\x0cH\x15\x88\x01\x01\x12\x1c\n\x0finvreq_quantity\x18\x1e \x01(\x04H\x16\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x1f \x01(\tH\x17\x88\x01\x01\x12&\n\x19invreq_recurrence_counter\x18 \x01(\rH\x18\x88\x01\x01\x12$\n\x17invreq_recurrence_start\x18! \x01(\rH\x19\x88\x01\x01\x12J\n\x1cunknown_invoice_request_tlvs\x18\" \x03(\x0b\x32$.cln.DecodeUnknownInvoiceRequestTlvs\x12,\n\x1fwarning_missing_invreq_metadata\x18# \x01(\tH\x1a\x88\x01\x01\x12,\n\x1fwarning_missing_invreq_payer_id\x18$ \x01(\tH\x1b\x88\x01\x01\x12.\n!warning_invalid_invreq_payer_note\x18% \x01(\tH\x1c\x88\x01\x01\x12\x36\n)warning_missing_invoice_request_signature\x18& \x01(\tH\x1d\x88\x01\x01\x12\x36\n)warning_invalid_invoice_request_signature\x18\' \x01(\tH\x1e\x88\x01\x01\x12.\n\rinvoice_paths\x18( \x03(\x0b\x32\x17.cln.DecodeInvoicePaths\x12\x1f\n\x12invoice_created_at\x18) \x01(\x04H\x1f\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\x14unknown_invoice_tlvs\x18\x31 \x03(\x0b\x32\x1d.cln.DecodeUnknownInvoiceTlvs\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(\x04H/\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18= \x01(\x04H0\x88\x01\x01\x12\x12\n\x05payee\x18> \x01(\x0cH1\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18? \x01(\x0cH2\x88\x01\x01\x12\x1d\n\x10\x64\x65scription_hash\x18@ \x01(\x0cH3\x88\x01\x01\x12\"\n\x15min_final_cltv_expiry\x18\x41 \x01(\rH4\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x42 \x01(\x0cH5\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x43 \x01(\x0cH6\x88\x01\x01\x12\x1f\n\x05\x65xtra\x18\x45 \x03(\x0b\x32\x10.cln.DecodeExtra\x12\x16\n\tunique_id\x18\x46 \x01(\tH7\x88\x01\x01\x12\x14\n\x07version\x18G \x01(\tH8\x88\x01\x01\x12\x13\n\x06string\x18H \x01(\tH9\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(\tH@\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18Q \x01(\x0cHA\x88\x01\x01\x12-\n\x06routes\x18R \x01(\x0b\x32\x18.cln.DecodeRoutehintListHB\x88\x01\x01\x12\x1c\n\x0foffer_issuer_id\x18S \x01(\x0cHC\x88\x01\x01\x12,\n\x1fwarning_missing_offer_issuer_id\x18T \x01(\tHD\x88\x01\x01\x12,\n\x0cinvreq_paths\x18U \x03(\x0b\x32\x16.cln.DecodeInvreqPaths\x12\'\n\x1awarning_empty_blinded_path\x18V \x01(\tHE\x88\x01\x01\x12=\n\x13invreq_bip_353_name\x18W \x01(\x0b\x32\x1b.cln.DecodeInvreqBip353NameHF\x88\x01\x01\x12\x35\n(warning_invreq_bip_353_name_name_invalid\x18X \x01(\tHG\x88\x01\x01\x12\x37\n*warning_invreq_bip_353_name_domain_invalid\x18Y \x01(\tHH\x88\x01\x01\x12%\n\x18invreq_recurrence_cancel\x18Z \x01(\x08HI\x88\x01\x01\x12=\n0warning_invreq_recurrence_cancel_without_counter\x18[ \x01(\tHJ\x88\x01\x01\x12?\n2warning_invreq_recurrence_cancel_with_zero_counter\x18\\ \x01(\tHK\x88\x01\x01\x12\x1b\n\x0eproof_preimage\x18] \x01(\x0cHL\x88\x01\x01\x12\x1a\n\x12proof_omitted_tlvs\x18^ \x03(\x04\x12\x1c\n\x14proof_missing_hashes\x18_ \x03(\x0c\x12\x19\n\x11proof_leaf_hashes\x18` \x03(\x0c\x12\x17\n\nproof_note\x18\x61 \x01(\tHM\x88\x01\x01\x12\x1c\n\x0fproof_signature\x18\x62 \x01(\tHN\x88\x01\x01\x12\x42\n\x18unknown_payer_proof_tlvs\x18\x63 \x03(\x0b\x32 .cln.DecodeUnknownPayerProofTlvs\"\x9b\x01\n\nDecodeType\x12\x10\n\x0c\x42OLT12_OFFER\x10\x00\x12\x12\n\x0e\x42OLT12_INVOICE\x10\x01\x12\x1a\n\x16\x42OLT12_INVOICE_REQUEST\x10\x02\x12\x12\n\x0e\x42OLT11_INVOICE\x10\x03\x12\x08\n\x04RUNE\x10\x04\x12\x15\n\x11\x45MERGENCY_RECOVER\x10\x05\x12\x16\n\x12\x42OLT12_PAYER_PROOF\x10\x06\x42\x0b\n\t_offer_idB\x11\n\x0f_offer_metadataB\x11\n\x0f_offer_currencyB!\n\x1f_warning_unknown_offer_currencyB\x16\n\x14_currency_minor_unitB\x0f\n\r_offer_amountB\x14\n\x12_offer_amount_msatB\x14\n\x12_offer_descriptionB\x0f\n\r_offer_issuerB\x11\n\x0f_offer_featuresB\x18\n\x16_offer_absolute_expiryB\x15\n\x13_offer_quantity_maxB\x13\n\x11_offer_recurrenceB$\n\"_warning_invalid_offer_descriptionB$\n\"_warning_missing_offer_descriptionB!\n\x1f_warning_invalid_offer_currencyB\x1f\n\x1d_warning_invalid_offer_issuerB\x12\n\x10_invreq_metadataB\x12\n\x10_invreq_payer_idB\x0f\n\r_invreq_chainB\x15\n\x13_invreq_amount_msatB\x12\n\x10_invreq_featuresB\x12\n\x10_invreq_quantityB\x14\n\x12_invreq_payer_noteB\x1c\n\x1a_invreq_recurrence_counterB\x1a\n\x18_invreq_recurrence_startB\"\n _warning_missing_invreq_metadataB\"\n _warning_missing_invreq_payer_idB$\n\"_warning_invalid_invreq_payer_noteB,\n*_warning_missing_invoice_request_signatureB,\n*_warning_invalid_invoice_request_signatureB\x15\n\x13_invoice_created_atB\x1a\n\x18_invoice_relative_expiryB\x17\n\x15_invoice_payment_hashB\x16\n\x14_invoice_amount_msatB\x13\n\x11_invoice_featuresB\x12\n\x10_invoice_node_idB\x1e\n\x1c_invoice_recurrence_basetimeB \n\x1e_warning_missing_invoice_pathsB%\n#_warning_missing_invoice_blindedpayB%\n#_warning_missing_invoice_created_atB\'\n%_warning_missing_invoice_payment_hashB!\n\x1f_warning_missing_invoice_amountB.\n,_warning_missing_invoice_recurrence_basetimeB\"\n _warning_missing_invoice_node_idB$\n\"_warning_missing_invoice_signatureB$\n\"_warning_invalid_invoice_signatureB\r\n\x0b_created_atB\t\n\x07_expiryB\x08\n\x06_payeeB\x0f\n\r_payment_hashB\x13\n\x11_description_hashB\x18\n\x16_min_final_cltv_expiryB\x11\n\x0f_payment_secretB\x13\n\x11_payment_metadataB\x0c\n\n_unique_idB\n\n\x08_versionB\t\n\x07_stringB\x1c\n\x1a_warning_rune_invalid_utf8B\x06\n\x04_hexB\x0c\n\n_decryptedB\x0c\n\n_signatureB\x0b\n\t_currencyB\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x0b\n\t_featuresB\t\n\x07_routesB\x12\n\x10_offer_issuer_idB\"\n _warning_missing_offer_issuer_idB\x1d\n\x1b_warning_empty_blinded_pathB\x16\n\x14_invreq_bip_353_nameB+\n)_warning_invreq_bip_353_name_name_invalidB-\n+_warning_invreq_bip_353_name_domain_invalidB\x1b\n\x19_invreq_recurrence_cancelB3\n1_warning_invreq_recurrence_cancel_without_counterB5\n3_warning_invreq_recurrence_cancel_with_zero_counterB\x11\n\x0f_proof_preimageB\r\n\x0b_proof_noteB\x12\n\x10_proof_signature\"(\n\x0b\x44\x65\x63odeExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\xc4\x01\n\x0f\x44\x65\x63odeFallbacks\x12;\n\titem_type\x18\x02 \x01(\x0e\x32(.cln.DecodeFallbacks.DecodeFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x03 \x01(\tH\x00\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\x07\n\x05_addr\"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\"\xa6\x02\n\x12\x44\x65\x63odeInvoicePaths\x12)\n\x04path\x18\x01 \x03(\x0b\x32\x1b.cln.DecodeInvoicePathsPath\x12/\n\x07payinfo\x18\x02 \x01(\x0b\x32\x1e.cln.DecodeInvoicePathsPayinfo\x12\x1a\n\rfirst_node_id\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x1b\n\x0e\x66irst_path_key\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x12\x1b\n\x0e\x66irst_scid_dir\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x06 \x01(\tH\x03\x88\x01\x01\x42\x10\n\x0e_first_node_idB\x11\n\x0f_first_path_keyB\x11\n\x0f_first_scid_dirB\r\n\x0b_first_scid\"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\"\x97\x02\n\x19\x44\x65\x63odeInvoicePathsPayinfo\x12+\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0c\x12\"\n\rfee_base_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x04 \x01(\r\x12+\n\x11htlc_maximum_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x19\n\x11\x63ltv_expiry_delta\x18\x06 \x01(\rB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msat\"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\"\xf3\x01\n\x11\x44\x65\x63odeInvreqPaths\x12\x1b\n\x0e\x66irst_scid_dir\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\rfirst_node_id\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x04 \x01(\tH\x02\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\x03\x88\x01\x01\x42\x11\n\x0f_first_scid_dirB\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\"\xf1\x01\n\x10\x44\x65\x63odeOfferPaths\x12\x1a\n\rfirst_node_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\'\n\x04path\x18\x03 \x03(\x0b\x32\x19.cln.DecodeOfferPathsPath\x12\x1b\n\x0e\x66irst_scid_dir\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x1b\n\x0e\x66irst_path_key\x18\x06 \x01(\x0cH\x03\x88\x01\x01\x42\x10\n\x0e_first_node_idB\x11\n\x0f_first_scid_dirB\r\n\x0b_first_scidB\x11\n\x0f_first_path_key\"Q\n\x14\x44\x65\x63odeOfferPathsPath\x12\x17\n\x0f\x62linded_node_id\x18\x01 \x01(\x0c\x12 \n\x18\x65ncrypted_recipient_data\x18\x02 \x01(\x0c\"\xab\x02\n\x15\x44\x65\x63odeOfferRecurrence\x12\x11\n\ttime_unit\x18\x01 \x01(\r\x12\x1d\n\x10\x63ompulsory_field\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x1b\n\x0etime_unit_name\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0e\n\x06period\x18\x04 \x01(\r\x12\x15\n\x08\x62\x61setime\x18\x05 \x01(\x04H\x02\x88\x01\x01\x12;\n\tpaywindow\x18\x06 \x01(\x0b\x32#.cln.DecodeOfferRecurrencePaywindowH\x03\x88\x01\x01\x12\x12\n\x05limit\x18\x07 \x01(\rH\x04\x88\x01\x01\x42\x13\n\x11_compulsory_fieldB\x11\n\x0f_time_unit_nameB\x0b\n\t_basetimeB\x0c\n\n_paywindowB\x08\n\x06_limit\"\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\";\n\x12\x44\x65\x63odeRestrictions\x12\x14\n\x0c\x61lternatives\x18\x01 \x03(\t\x12\x0f\n\x07summary\x18\x02 \x01(\t\"S\n\x1f\x44\x65\x63odeUnknownInvoiceRequestTlvs\x12\x11\n\titem_type\x18\x01 \x01(\x04\x12\x0e\n\x06length\x18\x02 \x01(\x04\x12\r\n\x05value\x18\x03 \x01(\x0c\"L\n\x18\x44\x65\x63odeUnknownInvoiceTlvs\x12\x11\n\titem_type\x18\x01 \x01(\x04\x12\x0e\n\x06length\x18\x02 \x01(\x04\x12\r\n\x05value\x18\x03 \x01(\x0c\"J\n\x16\x44\x65\x63odeUnknownOfferTlvs\x12\x11\n\titem_type\x18\x01 \x01(\x04\x12\x0e\n\x06length\x18\x02 \x01(\x04\x12\r\n\x05value\x18\x03 \x01(\x0c\"O\n\x1b\x44\x65\x63odeUnknownPayerProofTlvs\x12\x11\n\titem_type\x18\x01 \x01(\x04\x12\x0e\n\x06length\x18\x02 \x01(\x04\x12\r\n\x05value\x18\x03 \x01(\x0c\"\xc2\x01\n\rDelpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12/\n\x06status\x18\x02 \x01(\x0e\x32\x1f.cln.DelpayRequest.DelpayStatus\x12\x13\n\x06partid\x18\x03 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x01\x88\x01\x01\"(\n\x0c\x44\x65lpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x42\t\n\x07_partidB\n\n\x08_groupid\"7\n\x0e\x44\x65lpayResponse\x12%\n\x08payments\x18\x01 \x03(\x0b\x32\x13.cln.DelpayPayments\"\xb4\x05\n\x0e\x44\x65lpayPayments\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x38\n\x06status\x18\x04 \x01(\x0e\x32(.cln.DelpayPayments.DelpayPaymentsStatus\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\t \x01(\x04\x12\x1a\n\rupdated_index\x18\n \x01(\x04H\x03\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12\x14\n\x07groupid\x18\x0c \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x08\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\t\x88\x01\x01\x12\x17\n\nerroronion\x18\x11 \x01(\x0cH\n\x88\x01\x01\"=\n\x14\x44\x65lpayPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x10\n\x0e_updated_indexB\x0f\n\r_completed_atB\n\n\x08_groupidB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\r\n\x0b_erroronion\"\xb3\x01\n\x11\x44\x65lforwardRequest\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x12\n\nin_htlc_id\x18\x02 \x01(\x04\x12\x37\n\x06status\x18\x03 \x01(\x0e\x32\'.cln.DelforwardRequest.DelforwardStatus\"=\n\x10\x44\x65lforwardStatus\x12\x0b\n\x07SETTLED\x10\x00\x12\x10\n\x0cLOCAL_FAILED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"\x14\n\x12\x44\x65lforwardResponse\"\'\n\x13\x44isableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\xdc\x01\n\x14\x44isableofferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"&\n\x12\x45nableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\xdb\x01\n\x13\x45nableofferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"=\n\x11\x44isconnectRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\x05\x66orce\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x08\n\x06_force\"\x14\n\x12\x44isconnectResponse\"k\n\x0f\x46\x65\x65ratesRequest\x12\x31\n\x05style\x18\x01 \x01(\x0e\x32\".cln.FeeratesRequest.FeeratesStyle\"%\n\rFeeratesStyle\x12\t\n\x05PERKB\x10\x00\x12\t\n\x05PERKW\x10\x01\"\x9a\x02\n\x10\x46\x65\x65ratesResponse\x12%\n\x18warning_missing_feerates\x18\x01 \x01(\tH\x00\x88\x01\x01\x12&\n\x05perkb\x18\x02 \x01(\x0b\x32\x12.cln.FeeratesPerkbH\x01\x88\x01\x01\x12&\n\x05perkw\x18\x03 \x01(\x0b\x32\x12.cln.FeeratesPerkwH\x02\x88\x01\x01\x12\x44\n\x15onchain_fee_estimates\x18\x04 \x01(\x0b\x32 .cln.FeeratesOnchainFeeEstimatesH\x03\x88\x01\x01\x42\x1b\n\x19_warning_missing_feeratesB\x08\n\x06_perkbB\x08\n\x06_perkwB\x18\n\x16_onchain_fee_estimates\"\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\"\x84\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\x14\n\x07penalty\x18\x08 \x01(\rH\x03\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkbEstimates\x12\r\n\x05\x66loor\x18\n \x01(\r\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x04\x88\x01\x01\x12\x13\n\x06splice\x18\x0c \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\n\n\x08_penaltyB\x1a\n\x18_unilateral_anchor_closeB\t\n\x07_splice\"W\n\x16\x46\x65\x65ratesPerkbEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"\x84\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\x14\n\x07penalty\x18\x08 \x01(\rH\x03\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkwEstimates\x12\r\n\x05\x66loor\x18\n \x01(\r\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x04\x88\x01\x01\x12\x13\n\x06splice\x18\x0c \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\n\n\x08_penaltyB\x1a\n\x18_unilateral_anchor_closeB\t\n\x07_splice\"W\n\x16\x46\x65\x65ratesPerkwEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"%\n\x12\x46\x65tchbip353Request\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"X\n\x13\x46\x65tchbip353Response\x12\r\n\x05proof\x18\x01 \x01(\t\x12\x32\n\x0cinstructions\x18\x02 \x03(\x0b\x32\x1c.cln.Fetchbip353Instructions\"\xf7\x01\n\x17\x46\x65tchbip353Instructions\x12\x18\n\x0b\x64\x65scription\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05offer\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07onchain\x18\x03 \x01(\tH\x02\x88\x01\x01\x12!\n\x14offchain_amount_msat\x18\x04 \x01(\x04H\x03\x88\x01\x01\x12\x1f\n\x12onchain_amount_sat\x18\x05 \x01(\x04H\x04\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x08\n\x06_offerB\n\n\x08_onchainB\x17\n\x15_offchain_amount_msatB\x15\n\x13_onchain_amount_sat\"\xb9\x03\n\x13\x46\x65tchinvoiceRequest\x12\r\n\x05offer\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x15\n\x08quantity\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x1f\n\x12recurrence_counter\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x10recurrence_start\x18\x05 \x01(\x01H\x03\x88\x01\x01\x12\x1d\n\x10recurrence_label\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x14\n\x07timeout\x18\x07 \x01(\x01H\x05\x88\x01\x01\x12\x17\n\npayer_note\x18\x08 \x01(\tH\x06\x88\x01\x01\x12\x1b\n\x0epayer_metadata\x18\t \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62ip353\x18\n \x01(\tH\x08\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0b\n\t_quantityB\x15\n\x13_recurrence_counterB\x13\n\x11_recurrence_startB\x13\n\x11_recurrence_labelB\n\n\x08_timeoutB\r\n\x0b_payer_noteB\x11\n\x0f_payer_metadataB\t\n\x07_bip353\"\x99\x01\n\x14\x46\x65tchinvoiceResponse\x12\x0f\n\x07invoice\x18\x01 \x01(\t\x12)\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x18.cln.FetchinvoiceChanges\x12\x35\n\x0bnext_period\x18\x03 \x01(\x0b\x32\x1b.cln.FetchinvoiceNextPeriodH\x00\x88\x01\x01\x42\x0e\n\x0c_next_period\"\x82\x02\n\x13\x46\x65tchinvoiceChanges\x12!\n\x14\x64\x65scription_appended\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0evendor_removed\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06vendor\x18\x04 \x01(\tH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x42\x17\n\x15_description_appendedB\x0e\n\x0c_descriptionB\x11\n\x0f_vendor_removedB\t\n\x07_vendorB\x0e\n\x0c_amount_msat\"}\n\x16\x46\x65tchinvoiceNextPeriod\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x04\x12\x11\n\tstarttime\x18\x02 \x01(\x04\x12\x0f\n\x07\x65ndtime\x18\x03 \x01(\x04\x12\x17\n\x0fpaywindow_start\x18\x04 \x01(\x04\x12\x15\n\rpaywindow_end\x18\x05 \x01(\x04\"\xe0\x01\n\x1d\x43\x61ncelrecurringinvoiceRequest\x12\r\n\x05offer\x18\x01 \x01(\t\x12\x1a\n\x12recurrence_counter\x18\x02 \x01(\x04\x12\x18\n\x10recurrence_label\x18\x03 \x01(\t\x12\x1d\n\x10recurrence_start\x18\x04 \x01(\x01H\x00\x88\x01\x01\x12\x17\n\npayer_note\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62ip353\x18\x06 \x01(\tH\x02\x88\x01\x01\x42\x13\n\x11_recurrence_startB\r\n\x0b_payer_noteB\t\n\x07_bip353\"0\n\x1e\x43\x61ncelrecurringinvoiceResponse\x12\x0e\n\x06\x62olt12\x18\x01 \x01(\t\"&\n\x18\x46undchannelCancelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\".\n\x19\x46undchannelCancelResponse\x12\x11\n\tcancelled\x18\x01 \x01(\t\"Z\n\x1a\x46undchannelCompleteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x15\n\x08withhold\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x0b\n\t_withhold\"N\n\x1b\x46undchannelCompleteResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\"\x84\x04\n\x12\x46undchannelRequest\x12#\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x13.cln.AmountSatOrAll\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\x0e.cln.AmountSatH\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\x0e.cln.AmountSatH\x08\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\x0e \x03(\rB\n\n\x08_feerateB\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\n\n\x08_minconfB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xce\x01\n\x13\x46undchannelResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0e\n\x06outnum\x18\x03 \x01(\r\x12\x12\n\nchannel_id\x18\x04 \x01(\x0c\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\x08mindepth\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x31\n\x0c\x63hannel_type\x18\x07 \x01(\x0b\x32\x1b.cln.FundchannelChannelTypeB\x0b\n\t_close_toB\x0b\n\t_mindepth\"K\n\x16\x46undchannelChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\xdc\x02\n\x17\x46undchannelStartRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1e\n\x06\x61mount\x18\x02 \x01(\x0b\x32\x0e.cln.AmountSat\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\x0e.cln.AmountSatH\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\"\x8c\x02\n\x0fGetrouteRequest\x12\x0e\n\x02id\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\nriskfactor\x18\x03 \x01(\x04\x42\x02\x18\x01\x12\x15\n\x04\x63ltv\x18\x04 \x01(\rB\x02\x18\x01H\x00\x88\x01\x01\x12\x17\n\x06\x66romid\x18\x05 \x01(\x0c\x42\x02\x18\x01H\x01\x88\x01\x01\x12\x1c\n\x0b\x66uzzpercent\x18\x06 \x01(\rB\x02\x18\x01H\x02\x88\x01\x01\x12\x13\n\x07\x65xclude\x18\x07 \x03(\tB\x02\x18\x01\x12\x18\n\x07maxhops\x18\x08 \x01(\rB\x02\x18\x01H\x03\x88\x01\x01\x12$\n\x0b\x61mount_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x42\x07\n\x05_cltvB\t\n\x07_fromidB\x0e\n\x0c_fuzzpercentB\n\n\x08_maxhops\"9\n\x10GetrouteResponse\x12%\n\x05route\x18\x01 \x03(\x0b\x32\x12.cln.GetrouteRouteB\x02\x18\x01\"\xe1\x01\n\rGetrouteRoute\x12\x0e\n\x02id\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x13\n\x07\x63hannel\x18\x02 \x01(\tB\x02\x18\x01\x12\x15\n\tdirection\x18\x03 \x01(\rB\x02\x18\x01\x12$\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12\x11\n\x05\x64\x65lay\x18\x05 \x01(\rB\x02\x18\x01\x12\x38\n\x05style\x18\x06 \x01(\x0e\x32%.cln.GetrouteRoute.GetrouteRouteStyleB\x02\x18\x01\"!\n\x12GetrouteRouteStyle\x12\x0b\n\x03TLV\x10\x00\x1a\x02\x08\x01\"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\"-\n\x11ListforwardsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\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\x42\t\n\x07_statusB\r\n\x0b_in_channelB\x0e\n\x0c_out_channelB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListforwardsResponse\x12+\n\x08\x66orwards\x18\x01 \x03(\x0b\x32\x19.cln.ListforwardsForwards\"\x9d\x06\n\x14ListforwardsForwards\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x1c\n\x07in_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x44\n\x06status\x18\x03 \x01(\x0e\x32\x34.cln.ListforwardsForwards.ListforwardsForwardsStatus\x12\x15\n\rreceived_time\x18\x04 \x01(\x01\x12\x18\n\x0bout_channel\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\"\n\x08out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12G\n\x05style\x18\t \x01(\x0e\x32\x33.cln.ListforwardsForwards.ListforwardsForwardsStyleH\x03\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x18\n\x0bout_htlc_id\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0c \x01(\x04\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rresolved_time\x18\x0e \x01(\x01H\x07\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x0f \x01(\rH\x08\x88\x01\x01\x12\x17\n\nfailreason\x18\x10 \x01(\tH\t\x88\x01\x01\"T\n\x1aListforwardsForwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"0\n\x19ListforwardsForwardsStyle\x12\n\n\x06LEGACY\x10\x00\x12\x07\n\x03TLV\x10\x01\x42\x0e\n\x0c_out_channelB\x0b\n\t_fee_msatB\x0b\n\t_out_msatB\x08\n\x06_styleB\r\n\x0b_in_htlc_idB\x0e\n\x0c_out_htlc_idB\x10\n\x0e_updated_indexB\x10\n\x0e_resolved_timeB\x0b\n\t_failcodeB\r\n\x0b_failreason\"a\n\x11ListoffersRequest\x12\x15\n\x08offer_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0b\n\t_offer_idB\x0e\n\x0c_active_only\";\n\x12ListoffersResponse\x12%\n\x06offers\x18\x01 \x03(\x0b\x32\x15.cln.ListoffersOffers\"\xd8\x01\n\x10ListoffersOffers\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"\x84\x03\n\x0fListpaysRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x38\n\x06status\x18\x03 \x01(\x0e\x32#.cln.ListpaysRequest.ListpaysStatusH\x02\x88\x01\x01\x12\x36\n\x05index\x18\x04 \x01(\x0e\x32\".cln.ListpaysRequest.ListpaysIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\")\n\rListpaysIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\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\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\"\x88\x03\n\x1cMultifundchannelDestinations\x12\n\n\x02id\x18\x01 \x01(\t\x12#\n\x06\x61mount\x18\x02 \x01(\x0b\x32\x13.cln.AmountSatOrAll\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\x0e.cln.AmountSatH\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\x0e.cln.AmountSatH\x06\x88\x01\x01\x42\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xb2\x01\n\x1aMultifundchannelChannelIds\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12\x12\n\nchannel_id\x18\x03 \x01(\x0c\x12@\n\x0c\x63hannel_type\x18\x04 \x01(\x0b\x32*.cln.MultifundchannelChannelIdsChannelType\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_close_to\"Z\n%MultifundchannelChannelIdsChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x93\x02\n\x16MultifundchannelFailed\x12\n\n\x02id\x18\x01 \x01(\x0c\x12H\n\x06method\x18\x02 \x01(\x0e\x32\x38.cln.MultifundchannelFailed.MultifundchannelFailedMethod\x12/\n\x05\x65rror\x18\x03 \x01(\x0b\x32 .cln.MultifundchannelFailedError\"r\n\x1cMultifundchannelFailedMethod\x12\x0b\n\x07\x43ONNECT\x10\x00\x12\x14\n\x10OPENCHANNEL_INIT\x10\x01\x12\x15\n\x11\x46UNDCHANNEL_START\x10\x02\x12\x18\n\x14\x46UNDCHANNEL_COMPLETE\x10\x03\"<\n\x1bMultifundchannelFailedError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x12\x12\x0f\n\x07message\x18\x02 \x01(\t\"\xa8\x01\n\x14MultiwithdrawRequest\x12 \n\x07outputs\x18\x01 \x03(\x0b\x32\x0f.cln.OutputDesc\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.OutpointB\n\n\x08_feerateB\n\n\x08_minconf\"1\n\x15MultiwithdrawResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xe2\x04\n\x0cOfferRequest\x12\x0e\n\x06\x61mount\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0cquantity_max\x18\x05 \x01(\x04H\x03\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x06 \x01(\x04H\x04\x88\x01\x01\x12\x17\n\nrecurrence\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1c\n\x0frecurrence_base\x18\x08 \x01(\tH\x06\x88\x01\x01\x12!\n\x14recurrence_paywindow\x18\t \x01(\tH\x07\x88\x01\x01\x12\x1d\n\x10recurrence_limit\x18\n \x01(\rH\x08\x88\x01\x01\x12\x17\n\nsingle_use\x18\x0b \x01(\x08H\t\x88\x01\x01\x12 \n\x13proportional_amount\x18\r \x01(\x08H\n\x88\x01\x01\x12 \n\x13optional_recurrence\x18\x0e \x01(\x08H\x0b\x88\x01\x01\x12\x16\n\x0e\x66ronting_nodes\x18\x0f \x03(\x0c\x42\x0e\n\x0c_descriptionB\t\n\x07_issuerB\x08\n\x06_labelB\x0f\n\r_quantity_maxB\x12\n\x10_absolute_expiryB\r\n\x0b_recurrenceB\x12\n\x10_recurrence_baseB\x17\n\x15_recurrence_paywindowB\x13\n\x11_recurrence_limitB\r\n\x0b_single_useB\x16\n\x14_proportional_amountB\x16\n\x14_optional_recurrence\"\xbc\x01\n\rOfferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x0f\n\x07\x63reated\x18\x06 \x01(\x08\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x01\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_force_paths\"-\n\x17OpenchannelAbortRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"X\n\x18OpenchannelAbortResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x18\n\x10\x63hannel_canceled\x18\x02 \x01(\x08\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\xa1\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\x1e\n\x06\x61mount\x18\x04 \x01(\x0b\x32\x0e.cln.AmountSatB\x12\n\x10_funding_feerate\"\xed\x01\n\x17OpenchannelBumpResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x35\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32\x1f.cln.OpenchannelBumpChannelType\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x00\x88\x01\x01\x42\x1c\n\x1a_requires_confirmed_inputs\"O\n\x1aOpenchannelBumpChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\xa5\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\x0e.cln.AmountSatH\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\x1e\n\x06\x61mount\x18\n \x01(\x0b\x32\x0e.cln.AmountSatB\x15\n\x13_commitment_feerateB\x12\n\x10_funding_feerateB\x0b\n\t_announceB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_lease\"\xed\x01\n\x17OpenchannelInitResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x35\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32\x1f.cln.OpenchannelInitChannelType\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x00\x88\x01\x01\x42\x1c\n\x1a_requires_confirmed_inputs\"O\n\x1aOpenchannelInitChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"C\n\x18OpenchannelSignedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_psbt\x18\x02 \x01(\t\"I\n\x19OpenchannelSignedResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"<\n\x18OpenchannelUpdateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"\x95\x02\n\x19OpenchannelUpdateResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x37\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32!.cln.OpenchannelUpdateChannelType\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_outnum\x18\x05 \x01(\r\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12&\n\x19requires_confirmed_inputs\x18\x07 \x01(\x08H\x01\x88\x01\x01\x42\x0b\n\t_close_toB\x1c\n\x1a_requires_confirmed_inputs\"Q\n\x1cOpenchannelUpdateChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"Y\n\x0bPingRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x03len\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x16\n\tpongbytes\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x06\n\x04_lenB\x0c\n\n_pongbytes\"\x1e\n\x0cPingResponse\x12\x0e\n\x06totlen\x18\x01 \x01(\r\"\x91\x01\n\rPluginRequest\x12)\n\nsubcommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12\x13\n\x06plugin\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tdirectory\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x07options\x18\x04 \x03(\tB\t\n\x07_pluginB\x0c\n\n_directory\"}\n\x0ePluginResponse\x12&\n\x07\x63ommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12#\n\x07plugins\x18\x02 \x03(\x0b\x32\x12.cln.PluginPlugins\x12\x13\n\x06result\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_result\">\n\rPluginPlugins\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x0f\n\x07\x64ynamic\x18\x03 \x01(\x08\"@\n\x14RenepaystatusRequest\x12\x1a\n\tinvstring\x18\x01 \x01(\tB\x02\x18\x01H\x00\x88\x01\x01\x42\x0c\n\n_invstring\"K\n\x15RenepaystatusResponse\x12\x32\n\tpaystatus\x18\x01 \x03(\x0b\x32\x1b.cln.RenepaystatusPaystatusB\x02\x18\x01\"\x9a\x04\n\x16RenepaystatusPaystatus\x12\x12\n\x06\x62olt11\x18\x01 \x01(\tB\x02\x18\x01\x12!\n\x10payment_preimage\x18\x02 \x01(\x0c\x42\x02\x18\x01H\x00\x88\x01\x01\x12\x18\n\x0cpayment_hash\x18\x03 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\ncreated_at\x18\x04 \x01(\x01\x42\x02\x18\x01\x12\x13\n\x07groupid\x18\x05 \x01(\rB\x02\x18\x01\x12\x16\n\x05parts\x18\x06 \x01(\rB\x02\x18\x01H\x01\x88\x01\x01\x12$\n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12.\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x02\x88\x01\x01\x12L\n\x06status\x18\t \x01(\x0e\x32\x38.cln.RenepaystatusPaystatus.RenepaystatusPaystatusStatusB\x02\x18\x01\x12\x1c\n\x0b\x64\x65stination\x18\n \x01(\x0c\x42\x02\x18\x01H\x03\x88\x01\x01\x12\x11\n\x05notes\x18\x0b \x03(\tB\x02\x18\x01\"Q\n\x1cRenepaystatusPaystatusStatus\x12\x10\n\x08\x43OMPLETE\x10\x00\x1a\x02\x08\x01\x12\x0f\n\x07PENDING\x10\x01\x1a\x02\x08\x01\x12\x0e\n\x06\x46\x41ILED\x10\x02\x1a\x02\x08\x01\x42\x13\n\x11_payment_preimageB\x08\n\x06_partsB\x13\n\x11_amount_sent_msatB\x0e\n\x0c_destination\"\xfe\x02\n\x0eRenepayRequest\x12\x15\n\tinvstring\x18\x01 \x01(\tB\x02\x18\x01\x12)\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x00\x88\x01\x01\x12$\n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x01\x88\x01\x01\x12\x19\n\x08maxdelay\x18\x04 \x01(\rB\x02\x18\x01H\x02\x88\x01\x01\x12\x1a\n\tretry_for\x18\x05 \x01(\rB\x02\x18\x01H\x03\x88\x01\x01\x12\x1c\n\x0b\x64\x65scription\x18\x06 \x01(\tB\x02\x18\x01H\x04\x88\x01\x01\x12\x16\n\x05label\x18\x07 \x01(\tB\x02\x18\x01H\x05\x88\x01\x01\x12\x1f\n\x0e\x64\x65v_use_shadow\x18\x08 \x01(\x08\x42\x02\x18\x01H\x06\x88\x01\x01\x12\x13\n\x07\x65xclude\x18\t \x03(\tB\x02\x18\x01\x42\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\"\xdd\x03\n\x0fRenepayResponse\x12\x1c\n\x10payment_preimage\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x18\n\x0cpayment_hash\x18\x02 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\ncreated_at\x18\x03 \x01(\x01\x42\x02\x18\x01\x12\x11\n\x05parts\x18\x04 \x01(\rB\x02\x18\x01\x12$\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12)\n\x10\x61mount_sent_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12\x36\n\x06status\x18\x07 \x01(\x0e\x32\".cln.RenepayResponse.RenepayStatusB\x02\x18\x01\x12\x1c\n\x0b\x64\x65stination\x18\x08 \x01(\x0c\x42\x02\x18\x01H\x00\x88\x01\x01\x12\x17\n\x06\x62olt11\x18\t \x01(\tB\x02\x18\x01H\x01\x88\x01\x01\x12\x17\n\x06\x62olt12\x18\n \x01(\tB\x02\x18\x01H\x02\x88\x01\x01\x12\x18\n\x07groupid\x18\x0b \x01(\x04\x42\x02\x18\x01H\x03\x88\x01\x01\"B\n\rRenepayStatus\x12\x10\n\x08\x43OMPLETE\x10\x00\x1a\x02\x08\x01\x12\x0f\n\x07PENDING\x10\x01\x1a\x02\x08\x01\x12\x0e\n\x06\x46\x41ILED\x10\x02\x1a\x02\x08\x01\x42\x0e\n\x0c_destinationB\t\n\x07_bolt11B\t\n\x07_bolt12B\n\n\x08_groupid\"l\n\x14ReserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\texclusive\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x14\n\x07reserve\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x0c\n\n_exclusiveB\n\n\x08_reserve\"M\n\x15ReserveinputsResponse\x12\x34\n\x0creservations\x18\x01 \x03(\x0b\x32\x1e.cln.ReserveinputsReservations\"z\n\x19ReserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\"4\n\x14SendcustommsgRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x0c\x12\x0b\n\x03msg\x18\x02 \x01(\x0c\"\'\n\x15SendcustommsgResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\"\xb0\x01\n\x12SendinvoiceRequest\x12\x0e\n\x06invreq\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08quantity\x18\x05 \x01(\x04H\x02\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\n\n\x08_timeoutB\x0b\n\t_quantity\"\xb8\x04\n\x13SendinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.SendinvoiceResponse.SendinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x15\n\rcreated_index\x18\x08 \x01(\x04\x12\x1a\n\rupdated_index\x18\t \x01(\x04H\x02\x88\x01\x01\x12\x16\n\tpay_index\x18\n \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0c \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x06\x88\x01\x01\"6\n\x11SendinvoiceStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_amount_msatB\t\n\x07_bolt12B\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\xaa\x02\n\x11SetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12!\n\x07\x66\x65\x65\x62\x61se\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x66\x65\x65ppm\x18\x03 \x01(\rH\x01\x88\x01\x01\x12!\n\x07htlcmin\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12!\n\x07htlcmax\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x19\n\x0c\x65nforcedelay\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1c\n\x0fignorefeelimits\x18\x07 \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_feebaseB\t\n\x07_feeppmB\n\n\x08_htlcminB\n\n\x08_htlcmaxB\x0f\n\r_enforcedelayB\x12\n\x10_ignorefeelimits\"?\n\x12SetchannelResponse\x12)\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x17.cln.SetchannelChannels\"\xaf\x03\n\x12SetchannelChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\x12*\n\x15minimum_htlc_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x17warning_htlcmin_too_low\x18\x07 \x01(\tH\x01\x88\x01\x01\x12*\n\x15maximum_htlc_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x18warning_htlcmax_too_high\x18\t \x01(\tH\x02\x88\x01\x01\x12\x19\n\x11ignore_fee_limits\x18\n \x01(\x08\x42\x13\n\x11_short_channel_idB\x1a\n\x18_warning_htlcmin_too_lowB\x1b\n\x19_warning_htlcmax_too_high\"b\n\x10SetconfigRequest\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x10\n\x03val\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttransient\x18\x03 \x01(\x08H\x01\x88\x01\x01\x42\x06\n\x04_valB\x0c\n\n_transient\"9\n\x11SetconfigResponse\x12$\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x14.cln.SetconfigConfig\"\xda\x02\n\x0fSetconfigConfig\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x13\n\x06source\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x07\x64ynamic\x18\x04 \x01(\x08\x12\x10\n\x03set\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x16\n\tvalue_str\x18\x06 \x01(\tH\x03\x88\x01\x01\x12$\n\nvalue_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x16\n\tvalue_int\x18\x08 \x01(\x12H\x05\x88\x01\x01\x12\x17\n\nvalue_bool\x18\t \x01(\x08H\x06\x88\x01\x01\x12\x0f\n\x07sources\x18\n \x03(\t\x12\x12\n\nvalues_str\x18\x0b \x03(\tB\t\n\x07_sourceB\t\n\x07_pluginB\x06\n\x04_setB\x0c\n\n_value_strB\r\n\x0b_value_msatB\x0c\n\n_value_intB\r\n\x0b_value_bool\"6\n\x15SetpsbtversionRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\r\"&\n\x16SetpsbtversionResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"\'\n\x12SigninvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\"%\n\x13SigninvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"%\n\x12SignmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"F\n\x13SignmessageResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\r\n\x05recid\x18\x02 \x01(\x0c\x12\r\n\x05zbase\x18\x03 \x01(\t\"\xc8\x01\n\x11SpliceInitRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x17\n\x0frelative_amount\x18\x02 \x01(\x12\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x65\x65rate_per_kw\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x0e\n\x0c_initialpsbtB\x11\n\x0f_feerate_per_kwB\x10\n\x0e_force_feerate\"\"\n\x12SpliceInitResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"_\n\x13SpliceSignedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x17\n\nsign_first\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_sign_first\"^\n\x14SpliceSignedResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x13\n\x06outnum\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04psbt\x18\x04 \x01(\tB\t\n\x07_outnum\"7\n\x13SpliceUpdateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"y\n\x14SpliceUpdateResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\x12\x1f\n\x12signatures_secured\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x15\n\x13_signatures_secured\"2\n\x0fSpliceinRequest\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\t\"b\n\x10SpliceinResponse\x12\x11\n\x04psbt\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"\x8b\x01\n\x10SpliceoutRequest\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\t\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x04 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_destinationB\x10\n\x0e_force_feerate\"c\n\x11SpliceoutResponse\x12\x11\n\x04psbt\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"\xc6\x01\n\x10\x44\x65vspliceRequest\x12\x16\n\x0escript_or_json\x18\x01 \x01(\t\x12\x13\n\x06\x64ryrun\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tdebug_log\x18\x04 \x01(\x08H\x02\x88\x01\x01\x12\x17\n\ndev_wetrun\x18\x05 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_dryrunB\x10\n\x0e_force_feerateB\x0c\n\n_debug_logB\r\n\x0b_dev_wetrun\"\x80\x01\n\x11\x44\x65vspliceResponse\x12\x0e\n\x06\x64ryrun\x18\x01 \x03(\t\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03log\x18\x05 \x03(\tB\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"H\n\x16UnreserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x14\n\x07reserve\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_reserve\"Q\n\x17UnreserveinputsResponse\x12\x36\n\x0creservations\x18\x01 \x03(\x0b\x32 .cln.UnreserveinputsReservations\"\x97\x01\n\x1bUnreserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x1e\n\x11reserved_to_block\x18\x05 \x01(\rH\x00\x88\x01\x01\x42\x14\n\x12_reserved_to_block\"n\n\x14UpgradewalletRequest\x12\"\n\x07\x66\x65\x65rate\x18\x01 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x17\n\nreservedok\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\n\n\x08_feerateB\r\n\x0b_reservedok\"~\n\x15UpgradewalletResponse\x12\x15\n\rupgraded_outs\x18\x01 \x01(\x04\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\x0cH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"O\n\x16WaitblockheightRequest\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\x12\x14\n\x07timeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_timeout\".\n\x17WaitblockheightResponse\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\"\xb9\x02\n\x0bWaitRequest\x12\x31\n\tsubsystem\x18\x01 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitSubsystem\x12\x31\n\tindexname\x18\x02 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitIndexname\x12\x11\n\tnextvalue\x18\x03 \x01(\x04\"6\n\rWaitIndexname\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x12\x0b\n\x07\x44\x45LETED\x10\x02\"y\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\x12\t\n\x05HTLCS\x10\x03\x12\x0e\n\nCHAINMOVES\x10\x04\x12\x10\n\x0c\x43HANNELMOVES\x10\x05\x12\x11\n\rNETWORKEVENTS\x10\x06\"\xf4\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.WaitDetailsB\x02\x18\x01H\x03\x88\x01\x01\x12(\n\x08\x66orwards\x18\x06 \x01(\x0b\x32\x11.cln.WaitForwardsH\x04\x88\x01\x01\x12(\n\x08invoices\x18\x07 \x01(\x0b\x32\x11.cln.WaitInvoicesH\x05\x88\x01\x01\x12(\n\x08sendpays\x18\x08 \x01(\x0b\x32\x11.cln.WaitSendpaysH\x06\x88\x01\x01\x12\"\n\x05htlcs\x18\t \x01(\x0b\x32\x0e.cln.WaitHtlcsH\x07\x88\x01\x01\x12,\n\nchainmoves\x18\n \x01(\x0b\x32\x13.cln.WaitChainmovesH\x08\x88\x01\x01\x12\x30\n\x0c\x63hannelmoves\x18\x0b \x01(\x0b\x32\x15.cln.WaitChannelmovesH\t\x88\x01\x01\x12\x32\n\rnetworkevents\x18\x0c \x01(\x0b\x32\x16.cln.WaitNetworkeventsH\n\x88\x01\x01\"y\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\x12\t\n\x05HTLCS\x10\x03\x12\x0e\n\nCHAINMOVES\x10\x04\x12\x10\n\x0c\x43HANNELMOVES\x10\x05\x12\x11\n\rNETWORKEVENTS\x10\x06\x42\n\n\x08_createdB\n\n\x08_updatedB\n\n\x08_deletedB\n\n\x08_detailsB\x0b\n\t_forwardsB\x0b\n\t_invoicesB\x0b\n\t_sendpaysB\x08\n\x06_htlcsB\r\n\x0b_chainmovesB\x0f\n\r_channelmovesB\x10\n\x0e_networkevents\"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\"\xd0\x05\n\x0bWaitDetails\x12;\n\x06status\x18\x01 \x01(\x0e\x32\".cln.WaitDetails.WaitDetailsStatusB\x02\x18\x01H\x00\x88\x01\x01\x12\x16\n\x05label\x18\x02 \x01(\tB\x02\x18\x01H\x01\x88\x01\x01\x12\x1c\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x02\x18\x01H\x02\x88\x01\x01\x12\x17\n\x06\x62olt11\x18\x04 \x01(\tB\x02\x18\x01H\x03\x88\x01\x01\x12\x17\n\x06\x62olt12\x18\x05 \x01(\tB\x02\x18\x01H\x04\x88\x01\x01\x12\x17\n\x06partid\x18\x06 \x01(\x04\x42\x02\x18\x01H\x05\x88\x01\x01\x12\x18\n\x07groupid\x18\x07 \x01(\x04\x42\x02\x18\x01H\x06\x88\x01\x01\x12\x1d\n\x0cpayment_hash\x18\x08 \x01(\x0c\x42\x02\x18\x01H\x07\x88\x01\x01\x12\x1b\n\nin_channel\x18\t \x01(\tB\x02\x18\x01H\x08\x88\x01\x01\x12\x1b\n\nin_htlc_id\x18\n \x01(\x04\x42\x02\x18\x01H\t\x88\x01\x01\x12%\n\x07in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\n\x88\x01\x01\x12\x1c\n\x0bout_channel\x18\x0c \x01(\tB\x02\x18\x01H\x0b\x88\x01\x01\"\xad\x01\n\x11WaitDetailsStatus\x12\x0e\n\x06UNPAID\x10\x00\x1a\x02\x08\x01\x12\x0c\n\x04PAID\x10\x01\x1a\x02\x08\x01\x12\x0f\n\x07\x45XPIRED\x10\x02\x1a\x02\x08\x01\x12\x0f\n\x07PENDING\x10\x03\x1a\x02\x08\x01\x12\x0e\n\x06\x46\x41ILED\x10\x04\x1a\x02\x08\x01\x12\x10\n\x08\x43OMPLETE\x10\x05\x1a\x02\x08\x01\x12\x0f\n\x07OFFERED\x10\x06\x1a\x02\x08\x01\x12\x0f\n\x07SETTLED\x10\x07\x1a\x02\x08\x01\x12\x14\n\x0cLOCAL_FAILED\x10\x08\x1a\x02\x08\x01\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\"\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\"\x8c\x03\n\tWaitHtlcs\x12\"\n\x05state\x18\x01 \x01(\x0e\x32\x0e.cln.HtlcStateH\x00\x88\x01\x01\x12\x14\n\x07htlc_id\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x63ltv_expiry\x18\x04 \x01(\rH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x39\n\tdirection\x18\x06 \x01(\x0e\x32!.cln.WaitHtlcs.WaitHtlcsDirectionH\x05\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x07 \x01(\x0cH\x06\x88\x01\x01\"%\n\x12WaitHtlcsDirection\x12\x07\n\x03OUT\x10\x00\x12\x06\n\x02IN\x10\x01\x42\x08\n\x06_stateB\n\n\x08_htlc_idB\x13\n\x11_short_channel_idB\x0e\n\x0c_cltv_expiryB\x0e\n\x0c_amount_msatB\x0c\n\n_directionB\x0f\n\r_payment_hash\"\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\"\x89\x02\n\x11WaitNetworkevents\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x44\n\titem_type\x18\x02 \x01(\x0e\x32,.cln.WaitNetworkevents.WaitNetworkeventsTypeH\x01\x88\x01\x01\x12\x14\n\x07peer_id\x18\x03 \x01(\x0cH\x02\x88\x01\x01\"P\n\x15WaitNetworkeventsType\x12\x0b\n\x07\x43ONNECT\x10\x00\x12\x10\n\x0c\x43ONNECT_FAIL\x10\x01\x12\x08\n\x04PING\x10\x02\x12\x0e\n\nDISCONNECT\x10\x03\x42\x10\n\x0e_created_indexB\x0c\n\n_item_typeB\n\n\x08_peer_id\"\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\"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\"\x9d\x36\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\x12S\n\x15\x65xperimental_splicing\x18\x16 \x01(\x0b\x32+.cln.ListconfigsConfigsExperimentalsplicingB\x02\x18\x01H\x15\x88\x01\x01\x12i\n#experimental_shutdown_wrong_funding\x18\x19 \x01(\x0b\x32\x37.cln.ListconfigsConfigsExperimentalshutdownwrongfundingH\x16\x88\x01\x01\x12Z\n\x19\x65xperimental_peer_storage\x18\x1a \x01(\x0b\x32..cln.ListconfigsConfigsExperimentalpeerstorageB\x02\x18\x01H\x17\x88\x01\x01\x12Q\n\x14\x65xperimental_anchors\x18\x1b \x01(\x0b\x32*.cln.ListconfigsConfigsExperimentalanchorsB\x02\x18\x01H\x18\x88\x01\x01\x12\x45\n\x10\x64\x61tabase_upgrade\x18\x1c \x01(\x0b\x32&.cln.ListconfigsConfigsDatabaseupgradeH\x19\x88\x01\x01\x12,\n\x03rgb\x18\x1d \x01(\x0b\x32\x1a.cln.ListconfigsConfigsRgbH\x1a\x88\x01\x01\x12\x30\n\x05\x61lias\x18\x1e \x01(\x0b\x32\x1c.cln.ListconfigsConfigsAliasH\x1b\x88\x01\x01\x12\x35\n\x08pid_file\x18\x1f \x01(\x0b\x32\x1e.cln.ListconfigsConfigsPidfileH\x1c\x88\x01\x01\x12\x46\n\x11ignore_fee_limits\x18 \x01(\x0b\x32&.cln.ListconfigsConfigsIgnorefeelimitsH\x1d\x88\x01\x01\x12\x45\n\x10watchtime_blocks\x18! \x01(\x0b\x32&.cln.ListconfigsConfigsWatchtimeblocksH\x1e\x88\x01\x01\x12N\n\x13max_locktime_blocks\x18\" \x01(\x0b\x32(.cln.ListconfigsConfigsMaxlocktimeblocksB\x02\x18\x01H\x1f\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.ListconfigsConfigsBindaddrH.\x88\x01\x01\x12\x34\n\x07offline\x18\x32 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsOfflineH/\x88\x01\x01\x12:\n\nautolisten\x18\x33 \x01(\x0b\x32!.cln.ListconfigsConfigsAutolistenH0\x88\x01\x01\x12\x30\n\x05proxy\x18\x34 \x01(\x0b\x32\x1c.cln.ListconfigsConfigsProxyH1\x88\x01\x01\x12;\n\x0b\x64isable_dns\x18\x35 \x01(\x0b\x32!.cln.ListconfigsConfigsDisablednsH2\x88\x01\x01\x12T\n\x18\x61nnounce_addr_discovered\x18\x36 \x01(\x0b\x32-.cln.ListconfigsConfigsAnnounceaddrdiscoveredH3\x88\x01\x01\x12]\n\x1d\x61nnounce_addr_discovered_port\x18\x37 \x01(\x0b\x32\x31.cln.ListconfigsConfigsAnnounceaddrdiscoveredportH4\x88\x01\x01\x12\x43\n\rencrypted_hsm\x18\x38 \x01(\x0b\x32#.cln.ListconfigsConfigsEncryptedhsmB\x02\x18\x01H5\x88\x01\x01\x12>\n\rrpc_file_mode\x18\x39 \x01(\x0b\x32\".cln.ListconfigsConfigsRpcfilemodeH6\x88\x01\x01\x12\x37\n\tlog_level\x18: \x01(\x0b\x32\x1f.cln.ListconfigsConfigsLoglevelH7\x88\x01\x01\x12\x39\n\nlog_prefix\x18; \x01(\x0b\x32 .cln.ListconfigsConfigsLogprefixH8\x88\x01\x01\x12\x35\n\x08log_file\x18< \x01(\x0b\x32\x1e.cln.ListconfigsConfigsLogfileH9\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.ListconfigsConfigsAnnounceaddrdnsH?\x88\x01\x01\x12T\n\x18require_confirmed_inputs\x18\x44 \x01(\x0b\x32-.cln.ListconfigsConfigsRequireconfirmedinputsH@\x88\x01\x01\x12\x39\n\ncommit_fee\x18\x45 \x01(\x0b\x32 .cln.ListconfigsConfigsCommitfeeHA\x88\x01\x01\x12N\n\x15\x63ommit_feerate_offset\x18\x46 \x01(\x0b\x32*.cln.ListconfigsConfigsCommitfeerateoffsetHB\x88\x01\x01\x12T\n\x18\x61utoconnect_seeker_peers\x18G \x01(\x0b\x32-.cln.ListconfigsConfigsAutoconnectseekerpeersHC\x88\x01\x01\x12R\n\x17\x63urrencyrate_add_source\x18J \x01(\x0b\x32,.cln.ListconfigsConfigsCurrencyrateaddsourceHD\x88\x01\x01\x12Z\n\x1b\x63urrencyrate_disable_source\x18K \x01(\x0b\x32\x30.cln.ListconfigsConfigsCurrencyratedisablesourceHE\x88\x01\x01\x12V\n\x19\x65xperimental_simple_close\x18L \x01(\x0b\x32..cln.ListconfigsConfigsExperimentalsimplecloseHF\x88\x01\x01\x12K\n\x14\x61\x63\x63\x65pt_htlc_tlv_type\x18M \x01(\x0b\x32(.cln.ListconfigsConfigsAccepthtlctlvtypeHG\x88\x01\x01\x12\x41\n\x0ehsm_passphrase\x18N \x01(\x0b\x32$.cln.ListconfigsConfigsHsmpassphraseHH\x88\x01\x01\x12`\n i_promise_to_fix_broken_api_user\x18O \x01(\x0b\x32\x31.cln.ListconfigsConfigsIpromisetofixbrokenapiuserHI\x88\x01\x01\x12V\n\x19invoices_onchain_fallback\x18P \x01(\x0b\x32..cln.ListconfigsConfigsInvoicesonchainfallbackHJ\x88\x01\x01\x12\x43\n\x0fmessage_padding\x18Q \x01(\x0b\x32%.cln.ListconfigsConfigsMessagepaddingHK\x88\x01\x01\x12H\n\x12min_emergency_msat\x18R \x01(\x0b\x32\'.cln.ListconfigsConfigsMinemergencymsatHL\x88\x01\x01\x12N\n\x15payment_fronting_node\x18S \x01(\x0b\x32*.cln.ListconfigsConfigsPaymentfrontingnodeHM\x88\x01\x01\x12\x34\n\x07recover\x18T \x01(\x0b\x32\x1e.cln.ListconfigsConfigsRecoverHN\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&\n$_experimental_shutdown_wrong_fundingB\x1c\n\x1a_experimental_peer_storageB\x17\n\x15_experimental_anchorsB\x13\n\x11_database_upgradeB\x06\n\x04_rgbB\x08\n\x06_aliasB\x0b\n\t_pid_fileB\x14\n\x12_ignore_fee_limitsB\x13\n\x11_watchtime_blocksB\x16\n\x14_max_locktime_blocksB\x13\n\x11_funding_confirmsB\r\n\x0b_cltv_deltaB\r\n\x0b_cltv_finalB\x0e\n\x0c_commit_timeB\x0b\n\t_fee_baseB\t\n\x07_rescanB\x12\n\x10_fee_per_satoshiB\x17\n\x15_max_concurrent_htlcsB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x1e\n\x1c_max_dust_htlc_exposure_msatB\x13\n\x11_min_capacity_satB\x07\n\x05_addrB\x10\n\x0e_announce_addrB\x0c\n\n_bind_addrB\n\n\x08_offlineB\r\n\x0b_autolistenB\x08\n\x06_proxyB\x0e\n\x0c_disable_dnsB\x1b\n\x19_announce_addr_discoveredB \n\x1e_announce_addr_discovered_portB\x10\n\x0e_encrypted_hsmB\x10\n\x0e_rpc_file_modeB\x0c\n\n_log_levelB\r\n\x0b_log_prefixB\x0b\n\t_log_fileB\x11\n\x0f_log_timestampsB\x11\n\x0f_force_feeratesB\x0c\n\n_subdaemonB\x19\n\x17_fetchinvoice_noconnectB\x17\n\x15_tor_service_passwordB\x14\n\x12_announce_addr_dnsB\x1b\n\x19_require_confirmed_inputsB\r\n\x0b_commit_feeB\x18\n\x16_commit_feerate_offsetB\x1b\n\x19_autoconnect_seeker_peersB\x1a\n\x18_currencyrate_add_sourceB\x1e\n\x1c_currencyrate_disable_sourceB\x1c\n\x1a_experimental_simple_closeB\x17\n\x15_accept_htlc_tlv_typeB\x11\n\x0f_hsm_passphraseB#\n!_i_promise_to_fix_broken_api_userB\x1c\n\x1a_invoices_onchain_fallbackB\x12\n\x10_message_paddingB\x15\n\x13_min_emergency_msatB\x18\n\x16_payment_fronting_nodeB\n\n\x08_recover\"J\n#ListconfigsConfigsAccepthtlctlvtype\x12\x0f\n\x07sources\x18\x01 \x03(\t\x12\x12\n\nvalues_int\x18\x02 \x03(\r\"=\n\x16ListconfigsConfigsAddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"<\n\x17ListconfigsConfigsAlias\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\"F\n ListconfigsConfigsAlwaysuseproxy\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"E\n\x1eListconfigsConfigsAnnounceaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\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\"G\n!ListconfigsConfigsAnnounceaddrdns\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\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\"B\n\x1cListconfigsConfigsAutolisten\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"A\n\x1aListconfigsConfigsBindaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"=\n\x1eListconfigsConfigsClearplugins\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"@\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\"A\n\x1cListconfigsConfigsCommittime\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"\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\n\'ListconfigsConfigsCurrencyrateaddsource\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"r\n+ListconfigsConfigsCurrencyratedisablesource\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"7\n\x18ListconfigsConfigsDaemon\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\x1bListconfigsConfigsDeveloper\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"[\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\"F\n\x1fListconfigsConfigsDisableplugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"E\n\x1eListconfigsConfigsEncryptedhsm\x12\x0f\n\x03set\x18\x01 \x01(\x08\x42\x02\x18\x01\x12\x12\n\x06source\x18\x02 \x01(\tB\x02\x18\x01\"L\n%ListconfigsConfigsExperimentalanchors\x12\x0f\n\x03set\x18\x01 \x01(\x08\x42\x02\x18\x01\x12\x12\n\x06source\x18\x02 \x01(\tB\x02\x18\x01\"E\n&ListconfigsConfigsExperimentaldualfund\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"P\n)ListconfigsConfigsExperimentalpeerstorage\x12\x0f\n\x03set\x18\x01 \x01(\x08\x42\x02\x18\x01\x12\x12\n\x06source\x18\x02 \x01(\tB\x02\x18\x01\"Q\n2ListconfigsConfigsExperimentalshutdownwrongfunding\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n)ListconfigsConfigsExperimentalsimpleclose\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"M\n&ListconfigsConfigsExperimentalsplicing\x12\x0f\n\x03set\x18\x01 \x01(\x08\x42\x02\x18\x01\x12\x12\n\x06source\x18\x02 \x01(\tB\x02\x18\x01\">\n\x19ListconfigsConfigsFeebase\x12\x11\n\tvalue_int\x18\x01 \x01(\r\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\"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\"D\n\x1fListconfigsConfigsForcefeerates\x12\x11\n\tvalue_str\x18\x01 \x01(\t\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\x1fListconfigsConfigsHsmpassphrase\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"T\n!ListconfigsConfigsHtlcminimummsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"S\n,ListconfigsConfigsIpromisetofixbrokenapiuser\x12\x0f\n\x07sources\x18\x01 \x03(\t\x12\x12\n\nvalues_str\x18\x02 \x03(\t\"G\n!ListconfigsConfigsIgnorefeelimits\x12\x12\n\nvalue_bool\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\"H\n)ListconfigsConfigsInvoicesonchainfallback\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"C\n\x1eListconfigsConfigsLightningdir\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\"?\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\"E\n\x1fListconfigsConfigsLogtimestamps\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsMainnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"\\\n)ListconfigsConfigsMaxdusthtlcexposuremsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"P\n#ListconfigsConfigsMaxlocktimeblocks\x12\x15\n\tvalue_int\x18\x01 \x01(\rB\x02\x18\x01\x12\x12\n\x06source\x18\x02 \x01(\tB\x02\x18\x01\"F\n ListconfigsConfigsMessagepadding\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x12\n\nvalue_bool\x18\x02 \x01(\x08\"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\"U\n\"ListconfigsConfigsMinemergencymsat\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x1f\n\nvalue_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\">\n\x19ListconfigsConfigsNetwork\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsOffline\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"L\n%ListconfigsConfigsPaymentfrontingnode\x12\x0f\n\x07sources\x18\x01 \x03(\t\x12\x12\n\nvalues_str\x18\x02 \x03(\t\">\n\x19ListconfigsConfigsPidfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\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\"<\n\x17ListconfigsConfigsProxy\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsRecover\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x11\n\tvalue_str\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsRegtest\x12\x0b\n\x03set\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\x18ListconfigsConfigsRescan\x12\x11\n\tvalue_int\x18\x01 \x01(\x12\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\x19ListconfigsConfigsRpcfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\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\"7\n\x18ListconfigsConfigsSignet\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"8\n\x19ListconfigsConfigsTestnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"I\n$ListconfigsConfigsTorservicepassword\x12\x11\n\tvalue_str\x18\x01 \x01(\t\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\"F\n!ListconfigsConfigsWatchtimeblocks\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"\r\n\x0bStopRequest\"a\n\x0cStopResponse\x12,\n\x06result\x18\x01 \x01(\x0e\x32\x1c.cln.StopResponse.StopResult\"#\n\nStopResult\x12\x15\n\x11SHUTDOWN_COMPLETE\x10\x00\"/\n\x0bHelpRequest\x12\x14\n\x07\x63ommand\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_command\"\x95\x01\n\x0cHelpResponse\x12\x1b\n\x04help\x18\x01 \x03(\x0b\x32\r.cln.HelpHelp\x12:\n\x0b\x66ormat_hint\x18\x02 \x01(\x0e\x32 .cln.HelpResponse.HelpFormathintH\x00\x88\x01\x01\"\x1c\n\x0eHelpFormathint\x12\n\n\x06SIMPLE\x10\x00\x42\x0e\n\x0c_format_hint\"\x1b\n\x08HelpHelp\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\"g\n\x18PreapprovekeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"\x1b\n\x19PreapprovekeysendResponse\"*\n\x18PreapproveinvoiceRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"\x1b\n\x19PreapproveinvoiceResponse\"\x15\n\x13StaticbackupRequest\"#\n\x14StaticbackupResponse\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"d\n\x16\x42kprchannelsapyRequest\x12\x17\n\nstart_time\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\r\n\x0b_start_timeB\x0b\n\t_end_time\"P\n\x17\x42kprchannelsapyResponse\x12\x35\n\x0c\x63hannels_apy\x18\x01 \x03(\x0b\x32\x1f.cln.BkprchannelsapyChannelsApy\"\xf9\x06\n\x1a\x42kprchannelsapyChannelsApy\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12$\n\x0frouted_out_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0erouted_in_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12(\n\x13lease_fee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12*\n\x15lease_fee_earned_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x0fpushed_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0epushed_in_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x16our_start_balance_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12/\n\x1a\x63hannel_start_balance_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\rfees_out_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x0c\x66\x65\x65s_in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x17\n\x0futilization_out\x18\x0c \x01(\t\x12$\n\x17utilization_out_initial\x18\r \x01(\tH\x01\x88\x01\x01\x12\x16\n\x0eutilization_in\x18\x0e \x01(\t\x12#\n\x16utilization_in_initial\x18\x0f \x01(\tH\x02\x88\x01\x01\x12\x0f\n\x07\x61py_out\x18\x10 \x01(\t\x12\x1c\n\x0f\x61py_out_initial\x18\x11 \x01(\tH\x03\x88\x01\x01\x12\x0e\n\x06\x61py_in\x18\x12 \x01(\t\x12\x1b\n\x0e\x61py_in_initial\x18\x13 \x01(\tH\x04\x88\x01\x01\x12\x11\n\tapy_total\x18\x14 \x01(\t\x12\x1e\n\x11\x61py_total_initial\x18\x15 \x01(\tH\x05\x88\x01\x01\x12\x16\n\tapy_lease\x18\x16 \x01(\tH\x06\x88\x01\x01\x42\x0f\n\r_fees_in_msatB\x1a\n\x18_utilization_out_initialB\x19\n\x17_utilization_in_initialB\x12\n\x10_apy_out_initialB\x11\n\x0f_apy_in_initialB\x14\n\x12_apy_total_initialB\x0c\n\n_apy_lease\"\xd2\x01\n\x18\x42kprdumpincomecsvRequest\x12\x12\n\ncsv_format\x18\x01 \x01(\t\x12\x15\n\x08\x63sv_file\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1d\n\x10\x63onsolidate_fees\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x17\n\nstart_time\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x05 \x01(\x04H\x03\x88\x01\x01\x42\x0b\n\t_csv_fileB\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"\xd4\x01\n\x19\x42kprdumpincomecsvResponse\x12\x10\n\x08\x63sv_file\x18\x01 \x01(\t\x12M\n\ncsv_format\x18\x02 \x01(\x0e\x32\x39.cln.BkprdumpincomecsvResponse.BkprdumpincomecsvCsvFormat\"V\n\x1a\x42kprdumpincomecsvCsvFormat\x12\x0f\n\x0b\x43OINTRACKER\x10\x00\x12\n\n\x06KOINLY\x10\x01\x12\x0b\n\x07HARMONY\x10\x02\x12\x0e\n\nQUICKBOOKS\x10\x03\"%\n\x12\x42kprinspectRequest\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\"7\n\x13\x42kprinspectResponse\x12 \n\x03txs\x18\x01 \x03(\x0b\x32\x13.cln.BkprinspectTxs\"\x9a\x01\n\x0e\x42kprinspectTxs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x18\n\x0b\x62lockheight\x18\x02 \x01(\rH\x00\x88\x01\x01\x12#\n\x0e\x66\x65\x65s_paid_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x07outputs\x18\x04 \x03(\x0b\x32\x1a.cln.BkprinspectTxsOutputsB\x0e\n\x0c_blockheight\"\xbc\x03\n\x15\x42kprinspectTxsOutputs\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12&\n\x11output_value_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x04 \x01(\t\x12%\n\x0b\x63redit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12$\n\ndebit_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12 \n\x13originating_account\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x17\n\noutput_tag\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tspend_tag\x18\t \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rspending_txid\x18\n \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x42\x0e\n\x0c_credit_msatB\r\n\x0b_debit_msatB\x16\n\x14_originating_accountB\r\n\x0b_output_tagB\x0c\n\n_spend_tagB\x10\n\x0e_spending_txidB\r\n\x0b_payment_id\"h\n\x1c\x42kprlistaccounteventsRequest\x12\x14\n\x07\x61\x63\x63ount\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\npayment_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\n\n\x08_accountB\r\n\x0b_payment_id\"Q\n\x1d\x42kprlistaccounteventsResponse\x12\x30\n\x06\x65vents\x18\x01 \x03(\x0b\x32 .cln.BkprlistaccounteventsEvents\"\xcd\x05\n\x1b\x42kprlistaccounteventsEvents\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12S\n\titem_type\x18\x02 \x01(\x0e\x32@.cln.BkprlistaccounteventsEvents.BkprlistaccounteventsEventsType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\t \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\n \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x05\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x07\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x08\x88\x01\x01\x12\x19\n\x0c\x63urrencyrate\x18\x11 \x01(\x01H\t\x88\x01\x01\"J\n\x1f\x42kprlistaccounteventsEventsType\x12\x0f\n\x0bONCHAIN_FEE\x10\x00\x12\t\n\x05\x43HAIN\x10\x01\x12\x0b\n\x07\x43HANNEL\x10\x02\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0e\n\x0c_descriptionB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_idB\x0f\n\r_currencyrate\"\x19\n\x17\x42kprlistbalancesRequest\"K\n\x18\x42kprlistbalancesResponse\x12/\n\x08\x61\x63\x63ounts\x18\x01 \x03(\x0b\x32\x1d.cln.BkprlistbalancesAccounts\"\xc6\x02\n\x18\x42kprlistbalancesAccounts\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x37\n\x08\x62\x61lances\x18\x02 \x03(\x0b\x32%.cln.BkprlistbalancesAccountsBalances\x12\x14\n\x07peer_id\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x16\n\twe_opened\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x1b\n\x0e\x61\x63\x63ount_closed\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x1d\n\x10\x61\x63\x63ount_resolved\x18\x06 \x01(\x08H\x03\x88\x01\x01\x12\x1e\n\x11resolved_at_block\x18\x07 \x01(\rH\x04\x88\x01\x01\x42\n\n\x08_peer_idB\x0c\n\n_we_openedB\x11\n\x0f_account_closedB\x13\n\x11_account_resolvedB\x14\n\x12_resolved_at_block\"X\n BkprlistbalancesAccountsBalances\x12!\n\x0c\x62\x61lance_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\tcoin_type\x18\x02 \x01(\t\"\x97\x01\n\x15\x42kprlistincomeRequest\x12\x1d\n\x10\x63onsolidate_fees\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x17\n\nstart_time\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x03 \x01(\rH\x02\x88\x01\x01\x42\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"P\n\x16\x42kprlistincomeResponse\x12\x36\n\rincome_events\x18\x01 \x03(\x0b\x32\x1f.cln.BkprlistincomeIncomeEvents\"\xb4\x02\n\x1a\x42kprlistincomeIncomeEvents\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0b\n\x03tag\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x05 \x01(\t\x12\x11\n\ttimestamp\x18\x06 \x01(\r\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\n \x01(\x0cH\x03\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_outpointB\x07\n\x05_txidB\r\n\x0b_payment_id\"P\n%BkpreditdescriptionbypaymentidRequest\x12\x12\n\npayment_id\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"e\n&BkpreditdescriptionbypaymentidResponse\x12;\n\x07updated\x18\x01 \x03(\x0b\x32*.cln.BkpreditdescriptionbypaymentidUpdated\"\xa3\x05\n%BkpreditdescriptionbypaymentidUpdated\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12g\n\titem_type\x18\x02 \x01(\x0e\x32T.cln.BkpreditdescriptionbypaymentidUpdated.BkpreditdescriptionbypaymentidUpdatedType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x15\n\x08outpoint\x18\t \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\n \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\x0b \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\r \x01(\x0cH\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x06\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x07\x88\x01\x01\"C\n)BkpreditdescriptionbypaymentidUpdatedType\x12\t\n\x05\x43HAIN\x10\x00\x12\x0b\n\x07\x43HANNEL\x10\x01\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_id\"M\n$BkpreditdescriptionbyoutpointRequest\x12\x10\n\x08outpoint\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"c\n%BkpreditdescriptionbyoutpointResponse\x12:\n\x07updated\x18\x01 \x03(\x0b\x32).cln.BkpreditdescriptionbyoutpointUpdated\"\x9f\x05\n$BkpreditdescriptionbyoutpointUpdated\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x65\n\titem_type\x18\x02 \x01(\x0e\x32R.cln.BkpreditdescriptionbyoutpointUpdated.BkpreditdescriptionbyoutpointUpdatedType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x15\n\x08outpoint\x18\t \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\n \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\x0b \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\r \x01(\x0cH\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x06\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x07\x88\x01\x01\"B\n(BkpreditdescriptionbyoutpointUpdatedType\x12\t\n\x05\x43HAIN\x10\x00\x12\x0b\n\x07\x43HANNEL\x10\x01\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_id\"\xb0\x01\n\x11\x42kprreportRequest\x12\x13\n\x06\x66ormat\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07headers\x18\x02 \x03(\t\x12\x13\n\x06\x65scape\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nstart_time\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x05 \x01(\rH\x03\x88\x01\x01\x42\t\n\x07_formatB\t\n\x07_escapeB\r\n\x0b_start_timeB\x0b\n\t_end_time\"$\n\x12\x42kprreportResponse\x12\x0e\n\x06report\x18\x01 \x03(\t\"n\n\x14\x42lacklistruneRequest\x12\x12\n\x05start\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x13\n\x06relist\x18\x03 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_endB\t\n\x07_relist\"G\n\x15\x42lacklistruneResponse\x12.\n\tblacklist\x18\x01 \x03(\x0b\x32\x1b.cln.BlacklistruneBlacklist\"4\n\x16\x42lacklistruneBlacklist\x12\r\n\x05start\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\"p\n\x10\x43heckruneRequest\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x13\n\x06nodeid\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06method\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0e\n\x06params\x18\x04 \x03(\tB\t\n\x07_nodeidB\t\n\x07_method\"\"\n\x11\x43heckruneResponse\x12\r\n\x05valid\x18\x01 \x01(\x08\"E\n\x11\x43reateruneRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0crestrictions\x18\x02 \x03(\tB\x07\n\x05_rune\"{\n\x12\x43reateruneResponse\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12&\n\x19warning_unrestricted_rune\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x1c\n\x1a_warning_unrestricted_rune\".\n\x10ShowrunesRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_rune\"7\n\x11ShowrunesResponse\x12\"\n\x05runes\x18\x01 \x03(\x0b\x32\x13.cln.ShowrunesRunes\"\x9d\x02\n\x0eShowrunesRunes\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x35\n\x0crestrictions\x18\x03 \x03(\x0b\x32\x1f.cln.ShowrunesRunesRestrictions\x12\x1f\n\x17restrictions_as_english\x18\x04 \x01(\t\x12\x13\n\x06stored\x18\x05 \x01(\x08H\x00\x88\x01\x01\x12\x18\n\x0b\x62lacklisted\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tlast_used\x18\x07 \x01(\x01H\x02\x88\x01\x01\x12\x15\n\x08our_rune\x18\x08 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_storedB\x0e\n\x0c_blacklistedB\x0c\n\n_last_usedB\x0b\n\t_our_rune\"p\n\x1aShowrunesRunesRestrictions\x12\x41\n\x0c\x61lternatives\x18\x01 \x03(\x0b\x32+.cln.ShowrunesRunesRestrictionsAlternatives\x12\x0f\n\x07\x65nglish\x18\x02 \x01(\t\"n\n&ShowrunesRunesRestrictionsAlternatives\x12\x11\n\tfieldname\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x11\n\tcondition\x18\x03 \x01(\t\x12\x0f\n\x07\x65nglish\x18\x04 \x01(\t\"r\n\x17\x41skreneunreserveRequest\x12\'\n\x04path\x18\x01 \x03(\x0b\x32\x19.cln.AskreneunreservePath\x12\x1b\n\x0e\x64\x65v_remove_all\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x11\n\x0f_dev_remove_all\"\x1a\n\x18\x41skreneunreserveResponse\"t\n\x14\x41skreneunreservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1c\n\x14short_channel_id_dir\x18\x04 \x01(\t\x12\x12\n\x05layer\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"8\n\x18\x41skrenelistlayersRequest\x12\x12\n\x05layer\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"I\n\x19\x41skrenelistlayersResponse\x12,\n\x06layers\x18\x01 \x03(\x0b\x32\x1c.cln.AskrenelistlayersLayers\"\xaa\x03\n\x17\x41skrenelistlayersLayers\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x16\n\x0e\x64isabled_nodes\x18\x02 \x03(\x0c\x12\x45\n\x10\x63reated_channels\x18\x03 \x03(\x0b\x32+.cln.AskrenelistlayersLayersCreatedChannels\x12<\n\x0b\x63onstraints\x18\x04 \x03(\x0b\x32\'.cln.AskrenelistlayersLayersConstraints\x12\x12\n\npersistent\x18\x05 \x01(\x08\x12\x19\n\x11\x64isabled_channels\x18\x06 \x03(\t\x12\x43\n\x0f\x63hannel_updates\x18\x07 \x03(\x0b\x32*.cln.AskrenelistlayersLayersChannelUpdates\x12\x32\n\x06\x62iases\x18\x08 \x03(\x0b\x32\".cln.AskrenelistlayersLayersBiases\x12;\n\x0bnode_biases\x18\t \x03(\x0b\x32&.cln.AskrenelistlayersLayersNodeBiases\"\x9b\x01\n\x1d\x41skrenelistlayersLayersBiases\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x0c\n\x04\x62ias\x18\x02 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x04 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\xa8\x03\n%AskrenelistlayersLayersChannelUpdates\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x14\n\x07\x65nabled\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12+\n\x11htlc_minimum_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1e\n\x11\x63ltv_expiry_delta\x18\x07 \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_enabledB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x14\n\x12_cltv_expiry_delta\"\xda\x01\n\"AskrenelistlayersLayersConstraints\x12&\n\x0cmaximum_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12&\n\x0cminimum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x1c\n\x14short_channel_id_dir\x18\x05 \x01(\t\x12\x16\n\ttimestamp\x18\x06 \x01(\x04H\x02\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msatB\x0c\n\n_timestamp\"\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\"\x91\x01\n!AskrenelistlayersLayersNodeBiases\x12\x0c\n\x04node\x18\x01 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x02 \x01(\x12\x12\x10\n\x08out_bias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x42\x0e\n\x0c_description\"R\n\x19\x41skrenecreatelayerRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x17\n\npersistent\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_persistent\"K\n\x1a\x41skrenecreatelayerResponse\x12-\n\x06layers\x18\x01 \x03(\x0b\x32\x1d.cln.AskrenecreatelayerLayers\"\xb0\x03\n\x18\x41skrenecreatelayerLayers\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x12\n\npersistent\x18\x02 \x01(\x08\x12\x16\n\x0e\x64isabled_nodes\x18\x03 \x03(\x0c\x12\x19\n\x11\x64isabled_channels\x18\x04 \x03(\t\x12\x46\n\x10\x63reated_channels\x18\x05 \x03(\x0b\x32,.cln.AskrenecreatelayerLayersCreatedChannels\x12\x44\n\x0f\x63hannel_updates\x18\x06 \x03(\x0b\x32+.cln.AskrenecreatelayerLayersChannelUpdates\x12=\n\x0b\x63onstraints\x18\x07 \x03(\x0b\x32(.cln.AskrenecreatelayerLayersConstraints\x12\x33\n\x06\x62iases\x18\x08 \x03(\x0b\x32#.cln.AskrenecreatelayerLayersBiases\x12<\n\x0bnode_biases\x18\t \x03(\x0b\x32\'.cln.AskrenecreatelayerLayersNodeBiases\"\x9c\x01\n\x1e\x41skrenecreatelayerLayersBiases\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x0c\n\x04\x62ias\x18\x02 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x04 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\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\"\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\"\x92\x01\n\"AskrenecreatelayerLayersNodeBiases\x12\x0c\n\x04node\x18\x01 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x02 \x01(\x12\x12\x10\n\x08out_bias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x42\x0e\n\x0c_description\"*\n\x19\x41skreneremovelayerRequest\x12\r\n\x05layer\x18\x01 \x01(\t\"\x1c\n\x1a\x41skreneremovelayerResponse\"P\n!AskreneremovechannelupdateRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\"$\n\"AskreneremovechannelupdateResponse\">\n\x15\x41skrenereserveRequest\x12%\n\x04path\x18\x01 \x03(\x0b\x32\x17.cln.AskrenereservePath\"\x18\n\x16\x41skrenereserveResponse\"r\n\x12\x41skrenereservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1c\n\x14short_channel_id_dir\x18\x04 \x01(\t\x12\x12\n\x05layer\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"2\n\x11\x41skreneageRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0e\n\x06\x63utoff\x18\x02 \x01(\x04\"8\n\x12\x41skreneageResponse\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x13\n\x0bnum_removed\x18\x02 \x01(\x04\"\xe7\x01\n\x10GetroutesRequest\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12 \n\x0bmaxfee_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\nfinal_cltv\x18\x07 \x01(\r\x12\x15\n\x08maxdelay\x18\x08 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08maxparts\x18\t \x01(\rH\x01\x88\x01\x01\x42\x0b\n\t_maxdelayB\x0b\n\t_maxparts\"R\n\x11GetroutesResponse\x12\x17\n\x0fprobability_ppm\x18\x01 \x01(\x04\x12$\n\x06routes\x18\x02 \x03(\x0b\x32\x14.cln.GetroutesRoutes\"\x88\x01\n\x0fGetroutesRoutes\x12\x17\n\x0fprobability_ppm\x18\x01 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x04path\x18\x03 \x03(\x0b\x32\x18.cln.GetroutesRoutesPath\x12\x12\n\nfinal_cltv\x18\x04 \x01(\r\"\xd4\x03\n\x13GetroutesRoutesPath\x12)\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x00\x88\x01\x01\x12\x1d\n\x0cnext_node_id\x18\x04 \x01(\x0c\x42\x02\x18\x01H\x01\x88\x01\x01\x12\x16\n\x05\x64\x65lay\x18\x05 \x01(\rB\x02\x18\x01H\x02\x88\x01\x01\x12\x1c\n\x14short_channel_id_dir\x18\x06 \x01(\t\x12(\n\x0e\x61mount_in_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12)\n\x0f\x61mount_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x17\n\nnode_id_in\x18\t \x01(\x0cH\x05\x88\x01\x01\x12\x18\n\x0bnode_id_out\x18\n \x01(\x0cH\x06\x88\x01\x01\x12\x14\n\x07\x63ltv_in\x18\x0b \x01(\rH\x07\x88\x01\x01\x12\x15\n\x08\x63ltv_out\x18\x0c \x01(\rH\x08\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0f\n\r_next_node_idB\x08\n\x06_delayB\x11\n\x0f_amount_in_msatB\x12\n\x10_amount_out_msatB\r\n\x0b_node_id_inB\x0e\n\x0c_node_id_outB\n\n\x08_cltv_inB\x0b\n\t_cltv_out\"8\n\x19\x41skrenedisablenodeRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\"\x1c\n\x1a\x41skrenedisablenodeResponse\"\x8a\x02\n\x1b\x41skreneinformchannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x06 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12K\n\x06inform\x18\x08 \x01(\x0e\x32;.cln.AskreneinformchannelRequest.AskreneinformchannelInform\"O\n\x1a\x41skreneinformchannelInform\x12\x0f\n\x0b\x43ONSTRAINED\x10\x00\x12\x11\n\rUNCONSTRAINED\x10\x01\x12\r\n\tSUCCEEDED\x10\x02\"Y\n\x1c\x41skreneinformchannelResponse\x12\x39\n\x0b\x63onstraints\x18\x02 \x03(\x0b\x32$.cln.AskreneinformchannelConstraints\"\xd3\x01\n\x1f\x41skreneinformchannelConstraints\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\r\n\x05layer\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\x04\x12&\n\x0cmaximum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12&\n\x0cminimum_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msat\"\x8f\x01\n\x1b\x41skrenecreatechannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x03 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x04 \x01(\t\x12\"\n\rcapacity_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"\x1e\n\x1c\x41skrenecreatechannelResponse\"\xad\x03\n\x1b\x41skreneupdatechannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x14\n\x07\x65nabled\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12+\n\x11htlc_minimum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x1e\n\x11\x63ltv_expiry_delta\x18\x08 \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_enabledB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x14\n\x12_cltv_expiry_delta\"\x1e\n\x1c\x41skreneupdatechannelResponse\"\xa4\x01\n\x19\x41skrenebiaschannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x0c\n\x04\x62ias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08relative\x18\x05 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_relative\"K\n\x1a\x41skrenebiaschannelResponse\x12-\n\x06\x62iases\x18\x01 \x03(\x0b\x32\x1d.cln.AskrenebiaschannelBiases\"\xa5\x01\n\x18\x41skrenebiaschannelBiases\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x0c\n\x04\x62ias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x05 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\xa4\x01\n\x16\x41skrenebiasnodeRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x11\n\tdirection\x18\x03 \x01(\t\x12\x0c\n\x04\x62ias\x18\x04 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08relative\x18\x06 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_relative\"N\n\x17\x41skrenebiasnodeResponse\x12\x33\n\x0bnode_biases\x18\x01 \x03(\x0b\x32\x1e.cln.AskrenebiasnodeNodeBiases\"\x98\x01\n\x19\x41skrenebiasnodeNodeBiases\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x03 \x01(\x12\x12\x10\n\x08out_bias\x18\x04 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x06 \x01(\x04\x42\x0e\n\x0c_description\" \n\x1e\x41skrenelistreservationsRequest\"a\n\x1f\x41skrenelistreservationsResponse\x12>\n\x0creservations\x18\x01 \x03(\x0b\x32(.cln.AskrenelistreservationsReservations\"\x91\x01\n#AskrenelistreservationsReservations\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x16\n\x0e\x61ge_in_seconds\x18\x03 \x01(\x04\x12\x12\n\ncommand_id\x18\x04 \x01(\t\"\xf5\x02\n\x19InjectpaymentonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x63ltv_expiry\x18\x04 \x01(\r\x12\x0e\n\x06partid\x18\x05 \x01(\x04\x12\x0f\n\x07groupid\x18\x06 \x01(\x04\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12*\n\x10\x64\x65stination_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x0b \x01(\x0cH\x04\x88\x01\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x10\n\x0e_localinvreqidB\x13\n\x11_destination_msatB\x0e\n\x0c_destination\"w\n\x1aInjectpaymentonionResponse\x12\x12\n\ncreated_at\x18\x01 \x01(\x04\x12\x14\n\x0c\x63ompleted_at\x18\x02 \x01(\x04\x12\x15\n\rcreated_index\x18\x03 \x01(\x04\x12\x18\n\x10payment_preimage\x18\x04 \x01(\x0c\">\n\x19InjectonionmessageRequest\x12\x10\n\x08path_key\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x1c\n\x1aInjectonionmessageResponse\"\xbb\x03\n\x0bXpayRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12&\n\x0cpartial_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x17\n\npayer_note\x18\x08 \x01(\tH\x05\x88\x01\x01\x12\x12\n\x05label\x18\t \x01(\tH\x06\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\n \x01(\x0cH\x07\x88\x01\x01\x12\x1b\n\x0e\x64\x65v_use_shadow\x18\x0b \x01(\x08H\x08\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0f\n\r_partial_msatB\x0b\n\t_maxdelayB\r\n\x0b_payer_noteB\x08\n\x06_labelB\x10\n\x0e_localinvreqidB\x11\n\x0f_dev_use_shadow\"\xa1\x01\n\x0cXpayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x14\n\x0c\x66\x61iled_parts\x18\x02 \x01(\x04\x12\x18\n\x10successful_parts\x18\x03 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"=\n\x19SignmessagewithkeyRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"`\n\x1aSignmessagewithkeyResponse\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\x0e\n\x06\x62\x61se64\x18\x04 \x01(\t\"\xcd\x01\n\x17ListchannelmovesRequest\x12\x46\n\x05index\x18\x01 \x01(\x0e\x32\x32.cln.ListchannelmovesRequest.ListchannelmovesIndexH\x00\x88\x01\x01\x12\x12\n\x05start\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\"$\n\x15ListchannelmovesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"S\n\x18ListchannelmovesResponse\x12\x37\n\x0c\x63hannelmoves\x18\x01 \x03(\x0b\x32!.cln.ListchannelmovesChannelmoves\"\xa9\x04\n\x1cListchannelmovesChannelmoves\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x12\n\naccount_id\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12]\n\x0bprimary_tag\x18\x06 \x01(\x0e\x32H.cln.ListchannelmovesChannelmoves.ListchannelmovesChannelmovesPrimaryTag\x12\x19\n\x0cpayment_hash\x18\x07 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x07part_id\x18\x08 \x01(\x04H\x01\x88\x01\x01\x12\x15\n\x08group_id\x18\t \x01(\x04H\x02\x88\x01\x01\x12\x1e\n\tfees_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\"\x96\x01\n&ListchannelmovesChannelmovesPrimaryTag\x12\x0b\n\x07INVOICE\x10\x00\x12\n\n\x06ROUTED\x10\x01\x12\n\n\x06PUSHED\x10\x02\x12\r\n\tLEASE_FEE\x10\x03\x12\x14\n\x10\x43HANNEL_PROPOSED\x10\x04\x12\x0f\n\x0bPENALTY_ADJ\x10\x05\x12\x11\n\rJOURNAL_ENTRY\x10\x06\x42\x0f\n\r_payment_hashB\n\n\x08_part_idB\x0b\n\t_group_id\"\xc5\x01\n\x15ListchainmovesRequest\x12\x42\n\x05index\x18\x01 \x01(\x0e\x32..cln.ListchainmovesRequest.ListchainmovesIndexH\x00\x88\x01\x01\x12\x12\n\x05start\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\"\"\n\x13ListchainmovesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"K\n\x16ListchainmovesResponse\x12\x31\n\nchainmoves\x18\x01 \x03(\x0b\x32\x1d.cln.ListchainmovesChainmoves\"\xd4\x06\n\x18ListchainmovesChainmoves\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x12\n\naccount_id\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12U\n\x0bprimary_tag\x18\x06 \x01(\x0e\x32@.cln.ListchainmovesChainmoves.ListchainmovesChainmovesPrimaryTag\x12\x14\n\x07peer_id\x18\x08 \x01(\x0cH\x00\x88\x01\x01\x12 \n\x13originating_account\x18\t \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rspending_txid\x18\n \x01(\x0cH\x02\x88\x01\x01\x12\x1b\n\x04utxo\x18\x0b \x01(\x0b\x32\r.cln.Outpoint\x12\x19\n\x0cpayment_hash\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12 \n\x0boutput_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x0coutput_count\x18\x0e \x01(\rH\x04\x88\x01\x01\x12\x13\n\x0b\x62lockheight\x18\x0f \x01(\r\x12\x12\n\nextra_tags\x18\x10 \x03(\t\"\x95\x02\n\"ListchainmovesChainmovesPrimaryTag\x12\x0b\n\x07\x44\x45POSIT\x10\x00\x12\x0e\n\nWITHDRAWAL\x10\x01\x12\x0b\n\x07PENALTY\x10\x02\x12\x10\n\x0c\x43HANNEL_OPEN\x10\x03\x12\x11\n\rCHANNEL_CLOSE\x10\x04\x12\x11\n\rDELAYED_TO_US\x10\x05\x12\x0b\n\x07HTLC_TX\x10\x06\x12\x10\n\x0cHTLC_TIMEOUT\x10\x07\x12\x10\n\x0cHTLC_FULFILL\x10\x08\x12\r\n\tTO_WALLET\x10\t\x12\n\n\x06\x41NCHOR\x10\n\x12\x0b\n\x07TO_THEM\x10\x0b\x12\r\n\tPENALIZED\x10\x0c\x12\n\n\x06STOLEN\x10\r\x12\x0b\n\x07IGNORED\x10\x0e\x12\x0c\n\x08TO_MINER\x10\x0f\x42\n\n\x08_peer_idB\x16\n\x14_originating_accountB\x10\n\x0e_spending_txidB\x0f\n\r_payment_hashB\x0f\n\r_output_count\"\xe9\x01\n\x18ListnetworkeventsRequest\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12H\n\x05index\x18\x02 \x01(\x0e\x32\x34.cln.ListnetworkeventsRequest.ListnetworkeventsIndexH\x01\x88\x01\x01\x12\x12\n\x05start\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12\x12\n\x05limit\x18\x04 \x01(\rH\x03\x88\x01\x01\"%\n\x16ListnetworkeventsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x05\n\x03_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"W\n\x19ListnetworkeventsResponse\x12:\n\rnetworkevents\x18\x01 \x03(\x0b\x32#.cln.ListnetworkeventsNetworkevents\"\xf2\x01\n\x1eListnetworkeventsNetworkevents\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x0f\n\x07peer_id\x18\x03 \x01(\x0c\x12\x11\n\titem_type\x18\x04 \x01(\t\x12\x13\n\x06reason\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rduration_nsec\x18\x06 \x01(\x04H\x01\x88\x01\x01\x12\x1e\n\x11\x63onnect_attempted\x18\x07 \x01(\x08H\x02\x88\x01\x01\x42\t\n\x07_reasonB\x10\n\x0e_duration_nsecB\x14\n\x12_connect_attempted\"/\n\x16\x44\x65lnetworkeventRequest\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\"\x19\n\x17\x44\x65lnetworkeventResponse\"\xf6\x01\n\x1a\x43lnrestregisterpathRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x12\n\nrpc_method\x18\x02 \x01(\t\x12H\n\x11rune_restrictions\x18\x03 \x01(\x0b\x32(.cln.ClnrestregisterpathRuneRestrictionsH\x00\x88\x01\x01\x12\x1a\n\rrune_required\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x0bhttp_method\x18\x05 \x01(\tH\x02\x88\x01\x01\x42\x14\n\x12_rune_restrictionsB\x10\n\x0e_rune_requiredB\x0e\n\x0c_http_method\"\x1d\n\x1b\x43lnrestregisterpathResponse\"\xda\x01\n#ClnrestregisterpathRuneRestrictions\x12\x13\n\x06nodeid\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06method\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x44\n\x06params\x18\x03 \x03(\x0b\x32\x34.cln.ClnrestregisterpathRuneRestrictions.ParamsEntry\x1a-\n\x0bParamsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07_nodeidB\t\n\x07_method\",\n\x18ListcurrencyratesRequest\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\"W\n\x19ListcurrencyratesResponse\x12:\n\rcurrencyrates\x18\x01 \x03(\x0b\x32#.cln.ListcurrencyratesCurrencyrates\"@\n\x1eListcurrencyratesCurrencyrates\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x01\":\n\x16\x43urrencyconvertRequest\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x01\x12\x10\n\x08\x63urrency\x18\x02 \x01(\t\"4\n\x17\x43urrencyconvertResponse\x12\x19\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\"G\n\x13\x43urrencyrateRequest\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\x12\x13\n\x06source\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_source\"$\n\x14\x43urrencyrateResponse\x12\x0c\n\x04rate\x18\x01 \x01(\x01\"\x95\x02\n\x11SendamountRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x17\n\npayer_note\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x12\n\x05label\x18\x08 \x01(\tH\x04\x88\x01\x01\x42\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\r\n\x0b_payer_noteB\x08\n\x06_label\"\xa7\x01\n\x12SendamountResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x14\n\x0c\x66\x61iled_parts\x18\x02 \x01(\x04\x12\x18\n\x10successful_parts\x18\x03 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"e\n\x12\x43reateproofRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12\x11\n\x04note\x18\x02 \x01(\tH\x00\x88\x01\x01\x12 \n\x07include\x18\x03 \x03(\x0b\x32\x0f.cln.ProofFieldB\x07\n\x05_note\"=\n\x13\x43reateproofResponse\x12&\n\x06proofs\x18\x01 \x03(\x0b\x32\x16.cln.CreateproofProofs\"\xb6\x01\n\x11\x43reateproofProofs\x12\x0e\n\x06\x62olt12\x18\x01 \x01(\t\x12.\n\x15offer_fields_included\x18\x02 \x03(\x0b\x32\x0f.cln.ProofField\x12/\n\x16invreq_fields_included\x18\x03 \x03(\x0b\x32\x0f.cln.ProofField\x12\x30\n\x17invoice_fields_included\x18\x04 \x03(\x0b\x32\x0f.cln.ProofField\"\xd7\x02\n\x0fXkeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x0e\n\x06layers\x18\x05 \x03(\t\x12\x16\n\tretry_for\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x07 \x01(\rH\x03\x88\x01\x01\x12\x36\n\textratlvs\x18\x08 \x03(\x0b\x32#.cln.XkeysendRequest.ExtratlvsEntry\x1a\x30\n\x0e\x45xtratlvsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x08\n\x06_labelB\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0b\n\t_maxdelay\"\xa5\x01\n\x10XkeysendResponse\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\"3\n\x0fGracefulRequest\x12\x14\n\x07timeout\x18\x01 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_timeout\"H\n\x10GracefulResponse\x12\x1d\n\x15pending_htlc_expiries\x18\x01 \x03(\r\x12\x15\n\rpending_peers\x18\x02 \x03(\x0c\"\x1e\n\x1cStreamBalanceSnapshotRequest\"\x86\x01\n\x1b\x42\x61lanceSnapshotNotification\x12\x0f\n\x07node_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x62lockheight\x18\x02 \x01(\r\x12\x11\n\ttimestamp\x18\x03 \x01(\r\x12.\n\x08\x61\x63\x63ounts\x18\x04 \x03(\x0b\x32\x1c.cln.BalanceSnapshotAccounts\"c\n\x17\x42\x61lanceSnapshotAccounts\x12\x12\n\naccount_id\x18\x01 \x01(\t\x12!\n\x0c\x62\x61lance_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\tcoin_type\x18\x03 \x01(\t\"\x19\n\x17StreamBlockAddedRequest\"6\n\x16\x42lockAddedNotification\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\x0e\n\x06height\x18\x02 \x01(\r\" \n\x1eStreamChannelOpenFailedRequest\"3\n\x1d\x43hannelOpenFailedNotification\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"\x1c\n\x1aStreamChannelOpenedRequest\"w\n\x19\x43hannelOpenedNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12!\n\x0c\x66unding_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\x12\x15\n\rchannel_ready\x18\x04 \x01(\x08\"\"\n StreamChannelStateChangedRequest\"\xc1\x03\n\x1f\x43hannelStateChangedNotification\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x04 \x01(\t\x12)\n\told_state\x18\x05 \x01(\x0e\x32\x11.cln.ChannelStateH\x01\x88\x01\x01\x12$\n\tnew_state\x18\x06 \x01(\x0e\x32\x11.cln.ChannelState\x12L\n\x05\x63\x61use\x18\x07 \x01(\x0e\x32=.cln.ChannelStateChangedNotification.ChannelStateChangedCause\x12\x14\n\x07message\x18\x08 \x01(\tH\x02\x88\x01\x01\"c\n\x18\x43hannelStateChangedCause\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05LOCAL\x10\x01\x12\x08\n\x04USER\x10\x02\x12\n\n\x06REMOTE\x10\x03\x12\x0c\n\x08PROTOCOL\x10\x04\x12\x0b\n\x07ONCHAIN\x10\x05\x42\x13\n\x11_short_channel_idB\x0c\n\n_old_stateB\n\n\x08_message\"\x16\n\x14StreamConnectRequest\"\xbe\x01\n\x17PeerConnectNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x44\n\tdirection\x18\x02 \x01(\x0e\x32\x31.cln.PeerConnectNotification.PeerConnectDirection\x12(\n\x07\x61\x64\x64ress\x18\x03 \x01(\x0b\x32\x17.cln.PeerConnectAddress\"\'\n\x14PeerConnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\x9a\x02\n\x12PeerConnectAddress\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.PeerConnectAddress.PeerConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"c\n\x16PeerConnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x12\r\n\tWEBSOCKET\x10\x05\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"\x1b\n\x19StreamCoinMovementRequest\"\xaf\x0b\n\x18\x43oinMovementNotification\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\tcoin_type\x18\x02 \x01(\t\x12\x0f\n\x07node_id\x18\x03 \x01(\x0c\x12\x41\n\titem_type\x18\x04 \x01(\x0e\x32..cln.CoinMovementNotification.CoinMovementType\x12\x1a\n\rcreated_index\x18\x05 \x01(\x04H\x00\x88\x01\x01\x12\x12\n\naccount_id\x18\x06 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\t \x01(\x04\x12\x10\n\x04tags\x18\n \x03(\tB\x02\x18\x01\x12N\n\x0bprimary_tag\x18\x0b \x01(\x0e\x32\x34.cln.CoinMovementNotification.CoinMovementPrimaryTagH\x01\x88\x01\x01\x12\x12\n\nextra_tags\x18\x0c \x03(\t\x12\x19\n\x0cpayment_hash\x18\r \x01(\x0cH\x02\x88\x01\x01\x12\x14\n\x07part_id\x18\x0e \x01(\x04H\x03\x88\x01\x01\x12\x15\n\x08group_id\x18\x0f \x01(\x04H\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x10 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12 \n\x04utxo\x18\x11 \x01(\x0b\x32\r.cln.OutpointH\x06\x88\x01\x01\x12\x14\n\x07peer_id\x18\x12 \x01(\x0cH\x07\x88\x01\x01\x12 \n\x13originating_account\x18\x13 \x01(\tH\x08\x88\x01\x01\x12\x15\n\x04txid\x18\x14 \x01(\x0c\x42\x02\x18\x01H\t\x88\x01\x01\x12\x1a\n\rspending_txid\x18\x15 \x01(\x0cH\n\x88\x01\x01\x12\x1a\n\tutxo_txid\x18\x16 \x01(\x0c\x42\x02\x18\x01H\x0b\x88\x01\x01\x12\x15\n\x04vout\x18\x17 \x01(\rB\x02\x18\x01H\x0c\x88\x01\x01\x12%\n\x0boutput_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\r\x88\x01\x01\x12\x19\n\x0coutput_count\x18\x19 \x01(\rH\x0e\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\x1a \x01(\rH\x0f\x88\x01\x01\"\xf7\x02\n\x16\x43oinMovementPrimaryTag\x12\x0b\n\x07\x44\x45POSIT\x10\x00\x12\x0e\n\nWITHDRAWAL\x10\x01\x12\x0b\n\x07PENALTY\x10\x02\x12\x10\n\x0c\x43HANNEL_OPEN\x10\x03\x12\x11\n\rCHANNEL_CLOSE\x10\x04\x12\x11\n\rDELAYED_TO_US\x10\x05\x12\x0b\n\x07HTLC_TX\x10\x06\x12\x10\n\x0cHTLC_TIMEOUT\x10\x07\x12\x10\n\x0cHTLC_FULFILL\x10\x08\x12\r\n\tTO_WALLET\x10\t\x12\n\n\x06\x41NCHOR\x10\n\x12\x0b\n\x07TO_THEM\x10\x0b\x12\r\n\tPENALIZED\x10\x0c\x12\n\n\x06STOLEN\x10\r\x12\x0b\n\x07IGNORED\x10\x0e\x12\x0c\n\x08TO_MINER\x10\x0f\x12\x0b\n\x07INVOICE\x10\x10\x12\n\n\x06ROUTED\x10\x11\x12\n\n\x06PUSHED\x10\x12\x12\r\n\tLEASE_FEE\x10\x13\x12\x14\n\x10\x43HANNEL_PROPOSED\x10\x14\x12\x0f\n\x0bPENALTY_ADJ\x10\x15\x12\x11\n\rJOURNAL_ENTRY\x10\x16\"2\n\x10\x43oinMovementType\x12\x0f\n\x0b\x43HANNEL_MVT\x10\x00\x12\r\n\tCHAIN_MVT\x10\x01\x42\x10\n\x0e_created_indexB\x0e\n\x0c_primary_tagB\x0f\n\r_payment_hashB\n\n\x08_part_idB\x0b\n\t_group_idB\x0c\n\n_fees_msatB\x07\n\x05_utxoB\n\n\x08_peer_idB\x16\n\x14_originating_accountB\x07\n\x05_txidB\x10\n\x0e_spending_txidB\x0c\n\n_utxo_txidB\x07\n\x05_voutB\x0e\n\x0c_output_msatB\x0f\n\r_output_countB\x0e\n\x0c_blockheight\"\x18\n\x16StreamCustomMsgRequest\"9\n\x15\x43ustomMsgNotification\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\" \n\x1eStreamDeprecatedOneshotRequest\"6\n\x1d\x44\x65precatedOneshotNotification\x12\x15\n\rdeprecated_ok\x18\x01 \x01(\x08\"\x19\n\x17StreamDisconnectRequest\"$\n\x16\x44isconnectNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\"\x1b\n\x19StreamForwardEventRequest\"\x88\x05\n\x18\x46orwardEventNotification\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x12\n\nin_channel\x18\x02 \x01(\t\x12\x18\n\x0bout_channel\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x07in_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\x08out_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12@\n\x06status\x18\x07 \x01(\x0e\x32\x30.cln.ForwardEventNotification.ForwardEventStatus\x12\x15\n\x08\x66\x61ilcode\x18\x08 \x01(\rH\x03\x88\x01\x01\x12\x17\n\nfailreason\x18\t \x01(\tH\x04\x88\x01\x01\x12\x43\n\x05style\x18\n \x01(\x0e\x32/.cln.ForwardEventNotification.ForwardEventStyleH\x05\x88\x01\x01\x12\x15\n\rreceived_time\x18\x0b \x01(\x01\x12\x1a\n\rresolved_time\x18\x0c \x01(\x01H\x06\x88\x01\x01\"L\n\x12\x46orwardEventStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"(\n\x11\x46orwardEventStyle\x12\n\n\x06LEGACY\x10\x00\x12\x07\n\x03TLV\x10\x01\x42\x0e\n\x0c_out_channelB\x0b\n\t_out_msatB\x0b\n\t_fee_msatB\x0b\n\t_failcodeB\r\n\x0b_failreasonB\x08\n\x06_styleB\x10\n\x0e_resolved_time\"\x1e\n\x1cStreamInvoiceCreationRequest\"\x8b\x01\n\x1bInvoiceCreationNotification\x12\x1e\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08preimage\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\t\x12\x15\n\x08offer_id\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x42\x07\n\x05_msatB\x0b\n\t_offer_id\"\x1d\n\x1bStreamInvoicePaymentRequest\"\x8b\x01\n\x1aInvoicePaymentNotification\x12\x19\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08preimage\x18\x02 \x01(\x0c\x12$\n\x08outpoint\x18\x03 \x01(\x0b\x32\r.cln.OutpointH\x00\x88\x01\x01\x12\r\n\x05label\x18\x04 \x01(\tB\x0b\n\t_outpoint\"\x12\n\x10StreamLogRequest\"\xca\x01\n\x0fLogNotification\x12,\n\x05level\x18\x01 \x01(\x0e\x32\x1d.cln.LogNotification.LogLevel\x12\x0c\n\x04time\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\t\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x0b\n\x03log\x18\x05 \x01(\t\"K\n\x08LogLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05TRACE\x10\x01\x12\t\n\x05\x44\x45\x42UG\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\x0b\n\x07UNUSUAL\x10\x04\x12\n\n\x06\x42ROKEN\x10\x05\"&\n$StreamOnionMessageForwardFailRequest\"\xef\x01\n#OnionMessageForwardFailNotification\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x10\n\x08incoming\x18\x02 \x01(\x0c\x12\x10\n\x08path_key\x18\x03 \x01(\x0c\x12\x15\n\x08outgoing\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x12\x19\n\x0cnext_node_id\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12&\n\x19next_short_channel_id_dir\x18\x06 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_outgoingB\x0f\n\r_next_node_idB\x1c\n\x1a_next_short_channel_id_dir\"\"\n StreamOpenChannelPeerSigsRequest\"J\n\x1fOpenChannelPeerSigsNotification\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_psbt\x18\x02 \x01(\t\"\x1c\n\x1aStreamPluginStartedRequest\"V\n\x19PluginStartedNotification\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\x12\x13\n\x0bplugin_path\x18\x02 \x01(\t\x12\x0f\n\x07methods\x18\x03 \x03(\t\"\x1c\n\x1aStreamPluginStoppedRequest\"V\n\x19PluginStoppedNotification\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\x12\x13\n\x0bplugin_path\x18\x02 \x01(\t\x12\x0f\n\x07methods\x18\x03 \x03(\t\"\x1d\n\x1bStreamSendPayFailureRequest\"b\n\x1aSendPayFailureNotification\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x12\x12\x0f\n\x07message\x18\x02 \x01(\t\x12%\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x17.cln.SendpayFailureData\"\xc1\t\n\x12SendpayFailureData\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x03\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x06\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x12*\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x17\n\ncreated_at\x18\n \x01(\x04H\t\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\n\x88\x01\x01\x12\x45\n\x06status\x18\x0c \x01(\x0e\x32\x30.cln.SendpayFailureData.SendpayFailureDataStatusH\x0b\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x0c\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\r\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x0e\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\x0f\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x11 \x01(\tH\x10\x88\x01\x01\x12\x17\n\nerroronion\x18\x12 \x01(\x0cH\x11\x88\x01\x01\x12\x17\n\nonionreply\x18\x13 \x01(\x0cH\x12\x88\x01\x01\x12\x19\n\x0c\x65rring_index\x18\x14 \x01(\rH\x13\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x15 \x01(\rH\x14\x88\x01\x01\x12\x19\n\x0c\x66\x61ilcodename\x18\x16 \x01(\tH\x15\x88\x01\x01\x12\x18\n\x0b\x65rring_node\x18\x17 \x01(\x0cH\x16\x88\x01\x01\x12\x1b\n\x0e\x65rring_channel\x18\x18 \x01(\tH\x17\x88\x01\x01\x12\x1d\n\x10\x65rring_direction\x18\x19 \x01(\rH\x18\x88\x01\x01\x12\x18\n\x0braw_message\x18\x1a \x01(\x0cH\x19\x88\x01\x01\"A\n\x18SendpayFailureDataStatus\x12\n\n\x06\x46\x41ILED\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x10\n\x0e_created_indexB\x05\n\x03_idB\x0f\n\r_payment_hashB\n\n\x08_groupidB\x10\n\x0e_updated_indexB\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x13\n\x11_amount_sent_msatB\r\n\x0b_created_atB\x0f\n\r_completed_atB\t\n\x07_statusB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_descriptionB\r\n\x0b_erroronionB\r\n\x0b_onionreplyB\x0f\n\r_erring_indexB\x0b\n\t_failcodeB\x0f\n\r_failcodenameB\x0e\n\x0c_erring_nodeB\x11\n\x0f_erring_channelB\x13\n\x11_erring_directionB\x0e\n\x0c_raw_message\"\x1d\n\x1bStreamSendPaySuccessRequest\"\xcc\x05\n\x1aSendPaySuccessNotification\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x0f\n\x07groupid\x18\x04 \x01(\x04\x12\x1a\n\rupdated_index\x18\x05 \x01(\x04H\x00\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x02\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12%\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\ncreated_at\x18\n \x01(\x04\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12\x44\n\x06status\x18\x0c \x01(\x0e\x32\x34.cln.SendPaySuccessNotification.SendpaySuccessStatus\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x05\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\x08\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x11 \x01(\tH\t\x88\x01\x01\x12\x17\n\nerroronion\x18\x12 \x01(\x0cH\n\x88\x01\x01\"$\n\x14SendpaySuccessStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\x10\n\x0e_updated_indexB\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x0f\n\r_completed_atB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_descriptionB\r\n\x0b_erroronion\"\x17\n\x15StreamShutdownRequest\"\x16\n\x14ShutdownNotification\"\x16\n\x14StreamWarningRequest\"\xae\x01\n\x13WarningNotification\x12\x34\n\x05level\x18\x01 \x01(\x0e\x32%.cln.WarningNotification.WarningLevel\x12\x0c\n\x04time\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\t\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x0b\n\x03log\x18\x05 \x01(\t\"#\n\x0cWarningLevel\x12\x08\n\x04WARN\x10\x00\x12\t\n\x05\x45RROR\x10\x01\"\x19\n\x17StreamPayPartEndRequest\"\xf1\x03\n\x16PayPartEndNotification\x12<\n\x06status\x18\x01 \x01(\x0e\x32,.cln.PayPartEndNotification.PayPartEndStatus\x12\x10\n\x08\x64uration\x18\x02 \x01(\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x0f\n\x07groupid\x18\x04 \x01(\x04\x12\x0e\n\x06partid\x18\x05 \x01(\x04\x12\x17\n\nfailed_msg\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x61iled_node_id\x18\x07 \x01(\x0cH\x01\x88\x01\x01\x12$\n\x17\x66\x61iled_short_channel_id\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10\x66\x61iled_direction\x18\t \x01(\rH\x03\x88\x01\x01\x12\x17\n\nerror_code\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rerror_message\x18\x0b \x01(\tH\x05\x88\x01\x01\",\n\x10PayPartEndStatus\x12\x0b\n\x07SUCCESS\x10\x00\x12\x0b\n\x07\x46\x41ILURE\x10\x01\x42\r\n\x0b_failed_msgB\x11\n\x0f_failed_node_idB\x1a\n\x18_failed_short_channel_idB\x13\n\x11_failed_directionB\r\n\x0b_error_codeB\x10\n\x0e_error_message\"\x1b\n\x19StreamPayPartStartRequest\"\xc2\x01\n\x18PayPartStartNotification\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x0e\n\x06partid\x18\x03 \x01(\x04\x12\'\n\x12total_payment_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x0c\x61ttempt_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x04hops\x18\x06 \x03(\x0b\x32\x15.cln.PayPartStartHops\"\x9f\x01\n\x10PayPartStartHops\x12\x11\n\tnext_node\x18\x01 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x02 \x01(\t\x12\x11\n\tdirection\x18\x03 \x01(\r\x12$\n\x0f\x63hannel_in_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x63hannel_out_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount2\xbah\n\x04Node\x12\x36\n\x07Getinfo\x12\x13.cln.GetinfoRequest\x1a\x14.cln.GetinfoResponse\"\x00\x12<\n\tListPeers\x12\x15.cln.ListpeersRequest\x1a\x16.cln.ListpeersResponse\"\x00\x12<\n\tListFunds\x12\x15.cln.ListfundsRequest\x1a\x16.cln.ListfundsResponse\"\x00\x12\x36\n\x07SendPay\x12\x13.cln.SendpayRequest\x1a\x14.cln.SendpayResponse\"\x00\x12\x45\n\x0cListChannels\x12\x18.cln.ListchannelsRequest\x1a\x19.cln.ListchannelsResponse\"\x00\x12<\n\tAddGossip\x12\x15.cln.AddgossipRequest\x1a\x16.cln.AddgossipResponse\"\x00\x12H\n\rAddPsbtOutput\x12\x19.cln.AddpsbtoutputRequest\x1a\x1a.cln.AddpsbtoutputResponse\"\x00\x12H\n\rAutoCleanOnce\x12\x19.cln.AutocleanonceRequest\x1a\x1a.cln.AutocleanonceResponse\"\x00\x12N\n\x0f\x41utoCleanStatus\x12\x1b.cln.AutocleanstatusRequest\x1a\x1c.cln.AutocleanstatusResponse\"\x00\x12\x45\n\x0c\x43heckMessage\x12\x18.cln.CheckmessageRequest\x1a\x19.cln.CheckmessageResponse\"\x00\x12\x30\n\x05\x43lose\x12\x11.cln.CloseRequest\x1a\x12.cln.CloseResponse\"\x00\x12:\n\x0b\x43onnectPeer\x12\x13.cln.ConnectRequest\x1a\x14.cln.ConnectResponse\"\x00\x12H\n\rCreateInvoice\x12\x19.cln.CreateinvoiceRequest\x1a\x1a.cln.CreateinvoiceResponse\"\x00\x12<\n\tDatastore\x12\x15.cln.DatastoreRequest\x1a\x16.cln.DatastoreResponse\"\x00\x12K\n\x0e\x44\x61tastoreUsage\x12\x1a.cln.DatastoreusageRequest\x1a\x1b.cln.DatastoreusageResponse\"\x00\x12\x42\n\x0b\x43reateOnion\x12\x17.cln.CreateonionRequest\x1a\x18.cln.CreateonionResponse\"\x00\x12\x45\n\x0c\x44\x65lDatastore\x12\x18.cln.DeldatastoreRequest\x1a\x19.cln.DeldatastoreResponse\"\x00\x12?\n\nDelInvoice\x12\x16.cln.DelinvoiceRequest\x1a\x17.cln.DelinvoiceResponse\"\x00\x12Q\n\x10\x44\x65vForgetChannel\x12\x1c.cln.DevforgetchannelRequest\x1a\x1d.cln.DevforgetchannelResponse\"\x00\x12Q\n\x10\x45mergencyRecover\x12\x1c.cln.EmergencyrecoverRequest\x1a\x1d.cln.EmergencyrecoverResponse\"\x00\x12\x66\n\x17GetEmergencyRecoverData\x12#.cln.GetemergencyrecoverdataRequest\x1a$.cln.GetemergencyrecoverdataResponse\"\x00\x12\x45\n\x0c\x45xposeSecret\x12\x18.cln.ExposesecretRequest\x1a\x19.cln.ExposesecretResponse\"\x00\x12\x36\n\x07Recover\x12\x13.cln.RecoverRequest\x1a\x14.cln.RecoverResponse\"\x00\x12K\n\x0eRecoverChannel\x12\x1a.cln.RecoverchannelRequest\x1a\x1b.cln.RecoverchannelResponse\"\x00\x12\x36\n\x07Invoice\x12\x13.cln.InvoiceRequest\x1a\x14.cln.InvoiceResponse\"\x00\x12Q\n\x14\x43reateInvoiceRequest\x12\x1a.cln.InvoicerequestRequest\x1a\x1b.cln.InvoicerequestResponse\"\x00\x12`\n\x15\x44isableInvoiceRequest\x12!.cln.DisableinvoicerequestRequest\x1a\".cln.DisableinvoicerequestResponse\"\x00\x12Z\n\x13ListInvoiceRequests\x12\x1f.cln.ListinvoicerequestsRequest\x1a .cln.ListinvoicerequestsResponse\"\x00\x12H\n\rListDatastore\x12\x19.cln.ListdatastoreRequest\x1a\x1a.cln.ListdatastoreResponse\"\x00\x12\x45\n\x0cListInvoices\x12\x18.cln.ListinvoicesRequest\x1a\x19.cln.ListinvoicesResponse\"\x00\x12<\n\tSendOnion\x12\x15.cln.SendonionRequest\x1a\x16.cln.SendonionResponse\"\x00\x12\x45\n\x0cListSendPays\x12\x18.cln.ListsendpaysRequest\x1a\x19.cln.ListsendpaysResponse\"\x00\x12Q\n\x10ListTransactions\x12\x1c.cln.ListtransactionsRequest\x1a\x1d.cln.ListtransactionsResponse\"\x00\x12?\n\nMakeSecret\x12\x16.cln.MakesecretRequest\x1a\x17.cln.MakesecretResponse\"\x00\x12*\n\x03Pay\x12\x0f.cln.PayRequest\x1a\x10.cln.PayResponse\"\x00\x12<\n\tListNodes\x12\x15.cln.ListnodesRequest\x1a\x16.cln.ListnodesResponse\"\x00\x12K\n\x0eWaitAnyInvoice\x12\x1a.cln.WaitanyinvoiceRequest\x1a\x1b.cln.WaitanyinvoiceResponse\"\x00\x12\x42\n\x0bWaitInvoice\x12\x17.cln.WaitinvoiceRequest\x1a\x18.cln.WaitinvoiceResponse\"\x00\x12\x42\n\x0bWaitSendPay\x12\x17.cln.WaitsendpayRequest\x1a\x18.cln.WaitsendpayResponse\"\x00\x12\x36\n\x07NewAddr\x12\x13.cln.NewaddrRequest\x1a\x14.cln.NewaddrResponse\"\x00\x12\x39\n\x08Withdraw\x12\x14.cln.WithdrawRequest\x1a\x15.cln.WithdrawResponse\"\x00\x12\x36\n\x07KeySend\x12\x13.cln.KeysendRequest\x1a\x14.cln.KeysendResponse\"\x00\x12\x39\n\x08\x46undPsbt\x12\x14.cln.FundpsbtRequest\x1a\x15.cln.FundpsbtResponse\"\x00\x12\x39\n\x08SendPsbt\x12\x14.cln.SendpsbtRequest\x1a\x15.cln.SendpsbtResponse\"\x00\x12\x39\n\x08SignPsbt\x12\x14.cln.SignpsbtRequest\x1a\x15.cln.SignpsbtResponse\"\x00\x12\x39\n\x08UtxoPsbt\x12\x14.cln.UtxopsbtRequest\x1a\x15.cln.UtxopsbtResponse\"\x00\x12<\n\tTxDiscard\x12\x15.cln.TxdiscardRequest\x1a\x16.cln.TxdiscardResponse\"\x00\x12<\n\tTxPrepare\x12\x15.cln.TxprepareRequest\x1a\x16.cln.TxprepareResponse\"\x00\x12\x33\n\x06TxSend\x12\x12.cln.TxsendRequest\x1a\x13.cln.TxsendResponse\"\x00\x12Q\n\x10ListPeerChannels\x12\x1c.cln.ListpeerchannelsRequest\x1a\x1d.cln.ListpeerchannelsResponse\"\x00\x12W\n\x12ListClosedChannels\x12\x1e.cln.ListclosedchannelsRequest\x1a\x1f.cln.ListclosedchannelsResponse\"\x00\x12\x33\n\x06\x44\x65\x63ode\x12\x12.cln.DecodeRequest\x1a\x13.cln.DecodeResponse\"\x00\x12\x33\n\x06\x44\x65lPay\x12\x12.cln.DelpayRequest\x1a\x13.cln.DelpayResponse\"\x00\x12?\n\nDelForward\x12\x16.cln.DelforwardRequest\x1a\x17.cln.DelforwardResponse\"\x00\x12\x45\n\x0c\x44isableOffer\x12\x18.cln.DisableofferRequest\x1a\x19.cln.DisableofferResponse\"\x00\x12\x42\n\x0b\x45nableOffer\x12\x17.cln.EnableofferRequest\x1a\x18.cln.EnableofferResponse\"\x00\x12?\n\nDisconnect\x12\x16.cln.DisconnectRequest\x1a\x17.cln.DisconnectResponse\"\x00\x12\x39\n\x08\x46\x65\x65rates\x12\x14.cln.FeeratesRequest\x1a\x15.cln.FeeratesResponse\"\x00\x12\x42\n\x0b\x46\x65tchBip353\x12\x17.cln.Fetchbip353Request\x1a\x18.cln.Fetchbip353Response\"\x00\x12\x45\n\x0c\x46\x65tchInvoice\x12\x18.cln.FetchinvoiceRequest\x1a\x19.cln.FetchinvoiceResponse\"\x00\x12\x63\n\x16\x43\x61ncelRecurringInvoice\x12\".cln.CancelrecurringinvoiceRequest\x1a#.cln.CancelrecurringinvoiceResponse\"\x00\x12T\n\x11\x46undChannelCancel\x12\x1d.cln.FundchannelCancelRequest\x1a\x1e.cln.FundchannelCancelResponse\"\x00\x12Z\n\x13\x46undChannelComplete\x12\x1f.cln.FundchannelCompleteRequest\x1a .cln.FundchannelCompleteResponse\"\x00\x12\x42\n\x0b\x46undChannel\x12\x17.cln.FundchannelRequest\x1a\x18.cln.FundchannelResponse\"\x00\x12Q\n\x10\x46undChannelStart\x12\x1c.cln.FundchannelStartRequest\x1a\x1d.cln.FundchannelStartResponse\"\x00\x12\x33\n\x06GetLog\x12\x12.cln.GetlogRequest\x1a\x13.cln.GetlogResponse\"\x00\x12\x45\n\x0c\x46underUpdate\x12\x18.cln.FunderupdateRequest\x1a\x19.cln.FunderupdateResponse\"\x00\x12\x39\n\x08GetRoute\x12\x14.cln.GetrouteRequest\x1a\x15.cln.GetrouteResponse\"\x00\x12H\n\rListAddresses\x12\x19.cln.ListaddressesRequest\x1a\x1a.cln.ListaddressesResponse\"\x00\x12\x45\n\x0cListForwards\x12\x18.cln.ListforwardsRequest\x1a\x19.cln.ListforwardsResponse\"\x00\x12?\n\nListOffers\x12\x16.cln.ListoffersRequest\x1a\x17.cln.ListoffersResponse\"\x00\x12\x39\n\x08ListPays\x12\x14.cln.ListpaysRequest\x1a\x15.cln.ListpaysResponse\"\x00\x12<\n\tListHtlcs\x12\x15.cln.ListhtlcsRequest\x1a\x16.cln.ListhtlcsResponse\"\x00\x12Q\n\x10MultiFundChannel\x12\x1c.cln.MultifundchannelRequest\x1a\x1d.cln.MultifundchannelResponse\"\x00\x12H\n\rMultiWithdraw\x12\x19.cln.MultiwithdrawRequest\x1a\x1a.cln.MultiwithdrawResponse\"\x00\x12\x30\n\x05Offer\x12\x11.cln.OfferRequest\x1a\x12.cln.OfferResponse\"\x00\x12Q\n\x10OpenChannelAbort\x12\x1c.cln.OpenchannelAbortRequest\x1a\x1d.cln.OpenchannelAbortResponse\"\x00\x12N\n\x0fOpenChannelBump\x12\x1b.cln.OpenchannelBumpRequest\x1a\x1c.cln.OpenchannelBumpResponse\"\x00\x12N\n\x0fOpenChannelInit\x12\x1b.cln.OpenchannelInitRequest\x1a\x1c.cln.OpenchannelInitResponse\"\x00\x12T\n\x11OpenChannelSigned\x12\x1d.cln.OpenchannelSignedRequest\x1a\x1e.cln.OpenchannelSignedResponse\"\x00\x12T\n\x11OpenChannelUpdate\x12\x1d.cln.OpenchannelUpdateRequest\x1a\x1e.cln.OpenchannelUpdateResponse\"\x00\x12-\n\x04Ping\x12\x10.cln.PingRequest\x1a\x11.cln.PingResponse\"\x00\x12\x33\n\x06Plugin\x12\x12.cln.PluginRequest\x1a\x13.cln.PluginResponse\"\x00\x12H\n\rRenePayStatus\x12\x19.cln.RenepaystatusRequest\x1a\x1a.cln.RenepaystatusResponse\"\x00\x12\x36\n\x07RenePay\x12\x13.cln.RenepayRequest\x1a\x14.cln.RenepayResponse\"\x00\x12H\n\rReserveInputs\x12\x19.cln.ReserveinputsRequest\x1a\x1a.cln.ReserveinputsResponse\"\x00\x12H\n\rSendCustomMsg\x12\x19.cln.SendcustommsgRequest\x1a\x1a.cln.SendcustommsgResponse\"\x00\x12\x42\n\x0bSendInvoice\x12\x17.cln.SendinvoiceRequest\x1a\x18.cln.SendinvoiceResponse\"\x00\x12?\n\nSetChannel\x12\x16.cln.SetchannelRequest\x1a\x17.cln.SetchannelResponse\"\x00\x12<\n\tSetConfig\x12\x15.cln.SetconfigRequest\x1a\x16.cln.SetconfigResponse\"\x00\x12K\n\x0eSetPsbtVersion\x12\x1a.cln.SetpsbtversionRequest\x1a\x1b.cln.SetpsbtversionResponse\"\x00\x12\x42\n\x0bSignInvoice\x12\x17.cln.SigninvoiceRequest\x1a\x18.cln.SigninvoiceResponse\"\x00\x12\x42\n\x0bSignMessage\x12\x17.cln.SignmessageRequest\x1a\x18.cln.SignmessageResponse\"\x00\x12?\n\nSpliceInit\x12\x16.cln.SpliceInitRequest\x1a\x17.cln.SpliceInitResponse\"\x00\x12\x45\n\x0cSpliceSigned\x12\x18.cln.SpliceSignedRequest\x1a\x19.cln.SpliceSignedResponse\"\x00\x12\x45\n\x0cSpliceUpdate\x12\x18.cln.SpliceUpdateRequest\x1a\x19.cln.SpliceUpdateResponse\"\x00\x12\x39\n\x08SpliceIn\x12\x14.cln.SpliceinRequest\x1a\x15.cln.SpliceinResponse\"\x00\x12<\n\tSpliceOut\x12\x15.cln.SpliceoutRequest\x1a\x16.cln.SpliceoutResponse\"\x00\x12<\n\tDevSplice\x12\x15.cln.DevspliceRequest\x1a\x16.cln.DevspliceResponse\"\x00\x12N\n\x0fUnreserveInputs\x12\x1b.cln.UnreserveinputsRequest\x1a\x1c.cln.UnreserveinputsResponse\"\x00\x12H\n\rUpgradeWallet\x12\x19.cln.UpgradewalletRequest\x1a\x1a.cln.UpgradewalletResponse\"\x00\x12N\n\x0fWaitBlockHeight\x12\x1b.cln.WaitblockheightRequest\x1a\x1c.cln.WaitblockheightResponse\"\x00\x12-\n\x04Wait\x12\x10.cln.WaitRequest\x1a\x11.cln.WaitResponse\"\x00\x12\x42\n\x0bListConfigs\x12\x17.cln.ListconfigsRequest\x1a\x18.cln.ListconfigsResponse\"\x00\x12-\n\x04Stop\x12\x10.cln.StopRequest\x1a\x11.cln.StopResponse\"\x00\x12-\n\x04Help\x12\x10.cln.HelpRequest\x1a\x11.cln.HelpResponse\"\x00\x12T\n\x11PreApproveKeysend\x12\x1d.cln.PreapprovekeysendRequest\x1a\x1e.cln.PreapprovekeysendResponse\"\x00\x12T\n\x11PreApproveInvoice\x12\x1d.cln.PreapproveinvoiceRequest\x1a\x1e.cln.PreapproveinvoiceResponse\"\x00\x12\x45\n\x0cStaticBackup\x12\x18.cln.StaticbackupRequest\x1a\x19.cln.StaticbackupResponse\"\x00\x12N\n\x0f\x42kprChannelsApy\x12\x1b.cln.BkprchannelsapyRequest\x1a\x1c.cln.BkprchannelsapyResponse\"\x00\x12T\n\x11\x42kprDumpIncomeCsv\x12\x1d.cln.BkprdumpincomecsvRequest\x1a\x1e.cln.BkprdumpincomecsvResponse\"\x00\x12\x42\n\x0b\x42kprInspect\x12\x17.cln.BkprinspectRequest\x1a\x18.cln.BkprinspectResponse\"\x00\x12`\n\x15\x42kprListAccountEvents\x12!.cln.BkprlistaccounteventsRequest\x1a\".cln.BkprlistaccounteventsResponse\"\x00\x12Q\n\x10\x42kprListBalances\x12\x1c.cln.BkprlistbalancesRequest\x1a\x1d.cln.BkprlistbalancesResponse\"\x00\x12K\n\x0e\x42kprListIncome\x12\x1a.cln.BkprlistincomeRequest\x1a\x1b.cln.BkprlistincomeResponse\"\x00\x12{\n\x1e\x42kprEditDescriptionByPaymentId\x12*.cln.BkpreditdescriptionbypaymentidRequest\x1a+.cln.BkpreditdescriptionbypaymentidResponse\"\x00\x12x\n\x1d\x42kprEditDescriptionByOutpoint\x12).cln.BkpreditdescriptionbyoutpointRequest\x1a*.cln.BkpreditdescriptionbyoutpointResponse\"\x00\x12?\n\nBkprReport\x12\x16.cln.BkprreportRequest\x1a\x17.cln.BkprreportResponse\"\x00\x12H\n\rBlacklistRune\x12\x19.cln.BlacklistruneRequest\x1a\x1a.cln.BlacklistruneResponse\"\x00\x12<\n\tCheckRune\x12\x15.cln.CheckruneRequest\x1a\x16.cln.CheckruneResponse\"\x00\x12?\n\nCreateRune\x12\x16.cln.CreateruneRequest\x1a\x17.cln.CreateruneResponse\"\x00\x12<\n\tShowRunes\x12\x15.cln.ShowrunesRequest\x1a\x16.cln.ShowrunesResponse\"\x00\x12Q\n\x10\x41skReneUnreserve\x12\x1c.cln.AskreneunreserveRequest\x1a\x1d.cln.AskreneunreserveResponse\"\x00\x12T\n\x11\x41skReneListLayers\x12\x1d.cln.AskrenelistlayersRequest\x1a\x1e.cln.AskrenelistlayersResponse\"\x00\x12W\n\x12\x41skReneCreateLayer\x12\x1e.cln.AskrenecreatelayerRequest\x1a\x1f.cln.AskrenecreatelayerResponse\"\x00\x12W\n\x12\x41skReneRemoveLayer\x12\x1e.cln.AskreneremovelayerRequest\x1a\x1f.cln.AskreneremovelayerResponse\"\x00\x12o\n\x1a\x41skReneRemoveChannelUpdate\x12&.cln.AskreneremovechannelupdateRequest\x1a\'.cln.AskreneremovechannelupdateResponse\"\x00\x12K\n\x0e\x41skReneReserve\x12\x1a.cln.AskrenereserveRequest\x1a\x1b.cln.AskrenereserveResponse\"\x00\x12?\n\nAskReneAge\x12\x16.cln.AskreneageRequest\x1a\x17.cln.AskreneageResponse\"\x00\x12<\n\tGetRoutes\x12\x15.cln.GetroutesRequest\x1a\x16.cln.GetroutesResponse\"\x00\x12W\n\x12\x41skReneDisableNode\x12\x1e.cln.AskrenedisablenodeRequest\x1a\x1f.cln.AskrenedisablenodeResponse\"\x00\x12]\n\x14\x41skReneInformChannel\x12 .cln.AskreneinformchannelRequest\x1a!.cln.AskreneinformchannelResponse\"\x00\x12]\n\x14\x41skReneCreateChannel\x12 .cln.AskrenecreatechannelRequest\x1a!.cln.AskrenecreatechannelResponse\"\x00\x12]\n\x14\x41skReneUpdateChannel\x12 .cln.AskreneupdatechannelRequest\x1a!.cln.AskreneupdatechannelResponse\"\x00\x12W\n\x12\x41skReneBiasChannel\x12\x1e.cln.AskrenebiaschannelRequest\x1a\x1f.cln.AskrenebiaschannelResponse\"\x00\x12N\n\x0f\x41skreneBiasNode\x12\x1b.cln.AskrenebiasnodeRequest\x1a\x1c.cln.AskrenebiasnodeResponse\"\x00\x12\x66\n\x17\x41skReneListReservations\x12#.cln.AskrenelistreservationsRequest\x1a$.cln.AskrenelistreservationsResponse\"\x00\x12W\n\x12InjectPaymentOnion\x12\x1e.cln.InjectpaymentonionRequest\x1a\x1f.cln.InjectpaymentonionResponse\"\x00\x12W\n\x12InjectOnionMessage\x12\x1e.cln.InjectonionmessageRequest\x1a\x1f.cln.InjectonionmessageResponse\"\x00\x12-\n\x04Xpay\x12\x10.cln.XpayRequest\x1a\x11.cln.XpayResponse\"\x00\x12W\n\x12SignMessageWithKey\x12\x1e.cln.SignmessagewithkeyRequest\x1a\x1f.cln.SignmessagewithkeyResponse\"\x00\x12Q\n\x10ListChannelMoves\x12\x1c.cln.ListchannelmovesRequest\x1a\x1d.cln.ListchannelmovesResponse\"\x00\x12K\n\x0eListChainMoves\x12\x1a.cln.ListchainmovesRequest\x1a\x1b.cln.ListchainmovesResponse\"\x00\x12T\n\x11ListNetworkEvents\x12\x1d.cln.ListnetworkeventsRequest\x1a\x1e.cln.ListnetworkeventsResponse\"\x00\x12N\n\x0f\x44\x65lNetworkEvent\x12\x1b.cln.DelnetworkeventRequest\x1a\x1c.cln.DelnetworkeventResponse\"\x00\x12Z\n\x13\x43lnrestRegisterPath\x12\x1f.cln.ClnrestregisterpathRequest\x1a .cln.ClnrestregisterpathResponse\"\x00\x12T\n\x11ListCurrencyRates\x12\x1d.cln.ListcurrencyratesRequest\x1a\x1e.cln.ListcurrencyratesResponse\"\x00\x12N\n\x0f\x43urrencyConvert\x12\x1b.cln.CurrencyconvertRequest\x1a\x1c.cln.CurrencyconvertResponse\"\x00\x12\x45\n\x0c\x43urrencyRate\x12\x18.cln.CurrencyrateRequest\x1a\x19.cln.CurrencyrateResponse\"\x00\x12?\n\nSendAmount\x12\x16.cln.SendamountRequest\x1a\x17.cln.SendamountResponse\"\x00\x12\x42\n\x0b\x43reateProof\x12\x17.cln.CreateproofRequest\x1a\x18.cln.CreateproofResponse\"\x00\x12\x39\n\x08Xkeysend\x12\x14.cln.XkeysendRequest\x1a\x15.cln.XkeysendResponse\"\x00\x12\x39\n\x08Graceful\x12\x14.cln.GracefulRequest\x1a\x15.cln.GracefulResponse\"\x00\x12\x63\n\x18SubscribeBalanceSnapshot\x12!.cln.StreamBalanceSnapshotRequest\x1a .cln.BalanceSnapshotNotification\"\x00\x30\x01\x12T\n\x13SubscribeBlockAdded\x12\x1c.cln.StreamBlockAddedRequest\x1a\x1b.cln.BlockAddedNotification\"\x00\x30\x01\x12i\n\x1aSubscribeChannelOpenFailed\x12#.cln.StreamChannelOpenFailedRequest\x1a\".cln.ChannelOpenFailedNotification\"\x00\x30\x01\x12]\n\x16SubscribeChannelOpened\x12\x1f.cln.StreamChannelOpenedRequest\x1a\x1e.cln.ChannelOpenedNotification\"\x00\x30\x01\x12o\n\x1cSubscribeChannelStateChanged\x12%.cln.StreamChannelStateChangedRequest\x1a$.cln.ChannelStateChangedNotification\"\x00\x30\x01\x12O\n\x10SubscribeConnect\x12\x19.cln.StreamConnectRequest\x1a\x1c.cln.PeerConnectNotification\"\x00\x30\x01\x12Z\n\x15SubscribeCoinMovement\x12\x1e.cln.StreamCoinMovementRequest\x1a\x1d.cln.CoinMovementNotification\"\x00\x30\x01\x12Q\n\x12SubscribeCustomMsg\x12\x1b.cln.StreamCustomMsgRequest\x1a\x1a.cln.CustomMsgNotification\"\x00\x30\x01\x12i\n\x1aSubscribeDeprecatedOneshot\x12#.cln.StreamDeprecatedOneshotRequest\x1a\".cln.DeprecatedOneshotNotification\"\x00\x30\x01\x12T\n\x13SubscribeDisconnect\x12\x1c.cln.StreamDisconnectRequest\x1a\x1b.cln.DisconnectNotification\"\x00\x30\x01\x12Z\n\x15SubscribeForwardEvent\x12\x1e.cln.StreamForwardEventRequest\x1a\x1d.cln.ForwardEventNotification\"\x00\x30\x01\x12\x63\n\x18SubscribeInvoiceCreation\x12!.cln.StreamInvoiceCreationRequest\x1a .cln.InvoiceCreationNotification\"\x00\x30\x01\x12`\n\x17SubscribeInvoicePayment\x12 .cln.StreamInvoicePaymentRequest\x1a\x1f.cln.InvoicePaymentNotification\"\x00\x30\x01\x12?\n\x0cSubscribeLog\x12\x15.cln.StreamLogRequest\x1a\x14.cln.LogNotification\"\x00\x30\x01\x12{\n SubscribeOnionMessageForwardFail\x12).cln.StreamOnionMessageForwardFailRequest\x1a(.cln.OnionMessageForwardFailNotification\"\x00\x30\x01\x12o\n\x1cSubscribeOpenChannelPeerSigs\x12%.cln.StreamOpenChannelPeerSigsRequest\x1a$.cln.OpenChannelPeerSigsNotification\"\x00\x30\x01\x12]\n\x16SubscribePluginStarted\x12\x1f.cln.StreamPluginStartedRequest\x1a\x1e.cln.PluginStartedNotification\"\x00\x30\x01\x12]\n\x16SubscribePluginStopped\x12\x1f.cln.StreamPluginStoppedRequest\x1a\x1e.cln.PluginStoppedNotification\"\x00\x30\x01\x12`\n\x17SubscribeSendPayFailure\x12 .cln.StreamSendPayFailureRequest\x1a\x1f.cln.SendPayFailureNotification\"\x00\x30\x01\x12`\n\x17SubscribeSendPaySuccess\x12 .cln.StreamSendPaySuccessRequest\x1a\x1f.cln.SendPaySuccessNotification\"\x00\x30\x01\x12N\n\x11SubscribeShutdown\x12\x1a.cln.StreamShutdownRequest\x1a\x19.cln.ShutdownNotification\"\x00\x30\x01\x12K\n\x10SubscribeWarning\x12\x19.cln.StreamWarningRequest\x1a\x18.cln.WarningNotification\"\x00\x30\x01\x12T\n\x13SubscribePayPartEnd\x12\x1c.cln.StreamPayPartEndRequest\x1a\x1b.cln.PayPartEndNotification\"\x00\x30\x01\x12Z\n\x15SubscribePayPartStart\x12\x1e.cln.StreamPayPartStartRequest\x1a\x1d.cln.PayPartStartNotification\"\x00\x30\x01\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nnode.proto\x12\x03\x63ln\x1a\x10primitives.proto\"\x10\n\x0eGetinfoRequest\"\xb1\x04\n\x0fGetinfoResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05\x61lias\x18\x02 \x01(\t\x12\r\n\x05\x63olor\x18\x03 \x01(\x0c\x12\x11\n\tnum_peers\x18\x04 \x01(\r\x12\x1c\n\x14num_pending_channels\x18\x05 \x01(\r\x12\x1b\n\x13num_active_channels\x18\x06 \x01(\r\x12\x1d\n\x15num_inactive_channels\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\t\x12\x15\n\rlightning_dir\x18\t \x01(\t\x12\x32\n\x0cour_features\x18\n \x01(\x0b\x32\x17.cln.GetinfoOurFeaturesH\x00\x88\x01\x01\x12\x13\n\x0b\x62lockheight\x18\x0b \x01(\r\x12\x0f\n\x07network\x18\x0c \x01(\t\x12(\n\x13\x66\x65\x65s_collected_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x07\x61\x64\x64ress\x18\x0e \x03(\x0b\x32\x13.cln.GetinfoAddress\x12$\n\x07\x62inding\x18\x0f \x03(\x0b\x32\x13.cln.GetinfoBinding\x12\"\n\x15warning_bitcoind_sync\x18\x10 \x01(\tH\x01\x88\x01\x01\x12$\n\x17warning_lightningd_sync\x18\x11 \x01(\tH\x02\x88\x01\x01\x42\x0f\n\r_our_featuresB\x18\n\x16_warning_bitcoind_syncB\x1a\n\x18_warning_lightningd_sync\"\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\"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\"\xb5\x01\n\x10ListpeersRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x38\n\x05level\x18\x02 \x01(\x0e\x32$.cln.ListpeersRequest.ListpeersLevelH\x01\x88\x01\x01\"E\n\x0eListpeersLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\x0b\n\x07UNUSUAL\x10\x03\x12\t\n\x05TRACE\x10\x04\x42\x05\n\x03_idB\x08\n\x06_level\"7\n\x11ListpeersResponse\x12\"\n\x05peers\x18\x01 \x03(\x0b\x32\x13.cln.ListpeersPeers\"\xc9\x01\n\x0eListpeersPeers\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x11\n\tconnected\x18\x02 \x01(\x08\x12#\n\x03log\x18\x03 \x03(\x0b\x32\x16.cln.ListpeersPeersLog\x12\x0f\n\x07netaddr\x18\x05 \x03(\t\x12\x15\n\x08\x66\x65\x61tures\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0bremote_addr\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x0cnum_channels\x18\x08 \x01(\rB\x0b\n\t_featuresB\x0e\n\x0c_remote_addr\"\x88\x03\n\x11ListpeersPeersLog\x12?\n\titem_type\x18\x01 \x01(\x0e\x32,.cln.ListpeersPeersLog.ListpeersPeersLogType\x12\x18\n\x0bnum_skipped\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04time\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03log\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07node_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x11\n\x04\x64\x61ta\x18\x07 \x01(\x0cH\x05\x88\x01\x01\"t\n\x15ListpeersPeersLogType\x12\x0b\n\x07SKIPPED\x10\x00\x12\n\n\x06\x42ROKEN\x10\x01\x12\x0b\n\x07UNUSUAL\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\t\n\x05IO_IN\x10\x05\x12\n\n\x06IO_OUT\x10\x06\x12\t\n\x05TRACE\x10\x07\x42\x0e\n\x0c_num_skippedB\x07\n\x05_timeB\t\n\x07_sourceB\x06\n\x04_logB\n\n\x08_node_idB\x07\n\x05_data\"0\n\x10ListfundsRequest\x12\x12\n\x05spent\x18\x01 \x01(\x08H\x00\x88\x01\x01\x42\x08\n\x06_spent\"e\n\x11ListfundsResponse\x12&\n\x07outputs\x18\x01 \x03(\x0b\x32\x15.cln.ListfundsOutputs\x12(\n\x08\x63hannels\x18\x02 \x03(\x0b\x32\x16.cln.ListfundsChannels\"\x97\x02\n\x11ListfundsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12$\n\x0four_amount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x04 \x01(\x0c\x12\x16\n\x0e\x66unding_output\x18\x05 \x01(\r\x12\x11\n\tconnected\x18\x06 \x01(\x08\x12 \n\x05state\x18\x07 \x01(\x0e\x32\x11.cln.ChannelState\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x12\n\nchannel_id\x18\t \x01(\x0c\x42\x13\n\x11_short_channel_id\"\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\"\xbb\x03\n\x0eSendpayRequest\x12 \n\x05route\x18\x01 \x03(\x0b\x32\x11.cln.SendpayRoute\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x13\n\x06partid\x18\x07 \x01(\x04H\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\t \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x08\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_bolt11B\x11\n\x0f_payment_secretB\t\n\x07_partidB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x13\n\x11_payment_metadataB\x0e\n\x0c_description\"\x96\x05\n\x0fSendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x32\n\x06status\x18\x04 \x01(\x0e\x32\".cln.SendpayResponse.SendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x14\n\x07message\x18\x0e \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0f \x01(\x04H\t\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\"*\n\rSendpayStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\x0f\n\r_completed_atB\x10\n\x0e_updated_index\"\xe6\x02\n\x0cSendpayRoute\x12\x0f\n\x02id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05\x64\x65lay\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x14\n\x07\x63hannel\x18\x04 \x01(\tH\x02\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12!\n\x14short_channel_id_dir\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x18\n\x0bnode_id_out\x18\x07 \x01(\x0cH\x05\x88\x01\x01\x12)\n\x0f\x61mount_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x15\n\x08\x63ltv_out\x18\t \x01(\rH\x07\x88\x01\x01\x42\x05\n\x03_idB\x08\n\x06_delayB\n\n\x08_channelB\x0e\n\x0c_amount_msatB\x17\n\x15_short_channel_id_dirB\x0e\n\x0c_node_id_outB\x12\n\x10_amount_out_msatB\x0b\n\t_cltv_out\"\x93\x01\n\x13ListchannelsRequest\x12\x1d\n\x10short_channel_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06source\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\t\n\x07_sourceB\x0e\n\x0c_destination\"C\n\x14ListchannelsResponse\x12+\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x19.cln.ListchannelsChannels\"\xb3\x03\n\x14ListchannelsChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\x0e\n\x06public\x18\x04 \x01(\x08\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\rmessage_flags\x18\x06 \x01(\r\x12\x15\n\rchannel_flags\x18\x07 \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x08 \x01(\x08\x12\x13\n\x0blast_update\x18\t \x01(\r\x12\x1d\n\x15\x62\x61se_fee_millisatoshi\x18\n \x01(\r\x12\x19\n\x11\x66\x65\x65_per_millionth\x18\x0b \x01(\r\x12\r\n\x05\x64\x65lay\x18\x0c \x01(\r\x12&\n\x11htlc_minimum_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x11htlc_maximum_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x0f \x01(\x0c\x12\x11\n\tdirection\x18\x10 \x01(\rB\x14\n\x12_htlc_maximum_msat\"#\n\x10\x41\x64\x64gossipRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x13\n\x11\x41\x64\x64gossipResponse\"\xaf\x01\n\x14\x41\x64\x64psbtoutputRequest\x12\x1f\n\x07satoshi\x18\x01 \x01(\x0b\x32\x0e.cln.AmountSat\x12\x15\n\x08locktime\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_locktimeB\x0e\n\x0c_initialpsbtB\x0e\n\x0c_destination\"U\n\x15\x41\x64\x64psbtoutputResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1e\n\x16\x65stimated_added_weight\x18\x02 \x01(\r\x12\x0e\n\x06outnum\x18\x03 \x01(\r\"O\n\x14\x41utocleanonceRequest\x12*\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystem\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x04\"G\n\x15\x41utocleanonceResponse\x12.\n\tautoclean\x18\x01 \x01(\x0b\x32\x1b.cln.AutocleanonceAutoclean\"\x89\x05\n\x16\x41utocleanonceAutoclean\x12L\n\x11succeededforwards\x18\x01 \x01(\x0b\x32,.cln.AutocleanonceAutocleanSucceededforwardsH\x00\x88\x01\x01\x12\x46\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32).cln.AutocleanonceAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x44\n\rsucceededpays\x18\x03 \x01(\x0b\x32(.cln.AutocleanonceAutocleanSucceededpaysH\x02\x88\x01\x01\x12>\n\nfailedpays\x18\x04 \x01(\x0b\x32%.cln.AutocleanonceAutocleanFailedpaysH\x03\x88\x01\x01\x12\x42\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32\'.cln.AutocleanonceAutocleanPaidinvoicesH\x04\x88\x01\x01\x12H\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32*.cln.AutocleanonceAutocleanExpiredinvoicesH\x05\x88\x01\x01\x12\x44\n\rnetworkevents\x18\x07 \x01(\x0b\x32(.cln.AutocleanonceAutocleanNetworkeventsH\x06\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoicesB\x10\n\x0e_networkevents\"K\n%AutocleanonceAutocleanExpiredinvoices\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\"F\n AutocleanonceAutocleanFailedpays\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"I\n#AutocleanonceAutocleanNetworkevents\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"H\n\"AutocleanonceAutocleanPaidinvoices\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"M\n\'AutocleanonceAutocleanSucceededforwards\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\"W\n\x16\x41utocleanstatusRequest\x12/\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystemH\x00\x88\x01\x01\x42\x0c\n\n_subsystem\"K\n\x17\x41utocleanstatusResponse\x12\x30\n\tautoclean\x18\x01 \x01(\x0b\x32\x1d.cln.AutocleanstatusAutoclean\"\x99\x05\n\x18\x41utocleanstatusAutoclean\x12N\n\x11succeededforwards\x18\x01 \x01(\x0b\x32..cln.AutocleanstatusAutocleanSucceededforwardsH\x00\x88\x01\x01\x12H\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32+.cln.AutocleanstatusAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x46\n\rsucceededpays\x18\x03 \x01(\x0b\x32*.cln.AutocleanstatusAutocleanSucceededpaysH\x02\x88\x01\x01\x12@\n\nfailedpays\x18\x04 \x01(\x0b\x32\'.cln.AutocleanstatusAutocleanFailedpaysH\x03\x88\x01\x01\x12\x44\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32).cln.AutocleanstatusAutocleanPaidinvoicesH\x04\x88\x01\x01\x12J\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32,.cln.AutocleanstatusAutocleanExpiredinvoicesH\x05\x88\x01\x01\x12\x46\n\rnetworkevents\x18\x07 \x01(\x0b\x32*.cln.AutocleanstatusAutocleanNetworkeventsH\x06\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoicesB\x10\n\x0e_networkevents\"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\"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\"`\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\"c\n%AutocleanstatusAutocleanNetworkevents\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"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\"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\"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\"U\n\x13\x43heckmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\r\n\x05zbase\x18\x02 \x01(\t\x12\x13\n\x06pubkey\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x42\t\n\x07_pubkey\"8\n\x14\x43heckmessageResponse\x12\x10\n\x08verified\x18\x01 \x01(\x08\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\"\xcb\x02\n\x0c\x43loseRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1e\n\x11unilateraltimeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\tH\x01\x88\x01\x01\x12!\n\x14\x66\x65\x65_negotiation_step\x18\x04 \x01(\tH\x02\x88\x01\x01\x12)\n\rwrong_funding\x18\x05 \x01(\x0b\x32\r.cln.OutpointH\x03\x88\x01\x01\x12\x1f\n\x12\x66orce_lease_closed\x18\x06 \x01(\x08H\x04\x88\x01\x01\x12\x1e\n\x08\x66\x65\x65range\x18\x07 \x03(\x0b\x32\x0c.cln.FeerateB\x14\n\x12_unilateraltimeoutB\x0e\n\x0c_destinationB\x17\n\x15_fee_negotiation_stepB\x10\n\x0e_wrong_fundingB\x15\n\x13_force_lease_closed\"\x93\x01\n\rCloseResponse\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.CloseResponse.CloseType\x12\x0b\n\x03txs\x18\x04 \x03(\x0c\x12\r\n\x05txids\x18\x05 \x03(\x0c\"5\n\tCloseType\x12\n\n\x06MUTUAL\x10\x00\x12\x0e\n\nUNILATERAL\x10\x01\x12\x0c\n\x08UNOPENED\x10\x02\"T\n\x0e\x43onnectRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\x04host\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04port\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x07\n\x05_hostB\x07\n\x05_port\"\xb4\x01\n\x0f\x43onnectResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0c\x12\x38\n\tdirection\x18\x03 \x01(\x0e\x32%.cln.ConnectResponse.ConnectDirection\x12$\n\x07\x61\x64\x64ress\x18\x04 \x01(\x0b\x32\x13.cln.ConnectAddress\"#\n\x10\x43onnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\xfb\x01\n\x0e\x43onnectAddress\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.ConnectAddress.ConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"P\n\x12\x43onnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"J\n\x14\x43reateinvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x10\n\x08preimage\x18\x03 \x01(\x0c\"\xe6\x05\n\x15\x43reateinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12>\n\x06status\x18\x06 \x01(\x0e\x32..cln.CreateinvoiceResponse.CreateinvoiceStatus\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x16\n\tpay_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x06\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12:\n\rpaid_outpoint\x18\x11 \x01(\x0b\x32\x1e.cln.CreateinvoicePaidOutpointH\t\x88\x01\x01\"8\n\x13\x43reateinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_paid_outpoint\"9\n\x19\x43reateinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xb4\x02\n\x10\x44\x61tastoreRequest\x12\x10\n\x03hex\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x36\n\x04mode\x18\x03 \x01(\x0e\x32#.cln.DatastoreRequest.DatastoreModeH\x01\x88\x01\x01\x12\x17\n\ngeneration\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\t\x12\x13\n\x06string\x18\x06 \x01(\tH\x03\x88\x01\x01\"p\n\rDatastoreMode\x12\x0f\n\x0bMUST_CREATE\x10\x00\x12\x10\n\x0cMUST_REPLACE\x10\x01\x12\x15\n\x11\x43REATE_OR_REPLACE\x10\x02\x12\x0f\n\x0bMUST_APPEND\x10\x03\x12\x14\n\x10\x43REATE_OR_APPEND\x10\x04\x42\x06\n\x04_hexB\x07\n\x05_modeB\r\n\x0b_generationB\t\n\x07_string\"\x82\x01\n\x11\x44\x61tastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"$\n\x15\x44\x61tastoreusageRequest\x12\x0b\n\x03key\x18\x01 \x03(\t\"S\n\x16\x44\x61tastoreusageResponse\x12\x39\n\x0e\x64\x61tastoreusage\x18\x01 \x01(\x0b\x32!.cln.DatastoreusageDatastoreusage\"@\n\x1c\x44\x61tastoreusageDatastoreusage\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x13\n\x0btotal_bytes\x18\x02 \x01(\x04\"\x9d\x01\n\x12\x43reateonionRequest\x12\"\n\x04hops\x18\x01 \x03(\x0b\x32\x14.cln.CreateonionHops\x12\x11\n\tassocdata\x18\x02 \x01(\x0c\x12\x18\n\x0bsession_key\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x17\n\nonion_size\x18\x04 \x01(\rH\x01\x88\x01\x01\x42\x0e\n\x0c_session_keyB\r\n\x0b_onion_size\"<\n\x13\x43reateonionResponse\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x16\n\x0eshared_secrets\x18\x02 \x03(\x0c\"2\n\x0f\x43reateonionHops\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"J\n\x13\x44\x65ldatastoreRequest\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x03 \x03(\tB\r\n\x0b_generation\"\x85\x01\n\x14\x44\x65ldatastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xb6\x01\n\x11\x44\x65linvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\x12\x37\n\x06status\x18\x02 \x01(\x0e\x32\'.cln.DelinvoiceRequest.DelinvoiceStatus\x12\x15\n\x08\x64\x65sconly\x18\x03 \x01(\x08H\x00\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\x0b\n\t_desconly\"\xcf\x05\n\x12\x44\x65linvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x38\n\x06status\x18\x07 \x01(\x0e\x32(.cln.DelinvoiceResponse.DelinvoiceStatus\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0c \x01(\x04\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x06\x88\x01\x01\x12\x16\n\tpay_index\x18\x0e \x01(\x04H\x07\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x14\n\x07paid_at\x18\x10 \x01(\x04H\t\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x11 \x01(\x0cH\n\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\x9f\x01\n\x17\x44\x65vforgetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nchannel_id\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05\x66orce\x18\x04 \x01(\x08H\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x08\n\x06_force\"Y\n\x18\x44\x65vforgetchannelResponse\x12\x0e\n\x06\x66orced\x18\x01 \x01(\x08\x12\x17\n\x0f\x66unding_unspent\x18\x02 \x01(\x08\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\"\x19\n\x17\x45mergencyrecoverRequest\")\n\x18\x45mergencyrecoverResponse\x12\r\n\x05stubs\x18\x01 \x03(\x0c\" \n\x1eGetemergencyrecoverdataRequest\"\x8a\x01\n\x1fGetemergencyrecoverdataResponse\x12\x10\n\x08\x66iledata\x18\x01 \x01(\x0c\x12\x1f\n\x12\x63\x61n_create_penalty\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x1d\n\x15\x62\x61\x63ked_up_channel_ids\x18\x03 \x03(\x0c\x42\x15\n\x13_can_create_penalty\"Q\n\x13\x45xposesecretRequest\x12\x12\n\npassphrase\x18\x01 \x01(\t\x12\x17\n\nidentifier\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\r\n\x0b_identifier\"_\n\x14\x45xposesecretResponse\x12\x12\n\nidentifier\x18\x01 \x01(\t\x12\x0f\n\x07\x63odex32\x18\x02 \x01(\t\x12\x15\n\x08mnemonic\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x0b\n\t_mnemonic\"#\n\x0eRecoverRequest\x12\x11\n\thsmsecret\x18\x01 \x01(\t\"x\n\x0fRecoverResponse\x12\x32\n\x06result\x18\x01 \x01(\x0e\x32\".cln.RecoverResponse.RecoverResult\"1\n\rRecoverResult\x12 \n\x1cRECOVERY_RESTART_IN_PROGRESS\x10\x00\"$\n\x15RecoverchannelRequest\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"\'\n\x16RecoverchannelResponse\x12\r\n\x05stubs\x18\x01 \x03(\t\"\x99\x02\n\x0eInvoiceRequest\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05label\x18\x03 \x01(\t\x12\x11\n\tfallbacks\x18\x04 \x03(\t\x12\x15\n\x08preimage\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x11\n\x04\x63ltv\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18\x07 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x15\x65xposeprivatechannels\x18\x08 \x03(\t\x12\x19\n\x0c\x64\x65schashonly\x18\t \x01(\x08H\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x10.cln.AmountOrAnyB\x0b\n\t_preimageB\x07\n\x05_cltvB\t\n\x07_expiryB\x0f\n\r_deschashonly\"\xfe\x02\n\x0fInvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x16\n\x0epayment_secret\x18\x03 \x01(\x0c\x12\x12\n\nexpires_at\x18\x04 \x01(\x04\x12\x1d\n\x10warning_capacity\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x0fwarning_offline\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10warning_deadends\x18\x07 \x01(\tH\x02\x88\x01\x01\x12#\n\x16warning_private_unused\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x0bwarning_mpp\x18\t \x01(\tH\x04\x88\x01\x01\x12\x15\n\rcreated_index\x18\n \x01(\x04\x42\x13\n\x11_warning_capacityB\x12\n\x10_warning_offlineB\x13\n\x11_warning_deadendsB\x19\n\x17_warning_private_unusedB\x0e\n\x0c_warning_mpp\"\xe1\x01\n\x15InvoicerequestRequest\x12\x1b\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x05 \x01(\x04H\x02\x88\x01\x01\x12\x17\n\nsingle_use\x18\x06 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_issuerB\x08\n\x06_labelB\x12\n\x10_absolute_expiryB\r\n\x0b_single_use\"\x8b\x01\n\x16InvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"1\n\x1c\x44isableinvoicerequestRequest\x12\x11\n\tinvreq_id\x18\x01 \x01(\t\"\x92\x01\n\x1d\x44isableinvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"l\n\x1aListinvoicerequestsRequest\x12\x16\n\tinvreq_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0c\n\n_invreq_idB\x0e\n\x0c_active_only\"_\n\x1bListinvoicerequestsResponse\x12@\n\x0finvoicerequests\x18\x01 \x03(\x0b\x32\'.cln.ListinvoicerequestsInvoicerequests\"\x97\x01\n\"ListinvoicerequestsInvoicerequests\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"#\n\x14ListdatastoreRequest\x12\x0b\n\x03key\x18\x02 \x03(\t\"G\n\x15ListdatastoreResponse\x12.\n\tdatastore\x18\x01 \x03(\x0b\x32\x1b.cln.ListdatastoreDatastore\"\x87\x01\n\x16ListdatastoreDatastore\x12\x0b\n\x03key\x18\x01 \x03(\t\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xde\x02\n\x13ListinvoicesRequest\x12\x12\n\x05label\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x15\n\x08offer_id\x18\x04 \x01(\tH\x03\x88\x01\x01\x12>\n\x05index\x18\x05 \x01(\x0e\x32*.cln.ListinvoicesRequest.ListinvoicesIndexH\x04\x88\x01\x01\x12\x12\n\x05start\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x12\n\x05limit\x18\x07 \x01(\rH\x06\x88\x01\x01\"-\n\x11ListinvoicesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x0f\n\r_payment_hashB\x0b\n\t_offer_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListinvoicesResponse\x12+\n\x08invoices\x18\x01 \x03(\x0b\x32\x19.cln.ListinvoicesInvoices\"\xbc\x06\n\x14ListinvoicesInvoices\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListinvoicesInvoices.ListinvoicesInvoicesStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x16\n\tpay_index\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x14\n\x07paid_at\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0e \x01(\x0cH\x08\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\t\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\x12\x41\n\rpaid_outpoint\x18\x12 \x01(\x0b\x32%.cln.ListinvoicesInvoicesPaidOutpointH\x0b\x88\x01\x01\"?\n\x1aListinvoicesInvoicesStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x11\n\x0f_local_offer_idB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"@\n ListinvoicesInvoicesPaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xf6\x03\n\x10SendonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12)\n\tfirst_hop\x18\x02 \x01(\x0b\x32\x16.cln.SendonionFirstHop\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\x05label\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x16\n\x0eshared_secrets\x18\x05 \x03(\x0c\x12\x13\n\x06partid\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\t \x01(\x0cH\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x12+\n\x11total_amount_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\x0e\n\x0c_destinationB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x0e\n\x0c_descriptionB\x14\n\x12_total_amount_msat\"\xd0\x04\n\x11SendonionResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x36\n\x06status\x18\x03 \x01(\x0e\x32&.cln.SendonionResponse.SendonionStatus\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x06 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\n \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0b \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x07message\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06partid\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0e \x01(\x04\x12\x1a\n\rupdated_index\x18\x0f \x01(\x04H\x08\x88\x01\x01\",\n\x0fSendonionStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\t\n\x07_partidB\x10\n\x0e_updated_index\"P\n\x11SendonionFirstHop\x12\n\n\x02id\x18\x01 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\r\n\x05\x64\x65lay\x18\x03 \x01(\r\"\xa0\x03\n\x13ListsendpaysRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12@\n\x06status\x18\x03 \x01(\x0e\x32+.cln.ListsendpaysRequest.ListsendpaysStatusH\x02\x88\x01\x01\x12>\n\x05index\x18\x04 \x01(\x0e\x32*.cln.ListsendpaysRequest.ListsendpaysIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\"-\n\x11ListsendpaysIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\";\n\x12ListsendpaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\t\n\x07_bolt11B\x0f\n\r_payment_hashB\t\n\x07_statusB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListsendpaysResponse\x12+\n\x08payments\x18\x01 \x03(\x0b\x32\x19.cln.ListsendpaysPayments\"\xe5\x05\n\x14ListsendpaysPayments\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListsendpaysPayments.ListsendpaysPaymentsStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\n \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0b \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\nerroronion\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06partid\x18\x0f \x01(\x04H\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x10 \x01(\x04\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\t\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x12 \x01(\x04H\n\x88\x01\x01\"C\n\x1aListsendpaysPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\r\n\x0b_erroronionB\x0e\n\x0c_descriptionB\t\n\x07_partidB\x10\n\x0e_updated_indexB\x0f\n\r_completed_at\"\x19\n\x17ListtransactionsRequest\"S\n\x18ListtransactionsResponse\x12\x37\n\x0ctransactions\x18\x01 \x03(\x0b\x32!.cln.ListtransactionsTransactions\"\xf8\x01\n\x1cListtransactionsTransactions\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\r\n\x05rawtx\x18\x02 \x01(\x0c\x12\x13\n\x0b\x62lockheight\x18\x03 \x01(\r\x12\x0f\n\x07txindex\x18\x04 \x01(\r\x12\x10\n\x08locktime\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x37\n\x06inputs\x18\t \x03(\x0b\x32\'.cln.ListtransactionsTransactionsInputs\x12\x39\n\x07outputs\x18\n \x03(\x0b\x32(.cln.ListtransactionsTransactionsOutputs\"S\n\"ListtransactionsTransactionsInputs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\r\n\x05index\x18\x02 \x01(\r\x12\x10\n\x08sequence\x18\x03 \x01(\r\"l\n#ListtransactionsTransactionsOutputs\x12\r\n\x05index\x18\x01 \x01(\r\x12\x14\n\x0cscriptPubKey\x18\x03 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\"M\n\x11MakesecretRequest\x12\x10\n\x03hex\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x13\n\x06string\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x06\n\x04_hexB\t\n\x07_string\"$\n\x12MakesecretResponse\x12\x0e\n\x06secret\x18\x01 \x01(\x0c\"\xc7\x04\n\nPayRequest\x12\x12\n\x06\x62olt11\x18\x01 \x01(\tB\x02\x18\x01\x12\x16\n\x05label\x18\x03 \x01(\tB\x02\x18\x01H\x00\x88\x01\x01\x12\x1e\n\rmaxfeepercent\x18\x04 \x01(\x01\x42\x02\x18\x01H\x01\x88\x01\x01\x12\x1a\n\tretry_for\x18\x05 \x01(\rB\x02\x18\x01H\x02\x88\x01\x01\x12\x19\n\x08maxdelay\x18\x06 \x01(\rB\x02\x18\x01H\x03\x88\x01\x01\x12\'\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x04\x88\x01\x01\x12\x1b\n\nriskfactor\x18\x08 \x01(\x01\x42\x02\x18\x01H\x05\x88\x01\x01\x12\x13\n\x07\x65xclude\x18\n \x03(\tB\x02\x18\x01\x12$\n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x06\x88\x01\x01\x12\x1c\n\x0b\x64\x65scription\x18\x0c \x01(\tB\x02\x18\x01H\x07\x88\x01\x01\x12)\n\x0b\x61mount_msat\x18\r \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x08\x88\x01\x01\x12\x1e\n\rlocalinvreqid\x18\x0e \x01(\x0c\x42\x02\x18\x01H\t\x88\x01\x01\x12*\n\x0cpartial_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\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\"\xab\x03\n\x0bPayResponse\x12\x1c\n\x10payment_preimage\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x1c\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x42\x02\x18\x01H\x00\x88\x01\x01\x12\x18\n\x0cpayment_hash\x18\x03 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\ncreated_at\x18\x04 \x01(\x01\x42\x02\x18\x01\x12\x11\n\x05parts\x18\x05 \x01(\rB\x02\x18\x01\x12$\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12)\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12+\n\x1awarning_partial_completion\x18\x08 \x01(\tB\x02\x18\x01H\x01\x88\x01\x01\x12.\n\x06status\x18\t \x01(\x0e\x32\x1a.cln.PayResponse.PayStatusB\x02\x18\x01\">\n\tPayStatus\x12\x10\n\x08\x43OMPLETE\x10\x00\x1a\x02\x08\x01\x12\x0f\n\x07PENDING\x10\x01\x1a\x02\x08\x01\x12\x0e\n\x06\x46\x41ILED\x10\x02\x1a\x02\x08\x01\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\"\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\"\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\"g\n\x15WaitanyinvoiceRequest\x12\x1a\n\rlastpay_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\x10\n\x0e_lastpay_indexB\n\n\x08_timeout\"\xbc\x05\n\x16WaitanyinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12@\n\x06status\x18\x04 \x01(\x0e\x32\x30.cln.WaitanyinvoiceResponse.WaitanyinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\t \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\r \x01(\x04\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12;\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1f.cln.WaitanyinvoicePaidOutpointH\t\x88\x01\x01\"-\n\x14WaitanyinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\":\n\x1aWaitanyinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"#\n\x12WaitinvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\"\xad\x05\n\x13WaitinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.WaitinvoiceResponse.WaitinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\t \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x15\n\rcreated_index\x18\r \x01(\x04\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12\x38\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1c.cln.WaitinvoicePaidOutpointH\t\x88\x01\x01\"*\n\x11WaitinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"7\n\x17WaitinvoicePaidOutpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\x8e\x01\n\x12WaitsendpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x13\n\x06partid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x02\x88\x01\x01\x42\t\n\x07_partidB\n\n\x08_timeoutB\n\n\x08_groupid\"\xf7\x04\n\x13WaitsendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.WaitsendpayResponse.WaitsendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0e \x01(\x01H\x08\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0f \x01(\x04\x12\x1a\n\rupdated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\"!\n\x11WaitsendpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\x0f\n\r_completed_atB\x10\n\x0e_updated_index\"\x97\x01\n\x0eNewaddrRequest\x12@\n\x0b\x61\x64\x64resstype\x18\x01 \x01(\x0e\x32&.cln.NewaddrRequest.NewaddrAddresstypeH\x00\x88\x01\x01\"3\n\x12NewaddrAddresstype\x12\n\n\x06\x42\x45\x43H32\x10\x00\x12\x07\n\x03\x41LL\x10\x02\x12\x08\n\x04P2TR\x10\x03\x42\x0e\n\x0c_addresstype\"M\n\x0fNewaddrResponse\x12\x13\n\x06\x62\x65\x63h32\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04p2tr\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_bech32B\x07\n\x05_p2tr\"\xbc\x01\n\x0fWithdrawRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\t\x12$\n\x07satoshi\x18\x02 \x01(\x0b\x32\x13.cln.AmountSatOrAll\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\"\xd7\x03\n\x0eKeysendRequest\x12\x17\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\x05label\x18\x03 \x01(\tB\x02\x18\x01H\x00\x88\x01\x01\x12\x1e\n\rmaxfeepercent\x18\x04 \x01(\x01\x42\x02\x18\x01H\x01\x88\x01\x01\x12\x1a\n\tretry_for\x18\x05 \x01(\rB\x02\x18\x01H\x02\x88\x01\x01\x12\x19\n\x08maxdelay\x18\x06 \x01(\rB\x02\x18\x01H\x03\x88\x01\x01\x12\'\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x04\x88\x01\x01\x12/\n\nroutehints\x18\x08 \x01(\x0b\x32\x12.cln.RoutehintListB\x02\x18\x01H\x05\x88\x01\x01\x12*\n\textratlvs\x18\t \x01(\x0b\x32\x0e.cln.TlvStreamB\x02\x18\x01H\x06\x88\x01\x01\x12$\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12$\n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\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\"\x9a\x03\n\x0fKeysendResponse\x12\x1c\n\x10payment_preimage\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x1c\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x42\x02\x18\x01H\x00\x88\x01\x01\x12\x18\n\x0cpayment_hash\x18\x03 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\ncreated_at\x18\x04 \x01(\x01\x42\x02\x18\x01\x12\x11\n\x05parts\x18\x05 \x01(\rB\x02\x18\x01\x12$\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12)\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12+\n\x1awarning_partial_completion\x18\x08 \x01(\tB\x02\x18\x01H\x01\x88\x01\x01\x12\x36\n\x06status\x18\t \x01(\x0e\x32\".cln.KeysendResponse.KeysendStatusB\x02\x18\x01\"!\n\rKeysendStatus\x12\x10\n\x08\x43OMPLETE\x10\x00\x1a\x02\x08\x01\x42\x0e\n\x0c_destinationB\x1d\n\x1b_warning_partial_completion\"\xa7\x03\n\x0f\x46undpsbtRequest\x12$\n\x07satoshi\x18\x01 \x01(\x0b\x32\x13.cln.AmountSatOrAll\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\"\xa3\x03\n\x0fUtxopsbtRequest\x12$\n\x07satoshi\x18\x01 \x01(\x0b\x32\x13.cln.AmountSatOrAll\x12\x1d\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.Feerate\x12\x13\n\x0bstartweight\x18\x03 \x01(\r\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\x14\n\x07reserve\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08locktime\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1f\n\x12min_witness_weight\x18\x07 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nreservedok\x18\x08 \x01(\x08H\x03\x88\x01\x01\x12\x1d\n\x10\x65xcess_as_change\x18\t \x01(\x08H\x04\x88\x01\x01\x12#\n\x16opening_anchor_channel\x18\n \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_reserveB\x0b\n\t_locktimeB\x15\n\x13_min_witness_weightB\r\n\x0b_reservedokB\x13\n\x11_excess_as_changeB\x19\n\x17_opening_anchor_channel\"\xd9\x01\n\x10UtxopsbtResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\x0e\x66\x65\x65rate_per_kw\x18\x02 \x01(\r\x12\x1e\n\x16\x65stimated_final_weight\x18\x03 \x01(\r\x12 \n\x0b\x65xcess_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1a\n\rchange_outnum\x18\x05 \x01(\rH\x00\x88\x01\x01\x12/\n\x0creservations\x18\x06 \x03(\x0b\x32\x19.cln.UtxopsbtReservationsB\x10\n\x0e_change_outnum\"u\n\x14UtxopsbtReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\" \n\x10TxdiscardRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"6\n\x11TxdiscardResponse\x12\x13\n\x0bunsigned_tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xa4\x01\n\x10TxprepareRequest\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12 \n\x07outputs\x18\x05 \x03(\x0b\x32\x0f.cln.OutputDescB\n\n\x08_feerateB\n\n\x08_minconf\"D\n\x11TxprepareResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x13\n\x0bunsigned_tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"\x1d\n\rTxsendRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"8\n\x0eTxsendResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"\x8d\x01\n\x17ListpeerchannelsRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nchannel_id\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x05\n\x03_idB\x13\n\x11_short_channel_idB\r\n\x0b_channel_id\"K\n\x18ListpeerchannelsResponse\x12/\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1d.cln.ListpeerchannelsChannels\"\xd1\x1a\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\x43\n\x0c\x63hannel_type\x18\x05 \x01(\x0b\x32(.cln.ListpeerchannelsChannelsChannelTypeH\x01\x88\x01\x01\x12:\n\x07\x66\x65\x65rate\x18\x06 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFeerateH\x02\x88\x01\x01\x12\x12\n\x05owner\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x04\x88\x01\x01\x12\x17\n\nchannel_id\x18\t \x01(\x0cH\x05\x88\x01\x01\x12\x19\n\x0c\x66unding_txid\x18\n \x01(\x0cH\x06\x88\x01\x01\x12\x1b\n\x0e\x66unding_outnum\x18\x0b \x01(\rH\x07\x88\x01\x01\x12\x1c\n\x0finitial_feerate\x18\x0c \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0clast_feerate\x18\r \x01(\tH\t\x88\x01\x01\x12\x19\n\x0cnext_feerate\x18\x0e \x01(\tH\n\x88\x01\x01\x12\x1a\n\rnext_fee_step\x18\x0f \x01(\rH\x0b\x88\x01\x01\x12\x37\n\x08inflight\x18\x10 \x03(\x0b\x32%.cln.ListpeerchannelsChannelsInflight\x12\x15\n\x08\x63lose_to\x18\x11 \x01(\x0cH\x0c\x88\x01\x01\x12\x14\n\x07private\x18\x12 \x01(\x08H\r\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\x0e\x88\x01\x01\x12:\n\x07\x66unding\x18\x16 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFundingH\x0f\x88\x01\x01\x12$\n\nto_us_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x10\x88\x01\x01\x12(\n\x0emin_to_us_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\x11\x88\x01\x01\x12(\n\x0emax_to_us_msat\x18\x19 \x01(\x0b\x32\x0b.cln.AmountH\x12\x88\x01\x01\x12$\n\ntotal_msat\x18\x1a \x01(\x0b\x32\x0b.cln.AmountH\x13\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x1b \x01(\x0b\x32\x0b.cln.AmountH\x14\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x1c \x01(\rH\x15\x88\x01\x01\x12)\n\x0f\x64ust_limit_msat\x18\x1d \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@\n\rstate_changes\x18* \x03(\x0b\x32).cln.ListpeerchannelsChannelsStateChanges\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\x12\x10\n\x08\x66\x65\x61tures\x18? \x03(\tB\x0f\n\r_scratch_txidB\x0f\n\r_channel_typeB\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\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\"]\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\"X\n#ListpeerchannelsChannelsChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"?\n\x1fListpeerchannelsChannelsFeerate\x12\r\n\x05perkw\x18\x01 \x01(\r\x12\r\n\x05perkb\x18\x02 \x01(\r\"\xdd\x02\n\x1fListpeerchannelsChannelsFunding\x12%\n\x0bpushed_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12%\n\x10local_funds_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11remote_funds_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\rfee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\'\n\rfee_rcvd_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x11\n\x04psbt\x18\x06 \x01(\tH\x03\x88\x01\x01\x12\x15\n\x08withheld\x18\x07 \x01(\x08H\x04\x88\x01\x01\x42\x0e\n\x0c_pushed_msatB\x10\n\x0e_fee_paid_msatB\x10\n\x0e_fee_rcvd_msatB\x07\n\x05_psbtB\x0b\n\t_withheld\"\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\"\xf4\x01\n ListpeerchannelsChannelsInflight\x12\x14\n\x0c\x66unding_txid\x18\x01 \x01(\x0c\x12\x16\n\x0e\x66unding_outnum\x18\x02 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x03 \x01(\t\x12\'\n\x12total_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10our_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x0cscratch_txid\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\rsplice_amount\x18\x07 \x01(\x12\x42\x0f\n\r_scratch_txid\"\xf0\x02\n$ListpeerchannelsChannelsStateChanges\x12\x11\n\ttimestamp\x18\x01 \x01(\t\x12$\n\told_state\x18\x02 \x01(\x0e\x32\x11.cln.ChannelState\x12$\n\tnew_state\x18\x03 \x01(\x0e\x32\x11.cln.ChannelState\x12\x62\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32S.cln.ListpeerchannelsChannelsStateChanges.ListpeerchannelsChannelsStateChangesCause\x12\x0f\n\x07message\x18\x05 \x01(\t\"t\n)ListpeerchannelsChannelsStateChangesCause\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\"\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\"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\"\xae\x0b\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\x12K\n\x0c\x63hannel_type\x18\x08 \x01(\x0b\x32\x30.cln.ListclosedchannelsClosedchannelsChannelTypeH\x04\x88\x01\x01\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\x05\x88\x01\x01\x12/\n\x15\x66unding_fee_rcvd_msat\x18\x10 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12-\n\x13\x66unding_pushed_msat\x18\x11 \x01(\x0b\x32\x0b.cln.AmountH\x07\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\x08\x88\x01\x01\x12\x32\n\x18last_commitment_fee_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\t\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\n\x88\x01\x01\x12\x19\n\x0c\x66unding_psbt\x18\x1a \x01(\tH\x0b\x88\x01\x01\x12\x1d\n\x10\x66unding_withheld\x18\x1b \x01(\x08H\x0c\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\x0f\n\r_channel_typeB\x18\n\x16_funding_fee_paid_msatB\x18\n\x16_funding_fee_rcvd_msatB\x16\n\x14_funding_pushed_msatB\x17\n\x15_last_commitment_txidB\x1b\n\x19_last_commitment_fee_msatB\x19\n\x17_last_stable_connectionB\x0f\n\r_funding_psbtB\x13\n\x11_funding_withheld\"e\n%ListclosedchannelsClosedchannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"`\n+ListclosedchannelsClosedchannelsChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x1f\n\rDecodeRequest\x12\x0e\n\x06string\x18\x01 \x01(\t\"\xbd.\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\x39\n\x10offer_recurrence\x18\x12 \x01(\x0b\x32\x1a.cln.DecodeOfferRecurrenceH\x0c\x88\x01\x01\x12\x37\n\x12unknown_offer_tlvs\x18\x13 \x03(\x0b\x32\x1b.cln.DecodeUnknownOfferTlvs\x12.\n!warning_invalid_offer_description\x18\x15 \x01(\tH\r\x88\x01\x01\x12.\n!warning_missing_offer_description\x18\x16 \x01(\tH\x0e\x88\x01\x01\x12+\n\x1ewarning_invalid_offer_currency\x18\x17 \x01(\tH\x0f\x88\x01\x01\x12)\n\x1cwarning_invalid_offer_issuer\x18\x18 \x01(\tH\x10\x88\x01\x01\x12\x1c\n\x0finvreq_metadata\x18\x19 \x01(\x0cH\x11\x88\x01\x01\x12\x1c\n\x0finvreq_payer_id\x18\x1a \x01(\x0cH\x12\x88\x01\x01\x12\x19\n\x0cinvreq_chain\x18\x1b \x01(\x0cH\x13\x88\x01\x01\x12,\n\x12invreq_amount_msat\x18\x1c \x01(\x0b\x32\x0b.cln.AmountH\x14\x88\x01\x01\x12\x1c\n\x0finvreq_features\x18\x1d \x01(\x0cH\x15\x88\x01\x01\x12\x1c\n\x0finvreq_quantity\x18\x1e \x01(\x04H\x16\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x1f \x01(\tH\x17\x88\x01\x01\x12&\n\x19invreq_recurrence_counter\x18 \x01(\rH\x18\x88\x01\x01\x12$\n\x17invreq_recurrence_start\x18! \x01(\rH\x19\x88\x01\x01\x12J\n\x1cunknown_invoice_request_tlvs\x18\" \x03(\x0b\x32$.cln.DecodeUnknownInvoiceRequestTlvs\x12,\n\x1fwarning_missing_invreq_metadata\x18# \x01(\tH\x1a\x88\x01\x01\x12,\n\x1fwarning_missing_invreq_payer_id\x18$ \x01(\tH\x1b\x88\x01\x01\x12.\n!warning_invalid_invreq_payer_note\x18% \x01(\tH\x1c\x88\x01\x01\x12\x36\n)warning_missing_invoice_request_signature\x18& \x01(\tH\x1d\x88\x01\x01\x12\x36\n)warning_invalid_invoice_request_signature\x18\' \x01(\tH\x1e\x88\x01\x01\x12.\n\rinvoice_paths\x18( \x03(\x0b\x32\x17.cln.DecodeInvoicePaths\x12\x1f\n\x12invoice_created_at\x18) \x01(\x04H\x1f\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\x14unknown_invoice_tlvs\x18\x31 \x03(\x0b\x32\x1d.cln.DecodeUnknownInvoiceTlvs\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(\x04H/\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18= \x01(\x04H0\x88\x01\x01\x12\x12\n\x05payee\x18> \x01(\x0cH1\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18? \x01(\x0cH2\x88\x01\x01\x12\x1d\n\x10\x64\x65scription_hash\x18@ \x01(\x0cH3\x88\x01\x01\x12\"\n\x15min_final_cltv_expiry\x18\x41 \x01(\rH4\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x42 \x01(\x0cH5\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x43 \x01(\x0cH6\x88\x01\x01\x12\x1f\n\x05\x65xtra\x18\x45 \x03(\x0b\x32\x10.cln.DecodeExtra\x12\x16\n\tunique_id\x18\x46 \x01(\tH7\x88\x01\x01\x12\x14\n\x07version\x18G \x01(\tH8\x88\x01\x01\x12\x13\n\x06string\x18H \x01(\tH9\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(\tH@\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18Q \x01(\x0cHA\x88\x01\x01\x12-\n\x06routes\x18R \x01(\x0b\x32\x18.cln.DecodeRoutehintListHB\x88\x01\x01\x12\x1c\n\x0foffer_issuer_id\x18S \x01(\x0cHC\x88\x01\x01\x12,\n\x1fwarning_missing_offer_issuer_id\x18T \x01(\tHD\x88\x01\x01\x12,\n\x0cinvreq_paths\x18U \x03(\x0b\x32\x16.cln.DecodeInvreqPaths\x12\'\n\x1awarning_empty_blinded_path\x18V \x01(\tHE\x88\x01\x01\x12=\n\x13invreq_bip_353_name\x18W \x01(\x0b\x32\x1b.cln.DecodeInvreqBip353NameHF\x88\x01\x01\x12\x35\n(warning_invreq_bip_353_name_name_invalid\x18X \x01(\tHG\x88\x01\x01\x12\x37\n*warning_invreq_bip_353_name_domain_invalid\x18Y \x01(\tHH\x88\x01\x01\x12%\n\x18invreq_recurrence_cancel\x18Z \x01(\x08HI\x88\x01\x01\x12=\n0warning_invreq_recurrence_cancel_without_counter\x18[ \x01(\tHJ\x88\x01\x01\x12?\n2warning_invreq_recurrence_cancel_with_zero_counter\x18\\ \x01(\tHK\x88\x01\x01\x12\x1b\n\x0eproof_preimage\x18] \x01(\x0cHL\x88\x01\x01\x12\x1a\n\x12proof_omitted_tlvs\x18^ \x03(\x04\x12\x1c\n\x14proof_missing_hashes\x18_ \x03(\x0c\x12\x19\n\x11proof_leaf_hashes\x18` \x03(\x0c\x12\x17\n\nproof_note\x18\x61 \x01(\tHM\x88\x01\x01\x12\x1c\n\x0fproof_signature\x18\x62 \x01(\tHN\x88\x01\x01\x12\x42\n\x18unknown_payer_proof_tlvs\x18\x63 \x03(\x0b\x32 .cln.DecodeUnknownPayerProofTlvs\"\x9b\x01\n\nDecodeType\x12\x10\n\x0c\x42OLT12_OFFER\x10\x00\x12\x12\n\x0e\x42OLT12_INVOICE\x10\x01\x12\x1a\n\x16\x42OLT12_INVOICE_REQUEST\x10\x02\x12\x12\n\x0e\x42OLT11_INVOICE\x10\x03\x12\x08\n\x04RUNE\x10\x04\x12\x15\n\x11\x45MERGENCY_RECOVER\x10\x05\x12\x16\n\x12\x42OLT12_PAYER_PROOF\x10\x06\x42\x0b\n\t_offer_idB\x11\n\x0f_offer_metadataB\x11\n\x0f_offer_currencyB!\n\x1f_warning_unknown_offer_currencyB\x16\n\x14_currency_minor_unitB\x0f\n\r_offer_amountB\x14\n\x12_offer_amount_msatB\x14\n\x12_offer_descriptionB\x0f\n\r_offer_issuerB\x11\n\x0f_offer_featuresB\x18\n\x16_offer_absolute_expiryB\x15\n\x13_offer_quantity_maxB\x13\n\x11_offer_recurrenceB$\n\"_warning_invalid_offer_descriptionB$\n\"_warning_missing_offer_descriptionB!\n\x1f_warning_invalid_offer_currencyB\x1f\n\x1d_warning_invalid_offer_issuerB\x12\n\x10_invreq_metadataB\x12\n\x10_invreq_payer_idB\x0f\n\r_invreq_chainB\x15\n\x13_invreq_amount_msatB\x12\n\x10_invreq_featuresB\x12\n\x10_invreq_quantityB\x14\n\x12_invreq_payer_noteB\x1c\n\x1a_invreq_recurrence_counterB\x1a\n\x18_invreq_recurrence_startB\"\n _warning_missing_invreq_metadataB\"\n _warning_missing_invreq_payer_idB$\n\"_warning_invalid_invreq_payer_noteB,\n*_warning_missing_invoice_request_signatureB,\n*_warning_invalid_invoice_request_signatureB\x15\n\x13_invoice_created_atB\x1a\n\x18_invoice_relative_expiryB\x17\n\x15_invoice_payment_hashB\x16\n\x14_invoice_amount_msatB\x13\n\x11_invoice_featuresB\x12\n\x10_invoice_node_idB\x1e\n\x1c_invoice_recurrence_basetimeB \n\x1e_warning_missing_invoice_pathsB%\n#_warning_missing_invoice_blindedpayB%\n#_warning_missing_invoice_created_atB\'\n%_warning_missing_invoice_payment_hashB!\n\x1f_warning_missing_invoice_amountB.\n,_warning_missing_invoice_recurrence_basetimeB\"\n _warning_missing_invoice_node_idB$\n\"_warning_missing_invoice_signatureB$\n\"_warning_invalid_invoice_signatureB\r\n\x0b_created_atB\t\n\x07_expiryB\x08\n\x06_payeeB\x0f\n\r_payment_hashB\x13\n\x11_description_hashB\x18\n\x16_min_final_cltv_expiryB\x11\n\x0f_payment_secretB\x13\n\x11_payment_metadataB\x0c\n\n_unique_idB\n\n\x08_versionB\t\n\x07_stringB\x1c\n\x1a_warning_rune_invalid_utf8B\x06\n\x04_hexB\x0c\n\n_decryptedB\x0c\n\n_signatureB\x0b\n\t_currencyB\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x0b\n\t_featuresB\t\n\x07_routesB\x12\n\x10_offer_issuer_idB\"\n _warning_missing_offer_issuer_idB\x1d\n\x1b_warning_empty_blinded_pathB\x16\n\x14_invreq_bip_353_nameB+\n)_warning_invreq_bip_353_name_name_invalidB-\n+_warning_invreq_bip_353_name_domain_invalidB\x1b\n\x19_invreq_recurrence_cancelB3\n1_warning_invreq_recurrence_cancel_without_counterB5\n3_warning_invreq_recurrence_cancel_with_zero_counterB\x11\n\x0f_proof_preimageB\r\n\x0b_proof_noteB\x12\n\x10_proof_signature\"(\n\x0b\x44\x65\x63odeExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\xc4\x01\n\x0f\x44\x65\x63odeFallbacks\x12;\n\titem_type\x18\x02 \x01(\x0e\x32(.cln.DecodeFallbacks.DecodeFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x03 \x01(\tH\x00\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\x07\n\x05_addr\"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\"\xa6\x02\n\x12\x44\x65\x63odeInvoicePaths\x12)\n\x04path\x18\x01 \x03(\x0b\x32\x1b.cln.DecodeInvoicePathsPath\x12/\n\x07payinfo\x18\x02 \x01(\x0b\x32\x1e.cln.DecodeInvoicePathsPayinfo\x12\x1a\n\rfirst_node_id\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x1b\n\x0e\x66irst_path_key\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x12\x1b\n\x0e\x66irst_scid_dir\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x06 \x01(\tH\x03\x88\x01\x01\x42\x10\n\x0e_first_node_idB\x11\n\x0f_first_path_keyB\x11\n\x0f_first_scid_dirB\r\n\x0b_first_scid\"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\"\x97\x02\n\x19\x44\x65\x63odeInvoicePathsPayinfo\x12+\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0c\x12\"\n\rfee_base_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x04 \x01(\r\x12+\n\x11htlc_maximum_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x19\n\x11\x63ltv_expiry_delta\x18\x06 \x01(\rB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msat\"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\"\xf3\x01\n\x11\x44\x65\x63odeInvreqPaths\x12\x1b\n\x0e\x66irst_scid_dir\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\rfirst_node_id\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x04 \x01(\tH\x02\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\x03\x88\x01\x01\x42\x11\n\x0f_first_scid_dirB\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\"\xf1\x01\n\x10\x44\x65\x63odeOfferPaths\x12\x1a\n\rfirst_node_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\'\n\x04path\x18\x03 \x03(\x0b\x32\x19.cln.DecodeOfferPathsPath\x12\x1b\n\x0e\x66irst_scid_dir\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x1b\n\x0e\x66irst_path_key\x18\x06 \x01(\x0cH\x03\x88\x01\x01\x42\x10\n\x0e_first_node_idB\x11\n\x0f_first_scid_dirB\r\n\x0b_first_scidB\x11\n\x0f_first_path_key\"Q\n\x14\x44\x65\x63odeOfferPathsPath\x12\x17\n\x0f\x62linded_node_id\x18\x01 \x01(\x0c\x12 \n\x18\x65ncrypted_recipient_data\x18\x02 \x01(\x0c\"\xab\x02\n\x15\x44\x65\x63odeOfferRecurrence\x12\x11\n\ttime_unit\x18\x01 \x01(\r\x12\x1d\n\x10\x63ompulsory_field\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x1b\n\x0etime_unit_name\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0e\n\x06period\x18\x04 \x01(\r\x12\x15\n\x08\x62\x61setime\x18\x05 \x01(\x04H\x02\x88\x01\x01\x12;\n\tpaywindow\x18\x06 \x01(\x0b\x32#.cln.DecodeOfferRecurrencePaywindowH\x03\x88\x01\x01\x12\x12\n\x05limit\x18\x07 \x01(\rH\x04\x88\x01\x01\x42\x13\n\x11_compulsory_fieldB\x11\n\x0f_time_unit_nameB\x0b\n\t_basetimeB\x0c\n\n_paywindowB\x08\n\x06_limit\"\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\";\n\x12\x44\x65\x63odeRestrictions\x12\x14\n\x0c\x61lternatives\x18\x01 \x03(\t\x12\x0f\n\x07summary\x18\x02 \x01(\t\"S\n\x1f\x44\x65\x63odeUnknownInvoiceRequestTlvs\x12\x11\n\titem_type\x18\x01 \x01(\x04\x12\x0e\n\x06length\x18\x02 \x01(\x04\x12\r\n\x05value\x18\x03 \x01(\x0c\"L\n\x18\x44\x65\x63odeUnknownInvoiceTlvs\x12\x11\n\titem_type\x18\x01 \x01(\x04\x12\x0e\n\x06length\x18\x02 \x01(\x04\x12\r\n\x05value\x18\x03 \x01(\x0c\"J\n\x16\x44\x65\x63odeUnknownOfferTlvs\x12\x11\n\titem_type\x18\x01 \x01(\x04\x12\x0e\n\x06length\x18\x02 \x01(\x04\x12\r\n\x05value\x18\x03 \x01(\x0c\"O\n\x1b\x44\x65\x63odeUnknownPayerProofTlvs\x12\x11\n\titem_type\x18\x01 \x01(\x04\x12\x0e\n\x06length\x18\x02 \x01(\x04\x12\r\n\x05value\x18\x03 \x01(\x0c\"\xc2\x01\n\rDelpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12/\n\x06status\x18\x02 \x01(\x0e\x32\x1f.cln.DelpayRequest.DelpayStatus\x12\x13\n\x06partid\x18\x03 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x01\x88\x01\x01\"(\n\x0c\x44\x65lpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x42\t\n\x07_partidB\n\n\x08_groupid\"7\n\x0e\x44\x65lpayResponse\x12%\n\x08payments\x18\x01 \x03(\x0b\x32\x13.cln.DelpayPayments\"\xb4\x05\n\x0e\x44\x65lpayPayments\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x38\n\x06status\x18\x04 \x01(\x0e\x32(.cln.DelpayPayments.DelpayPaymentsStatus\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\t \x01(\x04\x12\x1a\n\rupdated_index\x18\n \x01(\x04H\x03\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12\x14\n\x07groupid\x18\x0c \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x08\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\t\x88\x01\x01\x12\x17\n\nerroronion\x18\x11 \x01(\x0cH\n\x88\x01\x01\"=\n\x14\x44\x65lpayPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x10\n\x0e_updated_indexB\x0f\n\r_completed_atB\n\n\x08_groupidB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\r\n\x0b_erroronion\"\xb3\x01\n\x11\x44\x65lforwardRequest\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x12\n\nin_htlc_id\x18\x02 \x01(\x04\x12\x37\n\x06status\x18\x03 \x01(\x0e\x32\'.cln.DelforwardRequest.DelforwardStatus\"=\n\x10\x44\x65lforwardStatus\x12\x0b\n\x07SETTLED\x10\x00\x12\x10\n\x0cLOCAL_FAILED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"\x14\n\x12\x44\x65lforwardResponse\"\'\n\x13\x44isableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\xdc\x01\n\x14\x44isableofferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"&\n\x12\x45nableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\xdb\x01\n\x13\x45nableofferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"=\n\x11\x44isconnectRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\x05\x66orce\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x08\n\x06_force\"\x14\n\x12\x44isconnectResponse\"k\n\x0f\x46\x65\x65ratesRequest\x12\x31\n\x05style\x18\x01 \x01(\x0e\x32\".cln.FeeratesRequest.FeeratesStyle\"%\n\rFeeratesStyle\x12\t\n\x05PERKB\x10\x00\x12\t\n\x05PERKW\x10\x01\"\x9a\x02\n\x10\x46\x65\x65ratesResponse\x12%\n\x18warning_missing_feerates\x18\x01 \x01(\tH\x00\x88\x01\x01\x12&\n\x05perkb\x18\x02 \x01(\x0b\x32\x12.cln.FeeratesPerkbH\x01\x88\x01\x01\x12&\n\x05perkw\x18\x03 \x01(\x0b\x32\x12.cln.FeeratesPerkwH\x02\x88\x01\x01\x12\x44\n\x15onchain_fee_estimates\x18\x04 \x01(\x0b\x32 .cln.FeeratesOnchainFeeEstimatesH\x03\x88\x01\x01\x42\x1b\n\x19_warning_missing_feeratesB\x08\n\x06_perkbB\x08\n\x06_perkwB\x18\n\x16_onchain_fee_estimates\"\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\"\x84\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\x14\n\x07penalty\x18\x08 \x01(\rH\x03\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkbEstimates\x12\r\n\x05\x66loor\x18\n \x01(\r\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x04\x88\x01\x01\x12\x13\n\x06splice\x18\x0c \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\n\n\x08_penaltyB\x1a\n\x18_unilateral_anchor_closeB\t\n\x07_splice\"W\n\x16\x46\x65\x65ratesPerkbEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"\x84\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\x14\n\x07penalty\x18\x08 \x01(\rH\x03\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkwEstimates\x12\r\n\x05\x66loor\x18\n \x01(\r\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x04\x88\x01\x01\x12\x13\n\x06splice\x18\x0c \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\n\n\x08_penaltyB\x1a\n\x18_unilateral_anchor_closeB\t\n\x07_splice\"W\n\x16\x46\x65\x65ratesPerkwEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"%\n\x12\x46\x65tchbip353Request\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"X\n\x13\x46\x65tchbip353Response\x12\r\n\x05proof\x18\x01 \x01(\t\x12\x32\n\x0cinstructions\x18\x02 \x03(\x0b\x32\x1c.cln.Fetchbip353Instructions\"\xf7\x01\n\x17\x46\x65tchbip353Instructions\x12\x18\n\x0b\x64\x65scription\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05offer\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07onchain\x18\x03 \x01(\tH\x02\x88\x01\x01\x12!\n\x14offchain_amount_msat\x18\x04 \x01(\x04H\x03\x88\x01\x01\x12\x1f\n\x12onchain_amount_sat\x18\x05 \x01(\x04H\x04\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x08\n\x06_offerB\n\n\x08_onchainB\x17\n\x15_offchain_amount_msatB\x15\n\x13_onchain_amount_sat\"\xb9\x03\n\x13\x46\x65tchinvoiceRequest\x12\r\n\x05offer\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x15\n\x08quantity\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x1f\n\x12recurrence_counter\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x10recurrence_start\x18\x05 \x01(\x01H\x03\x88\x01\x01\x12\x1d\n\x10recurrence_label\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x14\n\x07timeout\x18\x07 \x01(\x01H\x05\x88\x01\x01\x12\x17\n\npayer_note\x18\x08 \x01(\tH\x06\x88\x01\x01\x12\x1b\n\x0epayer_metadata\x18\t \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62ip353\x18\n \x01(\tH\x08\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0b\n\t_quantityB\x15\n\x13_recurrence_counterB\x13\n\x11_recurrence_startB\x13\n\x11_recurrence_labelB\n\n\x08_timeoutB\r\n\x0b_payer_noteB\x11\n\x0f_payer_metadataB\t\n\x07_bip353\"\x99\x01\n\x14\x46\x65tchinvoiceResponse\x12\x0f\n\x07invoice\x18\x01 \x01(\t\x12)\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x18.cln.FetchinvoiceChanges\x12\x35\n\x0bnext_period\x18\x03 \x01(\x0b\x32\x1b.cln.FetchinvoiceNextPeriodH\x00\x88\x01\x01\x42\x0e\n\x0c_next_period\"\x82\x02\n\x13\x46\x65tchinvoiceChanges\x12!\n\x14\x64\x65scription_appended\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0evendor_removed\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06vendor\x18\x04 \x01(\tH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x42\x17\n\x15_description_appendedB\x0e\n\x0c_descriptionB\x11\n\x0f_vendor_removedB\t\n\x07_vendorB\x0e\n\x0c_amount_msat\"}\n\x16\x46\x65tchinvoiceNextPeriod\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x04\x12\x11\n\tstarttime\x18\x02 \x01(\x04\x12\x0f\n\x07\x65ndtime\x18\x03 \x01(\x04\x12\x17\n\x0fpaywindow_start\x18\x04 \x01(\x04\x12\x15\n\rpaywindow_end\x18\x05 \x01(\x04\"\xe0\x01\n\x1d\x43\x61ncelrecurringinvoiceRequest\x12\r\n\x05offer\x18\x01 \x01(\t\x12\x1a\n\x12recurrence_counter\x18\x02 \x01(\x04\x12\x18\n\x10recurrence_label\x18\x03 \x01(\t\x12\x1d\n\x10recurrence_start\x18\x04 \x01(\x01H\x00\x88\x01\x01\x12\x17\n\npayer_note\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62ip353\x18\x06 \x01(\tH\x02\x88\x01\x01\x42\x13\n\x11_recurrence_startB\r\n\x0b_payer_noteB\t\n\x07_bip353\"0\n\x1e\x43\x61ncelrecurringinvoiceResponse\x12\x0e\n\x06\x62olt12\x18\x01 \x01(\t\"&\n\x18\x46undchannelCancelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\".\n\x19\x46undchannelCancelResponse\x12\x11\n\tcancelled\x18\x01 \x01(\t\"Z\n\x1a\x46undchannelCompleteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x15\n\x08withhold\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x0b\n\t_withhold\"N\n\x1b\x46undchannelCompleteResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\"\x84\x04\n\x12\x46undchannelRequest\x12#\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x13.cln.AmountSatOrAll\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\x0e.cln.AmountSatH\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\x0e.cln.AmountSatH\x08\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\x0e \x03(\rB\n\n\x08_feerateB\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\n\n\x08_minconfB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xce\x01\n\x13\x46undchannelResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0e\n\x06outnum\x18\x03 \x01(\r\x12\x12\n\nchannel_id\x18\x04 \x01(\x0c\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\x08mindepth\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x31\n\x0c\x63hannel_type\x18\x07 \x01(\x0b\x32\x1b.cln.FundchannelChannelTypeB\x0b\n\t_close_toB\x0b\n\t_mindepth\"K\n\x16\x46undchannelChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\xdc\x02\n\x17\x46undchannelStartRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1e\n\x06\x61mount\x18\x02 \x01(\x0b\x32\x0e.cln.AmountSat\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\x0e.cln.AmountSatH\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\"\x8c\x02\n\x0fGetrouteRequest\x12\x0e\n\x02id\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\nriskfactor\x18\x03 \x01(\x04\x42\x02\x18\x01\x12\x15\n\x04\x63ltv\x18\x04 \x01(\rB\x02\x18\x01H\x00\x88\x01\x01\x12\x17\n\x06\x66romid\x18\x05 \x01(\x0c\x42\x02\x18\x01H\x01\x88\x01\x01\x12\x1c\n\x0b\x66uzzpercent\x18\x06 \x01(\rB\x02\x18\x01H\x02\x88\x01\x01\x12\x13\n\x07\x65xclude\x18\x07 \x03(\tB\x02\x18\x01\x12\x18\n\x07maxhops\x18\x08 \x01(\rB\x02\x18\x01H\x03\x88\x01\x01\x12$\n\x0b\x61mount_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x42\x07\n\x05_cltvB\t\n\x07_fromidB\x0e\n\x0c_fuzzpercentB\n\n\x08_maxhops\"9\n\x10GetrouteResponse\x12%\n\x05route\x18\x01 \x03(\x0b\x32\x12.cln.GetrouteRouteB\x02\x18\x01\"\xe1\x01\n\rGetrouteRoute\x12\x0e\n\x02id\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x13\n\x07\x63hannel\x18\x02 \x01(\tB\x02\x18\x01\x12\x15\n\tdirection\x18\x03 \x01(\rB\x02\x18\x01\x12$\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12\x11\n\x05\x64\x65lay\x18\x05 \x01(\rB\x02\x18\x01\x12\x38\n\x05style\x18\x06 \x01(\x0e\x32%.cln.GetrouteRoute.GetrouteRouteStyleB\x02\x18\x01\"!\n\x12GetrouteRouteStyle\x12\x0b\n\x03TLV\x10\x00\x1a\x02\x08\x01\"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\"-\n\x11ListforwardsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\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\x42\t\n\x07_statusB\r\n\x0b_in_channelB\x0e\n\x0c_out_channelB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListforwardsResponse\x12+\n\x08\x66orwards\x18\x01 \x03(\x0b\x32\x19.cln.ListforwardsForwards\"\x9d\x06\n\x14ListforwardsForwards\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x1c\n\x07in_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x44\n\x06status\x18\x03 \x01(\x0e\x32\x34.cln.ListforwardsForwards.ListforwardsForwardsStatus\x12\x15\n\rreceived_time\x18\x04 \x01(\x01\x12\x18\n\x0bout_channel\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\"\n\x08out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12G\n\x05style\x18\t \x01(\x0e\x32\x33.cln.ListforwardsForwards.ListforwardsForwardsStyleH\x03\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x18\n\x0bout_htlc_id\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x15\n\rcreated_index\x18\x0c \x01(\x04\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rresolved_time\x18\x0e \x01(\x01H\x07\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x0f \x01(\rH\x08\x88\x01\x01\x12\x17\n\nfailreason\x18\x10 \x01(\tH\t\x88\x01\x01\"T\n\x1aListforwardsForwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"0\n\x19ListforwardsForwardsStyle\x12\n\n\x06LEGACY\x10\x00\x12\x07\n\x03TLV\x10\x01\x42\x0e\n\x0c_out_channelB\x0b\n\t_fee_msatB\x0b\n\t_out_msatB\x08\n\x06_styleB\r\n\x0b_in_htlc_idB\x0e\n\x0c_out_htlc_idB\x10\n\x0e_updated_indexB\x10\n\x0e_resolved_timeB\x0b\n\t_failcodeB\r\n\x0b_failreason\"a\n\x11ListoffersRequest\x12\x15\n\x08offer_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0b\n\t_offer_idB\x0e\n\x0c_active_only\";\n\x12ListoffersResponse\x12%\n\x06offers\x18\x01 \x03(\x0b\x32\x15.cln.ListoffersOffers\"\xd8\x01\n\x10ListoffersOffers\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_descriptionB\x0e\n\x0c_force_paths\"\x84\x03\n\x0fListpaysRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x38\n\x06status\x18\x03 \x01(\x0e\x32#.cln.ListpaysRequest.ListpaysStatusH\x02\x88\x01\x01\x12\x36\n\x05index\x18\x04 \x01(\x0e\x32\".cln.ListpaysRequest.ListpaysIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\")\n\rListpaysIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\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\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\"\x88\x03\n\x1cMultifundchannelDestinations\x12\n\n\x02id\x18\x01 \x01(\t\x12#\n\x06\x61mount\x18\x02 \x01(\x0b\x32\x13.cln.AmountSatOrAll\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\x0e.cln.AmountSatH\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\x0e.cln.AmountSatH\x06\x88\x01\x01\x42\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xb2\x01\n\x1aMultifundchannelChannelIds\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12\x12\n\nchannel_id\x18\x03 \x01(\x0c\x12@\n\x0c\x63hannel_type\x18\x04 \x01(\x0b\x32*.cln.MultifundchannelChannelIdsChannelType\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_close_to\"Z\n%MultifundchannelChannelIdsChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x93\x02\n\x16MultifundchannelFailed\x12\n\n\x02id\x18\x01 \x01(\x0c\x12H\n\x06method\x18\x02 \x01(\x0e\x32\x38.cln.MultifundchannelFailed.MultifundchannelFailedMethod\x12/\n\x05\x65rror\x18\x03 \x01(\x0b\x32 .cln.MultifundchannelFailedError\"r\n\x1cMultifundchannelFailedMethod\x12\x0b\n\x07\x43ONNECT\x10\x00\x12\x14\n\x10OPENCHANNEL_INIT\x10\x01\x12\x15\n\x11\x46UNDCHANNEL_START\x10\x02\x12\x18\n\x14\x46UNDCHANNEL_COMPLETE\x10\x03\"<\n\x1bMultifundchannelFailedError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x12\x12\x0f\n\x07message\x18\x02 \x01(\t\"\xa8\x01\n\x14MultiwithdrawRequest\x12 \n\x07outputs\x18\x01 \x03(\x0b\x32\x0f.cln.OutputDesc\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.OutpointB\n\n\x08_feerateB\n\n\x08_minconf\"1\n\x15MultiwithdrawResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xe2\x04\n\x0cOfferRequest\x12\x0e\n\x06\x61mount\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0cquantity_max\x18\x05 \x01(\x04H\x03\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x06 \x01(\x04H\x04\x88\x01\x01\x12\x17\n\nrecurrence\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1c\n\x0frecurrence_base\x18\x08 \x01(\tH\x06\x88\x01\x01\x12!\n\x14recurrence_paywindow\x18\t \x01(\tH\x07\x88\x01\x01\x12\x1d\n\x10recurrence_limit\x18\n \x01(\rH\x08\x88\x01\x01\x12\x17\n\nsingle_use\x18\x0b \x01(\x08H\t\x88\x01\x01\x12 \n\x13proportional_amount\x18\r \x01(\x08H\n\x88\x01\x01\x12 \n\x13optional_recurrence\x18\x0e \x01(\x08H\x0b\x88\x01\x01\x12\x16\n\x0e\x66ronting_nodes\x18\x0f \x03(\x0c\x42\x0e\n\x0c_descriptionB\t\n\x07_issuerB\x08\n\x06_labelB\x0f\n\r_quantity_maxB\x12\n\x10_absolute_expiryB\r\n\x0b_recurrenceB\x12\n\x10_recurrence_baseB\x17\n\x15_recurrence_paywindowB\x13\n\x11_recurrence_limitB\r\n\x0b_single_useB\x16\n\x14_proportional_amountB\x16\n\x14_optional_recurrence\"\xbc\x01\n\rOfferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x0f\n\x07\x63reated\x18\x06 \x01(\x08\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x66orce_paths\x18\x08 \x01(\x08H\x01\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_force_paths\"-\n\x17OpenchannelAbortRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"X\n\x18OpenchannelAbortResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x18\n\x10\x63hannel_canceled\x18\x02 \x01(\x08\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\xa1\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\x1e\n\x06\x61mount\x18\x04 \x01(\x0b\x32\x0e.cln.AmountSatB\x12\n\x10_funding_feerate\"\xed\x01\n\x17OpenchannelBumpResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x35\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32\x1f.cln.OpenchannelBumpChannelType\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x00\x88\x01\x01\x42\x1c\n\x1a_requires_confirmed_inputs\"O\n\x1aOpenchannelBumpChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\xa5\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\x0e.cln.AmountSatH\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\x1e\n\x06\x61mount\x18\n \x01(\x0b\x32\x0e.cln.AmountSatB\x15\n\x13_commitment_feerateB\x12\n\x10_funding_feerateB\x0b\n\t_announceB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_lease\"\xed\x01\n\x17OpenchannelInitResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x35\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32\x1f.cln.OpenchannelInitChannelType\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x00\x88\x01\x01\x42\x1c\n\x1a_requires_confirmed_inputs\"O\n\x1aOpenchannelInitChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"C\n\x18OpenchannelSignedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_psbt\x18\x02 \x01(\t\"I\n\x19OpenchannelSignedResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"<\n\x18OpenchannelUpdateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"\x95\x02\n\x19OpenchannelUpdateResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x37\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32!.cln.OpenchannelUpdateChannelType\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_outnum\x18\x05 \x01(\r\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12&\n\x19requires_confirmed_inputs\x18\x07 \x01(\x08H\x01\x88\x01\x01\x42\x0b\n\t_close_toB\x1c\n\x1a_requires_confirmed_inputs\"Q\n\x1cOpenchannelUpdateChannelType\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"Y\n\x0bPingRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x03len\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x16\n\tpongbytes\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x06\n\x04_lenB\x0c\n\n_pongbytes\"\x1e\n\x0cPingResponse\x12\x0e\n\x06totlen\x18\x01 \x01(\r\"\x91\x01\n\rPluginRequest\x12)\n\nsubcommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12\x13\n\x06plugin\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tdirectory\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x07options\x18\x04 \x03(\tB\t\n\x07_pluginB\x0c\n\n_directory\"}\n\x0ePluginResponse\x12&\n\x07\x63ommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12#\n\x07plugins\x18\x02 \x03(\x0b\x32\x12.cln.PluginPlugins\x12\x13\n\x06result\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_result\">\n\rPluginPlugins\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x0f\n\x07\x64ynamic\x18\x03 \x01(\x08\"@\n\x14RenepaystatusRequest\x12\x1a\n\tinvstring\x18\x01 \x01(\tB\x02\x18\x01H\x00\x88\x01\x01\x42\x0c\n\n_invstring\"K\n\x15RenepaystatusResponse\x12\x32\n\tpaystatus\x18\x01 \x03(\x0b\x32\x1b.cln.RenepaystatusPaystatusB\x02\x18\x01\"\x9a\x04\n\x16RenepaystatusPaystatus\x12\x12\n\x06\x62olt11\x18\x01 \x01(\tB\x02\x18\x01\x12!\n\x10payment_preimage\x18\x02 \x01(\x0c\x42\x02\x18\x01H\x00\x88\x01\x01\x12\x18\n\x0cpayment_hash\x18\x03 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\ncreated_at\x18\x04 \x01(\x01\x42\x02\x18\x01\x12\x13\n\x07groupid\x18\x05 \x01(\rB\x02\x18\x01\x12\x16\n\x05parts\x18\x06 \x01(\rB\x02\x18\x01H\x01\x88\x01\x01\x12$\n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12.\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x02\x88\x01\x01\x12L\n\x06status\x18\t \x01(\x0e\x32\x38.cln.RenepaystatusPaystatus.RenepaystatusPaystatusStatusB\x02\x18\x01\x12\x1c\n\x0b\x64\x65stination\x18\n \x01(\x0c\x42\x02\x18\x01H\x03\x88\x01\x01\x12\x11\n\x05notes\x18\x0b \x03(\tB\x02\x18\x01\"Q\n\x1cRenepaystatusPaystatusStatus\x12\x10\n\x08\x43OMPLETE\x10\x00\x1a\x02\x08\x01\x12\x0f\n\x07PENDING\x10\x01\x1a\x02\x08\x01\x12\x0e\n\x06\x46\x41ILED\x10\x02\x1a\x02\x08\x01\x42\x13\n\x11_payment_preimageB\x08\n\x06_partsB\x13\n\x11_amount_sent_msatB\x0e\n\x0c_destination\"\xfe\x02\n\x0eRenepayRequest\x12\x15\n\tinvstring\x18\x01 \x01(\tB\x02\x18\x01\x12)\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x00\x88\x01\x01\x12$\n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x01\x88\x01\x01\x12\x19\n\x08maxdelay\x18\x04 \x01(\rB\x02\x18\x01H\x02\x88\x01\x01\x12\x1a\n\tretry_for\x18\x05 \x01(\rB\x02\x18\x01H\x03\x88\x01\x01\x12\x1c\n\x0b\x64\x65scription\x18\x06 \x01(\tB\x02\x18\x01H\x04\x88\x01\x01\x12\x16\n\x05label\x18\x07 \x01(\tB\x02\x18\x01H\x05\x88\x01\x01\x12\x1f\n\x0e\x64\x65v_use_shadow\x18\x08 \x01(\x08\x42\x02\x18\x01H\x06\x88\x01\x01\x12\x13\n\x07\x65xclude\x18\t \x03(\tB\x02\x18\x01\x42\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\"\xdd\x03\n\x0fRenepayResponse\x12\x1c\n\x10payment_preimage\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x18\n\x0cpayment_hash\x18\x02 \x01(\x0c\x42\x02\x18\x01\x12\x16\n\ncreated_at\x18\x03 \x01(\x01\x42\x02\x18\x01\x12\x11\n\x05parts\x18\x04 \x01(\rB\x02\x18\x01\x12$\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12)\n\x10\x61mount_sent_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01\x12\x36\n\x06status\x18\x07 \x01(\x0e\x32\".cln.RenepayResponse.RenepayStatusB\x02\x18\x01\x12\x1c\n\x0b\x64\x65stination\x18\x08 \x01(\x0c\x42\x02\x18\x01H\x00\x88\x01\x01\x12\x17\n\x06\x62olt11\x18\t \x01(\tB\x02\x18\x01H\x01\x88\x01\x01\x12\x17\n\x06\x62olt12\x18\n \x01(\tB\x02\x18\x01H\x02\x88\x01\x01\x12\x18\n\x07groupid\x18\x0b \x01(\x04\x42\x02\x18\x01H\x03\x88\x01\x01\"B\n\rRenepayStatus\x12\x10\n\x08\x43OMPLETE\x10\x00\x1a\x02\x08\x01\x12\x0f\n\x07PENDING\x10\x01\x1a\x02\x08\x01\x12\x0e\n\x06\x46\x41ILED\x10\x02\x1a\x02\x08\x01\x42\x0e\n\x0c_destinationB\t\n\x07_bolt11B\t\n\x07_bolt12B\n\n\x08_groupid\"l\n\x14ReserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\texclusive\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x14\n\x07reserve\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x0c\n\n_exclusiveB\n\n\x08_reserve\"M\n\x15ReserveinputsResponse\x12\x34\n\x0creservations\x18\x01 \x03(\x0b\x32\x1e.cln.ReserveinputsReservations\"z\n\x19ReserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\"4\n\x14SendcustommsgRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x0c\x12\x0b\n\x03msg\x18\x02 \x01(\x0c\"\'\n\x15SendcustommsgResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\"\xb0\x01\n\x12SendinvoiceRequest\x12\x0e\n\x06invreq\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08quantity\x18\x05 \x01(\x04H\x02\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\n\n\x08_timeoutB\x0b\n\t_quantity\"\xb8\x04\n\x13SendinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.SendinvoiceResponse.SendinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x15\n\rcreated_index\x18\x08 \x01(\x04\x12\x1a\n\rupdated_index\x18\t \x01(\x04H\x02\x88\x01\x01\x12\x16\n\tpay_index\x18\n \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0c \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x06\x88\x01\x01\"6\n\x11SendinvoiceStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_amount_msatB\t\n\x07_bolt12B\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\xaa\x02\n\x11SetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12!\n\x07\x66\x65\x65\x62\x61se\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x66\x65\x65ppm\x18\x03 \x01(\rH\x01\x88\x01\x01\x12!\n\x07htlcmin\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12!\n\x07htlcmax\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x19\n\x0c\x65nforcedelay\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1c\n\x0fignorefeelimits\x18\x07 \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_feebaseB\t\n\x07_feeppmB\n\n\x08_htlcminB\n\n\x08_htlcmaxB\x0f\n\r_enforcedelayB\x12\n\x10_ignorefeelimits\"?\n\x12SetchannelResponse\x12)\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x17.cln.SetchannelChannels\"\xaf\x03\n\x12SetchannelChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\x12*\n\x15minimum_htlc_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x17warning_htlcmin_too_low\x18\x07 \x01(\tH\x01\x88\x01\x01\x12*\n\x15maximum_htlc_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x18warning_htlcmax_too_high\x18\t \x01(\tH\x02\x88\x01\x01\x12\x19\n\x11ignore_fee_limits\x18\n \x01(\x08\x42\x13\n\x11_short_channel_idB\x1a\n\x18_warning_htlcmin_too_lowB\x1b\n\x19_warning_htlcmax_too_high\"b\n\x10SetconfigRequest\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x10\n\x03val\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttransient\x18\x03 \x01(\x08H\x01\x88\x01\x01\x42\x06\n\x04_valB\x0c\n\n_transient\"9\n\x11SetconfigResponse\x12$\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x14.cln.SetconfigConfig\"\xda\x02\n\x0fSetconfigConfig\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x13\n\x06source\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x07\x64ynamic\x18\x04 \x01(\x08\x12\x10\n\x03set\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x16\n\tvalue_str\x18\x06 \x01(\tH\x03\x88\x01\x01\x12$\n\nvalue_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x16\n\tvalue_int\x18\x08 \x01(\x12H\x05\x88\x01\x01\x12\x17\n\nvalue_bool\x18\t \x01(\x08H\x06\x88\x01\x01\x12\x0f\n\x07sources\x18\n \x03(\t\x12\x12\n\nvalues_str\x18\x0b \x03(\tB\t\n\x07_sourceB\t\n\x07_pluginB\x06\n\x04_setB\x0c\n\n_value_strB\r\n\x0b_value_msatB\x0c\n\n_value_intB\r\n\x0b_value_bool\"6\n\x15SetpsbtversionRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\r\"&\n\x16SetpsbtversionResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"\'\n\x12SigninvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\"%\n\x13SigninvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"%\n\x12SignmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"F\n\x13SignmessageResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\r\n\x05recid\x18\x02 \x01(\x0c\x12\r\n\x05zbase\x18\x03 \x01(\t\"\xc8\x01\n\x11SpliceInitRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x17\n\x0frelative_amount\x18\x02 \x01(\x12\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x65\x65rate_per_kw\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x0e\n\x0c_initialpsbtB\x11\n\x0f_feerate_per_kwB\x10\n\x0e_force_feerate\"\"\n\x12SpliceInitResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"_\n\x13SpliceSignedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x17\n\nsign_first\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_sign_first\"^\n\x14SpliceSignedResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x13\n\x06outnum\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04psbt\x18\x04 \x01(\tB\t\n\x07_outnum\"7\n\x13SpliceUpdateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"y\n\x14SpliceUpdateResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\x12\x1f\n\x12signatures_secured\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\x15\n\x13_signatures_secured\"2\n\x0fSpliceinRequest\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\t\"b\n\x10SpliceinResponse\x12\x11\n\x04psbt\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"\x8b\x01\n\x10SpliceoutRequest\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\t\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x04 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_destinationB\x10\n\x0e_force_feerate\"c\n\x11SpliceoutResponse\x12\x11\n\x04psbt\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"\xc6\x01\n\x10\x44\x65vspliceRequest\x12\x16\n\x0escript_or_json\x18\x01 \x01(\t\x12\x13\n\x06\x64ryrun\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tdebug_log\x18\x04 \x01(\x08H\x02\x88\x01\x01\x12\x17\n\ndev_wetrun\x18\x05 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_dryrunB\x10\n\x0e_force_feerateB\x0c\n\n_debug_logB\r\n\x0b_dev_wetrun\"\x80\x01\n\x11\x44\x65vspliceResponse\x12\x0e\n\x06\x64ryrun\x18\x01 \x03(\t\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03log\x18\x05 \x03(\tB\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"H\n\x16UnreserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x14\n\x07reserve\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_reserve\"Q\n\x17UnreserveinputsResponse\x12\x36\n\x0creservations\x18\x01 \x03(\x0b\x32 .cln.UnreserveinputsReservations\"\x97\x01\n\x1bUnreserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x1e\n\x11reserved_to_block\x18\x05 \x01(\rH\x00\x88\x01\x01\x42\x14\n\x12_reserved_to_block\"n\n\x14UpgradewalletRequest\x12\"\n\x07\x66\x65\x65rate\x18\x01 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x17\n\nreservedok\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\n\n\x08_feerateB\r\n\x0b_reservedok\"~\n\x15UpgradewalletResponse\x12\x15\n\rupgraded_outs\x18\x01 \x01(\x04\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\x0cH\x02\x88\x01\x01\x42\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"O\n\x16WaitblockheightRequest\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\x12\x14\n\x07timeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_timeout\".\n\x17WaitblockheightResponse\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\"\xb9\x02\n\x0bWaitRequest\x12\x31\n\tsubsystem\x18\x01 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitSubsystem\x12\x31\n\tindexname\x18\x02 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitIndexname\x12\x11\n\tnextvalue\x18\x03 \x01(\x04\"6\n\rWaitIndexname\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x12\x0b\n\x07\x44\x45LETED\x10\x02\"y\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\x12\t\n\x05HTLCS\x10\x03\x12\x0e\n\nCHAINMOVES\x10\x04\x12\x10\n\x0c\x43HANNELMOVES\x10\x05\x12\x11\n\rNETWORKEVENTS\x10\x06\"\xf4\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.WaitDetailsB\x02\x18\x01H\x03\x88\x01\x01\x12(\n\x08\x66orwards\x18\x06 \x01(\x0b\x32\x11.cln.WaitForwardsH\x04\x88\x01\x01\x12(\n\x08invoices\x18\x07 \x01(\x0b\x32\x11.cln.WaitInvoicesH\x05\x88\x01\x01\x12(\n\x08sendpays\x18\x08 \x01(\x0b\x32\x11.cln.WaitSendpaysH\x06\x88\x01\x01\x12\"\n\x05htlcs\x18\t \x01(\x0b\x32\x0e.cln.WaitHtlcsH\x07\x88\x01\x01\x12,\n\nchainmoves\x18\n \x01(\x0b\x32\x13.cln.WaitChainmovesH\x08\x88\x01\x01\x12\x30\n\x0c\x63hannelmoves\x18\x0b \x01(\x0b\x32\x15.cln.WaitChannelmovesH\t\x88\x01\x01\x12\x32\n\rnetworkevents\x18\x0c \x01(\x0b\x32\x16.cln.WaitNetworkeventsH\n\x88\x01\x01\"y\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\x12\t\n\x05HTLCS\x10\x03\x12\x0e\n\nCHAINMOVES\x10\x04\x12\x10\n\x0c\x43HANNELMOVES\x10\x05\x12\x11\n\rNETWORKEVENTS\x10\x06\x42\n\n\x08_createdB\n\n\x08_updatedB\n\n\x08_deletedB\n\n\x08_detailsB\x0b\n\t_forwardsB\x0b\n\t_invoicesB\x0b\n\t_sendpaysB\x08\n\x06_htlcsB\r\n\x0b_chainmovesB\x0f\n\r_channelmovesB\x10\n\x0e_networkevents\"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\"\xd0\x05\n\x0bWaitDetails\x12;\n\x06status\x18\x01 \x01(\x0e\x32\".cln.WaitDetails.WaitDetailsStatusB\x02\x18\x01H\x00\x88\x01\x01\x12\x16\n\x05label\x18\x02 \x01(\tB\x02\x18\x01H\x01\x88\x01\x01\x12\x1c\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x02\x18\x01H\x02\x88\x01\x01\x12\x17\n\x06\x62olt11\x18\x04 \x01(\tB\x02\x18\x01H\x03\x88\x01\x01\x12\x17\n\x06\x62olt12\x18\x05 \x01(\tB\x02\x18\x01H\x04\x88\x01\x01\x12\x17\n\x06partid\x18\x06 \x01(\x04\x42\x02\x18\x01H\x05\x88\x01\x01\x12\x18\n\x07groupid\x18\x07 \x01(\x04\x42\x02\x18\x01H\x06\x88\x01\x01\x12\x1d\n\x0cpayment_hash\x18\x08 \x01(\x0c\x42\x02\x18\x01H\x07\x88\x01\x01\x12\x1b\n\nin_channel\x18\t \x01(\tB\x02\x18\x01H\x08\x88\x01\x01\x12\x1b\n\nin_htlc_id\x18\n \x01(\x04\x42\x02\x18\x01H\t\x88\x01\x01\x12%\n\x07in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\n\x88\x01\x01\x12\x1c\n\x0bout_channel\x18\x0c \x01(\tB\x02\x18\x01H\x0b\x88\x01\x01\"\xad\x01\n\x11WaitDetailsStatus\x12\x0e\n\x06UNPAID\x10\x00\x1a\x02\x08\x01\x12\x0c\n\x04PAID\x10\x01\x1a\x02\x08\x01\x12\x0f\n\x07\x45XPIRED\x10\x02\x1a\x02\x08\x01\x12\x0f\n\x07PENDING\x10\x03\x1a\x02\x08\x01\x12\x0e\n\x06\x46\x41ILED\x10\x04\x1a\x02\x08\x01\x12\x10\n\x08\x43OMPLETE\x10\x05\x1a\x02\x08\x01\x12\x0f\n\x07OFFERED\x10\x06\x1a\x02\x08\x01\x12\x0f\n\x07SETTLED\x10\x07\x1a\x02\x08\x01\x12\x14\n\x0cLOCAL_FAILED\x10\x08\x1a\x02\x08\x01\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\"\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\"\x8c\x03\n\tWaitHtlcs\x12\"\n\x05state\x18\x01 \x01(\x0e\x32\x0e.cln.HtlcStateH\x00\x88\x01\x01\x12\x14\n\x07htlc_id\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x63ltv_expiry\x18\x04 \x01(\rH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x39\n\tdirection\x18\x06 \x01(\x0e\x32!.cln.WaitHtlcs.WaitHtlcsDirectionH\x05\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x07 \x01(\x0cH\x06\x88\x01\x01\"%\n\x12WaitHtlcsDirection\x12\x07\n\x03OUT\x10\x00\x12\x06\n\x02IN\x10\x01\x42\x08\n\x06_stateB\n\n\x08_htlc_idB\x13\n\x11_short_channel_idB\x0e\n\x0c_cltv_expiryB\x0e\n\x0c_amount_msatB\x0c\n\n_directionB\x0f\n\r_payment_hash\"\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\"\x89\x02\n\x11WaitNetworkevents\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x44\n\titem_type\x18\x02 \x01(\x0e\x32,.cln.WaitNetworkevents.WaitNetworkeventsTypeH\x01\x88\x01\x01\x12\x14\n\x07peer_id\x18\x03 \x01(\x0cH\x02\x88\x01\x01\"P\n\x15WaitNetworkeventsType\x12\x0b\n\x07\x43ONNECT\x10\x00\x12\x10\n\x0c\x43ONNECT_FAIL\x10\x01\x12\x08\n\x04PING\x10\x02\x12\x0e\n\nDISCONNECT\x10\x03\x42\x10\n\x0e_created_indexB\x0c\n\n_item_typeB\n\n\x08_peer_id\"\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\"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\"\xed\x36\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\x12S\n\x15\x65xperimental_splicing\x18\x16 \x01(\x0b\x32+.cln.ListconfigsConfigsExperimentalsplicingB\x02\x18\x01H\x15\x88\x01\x01\x12i\n#experimental_shutdown_wrong_funding\x18\x19 \x01(\x0b\x32\x37.cln.ListconfigsConfigsExperimentalshutdownwrongfundingH\x16\x88\x01\x01\x12Z\n\x19\x65xperimental_peer_storage\x18\x1a \x01(\x0b\x32..cln.ListconfigsConfigsExperimentalpeerstorageB\x02\x18\x01H\x17\x88\x01\x01\x12Q\n\x14\x65xperimental_anchors\x18\x1b \x01(\x0b\x32*.cln.ListconfigsConfigsExperimentalanchorsB\x02\x18\x01H\x18\x88\x01\x01\x12\x45\n\x10\x64\x61tabase_upgrade\x18\x1c \x01(\x0b\x32&.cln.ListconfigsConfigsDatabaseupgradeH\x19\x88\x01\x01\x12,\n\x03rgb\x18\x1d \x01(\x0b\x32\x1a.cln.ListconfigsConfigsRgbH\x1a\x88\x01\x01\x12\x30\n\x05\x61lias\x18\x1e \x01(\x0b\x32\x1c.cln.ListconfigsConfigsAliasH\x1b\x88\x01\x01\x12\x35\n\x08pid_file\x18\x1f \x01(\x0b\x32\x1e.cln.ListconfigsConfigsPidfileH\x1c\x88\x01\x01\x12\x46\n\x11ignore_fee_limits\x18 \x01(\x0b\x32&.cln.ListconfigsConfigsIgnorefeelimitsH\x1d\x88\x01\x01\x12\x45\n\x10watchtime_blocks\x18! \x01(\x0b\x32&.cln.ListconfigsConfigsWatchtimeblocksH\x1e\x88\x01\x01\x12N\n\x13max_locktime_blocks\x18\" \x01(\x0b\x32(.cln.ListconfigsConfigsMaxlocktimeblocksB\x02\x18\x01H\x1f\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.ListconfigsConfigsBindaddrH.\x88\x01\x01\x12\x34\n\x07offline\x18\x32 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsOfflineH/\x88\x01\x01\x12:\n\nautolisten\x18\x33 \x01(\x0b\x32!.cln.ListconfigsConfigsAutolistenH0\x88\x01\x01\x12\x30\n\x05proxy\x18\x34 \x01(\x0b\x32\x1c.cln.ListconfigsConfigsProxyH1\x88\x01\x01\x12;\n\x0b\x64isable_dns\x18\x35 \x01(\x0b\x32!.cln.ListconfigsConfigsDisablednsH2\x88\x01\x01\x12T\n\x18\x61nnounce_addr_discovered\x18\x36 \x01(\x0b\x32-.cln.ListconfigsConfigsAnnounceaddrdiscoveredH3\x88\x01\x01\x12]\n\x1d\x61nnounce_addr_discovered_port\x18\x37 \x01(\x0b\x32\x31.cln.ListconfigsConfigsAnnounceaddrdiscoveredportH4\x88\x01\x01\x12\x43\n\rencrypted_hsm\x18\x38 \x01(\x0b\x32#.cln.ListconfigsConfigsEncryptedhsmB\x02\x18\x01H5\x88\x01\x01\x12>\n\rrpc_file_mode\x18\x39 \x01(\x0b\x32\".cln.ListconfigsConfigsRpcfilemodeH6\x88\x01\x01\x12\x37\n\tlog_level\x18: \x01(\x0b\x32\x1f.cln.ListconfigsConfigsLoglevelH7\x88\x01\x01\x12\x39\n\nlog_prefix\x18; \x01(\x0b\x32 .cln.ListconfigsConfigsLogprefixH8\x88\x01\x01\x12\x35\n\x08log_file\x18< \x01(\x0b\x32\x1e.cln.ListconfigsConfigsLogfileH9\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.ListconfigsConfigsAnnounceaddrdnsH?\x88\x01\x01\x12T\n\x18require_confirmed_inputs\x18\x44 \x01(\x0b\x32-.cln.ListconfigsConfigsRequireconfirmedinputsH@\x88\x01\x01\x12\x39\n\ncommit_fee\x18\x45 \x01(\x0b\x32 .cln.ListconfigsConfigsCommitfeeHA\x88\x01\x01\x12N\n\x15\x63ommit_feerate_offset\x18\x46 \x01(\x0b\x32*.cln.ListconfigsConfigsCommitfeerateoffsetHB\x88\x01\x01\x12T\n\x18\x61utoconnect_seeker_peers\x18G \x01(\x0b\x32-.cln.ListconfigsConfigsAutoconnectseekerpeersHC\x88\x01\x01\x12R\n\x17\x63urrencyrate_add_source\x18J \x01(\x0b\x32,.cln.ListconfigsConfigsCurrencyrateaddsourceHD\x88\x01\x01\x12Z\n\x1b\x63urrencyrate_disable_source\x18K \x01(\x0b\x32\x30.cln.ListconfigsConfigsCurrencyratedisablesourceHE\x88\x01\x01\x12V\n\x19\x65xperimental_simple_close\x18L \x01(\x0b\x32..cln.ListconfigsConfigsExperimentalsimplecloseHF\x88\x01\x01\x12K\n\x14\x61\x63\x63\x65pt_htlc_tlv_type\x18M \x01(\x0b\x32(.cln.ListconfigsConfigsAccepthtlctlvtypeHG\x88\x01\x01\x12\x41\n\x0ehsm_passphrase\x18N \x01(\x0b\x32$.cln.ListconfigsConfigsHsmpassphraseHH\x88\x01\x01\x12`\n i_promise_to_fix_broken_api_user\x18O \x01(\x0b\x32\x31.cln.ListconfigsConfigsIpromisetofixbrokenapiuserHI\x88\x01\x01\x12V\n\x19invoices_onchain_fallback\x18P \x01(\x0b\x32..cln.ListconfigsConfigsInvoicesonchainfallbackHJ\x88\x01\x01\x12\x43\n\x0fmessage_padding\x18Q \x01(\x0b\x32%.cln.ListconfigsConfigsMessagepaddingHK\x88\x01\x01\x12H\n\x12min_emergency_msat\x18R \x01(\x0b\x32\'.cln.ListconfigsConfigsMinemergencymsatHL\x88\x01\x01\x12N\n\x15payment_fronting_node\x18S \x01(\x0b\x32*.cln.ListconfigsConfigsPaymentfrontingnodeHM\x88\x01\x01\x12\x34\n\x07recover\x18T \x01(\x0b\x32\x1e.cln.ListconfigsConfigsRecoverHN\x88\x01\x01\x12=\n\x0creckless_dir\x18U \x01(\x0b\x32\".cln.ListconfigsConfigsRecklessdirHO\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&\n$_experimental_shutdown_wrong_fundingB\x1c\n\x1a_experimental_peer_storageB\x17\n\x15_experimental_anchorsB\x13\n\x11_database_upgradeB\x06\n\x04_rgbB\x08\n\x06_aliasB\x0b\n\t_pid_fileB\x14\n\x12_ignore_fee_limitsB\x13\n\x11_watchtime_blocksB\x16\n\x14_max_locktime_blocksB\x13\n\x11_funding_confirmsB\r\n\x0b_cltv_deltaB\r\n\x0b_cltv_finalB\x0e\n\x0c_commit_timeB\x0b\n\t_fee_baseB\t\n\x07_rescanB\x12\n\x10_fee_per_satoshiB\x17\n\x15_max_concurrent_htlcsB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x1e\n\x1c_max_dust_htlc_exposure_msatB\x13\n\x11_min_capacity_satB\x07\n\x05_addrB\x10\n\x0e_announce_addrB\x0c\n\n_bind_addrB\n\n\x08_offlineB\r\n\x0b_autolistenB\x08\n\x06_proxyB\x0e\n\x0c_disable_dnsB\x1b\n\x19_announce_addr_discoveredB \n\x1e_announce_addr_discovered_portB\x10\n\x0e_encrypted_hsmB\x10\n\x0e_rpc_file_modeB\x0c\n\n_log_levelB\r\n\x0b_log_prefixB\x0b\n\t_log_fileB\x11\n\x0f_log_timestampsB\x11\n\x0f_force_feeratesB\x0c\n\n_subdaemonB\x19\n\x17_fetchinvoice_noconnectB\x17\n\x15_tor_service_passwordB\x14\n\x12_announce_addr_dnsB\x1b\n\x19_require_confirmed_inputsB\r\n\x0b_commit_feeB\x18\n\x16_commit_feerate_offsetB\x1b\n\x19_autoconnect_seeker_peersB\x1a\n\x18_currencyrate_add_sourceB\x1e\n\x1c_currencyrate_disable_sourceB\x1c\n\x1a_experimental_simple_closeB\x17\n\x15_accept_htlc_tlv_typeB\x11\n\x0f_hsm_passphraseB#\n!_i_promise_to_fix_broken_api_userB\x1c\n\x1a_invoices_onchain_fallbackB\x12\n\x10_message_paddingB\x15\n\x13_min_emergency_msatB\x18\n\x16_payment_fronting_nodeB\n\n\x08_recoverB\x0f\n\r_reckless_dir\"J\n#ListconfigsConfigsAccepthtlctlvtype\x12\x0f\n\x07sources\x18\x01 \x03(\t\x12\x12\n\nvalues_int\x18\x02 \x03(\r\"=\n\x16ListconfigsConfigsAddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"<\n\x17ListconfigsConfigsAlias\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\"F\n ListconfigsConfigsAlwaysuseproxy\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"E\n\x1eListconfigsConfigsAnnounceaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\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\"G\n!ListconfigsConfigsAnnounceaddrdns\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\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\"B\n\x1cListconfigsConfigsAutolisten\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"A\n\x1aListconfigsConfigsBindaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"=\n\x1eListconfigsConfigsClearplugins\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"@\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\"A\n\x1cListconfigsConfigsCommittime\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"\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\n\'ListconfigsConfigsCurrencyrateaddsource\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"r\n+ListconfigsConfigsCurrencyratedisablesource\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"7\n\x18ListconfigsConfigsDaemon\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\x1bListconfigsConfigsDeveloper\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"[\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\"F\n\x1fListconfigsConfigsDisableplugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"E\n\x1eListconfigsConfigsEncryptedhsm\x12\x0f\n\x03set\x18\x01 \x01(\x08\x42\x02\x18\x01\x12\x12\n\x06source\x18\x02 \x01(\tB\x02\x18\x01\"L\n%ListconfigsConfigsExperimentalanchors\x12\x0f\n\x03set\x18\x01 \x01(\x08\x42\x02\x18\x01\x12\x12\n\x06source\x18\x02 \x01(\tB\x02\x18\x01\"E\n&ListconfigsConfigsExperimentaldualfund\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"P\n)ListconfigsConfigsExperimentalpeerstorage\x12\x0f\n\x03set\x18\x01 \x01(\x08\x42\x02\x18\x01\x12\x12\n\x06source\x18\x02 \x01(\tB\x02\x18\x01\"Q\n2ListconfigsConfigsExperimentalshutdownwrongfunding\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n)ListconfigsConfigsExperimentalsimpleclose\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"M\n&ListconfigsConfigsExperimentalsplicing\x12\x0f\n\x03set\x18\x01 \x01(\x08\x42\x02\x18\x01\x12\x12\n\x06source\x18\x02 \x01(\tB\x02\x18\x01\">\n\x19ListconfigsConfigsFeebase\x12\x11\n\tvalue_int\x18\x01 \x01(\r\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\"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\"D\n\x1fListconfigsConfigsForcefeerates\x12\x11\n\tvalue_str\x18\x01 \x01(\t\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\x1fListconfigsConfigsHsmpassphrase\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"T\n!ListconfigsConfigsHtlcminimummsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"S\n,ListconfigsConfigsIpromisetofixbrokenapiuser\x12\x0f\n\x07sources\x18\x01 \x03(\t\x12\x12\n\nvalues_str\x18\x02 \x03(\t\"G\n!ListconfigsConfigsIgnorefeelimits\x12\x12\n\nvalue_bool\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\"H\n)ListconfigsConfigsInvoicesonchainfallback\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"C\n\x1eListconfigsConfigsLightningdir\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\"?\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\"E\n\x1fListconfigsConfigsLogtimestamps\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsMainnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"\\\n)ListconfigsConfigsMaxdusthtlcexposuremsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"P\n#ListconfigsConfigsMaxlocktimeblocks\x12\x15\n\tvalue_int\x18\x01 \x01(\rB\x02\x18\x01\x12\x12\n\x06source\x18\x02 \x01(\tB\x02\x18\x01\"F\n ListconfigsConfigsMessagepadding\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x12\n\nvalue_bool\x18\x02 \x01(\x08\"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\"U\n\"ListconfigsConfigsMinemergencymsat\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x1f\n\nvalue_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\">\n\x19ListconfigsConfigsNetwork\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsOffline\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"L\n%ListconfigsConfigsPaymentfrontingnode\x12\x0f\n\x07sources\x18\x01 \x03(\t\x12\x12\n\nvalues_str\x18\x02 \x03(\t\">\n\x19ListconfigsConfigsPidfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\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\"<\n\x17ListconfigsConfigsProxy\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1dListconfigsConfigsRecklessdir\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x11\n\tvalue_str\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsRecover\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x11\n\tvalue_str\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsRegtest\x12\x0b\n\x03set\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\x18ListconfigsConfigsRescan\x12\x11\n\tvalue_int\x18\x01 \x01(\x12\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\x19ListconfigsConfigsRpcfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\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\"7\n\x18ListconfigsConfigsSignet\x12\x0b\n\x03set\x18\x01 \x01(\x08\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\"8\n\x19ListconfigsConfigsTestnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"I\n$ListconfigsConfigsTorservicepassword\x12\x11\n\tvalue_str\x18\x01 \x01(\t\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\"F\n!ListconfigsConfigsWatchtimeblocks\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"\r\n\x0bStopRequest\"a\n\x0cStopResponse\x12,\n\x06result\x18\x01 \x01(\x0e\x32\x1c.cln.StopResponse.StopResult\"#\n\nStopResult\x12\x15\n\x11SHUTDOWN_COMPLETE\x10\x00\"/\n\x0bHelpRequest\x12\x14\n\x07\x63ommand\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_command\"\x95\x01\n\x0cHelpResponse\x12\x1b\n\x04help\x18\x01 \x03(\x0b\x32\r.cln.HelpHelp\x12:\n\x0b\x66ormat_hint\x18\x02 \x01(\x0e\x32 .cln.HelpResponse.HelpFormathintH\x00\x88\x01\x01\"\x1c\n\x0eHelpFormathint\x12\n\n\x06SIMPLE\x10\x00\x42\x0e\n\x0c_format_hint\"\x1b\n\x08HelpHelp\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\"g\n\x18PreapprovekeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"\x1b\n\x19PreapprovekeysendResponse\"*\n\x18PreapproveinvoiceRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"\x1b\n\x19PreapproveinvoiceResponse\"\x15\n\x13StaticbackupRequest\"#\n\x14StaticbackupResponse\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"d\n\x16\x42kprchannelsapyRequest\x12\x17\n\nstart_time\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\r\n\x0b_start_timeB\x0b\n\t_end_time\"P\n\x17\x42kprchannelsapyResponse\x12\x35\n\x0c\x63hannels_apy\x18\x01 \x03(\x0b\x32\x1f.cln.BkprchannelsapyChannelsApy\"\xf9\x06\n\x1a\x42kprchannelsapyChannelsApy\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12$\n\x0frouted_out_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0erouted_in_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12(\n\x13lease_fee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12*\n\x15lease_fee_earned_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x0fpushed_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0epushed_in_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x16our_start_balance_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12/\n\x1a\x63hannel_start_balance_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\rfees_out_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x0c\x66\x65\x65s_in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x17\n\x0futilization_out\x18\x0c \x01(\t\x12$\n\x17utilization_out_initial\x18\r \x01(\tH\x01\x88\x01\x01\x12\x16\n\x0eutilization_in\x18\x0e \x01(\t\x12#\n\x16utilization_in_initial\x18\x0f \x01(\tH\x02\x88\x01\x01\x12\x0f\n\x07\x61py_out\x18\x10 \x01(\t\x12\x1c\n\x0f\x61py_out_initial\x18\x11 \x01(\tH\x03\x88\x01\x01\x12\x0e\n\x06\x61py_in\x18\x12 \x01(\t\x12\x1b\n\x0e\x61py_in_initial\x18\x13 \x01(\tH\x04\x88\x01\x01\x12\x11\n\tapy_total\x18\x14 \x01(\t\x12\x1e\n\x11\x61py_total_initial\x18\x15 \x01(\tH\x05\x88\x01\x01\x12\x16\n\tapy_lease\x18\x16 \x01(\tH\x06\x88\x01\x01\x42\x0f\n\r_fees_in_msatB\x1a\n\x18_utilization_out_initialB\x19\n\x17_utilization_in_initialB\x12\n\x10_apy_out_initialB\x11\n\x0f_apy_in_initialB\x14\n\x12_apy_total_initialB\x0c\n\n_apy_lease\"\xd2\x01\n\x18\x42kprdumpincomecsvRequest\x12\x12\n\ncsv_format\x18\x01 \x01(\t\x12\x15\n\x08\x63sv_file\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1d\n\x10\x63onsolidate_fees\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x17\n\nstart_time\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x05 \x01(\x04H\x03\x88\x01\x01\x42\x0b\n\t_csv_fileB\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"\xd4\x01\n\x19\x42kprdumpincomecsvResponse\x12\x10\n\x08\x63sv_file\x18\x01 \x01(\t\x12M\n\ncsv_format\x18\x02 \x01(\x0e\x32\x39.cln.BkprdumpincomecsvResponse.BkprdumpincomecsvCsvFormat\"V\n\x1a\x42kprdumpincomecsvCsvFormat\x12\x0f\n\x0b\x43OINTRACKER\x10\x00\x12\n\n\x06KOINLY\x10\x01\x12\x0b\n\x07HARMONY\x10\x02\x12\x0e\n\nQUICKBOOKS\x10\x03\"%\n\x12\x42kprinspectRequest\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\"7\n\x13\x42kprinspectResponse\x12 \n\x03txs\x18\x01 \x03(\x0b\x32\x13.cln.BkprinspectTxs\"\x9a\x01\n\x0e\x42kprinspectTxs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x18\n\x0b\x62lockheight\x18\x02 \x01(\rH\x00\x88\x01\x01\x12#\n\x0e\x66\x65\x65s_paid_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x07outputs\x18\x04 \x03(\x0b\x32\x1a.cln.BkprinspectTxsOutputsB\x0e\n\x0c_blockheight\"\xbc\x03\n\x15\x42kprinspectTxsOutputs\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12&\n\x11output_value_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x04 \x01(\t\x12%\n\x0b\x63redit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12$\n\ndebit_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12 \n\x13originating_account\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x17\n\noutput_tag\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tspend_tag\x18\t \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rspending_txid\x18\n \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x42\x0e\n\x0c_credit_msatB\r\n\x0b_debit_msatB\x16\n\x14_originating_accountB\r\n\x0b_output_tagB\x0c\n\n_spend_tagB\x10\n\x0e_spending_txidB\r\n\x0b_payment_id\"h\n\x1c\x42kprlistaccounteventsRequest\x12\x14\n\x07\x61\x63\x63ount\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\npayment_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\n\n\x08_accountB\r\n\x0b_payment_id\"Q\n\x1d\x42kprlistaccounteventsResponse\x12\x30\n\x06\x65vents\x18\x01 \x03(\x0b\x32 .cln.BkprlistaccounteventsEvents\"\xcd\x05\n\x1b\x42kprlistaccounteventsEvents\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12S\n\titem_type\x18\x02 \x01(\x0e\x32@.cln.BkprlistaccounteventsEvents.BkprlistaccounteventsEventsType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\t \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\n \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x05\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x07\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x08\x88\x01\x01\x12\x19\n\x0c\x63urrencyrate\x18\x11 \x01(\x01H\t\x88\x01\x01\"J\n\x1f\x42kprlistaccounteventsEventsType\x12\x0f\n\x0bONCHAIN_FEE\x10\x00\x12\t\n\x05\x43HAIN\x10\x01\x12\x0b\n\x07\x43HANNEL\x10\x02\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0e\n\x0c_descriptionB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_idB\x0f\n\r_currencyrate\"\x19\n\x17\x42kprlistbalancesRequest\"K\n\x18\x42kprlistbalancesResponse\x12/\n\x08\x61\x63\x63ounts\x18\x01 \x03(\x0b\x32\x1d.cln.BkprlistbalancesAccounts\"\xc6\x02\n\x18\x42kprlistbalancesAccounts\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x37\n\x08\x62\x61lances\x18\x02 \x03(\x0b\x32%.cln.BkprlistbalancesAccountsBalances\x12\x14\n\x07peer_id\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x16\n\twe_opened\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x1b\n\x0e\x61\x63\x63ount_closed\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x1d\n\x10\x61\x63\x63ount_resolved\x18\x06 \x01(\x08H\x03\x88\x01\x01\x12\x1e\n\x11resolved_at_block\x18\x07 \x01(\rH\x04\x88\x01\x01\x42\n\n\x08_peer_idB\x0c\n\n_we_openedB\x11\n\x0f_account_closedB\x13\n\x11_account_resolvedB\x14\n\x12_resolved_at_block\"X\n BkprlistbalancesAccountsBalances\x12!\n\x0c\x62\x61lance_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\tcoin_type\x18\x02 \x01(\t\"\x97\x01\n\x15\x42kprlistincomeRequest\x12\x1d\n\x10\x63onsolidate_fees\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x17\n\nstart_time\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x03 \x01(\rH\x02\x88\x01\x01\x42\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"P\n\x16\x42kprlistincomeResponse\x12\x36\n\rincome_events\x18\x01 \x03(\x0b\x32\x1f.cln.BkprlistincomeIncomeEvents\"\xb4\x02\n\x1a\x42kprlistincomeIncomeEvents\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0b\n\x03tag\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x05 \x01(\t\x12\x11\n\ttimestamp\x18\x06 \x01(\r\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\n \x01(\x0cH\x03\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_outpointB\x07\n\x05_txidB\r\n\x0b_payment_id\"P\n%BkpreditdescriptionbypaymentidRequest\x12\x12\n\npayment_id\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"e\n&BkpreditdescriptionbypaymentidResponse\x12;\n\x07updated\x18\x01 \x03(\x0b\x32*.cln.BkpreditdescriptionbypaymentidUpdated\"\xa3\x05\n%BkpreditdescriptionbypaymentidUpdated\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12g\n\titem_type\x18\x02 \x01(\x0e\x32T.cln.BkpreditdescriptionbypaymentidUpdated.BkpreditdescriptionbypaymentidUpdatedType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x15\n\x08outpoint\x18\t \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\n \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\x0b \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\r \x01(\x0cH\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x06\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x07\x88\x01\x01\"C\n)BkpreditdescriptionbypaymentidUpdatedType\x12\t\n\x05\x43HAIN\x10\x00\x12\x0b\n\x07\x43HANNEL\x10\x01\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_id\"M\n$BkpreditdescriptionbyoutpointRequest\x12\x10\n\x08outpoint\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"c\n%BkpreditdescriptionbyoutpointResponse\x12:\n\x07updated\x18\x01 \x03(\x0b\x32).cln.BkpreditdescriptionbyoutpointUpdated\"\x9f\x05\n$BkpreditdescriptionbyoutpointUpdated\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x65\n\titem_type\x18\x02 \x01(\x0e\x32R.cln.BkpreditdescriptionbyoutpointUpdated.BkpreditdescriptionbyoutpointUpdatedType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x15\n\x08outpoint\x18\t \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\n \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\x0b \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\r \x01(\x0cH\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x06\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x07\x88\x01\x01\"B\n(BkpreditdescriptionbyoutpointUpdatedType\x12\t\n\x05\x43HAIN\x10\x00\x12\x0b\n\x07\x43HANNEL\x10\x01\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_id\"\xb0\x01\n\x11\x42kprreportRequest\x12\x13\n\x06\x66ormat\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07headers\x18\x02 \x03(\t\x12\x13\n\x06\x65scape\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nstart_time\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x05 \x01(\rH\x03\x88\x01\x01\x42\t\n\x07_formatB\t\n\x07_escapeB\r\n\x0b_start_timeB\x0b\n\t_end_time\"$\n\x12\x42kprreportResponse\x12\x0e\n\x06report\x18\x01 \x03(\t\"n\n\x14\x42lacklistruneRequest\x12\x12\n\x05start\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x13\n\x06relist\x18\x03 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_endB\t\n\x07_relist\"G\n\x15\x42lacklistruneResponse\x12.\n\tblacklist\x18\x01 \x03(\x0b\x32\x1b.cln.BlacklistruneBlacklist\"4\n\x16\x42lacklistruneBlacklist\x12\r\n\x05start\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\"p\n\x10\x43heckruneRequest\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x13\n\x06nodeid\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06method\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0e\n\x06params\x18\x04 \x03(\tB\t\n\x07_nodeidB\t\n\x07_method\"\"\n\x11\x43heckruneResponse\x12\r\n\x05valid\x18\x01 \x01(\x08\"E\n\x11\x43reateruneRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0crestrictions\x18\x02 \x03(\tB\x07\n\x05_rune\"{\n\x12\x43reateruneResponse\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12&\n\x19warning_unrestricted_rune\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x1c\n\x1a_warning_unrestricted_rune\".\n\x10ShowrunesRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_rune\"7\n\x11ShowrunesResponse\x12\"\n\x05runes\x18\x01 \x03(\x0b\x32\x13.cln.ShowrunesRunes\"\x9d\x02\n\x0eShowrunesRunes\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x35\n\x0crestrictions\x18\x03 \x03(\x0b\x32\x1f.cln.ShowrunesRunesRestrictions\x12\x1f\n\x17restrictions_as_english\x18\x04 \x01(\t\x12\x13\n\x06stored\x18\x05 \x01(\x08H\x00\x88\x01\x01\x12\x18\n\x0b\x62lacklisted\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tlast_used\x18\x07 \x01(\x01H\x02\x88\x01\x01\x12\x15\n\x08our_rune\x18\x08 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_storedB\x0e\n\x0c_blacklistedB\x0c\n\n_last_usedB\x0b\n\t_our_rune\"p\n\x1aShowrunesRunesRestrictions\x12\x41\n\x0c\x61lternatives\x18\x01 \x03(\x0b\x32+.cln.ShowrunesRunesRestrictionsAlternatives\x12\x0f\n\x07\x65nglish\x18\x02 \x01(\t\"n\n&ShowrunesRunesRestrictionsAlternatives\x12\x11\n\tfieldname\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x11\n\tcondition\x18\x03 \x01(\t\x12\x0f\n\x07\x65nglish\x18\x04 \x01(\t\"r\n\x17\x41skreneunreserveRequest\x12\'\n\x04path\x18\x01 \x03(\x0b\x32\x19.cln.AskreneunreservePath\x12\x1b\n\x0e\x64\x65v_remove_all\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x11\n\x0f_dev_remove_all\"\x1a\n\x18\x41skreneunreserveResponse\"t\n\x14\x41skreneunreservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1c\n\x14short_channel_id_dir\x18\x04 \x01(\t\x12\x12\n\x05layer\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"8\n\x18\x41skrenelistlayersRequest\x12\x12\n\x05layer\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"I\n\x19\x41skrenelistlayersResponse\x12,\n\x06layers\x18\x01 \x03(\x0b\x32\x1c.cln.AskrenelistlayersLayers\"\xaa\x03\n\x17\x41skrenelistlayersLayers\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x16\n\x0e\x64isabled_nodes\x18\x02 \x03(\x0c\x12\x45\n\x10\x63reated_channels\x18\x03 \x03(\x0b\x32+.cln.AskrenelistlayersLayersCreatedChannels\x12<\n\x0b\x63onstraints\x18\x04 \x03(\x0b\x32\'.cln.AskrenelistlayersLayersConstraints\x12\x12\n\npersistent\x18\x05 \x01(\x08\x12\x19\n\x11\x64isabled_channels\x18\x06 \x03(\t\x12\x43\n\x0f\x63hannel_updates\x18\x07 \x03(\x0b\x32*.cln.AskrenelistlayersLayersChannelUpdates\x12\x32\n\x06\x62iases\x18\x08 \x03(\x0b\x32\".cln.AskrenelistlayersLayersBiases\x12;\n\x0bnode_biases\x18\t \x03(\x0b\x32&.cln.AskrenelistlayersLayersNodeBiases\"\x9b\x01\n\x1d\x41skrenelistlayersLayersBiases\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x0c\n\x04\x62ias\x18\x02 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x04 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\xa8\x03\n%AskrenelistlayersLayersChannelUpdates\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x14\n\x07\x65nabled\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12+\n\x11htlc_minimum_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1e\n\x11\x63ltv_expiry_delta\x18\x07 \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_enabledB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x14\n\x12_cltv_expiry_delta\"\xda\x01\n\"AskrenelistlayersLayersConstraints\x12&\n\x0cmaximum_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12&\n\x0cminimum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x1c\n\x14short_channel_id_dir\x18\x05 \x01(\t\x12\x16\n\ttimestamp\x18\x06 \x01(\x04H\x02\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msatB\x0c\n\n_timestamp\"\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\"\x91\x01\n!AskrenelistlayersLayersNodeBiases\x12\x0c\n\x04node\x18\x01 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x02 \x01(\x12\x12\x10\n\x08out_bias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x42\x0e\n\x0c_description\"R\n\x19\x41skrenecreatelayerRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x17\n\npersistent\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_persistent\"K\n\x1a\x41skrenecreatelayerResponse\x12-\n\x06layers\x18\x01 \x03(\x0b\x32\x1d.cln.AskrenecreatelayerLayers\"\xb0\x03\n\x18\x41skrenecreatelayerLayers\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x12\n\npersistent\x18\x02 \x01(\x08\x12\x16\n\x0e\x64isabled_nodes\x18\x03 \x03(\x0c\x12\x19\n\x11\x64isabled_channels\x18\x04 \x03(\t\x12\x46\n\x10\x63reated_channels\x18\x05 \x03(\x0b\x32,.cln.AskrenecreatelayerLayersCreatedChannels\x12\x44\n\x0f\x63hannel_updates\x18\x06 \x03(\x0b\x32+.cln.AskrenecreatelayerLayersChannelUpdates\x12=\n\x0b\x63onstraints\x18\x07 \x03(\x0b\x32(.cln.AskrenecreatelayerLayersConstraints\x12\x33\n\x06\x62iases\x18\x08 \x03(\x0b\x32#.cln.AskrenecreatelayerLayersBiases\x12<\n\x0bnode_biases\x18\t \x03(\x0b\x32\'.cln.AskrenecreatelayerLayersNodeBiases\"\x9c\x01\n\x1e\x41skrenecreatelayerLayersBiases\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\x0c\n\x04\x62ias\x18\x02 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x04 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\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\"\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\"\x92\x01\n\"AskrenecreatelayerLayersNodeBiases\x12\x0c\n\x04node\x18\x01 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x02 \x01(\x12\x12\x10\n\x08out_bias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x42\x0e\n\x0c_description\"*\n\x19\x41skreneremovelayerRequest\x12\r\n\x05layer\x18\x01 \x01(\t\"\x1c\n\x1a\x41skreneremovelayerResponse\"P\n!AskreneremovechannelupdateRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\"$\n\"AskreneremovechannelupdateResponse\">\n\x15\x41skrenereserveRequest\x12%\n\x04path\x18\x01 \x03(\x0b\x32\x17.cln.AskrenereservePath\"\x18\n\x16\x41skrenereserveResponse\"r\n\x12\x41skrenereservePath\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1c\n\x14short_channel_id_dir\x18\x04 \x01(\t\x12\x12\n\x05layer\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_layer\"2\n\x11\x41skreneageRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0e\n\x06\x63utoff\x18\x02 \x01(\x04\"8\n\x12\x41skreneageResponse\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x13\n\x0bnum_removed\x18\x02 \x01(\x04\"\xe7\x01\n\x10GetroutesRequest\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12 \n\x0bmaxfee_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\nfinal_cltv\x18\x07 \x01(\r\x12\x15\n\x08maxdelay\x18\x08 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08maxparts\x18\t \x01(\rH\x01\x88\x01\x01\x42\x0b\n\t_maxdelayB\x0b\n\t_maxparts\"R\n\x11GetroutesResponse\x12\x17\n\x0fprobability_ppm\x18\x01 \x01(\x04\x12$\n\x06routes\x18\x02 \x03(\x0b\x32\x14.cln.GetroutesRoutes\"\x88\x01\n\x0fGetroutesRoutes\x12\x17\n\x0fprobability_ppm\x18\x01 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x04path\x18\x03 \x03(\x0b\x32\x18.cln.GetroutesRoutesPath\x12\x12\n\nfinal_cltv\x18\x04 \x01(\r\"\xd4\x03\n\x13GetroutesRoutesPath\x12)\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountB\x02\x18\x01H\x00\x88\x01\x01\x12\x1d\n\x0cnext_node_id\x18\x04 \x01(\x0c\x42\x02\x18\x01H\x01\x88\x01\x01\x12\x16\n\x05\x64\x65lay\x18\x05 \x01(\rB\x02\x18\x01H\x02\x88\x01\x01\x12\x1c\n\x14short_channel_id_dir\x18\x06 \x01(\t\x12(\n\x0e\x61mount_in_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12)\n\x0f\x61mount_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x17\n\nnode_id_in\x18\t \x01(\x0cH\x05\x88\x01\x01\x12\x18\n\x0bnode_id_out\x18\n \x01(\x0cH\x06\x88\x01\x01\x12\x14\n\x07\x63ltv_in\x18\x0b \x01(\rH\x07\x88\x01\x01\x12\x15\n\x08\x63ltv_out\x18\x0c \x01(\rH\x08\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0f\n\r_next_node_idB\x08\n\x06_delayB\x11\n\x0f_amount_in_msatB\x12\n\x10_amount_out_msatB\r\n\x0b_node_id_inB\x0e\n\x0c_node_id_outB\n\n\x08_cltv_inB\x0b\n\t_cltv_out\"8\n\x19\x41skrenedisablenodeRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\"\x1c\n\x1a\x41skrenedisablenodeResponse\"\x8a\x02\n\x1b\x41skreneinformchannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x06 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12K\n\x06inform\x18\x08 \x01(\x0e\x32;.cln.AskreneinformchannelRequest.AskreneinformchannelInform\"O\n\x1a\x41skreneinformchannelInform\x12\x0f\n\x0b\x43ONSTRAINED\x10\x00\x12\x11\n\rUNCONSTRAINED\x10\x01\x12\r\n\tSUCCEEDED\x10\x02\"Y\n\x1c\x41skreneinformchannelResponse\x12\x39\n\x0b\x63onstraints\x18\x02 \x03(\x0b\x32$.cln.AskreneinformchannelConstraints\"\xd3\x01\n\x1f\x41skreneinformchannelConstraints\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12\r\n\x05layer\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\x04\x12&\n\x0cmaximum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12&\n\x0cminimum_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x42\x0f\n\r_maximum_msatB\x0f\n\r_minimum_msat\"\x8f\x01\n\x1b\x41skrenecreatechannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x03 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x04 \x01(\t\x12\"\n\rcapacity_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"\x1e\n\x1c\x41skrenecreatechannelResponse\"\xad\x03\n\x1b\x41skreneupdatechannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x14\n\x07\x65nabled\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12+\n\x11htlc_minimum_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x1e\n\x11\x63ltv_expiry_delta\x18\x08 \x01(\rH\x05\x88\x01\x01\x42\n\n\x08_enabledB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x14\n\x12_cltv_expiry_delta\"\x1e\n\x1c\x41skreneupdatechannelResponse\"\xa4\x01\n\x19\x41skrenebiaschannelRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x0c\n\x04\x62ias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08relative\x18\x05 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_relative\"K\n\x1a\x41skrenebiaschannelResponse\x12-\n\x06\x62iases\x18\x01 \x03(\x0b\x32\x1d.cln.AskrenebiaschannelBiases\"\xa5\x01\n\x18\x41skrenebiaschannelBiases\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x1c\n\x14short_channel_id_dir\x18\x02 \x01(\t\x12\x0c\n\x04\x62ias\x18\x03 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x16\n\ttimestamp\x18\x05 \x01(\x04H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0c\n\n_timestamp\"\xa4\x01\n\x16\x41skrenebiasnodeRequest\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x11\n\tdirection\x18\x03 \x01(\t\x12\x0c\n\x04\x62ias\x18\x04 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08relative\x18\x06 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_relative\"N\n\x17\x41skrenebiasnodeResponse\x12\x33\n\x0bnode_biases\x18\x01 \x03(\x0b\x32\x1e.cln.AskrenebiasnodeNodeBiases\"\x98\x01\n\x19\x41skrenebiasnodeNodeBiases\x12\r\n\x05layer\x18\x01 \x01(\t\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x0f\n\x07in_bias\x18\x03 \x01(\x12\x12\x10\n\x08out_bias\x18\x04 \x01(\x12\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x06 \x01(\x04\x42\x0e\n\x0c_description\" \n\x1e\x41skrenelistreservationsRequest\"a\n\x1f\x41skrenelistreservationsResponse\x12>\n\x0creservations\x18\x01 \x03(\x0b\x32(.cln.AskrenelistreservationsReservations\"\x91\x01\n#AskrenelistreservationsReservations\x12\x1c\n\x14short_channel_id_dir\x18\x01 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x16\n\x0e\x61ge_in_seconds\x18\x03 \x01(\x04\x12\x12\n\ncommand_id\x18\x04 \x01(\t\"\xf5\x02\n\x19InjectpaymentonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x63ltv_expiry\x18\x04 \x01(\r\x12\x0e\n\x06partid\x18\x05 \x01(\x04\x12\x0f\n\x07groupid\x18\x06 \x01(\x04\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12*\n\x10\x64\x65stination_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x0b \x01(\x0cH\x04\x88\x01\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x10\n\x0e_localinvreqidB\x13\n\x11_destination_msatB\x0e\n\x0c_destination\"w\n\x1aInjectpaymentonionResponse\x12\x12\n\ncreated_at\x18\x01 \x01(\x04\x12\x14\n\x0c\x63ompleted_at\x18\x02 \x01(\x04\x12\x15\n\rcreated_index\x18\x03 \x01(\x04\x12\x18\n\x10payment_preimage\x18\x04 \x01(\x0c\">\n\x19InjectonionmessageRequest\x12\x10\n\x08path_key\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x1c\n\x1aInjectonionmessageResponse\"\xbb\x03\n\x0bXpayRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12&\n\x0cpartial_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x17\n\npayer_note\x18\x08 \x01(\tH\x05\x88\x01\x01\x12\x12\n\x05label\x18\t \x01(\tH\x06\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\n \x01(\x0cH\x07\x88\x01\x01\x12\x1b\n\x0e\x64\x65v_use_shadow\x18\x0b \x01(\x08H\x08\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0f\n\r_partial_msatB\x0b\n\t_maxdelayB\r\n\x0b_payer_noteB\x08\n\x06_labelB\x10\n\x0e_localinvreqidB\x11\n\x0f_dev_use_shadow\"\xa1\x01\n\x0cXpayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x14\n\x0c\x66\x61iled_parts\x18\x02 \x01(\x04\x12\x18\n\x10successful_parts\x18\x03 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"=\n\x19SignmessagewithkeyRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"`\n\x1aSignmessagewithkeyResponse\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\x0e\n\x06\x62\x61se64\x18\x04 \x01(\t\"\xcd\x01\n\x17ListchannelmovesRequest\x12\x46\n\x05index\x18\x01 \x01(\x0e\x32\x32.cln.ListchannelmovesRequest.ListchannelmovesIndexH\x00\x88\x01\x01\x12\x12\n\x05start\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\"$\n\x15ListchannelmovesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"S\n\x18ListchannelmovesResponse\x12\x37\n\x0c\x63hannelmoves\x18\x01 \x03(\x0b\x32!.cln.ListchannelmovesChannelmoves\"\xa9\x04\n\x1cListchannelmovesChannelmoves\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x12\n\naccount_id\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12]\n\x0bprimary_tag\x18\x06 \x01(\x0e\x32H.cln.ListchannelmovesChannelmoves.ListchannelmovesChannelmovesPrimaryTag\x12\x19\n\x0cpayment_hash\x18\x07 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x07part_id\x18\x08 \x01(\x04H\x01\x88\x01\x01\x12\x15\n\x08group_id\x18\t \x01(\x04H\x02\x88\x01\x01\x12\x1e\n\tfees_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\"\x96\x01\n&ListchannelmovesChannelmovesPrimaryTag\x12\x0b\n\x07INVOICE\x10\x00\x12\n\n\x06ROUTED\x10\x01\x12\n\n\x06PUSHED\x10\x02\x12\r\n\tLEASE_FEE\x10\x03\x12\x14\n\x10\x43HANNEL_PROPOSED\x10\x04\x12\x0f\n\x0bPENALTY_ADJ\x10\x05\x12\x11\n\rJOURNAL_ENTRY\x10\x06\x42\x0f\n\r_payment_hashB\n\n\x08_part_idB\x0b\n\t_group_id\"\xc5\x01\n\x15ListchainmovesRequest\x12\x42\n\x05index\x18\x01 \x01(\x0e\x32..cln.ListchainmovesRequest.ListchainmovesIndexH\x00\x88\x01\x01\x12\x12\n\x05start\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\"\"\n\x13ListchainmovesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"K\n\x16ListchainmovesResponse\x12\x31\n\nchainmoves\x18\x01 \x03(\x0b\x32\x1d.cln.ListchainmovesChainmoves\"\xd4\x06\n\x18ListchainmovesChainmoves\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x12\n\naccount_id\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12U\n\x0bprimary_tag\x18\x06 \x01(\x0e\x32@.cln.ListchainmovesChainmoves.ListchainmovesChainmovesPrimaryTag\x12\x14\n\x07peer_id\x18\x08 \x01(\x0cH\x00\x88\x01\x01\x12 \n\x13originating_account\x18\t \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rspending_txid\x18\n \x01(\x0cH\x02\x88\x01\x01\x12\x1b\n\x04utxo\x18\x0b \x01(\x0b\x32\r.cln.Outpoint\x12\x19\n\x0cpayment_hash\x18\x0c \x01(\x0cH\x03\x88\x01\x01\x12 \n\x0boutput_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x0coutput_count\x18\x0e \x01(\rH\x04\x88\x01\x01\x12\x13\n\x0b\x62lockheight\x18\x0f \x01(\r\x12\x12\n\nextra_tags\x18\x10 \x03(\t\"\x95\x02\n\"ListchainmovesChainmovesPrimaryTag\x12\x0b\n\x07\x44\x45POSIT\x10\x00\x12\x0e\n\nWITHDRAWAL\x10\x01\x12\x0b\n\x07PENALTY\x10\x02\x12\x10\n\x0c\x43HANNEL_OPEN\x10\x03\x12\x11\n\rCHANNEL_CLOSE\x10\x04\x12\x11\n\rDELAYED_TO_US\x10\x05\x12\x0b\n\x07HTLC_TX\x10\x06\x12\x10\n\x0cHTLC_TIMEOUT\x10\x07\x12\x10\n\x0cHTLC_FULFILL\x10\x08\x12\r\n\tTO_WALLET\x10\t\x12\n\n\x06\x41NCHOR\x10\n\x12\x0b\n\x07TO_THEM\x10\x0b\x12\r\n\tPENALIZED\x10\x0c\x12\n\n\x06STOLEN\x10\r\x12\x0b\n\x07IGNORED\x10\x0e\x12\x0c\n\x08TO_MINER\x10\x0f\x42\n\n\x08_peer_idB\x16\n\x14_originating_accountB\x10\n\x0e_spending_txidB\x0f\n\r_payment_hashB\x0f\n\r_output_count\"\xe9\x01\n\x18ListnetworkeventsRequest\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12H\n\x05index\x18\x02 \x01(\x0e\x32\x34.cln.ListnetworkeventsRequest.ListnetworkeventsIndexH\x01\x88\x01\x01\x12\x12\n\x05start\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12\x12\n\x05limit\x18\x04 \x01(\rH\x03\x88\x01\x01\"%\n\x16ListnetworkeventsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x42\x05\n\x03_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"W\n\x19ListnetworkeventsResponse\x12:\n\rnetworkevents\x18\x01 \x03(\x0b\x32#.cln.ListnetworkeventsNetworkevents\"\xf2\x01\n\x1eListnetworkeventsNetworkevents\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x0f\n\x07peer_id\x18\x03 \x01(\x0c\x12\x11\n\titem_type\x18\x04 \x01(\t\x12\x13\n\x06reason\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rduration_nsec\x18\x06 \x01(\x04H\x01\x88\x01\x01\x12\x1e\n\x11\x63onnect_attempted\x18\x07 \x01(\x08H\x02\x88\x01\x01\x42\t\n\x07_reasonB\x10\n\x0e_duration_nsecB\x14\n\x12_connect_attempted\"/\n\x16\x44\x65lnetworkeventRequest\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\"\x19\n\x17\x44\x65lnetworkeventResponse\"\xf6\x01\n\x1a\x43lnrestregisterpathRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x12\n\nrpc_method\x18\x02 \x01(\t\x12H\n\x11rune_restrictions\x18\x03 \x01(\x0b\x32(.cln.ClnrestregisterpathRuneRestrictionsH\x00\x88\x01\x01\x12\x1a\n\rrune_required\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x0bhttp_method\x18\x05 \x01(\tH\x02\x88\x01\x01\x42\x14\n\x12_rune_restrictionsB\x10\n\x0e_rune_requiredB\x0e\n\x0c_http_method\"\x1d\n\x1b\x43lnrestregisterpathResponse\"\xda\x01\n#ClnrestregisterpathRuneRestrictions\x12\x13\n\x06nodeid\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06method\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x44\n\x06params\x18\x03 \x03(\x0b\x32\x34.cln.ClnrestregisterpathRuneRestrictions.ParamsEntry\x1a-\n\x0bParamsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07_nodeidB\t\n\x07_method\",\n\x18ListcurrencyratesRequest\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\"W\n\x19ListcurrencyratesResponse\x12:\n\rcurrencyrates\x18\x01 \x03(\x0b\x32#.cln.ListcurrencyratesCurrencyrates\"@\n\x1eListcurrencyratesCurrencyrates\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x01\":\n\x16\x43urrencyconvertRequest\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x01\x12\x10\n\x08\x63urrency\x18\x02 \x01(\t\"4\n\x17\x43urrencyconvertResponse\x12\x19\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\"G\n\x13\x43urrencyrateRequest\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\x12\x13\n\x06source\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_source\"$\n\x14\x43urrencyrateResponse\x12\x0c\n\x04rate\x18\x01 \x01(\x01\"\x95\x02\n\x11SendamountRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x0e\n\x06layers\x18\x04 \x03(\t\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x17\n\npayer_note\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x12\n\x05label\x18\x08 \x01(\tH\x04\x88\x01\x01\x42\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\r\n\x0b_payer_noteB\x08\n\x06_label\"\xa7\x01\n\x12SendamountResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x14\n\x0c\x66\x61iled_parts\x18\x02 \x01(\x04\x12\x18\n\x10successful_parts\x18\x03 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"e\n\x12\x43reateproofRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12\x11\n\x04note\x18\x02 \x01(\tH\x00\x88\x01\x01\x12 \n\x07include\x18\x03 \x03(\x0b\x32\x0f.cln.ProofFieldB\x07\n\x05_note\"=\n\x13\x43reateproofResponse\x12&\n\x06proofs\x18\x01 \x03(\x0b\x32\x16.cln.CreateproofProofs\"\xb6\x01\n\x11\x43reateproofProofs\x12\x0e\n\x06\x62olt12\x18\x01 \x01(\t\x12.\n\x15offer_fields_included\x18\x02 \x03(\x0b\x32\x0f.cln.ProofField\x12/\n\x16invreq_fields_included\x18\x03 \x03(\x0b\x32\x0f.cln.ProofField\x12\x30\n\x17invoice_fields_included\x18\x04 \x03(\x0b\x32\x0f.cln.ProofField\"\xd7\x02\n\x0fXkeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x0e\n\x06layers\x18\x05 \x03(\t\x12\x16\n\tretry_for\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x07 \x01(\rH\x03\x88\x01\x01\x12\x36\n\textratlvs\x18\x08 \x03(\x0b\x32#.cln.XkeysendRequest.ExtratlvsEntry\x1a\x30\n\x0e\x45xtratlvsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x08\n\x06_labelB\t\n\x07_maxfeeB\x0c\n\n_retry_forB\x0b\n\t_maxdelay\"\xa5\x01\n\x10XkeysendResponse\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\"3\n\x0fGracefulRequest\x12\x14\n\x07timeout\x18\x01 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_timeout\"H\n\x10GracefulResponse\x12\x1d\n\x15pending_htlc_expiries\x18\x01 \x03(\r\x12\x15\n\rpending_peers\x18\x02 \x03(\x0c\"\xc0\x04\n\x0fRecklessRequest\x12%\n\x0b\x61mount_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x35\n\x07\x63ommand\x18\x02 \x01(\x0e\x32$.cln.RecklessRequest.RecklessCommand\x12\x16\n\tdeveloper\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x0f\n\x07options\x18\x04 \x03(\t\x12\x17\n\npayer_note\x18\x05 \x01(\tH\x02\x88\x01\x01\x12@\n\nsubcommand\x18\x06 \x01(\x0e\x32\'.cln.RecklessRequest.RecklessSubcommandH\x03\x88\x01\x01\x12\x13\n\x06target\x18\x07 \x01(\tH\x04\x88\x01\x01\x12\x14\n\x07verbose\x18\x08 \x01(\x08H\x05\x88\x01\x01\"\x97\x01\n\x0fRecklessCommand\x12\x0b\n\x07INSTALL\x10\x00\x12\n\n\x06UPDATE\x10\x01\x12\r\n\tUNINSTALL\x10\x02\x12\x11\n\rLISTAVAILABLE\x10\x03\x12\x11\n\rLISTINSTALLED\x10\x04\x12\n\n\x06\x45NABLE\x10\x05\x12\x0b\n\x07\x44ISABLE\x10\x06\x12\n\n\x06SOURCE\x10\x07\x12\x07\n\x03TIP\x10\x08\x12\x08\n\x04HELP\x10\t\"3\n\x12RecklessSubcommand\x12\x07\n\x03\x41\x44\x44\x10\x00\x12\x08\n\x04LIST\x10\x01\x12\n\n\x06REMOVE\x10\x02\x42\x0e\n\x0c_amount_msatB\x0c\n\n_developerB\r\n\x0b_payer_noteB\r\n\x0b_subcommandB\t\n\x07_targetB\n\n\x08_verbose\"\xca\x03\n\x10RecklessResponse\x12*\n\x07\x64isable\x18\x01 \x01(\x0b\x32\x14.cln.RecklessDisableH\x00\x88\x01\x01\x12(\n\x06\x65nable\x18\x02 \x01(\x0b\x32\x13.cln.RecklessEnableH\x01\x88\x01\x01\x12*\n\x07install\x18\x03 \x01(\x0b\x32\x14.cln.RecklessInstallH\x02\x88\x01\x01\x12\x31\n\rlistavailable\x18\x04 \x03(\x0b\x32\x1a.cln.RecklessListavailable\x12\x31\n\rlistinstalled\x18\x05 \x03(\x0b\x32\x1a.cln.RecklessListinstalled\x12\x0b\n\x03log\x18\x06 \x03(\t\x12\x0f\n\x07sources\x18\x07 \x03(\t\x12\"\n\x03tip\x18\x08 \x01(\x0b\x32\x10.cln.RecklessTipH\x03\x88\x01\x01\x12.\n\tuninstall\x18\t \x01(\x0b\x32\x16.cln.RecklessUninstallH\x04\x88\x01\x01\x12#\n\x06update\x18\n \x03(\x0b\x32\x13.cln.RecklessUpdateB\n\n\x08_disableB\t\n\x07_enableB\n\n\x08_installB\x06\n\x04_tipB\x0c\n\n_uninstall\"&\n\x0fRecklessDisable\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\"%\n\x0eRecklessEnable\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\"k\n\x0fRecklessInstall\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1d\n\x10installed_commit\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x0bplugin_name\x18\x03 \x01(\tB\x13\n\x11_installed_commit\"\xf5\x02\n\x15RecklessListavailable\x12L\n\tinstaller\x18\x01 \x01(\x0e\x32\x39.cln.RecklessListavailable.RecklessListavailableInstaller\x12\x34\n\x08manifest\x18\x02 \x01(\x0b\x32\".cln.RecklessListavailableManifest\x12\x0e\n\x06origin\x18\x03 \x01(\t\x12\x13\n\x0bplugin_name\x18\x04 \x01(\t\"\xb2\x01\n\x1eRecklessListavailableInstaller\x12\x0c\n\x08PYTHONUV\x10\x00\x12\x13\n\x0fPYTHONUVSHEBANG\x10\x01\x12\x12\n\x0ePYTHONUVLEGACY\x10\x02\x12\x0e\n\nPOETRYVENV\x10\x03\x12\x13\n\x0fPYPROJECTVIAPIP\x10\x04\x12\n\n\x06PYTHON\x10\x05\x12\n\n\x06NODEJS\x10\x06\x12\x08\n\x04RUST\x10\x07\x12\x06\n\x02GO\x10\x08\x12\n\n\x06\x43USTOM\x10\t\"\xaa\x02\n\x1dRecklessListavailableManifest\x12\x14\n\x0c\x64\x65pendencies\x18\x01 \x03(\t\x12\x12\n\nentrypoint\x18\x02 \x01(\t\x12\x13\n\x0binstall_cmd\x18\x03 \x03(\t\x12\x18\n\x0binstallable\x18\x04 \x01(\x08H\x00\x88\x01\x01\x12\x1d\n\x10long_description\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05offer\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x10required_options\x18\x07 \x03(\t\x12\x1e\n\x11short_description\x18\x08 \x01(\tH\x03\x88\x01\x01\x42\x0e\n\x0c_installableB\x13\n\x11_long_descriptionB\x08\n\x06_offerB\x14\n\x12_short_description\"\xe3\x01\n\x15RecklessListinstalled\x12\x19\n\x11installation_date\x18\x01 \x01(\t\x12\x19\n\x11installation_time\x18\x02 \x01(\x01\x12\x1d\n\x10installed_commit\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x17\n\x0foriginal_source\x18\x04 \x01(\t\x12\x13\n\x0bplugin_name\x18\x05 \x01(\t\x12\x1d\n\x10requested_commit\x18\x06 \x01(\tH\x01\x88\x01\x01\x42\x13\n\x11_installed_commitB\x13\n\x11_requested_commit\"\xa0\x01\n\x0bRecklessTip\x12 \n\x0b\x61mount_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66\x61iled_parts\x18\x03 \x01(\x04\x12\x18\n\x10payment_preimage\x18\x04 \x01(\x0c\x12\x18\n\x10successful_parts\x18\x05 \x01(\x04\"(\n\x11RecklessUninstall\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\"j\n\x0eRecklessUpdate\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1d\n\x10installed_commit\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x0bplugin_name\x18\x03 \x01(\tB\x13\n\x11_installed_commit\"\x1e\n\x1cStreamBalanceSnapshotRequest\"\x86\x01\n\x1b\x42\x61lanceSnapshotNotification\x12\x0f\n\x07node_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x62lockheight\x18\x02 \x01(\r\x12\x11\n\ttimestamp\x18\x03 \x01(\r\x12.\n\x08\x61\x63\x63ounts\x18\x04 \x03(\x0b\x32\x1c.cln.BalanceSnapshotAccounts\"c\n\x17\x42\x61lanceSnapshotAccounts\x12\x12\n\naccount_id\x18\x01 \x01(\t\x12!\n\x0c\x62\x61lance_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\tcoin_type\x18\x03 \x01(\t\"\x19\n\x17StreamBlockAddedRequest\"6\n\x16\x42lockAddedNotification\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\x0e\n\x06height\x18\x02 \x01(\r\" \n\x1eStreamChannelOpenFailedRequest\"3\n\x1d\x43hannelOpenFailedNotification\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"\x1c\n\x1aStreamChannelOpenedRequest\"w\n\x19\x43hannelOpenedNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12!\n\x0c\x66unding_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\x12\x15\n\rchannel_ready\x18\x04 \x01(\x08\"\"\n StreamChannelStateChangedRequest\"\xc1\x03\n\x1f\x43hannelStateChangedNotification\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x11\n\ttimestamp\x18\x04 \x01(\t\x12)\n\told_state\x18\x05 \x01(\x0e\x32\x11.cln.ChannelStateH\x01\x88\x01\x01\x12$\n\tnew_state\x18\x06 \x01(\x0e\x32\x11.cln.ChannelState\x12L\n\x05\x63\x61use\x18\x07 \x01(\x0e\x32=.cln.ChannelStateChangedNotification.ChannelStateChangedCause\x12\x14\n\x07message\x18\x08 \x01(\tH\x02\x88\x01\x01\"c\n\x18\x43hannelStateChangedCause\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05LOCAL\x10\x01\x12\x08\n\x04USER\x10\x02\x12\n\n\x06REMOTE\x10\x03\x12\x0c\n\x08PROTOCOL\x10\x04\x12\x0b\n\x07ONCHAIN\x10\x05\x42\x13\n\x11_short_channel_idB\x0c\n\n_old_stateB\n\n\x08_message\"\x16\n\x14StreamConnectRequest\"\xbe\x01\n\x17PeerConnectNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x44\n\tdirection\x18\x02 \x01(\x0e\x32\x31.cln.PeerConnectNotification.PeerConnectDirection\x12(\n\x07\x61\x64\x64ress\x18\x03 \x01(\x0b\x32\x17.cln.PeerConnectAddress\"\'\n\x14PeerConnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\x9a\x02\n\x12PeerConnectAddress\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.PeerConnectAddress.PeerConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"c\n\x16PeerConnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x12\r\n\tWEBSOCKET\x10\x05\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"\x1b\n\x19StreamCoinMovementRequest\"\xaf\x0b\n\x18\x43oinMovementNotification\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\tcoin_type\x18\x02 \x01(\t\x12\x0f\n\x07node_id\x18\x03 \x01(\x0c\x12\x41\n\titem_type\x18\x04 \x01(\x0e\x32..cln.CoinMovementNotification.CoinMovementType\x12\x1a\n\rcreated_index\x18\x05 \x01(\x04H\x00\x88\x01\x01\x12\x12\n\naccount_id\x18\x06 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\ttimestamp\x18\t \x01(\x04\x12\x10\n\x04tags\x18\n \x03(\tB\x02\x18\x01\x12N\n\x0bprimary_tag\x18\x0b \x01(\x0e\x32\x34.cln.CoinMovementNotification.CoinMovementPrimaryTagH\x01\x88\x01\x01\x12\x12\n\nextra_tags\x18\x0c \x03(\t\x12\x19\n\x0cpayment_hash\x18\r \x01(\x0cH\x02\x88\x01\x01\x12\x14\n\x07part_id\x18\x0e \x01(\x04H\x03\x88\x01\x01\x12\x15\n\x08group_id\x18\x0f \x01(\x04H\x04\x88\x01\x01\x12#\n\tfees_msat\x18\x10 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12 \n\x04utxo\x18\x11 \x01(\x0b\x32\r.cln.OutpointH\x06\x88\x01\x01\x12\x14\n\x07peer_id\x18\x12 \x01(\x0cH\x07\x88\x01\x01\x12 \n\x13originating_account\x18\x13 \x01(\tH\x08\x88\x01\x01\x12\x15\n\x04txid\x18\x14 \x01(\x0c\x42\x02\x18\x01H\t\x88\x01\x01\x12\x1a\n\rspending_txid\x18\x15 \x01(\x0cH\n\x88\x01\x01\x12\x1a\n\tutxo_txid\x18\x16 \x01(\x0c\x42\x02\x18\x01H\x0b\x88\x01\x01\x12\x15\n\x04vout\x18\x17 \x01(\rB\x02\x18\x01H\x0c\x88\x01\x01\x12%\n\x0boutput_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\r\x88\x01\x01\x12\x19\n\x0coutput_count\x18\x19 \x01(\rH\x0e\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\x1a \x01(\rH\x0f\x88\x01\x01\"\xf7\x02\n\x16\x43oinMovementPrimaryTag\x12\x0b\n\x07\x44\x45POSIT\x10\x00\x12\x0e\n\nWITHDRAWAL\x10\x01\x12\x0b\n\x07PENALTY\x10\x02\x12\x10\n\x0c\x43HANNEL_OPEN\x10\x03\x12\x11\n\rCHANNEL_CLOSE\x10\x04\x12\x11\n\rDELAYED_TO_US\x10\x05\x12\x0b\n\x07HTLC_TX\x10\x06\x12\x10\n\x0cHTLC_TIMEOUT\x10\x07\x12\x10\n\x0cHTLC_FULFILL\x10\x08\x12\r\n\tTO_WALLET\x10\t\x12\n\n\x06\x41NCHOR\x10\n\x12\x0b\n\x07TO_THEM\x10\x0b\x12\r\n\tPENALIZED\x10\x0c\x12\n\n\x06STOLEN\x10\r\x12\x0b\n\x07IGNORED\x10\x0e\x12\x0c\n\x08TO_MINER\x10\x0f\x12\x0b\n\x07INVOICE\x10\x10\x12\n\n\x06ROUTED\x10\x11\x12\n\n\x06PUSHED\x10\x12\x12\r\n\tLEASE_FEE\x10\x13\x12\x14\n\x10\x43HANNEL_PROPOSED\x10\x14\x12\x0f\n\x0bPENALTY_ADJ\x10\x15\x12\x11\n\rJOURNAL_ENTRY\x10\x16\"2\n\x10\x43oinMovementType\x12\x0f\n\x0b\x43HANNEL_MVT\x10\x00\x12\r\n\tCHAIN_MVT\x10\x01\x42\x10\n\x0e_created_indexB\x0e\n\x0c_primary_tagB\x0f\n\r_payment_hashB\n\n\x08_part_idB\x0b\n\t_group_idB\x0c\n\n_fees_msatB\x07\n\x05_utxoB\n\n\x08_peer_idB\x16\n\x14_originating_accountB\x07\n\x05_txidB\x10\n\x0e_spending_txidB\x0c\n\n_utxo_txidB\x07\n\x05_voutB\x0e\n\x0c_output_msatB\x0f\n\r_output_countB\x0e\n\x0c_blockheight\"\x18\n\x16StreamCustomMsgRequest\"9\n\x15\x43ustomMsgNotification\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\" \n\x1eStreamDeprecatedOneshotRequest\"6\n\x1d\x44\x65precatedOneshotNotification\x12\x15\n\rdeprecated_ok\x18\x01 \x01(\x08\"\x19\n\x17StreamDisconnectRequest\"$\n\x16\x44isconnectNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\"\x1b\n\x19StreamForwardEventRequest\"\x88\x05\n\x18\x46orwardEventNotification\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x12\n\nin_channel\x18\x02 \x01(\t\x12\x18\n\x0bout_channel\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x07in_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\x08out_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12@\n\x06status\x18\x07 \x01(\x0e\x32\x30.cln.ForwardEventNotification.ForwardEventStatus\x12\x15\n\x08\x66\x61ilcode\x18\x08 \x01(\rH\x03\x88\x01\x01\x12\x17\n\nfailreason\x18\t \x01(\tH\x04\x88\x01\x01\x12\x43\n\x05style\x18\n \x01(\x0e\x32/.cln.ForwardEventNotification.ForwardEventStyleH\x05\x88\x01\x01\x12\x15\n\rreceived_time\x18\x0b \x01(\x01\x12\x1a\n\rresolved_time\x18\x0c \x01(\x01H\x06\x88\x01\x01\"L\n\x12\x46orwardEventStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"(\n\x11\x46orwardEventStyle\x12\n\n\x06LEGACY\x10\x00\x12\x07\n\x03TLV\x10\x01\x42\x0e\n\x0c_out_channelB\x0b\n\t_out_msatB\x0b\n\t_fee_msatB\x0b\n\t_failcodeB\r\n\x0b_failreasonB\x08\n\x06_styleB\x10\n\x0e_resolved_time\"\x1e\n\x1cStreamInvoiceCreationRequest\"\x8b\x01\n\x1bInvoiceCreationNotification\x12\x1e\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08preimage\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\t\x12\x15\n\x08offer_id\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x42\x07\n\x05_msatB\x0b\n\t_offer_id\"\x1d\n\x1bStreamInvoicePaymentRequest\"\x8b\x01\n\x1aInvoicePaymentNotification\x12\x19\n\x04msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08preimage\x18\x02 \x01(\x0c\x12$\n\x08outpoint\x18\x03 \x01(\x0b\x32\r.cln.OutpointH\x00\x88\x01\x01\x12\r\n\x05label\x18\x04 \x01(\tB\x0b\n\t_outpoint\"\x12\n\x10StreamLogRequest\"\xca\x01\n\x0fLogNotification\x12,\n\x05level\x18\x01 \x01(\x0e\x32\x1d.cln.LogNotification.LogLevel\x12\x0c\n\x04time\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\t\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x0b\n\x03log\x18\x05 \x01(\t\"K\n\x08LogLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05TRACE\x10\x01\x12\t\n\x05\x44\x45\x42UG\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\x0b\n\x07UNUSUAL\x10\x04\x12\n\n\x06\x42ROKEN\x10\x05\"&\n$StreamOnionMessageForwardFailRequest\"\xef\x01\n#OnionMessageForwardFailNotification\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x10\n\x08incoming\x18\x02 \x01(\x0c\x12\x10\n\x08path_key\x18\x03 \x01(\x0c\x12\x15\n\x08outgoing\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x12\x19\n\x0cnext_node_id\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12&\n\x19next_short_channel_id_dir\x18\x06 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_outgoingB\x0f\n\r_next_node_idB\x1c\n\x1a_next_short_channel_id_dir\"\"\n StreamOpenChannelPeerSigsRequest\"J\n\x1fOpenChannelPeerSigsNotification\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_psbt\x18\x02 \x01(\t\"\x1c\n\x1aStreamPluginStartedRequest\"V\n\x19PluginStartedNotification\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\x12\x13\n\x0bplugin_path\x18\x02 \x01(\t\x12\x0f\n\x07methods\x18\x03 \x03(\t\"\x1c\n\x1aStreamPluginStoppedRequest\"V\n\x19PluginStoppedNotification\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\x12\x13\n\x0bplugin_path\x18\x02 \x01(\t\x12\x0f\n\x07methods\x18\x03 \x03(\t\"\x1d\n\x1bStreamSendPayFailureRequest\"b\n\x1aSendPayFailureNotification\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x12\x12\x0f\n\x07message\x18\x02 \x01(\t\x12%\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x17.cln.SendpayFailureData\"\xc1\t\n\x12SendpayFailureData\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x03\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x06\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x12*\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x17\n\ncreated_at\x18\n \x01(\x04H\t\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\n\x88\x01\x01\x12\x45\n\x06status\x18\x0c \x01(\x0e\x32\x30.cln.SendpayFailureData.SendpayFailureDataStatusH\x0b\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x0c\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\r\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x0e\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\x0f\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x11 \x01(\tH\x10\x88\x01\x01\x12\x17\n\nerroronion\x18\x12 \x01(\x0cH\x11\x88\x01\x01\x12\x17\n\nonionreply\x18\x13 \x01(\x0cH\x12\x88\x01\x01\x12\x19\n\x0c\x65rring_index\x18\x14 \x01(\rH\x13\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x15 \x01(\rH\x14\x88\x01\x01\x12\x19\n\x0c\x66\x61ilcodename\x18\x16 \x01(\tH\x15\x88\x01\x01\x12\x18\n\x0b\x65rring_node\x18\x17 \x01(\x0cH\x16\x88\x01\x01\x12\x1b\n\x0e\x65rring_channel\x18\x18 \x01(\tH\x17\x88\x01\x01\x12\x1d\n\x10\x65rring_direction\x18\x19 \x01(\rH\x18\x88\x01\x01\x12\x18\n\x0braw_message\x18\x1a \x01(\x0cH\x19\x88\x01\x01\"A\n\x18SendpayFailureDataStatus\x12\n\n\x06\x46\x41ILED\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x10\n\x0e_created_indexB\x05\n\x03_idB\x0f\n\r_payment_hashB\n\n\x08_groupidB\x10\n\x0e_updated_indexB\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x13\n\x11_amount_sent_msatB\r\n\x0b_created_atB\x0f\n\r_completed_atB\t\n\x07_statusB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_descriptionB\r\n\x0b_erroronionB\r\n\x0b_onionreplyB\x0f\n\r_erring_indexB\x0b\n\t_failcodeB\x0f\n\r_failcodenameB\x0e\n\x0c_erring_nodeB\x11\n\x0f_erring_channelB\x13\n\x11_erring_directionB\x0e\n\x0c_raw_message\"\x1d\n\x1bStreamSendPaySuccessRequest\"\xcc\x05\n\x1aSendPaySuccessNotification\x12\x15\n\rcreated_index\x18\x01 \x01(\x04\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x0f\n\x07groupid\x18\x04 \x01(\x04\x12\x1a\n\rupdated_index\x18\x05 \x01(\x04H\x00\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x02\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12%\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\ncreated_at\x18\n \x01(\x04\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12\x44\n\x06status\x18\x0c \x01(\x0e\x32\x34.cln.SendPaySuccessNotification.SendpaySuccessStatus\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x05\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\x08\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x11 \x01(\tH\t\x88\x01\x01\x12\x17\n\nerroronion\x18\x12 \x01(\x0cH\n\x88\x01\x01\"$\n\x14SendpaySuccessStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\x10\n\x0e_updated_indexB\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x0f\n\r_completed_atB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_descriptionB\r\n\x0b_erroronion\"\x17\n\x15StreamShutdownRequest\"\x16\n\x14ShutdownNotification\"\x16\n\x14StreamWarningRequest\"\xae\x01\n\x13WarningNotification\x12\x34\n\x05level\x18\x01 \x01(\x0e\x32%.cln.WarningNotification.WarningLevel\x12\x0c\n\x04time\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\t\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x0b\n\x03log\x18\x05 \x01(\t\"#\n\x0cWarningLevel\x12\x08\n\x04WARN\x10\x00\x12\t\n\x05\x45RROR\x10\x01\"\x19\n\x17StreamPayPartEndRequest\"\xf1\x03\n\x16PayPartEndNotification\x12<\n\x06status\x18\x01 \x01(\x0e\x32,.cln.PayPartEndNotification.PayPartEndStatus\x12\x10\n\x08\x64uration\x18\x02 \x01(\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x0f\n\x07groupid\x18\x04 \x01(\x04\x12\x0e\n\x06partid\x18\x05 \x01(\x04\x12\x17\n\nfailed_msg\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x61iled_node_id\x18\x07 \x01(\x0cH\x01\x88\x01\x01\x12$\n\x17\x66\x61iled_short_channel_id\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10\x66\x61iled_direction\x18\t \x01(\rH\x03\x88\x01\x01\x12\x17\n\nerror_code\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rerror_message\x18\x0b \x01(\tH\x05\x88\x01\x01\",\n\x10PayPartEndStatus\x12\x0b\n\x07SUCCESS\x10\x00\x12\x0b\n\x07\x46\x41ILURE\x10\x01\x42\r\n\x0b_failed_msgB\x11\n\x0f_failed_node_idB\x1a\n\x18_failed_short_channel_idB\x13\n\x11_failed_directionB\r\n\x0b_error_codeB\x10\n\x0e_error_message\"\x1b\n\x19StreamPayPartStartRequest\"\xc2\x01\n\x18PayPartStartNotification\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x0e\n\x06partid\x18\x03 \x01(\x04\x12\'\n\x12total_payment_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x0c\x61ttempt_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x04hops\x18\x06 \x03(\x0b\x32\x15.cln.PayPartStartHops\"\x9f\x01\n\x10PayPartStartHops\x12\x11\n\tnext_node\x18\x01 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x02 \x01(\t\x12\x11\n\tdirection\x18\x03 \x01(\r\x12$\n\x0f\x63hannel_in_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x63hannel_out_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"\x1a\n\x18StreamRecklessLogRequest\"\xda\x01\n\x17RecklessLogNotification\x12<\n\x05level\x18\x01 \x01(\x0e\x32-.cln.RecklessLogNotification.RecklessLogLevel\x12\x0b\n\x03log\x18\x02 \x01(\t\x12\x0c\n\x04time\x18\x03 \x01(\t\x12\x11\n\ttimestamp\x18\x04 \x01(\t\"S\n\x10RecklessLogLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05TRACE\x10\x01\x12\t\n\x05\x44\x45\x42UG\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\x0b\n\x07UNUSUAL\x10\x04\x12\n\n\x06\x42ROKEN\x10\x05\x32\xcei\n\x04Node\x12\x36\n\x07Getinfo\x12\x13.cln.GetinfoRequest\x1a\x14.cln.GetinfoResponse\"\x00\x12<\n\tListPeers\x12\x15.cln.ListpeersRequest\x1a\x16.cln.ListpeersResponse\"\x00\x12<\n\tListFunds\x12\x15.cln.ListfundsRequest\x1a\x16.cln.ListfundsResponse\"\x00\x12\x36\n\x07SendPay\x12\x13.cln.SendpayRequest\x1a\x14.cln.SendpayResponse\"\x00\x12\x45\n\x0cListChannels\x12\x18.cln.ListchannelsRequest\x1a\x19.cln.ListchannelsResponse\"\x00\x12<\n\tAddGossip\x12\x15.cln.AddgossipRequest\x1a\x16.cln.AddgossipResponse\"\x00\x12H\n\rAddPsbtOutput\x12\x19.cln.AddpsbtoutputRequest\x1a\x1a.cln.AddpsbtoutputResponse\"\x00\x12H\n\rAutoCleanOnce\x12\x19.cln.AutocleanonceRequest\x1a\x1a.cln.AutocleanonceResponse\"\x00\x12N\n\x0f\x41utoCleanStatus\x12\x1b.cln.AutocleanstatusRequest\x1a\x1c.cln.AutocleanstatusResponse\"\x00\x12\x45\n\x0c\x43heckMessage\x12\x18.cln.CheckmessageRequest\x1a\x19.cln.CheckmessageResponse\"\x00\x12\x30\n\x05\x43lose\x12\x11.cln.CloseRequest\x1a\x12.cln.CloseResponse\"\x00\x12:\n\x0b\x43onnectPeer\x12\x13.cln.ConnectRequest\x1a\x14.cln.ConnectResponse\"\x00\x12H\n\rCreateInvoice\x12\x19.cln.CreateinvoiceRequest\x1a\x1a.cln.CreateinvoiceResponse\"\x00\x12<\n\tDatastore\x12\x15.cln.DatastoreRequest\x1a\x16.cln.DatastoreResponse\"\x00\x12K\n\x0e\x44\x61tastoreUsage\x12\x1a.cln.DatastoreusageRequest\x1a\x1b.cln.DatastoreusageResponse\"\x00\x12\x42\n\x0b\x43reateOnion\x12\x17.cln.CreateonionRequest\x1a\x18.cln.CreateonionResponse\"\x00\x12\x45\n\x0c\x44\x65lDatastore\x12\x18.cln.DeldatastoreRequest\x1a\x19.cln.DeldatastoreResponse\"\x00\x12?\n\nDelInvoice\x12\x16.cln.DelinvoiceRequest\x1a\x17.cln.DelinvoiceResponse\"\x00\x12Q\n\x10\x44\x65vForgetChannel\x12\x1c.cln.DevforgetchannelRequest\x1a\x1d.cln.DevforgetchannelResponse\"\x00\x12Q\n\x10\x45mergencyRecover\x12\x1c.cln.EmergencyrecoverRequest\x1a\x1d.cln.EmergencyrecoverResponse\"\x00\x12\x66\n\x17GetEmergencyRecoverData\x12#.cln.GetemergencyrecoverdataRequest\x1a$.cln.GetemergencyrecoverdataResponse\"\x00\x12\x45\n\x0c\x45xposeSecret\x12\x18.cln.ExposesecretRequest\x1a\x19.cln.ExposesecretResponse\"\x00\x12\x36\n\x07Recover\x12\x13.cln.RecoverRequest\x1a\x14.cln.RecoverResponse\"\x00\x12K\n\x0eRecoverChannel\x12\x1a.cln.RecoverchannelRequest\x1a\x1b.cln.RecoverchannelResponse\"\x00\x12\x36\n\x07Invoice\x12\x13.cln.InvoiceRequest\x1a\x14.cln.InvoiceResponse\"\x00\x12Q\n\x14\x43reateInvoiceRequest\x12\x1a.cln.InvoicerequestRequest\x1a\x1b.cln.InvoicerequestResponse\"\x00\x12`\n\x15\x44isableInvoiceRequest\x12!.cln.DisableinvoicerequestRequest\x1a\".cln.DisableinvoicerequestResponse\"\x00\x12Z\n\x13ListInvoiceRequests\x12\x1f.cln.ListinvoicerequestsRequest\x1a .cln.ListinvoicerequestsResponse\"\x00\x12H\n\rListDatastore\x12\x19.cln.ListdatastoreRequest\x1a\x1a.cln.ListdatastoreResponse\"\x00\x12\x45\n\x0cListInvoices\x12\x18.cln.ListinvoicesRequest\x1a\x19.cln.ListinvoicesResponse\"\x00\x12<\n\tSendOnion\x12\x15.cln.SendonionRequest\x1a\x16.cln.SendonionResponse\"\x00\x12\x45\n\x0cListSendPays\x12\x18.cln.ListsendpaysRequest\x1a\x19.cln.ListsendpaysResponse\"\x00\x12Q\n\x10ListTransactions\x12\x1c.cln.ListtransactionsRequest\x1a\x1d.cln.ListtransactionsResponse\"\x00\x12?\n\nMakeSecret\x12\x16.cln.MakesecretRequest\x1a\x17.cln.MakesecretResponse\"\x00\x12*\n\x03Pay\x12\x0f.cln.PayRequest\x1a\x10.cln.PayResponse\"\x00\x12<\n\tListNodes\x12\x15.cln.ListnodesRequest\x1a\x16.cln.ListnodesResponse\"\x00\x12K\n\x0eWaitAnyInvoice\x12\x1a.cln.WaitanyinvoiceRequest\x1a\x1b.cln.WaitanyinvoiceResponse\"\x00\x12\x42\n\x0bWaitInvoice\x12\x17.cln.WaitinvoiceRequest\x1a\x18.cln.WaitinvoiceResponse\"\x00\x12\x42\n\x0bWaitSendPay\x12\x17.cln.WaitsendpayRequest\x1a\x18.cln.WaitsendpayResponse\"\x00\x12\x36\n\x07NewAddr\x12\x13.cln.NewaddrRequest\x1a\x14.cln.NewaddrResponse\"\x00\x12\x39\n\x08Withdraw\x12\x14.cln.WithdrawRequest\x1a\x15.cln.WithdrawResponse\"\x00\x12\x36\n\x07KeySend\x12\x13.cln.KeysendRequest\x1a\x14.cln.KeysendResponse\"\x00\x12\x39\n\x08\x46undPsbt\x12\x14.cln.FundpsbtRequest\x1a\x15.cln.FundpsbtResponse\"\x00\x12\x39\n\x08SendPsbt\x12\x14.cln.SendpsbtRequest\x1a\x15.cln.SendpsbtResponse\"\x00\x12\x39\n\x08SignPsbt\x12\x14.cln.SignpsbtRequest\x1a\x15.cln.SignpsbtResponse\"\x00\x12\x39\n\x08UtxoPsbt\x12\x14.cln.UtxopsbtRequest\x1a\x15.cln.UtxopsbtResponse\"\x00\x12<\n\tTxDiscard\x12\x15.cln.TxdiscardRequest\x1a\x16.cln.TxdiscardResponse\"\x00\x12<\n\tTxPrepare\x12\x15.cln.TxprepareRequest\x1a\x16.cln.TxprepareResponse\"\x00\x12\x33\n\x06TxSend\x12\x12.cln.TxsendRequest\x1a\x13.cln.TxsendResponse\"\x00\x12Q\n\x10ListPeerChannels\x12\x1c.cln.ListpeerchannelsRequest\x1a\x1d.cln.ListpeerchannelsResponse\"\x00\x12W\n\x12ListClosedChannels\x12\x1e.cln.ListclosedchannelsRequest\x1a\x1f.cln.ListclosedchannelsResponse\"\x00\x12\x33\n\x06\x44\x65\x63ode\x12\x12.cln.DecodeRequest\x1a\x13.cln.DecodeResponse\"\x00\x12\x33\n\x06\x44\x65lPay\x12\x12.cln.DelpayRequest\x1a\x13.cln.DelpayResponse\"\x00\x12?\n\nDelForward\x12\x16.cln.DelforwardRequest\x1a\x17.cln.DelforwardResponse\"\x00\x12\x45\n\x0c\x44isableOffer\x12\x18.cln.DisableofferRequest\x1a\x19.cln.DisableofferResponse\"\x00\x12\x42\n\x0b\x45nableOffer\x12\x17.cln.EnableofferRequest\x1a\x18.cln.EnableofferResponse\"\x00\x12?\n\nDisconnect\x12\x16.cln.DisconnectRequest\x1a\x17.cln.DisconnectResponse\"\x00\x12\x39\n\x08\x46\x65\x65rates\x12\x14.cln.FeeratesRequest\x1a\x15.cln.FeeratesResponse\"\x00\x12\x42\n\x0b\x46\x65tchBip353\x12\x17.cln.Fetchbip353Request\x1a\x18.cln.Fetchbip353Response\"\x00\x12\x45\n\x0c\x46\x65tchInvoice\x12\x18.cln.FetchinvoiceRequest\x1a\x19.cln.FetchinvoiceResponse\"\x00\x12\x63\n\x16\x43\x61ncelRecurringInvoice\x12\".cln.CancelrecurringinvoiceRequest\x1a#.cln.CancelrecurringinvoiceResponse\"\x00\x12T\n\x11\x46undChannelCancel\x12\x1d.cln.FundchannelCancelRequest\x1a\x1e.cln.FundchannelCancelResponse\"\x00\x12Z\n\x13\x46undChannelComplete\x12\x1f.cln.FundchannelCompleteRequest\x1a .cln.FundchannelCompleteResponse\"\x00\x12\x42\n\x0b\x46undChannel\x12\x17.cln.FundchannelRequest\x1a\x18.cln.FundchannelResponse\"\x00\x12Q\n\x10\x46undChannelStart\x12\x1c.cln.FundchannelStartRequest\x1a\x1d.cln.FundchannelStartResponse\"\x00\x12\x33\n\x06GetLog\x12\x12.cln.GetlogRequest\x1a\x13.cln.GetlogResponse\"\x00\x12\x45\n\x0c\x46underUpdate\x12\x18.cln.FunderupdateRequest\x1a\x19.cln.FunderupdateResponse\"\x00\x12\x39\n\x08GetRoute\x12\x14.cln.GetrouteRequest\x1a\x15.cln.GetrouteResponse\"\x00\x12H\n\rListAddresses\x12\x19.cln.ListaddressesRequest\x1a\x1a.cln.ListaddressesResponse\"\x00\x12\x45\n\x0cListForwards\x12\x18.cln.ListforwardsRequest\x1a\x19.cln.ListforwardsResponse\"\x00\x12?\n\nListOffers\x12\x16.cln.ListoffersRequest\x1a\x17.cln.ListoffersResponse\"\x00\x12\x39\n\x08ListPays\x12\x14.cln.ListpaysRequest\x1a\x15.cln.ListpaysResponse\"\x00\x12<\n\tListHtlcs\x12\x15.cln.ListhtlcsRequest\x1a\x16.cln.ListhtlcsResponse\"\x00\x12Q\n\x10MultiFundChannel\x12\x1c.cln.MultifundchannelRequest\x1a\x1d.cln.MultifundchannelResponse\"\x00\x12H\n\rMultiWithdraw\x12\x19.cln.MultiwithdrawRequest\x1a\x1a.cln.MultiwithdrawResponse\"\x00\x12\x30\n\x05Offer\x12\x11.cln.OfferRequest\x1a\x12.cln.OfferResponse\"\x00\x12Q\n\x10OpenChannelAbort\x12\x1c.cln.OpenchannelAbortRequest\x1a\x1d.cln.OpenchannelAbortResponse\"\x00\x12N\n\x0fOpenChannelBump\x12\x1b.cln.OpenchannelBumpRequest\x1a\x1c.cln.OpenchannelBumpResponse\"\x00\x12N\n\x0fOpenChannelInit\x12\x1b.cln.OpenchannelInitRequest\x1a\x1c.cln.OpenchannelInitResponse\"\x00\x12T\n\x11OpenChannelSigned\x12\x1d.cln.OpenchannelSignedRequest\x1a\x1e.cln.OpenchannelSignedResponse\"\x00\x12T\n\x11OpenChannelUpdate\x12\x1d.cln.OpenchannelUpdateRequest\x1a\x1e.cln.OpenchannelUpdateResponse\"\x00\x12-\n\x04Ping\x12\x10.cln.PingRequest\x1a\x11.cln.PingResponse\"\x00\x12\x33\n\x06Plugin\x12\x12.cln.PluginRequest\x1a\x13.cln.PluginResponse\"\x00\x12H\n\rRenePayStatus\x12\x19.cln.RenepaystatusRequest\x1a\x1a.cln.RenepaystatusResponse\"\x00\x12\x36\n\x07RenePay\x12\x13.cln.RenepayRequest\x1a\x14.cln.RenepayResponse\"\x00\x12H\n\rReserveInputs\x12\x19.cln.ReserveinputsRequest\x1a\x1a.cln.ReserveinputsResponse\"\x00\x12H\n\rSendCustomMsg\x12\x19.cln.SendcustommsgRequest\x1a\x1a.cln.SendcustommsgResponse\"\x00\x12\x42\n\x0bSendInvoice\x12\x17.cln.SendinvoiceRequest\x1a\x18.cln.SendinvoiceResponse\"\x00\x12?\n\nSetChannel\x12\x16.cln.SetchannelRequest\x1a\x17.cln.SetchannelResponse\"\x00\x12<\n\tSetConfig\x12\x15.cln.SetconfigRequest\x1a\x16.cln.SetconfigResponse\"\x00\x12K\n\x0eSetPsbtVersion\x12\x1a.cln.SetpsbtversionRequest\x1a\x1b.cln.SetpsbtversionResponse\"\x00\x12\x42\n\x0bSignInvoice\x12\x17.cln.SigninvoiceRequest\x1a\x18.cln.SigninvoiceResponse\"\x00\x12\x42\n\x0bSignMessage\x12\x17.cln.SignmessageRequest\x1a\x18.cln.SignmessageResponse\"\x00\x12?\n\nSpliceInit\x12\x16.cln.SpliceInitRequest\x1a\x17.cln.SpliceInitResponse\"\x00\x12\x45\n\x0cSpliceSigned\x12\x18.cln.SpliceSignedRequest\x1a\x19.cln.SpliceSignedResponse\"\x00\x12\x45\n\x0cSpliceUpdate\x12\x18.cln.SpliceUpdateRequest\x1a\x19.cln.SpliceUpdateResponse\"\x00\x12\x39\n\x08SpliceIn\x12\x14.cln.SpliceinRequest\x1a\x15.cln.SpliceinResponse\"\x00\x12<\n\tSpliceOut\x12\x15.cln.SpliceoutRequest\x1a\x16.cln.SpliceoutResponse\"\x00\x12<\n\tDevSplice\x12\x15.cln.DevspliceRequest\x1a\x16.cln.DevspliceResponse\"\x00\x12N\n\x0fUnreserveInputs\x12\x1b.cln.UnreserveinputsRequest\x1a\x1c.cln.UnreserveinputsResponse\"\x00\x12H\n\rUpgradeWallet\x12\x19.cln.UpgradewalletRequest\x1a\x1a.cln.UpgradewalletResponse\"\x00\x12N\n\x0fWaitBlockHeight\x12\x1b.cln.WaitblockheightRequest\x1a\x1c.cln.WaitblockheightResponse\"\x00\x12-\n\x04Wait\x12\x10.cln.WaitRequest\x1a\x11.cln.WaitResponse\"\x00\x12\x42\n\x0bListConfigs\x12\x17.cln.ListconfigsRequest\x1a\x18.cln.ListconfigsResponse\"\x00\x12-\n\x04Stop\x12\x10.cln.StopRequest\x1a\x11.cln.StopResponse\"\x00\x12-\n\x04Help\x12\x10.cln.HelpRequest\x1a\x11.cln.HelpResponse\"\x00\x12T\n\x11PreApproveKeysend\x12\x1d.cln.PreapprovekeysendRequest\x1a\x1e.cln.PreapprovekeysendResponse\"\x00\x12T\n\x11PreApproveInvoice\x12\x1d.cln.PreapproveinvoiceRequest\x1a\x1e.cln.PreapproveinvoiceResponse\"\x00\x12\x45\n\x0cStaticBackup\x12\x18.cln.StaticbackupRequest\x1a\x19.cln.StaticbackupResponse\"\x00\x12N\n\x0f\x42kprChannelsApy\x12\x1b.cln.BkprchannelsapyRequest\x1a\x1c.cln.BkprchannelsapyResponse\"\x00\x12T\n\x11\x42kprDumpIncomeCsv\x12\x1d.cln.BkprdumpincomecsvRequest\x1a\x1e.cln.BkprdumpincomecsvResponse\"\x00\x12\x42\n\x0b\x42kprInspect\x12\x17.cln.BkprinspectRequest\x1a\x18.cln.BkprinspectResponse\"\x00\x12`\n\x15\x42kprListAccountEvents\x12!.cln.BkprlistaccounteventsRequest\x1a\".cln.BkprlistaccounteventsResponse\"\x00\x12Q\n\x10\x42kprListBalances\x12\x1c.cln.BkprlistbalancesRequest\x1a\x1d.cln.BkprlistbalancesResponse\"\x00\x12K\n\x0e\x42kprListIncome\x12\x1a.cln.BkprlistincomeRequest\x1a\x1b.cln.BkprlistincomeResponse\"\x00\x12{\n\x1e\x42kprEditDescriptionByPaymentId\x12*.cln.BkpreditdescriptionbypaymentidRequest\x1a+.cln.BkpreditdescriptionbypaymentidResponse\"\x00\x12x\n\x1d\x42kprEditDescriptionByOutpoint\x12).cln.BkpreditdescriptionbyoutpointRequest\x1a*.cln.BkpreditdescriptionbyoutpointResponse\"\x00\x12?\n\nBkprReport\x12\x16.cln.BkprreportRequest\x1a\x17.cln.BkprreportResponse\"\x00\x12H\n\rBlacklistRune\x12\x19.cln.BlacklistruneRequest\x1a\x1a.cln.BlacklistruneResponse\"\x00\x12<\n\tCheckRune\x12\x15.cln.CheckruneRequest\x1a\x16.cln.CheckruneResponse\"\x00\x12?\n\nCreateRune\x12\x16.cln.CreateruneRequest\x1a\x17.cln.CreateruneResponse\"\x00\x12<\n\tShowRunes\x12\x15.cln.ShowrunesRequest\x1a\x16.cln.ShowrunesResponse\"\x00\x12Q\n\x10\x41skReneUnreserve\x12\x1c.cln.AskreneunreserveRequest\x1a\x1d.cln.AskreneunreserveResponse\"\x00\x12T\n\x11\x41skReneListLayers\x12\x1d.cln.AskrenelistlayersRequest\x1a\x1e.cln.AskrenelistlayersResponse\"\x00\x12W\n\x12\x41skReneCreateLayer\x12\x1e.cln.AskrenecreatelayerRequest\x1a\x1f.cln.AskrenecreatelayerResponse\"\x00\x12W\n\x12\x41skReneRemoveLayer\x12\x1e.cln.AskreneremovelayerRequest\x1a\x1f.cln.AskreneremovelayerResponse\"\x00\x12o\n\x1a\x41skReneRemoveChannelUpdate\x12&.cln.AskreneremovechannelupdateRequest\x1a\'.cln.AskreneremovechannelupdateResponse\"\x00\x12K\n\x0e\x41skReneReserve\x12\x1a.cln.AskrenereserveRequest\x1a\x1b.cln.AskrenereserveResponse\"\x00\x12?\n\nAskReneAge\x12\x16.cln.AskreneageRequest\x1a\x17.cln.AskreneageResponse\"\x00\x12<\n\tGetRoutes\x12\x15.cln.GetroutesRequest\x1a\x16.cln.GetroutesResponse\"\x00\x12W\n\x12\x41skReneDisableNode\x12\x1e.cln.AskrenedisablenodeRequest\x1a\x1f.cln.AskrenedisablenodeResponse\"\x00\x12]\n\x14\x41skReneInformChannel\x12 .cln.AskreneinformchannelRequest\x1a!.cln.AskreneinformchannelResponse\"\x00\x12]\n\x14\x41skReneCreateChannel\x12 .cln.AskrenecreatechannelRequest\x1a!.cln.AskrenecreatechannelResponse\"\x00\x12]\n\x14\x41skReneUpdateChannel\x12 .cln.AskreneupdatechannelRequest\x1a!.cln.AskreneupdatechannelResponse\"\x00\x12W\n\x12\x41skReneBiasChannel\x12\x1e.cln.AskrenebiaschannelRequest\x1a\x1f.cln.AskrenebiaschannelResponse\"\x00\x12N\n\x0f\x41skreneBiasNode\x12\x1b.cln.AskrenebiasnodeRequest\x1a\x1c.cln.AskrenebiasnodeResponse\"\x00\x12\x66\n\x17\x41skReneListReservations\x12#.cln.AskrenelistreservationsRequest\x1a$.cln.AskrenelistreservationsResponse\"\x00\x12W\n\x12InjectPaymentOnion\x12\x1e.cln.InjectpaymentonionRequest\x1a\x1f.cln.InjectpaymentonionResponse\"\x00\x12W\n\x12InjectOnionMessage\x12\x1e.cln.InjectonionmessageRequest\x1a\x1f.cln.InjectonionmessageResponse\"\x00\x12-\n\x04Xpay\x12\x10.cln.XpayRequest\x1a\x11.cln.XpayResponse\"\x00\x12W\n\x12SignMessageWithKey\x12\x1e.cln.SignmessagewithkeyRequest\x1a\x1f.cln.SignmessagewithkeyResponse\"\x00\x12Q\n\x10ListChannelMoves\x12\x1c.cln.ListchannelmovesRequest\x1a\x1d.cln.ListchannelmovesResponse\"\x00\x12K\n\x0eListChainMoves\x12\x1a.cln.ListchainmovesRequest\x1a\x1b.cln.ListchainmovesResponse\"\x00\x12T\n\x11ListNetworkEvents\x12\x1d.cln.ListnetworkeventsRequest\x1a\x1e.cln.ListnetworkeventsResponse\"\x00\x12N\n\x0f\x44\x65lNetworkEvent\x12\x1b.cln.DelnetworkeventRequest\x1a\x1c.cln.DelnetworkeventResponse\"\x00\x12Z\n\x13\x43lnrestRegisterPath\x12\x1f.cln.ClnrestregisterpathRequest\x1a .cln.ClnrestregisterpathResponse\"\x00\x12T\n\x11ListCurrencyRates\x12\x1d.cln.ListcurrencyratesRequest\x1a\x1e.cln.ListcurrencyratesResponse\"\x00\x12N\n\x0f\x43urrencyConvert\x12\x1b.cln.CurrencyconvertRequest\x1a\x1c.cln.CurrencyconvertResponse\"\x00\x12\x45\n\x0c\x43urrencyRate\x12\x18.cln.CurrencyrateRequest\x1a\x19.cln.CurrencyrateResponse\"\x00\x12?\n\nSendAmount\x12\x16.cln.SendamountRequest\x1a\x17.cln.SendamountResponse\"\x00\x12\x42\n\x0b\x43reateProof\x12\x17.cln.CreateproofRequest\x1a\x18.cln.CreateproofResponse\"\x00\x12\x39\n\x08Xkeysend\x12\x14.cln.XkeysendRequest\x1a\x15.cln.XkeysendResponse\"\x00\x12\x39\n\x08Graceful\x12\x14.cln.GracefulRequest\x1a\x15.cln.GracefulResponse\"\x00\x12\x39\n\x08Reckless\x12\x14.cln.RecklessRequest\x1a\x15.cln.RecklessResponse\"\x00\x12\x63\n\x18SubscribeBalanceSnapshot\x12!.cln.StreamBalanceSnapshotRequest\x1a .cln.BalanceSnapshotNotification\"\x00\x30\x01\x12T\n\x13SubscribeBlockAdded\x12\x1c.cln.StreamBlockAddedRequest\x1a\x1b.cln.BlockAddedNotification\"\x00\x30\x01\x12i\n\x1aSubscribeChannelOpenFailed\x12#.cln.StreamChannelOpenFailedRequest\x1a\".cln.ChannelOpenFailedNotification\"\x00\x30\x01\x12]\n\x16SubscribeChannelOpened\x12\x1f.cln.StreamChannelOpenedRequest\x1a\x1e.cln.ChannelOpenedNotification\"\x00\x30\x01\x12o\n\x1cSubscribeChannelStateChanged\x12%.cln.StreamChannelStateChangedRequest\x1a$.cln.ChannelStateChangedNotification\"\x00\x30\x01\x12O\n\x10SubscribeConnect\x12\x19.cln.StreamConnectRequest\x1a\x1c.cln.PeerConnectNotification\"\x00\x30\x01\x12Z\n\x15SubscribeCoinMovement\x12\x1e.cln.StreamCoinMovementRequest\x1a\x1d.cln.CoinMovementNotification\"\x00\x30\x01\x12Q\n\x12SubscribeCustomMsg\x12\x1b.cln.StreamCustomMsgRequest\x1a\x1a.cln.CustomMsgNotification\"\x00\x30\x01\x12i\n\x1aSubscribeDeprecatedOneshot\x12#.cln.StreamDeprecatedOneshotRequest\x1a\".cln.DeprecatedOneshotNotification\"\x00\x30\x01\x12T\n\x13SubscribeDisconnect\x12\x1c.cln.StreamDisconnectRequest\x1a\x1b.cln.DisconnectNotification\"\x00\x30\x01\x12Z\n\x15SubscribeForwardEvent\x12\x1e.cln.StreamForwardEventRequest\x1a\x1d.cln.ForwardEventNotification\"\x00\x30\x01\x12\x63\n\x18SubscribeInvoiceCreation\x12!.cln.StreamInvoiceCreationRequest\x1a .cln.InvoiceCreationNotification\"\x00\x30\x01\x12`\n\x17SubscribeInvoicePayment\x12 .cln.StreamInvoicePaymentRequest\x1a\x1f.cln.InvoicePaymentNotification\"\x00\x30\x01\x12?\n\x0cSubscribeLog\x12\x15.cln.StreamLogRequest\x1a\x14.cln.LogNotification\"\x00\x30\x01\x12{\n SubscribeOnionMessageForwardFail\x12).cln.StreamOnionMessageForwardFailRequest\x1a(.cln.OnionMessageForwardFailNotification\"\x00\x30\x01\x12o\n\x1cSubscribeOpenChannelPeerSigs\x12%.cln.StreamOpenChannelPeerSigsRequest\x1a$.cln.OpenChannelPeerSigsNotification\"\x00\x30\x01\x12]\n\x16SubscribePluginStarted\x12\x1f.cln.StreamPluginStartedRequest\x1a\x1e.cln.PluginStartedNotification\"\x00\x30\x01\x12]\n\x16SubscribePluginStopped\x12\x1f.cln.StreamPluginStoppedRequest\x1a\x1e.cln.PluginStoppedNotification\"\x00\x30\x01\x12`\n\x17SubscribeSendPayFailure\x12 .cln.StreamSendPayFailureRequest\x1a\x1f.cln.SendPayFailureNotification\"\x00\x30\x01\x12`\n\x17SubscribeSendPaySuccess\x12 .cln.StreamSendPaySuccessRequest\x1a\x1f.cln.SendPaySuccessNotification\"\x00\x30\x01\x12N\n\x11SubscribeShutdown\x12\x1a.cln.StreamShutdownRequest\x1a\x19.cln.ShutdownNotification\"\x00\x30\x01\x12K\n\x10SubscribeWarning\x12\x19.cln.StreamWarningRequest\x1a\x18.cln.WarningNotification\"\x00\x30\x01\x12T\n\x13SubscribePayPartEnd\x12\x1c.cln.StreamPayPartEndRequest\x1a\x1b.cln.PayPartEndNotification\"\x00\x30\x01\x12Z\n\x15SubscribePayPartStart\x12\x1e.cln.StreamPayPartStartRequest\x1a\x1d.cln.PayPartStartNotification\"\x00\x30\x01\x12W\n\x14SubscribeRecklessLog\x12\x1d.cln.StreamRecklessLogRequest\x1a\x1c.cln.RecklessLogNotification\"\x00\x30\x01\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -1101,601 +1101,637 @@ _globals['_LISTCONFIGSRESPONSE']._serialized_start=72109 _globals['_LISTCONFIGSRESPONSE']._serialized_end=72189 _globals['_LISTCONFIGSCONFIGS']._serialized_start=72192 - _globals['_LISTCONFIGSCONFIGS']._serialized_end=79133 - _globals['_LISTCONFIGSCONFIGSACCEPTHTLCTLVTYPE']._serialized_start=79135 - _globals['_LISTCONFIGSCONFIGSACCEPTHTLCTLVTYPE']._serialized_end=79209 - _globals['_LISTCONFIGSCONFIGSADDR']._serialized_start=79211 - _globals['_LISTCONFIGSCONFIGSADDR']._serialized_end=79272 - _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_start=79274 - _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_end=79334 - _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_start=79336 - _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_end=79411 - _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_start=79413 - _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_end=79483 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_start=79485 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_end=79554 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_start=79557 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_end=79813 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_start=79732 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_end=79813 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_start=79815 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_end=79896 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_start=79898 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_end=79969 - _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_start=79971 - _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_end=80048 - _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_start=80050 - _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_end=80116 - _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_start=80118 - _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_end=80183 - _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_start=80185 - _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_end=80246 - _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_start=80248 - _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_end=80312 - _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_start=80314 - _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_end=80378 - _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_start=80380 - _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_end=80444 - _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_start=80446 - _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_end=80520 - _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_start=80522 - _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_end=80587 - _globals['_LISTCONFIGSCONFIGSCONF']._serialized_start=80590 - _globals['_LISTCONFIGSCONFIGSCONF']._serialized_end=80752 - _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_start=80709 - _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_end=80752 - _globals['_LISTCONFIGSCONFIGSCURRENCYRATEADDSOURCE']._serialized_start=80754 - _globals['_LISTCONFIGSCONFIGSCURRENCYRATEADDSOURCE']._serialized_end=80864 - _globals['_LISTCONFIGSCONFIGSCURRENCYRATEDISABLESOURCE']._serialized_start=80866 - _globals['_LISTCONFIGSCONFIGSCURRENCYRATEDISABLESOURCE']._serialized_end=80980 - _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_start=80982 - _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_end=81037 - _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_start=81039 - _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_end=81110 - _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_start=81112 - _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_end=81170 - _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_start=81172 - _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_end=81231 - _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_start=81233 - _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_end=81324 - _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_start=81326 - _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_end=81396 - _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_start=81398 - _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_end=81467 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_start=81469 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_end=81545 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_start=81547 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_end=81616 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_start=81618 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_end=81698 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_start=81700 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_end=81781 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSIMPLECLOSE']._serialized_start=81783 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSIMPLECLOSE']._serialized_end=81855 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_start=81857 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_end=81934 - _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_start=81936 - _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_end=81998 - _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_start=82000 - _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_end=82068 - _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_start=82070 - _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_end=82172 - _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_start=82174 - _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_end=82242 - _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_start=82244 - _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_end=82314 - _globals['_LISTCONFIGSCONFIGSHSMPASSPHRASE']._serialized_start=82316 - _globals['_LISTCONFIGSCONFIGSHSMPASSPHRASE']._serialized_end=82378 - _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_start=82380 - _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_end=82464 - _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_start=82466 - _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_end=82550 - _globals['_LISTCONFIGSCONFIGSIPROMISETOFIXBROKENAPIUSER']._serialized_start=82552 - _globals['_LISTCONFIGSCONFIGSIPROMISETOFIXBROKENAPIUSER']._serialized_end=82635 - _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_start=82637 - _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_end=82708 - _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_start=82710 - _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_end=82782 - _globals['_LISTCONFIGSCONFIGSINVOICESONCHAINFALLBACK']._serialized_start=82784 - _globals['_LISTCONFIGSCONFIGSINVOICESONCHAINFALLBACK']._serialized_end=82856 - _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_start=82858 - _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_end=82920 - _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_start=82922 - _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_end=82989 - _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_start=82991 - _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_end=83055 - _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_start=83057 - _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_end=83120 - _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_start=83122 - _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_end=83186 - _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_start=83188 - _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_end=83257 - _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_start=83259 - _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_end=83315 - _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_start=83317 - _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_end=83390 - _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_start=83392 - _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_end=83484 - _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_start=83486 - _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_end=83566 - _globals['_LISTCONFIGSCONFIGSMESSAGEPADDING']._serialized_start=83568 - _globals['_LISTCONFIGSCONFIGSMESSAGEPADDING']._serialized_end=83638 - _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_start=83640 - _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_end=83743 - _globals['_LISTCONFIGSCONFIGSMINEMERGENCYMSAT']._serialized_start=83745 - _globals['_LISTCONFIGSCONFIGSMINEMERGENCYMSAT']._serialized_end=83830 - _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_start=83832 - _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_end=83894 - _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_start=83896 - _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_end=83952 - _globals['_LISTCONFIGSCONFIGSPAYMENTFRONTINGNODE']._serialized_start=83954 - _globals['_LISTCONFIGSCONFIGSPAYMENTFRONTINGNODE']._serialized_end=84030 - _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_start=84032 - _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_end=84094 - _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_start=84096 - _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_end=84159 - _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_start=84161 - _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_end=84227 - _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_start=84229 - _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_end=84289 - _globals['_LISTCONFIGSCONFIGSRECOVER']._serialized_start=84291 - _globals['_LISTCONFIGSCONFIGSRECOVER']._serialized_end=84353 - _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_start=84355 - _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_end=84411 - _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_start=84413 - _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_end=84491 - _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_start=84493 - _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_end=84554 - _globals['_LISTCONFIGSCONFIGSRGB']._serialized_start=84556 - _globals['_LISTCONFIGSCONFIGSRGB']._serialized_end=84614 - _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_start=84616 - _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_end=84678 - _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_start=84680 - _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_end=84746 - _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_start=84748 - _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_end=84803 - _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_start=84805 - _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_end=84871 - _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_start=84873 - _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_end=84929 - _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_start=84931 - _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_end=85004 - _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_start=85006 - _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_end=85067 - _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_start=85069 - _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_end=85139 - _globals['_STOPREQUEST']._serialized_start=85141 - _globals['_STOPREQUEST']._serialized_end=85154 - _globals['_STOPRESPONSE']._serialized_start=85156 - _globals['_STOPRESPONSE']._serialized_end=85253 - _globals['_STOPRESPONSE_STOPRESULT']._serialized_start=85218 - _globals['_STOPRESPONSE_STOPRESULT']._serialized_end=85253 - _globals['_HELPREQUEST']._serialized_start=85255 - _globals['_HELPREQUEST']._serialized_end=85302 - _globals['_HELPRESPONSE']._serialized_start=85305 - _globals['_HELPRESPONSE']._serialized_end=85454 - _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_start=85410 - _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_end=85438 - _globals['_HELPHELP']._serialized_start=85456 - _globals['_HELPHELP']._serialized_end=85483 - _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_start=85485 - _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_end=85588 - _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_start=85590 - _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_end=85617 - _globals['_PREAPPROVEINVOICEREQUEST']._serialized_start=85619 - _globals['_PREAPPROVEINVOICEREQUEST']._serialized_end=85661 - _globals['_PREAPPROVEINVOICERESPONSE']._serialized_start=85663 - _globals['_PREAPPROVEINVOICERESPONSE']._serialized_end=85690 - _globals['_STATICBACKUPREQUEST']._serialized_start=85692 - _globals['_STATICBACKUPREQUEST']._serialized_end=85713 - _globals['_STATICBACKUPRESPONSE']._serialized_start=85715 - _globals['_STATICBACKUPRESPONSE']._serialized_end=85750 - _globals['_BKPRCHANNELSAPYREQUEST']._serialized_start=85752 - _globals['_BKPRCHANNELSAPYREQUEST']._serialized_end=85852 - _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_start=85854 - _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_end=85934 - _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_start=85937 - _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_end=86826 - _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_start=86829 - _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_end=87039 - _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_start=87042 - _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_end=87254 - _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_start=87168 - _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_end=87254 - _globals['_BKPRINSPECTREQUEST']._serialized_start=87256 - _globals['_BKPRINSPECTREQUEST']._serialized_end=87293 - _globals['_BKPRINSPECTRESPONSE']._serialized_start=87295 - _globals['_BKPRINSPECTRESPONSE']._serialized_end=87350 - _globals['_BKPRINSPECTTXS']._serialized_start=87353 - _globals['_BKPRINSPECTTXS']._serialized_end=87507 - _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_start=87510 - _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_end=87954 - _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_start=87956 - _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_end=88060 - _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_start=88062 - _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_end=88143 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_start=88146 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_end=88863 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_start=88649 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_end=88723 - _globals['_BKPRLISTBALANCESREQUEST']._serialized_start=88865 - _globals['_BKPRLISTBALANCESREQUEST']._serialized_end=88890 - _globals['_BKPRLISTBALANCESRESPONSE']._serialized_start=88892 - _globals['_BKPRLISTBALANCESRESPONSE']._serialized_end=88967 - _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_start=88970 - _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_end=89296 - _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_start=89298 - _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_end=89386 - _globals['_BKPRLISTINCOMEREQUEST']._serialized_start=89389 - _globals['_BKPRLISTINCOMEREQUEST']._serialized_end=89540 - _globals['_BKPRLISTINCOMERESPONSE']._serialized_start=89542 - _globals['_BKPRLISTINCOMERESPONSE']._serialized_end=89622 - _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_start=89625 - _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_end=89933 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_start=89935 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_end=90015 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_start=90017 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_end=90118 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_start=90121 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_end=90796 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_start=90622 - _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_end=90689 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_start=90798 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_end=90875 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_start=90877 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_end=90976 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_start=90979 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_end=91650 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_start=91477 - _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_end=91543 - _globals['_BKPRREPORTREQUEST']._serialized_start=91653 - _globals['_BKPRREPORTREQUEST']._serialized_end=91829 - _globals['_BKPRREPORTRESPONSE']._serialized_start=91831 - _globals['_BKPRREPORTRESPONSE']._serialized_end=91867 - _globals['_BLACKLISTRUNEREQUEST']._serialized_start=91869 - _globals['_BLACKLISTRUNEREQUEST']._serialized_end=91979 - _globals['_BLACKLISTRUNERESPONSE']._serialized_start=91981 - _globals['_BLACKLISTRUNERESPONSE']._serialized_end=92052 - _globals['_BLACKLISTRUNEBLACKLIST']._serialized_start=92054 - _globals['_BLACKLISTRUNEBLACKLIST']._serialized_end=92106 - _globals['_CHECKRUNEREQUEST']._serialized_start=92108 - _globals['_CHECKRUNEREQUEST']._serialized_end=92220 - _globals['_CHECKRUNERESPONSE']._serialized_start=92222 - _globals['_CHECKRUNERESPONSE']._serialized_end=92256 - _globals['_CREATERUNEREQUEST']._serialized_start=92258 - _globals['_CREATERUNEREQUEST']._serialized_end=92327 - _globals['_CREATERUNERESPONSE']._serialized_start=92329 - _globals['_CREATERUNERESPONSE']._serialized_end=92452 - _globals['_SHOWRUNESREQUEST']._serialized_start=92454 - _globals['_SHOWRUNESREQUEST']._serialized_end=92500 - _globals['_SHOWRUNESRESPONSE']._serialized_start=92502 - _globals['_SHOWRUNESRESPONSE']._serialized_end=92557 - _globals['_SHOWRUNESRUNES']._serialized_start=92560 - _globals['_SHOWRUNESRUNES']._serialized_end=92845 - _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_start=92847 - _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_end=92959 - _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_start=92961 - _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_end=93071 - _globals['_ASKRENEUNRESERVEREQUEST']._serialized_start=93073 - _globals['_ASKRENEUNRESERVEREQUEST']._serialized_end=93187 - _globals['_ASKRENEUNRESERVERESPONSE']._serialized_start=93189 - _globals['_ASKRENEUNRESERVERESPONSE']._serialized_end=93215 - _globals['_ASKRENEUNRESERVEPATH']._serialized_start=93217 - _globals['_ASKRENEUNRESERVEPATH']._serialized_end=93333 - _globals['_ASKRENELISTLAYERSREQUEST']._serialized_start=93335 - _globals['_ASKRENELISTLAYERSREQUEST']._serialized_end=93391 - _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_start=93393 - _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_end=93466 - _globals['_ASKRENELISTLAYERSLAYERS']._serialized_start=93469 - _globals['_ASKRENELISTLAYERSLAYERS']._serialized_end=93895 - _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_start=93898 - _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_end=94053 - _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_start=94056 - _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_end=94480 - _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_start=94483 - _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_end=94701 - _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_start=94704 - _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_end=94843 - _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_start=94846 - _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_end=94991 - _globals['_ASKRENECREATELAYERREQUEST']._serialized_start=94993 - _globals['_ASKRENECREATELAYERREQUEST']._serialized_end=95075 - _globals['_ASKRENECREATELAYERRESPONSE']._serialized_start=95077 - _globals['_ASKRENECREATELAYERRESPONSE']._serialized_end=95152 - _globals['_ASKRENECREATELAYERLAYERS']._serialized_start=95155 - _globals['_ASKRENECREATELAYERLAYERS']._serialized_end=95587 - _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_start=95590 - _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_end=95746 - _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_start=95749 - _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_end=96086 - _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_start=96089 - _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_end=96285 - _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_start=96288 - _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_end=96428 - _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_start=96431 - _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_end=96577 - _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_start=96579 - _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_end=96621 - _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_start=96623 - _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_end=96651 - _globals['_ASKRENEREMOVECHANNELUPDATEREQUEST']._serialized_start=96653 - _globals['_ASKRENEREMOVECHANNELUPDATEREQUEST']._serialized_end=96733 - _globals['_ASKRENEREMOVECHANNELUPDATERESPONSE']._serialized_start=96735 - _globals['_ASKRENEREMOVECHANNELUPDATERESPONSE']._serialized_end=96771 - _globals['_ASKRENERESERVEREQUEST']._serialized_start=96773 - _globals['_ASKRENERESERVEREQUEST']._serialized_end=96835 - _globals['_ASKRENERESERVERESPONSE']._serialized_start=96837 - _globals['_ASKRENERESERVERESPONSE']._serialized_end=96861 - _globals['_ASKRENERESERVEPATH']._serialized_start=96863 - _globals['_ASKRENERESERVEPATH']._serialized_end=96977 - _globals['_ASKRENEAGEREQUEST']._serialized_start=96979 - _globals['_ASKRENEAGEREQUEST']._serialized_end=97029 - _globals['_ASKRENEAGERESPONSE']._serialized_start=97031 - _globals['_ASKRENEAGERESPONSE']._serialized_end=97087 - _globals['_GETROUTESREQUEST']._serialized_start=97090 - _globals['_GETROUTESREQUEST']._serialized_end=97321 - _globals['_GETROUTESRESPONSE']._serialized_start=97323 - _globals['_GETROUTESRESPONSE']._serialized_end=97405 - _globals['_GETROUTESROUTES']._serialized_start=97408 - _globals['_GETROUTESROUTES']._serialized_end=97544 - _globals['_GETROUTESROUTESPATH']._serialized_start=97547 - _globals['_GETROUTESROUTESPATH']._serialized_end=98015 - _globals['_ASKRENEDISABLENODEREQUEST']._serialized_start=98017 - _globals['_ASKRENEDISABLENODEREQUEST']._serialized_end=98073 - _globals['_ASKRENEDISABLENODERESPONSE']._serialized_start=98075 - _globals['_ASKRENEDISABLENODERESPONSE']._serialized_end=98103 - _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_start=98106 - _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_end=98372 - _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_start=98293 - _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_end=98372 - _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_start=98374 - _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_end=98463 - _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_start=98466 - _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_end=98677 - _globals['_ASKRENECREATECHANNELREQUEST']._serialized_start=98680 - _globals['_ASKRENECREATECHANNELREQUEST']._serialized_end=98823 - _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_start=98825 - _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_end=98855 - _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_start=98858 - _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_end=99287 - _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_start=99289 - _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_end=99319 - _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_start=99322 - _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_end=99486 - _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_start=99488 - _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_end=99563 - _globals['_ASKRENEBIASCHANNELBIASES']._serialized_start=99566 - _globals['_ASKRENEBIASCHANNELBIASES']._serialized_end=99731 - _globals['_ASKRENEBIASNODEREQUEST']._serialized_start=99734 - _globals['_ASKRENEBIASNODEREQUEST']._serialized_end=99898 - _globals['_ASKRENEBIASNODERESPONSE']._serialized_start=99900 - _globals['_ASKRENEBIASNODERESPONSE']._serialized_end=99978 - _globals['_ASKRENEBIASNODENODEBIASES']._serialized_start=99981 - _globals['_ASKRENEBIASNODENODEBIASES']._serialized_end=100133 - _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_start=100135 - _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_end=100167 - _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_start=100169 - _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_end=100266 - _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_start=100269 - _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_end=100414 - _globals['_INJECTPAYMENTONIONREQUEST']._serialized_start=100417 - _globals['_INJECTPAYMENTONIONREQUEST']._serialized_end=100790 - _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_start=100792 - _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_end=100911 - _globals['_INJECTONIONMESSAGEREQUEST']._serialized_start=100913 - _globals['_INJECTONIONMESSAGEREQUEST']._serialized_end=100975 - _globals['_INJECTONIONMESSAGERESPONSE']._serialized_start=100977 - _globals['_INJECTONIONMESSAGERESPONSE']._serialized_end=101005 - _globals['_XPAYREQUEST']._serialized_start=101008 - _globals['_XPAYREQUEST']._serialized_end=101451 - _globals['_XPAYRESPONSE']._serialized_start=101454 - _globals['_XPAYRESPONSE']._serialized_end=101615 - _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_start=101617 - _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_end=101678 - _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_start=101680 - _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_end=101776 - _globals['_LISTCHANNELMOVESREQUEST']._serialized_start=101779 - _globals['_LISTCHANNELMOVESREQUEST']._serialized_end=101984 - _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_start=101918 - _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_end=101954 - _globals['_LISTCHANNELMOVESRESPONSE']._serialized_start=101986 - _globals['_LISTCHANNELMOVESRESPONSE']._serialized_end=102069 - _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_start=102072 - _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_end=102625 - _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_start=102433 - _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_end=102583 - _globals['_LISTCHAINMOVESREQUEST']._serialized_start=102628 - _globals['_LISTCHAINMOVESREQUEST']._serialized_end=102825 - _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_start=102761 - _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_end=102795 - _globals['_LISTCHAINMOVESRESPONSE']._serialized_start=102827 - _globals['_LISTCHAINMOVESRESPONSE']._serialized_end=102902 - _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_start=102905 - _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_end=103757 - _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_start=103392 - _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_end=103669 - _globals['_LISTNETWORKEVENTSREQUEST']._serialized_start=103760 - _globals['_LISTNETWORKEVENTSREQUEST']._serialized_end=103993 - _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_start=103919 - _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_end=103956 - _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_start=103995 - _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_end=104082 - _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_start=104085 - _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_end=104327 - _globals['_DELNETWORKEVENTREQUEST']._serialized_start=104329 - _globals['_DELNETWORKEVENTREQUEST']._serialized_end=104376 - _globals['_DELNETWORKEVENTRESPONSE']._serialized_start=104378 - _globals['_DELNETWORKEVENTRESPONSE']._serialized_end=104403 - _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_start=104406 - _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_end=104652 - _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_start=104654 - _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_end=104683 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_start=104686 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_end=104904 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_start=104837 - _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_end=104882 - _globals['_LISTCURRENCYRATESREQUEST']._serialized_start=104906 - _globals['_LISTCURRENCYRATESREQUEST']._serialized_end=104950 - _globals['_LISTCURRENCYRATESRESPONSE']._serialized_start=104952 - _globals['_LISTCURRENCYRATESRESPONSE']._serialized_end=105039 - _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_start=105041 - _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_end=105105 - _globals['_CURRENCYCONVERTREQUEST']._serialized_start=105107 - _globals['_CURRENCYCONVERTREQUEST']._serialized_end=105165 - _globals['_CURRENCYCONVERTRESPONSE']._serialized_start=105167 - _globals['_CURRENCYCONVERTRESPONSE']._serialized_end=105219 - _globals['_CURRENCYRATEREQUEST']._serialized_start=105221 - _globals['_CURRENCYRATEREQUEST']._serialized_end=105292 - _globals['_CURRENCYRATERESPONSE']._serialized_start=105294 - _globals['_CURRENCYRATERESPONSE']._serialized_end=105330 - _globals['_SENDAMOUNTREQUEST']._serialized_start=105333 - _globals['_SENDAMOUNTREQUEST']._serialized_end=105610 - _globals['_SENDAMOUNTRESPONSE']._serialized_start=105613 - _globals['_SENDAMOUNTRESPONSE']._serialized_end=105780 - _globals['_CREATEPROOFREQUEST']._serialized_start=105782 - _globals['_CREATEPROOFREQUEST']._serialized_end=105883 - _globals['_CREATEPROOFRESPONSE']._serialized_start=105885 - _globals['_CREATEPROOFRESPONSE']._serialized_end=105946 - _globals['_CREATEPROOFPROOFS']._serialized_start=105949 - _globals['_CREATEPROOFPROOFS']._serialized_end=106131 - _globals['_XKEYSENDREQUEST']._serialized_start=106134 - _globals['_XKEYSENDREQUEST']._serialized_end=106477 - _globals['_XKEYSENDREQUEST_EXTRATLVSENTRY']._serialized_start=106381 - _globals['_XKEYSENDREQUEST_EXTRATLVSENTRY']._serialized_end=106429 - _globals['_XKEYSENDRESPONSE']._serialized_start=106480 - _globals['_XKEYSENDRESPONSE']._serialized_end=106645 - _globals['_GRACEFULREQUEST']._serialized_start=106647 - _globals['_GRACEFULREQUEST']._serialized_end=106698 - _globals['_GRACEFULRESPONSE']._serialized_start=106700 - _globals['_GRACEFULRESPONSE']._serialized_end=106772 - _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_start=106774 - _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_end=106804 - _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_start=106807 - _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_end=106941 - _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_start=106943 - _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_end=107042 - _globals['_STREAMBLOCKADDEDREQUEST']._serialized_start=107044 - _globals['_STREAMBLOCKADDEDREQUEST']._serialized_end=107069 - _globals['_BLOCKADDEDNOTIFICATION']._serialized_start=107071 - _globals['_BLOCKADDEDNOTIFICATION']._serialized_end=107125 - _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_start=107127 - _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_end=107159 - _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_start=107161 - _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_end=107212 - _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_start=107214 - _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_end=107242 - _globals['_CHANNELOPENEDNOTIFICATION']._serialized_start=107244 - _globals['_CHANNELOPENEDNOTIFICATION']._serialized_end=107363 - _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_start=107365 - _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_end=107399 - _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_start=107402 - _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_end=107851 - _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_start=107705 - _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_end=107804 - _globals['_STREAMCONNECTREQUEST']._serialized_start=107853 - _globals['_STREAMCONNECTREQUEST']._serialized_end=107875 - _globals['_PEERCONNECTNOTIFICATION']._serialized_start=107878 - _globals['_PEERCONNECTNOTIFICATION']._serialized_end=108068 - _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_start=108029 - _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_end=108068 - _globals['_PEERCONNECTADDRESS']._serialized_start=108071 - _globals['_PEERCONNECTADDRESS']._serialized_end=108353 - _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_start=108222 - _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_end=108321 - _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_start=108355 - _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_end=108382 - _globals['_COINMOVEMENTNOTIFICATION']._serialized_start=108385 - _globals['_COINMOVEMENTNOTIFICATION']._serialized_end=109840 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_start=109179 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_end=109554 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_start=109556 - _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_end=109606 - _globals['_STREAMCUSTOMMSGREQUEST']._serialized_start=109842 - _globals['_STREAMCUSTOMMSGREQUEST']._serialized_end=109866 - _globals['_CUSTOMMSGNOTIFICATION']._serialized_start=109868 - _globals['_CUSTOMMSGNOTIFICATION']._serialized_end=109925 - _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_start=109927 - _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_end=109959 - _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_start=109961 - _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_end=110015 - _globals['_STREAMDISCONNECTREQUEST']._serialized_start=110017 - _globals['_STREAMDISCONNECTREQUEST']._serialized_end=110042 - _globals['_DISCONNECTNOTIFICATION']._serialized_start=110044 - _globals['_DISCONNECTNOTIFICATION']._serialized_end=110080 - _globals['_STREAMFORWARDEVENTREQUEST']._serialized_start=110082 - _globals['_STREAMFORWARDEVENTREQUEST']._serialized_end=110109 - _globals['_FORWARDEVENTNOTIFICATION']._serialized_start=110112 - _globals['_FORWARDEVENTNOTIFICATION']._serialized_end=110760 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_start=110544 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_end=110620 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_start=110622 - _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_end=110662 - _globals['_STREAMINVOICECREATIONREQUEST']._serialized_start=110762 - _globals['_STREAMINVOICECREATIONREQUEST']._serialized_end=110792 - _globals['_INVOICECREATIONNOTIFICATION']._serialized_start=110795 - _globals['_INVOICECREATIONNOTIFICATION']._serialized_end=110934 - _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_start=110936 - _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_end=110965 - _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_start=110968 - _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_end=111107 - _globals['_STREAMLOGREQUEST']._serialized_start=111109 - _globals['_STREAMLOGREQUEST']._serialized_end=111127 - _globals['_LOGNOTIFICATION']._serialized_start=111130 - _globals['_LOGNOTIFICATION']._serialized_end=111332 - _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_start=111257 - _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_end=111332 - _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_start=111334 - _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_end=111372 - _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_start=111375 - _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_end=111614 - _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_start=111616 - _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_end=111650 - _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_start=111652 - _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_end=111726 - _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_start=111728 - _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_end=111756 - _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_start=111758 - _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_end=111844 - _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_start=111846 - _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_end=111874 - _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_start=111876 - _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_end=111962 - _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_start=111964 - _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_end=111993 - _globals['_SENDPAYFAILURENOTIFICATION']._serialized_start=111995 - _globals['_SENDPAYFAILURENOTIFICATION']._serialized_end=112093 - _globals['_SENDPAYFAILUREDATA']._serialized_start=112096 - _globals['_SENDPAYFAILUREDATA']._serialized_end=113313 - _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_start=112851 - _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_end=112916 - _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_start=113315 - _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_end=113344 - _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_start=113347 - _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_end=114063 - _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_start=113865 - _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_end=113901 - _globals['_STREAMSHUTDOWNREQUEST']._serialized_start=114065 - _globals['_STREAMSHUTDOWNREQUEST']._serialized_end=114088 - _globals['_SHUTDOWNNOTIFICATION']._serialized_start=114090 - _globals['_SHUTDOWNNOTIFICATION']._serialized_end=114112 - _globals['_STREAMWARNINGREQUEST']._serialized_start=114114 - _globals['_STREAMWARNINGREQUEST']._serialized_end=114136 - _globals['_WARNINGNOTIFICATION']._serialized_start=114139 - _globals['_WARNINGNOTIFICATION']._serialized_end=114313 - _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_start=114278 - _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_end=114313 - _globals['_STREAMPAYPARTENDREQUEST']._serialized_start=114315 - _globals['_STREAMPAYPARTENDREQUEST']._serialized_end=114340 - _globals['_PAYPARTENDNOTIFICATION']._serialized_start=114343 - _globals['_PAYPARTENDNOTIFICATION']._serialized_end=114840 - _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_start=114680 - _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_end=114724 - _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_start=114842 - _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_end=114869 - _globals['_PAYPARTSTARTNOTIFICATION']._serialized_start=114872 - _globals['_PAYPARTSTARTNOTIFICATION']._serialized_end=115066 - _globals['_PAYPARTSTARTHOPS']._serialized_start=115069 - _globals['_PAYPARTSTARTHOPS']._serialized_end=115228 - _globals['_NODE']._serialized_start=115231 - _globals['_NODE']._serialized_end=128601 + _globals['_LISTCONFIGSCONFIGS']._serialized_end=79213 + _globals['_LISTCONFIGSCONFIGSACCEPTHTLCTLVTYPE']._serialized_start=79215 + _globals['_LISTCONFIGSCONFIGSACCEPTHTLCTLVTYPE']._serialized_end=79289 + _globals['_LISTCONFIGSCONFIGSADDR']._serialized_start=79291 + _globals['_LISTCONFIGSCONFIGSADDR']._serialized_end=79352 + _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_start=79354 + _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_end=79414 + _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_start=79416 + _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_end=79491 + _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_start=79493 + _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_end=79563 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_start=79565 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_end=79634 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_start=79637 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_end=79893 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_start=79812 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUESTR']._serialized_end=79893 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_start=79895 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_end=79976 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_start=79978 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_end=80049 + _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_start=80051 + _globals['_LISTCONFIGSCONFIGSAUTOCONNECTSEEKERPEERS']._serialized_end=80128 + _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_start=80130 + _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_end=80196 + _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_start=80198 + _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_end=80263 + _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_start=80265 + _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_end=80326 + _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_start=80328 + _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_end=80392 + _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_start=80394 + _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_end=80458 + _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_start=80460 + _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_end=80524 + _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_start=80526 + _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_end=80600 + _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_start=80602 + _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_end=80667 + _globals['_LISTCONFIGSCONFIGSCONF']._serialized_start=80670 + _globals['_LISTCONFIGSCONFIGSCONF']._serialized_end=80832 + _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_start=80789 + _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_end=80832 + _globals['_LISTCONFIGSCONFIGSCURRENCYRATEADDSOURCE']._serialized_start=80834 + _globals['_LISTCONFIGSCONFIGSCURRENCYRATEADDSOURCE']._serialized_end=80944 + _globals['_LISTCONFIGSCONFIGSCURRENCYRATEDISABLESOURCE']._serialized_start=80946 + _globals['_LISTCONFIGSCONFIGSCURRENCYRATEDISABLESOURCE']._serialized_end=81060 + _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_start=81062 + _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_end=81117 + _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_start=81119 + _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_end=81190 + _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_start=81192 + _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_end=81250 + _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_start=81252 + _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_end=81311 + _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_start=81313 + _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_end=81404 + _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_start=81406 + _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_end=81476 + _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_start=81478 + _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_end=81547 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_start=81549 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_end=81625 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_start=81627 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_end=81696 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_start=81698 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_end=81778 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_start=81780 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_end=81861 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSIMPLECLOSE']._serialized_start=81863 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSIMPLECLOSE']._serialized_end=81935 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_start=81937 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_end=82014 + _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_start=82016 + _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_end=82078 + _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_start=82080 + _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_end=82148 + _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_start=82150 + _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_end=82252 + _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_start=82254 + _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_end=82322 + _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_start=82324 + _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_end=82394 + _globals['_LISTCONFIGSCONFIGSHSMPASSPHRASE']._serialized_start=82396 + _globals['_LISTCONFIGSCONFIGSHSMPASSPHRASE']._serialized_end=82458 + _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_start=82460 + _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_end=82544 + _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_start=82546 + _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_end=82630 + _globals['_LISTCONFIGSCONFIGSIPROMISETOFIXBROKENAPIUSER']._serialized_start=82632 + _globals['_LISTCONFIGSCONFIGSIPROMISETOFIXBROKENAPIUSER']._serialized_end=82715 + _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_start=82717 + _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_end=82788 + _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_start=82790 + _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_end=82862 + _globals['_LISTCONFIGSCONFIGSINVOICESONCHAINFALLBACK']._serialized_start=82864 + _globals['_LISTCONFIGSCONFIGSINVOICESONCHAINFALLBACK']._serialized_end=82936 + _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_start=82938 + _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_end=83000 + _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_start=83002 + _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_end=83069 + _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_start=83071 + _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_end=83135 + _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_start=83137 + _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_end=83200 + _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_start=83202 + _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_end=83266 + _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_start=83268 + _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_end=83337 + _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_start=83339 + _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_end=83395 + _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_start=83397 + _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_end=83470 + _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_start=83472 + _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_end=83564 + _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_start=83566 + _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_end=83646 + _globals['_LISTCONFIGSCONFIGSMESSAGEPADDING']._serialized_start=83648 + _globals['_LISTCONFIGSCONFIGSMESSAGEPADDING']._serialized_end=83718 + _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_start=83720 + _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_end=83823 + _globals['_LISTCONFIGSCONFIGSMINEMERGENCYMSAT']._serialized_start=83825 + _globals['_LISTCONFIGSCONFIGSMINEMERGENCYMSAT']._serialized_end=83910 + _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_start=83912 + _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_end=83974 + _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_start=83976 + _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_end=84032 + _globals['_LISTCONFIGSCONFIGSPAYMENTFRONTINGNODE']._serialized_start=84034 + _globals['_LISTCONFIGSCONFIGSPAYMENTFRONTINGNODE']._serialized_end=84110 + _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_start=84112 + _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_end=84174 + _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_start=84176 + _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_end=84239 + _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_start=84241 + _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_end=84307 + _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_start=84309 + _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_end=84369 + _globals['_LISTCONFIGSCONFIGSRECKLESSDIR']._serialized_start=84371 + _globals['_LISTCONFIGSCONFIGSRECKLESSDIR']._serialized_end=84437 + _globals['_LISTCONFIGSCONFIGSRECOVER']._serialized_start=84439 + _globals['_LISTCONFIGSCONFIGSRECOVER']._serialized_end=84501 + _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_start=84503 + _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_end=84559 + _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_start=84561 + _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_end=84639 + _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_start=84641 + _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_end=84702 + _globals['_LISTCONFIGSCONFIGSRGB']._serialized_start=84704 + _globals['_LISTCONFIGSCONFIGSRGB']._serialized_end=84762 + _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_start=84764 + _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_end=84826 + _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_start=84828 + _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_end=84894 + _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_start=84896 + _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_end=84951 + _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_start=84953 + _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_end=85019 + _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_start=85021 + _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_end=85077 + _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_start=85079 + _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_end=85152 + _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_start=85154 + _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_end=85215 + _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_start=85217 + _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_end=85287 + _globals['_STOPREQUEST']._serialized_start=85289 + _globals['_STOPREQUEST']._serialized_end=85302 + _globals['_STOPRESPONSE']._serialized_start=85304 + _globals['_STOPRESPONSE']._serialized_end=85401 + _globals['_STOPRESPONSE_STOPRESULT']._serialized_start=85366 + _globals['_STOPRESPONSE_STOPRESULT']._serialized_end=85401 + _globals['_HELPREQUEST']._serialized_start=85403 + _globals['_HELPREQUEST']._serialized_end=85450 + _globals['_HELPRESPONSE']._serialized_start=85453 + _globals['_HELPRESPONSE']._serialized_end=85602 + _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_start=85558 + _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_end=85586 + _globals['_HELPHELP']._serialized_start=85604 + _globals['_HELPHELP']._serialized_end=85631 + _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_start=85633 + _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_end=85736 + _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_start=85738 + _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_end=85765 + _globals['_PREAPPROVEINVOICEREQUEST']._serialized_start=85767 + _globals['_PREAPPROVEINVOICEREQUEST']._serialized_end=85809 + _globals['_PREAPPROVEINVOICERESPONSE']._serialized_start=85811 + _globals['_PREAPPROVEINVOICERESPONSE']._serialized_end=85838 + _globals['_STATICBACKUPREQUEST']._serialized_start=85840 + _globals['_STATICBACKUPREQUEST']._serialized_end=85861 + _globals['_STATICBACKUPRESPONSE']._serialized_start=85863 + _globals['_STATICBACKUPRESPONSE']._serialized_end=85898 + _globals['_BKPRCHANNELSAPYREQUEST']._serialized_start=85900 + _globals['_BKPRCHANNELSAPYREQUEST']._serialized_end=86000 + _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_start=86002 + _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_end=86082 + _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_start=86085 + _globals['_BKPRCHANNELSAPYCHANNELSAPY']._serialized_end=86974 + _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_start=86977 + _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_end=87187 + _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_start=87190 + _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_end=87402 + _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_start=87316 + _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSVFORMAT']._serialized_end=87402 + _globals['_BKPRINSPECTREQUEST']._serialized_start=87404 + _globals['_BKPRINSPECTREQUEST']._serialized_end=87441 + _globals['_BKPRINSPECTRESPONSE']._serialized_start=87443 + _globals['_BKPRINSPECTRESPONSE']._serialized_end=87498 + _globals['_BKPRINSPECTTXS']._serialized_start=87501 + _globals['_BKPRINSPECTTXS']._serialized_end=87655 + _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_start=87658 + _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_end=88102 + _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_start=88104 + _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_end=88208 + _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_start=88210 + _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_end=88291 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_start=88294 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_end=89011 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_start=88797 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_end=88871 + _globals['_BKPRLISTBALANCESREQUEST']._serialized_start=89013 + _globals['_BKPRLISTBALANCESREQUEST']._serialized_end=89038 + _globals['_BKPRLISTBALANCESRESPONSE']._serialized_start=89040 + _globals['_BKPRLISTBALANCESRESPONSE']._serialized_end=89115 + _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_start=89118 + _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_end=89444 + _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_start=89446 + _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_end=89534 + _globals['_BKPRLISTINCOMEREQUEST']._serialized_start=89537 + _globals['_BKPRLISTINCOMEREQUEST']._serialized_end=89688 + _globals['_BKPRLISTINCOMERESPONSE']._serialized_start=89690 + _globals['_BKPRLISTINCOMERESPONSE']._serialized_end=89770 + _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_start=89773 + _globals['_BKPRLISTINCOMEINCOMEEVENTS']._serialized_end=90081 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_start=90083 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDREQUEST']._serialized_end=90163 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_start=90165 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDRESPONSE']._serialized_end=90266 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_start=90269 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED']._serialized_end=90944 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_start=90770 + _globals['_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATED_BKPREDITDESCRIPTIONBYPAYMENTIDUPDATEDTYPE']._serialized_end=90837 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_start=90946 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTREQUEST']._serialized_end=91023 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_start=91025 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTRESPONSE']._serialized_end=91124 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_start=91127 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED']._serialized_end=91798 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_start=91625 + _globals['_BKPREDITDESCRIPTIONBYOUTPOINTUPDATED_BKPREDITDESCRIPTIONBYOUTPOINTUPDATEDTYPE']._serialized_end=91691 + _globals['_BKPRREPORTREQUEST']._serialized_start=91801 + _globals['_BKPRREPORTREQUEST']._serialized_end=91977 + _globals['_BKPRREPORTRESPONSE']._serialized_start=91979 + _globals['_BKPRREPORTRESPONSE']._serialized_end=92015 + _globals['_BLACKLISTRUNEREQUEST']._serialized_start=92017 + _globals['_BLACKLISTRUNEREQUEST']._serialized_end=92127 + _globals['_BLACKLISTRUNERESPONSE']._serialized_start=92129 + _globals['_BLACKLISTRUNERESPONSE']._serialized_end=92200 + _globals['_BLACKLISTRUNEBLACKLIST']._serialized_start=92202 + _globals['_BLACKLISTRUNEBLACKLIST']._serialized_end=92254 + _globals['_CHECKRUNEREQUEST']._serialized_start=92256 + _globals['_CHECKRUNEREQUEST']._serialized_end=92368 + _globals['_CHECKRUNERESPONSE']._serialized_start=92370 + _globals['_CHECKRUNERESPONSE']._serialized_end=92404 + _globals['_CREATERUNEREQUEST']._serialized_start=92406 + _globals['_CREATERUNEREQUEST']._serialized_end=92475 + _globals['_CREATERUNERESPONSE']._serialized_start=92477 + _globals['_CREATERUNERESPONSE']._serialized_end=92600 + _globals['_SHOWRUNESREQUEST']._serialized_start=92602 + _globals['_SHOWRUNESREQUEST']._serialized_end=92648 + _globals['_SHOWRUNESRESPONSE']._serialized_start=92650 + _globals['_SHOWRUNESRESPONSE']._serialized_end=92705 + _globals['_SHOWRUNESRUNES']._serialized_start=92708 + _globals['_SHOWRUNESRUNES']._serialized_end=92993 + _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_start=92995 + _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_end=93107 + _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_start=93109 + _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_end=93219 + _globals['_ASKRENEUNRESERVEREQUEST']._serialized_start=93221 + _globals['_ASKRENEUNRESERVEREQUEST']._serialized_end=93335 + _globals['_ASKRENEUNRESERVERESPONSE']._serialized_start=93337 + _globals['_ASKRENEUNRESERVERESPONSE']._serialized_end=93363 + _globals['_ASKRENEUNRESERVEPATH']._serialized_start=93365 + _globals['_ASKRENEUNRESERVEPATH']._serialized_end=93481 + _globals['_ASKRENELISTLAYERSREQUEST']._serialized_start=93483 + _globals['_ASKRENELISTLAYERSREQUEST']._serialized_end=93539 + _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_start=93541 + _globals['_ASKRENELISTLAYERSRESPONSE']._serialized_end=93614 + _globals['_ASKRENELISTLAYERSLAYERS']._serialized_start=93617 + _globals['_ASKRENELISTLAYERSLAYERS']._serialized_end=94043 + _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_start=94046 + _globals['_ASKRENELISTLAYERSLAYERSBIASES']._serialized_end=94201 + _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_start=94204 + _globals['_ASKRENELISTLAYERSLAYERSCHANNELUPDATES']._serialized_end=94628 + _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_start=94631 + _globals['_ASKRENELISTLAYERSLAYERSCONSTRAINTS']._serialized_end=94849 + _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_start=94852 + _globals['_ASKRENELISTLAYERSLAYERSCREATEDCHANNELS']._serialized_end=94991 + _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_start=94994 + _globals['_ASKRENELISTLAYERSLAYERSNODEBIASES']._serialized_end=95139 + _globals['_ASKRENECREATELAYERREQUEST']._serialized_start=95141 + _globals['_ASKRENECREATELAYERREQUEST']._serialized_end=95223 + _globals['_ASKRENECREATELAYERRESPONSE']._serialized_start=95225 + _globals['_ASKRENECREATELAYERRESPONSE']._serialized_end=95300 + _globals['_ASKRENECREATELAYERLAYERS']._serialized_start=95303 + _globals['_ASKRENECREATELAYERLAYERS']._serialized_end=95735 + _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_start=95738 + _globals['_ASKRENECREATELAYERLAYERSBIASES']._serialized_end=95894 + _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_start=95897 + _globals['_ASKRENECREATELAYERLAYERSCHANNELUPDATES']._serialized_end=96234 + _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_start=96237 + _globals['_ASKRENECREATELAYERLAYERSCONSTRAINTS']._serialized_end=96433 + _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_start=96436 + _globals['_ASKRENECREATELAYERLAYERSCREATEDCHANNELS']._serialized_end=96576 + _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_start=96579 + _globals['_ASKRENECREATELAYERLAYERSNODEBIASES']._serialized_end=96725 + _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_start=96727 + _globals['_ASKRENEREMOVELAYERREQUEST']._serialized_end=96769 + _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_start=96771 + _globals['_ASKRENEREMOVELAYERRESPONSE']._serialized_end=96799 + _globals['_ASKRENEREMOVECHANNELUPDATEREQUEST']._serialized_start=96801 + _globals['_ASKRENEREMOVECHANNELUPDATEREQUEST']._serialized_end=96881 + _globals['_ASKRENEREMOVECHANNELUPDATERESPONSE']._serialized_start=96883 + _globals['_ASKRENEREMOVECHANNELUPDATERESPONSE']._serialized_end=96919 + _globals['_ASKRENERESERVEREQUEST']._serialized_start=96921 + _globals['_ASKRENERESERVEREQUEST']._serialized_end=96983 + _globals['_ASKRENERESERVERESPONSE']._serialized_start=96985 + _globals['_ASKRENERESERVERESPONSE']._serialized_end=97009 + _globals['_ASKRENERESERVEPATH']._serialized_start=97011 + _globals['_ASKRENERESERVEPATH']._serialized_end=97125 + _globals['_ASKRENEAGEREQUEST']._serialized_start=97127 + _globals['_ASKRENEAGEREQUEST']._serialized_end=97177 + _globals['_ASKRENEAGERESPONSE']._serialized_start=97179 + _globals['_ASKRENEAGERESPONSE']._serialized_end=97235 + _globals['_GETROUTESREQUEST']._serialized_start=97238 + _globals['_GETROUTESREQUEST']._serialized_end=97469 + _globals['_GETROUTESRESPONSE']._serialized_start=97471 + _globals['_GETROUTESRESPONSE']._serialized_end=97553 + _globals['_GETROUTESROUTES']._serialized_start=97556 + _globals['_GETROUTESROUTES']._serialized_end=97692 + _globals['_GETROUTESROUTESPATH']._serialized_start=97695 + _globals['_GETROUTESROUTESPATH']._serialized_end=98163 + _globals['_ASKRENEDISABLENODEREQUEST']._serialized_start=98165 + _globals['_ASKRENEDISABLENODEREQUEST']._serialized_end=98221 + _globals['_ASKRENEDISABLENODERESPONSE']._serialized_start=98223 + _globals['_ASKRENEDISABLENODERESPONSE']._serialized_end=98251 + _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_start=98254 + _globals['_ASKRENEINFORMCHANNELREQUEST']._serialized_end=98520 + _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_start=98441 + _globals['_ASKRENEINFORMCHANNELREQUEST_ASKRENEINFORMCHANNELINFORM']._serialized_end=98520 + _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_start=98522 + _globals['_ASKRENEINFORMCHANNELRESPONSE']._serialized_end=98611 + _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_start=98614 + _globals['_ASKRENEINFORMCHANNELCONSTRAINTS']._serialized_end=98825 + _globals['_ASKRENECREATECHANNELREQUEST']._serialized_start=98828 + _globals['_ASKRENECREATECHANNELREQUEST']._serialized_end=98971 + _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_start=98973 + _globals['_ASKRENECREATECHANNELRESPONSE']._serialized_end=99003 + _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_start=99006 + _globals['_ASKRENEUPDATECHANNELREQUEST']._serialized_end=99435 + _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_start=99437 + _globals['_ASKRENEUPDATECHANNELRESPONSE']._serialized_end=99467 + _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_start=99470 + _globals['_ASKRENEBIASCHANNELREQUEST']._serialized_end=99634 + _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_start=99636 + _globals['_ASKRENEBIASCHANNELRESPONSE']._serialized_end=99711 + _globals['_ASKRENEBIASCHANNELBIASES']._serialized_start=99714 + _globals['_ASKRENEBIASCHANNELBIASES']._serialized_end=99879 + _globals['_ASKRENEBIASNODEREQUEST']._serialized_start=99882 + _globals['_ASKRENEBIASNODEREQUEST']._serialized_end=100046 + _globals['_ASKRENEBIASNODERESPONSE']._serialized_start=100048 + _globals['_ASKRENEBIASNODERESPONSE']._serialized_end=100126 + _globals['_ASKRENEBIASNODENODEBIASES']._serialized_start=100129 + _globals['_ASKRENEBIASNODENODEBIASES']._serialized_end=100281 + _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_start=100283 + _globals['_ASKRENELISTRESERVATIONSREQUEST']._serialized_end=100315 + _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_start=100317 + _globals['_ASKRENELISTRESERVATIONSRESPONSE']._serialized_end=100414 + _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_start=100417 + _globals['_ASKRENELISTRESERVATIONSRESERVATIONS']._serialized_end=100562 + _globals['_INJECTPAYMENTONIONREQUEST']._serialized_start=100565 + _globals['_INJECTPAYMENTONIONREQUEST']._serialized_end=100938 + _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_start=100940 + _globals['_INJECTPAYMENTONIONRESPONSE']._serialized_end=101059 + _globals['_INJECTONIONMESSAGEREQUEST']._serialized_start=101061 + _globals['_INJECTONIONMESSAGEREQUEST']._serialized_end=101123 + _globals['_INJECTONIONMESSAGERESPONSE']._serialized_start=101125 + _globals['_INJECTONIONMESSAGERESPONSE']._serialized_end=101153 + _globals['_XPAYREQUEST']._serialized_start=101156 + _globals['_XPAYREQUEST']._serialized_end=101599 + _globals['_XPAYRESPONSE']._serialized_start=101602 + _globals['_XPAYRESPONSE']._serialized_end=101763 + _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_start=101765 + _globals['_SIGNMESSAGEWITHKEYREQUEST']._serialized_end=101826 + _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_start=101828 + _globals['_SIGNMESSAGEWITHKEYRESPONSE']._serialized_end=101924 + _globals['_LISTCHANNELMOVESREQUEST']._serialized_start=101927 + _globals['_LISTCHANNELMOVESREQUEST']._serialized_end=102132 + _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_start=102066 + _globals['_LISTCHANNELMOVESREQUEST_LISTCHANNELMOVESINDEX']._serialized_end=102102 + _globals['_LISTCHANNELMOVESRESPONSE']._serialized_start=102134 + _globals['_LISTCHANNELMOVESRESPONSE']._serialized_end=102217 + _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_start=102220 + _globals['_LISTCHANNELMOVESCHANNELMOVES']._serialized_end=102773 + _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_start=102581 + _globals['_LISTCHANNELMOVESCHANNELMOVES_LISTCHANNELMOVESCHANNELMOVESPRIMARYTAG']._serialized_end=102731 + _globals['_LISTCHAINMOVESREQUEST']._serialized_start=102776 + _globals['_LISTCHAINMOVESREQUEST']._serialized_end=102973 + _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_start=102909 + _globals['_LISTCHAINMOVESREQUEST_LISTCHAINMOVESINDEX']._serialized_end=102943 + _globals['_LISTCHAINMOVESRESPONSE']._serialized_start=102975 + _globals['_LISTCHAINMOVESRESPONSE']._serialized_end=103050 + _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_start=103053 + _globals['_LISTCHAINMOVESCHAINMOVES']._serialized_end=103905 + _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_start=103540 + _globals['_LISTCHAINMOVESCHAINMOVES_LISTCHAINMOVESCHAINMOVESPRIMARYTAG']._serialized_end=103817 + _globals['_LISTNETWORKEVENTSREQUEST']._serialized_start=103908 + _globals['_LISTNETWORKEVENTSREQUEST']._serialized_end=104141 + _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_start=104067 + _globals['_LISTNETWORKEVENTSREQUEST_LISTNETWORKEVENTSINDEX']._serialized_end=104104 + _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_start=104143 + _globals['_LISTNETWORKEVENTSRESPONSE']._serialized_end=104230 + _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_start=104233 + _globals['_LISTNETWORKEVENTSNETWORKEVENTS']._serialized_end=104475 + _globals['_DELNETWORKEVENTREQUEST']._serialized_start=104477 + _globals['_DELNETWORKEVENTREQUEST']._serialized_end=104524 + _globals['_DELNETWORKEVENTRESPONSE']._serialized_start=104526 + _globals['_DELNETWORKEVENTRESPONSE']._serialized_end=104551 + _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_start=104554 + _globals['_CLNRESTREGISTERPATHREQUEST']._serialized_end=104800 + _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_start=104802 + _globals['_CLNRESTREGISTERPATHRESPONSE']._serialized_end=104831 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_start=104834 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS']._serialized_end=105052 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_start=104985 + _globals['_CLNRESTREGISTERPATHRUNERESTRICTIONS_PARAMSENTRY']._serialized_end=105030 + _globals['_LISTCURRENCYRATESREQUEST']._serialized_start=105054 + _globals['_LISTCURRENCYRATESREQUEST']._serialized_end=105098 + _globals['_LISTCURRENCYRATESRESPONSE']._serialized_start=105100 + _globals['_LISTCURRENCYRATESRESPONSE']._serialized_end=105187 + _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_start=105189 + _globals['_LISTCURRENCYRATESCURRENCYRATES']._serialized_end=105253 + _globals['_CURRENCYCONVERTREQUEST']._serialized_start=105255 + _globals['_CURRENCYCONVERTREQUEST']._serialized_end=105313 + _globals['_CURRENCYCONVERTRESPONSE']._serialized_start=105315 + _globals['_CURRENCYCONVERTRESPONSE']._serialized_end=105367 + _globals['_CURRENCYRATEREQUEST']._serialized_start=105369 + _globals['_CURRENCYRATEREQUEST']._serialized_end=105440 + _globals['_CURRENCYRATERESPONSE']._serialized_start=105442 + _globals['_CURRENCYRATERESPONSE']._serialized_end=105478 + _globals['_SENDAMOUNTREQUEST']._serialized_start=105481 + _globals['_SENDAMOUNTREQUEST']._serialized_end=105758 + _globals['_SENDAMOUNTRESPONSE']._serialized_start=105761 + _globals['_SENDAMOUNTRESPONSE']._serialized_end=105928 + _globals['_CREATEPROOFREQUEST']._serialized_start=105930 + _globals['_CREATEPROOFREQUEST']._serialized_end=106031 + _globals['_CREATEPROOFRESPONSE']._serialized_start=106033 + _globals['_CREATEPROOFRESPONSE']._serialized_end=106094 + _globals['_CREATEPROOFPROOFS']._serialized_start=106097 + _globals['_CREATEPROOFPROOFS']._serialized_end=106279 + _globals['_XKEYSENDREQUEST']._serialized_start=106282 + _globals['_XKEYSENDREQUEST']._serialized_end=106625 + _globals['_XKEYSENDREQUEST_EXTRATLVSENTRY']._serialized_start=106529 + _globals['_XKEYSENDREQUEST_EXTRATLVSENTRY']._serialized_end=106577 + _globals['_XKEYSENDRESPONSE']._serialized_start=106628 + _globals['_XKEYSENDRESPONSE']._serialized_end=106793 + _globals['_GRACEFULREQUEST']._serialized_start=106795 + _globals['_GRACEFULREQUEST']._serialized_end=106846 + _globals['_GRACEFULRESPONSE']._serialized_start=106848 + _globals['_GRACEFULRESPONSE']._serialized_end=106920 + _globals['_RECKLESSREQUEST']._serialized_start=106923 + _globals['_RECKLESSREQUEST']._serialized_end=107499 + _globals['_RECKLESSREQUEST_RECKLESSCOMMAND']._serialized_start=107212 + _globals['_RECKLESSREQUEST_RECKLESSCOMMAND']._serialized_end=107363 + _globals['_RECKLESSREQUEST_RECKLESSSUBCOMMAND']._serialized_start=107365 + _globals['_RECKLESSREQUEST_RECKLESSSUBCOMMAND']._serialized_end=107416 + _globals['_RECKLESSRESPONSE']._serialized_start=107502 + _globals['_RECKLESSRESPONSE']._serialized_end=107960 + _globals['_RECKLESSDISABLE']._serialized_start=107962 + _globals['_RECKLESSDISABLE']._serialized_end=108000 + _globals['_RECKLESSENABLE']._serialized_start=108002 + _globals['_RECKLESSENABLE']._serialized_end=108039 + _globals['_RECKLESSINSTALL']._serialized_start=108041 + _globals['_RECKLESSINSTALL']._serialized_end=108148 + _globals['_RECKLESSLISTAVAILABLE']._serialized_start=108151 + _globals['_RECKLESSLISTAVAILABLE']._serialized_end=108524 + _globals['_RECKLESSLISTAVAILABLE_RECKLESSLISTAVAILABLEINSTALLER']._serialized_start=108346 + _globals['_RECKLESSLISTAVAILABLE_RECKLESSLISTAVAILABLEINSTALLER']._serialized_end=108524 + _globals['_RECKLESSLISTAVAILABLEMANIFEST']._serialized_start=108527 + _globals['_RECKLESSLISTAVAILABLEMANIFEST']._serialized_end=108825 + _globals['_RECKLESSLISTINSTALLED']._serialized_start=108828 + _globals['_RECKLESSLISTINSTALLED']._serialized_end=109055 + _globals['_RECKLESSTIP']._serialized_start=109058 + _globals['_RECKLESSTIP']._serialized_end=109218 + _globals['_RECKLESSUNINSTALL']._serialized_start=109220 + _globals['_RECKLESSUNINSTALL']._serialized_end=109260 + _globals['_RECKLESSUPDATE']._serialized_start=109262 + _globals['_RECKLESSUPDATE']._serialized_end=109368 + _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_start=109370 + _globals['_STREAMBALANCESNAPSHOTREQUEST']._serialized_end=109400 + _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_start=109403 + _globals['_BALANCESNAPSHOTNOTIFICATION']._serialized_end=109537 + _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_start=109539 + _globals['_BALANCESNAPSHOTACCOUNTS']._serialized_end=109638 + _globals['_STREAMBLOCKADDEDREQUEST']._serialized_start=109640 + _globals['_STREAMBLOCKADDEDREQUEST']._serialized_end=109665 + _globals['_BLOCKADDEDNOTIFICATION']._serialized_start=109667 + _globals['_BLOCKADDEDNOTIFICATION']._serialized_end=109721 + _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_start=109723 + _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_end=109755 + _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_start=109757 + _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_end=109808 + _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_start=109810 + _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_end=109838 + _globals['_CHANNELOPENEDNOTIFICATION']._serialized_start=109840 + _globals['_CHANNELOPENEDNOTIFICATION']._serialized_end=109959 + _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_start=109961 + _globals['_STREAMCHANNELSTATECHANGEDREQUEST']._serialized_end=109995 + _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_start=109998 + _globals['_CHANNELSTATECHANGEDNOTIFICATION']._serialized_end=110447 + _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_start=110301 + _globals['_CHANNELSTATECHANGEDNOTIFICATION_CHANNELSTATECHANGEDCAUSE']._serialized_end=110400 + _globals['_STREAMCONNECTREQUEST']._serialized_start=110449 + _globals['_STREAMCONNECTREQUEST']._serialized_end=110471 + _globals['_PEERCONNECTNOTIFICATION']._serialized_start=110474 + _globals['_PEERCONNECTNOTIFICATION']._serialized_end=110664 + _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_start=110625 + _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_end=110664 + _globals['_PEERCONNECTADDRESS']._serialized_start=110667 + _globals['_PEERCONNECTADDRESS']._serialized_end=110949 + _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_start=110818 + _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_end=110917 + _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_start=110951 + _globals['_STREAMCOINMOVEMENTREQUEST']._serialized_end=110978 + _globals['_COINMOVEMENTNOTIFICATION']._serialized_start=110981 + _globals['_COINMOVEMENTNOTIFICATION']._serialized_end=112436 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_start=111775 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTPRIMARYTAG']._serialized_end=112150 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_start=112152 + _globals['_COINMOVEMENTNOTIFICATION_COINMOVEMENTTYPE']._serialized_end=112202 + _globals['_STREAMCUSTOMMSGREQUEST']._serialized_start=112438 + _globals['_STREAMCUSTOMMSGREQUEST']._serialized_end=112462 + _globals['_CUSTOMMSGNOTIFICATION']._serialized_start=112464 + _globals['_CUSTOMMSGNOTIFICATION']._serialized_end=112521 + _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_start=112523 + _globals['_STREAMDEPRECATEDONESHOTREQUEST']._serialized_end=112555 + _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_start=112557 + _globals['_DEPRECATEDONESHOTNOTIFICATION']._serialized_end=112611 + _globals['_STREAMDISCONNECTREQUEST']._serialized_start=112613 + _globals['_STREAMDISCONNECTREQUEST']._serialized_end=112638 + _globals['_DISCONNECTNOTIFICATION']._serialized_start=112640 + _globals['_DISCONNECTNOTIFICATION']._serialized_end=112676 + _globals['_STREAMFORWARDEVENTREQUEST']._serialized_start=112678 + _globals['_STREAMFORWARDEVENTREQUEST']._serialized_end=112705 + _globals['_FORWARDEVENTNOTIFICATION']._serialized_start=112708 + _globals['_FORWARDEVENTNOTIFICATION']._serialized_end=113356 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_start=113140 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTATUS']._serialized_end=113216 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_start=113218 + _globals['_FORWARDEVENTNOTIFICATION_FORWARDEVENTSTYLE']._serialized_end=113258 + _globals['_STREAMINVOICECREATIONREQUEST']._serialized_start=113358 + _globals['_STREAMINVOICECREATIONREQUEST']._serialized_end=113388 + _globals['_INVOICECREATIONNOTIFICATION']._serialized_start=113391 + _globals['_INVOICECREATIONNOTIFICATION']._serialized_end=113530 + _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_start=113532 + _globals['_STREAMINVOICEPAYMENTREQUEST']._serialized_end=113561 + _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_start=113564 + _globals['_INVOICEPAYMENTNOTIFICATION']._serialized_end=113703 + _globals['_STREAMLOGREQUEST']._serialized_start=113705 + _globals['_STREAMLOGREQUEST']._serialized_end=113723 + _globals['_LOGNOTIFICATION']._serialized_start=113726 + _globals['_LOGNOTIFICATION']._serialized_end=113928 + _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_start=113853 + _globals['_LOGNOTIFICATION_LOGLEVEL']._serialized_end=113928 + _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_start=113930 + _globals['_STREAMONIONMESSAGEFORWARDFAILREQUEST']._serialized_end=113968 + _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_start=113971 + _globals['_ONIONMESSAGEFORWARDFAILNOTIFICATION']._serialized_end=114210 + _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_start=114212 + _globals['_STREAMOPENCHANNELPEERSIGSREQUEST']._serialized_end=114246 + _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_start=114248 + _globals['_OPENCHANNELPEERSIGSNOTIFICATION']._serialized_end=114322 + _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_start=114324 + _globals['_STREAMPLUGINSTARTEDREQUEST']._serialized_end=114352 + _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_start=114354 + _globals['_PLUGINSTARTEDNOTIFICATION']._serialized_end=114440 + _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_start=114442 + _globals['_STREAMPLUGINSTOPPEDREQUEST']._serialized_end=114470 + _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_start=114472 + _globals['_PLUGINSTOPPEDNOTIFICATION']._serialized_end=114558 + _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_start=114560 + _globals['_STREAMSENDPAYFAILUREREQUEST']._serialized_end=114589 + _globals['_SENDPAYFAILURENOTIFICATION']._serialized_start=114591 + _globals['_SENDPAYFAILURENOTIFICATION']._serialized_end=114689 + _globals['_SENDPAYFAILUREDATA']._serialized_start=114692 + _globals['_SENDPAYFAILUREDATA']._serialized_end=115909 + _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_start=115447 + _globals['_SENDPAYFAILUREDATA_SENDPAYFAILUREDATASTATUS']._serialized_end=115512 + _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_start=115911 + _globals['_STREAMSENDPAYSUCCESSREQUEST']._serialized_end=115940 + _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_start=115943 + _globals['_SENDPAYSUCCESSNOTIFICATION']._serialized_end=116659 + _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_start=116461 + _globals['_SENDPAYSUCCESSNOTIFICATION_SENDPAYSUCCESSSTATUS']._serialized_end=116497 + _globals['_STREAMSHUTDOWNREQUEST']._serialized_start=116661 + _globals['_STREAMSHUTDOWNREQUEST']._serialized_end=116684 + _globals['_SHUTDOWNNOTIFICATION']._serialized_start=116686 + _globals['_SHUTDOWNNOTIFICATION']._serialized_end=116708 + _globals['_STREAMWARNINGREQUEST']._serialized_start=116710 + _globals['_STREAMWARNINGREQUEST']._serialized_end=116732 + _globals['_WARNINGNOTIFICATION']._serialized_start=116735 + _globals['_WARNINGNOTIFICATION']._serialized_end=116909 + _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_start=116874 + _globals['_WARNINGNOTIFICATION_WARNINGLEVEL']._serialized_end=116909 + _globals['_STREAMPAYPARTENDREQUEST']._serialized_start=116911 + _globals['_STREAMPAYPARTENDREQUEST']._serialized_end=116936 + _globals['_PAYPARTENDNOTIFICATION']._serialized_start=116939 + _globals['_PAYPARTENDNOTIFICATION']._serialized_end=117436 + _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_start=117276 + _globals['_PAYPARTENDNOTIFICATION_PAYPARTENDSTATUS']._serialized_end=117320 + _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_start=117438 + _globals['_STREAMPAYPARTSTARTREQUEST']._serialized_end=117465 + _globals['_PAYPARTSTARTNOTIFICATION']._serialized_start=117468 + _globals['_PAYPARTSTARTNOTIFICATION']._serialized_end=117662 + _globals['_PAYPARTSTARTHOPS']._serialized_start=117665 + _globals['_PAYPARTSTARTHOPS']._serialized_end=117824 + _globals['_STREAMRECKLESSLOGREQUEST']._serialized_start=117826 + _globals['_STREAMRECKLESSLOGREQUEST']._serialized_end=117852 + _globals['_RECKLESSLOGNOTIFICATION']._serialized_start=117855 + _globals['_RECKLESSLOGNOTIFICATION']._serialized_end=118073 + _globals['_RECKLESSLOGNOTIFICATION_RECKLESSLOGLEVEL']._serialized_start=117990 + _globals['_RECKLESSLOGNOTIFICATION_RECKLESSLOGLEVEL']._serialized_end=118073 + _globals['_NODE']._serialized_start=118076 + _globals['_NODE']._serialized_end=131594 # @@protoc_insertion_point(module_scope) diff --git a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2_grpc.py b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2_grpc.py index ab8bd868c93e..64ba021f0ee3 100644 --- a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2_grpc.py +++ b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2_grpc.py @@ -799,6 +799,11 @@ def __init__(self, channel): request_serializer=node__pb2.GracefulRequest.SerializeToString, response_deserializer=node__pb2.GracefulResponse.FromString, _registered_method=True) + self.Reckless = channel.unary_unary( + '/cln.Node/Reckless', + request_serializer=node__pb2.RecklessRequest.SerializeToString, + response_deserializer=node__pb2.RecklessResponse.FromString, + _registered_method=True) self.SubscribeBalanceSnapshot = channel.unary_stream( '/cln.Node/SubscribeBalanceSnapshot', request_serializer=node__pb2.StreamBalanceSnapshotRequest.SerializeToString, @@ -919,6 +924,11 @@ def __init__(self, channel): request_serializer=node__pb2.StreamPayPartStartRequest.SerializeToString, response_deserializer=node__pb2.PayPartStartNotification.FromString, _registered_method=True) + self.SubscribeRecklessLog = channel.unary_stream( + '/cln.Node/SubscribeRecklessLog', + request_serializer=node__pb2.StreamRecklessLogRequest.SerializeToString, + response_deserializer=node__pb2.RecklessLogNotification.FromString, + _registered_method=True) class NodeServicer(object): @@ -1842,6 +1852,12 @@ def Graceful(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def Reckless(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def SubscribeBalanceSnapshot(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) @@ -1986,6 +2002,12 @@ def SubscribePayPartStart(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def SubscribeRecklessLog(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_NodeServicer_to_server(servicer, server): rpc_method_handlers = { @@ -2754,6 +2776,11 @@ def add_NodeServicer_to_server(servicer, server): request_deserializer=node__pb2.GracefulRequest.FromString, response_serializer=node__pb2.GracefulResponse.SerializeToString, ), + 'Reckless': grpc.unary_unary_rpc_method_handler( + servicer.Reckless, + request_deserializer=node__pb2.RecklessRequest.FromString, + response_serializer=node__pb2.RecklessResponse.SerializeToString, + ), 'SubscribeBalanceSnapshot': grpc.unary_stream_rpc_method_handler( servicer.SubscribeBalanceSnapshot, request_deserializer=node__pb2.StreamBalanceSnapshotRequest.FromString, @@ -2874,6 +2901,11 @@ def add_NodeServicer_to_server(servicer, server): request_deserializer=node__pb2.StreamPayPartStartRequest.FromString, response_serializer=node__pb2.PayPartStartNotification.SerializeToString, ), + 'SubscribeRecklessLog': grpc.unary_stream_rpc_method_handler( + servicer.SubscribeRecklessLog, + request_deserializer=node__pb2.StreamRecklessLogRequest.FromString, + response_serializer=node__pb2.RecklessLogNotification.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'cln.Node', rpc_method_handlers) @@ -7016,6 +7048,33 @@ def Graceful(request, metadata, _registered_method=True) + @staticmethod + def Reckless(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cln.Node/Reckless', + node__pb2.RecklessRequest.SerializeToString, + node__pb2.RecklessResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + @staticmethod def SubscribeBalanceSnapshot(request, target, @@ -7663,3 +7722,30 @@ def SubscribePayPartStart(request, timeout, metadata, _registered_method=True) + + @staticmethod + def SubscribeRecklessLog(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/cln.Node/SubscribeRecklessLog', + node__pb2.StreamRecklessLogRequest.SerializeToString, + node__pb2.RecklessLogNotification.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/contrib/pyln-testing/pyln/testing/grpc2py.py b/contrib/pyln-testing/pyln/testing/grpc2py.py index 060389d5629c..3aebbbce5d40 100644 --- a/contrib/pyln-testing/pyln/testing/grpc2py.py +++ b/contrib/pyln-testing/pyln/testing/grpc2py.py @@ -2678,6 +2678,13 @@ def listconfigs_configs_proxy2py(m): }) +def listconfigs_configs_reckless_dir2py(m): + return remove_default({ + "source": m.source, # PrimitiveField in generate_composite + "value_str": m.value_str, # PrimitiveField in generate_composite + }) + + def listconfigs_configs_recover2py(m): return remove_default({ "source": m.source, # PrimitiveField in generate_composite @@ -3529,6 +3536,92 @@ def graceful2py(m): }) +def reckless_disable2py(m): + return remove_default({ + "plugin_name": m.plugin_name, # PrimitiveField in generate_composite + }) + + +def reckless_enable2py(m): + return remove_default({ + "plugin_name": m.plugin_name, # PrimitiveField in generate_composite + }) + + +def reckless_install2py(m): + return remove_default({ + "enabled": m.enabled, # PrimitiveField in generate_composite + "installed_commit": m.installed_commit, # PrimitiveField in generate_composite + "plugin_name": m.plugin_name, # PrimitiveField in generate_composite + }) + + +def reckless_listavailable_manifest2py(m): + return remove_default({ + "dependencies": [m.dependencies for i in m.dependencies], # ArrayField[primitive] in generate_composite + "install_cmd": [m.install_cmd for i in m.install_cmd], # ArrayField[primitive] in generate_composite + "required_options": [m.required_options for i in m.required_options], # ArrayField[primitive] in generate_composite + "entrypoint": m.entrypoint, # PrimitiveField in generate_composite + "installable": m.installable, # PrimitiveField in generate_composite + "long_description": m.long_description, # PrimitiveField in generate_composite + "offer": m.offer, # PrimitiveField in generate_composite + "short_description": m.short_description, # PrimitiveField in generate_composite + }) + + +def reckless_listavailable2py(m): + return remove_default({ + "installer": str(m.installer), # EnumField in generate_composite + "origin": m.origin, # PrimitiveField in generate_composite + "plugin_name": m.plugin_name, # PrimitiveField in generate_composite + }) + + +def reckless_listinstalled2py(m): + return remove_default({ + "installation_date": m.installation_date, # PrimitiveField in generate_composite + "installation_time": m.installation_time, # PrimitiveField in generate_composite + "installed_commit": m.installed_commit, # PrimitiveField in generate_composite + "original_source": m.original_source, # PrimitiveField in generate_composite + "plugin_name": m.plugin_name, # PrimitiveField in generate_composite + "requested_commit": m.requested_commit, # PrimitiveField in generate_composite + }) + + +def reckless_tip2py(m): + return remove_default({ + "amount_msat": amount2msat(m.amount_msat), # PrimitiveField in generate_composite + "amount_sent_msat": amount2msat(m.amount_sent_msat), # PrimitiveField in generate_composite + "failed_parts": m.failed_parts, # PrimitiveField in generate_composite + "payment_preimage": hexlify(m.payment_preimage), # PrimitiveField in generate_composite + "successful_parts": m.successful_parts, # PrimitiveField in generate_composite + }) + + +def reckless_uninstall2py(m): + return remove_default({ + "plugin_name": m.plugin_name, # PrimitiveField in generate_composite + }) + + +def reckless_update2py(m): + return remove_default({ + "enabled": m.enabled, # PrimitiveField in generate_composite + "installed_commit": m.installed_commit, # PrimitiveField in generate_composite + "plugin_name": m.plugin_name, # PrimitiveField in generate_composite + }) + + +def reckless2py(m): + return remove_default({ + "listavailable": [reckless_listavailable2py(i) for i in m.listavailable], # ArrayField[composite] in generate_composite + "listinstalled": [reckless_listinstalled2py(i) for i in m.listinstalled], # ArrayField[composite] in generate_composite + "log": [m.log for i in m.log], # ArrayField[primitive] in generate_composite + "sources": [m.sources for i in m.sources], # ArrayField[primitive] in generate_composite + "update": [reckless_update2py(i) for i in m.update], # ArrayField[composite] in generate_composite + }) + + def decodekeysend_routes2py(m): # manual override return remove_default({ "expirydelta": m.expirydelta, diff --git a/contrib/pyln-testing/pyln/testing/utils.py b/contrib/pyln-testing/pyln/testing/utils.py index 16c63ed92669..6ab0265dd3f0 100644 --- a/contrib/pyln-testing/pyln/testing/utils.py +++ b/contrib/pyln-testing/pyln/testing/utils.py @@ -1025,7 +1025,7 @@ def __init__(self, node_id, lightning_dir, bitcoind, executor, may_fail=False, if dsn is not None: self.daemon.opts['wallet'] = dsn if VALGRIND: - trace_skip_pattern = '*python*,*bitcoin-cli*,*elements-cli*,*cln-grpc*,*clnrest*,*wss-proxy*,*cln-bip353*,*reckless,*cln-currencyrate*' + trace_skip_pattern = '*python*,*bitcoin-cli*,*elements-cli*,*cln-grpc*,*clnrest*,*wss-proxy*,*cln-bip353*,*cln-reckless*,*cln-currencyrate*' if not valgrind_plugins: trace_skip_pattern += ',*plugins*' self.daemon.cmd_prefix = [ diff --git a/doc/Makefile b/doc/Makefile index 2775eb1c9c49..2af53ffee32e 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -191,8 +191,7 @@ NON_PREFIXED_MANPAGES := doc/lightning-cli.1 \ doc/lightningd-config.5 \ doc/lightningd-rpc.7 \ doc/lightning-hsmtool.8 \ - doc/lightning-downgrade.8 \ - doc/lightning-reckless.1 + doc/lightning-downgrade.8 MANPAGES := $(PREFIXED_MANPAGES) $(NON_PREFIXED_MANPAGES) diff --git a/doc/developers-guide/plugin-development/plugin-manager.md b/doc/developers-guide/plugin-development/plugin-manager.md index 418ba3206cbb..70b38fbc9f66 100644 --- a/doc/developers-guide/plugin-development/plugin-manager.md +++ b/doc/developers-guide/plugin-development/plugin-manager.md @@ -6,18 +6,6 @@ content: privacy: view: public --- -`reckless` is a plugin manager for Core Lightning that you can use to install and uninstall [plugins](doc:plugins) with a single command. +`reckless` is a plugin manager for Core Lightning that you can use to install and uninstall (and more!) [plugins](doc:plugins) with a single command. -To make your plugin compatible with reckless install: - -- Choose a unique plugin name. -- The plugin entrypoint is inferred. Naming your plugin executable the same as your plugin name will allow reckless to identify it correctly (file extensions are okay). -- For python plugins, a requirements.txt is the preferred medium for python dependencies. A pyproject.toml will be used as a fallback, but test installation via `pip install -e .` - Poetry looks for additional files in the working directory, whereas with pip, any references to these will require something like `packages = [{ include = "*.py" }]` under the `[tool.poetry]` section. -- Additional repository sources may be added with `reckless source add https://my.repo.url/here` however https://github.com/lightningd/plugins is included by default. Consider adding your plugin lightningd/plugins to make installation simpler. -- If your plugin is located in a subdirectory of your repo with a different name than your plugin, it will likely be overlooked. - -> 📘 -> -> As reckless needs to know how to handle and install the dependencies of a plugin, current version only supports python plugins. We are working on a broader support, e.g., for javascript, golang and other popular programming languages. -> -> Stay tuned and tell us what languages you need support for, and what features you're missing. +Please refer to the `reckless` README for more information: [README.md](https://github.com/ElementsProject/lightning/blob/master/plugins/reckless-plugin/README.md) diff --git a/doc/index.rst b/doc/index.rst index 8a1cf769ddd0..b135674494d4 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -110,7 +110,6 @@ Core Lightning Documentation lightning-cli lightning-downgrade lightning-hsmtool - lightning-reckless lightningd lightningd-config lightningd-rpc @@ -158,6 +157,7 @@ Core Lightning Documentation notification-openchannel_peer_sigs notification-plugin_started notification-plugin_stopped + notification-reckless_log notification-sendpay_failure notification-sendpay_success notification-shutdown diff --git a/doc/lightning-reckless.1.md b/doc/lightning-reckless.1.md deleted file mode 100644 index 4a7b476fe989..000000000000 --- a/doc/lightning-reckless.1.md +++ /dev/null @@ -1,159 +0,0 @@ -reckless - install and activate a CLN plugin by name -==================================================== - -SYNOPSIS --------- - -**reckless** [*options*] **install/uninstall/enable/disable/source** *target* - -DESCRIPTION ------------ - -Reckless is a plugin manager for Core-Lightning. Typical plugin -installation involves: finding the source plugin, copying, -installing dependencies, testing, activating, and updating the -lightningd config file. Reckless does all of these by invoking: - -**reckless** **install**[@*commit/tag*] *plugin\_name* - -Alternatively, the source path or URL to the plugin repository can be -passed directly in place of the *plugin\_name*. In either case, the -containing directory or repository should be named for the plugin, don't -pass the plugin's executable/entrypoint directly. - -reckless will exit early in the event that: - -- the plugin is not found in any available source repositories -- dependencies are not successfully installed -- the plugin fails to execute - -Reckless-installed plugins reside in the 'reckless' subdirectory -of the user's `.lightning` folder. By default, plugins are activated -on the `bitcoin` network (and use lightningd's bitcoin network -config), but regtest may also be used. - -Other commands include: - -**reckless** **uninstall** *plugin\_name* - disables the plugin, removes the directory. - -**reckless** **search** *plugin\_name* - looks through all available sources for a plugin matching - this name. - -**reckless** **enable** *plugin\_name* - dynamically enables the reckless-installed plugin and updates - the config to match. - -**reckless** **disable** *plugin\_name* - dynamically disables the reckless-installed plugin and updates - the config to match. - -**reckless** **source** **list** - list available plugin repositories. - -**reckless** **source** **add** *repo\_url* - add another plugin repo for reckless to search. - -**reckless** **source** **rm** *repo\_url* - remove a plugin repo for reckless to search. - -**reckless** **update** *[plugin\_name]* - install the latest commit of a single plugin, or omit to update all - reckless-installed plugins. Does not automatically update if a plugin - was previously installed by requesting a specific git tag or commit. - -OPTIONS -------- - -Available option flags: - -**-d**, **--reckless-dir** *reckless\_dir* - specify an alternative data directory for reckless to use. - Useful if your .lightning is protected from execution. - -**-l**, **--lightning** *lightning\_data\_dir* - lightning data directory (defaults to $USER/.lightning) - -**-c**, **--conf** *lightning\_config* - pass the config used by lightningd - -**-r**, **--regtest** - use the regtest network and config instead of bitcoin mainnet - -**-v**, **--verbose** - request additional debug output - -**--network**=*network* - specify bitcoin, regtest, liquid, liquid-regtest, signet, - or testnet networks. (default: bitcoin) - -NOTES ------ - -Reckless currently supports python, rust, and javascript plugins. - -Running the first time will prompt the user that their lightningd's -bitcoin config will be appended (or created) to inherit the reckless -config file (this config is specific to bitcoin by default.) -Management of plugins will subsequently modify this file. - - -Troubleshooting tips: - -Plugins must be executable. For python plugins, the shebang is -invoked, so **python3** should be available in your environment. This -can be verified with **which Python3**. The default reckless directory -is $USER/.lightning/reckless and it should be possible for the -lightningd user to execute files located here. If this is a problem, -the option flag **reckless -d=`my_alternate_dir`** may be used to -relocate the reckless directory from its default. Consider creating a -permanent alias in this case. - -Python plugins are installed to their own virtual environments. The -environment is activated by a wrapper (named the same as the plugin) -which then imports and executes the actual plugin entrypoint. - -For Plugin Developers: - -To make your plugin compatible with reckless install: - -- Choose a unique plugin name. -- The plugin entrypoint is inferred. Naming your plugin executable - the same as your plugin name will allow reckless to identify it - correctly (file extensions are okay.) -- For python plugins, a requirements.txt is the preferred medium for - python dependencies. A pyproject.toml will be used as a fallback, - but test installation via `pip install -e .` - Poetry looks for - additional files in the working directory, whereas with pip, any - references to these will require something like - `packages = [{ include = "*.py" }]` under the `[tool.poetry]` - section. -- Additional repository sources may be added with - `reckless source add https://my.repo.url/here` however, - https://github.com/lightningd/plugins is included by default. - Consider adding your plugin lightningd/plugins to make - installation simpler. -- If your plugin is located in a subdirectory of your repo with a - different name than your plugin, it will likely be overlooked. - -AUTHOR ------- - -Antoine Poinsot wrote the original reckless plugin on which this is -based. - -Rusty Russell wrote the outline for the reckless utility's function - -Alex Myers [alex@endothermic.dev](mailto:alex@endothermic.dev) is mostly responsible for the -reckless code and this man page, with thanks to Christian Decker for extensive review. - -SEE ALSO --------- - -reckless(7), Core-Lightning plugins repo: [https://github.com/lightningd/plugins](https://github.com/lightningd/plugins) - -RESOURCES ---------- - -Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning) diff --git a/doc/lightningd-config.5.md b/doc/lightningd-config.5.md index aaa3e8fb8bc7..f1802c8ca749 100644 --- a/doc/lightningd-config.5.md +++ b/doc/lightningd-config.5.md @@ -334,6 +334,11 @@ connections. Default is 9736. them over grpc. If buffer overflow occurs some notifications will not be delivered. +* **reckless-dir**=*DIR* + + Set the working directory for reckless, where repositories, metadata, reckless-installed + plugins, and a reckless-installed config is stored. Defaults to `lightning-dir/../reckless` + ### Lightning node customization options * **recover**=*mnemonic* diff --git a/doc/node-operators-guide/plugins.md b/doc/node-operators-guide/plugins.md index be288d921ecc..a7c9fc3ba97d 100644 --- a/doc/node-operators-guide/plugins.md +++ b/doc/node-operators-guide/plugins.md @@ -10,110 +10,6 @@ Power up your Core Lightning node and tailor it for your business needs with com ## Reckless plugin manager -`reckless` is a plugin manager for Core Lightning that you can use to install and uninstall plugins with a single command. +`reckless` is a plugin manager for Core Lightning that you can use to install and uninstall (and more!) plugins with a single command. -> 📘 -> -> Reckless currently supports python plugins only. Additional language support will be provided in future releases. For plugins built by the community in other languages, see the complete list of plugins [here](https://github.com/lightningd/plugins). - -Typical plugin installation involves: finding the source plugin, copying, installing dependencies, testing, activating, and updating the lightningd config file. Reckless does all of these by invoking: - -```shell -reckless install plugin_name -``` - - - -reckless will exit early in the event that: - -- the plugin is not found in any available source repositories -- dependencies are not sucessfully installed -- the plugin fails to execute - -Reckless-installed plugins reside in the 'reckless' subdirectory of the user's `.lightning` folder. By default, plugins are activated on the `bitcoin` network (and use lightningd's bitcoin network config), but regtest may also be used. - -Other commands include: - -Disable the plugin, remove the directory: - -```shell -reckless uninstall plugin_name -``` - - - -Look through all available sources for a plugin matching this name: - -```shell -reckless search plugin_name -``` - - - -Dynamically enable the reckless-installed plugin and update the config to match: - -```shell -reckless enable plugin_name -``` - - - -Dynamically disable the reckless-installed plugin and update the config to match: - -```shell -reckless disable plugin_name -``` - - - -List available plugin repositories: - -```shell -reckless source list -``` - - - -Add another plugin repo for reckless to search: - -```shell -reckless source add repo_url -``` - - - -Remove a plugin repo for reckless to search: - -```shell -reckless source rm repo_url -``` - - - -## Options - -Available option flags: - -**-d**, **--reckless-dir** _reckless\_dir_ - specify an alternative data directory for reckless to use. - Useful if your .lightning is protected from execution. - -**-l**, **--lightning** _lightning\_data\_dir_ - lightning data directory (defaults to $USER/.lightning) - -**-c**, **--conf** _lightning\_config_ - pass the config used by lightningd - -**-r**, **--regtest** - use the regtest network and config instead of bitcoin mainnet - -**-v**, **--verbose** - request additional debug output - -> 📘 -> -> Running the first time will prompt the user that their lightningd's bitcoin config will be appended (or created) to inherit the reckless config file (this config is specific to bitcoin by default.) Management of plugins will subsequently modify this file. - -## Troubleshooting - -Plugins must be executable. For python plugins, the shebang is invoked, so **python3** should be available in your environment. This can be verified with **which Python3**. The default reckless directory is $USER/.lightning/reckless and it should be possible for the lightningd user to execute files located here. If this is a problem, the option flag **reckless -d=\** may be used to relocate the reckless directory from its default. Consider creating a permanent alias in this case. +Please refer to the `reckless` README for more information: [README.md](https://github.com/ElementsProject/lightning/blob/master/plugins/reckless-plugin/README.md) diff --git a/doc/reckless.7.md b/doc/reckless.7.md deleted file mode 100644 index 49918023d56b..000000000000 --- a/doc/reckless.7.md +++ /dev/null @@ -1,167 +0,0 @@ -reckless -- Issue a command to the reckless plugin manager utility -================================================================== - -SYNOPSIS --------- - -**reckless** *command* [*target/subcommand*] [*target*] - -DESCRIPTION ------------ - -The **reckless** RPC starts a reckless process with the *command* and *target* provided. Node configuration, network, and lightning direrctory are automatically passed to the reckless utility. - -- **command** (string) (one of "install", "uninstall", "search", "enable", "disable", "source", "--version"): Determines which command to pass to reckless - - *command* **install** takes a *plugin\_name* to search for and install a named plugin. - - *command* **uninstall** takes a *plugin\_name* and attempts to uninstall a plugin of the same name. - - *command* **search** takes a *plugin\_name* to search for a named plugin. - ... -- **target/subcommand** (one of, optional): Target of a reckless command or a subcommand.: - - (string) - - (array) -- **target** (one of, optional): *name* of a plugin to install/uninstall/search/enable/disable or source to add/remove.: - - (string) - - (array) - -RETURN VALUE ------------- - -On success, an object is returned, containing: - -- **result** (array of strings): Output of the requested reckless command.: - - (string, optional) -- **log** (array of strings): Verbose log entries of the requested reckless command.: - - (string, optional) - -AUTHOR ------- - -Alex Myers [alex@endothermic.dev](mailto:alex@endothermic.dev) is mainly responsible. - -SEE ALSO --------- - -reckless(1) - -RESOURCES ---------- - -Main web site: [https://github.com/ElementsProject/lightning](https://github.com/ElementsProject/lightning) - -EXAMPLES --------- - - -**Example 1**: - -Request: -```shell -lightning-cli reckless -k "command"="search" "target/subcommand"="backup" -``` -```json -{ - "id": "example:reckless#1", - "method": "reckless", - "params": { - "command": "search", - "target/subcommand": "backup" - } -} -``` - -Response: -```json -{ - "result": [ - "https://github.com/lightningd/plugins" - ], - "log": [ - "DEBUG: Warning: Reckless requires write access", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/contents/", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/git/trees/294f93d7060799439c994daa84f534c4d1458325", - "INFO: found backup in source: https://github.com/lightningd/plugins", - "DEBUG: entry: None", - "DEBUG: sub-directory: backup" - ] -} -``` - -**Example 2**: - -Request: -```shell -lightning-cli reckless -k "command"="install" "target/subcommand"='["summars", "currecyrate"]' -``` -```json -{ - "id": "example:reckless#2", - "method": "reckless", - "params": { - "command": "install", - "target/subcommand": [ - "summars", - "currecyrate" - ] - } -} -``` - -Response: -```json -{ - "result": [ - "/tmp/l1/reckless/summars", - "/tmp/l1/reckless/currencyrate" - ], - "log": [ - "DEBUG: Searching for summars", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/contents/", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/git/trees/294f93d7060799439c994daa84f534c4d1458325", - "INFO: found summars in source: https://github.com/lightningd/plugins", - "DEBUG: entry: None", - "DEBUG: sub-directory: summars", - "DEBUG: Retrieving summars from https://github.com/lightningd/plugins", - "DEBUG: Install requested from InstInfo(summars, https://github.com/lightningd/plugins, None, None, None, summars).", - "INFO: cloning Source.GITHUB_REPO InstInfo(summars, https://github.com/lightningd/plugins, None, None, None, summars)", - "DEBUG: cloned_src: InstInfo(summars, /tmp/reckless-726255950dyifh_fh/clone, None, Cargo.toml, Cargo.toml, summars/summars)", - "DEBUG: using latest commit of default branch", - "DEBUG: checked out HEAD: 5e449468bd57db7d0f33178fe0dc867e0da94133", - "DEBUG: using installer rust", - "DEBUG: creating /tmp/l1/reckless/summars", - "DEBUG: creating /tmp/l1/reckless/summars/source", - "DEBUG: copying /tmp/reckless-726255950dyifh_fh/clone/summars/summars tree to /tmp/l1/reckless/summars/source/summars", - "DEBUG: linking source /tmp/l1/reckless/summars/source/summars/Cargo.toml to /tmp/l1/reckless/summars/Cargo.toml", - "DEBUG: InstInfo(summars, /tmp/l1/reckless/summars, None, Cargo.toml, Cargo.toml, source/summars)", - "DEBUG: cargo installing from /tmp/l1/reckless/summars/source/summars", - "DEBUG: rust project compiled successfully", - "INFO: plugin installed: /tmp/l1/reckless/summars", - "DEBUG: activating summars", - "INFO: summars enabled", - "DEBUG: Searching for currencyrate", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/contents/", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/git/trees/294f93d7060799439c994daa84f534c4d1458325", - "INFO: found currencyrate in source: https://github.com/lightningd/plugins", - "DEBUG: entry: None", - "DEBUG: sub-directory: currencyrate", - "DEBUG: Retrieving currencyrate from https://github.com/lightningd/plugins", - "DEBUG: Install requested from InstInfo(currencyrate, https://github.com/lightningd/plugins, None, None, None, currencyrate).", - "INFO: cloning Source.GITHUB_REPO InstInfo(currencyrate, https://github.com/lightningd/plugins, None, None, None, currencyrate)", - "DEBUG: cloned_src: InstInfo(currencyrate, /tmp/reckless-192564272t478naxn/clone, None, currencyrate.py, requirements.txt, currencyrate/currencyrate)", - "DEBUG: using latest commit of default branch", - "DEBUG: checked out HEAD: 5e449468bd57db7d0f33178fe0dc867e0da94133", - "DEBUG: using installer python3venv", - "DEBUG: creating /tmp/l1/reckless/currencyrate", - "DEBUG: creating /tmp/l1/reckless/currencyrate/source", - "DEBUG: copying /tmp/reckless-192564272t478naxn/clone/currencyrate/currencyrate tree to /tmp/l1/reckless/currencyrate/source/currencyrate", - "DEBUG: linking source /tmp/l1/reckless/currencyrate/source/currencyrate/currencyrate.py to /tmp/l1/reckless/currencyrate/currencyrate.py", - "DEBUG: InstInfo(currencyrate, /tmp/l1/reckless/currencyrate, None, currencyrate.py, requirements.txt, source/currencyrate)", - "DEBUG: configuring a python virtual environment (pip) in /tmp/l1/reckless/currencyrate/.venv", - "DEBUG: virtual environment created in /tmp/l1/reckless/currencyrate/.venv.", - "INFO: dependencies installed successfully", - "DEBUG: virtual environment for cloned plugin: .venv", - "INFO: plugin installed: /tmp/l1/reckless/currencyrate", - "DEBUG: activating currencyrate", - "INFO: currencyrate enabled" - ] -} -``` diff --git a/doc/schemas/listconfigs.json b/doc/schemas/listconfigs.json index 160585efa428..e1e533555f07 100644 --- a/doc/schemas/listconfigs.json +++ b/doc/schemas/listconfigs.json @@ -1962,6 +1962,31 @@ ] } } + }, + "reckless-dir": { + "added": "v26.09", + "type": "object", + "additionalProperties": false, + "required": [ + "value_str", + "source" + ], + "properties": { + "value_str": { + "added": "v26.09", + "type": "string", + "description": [ + "Field from config or cmdline, or default." + ] + }, + "source": { + "added": "v26.09", + "type": "string", + "description": [ + "Source of configuration setting." + ] + } + } } } } diff --git a/doc/schemas/notification/reckless_log.json b/doc/schemas/notification/reckless_log.json new file mode 100644 index 000000000000..db31a19e9840 --- /dev/null +++ b/doc/schemas/notification/reckless_log.json @@ -0,0 +1,54 @@ +{ + "$schema": "../../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "notification": "reckless_log", + "title": "Notification for reckless log events", + "description": [ + "The **reckless_log** notification informs whenever the reckless plugin emits a log message during **install** or **update**" + ], + "added": "v26.09", + "request": {}, + "response": { + "required": [ + "level", + "time", + "timestamp", + "log" + ], + "properties": { + "level": { + "type": "string", + "enum": [ + "io", + "trace", + "debug", + "info", + "unusual", + "broken" + ], + "description": [ + "The log level of the emitted message." + ] + }, + "time": { + "type": "string", + "description": [ + "The event time as seconds since epoch with subsecond precision." + ] + }, + "timestamp": { + "type": "string", + "description": [ + "The event time in ISO 8601 format." + ] + }, + "log": { + "type": "string", + "description": [ + "The original log message." + ] + } + } + } +} diff --git a/doc/schemas/plugin.json b/doc/schemas/plugin.json index 11e643a24674..6c7cac527e87 100644 --- a/doc/schemas/plugin.json +++ b/doc/schemas/plugin.json @@ -257,11 +257,6 @@ "active": true, "dynamic": true }, - { - "name": "/usr/local/libexec/plugins/recklessrpc", - "active": true, - "dynamic": true - }, { "name": "/usr/local/libexec/plugins/recover", "active": true, @@ -312,6 +307,11 @@ "active": true, "dynamic": true }, + { + "name": "/usr/local/libexec/plugins/cln-reckless", + "active": true, + "dynamic": true + }, { "name": "/usr/local/libexec/plugins/bookkeeper", "active": true, @@ -405,11 +405,6 @@ "active": true, "dynamic": true }, - { - "name": "/usr/local/libexec/plugins/recklessrpc", - "active": true, - "dynamic": true - }, { "name": "/usr/local/libexec/plugins/recover", "active": true, @@ -460,6 +455,11 @@ "active": true, "dynamic": true }, + { + "name": "/usr/local/libexec/plugins/cln-reckless", + "active": true, + "dynamic": true + }, { "name": "/usr/local/libexec/plugins/bookkeeper", "active": true, diff --git a/doc/schemas/reckless.json b/doc/schemas/reckless.json index 294fdf8f9690..6d18b3d57117 100644 --- a/doc/schemas/reckless.json +++ b/doc/schemas/reckless.json @@ -1,10 +1,11 @@ { "$schema": "../rpc-schema-draft.json", "type": "object", + "added": "v22.11", "rpc": "reckless", - "title": "Issue a command to the reckless plugin manager utility", + "title": "Reckless, a plugin manager", "description": [ - "The **reckless** RPC starts a reckless process with the *command* and *target* provided. Node configuration, network, and lightning direrctory are automatically passed to the reckless utility." + "The **reckless** RPC lets you manage plugins. It has multiple commands available, best described in the **help** command." ], "request": { "required": [ @@ -16,63 +17,411 @@ "type": "string", "enum": [ "install", + "update", "uninstall", - "search", + "listavailable", + "listinstalled", "enable", "disable", "source", - "--version" + "tip", + "help" ], "description": [ "Determines which command to pass to reckless", " - *command* **install** takes a *plugin_name* to search for and install a named plugin.", " - *command* **uninstall** takes a *plugin_name* and attempts to uninstall a plugin of the same name.", - " - *command* **search** takes a *plugin_name* to search for a named plugin.", + " - *command* **help** takes a *command* to display help for (plain text).", "..." ] }, - "target/subcommand": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "array" - } + "subcommand": { + "type": "string", + "enum": [ + "add", + "list", + "remove" ], "description": [ - "Target of a reckless command or a subcommand." + "A subcommand. Only in combination with *command* **source**." ] }, "target": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "array" - } - ], + "type": "string", + "description": [ + "*name* of a plugin to install/update/uninstall/listavailable/enable/disable or source to add/remove. Can also have a git ref added with `@` to install a specific version." + ] + }, + "options": { + "type": "array", + "added": "v26.09", + "items": { + "type": "string" + }, + "description": [ + "Plugin options to be used with the commands **install**/**update**/**enable** in the form of `key=value`." + ] + }, + "amount_msat": { + "type": "msat", + "added": "v26.09", + "description": [ + "The amount of msat to send when using the *command* **tip**." + ] + }, + "payer_note": { + "type": "string", + "added": "v26.09", + "description": [ + "A message that a payer is willing to send to a payee when using the *command* **tip**." + ] + }, + "verbose": { + "type": "boolean", + "added": "v26.09", "description": [ - "*name* of a plugin to install/uninstall/search/enable/disable or source to add/remove." + "Verbose output for all logging outputs for this command." + ] + }, + "developer": { + "type": "boolean", + "added": "v26.09", + "description": [ + "Build plugins in debug mode and do not clean up build files where applicable." ] } } }, "response": { "required": [ - "log", - "result" + "log" ], "additionalProperties": false, "properties": { - "result": { + "install": { + "type": "object", + "added": "v26.09", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was installed." + ] + }, + "enabled": { + "type": "boolean", + "description": [ + "Whether the plugin was enabled or not." + ] + }, + "installed_commit": { + "type": "string", + "description": [ + "The git ref that was installed. Only present if source is a remote git repository." + ] + } + }, + "required": [ + "plugin_name", + "enabled" + ], + "additionalProperties": false + }, + "update": { + "type": "array", + "added": "v26.09", + "items": { + "type": "object", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was updated." + ] + }, + "enabled": { + "type": "boolean", + "description": [ + "Whether the plugin was enabled or not." + ] + }, + "installed_commit": { + "type": "string", + "description": [ + "The git ref that the plugin was updated to. Only present if source is a remote git repository." + ] + } + }, + "required": [ + "plugin_name", + "enabled" + ], + "additionalProperties": false + } + }, + "uninstall": { + "type": "object", + "added": "v26.09", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was uninstalled." + ] + } + }, + "required": [ + "plugin_name" + ], + "additionalProperties": false + }, + "enable": { + "type": "object", + "added": "v26.09", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was enabled." + ] + } + }, + "required": [ + "plugin_name" + ], + "additionalProperties": false + }, + "disable": { + "type": "object", + "added": "v26.09", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was disabled." + ] + } + }, + "required": [ + "plugin_name" + ], + "additionalProperties": false + }, + "listavailable": { + "type": "array", + "added": "v26.09", + "items": { + "type": "object", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was listed." + ] + }, + "installer": { + "type": "string", + "enum": [ + "PythonUv", + "PythonUvShebang", + "PythonUvLegacy", + "PoetryVenv", + "PyprojectViaPip", + "Python", + "Nodejs", + "Rust", + "Go", + "Custom" + ], + "description": [ + "The name of the plugin installer that will be used." + ] + }, + "manifest": { + "type": "object", + "properties": { + "short_description": { + "type": "string", + "description": [ + "A short description of the plugin." + ] + }, + "long_description": { + "type": "string", + "description": [ + "A long description of the plugin." + ] + }, + "entrypoint": { + "type": "string", + "description": [ + "The entrypoint for the plugin." + ] + }, + "dependencies": { + "type": "array", + "items": { + "type": "string" + }, + "description": [ + "Programs needed to install this plugin." + ] + }, + "install_cmd": { + "type": "array", + "items": { + "type": "string" + }, + "description": [ + "Custom commands needed to install this plugin, if the default installers do not work." + ] + }, + "required_options": { + "type": "array", + "items": { + "type": "string" + }, + "description": [ + "Options needed to install this plugin." + ] + }, + "offer": { + "type": "string", + "description": [ + "An offer for users to tip for this plugin." + ] + }, + "installable": { + "type": "boolean", + "description": [ + "Whether this plugin is reckless-installable." + ] + } + }, + "required": [ + "entrypoint" + ], + "additionalProperties": false + }, + "origin": { + "type": "string", + "description": [ + "The origin of the plugin." + ] + } + }, + "required": [ + "plugin_name", + "installer", + "manifest", + "origin" + ], + "additionalProperties": false + } + }, + "listinstalled": { + "type": "array", + "added": "v26.09", + "items": { + "type": "object", + "properties": { + "plugin_name": { + "type": "string", + "description": [ + "The name of the plugin that was listed." + ] + }, + "installation_date": { + "type": "string", + "description": [ + "The date the plugin was installed." + ] + }, + "installation_time": { + "type": "number", + "description": [ + "The timestamp the plugin was installed." + ] + }, + "original_source": { + "type": "string", + "description": [ + "The original source of the plugin." + ] + }, + "requested_commit": { + "type": "string", + "description": [ + "The git ref that was requested to be installed." + ] + }, + "installed_commit": { + "type": "string", + "description": [ + "The git ref that was installed." + ] + } + }, + "required": [ + "plugin_name", + "installation_date", + "installation_time", + "original_source" + ], + "additionalProperties": false + } + }, + "sources": { "type": "array", + "added": "v26.09", "items": { "type": "string" }, "description": [ - "Output of the requested reckless command." + "The list of current sources." + ] + }, + "tip": { + "type": "object", + "added": "v26.09", + "properties": { + "payment_preimage": { + "type": "secret", + "description": [ + "The proof of payment: SHA256 of this **payment_hash**." + ] + }, + "failed_parts": { + "type": "u64", + "description": [ + "How many separate payment parts failed." + ] + }, + "successful_parts": { + "type": "u64", + "description": [ + "How many separate payment parts succeeded (or are anticipated to succeed). This will be at least one." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "Amount the recipient received." + ] + }, + "amount_sent_msat": { + "type": "msat", + "description": [ + "Total amount we sent (including fees)." + ] + } + }, + "required": [ + "payment_preimage", + "failed_parts", + "successful_parts", + "amount_msat", + "amount_sent_msat" ] }, "log": { @@ -81,13 +430,14 @@ "type": "string" }, "description": [ - "Verbose log entries of the requested reckless command." + "Log entries of the requested reckless command." ] } } }, "author": [ - "Alex Myers [alex@endothermic.dev](mailto:alex@endothermic.dev) is mainly responsible." + "Alex Myers [alex@endothermic.dev](mailto:alex@endothermic.dev) is mainly responsible for the original python reckless.", + "daywalker90 [daywalker990@gmx.de](mailto:daywalker990@gmx.de) is mainly responsible for the current rust reckless." ], "see_also": [ "reckless(1)" @@ -101,90 +451,82 @@ "id": "example:reckless#1", "method": "reckless", "params": { - "command": "search", - "target/subcommand": "backup" + "command": "install", + "target": "summary" } }, "response": { - "result": [ - "https://github.com/lightningd/plugins" - ], + "install": { + "enabled": false, + "installed_commit": "002761088174c151237e8a847c50603db20d5abf", + "plugin_name": "summary" + }, "log": [ - "DEBUG: Warning: Reckless requires write access", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/contents/", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/git/trees/294f93d7060799439c994daa84f534c4d1458325", - "INFO: found backup in source: https://github.com/lightningd/plugins", - "DEBUG: entry: None", - "DEBUG: sub-directory: backup" + "INFO: running command: `git clone --recursive https://github.com/lightningd/plugins /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins`", + "", + "INFO: running command: `git submodule sync --recursive` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins)", + "", + "INFO: running command: `git submodule update --init --recursive` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins)", + "WARNING: could not detect installer for /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins: entryfile not found", + "INFO: Plugins matching 'summary':", + "INFO: summary (https://github.com/lightningd/plugins)", + "INFO: found summary in source: https://github.com/lightningd/plugins", + "INFO: running command: `git pull --ff-only` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins)", + "INFO: Already up to date.", + "INFO: running command: `git submodule sync --recursive` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins)", + "", + "INFO: running command: `git submodule update --init --recursive` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins)", + "INFO: running command: `git checkout HEAD` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins/summary)", + "INFO: Your branch is up to date with 'origin/master'.", + "INFO: using installer pythonuvshebang", + "INFO: running command: `git rev-parse HEAD` (cwd: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/lightningd/plugins/summary)", + "INFO: 002761088174c151237e8a847c50603db20d5abf", + "INFO: plugin installed: /tmp/ltests-88arihe3/test_generate_examples_1/lightning-1/reckless/summary/summary.py", + "WARNING: plugin exited before sending getmanifest response", + "WARNING: summary failed to start, it may require options, read the logs!" ] } }, { "request": { - "id": "example:reckless#2", + "id": "example:reckless#1", "method": "reckless", "params": { - "command": "install", - "target/subcommand": [ - "summars", - "currecyrate" - ] + "command": "tip", + "target": "summary", + "amount_msat": 1000, + "payer_note": "thanks!" } }, "response": { - "result": [ - "/tmp/l1/reckless/summars", - "/tmp/l1/reckless/currencyrate" - ], + "tip": { + "amount_msat": 1000, + "amount_sent_msat": 1000, + "failed_parts": 0, + "payment_preimage": "940148d45ce964205c289a215d2b45e7bad32caa4318eb1977184fe424d04a00", + "successful_parts": 1 + }, "log": [ - "DEBUG: Searching for summars", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/contents/", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/git/trees/294f93d7060799439c994daa84f534c4d1458325", - "INFO: found summars in source: https://github.com/lightningd/plugins", - "DEBUG: entry: None", - "DEBUG: sub-directory: summars", - "DEBUG: Retrieving summars from https://github.com/lightningd/plugins", - "DEBUG: Install requested from InstInfo(summars, https://github.com/lightningd/plugins, None, None, None, summars).", - "INFO: cloning Source.GITHUB_REPO InstInfo(summars, https://github.com/lightningd/plugins, None, None, None, summars)", - "DEBUG: cloned_src: InstInfo(summars, /tmp/reckless-726255950dyifh_fh/clone, None, Cargo.toml, Cargo.toml, summars/summars)", - "DEBUG: using latest commit of default branch", - "DEBUG: checked out HEAD: 5e449468bd57db7d0f33178fe0dc867e0da94133", - "DEBUG: using installer rust", - "DEBUG: creating /tmp/l1/reckless/summars", - "DEBUG: creating /tmp/l1/reckless/summars/source", - "DEBUG: copying /tmp/reckless-726255950dyifh_fh/clone/summars/summars tree to /tmp/l1/reckless/summars/source/summars", - "DEBUG: linking source /tmp/l1/reckless/summars/source/summars/Cargo.toml to /tmp/l1/reckless/summars/Cargo.toml", - "DEBUG: InstInfo(summars, /tmp/l1/reckless/summars, None, Cargo.toml, Cargo.toml, source/summars)", - "DEBUG: cargo installing from /tmp/l1/reckless/summars/source/summars", - "DEBUG: rust project compiled successfully", - "INFO: plugin installed: /tmp/l1/reckless/summars", - "DEBUG: activating summars", - "INFO: summars enabled", - "DEBUG: Searching for currencyrate", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/contents/", - "DEBUG: fetching from gh API: https://api.github.com/repos/lightningd/plugins/git/trees/294f93d7060799439c994daa84f534c4d1458325", - "INFO: found currencyrate in source: https://github.com/lightningd/plugins", - "DEBUG: entry: None", - "DEBUG: sub-directory: currencyrate", - "DEBUG: Retrieving currencyrate from https://github.com/lightningd/plugins", - "DEBUG: Install requested from InstInfo(currencyrate, https://github.com/lightningd/plugins, None, None, None, currencyrate).", - "INFO: cloning Source.GITHUB_REPO InstInfo(currencyrate, https://github.com/lightningd/plugins, None, None, None, currencyrate)", - "DEBUG: cloned_src: InstInfo(currencyrate, /tmp/reckless-192564272t478naxn/clone, None, currencyrate.py, requirements.txt, currencyrate/currencyrate)", - "DEBUG: using latest commit of default branch", - "DEBUG: checked out HEAD: 5e449468bd57db7d0f33178fe0dc867e0da94133", - "DEBUG: using installer python3venv", - "DEBUG: creating /tmp/l1/reckless/currencyrate", - "DEBUG: creating /tmp/l1/reckless/currencyrate/source", - "DEBUG: copying /tmp/reckless-192564272t478naxn/clone/currencyrate/currencyrate tree to /tmp/l1/reckless/currencyrate/source/currencyrate", - "DEBUG: linking source /tmp/l1/reckless/currencyrate/source/currencyrate/currencyrate.py to /tmp/l1/reckless/currencyrate/currencyrate.py", - "DEBUG: InstInfo(currencyrate, /tmp/l1/reckless/currencyrate, None, currencyrate.py, requirements.txt, source/currencyrate)", - "DEBUG: configuring a python virtual environment (pip) in /tmp/l1/reckless/currencyrate/.venv", - "DEBUG: virtual environment created in /tmp/l1/reckless/currencyrate/.venv.", - "INFO: dependencies installed successfully", - "DEBUG: virtual environment for cloned plugin: .venv", - "INFO: plugin installed: /tmp/l1/reckless/currencyrate", - "DEBUG: activating currencyrate", - "INFO: currencyrate enabled" + "WARNING: summary is not installed", + "INFO: summary not installed, searching in sources...", + "INFO: running command: `git remote set-head origin -a` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "INFO: origin/HEAD set to master", + "INFO: running command: `git symbolic-ref refs/remotes/origin/HEAD --short` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "INFO: origin/master", + "INFO: running command: `git checkout master` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "WARNING: Already on 'master'", + "INFO: Your branch is up to date with 'origin/master'.", + "INFO: running command: `git pull --ff-only` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "INFO: Already up to date.", + "INFO: running command: `git submodule sync --recursive` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "", + "INFO: running command: `git submodule update --init --recursive` (cwd: /tmp/l1/reckless/lightningd/plugins)", + "WARNING: could not detect installer for /tmp/l1/reckless/lightningd/plugins: entryfile not found", + "INFO: Plugins matching 'summary':", + "INFO: summary (/media/addonssd/dev/plugins/summary)", + "INFO: found summary in source: /media/addonssd/dev/plugins/summary", + "INFO: Sending 1000msat to summary author...", + "INFO: Successfully sent 1000msat to summary author!" ] } } diff --git a/mkdocs.yml b/mkdocs.yml index 7112dac569f2..7f0e78a1835f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -133,6 +133,7 @@ nav: - "lightning-pay": "lightning-pay.7.md" - "lightning-ping": "lightning-ping.7.md" - "lightning-plugin": "lightning-plugin.7.md" + - "lightning-reckless": "lightning-reckless.7.md" - "lightning-recoverchannel": "lightning-recoverchannel.7.md" - "lightning-reserveinputs": "lightning-reserveinputs.7.md" - "lightning-sendcustommsg": "lightning-sendcustommsg.7.md" @@ -159,7 +160,6 @@ nav: - "lightningd-config": "lightningd-config.5.md" - "lightningd-rpc": "lightningd-rpc.7.md" - "lightningd": "lightningd.8.md" - - "reckless": "reckless.7.md" # block_end manpages - About: - Changelog: "CHANGELOG.md" diff --git a/nix/apps.nix b/nix/apps.nix index 7d9babba5bba..527451c29cc0 100644 --- a/nix/apps.nix +++ b/nix/apps.nix @@ -22,10 +22,6 @@ program = "${self'.packages.cln}/bin/lightning-hsmtool"; meta.description = "Core Lightning HSM tool"; }; - reckless = { - program = "${self'.packages.cln}/bin/reckless"; - meta.description = "Core Lightning reckless tool"; - }; }; }; } diff --git a/plugins/.gitignore b/plugins/.gitignore index 06daa728eca9..a90b62b6bad9 100644 --- a/plugins/.gitignore +++ b/plugins/.gitignore @@ -17,9 +17,9 @@ sql cln-renepay recover cln-askrene -recklessrpc exposesecret cln-xpay cln-lsps-client cln-lsps-service cln-bwatch +cln-reckless diff --git a/plugins/Makefile b/plugins/Makefile index d302cc74d597..c731401a654a 100644 --- a/plugins/Makefile +++ b/plugins/Makefile @@ -87,9 +87,6 @@ PLUGIN_FUNDER_HEADER := \ plugins/funder_policy.h PLUGIN_FUNDER_OBJS := $(PLUGIN_FUNDER_SRC:.c=.o) -PLUGIN_RECKLESSRPC_SRC := plugins/recklessrpc.c -PLUGIN_RECKLESSRPC_OBJS := $(PLUGIN_RECKLESSRPC_SRC:.c=.o) - PLUGIN_ALL_SRC := \ $(PLUGIN_AUTOCLEAN_SRC) \ $(PLUGIN_chanbackup_SRC) \ @@ -106,8 +103,7 @@ PLUGIN_ALL_SRC := \ $(PLUGIN_PAY_LIB_SRC) \ $(PLUGIN_PAY_SRC) \ $(PLUGIN_SPENDER_SRC) \ - $(PLUGIN_RECOVER_SRC) \ - $(PLUGIN_RECKLESSRPC_SRC) + $(PLUGIN_RECOVER_SRC) PLUGIN_ALL_HEADER := \ $(PLUGIN_PAY_HEADER) \ @@ -130,7 +126,6 @@ C_PLUGINS := \ plugins/keysend \ plugins/offers \ plugins/pay \ - plugins/recklessrpc \ plugins/recover \ plugins/txprepare \ plugins/cln-renepay \ @@ -153,7 +148,7 @@ $(shell test -d plugins/clnrest && $(RM) -r plugins/clnrest || true) $(shell test -d plugins/wss-proxy && $(RM) -r plugins/wss-proxy || true) ifneq ($(RUST),0) -RUST_PLUGIN_NAMES := cln-grpc clnrest cln-lsps-client cln-lsps-service wss-proxy cln-bip353 cln-currencyrate +RUST_PLUGIN_NAMES := cln-grpc clnrest cln-lsps-client cln-lsps-service wss-proxy cln-bip353 cln-currencyrate cln-reckless # Builtin plugins must be in this plugins dir to work when we're executed # *without* make install. @@ -218,8 +213,6 @@ plugins/funder: $(PLUGIN_FUNDER_OBJS) $(PLUGIN_LIB_OBJS) libcommon.a plugins/recover: $(PLUGIN_RECOVER_OBJS) $(PLUGIN_LIB_OBJS) libcommon.a -plugins/recklessrpc: $(PLUGIN_RECKLESSRPC_OBJS) $(PLUGIN_LIB_OBJS) libcommon.a - # This covers all the low-level list RPCs which return simple arrays SQL_LISTRPCS := listchannels listforwards listhtlcs listinvoices listnodes listoffers listpeers listpeerchannels listclosedchannels listtransactions listsendpays listchainmoves listchannelmoves bkpr-listaccountevents bkpr-listincome listnetworkevents SQL_LISTRPCS_SCHEMAS := $(foreach l,$(SQL_LISTRPCS),doc/schemas/$l.json) @@ -274,6 +267,7 @@ CLN_LSPS_PLUGIN_SRC = $(shell find plugins/lsps-plugin/src -name "*.rs") CLN_WSS_PROXY_PLUGIN_SRC = $(shell find plugins/wss-proxy-plugin/src -name "*.rs") CLN_BIP353_PLUGIN_SRC = $(shell find plugins/bip353-plugin/src -name "*.rs") CLN_CURRENCYRATE_PLUGIN_SRC = $(shell find plugins/currencyrate-plugin/src -name "*.rs") +CLN_RECKLESS_PLUGIN_SRC = $(shell find plugins/reckless-plugin/src -name "*.rs") $(RUST_TARGET_DIR)/cln-grpc: ${CLN_PLUGIN_SRC} ${CLN_GRPC_PLUGIN_SRC} $(MSGGEN_GENALL) $(MSGGEN_GEN_ALL) $(CARGO) build ${CARGO_OPTS} --bin cln-grpc @@ -289,11 +283,13 @@ $(RUST_TARGET_DIR)/cln-bip353: ${CLN_BIP353_PLUGIN_SRC} $(CARGO) build ${CARGO_OPTS} --bin cln-bip353 $(RUST_TARGET_DIR)/cln-currencyrate: ${CLN_CURRENCYRATE_PLUGIN_SRC} $(CARGO) build ${CARGO_OPTS} --bin cln-currencyrate +$(RUST_TARGET_DIR)/cln-reckless: ${CLN_RECKLESS_PLUGIN_SRC} + $(CARGO) build ${CARGO_OPTS} --bin cln-reckless ifneq ($(RUST),0) include plugins/rest-plugin/Makefile include plugins/wss-proxy-plugin/Makefile -DEFAULT_TARGETS += $(CLN_PLUGIN_EXAMPLES) plugins/cln-grpc plugins/clnrest plugins/cln-lsps-client plugins/cln-lsps-service plugins/wss-proxy plugins/cln-bip353 plugins/cln-currencyrate +DEFAULT_TARGETS += $(CLN_PLUGIN_EXAMPLES) plugins/cln-grpc plugins/clnrest plugins/cln-lsps-client plugins/cln-lsps-service plugins/wss-proxy plugins/cln-bip353 plugins/cln-currencyrate plugins/cln-reckless endif clean: plugins-clean diff --git a/plugins/reckless-plugin/Cargo.toml b/plugins/reckless-plugin/Cargo.toml new file mode 100644 index 000000000000..eb5fef18dd7d --- /dev/null +++ b/plugins/reckless-plugin/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "cln-reckless" +version = "0.1.0" +edition = "2024" +license = "MIT" +description = "Install plugins from remote or local repositories" +homepage = "https://github.com/ElementsProject/lightning/tree/master/plugins" +repository = "https://github.com/ElementsProject/lightning" +rust-version.workspace = true + +[dependencies] +anyhow = "1" +log = { version = "0.4", features = ['std'] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +tokio = { version = "1", features = ["fs", "process"] } +tokio-util = { version = "0.7", features = ["codec"] } + +futures = "0.3" + +log-panics = "2" + +which = "8" +url = "2" +sha2 = "0.11" +chrono = "0.4" +hex = "0.4" + +clap = { version = "4", features = ["derive"] } + +cln-plugin = { workspace = true } +cln-rpc = { workspace = true } diff --git a/plugins/reckless-plugin/README.md b/plugins/reckless-plugin/README.md new file mode 100644 index 000000000000..acb50155de06 --- /dev/null +++ b/plugins/reckless-plugin/README.md @@ -0,0 +1,121 @@ +# cln-reckless plugin + +A Core Lightning plugin that can manage other plugins. It can install, uninstall, enable, or disable other plugins, including plugin options and persisting them to config files. + +## Options + +These options can be set in your `lightning.conf` config file or passed directly when starting the plugin. + +### `reckless-dir=PATH` + +Set the directory where `reckless` saves remote git repositories, the plugin installations, a config file, and other metadata. Defaults to your lightning directory (not network directory). + +## CLI help + +The `reckless` plugin comes with a help command for every sub-command it offers: + +```bash +lightning-cli reckless help [command] +``` + +## Sources + +By default `reckless` adds `https://github.com/lightningd/plugins` as a plugin source. But you can add other remote git repositories or local paths as a source for `reckless` with + +```bash +lightning-cli reckless source add +``` + +## List plugins + +There are two commands to list plugins. `listinstalled` to list all plugins that are installed by `reckless` and `listavailable` to list all plugins ready to be installed from your current sources. + +## Installing a plugin + +To install a plugin, `reckless` must be able to find it in one of your sources and detect a supported installation method. Plugins can provide a manifest to instruct `reckless` with custom installation commands. Without a manifest most python, rust, go, and javascript plugins are supported. + +```bash +lightning-cli reckless install [options] +``` + +You can just provide the plugin name to install the latest version or specifiy a git reference like a commit hash or git tag to install a specific version. + +You can, and sometimes must, pass plugin configuration options here too. They are in the same format as you would write them to the config file: `config-name:config-value`. + +This will install dependencies, try to start the plugin, and if successfull, persist the plugin and it's options to a config file. Some plugins are not dynamic and will only start the next time you restart your CLN node. + +## Updating plugins + +You can update `reckless`-installed plugins like this: + +```bash +lightning-cli reckless update +``` + +This will update all `reckless`-installed plugins that were installed without specifying a git ref as a version. You can provide the same `` format to the `update` command to update a specific plugin. The `@gitref` is optional and if you omit it `reckless` will install the latest version. + +This command will stop a plugin, update it, and start it again. + + +## Uninstalling a plugin + +To uninstall a plugin with `reckless`, it must have been previously installed with `reckless`. + +```bash +lightning-cli reckless install +``` + +This will remove the plugin's files and it's configuration. + +## Enabling and disabling plugins + +Only plugins installed by `reckless` can be managed by these commands. + +The `disable` command can be used to remove the plugin from the config files, but leave the dependencies and plugin files on disk. + +The `enable` command accepts plugin config options the same as the `install` command and will add a previously disabled plugin to the config files again. + + +## Tipping a plugin author + +If a plugin author provided a bolt12 offer in their `reckless` manifest, you can tip them like this: + +```bash +lightning-cli reckless tip [payer_note] +``` + +Credit goes to [coffee](https://github.com/coffee-tools/coffee) for this wonderful idea. + +## For plugin authors + +### How to make your plugin compatible with reckless + +If you have a more complex setup or a plugin in a language not listed below, you can use [The reckless manifest](#the-reckless-manifest) to help `reckless` install your plugin. + +`reckless` currently supports python (`requirements.txt`, `pyproject.toml` managed by `pip`, `poetry`, or `uv`), javascript (via `npm`), rust, and go plugins. + +For `reckless` to be able to install your plugin without a manifest make sure to: + +- Choose a unique plugin name. If the repository is for a single plugin the name of the repository is the plugin name. +- If you use a compiled language like rust or go, make sure there is ony one binary target. +- The plugin entrypoint for non-compiled languages is inferred. Naming your plugin executable the same as your plugin name will allow `reckless` to identify it correctly (file extensions are okay). +- Additional repository sources may be added with `reckless source add https://my.repo.url/here` however `https://github.com/lightningd/plugins` is included by default. Consider adding your plugin to `lightningd/plugins` to make installation simpler. +- If your plugin is located too deep in a subdirectory of your repo or named differently than your plugin, it will likely be overlooked. + + +### The reckless manifest + +Plugin authors MAY add a `manifest.json` file at their root directory for various purposes. The available fields are: + +- `short_description` (string): A short description of what your plugin does. +- `long_description` (string): A long description of what your plugin does. +- `entrypoint` (string): The path to the file that will be started by CLN, relative to the root of your project. +- `dependencies` (array of strings): System dependencies needed to install your plugin. These are currently only used for display purposes and not installed by `reckless`. +- `install_cmd`(array of strings): A list of commands that are ran inside your plugin directory in order to install your plugin. +- `required_options` (array of strings): A list of your plugin option names that are required by the user to set in order for the plugin to start. This improves the error message in case the user forgot to set any of them. +- `offer` (string): A bolt12 offer. Users can then use the `reckless` tip command to send the plugin author some Bitcoin. +- `installable` (boolean): If your plugin for any reason should not be installed through `reckless`, set this to `false`. + +All fields are optional, but if you set `install_cmd` you must also set `entrypoint`. + + diff --git a/plugins/reckless-plugin/src/cmds.rs b/plugins/reckless-plugin/src/cmds.rs new file mode 100644 index 000000000000..5798a07f2550 --- /dev/null +++ b/plugins/reckless-plugin/src/cmds.rs @@ -0,0 +1,6 @@ +pub mod enable; +pub mod install; +pub mod list; +pub mod source; +pub mod tip; +pub mod update; diff --git a/plugins/reckless-plugin/src/cmds/enable.rs b/plugins/reckless-plugin/src/cmds/enable.rs new file mode 100644 index 000000000000..bd6d6e34d4b0 --- /dev/null +++ b/plugins/reckless-plugin/src/cmds/enable.rs @@ -0,0 +1,188 @@ +use anyhow::anyhow; +use cln_plugin::Plugin; +use cln_rpc::notifications::LogLevel; +use serde_json::json; + +use crate::{ + structs::{ + CommonResult, DisableResponse, EnableArgs, EnableResponse, PluginState, RecklessLogger, + RecklessPlugin, RecklessTopic, + }, + util::{ + add_plugin_to_config, cln_list_plugins, cln_start_plugin, cln_stop_plugin, + get_plugin_manifest, parse_options, parse_target, read_metadata, remove_plugin_from_config, + }, +}; + +pub async fn handle_enable( + plugin: Plugin, + enable_args: EnableArgs, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Enable, verbose); + + let (plugin_name, git_ref) = match parse_target(&enable_args.target) { + Ok((n, g)) => (n, g), + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + if git_ref.is_some() { + let line = "git refs are not supported here"; + logger.log(line, LogLevel::UNUSUAL).await?; + return Err(anyhow!(line)); + } + + let plugin_dir = plugin.state().reckless_dir.join(&plugin_name); + + let rl_plugin = match read_metadata(&plugin_name, &plugin_dir).await { + Ok(p) => p, + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + + let common_result = + match enable_plugin(plugin.clone(), &rl_plugin, enable_args.options, &mut logger).await { + Ok(()) => CommonResult { plugin_name }, + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + + let response = EnableResponse::new(common_result, logger); + + Ok(json!(response)) +} + +pub async fn enable_plugin( + plugin: Plugin, + rl_plugin: &RecklessPlugin, + options: Vec<(String, Option)>, + logger: &mut RecklessLogger<'_>, +) -> Result<(), anyhow::Error> { + let entry_file = rl_plugin.manifest().entry_filename_str()?; + let entry_path = rl_plugin.get_entrypath()?; + + let plugin_manifest = get_plugin_manifest(&entry_path, logger).await?; + logger + .log(&format!("{plugin_manifest:#?}"), LogLevel::TRACE) + .await?; + + let parsed_options = parse_options(&plugin_manifest, &options)?; + + if let Some(req_opts) = rl_plugin.manifest().required_options.as_ref() { + for option in req_opts { + if !parsed_options.iter().any(|(o, _)| o == option) { + return Err(anyhow!("option `{option}` is required")); + } + } + } + + let running_plugins = cln_list_plugins(plugin.clone(), logger).await?; + if running_plugins.contains(&entry_file) { + let line = format!("Plugin {} is already running", rl_plugin.name()); + logger.log(&line, LogLevel::INFO).await?; + } else if !running_plugins.contains(&entry_file) && plugin_manifest.is_dynamic() { + cln_start_plugin( + plugin.clone(), + rl_plugin.name(), + &entry_path, + options, + logger, + ) + .await?; + } else if !plugin_manifest.is_dynamic() { + let line = format!( + "{} is not dynamic and will be started the next time the node starts", + rl_plugin.name() + ); + logger.log(&line, LogLevel::INFO).await?; + } + + match add_plugin_to_config(plugin.clone(), entry_path, parsed_options, plugin_manifest).await { + Ok(()) => { + let line = format!("{} enabled", rl_plugin.name()); + logger.log(&line, LogLevel::INFO).await?; + } + Err(e) => { + return Err(anyhow!("{} failed to enable: {e}", rl_plugin.name())); + } + } + + Ok(()) +} + +pub async fn handle_disable( + plugin: Plugin, + target: String, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Enable, verbose); + + let (plugin_name, git_ref) = match parse_target(&target) { + Ok((pn, g)) => (pn, g), + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + if git_ref.is_some() { + let line = "git refs are not supported here"; + logger.log(line, LogLevel::UNUSUAL).await?; + return Err(anyhow!(line)); + } + + let plugin_dir = plugin.state().reckless_dir.join(&plugin_name); + + let rl_plugin = match read_metadata(&plugin_name, &plugin_dir).await { + Ok(p) => p, + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + + let common_result = match disable_plugin(plugin.clone(), &rl_plugin, &mut logger).await { + Ok(_) => CommonResult { plugin_name }, + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + return Err(e); + } + }; + + let response = DisableResponse::new(common_result, logger); + + Ok(json!(response)) +} + +pub async fn disable_plugin( + plugin: Plugin, + rl_plugin: &RecklessPlugin, + logger: &mut RecklessLogger<'_>, +) -> Result)>, anyhow::Error> { + let entry_file = rl_plugin.manifest().entry_filename_str()?; + let entry_path = rl_plugin.get_entrypath()?; + + let manifest = get_plugin_manifest(&entry_path, logger).await?; + logger + .log(&format!("{manifest:#?}"), LogLevel::TRACE) + .await?; + + let running_plugins = cln_list_plugins(plugin.clone(), logger).await?; + if running_plugins.contains(&entry_file) { + cln_stop_plugin(plugin.clone(), rl_plugin.name(), &entry_path, logger).await?; + } else { + let line = format!("{} already stopped", rl_plugin.name()); + logger.log(&line, LogLevel::INFO).await?; + } + + let old_options = remove_plugin_from_config(plugin.clone(), entry_path, manifest).await?; + let line = format!("{} disabled", rl_plugin.name()); + logger.log(&line, LogLevel::INFO).await?; + + Ok(old_options) +} diff --git a/plugins/reckless-plugin/src/cmds/install.rs b/plugins/reckless-plugin/src/cmds/install.rs new file mode 100644 index 000000000000..7149b8a0dccd --- /dev/null +++ b/plugins/reckless-plugin/src/cmds/install.rs @@ -0,0 +1,317 @@ +use std::{collections::HashMap, path::PathBuf}; + +use anyhow::anyhow; +use cln_plugin::Plugin; +use cln_rpc::notifications::LogLevel; +use serde_json::json; +use tokio::{fs, process::Command}; + +use crate::{ + cmds::enable::{disable_plugin, enable_plugin}, + installers::{ + install_custom_plugin, install_go_plugin, install_nodejs_plugin, install_poetry_plugin, + install_python_plugin, install_rust_plugin, install_uv_legacy_plugin, install_uv_plugin, + install_uv_shebang_plugin, + }, + structs::{ + CommonResult, InstallArgs, InstallResponse, InstallResult, Installer, PluginState, + RecklessLogger, RecklessPlugin, RecklessTopic, UninstallResponse, + }, + util::{ + copy_dir_all, parse_install_target, parse_target, read_metadata, run_logged_command, + search_sources, write_metadata, + }, +}; + +pub async fn handle_install( + plugin: Plugin, + install_args: InstallArgs, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Install, verbose); + + let mut search_results: HashMap = HashMap::new(); + + let (plugin_name, git_ref) = match parse_install_target( + &mut logger, + &install_args.target, + &mut search_results, + &plugin.state().reckless_dir, + ) + .await + { + Ok((pn, g)) => (pn, g), + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + + if search_results.is_empty() { + search_results = match search_sources(&plugin, Some(plugin_name.clone()), &mut logger).await + { + Ok(o) => o, + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + } + let Some(rl_plugin) = search_results.get_mut(&plugin_name) else { + let line = format!("{plugin_name} not found in any known sources"); + logger.log(&line, LogLevel::UNUSUAL).await?; + return Err(anyhow!(line)); + }; + + pre_install_checks(rl_plugin, &plugin_name, git_ref.as_ref(), &mut logger).await?; + + let install_result = install( + rl_plugin, + git_ref.clone(), + install_args.developer, + &mut logger, + ) + .await; + + match install_result { + Ok(entrypoint) => { + let line = format!( + "{plugin_name} installed, entrypoint: {}", + entrypoint.display() + ); + logger.log(&line, LogLevel::DEBUG).await?; + } + Err(e) => { + let line = format!("{plugin_name} install failed: {e}, uninstalling..."); + logger.log(&line, LogLevel::UNUSUAL).await?; + if let Some(deps) = &rl_plugin.manifest().dependencies { + let line = format!( + "Make sure you have the following system dependencies installed: {}", + deps.join(", ") + ); + logger.log(&line, LogLevel::UNUSUAL).await?; + } + if let Err(e) = uninstall(plugin.clone(), plugin_name.clone(), &mut logger).await { + let line = format!("{plugin_name} uninstall failed: {e}"); + logger.log(&line, LogLevel::BROKEN).await?; + return Err(e); + } + return Err(e); + } + } + + let mut install_result = InstallResult { + plugin_name: plugin_name.clone(), + enabled: false, + installed_commit: rl_plugin + .metadata() + .installed_commit() + .map(std::borrow::ToOwned::to_owned), + }; + + match enable_plugin(plugin.clone(), rl_plugin, install_args.options, &mut logger).await { + Ok(()) => install_result.enabled = true, + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + let line = + format!("{plugin_name} failed to start, it may require options, read the logs!"); + logger.log(&line, LogLevel::UNUSUAL).await?; + } + } + + let response = InstallResponse::new(install_result, logger); + + Ok(json!(response)) +} + +async fn install( + rl_plugin: &mut RecklessPlugin, + git_ref: Option, + developer: bool, + logger: &mut RecklessLogger<'_>, +) -> Result { + if !rl_plugin.origin_plugin_path().exists() { + return Err(anyhow!( + "origin path does not exist: {}", + rl_plugin.origin_repo_path().display() + )); + } + + fs::create_dir_all(rl_plugin.path()).await?; + + if !rl_plugin.is_local_path() { + let mut command = Command::new("git"); + command + .args(["pull", "--ff-only"]) + .current_dir(rl_plugin.origin_repo_path()); + run_logged_command(command, logger).await?; + + let mut command = Command::new("git"); + command + .args(["submodule", "sync", "--recursive"]) + .current_dir(rl_plugin.origin_repo_path()); + run_logged_command(command, logger).await?; + + let mut command = Command::new("git"); + command + .args(["submodule", "update", "--init", "--recursive"]) + .current_dir(rl_plugin.origin_repo_path()); + run_logged_command(command, logger).await?; + + let mut command = Command::new("git"); + command + .args(["checkout", git_ref.as_deref().unwrap_or("HEAD")]) + .current_dir(rl_plugin.origin_plugin_path()); + run_logged_command(command, logger).await?; + + fs::create_dir_all(rl_plugin.source_path()).await?; + copy_dir_all( + rl_plugin.origin_plugin_path(), + rl_plugin.source_path(), + logger, + ) + .await?; + } + + let entrypoint = match rl_plugin.installer() { + Installer::PythonUv => install_uv_plugin(rl_plugin, logger).await?, + Installer::PythonUvShebang => install_uv_shebang_plugin(rl_plugin, logger).await?, + Installer::PythonUvLegacy => install_uv_legacy_plugin(rl_plugin, logger).await?, + Installer::PoetryVenv => install_poetry_plugin(rl_plugin, logger).await?, + Installer::PyprojectViaPip | Installer::Python => { + install_python_plugin(rl_plugin, logger).await? + } + Installer::Nodejs => install_nodejs_plugin(rl_plugin, logger).await?, + Installer::Rust => install_rust_plugin(rl_plugin, logger, developer).await?, + Installer::Go => install_go_plugin(rl_plugin, logger).await?, + Installer::Custom => install_custom_plugin(rl_plugin, logger).await?, + }; + + if rl_plugin.is_local_path() { + rl_plugin.metadata_mut().new_install(None, None); + } else { + let mut command = Command::new("git"); + command + .args(["rev-parse", "HEAD"]) + .current_dir(rl_plugin.origin_plugin_path()); + let commit_hash = run_logged_command(command, logger).await?; + + let installed_ref = if let Some(gr) = &git_ref { + gr.clone() + } else { + commit_hash + }; + + rl_plugin + .metadata_mut() + .new_install(Some(installed_ref), git_ref); + } + + write_metadata(rl_plugin).await?; + + let line = format!("plugin installed: {}", entrypoint.display()); + logger.log(&line, LogLevel::INFO).await?; + + Ok(entrypoint) +} + +async fn pre_install_checks( + rl_plugin: &RecklessPlugin, + plugin_name: &str, + git_ref: Option<&String>, + logger: &mut RecklessLogger<'_>, +) -> Result<(), anyhow::Error> { + if rl_plugin.path().exists() { + let line = format!("{plugin_name} is already installed"); + logger.log(&line, LogLevel::UNUSUAL).await?; + return Err(anyhow!(line)); + } + + if let Some(installable) = rl_plugin.manifest().installable { + if !installable { + let line = + format!("{plugin_name} is not reckless-installable according to their manifest"); + logger.log(&line, LogLevel::UNUSUAL).await?; + return Err(anyhow!(line)); + } + } + + if rl_plugin.is_local_path() && git_ref.is_some() { + let line = "git refs are not supported for local paths"; + logger.log(line, LogLevel::UNUSUAL).await?; + return Err(anyhow!(line)); + } + + Ok(()) +} + +pub async fn handle_uninstall( + plugin: Plugin, + target: String, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Uninstall, verbose); + + let (plugin_name, git_ref) = match parse_target(&target) { + Ok((pn, g)) => (pn, g), + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + if git_ref.is_some() { + let line = "git refs are not supported here"; + logger.log(line, LogLevel::UNUSUAL).await?; + return Err(anyhow!(line)); + } + + let common_result = match uninstall(plugin.clone(), plugin_name.clone(), &mut logger).await { + Ok(()) => CommonResult { plugin_name }, + Err(e) => { + let line = format!("{plugin_name} NOT uninstalled: {e}"); + logger.log(&line, LogLevel::BROKEN).await?; + return Err(anyhow!(line)); + } + }; + + let response = UninstallResponse::new(common_result, logger); + + Ok(json!(response)) +} + +async fn uninstall( + plugin: Plugin, + plugin_name: String, + logger: &mut RecklessLogger<'_>, +) -> Result<(), anyhow::Error> { + let plugin_dir = plugin.state().reckless_dir.join(&plugin_name); + + match read_metadata(&plugin_name, &plugin_dir).await { + Ok(rl_plugin) => { + if let Err(e) = disable_plugin(plugin.clone(), &rl_plugin, logger).await { + let line = + format!("{plugin_name} NOT disabled: {e}, remove plugin from config manually!"); + logger.log(&line, LogLevel::BROKEN).await?; + } + } + Err(e) => { + let line = format!( + "could not read metadata for {plugin_name}: {e}, you must stop and remove it \ + from the configs yourself" + ); + logger.log(&line, LogLevel::BROKEN).await?; + } + } + + match fs::remove_dir_all(&plugin_dir).await { + Ok(()) => { + let line = format!("{plugin_name} uninstalled"); + logger.log(&line, LogLevel::INFO).await?; + } + Err(e) => { + return Err(e.into()); + } + } + + Ok(()) +} diff --git a/plugins/reckless-plugin/src/cmds/list.rs b/plugins/reckless-plugin/src/cmds/list.rs new file mode 100644 index 000000000000..33d52a1a2052 --- /dev/null +++ b/plugins/reckless-plugin/src/cmds/list.rs @@ -0,0 +1,86 @@ +use std::collections::HashMap; + +use anyhow::anyhow; +use cln_plugin::Plugin; +use cln_rpc::notifications::LogLevel; +use serde_json::json; +use tokio::fs; + +use crate::{ + structs::{ + ListavailableResponse, ListavailableResult, ListinstalledResponse, ListinstalledResult, + Metadata, PluginState, RecklessLogger, RecklessTopic, + }, + util::{read_metadata, search_sources}, +}; + +pub async fn handle_list_available( + plugin: Plugin, + target: Option, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Search, verbose); + let mut listavailable_results = Vec::new(); + + let reckless_plugins = match search_sources(&plugin, target, &mut logger).await { + Ok(o) => o, + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + + for (_plugin_name, plugin) in reckless_plugins { + listavailable_results.push(ListavailableResult::from(plugin)); + } + + let response = ListavailableResponse::new(listavailable_results, logger); + + Ok(json!(response)) +} + +pub async fn handle_list_installed( + plugin: Plugin, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Search, verbose); + let mut listinstalled_results = Vec::new(); + + let installed = match list_installed(plugin.clone()).await { + Ok(i) => i, + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + return Err(anyhow!(e.to_string())); + } + }; + + for (plugin_name, metadata) in installed { + let li_res = ListinstalledResult::new(metadata, plugin_name); + listinstalled_results.push(li_res); + } + + let response = ListinstalledResponse::new(listinstalled_results, logger); + + Ok(json!(response)) +} + +pub async fn list_installed( + plugin: Plugin, +) -> Result, anyhow::Error> { + let mut result: HashMap = HashMap::new(); + let mut entries = fs::read_dir(&plugin.state().reckless_dir).await?; + while let Ok(Some(entry)) = entries.next_entry().await { + let Ok(file_type) = entry.file_type().await else { + continue; + }; + if file_type.is_file() { + continue; + } + let plugin_name = entry.file_name().to_string_lossy().to_string(); + if let Ok(rl_plugin) = read_metadata(&plugin_name, &entry.path()).await { + result.insert(plugin_name, rl_plugin.metadata().clone()); + } + } + + Ok(result) +} diff --git a/plugins/reckless-plugin/src/cmds/source.rs b/plugins/reckless-plugin/src/cmds/source.rs new file mode 100644 index 000000000000..61bf40dea749 --- /dev/null +++ b/plugins/reckless-plugin/src/cmds/source.rs @@ -0,0 +1,208 @@ +use std::str::FromStr; + +use anyhow::anyhow; +use cln_plugin::Plugin; +use cln_rpc::notifications::LogLevel; +use serde_json::json; +use tokio::{ + fs::{self, OpenOptions}, + io::AsyncWriteExt, +}; +use url::Url; + +use crate::{ + structs::{PluginOrigin, PluginState, RecklessLogger, RecklessTopic, SourcesResponse}, + util::{init_plugin_repo, read_sources_file, repo_path_from_url}, +}; + +pub async fn handle_source_list( + plugin: Plugin, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Search, verbose); + + let (sources, _source_file) = match read_sources_file(&plugin).await { + Ok(res) => res, + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + return Err(e); + } + }; + + let response = SourcesResponse::new(sources, logger); + + Ok(json!(response)) +} + +pub async fn handle_source_add( + plugin: Plugin, + target: String, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Source, verbose); + + let (mut sources, source_file) = match read_sources_file(&plugin).await { + Ok(res) => res, + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + return Err(e); + } + }; + + let mut file_handle = match OpenOptions::new().append(true).open(source_file).await { + Ok(f) => f, + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + return Err(anyhow!(e)); + } + }; + + let add_source = PluginOrigin::new(&target)?; + + for source in &sources { + if source == &add_source { + let line = format!("source {target} already exists"); + logger.log(&line, LogLevel::UNUSUAL).await?; + return Err(anyhow!(line)); + } + } + + if let PluginOrigin::Url(url_str) = &add_source { + let url = Url::from_str(url_str)?; + init_plugin_repo(&plugin, url, &mut logger).await?; + } + + if let Err(e) = file_handle + .write_all(format!("{add_source}\n").as_bytes()) + .await + { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + return Err(anyhow!(e)); + } + + sources.push(add_source); + + let response = SourcesResponse::new(sources, logger); + + Ok(json!(response)) +} + +pub async fn handle_source_remove( + plugin: Plugin, + target: String, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Source, verbose); + + let (mut sources, source_file) = match read_sources_file(&plugin).await { + Ok(res) => res, + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + return Err(e); + } + }; + + let del_source = PluginOrigin::new(&target)?; + + match remove_source(&plugin, &del_source, &mut logger).await { + Ok(res) => res, + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + return Err(e); + } + } + + let Ok(mut file_handle) = OpenOptions::new() + .write(true) + .truncate(true) + .open(&source_file) + .await + else { + let line = format!("failed to open sources file: {}", source_file.display()); + logger.log(&line, LogLevel::BROKEN).await?; + return Err(anyhow!(line)); + }; + + let mut remove_index = None; + + for (i, source) in sources.iter().enumerate() { + if source == &del_source { + remove_index = Some(i); + } else if let Err(e) = file_handle + .write_all(format!("{source}\n").as_bytes()) + .await + { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + return Err(anyhow!(e)); + } + } + + if let Some(i) = remove_index { + sources.remove(i); + } else { + return Err(anyhow!("source {target} not found")); + } + + let response = SourcesResponse::new(sources, logger); + + Ok(json!(response)) +} + +async fn remove_source( + plugin: &Plugin, + target: &PluginOrigin, + logger: &mut RecklessLogger<'_>, +) -> Result<(), anyhow::Error> { + match target { + PluginOrigin::LocalPath(_path) => {} + PluginOrigin::Url(url_str) => { + let url = Url::from_str(url_str)?; + let repo_dir = plugin.state().reckless_dir.join(repo_path_from_url(&url)?); + if !repo_dir.exists() { + let line = format!("source directory never existed: {}", repo_dir.display()); + logger.log(&line, LogLevel::INFO).await?; + return Ok(()); + } + match fs::remove_dir_all(&repo_dir).await { + Ok(()) => { + let line = format!("source directory removed: {}", repo_dir.display()); + logger.log(&line, LogLevel::INFO).await?; + } + Err(e) => { + let line = format!( + "failed to remove source directory: {}: {}", + repo_dir.display(), + e + ); + return Err(anyhow!(line)); + } + } + + let owner_dir = repo_dir + .parent() + .ok_or_else(|| anyhow!("source repo has no owner directory"))?; + + match fs::read_dir(&owner_dir).await { + Ok(mut entries) => { + if entries.next_entry().await?.is_none() { + let line = format!( + "also removing empty repository owner directory: {}", + owner_dir.display() + ); + logger.log(&line, LogLevel::INFO).await?; + fs::remove_dir_all(owner_dir).await?; + } + } + Err(e) => { + let line = format!( + "could not read repository owner directory: {} {e}", + owner_dir.display() + ); + logger.log(&line, LogLevel::UNUSUAL).await?; + } + } + } + } + + Ok(()) +} diff --git a/plugins/reckless-plugin/src/cmds/tip.rs b/plugins/reckless-plugin/src/cmds/tip.rs new file mode 100644 index 000000000000..5ddd10dcbae5 --- /dev/null +++ b/plugins/reckless-plugin/src/cmds/tip.rs @@ -0,0 +1,121 @@ +use anyhow::anyhow; +use cln_plugin::Plugin; +use cln_rpc::{model::requests::XpayRequest, notifications::LogLevel, primitives::Amount}; +use serde_json::json; + +use crate::{ + structs::{PluginState, RecklessLogger, RecklessTopic, TipArgs, TipResponse}, + util::{parse_target, read_metadata, search_sources}, +}; + +pub async fn handle_tip( + plugin: Plugin, + args: TipArgs, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Tip, verbose); + + let (plugin_name, git_ref) = match parse_target(&args.target) { + Ok(res) => res, + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + if git_ref.is_some() { + let line = "git refs are not supported here"; + logger.log(line, LogLevel::UNUSUAL).await?; + return Err(anyhow!(line)); + } + + let plugin_dir = plugin.state().reckless_dir.join(&plugin_name); + + let offer = match read_metadata(&plugin_name, &plugin_dir).await { + Ok(p) => { + if let Some(off) = &p.manifest().offer { + Some(off.clone()) + } else { + let line = + format!("installed version of {plugin_name} has no offer, checking sources..."); + logger.log(&line, LogLevel::INFO).await?; + get_offer_from_sources(&plugin, &plugin_name, &mut logger).await? + } + } + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + let line = format!("{plugin_name} not installed, searching in sources..."); + logger.log(&line, LogLevel::INFO).await?; + + get_offer_from_sources(&plugin, &plugin_name, &mut logger).await? + } + }; + + let Some(offer) = offer else { + return Err(anyhow!( + "no offer found in reckless manifest for {plugin_name}" + )); + }; + + let line = format!( + "Sending {}msat to {plugin_name} author...", + args.amount_msat + ); + logger.log(&line, LogLevel::INFO).await?; + + let mut rpc = plugin.state().rpc.lock().await; + let xpay = match rpc + .call_typed(&XpayRequest { + amount_msat: Some(Amount::from_msat(args.amount_msat)), + dev_use_shadow: None, + label: None, + localinvreqid: None, + maxdelay: None, + maxfee: None, + partial_msat: None, + payer_note: args.payer_note, + retry_for: None, + layers: None, + invstring: offer.clone(), + }) + .await + { + Ok(o) => o, + Err(e) => { + let line = format!( + "Error sending {}msat to {plugin_name} author: {e}", + args.amount_msat + ); + logger.log(&line, LogLevel::UNUSUAL).await?; + return Err(anyhow!(line)); + } + }; + + let line = format!( + "Successfully sent {}msat to {plugin_name} author!", + args.amount_msat + ); + logger.log(&line, LogLevel::INFO).await?; + + let response = TipResponse::new(xpay, logger); + + Ok(json!(response)) +} + +async fn get_offer_from_sources( + plugin: &Plugin, + plugin_name: &str, + logger: &mut RecklessLogger<'_>, +) -> Result, anyhow::Error> { + let search_results = match search_sources(plugin, Some(plugin_name.to_owned()), logger).await { + Ok(o) => o, + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + let Some(rlp) = search_results.get(plugin_name) else { + return Err(anyhow!("{plugin_name} not found installed or in sources")); + }; + + Ok(rlp.manifest().offer.clone()) +} diff --git a/plugins/reckless-plugin/src/cmds/update.rs b/plugins/reckless-plugin/src/cmds/update.rs new file mode 100644 index 000000000000..a36dc677441b --- /dev/null +++ b/plugins/reckless-plugin/src/cmds/update.rs @@ -0,0 +1,321 @@ +use anyhow::anyhow; +use cln_plugin::Plugin; +use cln_rpc::notifications::LogLevel; +use serde_json::json; +use tokio::process::Command; + +use crate::{ + cmds::{ + enable::{disable_plugin, enable_plugin}, + list::list_installed, + }, + installers::{ + install_custom_plugin, install_go_plugin, install_nodejs_plugin, install_poetry_plugin, + install_python_plugin, install_rust_plugin, install_uv_legacy_plugin, install_uv_plugin, + install_uv_shebang_plugin, + }, + structs::{ + InstallResult, Installer, PluginState, RecklessLogger, RecklessPlugin, RecklessTopic, + UpdateArgs, UpdateResponse, + }, + util::{ + copy_dir_all, parse_target, read_metadata, run_logged_command, search_sources, + write_metadata, + }, +}; + +#[allow(clippy::too_many_lines)] +pub async fn handle_update( + plugin: Plugin, + install_args: UpdateArgs, + verbose: bool, +) -> Result { + let mut logger = RecklessLogger::new(&plugin, RecklessTopic::Install, verbose); + let mut update_results = Vec::new(); + + let mut ignore_pinned = false; + + let targets = gather_update_targets( + plugin.clone(), + &install_args, + &mut ignore_pinned, + &mut logger, + ) + .await?; + + for target in targets { + let (plugin_name, git_ref) = match parse_target(&target) { + Ok(o) => o, + Err(e) => { + logger.log(&e.to_string(), LogLevel::UNUSUAL).await?; + return Err(e); + } + }; + let mut search_results = + match search_sources(&plugin, Some(plugin_name.clone()), &mut logger).await { + Ok(o) => o, + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + continue; + } + }; + let Some(new_rl_plugin) = search_results.get_mut(&plugin_name) else { + let line = format!("{plugin_name} not found in any known sources"); + logger.log(&line, LogLevel::UNUSUAL).await?; + continue; + }; + + let plugin_dir = plugin.state().reckless_dir.join(&plugin_name); + + let old_rl_plugin = match read_metadata(&plugin_name, &plugin_dir).await { + Ok(o) => o, + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + continue; + } + }; + + if let Err(e) = check_upgradeable(&old_rl_plugin, new_rl_plugin, ignore_pinned) { + let line = format!("{plugin_name} is not upgradeable: {e}"); + logger.log(&line, LogLevel::UNUSUAL).await?; + continue; + } + + let old_options = match disable_plugin(plugin.clone(), &old_rl_plugin, &mut logger).await { + Ok(o) => o, + Err(e) => { + let line = format!( + "Disabling {} before update failed. \ + It might be in an inconsistent state: {e}", + old_rl_plugin.name() + ); + logger.log(&line, LogLevel::BROKEN).await?; + continue; + } + }; + + let update_result = update( + git_ref.clone(), + old_rl_plugin, + new_rl_plugin, + &mut logger, + install_args.developer, + ) + .await; + + let mut install_result = InstallResult { + plugin_name: plugin_name.clone(), + enabled: false, + installed_commit: new_rl_plugin + .metadata() + .installed_commit() + .map(std::borrow::ToOwned::to_owned), + }; + + match update_result { + Ok(()) => { + match enable_plugin(plugin.clone(), new_rl_plugin, old_options, &mut logger).await { + Ok(()) => { + install_result.enabled = true; + } + Err(e) => { + let line = + format!("Enabling {} after update failed: {e}", new_rl_plugin.name()); + logger.log(&line, LogLevel::BROKEN).await?; + } + } + update_results.push(install_result); + } + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + if let Some(deps) = &new_rl_plugin.manifest().dependencies { + let line = format!( + "Make sure you have the following system dependencies installed: {}", + deps.join(", ") + ); + logger.log(&line, LogLevel::UNUSUAL).await?; + } + } + } + } + + if update_results.is_empty() { + let line = "No updates succeeded"; + logger.log(line, LogLevel::BROKEN).await?; + return Err(anyhow!(line)); + } + + let response = UpdateResponse::new(update_results, logger); + + Ok(json!(response)) +} + +fn check_upgradeable( + old_rl_plugin: &RecklessPlugin, + new_rl_plugin: &RecklessPlugin, + ignore_pinned: bool, +) -> Result<(), anyhow::Error> { + if old_rl_plugin.metadata().requested_commit().is_some() && !ignore_pinned { + return Err(anyhow!("version-pinned plugin: {}", old_rl_plugin.name())); + } + + if !new_rl_plugin.origin_plugin_path().exists() { + return Err(anyhow!( + "repo does not exist: {}", + new_rl_plugin.origin_repo_path().display() + )); + } + + if let Some(installable) = new_rl_plugin.manifest().installable { + if !installable { + return Err(anyhow!( + "{} is not reckless-installable according to their manifest", + new_rl_plugin.name() + )); + } + } + Ok(()) +} + +async fn gather_update_targets( + plugin: Plugin, + install_args: &UpdateArgs, + ignore_pinned: &mut bool, + logger: &mut RecklessLogger<'_>, +) -> Result, anyhow::Error> { + if let Some(target) = &install_args.target { + *ignore_pinned = true; + Ok(vec![target.clone()]) + } else { + let listinstalled = match list_installed(plugin).await { + Ok(o) => o, + Err(e) => { + logger.log(&e.to_string(), LogLevel::BROKEN).await?; + return Err(e); + } + }; + let mut targets = Vec::new(); + for (name, _) in listinstalled { + targets.push(name); + } + Ok(targets) + } +} + +async fn update( + git_ref: Option, + old_rl_plugin: RecklessPlugin, + new_rl_plugin: &mut RecklessPlugin, + logger: &mut RecklessLogger<'_>, + developer: bool, +) -> Result<(), anyhow::Error> { + if !new_rl_plugin.is_local_path() { + let mut command = Command::new("git"); + command + .args(["pull", "--ff-only"]) + .current_dir(new_rl_plugin.origin_repo_path()); + run_logged_command(command, logger).await?; + + let mut command = Command::new("git"); + command + .args(["submodule", "sync", "--recursive"]) + .current_dir(new_rl_plugin.origin_repo_path()); + run_logged_command(command, logger).await?; + + let mut command = Command::new("git"); + command + .args(["submodule", "update", "--init", "--recursive"]) + .current_dir(new_rl_plugin.origin_repo_path()); + run_logged_command(command, logger).await?; + + let mut command = Command::new("git"); + command + .args(["checkout", git_ref.as_ref().unwrap_or(&"HEAD".to_owned())]) + .current_dir(new_rl_plugin.origin_plugin_path()); + run_logged_command(command, logger).await?; + + let mut command = Command::new("git"); + command + .args(["rev-parse", "HEAD"]) + .current_dir(new_rl_plugin.origin_plugin_path()); + let commit_hash = run_logged_command(command, logger).await?; + + let ref_to_be_installed = if let Some(gr) = &git_ref { + gr.clone() + } else { + commit_hash + }; + + if let Some(installed_commit) = old_rl_plugin.metadata().installed_commit() { + if installed_commit == ref_to_be_installed { + let line = format!( + "{} is already on the latest version: {ref_to_be_installed}", + old_rl_plugin.name() + ); + logger.log(&line, LogLevel::INFO).await?; + return Ok(()); + } + } else { + let line = format!( + "{} should have a git ref for the current install", + old_rl_plugin.name() + ); + logger.log(&line, LogLevel::UNUSUAL).await?; + } + + let line = format!( + "updating {} from {} to {ref_to_be_installed}", + old_rl_plugin.name(), + old_rl_plugin.metadata().installed_commit().unwrap() + ); + logger.log(&line, LogLevel::INFO).await?; + + copy_dir_all( + new_rl_plugin.origin_plugin_path(), + new_rl_plugin.source_path(), + logger, + ) + .await?; + } + + let entrypoint = match new_rl_plugin.installer() { + Installer::PythonUv => install_uv_plugin(new_rl_plugin, logger).await?, + Installer::PythonUvShebang => install_uv_shebang_plugin(new_rl_plugin, logger).await?, + Installer::PythonUvLegacy => install_uv_legacy_plugin(new_rl_plugin, logger).await?, + Installer::PoetryVenv => install_poetry_plugin(new_rl_plugin, logger).await?, + Installer::PyprojectViaPip | Installer::Python => { + install_python_plugin(new_rl_plugin, logger).await? + } + Installer::Nodejs => install_nodejs_plugin(new_rl_plugin, logger).await?, + Installer::Rust => install_rust_plugin(new_rl_plugin, logger, developer).await?, + Installer::Go => install_go_plugin(new_rl_plugin, logger).await?, + Installer::Custom => install_custom_plugin(new_rl_plugin, logger).await?, + }; + + if new_rl_plugin.is_local_path() { + new_rl_plugin.metadata_mut().new_install(None, None); + } else { + let mut command = Command::new("git"); + command + .args(["rev-parse", "HEAD"]) + .current_dir(new_rl_plugin.origin_plugin_path()); + let commit_hash = run_logged_command(command, logger).await?; + + let installed_ref = if let Some(gr) = &git_ref { + gr.clone() + } else { + commit_hash + }; + + new_rl_plugin + .metadata_mut() + .new_install(Some(installed_ref), git_ref); + } + + write_metadata(new_rl_plugin).await?; + + let line = format!("plugin updated: {}", entrypoint.display()); + logger.log(&line, LogLevel::INFO).await?; + + Ok(()) +} diff --git a/plugins/reckless-plugin/src/installers.rs b/plugins/reckless-plugin/src/installers.rs new file mode 100644 index 000000000000..de20c9451b14 --- /dev/null +++ b/plugins/reckless-plugin/src/installers.rs @@ -0,0 +1,625 @@ +use std::{ + collections::{HashMap, VecDeque}, + path::{Path, PathBuf}, +}; + +use anyhow::anyhow; +use cln_rpc::notifications::LogLevel; +use tokio::{fs, process::Command}; + +use crate::{ + structs::{RecklessLogger, RecklessPlugin}, + util::{create_symlink, run_logged_command}, +}; + +pub async fn install_custom_plugin( + rl_plugin: &RecklessPlugin, + logger: &mut RecklessLogger<'_>, +) -> Result { + let line = "using installer custom"; + logger.log(line, LogLevel::INFO).await?; + + let entrypoint = Path::new( + rl_plugin + .manifest() + .entrypoint + .as_ref() + .ok_or_else(|| anyhow!("custom installer requires entrypoint in manifest"))?, + ); + let install_cmds = rl_plugin + .manifest() + .install_cmd + .as_ref() + .ok_or_else(|| anyhow!("custom installer requires install_cmd in manifest"))?; + + let line = format!( + "running install commands for {}, this might take a while...", + rl_plugin.name() + ); + logger.log(&line, LogLevel::INFO).await?; + + for install_cmd in install_cmds { + let cmd_parts = install_cmd.split_whitespace().collect::>(); + + if cmd_parts.is_empty() { + return Err(anyhow!("install_cmd in manifest is empty!?")); + } + + let mut cmd = Command::new(cmd_parts.first().unwrap()); + if cmd_parts.len() > 1 { + cmd.args(&cmd_parts[1..]); + } + cmd.current_dir(rl_plugin.source_path()); + run_logged_command(cmd, logger).await?; + } + + let entrypoint_path = rl_plugin.source_path().join(entrypoint); + + if !entrypoint_path.exists() { + return Err(anyhow!("plugin entry not present after install_cmd")); + } + + set_executable(&entrypoint_path).await?; + + let symlink_path = rl_plugin.get_entrypath()?; + + create_symlink(&entrypoint_path, &symlink_path)?; + + Ok(symlink_path) +} + +pub async fn install_nodejs_plugin( + rl_plugin: &RecklessPlugin, + logger: &mut RecklessLogger<'_>, +) -> Result { + let line = "using installer nodejs"; + logger.log(line, LogLevel::INFO).await?; + + let line = "installing dependencies with `npm install`..."; + logger.log(line, LogLevel::INFO).await?; + + let mut npm_install = Command::new("npm"); + npm_install + .arg("install") + .current_dir(rl_plugin.source_path()); + run_logged_command(npm_install, logger).await?; + + let line = "dependencies installed successfully"; + logger.log(line, LogLevel::INFO).await?; + + let Some(plugin_entry) = &rl_plugin.manifest().entrypoint else { + return Err(anyhow!("plugin entrypoint not found")); + }; + + let plugin_path = rl_plugin.source_path().join(plugin_entry); + set_executable(&plugin_path).await?; + + let symlink_path = rl_plugin.get_entrypath()?; + + create_symlink(&plugin_path, &symlink_path)?; + + Ok(symlink_path) +} + +pub async fn install_rust_plugin( + rl_plugin: &RecklessPlugin, + logger: &mut RecklessLogger<'_>, + developer: bool, +) -> Result { + let line = "using installer rust_cargo"; + logger.log(line, LogLevel::INFO).await?; + + let line = "compiling with `cargo`, this might take a while..."; + logger.log(line, LogLevel::INFO).await?; + + let mut cargo_build = Command::new("cargo"); + cargo_build.arg("build"); + if !developer { + cargo_build.arg("--release"); + } + cargo_build.current_dir(rl_plugin.source_path()); + + run_logged_command(cargo_build, logger).await?; + + let mut cargo_metadata = Command::new("cargo"); + cargo_metadata + .arg("metadata") + .arg("--no-deps") + .arg("--format-version") + .arg("1") + .current_dir(rl_plugin.source_path()); + + let metadata_str = run_logged_command(cargo_metadata, logger).await?; + + let metadata: serde_json::Value = serde_json::from_str(&metadata_str)?; + + let packages = if let Some(p) = metadata.get("packages").and_then(|t| t.as_array()) { + p.clone() + } else { + Vec::new() + }; + + if packages.len() > 1 { + return Err(anyhow!("Multiple packages found in Cargo.toml")); + } + + let mut targets = packages + .first() + .and_then(|p| p.get("targets").and_then(|t| t.as_array().cloned())) + .unwrap_or_default(); + + targets.retain(|p| { + if let Some(serde_json::Value::Array(arr)) = p.get("kind") { + return arr == &["bin"]; + } + false + }); + + if targets.len() > 1 { + return Err(anyhow!("Multiple binaries found in Cargo.toml")); + } + + if let Some(package_name) = targets + .first() + .and_then(|n| n.get("name").and_then(|n| n.as_str())) + { + let profile = if developer { "debug" } else { "release" }; + let binary = rl_plugin + .source_path() + .join("target") + .join(profile) + .join(package_name); + if !binary.exists() { + return Err(anyhow!( + "Binary {package_name} not found in target/{profile}" + )); + } + + let destination = rl_plugin.get_entrypath()?; + + let line = format!("moving {} to {}", binary.display(), destination.display()); + logger.log(&line, LogLevel::DEBUG).await?; + + fs::copy(&binary, &destination).await?; + + if !developer { + let mut cargo_clean = Command::new("cargo"); + cargo_clean.arg("clean"); + cargo_clean.current_dir(rl_plugin.source_path()); + run_logged_command(cargo_clean, logger).await?; + } + + Ok(destination) + } else { + Err(anyhow!("No binary found in Cargo.toml")) + } +} + +pub async fn install_go_plugin( + rl_plugin: &RecklessPlugin, + logger: &mut RecklessLogger<'_>, +) -> Result { + let line = "using installer go"; + logger.log(line, LogLevel::INFO).await?; + + let main_packages = find_go_main_packages(rl_plugin.source_path().to_owned()).await?; + if main_packages.len() > 1 { + return Err(anyhow!( + "Multiple main packages found, can't install: {main_packages:?}" + )); + } + if main_packages.is_empty() { + return Err(anyhow!("No main package found, can't install")); + } + + let destination = rl_plugin.get_entrypath()?; + let main_path = main_packages + .first() + .unwrap() + .parent() + .ok_or_else(|| anyhow!("main package has no parent directory"))?; + + let line = "compiling with `go`, this might take a moment..."; + logger.log(line, LogLevel::INFO).await?; + + let mut command = Command::new("go"); + command.arg("build"); + command.arg("-o"); + command.arg(&destination); + command.arg(main_path); + command.current_dir(rl_plugin.source_path()); + + run_logged_command(command, logger).await?; + + if !destination.exists() { + return Err(anyhow!("Binary {} not found", destination.display())); + } + + Ok(destination) +} + +const GO_SKIP_DIRS: &[&str] = &[ + "examples", + "example", + "testdata", + "tests", + "docs", + "doc", + ".git", + ".github", + ".vscode", + ".idea", + "vendor", + "node_modules", + "target", + "dist", + "build", + "tmp", + "bench", + "benchmark", + "benchmarks", +]; + +async fn find_go_main_packages(root: PathBuf) -> Result, anyhow::Error> { + let mut results: Vec = Vec::new(); + + let mut queue = VecDeque::new(); + queue.push_back((root.clone(), 0usize)); + + while let Some((path, depth)) = queue.pop_front() { + if depth > 256 { + continue; + } + + let Ok(mut read_dir) = fs::read_dir(&path).await else { + continue; + }; + + while let Some(entry) = read_dir.next_entry().await? { + let path = entry.path(); + let file_type = entry.file_type().await?; + + let Some(file_name) = path.file_name().and_then(|p| p.to_str()) else { + continue; + }; + + if file_type.is_dir() { + if !GO_SKIP_DIRS.contains(&file_name) { + queue.push_back((path, depth + 1)); + } + continue; + } + + if !file_type.is_file() { + continue; + } + + if path.extension().and_then(|e| e.to_str()) != Some("go") { + continue; + } + + let Ok(content) = fs::read_to_string(&path).await else { + continue; + }; + + if !content.contains("package main") { + continue; + } + + if !content.contains("func main(") { + continue; + } + + results.push(path.clone()); + } + } + + Ok(results) +} + +pub async fn install_poetry_plugin( + rl_plugin: &RecklessPlugin, + logger: &mut RecklessLogger<'_>, +) -> Result { + let line = "using installer poetryvenv"; + logger.log(line, LogLevel::INFO).await?; + + let venv_dir = rl_plugin.source_path().join(".venv"); + create_venv(rl_plugin.source_path(), &venv_dir, logger).await?; + + let mut env: HashMap = std::env::vars().collect(); + + env.insert("VIRTUAL_ENV".into(), venv_dir.to_string_lossy().to_string()); + env.remove("POETRY_VIRTUAL_ENV"); + + env.insert("LANG".to_string(), "C.UTF-8".to_string()); + env.insert("LC_ALL".to_string(), "C.UTF-8".to_string()); + env.insert("PYTHONUTF8".to_string(), "1".to_string()); + env.insert("PYTHONIOENCODING".to_string(), "utf-8".to_string()); + env.insert( + "POETRY_VIRTUALENVS_PATH".into(), + venv_dir.to_string_lossy().into_owned(), + ); + + let line = "installing dependencies with `poetry install`, this might take a moment..."; + logger.log(line, LogLevel::INFO).await?; + + let mut command = Command::new("poetry"); + command + .arg("install") + .arg("--no-root") + .arg("--no-interaction") + .current_dir(rl_plugin.source_path()) + .env_clear() + .envs(&env); + + run_logged_command(command, logger).await?; + + let line = "dependencies installed successfully"; + logger.log(line, LogLevel::INFO).await?; + + let wrapper = rl_plugin.manifest().entry_filename()?; + let wrapper_path = rl_plugin.get_entrypath()?; + + let wrapper = create_wrapper(rl_plugin, wrapper, &venv_dir).await?; + fs::write(&wrapper_path, wrapper).await?; + + set_executable(&wrapper_path).await?; + + Ok(wrapper_path) +} + +pub async fn install_uv_plugin( + rl_plugin: &RecklessPlugin, + logger: &mut RecklessLogger<'_>, +) -> Result { + let line = "using installer pythonuv"; + logger.log(line, LogLevel::INFO).await?; + + let mut command = Command::new("uv"); + command.arg("sync").current_dir(rl_plugin.source_path()); + run_logged_command(command, logger).await?; + + let line = "dependencies installed successfully"; + logger.log(line, LogLevel::INFO).await?; + + let wrapper = rl_plugin.manifest().entry_filename()?; + let wrapper_path = rl_plugin.get_entrypath()?; + let venv_dir = rl_plugin.source_path().join(".venv"); + + let wrapper = create_wrapper(rl_plugin, wrapper, &venv_dir).await?; + fs::write(&wrapper_path, wrapper).await?; + + set_executable(&wrapper_path).await?; + + Ok(wrapper_path) +} + +pub async fn install_uv_shebang_plugin( + rl_plugin: &RecklessPlugin, + logger: &mut RecklessLogger<'_>, +) -> Result { + let line = "using installer pythonuvshebang"; + logger.log(line, LogLevel::INFO).await?; + + let entryfile = rl_plugin.manifest().entry_filename()?; + + let plugin_path = rl_plugin.source_path().join(entryfile); + set_executable(&plugin_path).await?; + + let symlink_path = rl_plugin.get_entrypath()?; + + create_symlink(&plugin_path, &symlink_path)?; + + Ok(symlink_path) +} + +pub async fn install_uv_legacy_plugin( + rl_plugin: &RecklessPlugin, + logger: &mut RecklessLogger<'_>, +) -> Result { + let line = "using installer pythonuvlegacy"; + logger.log(line, LogLevel::INFO).await?; + + let mut command = Command::new("uv"); + command + .arg("venv") + .arg("--clear") + .current_dir(rl_plugin.source_path()); + + run_logged_command(command, logger).await?; + + let python = python_bin(&rl_plugin.source_path().join(".venv")); + + let mut command = Command::new("uv"); + command + .arg("pip") + .arg("install") + .arg("--python") + .arg(python) + .arg("-r") + .arg("requirements.txt") + .current_dir(rl_plugin.source_path()); + run_logged_command(command, logger).await?; + + let line = "dependencies installed successfully"; + logger.log(line, LogLevel::INFO).await?; + + let wrapper = rl_plugin.manifest().entry_filename()?; + let wrapper_path = rl_plugin.get_entrypath()?; + let venv_dir = rl_plugin.source_path().join(".venv"); + + let wrapper = create_wrapper(rl_plugin, wrapper, &venv_dir).await?; + fs::write(&wrapper_path, wrapper).await?; + + set_executable(&wrapper_path).await?; + + Ok(wrapper_path) +} + +pub async fn install_python_plugin( + rl_plugin: &RecklessPlugin, + logger: &mut RecklessLogger<'_>, +) -> Result { + let line = "using installer PyprojectViaPip/Python"; + logger.log(line, LogLevel::INFO).await?; + + let venv_dir = rl_plugin.source_path().join(".venv"); + create_venv(rl_plugin.source_path(), &venv_dir, logger).await?; + + let pip = pip_bin(&venv_dir); + + let req_txt = rl_plugin.source_path().join("requirements.txt"); + let pyproject = rl_plugin.source_path().join("pyproject.toml"); + + let line = "installing dependencies with `pip install`..."; + logger.log(line, LogLevel::INFO).await?; + + let mut command = Command::new(&pip); + command.arg("install"); + + if req_txt.exists() { + command.arg("-r").arg(&req_txt); + } else if pyproject.exists() { + command.arg("."); + } else { + return Err(anyhow!("No requirements.txt or pyproject.toml found")); + } + + command.current_dir(rl_plugin.source_path()); + run_logged_command(command, logger).await?; + + let line = "dependencies installed successfully"; + logger.log(line, LogLevel::INFO).await?; + + let wrapper = rl_plugin.manifest().entry_filename()?; + let wrapper_path = rl_plugin.get_entrypath()?; + + let wrapper = create_wrapper(rl_plugin, wrapper, &venv_dir).await?; + fs::write(&wrapper_path, wrapper).await?; + + set_executable(&wrapper_path).await?; + + Ok(wrapper_path) +} + +async fn create_venv( + source: &Path, + venv_dir: &Path, + logger: &mut RecklessLogger<'_>, +) -> Result<(), anyhow::Error> { + let line = format!("creating venv at: {}", venv_dir.display()); + logger.log(&line, LogLevel::INFO).await?; + + let mut command = Command::new("python"); + command + .arg("-m") + .arg("venv") + .arg(venv_dir) + .current_dir(source); + + run_logged_command(command, logger).await?; + + Ok(()) +} + +fn python_bin(venv: &Path) -> PathBuf { + #[cfg(unix)] + { + venv.join("bin").join("python") + } + #[cfg(windows)] + { + venv.join("Scripts").join("python.exe") + } +} + +fn pip_bin(venv: &Path) -> PathBuf { + #[cfg(unix)] + { + venv.join("bin").join("pip") + } + #[cfg(windows)] + { + venv.join("Scripts").join("pip.exe") + } +} + +async fn create_wrapper( + rl_plugin: &RecklessPlugin, + entryfile: &Path, + venv: &Path, +) -> Result { + let source_str = rl_plugin + .source_path() + .to_str() + .ok_or_else(|| anyhow!("source path contains invalid utf-8"))? + .to_owned(); + + let venv = check_venv(venv).await?; + + let python = python_bin(&venv); + + let python = python.display().to_string(); + + let path_str = rl_plugin + .path() + .to_str() + .ok_or_else(|| anyhow!("path contains invalid utf-8"))?; + + let module_name = entryfile + .file_stem() + .ok_or_else(|| anyhow!("entryfile has no filename"))? + .to_str() + .ok_or_else(|| anyhow!("entryfile has invalid utf-8 characters"))?; + + let wrapper = format!( + r#"#!{python} +import sys +import runpy + +if '{source_str}' not in sys.path: + sys.path.append('{source_str}') + +if '{path_str}' in sys.path: + sys.path.remove('{path_str}') + +runpy.run_module("{module_name}", {{}}, "__main__") +"# + ); + Ok(wrapper) +} + +async fn check_venv(venv: &Path) -> Result { + if python_bin(venv).exists() { + return Ok(venv.to_path_buf()); + } + + let mut venv_entries = fs::read_dir(venv).await?; + + while let Ok(Some(entry)) = venv_entries.next_entry().await { + if entry.file_type().await?.is_file() { + continue; + } + if python_bin(&entry.path()).exists() { + return Ok(entry.path()); + } + } + + Err(anyhow!("python not found in venv: {}", venv.display())) +} + +#[cfg(unix)] +async fn set_executable(path: &Path) -> Result<(), anyhow::Error> { + use std::os::unix::fs::PermissionsExt; + + let mut perm = fs::metadata(path).await?.permissions(); + perm.set_mode(0o755); + fs::set_permissions(path, perm).await?; + Ok(()) +} + +#[cfg(not(unix))] +async fn set_executable(_path: &Path) -> Result<()> { + Ok(()) +} diff --git a/plugins/reckless-plugin/src/main.rs b/plugins/reckless-plugin/src/main.rs new file mode 100644 index 000000000000..8f307f95e06b --- /dev/null +++ b/plugins/reckless-plugin/src/main.rs @@ -0,0 +1,200 @@ +use std::{path::PathBuf, str::FromStr, sync::Arc}; + +use clap::{CommandFactory, Parser}; +use cln_plugin::{ + Builder, Plugin, RpcMethodBuilder, + messages::NotificationTopic, + options::{ConfigOption, StringConfigOption}, +}; +use cln_rpc::{ClnRpc, model::requests::ListconfigsRequest}; +use serde_json::json; +use tokio::sync::Mutex; + +use crate::structs::{RecklessArgs, RecklessCmd, SourceCmd}; +use crate::{ + cmds::{ + enable::{handle_disable, handle_enable}, + install::{handle_install, handle_uninstall}, + list::{handle_list_available, handle_list_installed}, + source::{handle_source_add, handle_source_list, handle_source_remove}, + tip::handle_tip, + update::handle_update, + }, + structs::PluginState, +}; + +mod cmds; +mod installers; +mod structs; +mod util; + +const RECKLESS_DIR: StringConfigOption = ConfigOption::new_str_no_default( + "reckless-dir", + "directory where reckless config, git repos and metadata are stored, \ + defaults to /reckless", +); +const RECKLESS_NOTIFICATION: &str = "reckless_log"; + +#[tokio::main(flavor = "current_thread")] +async fn main() -> Result<(), anyhow::Error> { + unsafe { + std::env::set_var( + "CLN_PLUGIN_LOG", + "cln_plugin=info,cln_rpc=info,cln_reckless=trace,warn", + ); + }; + + log_panics::init(); + + let github_redir = std::env::var("REDIR_GITHUB").ok(); + + let Some(conf_plugin) = Builder::new(tokio::io::stdin(), tokio::io::stdout()) + .rpcmethod_from_builder( + RpcMethodBuilder::new("reckless", reckless) + .description("manage CLN plugins: install, uninstall, and configuration"), + ) + .notification(NotificationTopic::new(RECKLESS_NOTIFICATION)) + .option(RECKLESS_DIR) + .dynamic() + .configure() + .await? + else { + return Ok(()); + }; + + let mut lightning_dir = PathBuf::from_str(&conf_plugin.configuration().lightning_dir)?; + let mut rpc = match ClnRpc::new(lightning_dir.join(conf_plugin.configuration().rpc_file)).await + { + Ok(o) => o, + Err(e) => { + return conf_plugin + .disable(&format!("could not establish RPC connection to CLN: {e}")) + .await; + } + }; + + let configs_resp = match rpc + .call_typed(&ListconfigsRequest { + config: Some("conf".to_owned()), + }) + .await + { + Ok(o) => o, + Err(e) => { + return conf_plugin + .disable(&format!("could not get listconfigs: {e}")) + .await; + } + }; + let custom_cln_config = configs_resp + .configs + .and_then(|c| c.conf) + .map(|cc| PathBuf::from(cc.value_str)); + + let (cln_global_conf, cln_conf, cln_setconfig) = if let Some(custom_config) = custom_cln_config + { + let Some(conf_dir) = custom_config.parent() else { + return conf_plugin + .disable("`--conf` has no parent directory") + .await; + }; + let Some(conf_name) = custom_config.file_name().and_then(|f| f.to_str()) else { + return conf_plugin.disable("`--conf` has no valid file name").await; + }; + let setconfig = conf_dir.join(format!("{conf_name}.setconfig")); + (None, custom_config, setconfig) + } else { + let Some(global_dir) = lightning_dir.parent() else { + return conf_plugin + .disable("`lightning-dir` has no parent directory") + .await; + }; + let global_config = Some(global_dir.join("config")); + let network_config = lightning_dir.join("config"); + let setconfig_config = lightning_dir.join("config.setconfig"); + + (global_config, network_config, setconfig_config) + }; + + lightning_dir.pop(); + + let reckless_dir = conf_plugin + .option(&RECKLESS_DIR)? + .map_or_else(|| lightning_dir.join("reckless"), PathBuf::from); + + let reckless_conf = reckless_dir.join(format!( + "{}-reckless.conf", + conf_plugin.configuration().network + )); + + let state = PluginState { + reckless_dir, + cln_conf, + cln_global_conf, + cln_setconfig, + reckless_conf, + github_redir, + rpc: Arc::new(Mutex::new(rpc)), + }; + let plugin = conf_plugin.start(state).await?; + + plugin.join().await +} + +async fn reckless( + plugin: Plugin, + args: serde_json::Value, +) -> Result { + let gather_args = structs::json_to_argv(&args)?; + + let parsed = match RecklessArgs::try_parse_from(gather_args) { + Ok(p) => p, + Err(e) if e.kind() == clap::error::ErrorKind::DisplayHelp => { + return Ok( + serde_json::json!({ "format-hint": "simple","result": e.render().to_string() }), + ); + } + Err(e) => { + return Err(anyhow::anyhow!( + "{}", + e.render().to_string().replace('\n', " ") + )); + } + }; + + match parsed.command { + Some(RecklessCmd::Install(args)) => { + handle_install(plugin.clone(), args, parsed.verbose).await + } + Some(RecklessCmd::Uninstall(args)) => { + handle_uninstall(plugin.clone(), args.target, parsed.verbose).await + } + Some(RecklessCmd::Listavailable(args)) => { + handle_list_available(plugin.clone(), args.target, parsed.verbose).await + } + Some(RecklessCmd::Enable(args)) => { + handle_enable(plugin.clone(), args, parsed.verbose).await + } + Some(RecklessCmd::Disable(args)) => { + handle_disable(plugin.clone(), args.target, parsed.verbose).await + } + Some(RecklessCmd::Source(args)) => match args.subcommand { + SourceCmd::List => handle_source_list(plugin.clone(), parsed.verbose).await, + SourceCmd::Add(t) => handle_source_add(plugin.clone(), t.target, parsed.verbose).await, + SourceCmd::Remove(t) => { + handle_source_remove(plugin.clone(), t.target, parsed.verbose).await + } + }, + Some(RecklessCmd::Update(args)) => { + handle_update(plugin.clone(), args, parsed.verbose).await + } + Some(RecklessCmd::Listinstalled) => { + handle_list_installed(plugin.clone(), parsed.verbose).await + } + Some(RecklessCmd::Tip(args)) => handle_tip(plugin.clone(), args, parsed.verbose).await, + None => Ok(json!({ + "format-hint": "simple", + "result": RecklessArgs::command().render_help().to_string() + })), + } +} diff --git a/plugins/reckless-plugin/src/structs.rs b/plugins/reckless-plugin/src/structs.rs new file mode 100644 index 000000000000..e0b2d355ee3d --- /dev/null +++ b/plugins/reckless-plugin/src/structs.rs @@ -0,0 +1,899 @@ +use std::{ + collections::HashSet, + fmt::Display, + path::{Path, PathBuf}, + sync::Arc, + time::{SystemTime, UNIX_EPOCH}, +}; + +use anyhow::{Error, anyhow}; +use chrono::Utc; +use clap::{Args, Parser, Subcommand}; +use cln_plugin::{Plugin, options}; +use cln_rpc::{ClnRpc, model::responses::XpayResponse, notifications::LogLevel}; +use serde::{Deserialize, Serialize}; +use serde_json::json; +use tokio::sync::Mutex; +use url::Url; + +use crate::{RECKLESS_NOTIFICATION, util::validate_path}; + +#[derive(Clone)] +pub struct PluginState { + pub reckless_dir: PathBuf, + pub cln_conf: PathBuf, + pub cln_global_conf: Option, + pub cln_setconfig: PathBuf, + pub reckless_conf: PathBuf, + pub github_redir: Option, + pub rpc: Arc>, +} +impl PluginState { + pub fn get_cln_configs(&self) -> Vec<&Path> { + if let Some(cln_global) = self.cln_global_conf.as_ref() { + return vec![cln_global, &self.cln_conf, &self.cln_setconfig]; + } + + vec![&self.cln_conf, &self.cln_setconfig] + } +} + +pub struct RecklessLogger<'a> { + plugin: &'a Plugin, + log: Vec, + topic: RecklessTopic, + verbose: bool, +} +impl<'a> RecklessLogger<'a> { + pub fn new(plugin: &'a Plugin, topic: RecklessTopic, verbose: bool) -> Self { + Self { + plugin, + log: Vec::new(), + topic, + verbose, + } + } + pub async fn log(&mut self, line: &str, log_level: LogLevel) -> Result<(), anyhow::Error> { + if !self.verbose + && (log_level == LogLevel::IO + || log_level == LogLevel::TRACE + || log_level == LogLevel::DEBUG) + { + return Ok(()); + } + for line in line.split('\n') { + match log_level { + LogLevel::IO => { + self.log.push(format!("IO: {line}")); + log::trace!("{line}"); + } + LogLevel::TRACE => { + self.log.push(format!("TRACE: {line}")); + log::trace!("{line}"); + } + LogLevel::DEBUG => { + self.log.push(format!("DEBUG: {line}")); + log::debug!("{line}"); + } + LogLevel::INFO => { + self.log.push(format!("INFO: {line}")); + log::info!("{line}"); + } + LogLevel::UNUSUAL => { + self.log.push(format!("WARNING: {line}")); + log::warn!("{line}"); + } + LogLevel::BROKEN => { + self.log.push(format!("ERROR: {line}")); + log::error!("{line}"); + } + } + + if let RecklessTopic::Install = self.topic { + let now = Utc::now(); + + let unix_timestamp = f64::from(now.timestamp_subsec_millis()) / 1_000.0; + let iso8601 = now.to_rfc3339(); + self.plugin + .send_custom_notification( + RECKLESS_NOTIFICATION.to_owned(), + json!({ + "level": log_level, + "log": line, + "time": &unix_timestamp.to_string(), + "timestamp": iso8601}), + ) + .await?; + } + } + + Ok(()) + } +} + +#[derive(Parser, Debug, Deserialize, PartialEq)] +#[command(name = "reckless", no_binary_name = true, disable_help_flag = true)] +#[allow(clippy::struct_excessive_bools)] +pub struct RecklessArgs { + #[arg(short = 'v', long, default_value_t = false, global = true)] + pub verbose: bool, + + #[command(subcommand)] + pub command: Option, +} + +#[derive(Subcommand, Debug, Deserialize, PartialEq)] +pub enum RecklessCmd { + /// Install a plugin, start it and then persist to config + Install(InstallArgs), + + /// Stop a plugin and remove it from configs and disk + Uninstall(TargetArgs), + + /// List plugins available from the sources list + Listavailable(ListArgs), + + /// Dynamically enable a plugin and update config + Enable(EnableArgs), + + /// Disable a plugin, remove it from the config, but keep the plugin files + Disable(TargetArgs), + + /// Manage plugin search sources + Source(SourceArgs), + + /// Update plugins to latest version + Update(UpdateArgs), + + /// List reckless-installed plugins + Listinstalled, + + /// Tip a plugin author + Tip(TipArgs), +} + +/// Shared args for commands that take one or more plugin name targets +#[derive(Args, Debug, Deserialize, PartialEq)] +pub struct TargetArgs { + pub target: String, +} + +#[derive(Args, Debug, Deserialize, PartialEq)] +pub struct ListArgs { + pub target: Option, +} + +/// `reckless source ` +#[derive(Args, Debug, Deserialize, PartialEq)] +pub struct SourceArgs { + #[command(subcommand)] + pub subcommand: SourceCmd, +} + +#[derive(Args, Debug, Deserialize, PartialEq)] +pub struct InstallArgs { + #[arg(help = "name of plugin to install")] + pub target: String, + + #[arg(long, help = "build plugins in debug mode and keep build files")] + pub developer: bool, + + #[arg(value_parser = parse_key_val)] + pub options: Vec<(String, Option)>, +} + +#[derive(Args, Debug, Deserialize, PartialEq)] +pub struct UpdateArgs { + #[arg(help = "name of plugin to update, leave empty to update all installed plugins")] + pub target: Option, + + #[arg(long, help = "build plugins in debug mode and keep build files")] + pub developer: bool, + + #[arg(value_parser = parse_key_val)] + pub options: Vec<(String, Option)>, +} + +#[derive(Args, Debug, Deserialize, PartialEq)] +pub struct EnableArgs { + #[arg(help = "name of plugin to install")] + pub target: String, + + #[arg(value_parser = parse_key_val)] + pub options: Vec<(String, Option)>, +} + +#[allow(clippy::unnecessary_wraps)] +pub fn parse_key_val(s: &str) -> Result<(String, Option), String> { + if let Some((k, v)) = s.split_once('=') { + Ok((k.to_owned(), Some(v.to_owned()))) + } else { + Ok((s.to_owned(), None)) + } +} + +#[derive(Args, Debug, Deserialize, PartialEq)] +pub struct TipArgs { + #[arg(help = "plugin name which author to tip")] + pub target: String, + + #[arg(help = "tip amount in msat")] + pub amount_msat: u64, + + #[arg(help = "tip message")] + pub payer_note: Option, +} + +#[derive(Subcommand, Debug, Deserialize, PartialEq)] +pub enum SourceCmd { + /// List available plugin sources + List, + + /// Add a source repository + Add(TargetArgs), + + /// Remove a plugin source repository + #[command(aliases = ["rem", "rm"])] + Remove(TargetArgs), +} + +pub fn json_to_argv(value: &serde_json::Value) -> Result, Error> { + match value { + serde_json::Value::Array(arr) => arr + .iter() + .map(|v| match v { + serde_json::Value::String(s) => Ok(s.clone()), + other => Ok(other.to_string()), + }) + .collect(), + serde_json::Value::Object(obj) => { + fn get_flag<'a>( + key: &'a str, + obj: &serde_json::Map, + remaining: &mut std::collections::HashSet<&'a str>, + ) -> Result { + remaining.remove(key); + match obj.get(key) { + None => Ok(false), + Some(serde_json::Value::Bool(b)) => Ok(*b), + Some(other) => Err(anyhow!("\"{key}\" must be a boolean, got: {other}")), + } + } + + let mut argv: Vec = Vec::new(); + let mut remaining: HashSet<&str> = obj.keys().map(String::as_str).collect(); + + if get_flag("verbose", obj, &mut remaining)? { + argv.push("-v".to_owned()); + } + + remaining.remove("command"); + let command = obj + .get("command") + .and_then(|v| v.as_str()) + .ok_or_else(|| anyhow!("object form requires a `command` field"))?; + argv.push(command.to_owned()); + + if let Some(sc) = obj.get("subcommand") { + if !command.eq_ignore_ascii_case("source") { + return Err(anyhow!("`subcommand` only valid if `command` is `source`")); + } + remaining.remove("subcommand"); + argv.push( + sc.as_str() + .ok_or_else(|| anyhow!("`subcommand` must be a string"))? + .to_owned(), + ); + } + + if get_flag("developer", obj, &mut remaining)? { + argv.push("--developer".to_owned()); + } + + for key in ["target", "amount_msat", "payer_note"] { + remaining.remove(key); + match obj.get(key) { + Some(serde_json::Value::String(s)) => argv.push(s.clone()), + Some(other) => argv.push(other.to_string()), + None => {} + } + } + + if let Some(serde_json::Value::Array(opts)) = obj.get("options") { + remaining.remove("options"); + for opt in opts { + match opt { + serde_json::Value::String(s) => argv.push(s.clone()), + _ => return Err(anyhow!("{opt} must be a string")), + } + } + } + + if !remaining.is_empty() { + let mut unknown: Vec<&str> = remaining.into_iter().collect(); + unknown.sort_unstable(); + return Err(anyhow!("unknown fields: {}", unknown.join(", "))); + } + + Ok(argv) + } + _ => Err(anyhow!("expected array or object")), + } +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize)] +pub enum Installer { + PythonUv, + PythonUvShebang, + PythonUvLegacy, + PoetryVenv, + PyprojectViaPip, + Python, + Nodejs, + Rust, + Go, + Custom, +} + +#[derive(Debug, Clone, Copy)] +pub enum RecklessTopic { + Install, + Uninstall, + Search, + Enable, + Source, + Tip, +} + +#[derive(Deserialize, Default, Debug)] +pub struct GetManifestResponse { + pub options: Vec, + pub dynamic: Option, +} +impl GetManifestResponse { + pub fn is_dynamic(&self) -> bool { + self.dynamic.unwrap_or(false) + } +} + +#[derive(Clone, Debug, Deserialize)] +pub struct UntypedConfigOption { + pub name: String, + #[serde(rename = "type")] + pub value_type: options::ValueType, + // pub default: Option, + // pub description: String, + // pub deprecated: Option, + // pub dynamic: Option, + pub multi: Option, +} +impl UntypedConfigOption { + // pub fn is_dynamic(&self) -> bool { + // self.dynamic.unwrap_or(false) + // } + pub fn is_multi(&self) -> bool { + self.multi.unwrap_or(false) + } + // pub fn is_deprecated(&self) -> bool { + // self.deprecated.unwrap_or(false) + // } +} + +#[derive(Clone, Serialize, Deserialize, Debug, Default)] +pub struct RecklessManifest { + #[serde(skip_serializing_if = "Option::is_none")] + pub short_description: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub long_description: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub entrypoint: Option, + #[serde(skip_serializing_if = "option_vec_is_empty")] + pub dependencies: Option>, + #[serde(skip_serializing_if = "option_vec_is_empty")] + pub install_cmd: Option>, + #[serde(skip_serializing_if = "option_vec_is_empty")] + pub required_options: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub offer: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub installable: Option, +} +impl RecklessManifest { + pub fn entry_filename(&self) -> Result<&Path, anyhow::Error> { + Ok(Path::new( + self.entrypoint + .as_ref() + .ok_or_else(|| anyhow!("no entrypoint found"))? + .file_name() + .ok_or_else(|| anyhow!("entrypoint has no filename"))?, + )) + } + pub fn entry_filename_str(&self) -> Result { + Ok(self + .entry_filename()? + .to_str() + .ok_or_else(|| anyhow!("entry filename contains invalid utf-8"))? + .to_owned()) + } +} + +#[allow(clippy::ref_option)] +fn option_vec_is_empty(v: &Option>) -> bool { + v.as_ref().is_none_or(Vec::is_empty) +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +#[serde(untagged)] +pub enum PluginOrigin { + LocalPath(PathBuf), + Url(String), +} +impl Display for PluginOrigin { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + PluginOrigin::LocalPath(path) => write!(f, "{}", path.display()), + PluginOrigin::Url(url) => write!(f, "{url}"), + } + } +} +impl PluginOrigin { + pub fn new(original_source: &str) -> Result { + match Url::parse(original_source) { + Ok(url) => { + if matches!(url.scheme(), "http" | "https") { + Ok(PluginOrigin::Url(original_source.to_owned())) + } else { + Err(anyhow!( + "only http/https are supported for remote git \ + repositories: {original_source}" + )) + } + } + _ => Ok(PluginOrigin::LocalPath(validate_path(original_source)?)), + } + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct RecklessPlugin { + plugin_name: String, + /// URL or path where we got the plugin from, e.g. + /// + origin: PluginOrigin, + /// path that to the overall repo + /// e.g. lightningd/plugins + origin_repo_path: PathBuf, + /// we might need to traverse deeper into a repo to find the plugin path + /// e.g. lightningd/plugins/summary + origin_plugin_path: PathBuf, + /// always ``reckless_dir/`` + path: PathBuf, + /// if origin is a remote git repo it is ``reckless_dir//source/`` + /// if it's from a local path it is just that + source_path: PathBuf, + metadata: Metadata, + installer: Installer, + manifest: RecklessManifest, +} +impl PartialEq for RecklessPlugin { + fn eq(&self, other: &Self) -> bool { + self.plugin_name == other.plugin_name + && self.origin == other.origin + && self.origin_plugin_path == other.origin_plugin_path + && self.origin_repo_path == other.origin_repo_path + && self.path == other.path + } +} +impl RecklessPlugin { + pub fn new( + origin: PluginOrigin, + origin_plugin_path: PathBuf, + origin_repo_path: PathBuf, + name: String, + reckless_dir: &Path, + installer: Installer, + manifest: RecklessManifest, + ) -> Self { + let source_path = match origin { + PluginOrigin::LocalPath(_) => origin_plugin_path.clone(), + PluginOrigin::Url(_) => reckless_dir.join(&name).join("source").join(&name), + }; + RecklessPlugin { + path: reckless_dir.join(&name), + plugin_name: name, + metadata: Metadata::new(origin.clone()), + origin, + origin_plugin_path, + origin_repo_path, + source_path, + installer, + manifest, + } + } + pub fn name(&self) -> &str { + &self.plugin_name + } + pub fn origin(&self) -> &PluginOrigin { + &self.origin + } + pub fn origin_plugin_path(&self) -> &PathBuf { + &self.origin_plugin_path + } + pub fn origin_repo_path(&self) -> &PathBuf { + &self.origin_repo_path + } + pub fn path(&self) -> &PathBuf { + &self.path + } + pub fn source_path(&self) -> &PathBuf { + &self.source_path + } + pub fn metadata(&self) -> &Metadata { + &self.metadata + } + pub fn metadata_mut(&mut self) -> &mut Metadata { + &mut self.metadata + } + pub fn is_local_path(&self) -> bool { + matches!(self.origin, PluginOrigin::LocalPath(_)) + } + pub fn installer(&self) -> &Installer { + &self.installer + } + pub fn manifest(&self) -> &RecklessManifest { + &self.manifest + } + pub fn get_entrypath(&self) -> Result { + Ok(self.path().join(self.manifest().entry_filename()?)) + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct Metadata { + installation_date: String, + installation_time: u64, + original_source: PluginOrigin, + #[serde(skip_serializing_if = "Option::is_none")] + requested_commit: Option, + #[serde(skip_serializing_if = "Option::is_none")] + installed_commit: Option, +} +impl Metadata { + pub fn new(original_source: PluginOrigin) -> Metadata { + Metadata { + installation_date: Utc::now().date_naive().to_string(), + installation_time: SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs(), + original_source, + requested_commit: None, + installed_commit: None, + } + } + pub fn new_install( + &mut self, + installed_commit: Option, + requested_commit: Option, + ) { + self.installation_date = Utc::now().date_naive().to_string(); + self.installation_time = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs(); + + self.requested_commit = requested_commit; + self.installed_commit = installed_commit; + } + pub fn requested_commit(&self) -> Option<&str> { + self.requested_commit.as_deref() + } + pub fn installed_commit(&self) -> Option<&str> { + self.installed_commit.as_deref() + } +} + +#[derive(Debug, Serialize)] +pub struct InstallResponse { + install: InstallResult, + log: Vec, +} +impl InstallResponse { + pub fn new(result: InstallResult, logger: RecklessLogger) -> InstallResponse { + InstallResponse { + install: result, + log: logger.log, + } + } +} +#[derive(Debug, Serialize)] +pub struct InstallResult { + pub plugin_name: String, + pub enabled: bool, + #[serde(skip_serializing_if = "Option::is_none")] + pub installed_commit: Option, +} + +#[derive(Debug, Serialize)] +pub struct UpdateResponse { + update: Vec, + log: Vec, +} +impl UpdateResponse { + pub fn new(result: Vec, logger: RecklessLogger) -> UpdateResponse { + UpdateResponse { + update: result, + log: logger.log, + } + } +} + +#[derive(Debug, Serialize)] +pub struct UninstallResponse { + uninstall: CommonResult, + log: Vec, +} +impl UninstallResponse { + pub fn new(result: CommonResult, logger: RecklessLogger) -> UninstallResponse { + UninstallResponse { + uninstall: result, + log: logger.log, + } + } +} +#[derive(Debug, Serialize)] +pub struct EnableResponse { + enable: CommonResult, + log: Vec, +} +impl EnableResponse { + pub fn new(result: CommonResult, logger: RecklessLogger) -> EnableResponse { + EnableResponse { + enable: result, + log: logger.log, + } + } +} +#[derive(Debug, Serialize)] +pub struct DisableResponse { + disable: CommonResult, + log: Vec, +} +impl DisableResponse { + pub fn new(result: CommonResult, logger: RecklessLogger) -> DisableResponse { + DisableResponse { + disable: result, + log: logger.log, + } + } +} +#[derive(Debug, Serialize)] +pub struct CommonResult { + pub plugin_name: String, +} + +#[derive(Debug, Serialize)] +pub struct ListavailableResponse { + listavailable: Vec, + log: Vec, +} +impl ListavailableResponse { + pub fn new(result: Vec, logger: RecklessLogger) -> ListavailableResponse { + ListavailableResponse { + listavailable: result, + log: logger.log, + } + } +} +#[derive(Debug, Serialize)] +pub struct ListavailableResult { + plugin_name: String, + origin: PluginOrigin, + installer: Installer, + manifest: RecklessManifest, +} +impl From for ListavailableResult { + fn from(plugin: RecklessPlugin) -> Self { + ListavailableResult { + plugin_name: plugin.plugin_name, + origin: plugin.origin, + installer: plugin.installer, + manifest: plugin.manifest, + } + } +} + +#[derive(Debug, Serialize)] +pub struct ListinstalledResponse { + listinstalled: Vec, + log: Vec, +} +impl ListinstalledResponse { + pub fn new(result: Vec, logger: RecklessLogger) -> ListinstalledResponse { + ListinstalledResponse { + listinstalled: result, + log: logger.log, + } + } +} +#[derive(Debug, Serialize)] +pub struct ListinstalledResult { + plugin_name: String, + installation_date: String, + installation_time: u64, + original_source: PluginOrigin, + #[serde(skip_serializing_if = "Option::is_none")] + requested_commit: Option, + #[serde(skip_serializing_if = "Option::is_none")] + installed_commit: Option, +} +impl ListinstalledResult { + pub fn new(metadata: Metadata, plugin_name: String) -> ListinstalledResult { + ListinstalledResult { + plugin_name, + installation_date: metadata.installation_date, + installation_time: metadata.installation_time, + original_source: metadata.original_source, + requested_commit: metadata.requested_commit, + installed_commit: metadata.installed_commit, + } + } +} + +#[derive(Debug, Serialize)] +pub struct SourcesResponse { + sources: Vec, + log: Vec, +} +impl SourcesResponse { + pub fn new(result: Vec, logger: RecklessLogger) -> SourcesResponse { + SourcesResponse { + sources: result, + log: logger.log, + } + } +} + +#[derive(Debug, Serialize)] +pub struct TipResponse { + tip: XpayResponse, + log: Vec, +} +impl TipResponse { + pub fn new(result: XpayResponse, logger: RecklessLogger) -> TipResponse { + TipResponse { + tip: result, + log: logger.log, + } + } +} + +#[cfg(test)] +mod tests { + use clap::Parser; + use serde_json::json; + + use crate::structs::{ + EnableArgs, InstallArgs, RecklessArgs, RecklessCmd, SourceArgs, SourceCmd, TargetArgs, + TipArgs, json_to_argv, + }; + + #[test] + fn test_object_input() { + let enable = json!({ + "command": "enable", + "target": "plugin_name", + "verbose": true + }); + let argv = json_to_argv(&enable).unwrap(); + let rl_args = RecklessArgs::try_parse_from(argv).unwrap(); + assert_eq!( + rl_args, + RecklessArgs { + verbose: true, + command: Some(RecklessCmd::Enable(EnableArgs { + target: "plugin_name".to_owned(), + options: vec![] + })) + } + ); + + let enable_opts = json!({ + "command": "enable", + "target": "plugin_name", + "options": ["test-option=value"] + }); + let argv = json_to_argv(&enable_opts).unwrap(); + let rl_args = RecklessArgs::try_parse_from(argv).unwrap(); + assert_eq!( + rl_args, + RecklessArgs { + verbose: false, + command: Some(RecklessCmd::Enable(EnableArgs { + target: "plugin_name".to_owned(), + options: vec![("test-option".to_owned(), Some("value".to_owned()))] + })) + } + ); + + let install = json!({ + "command": "install", + "target": "plugin_name", + "options": ["test-option=value"], + "verbose": true, + "developer": true + }); + let argv = json_to_argv(&install).unwrap(); + let rl_args = RecklessArgs::try_parse_from(argv).unwrap(); + assert_eq!( + rl_args, + RecklessArgs { + verbose: true, + command: Some(RecklessCmd::Install(InstallArgs { + target: "plugin_name".to_owned(), + developer: true, + options: vec![("test-option".to_owned(), Some("value".to_owned()))] + })) + } + ); + + let source = json!({ + "command": "source", + "subcommand": "add", + "target": "plugin_name", + "verbose": true + }); + let argv = json_to_argv(&source).unwrap(); + let rl_args = RecklessArgs::try_parse_from(argv).unwrap(); + assert_eq!( + rl_args, + RecklessArgs { + verbose: true, + command: Some(RecklessCmd::Source(SourceArgs { + subcommand: SourceCmd::Add(TargetArgs { + target: "plugin_name".to_owned() + }) + })) + } + ); + + let tip = json!({ + "command": "tip", + "target": "offer1", + "amount_msat": 1000, + "payer_note": "test note", + "verbose": true + }); + let argv = json_to_argv(&tip).unwrap(); + let rl_args = RecklessArgs::try_parse_from(argv).unwrap(); + assert_eq!( + rl_args, + RecklessArgs { + verbose: true, + command: Some(RecklessCmd::Tip(TipArgs { + target: "offer1".to_owned(), + amount_msat: 1000, + payer_note: Some("test note".to_owned()) + })) + } + ); + } + + #[test] + fn test_object_invalid() { + let typo = json!({ + "commnd": "enable", + "target": "plugin_name", + "verbose": true + }); + assert!(json_to_argv(&typo).is_err()); + + let extra = json!({ + "command": "enable", + "target": "plugin_name", + "verbose": true, + "invalid": "none", + }); + assert!(json_to_argv(&extra).is_err()); + } +} diff --git a/plugins/reckless-plugin/src/util.rs b/plugins/reckless-plugin/src/util.rs new file mode 100644 index 000000000000..e9a5afb66418 --- /dev/null +++ b/plugins/reckless-plugin/src/util.rs @@ -0,0 +1,1456 @@ +use std::{ + collections::{HashMap, HashSet, VecDeque}, + path::{Path, PathBuf}, + process::Stdio, + str::FromStr, + time::Duration, +}; + +use anyhow::anyhow; +use cln_plugin::{Plugin, options}; +use cln_rpc::{ + codec::MultiLineCodec, + model::{requests::PluginRequest, responses::PluginResponse}, + notifications::LogLevel, + primitives::PluginSubcommand, +}; +use futures::StreamExt; +use sha2::{Digest, Sha256}; +use tokio::{ + fs::{self, OpenOptions}, + io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader}, + process::Command, + time::timeout, +}; +use tokio_util::codec::FramedRead; +use url::Url; +use which::which; + +use crate::structs::{ + GetManifestResponse, Installer, PluginOrigin, PluginState, RecklessLogger, RecklessManifest, + RecklessPlugin, parse_key_val, +}; + +const DEFAULT_REPO: &str = "https://github.com/lightningd/plugins"; +const RECKLESS_CONFIG_HEADER: &str = "# This configuration file is managed by reckless to \ +activate and disable\n# reckless-installed plugins\n\n"; + +pub async fn run_logged_command( + mut command: Command, + logger: &mut RecklessLogger<'_>, +) -> Result { + let mut cmd_str = format!( + "`{} {}`", + command + .as_std() + .get_program() + .to_str() + .ok_or_else(|| anyhow!("command program contains invalid utf-8"))?, + command + .as_std() + .get_args() + .map(|arg| arg + .to_str() + .ok_or_else(|| anyhow!("command argument contains invalid utf-8"))) + .collect::, anyhow::Error>>()? + .join(" "), + ); + if let Some(cwd) = command.as_std().get_current_dir() { + cmd_str = format!("{} (cwd: {})", cmd_str, cwd.display()); + } + logger + .log(&format!("running command: {cmd_str}"), LogLevel::INFO) + .await?; + + command.stdout(Stdio::piped()).stderr(Stdio::piped()); + + let mut child = command.spawn()?; + + let stdout = child + .stdout + .take() + .ok_or_else(|| anyhow!("failed to capture stdout"))?; + + let stderr = child + .stderr + .take() + .ok_or_else(|| anyhow!("failed to capture stderr"))?; + + let mut stdout_lines = BufReader::new(stdout).lines(); + let mut stderr_lines = BufReader::new(stderr).lines(); + + let mut stdout_done = false; + let mut stderr_done = false; + + let mut stdout_buf = String::new(); + let mut stderr_last = String::new(); + + loop { + if stdout_done && stderr_done { + break; + } + + tokio::select! { + line = stdout_lines.next_line(), if !stdout_done => { + match line? { + Some(line) => { + logger.log(&line, LogLevel::INFO).await?; + stdout_buf.push_str(&line); + stdout_buf.push('\n'); + } + None => { + stdout_done = true; + } + } + } + + line = stderr_lines.next_line(), if !stderr_done => { + match line? { + Some(line) => { + logger.log(&line, LogLevel::UNUSUAL).await?; + stderr_last = line; + } + None => { + stderr_done = true; + } + } + } + } + } + + let status = child.wait().await?; + + if !status.success() { + return Err(anyhow!("command {cmd_str} failed: {stderr_last}")); + } + + Ok(stdout_buf.trim().to_owned()) +} + +pub async fn get_plugin_manifest( + entrypoint: &PathBuf, + logger: &mut RecklessLogger<'_>, +) -> Result { + let line = format!("getmanifest: {}", entrypoint.display()); + logger.log(&line, LogLevel::DEBUG).await?; + + let mut child = Command::new(entrypoint) + .stdin(std::process::Stdio::piped()) + .stdout(std::process::Stdio::piped()) + .spawn()?; + + let line = format!("spawned: {}", entrypoint.display()); + logger.log(&line, LogLevel::DEBUG).await?; + + let mut stdin = child + .stdin + .take() + .ok_or_else(|| anyhow!("could not take stdin handle"))?; + let stdout = child + .stdout + .take() + .ok_or_else(|| anyhow!("could not take stdout handle"))?; + + logger.log("took stdin/stdout", LogLevel::DEBUG).await?; + + let mut reader = FramedRead::new(stdout, MultiLineCodec::default()); + + // CLN plugin handshake: simulate lightningd sending getmanifest + let getmanifest = serde_json::json!({ + "jsonrpc": "2.0", + "id": "reckless-1", + "method": "getmanifest", + "params": {} + }); + + stdin.write_all(getmanifest.to_string().as_bytes()).await?; + stdin.write_all(b"\n\n").await?; + stdin.flush().await?; + + logger.log("requested manifest", LogLevel::DEBUG).await?; + + let result = timeout(Duration::from_secs(10), async { + let mut message_count = 0; + + loop { + let message = reader + .next() + .await + .ok_or_else(|| anyhow!("plugin exited before sending getmanifest response"))??; + + message_count += 1; + + if message_count > 100 { + return Err(anyhow!("plugin send alot, but no manifest found")); + } + + let line = format!("got message: `{message}`"); + logger.log(&line, LogLevel::TRACE).await?; + + let mut json = match serde_json::from_str::(&message) { + Ok(v) => v, + Err(e) => { + logger.log(&e.to_string(), LogLevel::TRACE).await?; + continue; + } + }; + + let line = format!("got json: {json:#?}"); + logger.log(&line, LogLevel::TRACE).await?; + + if json.get("id") == Some(&serde_json::Value::String("reckless-1".into())) { + let result = json + .get_mut("result") + .ok_or_else(|| anyhow!("invalid getmanifest response, no `result`"))? + .take(); + + return Ok(result); + } + } + }) + .await + .map_err(|_| anyhow!("timed out reading getmanifest response"))??; + + let parsed: GetManifestResponse = serde_json::from_value(result.clone())?; + let line = format!("got manifest: {parsed:#?}"); + logger.log(&line, LogLevel::DEBUG).await?; + + drop(stdin); + logger.log("dropped stdin", LogLevel::DEBUG).await?; + + let _ = child.start_kill(); + logger.log("child exited", LogLevel::DEBUG).await?; + + let _ = child.wait().await?; + logger.log("waited for child", LogLevel::DEBUG).await?; + + Ok(parsed) +} + +pub fn parse_options( + manifest: &GetManifestResponse, + options: &[(String, Option)], +) -> Result)>, anyhow::Error> { + let manifest_options: HashMap<_, _> = manifest + .options + .iter() + .map(|opt| (&opt.name, opt)) + .collect(); + + let mut seen = HashSet::new(); + + let mut result = Vec::new(); + + for (option_name, value_str) in options { + let manifest_opt = manifest_options + .get(option_name) + .ok_or_else(|| anyhow!("option {option_name} not found in manifest"))?; + + if !manifest_opt.is_multi() && !seen.insert(option_name) { + return Err(anyhow!("{option_name} is not a multi option")); + } + + let value = match (&manifest_opt.value_type, value_str) { + (cln_plugin::options::ValueType::String, Some(v)) => { + Some(options::Value::String(v.clone())) + } + (cln_plugin::options::ValueType::Integer, Some(v)) => { + Some(options::Value::Integer(i64::from_str(v)?)) + } + (cln_plugin::options::ValueType::Boolean, Some(v)) => { + Some(options::Value::Boolean(bool::from_str(v)?)) + } + (cln_plugin::options::ValueType::Flag, None) => None, + _ => { + return Err(anyhow!( + "Invalid option value, expected {:#?} for {option_name}", + manifest_opt.value_type + )); + } + }; + + result.push((option_name.clone(), value)); + } + + Ok(result) +} + +pub fn repo_path_from_url(url: &Url) -> Result { + let mut segments = url + .path_segments() + .ok_or_else(|| anyhow!("No paths in git URL"))?; + let last = segments + .next_back() + .ok_or(anyhow!("Missing repo name in git URL"))?; + + let repo_name = last.trim_end_matches(".git"); + + if repo_name.is_empty() { + return Err(anyhow!("could not determine repo name")); + } + + let repo_owner = segments + .next_back() + .ok_or(anyhow!("Missing repo owner in git URL"))?; + + for segment in segments { + if segment == "tree" { + return Err(anyhow!( + "Please provide a URL with only the repo owner and name, not a tree reference. \ + You can specify a branch when installing a plugin." + )); + } + } + + Ok(PathBuf::from(repo_owner).join(repo_name)) +} + +pub async fn init_plugin_repo( + plugin: &Plugin, + mut url: Url, + logger: &mut RecklessLogger<'_>, +) -> Result { + let repo_path = plugin.state().reckless_dir.join(repo_path_from_url(&url)?); + let line = format!("initializing repo `{url}` in: `{}`", repo_path.display()); + logger.log(&line, LogLevel::DEBUG).await?; + + if let Some(domain) = url.domain() { + if domain == "github.com" { + if let Some(github_redir) = &plugin.state().github_redir { + let line = format!("using github redirect: file://{github_redir}"); + logger.log(&line, LogLevel::INFO).await?; + url = Url::from_str(&format!("file://{github_redir}"))?; + } + } + } + + if repo_path.exists() { + let mut command = Command::new("git"); + command + .args(["remote", "set-head", "origin", "-a"]) + .current_dir(&repo_path); + run_logged_command(command, logger).await?; + + let mut command = Command::new("git"); + command + .args(["symbolic-ref", "refs/remotes/origin/HEAD", "--short"]) + .current_dir(&repo_path); + let default_branch = run_logged_command(command, logger).await?; + let default_branch = default_branch.trim_start_matches("origin/"); + + let mut command = Command::new("git"); + command + .args(["checkout", default_branch]) + .current_dir(&repo_path); + run_logged_command(command, logger).await?; + + let mut command = Command::new("git"); + command.args(["pull", "--ff-only"]).current_dir(&repo_path); + run_logged_command(command, logger).await?; + } else { + let repo_path_str = repo_path + .to_str() + .ok_or_else(|| anyhow!("path is invalid"))?; + let mut command = Command::new("git"); + command.args(["clone", "--recursive", url.as_str(), repo_path_str]); + run_logged_command(command, logger).await?; + } + + let mut command = Command::new("git"); + command + .args(["submodule", "sync", "--recursive"]) + .current_dir(&repo_path); + run_logged_command(command, logger).await?; + + let mut command = Command::new("git"); + command + .args(["submodule", "update", "--init", "--recursive"]) + .current_dir(&repo_path); + run_logged_command(command, logger).await?; + + Ok(repo_path) +} + +pub async fn find_plugin_locs( + reckless_dir: &Path, + origin: String, + repo_dir: PathBuf, + max_depth: usize, + logger: &mut RecklessLogger<'_>, +) -> Result, anyhow::Error> { + let line = format!("trying to find plugins in: `{}`", repo_dir.display()); + logger.log(&line, LogLevel::DEBUG).await?; + + let mut plugin_locs = HashMap::new(); + + let mut queue = VecDeque::new(); + queue.push_back((repo_dir.clone(), 0usize)); + + while let Some((path, depth)) = queue.pop_front() { + if depth > max_depth { + continue; + } + + if depth == 1 { + if let Some(name) = path.file_name().and_then(|p| p.to_str()) { + if name.contains("archive") + || name.eq(".git") + || name.eq(".venv") + || name.eq(".ci") + || name.eq(".github") + { + continue; + } + } + } + + let Some(name) = path.file_name().and_then(|p| p.to_str()) else { + continue; + }; + + let rl_manifest = read_reckless_manifest(&path).await?; + let mut rl_manifest = rl_manifest.unwrap_or_default(); + + match detect_installer(&path, &mut rl_manifest).await { + Ok(installer) => { + let plugin_origin = PluginOrigin::new(&origin)?; + plugin_locs.insert( + normalize_plugin_name(name), + RecklessPlugin::new( + plugin_origin, + path.clone(), + repo_dir.clone(), + name.to_owned(), + reckless_dir, + installer, + rl_manifest, + ), + ); + + continue; + } + Err(e) => { + let line = format!("could not detect installer for {}: {e}", path.display()); + logger.log(&line, LogLevel::UNUSUAL).await?; + } + } + + if depth == max_depth { + continue; + } + + let Ok(mut entries) = fs::read_dir(&path).await else { + continue; + }; + + while let Ok(Some(entry)) = entries.next_entry().await { + let Ok(file_type) = entry.file_type().await else { + continue; + }; + + if file_type.is_symlink() { + continue; + } + + if !file_type.is_dir() { + continue; + } + + queue.push_back((entry.path(), depth + 1)); + } + } + + Ok(plugin_locs) +} + +async fn file_hash(path: &Path) -> Result, anyhow::Error> { + let file = fs::File::open(path).await?; + let mut reader = BufReader::new(file); + + let mut hasher = Sha256::new(); + let mut buf = [0u8; 8192]; + + loop { + let n = reader.read(&mut buf).await?; + if n == 0 { + break; + } + + hasher.update(&buf[..n]); + } + + Ok(hasher.finalize().to_vec()) +} + +async fn files_differ(src: &Path, dst: &Path) -> Result { + let Ok(dst_meta) = fs::metadata(dst).await else { + return Ok(true); + }; + + let src_meta = fs::metadata(src).await?; + + if src_meta.len() != dst_meta.len() { + return Ok(true); + } + + let src_hash = file_hash(src).await?; + let dst_hash = file_hash(dst).await?; + + Ok(src_hash != dst_hash) +} + +pub async fn copy_dir_all( + src: &Path, + dst: &Path, + logger: &mut RecklessLogger<'_>, +) -> Result<(), anyhow::Error> { + let line = format!("copying from: {} -> {}", src.display(), dst.display()); + logger.log(&line, LogLevel::DEBUG).await?; + + let mut stack = vec![(src.to_path_buf(), dst.to_path_buf())]; + + while let Some((src, dst)) = stack.pop() { + fs::create_dir_all(&dst).await?; + + let line = format!("reading dir: {}", src.display()); + logger.log(&line, LogLevel::DEBUG).await?; + + let mut entries = fs::read_dir(&src).await?; + + while let Some(entry) = entries.next_entry().await? { + let name = entry.file_name(); + + let line = format!("processing: {}", name.to_string_lossy()); + logger.log(&line, LogLevel::DEBUG).await?; + + if name == ".venv" || name == ".git" { + let line = format!("skipping {}", entry.path().display()); + logger.log(&line, LogLevel::DEBUG).await?; + continue; + } + + let src_path = entry.path(); + let dst_path = dst.join(&name); + + // IMPORTANT: do not follow symlinks here + let meta = fs::symlink_metadata(&src_path).await?; + let file_type = meta.file_type(); + + if meta.file_type().is_symlink() { + match fs::metadata(&src_path).await { + Ok(target_meta) => { + if target_meta.is_dir() { + stack.push((src_path, dst_path)); + } else { + fs::copy(&src_path, &dst_path).await?; + } + } + Err(e) if e.kind() == std::io::ErrorKind::NotFound => { + let line = format!("skipping broken symlink: {}", src_path.display()); + logger.log(&line, LogLevel::UNUSUAL).await?; + } + Err(e) => return Err(e.into()), + } + } else if file_type.is_dir() { + stack.push((src_path, dst_path)); + } else if file_type.is_file() && files_differ(&src_path, &dst_path).await? { + let line = format!("copying file {}", src_path.display()); + logger.log(&line, LogLevel::DEBUG).await?; + fs::copy(&src_path, &dst_path).await?; + } + } + } + + let line = "copying: done"; + logger.log(line, LogLevel::DEBUG).await?; + Ok(()) +} + +pub async fn write_metadata(rl_plugin: &RecklessPlugin) -> Result<(), anyhow::Error> { + let install_dir = Path::new(rl_plugin.path()); + + if !install_dir.is_dir() { + return Err(anyhow!("{} is not a directory", install_dir.display())); + } + + fs::write( + install_dir.join(".metadata.json"), + serde_json::to_string_pretty(rl_plugin)?, + ) + .await?; + + Ok(()) +} + +pub async fn read_metadata( + plugin_name: &str, + plugin_dir: &Path, +) -> Result { + if !plugin_dir.exists() { + return Err(anyhow!("{plugin_name} is not installed")); + } + + let metadata_file = plugin_dir.join(".metadata.json"); + + let contents = fs::read_to_string(metadata_file).await?; + + let rl_plugin = serde_json::from_str(&contents)?; + + Ok(rl_plugin) +} + +pub fn parse_target(target: &str) -> Result<(String, Option), anyhow::Error> { + let (name, git_ref) = if let Some(x) = target.split_once('@') { + (normalize_plugin_name(x.0), Some(x.1.to_owned())) + } else { + (normalize_plugin_name(target), None) + }; + if name.contains('/') { + return Err(anyhow!("invalid plugin name")); + } + let name = if let Some((base, extension)) = name.split_once('.') { + if extension.contains('.') { + return Err(anyhow!("invalid plugin name, too many `.`")); + } + // We don't want file extensions in the name but we also had plugin names + // like go-lnmetrics.reporter + if extension.len() > 4 { + name + } else { + base.to_owned() + } + } else { + name + }; + Ok((name, git_ref)) +} + +pub fn validate_path(input: &str) -> Result { + let path = PathBuf::from(input); + + if !path.exists() { + return Err(anyhow!("path does not exist")); + } + + path.canonicalize() + .map_err(|e| anyhow!("invalid path: {e}"))?; + + Ok(path) +} + +pub async fn parse_install_target( + logger: &mut RecklessLogger<'_>, + target: &str, + search_results: &mut HashMap, + reckless_dir: &Path, +) -> Result<(String, Option), anyhow::Error> { + let (name, git_ref) = match parse_target(target) { + Ok(o) => o, + Err(e1) => match validate_path(target.trim()) { + Ok(local_path) => { + let plugin_name = local_path + .file_name() + .ok_or_else(|| { + anyhow!("local_dir has no final component: {}", local_path.display()) + })? + .to_str() + .ok_or_else(|| anyhow!("not a valid path: {}", local_path.display()))? + .to_owned(); + + let rl_manifest = read_reckless_manifest(&local_path).await?; + let mut rl_manifest = rl_manifest.unwrap_or_default(); + let installer = detect_installer(&local_path, &mut rl_manifest).await?; + + let plugin_origin = PluginOrigin::new(local_path.to_str().ok_or_else(|| { + anyhow!("path contains invalid utf-8: {}", local_path.display()) + })?)?; + search_results.insert( + plugin_name.clone(), + RecklessPlugin::new( + plugin_origin, + local_path.clone(), + local_path, + plugin_name.clone(), + reckless_dir, + installer, + rl_manifest, + ), + ); + (plugin_name, None) + } + Err(e2) => { + logger.log(&e1.to_string(), LogLevel::BROKEN).await?; + logger.log(&e2.to_string(), LogLevel::BROKEN).await?; + return Err(anyhow!("neither a valid target or path")); + } + }, + }; + Ok((name, git_ref)) +} + +pub async fn read_sources_file( + plugin: &Plugin, +) -> Result<(Vec, PathBuf), anyhow::Error> { + if !plugin.state().reckless_dir.exists() { + fs::create_dir_all(&plugin.state().reckless_dir).await?; + } + + let source_file = plugin.state().reckless_dir.join(".sources"); + + if !source_file.exists() { + fs::write(&source_file, format!("{DEFAULT_REPO}\n")).await?; + } + + let contents = fs::read_to_string(&source_file).await?; + let lines = contents.lines().collect::>(); + + let mut sources: Vec = Vec::new(); + + for line in &lines { + let origin = PluginOrigin::new(line)?; + sources.push(origin); + } + + Ok((sources, source_file)) +} + +async fn find_entryfile(path: &Path, plugin_name: &str) -> Result { + if !path.exists() { + return Err(anyhow!("{} not found", path.display())); + } + + let mut entries = fs::read_dir(&path).await?; + + let guesses = vec![format!("{plugin_name}.py"), format!("{plugin_name}.js")]; + + let mut python_candidates = Vec::new(); + let mut js_candidates = Vec::new(); + + while let Ok(Some(entry)) = entries.next_entry().await { + let Ok(file_type) = entry.file_type().await else { + continue; + }; + if file_type.is_dir() { + continue; + } + if let Some(file_name) = entry.file_name().to_str() { + if normalized_eq(file_name, plugin_name) { + return Ok(PathBuf::from_str(file_name)?); + } + + for guess in &guesses { + if normalized_eq(file_name, guess) { + return Ok(PathBuf::from_str(file_name)?); + } + } + + if file_name.starts_with("test") { + continue; + } + + let fn_path = Path::new(file_name); + if fn_path + .extension() + .is_some_and(|ext| ext.eq_ignore_ascii_case("py")) + { + python_candidates.push(file_name.to_owned()); + } else if fn_path + .extension() + .is_some_and(|ext| ext.eq_ignore_ascii_case("js")) + { + js_candidates.push(file_name.to_owned()); + } + } + } + + if !python_candidates.is_empty() { + for file in &python_candidates { + let file_path = path.join(file); + let content = fs::read_to_string(&file_path).await?; + if content.contains("plugin.run()") { + return Ok(PathBuf::from_str(file)?); + } + } + } + + if js_candidates.len() == 1 { + return Ok(PathBuf::from_str(js_candidates.first().unwrap())?); + } + + if js_candidates.is_empty() && python_candidates.len() == 1 { + return Ok(PathBuf::from_str(python_candidates.first().unwrap())?); + } + + Err(anyhow!( + "{plugin_name} entryfile not found in {}", + path.display() + )) +} + +pub async fn detect_installer( + plugin_path: &Path, + rl_manifest: &mut RecklessManifest, +) -> Result { + let mut entries = fs::read_dir(plugin_path).await?; + let mut files = Vec::new(); + + while let Some(entry) = entries.next_entry().await? { + if let Ok(name) = entry.file_name().into_string() { + files.push(name); + } + } + + let has = |name: &str| files.iter().find(|f| normalized_eq(f, name)); + + let plugin_name = plugin_path + .file_name() + .ok_or_else(|| anyhow!("no filename"))? + .to_str() + .ok_or_else(|| anyhow!("not a valid path"))?; + + if rl_manifest.install_cmd.as_ref().is_some() && rl_manifest.entrypoint.as_ref().is_some() { + return Ok(Installer::Custom); + } + + let entry_file = if let Some(et) = &rl_manifest.entrypoint { + Some(et.clone()) + } else { + find_entryfile(plugin_path, plugin_name).await.ok() + }; + + if let Some(ef) = &entry_file { + rl_manifest.entrypoint = Some(ef.clone()); + } + + if has("Cargo.toml").is_some() { + if entry_file.is_none() { + rl_manifest.entrypoint = Some(PathBuf::from_str(plugin_name)?); + } + if which("cargo").is_ok() { + return Ok(Installer::Rust); + } + return Err(anyhow!("rust plugin requires cargo")); + } + + if has("go.mod").is_some() { + if entry_file.is_none() { + rl_manifest.entrypoint = Some(PathBuf::from_str(plugin_name)?); + } + if which("go").is_ok() { + return Ok(Installer::Go); + } + return Err(anyhow!("go plugin requires go")); + } + + if has("package.json").is_some() { + if entry_file.is_none() { + return Err(anyhow!("node plugin entrypoint not found")); + } + if which("npm").is_ok() { + return Ok(Installer::Nodejs); + } + return Err(anyhow!("node plugin requires npm")); + } + + let actual_python_entry = + plugin_path.join(entry_file.ok_or_else(|| anyhow!("entryfile not found"))?); + + if !actual_python_entry.exists() { + return Err(anyhow!("entry file not found")); + } + + if !actual_python_entry + .extension() + .is_some_and(|ext| ext.eq_ignore_ascii_case("py")) + { + return Err(anyhow!("python entry file must end with .py")); + } + + if has_uv_shebang(plugin_path.join(actual_python_entry)).await? { + if which("uv").is_ok() { + return Ok(Installer::PythonUvShebang); + } + return Err(anyhow!("python plugin uses uv shebang but uv not found")); + } + + if has("uv.lock").is_some() { + if which("uv").is_ok() { + return Ok(Installer::PythonUv); + } + return Err(anyhow!("python plugin uses uv but uv not found")); + } + + if has("poetry.lock").is_some() { + if which("poetry").is_ok() { + return Ok(Installer::PoetryVenv); + } + return Err(anyhow!("python plugin uses poetry but poetry not found")); + } + + if has("pyproject.toml").is_some() { + if which("pip").is_ok() { + return Ok(Installer::PyprojectViaPip); + } + return Err(anyhow!("python pyproject.toml detected but no pip found")); + } + + if has("requirements.txt").is_some() { + if which("uv").is_ok() { + return Ok(Installer::PythonUvLegacy); + } + if which("pip").is_ok() { + return Ok(Installer::Python); + } + return Err(anyhow!("python requirements.txt detected but no pip found")); + } + + Err(anyhow!( + "plugin language could not be detected or is unsupported" + )) +} + +async fn has_uv_shebang(path: PathBuf) -> Result { + let file = fs::File::open(path).await?; + let mut reader = BufReader::new(file); + + let mut line = String::new(); + + loop { + line.clear(); + + let bytes_read = reader.read_line(&mut line).await?; + + if bytes_read == 0 { + return Ok(false); + } + + let trimmed = line.trim(); + + if trimmed.is_empty() { + continue; + } + + if !trimmed.starts_with("#!") { + return Ok(false); + } + + let shebang = &trimmed[2..]; + + let has_uv = shebang.split_whitespace().any(|part| part == "uv"); + + return Ok(has_uv); + } +} + +pub fn create_symlink(src: &Path, dst: &Path) -> std::io::Result<()> { + if let Ok(meta) = std::fs::symlink_metadata(dst) { + if meta.is_dir() { + std::fs::remove_dir_all(dst)?; + } else { + std::fs::remove_file(dst)?; + } + } + + #[cfg(unix)] + { + std::os::unix::fs::symlink(src, dst) + } + + #[cfg(windows)] + { + use std::fs as stdfs; + use std::os::windows::fs; + + let metadata = stdfs::metadata(src); + + match metadata { + Ok(m) if m.is_dir() => fs::symlink_dir(src, dst), + _ => fs::symlink_file(src, dst), + } + } +} + +pub fn normalize_plugin_name(name: &str) -> String { + name.to_ascii_lowercase() +} + +pub fn normalized_eq(a: &str, b: &str) -> bool { + a.replace('-', "_").eq(&b.replace('-', "_")) +} + +fn normalized_line(line: &str) -> &str { + line.trim_start_matches('#').trim_start() +} + +pub async fn update_config_file( + path: &Path, + plugin_line: &str, + removing: bool, + option_lines: &mut Vec<(String, String)>, + remove_options: &mut HashSet, + old_options: &mut Vec<(String, Option)>, +) -> anyhow::Result { + if !path.exists() { + return Ok(false); + } + + let contents = fs::read_to_string(path).await?; + let mut lines: Vec = contents.lines().map(str::to_owned).collect(); + + let mut changed = false; + let mut plugin_enabled = false; + + for line in &mut lines { + let normalized_line = normalized_line(line); + + if normalized_line == plugin_line { + if removing && !line.starts_with('#') { + *line = format!("#{normalized_line}"); + changed = true; + } else if !removing && line.starts_with('#') { + plugin_line.clone_into(line); + changed = true; + } + + plugin_enabled = true; + + continue; + } + + if let Some(pos) = option_lines + .iter() + .position(|(name, _)| normalized_line.starts_with(name)) + { + let (name, expected) = option_lines[pos].clone(); + + if *line != expected { + *line = expected; + changed = true; + } + + // remove ONLY this occurrence (supports multi) + option_lines.remove(pos); + remove_options.insert(name); + continue; + } + + for name in remove_options.iter() { + if line.starts_with(name) { + *line = format!("#{line}"); + changed = true; + old_options.push(parse_key_val(line).unwrap()); + break; + } + } + } + + if changed { + fs::write(path, format!("{}\n", lines.join("\n"))).await?; + } + + Ok(plugin_enabled) +} + +async fn read_reckless_manifest(source: &Path) -> Result, anyhow::Error> { + let manifest_path = source.join("manifest.json"); + + if manifest_path.exists() { + let contents = fs::read_to_string(&manifest_path).await?; + Ok(serde_json::from_str(&contents)?) + } else { + Ok(None) + } +} + +pub async fn cln_list_plugins( + plugin: Plugin, + logger: &mut RecklessLogger<'_>, +) -> Result, anyhow::Error> { + let mut rpc = plugin.state().rpc.lock().await; + let plugins = rpc + .call_typed(&PluginRequest { + directory: None, + plugin: None, + options: None, + subcommand: PluginSubcommand::LIST, + }) + .await?; + + let mut plugin_names = Vec::new(); + + for plugin in plugins + .plugins + .ok_or_else(|| anyhow!("empty plugin list response"))? + { + let Some(name) = Path::new(&plugin.name).file_name() else { + let line = format!("plugin entry path has no filename: {}", plugin.name); + logger.log(&line, LogLevel::UNUSUAL).await?; + continue; + }; + plugin_names.push(name.to_string_lossy().to_string()); + } + + Ok(plugin_names) +} + +pub async fn cln_start_plugin( + plugin: Plugin, + plugin_name: &str, + plugin_entry: &Path, + options: Vec<(String, Option)>, + logger: &mut RecklessLogger<'_>, +) -> Result<(), anyhow::Error> { + let options_str = options + .iter() + .map(|(k, v)| match v { + Some(v) => format!("{k}={v}"), + None => k.clone(), + }) + .collect::>() + .join(", "); + let line = if options.is_empty() { + format!("Starting {plugin_name}") + } else { + format!("Starting {plugin_name} with options: {options_str}") + }; + logger.log(&line, LogLevel::INFO).await?; + + // Can not pass options with cln-rpc because of + // + // so we use .call_raw + let mut obj = serde_json::Map::new(); + + obj.insert( + "subcommand".to_owned(), + serde_json::Value::String("start".to_owned()), + ); + obj.insert( + "plugin".to_owned(), + serde_json::Value::String( + plugin_entry + .to_str() + .ok_or_else(|| anyhow!("plugin path invalid: {}", plugin_entry.display()))? + .to_string(), + ), + ); + + let options_val = options + .iter() + .map(|(k, v)| Ok((k.clone(), serde_json::to_value(v)?))) + .collect::, serde_json::Error>>()?; + + obj.extend(options_val); + + let line = format!("{obj:#?}"); + logger.log(&line, LogLevel::TRACE).await?; + + let mut rpc = plugin.state().rpc.lock().await; + match rpc + // .call_typed(&PluginRequest { + // directory: None, + // plugin: Some( + // path.to_str() + // .ok_or_else(|| anyhow!("plugin path invalid: {}", path.display()))? + // .to_string(), + // ), + // options: Some(options), + // subcommand: PluginSubcommand::START, + // }) + .call_raw::("plugin", &serde_json::Value::Object(obj)) + .await + { + Ok(_) => { + let line = format!("{plugin_name} started"); + logger.log(&line, LogLevel::INFO).await?; + } + Err(e) => { + return Err(anyhow!("{plugin_name} failed to start: {}", e.message)); + } + } + + Ok(()) +} + +pub async fn cln_stop_plugin( + plugin: Plugin, + plugin_name: &str, + plugin_entry: &Path, + logger: &mut RecklessLogger<'_>, +) -> Result<(), anyhow::Error> { + let mut rpc = plugin.state().rpc.lock().await; + + match rpc + .call_typed(&PluginRequest { + directory: None, + plugin: Some( + plugin_entry + .to_str() + .ok_or_else(|| anyhow!("plugin path invalid: {}", plugin_entry.display()))? + .to_string(), + ), + options: None, + subcommand: PluginSubcommand::STOP, + }) + .await + { + Ok(_) => { + let line = format!("{plugin_name} stopped"); + logger.log(&line, LogLevel::INFO).await?; + } + Err(e) => { + let line = format!("{plugin_name} NOT stopped: {e}"); + logger.log(&line, LogLevel::UNUSUAL).await?; + } + } + + Ok(()) +} + +pub async fn search_sources( + plugin: &Plugin, + search_name: Option, + logger: &mut RecklessLogger<'_>, +) -> Result, anyhow::Error> { + let (sources, _source_file) = read_sources_file(plugin).await?; + let mut rl_plugins = HashMap::new(); + + let mut urls: Vec = Vec::new(); + let mut paths: Vec = Vec::new(); + + for source in sources { + match source { + PluginOrigin::Url(url) => urls.push(url), + PluginOrigin::LocalPath(path) => paths.push(path), + } + } + + for url_str in &urls { + let url = Url::from_str(url_str)?; + let repo_dir = init_plugin_repo(plugin, url.clone(), logger).await?; + rl_plugins.extend( + find_plugin_locs( + &plugin.state().reckless_dir, + url.as_str().to_owned(), + repo_dir, + 5, + logger, + ) + .await?, + ); + } + + for path in paths { + rl_plugins.extend( + find_plugin_locs( + &plugin.state().reckless_dir, + path.to_str().unwrap().to_owned(), + path, + 3, + logger, + ) + .await?, + ); + } + + let mut exact_matches = HashMap::new(); + + let mut found_match = false; + for (plugin_name, rl_plugin) in &rl_plugins { + if search_name + .as_ref() + .is_some_and(|search| plugin_name.contains(search)) + { + if !found_match { + let line = format!("Plugins matching '{}':", search_name.as_ref().unwrap()); + logger.log(&line, LogLevel::INFO).await?; + } + let line = format!(" {plugin_name} ({})", rl_plugin.origin()); + logger.log(&line, LogLevel::INFO).await?; + found_match = true; + } + } + + for (plugin_name, rl_plugin) in rl_plugins { + if search_name + .as_ref() + .is_none_or(|search| normalized_eq(&plugin_name, search)) + { + let line = format!("found {plugin_name} in source: {}", rl_plugin.origin()); + logger.log(&line, LogLevel::INFO).await?; + + exact_matches.insert(plugin_name, rl_plugin); + found_match = true; + } + } + + if !found_match { + let line = "Search exhausted all sources"; + logger.log(line, LogLevel::INFO).await?; + } + + Ok(exact_matches) +} + +pub async fn add_plugin_to_config( + plugin: Plugin, + path: PathBuf, + options: Vec<(String, Option)>, + manifest: GetManifestResponse, +) -> Result<(), anyhow::Error> { + include_reckless_config(plugin.clone()).await?; + + let plugin_line = format!("plugin={}", path.display()); + + let mut option_lines: Vec<(String, String)> = options + .iter() + .map(|(name, value)| { + let value_str = match value { + Some(v) => match v { + options::Value::String(s) => s.clone(), + options::Value::Integer(i) => i.to_string(), + options::Value::Boolean(b) => b.to_string(), + _ => panic!("Unsupported value type"), + }, + None => name.clone(), + }; + let line = format!("{name}={value_str}"); + Ok((name.clone(), line)) + }) + .collect::>()?; + + let mut remove_options: HashSet<_> = manifest + .options + .into_iter() + .map(|o| o.name) + .filter(|name| !option_lines.iter().any(|(n, _)| n == name)) + .collect(); + + let mut old_options: Vec<(String, Option)> = Vec::new(); + + let mut plugin_enabled = false; + + for config in plugin.state().get_cln_configs() { + plugin_enabled |= update_config_file( + config, + &plugin_line, + false, + &mut option_lines, + &mut remove_options, + &mut old_options, + ) + .await?; + } + + if !plugin.state().reckless_conf.exists() { + fs::write(&plugin.state().reckless_conf, RECKLESS_CONFIG_HEADER).await?; + } + + plugin_enabled |= update_config_file( + &plugin.state().reckless_conf, + &plugin_line, + false, + &mut option_lines, + &mut remove_options, + &mut old_options, + ) + .await?; + + let mut file = OpenOptions::new() + .append(true) + .open(&plugin.state().reckless_conf) + .await?; + + if !plugin_enabled { + file.write_all(format!("{plugin_line}\n").as_bytes()) + .await?; + } + + for (_name, line) in option_lines { + file.write_all(format!("{line}\n").as_bytes()).await?; + } + + Ok(()) +} + +pub async fn remove_plugin_from_config( + plugin: Plugin, + plugin_entry: PathBuf, + manifest: GetManifestResponse, +) -> Result)>, anyhow::Error> { + include_reckless_config(plugin.clone()).await?; + + let plugin_line = format!("plugin={}", plugin_entry.display()); + + let mut option_lines: Vec<(String, String)> = Vec::new(); + + let mut remove_options: HashSet<_> = manifest.options.into_iter().map(|o| o.name).collect(); + + let mut old_options: Vec<(String, Option)> = Vec::new(); + + for config in &plugin.state().get_cln_configs() { + update_config_file( + config, + &plugin_line, + true, + &mut option_lines, + &mut remove_options, + &mut old_options, + ) + .await?; + } + + if !plugin.state().reckless_conf.exists() { + fs::write(&plugin.state().reckless_conf, RECKLESS_CONFIG_HEADER).await?; + } + + update_config_file( + &plugin.state().reckless_conf, + &plugin_line, + true, + &mut option_lines, + &mut remove_options, + &mut old_options, + ) + .await?; + + Ok(old_options) +} + +async fn include_reckless_config(plugin: Plugin) -> Result<(), anyhow::Error> { + let rl_conf_path_str = plugin + .state() + .reckless_conf + .to_str() + .ok_or_else(|| anyhow!("path to reckless config contains invalid utf-8"))?; + + if !plugin.state().cln_conf.exists() { + fs::write( + &plugin.state().cln_conf, + format!("# This config was autopopulated by reckless\n\ninclude {rl_conf_path_str}\n"), + ) + .await?; + return Ok(()); + } + + let contents = fs::read_to_string(&plugin.state().cln_conf).await?; + let lines = contents.lines().collect::>(); + + let include_line = format!("include {rl_conf_path_str}"); + + for line in lines { + if line.trim() == include_line { + return Ok(()); + } + } + + let mut file_handle = OpenOptions::new() + .append(true) + .open(&plugin.state().cln_conf) + .await?; + + file_handle + .write_all(format!("\ninclude {rl_conf_path_str}\n").as_bytes()) + .await?; + + Ok(()) +} diff --git a/plugins/recklessrpc.c b/plugins/recklessrpc.c deleted file mode 100644 index 5d3ebb5b2525..000000000000 --- a/plugins/recklessrpc.c +++ /dev/null @@ -1,334 +0,0 @@ -/* This plugin provides RPC access to the reckless standalone utility. - */ - -#include "config.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static struct plugin *plugin; - -struct reckless { - struct command *cmd; - int stdinfd; - int stdoutfd; - int stderrfd; - char *stdoutbuf; - char *stderrbuf; - size_t stdout_read; /* running total */ - size_t stdout_new; /* new since last read */ - size_t stderr_read; - size_t stderr_new; - pid_t pid; - char *process_failed; -}; - -struct lconfig { - char *lightningdir; - char *config; - char *network; -} lconfig; - -static struct io_plan *reckless_in_init(struct io_conn *conn, - struct reckless *reckless) -{ - return io_write(conn, "Y", 1, io_close_cb, NULL); -} - -static void reckless_send_yes(struct reckless *reckless) -{ - io_new_conn(reckless, reckless->stdinfd, reckless_in_init, reckless); -} - -static struct io_plan *read_more(struct io_conn *conn, struct reckless *rkls) -{ - rkls->stdout_read += rkls->stdout_new; - if (rkls->stdout_read == tal_count(rkls->stdoutbuf)) - tal_resize(&rkls->stdoutbuf, rkls->stdout_read * 2); - return io_read_partial(conn, rkls->stdoutbuf + rkls->stdout_read, - tal_count(rkls->stdoutbuf) - rkls->stdout_read, - &rkls->stdout_new, read_more, rkls); -} - -static struct command_result *reckless_result(struct io_conn *conn, - struct reckless *reckless) -{ - struct json_stream *response; - if (reckless->process_failed) { - response = jsonrpc_stream_fail(reckless->cmd, - PLUGIN_ERROR, - reckless->process_failed); - return command_finished(reckless->cmd, response); - } - const jsmntok_t *results, *result, *logs, *log; - size_t i; - jsmn_parser parser; - jsmntok_t *toks; - toks = tal_arr(reckless, jsmntok_t, 5000); - jsmn_init(&parser); - int res; - res = jsmn_parse(&parser, reckless->stdoutbuf, - strlen(reckless->stdoutbuf), toks, tal_count(toks)); - const char *err; - if (res == JSMN_ERROR_INVAL) - err = tal_fmt(tmpctx, "reckless returned invalid character in json " - "output"); - else if (res == JSMN_ERROR_PART) - err = tal_fmt(tmpctx, "reckless returned partial output"); - else if (res == JSMN_ERROR_NOMEM ) - err = tal_fmt(tmpctx, "insufficient tokens to parse " - "reckless output."); - else - err = NULL; - - if (err) { - plugin_log(plugin, LOG_UNUSUAL, "failed to parse json: %s", err); - response = jsonrpc_stream_fail(reckless->cmd, PLUGIN_ERROR, - err); - return command_finished(reckless->cmd, response); - } - - response = jsonrpc_stream_success(reckless->cmd); - json_array_start(response, "result"); - results = json_get_member(reckless->stdoutbuf, toks, "result"); - json_for_each_arr(i, result, results) { - json_add_string(response, - NULL, - json_strdup(reckless, reckless->stdoutbuf, - result)); - } - json_array_end(response); - json_array_start(response, "log"); - logs = json_get_member(reckless->stdoutbuf, toks, "log"); - json_for_each_arr(i, log, logs) { - json_add_string(response, - NULL, - json_strdup(reckless, reckless->stdoutbuf, - log)); - } - json_array_end(response); - - return command_finished(reckless->cmd, response); -} - -static struct command_result *reckless_fail(struct reckless *reckless, - char *err) -{ - struct json_stream *resp; - resp = jsonrpc_stream_fail(reckless->cmd, PLUGIN_ERROR, err); - return command_finished(reckless->cmd, resp); -} - -static void reckless_conn_finish(struct io_conn *conn, - struct reckless *reckless) -{ - /* FIXME: avoid EBADFD - leave stdin fd open? */ - if (errno && errno != 9) - plugin_log(plugin, LOG_DBG, "err: %s", strerror(errno)); - if (reckless->pid > 0) { - int status = 0; - pid_t p; - p = waitpid(reckless->pid, &status, WNOHANG); - /* Did the reckless process exit? */ - if (p != reckless->pid && reckless->pid) { - plugin_log(plugin, LOG_DBG, "reckless failed to exit, " - "killing now."); - kill(reckless->pid, SIGKILL); - reckless_fail(reckless, "reckless process hung"); - /* Reckless process exited and with normal status? */ - } else if (WIFEXITED(status) && !WEXITSTATUS(status)) { - plugin_log(plugin, LOG_DBG, - "Reckless subprocess complete: %s", - reckless->stdoutbuf); - reckless_result(conn, reckless); - /* Don't try to process json if python raised an error. */ - } else { - plugin_log(plugin, LOG_DBG, - "Reckless process has crashed (%i).", - WEXITSTATUS(status)); - char * err; - if (reckless->process_failed) - err = reckless->process_failed; - else - err = tal_strdup(tmpctx, "the reckless process " - "has crashed"); - reckless_fail(reckless, err); - plugin_log(plugin, LOG_UNUSUAL, - "The reckless subprocess has failed."); - } - } - io_close(conn); - tal_free(reckless); -} - -static struct io_plan *conn_init(struct io_conn *conn, struct reckless *rkls) -{ - io_set_finish(conn, reckless_conn_finish, rkls); - return read_more(conn, rkls); -} - -static void stderr_conn_finish(struct io_conn *conn, void *reckless UNUSED) -{ - io_close(conn); -} - -static struct io_plan *stderr_read_more(struct io_conn *conn, - struct reckless *rkls) -{ - rkls->stderr_read += rkls->stderr_new; - if (rkls->stderr_read == tal_count(rkls->stderrbuf)) - tal_resize(&rkls->stderrbuf, rkls->stderr_read * 2); - if (strends(rkls->stderrbuf, "[Y] to create one now.\n")) { - plugin_log(plugin, LOG_DBG, "confirming config creation"); - reckless_send_yes(rkls); - } - /* Old version of reckless installed? */ - if (strstr(rkls->stderrbuf, "error: unrecognized arguments: --json")) { - plugin_log(plugin, LOG_DBG, "Reckless call failed due to old " - "installed version."); - rkls->process_failed = tal_strdup(plugin, "The installed " - "reckless utility is out of " - "date. Please update to use " - "the RPC plugin."); - } - return io_read_partial(conn, rkls->stderrbuf + rkls->stderr_read, - tal_count(rkls->stderrbuf) - rkls->stderr_read, - &rkls->stderr_new, stderr_read_more, rkls); -} - -static struct io_plan *stderr_conn_init(struct io_conn *conn, - struct reckless *reckless) -{ - io_set_finish(conn, stderr_conn_finish, NULL); - return stderr_read_more(conn, reckless); -} - -static struct command_result *reckless_call(struct command *cmd, - const char *subcommand, - const char *target, - const char *target2) -{ - if (!subcommand || !target) - return command_fail(cmd, PLUGIN_ERROR, "invalid reckless call"); - char **my_call; - my_call = tal_arrz(tmpctx, char *, 0); - tal_arr_expand(&my_call, "reckless"); - tal_arr_expand(&my_call, "-v"); - tal_arr_expand(&my_call, "--json"); - tal_arr_expand(&my_call, "-l"); - tal_arr_expand(&my_call, lconfig.lightningdir); - tal_arr_expand(&my_call, "--network"); - tal_arr_expand(&my_call, lconfig.network); - if (lconfig.config) { - tal_arr_expand(&my_call, "--conf"); - tal_arr_expand(&my_call, lconfig.config); - } - tal_arr_expand(&my_call, (char *) subcommand); - tal_arr_expand(&my_call, (char *) target); - if (target2) - tal_arr_expand(&my_call, (char *) target2); - tal_arr_expand(&my_call, NULL); - struct reckless *reckless; - reckless = tal(NULL, struct reckless); - reckless->cmd = cmd; - reckless->stdoutbuf = tal_arrz(reckless, char, 4096); - reckless->stderrbuf = tal_arrz(reckless, char, 4096); - reckless->stdout_read = 0; - reckless->stdout_new = 0; - reckless->stderr_read = 0; - reckless->stderr_new = 0; - reckless->process_failed = NULL; - char * full_cmd; - full_cmd = tal_fmt(tmpctx, "calling:"); - for (int i=0; ipid = pipecmdarr(&reckless->stdinfd, &reckless->stdoutfd, - &reckless->stderrfd, my_call); - - if (reckless->pid < 0) { - return command_fail(cmd, LIGHTNINGD, "reckless failed: %s", - strerror(errno)); - } - - io_new_conn(reckless, reckless->stdoutfd, conn_init, reckless); - io_new_conn(reckless, reckless->stderrfd, stderr_conn_init, reckless); - tal_free(my_call); - return command_still_pending(cmd); -} - -static struct command_result *json_reckless(struct command *cmd, - const char *buf, - const jsmntok_t *params) -{ - const char *command; - const char *target; - const char *target2; - /* Allow check command to evaluate. */ - if (!param(cmd, buf, params, - p_req("command", param_string, &command), - p_req("target/subcommand", param_string, &target), - p_opt("target", param_string, &target2), - NULL)) - return command_param_failed(); - return reckless_call(cmd, command, target, target2); -} - -static const char *init(struct command *init_cmd, - const char *buf UNUSED, - const jsmntok_t *config UNUSED) -{ - plugin = init_cmd->plugin; - rpc_scan(init_cmd, "listconfigs", - take(json_out_obj(NULL, NULL, NULL)), - "{configs:{" - "conf?:{value_str:%}," - "lightning-dir:{value_str:%}," - "network:{value_str:%}" - "}}", - JSON_SCAN_TAL(plugin, json_strdup, &lconfig.config), - JSON_SCAN_TAL(plugin, json_strdup, &lconfig.lightningdir), - JSON_SCAN_TAL(plugin, json_strdup, &lconfig.network)); - /* These lightning config parameters need to stick around for each - * reckless call. */ - if (lconfig.config) - notleak(lconfig.config); - notleak(lconfig.lightningdir); - notleak(lconfig.network); - plugin_log(plugin, LOG_DBG, "plugin initialized!"); - plugin_log(plugin, LOG_DBG, "lightning-dir: %s", lconfig.lightningdir); - return NULL; -} - -static const struct plugin_command commands[] = { - { - "reckless", - json_reckless, - }, -}; - -int main(int argc, char **argv) -{ - setup_locale(); - - plugin_main(argv, init, NULL, PLUGIN_RESTARTABLE, true, - NULL, - commands, ARRAY_SIZE(commands), - NULL, 0, /* Notifications */ - NULL, 0, /* Hooks */ - NULL, 0, /* Notification topics */ - NULL); /* plugin options */ - - return 0; -} - diff --git a/plugins/src/options.rs b/plugins/src/options.rs index cfe8d12f39e5..6c78db44727a 100644 --- a/plugins/src/options.rs +++ b/plugins/src/options.rs @@ -132,8 +132,7 @@ //! Ok(()) //! } //! ``` -use serde::Serialize; -use serde::ser::{SerializeSeq, Serializer}; +use serde::{Deserialize, Serialize}; pub mod config_type { #[derive(Clone, Debug)] @@ -435,7 +434,7 @@ impl<'a> OptionType<'a> for config_type::Boolean { } } -#[derive(Clone, Debug, Serialize)] +#[derive(Clone, Debug, Serialize, Deserialize)] pub enum ValueType { #[serde(rename = "string")] String, @@ -447,7 +446,8 @@ pub enum ValueType { Flag, } -#[derive(Clone, Debug)] +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(untagged)] pub enum Value { String(String), Integer(i64), @@ -456,33 +456,6 @@ pub enum Value { IntegerArray(Vec), } -impl Serialize for Value { - fn serialize(&self, serializer: S) -> std::prelude::v1::Result - where - S: Serializer, - { - match self { - Value::String(s) => serializer.serialize_str(s), - Value::Integer(i) => serializer.serialize_i64(*i), - Value::Boolean(b) => serializer.serialize_bool(*b), - Value::StringArray(sa) => { - let mut seq = serializer.serialize_seq(Some(sa.len()))?; - for element in sa { - seq.serialize_element(element)?; - } - seq.end() - } - Value::IntegerArray(sa) => { - let mut seq = serializer.serialize_seq(Some(sa.len()))?; - for element in sa { - seq.serialize_element(element)?; - } - seq.end() - } - } - } -} - impl Value { /// Returns true if the `Value` is a String. Returns false otherwise. /// diff --git a/tests/data/recklessrepo/lightningd/testpluginvaliddeps/requirements.txt b/tests/data/recklessrepo/lightningd/testpluginvaliddeps/requirements.txt new file mode 100644 index 000000000000..9b0af6de3e96 --- /dev/null +++ b/tests/data/recklessrepo/lightningd/testpluginvaliddeps/requirements.txt @@ -0,0 +1 @@ +sofijowesifjwoiefjow diff --git a/tests/data/recklessrepo/lightningd/testpluginvaliddeps/testpluginvaliddeps.py b/tests/data/recklessrepo/lightningd/testpluginvaliddeps/testpluginvaliddeps.py new file mode 100644 index 000000000000..19ea984d11fe --- /dev/null +++ b/tests/data/recklessrepo/lightningd/testpluginvaliddeps/testpluginvaliddeps.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +from pyln.client import Plugin +import sofijowesifjwoiefjow # noqa: F401 + +plugin = Plugin() + +__version__ = "v1" + + +@plugin.init() +def init(options, configuration, plugin, **kwargs): + plugin.log("testplug initialized") + + +@plugin.method("testmethod") +def testmethod(plugin): + return "I live." + + +@plugin.method("gettestplugversion") +def gettestplugversion(plugin): + "to test commit/tag checkout" + return __version__ + + +plugin.run() diff --git a/tests/data/recklessrepo/lightningd/testplugmani/manifest.json b/tests/data/recklessrepo/lightningd/testplugmani/manifest.json new file mode 100644 index 000000000000..ca297a3fa27e --- /dev/null +++ b/tests/data/recklessrepo/lightningd/testplugmani/manifest.json @@ -0,0 +1,8 @@ +{ + "entrypoint": "run.py", + "install_cmd": [ + "uv venv --clear", + "uv pip install --python .venv -r reqs.txt" + ], + "offer": "" +} diff --git a/tests/data/recklessrepo/lightningd/testplugmani/reqs.txt b/tests/data/recklessrepo/lightningd/testplugmani/reqs.txt new file mode 100644 index 000000000000..7b19e677138d --- /dev/null +++ b/tests/data/recklessrepo/lightningd/testplugmani/reqs.txt @@ -0,0 +1,2 @@ +pyln-client + diff --git a/tests/data/recklessrepo/lightningd/testplugmani/run.py b/tests/data/recklessrepo/lightningd/testplugmani/run.py new file mode 100755 index 000000000000..41f41d4d1969 --- /dev/null +++ b/tests/data/recklessrepo/lightningd/testplugmani/run.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +import os +from pathlib import Path + +TARGET_SCRIPT = "testplugpass.py" + + +def get_venv_python(): + base = Path(__file__).resolve().parent + + if os.name == "nt": + return base / ".venv" / "Scripts" / "python.exe" + return base / ".venv" / "bin" / "python" + + +def main(): + base = Path(__file__).resolve().parent + venv_python = get_venv_python() + target = base / TARGET_SCRIPT + + if not venv_python.exists(): + raise SystemExit(f"Missing venv python: {venv_python}") + + if not target.exists(): + raise SystemExit(f"Missing target script: {target}") + + # Replace current process (clean execution) + os.execv(str(venv_python), [str(venv_python), str(target)]) + + +if __name__ == "__main__": + main() diff --git a/tests/data/recklessrepo/lightningd/testplugmani/testplugpass.py b/tests/data/recklessrepo/lightningd/testplugmani/testplugpass.py new file mode 100755 index 000000000000..435f979f23a0 --- /dev/null +++ b/tests/data/recklessrepo/lightningd/testplugmani/testplugpass.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +from pyln.client import Plugin + +plugin = Plugin() + +__version__ = 'v1' + + +@plugin.init() +def init(options, configuration, plugin, **kwargs): + plugin.log("testplug initialized") + + +@plugin.method("testmethod") +def testmethod(plugin): + return ("I live.") + + +@plugin.method("gettestplugversion") +def gettestplugversion(plugin): + "to test commit/tag checkout" + return __version__ + + +plugin.run() diff --git a/tests/data/recklessrepo/lightningd/testplugpyproj/poetry.lock b/tests/data/recklessrepo/lightningd/testplugpyproj/poetry.lock new file mode 100644 index 000000000000..56f93ea8f081 --- /dev/null +++ b/tests/data/recklessrepo/lightningd/testplugpyproj/poetry.lock @@ -0,0 +1,523 @@ +# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. + +[[package]] +name = "asn1crypto" +version = "1.5.1" +description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67"}, + {file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"}, +] + +[[package]] +name = "base58" +version = "2.1.1" +description = "Base58 and Base58Check implementation." +optional = false +python-versions = ">=3.5" +groups = ["main"] +files = [ + {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, + {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, +] + +[package.extras] +tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", "pytest-cov", "pytest-flake8"] + +[[package]] +name = "bitarray" +version = "3.8.1" +description = "efficient arrays of booleans -- C extension" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "bitarray-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30d42c34da2974a5e2e0b51c57ecf89892c1e83ed67e1084d1e27eefc27add91"}, + {file = "bitarray-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0793c51d3b1c7410bde1f7254fff71fabff1bc0cdeba1fa51319ac4e7931df3d"}, + {file = "bitarray-3.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133648c3405564e7fef9103f1768cb018de1b4976f3d8beff09cd4acea73bfe4"}, + {file = "bitarray-3.8.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4fd3399eaf6f1c77ea3132611efbc3d7a8c0eb899793387b3266be221dc75fd"}, + {file = "bitarray-3.8.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3b9790ae107fc8648155f120e80a58ef8e94424efefff5b355de84061de6a18b"}, + {file = "bitarray-3.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:af01133e78e5528ee282ceb1cf4bc54aecb937c2001913e751452ad7dffbbeb1"}, + {file = "bitarray-3.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2da2ca9495668ab77132a911f6bd530d2bfe686d10467584894efc3b66e9ffb5"}, + {file = "bitarray-3.8.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:72a0e87b2196120523fc6194ca6b580fcffa12d7daa4d57a16d7838e60f82d0e"}, + {file = "bitarray-3.8.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:defa3c12cb06b2fd2066a9e21bf00aab96465be84d9585c8c05195f080510506"}, + {file = "bitarray-3.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7eae9e763fbd32f19f2a66dfc2e37906f8422e0c4ad4a6c9dcf9d3246740812e"}, + {file = "bitarray-3.8.1-cp310-cp310-win32.whl", hash = "sha256:3b9358f6437a5fa0c765ffae5810c9830547baf4bcf469438b82845c3f33f998"}, + {file = "bitarray-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:6f92d12a46b2a67d56194bb5d226dabf586b386d1f1a5e25be5b745a3080dbba"}, + {file = "bitarray-3.8.1-cp310-cp310-win_arm64.whl", hash = "sha256:8e12d50d4d65c74bd877e15c276992263b878456a7cfcf72521e7205a553557f"}, + {file = "bitarray-3.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:660e11b9932f58f10151d0febd11f77d3b0d48d6fa4dd4686d8983f40187101e"}, + {file = "bitarray-3.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fb1df55f5700187c6db4b47dbdaf8a0653a111341ac7fccc596b397aa3399e65"}, + {file = "bitarray-3.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:838fd67b3d00c5a64181073282a2c0bf8f76465da4844d5e79d2dbbc64c987dc"}, + {file = "bitarray-3.8.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5743f532e408cfd716fa16776b5a6447b83ff2cf39021fb5f8d052aa0f331508"}, + {file = "bitarray-3.8.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0c8c66f5d8055cb84ad0ea14af57b3579cb0b6db589f2086f5e33f0922cf2354"}, + {file = "bitarray-3.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8c3fe25871f1758519a3ad8dcafb1bd95c5d1aaeb122e6492ac739ab11fa5907"}, + {file = "bitarray-3.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e9ff57452fcadfd1a379314234657b8f4e9967ae64480ddf7c2fd82139bc8cf8"}, + {file = "bitarray-3.8.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4e34f1cb6cdb036c5f4a839a2b74419f75fa36177a70c4bab2867f48973cbe44"}, + {file = "bitarray-3.8.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:698c37fca3761af69a09a1d39cc0492f7e8cb9e263af39a288dce8f3b8a9e2bc"}, + {file = "bitarray-3.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:81ede1f094f26eeaff62e029ff1bc4e84e9d568f20d4669f64dcf7c7b18a28fc"}, + {file = "bitarray-3.8.1-cp311-cp311-win32.whl", hash = "sha256:8a345b5dc8ab8cafdf338e08530d48fe3f73df27f4ff569be793c7a7e7bb6b6b"}, + {file = "bitarray-3.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:ddcd25a1f72b2b545fb27e17882046a6c161f3f24514b2e028c00c58ed73a2dd"}, + {file = "bitarray-3.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:dc2cab92c42991b711132bc52405680e075d1505d4356c4468bc6e9c93d49137"}, + {file = "bitarray-3.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4494c599effa16064f2b600f6eb28115182d6826847d795a55691339788d8a4d"}, + {file = "bitarray-3.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ff2ca039a161d49a8c713f5380def315c6f793df5fe348b94782b1dbee37a644"}, + {file = "bitarray-3.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df3ffa6ef88166bb36f5d1492e71e664868b9b8b6afd55821e0ac0cb96625441"}, + {file = "bitarray-3.8.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:478b9f0ea86f957624dd2b159066855716f78db94666e9b04babe85fc013e01b"}, + {file = "bitarray-3.8.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e127b2e7fc533728295196f9265d12834530f475bc6cd6f74619df415d04b8b1"}, + {file = "bitarray-3.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ef49462a615de062dcac8281944d0b036fe1e9c96a6c690bf6cf5e4b5488f0e"}, + {file = "bitarray-3.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4da256fc567a57ded2a4aa962fc9e9d430ab740e5c67be9e98a63ef4eb467f2f"}, + {file = "bitarray-3.8.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b46b7aec9272fd81c984e723e599957629a91204120b3e7f0933f138e0792fdf"}, + {file = "bitarray-3.8.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2dc07dab252c63c4f6600e200b26fa05207db6b650d41ae88ab0cec4d6c59459"}, + {file = "bitarray-3.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:29c8c10a49d6a9586f592116618b99c3dabcb24d881b7a649e0691ef87f314c4"}, + {file = "bitarray-3.8.1-cp312-cp312-win32.whl", hash = "sha256:67125404d12547443d74113862a80c10310cf875aff8dbfc5548fee1d9737123"}, + {file = "bitarray-3.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba0339d6aa80615a17f47fabc5700485e9469121d658458f95cdd2003288c28b"}, + {file = "bitarray-3.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:c0b367a00e8c88a714b2384c97dedcc85340547b3a54b6037a42fca5554d0576"}, + {file = "bitarray-3.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:55f4b105a1686eb486069a9e578d502d1998e890d8144012225de9e0450aeabd"}, + {file = "bitarray-3.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b3118ec012a799456f7fca6cc002c078590578b7640fbaab52d8ecb9a651f1c1"}, + {file = "bitarray-3.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2762db8049b230520358ac742cbc57bceaacebe34e5d25c096f2b4bc3887a3a8"}, + {file = "bitarray-3.8.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5b67b869f860eb19055e2560844d8c7d0935245938935bdb764b3e683e2014e2"}, + {file = "bitarray-3.8.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a661f3492462e7adf8a054fb7414a22fc8251f1e18b9d8cbcf008d2dc85f012"}, + {file = "bitarray-3.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:300e3026d17ae3328320ba78d3165bdb1c43d0dfdbc461a69ebbdc005d9ce0b3"}, + {file = "bitarray-3.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ad5a71c1ef4a2e404c2c888db09226c821d9d14eff8813e1da873572f5fbb89d"}, + {file = "bitarray-3.8.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:78cbda57a2808d994517b53571eaa2d9299359f63aa71cf4bc94210169aad8b1"}, + {file = "bitarray-3.8.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:89c7c125a0913d71ba9cc1fa8e14c7cfe1517b1c1f45416e1f9babcedd3b545d"}, + {file = "bitarray-3.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7875abfd90f2ae3aa22d50f3fa1c93bbae456458cc73d3179b838f07bed1fc10"}, + {file = "bitarray-3.8.1-cp313-cp313-win32.whl", hash = "sha256:21add0aa968496a2bd8341d85720d09808e22e0adc7dbefc1e0f8f67c4b83f36"}, + {file = "bitarray-3.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:40d1b57012bf9b4fefd25345aaa95aab3ca510cc693f33c2cb02a4b771d8e51a"}, + {file = "bitarray-3.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:72b32d8c471930c95d49640ec99f7694f9b040ca1342ff03ed69d3aea90f9339"}, + {file = "bitarray-3.8.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fe989bbed9d6f332c1e24d333936f3fa1375f380cd8028da0b985dcdefa6015a"}, + {file = "bitarray-3.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:75e33c9187da271d1dbeb2582ab2df2e441346492098f67559b09173ea4edde4"}, + {file = "bitarray-3.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd7e3158be382f8f140caccc0dc7742a7553ce4bf2978982abe3054d2cedd705"}, + {file = "bitarray-3.8.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9fa5620f7f352f9706924c0e2071a212be36421f09ee064b0fd7e1128289fcdb"}, + {file = "bitarray-3.8.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:190b20cbffc9cd7f308f7a57d406119c3af3ae197613325fd2d92d99c8882ad6"}, + {file = "bitarray-3.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec3d0a6c37a816ea6e3550697c60d90861c9b0f982a98a40b59ac1f7a360bfa9"}, + {file = "bitarray-3.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:746e25f17ba4203b5933773782cf2d30bca5cdb66a9ba5d48a53a6c795aedc57"}, + {file = "bitarray-3.8.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ab363a5baae965fb3438f2137583853ad9c77d7e45f2a62ba63e609a34d792ea"}, + {file = "bitarray-3.8.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5e30d8e399f38ae1ec86aa9be76d20ba15872dd0c41b4b46d1b78905857363b9"}, + {file = "bitarray-3.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0f099a4a77daf9bb99787070854894fe588c7d6988ea729f970ba2b3b82c7559"}, + {file = "bitarray-3.8.1-cp314-cp314-win32.whl", hash = "sha256:539880ddf9a8cc54c9e6126e7d072c991563f0c90ef73b3519a783d53df00352"}, + {file = "bitarray-3.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:c08cd5b19c570e1e9e094a6ce70d35bb39d12360e0763474ed9374229f174fcc"}, + {file = "bitarray-3.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:0da5f17bed67ffe1d72f79fbf98403513a6e51a4f9b8293c1ff8a64e121242be"}, + {file = "bitarray-3.8.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:154a19e1dcd430494fdad7d1a0fb36383baaa363e1cb9d5a7b744cd2418c44d2"}, + {file = "bitarray-3.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:814bb54db2a016026efc055a3527461e5eb551c0d91b32eeade003829ff84311"}, + {file = "bitarray-3.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac49519fcfeb4a7ecdf6b7d0ec6cac409e59f94c1bb54630db577a97893b6e38"}, + {file = "bitarray-3.8.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:329b994944993c45c3845047476ef4f231fe1a53972f18f8d005fd12fac163e1"}, + {file = "bitarray-3.8.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1d7b786a1ddd9b8dda17c445060a94a465cba2e113603ae7bdc5364efc1efd11"}, + {file = "bitarray-3.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd9b848c17ef034f2ae31b2a1bd9276710c2baf03509f1f3fa4dc4382b0a1b53"}, + {file = "bitarray-3.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0a33f8931ac91ebc23ce4decb99ed8fdddba2bafd2af3bb2781bcfd9878d4822"}, + {file = "bitarray-3.8.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07626f76a248fce5ebbb10fb0d4899d3c7f908ba21cb2fb4f5a7a9daf24c20cd"}, + {file = "bitarray-3.8.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:18f3a2c8908e63a66d3994808254397a5f989b1fb91087c33739f62bf1a1a064"}, + {file = "bitarray-3.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ced27af6aee28782260bfa5643797937e96a6489bca972202834017208cf74f5"}, + {file = "bitarray-3.8.1-cp314-cp314t-win32.whl", hash = "sha256:cf99e36c0f6ae5643ecef7ad7e1194aeb4a9798d9cff60b20ac041533fa6db0a"}, + {file = "bitarray-3.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:9befda0dbd27ed95fba1c26be4bf98a49ba166b3c91beb5fc04364c130ce950c"}, + {file = "bitarray-3.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:4b7d7d10a1c82050efbb9a83d7a43974f70cf8f021afb86463b42e4ac4e5a46b"}, + {file = "bitarray-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd6b5b6df14f98b2e7e474c1c7ea55fc32dcab038b3b34b76a591dec8ba50915"}, + {file = "bitarray-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:eb9fa02b9f5bbdb1d036a0c68999337793fa244528e0ce825e4b97cb7f7db99f"}, + {file = "bitarray-3.8.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6956ef0259a037f10da767741aca82925f6f9978bb6dceb5344e56ce0629ab07"}, + {file = "bitarray-3.8.1-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:78ab0d4166cf35c73054d1e04f224af1edc3cb4d75da8b6f74f4cff7c300f358"}, + {file = "bitarray-3.8.1-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:10c0caabff00ab0631d1e4fd25f56c7a5cf0f068426e5860d28dbbb972b509bf"}, + {file = "bitarray-3.8.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:430fe5150816445c8294a36ce2612360037342d750cea179efe5de38c66670a8"}, + {file = "bitarray-3.8.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c3387c314695f9790dce12fcf44357197ebf773651b6a4195f5e091cf500ae73"}, + {file = "bitarray-3.8.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a681bbf9f94027d66e15974cd207cec1a2993837b9c45acf5f6b22a67632b1c2"}, + {file = "bitarray-3.8.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4c7ce072191ba23a4a4876452ccd5f2a67b926e66a248d052d39e9969cd3ab47"}, + {file = "bitarray-3.8.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:03fe327549f177040b32f7faa736dc152be936d8b264d8b84f94c75f1379bfa1"}, + {file = "bitarray-3.8.1-cp38-cp38-win32.whl", hash = "sha256:2b9916867fa1ed815739e3e37dda458f397dee25a0e293b808839cfc2a396ca0"}, + {file = "bitarray-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:69c8298e8197b113f765a2ea60f49ceb8e1ea9eb308140b3cdc611e0d1de70b8"}, + {file = "bitarray-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac0145491619287ff893853bf3ca4d98d5ef94b617271184a5af68a06ac301a"}, + {file = "bitarray-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fd68db1a0f5d9374a7b735414efe48d2b3ecbf0adea39299bb48030988f16149"}, + {file = "bitarray-3.8.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9adacf6fdadeeb96e6c902aef08d02d2f45429fdbf0a75b80307e435156066f8"}, + {file = "bitarray-3.8.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d7d5f7f6f80388ce94849775da5f4082ab5e123e259972961970e190d60f5d2b"}, + {file = "bitarray-3.8.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3a5e594b4be2dbfe021cee8d6d7d96e9bb19dee7ed7be351f43bca7a0619b978"}, + {file = "bitarray-3.8.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:190a3482818d69faef176171c7cae10d55cb4dd0c686b5aced7f592b5e5591c1"}, + {file = "bitarray-3.8.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4fb869faf4b484cb213199ced1e2732091559107637d429fc25d0a9731f5f630"}, + {file = "bitarray-3.8.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:70f70ea138e69ec3159e4a38fef52443cb8eb81388aeb241b273265ea16387c5"}, + {file = "bitarray-3.8.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0256d57e294414bfe4fec4f852fd1d9ae361228c71b082332bf81c8b8fc69f80"}, + {file = "bitarray-3.8.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ef123b6aead12e0784f72970e8d94a96ac0d0aa4438c7ab9235e2f8669a0a5ae"}, + {file = "bitarray-3.8.1-cp39-cp39-win32.whl", hash = "sha256:c263ed9922942353a954cfbcd5f81b7626c0e20dc7f3e53d4926e8bc560ab845"}, + {file = "bitarray-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c133052737c7c75bfa49f5ba71918166fe988995b26a0d2f263a79bf8fed58a"}, + {file = "bitarray-3.8.1-cp39-cp39-win_arm64.whl", hash = "sha256:20e412527ec1aac7e3a6542b32a9c34bb852c954676b05008f0e3d58c390a0ac"}, + {file = "bitarray-3.8.1.tar.gz", hash = "sha256:f90bb3c680804ec9630bcf8c0965e54b4de84d33b17d7da57c87c30f0c64c6f5"}, +] + +[[package]] +name = "bitstring" +version = "4.4.0" +description = "Simple construction, analysis and modification of binary data." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "bitstring-4.4.0-py3-none-any.whl", hash = "sha256:feac49524fcf3ef27e6081e86f02b10d2adf6c3773bf22fbe0e7eea9534bc737"}, + {file = "bitstring-4.4.0.tar.gz", hash = "sha256:e682ac522bb63e041d16cbc9d0ca86a4f00194db16d0847c7efe066f836b2e37"}, +] + +[package.dependencies] +bitarray = ">=3.0.0,<4.0" +tibs = ">=0.5.6,<0.6" + +[[package]] +name = "cffi" +version = "2.0.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, + {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, + {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, + {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, + {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, + {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, + {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, + {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, + {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, + {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, + {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, + {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, + {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, + {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, + {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, + {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, + {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, + {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, + {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, + {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, + {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, +] + +[package.dependencies] +pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} + +[[package]] +name = "coincurve" +version = "20.0.0" +description = "Cross-platform Python CFFI bindings for libsecp256k1" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "coincurve-20.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d559b22828638390118cae9372a1bb6f6594f5584c311deb1de6a83163a0919b"}, + {file = "coincurve-20.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33d7f6ebd90fcc550f819f7f2cce2af525c342aac07f0ccda46ad8956ad9d99b"}, + {file = "coincurve-20.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22d70dd55d13fd427418eb41c20fde0a20a5e5f016e2b1bb94710701e759e7e0"}, + {file = "coincurve-20.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f18d481eaae72c169f334cde1fd22011a884e0c9c6adc3fdc1fd13df8236a3"}, + {file = "coincurve-20.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de1ec57f43c3526bc462be58fb97910dc1fdd5acab6c71eda9f9719a5bd7489"}, + {file = "coincurve-20.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a6f007c44c726b5c0b3724093c0d4fb8e294f6b6869beb02d7473b21777473a3"}, + {file = "coincurve-20.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0ff1f3b81330db5092c24da2102e4fcba5094f14945b3eb40746456ceabdd6d9"}, + {file = "coincurve-20.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82f7de97694d9343f26bd1c8e081b168e5f525894c12445548ce458af227f536"}, + {file = "coincurve-20.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e905b4b084b4f3b61e5a5d58ac2632fd1d07b7b13b4c6d778335a6ca1dafd7a3"}, + {file = "coincurve-20.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:3657bb5ed0baf1cf8cf356e7d44aa90a7902cc3dd4a435c6d4d0bed0553ad4f7"}, + {file = "coincurve-20.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44087d1126d43925bf9a2391ce5601bf30ce0dba4466c239172dc43226696018"}, + {file = "coincurve-20.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ccf0ba38b0f307a9b3ce28933f6c71dc12ef3a0985712ca09f48591afd597c8"}, + {file = "coincurve-20.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:566bc5986debdf8572b6be824fd4de03d533c49f3de778e29f69017ae3fe82d8"}, + {file = "coincurve-20.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4d70283168e146f025005c15406086513d5d35e89a60cf4326025930d45013a"}, + {file = "coincurve-20.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:763c6122dd7d5e7a81c86414ce360dbe9a2d4afa1ca6c853ee03d63820b3d0c5"}, + {file = "coincurve-20.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f00c361c356bcea386d47a191bb8ac60429f4b51c188966a201bfecaf306ff7f"}, + {file = "coincurve-20.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4af57bdadd2e64d117dd0b33cfefe76e90c7a6c496a7b034fc65fd01ec249b15"}, + {file = "coincurve-20.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a26437b7cbde13fb6e09261610b788ca2a0ca2195c62030afd1e1e0d1a62e035"}, + {file = "coincurve-20.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ed51f8bba35e6c7676ad65539c3dbc35acf014fc402101fa24f6b0a15a74ab9e"}, + {file = "coincurve-20.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:594b840fc25d74118407edbbbc754b815f1bba9759dbf4f67f1c2b78396df2d3"}, + {file = "coincurve-20.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4df4416a6c0370d777aa725a25b14b04e45aa228da1251c258ff91444643f688"}, + {file = "coincurve-20.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1ccc3e4db55abf3fc0e604a187fdb05f0702bc5952e503d9a75f4ae6eeb4cb3a"}, + {file = "coincurve-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac8335b1658a2ef5b3eb66d52647742fe8c6f413ad5b9d5310d7ea6d8060d40f"}, + {file = "coincurve-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7ac025e485a0229fd5394e0bf6b4a75f8a4f6cee0dcf6f0b01a2ef05c5210ff"}, + {file = "coincurve-20.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e46e3f1c21b3330857bcb1a3a5b942f645c8bce912a8a2b252216f34acfe4195"}, + {file = "coincurve-20.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:df9ff9b17a1d27271bf476cf3fa92df4c151663b11a55d8cea838b8f88d83624"}, + {file = "coincurve-20.0.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4155759f071375699282e03b3d95fb473ee05c022641c077533e0d906311e57a"}, + {file = "coincurve-20.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0530b9dd02fc6f6c2916716974b79bdab874227f560c422801ade290e3fc5013"}, + {file = "coincurve-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:eacf9c0ce8739c84549a89c083b1f3526c8780b84517ee75d6b43d276e55f8a0"}, + {file = "coincurve-20.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:52a67bfddbd6224dfa42085c88ad176559801b57d6a8bd30d92ee040de88b7b3"}, + {file = "coincurve-20.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61e951b1d695b62376f60519a84c4facaf756eeb9c5aff975bea0942833f185d"}, + {file = "coincurve-20.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e9e548db77f4ea34c0d748dddefc698adb0ee3fab23ed19f80fb2118dac70f6"}, + {file = "coincurve-20.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdbf0da0e0809366fdfff236b7eb6e663669c7b1f46361a4c4d05f5b7e94c57"}, + {file = "coincurve-20.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d72222b4ecd3952e8ffcbf59bc7e0d1b181161ba170b60e5c8e1f359a43bbe7e"}, + {file = "coincurve-20.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9add43c4807f0c17a940ce4076334c28f51d09c145cd478400e89dcfb83fb59d"}, + {file = "coincurve-20.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc94cceea6ec8863815134083e6221a034b1ecef822d0277cf6ad2e70009b7f"}, + {file = "coincurve-20.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ffbdfef6a6d147988eabaed681287a9a7e6ba45ecc0a8b94ba62ad0a7656d97"}, + {file = "coincurve-20.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:13335c19c7e5f36eaba2a53c68073d981980d7dc7abfee68d29f2da887ccd24e"}, + {file = "coincurve-20.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:7fbfb8d16cf2bea2cf48fc5246d4cb0a06607d73bb5c57c007c9aed7509f855e"}, + {file = "coincurve-20.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4870047704cddaae7f0266a549c927407c2ba0ec92d689e3d2b511736812a905"}, + {file = "coincurve-20.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81ce41263517b0a9f43cd570c87720b3c13324929584fa28d2e4095969b6015d"}, + {file = "coincurve-20.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:572083ccce6c7b514d482f25f394368f4ae888f478bd0b067519d33160ea2fcc"}, + {file = "coincurve-20.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee5bc78a31a2f1370baf28aaff3949bc48f940a12b0359d1cd2c4115742874e6"}, + {file = "coincurve-20.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2895d032e281c4e747947aae4bcfeef7c57eabfd9be22886c0ca4e1365c7c1f"}, + {file = "coincurve-20.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d3e2f21957ada0e1742edbde117bb41758fa8691b69c8d186c23e9e522ea71cd"}, + {file = "coincurve-20.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c2baa26b1aad1947ca07b3aa9e6a98940c5141c6bdd0f9b44d89e36da7282ffa"}, + {file = "coincurve-20.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7eacc7944ddf9e2b7448ecbe84753841ab9874b8c332a4f5cc3b2f184db9f4a2"}, + {file = "coincurve-20.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:c293c095dc690178b822cadaaeb81de3cc0d28f8bdf8216ed23551dcce153a26"}, + {file = "coincurve-20.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:11a47083a0b7092d3eb50929f74ffd947c4a5e7035796b81310ea85289088c7a"}, + {file = "coincurve-20.0.0.tar.gz", hash = "sha256:872419e404300302e938849b6b92a196fabdad651060b559dc310e52f8392829"}, +] + +[package.dependencies] +asn1crypto = "*" +cffi = ">=1.3.0" + +[package.extras] +dev = ["coverage", "pytest", "pytest-benchmark"] + +[[package]] +name = "cryptography" +version = "48.0.0" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = "!=3.9.0,!=3.9.1,>=3.9" +groups = ["main"] +files = [ + {file = "cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6"}, + {file = "cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c"}, + {file = "cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3"}, + {file = "cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5"}, + {file = "cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c"}, + {file = "cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f"}, + {file = "cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25"}, + {file = "cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602"}, + {file = "cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c"}, + {file = "cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5"}, + {file = "cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321"}, + {file = "cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74"}, + {file = "cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4"}, + {file = "cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7"}, + {file = "cryptography-48.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec"}, + {file = "cryptography-48.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18"}, + {file = "cryptography-48.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20"}, + {file = "cryptography-48.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff"}, + {file = "cryptography-48.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c"}, + {file = "cryptography-48.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db"}, + {file = "cryptography-48.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741"}, + {file = "cryptography-48.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166"}, + {file = "cryptography-48.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336"}, + {file = "cryptography-48.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057"}, + {file = "cryptography-48.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae"}, + {file = "cryptography-48.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c"}, + {file = "cryptography-48.0.0-cp314-cp314t-win32.whl", hash = "sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f"}, + {file = "cryptography-48.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12"}, + {file = "cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86"}, + {file = "cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e"}, + {file = "cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f"}, + {file = "cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7"}, + {file = "cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832"}, + {file = "cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c"}, + {file = "cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a"}, + {file = "cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a"}, + {file = "cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a"}, + {file = "cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239"}, + {file = "cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c"}, + {file = "cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4"}, + {file = "cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd"}, + {file = "cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8"}, + {file = "cryptography-48.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:84cf79f0dc8b36ac5da873481716e87aef31fcfa0444f9e1d8b4b2cece142855"}, + {file = "cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:fdfef35d751d510fcef5252703621574364fec16418c4a1e5e1055248401054b"}, + {file = "cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0890f502ddf7d9c6426129c3f49f5c0a39278ed7cd6322c8755ffca6ee675a13"}, + {file = "cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:ecde28a596bead48b0cfd2a1b4416c3d43074c2d785e3a398d7ec1fc4d0f7fbb"}, + {file = "cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:4defde8685ae324a9eb9d818717e93b4638ef67070ac9bc15b8ca85f63048355"}, + {file = "cryptography-48.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:db63bf618e5dea46c07de12e900fe1cdd2541e6dc9dbae772a70b7d4d4765f6a"}, + {file = "cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920"}, +] + +[package.dependencies] +cffi = {version = ">=2.0.0", markers = "platform_python_implementation != \"PyPy\""} +typing-extensions = {version = ">=4.13.2", markers = "python_full_version < \"3.11.0\""} + +[package.extras] +ssh = ["bcrypt (>=3.1.5)"] + +[[package]] +name = "pycparser" +version = "3.0" +description = "C parser in Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "implementation_name != \"PyPy\"" +files = [ + {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, + {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, +] + +[[package]] +name = "pyln-bolt7" +version = "1.0.246" +description = "BOLT7" +optional = false +python-versions = ">=3.7,<4.0" +groups = ["main"] +files = [ + {file = "pyln-bolt7-1.0.246.tar.gz", hash = "sha256:2b53744fa21c1b12d2c9c9df153651b122e38fa65d4a5c3f2957317ee148e089"}, + {file = "pyln_bolt7-1.0.246-py3-none-any.whl", hash = "sha256:54d48ec27fdc8751762cb068b0a9f2757a58fb57933c6d8f8255d02c27eb63c5"}, +] + +[[package]] +name = "pyln-client" +version = "23.11" +description = "Client library and plugin library for Core Lightning" +optional = false +python-versions = ">=3.8,<4.0" +groups = ["main"] +files = [ + {file = "pyln_client-23.11-py3-none-any.whl", hash = "sha256:98ff5a24232e7041970e7f1d631fd1e5044b3bb91c7cfae6f66d3894c82db2f0"}, + {file = "pyln_client-23.11.tar.gz", hash = "sha256:4102792bbdca545d5fbfa1fb1371222744e7157ec3d2c162edb03e8786db9823"}, +] + +[package.dependencies] +pyln-bolt7 = ">=1.0" +pyln-proto = ">=23" + +[[package]] +name = "pyln-proto" +version = "26.6.1" +description = "This package implements some of the Lightning Network protocol in pure python. It is intended for protocol testing and some minor tooling only. It is not deemed secure enough to handle any amount of real funds (you have been warned!)." +optional = false +python-versions = "<4.0,>=3.10" +groups = ["main"] +files = [ + {file = "pyln_proto-26.6.1-py3-none-any.whl", hash = "sha256:834ee3b7c68604cb2a95baef45e6fd470f4ede1d6d1c6172e761d5658a5517c9"}, + {file = "pyln_proto-26.6.1.tar.gz", hash = "sha256:b56b3577e5b6b3488cd232b6191116323758aa51835fe925853f0a69576d51b7"}, +] + +[package.dependencies] +base58 = ">=2.1.1" +bitstring = ">=4.3.0" +coincurve = "20.0.0" +cryptography = ">=46" +pysocks = ">=1" + +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, +] + +[[package]] +name = "tibs" +version = "0.5.7" +description = "A sleek Python library for binary data." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "tibs-0.5.7-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:01ea5258bdf942d21560dc07d532082cd04f07cfef65fedd58ae84f7d0d2562a"}, + {file = "tibs-0.5.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f5eea45851c960628a2bd29847765d55e19a687c5374456ad2c8cf6410eb1efa"}, + {file = "tibs-0.5.7-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a9feed5931b881809a950eca0e01e757113e2383a2af06a3e6982f110c869e2"}, + {file = "tibs-0.5.7-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:501728d096e10d9a165aa526743d47418a6bbfd7b084fa47ecb22be7641d3edb"}, + {file = "tibs-0.5.7-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77103a9f1af72ac4cf5006828d0fb21578d19ce55fd990e9a1c8e46fd549561f"}, + {file = "tibs-0.5.7-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f95d5db62960205a1e9eba73ce67dc14e7366ae080cd4e5b6f005ebd90faf02"}, + {file = "tibs-0.5.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace018a057459e3dccd06a4aae1c5c8cd57e352b263dcef534ae39bf3e03b5cf"}, + {file = "tibs-0.5.7-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a618de62004d9217d2d2ab0f7f9bbdd098c12642dc01f07b3fb00f0b5f3131a"}, + {file = "tibs-0.5.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42725200f1b02687ed6e6a1c01e0ec150dc829d21d901ffc74cc0ac4d821f57f"}, + {file = "tibs-0.5.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:63255749f937c5e6fedcc7d54e7bd359aef711017e6855f373b0510a14ee2215"}, + {file = "tibs-0.5.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4b7510235379368b7523f624d46e0680f3706e3a3965877a6583cdcb598b8bac"}, + {file = "tibs-0.5.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29480bf03e3372a5f9cc59ea0541f76f8efd696d4f0d214715e94247c342a037"}, + {file = "tibs-0.5.7-cp314-cp314t-win32.whl", hash = "sha256:b9535dc7b7484904a58b51bd8e64da7efbf1d8466ff7e84ed1d78f4ddc561c99"}, + {file = "tibs-0.5.7-cp314-cp314t-win_amd64.whl", hash = "sha256:1906729038b85c3b4c040aa28a456d85bc976d0c5007177350eb73374ffa0fd0"}, + {file = "tibs-0.5.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7d6592ed93c6748acd39df484c1ee24d40ee247c2a20ca38ba03363506fd24f3"}, + {file = "tibs-0.5.7-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:859f05315ffb307d3474c505d694f3a547f00730a024c982f5f60316a5505b3c"}, + {file = "tibs-0.5.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:a883ca13a922a66b2c1326a9c188123a574741a72510a4bf52fd6f97db191e44"}, + {file = "tibs-0.5.7-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f70bd250769381c73110d6f24feaf8b6fcd44f680b3cb28a20ea06db3d04fb6f"}, + {file = "tibs-0.5.7-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76746f01b3db9dbd802f5e615f11f68df7a29ecef521b082dca53f3fa7d0084f"}, + {file = "tibs-0.5.7-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:847709c108800ad6a45efaf9a040628278956938a4897f7427a2587013dc3b98"}, + {file = "tibs-0.5.7-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad61df93b50f875b277ab736c5d37b6bce56f9abce489a22f4e02d9daa2966e3"}, + {file = "tibs-0.5.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e13b9c7ff2604b0146772025e1ac6f85c8c625bf6ac73736ff671eaf357dda41"}, + {file = "tibs-0.5.7-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a7ce857ef05c59dc61abadc31c4b9b1e3c62f9e5fb29217988c308936aea71e"}, + {file = "tibs-0.5.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1d5521cc6768bfa6282a0c591ba06b079ab91b5c7d5696925ad2abac59779a54"}, + {file = "tibs-0.5.7-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:477608f9b87e24a22ab6d50b81da04a5cb59bfa49598ff7ec5165035a18fb392"}, + {file = "tibs-0.5.7-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:ac0aa2aae38f7325c91c261ce1d18f769c4c7033c98d6ea3ea5534585cf16452"}, + {file = "tibs-0.5.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b56583db148e5094d781c3d746815dbcbb6378c6f813c8ce291efd4ab21da8b"}, + {file = "tibs-0.5.7-cp38-abi3-win32.whl", hash = "sha256:d4f3ff613d486650816bc5516760c0382a2cc0ca8aeddd8914d011bc3b81d9a2"}, + {file = "tibs-0.5.7-cp38-abi3-win_amd64.whl", hash = "sha256:a61d36155f8ab8642e1b6744e13822f72050fc7ec4f86ec6965295afa04949e2"}, + {file = "tibs-0.5.7-cp38-abi3-win_arm64.whl", hash = "sha256:130bc68ff500fc8185677df7a97350b5d5339e6ba7e325bc3031337f6424ede7"}, + {file = "tibs-0.5.7.tar.gz", hash = "sha256:173dfbecb2309edd9771f453580c88cf251e775613461566b23dbd756b3d54cb"}, +] + +[package.extras] +dev = ["build", "hypothesis (>=6.151.0)", "pyright (>=1.1.389)", "pytest (>=9.0.0)", "pytest-benchmark (>=5.2.0)"] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version == \"3.10\"" +files = [ + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, +] + +[metadata] +lock-version = "2.1" +python-versions = "^3.10" +content-hash = "b48950ea4d9650c3a44225fb9c3a1678fcb8e2e8fb1a2a4f3319483634a36cbc" diff --git a/tests/data/recklessrepo/lightningd/testplugreqopts/requirements.txt b/tests/data/recklessrepo/lightningd/testplugreqopts/requirements.txt new file mode 100644 index 000000000000..0096004b4a8d --- /dev/null +++ b/tests/data/recklessrepo/lightningd/testplugreqopts/requirements.txt @@ -0,0 +1 @@ +pyln-client diff --git a/tests/data/recklessrepo/lightningd/testplugreqopts/testplugreqopts.py b/tests/data/recklessrepo/lightningd/testplugreqopts/testplugreqopts.py new file mode 100644 index 000000000000..959a7e70f9fc --- /dev/null +++ b/tests/data/recklessrepo/lightningd/testplugreqopts/testplugreqopts.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +"""Plugin that requires a mandatory option. Exits immediately when the +option is absent - as happens when reckless runs the plugin standalone +outside of a CLN connection.""" + +import sys + +from pyln.client import Plugin + +plugin = Plugin() + + +@plugin.init() +def init(options, configuration, plugin, **kwargs): + if "required-opt" not in options: + plugin.log("required option 'required-opt' is not configured") + sys.exit(1) + plugin.log("testplugreqopts initialized") + + +plugin.add_option("required-opt", None, "required option") +plugin.run() diff --git a/tests/data/recklessrepo/rkls_api_lightningd_plugins.json b/tests/data/recklessrepo/rkls_api_lightningd_plugins.json deleted file mode 100644 index a91c4844d898..000000000000 --- a/tests/data/recklessrepo/rkls_api_lightningd_plugins.json +++ /dev/null @@ -1,38 +0,0 @@ -[ - { - "name": "testplugpass", - "path": "testplugpass", - "url": "https://api.github.com/repos/lightningd/plugins/contents/webhook?ref=master", - "html_url": "https://github.com/lightningd/plugins/tree/master/testplugpass", - "git_url": "https://api.github.com/repos/lightningd/plugins/git/trees/testplugpass", - "download_url": null, - "type": "dir" - }, - { - "name": "testpluguv", - "path": "testpluguv", - "url": "https://api.github.com/repos/lightningd/plugins/contents/webhook?ref=master", - "html_url": "https://github.com/lightningd/plugins/tree/master/testpluguv", - "git_url": "https://api.github.com/repos/lightningd/plugins/git/trees/testpluguv", - "download_url": null, - "type": "dir" - }, - { - "name": "testplugfail", - "path": "testplugfail", - "url": "https://api.github.com/repos/lightningd/plugins/contents/testplugfail?ref=master", - "html_url": "https://github.com/lightningd/plugins/tree/master/testplugfail", - "git_url": "https://api.github.com/repos/lightningd/plugins/git/trees/testplugfail", - "download_url": null, - "type": "dir" - }, - { - "name": "testplugpyproj", - "path": "testplugpyproj", - "url": "https://api.github.com/repos/lightningd/plugins/contents/webhook?ref=master", - "html_url": "https://github.com/lightningd/plugins/tree/master/testplugpyproj", - "git_url": "https://api.github.com/repos/lightningd/plugins/git/trees/testplugpyproj", - "download_url": null, - "type": "dir" - } -] diff --git a/tests/rkls_github_canned_server.py b/tests/rkls_github_canned_server.py deleted file mode 100644 index a01366f9a8cb..000000000000 --- a/tests/rkls_github_canned_server.py +++ /dev/null @@ -1,43 +0,0 @@ -import flask -import json -import os -from markupsafe import escape - - -def create_app(test_config=None): - app = flask.Flask(__name__) - - @app.route("/api/repos///contents/") - def github_plugins_repo_api(github_user, github_repo): - '''This emulates api.github.com calls to lightningd/plugins''' - user = escape(github_user) - repo = escape(github_repo) - canned_api = os.environ.get('REDIR_GITHUB') + f'/rkls_api_{user}_{repo}.json' - with open(canned_api, 'rb') as f: - canned_data = f.read(-1) - print(f'serving canned api data from {canned_api}') - resp = flask.Response(response=canned_data, - headers={'Content-Type': 'application/json; charset=utf-8'}) - return resp - - @app.route("/api/repos///git/trees/") - def github_plugin_tree_api(github_user, github_repo, plugin_name): - dir_json = \ - { - "url": f"https://api.github.com/repos/{github_user}/{github_repo}/git/trees/{plugin_name}", - "tree": [] - } - # FIXME: Pull contents from directory - for file in os.listdir(f'tests/data/recklessrepo/{github_user}/{plugin_name}'): - dir_json["tree"].append({"path": file}) - resp = flask.Response(response=json.dumps(dir_json), - headers={'Content-Type': 'application/json; charset=utf-8'}) - return resp - - return app - - -if __name__ == '__main__': - app = create_app() - with app.app_context(): - app.run(debug=True) diff --git a/tests/test_reckless.py b/tests/test_reckless.py index c7c7f426bccc..28362c371814 100644 --- a/tests/test_reckless.py +++ b/tests/test_reckless.py @@ -1,110 +1,90 @@ +import json + +from pyln.client.lightning import RpcError + from fixtures import * # noqa: F401,F403 import subprocess -from pathlib import PosixPath, Path -import socket -from pyln.testing.utils import TIMEOUT, VALGRIND -import pytest +from pathlib import Path +from pyln.testing.utils import VALGRIND import os import re -import shutil import time import unittest +import pytest @pytest.fixture(autouse=True) def canned_github_server(directory): global NETWORK - NETWORK = os.environ.get('TEST_NETWORK') + NETWORK = os.environ.get("TEST_NETWORK") if NETWORK is None: - NETWORK = 'regtest' + NETWORK = "regtest" FILE_PATH = Path(os.path.dirname(os.path.realpath(__file__))) - if os.environ.get('LIGHTNING_CLI') is None: - os.environ['LIGHTNING_CLI'] = str(FILE_PATH.parent / 'cli/lightning-cli') - print('LIGHTNING_CALL: ', os.environ.get('LIGHTNING_CLI')) - # Use socket to provision a random free port - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.bind(('localhost', 0)) - free_port = str(sock.getsockname()[1]) - sock.close() + if os.environ.get("LIGHTNING_CLI") is None: + os.environ["LIGHTNING_CLI"] = str(FILE_PATH.parent / "cli/lightning-cli") + print("LIGHTNING_CALL: ", os.environ.get("LIGHTNING_CLI")) global my_env my_env = os.environ.copy() - # This tells reckless to redirect to the canned server rather than github. - my_env['REDIR_GITHUB_API'] = f'http://127.0.0.1:{free_port}/api' - my_env['REDIR_GITHUB'] = directory - my_env['FLASK_RUN_PORT'] = free_port - my_env['FLASK_APP'] = str(FILE_PATH / 'rkls_github_canned_server') - server = subprocess.Popen(["python3", "-m", "flask", "run"], - env=my_env) + os.environ["REDIR_GITHUB"] = os.path.join(directory, "lightningd") # Generate test plugin repository to test reckless against. repo_dir = os.path.join(directory, "lightningd") os.mkdir(repo_dir, 0o777) - plugins_path = str(FILE_PATH / 'data/recklessrepo/lightningd') + plugins_path = str(FILE_PATH / "data/recklessrepo/lightningd") # Create requirements.txt file for the testpluginpass # with pyln-client installed from the local source - requirements_file_path = os.path.join(plugins_path, 'testplugpass', 'requirements.txt') - with open(requirements_file_path, 'w') as f: - pyln_client_path = os.path.abspath(os.path.join(FILE_PATH, '..', 'contrib', 'pyln-client')) + requirements_file_path = os.path.join( + plugins_path, "testplugpass", "requirements.txt" + ) + with open(requirements_file_path, "w") as f: + pyln_client_path = os.path.abspath( + os.path.join(FILE_PATH, "..", "contrib", "pyln-client") + ) f.write(f"pyln-client @ file://{pyln_client_path}\n") # This lets us temporarily set .gitconfig user info in order to commit - my_env['HOME'] = directory - with open(os.path.join(directory, '.gitconfig'), 'w') as conf: - conf.write(("[user]\n" - "\temail = reckless@example.com\n" - "\tname = reckless CI\n" - "\t[init]\n" - "\tdefaultBranch = master")) - - with open(os.path.join(directory, '.gitconfig'), 'r') as conf: + my_env["HOME"] = directory + with open(os.path.join(directory, ".gitconfig"), "w") as conf: + conf.write( + ( + "[user]\n" + "\temail = reckless@example.com\n" + "\tname = reckless CI\n" + "\t[init]\n" + "\tdefaultBranch = master" + ) + ) + + with open(os.path.join(directory, ".gitconfig"), "r") as conf: print(conf.readlines()) # Bare repository must be initialized prior to setting other git env vars - subprocess.check_output(['git', 'init', '--bare', 'plugins'], cwd=repo_dir, - env=my_env) - - my_env['GIT_DIR'] = os.path.join(repo_dir, 'plugins') - my_env['GIT_WORK_TREE'] = repo_dir - my_env['GIT_INDEX_FILE'] = os.path.join(repo_dir, 'scratch-index') - repo_initialization = (f'cp -r {plugins_path}/* .;' - 'git add --all;' - 'git commit -m "initial commit - autogenerated by test_reckless.py";') - tag_and_update = ('git tag v1;' - "sed -i 's/v1/v2/g' testplugpass/testplugpass.py;" - 'git add testplugpass/testplugpass.py;' - 'git commit -m "update to v2";' - 'git tag v2;') - subprocess.check_output([repo_initialization], env=my_env, shell=True, - cwd=repo_dir) - subprocess.check_output([tag_and_update], env=my_env, - shell=True, cwd=repo_dir) - del my_env['HOME'] - del my_env['GIT_DIR'] - del my_env['GIT_WORK_TREE'] - del my_env['GIT_INDEX_FILE'] - # We also need the github api data for the repo which will be served via http - shutil.copyfile(str(FILE_PATH / 'data/recklessrepo/rkls_api_lightningd_plugins.json'), os.path.join(directory, 'rkls_api_lightningd_plugins.json')) - - # Flask can be slow to start listening under CI load; make sure the - # first reckless invocation doesn't race it and get connection refused. - start = time.time() - while True: - assert server.poll() is None, "canned github server died" - try: - with socket.create_connection(('127.0.0.1', int(free_port)), - timeout=5): - break - except OSError: - if time.time() >= start + TIMEOUT: - server.terminate() - raise RuntimeError("canned github server never started listening") - time.sleep(0.2) + subprocess.check_output(["git", "init"], cwd=repo_dir, env=my_env) + + repo_initialization = ( + f"cp -r {plugins_path}/* .;" + "git add --all;" + 'git commit -m "initial commit - autogenerated by test_reckless.py";' + "git remote add origin ./;" + "git fetch origin;" + "git checkout -B master origin/master;" + ) + tag_and_update = ( + "git tag v1;" + "sed -i.bak 's/v1/v2/g' testplugpass/testplugpass.py;" + "rm -f testplugpass/testplugpass.py.bak;" + "git add testplugpass/testplugpass.py;" + 'git commit -m "update to v2";' + "git tag v2;" + ) + subprocess.check_output([repo_initialization], env=my_env, shell=True, cwd=repo_dir) + subprocess.check_output([tag_and_update], env=my_env, shell=True, cwd=repo_dir) + del my_env["HOME"] yield # Delete requirements.txt from the testplugpass directory - with open(requirements_file_path, 'w') as f: - f.write(f"pyln-client\n\n") - server.terminate() + with open(requirements_file_path, "w") as f: + f.write("pyln-client\n\n") class RecklessResult: @@ -115,7 +95,7 @@ def __init__(self, process, returncode, stdout, stderr): self.stderr = stderr def __repr__(self): - return f'self.returncode, self.stdout, self.stderr' + return "self.returncode, self.stdout, self.stderr" def search_stdout(self, regex): """return the matching regex line from reckless output.""" @@ -126,286 +106,352 @@ def search_stdout(self, regex): matching.append(line) return matching - def check_stderr(self): - def output_okay(out): - for warning in ['[notice]', 'WARNING:', 'npm WARN', - 'npm notice', 'DEPRECATION:', 'Creating virtualenv', - 'config file not found:', 'press [Y]']: - if out.startswith(warning): - return True - return False - for e in self.stderr: - if len(e) < 1: - continue - # Don't err on verbosity from pip, npm - if not output_okay(e): - raise Exception(f'reckless stderr contains `{e}`') - - -def reckless(cmds: list, dir: PosixPath = None, - autoconfirm=True, timeout: int = 60): - '''Call the reckless executable, optionally with a directory.''' - if dir is not None: - cmds.insert(0, "-l") - cmds.insert(1, str(dir)) - cmds.insert(0, "tools/reckless") - if autoconfirm: - process_input = 'Y\n' - else: - process_input = None - r = subprocess.run(cmds, capture_output=True, encoding='utf-8', env=my_env, - input=process_input, timeout=timeout) - stdout = r.stdout.splitlines() - stderr = r.stderr.splitlines() - print(" ".join(r.args), "\n") - print("***RECKLESS STDOUT***") - for l in stdout: - print(l) - print('\n') - print("***RECKLESS STDERR***") - for l in stderr: - print(l) - print('\n') - return RecklessResult(r, r.returncode, stdout, stderr) - - -def get_reckless_node(node_factory): - '''This may be unnecessary, but a preconfigured lightning dir - is useful for reckless testing.''' - node = node_factory.get_node(options={}, start=False) - return node - - -def test_basic_help(): - '''Validate that argparse provides basic help info. - This requires no config options passed to reckless.''' - r = reckless(["-h"]) - assert r.returncode == 0 - assert r.search_stdout("positional arguments:") - assert r.search_stdout("options:") or r.search_stdout("optional arguments:") - - -def test_contextual_help(node_factory): - n = get_reckless_node(node_factory) - for subcmd in ['install', 'uninstall', 'search', - 'enable', 'disable', 'source']: - r = reckless([subcmd, "-h"], dir=n.lightning_dir) - assert r.returncode == 0 - assert r.search_stdout("positional arguments:") + +def check_stderr(logs): + def output_okay(out): + for warning in [ + "[notice]", + "WARNING:", + "npm WARN", + "npm notice", + "DEPRECATION:", + "Creating virtualenv", + "config file not found:", + "press [Y]", + ]: + if out.startswith(warning): + return True + return False + + for e in logs: + if len(e) < 1: + continue + # Don't err on verbosity from pip, npm + if not output_okay(e): + raise Exception(f"reckless stderr contains `{e}`") + + +SUBCOMMANDS = [ + "install", + "uninstall", + "listavailable", + "enable", + "disable", + "source", + "update", + "listinstalled", +] + + +def test_help(node_factory): + """Validate that reckless provides overall and subcommand help.""" + node = node_factory.get_node(options={}) + + r = node.rpc.call("reckless", ["help"], filter={"format-hint": True}) + assert "Usage: reckless [OPTIONS] [COMMAND]" in r["result"] + for subcommand in SUBCOMMANDS: + assert subcommand in r["result"] + + r = node.rpc.call("reckless", [], filter={"format-hint": True}) + assert "Usage: reckless [OPTIONS] [COMMAND]" in r["result"] + for subcommand in SUBCOMMANDS: + assert subcommand in r["result"] + + for subcmd in SUBCOMMANDS: + r = node.rpc.call("reckless", ["help", subcmd], filter={"format-hint": True}) + assert f"Usage: {subcmd}" in r["result"] def test_sources(node_factory): """add additional sources and search through them""" - n = get_reckless_node(node_factory) - r = reckless(["source", "-h"], dir=n.lightning_dir) - assert r.returncode == 0 - r = reckless(["source", "list"], dir=n.lightning_dir) - print(r.stdout) - assert r.returncode == 0 + n = node_factory.get_node(options={}) + r = n.rpc.call("reckless", ["source", "list", "-v"]) + print(r) + assert "https://github.com/lightningd/plugins" in r["sources"] print(n.lightning_dir) - reckless_dir = Path(n.lightning_dir) / 'reckless' + reckless_dir = Path(n.lightning_dir) / "reckless" print(dir(reckless_dir)) - assert (reckless_dir / '.sources').exists() + assert (reckless_dir / ".sources").exists() print(os.listdir(reckless_dir)) - print(reckless_dir / '.sources') - plugin_dir = str(os.path.join(n.lightning_dir, '..', 'lightningd')) - r = reckless([f"--network={NETWORK}", "-v", "source", "add", - f'{plugin_dir}/testplugfail'], - dir=n.lightning_dir) - r = reckless([f"--network={NETWORK}", "-v", "source", "add", - f'{plugin_dir}/testplugpass'], - dir=n.lightning_dir) - with open(reckless_dir / '.sources') as sources: + print(reckless_dir / ".sources") + plugin_dir = str(os.path.join(n.lightning_dir, "..", "lightningd")) + r = n.rpc.call("reckless", ["source", "-v", "add", f"{plugin_dir}/testplugfail"]) + r = n.rpc.call("reckless", ["source", "-v", "add", f"{plugin_dir}/testplugpass"]) + with open(reckless_dir / ".sources") as sources: contents = [c.strip() for c in sources.readlines()] - print('contents:', contents) - assert 'https://github.com/lightningd/plugins' in contents - assert f'{plugin_dir}/testplugfail' in contents - assert f'{plugin_dir}/testplugpass' in contents - r = reckless([f"--network={NETWORK}", "-v", "source", "remove", - f'{plugin_dir}/testplugfail'], - dir=n.lightning_dir) - with open(reckless_dir / '.sources') as sources: + print("contents:", contents) + assert "https://github.com/lightningd/plugins" in contents + assert f"{plugin_dir}/testplugfail" in contents + assert f"{plugin_dir}/testplugpass" in contents + r = n.rpc.call( + "reckless", + [ + "source", + "-v", + "remove", + f"{plugin_dir}/testplugfail", + ], + ) + print(r) + with open(reckless_dir / ".sources") as sources: contents = [c.strip() for c in sources.readlines()] - print('contents:', contents) - assert f'{plugin_dir}/testplugfail' not in contents - assert f'{plugin_dir}/testplugpass' in contents - - -def test_search(node_factory): - """add additional sources and search through them""" - n = get_reckless_node(node_factory) - r = reckless([f"--network={NETWORK}", "search", "testplugpass"], dir=n.lightning_dir) - assert r.returncode == 0 - assert r.search_stdout('found testplugpass in source: https://github.com/lightningd/plugins') + print("contents:", contents) + assert f"{plugin_dir}/testplugfail" not in contents + assert f"{plugin_dir}/testplugpass" in contents -def test_search_partial_match(node_factory): - """test that partial/substring search returns multiple matches""" - n = get_reckless_node(node_factory) +def test_list_partial_match(node_factory): + """test that partial/substring listavailable returns matches""" + n = node_factory.get_node(options={}) # Search for partial name "testplug" - should find all test plugins - r = reckless([f"--network={NETWORK}", "search", "testplug"], dir=n.lightning_dir) + r = n.rpc.call("reckless", ["listavailable", "-v", "testplug"]) # Should show the "Plugins matching" header - assert r.search_stdout("Plugins matching 'testplug':") + assert "INFO: Plugins matching 'testplug':" in r["log"] # Should list multiple plugins (all start with "testplug") - assert r.search_stdout('testplugpass') - assert r.search_stdout('testplugfail') - assert r.search_stdout('testplugpyproj') - assert r.search_stdout('testpluguv') + assert any("testplugpass" in line for line in r["log"]) + assert any("testplugfail" in line for line in r["log"]) + assert any("testplugpyproj" in line for line in r["log"]) + assert any("testpluguv" in line for line in r["log"]) # Search for "pass" - should find testplugpass - r = reckless([f"--network={NETWORK}", "search", "pass"], dir=n.lightning_dir) - assert r.search_stdout("Plugins matching 'pass':") - assert r.search_stdout('testplugpass') + r = n.rpc.call("reckless", ["listavailable", "-v", "pass"]) + assert "INFO: Plugins matching 'pass':" in r["log"] + assert any("testplugpass" in line for line in r["log"]) # Should not find plugins without "pass" in name - assert not r.search_stdout('testplugfail') + assert all("testplugfail" not in line for line in r["log"]) # Search for something that doesn't exist - r = reckless([f"--network={NETWORK}", "search", "nonexistent"], dir=n.lightning_dir) - assert r.search_stdout("Search exhausted all sources") + r = n.rpc.call("reckless", ["listavailable", "-v", "nonexistent"]) + assert "INFO: Search exhausted all sources" in r["log"] +@unittest.skipIf(VALGRIND, "virtual environment triggers memleak detection") def test_install(node_factory): """test search, git clone, and installation to folder.""" - n = get_reckless_node(node_factory) - r = reckless([f"--network={NETWORK}", "-v", "install", "testplugpass"], dir=n.lightning_dir) - assert r.returncode == 0 - assert r.search_stdout('dependencies installed successfully') - assert r.search_stdout('plugin installed:') - assert r.search_stdout('testplugpass enabled') - r.check_stderr() - plugin_path = Path(n.lightning_dir) / 'reckless/testplugpass' + n = node_factory.get_node(options={}) + r = n.rpc.call("reckless", ["install", "-v", "testplugpass"]) + assert r["install"]["enabled"] + assert r["install"]["plugin_name"] == "testplugpass" + assert any("dependencies installed successfully" in line for line in r["log"]) + assert any("plugin installed:" in line for line in r["log"]) + assert any("testplugpass enabled" in line for line in r["log"]) + # check_stderr(r["log"]) TODO: check logs + plugin_path = Path(n.lightning_dir) / "reckless/testplugpass" print(plugin_path) assert os.path.exists(plugin_path) + # Try to install again - should result in an error. + with pytest.raises(RpcError, match="already installed"): + n.rpc.call("reckless", ["install", "-v", "testplugpass"]) + n.daemon.wait_for_log("testplugpass is already installed") + + +@unittest.skipIf(VALGRIND, "virtual environment triggers memleak detection") +def test_install_cleanup(node_factory): + """test failed start which should give a chance to enable with options and""" + """a failed installation which should cleanup the plugin folder""" + n = node_factory.get_node( + options={}, + broken_log=".*uv failed.*|.*sofijowesifjwoiefjow.*|.*unsatisfiable.*|.*could not read metadata for testpluginvaliddeps.*", + ) + r = n.rpc.call("reckless", ["install", "-v", "testplugreqopts"]) + assert not r["install"]["enabled"] + assert r["install"]["plugin_name"] == "testplugreqopts" + assert any("testplugreqopts failed to start" in line for line in r["log"]) + + plugin_path = Path(n.lightning_dir) / "reckless/testplugreqopts" + assert os.path.exists(plugin_path) + + with pytest.raises(RpcError, match="command .* failed"): + n.rpc.call("reckless", ["install", "-v", "testpluginvaliddeps"]) + + plugin_path = Path(n.lightning_dir) / "reckless/testpluginvaliddeps" + assert not os.path.exists(plugin_path) + @unittest.skipIf(VALGRIND, "virtual environment triggers memleak detection") def test_poetry_install(node_factory): """test search, git clone, and installation to folder.""" - n = get_reckless_node(node_factory) - r = reckless([f"--network={NETWORK}", "-v", "install", "testplugpyproj"], dir=n.lightning_dir) - assert r.returncode == 0 - assert r.search_stdout('dependencies installed successfully') - assert r.search_stdout('plugin installed:') - assert r.search_stdout('testplugpyproj enabled') - r.check_stderr() - plugin_path = Path(n.lightning_dir) / 'reckless/testplugpyproj' + n = node_factory.get_node(options={}) + r = n.rpc.call("reckless", ["install", "-v", "testplugpyproj"]) + assert any("dependencies installed successfully" in line for line in r["log"]) + assert any("plugin installed:" in line for line in r["log"]) + # time.sleep(120) + assert any("testplugpyproj enabled" in line for line in r["log"]) + # check_stderr(r["log"]) TODO: check logs + plugin_path = Path(n.lightning_dir) / "reckless/testplugpyproj" print(plugin_path) assert os.path.exists(plugin_path) - n.start() print(n.rpc.testmethod()) - assert n.daemon.is_in_log(r'plugin-manager: started\([0-9].*\) /tmp/ltests-[a-z0-9_].*/test_poetry_install_1/lightning-1/reckless/testplugpyproj/testplugpyproj.py') - assert n.rpc.testmethod() == 'I live.' + assert n.daemon.is_in_log( + r"plugin-manager: started\([0-9].*\) /tmp/ltests-[a-z0-9_].*/test_poetry_install_1/lightning-1/reckless/testplugpyproj/testplugpyproj.py" + ) + assert n.rpc.testmethod() == "I live." @unittest.skipIf(VALGRIND, "virtual environment triggers memleak detection") def test_local_dir_install(node_factory): """Test search and install from local directory source.""" - n = get_reckless_node(node_factory) - n.start() - source_dir = str(Path(n.lightning_dir / '..' / 'lightningd' / 'testplugpass').resolve()) - r = reckless([f"--network={NETWORK}", "-v", "source", "add", source_dir], dir=n.lightning_dir) - assert r.returncode == 0 - r = reckless([f"--network={NETWORK}", "-v", "install", "testplugpass"], dir=n.lightning_dir) - assert r.returncode == 0 - assert r.search_stdout('testplugpass enabled') - plugin_path = Path(n.lightning_dir) / 'reckless/testplugpass' + n = node_factory.get_node(options={}) + source_dir = str( + Path(n.lightning_dir / ".." / "lightningd" / "testplugpass").resolve() + ) + r = n.rpc.call("reckless", ["source", "-v", "add", source_dir]) + r = n.rpc.call("reckless", ["install", "-v", "testplugpass"]) + assert any("testplugpass enabled" in line for line in r["log"]) + plugin_path = Path(n.lightning_dir) / "reckless/testplugpass" print(plugin_path) assert os.path.exists(plugin_path) # Retry with a direct install passing the full path to the local source - r = reckless(['uninstall', 'testplugpass', '-v'], dir=n.lightning_dir) + r = n.rpc.call("reckless", ["uninstall", "-v", "testplugpass"]) assert not os.path.exists(plugin_path) - r = reckless(['source', 'remove', source_dir], dir=n.lightning_dir) - assert r.search_stdout('plugin source removed') - r = reckless(['install', '-v', source_dir], dir=n.lightning_dir) - assert r.search_stdout('testplugpass enabled') + r = n.rpc.call("reckless", ["source", "-v", "remove", source_dir]) + assert source_dir not in r["sources"] + r = n.rpc.call("reckless", ["install", "-v", source_dir]) + print(r) + assert any("testplugpass enabled" in line for line in r["log"]) assert os.path.exists(plugin_path) @unittest.skipIf(VALGRIND, "virtual environment triggers memleak detection") def test_disable_enable(node_factory): """test search, git clone, and installation to folder.""" - n = get_reckless_node(node_factory) + n = node_factory.get_node(options={}) # Test case-insensitive search as well - r = reckless([f"--network={NETWORK}", "-v", "install", "testPlugPass"], - dir=n.lightning_dir) - assert r.returncode == 0 - assert r.search_stdout('dependencies installed successfully') - assert r.search_stdout('plugin installed:') - assert r.search_stdout('testplugpass enabled') - r.check_stderr() - plugin_path = Path(n.lightning_dir) / 'reckless/testplugpass' + r = n.rpc.call("reckless", ["install", "-v", "testPlugPass"]) + assert r["install"]["enabled"] + assert r["install"]["plugin_name"] == "testplugpass" + assert any("dependencies installed successfully" in line for line in r["log"]) + assert any("plugin installed:" in line for line in r["log"]) + assert any("testplugpass enabled" in line for line in r["log"]) + # r.check_stderr() TODO: check logs + plugin_path = Path(n.lightning_dir) / "reckless/testplugpass" print(plugin_path) assert os.path.exists(plugin_path) - r = reckless([f"--network={NETWORK}", "-v", "disable", "testPlugPass"], - dir=n.lightning_dir) - assert r.returncode == 0 - n.start() + r = n.rpc.call("reckless", ["disable", "-v", "testPlugPass"]) + assert r["disable"]["plugin_name"] == "testplugpass" + # Should find it with or without the file extension - r = reckless([f"--network={NETWORK}", "-v", "enable", "testplugpass.py"], - dir=n.lightning_dir) - assert r.returncode == 0 - assert r.search_stdout('testplugpass enabled') - test_plugin = {'name': str(plugin_path / 'testplugpass.py'), - 'active': True, 'dynamic': True} + r = n.rpc.call("reckless", ["enable", "-v", "testplugpass.py"]) + assert r["enable"]["plugin_name"] == "testplugpass" + assert any("testplugpass enabled" in line for line in r["log"]) + test_plugin = { + "name": str((plugin_path / "testplugpass.py").resolve()), + "active": True, + "dynamic": True, + } time.sleep(1) - print(n.rpc.plugin_list()['plugins']) - assert test_plugin in n.rpc.plugin_list()['plugins'] + print(n.rpc.plugin_list()["plugins"]) + assert test_plugin in n.rpc.plugin_list()["plugins"] @unittest.skipIf(VALGRIND, "virtual environment triggers memleak detection") def test_tag_install(node_factory): "install a plugin from a specific commit hash or tag" - node = get_reckless_node(node_factory) - node.start() - r = reckless([f"--network={NETWORK}", "-v", "install", "testPlugPass"], - dir=node.lightning_dir) - assert r.returncode == 0 - metadata = node.lightning_dir / "reckless/testplugpass/.metadata" - with open(metadata, "r") as md: - header = '' - for line in md.readlines(): - line = line.strip() - if header == 'requested commit': - assert line == 'None' - header = line + node = node_factory.get_node(options={}) + r = node.rpc.call("reckless", ["install", "-v", "testPlugPass"]) + assert r["install"]["enabled"] + assert r["install"]["plugin_name"] == "testplugpass" + metadata_file = node.lightning_dir / "reckless/testplugpass/.metadata.json" + with open(metadata_file, "r") as md: + metadata = json.load(md) + assert "requested_commit" not in metadata["metadata"] # should install v2 (latest) without specifying version = node.rpc.gettestplugversion() - assert version == 'v2' - r = reckless([f"--network={NETWORK}", "-v", "uninstall", "testplugpass"], - dir=node.lightning_dir) - r = reckless([f"--network={NETWORK}", "-v", "install", "testplugpass@v1"], - dir=node.lightning_dir) - assert r.returncode == 0 + assert version == "v2" + r = node.rpc.call("reckless", ["uninstall", "-v", "testplugpass"]) + assert r["uninstall"]["plugin_name"] == "testplugpass" + r = node.rpc.call("reckless", ["install", "-v", "testplugpass@v1"]) + assert r["install"]["enabled"] + assert r["install"]["plugin_name"] == "testplugpass" + assert r["install"]["installed_commit"] == "v1" # v1 should now be checked out. version = node.rpc.gettestplugversion() - assert version == 'v1' - installed_path = Path(node.lightning_dir) / 'reckless/testplugpass' + assert version == "v1" + installed_path = Path(node.lightning_dir) / "reckless/testplugpass" assert installed_path.is_dir() - with open(metadata, "r") as md: - header = '' - for line in md.readlines(): - line = line.strip() - if header == 'requested commit': - assert line == 'v1' - header = line + with open(metadata_file, "r") as md: + metadata = json.load(md) + assert metadata["metadata"]["requested_commit"] == "v1" + assert metadata["metadata"]["installed_commit"] == "v1" + + +@unittest.skipIf(VALGRIND, "virtual environment triggers memleak detection") +def test_install_plugin_requiring_opts(node_factory): + """A plugin that exits non-zero when run standalone (e.g. because a + required option is not yet configured) should still install successfully.""" + node = node_factory.get_node(options={}) + r = node.rpc.call("reckless", ["install", "-v", "testplugreqopts"]) + assert not r["install"]["enabled"] + assert r["install"]["plugin_name"] == "testplugreqopts" + assert any("plugin installed:" in line for line in r["log"]) + assert any("testplugreqopts failed to start" in line for line in r["log"]) + assert all("testplugreqopts enabled" not in line for line in r["log"]) + assert any("may require options" in line for line in r["log"]) + plugin_path = Path(node.lightning_dir) / "reckless/testplugreqopts" + assert plugin_path.exists() + + r = node.rpc.call( + "reckless", ["enable", "-v", "testplugreqopts", "required-opt=foo"] + ) + assert r["enable"]["plugin_name"] == "testplugreqopts" + assert any("testplugreqopts enabled" in line for line in r["log"]) + + r = node.rpc.call("reckless", ["uninstall", "-v", "testplugreqopts"]) + assert r["uninstall"]["plugin_name"] == "testplugreqopts" + assert not plugin_path.exists() + + r = node.rpc.call( + "reckless", ["install", "-v", "testplugreqopts", "required-opt=foo"] + ) + assert r["install"]["enabled"] + assert r["install"]["plugin_name"] == "testplugreqopts" + assert any("plugin installed:" in line for line in r["log"]) + assert any("testplugreqopts enabled" in line for line in r["log"]) # Note: uv timeouts from the GH network seem to happen? @pytest.mark.slow_test -@pytest.mark.flaky(reruns=3) +@pytest.mark.flaky(max_runs=3, min_passes=1) def test_reckless_uv_install(node_factory): - node = get_reckless_node(node_factory) - node.start() - r = reckless([f"--network={NETWORK}", "-v", "install", "testpluguv"], - dir=node.lightning_dir) - assert r.returncode == 0 - installed_path = Path(node.lightning_dir) / 'reckless/testpluguv' + node = node_factory.get_node(options={}) + r = node.rpc.call("reckless", ["install", "-v", "testpluguv"]) + assert r["install"]["enabled"] + assert r["install"]["plugin_name"] == "testpluguv" + installed_path = Path(node.lightning_dir) / "reckless/testpluguv" assert installed_path.is_dir() - assert node.rpc.uvplugintest() == 'I live.' + assert node.rpc.uvplugintest() == "I live." version = node.rpc.getuvpluginversion() - assert version == 'v1' + assert version == "v1" + + assert any("using installer pythonuv" in line for line in r["log"]) + # r.check_stderr() TODO: check logs + + +@unittest.skipIf(VALGRIND, "virtual environment triggers memleak detection") +def test_reckless_manifest(node_factory): + node, l2 = node_factory.line_graph(2, wait_for_announce=True) + + bolt12 = l2.rpc.call("offer", ["any"])["bolt12"] + + r = node.rpc.call("reckless", ["install", "-v", "testplugmani"]) + assert r["install"]["enabled"] + assert r["install"]["plugin_name"] == "testplugmani" + assert node.rpc.testmethod() == "I live." + + manifest = node.lightning_dir / "reckless/testplugmani/.metadata.json" + with open(manifest, "r") as f: + data = json.load(f) + + data["manifest"]["offer"] = bolt12 + + with open(manifest, "w") as f: + json.dump(data, f, indent=4) - assert r.search_stdout('using installer pythonuv') - r.check_stderr() + r = node.rpc.call("reckless", ["tip", "-v", "testplugmani", 1000]) + assert any( + "Successfully sent 1000msat to testplugmani author!" in line + for line in r["log"] + ) diff --git a/tools/reckless b/tools/reckless deleted file mode 100755 index 62bfe6259773..000000000000 --- a/tools/reckless +++ /dev/null @@ -1,2145 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import argparse -import copy -import datetime -from enum import Enum -import json -import logging -import os -from pathlib import Path, PosixPath -import shutil -from subprocess import Popen, PIPE, TimeoutExpired, run -import tempfile -import time -import types -from typing import Union -from urllib.parse import urlparse -from urllib.request import urlopen -from urllib.error import HTTPError -import venv - - -__VERSION__ = 'v26.06.6' - -logging.basicConfig( - level=logging.INFO, - format='[%(asctime)s] %(levelname)s: %(message)s', - handlers=[logging.StreamHandler(stream=sys.stdout)], -) - -LAST_FOUND = None - - -def chunk_string(string: str, size: int): - for i in range(0, len(string), size): - yield string[i: i + size] - - -def ratelimit_output(output: str): - sys.stdout.reconfigure(encoding='utf-8') - for i in chunk_string(output, 1024): - sys.stdout.write(i) - sys.stdout.flush() - time.sleep(0.01) - - -class Logger: - """Redirect logging output to a json object or stdout as appropriate.""" - def __init__(self, capture: bool = False): - self.json_output = {"result": [], - "log": []} - self.capture = capture - - def str_esc(self, raw_string: str) -> str: - assert isinstance(raw_string, str) - return json.dumps(raw_string)[1:-1] - - def debug(self, to_log: str): - assert isinstance(to_log, str) or hasattr(to_log, "__repr__") - if logging.root.level > logging.DEBUG: - return - if self.capture: - self.json_output['log'].append(self.str_esc(f"DEBUG: {to_log}")) - else: - logging.debug(to_log) - - def info(self, to_log: str): - assert isinstance(to_log, str) or hasattr(to_log, "__repr__") - if logging.root.level > logging.INFO: - return - if self.capture: - self.json_output['log'].append(self.str_esc(f"INFO: {to_log}")) - else: - print(to_log) - - def warning(self, to_log: str): - assert isinstance(to_log, str) or hasattr(to_log, "__repr__") - if logging.root.level > logging.WARNING: - return - if self.capture: - self.json_output['log'].append(self.str_esc(f"WARNING: {to_log}")) - else: - logging.warning(to_log) - - def error(self, to_log: str): - assert isinstance(to_log, str) or hasattr(to_log, "__repr__") - if logging.root.level > logging.ERROR: - return - if self.capture: - self.json_output['log'].append(self.str_esc(f"ERROR: {to_log}")) - else: - logging.error(to_log) - - def add_result(self, result: Union[str, None]): - assert json.dumps(result), "result must be json serializable" - self.json_output["result"].append(result) - - def reply_json(self): - """json output to stdout with accumulated result.""" - if len(log.json_output["result"]) == 1 and \ - isinstance(log.json_output["result"][0], list): - # unpack sources output - log.json_output["result"] = log.json_output["result"][0] - output = json.dumps(log.json_output, indent=3) + '\n' - ratelimit_output(output) - - -log = Logger() - -repos = ['https://github.com/lightningd/plugins'] - - -def reckless_abort(err: str): - log.error(err) - log.add_result(None) - log.reply_json() - sys.exit(1) - - -def py_entry_guesses(name) -> list: - return [name, f'{name}.py', '__init__.py'] - - -def unsupported_entry(name) -> list: - return [f'{name}.go', f'{name}.sh'] - - -def entry_guesses(name: str) -> list: - guesses = [] - for inst in INSTALLERS: - for entry in inst.entries: - guesses.append(entry.format(name=name)) - return guesses - - -class Installer: - ''' - The identification of a plugin language, compiler or interpreter - availability, and the install procedures. - ''' - def __init__(self, name: str, - exe: Union[str, None] = None, - compiler: Union[str, None] = None, - manager: Union[str, None] = None, - entry: Union[str, None] = None): - self.name = name - self.entries = [] - if entry: - self.entries.append(entry) - self.exe = exe # interpreter (if required) - self.compiler = compiler # compiler bin (if required) - self.manager = manager # dependency manager (if required) - self.dependency_file = None - self.dependency_call = None - - def __repr__(self): - return (f'') - - def executable(self) -> bool: - '''Validate the necessary bins are available to execute the plugin.''' - if self.exe: - if shutil.which(self.exe): - # This should arguably not be checked here. - if self.manager: - if shutil.which(self.manager): - return True - return False - return True - return False - return True - - def installable(self) -> bool: - '''Validate the necessary compiler and package manager executables are - available to install. If these are defined, they are considered - mandatory even though the user may have the requisite packages already - installed.''' - if self.compiler and not shutil.which(self.compiler): - return False - if self.manager and not shutil.which(self.manager): - return False - return True - - def add_entrypoint(self, entry: str): - assert isinstance(entry, str) - self.entries.append(entry) - - def get_entrypoints(self, name: str): - guesses = [] - for entry in self.entries: - guesses.append(entry.format(name=name)) - return guesses - - def add_dependency_file(self, dep: str): - assert isinstance(dep, str) - self.dependency_file = dep - - def add_dependency_call(self, call: list): - if self.dependency_call is None: - self.dependency_call = [] - self.dependency_call.append(call) - - def copy(self): - return copy.deepcopy(self) - - -class InstInfo: - def __init__(self, name: str, location: str, git_url: str): - self.name = name - self.source_loc = str(location) # Used for 'git clone' - self.git_url: str = git_url # API access for github repos - self.srctype: Source = Source.get_type(location) - self.entry: SourceFile = None # relative to source_loc or subdir - self.deps: str = None - self.subdir: str = None - self.commit: str = None - - def __repr__(self): - return (f'InstInfo({self.name}, {self.source_loc}, {self.git_url}, ' - f'{self.entry}, {self.deps}, {self.subdir})') - - def get_repo_commit(self) -> Union[str, None]: - """The latest commit from a remote repo or the HEAD of a local repo.""" - if self.srctype in [Source.LOCAL_REPO, Source.GIT_LOCAL_CLONE]: - git = run(['git', 'rev-parse', 'HEAD'], cwd=str(self.source_loc), - stdout=PIPE, stderr=PIPE, text=True, check=False, timeout=10) - if git.returncode != 0: - return None - return git.stdout.splitlines()[0] - - if self.srctype == Source.GITHUB_REPO: - parsed_url = urlparse(self.source_loc) - if 'github.com' not in parsed_url.netloc: - return None - if len(parsed_url.path.split('/')) < 2: - return None - start = 1 - # Maybe we were passed an api.github.com/repo/ url - if 'api' in parsed_url.netloc: - start += 1 - repo_user = parsed_url.path.split('/')[start] - repo_name = parsed_url.path.split('/')[start + 1] - api_url = f'{API_GITHUB_COM}/repos/{repo_user}/{repo_name}/commits?ref=HEAD' - r = urlopen(api_url, timeout=5) - if r.status != 200: - return None - try: - return json.loads(r.read().decode())['0']['sha'] - except: - return None - - def get_inst_details(self) -> bool: - """Search the source_loc for plugin install details. - This may be necessary if a contents api is unavailable. - Extracts entrypoint and dependencies if searchable, otherwise - matches a directory to the plugin name and stops.""" - if self.srctype == Source.DIRECTORY: - assert Path(self.source_loc).exists() - assert os.path.isdir(self.source_loc) - target = SourceDir(self.source_loc, srctype=self.srctype) - # Set recursion for how many directories deep we should search - depth = 0 - if self.srctype in [Source.DIRECTORY, Source.LOCAL_REPO, - Source.GIT_LOCAL_CLONE]: - depth = 5 - elif self.srctype == Source.GITHUB_REPO: - depth = 1 - - def search_dir(self, sub: SourceDir, subdir: bool, - recursion: int) -> Union[SourceDir, None]: - assert isinstance(recursion, int) - # carveout for archived plugins in lightningd/plugins. Other repos - # are only searched by API at the top level. - if recursion == 0 and 'archive' in sub.name.lower(): - pass - # If unable to search deeper, resort to matching directory name - elif recursion < 1: - if sub.name.lower() == self.name.lower(): - # Partial success (can't check for entrypoint) - self.name = sub.name - return sub - return None - sub.populate() - - if sub.name.lower() == self.name.lower(): - # Directory matches the name we're trying to install, so check - # for entrypoint and dependencies. - for inst in INSTALLERS: - for g in inst.get_entrypoints(self.name): - found_entry = sub.find(g, ftype=SourceFile) - if found_entry: - break - # FIXME: handle a list of dependencies - found_dep = sub.find(inst.dependency_file, - ftype=SourceFile) - if found_entry: - # Success! - if found_dep: - self.name = sub.name - self.entry = found_entry.name - self.deps = found_dep.name - return sub - log.debug(f"missing dependency for {self}") - found_entry = None - for file in sub.contents: - if isinstance(file, SourceDir): - assert file.relative - success = search_dir(self, file, True, recursion - 1) - if success: - return success - return None - - try: - result = search_dir(self, target, False, depth) - # Using the rest API of github.com may result in a - # "Error 403: rate limit exceeded" or other access issues. - # Fall back to cloning and searching the local copy instead. - except HTTPError: - result = None - if self.srctype == Source.GITHUB_REPO: - # clone source to reckless dir - target = copy_remote_git_source(self) - if not target: - log.warning(f"could not clone github source {self}") - return False - log.debug(f"falling back to cloning remote repo {self}") - # Update to reflect use of a local clone - self.source_loc = str(target.location) - self.srctype = target.srctype - result = search_dir(self, target, False, 5) - - if not result: - return False - - if result: - if result != target: - if result.relative: - self.subdir = result.relative - else: - # populate() should always assign a relative path - # if not in the top-level source directory - assert self.subdir == result.name - return True - return False - - -def create_dir(directory: PosixPath) -> bool: - try: - Path(directory).mkdir(parents=False, exist_ok=True) - return True - # Okay if directory already exists - except FileExistsError: - return True - # Parent directory missing - except FileNotFoundError: - return False - - -def remove_dir(directory: str) -> bool: - try: - shutil.rmtree(directory) - return True - except NotADirectoryError: - log.warning(f"Tried to remove directory {directory} that " - "does not exist.") - except PermissionError: - log.warning(f"Permission denied removing dir: {directory}") - return False - - -class Source(Enum): - DIRECTORY = 1 - LOCAL_REPO = 2 - GITHUB_REPO = 3 - OTHER_URL = 4 - UNKNOWN = 5 - # Cloned from remote source before searching (rather than github API) - GIT_LOCAL_CLONE = 6 - - @classmethod - def get_type(cls, source: str): - if Path(os.path.realpath(source)).exists(): - if os.path.isdir(os.path.realpath(source)): - # returns 0 if git repository - proc = run(['git', '-C', source, 'rev-parse'], - cwd=os.path.realpath(source), stdout=PIPE, - stderr=PIPE, text=True, timeout=5) - if proc.returncode == 0: - return cls(2) - return cls(1) - if 'github.com' in source.lower(): - return cls(3) - if 'http://' in source.lower() or 'https://' in source.lower(): - return cls(4) - return cls(5) - - @classmethod - def get_github_user_repo(cls, source: str) -> (str, str): - 'extract a github username and repository name' - if 'github.com/' not in source.lower(): - return None, None - trailing = Path(source.lower().partition('github.com/')[2]).parts - if len(trailing) < 2: - return None, None - return trailing[0], trailing[1] - - -class SourceDir(): - """Structure to search source contents.""" - def __init__(self, location: str, srctype: Source = None, name: str = None, - relative: str = None): - self.location = str(location) - if name: - self.name = name - else: - self.name = Path(location).name - self.contents = [] - self.srctype = srctype - self.prepopulated = False - self.relative = relative # location relative to source - - def populate(self): - """populates contents of the directory at least one level""" - if self.prepopulated: - return - if not self.srctype: - self.srctype = Source.get_type(self.location) - if self.srctype == Source.DIRECTORY: - self.contents = populate_local_dir(self.location) - elif self.srctype in [Source.LOCAL_REPO, Source.GIT_LOCAL_CLONE]: - self.contents = populate_local_repo(self.location) - elif self.srctype == Source.GITHUB_REPO: - self.contents = populate_github_repo(self.location) - else: - raise Exception("populate method undefined for {self.srctype}") - # Ensure the relative path of the contents is inherited. - for c in self.contents: - if self.relative is None: - c.relative = c.name - else: - c.relative = str(Path(self.relative) / c.name) - - def find(self, name: str, ftype: type = None) -> str: - """Match a SourceFile or SourceDir to the provided name - (case insentive) and return its filename.""" - assert isinstance(name, str) - if len(self.contents) == 0: - return None - for c in self.contents: - if ftype and not isinstance(c, ftype): - continue - if c.name.lower() == name.lower(): - return c - return None - - def __repr__(self): - return f"" - - def __eq__(self, compared): - if isinstance(compared, str): - return self.name == compared - if isinstance(compared, SourceDir): - return (self.name == compared.name and - self.location == compared.location) - return False - - -class SourceFile(): - def __init__(self, location: str): - self.location = str(location) - self.name = Path(location).name - - def __repr__(self): - return f"" - - def __eq__(self, compared): - if isinstance(compared, str): - return self.name == compared - if isinstance(compared, SourceFile): - return (self.name == compared.name and - self.location == compared.location) - return False - - -def populate_local_dir(path: str) -> list: - assert Path(os.path.realpath(path)).exists() - contents = [] - for c in os.listdir(path): - fullpath = Path(path) / c - if os.path.isdir(fullpath): - # Inheriting type saves a call to test if it's a git repo - contents.append(SourceDir(fullpath, srctype=Source.DIRECTORY)) - else: - contents.append(SourceFile(fullpath)) - return contents - - -def populate_local_repo(path: str, parent=None) -> list: - assert Path(os.path.realpath(path)).exists() - if parent is None: - basedir = SourceDir('base') - else: - assert isinstance(parent, SourceDir) - basedir = parent - - def populate_source_path(parent: SourceDir, mypath: PosixPath, - relative: str = None): - """`git ls-tree` lists all files with their full path. - This populates all intermediate directories and the file.""" - parentdir = parent - if mypath == '.': - log.debug(' asked to populate root dir') - return - # reverse the parents - pdirs = mypath - revpath = [] - child = parentdir - while pdirs.parent.name != '': - revpath.append(pdirs.parent.name) - pdirs = pdirs.parent - for p in reversed(revpath): - child = parentdir.find(p) - if child: - parentdir = child - else: - if p == revpath[-1]: - relative_path = None - if parentdir.relative: - relative_path = parentdir.relative - elif parentdir.relative: - relative_path = str(Path(parentdir.relative) / - parentdir.name) - else: - relative_path = parentdir.name - child = SourceDir(p, srctype=Source.LOCAL_REPO, - relative=relative_path) - # ls-tree lists every file in the repo with full path. - # No need to populate each directory individually. - child.prepopulated = True - parentdir.contents.append(child) - parentdir = child - newfile = SourceFile(mypath.name) - child.contents.append(newfile) - - # Submodules contents are populated separately - proc = run(['git', '-C', path, 'submodule', 'status'], - stdout=PIPE, stderr=PIPE, text=True, timeout=5) - if proc.returncode != 0: - log.debug(f"'git submodule status' of repo {path} failed") - return None - submodules = [] - for sub in proc.stdout.splitlines(): - submodules.append(sub.split()[1]) - - # FIXME: Pass in tag or commit hash - ver = 'HEAD' - git_call = ['git', '-C', path, 'ls-tree', '--full-tree', '-r', - '--name-only', ver] - proc = run(git_call, stdout=PIPE, stderr=PIPE, text=True, timeout=5) - if proc.returncode != 0: - log.debug(f'ls-tree of repo {path} failed') - return None - - for filepath in proc.stdout.splitlines(): - if filepath in submodules: - if parent is None: - relative_path = filepath - elif basedir.relative: - relative_path = str(Path(basedir.relative) / filepath) - assert relative_path - submodule_dir = SourceDir(filepath, srctype=Source.LOCAL_REPO, - relative=relative_path) - populate_local_repo(Path(path) / filepath, parent=submodule_dir) - submodule_dir.prepopulated = True - basedir.contents.append(submodule_dir) - else: - populate_source_path(basedir, Path(filepath)) - return basedir.contents - - -def source_element_from_repo_api(member: dict): - # api accessed via /contents/ - if 'type' in member and 'name' in member and 'git_url' in member: - if member['type'] == 'dir': - return SourceDir(member['git_url'], srctype=Source.GITHUB_REPO, - name=member['name']) - elif member['type'] == 'file': - # Likely a submodule - if member['size'] == 0: - return SourceDir(None, srctype=Source.GITHUB_REPO, - name=member['name']) - return SourceFile(member['name']) - elif member['type'] == 'commit': - # No path is given by the api here - return SourceDir(None, srctype=Source.GITHUB_REPO, - name=member['name']) - # git_url with /tree/ presents results a little differently - elif 'type' in member and 'path' in member and 'url' in member: - if member['type'] not in ['tree', 'blob']: - log.debug(f' skipping {member["path"]} type={member["type"]}') - if member['type'] == 'tree': - return SourceDir(member['url'], srctype=Source.GITHUB_REPO, - name=member['path']) - elif member['type'] == 'blob': - # This can be a submodule - if member['size'] == 0: - return SourceDir(member['git_url'], srctype=Source.GITHUB_REPO, - name=member['name']) - return SourceFile(member['path']) - elif member['type'] == 'commit': - # No path is given by the api here - return SourceDir(None, srctype=Source.GITHUB_REPO, - name=member['name']) - return None - - -def populate_github_repo(url: str) -> list: - """populate one level of a github repository via REST API""" - # Forces search to clone remote repos (for blackbox testing) - if GITHUB_API_FALLBACK: - with tempfile.NamedTemporaryFile() as tmp: - raise HTTPError(url, 403, 'simulated ratelimit', {}, tmp) - # FIXME: This probably contains leftover cruft. - repo = url.split('/') - while '' in repo: - repo.remove('') - repo_name = None - parsed_url = urlparse(url) - if 'github.com' not in parsed_url.netloc: - return None - if len(parsed_url.path.split('/')) < 2: - return None - start = 1 - # Maybe we were passed an api.github.com/repo/ url - if 'api' in parsed_url.netloc: - start += 1 - repo_user = parsed_url.path.split('/')[start] - repo_name = parsed_url.path.split('/')[start + 1] - - # Get details from the github API. - if API_GITHUB_COM in url: - api_url = url - else: - api_url = f'{API_GITHUB_COM}/repos/{repo_user}/{repo_name}/contents/' - - git_url = api_url - if "api.github.com" in git_url: - # This lets us redirect to handle blackbox testing - log.debug(f'fetching from gh API: {git_url}') - git_url = (API_GITHUB_COM + git_url.split("api.github.com")[-1]) - # Ratelimiting occurs for non-authenticated GH API calls at 60 in 1 hour. - r = urlopen(git_url, timeout=5) - if r.status != 200: - return False - if 'git/tree' in git_url: - tree = json.loads(r.read().decode())['tree'] - else: - tree = json.loads(r.read().decode()) - contents = [] - for sub in tree: - if source_element_from_repo_api(sub): - contents.append(source_element_from_repo_api(sub)) - return contents - - -def copy_remote_git_source(github_source: InstInfo): - """clone or fetch & checkout a local copy of a remote git repo""" - user, repo = Source.get_github_user_repo(github_source.source_loc) - if not user or not repo: - log.warning('could not extract github user and repo ' - f'name for {github_source.source_loc}') - return None - local_path = RECKLESS_DIR / '.remote_sources' / user - create_dir(RECKLESS_DIR / '.remote_sources') - if not create_dir(local_path): - log.warning(f'could not provision dir {local_path} to ' - f'clone remote source {github_source.source_loc}') - return None - local_path = local_path / repo - if local_path.exists(): - # Fetch the latest - assert _git_update(github_source, local_path) - else: - _git_clone(github_source, local_path) - return SourceDir(local_path, srctype=Source.GIT_LOCAL_CLONE) - - -class Config(): - """A generic class for procuring, reading and editing config files""" - def obtain_config(self, - config_path: str, - default_text: str, - warn: bool = False) -> str: - """Return a config file from the desired location. Create one with - default_text if it cannot be found.""" - if isinstance(config_path, type(None)): - raise Exception("Generic config must be passed a config_path.") - assert isinstance(config_path, str) - # FIXME: warn if reckless dir exists, but conf not found - if Path(config_path).exists(): - with open(config_path, 'r+') as f: - config_content = f.readlines() - return config_content - # redirecting the prompts to stderr is kinder for json consumers - tmp = sys.stdout - sys.stdout = sys.stderr - print(f'config file not found: {config_path}') - if warn: - confirm = input('press [Y] to create one now.\n').upper() == 'Y' - else: - confirm = True - sys.stdout = tmp - if not confirm: - reckless_abort(f"config file required: {config_path}") - parent_path = Path(config_path).parent - # Create up to one parent in the directory tree. - if create_dir(parent_path): - with open(self.conf_fp, 'w') as f: - f.write(default_text) - # FIXME: Handle write failure - return default_text - else: - log.warning('could not create the parent directory ' + - parent_path) - raise FileNotFoundError('invalid parent directory') - - def editConfigFile(self, addline: Union[str, None], - removeline: Union[str, None]): - """Idempotent function to add and/or remove a single line each.""" - remove_these_lines = [] - with open(self.conf_fp, 'r') as reckless_conf: - original = reckless_conf.readlines() - empty_lines = [] - write_required = False - for n, l in enumerate(original): - if removeline and l.strip() == removeline.strip(): - write_required = True - remove_these_lines.append(n) - continue - if l.strip() == '': - empty_lines.append(n) - if n-1 in empty_lines: - # The white space is getting excessive. - remove_these_lines.append(n) - continue - if not addline and not write_required: - return - # No write necessary if addline is already in config. - if addline and not write_required: - for line in original: - if line.strip() == addline.strip(): - return - with open(self.conf_fp, 'w') as conf_write: - # no need to write if passed 'None' - line_exists = not bool(addline) - for n, l in enumerate(original): - if n not in remove_these_lines: - if n > 0: - conf_write.write(f'\n{l.strip()}') - else: - conf_write.write(l.strip()) - if addline and addline.strip() == l.strip(): - # addline is idempotent - line_exists = True - if not line_exists: - conf_write.write(f'\n{addline}') - - def __init__(self, path: Union[str, None] = None, - default_text: Union[str, None] = None, - warn: bool = False): - assert path is not None - assert default_text is not None - self.conf_fp = path - self.content = self.obtain_config(self.conf_fp, default_text, - warn=warn) - - -class RecklessConfig(Config): - """Reckless config (by default, specific to the bitcoin network only.) - This is inherited by the lightningd config and contains all reckless - maintained plugins.""" - - def enable_plugin(self, plugin_path: str): - """Handle persistent plugin loading via config""" - self.editConfigFile(f'plugin={plugin_path}', - f'disable-plugin={plugin_path}') - - def disable_plugin(self, plugin_path: str): - """Handle persistent plugin disabling via config""" - self.editConfigFile(f'disable-plugin={plugin_path}', - f'plugin={plugin_path}') - - def __init__(self, path: Union[str, None] = None, - default_text: Union[str, None] = None): - if path is None: - path = Path(LIGHTNING_DIR) / 'reckless' / 'bitcoin-reckless.conf' - if default_text is None: - default_text = ( - '# This configuration file is managed by reckless to activate ' - 'and disable\n# reckless-installed plugins\n\n' - ) - Config.__init__(self, path=str(path), default_text=default_text) - self.reckless_dir = Path(path).parent - - -class LightningBitcoinConfig(Config): - """lightningd config specific to the bitcoin network. This is inherited by - the main lightningd config and in turn, inherits bitcoin-reckless.conf.""" - - def __init__(self, path: Union[str, None] = None, - default_text: Union[str, None] = None, - warn: bool = True): - if path is None: - path = Path(LIGHTNING_DIR).joinpath('bitcoin', 'config') - if default_text is None: - default_text = "# This config was autopopulated by reckless\n\n" - Config.__init__(self, path=str(path), - default_text=default_text, warn=warn) - - -class NotFoundError(Exception): - """Raised by InferInstall when a source/entrypoint cannot be located.""" - - -class InferInstall(): - """Once a plugin is installed, we may need its directory and entrypoint""" - def __init__(self, name: str): - reck_contents = os.listdir(RECKLESS_CONFIG.reckless_dir) - reck_contents_lower = {} - for f in reck_contents: - reck_contents_lower.update({f.lower(): f}) - - def match_name(name) -> str: - for tier in range(0, 10): - # Look for each installers preferred entrypoint format first - for inst in INSTALLERS: - # All of this installer's entrypoint options exhausted. - if tier >= len(inst.entries): - continue - fmt = inst.entries[tier] - if '{name}' in fmt: - pre = fmt.split('{name}')[0] - post = fmt.split('{name}')[-1] - if name.startswith(pre) and name.endswith(post): - return name.lstrip(pre).rstrip(post) - else: - if fmt == name: - return name - return name - - name = match_name(name) - if name.lower() in reck_contents_lower.keys(): - actual_name = reck_contents_lower[name.lower()] - self.dir = Path(RECKLESS_CONFIG.reckless_dir).joinpath(actual_name) - else: - raise NotFoundError("Could not find a reckless directory " - f"for {name}") - plug_dir = Path(RECKLESS_CONFIG.reckless_dir).joinpath(actual_name) - for guess in entry_guesses(actual_name): - for content in plug_dir.iterdir(): - if content.name == guess: - self.entry = str(content) - self.name = actual_name - return - raise NotFoundError(f'plugin entrypoint not found in {self.dir}') - - -class InstallationFailure(Exception): - "raised when pip fails to complete dependency installation" - - -def create_python3_venv(staged_plugin: InstInfo) -> InstInfo: - "Create a virtual environment, install dependencies and test plugin." - env_path = Path('.venv') - env_path_full = Path(staged_plugin.source_loc) / env_path - assert staged_plugin.subdir # relative dir of original source - plugin_path = Path(staged_plugin.source_loc) / staged_plugin.subdir - - if shutil.which('poetry') and staged_plugin.deps == 'pyproject.toml': - log.debug('configuring a python virtual environment (poetry) in ' - f'{env_path_full}') - # The virtual environment should be located with the plugin. - # This installs it to .venv instead of in the global location. - mod_poetry_env = os.environ - mod_poetry_env['POETRY_VIRTUALENVS_IN_PROJECT'] = 'true' - # This ensures poetry installs to a new venv even though one may - # already be active (i.e., under CI) - if 'VIRTUAL_ENV' in mod_poetry_env: - del mod_poetry_env['VIRTUAL_ENV'] - # to avoid relocating and breaking the venv, symlink pyroject.toml - # to the location of poetry's .venv dir - (Path(staged_plugin.source_loc) / 'pyproject.toml') \ - .symlink_to(plugin_path / 'pyproject.toml') - (Path(staged_plugin.source_loc) / 'poetry.lock') \ - .symlink_to(plugin_path / 'poetry.lock') - - # Avoid redirecting stdout in order to stream progress. - # Timeout excluded as armv7 grpcio build/install can take 1hr. - pip = run(['poetry', 'install', '--no-root'], check=False, - cwd=staged_plugin.source_loc, env=mod_poetry_env, - stdout=stdout_redirect, stderr=stderr_redirect) - - (Path(staged_plugin.source_loc) / 'pyproject.toml').unlink() - (Path(staged_plugin.source_loc) / 'poetry.lock').unlink() - - else: - builder = venv.EnvBuilder(with_pip=True) - builder.create(env_path_full) - log.debug('configuring a python virtual environment (pip) in ' - f'{env_path_full}') - log.debug(f'virtual environment created in {env_path_full}.') - if staged_plugin.deps == 'pyproject.toml': - pip = run(['bin/pip', 'install', str(plugin_path)], - check=False, cwd=plugin_path) - elif staged_plugin.deps == 'requirements.txt': - pip = run([str(env_path_full / 'bin/pip'), 'install', '-r', - str(plugin_path / 'requirements.txt')], - check=False, cwd=plugin_path, - stdout=stdout_redirect, stderr=stderr_redirect) - else: - log.debug("no python dependency file") - if pip and pip.returncode != 0: - log.error('error encountered installing dependencies') - raise InstallationFailure - - staged_plugin.venv = env_path - log.info('dependencies installed successfully') - return staged_plugin - - -def create_wrapper(plugin: InstInfo): - '''The wrapper will activate the virtual environment for this plugin and - then run the plugin from within the same process.''' - assert hasattr(plugin, 'venv') - venv_full_path = Path(plugin.source_loc) / plugin.venv - with open(Path(plugin.source_loc) / plugin.entry, 'w') as wrapper: - wrapper.write((f"#!{venv_full_path}/bin/python\n" - "import sys\n" - "import runpy\n\n" - f"if '{plugin.source_loc}/{plugin.subdir}' not in " - "sys.path:\n" - f" sys.path.append('{plugin.source_loc}/" - f"{plugin.subdir}')\n" - f"if '{plugin.source_loc}' in sys.path:\n" - f" sys.path.remove('{plugin.source_loc}')\n" - f"runpy.run_module(\"{plugin.name}\", " - "{}, \"__main__\")")) - wrapper_file = Path(plugin.source_loc) / plugin.entry - wrapper_file.chmod(0o755) - - -def install_to_python_virtual_environment(cloned_plugin: InstInfo): - '''Called during install in place of a subprocess.run list''' - # Delete symlink so that a venv wrapper can take it's place - (Path(cloned_plugin.source_loc) / cloned_plugin.entry).unlink() - create_python3_venv(cloned_plugin) - if not hasattr(cloned_plugin, 'venv'): - raise InstallationFailure - log.debug('virtual environment for cloned plugin: ' - f'{cloned_plugin.venv}') - create_wrapper(cloned_plugin) - return cloned_plugin - - -def cargo_installation(cloned_plugin: InstInfo): - call = ['cargo', 'build', '--release', '-vv'] - # FIXME: the symlinked Cargo.toml allows the installer to identify a valid - # plugin directory, but is unneeded, and actually confuses cargo if not - # removed prior to installing. - cargo_toml_path = Path(cloned_plugin.source_loc) / 'Cargo.toml' - if cargo_toml_path.exists(): - cargo_toml_path.unlink() - - # source_loc now contains a symlink to the entrypoint and 'source/plugin/' - source = Path(cloned_plugin.source_loc) / 'source' / cloned_plugin.name - log.debug(f'cargo installing from {source}') - if logging.root.level < logging.INFO and not log.capture: - cargo = run(call, cwd=str(source), text=True) - else: - cargo = run(call, cwd=str(source), stdout=PIPE, - stderr=PIPE, text=True) - - if cargo.returncode == 0: - log.debug('rust project compiled successfully') - else: - log.error(cargo.stderr if cargo.stderr else - 'error encountered during build, cargo exited with return ' - f'code {cargo.returncode}') - - log.debug(f'removing {cloned_plugin.source_loc}') - remove_dir(cloned_plugin.source_loc) - raise InstallationFailure - - # We do need to symlink to the executable binary though. - (Path(cloned_plugin.source_loc) / cloned_plugin.name).\ - symlink_to(source / f'target/release/{cloned_plugin.name}') - cloned_plugin.entry = cloned_plugin.name - - return cloned_plugin - - -def install_python_uv(cloned_plugin: InstInfo): - """This uses the rust-based python plugin manager uv to manage the python - installation and create a virtual environment.""" - - source = Path(cloned_plugin.source_loc) / 'source' / cloned_plugin.name - # This virtual env path matches the other python installations and allows - # creating the wrapper in the same manner. Otherwise uv would build it in - # the source/{name} subdirectory. - cloned_plugin.venv = Path('.venv') - - # We want the virtual env at the head of our directory structure and uv - # will need a pyproject.toml there in order to get started. - (Path(cloned_plugin.source_loc) / 'pyproject.toml').\ - symlink_to(source / 'pyproject.toml') - - call = ['uv', '-v', 'sync'] - uv = run(call, cwd=str(cloned_plugin.source_loc), stdout=PIPE, stderr=PIPE, - text=True, check=False) - if uv.returncode != 0: - for line in uv.stderr.splitlines(): - log.debug(line) - log.error('Failed to install virtual environment') - raise InstallationFailure('Failed to create virtual environment!') - - # Delete entrypoint symlink so that a venv wrapper can take it's place - (Path(cloned_plugin.source_loc) / cloned_plugin.entry).unlink() - - create_wrapper(cloned_plugin) - return cloned_plugin - - -def install_python_uv_legacy(cloned_plugin: InstInfo): - """Install a python plugin with uv that was created with a requirements.txt. - This requires creating a bare virtual environment with uv first.""" - source = Path(cloned_plugin.source_loc) / 'source' / cloned_plugin.name - cloned_plugin.venv = Path('.venv') - (Path(cloned_plugin.source_loc) / 'pyproject.toml').\ - symlink_to(source / 'pyproject.toml') - (Path(cloned_plugin.source_loc) / 'requirements.txt').\ - symlink_to(source / 'requirements.txt') - - venv = run(['uv', 'venv'], cwd=str(cloned_plugin.source_loc), - stdout=PIPE, stderr=PIPE, text=True, check=False) - if venv.returncode != 0: - for line in venv.stderr.splitlines(): - log.debug(line) - log.error('Failed to create virtual environment') - raise InstallationFailure('Failed to create virtual environment!') - for line in venv.stdout.splitlines(): - log.debug(line) - for line in venv.stderr.splitlines(): - log.debug(line) - # Running this as a shell allows overriding any active virtual environment - # which would make uv skip installing packages already present in the - # current env. - call = ['. .venv/bin/activate; uv pip install -r requirements.txt'] - uv = run(call, shell=True, cwd=str(cloned_plugin.source_loc), - stdout=PIPE, stderr=PIPE, text=True, check=False) - if uv.returncode != 0: - for line in uv.stderr.splitlines(): - log.debug(line) - log.error('Failed to install virtual environment') - raise InstallationFailure('Failed to create virtual environment!') - for line in uv.stdout.splitlines(): - log.debug(line) - for line in uv.stderr.splitlines(): - log.debug(line) - - # Delete entrypoint symlink so that a venv wrapper can take it's place - (Path(cloned_plugin.source_loc) / cloned_plugin.entry).unlink() - - create_wrapper(cloned_plugin) - log.info('dependencies installed successfully') - return cloned_plugin - - -python3venv = Installer('python3venv', exe='python3', - manager='pip', entry='{name}.py') -python3venv.add_entrypoint('{name}') -python3venv.add_entrypoint('__init__.py') -python3venv.add_dependency_file('requirements.txt') -python3venv.dependency_call = install_to_python_virtual_environment - -poetryvenv = Installer('poetryvenv', exe='python3', - manager='poetry', entry='{name}.py') -poetryvenv.add_entrypoint('{name}') -poetryvenv.add_entrypoint('__init__.py') -poetryvenv.add_dependency_file('poetry.lock') -poetryvenv.add_dependency_file('pyproject.toml') -poetryvenv.dependency_call = install_to_python_virtual_environment - -pyprojectViaPip = Installer('pyprojectViaPip', exe='python3', - manager='pip', entry='{name}.py') -pyprojectViaPip.add_entrypoint('{name}') -pyprojectViaPip.add_entrypoint('__init__.py') -pyprojectViaPip.add_dependency_file('pyproject.toml') -pyprojectViaPip.dependency_call = install_to_python_virtual_environment - -pythonuv = Installer('pythonuv', exe='python3', manager='uv', entry="{name}.py") -pythonuv.add_dependency_file('uv.lock') -pythonuv.dependency_call = install_python_uv - -pythonuvlegacy = Installer('pythonuvlegacy', exe='python3', manager='uv', entry='{name}.py') -pythonuvlegacy.add_dependency_file('requirements.txt') -pythonuvlegacy.dependency_call = install_python_uv_legacy - -# Nodejs plugin installer -nodejs = Installer('nodejs', exe='node', - manager='npm', entry='{name}.js') -nodejs.add_entrypoint('{name}') -nodejs.add_dependency_call(['npm', 'install', '--omit=dev']) -nodejs.add_dependency_file('package.json') - -# This entrypoint is used to identify a candidate directory, don't call it. -rust_cargo = Installer('rust', manager='cargo', entry='Cargo.toml') -rust_cargo.add_dependency_file('Cargo.toml') -rust_cargo.dependency_call = cargo_installation - -INSTALLERS = [pythonuv, pythonuvlegacy, python3venv, poetryvenv, - pyprojectViaPip, nodejs, rust_cargo] - - -def help_alias(targets: list): - if len(targets) == 0: - parser.print_help(sys.stdout) - else: - log.info('try "reckless {} -h"'.format(' '.join(targets))) - sys.exit(1) - - -def _source_search(name: str, src: str) -> Union[InstInfo, None]: - """Identify source type, retrieve contents, and populate InstInfo - if the relevant contents are found.""" - root_dir = SourceDir(src) - source = InstInfo(name, root_dir.location, None) - - # If a local clone of a github source already exists, prefer searching - # that instead of accessing the github API. - if source.srctype == Source.GITHUB_REPO: - # Do we have a local copy already? Use that. - user, repo = Source.get_github_user_repo(src) - assert user - assert repo - local_clone_location = RECKLESS_DIR / '.remote_sources' / user / repo - if local_clone_location.exists(): - # Make sure it's the correct remote source and fetch any updates. - if _git_update(source, local_clone_location): - log.debug(f"Using local clone of {src}: " - f"{local_clone_location}") - source.source_loc = str(local_clone_location) - source.srctype = Source.GIT_LOCAL_CLONE - - if source.get_inst_details(): - return source - return None - - -def _git_clone(src: InstInfo, dest: Union[PosixPath, str]) -> bool: - log.info(f'cloning {src.srctype} {src}') - if src.srctype == Source.GITHUB_REPO: - assert 'github.com' in src.source_loc - source = f"{GITHUB_COM}" + src.source_loc.split("github.com")[-1] - elif src.srctype in [Source.LOCAL_REPO, Source.OTHER_URL, - Source.GIT_LOCAL_CLONE]: - source = src.source_loc - else: - return False - git = run(['git', 'clone', '--recurse-submodules', source, str(dest)], - stdout=PIPE, stderr=PIPE, text=True, check=False, timeout=180) - if git.returncode != 0: - for line in git.stderr.splitlines(): - log.debug(line) - if Path(dest).exists(): - remove_dir(str(dest)) - log.error('Failed to clone repo') - return False - return True - - -def _git_update(github_source: InstInfo, local_copy: PosixPath): - # Ensure this is the correct source - git = run(['git', 'remote', 'set-url', 'origin', github_source.source_loc], - cwd=str(local_copy), stdout=PIPE, stderr=PIPE, text=True, - check=False, timeout=60) - assert git.returncode == 0 - if git.returncode != 0: - return False - - # Fetch the latest from the remote - git = run(['git', 'fetch', 'origin', '--recurse-submodules=on-demand'], - cwd=str(local_copy), stdout=PIPE, stderr=PIPE, text=True, - check=False, timeout=60) - assert git.returncode == 0 - if git.returncode != 0: - return False - - # Find default branch - git = run(['git', 'symbolic-ref', 'refs/remotes/origin/HEAD', '--short'], - cwd=str(local_copy), stdout=PIPE, stderr=PIPE, text=True, - check=False, timeout=60) - assert git.returncode == 0 - if git.returncode != 0: - return False - default_branch = git.stdout.splitlines()[0] - if default_branch != 'origin/master': - log.debug(f'UNUSUAL: fetched default branch {default_branch} for ' - f'{github_source.source_loc}') - - # Checkout default branch - git = run(['git', 'checkout', default_branch], - cwd=str(local_copy), stdout=PIPE, stderr=PIPE, text=True, - check=False, timeout=60) - assert git.returncode == 0 - if git.returncode != 0: - return False - - return True - - -def get_temp_reckless_dir() -> PosixPath: - random_dir = 'reckless-{}'.format(str(hash(os.times()))[-9:]) - new_path = Path(tempfile.mkdtemp(prefix=random_dir)) - return new_path - - -def add_installation_metadata(installed: InstInfo, - original_request: InstInfo): - """Document the install request and installation details for use when - updating the plugin.""" - install_dir = Path(installed.source_loc) - assert install_dir.is_dir() - if urlparse(original_request.source_loc).scheme in ['http', 'https']: - abs_source_path = original_request.source_loc - else: - abs_source_path = Path(original_request.source_loc).resolve() - data = ('installation date\n' - f'{datetime.date.today().isoformat()}\n' - 'installation time\n' - f'{int(time.time())}\n' - 'original source\n' - f'{abs_source_path}\n' - 'requested commit\n' - f'{original_request.commit}\n' - 'installed commit\n' - f'{installed.commit}\n') - with open(install_dir / '.metadata', 'w') as metadata: - metadata.write(data) - - -def _checkout_commit(orig_src: InstInfo, - cloned_src: InstInfo, - cloned_path: PosixPath): - # Check out and verify commit/tag if source was a repository - if orig_src.srctype in [Source.LOCAL_REPO, Source.GITHUB_REPO, - Source.OTHER_URL, Source.GIT_LOCAL_CLONE]: - if orig_src.commit: - log.debug(f"Checking out {orig_src.commit}") - checkout = Popen(['git', 'checkout', orig_src.commit], - cwd=str(cloned_path), - stdout=PIPE, stderr=PIPE) - checkout.wait() - if checkout.returncode != 0: - log.warning('failed to checkout referenced ' - f'commit {orig_src.commit}') - return None - else: - log.debug("using latest commit of default branch") - - # Log the commit we actually used (for installation metadata) - git = run(['git', 'rev-parse', 'HEAD'], cwd=str(cloned_path), - stdout=PIPE, stderr=PIPE, text=True, check=False, timeout=60) - if git.returncode == 0: - head_commit = git.stdout.splitlines()[0] - log.debug(f'checked out HEAD: {head_commit}') - cloned_src.commit = head_commit - else: - log.debug(f'unable to collect commit: {git.stderr}') - else: - if orig_src.commit: - log.warning("unable to checkout commit/tag on non-repository " - "source") - return cloned_path - - if cloned_src.subdir is not None: - return Path(cloned_src.source_loc) / cloned_src.subdir - return cloned_path - - -def _install_plugin(src: InstInfo) -> Union[InstInfo, None]: - """make sure the repo exists and clone it.""" - log.debug(f'Install requested from {src}.') - if RECKLESS_CONFIG is None: - log.error('reckless install directory unavailable') - return None - - # Use a unique directory for each cloned repo. - tmp_path = get_temp_reckless_dir() - if not create_dir(tmp_path): - log.debug(f'failed to create {tmp_path}') - return None - clone_path = tmp_path / 'clone' - if not create_dir(tmp_path): - log.debug(f'failed to create {clone_path}') - return None - # we rename the original repo here. - plugin_path = clone_path / src.name - inst_path = Path(RECKLESS_CONFIG.reckless_dir) / src.name - if Path(clone_path).exists(): - log.debug(f'{clone_path} already exists - deleting') - shutil.rmtree(clone_path) - if src.srctype == Source.DIRECTORY: - full_source_path = Path(src.source_loc) - if src.subdir: - full_source_path /= src.subdir - log.debug(("copying local directory contents from" - f" {full_source_path}")) - create_dir(clone_path) - shutil.copytree(full_source_path, plugin_path) - elif src.srctype in [Source.LOCAL_REPO, Source.GITHUB_REPO, - Source.OTHER_URL, Source.GIT_LOCAL_CLONE]: - # clone git repository to /tmp/reckless-... - if not _git_clone(src, plugin_path): - return None - # FIXME: Validate path was cloned successfully. - # Depending on how we accessed the original source, there may be install - # details missing. Searching the cloned repo makes sure we have it. - cloned_src = _source_search(src.name, str(clone_path)) - log.debug(f'cloned_src: {cloned_src}') - if not cloned_src: - log.warning('failed to find plugin after cloning repo.') - return None - - # If a specific commit or tag was requested, check it out now. - plugin_path = _checkout_commit(src, cloned_src, plugin_path) - if not plugin_path: - return None - - # Find a suitable installer - INSTALLER = None - for inst_method in INSTALLERS: - if not (inst_method.installable() and inst_method.executable()): - continue - if inst_method.dependency_file is not None: - if inst_method.dependency_file not in os.listdir(plugin_path): - continue - log.debug(f"using installer {inst_method.name}") - INSTALLER = inst_method - break - if not INSTALLER: - log.warning('Could not find a suitable installer method for ' - f'{src.name}') - return None - if not cloned_src.entry: - # The plugin entrypoint may not be discernable prior to cloning. - # Need to search the newly cloned directory, not the original - cloned_src.source_loc = str(plugin_path) - - # Relocate plugin to a staging directory prior to testing - if not Path(inst_path).exists(): - log.debug(f'creating {inst_path}') - create_dir(inst_path) - if not Path(inst_path / 'source').exists(): - log.debug(f'creating {inst_path / "source"}') - create_dir(inst_path / 'source') - staging_path = inst_path / 'source' / src.name - log.debug(f'copying {plugin_path} tree to {staging_path}') - shutil.copytree(str(plugin_path), staging_path) - staged_src = cloned_src - # Because the source files are copied to a 'source' directory, the - # get_inst_details function no longer works. (dir must match plugin name) - # Set these manually instead. - staged_src.source_loc = str(inst_path) - staged_src.srctype = Source.DIRECTORY - # Use subdir to redirect the symlink to the actual executable location - staged_src.subdir = f'source/{src.name}' - # Create symlink in staging tree to redirect to the plugins entrypoint - log.debug(f"linking source {staging_path / cloned_src.entry} to " - f"{Path(staged_src.source_loc) / cloned_src.entry}") - log.debug(staged_src) - (Path(staged_src.source_loc) / cloned_src.entry).\ - symlink_to(staging_path / cloned_src.entry) - - # try it out - if INSTALLER.dependency_call: - if isinstance(INSTALLER.dependency_call, types.FunctionType): - try: - staged_src = INSTALLER.dependency_call(staged_src) - except InstallationFailure: - return None - else: - for call in INSTALLER.dependency_call: - log.debug(f"Install: invoking '{' '.join(call)}'") - if logging.root.level < logging.INFO: - pip = Popen(call, cwd=staging_path, text=True) - else: - pip = Popen(call, cwd=staging_path, stdout=PIPE, - stderr=PIPE, text=True) - pip.wait() - # FIXME: handle output of multiple calls - - if pip.returncode == 0: - log.info('dependencies installed successfully') - else: - log.error('error encountered installing dependencies') - if pip.stdout: - log.debug(pip.stdout.read()) - remove_dir(clone_path) - remove_dir(inst_path) - return None - staged_src.subdir = None - test_log = [] - try: - test = run([Path(staged_src.source_loc).joinpath(staged_src.entry)], - cwd=str(staging_path), stdout=PIPE, stderr=PIPE, - text=True, timeout=10) - for line in test.stderr.splitlines(): - test_log.append(line) - returncode = test.returncode - except TimeoutExpired: - # If the plugin is still running, it's assumed to be okay. - returncode = 0 - if returncode != 0: - log.debug("plugin testing error:") - for line in test_log: - log.debug(f' {line}') - log.error('plugin testing failed') - remove_dir(clone_path) - remove_dir(inst_path) - return None - - add_installation_metadata(staged_src, src) - log.info(f'plugin installed: {inst_path}') - remove_dir(clone_path) - return staged_src - - -def location_from_name(plugin_name: str) -> (str, str): - """Maybe the location was passed in place of the plugin name. Check - if this looks like a filepath or URL and return that as well as the - plugin name.""" - if not Path(plugin_name).exists(): - try: - parsed = urlparse(plugin_name) - if parsed.scheme in ['http', 'https']: - return (plugin_name, Path(plugin_name).with_suffix('').name) - except ValueError: - pass - # No path included, return the name only. - return (None, plugin_name) - - # Directory containing the plugin? The plugin name should match the dir. - if os.path.isdir(plugin_name): - return (Path(plugin_name).parent, Path(plugin_name).name) - - # Possibly the entrypoint itself was passed? - elif os.path.isfile(plugin_name): - if Path(plugin_name).with_suffix('').name != Path(plugin_name).parent.name or \ - not Path(plugin_name).parent.parent.exists(): - # If the directory is not named for the plugin, we can't infer what - # should be done. - # FIXME: return InstInfo with entrypoint rather than source str. - return (None, plugin_name) - # We have to make inferences as to the naming here. - return (Path(plugin_name).parent.parent, Path(plugin_name).with_suffix('').name) - - -def _enable_installed(installed: InstInfo, plugin_name: str) -> Union[str, None]: - """Enable the plugin in the active config file and dynamically activate - if a lightningd rpc is available.""" - if not installed: - log.warning(f'{plugin_name}: installation aborted') - return None - - if enable(installed.name): - return f"{installed.source_loc}" - - log.error(('dynamic activation failed: ' - f'{installed.name} not found in reckless directory')) - return None - -def install(plugin_name: str) -> Union[str, None]: - """Downloads plugin from source repos, installs and activates plugin. - Returns the location of the installed plugin or "None" in the case of - failure.""" - assert isinstance(plugin_name, str) - # Specify a tag or commit to checkout by adding @ to plugin name - if '@' in plugin_name: - log.debug("testing for a commit/tag in plugin name") - name, commit = plugin_name.split('@', 1) - else: - name = plugin_name - commit = None - # Is the install request specifying a path to the plugin? - direct_location, name = location_from_name(name) - src = None - if direct_location: - logging.debug(f"install of {name} requested from {direct_location}") - src = InstInfo(name, direct_location, name) - # Treating a local git repo as a directory allows testing - # uncommitted changes. - if src and src.srctype == Source.LOCAL_REPO: - src.srctype = Source.DIRECTORY - if not src.get_inst_details(): - src = None - if not direct_location or not src: - log.debug(f"Searching for {name}") - if search(name): - global LAST_FOUND - src = LAST_FOUND - LAST_FOUND = None - src.commit = commit - log.debug(f'Retrieving {src.name} from {src.source_loc}') - else: - LAST_FOUND = None - return None - - try: - installed = _install_plugin(src) - except FileExistsError as err: - log.error(f'File exists: {err.filename}') - return None - return _enable_installed(installed, plugin_name) - - - -def uninstall(plugin_name: str) -> str: - """dDisables plugin and deletes the plugin's reckless dir. Returns the - status of the uninstall attempt.""" - assert isinstance(plugin_name, str) - log.debug(f'Uninstalling plugin {plugin_name}') - disable(plugin_name) - try: - inst = InferInstall(plugin_name) - except NotFoundError as err: - log.error(err) - return "uninstall failed" - if not Path(inst.entry).exists(): - log.error("cannot find installed plugin at expected path" - f"{inst.entry}") - return "uninstall failed" - log.debug(f'looking for {str(Path(inst.entry).parent)}') - if remove_dir(str(Path(inst.entry).parent)): - log.info(f"{inst.name} uninstalled successfully.") - else: - return "uninstall failed" - return "uninstalled" - - -def _get_all_plugins_from_source(src: str) -> list: - """Get all plugin directories from a source repository. - Returns a list of (plugin_name, source_url) tuples.""" - plugins = [] - srctype = Source.get_type(src) - if srctype == Source.UNKNOWN: - return plugins - - try: - root = SourceDir(src, srctype=srctype) - root.populate() - except Exception as e: - log.debug(f"Failed to populate source {src}: {e}") - return plugins - - plugins.append((root.name, src)) - - for item in root.contents: - if isinstance(item, SourceDir): - # Skip archive directories - if 'archive' in item.name.lower(): - continue - plugins.append((item.name, src)) - return plugins - - -def search(plugin_name: str) -> Union[InstInfo, None]: - """searches plugin index for plugin""" - ordered_sources = RECKLESS_SOURCES.copy() - - for src in RECKLESS_SOURCES: - # Search repos named after the plugin before collections - if Source.get_type(src) == Source.GITHUB_REPO: - if src.split('/')[-1].lower() == plugin_name.lower(): - ordered_sources.remove(src) - ordered_sources.insert(0, src) - # Check locally before reaching out to remote repositories - for src in RECKLESS_SOURCES: - if Source.get_type(src) in [Source.DIRECTORY, Source.LOCAL_REPO]: - ordered_sources.remove(src) - ordered_sources.insert(0, src) - - # First, collect all partial matches to display to user - partial_matches = [] - for source in ordered_sources: - for plugin_name_found, src_url in _get_all_plugins_from_source(source): - if plugin_name.lower() in plugin_name_found.lower(): - partial_matches.append((plugin_name_found, src_url)) - - # Display all partial matches - if partial_matches: - log.info(f"Plugins matching '{plugin_name}':") - for name, src_url in partial_matches: - log.info(f" {name} ({src_url})") - - # Now try exact match for installation purposes - exact_match = None - for source in ordered_sources: - srctype = Source.get_type(source) - if srctype == Source.UNKNOWN: - log.debug(f'cannot search {srctype} {source}') - continue - if srctype in [Source.DIRECTORY, Source.LOCAL_REPO, - Source.GITHUB_REPO, Source.OTHER_URL]: - found = _source_search(plugin_name, source) - if found: - log.debug(f"{found}, {found.srctype}") - exact_match = found - break - - if exact_match: - log.info(f"found {exact_match.name} in source: {exact_match.source_loc}") - log.debug(f"entry: {exact_match.entry}") - if exact_match.subdir: - log.debug(f'sub-directory: {exact_match.subdir}') - global LAST_FOUND - # Stashing the search result saves install() a call to _source_search. - LAST_FOUND = exact_match - return str(exact_match.source_loc) - - if not partial_matches: - log.info("Search exhausted all sources") - return None - - -class RPCError(Exception): - """lightning-cli fails to connect to lightningd RPC""" - def __init__(self, err): - self.err = err - - def __str__(self): - return 'RPCError({self.err})' - - -class CLIError(Exception): - """lightningd error response""" - def __init__(self, code, message): - self.code = code - self.message = message - - def __str__(self): - return f'CLIError({self.code} {self.message})' - - -def lightning_cli(*cli_args, timeout: int = 15) -> dict: - """Interfaces with Core-Lightning via CLI using any configured options.""" - cmd = LIGHTNING_CLI_CALL.copy() - cmd.extend(cli_args) - clncli = run(cmd, stdout=PIPE, stderr=PIPE, check=False, timeout=timeout) - out = clncli.stdout.decode() - if len(out) > 0 and out[0] == '{': - # If all goes well, a json object is typically returned - out = json.loads(out.replace('\n', '')) - else: - # help, -V, etc. may not return json, so stash it here. - out = {'content': out} - if clncli.returncode == 0: - return out - if clncli.returncode == 1: - # RPC doesn't like our input - # output contains 'code' and 'message' - raise CLIError(out['code'], out['message']) - # RPC may not be available - i.e., lightningd not running, using - # alternate config. - err = clncli.stderr.decode() - raise RPCError(err) - - -def enable(plugin_name: str): - """dynamically activates plugin and adds to config (persistent)""" - assert isinstance(plugin_name, str) - try: - inst = InferInstall(plugin_name) - except NotFoundError as err: - log.error(err) - return None - path = inst.entry - if not Path(path).exists(): - log.error(f'cannot find installed plugin at expected path {path}') - return None - log.debug(f'activating {plugin_name}') - try: - lightning_cli('plugin', 'start', path) - except CLIError as err: - if 'already registered' in err.message: - log.debug(f'{inst.name} is already running') - return None - else: - log.error(f'reckless: {inst.name} failed to start!') - log.error(err) - return None - except RPCError: - log.info(('lightningd rpc unavailable. ' - 'Skipping dynamic activation.')) - RECKLESS_CONFIG.enable_plugin(path) - log.info(f'{inst.name} enabled') - return 'enabled' - - -def disable(plugin_name: str): - """reckless disable - deactivates an installed plugin""" - assert isinstance(plugin_name, str) - try: - inst = InferInstall(plugin_name) - except NotFoundError as err: - log.warning(f'failed to disable: {err}') - return None - path = inst.entry - if not Path(path).exists(): - sys.stderr.write(f'Could not find plugin at {path}\n') - return None - log.debug(f'deactivating {plugin_name}') - try: - lightning_cli('plugin', 'stop', path) - except CLIError as err: - if err.code == -32602: - log.debug('plugin not currently running') - else: - log.error('lightning-cli plugin stop failed') - logging.error(err) - return None - except RPCError: - log.debug(('lightningd rpc unavailable. ' - 'Skipping dynamic deactivation.')) - RECKLESS_CONFIG.disable_plugin(path) - log.info(f'{inst.name} disabled') - return 'disabled' - - -def load_config(reckless_dir: Union[str, None] = None, - network: str = 'bitcoin') -> Config: - """Initial directory discovery and config file creation.""" - net_conf = None - # Does the lightning-cli already reference an explicit config? - try: - active_config = lightning_cli('listconfigs', timeout=10)['configs'] - if 'conf' in active_config: - net_conf = LightningBitcoinConfig(path=active_config['conf'] - ['value_str']) - except RPCError: - pass - if reckless_dir is None: - reckless_dir = Path(LIGHTNING_DIR) / 'reckless' - else: - if not os.path.isabs(reckless_dir): - reckless_dir = Path.cwd() / reckless_dir - if LIGHTNING_CONFIG: - network_path = LIGHTNING_CONFIG - else: - network_path = Path(LIGHTNING_DIR) / network / 'config' - reck_conf_path = Path(reckless_dir) / f'{network}-reckless.conf' - if net_conf: - if str(network_path) != net_conf.conf_fp: - reckless_abort('reckless configuration does not match lightningd:\n' - f'reckless network config path: {network_path}\n' - f'lightningd active config: {net_conf.conf_fp}') - else: - # The network-specific config file (bitcoin by default) - net_conf = LightningBitcoinConfig(path=network_path) - # Reckless manages plugins here. - try: - reckless_conf = RecklessConfig(path=reck_conf_path) - except FileNotFoundError: - reckless_abort('reckless config file could not be written: ' - + str(reck_conf_path)) - if not net_conf: - reckless_abort('Error: could not load or create the network specific lightningd' - ' config (default .lightning/bitcoin)') - net_conf.editConfigFile(f'include {reckless_conf.conf_fp}', None) - return reckless_conf - - -def get_sources_file() -> str: - return str(RECKLESS_DIR / '.sources') - - -def sources_from_file() -> list: - sources_file = get_sources_file() - read_sources = [] - with open(sources_file, 'r') as f: - for src in f.readlines(): - if len(src.strip()) > 0: - read_sources.append(src.strip()) - return read_sources - - -def load_sources() -> list: - """Look for the repo sources file.""" - sources_file = get_sources_file() - # This would have been created if possible - if not Path(sources_file).exists(): - log.debug('Warning: Reckless requires write access') - Config(path=str(sources_file), - default_text='https://github.com/lightningd/plugins') - return ['https://github.com/lightningd/plugins'] - return sources_from_file() - - -def add_source(src: str): - """Additional git repositories, directories, etc. are passed here.""" - assert isinstance(src, str) - # Is it a file? - maybe_path = os.path.realpath(src) - sources = Config(path=str(get_sources_file()), - default_text='https://github.com/lightningd/plugins') - if Path(maybe_path).exists(): - if os.path.isdir(maybe_path): - sources.editConfigFile(src, None) - elif 'github.com' in src or 'http://' in src or 'https://' in src: - sources.editConfigFile(src, None) - else: - log.warning(f'failed to add source {src}') - return None - return sources_from_file() - - -def remove_source(src: str): - """Remove a source from the sources file.""" - assert isinstance(src, str) - if src in sources_from_file(): - my_file = Config(path=get_sources_file(), - default_text='https://github.com/lightningd/plugins') - my_file.editConfigFile(None, src) - log.info('plugin source removed') - else: - log.warning(f'source not found: {src}') - return sources_from_file() - - -def list_source(): - """Provide the user with all stored source repositories.""" - for src in sources_from_file(): - log.info(src) - return sources_from_file() - - -class UpdateStatus(Enum): - SUCCESS = 0 - LATEST = 1 - UNINSTALLED = 2 - ERROR = 3 - METADATA_MISSING = 4 - REFUSING_UPDATE = 5 - - -def update_plugin(plugin_name: str) -> tuple: - """Check for an installed plugin, if metadata for it exists, update - to the latest available while using the same source.""" - log.info(f"updating {plugin_name}") - if not (Path(RECKLESS_CONFIG.reckless_dir) / plugin_name).exists(): - log.error(f'{plugin_name} is not installed') - return (None, UpdateStatus.UNINSTALLED) - metadata_file = Path(RECKLESS_CONFIG.reckless_dir) / plugin_name / '.metadata' - if not metadata_file.exists(): - log.warning(f"no metadata file for {plugin_name}") - return (None, UpdateStatus.METADATA_MISSING) - - metadata = {'installation date': None, - 'installation time': None, - 'original source': None, - 'requested commit': None, - 'installed commit': None, - } - with open(metadata_file, "r") as meta: - metadata_lines = meta.readlines() - for line_no, line in enumerate(metadata_lines): - if line_no > 0 and metadata_lines[line_no - 1].strip() in metadata: - metadata.update({metadata_lines[line_no - 1].strip(): line.strip()}) - for key in metadata: - if metadata[key].lower() == 'none': - metadata[key] = None - log.debug(f'{plugin_name} previous installation metadata: {str(metadata)}') - if metadata['requested commit']: - log.warning(f'refusing to upgrade {plugin_name}@{metadata["requested commit"]} due to previously requested tag/commit') - return (None, UpdateStatus.REFUSING_UPDATE) - - src = InstInfo(plugin_name, - metadata['original source'], None) - if not src.get_inst_details(): - log.error(f'cannot locate {plugin_name} in original source {metadata["original_source"]}') - return (None, UpdateStatus.ERROR) - repo_commit = src.get_repo_commit() - if not repo_commit: - log.debug('source commit not available') - else: - log.debug(f'source commit: {repo_commit}') - if repo_commit and repo_commit == metadata['installed commit']: - log.info(f'Installed {plugin_name} is already latest @{repo_commit}') - return (None, UpdateStatus.LATEST) - uninstall(plugin_name) - try: - installed = _install_plugin(src) - except FileExistsError as err: - log.error(f'File exists: {err.filename}') - return (None, UpdateStatus.ERROR) - result = _enable_installed(installed, plugin_name) - if result: - return (result, UpdateStatus.SUCCESS) - return (result, UpdateStatus.ERROR) - - -def update_plugins(plugin_name: str): - """user requested plugin upgrade(s)""" - if plugin_name: - installed = update_plugin(plugin_name) - if not installed[0] and installed[1] != UpdateStatus.LATEST: - log.error(f'{plugin_name} update aborted') - return installed[0] - - log.info("updating all plugins") - update_results = [] - for plugin in os.listdir(RECKLESS_CONFIG.reckless_dir): - if not (Path(RECKLESS_CONFIG.reckless_dir) / plugin).is_dir(): - continue - if len(plugin) > 0 and plugin[0] == '.': - continue - update_results.append(update_plugin(plugin)[0]) - return update_results - - -def report_version() -> str: - """return reckless version""" - log.info(__VERSION__) - log.add_result(__VERSION__) - - -def unpack_json_arg(json_target: str) -> list: - """validate json for any command line targets passes as a json array""" - try: - targets = json.loads(json_target) - except json.decoder.JSONDecodeError: - return None - if isinstance(targets, list): - return targets - log.warning(f'input {target_list} is not a json array') - return None - - -class StoreIdempotent(argparse.Action): - """Make the option idempotent. This adds a secondary argument that doesn't - get reinitialized. The downside is it""" - def __init__(self, option_strings, dest, nargs=None, **kwargs): - super().__init__(option_strings, dest, **kwargs) - - def __call__(self, parser, namespace, values, option_string=None): - if option_string: - setattr(namespace, self.dest, values) - setattr(namespace, f'{self.dest}_idempotent', values) - - -class StoreTrueIdempotent(argparse._StoreConstAction): - """Make the option idempotent""" - def __init__(self, option_strings, dest, default=False, - required=False, nargs=None, const=None, help=None): - super().__init__(option_strings=option_strings, dest=dest, - const=const, help=help) - - def __call__(self, parser, namespace, values, option_string=None): - if option_string: - setattr(namespace, self.dest, True) - setattr(namespace, f'{self.dest}_idempotent', True) - - -def process_idempotent_args(args): - """Swap idempotently set arguments back in for the default arg names.""" - original_args = dict(vars(args)) - for arg, value in original_args.items(): - if f"{arg}_idempotent" in vars(args): - setattr(args, f"{arg}", vars(args)[f"{arg}_idempotent"]) - delattr(args, f"{arg}_idempotent") - return args - - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - cmd1 = parser.add_subparsers(dest='cmd1', help='command', - required=False) - - install_cmd = cmd1.add_parser('install', help='search for and install a ' - 'plugin, then test and activate') - install_cmd.add_argument('targets', type=str, nargs='*') - install_cmd.set_defaults(func=install) - - uninstall_cmd = cmd1.add_parser('uninstall', help='deactivate a plugin ' - 'and remove it from the directory') - uninstall_cmd.add_argument('targets', type=str, nargs='*') - uninstall_cmd.set_defaults(func=uninstall) - - search_cmd = cmd1.add_parser('search', help='search for a plugin from ' - 'the available source repositories') - search_cmd.add_argument('targets', type=str, nargs='*') - search_cmd.set_defaults(func=search) - - enable_cmd = cmd1.add_parser('enable', help='dynamically enable a plugin ' - 'and update config') - enable_cmd.add_argument('targets', type=str, nargs='*') - enable_cmd.set_defaults(func=enable) - disable_cmd = cmd1.add_parser('disable', help='disable a plugin') - disable_cmd.add_argument('targets', type=str, nargs='*') - disable_cmd.set_defaults(func=disable) - source_parser = cmd1.add_parser('source', help='manage plugin search ' - 'sources') - source_subs = source_parser.add_subparsers(dest='source_subs', - required=True) - list_parse = source_subs.add_parser('list', help='list available plugin ' - 'sources (repositories)') - list_parse.set_defaults(func=list_source) - source_add = source_subs.add_parser('add', help='add a source repository') - source_add.add_argument('targets', type=str, nargs='*') - source_add.set_defaults(func=add_source) - source_rem = source_subs.add_parser('remove', aliases=['rem', 'rm'], - help='remove a plugin source ' - 'repository') - source_rem.add_argument('targets', type=str, nargs='*') - source_rem.set_defaults(func=remove_source) - update = cmd1.add_parser('update', help='update plugins to lastest version') - update.add_argument('targets', type=str, nargs='*') - update.set_defaults(func=update_plugins) - - help_cmd = cmd1.add_parser('help', help='for contextual help, use ' - '"reckless -h"') - help_cmd.add_argument('targets', type=str, nargs='*') - help_cmd.set_defaults(func=help_alias) - parser.add_argument('-V', '--version', - action=StoreTrueIdempotent, const=None, - help='print version and exit') - - all_parsers = [parser, install_cmd, uninstall_cmd, search_cmd, enable_cmd, - disable_cmd, list_parse, source_add, source_rem, help_cmd, - update] - for p in all_parsers: - # This default depends on the .lightning directory - p.add_argument('-d', '--reckless-dir', action=StoreIdempotent, - help='specify a data directory for reckless to use', - type=str, default=None) - p.add_argument('-l', '--lightning', type=str, action=StoreIdempotent, - help='lightning data directory ' - '(default:~/.lightning)', - default=Path.home().joinpath('.lightning')) - p.add_argument('-c', '--conf', action=StoreIdempotent, - help=' config file used by lightningd', - type=str, - default=None) - p.add_argument('-r', '--regtest', action=StoreTrueIdempotent) - p.add_argument('--network', action=StoreIdempotent, - help="specify a network to use (default: bitcoin)", - type=str) - p.add_argument('-v', '--verbose', action=StoreTrueIdempotent, - const=None) - p.add_argument('-j', '--json', action=StoreTrueIdempotent, - help='output in json format') - - args = parser.parse_args() - args = process_idempotent_args(args) - - if args.json: - log.capture = True - stdout_redirect = PIPE - stderr_redirect = PIPE - else: - stdout_redirect = None - stderr_redirect = None - - if args.verbose: - logging.root.setLevel(logging.DEBUG) - else: - logging.root.setLevel(logging.INFO) - - NETWORK = 'regtest' if args.regtest else 'bitcoin' - SUPPORTED_NETWORKS = ['bitcoin', 'regtest', 'liquid', 'liquid-regtest', - 'signet', 'testnet', 'testnet4'] - if args.version: - report_version() - elif args.cmd1 is None: - parser.print_help(sys.stdout) - sys.exit(1) - if args.network: - if args.network in SUPPORTED_NETWORKS: - NETWORK = args.network - else: - log.error(f"{args.network} network not supported") - LIGHTNING_DIR = Path(args.lightning) - # This env variable is set under CI testing - LIGHTNING_CLI_CALL = [os.environ.get('LIGHTNING_CLI')] - if LIGHTNING_CLI_CALL == [None]: - LIGHTNING_CLI_CALL = ['lightning-cli'] - if NETWORK != 'bitcoin': - LIGHTNING_CLI_CALL.append(f'--network={NETWORK}') - if LIGHTNING_DIR != Path.home().joinpath('.lightning'): - LIGHTNING_CLI_CALL.append(f'--lightning-dir={LIGHTNING_DIR}') - if args.reckless_dir: - RECKLESS_DIR = Path(args.reckless_dir) - else: - RECKLESS_DIR = Path(LIGHTNING_DIR) / 'reckless' - LIGHTNING_CONFIG = args.conf - RECKLESS_CONFIG = load_config(reckless_dir=str(RECKLESS_DIR), - network=NETWORK) - RECKLESS_SOURCES = load_sources() - API_GITHUB_COM = 'https://api.github.com' - GITHUB_COM = 'https://github.com' - # Used for blackbox testing to avoid hitting github servers - if 'REDIR_GITHUB_API' in os.environ: - API_GITHUB_COM = os.environ['REDIR_GITHUB_API'] - if 'REDIR_GITHUB' in os.environ: - GITHUB_COM = os.environ['REDIR_GITHUB'] - - GITHUB_API_FALLBACK = False - if 'GITHUB_API_FALLBACK' in os.environ: - GITHUB_API_FALLBACK = os.environ['GITHUB_API_FALLBACK'] - - if 'targets' in args: # and len(args.targets) > 0: - if args.func.__name__ == 'help_alias': - args.func(args.targets) - sys.exit(0) - # Catch a missing argument so that we can overload functions. - if len(args.targets) == 0: - args.targets=[None] - for target in args.targets: - # Accept single item arguments, or a json array - try: - target_list = unpack_json_arg(target) - if target_list: - for tar in target_list: - log.add_result(args.func(tar)) - else: - log.add_result(args.func(target)) - except TypeError: - if len(args.targets) == 1: - log.add_result(args.func(target)) - elif 'func' in args: - log.add_result(args.func()) - - if log.capture: - log.reply_json()