From 84fe3dc9408c6bc1b2169f0a8a36aacfe39a2c8d Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Sun, 6 Aug 2023 12:22:09 +0930 Subject: [PATCH 01/30] build: more 32-bit printf fixes. Reported-by: Shahana Signed-off-by: Rusty Russell --- channeld/channeld.c | 2 +- common/test/run-codex32.c | 4 ++-- plugins/renepay/test/run-payflow_map.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/channeld/channeld.c b/channeld/channeld.c index 492d8489b6d7..264d54aac11f 100644 --- a/channeld/channeld.c +++ b/channeld/channeld.c @@ -3349,7 +3349,7 @@ static void resume_splice_negotiation(struct peer *peer, if (tal_count(inws) > current_psbt->num_inputs) peer_failed_warn(peer->pps, &peer->channel_id, - "%lu too many witness elements received", + "%zu too many witness elements received", tal_count(inws) - current_psbt->num_inputs); /* We put the PSBT + sigs all together */ diff --git a/common/test/run-codex32.c b/common/test/run-codex32.c index 5e0c78041858..ab75f129af8f 100644 --- a/common/test/run-codex32.c +++ b/common/test/run-codex32.c @@ -425,7 +425,7 @@ int main(int argc, char *argv[]) for (size_t i = 0; i < ARRAY_SIZE(addr_invalid1); i++) { parts = codex32_decode(tmpctx, NULL, addr_invalid1[i], &fail); if (parts) { - printf("payload == %ld\n", tal_bytelen(parts->payload)); + printf("payload == %zu\n", tal_bytelen(parts->payload)); abort(); } else { assert(streq(fail, "Invalid checksum!") || @@ -473,7 +473,7 @@ int main(int argc, char *argv[]) for (size_t i = 0; i < ARRAY_SIZE(addr_invalid2); i++) { parts = codex32_decode(tmpctx, NULL, addr_invalid2[i], &fail); if (parts) { - printf("payload %ld\n", tal_bytelen(parts->payload)); + printf("payload %zu\n", tal_bytelen(parts->payload)); abort(); } else { assert(streq(fail, "Invalid payload!") || diff --git a/plugins/renepay/test/run-payflow_map.c b/plugins/renepay/test/run-payflow_map.c index e98eea1914b1..9627ef810ecc 100644 --- a/plugins/renepay/test/run-payflow_map.c +++ b/plugins/renepay/test/run-payflow_map.c @@ -69,8 +69,8 @@ static void valgrind_ok1(void) printf("key1 = %s\n",fmt_payflow_key(local_ctx,&p1->key)); printf("key1 = %s\n",fmt_payflow_key(local_ctx,&p2->key)); - printf("key hash 1 = %ld\n",payflow_key_hash(p1->key)); - printf("key hash 2 = %ld\n",payflow_key_hash(p2->key)); + printf("key hash 1 = %zu\n",payflow_key_hash(p1->key)); + printf("key hash 2 = %zu\n",payflow_key_hash(p2->key)); payflow_map_add(map,p1); tal_add_destructor2(p1,destroy_payflow,map); payflow_map_add(map,p2); tal_add_destructor2(p2,destroy_payflow,map); From f64aaaf943b8251e0513a03fac395314a5d4dc9b Mon Sep 17 00:00:00 2001 From: Adi Shankara Date: Thu, 3 Aug 2023 14:40:07 +0930 Subject: [PATCH 02/30] add script to sync rpc commands --- .github/scripts/sync-rpc-cmds.py | 90 ++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 .github/scripts/sync-rpc-cmds.py diff --git a/.github/scripts/sync-rpc-cmds.py b/.github/scripts/sync-rpc-cmds.py new file mode 100644 index 000000000000..b0b5bf9c6b5a --- /dev/null +++ b/.github/scripts/sync-rpc-cmds.py @@ -0,0 +1,90 @@ +import os +from time import sleep +import requests +import re + +# readme url +URL = "https://dash.readme.com/api/v1/docs" +# category id for API reference +CATEGORY_ID = "63e4e160c60b2e001dd1cc4e" + + +def checkIfDocIsPresent(title, headers): + + check_url = URL + "/" + title + response = requests.get(check_url, headers=headers) + + if (response.status_code == 200): + return True + else: + return False + + +def publishDoc(title, body, order): + key = os.environ.get('README_API_KEY') + payload = { + "title": title, + "type": "basic", + "body": body, + "category": CATEGORY_ID, + "hidden": False, + "order": order + } + headers = { + "accept": "application/json", + "content-type": "application/json", + "authorization": "Basic " + key + } + + isDocPresent = checkIfDocIsPresent(title, headers) + if (isDocPresent): + # update doc + update_url = URL + "/" + title # title == slug + response = requests.put(update_url, json=payload, headers=headers) + if (response.status_code != 200): + print(response.text) + else: + print("Updated ", title) + else: + # create doc + response = requests.post(URL, json=payload, headers=headers) + if (response.status_code != 201): + print(response.text) + else: + print("Created ", title) + + +def extract_rpc_commands(rst_content): + manpages_block = re.search + (r"\.\. block_start manpages(.*?)\.\. block_end manpages", + rst_content, re.DOTALL) + if manpages_block: + commands = re.findall + (r'\b([a-zA-Z0-9_-]+)\s+<([^>]+)>\n', + manpages_block.group(1)) + return commands + return [] + + +def main(): + # path to the rst file from where we fetch all the RPC commands + path_to_rst = 'doc/index.rst' + with open(path_to_rst, "r") as file: + rst_content = file.read() + + commands = extract_rpc_commands(rst_content) + if commands: + order = 0 + for name, file in commands: + print(f"{name}\t\t{file}") + with open("doc/" + file) as f: + body = f.read() + publishDoc(name, body, order) + order = order + 1 + sleep(3) + else: + print("No commands found in the Manpages block.") + + +if __name__ == "__main__": + main() From be829a14755067c115c5a1d6751dcfe76ad6078d Mon Sep 17 00:00:00 2001 From: Adi Shankara Date: Thu, 3 Aug 2023 14:40:48 +0930 Subject: [PATCH 03/30] add workflow to sync rpc commands --- .github/workflows/readme-rpc-sync.yml | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/readme-rpc-sync.yml diff --git a/.github/workflows/readme-rpc-sync.yml b/.github/workflows/readme-rpc-sync.yml new file mode 100644 index 000000000000..a89c19807d1f --- /dev/null +++ b/.github/workflows/readme-rpc-sync.yml @@ -0,0 +1,28 @@ +name: ReadMe RPC Sync + +on: + push: + branches: + - 'master' + paths: + - 'doc/**.md' + +jobs: + rdme-rpc-sync: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + + - name: Install requests module + run: python -m pip install requests + + - name: Set environment variable and run + env: + README_API_KEY: ${{ secrets.README_API_KEY }} + run: python .github/scripts/sync-rpc-cmds.py From 49acafe65385274c4961768a41aa948364f217cc Mon Sep 17 00:00:00 2001 From: Adi Shankara Date: Thu, 3 Aug 2023 14:43:59 +0930 Subject: [PATCH 04/30] random doc changes to test. [Moved into a separate commit --RR] --- doc/developers-guide/tracing-cln-performance.md | 2 ++ doc/lightning-offer.7.md | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/developers-guide/tracing-cln-performance.md b/doc/developers-guide/tracing-cln-performance.md index 2c80413bceb3..54d75a0268f7 100644 --- a/doc/developers-guide/tracing-cln-performance.md +++ b/doc/developers-guide/tracing-cln-performance.md @@ -78,4 +78,6 @@ Attaching 1 probe... + + Notice that due to a [limitation](https://github.com/iovisor/bpftrace/issues/305) in `bpftrace` you'll at most get the first 200 bytes of the payload. If you write your own exporter you'll be able to specify the size of the buffer that is being used, and can extract the entire span. diff --git a/doc/lightning-offer.7.md b/doc/lightning-offer.7.md index d44eaff8334e..e9cea4014260 100644 --- a/doc/lightning-offer.7.md +++ b/doc/lightning-offer.7.md @@ -16,8 +16,7 @@ one), which is a precursor to creating one or more invoices. It automatically enables the processing of an incoming invoice\_request, and issuing of invoices. -Note that for making an offer to *pay* someone else, see -lightning-invoicerequest(7). +Note that for making an offer to *pay* someone else, see lightning-invoicerequest(7). The *amount* parameter can be the string "any", which creates an offer that can be paid with any amount (e.g. a donation). Otherwise it can From 5faaa39773ccd73ecdcc0a1f14794a69a0732602 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 3 Aug 2023 10:43:54 +0930 Subject: [PATCH 05/30] docs: try to fix up readthedocs.io, so it has the latest man pages, but points to docs.corelighting.org for the rest Signed-off-by: Rusty Russell --- doc/index.rst | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/doc/index.rst b/doc/index.rst index a0eeee988913..c2f2ce237f92 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -3,27 +3,9 @@ Core Lightning Documentation .. toctree:: :maxdepth: 1 - :caption: User Documentation + :caption: Main Documentation - INSTALL.md - TOR.md - FAQ - Backups - -.. toctree:: - :maxdepth: 2 - :caption: Integrator Documentation - - Writing plugins - -.. toctree:: - :maxdepth: 1 - :caption: Developer Documentation - - HACKING.md - Coding Style Guideline - MAKING-RELEASES.md - CHANGELOG.md + https://docs.corelightning.org/docs .. toctree:: :maxdepth: 1 From aa2df28faf68dd61bf1428fac9b6941aa18cc934 Mon Sep 17 00:00:00 2001 From: Dusty Daemon Date: Thu, 3 Aug 2023 15:34:14 -0400 Subject: [PATCH 06/30] splicing: Update documentation Added documentation for splice_update & splice_signed and tweaked splice_init. Added corresponding schemas for splice_* commands Changelog-None --- contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py | 843 +++++++++--------- doc/Makefile | 3 + doc/index.rst | 2 + doc/lightning-splice_init.7.md | 4 +- doc/lightning-splice_signed.7.md | 93 ++ doc/lightning-splice_update.7.md | 106 +++ doc/schemas/splice_init.request.json | 32 + doc/schemas/splice_init.schema.json | 15 + doc/schemas/splice_signed.request.json | 24 + doc/schemas/splice_signed.schema.json | 20 + doc/schemas/splice_update.request.json | 20 + doc/schemas/splice_update.schema.json | 20 + 12 files changed, 758 insertions(+), 424 deletions(-) create mode 100644 doc/lightning-splice_signed.7.md create mode 100644 doc/lightning-splice_update.7.md create mode 100644 doc/schemas/splice_init.request.json create mode 100644 doc/schemas/splice_init.schema.json create mode 100644 doc/schemas/splice_signed.request.json create mode 100644 doc/schemas/splice_signed.schema.json create mode 100644 doc/schemas/splice_update.request.json create mode 100644 doc/schemas/splice_update.schema.json diff --git a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py index b3fde8814264..07728ed2b586 100644 --- a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py +++ b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py @@ -2,10 +2,10 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: node.proto """Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -16,428 +16,427 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nnode.proto\x12\x03\x63ln\x1a\x10primitives.proto\"\x10\n\x0eGetinfoRequest\"\xc1\x04\n\x0fGetinfoResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\x05\x61lias\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\r\n\x05\x63olor\x18\x03 \x01(\x0c\x12\x11\n\tnum_peers\x18\x04 \x01(\r\x12\x1c\n\x14num_pending_channels\x18\x05 \x01(\r\x12\x1b\n\x13num_active_channels\x18\x06 \x01(\r\x12\x1d\n\x15num_inactive_channels\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\t\x12\x15\n\rlightning_dir\x18\t \x01(\t\x12\x33\n\x0cour_features\x18\n \x01(\x0b\x32\x18.cln.GetinfoOur_featuresH\x01\x88\x01\x01\x12\x13\n\x0b\x62lockheight\x18\x0b \x01(\r\x12\x0f\n\x07network\x18\x0c \x01(\t\x12(\n\x13\x66\x65\x65s_collected_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x07\x61\x64\x64ress\x18\x0e \x03(\x0b\x32\x13.cln.GetinfoAddress\x12$\n\x07\x62inding\x18\x0f \x03(\x0b\x32\x13.cln.GetinfoBinding\x12\"\n\x15warning_bitcoind_sync\x18\x10 \x01(\tH\x02\x88\x01\x01\x12$\n\x17warning_lightningd_sync\x18\x11 \x01(\tH\x03\x88\x01\x01\x42\x08\n\x06_aliasB\x0f\n\r_our_featuresB\x18\n\x16_warning_bitcoind_syncB\x1a\n\x18_warning_lightningd_sync\"S\n\x13GetinfoOur_features\x12\x0c\n\x04init\x18\x01 \x01(\x0c\x12\x0c\n\x04node\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\x0c\x12\x0f\n\x07invoice\x18\x04 \x01(\x0c\"\xc4\x01\n\x0eGetinfoAddress\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.GetinfoAddress.GetinfoAddressType\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x00\x88\x01\x01\"G\n\x12GetinfoAddressType\x12\x07\n\x03\x44NS\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\n\n\x08_address\"\x8a\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\"_\n\x12GetinfoBindingType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\r\n\tWEBSOCKET\x10\x05\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_addressB\x07\n\x05_portB\t\n\x07_socket\"H\n\x10ListpeersRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05level\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x05\n\x03_idB\x08\n\x06_level\"7\n\x11ListpeersResponse\x12\"\n\x05peers\x18\x01 \x03(\x0b\x32\x13.cln.ListpeersPeers\"\x8e\x02\n\x0eListpeersPeers\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x11\n\tconnected\x18\x02 \x01(\x08\x12\x19\n\x0cnum_channels\x18\x08 \x01(\rH\x00\x88\x01\x01\x12#\n\x03log\x18\x03 \x03(\x0b\x32\x16.cln.ListpeersPeersLog\x12-\n\x08\x63hannels\x18\x04 \x03(\x0b\x32\x1b.cln.ListpeersPeersChannels\x12\x0f\n\x07netaddr\x18\x05 \x03(\t\x12\x18\n\x0bremote_addr\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x42\x0f\n\r_num_channelsB\x0e\n\x0c_remote_addrB\x0b\n\t_features\"\xfd\x02\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\"i\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\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\"\xd6\x17\n\x16ListpeersPeersChannels\x12\x46\n\x05state\x18\x01 \x01(\x0e\x32\x37.cln.ListpeersPeersChannels.ListpeersPeersChannelsState\x12\x19\n\x0cscratch_txid\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x38\n\x07\x66\x65\x65rate\x18\x03 \x01(\x0b\x32\".cln.ListpeersPeersChannelsFeerateH\x01\x88\x01\x01\x12\x12\n\x05owner\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x17\n\nchannel_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x19\n\x0c\x66unding_txid\x18\x07 \x01(\x0cH\x05\x88\x01\x01\x12\x1b\n\x0e\x66unding_outnum\x18\x08 \x01(\rH\x06\x88\x01\x01\x12\x1c\n\x0finitial_feerate\x18\t \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0clast_feerate\x18\n \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0cnext_feerate\x18\x0b \x01(\tH\t\x88\x01\x01\x12\x1a\n\rnext_fee_step\x18\x0c \x01(\rH\n\x88\x01\x01\x12\x35\n\x08inflight\x18\r \x03(\x0b\x32#.cln.ListpeersPeersChannelsInflight\x12\x15\n\x08\x63lose_to\x18\x0e \x01(\x0cH\x0b\x88\x01\x01\x12\x14\n\x07private\x18\x0f \x01(\x08H\x0c\x88\x01\x01\x12 \n\x06opener\x18\x10 \x01(\x0e\x32\x10.cln.ChannelSide\x12%\n\x06\x63loser\x18\x11 \x01(\x0e\x32\x10.cln.ChannelSideH\r\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x12 \x03(\t\x12\x38\n\x07\x66unding\x18\x13 \x01(\x0b\x32\".cln.ListpeersPeersChannelsFundingH\x0e\x88\x01\x01\x12$\n\nto_us_msat\x18\x14 \x01(\x0b\x32\x0b.cln.AmountH\x0f\x88\x01\x01\x12(\n\x0emin_to_us_msat\x18\x15 \x01(\x0b\x32\x0b.cln.AmountH\x10\x88\x01\x01\x12(\n\x0emax_to_us_msat\x18\x16 \x01(\x0b\x32\x0b.cln.AmountH\x11\x88\x01\x01\x12$\n\ntotal_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x12\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\x13\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x19 \x01(\rH\x14\x88\x01\x01\x12)\n\x0f\x64ust_limit_msat\x18\x1a \x01(\x0b\x32\x0b.cln.AmountH\x15\x88\x01\x01\x12\x30\n\x16max_total_htlc_in_msat\x18\x1b \x01(\x0b\x32\x0b.cln.AmountH\x16\x88\x01\x01\x12,\n\x12their_reserve_msat\x18\x1c \x01(\x0b\x32\x0b.cln.AmountH\x17\x88\x01\x01\x12*\n\x10our_reserve_msat\x18\x1d \x01(\x0b\x32\x0b.cln.AmountH\x18\x88\x01\x01\x12(\n\x0espendable_msat\x18\x1e \x01(\x0b\x32\x0b.cln.AmountH\x19\x88\x01\x01\x12)\n\x0freceivable_msat\x18\x1f \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\x30 \x01(\x0b\x32\x0b.cln.AmountH\x1c\x88\x01\x01\x12/\n\x15maximum_htlc_out_msat\x18\x31 \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\x34\n\x05\x61lias\x18\x32 \x01(\x0b\x32 .cln.ListpeersPeersChannelsAliasH!\x88\x01\x01\x12\x0e\n\x06status\x18% \x03(\t\x12 \n\x13in_payments_offered\x18& \x01(\x04H\"\x88\x01\x01\x12)\n\x0fin_offered_msat\x18\' \x01(\x0b\x32\x0b.cln.AmountH#\x88\x01\x01\x12\"\n\x15in_payments_fulfilled\x18( \x01(\x04H$\x88\x01\x01\x12+\n\x11in_fulfilled_msat\x18) \x01(\x0b\x32\x0b.cln.AmountH%\x88\x01\x01\x12!\n\x14out_payments_offered\x18* \x01(\x04H&\x88\x01\x01\x12*\n\x10out_offered_msat\x18+ \x01(\x0b\x32\x0b.cln.AmountH\'\x88\x01\x01\x12#\n\x16out_payments_fulfilled\x18, \x01(\x04H(\x88\x01\x01\x12,\n\x12out_fulfilled_msat\x18- \x01(\x0b\x32\x0b.cln.AmountH)\x88\x01\x01\x12/\n\x05htlcs\x18. \x03(\x0b\x32 .cln.ListpeersPeersChannelsHtlcs\x12\x1a\n\rclose_to_addr\x18/ \x01(\tH*\x88\x01\x01\"\xa1\x02\n\x1bListpeersPeersChannelsState\x12\x0c\n\x08OPENINGD\x10\x00\x12\x1c\n\x18\x43HANNELD_AWAITING_LOCKIN\x10\x01\x12\x13\n\x0f\x43HANNELD_NORMAL\x10\x02\x12\x1a\n\x16\x43HANNELD_SHUTTING_DOWN\x10\x03\x12\x18\n\x14\x43LOSINGD_SIGEXCHANGE\x10\x04\x12\x15\n\x11\x43LOSINGD_COMPLETE\x10\x05\x12\x17\n\x13\x41WAITING_UNILATERAL\x10\x06\x12\x16\n\x12\x46UNDING_SPEND_SEEN\x10\x07\x12\x0b\n\x07ONCHAIN\x10\x08\x12\x17\n\x13\x44UALOPEND_OPEN_INIT\x10\t\x12\x1d\n\x19\x44UALOPEND_AWAITING_LOCKIN\x10\nB\x0f\n\r_scratch_txidB\n\n\x08_feerateB\x08\n\x06_ownerB\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x0f\n\r_funding_txidB\x11\n\x0f_funding_outnumB\x12\n\x10_initial_feerateB\x0f\n\r_last_feerateB\x0f\n\r_next_feerateB\x10\n\x0e_next_fee_stepB\x0b\n\t_close_toB\n\n\x08_privateB\t\n\x07_closerB\n\n\x08_fundingB\r\n\x0b_to_us_msatB\x11\n\x0f_min_to_us_msatB\x11\n\x0f_max_to_us_msatB\r\n\x0b_total_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x12\n\x10_dust_limit_msatB\x19\n\x17_max_total_htlc_in_msatB\x15\n\x13_their_reserve_msatB\x13\n\x11_our_reserve_msatB\x11\n\x0f_spendable_msatB\x12\n\x10_receivable_msatB\x17\n\x15_minimum_htlc_in_msatB\x18\n\x16_minimum_htlc_out_msatB\x18\n\x16_maximum_htlc_out_msatB\x16\n\x14_their_to_self_delayB\x14\n\x12_our_to_self_delayB\x15\n\x13_max_accepted_htlcsB\x08\n\x06_aliasB\x16\n\x14_in_payments_offeredB\x12\n\x10_in_offered_msatB\x18\n\x16_in_payments_fulfilledB\x14\n\x12_in_fulfilled_msatB\x17\n\x15_out_payments_offeredB\x13\n\x11_out_offered_msatB\x19\n\x17_out_payments_fulfilledB\x15\n\x13_out_fulfilled_msatB\x10\n\x0e_close_to_addr\"=\n\x1dListpeersPeersChannelsFeerate\x12\r\n\x05perkw\x18\x01 \x01(\r\x12\r\n\x05perkb\x18\x02 \x01(\r\"\xf3\x01\n\x1eListpeersPeersChannelsInflight\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\x1a\n\rsplice_amount\x18\x07 \x01(\x12H\x00\x88\x01\x01\x12\x14\n\x0cscratch_txid\x18\x06 \x01(\x0c\x42\x10\n\x0e_splice_amount\"\x9b\x02\n\x1dListpeersPeersChannelsFunding\x12%\n\x0bpushed_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12%\n\x10local_funds_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11remote_funds_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\rfee_paid_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\'\n\rfee_rcvd_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x42\x0e\n\x0c_pushed_msatB\x10\n\x0e_fee_paid_msatB\x10\n\x0e_fee_rcvd_msat\"[\n\x1bListpeersPeersChannelsAlias\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\"\xf1\x02\n\x1bListpeersPeersChannelsHtlcs\x12X\n\tdirection\x18\x01 \x01(\x0e\x32\x45.cln.ListpeersPeersChannelsHtlcs.ListpeersPeersChannelsHtlcsDirection\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\"7\n$ListpeersPeersChannelsHtlcsDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\x42\x10\n\x0e_local_trimmedB\t\n\x07_status\"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\"\x83\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\x10\n\x08reserved\x18\t \x01(\x08\x12\x18\n\x0b\x62lockheight\x18\x08 \x01(\rH\x02\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_blockheight\"\xab\x02\n\x11ListfundsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12$\n\x0four_amount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x04 \x01(\x0c\x12\x16\n\x0e\x66unding_output\x18\x05 \x01(\r\x12\x11\n\tconnected\x18\x06 \x01(\x08\x12 \n\x05state\x18\x07 \x01(\x0e\x32\x11.cln.ChannelState\x12\x17\n\nchannel_id\x18\t \x01(\x0cH\x00\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x01\x88\x01\x01\x42\r\n\x0b_channel_idB\x13\n\x11_short_channel_id\"\xdd\x02\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%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x06 \x01(\x0cH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0b \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x07groupid\x18\t \x01(\x04H\x06\x88\x01\x01\x42\x08\n\x06_labelB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\x11\n\x0f_payment_secretB\t\n\x07_partidB\x10\n\x0e_localinvreqidB\n\n\x08_groupid\"\xd1\x04\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\x19\n\x0c\x63ompleted_at\x18\x0f \x01(\x04H\x03\x88\x01\x01\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x04\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x05\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x07\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x08\x88\x01\x01\x12\x14\n\x07message\x18\x0e \x01(\tH\t\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\x0f\n\r_completed_atB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_message\"\\\n\x0cSendpayRoute\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\n\n\x02id\x18\x02 \x01(\x0c\x12\r\n\x05\x64\x65lay\x18\x03 \x01(\r\x12\x0f\n\x07\x63hannel\x18\x04 \x01(\t\"\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\x11\n\tdirection\x18\x10 \x01(\r\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\x42\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\"o\n\x17\x41utocleaninvoiceRequest\x12\x17\n\nexpired_by\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x1a\n\rcycle_seconds\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\r\n\x0b_expired_byB\x10\n\x0e_cycle_seconds\"\x81\x01\n\x18\x41utocleaninvoiceResponse\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x17\n\nexpired_by\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x1a\n\rcycle_seconds\x18\x03 \x01(\x04H\x01\x88\x01\x01\x42\r\n\x0b_expired_byB\x10\n\x0e_cycle_seconds\"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\"\xab\x01\n\rCloseResponse\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.CloseResponse.CloseType\x12\x0f\n\x02tx\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x11\n\x04txid\x18\x03 \x01(\x0cH\x01\x88\x01\x01\"5\n\tCloseType\x12\n\n\x06MUTUAL\x10\x00\x12\x0e\n\nUNILATERAL\x10\x01\x12\x0c\n\x08UNOPENED\x10\x02\x42\x05\n\x03_txB\x07\n\x05_txid\"T\n\x0e\x43onnectRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\x04host\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04port\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x07\n\x05_hostB\x07\n\x05_port\"\xb4\x01\n\x0f\x43onnectResponse\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0c\x12\x38\n\tdirection\x18\x03 \x01(\x0e\x32%.cln.ConnectResponse.ConnectDirection\x12$\n\x07\x61\x64\x64ress\x18\x04 \x01(\x0b\x32\x13.cln.ConnectAddress\"#\n\x10\x43onnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\xfb\x01\n\x0e\x43onnectAddress\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.ConnectAddress.ConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"P\n\x12\x43onnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"J\n\x14\x43reateinvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x10\n\x08preimage\x18\x03 \x01(\x0c\"\xaf\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\x1a\n\rcreated_index\x18\x10 \x01(\x04H\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\x1b\n\x0elocal_offer_id\x18\r \x01(\x0cH\x08\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\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\x10\n\x0e_created_indexB\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_note\"\xb4\x02\n\x10\x44\x61tastoreRequest\x12\x0b\n\x03key\x18\x05 \x03(\t\x12\x13\n\x06string\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x36\n\x04mode\x18\x03 \x01(\x0e\x32#.cln.DatastoreRequest.DatastoreModeH\x02\x88\x01\x01\x12\x17\n\ngeneration\x18\x04 \x01(\x04H\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\t\n\x07_stringB\x06\n\x04_hexB\x07\n\x05_modeB\r\n\x0b_generation\"\x82\x01\n\x11\x44\x61tastoreResponse\x12\x0b\n\x03key\x18\x05 \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\"\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\x0b\n\x03key\x18\x03 \x03(\t\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x42\r\n\x0b_generation\"\x85\x01\n\x14\x44\x65ldatastoreResponse\x12\x0b\n\x03key\x18\x05 \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\"H\n\x18\x44\x65lexpiredinvoiceRequest\x12\x1a\n\rmaxexpirytime\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\x10\n\x0e_maxexpirytime\"\x1b\n\x19\x44\x65lexpiredinvoiceResponse\"\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\"\xa1\x04\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\x1a\n\rcreated_index\x18\x0c \x01(\x04H\x04\x88\x01\x01\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x05\x88\x01\x01\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\x06\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0b \x01(\tH\x07\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\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_note\"\xfa\x01\n\x0eInvoiceRequest\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x10.cln.AmountOrAny\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05label\x18\x03 \x01(\t\x12\x13\n\x06\x65xpiry\x18\x07 \x01(\x04H\x00\x88\x01\x01\x12\x11\n\tfallbacks\x18\x04 \x03(\t\x12\x15\n\x08preimage\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x11\n\x04\x63ltv\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x19\n\x0c\x64\x65schashonly\x18\t \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_expiryB\x0b\n\t_preimageB\x07\n\x05_cltvB\x0f\n\r_deschashonly\"\x95\x03\n\x0fInvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x16\n\x0epayment_secret\x18\x03 \x01(\x0c\x12\x12\n\nexpires_at\x18\x04 \x01(\x04\x12\x1a\n\rcreated_index\x18\n \x01(\x04H\x00\x88\x01\x01\x12\x1d\n\x10warning_capacity\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x1c\n\x0fwarning_offline\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10warning_deadends\x18\x07 \x01(\tH\x03\x88\x01\x01\x12#\n\x16warning_private_unused\x18\x08 \x01(\tH\x04\x88\x01\x01\x12\x18\n\x0bwarning_mpp\x18\t \x01(\tH\x05\x88\x01\x01\x42\x10\n\x0e_created_indexB\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\"#\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\"\xfe\x05\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\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\x05\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x10 \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\x07\x88\x01\x01\x12\x16\n\tpay_index\x18\x0b \x01(\x04H\x08\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\t\x88\x01\x01\x12\x14\n\x07paid_at\x18\r \x01(\x04H\n\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0e \x01(\x0cH\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\x14\n\x12_invreq_payer_noteB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\x8a\x03\n\x10SendonionRequest\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12*\n\tfirst_hop\x18\x02 \x01(\x0b\x32\x17.cln.SendonionFirst_hop\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%\n\x0b\x61mount_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\r \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x07groupid\x18\x0b \x01(\x04H\x06\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x10\n\x0e_localinvreqidB\n\n\x08_groupid\"\x8b\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\x13\n\x06partid\x18\r \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x12\x14\n\x07message\x18\x0c \x01(\tH\x07\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\t\n\x07_partidB\x13\n\x11_payment_preimageB\n\n\x08_message\"Q\n\x12SendonionFirst_hop\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\"\xeb\x01\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\";\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_status\"C\n\x14ListsendpaysResponse\x12+\n\x08payments\x18\x01 \x03(\x0b\x32\x19.cln.ListsendpaysPayments\"\xf4\x04\n\x14ListsendpaysPayments\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x13\n\x06partid\x18\x0f \x01(\x04H\x00\x88\x01\x01\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\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\x06\x62olt11\x18\n \x01(\tH\x04\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0b \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x17\n\nerroronion\x18\r \x01(\x0cH\x08\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\t\n\x07_partidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\x0e\n\x0c_descriptionB\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\r\n\x0b_erroronion\"\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 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0cscriptPubKey\x18\x03 \x01(\x0c\"\xda\x03\n\nPayRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\r \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nriskfactor\x18\x08 \x01(\x01H\x02\x88\x01\x01\x12\x1a\n\rmaxfeepercent\x18\x04 \x01(\x01H\x03\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x04\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x05\x88\x01\x01\x12#\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0e \x01(\x0cH\x07\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\n \x03(\t\x12 \n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0c \x01(\tH\t\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x08\n\x06_labelB\r\n\x0b_riskfactorB\x10\n\x0e_maxfeepercentB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\x0c\n\n_exemptfeeB\x10\n\x0e_localinvreqidB\t\n\x07_maxfeeB\x0e\n\x0c_description\"\xfb\x02\n\x0bPayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x18\n\x0b\x64\x65stination\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\r\n\x05parts\x18\x05 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\x1awarning_partial_completion\x18\x08 \x01(\tH\x01\x88\x01\x01\x12*\n\x06status\x18\t \x01(\x0e\x32\x1a.cln.PayResponse.PayStatus\"2\n\tPayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x0e\n\x0c_destinationB\x1d\n\x1b_warning_partial_completion\"*\n\x10ListnodesRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x05\n\x03_id\"7\n\x11ListnodesResponse\x12\"\n\x05nodes\x18\x01 \x03(\x0b\x32\x13.cln.ListnodesNodes\"\xe1\x01\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.ListnodesNodesAddressesB\x11\n\x0f_last_timestampB\x08\n\x06_aliasB\x08\n\x06_colorB\x0b\n\t_features\"\xe8\x01\n\x17ListnodesNodesAddresses\x12K\n\titem_type\x18\x01 \x01(\x0e\x32\x38.cln.ListnodesNodesAddresses.ListnodesNodesAddressesType\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x00\x88\x01\x01\"P\n\x1bListnodesNodesAddressesType\x12\x07\n\x03\x44NS\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\n\n\x08_address\"g\n\x15WaitanyinvoiceRequest\x12\x1a\n\rlastpay_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\x10\n\x0e_lastpay_indexB\n\n\x08_timeout\"\xef\x04\n\x16WaitanyinvoiceResponse\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\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\x00\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rcreated_index\x18\r \x01(\x04H\x03\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x04\x88\x01\x01\x12\x16\n\tpay_index\x18\t \x01(\x04H\x05\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x07\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x08\x88\x01\x01\"-\n\x14WaitanyinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x42\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"#\n\x12WaitinvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\"\xe3\x04\n\x13WaitinvoiceResponse\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.WaitinvoiceResponse.WaitinvoiceStatus\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\x62olt11\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rcreated_index\x18\r \x01(\x04H\x03\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x04\x88\x01\x01\x12\x16\n\tpay_index\x18\t \x01(\x04H\x05\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x07\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x08\x88\x01\x01\"*\n\x11WaitinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x42\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\x8e\x01\n\x12WaitsendpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x14\n\x07timeout\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x13\n\x06partid\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x02\x88\x01\x01\x42\n\n\x08_timeoutB\t\n\x07_partidB\n\n\x08_groupid\"\xb2\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\x19\n\x0c\x63ompleted_at\x18\x0e \x01(\x01H\x03\x88\x01\x01\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x04\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x05\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x07\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x08\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\x0f\n\r_completed_atB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimage\"\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\x08\n\x04P2TR\x10\x03\x12\x07\n\x03\x41LL\x10\x02\x42\x0e\n\x0c_addresstype\"w\n\x0fNewaddrResponse\x12\x11\n\x04p2tr\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62\x65\x63h32\x18\x01 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bp2sh_segwit\x18\x02 \x01(\tH\x02\x88\x01\x01\x42\x07\n\x05_p2trB\t\n\x07_bech32B\x0e\n\x0c_p2sh_segwit\"\xca\x01\n\x0fWithdrawRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\t\x12&\n\x07satoshi\x18\x02 \x01(\x0b\x32\x10.cln.AmountOrAllH\x00\x88\x01\x01\x12\"\n\x07\x66\x65\x65rate\x18\x05 \x01(\x0b\x32\x0c.cln.FeerateH\x01\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.OutpointB\n\n\x08_satoshiB\n\n\x08_feerateB\n\n\x08_minconf\":\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\"\x82\x03\n\x0eKeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rmaxfeepercent\x18\x04 \x01(\x01H\x01\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x03\x88\x01\x01\x12#\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12+\n\nroutehints\x18\x08 \x01(\x0b\x32\x12.cln.RoutehintListH\x05\x88\x01\x01\x12&\n\textratlvs\x18\t \x01(\x0b\x32\x0e.cln.TlvStreamH\x06\x88\x01\x01\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_extratlvs\"\xf2\x02\n\x0fKeysendResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x18\n\x0b\x64\x65stination\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\r\n\x05parts\x18\x05 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\x1awarning_partial_completion\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x32\n\x06status\x18\t \x01(\x0e\x32\".cln.KeysendResponse.KeysendStatus\"\x1d\n\rKeysendStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\x0e\n\x0c_destinationB\x1d\n\x1b_warning_partial_completion\"\xa4\x03\n\x0f\x46undpsbtRequest\x12!\n\x07satoshi\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x1d\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.Feerate\x12\x13\n\x0bstartweight\x18\x03 \x01(\r\x12\x14\n\x07minconf\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07reserve\x18\x05 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08locktime\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x1f\n\x12min_witness_weight\x18\x07 \x01(\rH\x03\x88\x01\x01\x12\x1d\n\x10\x65xcess_as_change\x18\x08 \x01(\x08H\x04\x88\x01\x01\x12\x17\n\nnonwrapped\x18\t \x01(\x08H\x05\x88\x01\x01\x12#\n\x16opening_anchor_channel\x18\n \x01(\x08H\x06\x88\x01\x01\x42\n\n\x08_minconfB\n\n\x08_reserveB\x0b\n\t_locktimeB\x15\n\x13_min_witness_weightB\x13\n\x11_excess_as_changeB\r\n\x0b_nonwrappedB\x19\n\x17_opening_anchor_channel\"\xd9\x01\n\x10\x46undpsbtResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\x0e\x66\x65\x65rate_per_kw\x18\x02 \x01(\r\x12\x1e\n\x16\x65stimated_final_weight\x18\x03 \x01(\r\x12 \n\x0b\x65xcess_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1a\n\rchange_outnum\x18\x05 \x01(\rH\x00\x88\x01\x01\x12/\n\x0creservations\x18\x06 \x03(\x0b\x32\x19.cln.FundpsbtReservationsB\x10\n\x0e_change_outnum\"u\n\x14\x46undpsbtReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\"A\n\x0fSendpsbtRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x14\n\x07reserve\x18\x02 \x01(\x08H\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\"\x9b\x03\n\x0fUtxopsbtRequest\x12\x1c\n\x07satoshi\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\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\x17\n\nreservedok\x18\x08 \x01(\x08H\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\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\r\n\x0b_reservedokB\x0b\n\t_locktimeB\x15\n\x13_min_witness_weightB\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\x07outputs\x18\x05 \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\"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\"1\n\x17ListpeerchannelsRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x05\n\x03_id\"K\n\x18ListpeerchannelsResponse\x12/\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1d.cln.ListpeerchannelsChannels\"\x9b\x19\n\x18ListpeerchannelsChannels\x12\x14\n\x07peer_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x1b\n\x0epeer_connected\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12O\n\x05state\x18\x03 \x01(\x0e\x32;.cln.ListpeerchannelsChannels.ListpeerchannelsChannelsStateH\x02\x88\x01\x01\x12\x19\n\x0cscratch_txid\x18\x04 \x01(\x0cH\x03\x88\x01\x01\x12\x1e\n\x11ignore_fee_limits\x18\x36 \x01(\x08H\x04\x88\x01\x01\x12:\n\x07\x66\x65\x65rate\x18\x06 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFeerateH\x05\x88\x01\x01\x12\x12\n\x05owner\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x07\x88\x01\x01\x12\x17\n\nchannel_id\x18\t \x01(\x0cH\x08\x88\x01\x01\x12\x19\n\x0c\x66unding_txid\x18\n \x01(\x0cH\t\x88\x01\x01\x12\x1b\n\x0e\x66unding_outnum\x18\x0b \x01(\rH\n\x88\x01\x01\x12\x1c\n\x0finitial_feerate\x18\x0c \x01(\tH\x0b\x88\x01\x01\x12\x19\n\x0clast_feerate\x18\r \x01(\tH\x0c\x88\x01\x01\x12\x19\n\x0cnext_feerate\x18\x0e \x01(\tH\r\x88\x01\x01\x12\x1a\n\rnext_fee_step\x18\x0f \x01(\rH\x0e\x88\x01\x01\x12\x37\n\x08inflight\x18\x10 \x03(\x0b\x32%.cln.ListpeerchannelsChannelsInflight\x12\x15\n\x08\x63lose_to\x18\x11 \x01(\x0cH\x0f\x88\x01\x01\x12\x14\n\x07private\x18\x12 \x01(\x08H\x10\x88\x01\x01\x12%\n\x06opener\x18\x13 \x01(\x0e\x32\x10.cln.ChannelSideH\x11\x88\x01\x01\x12%\n\x06\x63loser\x18\x14 \x01(\x0e\x32\x10.cln.ChannelSideH\x12\x88\x01\x01\x12:\n\x07\x66unding\x18\x16 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFundingH\x13\x88\x01\x01\x12$\n\nto_us_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x14\x88\x01\x01\x12(\n\x0emin_to_us_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\x15\x88\x01\x01\x12(\n\x0emax_to_us_msat\x18\x19 \x01(\x0b\x32\x0b.cln.AmountH\x16\x88\x01\x01\x12$\n\ntotal_msat\x18\x1a \x01(\x0b\x32\x0b.cln.AmountH\x17\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x1b \x01(\x0b\x32\x0b.cln.AmountH\x18\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x1c \x01(\rH\x19\x88\x01\x01\x12)\n\x0f\x64ust_limit_msat\x18\x1d \x01(\x0b\x32\x0b.cln.AmountH\x1a\x88\x01\x01\x12\x30\n\x16max_total_htlc_in_msat\x18\x1e \x01(\x0b\x32\x0b.cln.AmountH\x1b\x88\x01\x01\x12,\n\x12their_reserve_msat\x18\x1f \x01(\x0b\x32\x0b.cln.AmountH\x1c\x88\x01\x01\x12*\n\x10our_reserve_msat\x18 \x01(\x0b\x32\x0b.cln.AmountH\x1d\x88\x01\x01\x12(\n\x0espendable_msat\x18! \x01(\x0b\x32\x0b.cln.AmountH\x1e\x88\x01\x01\x12)\n\x0freceivable_msat\x18\" \x01(\x0b\x32\x0b.cln.AmountH\x1f\x88\x01\x01\x12.\n\x14minimum_htlc_in_msat\x18# \x01(\x0b\x32\x0b.cln.AmountH \x88\x01\x01\x12/\n\x15minimum_htlc_out_msat\x18$ \x01(\x0b\x32\x0b.cln.AmountH!\x88\x01\x01\x12/\n\x15maximum_htlc_out_msat\x18% \x01(\x0b\x32\x0b.cln.AmountH\"\x88\x01\x01\x12 \n\x13their_to_self_delay\x18& \x01(\rH#\x88\x01\x01\x12\x1e\n\x11our_to_self_delay\x18\' \x01(\rH$\x88\x01\x01\x12\x1f\n\x12max_accepted_htlcs\x18( \x01(\rH%\x88\x01\x01\x12\x36\n\x05\x61lias\x18) \x01(\x0b\x32\".cln.ListpeerchannelsChannelsAliasH&\x88\x01\x01\x12\x0e\n\x06status\x18+ \x03(\t\x12 \n\x13in_payments_offered\x18, \x01(\x04H\'\x88\x01\x01\x12)\n\x0fin_offered_msat\x18- \x01(\x0b\x32\x0b.cln.AmountH(\x88\x01\x01\x12\"\n\x15in_payments_fulfilled\x18. \x01(\x04H)\x88\x01\x01\x12+\n\x11in_fulfilled_msat\x18/ \x01(\x0b\x32\x0b.cln.AmountH*\x88\x01\x01\x12!\n\x14out_payments_offered\x18\x30 \x01(\x04H+\x88\x01\x01\x12*\n\x10out_offered_msat\x18\x31 \x01(\x0b\x32\x0b.cln.AmountH,\x88\x01\x01\x12#\n\x16out_payments_fulfilled\x18\x32 \x01(\x04H-\x88\x01\x01\x12,\n\x12out_fulfilled_msat\x18\x33 \x01(\x0b\x32\x0b.cln.AmountH.\x88\x01\x01\x12\x31\n\x05htlcs\x18\x34 \x03(\x0b\x32\".cln.ListpeerchannelsChannelsHtlcs\x12\x1a\n\rclose_to_addr\x18\x35 \x01(\tH/\x88\x01\x01\"\xc1\x02\n\x1dListpeerchannelsChannelsState\x12\x0c\n\x08OPENINGD\x10\x00\x12\x1c\n\x18\x43HANNELD_AWAITING_LOCKIN\x10\x01\x12\x13\n\x0f\x43HANNELD_NORMAL\x10\x02\x12\x1a\n\x16\x43HANNELD_SHUTTING_DOWN\x10\x03\x12\x18\n\x14\x43LOSINGD_SIGEXCHANGE\x10\x04\x12\x15\n\x11\x43LOSINGD_COMPLETE\x10\x05\x12\x17\n\x13\x41WAITING_UNILATERAL\x10\x06\x12\x16\n\x12\x46UNDING_SPEND_SEEN\x10\x07\x12\x0b\n\x07ONCHAIN\x10\x08\x12\x17\n\x13\x44UALOPEND_OPEN_INIT\x10\t\x12\x1d\n\x19\x44UALOPEND_AWAITING_LOCKIN\x10\n\x12\x1c\n\x18\x43HANNELD_AWAITING_SPLICE\x10\x0b\x42\n\n\x08_peer_idB\x11\n\x0f_peer_connectedB\x08\n\x06_stateB\x0f\n\r_scratch_txidB\x14\n\x12_ignore_fee_limitsB\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_openerB\t\n\x07_closerB\n\n\x08_fundingB\r\n\x0b_to_us_msatB\x11\n\x0f_min_to_us_msatB\x11\n\x0f_max_to_us_msatB\r\n\x0b_total_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x12\n\x10_dust_limit_msatB\x19\n\x17_max_total_htlc_in_msatB\x15\n\x13_their_reserve_msatB\x13\n\x11_our_reserve_msatB\x11\n\x0f_spendable_msatB\x12\n\x10_receivable_msatB\x17\n\x15_minimum_htlc_in_msatB\x18\n\x16_minimum_htlc_out_msatB\x18\n\x16_maximum_htlc_out_msatB\x16\n\x14_their_to_self_delayB\x14\n\x12_our_to_self_delayB\x15\n\x13_max_accepted_htlcsB\x08\n\x06_aliasB\x16\n\x14_in_payments_offeredB\x12\n\x10_in_offered_msatB\x18\n\x16_in_payments_fulfilledB\x14\n\x12_in_fulfilled_msatB\x17\n\x15_out_payments_offeredB\x13\n\x11_out_offered_msatB\x19\n\x17_out_payments_fulfilledB\x15\n\x13_out_fulfilled_msatB\x10\n\x0e_close_to_addr\"]\n\x1fListpeerchannelsChannelsFeerate\x12\x12\n\x05perkw\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x12\n\x05perkb\x18\x02 \x01(\rH\x01\x88\x01\x01\x42\x08\n\x06_perkwB\x08\n\x06_perkb\"\x80\x03\n ListpeerchannelsChannelsInflight\x12\x19\n\x0c\x66unding_txid\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x1b\n\x0e\x66unding_outnum\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x14\n\x07\x66\x65\x65rate\x18\x03 \x01(\tH\x02\x88\x01\x01\x12,\n\x12total_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x1a\n\rsplice_amount\x18\x07 \x01(\x12H\x04\x88\x01\x01\x12*\n\x10our_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x19\n\x0cscratch_txid\x18\x06 \x01(\x0cH\x06\x88\x01\x01\x42\x0f\n\r_funding_txidB\x11\n\x0f_funding_outnumB\n\n\x08_feerateB\x15\n\x13_total_funding_msatB\x10\n\x0e_splice_amountB\x13\n\x11_our_funding_msatB\x0f\n\r_scratch_txid\"\xd2\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.AmountH\x01\x88\x01\x01\x12+\n\x11remote_funds_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\'\n\rfee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\'\n\rfee_rcvd_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x42\x0e\n\x0c_pushed_msatB\x13\n\x11_local_funds_msatB\x14\n\x12_remote_funds_msatB\x10\n\x0e_fee_paid_msatB\x10\n\x0e_fee_rcvd_msat\"]\n\x1dListpeerchannelsChannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"\xe2\x03\n\x1dListpeerchannelsChannelsHtlcs\x12\x61\n\tdirection\x18\x01 \x01(\x0e\x32I.cln.ListpeerchannelsChannelsHtlcs.ListpeerchannelsChannelsHtlcsDirectionH\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x05 \x01(\x0cH\x04\x88\x01\x01\x12\x1a\n\rlocal_trimmed\x18\x06 \x01(\x08H\x05\x88\x01\x01\x12\x13\n\x06status\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\"\n\x05state\x18\x08 \x01(\x0e\x32\x0e.cln.HtlcStateH\x07\x88\x01\x01\"9\n&ListpeerchannelsChannelsHtlcsDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\x42\x0c\n\n_directionB\x05\n\x03_idB\x0e\n\x0c_amount_msatB\t\n\x07_expiryB\x0f\n\r_payment_hashB\x10\n\x0e_local_trimmedB\t\n\x07_statusB\x08\n\x06_state\"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\"\xb2\t\n ListclosedchannelsClosedchannels\x12\x14\n\x07peer_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x01\x88\x01\x01\x12>\n\x05\x61lias\x18\x04 \x01(\x0b\x32*.cln.ListclosedchannelsClosedchannelsAliasH\x02\x88\x01\x01\x12 \n\x06opener\x18\x05 \x01(\x0e\x32\x10.cln.ChannelSide\x12%\n\x06\x63loser\x18\x06 \x01(\x0e\x32\x10.cln.ChannelSideH\x03\x88\x01\x01\x12\x0f\n\x07private\x18\x07 \x01(\x08\x12\x1f\n\x17total_local_commitments\x18\t \x01(\x04\x12 \n\x18total_remote_commitments\x18\n \x01(\x04\x12\x18\n\x10total_htlcs_sent\x18\x0b \x01(\x04\x12\x14\n\x0c\x66unding_txid\x18\x0c \x01(\x0c\x12\x16\n\x0e\x66unding_outnum\x18\r \x01(\r\x12\x0e\n\x06leased\x18\x0e \x01(\x08\x12/\n\x15\x66unding_fee_paid_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12/\n\x15\x66unding_fee_rcvd_msat\x18\x10 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12-\n\x13\x66unding_pushed_msat\x18\x11 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x1f\n\ntotal_msat\x18\x12 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x66inal_to_us_msat\x18\x13 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0emin_to_us_msat\x18\x14 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0emax_to_us_msat\x18\x15 \x01(\x0b\x32\x0b.cln.Amount\x12!\n\x14last_commitment_txid\x18\x16 \x01(\x0cH\x07\x88\x01\x01\x12\x32\n\x18last_commitment_fee_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x66\n\x0b\x63lose_cause\x18\x18 \x01(\x0e\x32Q.cln.ListclosedchannelsClosedchannels.ListclosedchannelsClosedchannelsClose_cause\"v\n+ListclosedchannelsClosedchannelsClose_cause\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05LOCAL\x10\x01\x12\x08\n\x04USER\x10\x02\x12\n\n\x06REMOTE\x10\x03\x12\x0c\n\x08PROTOCOL\x10\x04\x12\x0b\n\x07ONCHAIN\x10\x05\x42\n\n\x08_peer_idB\x13\n\x11_short_channel_idB\x08\n\x06_aliasB\t\n\x07_closerB\x18\n\x16_funding_fee_paid_msatB\x18\n\x16_funding_fee_rcvd_msatB\x16\n\x14_funding_pushed_msatB\x17\n\x15_last_commitment_txidB\x1b\n\x19_last_commitment_fee_msat\"e\n%ListclosedchannelsClosedchannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"L\n\x10\x44\x65\x63odepayRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_description\"\x8d\x04\n\x11\x44\x65\x63odepayResponse\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\x12\x12\n\ncreated_at\x18\x02 \x01(\x04\x12\x0e\n\x06\x65xpiry\x18\x03 \x01(\x04\x12\r\n\x05payee\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x11\n\tsignature\x18\x07 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10\x64\x65scription_hash\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x1d\n\x15min_final_cltv_expiry\x18\n \x01(\r\x12\x1b\n\x0epayment_secret\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\r \x01(\x0cH\x05\x88\x01\x01\x12*\n\tfallbacks\x18\x0e \x03(\x0b\x32\x17.cln.DecodepayFallbacks\x12\"\n\x05\x65xtra\x18\x10 \x03(\x0b\x32\x13.cln.DecodepayExtraB\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x13\n\x11_description_hashB\x11\n\x0f_payment_secretB\x0b\n\t_featuresB\x13\n\x11_payment_metadata\"\xc6\x01\n\x12\x44\x65\x63odepayFallbacks\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.DecodepayFallbacks.DecodepayFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0b\n\x03hex\x18\x03 \x01(\x0c\"D\n\x16\x44\x65\x63odepayFallbacksType\x12\t\n\x05P2PKH\x10\x00\x12\x08\n\x04P2SH\x10\x01\x12\n\n\x06P2WPKH\x10\x02\x12\t\n\x05P2WSH\x10\x03\x42\x07\n\x05_addr\"+\n\x0e\x44\x65\x63odepayExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x1f\n\rDecodeRequest\x12\x0e\n\x06string\x18\x01 \x01(\t\"\xaa!\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\x16.cln.DecodeOffer_paths\x12\x1a\n\roffer_node_id\x18\x11 \x01(\x0cH\x0c\x88\x01\x01\x12*\n\x1dwarning_missing_offer_node_id\x18\x14 \x01(\tH\r\x88\x01\x01\x12.\n!warning_invalid_offer_description\x18\x15 \x01(\tH\x0e\x88\x01\x01\x12.\n!warning_missing_offer_description\x18\x16 \x01(\tH\x0f\x88\x01\x01\x12+\n\x1ewarning_invalid_offer_currency\x18\x17 \x01(\tH\x10\x88\x01\x01\x12)\n\x1cwarning_invalid_offer_issuer\x18\x18 \x01(\tH\x11\x88\x01\x01\x12\x1c\n\x0finvreq_metadata\x18\x19 \x01(\x0cH\x12\x88\x01\x01\x12\x1c\n\x0finvreq_payer_id\x18\x1a \x01(\x0cH\x13\x88\x01\x01\x12\x19\n\x0cinvreq_chain\x18\x1b \x01(\x0cH\x14\x88\x01\x01\x12,\n\x12invreq_amount_msat\x18\x1c \x01(\x0b\x32\x0b.cln.AmountH\x15\x88\x01\x01\x12\x1c\n\x0finvreq_features\x18\x1d \x01(\x0cH\x16\x88\x01\x01\x12\x1c\n\x0finvreq_quantity\x18\x1e \x01(\x04H\x17\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x1f \x01(\tH\x18\x88\x01\x01\x12&\n\x19invreq_recurrence_counter\x18 \x01(\rH\x19\x88\x01\x01\x12$\n\x17invreq_recurrence_start\x18! \x01(\rH\x1a\x88\x01\x01\x12,\n\x1fwarning_missing_invreq_metadata\x18# \x01(\tH\x1b\x88\x01\x01\x12,\n\x1fwarning_missing_invreq_payer_id\x18$ \x01(\tH\x1c\x88\x01\x01\x12.\n!warning_invalid_invreq_payer_note\x18% \x01(\tH\x1d\x88\x01\x01\x12\x36\n)warning_missing_invoice_request_signature\x18& \x01(\tH\x1e\x88\x01\x01\x12\x36\n)warning_invalid_invoice_request_signature\x18\' \x01(\tH\x1f\x88\x01\x01\x12\x1f\n\x12invoice_created_at\x18) \x01(\x04H \x88\x01\x01\x12$\n\x17invoice_relative_expiry\x18* \x01(\rH!\x88\x01\x01\x12!\n\x14invoice_payment_hash\x18+ \x01(\x0cH\"\x88\x01\x01\x12-\n\x13invoice_amount_msat\x18, \x01(\x0b\x32\x0b.cln.AmountH#\x88\x01\x01\x12\x37\n\x11invoice_fallbacks\x18- \x03(\x0b\x32\x1c.cln.DecodeInvoice_fallbacks\x12\x1d\n\x10invoice_features\x18. \x01(\x0cH$\x88\x01\x01\x12\x1c\n\x0finvoice_node_id\x18/ \x01(\x0cH%\x88\x01\x01\x12(\n\x1binvoice_recurrence_basetime\x18\x30 \x01(\x04H&\x88\x01\x01\x12*\n\x1dwarning_missing_invoice_paths\x18\x32 \x01(\tH\'\x88\x01\x01\x12/\n\"warning_missing_invoice_blindedpay\x18\x33 \x01(\tH(\x88\x01\x01\x12/\n\"warning_missing_invoice_created_at\x18\x34 \x01(\tH)\x88\x01\x01\x12\x31\n$warning_missing_invoice_payment_hash\x18\x35 \x01(\tH*\x88\x01\x01\x12+\n\x1ewarning_missing_invoice_amount\x18\x36 \x01(\tH+\x88\x01\x01\x12\x38\n+warning_missing_invoice_recurrence_basetime\x18\x37 \x01(\tH,\x88\x01\x01\x12,\n\x1fwarning_missing_invoice_node_id\x18\x38 \x01(\tH-\x88\x01\x01\x12.\n!warning_missing_invoice_signature\x18\x39 \x01(\tH.\x88\x01\x01\x12.\n!warning_invalid_invoice_signature\x18: \x01(\tH/\x88\x01\x01\x12\'\n\tfallbacks\x18; \x03(\x0b\x32\x14.cln.DecodeFallbacks\x12\x17\n\ncreated_at\x18< \x01(\x04H0\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18= \x01(\x04H1\x88\x01\x01\x12\x12\n\x05payee\x18> \x01(\x0cH2\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18? \x01(\x0cH3\x88\x01\x01\x12\x1d\n\x10\x64\x65scription_hash\x18@ \x01(\x0cH4\x88\x01\x01\x12\"\n\x15min_final_cltv_expiry\x18\x41 \x01(\rH5\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x42 \x01(\x0cH6\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x43 \x01(\x0cH7\x88\x01\x01\x12\x1f\n\x05\x65xtra\x18\x45 \x03(\x0b\x32\x10.cln.DecodeExtra\x12\x16\n\tunique_id\x18\x46 \x01(\tH8\x88\x01\x01\x12\x14\n\x07version\x18G \x01(\tH9\x88\x01\x01\x12\x13\n\x06string\x18H \x01(\tH:\x88\x01\x01\x12-\n\x0crestrictions\x18I \x03(\x0b\x32\x17.cln.DecodeRestrictions\x12&\n\x19warning_rune_invalid_utf8\x18J \x01(\tH;\x88\x01\x01\x12\x10\n\x03hex\x18K \x01(\x0cH<\x88\x01\x01\"l\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\x42\x0b\n\t_offer_idB\x11\n\x0f_offer_metadataB\x11\n\x0f_offer_currencyB!\n\x1f_warning_unknown_offer_currencyB\x16\n\x14_currency_minor_unitB\x0f\n\r_offer_amountB\x14\n\x12_offer_amount_msatB\x14\n\x12_offer_descriptionB\x0f\n\r_offer_issuerB\x11\n\x0f_offer_featuresB\x18\n\x16_offer_absolute_expiryB\x15\n\x13_offer_quantity_maxB\x10\n\x0e_offer_node_idB \n\x1e_warning_missing_offer_node_idB$\n\"_warning_invalid_offer_descriptionB$\n\"_warning_missing_offer_descriptionB!\n\x1f_warning_invalid_offer_currencyB\x1f\n\x1d_warning_invalid_offer_issuerB\x12\n\x10_invreq_metadataB\x12\n\x10_invreq_payer_idB\x0f\n\r_invreq_chainB\x15\n\x13_invreq_amount_msatB\x12\n\x10_invreq_featuresB\x12\n\x10_invreq_quantityB\x14\n\x12_invreq_payer_noteB\x1c\n\x1a_invreq_recurrence_counterB\x1a\n\x18_invreq_recurrence_startB\"\n _warning_missing_invreq_metadataB\"\n _warning_missing_invreq_payer_idB$\n\"_warning_invalid_invreq_payer_noteB,\n*_warning_missing_invoice_request_signatureB,\n*_warning_invalid_invoice_request_signatureB\x15\n\x13_invoice_created_atB\x1a\n\x18_invoice_relative_expiryB\x17\n\x15_invoice_payment_hashB\x16\n\x14_invoice_amount_msatB\x13\n\x11_invoice_featuresB\x12\n\x10_invoice_node_idB\x1e\n\x1c_invoice_recurrence_basetimeB \n\x1e_warning_missing_invoice_pathsB%\n#_warning_missing_invoice_blindedpayB%\n#_warning_missing_invoice_created_atB\'\n%_warning_missing_invoice_payment_hashB!\n\x1f_warning_missing_invoice_amountB.\n,_warning_missing_invoice_recurrence_basetimeB\"\n _warning_missing_invoice_node_idB$\n\"_warning_missing_invoice_signatureB$\n\"_warning_invalid_invoice_signatureB\r\n\x0b_created_atB\t\n\x07_expiryB\x08\n\x06_payeeB\x0f\n\r_payment_hashB\x13\n\x11_description_hashB\x18\n\x16_min_final_cltv_expiryB\x11\n\x0f_payment_secretB\x13\n\x11_payment_metadataB\x0c\n\n_unique_idB\n\n\x08_versionB\t\n\x07_stringB\x1c\n\x1a_warning_rune_invalid_utf8B\x06\n\x04_hex\"<\n\x11\x44\x65\x63odeOffer_paths\x12\x15\n\rfirst_node_id\x18\x01 \x01(\x0c\x12\x10\n\x08\x62linding\x18\x02 \x01(\x0c\"\x8a\x01\n\x1f\x44\x65\x63odeOffer_recurrencePaywindow\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\"T\n\x17\x44\x65\x63odeInvoice_pathsPath\x12\x17\n\x0f\x62linded_node_id\x18\x01 \x01(\x0c\x12 \n\x18\x65ncrypted_recipient_data\x18\x02 \x01(\x0c\"Y\n\x17\x44\x65\x63odeInvoice_fallbacks\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\"w\n\x0f\x44\x65\x63odeFallbacks\x12\x36\n)warning_invoice_fallbacks_version_invalid\x18\x01 \x01(\tH\x00\x88\x01\x01\x42,\n*_warning_invoice_fallbacks_version_invalid\"(\n\x0b\x44\x65\x63odeExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\";\n\x12\x44\x65\x63odeRestrictions\x12\x14\n\x0c\x61lternatives\x18\x01 \x03(\t\x12\x0f\n\x07summary\x18\x02 \x01(\t\"=\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\"\x9c\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\x46\n\x15onchain_fee_estimates\x18\x04 \x01(\x0b\x32\".cln.FeeratesOnchain_fee_estimatesH\x03\x88\x01\x01\x42\x1b\n\x19_warning_missing_feeratesB\x08\n\x06_perkbB\x08\n\x06_perkwB\x18\n\x16_onchain_fee_estimates\"\xd3\x03\n\rFeeratesPerkb\x12\x16\n\x0emin_acceptable\x18\x01 \x01(\r\x12\x16\n\x0emax_acceptable\x18\x02 \x01(\r\x12\x12\n\x05\x66loor\x18\n \x01(\rH\x00\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkbEstimates\x12\x14\n\x07opening\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x19\n\x0cmutual_close\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x1d\n\x10unilateral_close\x18\x05 \x01(\rH\x03\x88\x01\x01\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rdelayed_to_us\x18\x06 \x01(\rH\x05\x88\x01\x01\x12\x1c\n\x0fhtlc_resolution\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x14\n\x07penalty\x18\x08 \x01(\rH\x07\x88\x01\x01\x42\x08\n\x06_floorB\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\x1a\n\x18_unilateral_anchor_closeB\x10\n\x0e_delayed_to_usB\x12\n\x10_htlc_resolutionB\n\n\x08_penalty\"\x96\x01\n\x16\x46\x65\x65ratesPerkbEstimates\x12\x17\n\nblockcount\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07\x66\x65\x65rate\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1d\n\x10smoothed_feerate\x18\x03 \x01(\rH\x02\x88\x01\x01\x42\r\n\x0b_blockcountB\n\n\x08_feerateB\x13\n\x11_smoothed_feerate\"\xd3\x03\n\rFeeratesPerkw\x12\x16\n\x0emin_acceptable\x18\x01 \x01(\r\x12\x16\n\x0emax_acceptable\x18\x02 \x01(\r\x12\x12\n\x05\x66loor\x18\n \x01(\rH\x00\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkwEstimates\x12\x14\n\x07opening\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x19\n\x0cmutual_close\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x1d\n\x10unilateral_close\x18\x05 \x01(\rH\x03\x88\x01\x01\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rdelayed_to_us\x18\x06 \x01(\rH\x05\x88\x01\x01\x12\x1c\n\x0fhtlc_resolution\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x14\n\x07penalty\x18\x08 \x01(\rH\x07\x88\x01\x01\x42\x08\n\x06_floorB\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\x1a\n\x18_unilateral_anchor_closeB\x10\n\x0e_delayed_to_usB\x12\n\x10_htlc_resolutionB\n\n\x08_penalty\"\x96\x01\n\x16\x46\x65\x65ratesPerkwEstimates\x12\x17\n\nblockcount\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07\x66\x65\x65rate\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1d\n\x10smoothed_feerate\x18\x03 \x01(\rH\x02\x88\x01\x01\x42\r\n\x0b_blockcountB\n\n\x08_feerateB\x13\n\x11_smoothed_feerate\"\x9b\x02\n\x1d\x46\x65\x65ratesOnchain_fee_estimates\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\x30\n#unilateral_close_nonanchor_satoshis\x18\x06 \x01(\x04H\x00\x88\x01\x01\x12\x1d\n\x15htlc_timeout_satoshis\x18\x04 \x01(\x04\x12\x1d\n\x15htlc_success_satoshis\x18\x05 \x01(\x04\x42&\n$_unilateral_close_nonanchor_satoshis\"\xe5\x03\n\x12\x46undchannelRequest\x12\n\n\x02id\x18\t \x01(\x0c\x12 \n\x06\x61mount\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x14\n\x07minconf\x18\n \x01(\rH\x02\x88\x01\x01\x12#\n\tpush_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\tH\x04\x88\x01\x01\x12%\n\x0brequest_amt\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x08 \x01(\tH\x06\x88\x01\x01\x12\x1c\n\x05utxos\x18\x0b \x03(\x0b\x32\r.cln.Outpoint\x12\x15\n\x08mindepth\x18\x0c \x01(\rH\x07\x88\x01\x01\x12!\n\x07reserve\x18\r \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x42\n\n\x08_feerateB\x0b\n\t_announceB\n\n\x08_minconfB\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\"\x9b\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\x42\x0b\n\t_close_toB\x0b\n\t_mindepth\"\xec\x01\n\x0fGetrouteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\nriskfactor\x18\x03 \x01(\x04\x12\x11\n\x04\x63ltv\x18\x04 \x01(\x01H\x00\x88\x01\x01\x12\x13\n\x06\x66romid\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x66uzzpercent\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\x07 \x03(\t\x12\x14\n\x07maxhops\x18\x08 \x01(\rH\x03\x88\x01\x01\x42\x07\n\x05_cltvB\t\n\x07_fromidB\x0e\n\x0c_fuzzpercentB\n\n\x08_maxhops\"5\n\x10GetrouteResponse\x12!\n\x05route\x18\x01 \x03(\x0b\x32\x12.cln.GetrouteRoute\"\xc5\x01\n\rGetrouteRoute\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x11\n\tdirection\x18\x03 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\r\n\x05\x64\x65lay\x18\x05 \x01(\r\x12\x34\n\x05style\x18\x06 \x01(\x0e\x32%.cln.GetrouteRoute.GetrouteRouteStyle\"\x1d\n\x12GetrouteRouteStyle\x12\x07\n\x03TLV\x10\x00\"\x82\x02\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\"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_channel\"C\n\x14ListforwardsResponse\x12+\n\x08\x66orwards\x18\x01 \x03(\x0b\x32\x19.cln.ListforwardsForwards\"\xde\x04\n\x14ListforwardsForwards\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\x00\x88\x01\x01\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\x01\x88\x01\x01\x12\x18\n\x0bout_htlc_id\x18\x0b \x01(\x04H\x02\x88\x01\x01\x12G\n\x05style\x18\t \x01(\x0e\x32\x33.cln.ListforwardsForwards.ListforwardsForwardsStyleH\x03\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\"\n\x08out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x05\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\r\n\x0b_in_htlc_idB\x0e\n\x0c_out_channelB\x0e\n\x0c_out_htlc_idB\x08\n\x06_styleB\x0b\n\t_fee_msatB\x0b\n\t_out_msat\"\xdb\x01\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\"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_status\"3\n\x10ListpaysResponse\x12\x1f\n\x04pays\x18\x01 \x03(\x0b\x32\x11.cln.ListpaysPays\"\xff\x04\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\x19\n\x0c\x63ompleted_at\x18\x0c \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05label\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x06 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0b \x01(\tH\x04\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x05\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12*\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x12\x15\n\x08preimage\x18\r \x01(\x0cH\x08\x88\x01\x01\x12\x1c\n\x0fnumber_of_parts\x18\x0e \x01(\x04H\t\x88\x01\x01\x12\x17\n\nerroronion\x18\n \x01(\x0cH\n\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\x0f\n\r_completed_atB\x08\n\x06_labelB\t\n\x07_bolt11B\x0e\n\x0c_descriptionB\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x13\n\x11_amount_sent_msatB\x0b\n\t_preimageB\x12\n\x10_number_of_partsB\r\n\x0b_erroronion\"*\n\x10ListhtlcsRequest\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x05\n\x03_id\"7\n\x11ListhtlcsResponse\x12\"\n\x05htlcs\x18\x01 \x03(\x0b\x32\x13.cln.ListhtlcsHtlcs\"\x89\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\"*\n\x17ListhtlcsHtlcsDirection\x12\x07\n\x03OUT\x10\x00\x12\x06\n\x02IN\x10\x01\"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\"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\"\xaa\x02\n\x11SetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12!\n\x07\x66\x65\x65\x62\x61se\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x66\x65\x65ppm\x18\x03 \x01(\rH\x01\x88\x01\x01\x12!\n\x07htlcmin\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12!\n\x07htlcmax\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x19\n\x0c\x65nforcedelay\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1c\n\x0fignorefeelimits\x18\x07 \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_feebaseB\t\n\x07_feeppmB\n\n\x08_htlcminB\n\n\x08_htlcmaxB\x0f\n\r_enforcedelayB\x12\n\x10_ignorefeelimits\"?\n\x12SetchannelResponse\x12)\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x17.cln.SetchannelChannels\"\xca\x03\n\x12SetchannelChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\x12\x1e\n\x11ignore_fee_limits\x18\n \x01(\x08H\x01\x88\x01\x01\x12*\n\x15minimum_htlc_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x17warning_htlcmin_too_low\x18\x07 \x01(\tH\x02\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\x03\x88\x01\x01\x42\x13\n\x11_short_channel_idB\x14\n\x12_ignore_fee_limitsB\x1a\n\x18_warning_htlcmin_too_lowB\x1b\n\x19_warning_htlcmax_too_high\"\'\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\"\r\n\x0bStopRequest\"\x0e\n\x0cStopResponse\"\xa7\x01\n\x18PreapprovekeysendRequest\x12\x18\n\x0b\x64\x65stination\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x42\x0e\n\x0c_destinationB\x0f\n\r_payment_hashB\x0e\n\x0c_amount_msat\"\x1b\n\x19PreapprovekeysendResponse\":\n\x18PreapproveinvoiceRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_bolt11\"\x1b\n\x19PreapproveinvoiceResponse\"\x15\n\x13StaticbackupRequest\"#\n\x14StaticbackupResponse\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\x32\x8f\x1d\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\x12Q\n\x10\x41utoCleanInvoice\x12\x1c.cln.AutocleaninvoiceRequest\x1a\x1d.cln.AutocleaninvoiceResponse\"\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\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\x12T\n\x11\x44\x65lExpiredInvoice\x12\x1d.cln.DelexpiredinvoiceRequest\x1a\x1e.cln.DelexpiredinvoiceResponse\"\x00\x12?\n\nDelInvoice\x12\x16.cln.DelinvoiceRequest\x1a\x17.cln.DelinvoiceResponse\"\x00\x12\x36\n\x07Invoice\x12\x13.cln.InvoiceRequest\x1a\x14.cln.InvoiceResponse\"\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\x03Pay\x12\x0f.cln.PayRequest\x1a\x10.cln.PayResponse\"\x00\x12<\n\tListNodes\x12\x15.cln.ListnodesRequest\x1a\x16.cln.ListnodesResponse\"\x00\x12K\n\x0eWaitAnyInvoice\x12\x1a.cln.WaitanyinvoiceRequest\x1a\x1b.cln.WaitanyinvoiceResponse\"\x00\x12\x42\n\x0bWaitInvoice\x12\x17.cln.WaitinvoiceRequest\x1a\x18.cln.WaitinvoiceResponse\"\x00\x12\x42\n\x0bWaitSendPay\x12\x17.cln.WaitsendpayRequest\x1a\x18.cln.WaitsendpayResponse\"\x00\x12\x36\n\x07NewAddr\x12\x13.cln.NewaddrRequest\x1a\x14.cln.NewaddrResponse\"\x00\x12\x39\n\x08Withdraw\x12\x14.cln.WithdrawRequest\x1a\x15.cln.WithdrawResponse\"\x00\x12\x36\n\x07KeySend\x12\x13.cln.KeysendRequest\x1a\x14.cln.KeysendResponse\"\x00\x12\x39\n\x08\x46undPsbt\x12\x14.cln.FundpsbtRequest\x1a\x15.cln.FundpsbtResponse\"\x00\x12\x39\n\x08SendPsbt\x12\x14.cln.SendpsbtRequest\x1a\x15.cln.SendpsbtResponse\"\x00\x12\x39\n\x08SignPsbt\x12\x14.cln.SignpsbtRequest\x1a\x15.cln.SignpsbtResponse\"\x00\x12\x39\n\x08UtxoPsbt\x12\x14.cln.UtxopsbtRequest\x1a\x15.cln.UtxopsbtResponse\"\x00\x12<\n\tTxDiscard\x12\x15.cln.TxdiscardRequest\x1a\x16.cln.TxdiscardResponse\"\x00\x12<\n\tTxPrepare\x12\x15.cln.TxprepareRequest\x1a\x16.cln.TxprepareResponse\"\x00\x12\x33\n\x06TxSend\x12\x12.cln.TxsendRequest\x1a\x13.cln.TxsendResponse\"\x00\x12Q\n\x10ListPeerChannels\x12\x1c.cln.ListpeerchannelsRequest\x1a\x1d.cln.ListpeerchannelsResponse\"\x00\x12W\n\x12ListClosedChannels\x12\x1e.cln.ListclosedchannelsRequest\x1a\x1f.cln.ListclosedchannelsResponse\"\x00\x12<\n\tDecodePay\x12\x15.cln.DecodepayRequest\x1a\x16.cln.DecodepayResponse\"\x00\x12\x33\n\x06\x44\x65\x63ode\x12\x12.cln.DecodeRequest\x1a\x13.cln.DecodeResponse\"\x00\x12?\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\x46undChannel\x12\x17.cln.FundchannelRequest\x1a\x18.cln.FundchannelResponse\"\x00\x12\x39\n\x08GetRoute\x12\x14.cln.GetrouteRequest\x1a\x15.cln.GetrouteResponse\"\x00\x12\x45\n\x0cListForwards\x12\x18.cln.ListforwardsRequest\x1a\x19.cln.ListforwardsResponse\"\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\x12-\n\x04Ping\x12\x10.cln.PingRequest\x1a\x11.cln.PingResponse\"\x00\x12H\n\rSendCustomMsg\x12\x19.cln.SendcustommsgRequest\x1a\x1a.cln.SendcustommsgResponse\"\x00\x12?\n\nSetChannel\x12\x16.cln.SetchannelRequest\x1a\x17.cln.SetchannelResponse\"\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\x04Stop\x12\x10.cln.StopRequest\x1a\x11.cln.StopResponse\"\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\x62\x06proto3') -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'node_pb2', _globals) +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'node_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None - _globals['_GETINFOREQUEST']._serialized_start=37 - _globals['_GETINFOREQUEST']._serialized_end=53 - _globals['_GETINFORESPONSE']._serialized_start=56 - _globals['_GETINFORESPONSE']._serialized_end=633 - _globals['_GETINFOOUR_FEATURES']._serialized_start=635 - _globals['_GETINFOOUR_FEATURES']._serialized_end=718 - _globals['_GETINFOADDRESS']._serialized_start=721 - _globals['_GETINFOADDRESS']._serialized_end=917 - _globals['_GETINFOADDRESS_GETINFOADDRESSTYPE']._serialized_start=834 - _globals['_GETINFOADDRESS_GETINFOADDRESSTYPE']._serialized_end=905 - _globals['_GETINFOBINDING']._serialized_start=920 - _globals['_GETINFOBINDING']._serialized_end=1186 - _globals['_GETINFOBINDING_GETINFOBINDINGTYPE']._serialized_start=1059 - _globals['_GETINFOBINDING_GETINFOBINDINGTYPE']._serialized_end=1154 - _globals['_LISTPEERSREQUEST']._serialized_start=1188 - _globals['_LISTPEERSREQUEST']._serialized_end=1260 - _globals['_LISTPEERSRESPONSE']._serialized_start=1262 - _globals['_LISTPEERSRESPONSE']._serialized_end=1317 - _globals['_LISTPEERSPEERS']._serialized_start=1320 - _globals['_LISTPEERSPEERS']._serialized_end=1590 - _globals['_LISTPEERSPEERSLOG']._serialized_start=1593 - _globals['_LISTPEERSPEERSLOG']._serialized_end=1974 - _globals['_LISTPEERSPEERSLOG_LISTPEERSPEERSLOGTYPE']._serialized_start=1804 - _globals['_LISTPEERSPEERSLOG_LISTPEERSPEERSLOGTYPE']._serialized_end=1909 - _globals['_LISTPEERSPEERSCHANNELS']._serialized_start=1977 - _globals['_LISTPEERSPEERSCHANNELS']._serialized_end=5007 - _globals['_LISTPEERSPEERSCHANNELS_LISTPEERSPEERSCHANNELSSTATE']._serialized_start=3877 - _globals['_LISTPEERSPEERSCHANNELS_LISTPEERSPEERSCHANNELSSTATE']._serialized_end=4166 - _globals['_LISTPEERSPEERSCHANNELSFEERATE']._serialized_start=5009 - _globals['_LISTPEERSPEERSCHANNELSFEERATE']._serialized_end=5070 - _globals['_LISTPEERSPEERSCHANNELSINFLIGHT']._serialized_start=5073 - _globals['_LISTPEERSPEERSCHANNELSINFLIGHT']._serialized_end=5316 - _globals['_LISTPEERSPEERSCHANNELSFUNDING']._serialized_start=5319 - _globals['_LISTPEERSPEERSCHANNELSFUNDING']._serialized_end=5602 - _globals['_LISTPEERSPEERSCHANNELSALIAS']._serialized_start=5604 - _globals['_LISTPEERSPEERSCHANNELSALIAS']._serialized_end=5695 - _globals['_LISTPEERSPEERSCHANNELSHTLCS']._serialized_start=5698 - _globals['_LISTPEERSPEERSCHANNELSHTLCS']._serialized_end=6067 - _globals['_LISTPEERSPEERSCHANNELSHTLCS_LISTPEERSPEERSCHANNELSHTLCSDIRECTION']._serialized_start=5983 - _globals['_LISTPEERSPEERSCHANNELSHTLCS_LISTPEERSPEERSCHANNELSHTLCSDIRECTION']._serialized_end=6038 - _globals['_LISTFUNDSREQUEST']._serialized_start=6069 - _globals['_LISTFUNDSREQUEST']._serialized_end=6117 - _globals['_LISTFUNDSRESPONSE']._serialized_start=6119 - _globals['_LISTFUNDSRESPONSE']._serialized_end=6220 - _globals['_LISTFUNDSOUTPUTS']._serialized_start=6223 - _globals['_LISTFUNDSOUTPUTS']._serialized_end=6610 - _globals['_LISTFUNDSOUTPUTS_LISTFUNDSOUTPUTSSTATUS']._serialized_start=6484 - _globals['_LISTFUNDSOUTPUTS_LISTFUNDSOUTPUTSSTATUS']._serialized_end=6565 - _globals['_LISTFUNDSCHANNELS']._serialized_start=6613 - _globals['_LISTFUNDSCHANNELS']._serialized_end=6912 - _globals['_SENDPAYREQUEST']._serialized_start=6915 - _globals['_SENDPAYREQUEST']._serialized_end=7264 - _globals['_SENDPAYRESPONSE']._serialized_start=7267 - _globals['_SENDPAYRESPONSE']._serialized_end=7860 - _globals['_SENDPAYRESPONSE_SENDPAYSTATUS']._serialized_start=7681 - _globals['_SENDPAYRESPONSE_SENDPAYSTATUS']._serialized_end=7723 - _globals['_SENDPAYROUTE']._serialized_start=7862 - _globals['_SENDPAYROUTE']._serialized_end=7954 - _globals['_LISTCHANNELSREQUEST']._serialized_start=7957 - _globals['_LISTCHANNELSREQUEST']._serialized_end=8104 - _globals['_LISTCHANNELSRESPONSE']._serialized_start=8106 - _globals['_LISTCHANNELSRESPONSE']._serialized_end=8173 - _globals['_LISTCHANNELSCHANNELS']._serialized_start=8176 - _globals['_LISTCHANNELSCHANNELS']._serialized_end=8611 - _globals['_ADDGOSSIPREQUEST']._serialized_start=8613 - _globals['_ADDGOSSIPREQUEST']._serialized_end=8648 - _globals['_ADDGOSSIPRESPONSE']._serialized_start=8650 - _globals['_ADDGOSSIPRESPONSE']._serialized_end=8669 - _globals['_AUTOCLEANINVOICEREQUEST']._serialized_start=8671 - _globals['_AUTOCLEANINVOICEREQUEST']._serialized_end=8782 - _globals['_AUTOCLEANINVOICERESPONSE']._serialized_start=8785 - _globals['_AUTOCLEANINVOICERESPONSE']._serialized_end=8914 - _globals['_CHECKMESSAGEREQUEST']._serialized_start=8916 - _globals['_CHECKMESSAGEREQUEST']._serialized_end=9001 - _globals['_CHECKMESSAGERESPONSE']._serialized_start=9003 - _globals['_CHECKMESSAGERESPONSE']._serialized_end=9059 - _globals['_CLOSEREQUEST']._serialized_start=9062 - _globals['_CLOSEREQUEST']._serialized_end=9393 - _globals['_CLOSERESPONSE']._serialized_start=9396 - _globals['_CLOSERESPONSE']._serialized_end=9567 - _globals['_CLOSERESPONSE_CLOSETYPE']._serialized_start=9498 - _globals['_CLOSERESPONSE_CLOSETYPE']._serialized_end=9551 - _globals['_CONNECTREQUEST']._serialized_start=9569 - _globals['_CONNECTREQUEST']._serialized_end=9653 - _globals['_CONNECTRESPONSE']._serialized_start=9656 - _globals['_CONNECTRESPONSE']._serialized_end=9836 - _globals['_CONNECTRESPONSE_CONNECTDIRECTION']._serialized_start=9801 - _globals['_CONNECTRESPONSE_CONNECTDIRECTION']._serialized_end=9836 - _globals['_CONNECTADDRESS']._serialized_start=9839 - _globals['_CONNECTADDRESS']._serialized_end=10090 - _globals['_CONNECTADDRESS_CONNECTADDRESSTYPE']._serialized_start=9978 - _globals['_CONNECTADDRESS_CONNECTADDRESSTYPE']._serialized_end=10058 - _globals['_CREATEINVOICEREQUEST']._serialized_start=10092 - _globals['_CREATEINVOICEREQUEST']._serialized_end=10166 - _globals['_CREATEINVOICERESPONSE']._serialized_start=10169 - _globals['_CREATEINVOICERESPONSE']._serialized_end=10856 - _globals['_CREATEINVOICERESPONSE_CREATEINVOICESTATUS']._serialized_start=10631 - _globals['_CREATEINVOICERESPONSE_CREATEINVOICESTATUS']._serialized_end=10687 - _globals['_DATASTOREREQUEST']._serialized_start=10859 - _globals['_DATASTOREREQUEST']._serialized_end=11167 - _globals['_DATASTOREREQUEST_DATASTOREMODE']._serialized_start=11012 - _globals['_DATASTOREREQUEST_DATASTOREMODE']._serialized_end=11124 - _globals['_DATASTORERESPONSE']._serialized_start=11170 - _globals['_DATASTORERESPONSE']._serialized_end=11300 - _globals['_CREATEONIONREQUEST']._serialized_start=11303 - _globals['_CREATEONIONREQUEST']._serialized_end=11460 - _globals['_CREATEONIONRESPONSE']._serialized_start=11462 - _globals['_CREATEONIONRESPONSE']._serialized_end=11522 - _globals['_CREATEONIONHOPS']._serialized_start=11524 - _globals['_CREATEONIONHOPS']._serialized_end=11574 - _globals['_DELDATASTOREREQUEST']._serialized_start=11576 - _globals['_DELDATASTOREREQUEST']._serialized_end=11650 - _globals['_DELDATASTORERESPONSE']._serialized_start=11653 - _globals['_DELDATASTORERESPONSE']._serialized_end=11786 - _globals['_DELEXPIREDINVOICEREQUEST']._serialized_start=11788 - _globals['_DELEXPIREDINVOICEREQUEST']._serialized_end=11860 - _globals['_DELEXPIREDINVOICERESPONSE']._serialized_start=11862 - _globals['_DELEXPIREDINVOICERESPONSE']._serialized_end=11889 - _globals['_DELINVOICEREQUEST']._serialized_start=11892 - _globals['_DELINVOICEREQUEST']._serialized_end=12074 - _globals['_DELINVOICEREQUEST_DELINVOICESTATUS']._serialized_start=12008 - _globals['_DELINVOICEREQUEST_DELINVOICESTATUS']._serialized_end=12061 - _globals['_DELINVOICERESPONSE']._serialized_start=12077 - _globals['_DELINVOICERESPONSE']._serialized_end=12622 - _globals['_DELINVOICERESPONSE_DELINVOICESTATUS']._serialized_start=12008 - _globals['_DELINVOICERESPONSE_DELINVOICESTATUS']._serialized_end=12061 - _globals['_INVOICEREQUEST']._serialized_start=12625 - _globals['_INVOICEREQUEST']._serialized_end=12875 - _globals['_INVOICERESPONSE']._serialized_start=12878 - _globals['_INVOICERESPONSE']._serialized_end=13283 - _globals['_LISTDATASTOREREQUEST']._serialized_start=13285 - _globals['_LISTDATASTOREREQUEST']._serialized_end=13320 - _globals['_LISTDATASTORERESPONSE']._serialized_start=13322 - _globals['_LISTDATASTORERESPONSE']._serialized_end=13393 - _globals['_LISTDATASTOREDATASTORE']._serialized_start=13396 - _globals['_LISTDATASTOREDATASTORE']._serialized_end=13531 - _globals['_LISTINVOICESREQUEST']._serialized_start=13534 - _globals['_LISTINVOICESREQUEST']._serialized_end=13884 - _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_start=13755 - _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_end=13800 - _globals['_LISTINVOICESRESPONSE']._serialized_start=13886 - _globals['_LISTINVOICESRESPONSE']._serialized_end=13953 - _globals['_LISTINVOICESINVOICES']._serialized_start=13956 - _globals['_LISTINVOICESINVOICES']._serialized_end=14722 - _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_start=14456 - _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_end=14519 - _globals['_SENDONIONREQUEST']._serialized_start=14725 - _globals['_SENDONIONREQUEST']._serialized_end=15119 - _globals['_SENDONIONRESPONSE']._serialized_start=15122 - _globals['_SENDONIONRESPONSE']._serialized_end=15645 - _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_start=15493 - _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_end=15537 - _globals['_SENDONIONFIRST_HOP']._serialized_start=15647 - _globals['_SENDONIONFIRST_HOP']._serialized_end=15728 - _globals['_LISTSENDPAYSREQUEST']._serialized_start=15731 - _globals['_LISTSENDPAYSREQUEST']._serialized_end=15966 - _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_start=15868 - _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_end=15927 - _globals['_LISTSENDPAYSRESPONSE']._serialized_start=15968 - _globals['_LISTSENDPAYSRESPONSE']._serialized_end=16035 - _globals['_LISTSENDPAYSPAYMENTS']._serialized_start=16038 - _globals['_LISTSENDPAYSPAYMENTS']._serialized_end=16666 - _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_start=16472 - _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_end=16539 - _globals['_LISTTRANSACTIONSREQUEST']._serialized_start=16668 - _globals['_LISTTRANSACTIONSREQUEST']._serialized_end=16693 - _globals['_LISTTRANSACTIONSRESPONSE']._serialized_start=16695 - _globals['_LISTTRANSACTIONSRESPONSE']._serialized_end=16778 - _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_start=16781 - _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_end=17029 - _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_start=17031 - _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_end=17114 - _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_start=17116 - _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_end=17224 - _globals['_PAYREQUEST']._serialized_start=17227 - _globals['_PAYREQUEST']._serialized_end=17701 - _globals['_PAYRESPONSE']._serialized_start=17704 - _globals['_PAYRESPONSE']._serialized_end=18083 - _globals['_PAYRESPONSE_PAYSTATUS']._serialized_start=17986 - _globals['_PAYRESPONSE_PAYSTATUS']._serialized_end=18036 - _globals['_LISTNODESREQUEST']._serialized_start=18085 - _globals['_LISTNODESREQUEST']._serialized_end=18127 - _globals['_LISTNODESRESPONSE']._serialized_start=18129 - _globals['_LISTNODESRESPONSE']._serialized_end=18184 - _globals['_LISTNODESNODES']._serialized_start=18187 - _globals['_LISTNODESNODES']._serialized_end=18412 - _globals['_LISTNODESNODESADDRESSES']._serialized_start=18415 - _globals['_LISTNODESNODESADDRESSES']._serialized_end=18647 - _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_start=18555 - _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_end=18635 - _globals['_WAITANYINVOICEREQUEST']._serialized_start=18649 - _globals['_WAITANYINVOICEREQUEST']._serialized_end=18752 - _globals['_WAITANYINVOICERESPONSE']._serialized_start=18755 - _globals['_WAITANYINVOICERESPONSE']._serialized_end=19378 - _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_start=19187 - _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_end=19232 - _globals['_WAITINVOICEREQUEST']._serialized_start=19380 - _globals['_WAITINVOICEREQUEST']._serialized_end=19415 - _globals['_WAITINVOICERESPONSE']._serialized_start=19418 - _globals['_WAITINVOICERESPONSE']._serialized_end=20029 - _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_start=19841 - _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_end=19883 - _globals['_WAITSENDPAYREQUEST']._serialized_start=20032 - _globals['_WAITSENDPAYREQUEST']._serialized_end=20174 - _globals['_WAITSENDPAYRESPONSE']._serialized_start=20177 - _globals['_WAITSENDPAYRESPONSE']._serialized_end=20739 - _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_start=20581 - _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_end=20614 - _globals['_NEWADDRREQUEST']._serialized_start=20742 - _globals['_NEWADDRREQUEST']._serialized_end=20893 - _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_start=20826 - _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_end=20877 - _globals['_NEWADDRRESPONSE']._serialized_start=20895 - _globals['_NEWADDRRESPONSE']._serialized_end=21014 - _globals['_WITHDRAWREQUEST']._serialized_start=21017 - _globals['_WITHDRAWREQUEST']._serialized_end=21219 - _globals['_WITHDRAWRESPONSE']._serialized_start=21221 - _globals['_WITHDRAWRESPONSE']._serialized_end=21279 - _globals['_KEYSENDREQUEST']._serialized_start=21282 - _globals['_KEYSENDREQUEST']._serialized_end=21668 - _globals['_KEYSENDRESPONSE']._serialized_start=21671 - _globals['_KEYSENDRESPONSE']._serialized_end=22041 - _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_start=21965 - _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_end=21994 - _globals['_FUNDPSBTREQUEST']._serialized_start=22044 - _globals['_FUNDPSBTREQUEST']._serialized_end=22464 - _globals['_FUNDPSBTRESPONSE']._serialized_start=22467 - _globals['_FUNDPSBTRESPONSE']._serialized_end=22684 - _globals['_FUNDPSBTRESERVATIONS']._serialized_start=22686 - _globals['_FUNDPSBTRESERVATIONS']._serialized_end=22803 - _globals['_SENDPSBTREQUEST']._serialized_start=22805 - _globals['_SENDPSBTREQUEST']._serialized_end=22870 - _globals['_SENDPSBTRESPONSE']._serialized_start=22872 - _globals['_SENDPSBTRESPONSE']._serialized_end=22916 - _globals['_SIGNPSBTREQUEST']._serialized_start=22918 - _globals['_SIGNPSBTREQUEST']._serialized_end=22967 - _globals['_SIGNPSBTRESPONSE']._serialized_start=22969 - _globals['_SIGNPSBTRESPONSE']._serialized_end=23008 - _globals['_UTXOPSBTREQUEST']._serialized_start=23011 - _globals['_UTXOPSBTREQUEST']._serialized_end=23422 - _globals['_UTXOPSBTRESPONSE']._serialized_start=23425 - _globals['_UTXOPSBTRESPONSE']._serialized_end=23642 - _globals['_UTXOPSBTRESERVATIONS']._serialized_start=23644 - _globals['_UTXOPSBTRESERVATIONS']._serialized_end=23761 - _globals['_TXDISCARDREQUEST']._serialized_start=23763 - _globals['_TXDISCARDREQUEST']._serialized_end=23795 - _globals['_TXDISCARDRESPONSE']._serialized_start=23797 - _globals['_TXDISCARDRESPONSE']._serialized_end=23851 - _globals['_TXPREPAREREQUEST']._serialized_start=23854 - _globals['_TXPREPAREREQUEST']._serialized_end=24018 - _globals['_TXPREPARERESPONSE']._serialized_start=24020 - _globals['_TXPREPARERESPONSE']._serialized_end=24088 - _globals['_TXSENDREQUEST']._serialized_start=24090 - _globals['_TXSENDREQUEST']._serialized_end=24119 - _globals['_TXSENDRESPONSE']._serialized_start=24121 - _globals['_TXSENDRESPONSE']._serialized_end=24177 - _globals['_LISTPEERCHANNELSREQUEST']._serialized_start=24179 - _globals['_LISTPEERCHANNELSREQUEST']._serialized_end=24228 - _globals['_LISTPEERCHANNELSRESPONSE']._serialized_start=24230 - _globals['_LISTPEERCHANNELSRESPONSE']._serialized_end=24305 - _globals['_LISTPEERCHANNELSCHANNELS']._serialized_start=24308 - _globals['_LISTPEERCHANNELSCHANNELS']._serialized_end=27535 - _globals['_LISTPEERCHANNELSCHANNELS_LISTPEERCHANNELSCHANNELSSTATE']._serialized_start=26299 - _globals['_LISTPEERCHANNELSCHANNELS_LISTPEERCHANNELSCHANNELSSTATE']._serialized_end=26620 - _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_start=27537 - _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_end=27630 - _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_start=27633 - _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_end=28017 - _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_start=28020 - _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_end=28358 - _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_start=28360 - _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_end=28453 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_start=28456 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_end=28938 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_start=28777 - _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_end=28834 - _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_start=28940 - _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_end=28991 - _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_start=28993 - _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_end=29084 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_start=29087 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_end=30289 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSE_CAUSE']._serialized_start=29987 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSE_CAUSE']._serialized_end=30105 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_start=30291 - _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_end=30392 - _globals['_DECODEPAYREQUEST']._serialized_start=30394 - _globals['_DECODEPAYREQUEST']._serialized_end=30470 - _globals['_DECODEPAYRESPONSE']._serialized_start=30473 - _globals['_DECODEPAYRESPONSE']._serialized_end=30998 - _globals['_DECODEPAYFALLBACKS']._serialized_start=31001 - _globals['_DECODEPAYFALLBACKS']._serialized_end=31199 - _globals['_DECODEPAYFALLBACKS_DECODEPAYFALLBACKSTYPE']._serialized_start=31122 - _globals['_DECODEPAYFALLBACKS_DECODEPAYFALLBACKSTYPE']._serialized_end=31190 - _globals['_DECODEPAYEXTRA']._serialized_start=31201 - _globals['_DECODEPAYEXTRA']._serialized_end=31244 - _globals['_DECODEREQUEST']._serialized_start=31246 - _globals['_DECODEREQUEST']._serialized_end=31277 - _globals['_DECODERESPONSE']._serialized_start=31280 - _globals['_DECODERESPONSE']._serialized_end=35546 - _globals['_DECODERESPONSE_DECODETYPE']._serialized_start=33848 - _globals['_DECODERESPONSE_DECODETYPE']._serialized_end=33956 - _globals['_DECODEOFFER_PATHS']._serialized_start=35548 - _globals['_DECODEOFFER_PATHS']._serialized_end=35608 - _globals['_DECODEOFFER_RECURRENCEPAYWINDOW']._serialized_start=35611 - _globals['_DECODEOFFER_RECURRENCEPAYWINDOW']._serialized_end=35749 - _globals['_DECODEINVOICE_PATHSPATH']._serialized_start=35751 - _globals['_DECODEINVOICE_PATHSPATH']._serialized_end=35835 - _globals['_DECODEINVOICE_FALLBACKS']._serialized_start=35837 - _globals['_DECODEINVOICE_FALLBACKS']._serialized_end=35926 - _globals['_DECODEFALLBACKS']._serialized_start=35928 - _globals['_DECODEFALLBACKS']._serialized_end=36047 - _globals['_DECODEEXTRA']._serialized_start=36049 - _globals['_DECODEEXTRA']._serialized_end=36089 - _globals['_DECODERESTRICTIONS']._serialized_start=36091 - _globals['_DECODERESTRICTIONS']._serialized_end=36150 - _globals['_DISCONNECTREQUEST']._serialized_start=36152 - _globals['_DISCONNECTREQUEST']._serialized_end=36213 - _globals['_DISCONNECTRESPONSE']._serialized_start=36215 - _globals['_DISCONNECTRESPONSE']._serialized_end=36235 - _globals['_FEERATESREQUEST']._serialized_start=36237 - _globals['_FEERATESREQUEST']._serialized_end=36344 - _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_start=36307 - _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_end=36344 - _globals['_FEERATESRESPONSE']._serialized_start=36347 - _globals['_FEERATESRESPONSE']._serialized_end=36631 - _globals['_FEERATESPERKB']._serialized_start=36634 - _globals['_FEERATESPERKB']._serialized_end=37101 - _globals['_FEERATESPERKBESTIMATES']._serialized_start=37104 - _globals['_FEERATESPERKBESTIMATES']._serialized_end=37254 - _globals['_FEERATESPERKW']._serialized_start=37257 - _globals['_FEERATESPERKW']._serialized_end=37724 - _globals['_FEERATESPERKWESTIMATES']._serialized_start=37727 - _globals['_FEERATESPERKWESTIMATES']._serialized_end=37877 - _globals['_FEERATESONCHAIN_FEE_ESTIMATES']._serialized_start=37880 - _globals['_FEERATESONCHAIN_FEE_ESTIMATES']._serialized_end=38163 - _globals['_FUNDCHANNELREQUEST']._serialized_start=38166 - _globals['_FUNDCHANNELREQUEST']._serialized_end=38651 - _globals['_FUNDCHANNELRESPONSE']._serialized_start=38654 - _globals['_FUNDCHANNELRESPONSE']._serialized_end=38809 - _globals['_GETROUTEREQUEST']._serialized_start=38812 - _globals['_GETROUTEREQUEST']._serialized_end=39048 - _globals['_GETROUTERESPONSE']._serialized_start=39050 - _globals['_GETROUTERESPONSE']._serialized_end=39103 - _globals['_GETROUTEROUTE']._serialized_start=39106 - _globals['_GETROUTEROUTE']._serialized_end=39303 - _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_start=39274 - _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_end=39303 - _globals['_LISTFORWARDSREQUEST']._serialized_start=39306 - _globals['_LISTFORWARDSREQUEST']._serialized_end=39564 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_start=39446 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_end=39522 - _globals['_LISTFORWARDSRESPONSE']._serialized_start=39566 - _globals['_LISTFORWARDSRESPONSE']._serialized_end=39633 - _globals['_LISTFORWARDSFORWARDS']._serialized_start=39636 - _globals['_LISTFORWARDSFORWARDS']._serialized_end=40242 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_start=40025 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_end=40109 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_start=40111 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_end=40159 - _globals['_LISTPAYSREQUEST']._serialized_start=40245 - _globals['_LISTPAYSREQUEST']._serialized_end=40464 - _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_start=40370 - _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_end=40425 - _globals['_LISTPAYSRESPONSE']._serialized_start=40466 - _globals['_LISTPAYSRESPONSE']._serialized_end=40517 - _globals['_LISTPAYSPAYS']._serialized_start=40520 - _globals['_LISTPAYSPAYS']._serialized_end=41159 - _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_start=40934 - _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_end=40993 - _globals['_LISTHTLCSREQUEST']._serialized_start=41161 - _globals['_LISTHTLCSREQUEST']._serialized_end=41203 - _globals['_LISTHTLCSRESPONSE']._serialized_start=41205 - _globals['_LISTHTLCSRESPONSE']._serialized_end=41260 - _globals['_LISTHTLCSHTLCS']._serialized_start=41263 - _globals['_LISTHTLCSHTLCS']._serialized_end=41528 - _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_start=41486 - _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_end=41528 - _globals['_PINGREQUEST']._serialized_start=41530 - _globals['_PINGREQUEST']._serialized_end=41619 - _globals['_PINGRESPONSE']._serialized_start=41621 - _globals['_PINGRESPONSE']._serialized_end=41651 - _globals['_SENDCUSTOMMSGREQUEST']._serialized_start=41653 - _globals['_SENDCUSTOMMSGREQUEST']._serialized_end=41705 - _globals['_SENDCUSTOMMSGRESPONSE']._serialized_start=41707 - _globals['_SENDCUSTOMMSGRESPONSE']._serialized_end=41746 - _globals['_SETCHANNELREQUEST']._serialized_start=41749 - _globals['_SETCHANNELREQUEST']._serialized_end=42047 - _globals['_SETCHANNELRESPONSE']._serialized_start=42049 - _globals['_SETCHANNELRESPONSE']._serialized_end=42112 - _globals['_SETCHANNELCHANNELS']._serialized_start=42115 - _globals['_SETCHANNELCHANNELS']._serialized_end=42573 - _globals['_SIGNINVOICEREQUEST']._serialized_start=42575 - _globals['_SIGNINVOICEREQUEST']._serialized_end=42614 - _globals['_SIGNINVOICERESPONSE']._serialized_start=42616 - _globals['_SIGNINVOICERESPONSE']._serialized_end=42653 - _globals['_SIGNMESSAGEREQUEST']._serialized_start=42655 - _globals['_SIGNMESSAGEREQUEST']._serialized_end=42692 - _globals['_SIGNMESSAGERESPONSE']._serialized_start=42694 - _globals['_SIGNMESSAGERESPONSE']._serialized_end=42764 - _globals['_STOPREQUEST']._serialized_start=42766 - _globals['_STOPREQUEST']._serialized_end=42779 - _globals['_STOPRESPONSE']._serialized_start=42781 - _globals['_STOPRESPONSE']._serialized_end=42795 - _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_start=42798 - _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_end=42965 - _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_start=42967 - _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_end=42994 - _globals['_PREAPPROVEINVOICEREQUEST']._serialized_start=42996 - _globals['_PREAPPROVEINVOICEREQUEST']._serialized_end=43054 - _globals['_PREAPPROVEINVOICERESPONSE']._serialized_start=43056 - _globals['_PREAPPROVEINVOICERESPONSE']._serialized_end=43083 - _globals['_STATICBACKUPREQUEST']._serialized_start=43085 - _globals['_STATICBACKUPREQUEST']._serialized_end=43106 - _globals['_STATICBACKUPRESPONSE']._serialized_start=43108 - _globals['_STATICBACKUPRESPONSE']._serialized_end=43143 - _globals['_NODE']._serialized_start=43146 - _globals['_NODE']._serialized_end=46873 + _GETINFOREQUEST._serialized_start=37 + _GETINFOREQUEST._serialized_end=53 + _GETINFORESPONSE._serialized_start=56 + _GETINFORESPONSE._serialized_end=633 + _GETINFOOUR_FEATURES._serialized_start=635 + _GETINFOOUR_FEATURES._serialized_end=718 + _GETINFOADDRESS._serialized_start=721 + _GETINFOADDRESS._serialized_end=917 + _GETINFOADDRESS_GETINFOADDRESSTYPE._serialized_start=834 + _GETINFOADDRESS_GETINFOADDRESSTYPE._serialized_end=905 + _GETINFOBINDING._serialized_start=920 + _GETINFOBINDING._serialized_end=1186 + _GETINFOBINDING_GETINFOBINDINGTYPE._serialized_start=1059 + _GETINFOBINDING_GETINFOBINDINGTYPE._serialized_end=1154 + _LISTPEERSREQUEST._serialized_start=1188 + _LISTPEERSREQUEST._serialized_end=1260 + _LISTPEERSRESPONSE._serialized_start=1262 + _LISTPEERSRESPONSE._serialized_end=1317 + _LISTPEERSPEERS._serialized_start=1320 + _LISTPEERSPEERS._serialized_end=1590 + _LISTPEERSPEERSLOG._serialized_start=1593 + _LISTPEERSPEERSLOG._serialized_end=1974 + _LISTPEERSPEERSLOG_LISTPEERSPEERSLOGTYPE._serialized_start=1804 + _LISTPEERSPEERSLOG_LISTPEERSPEERSLOGTYPE._serialized_end=1909 + _LISTPEERSPEERSCHANNELS._serialized_start=1977 + _LISTPEERSPEERSCHANNELS._serialized_end=5007 + _LISTPEERSPEERSCHANNELS_LISTPEERSPEERSCHANNELSSTATE._serialized_start=3877 + _LISTPEERSPEERSCHANNELS_LISTPEERSPEERSCHANNELSSTATE._serialized_end=4166 + _LISTPEERSPEERSCHANNELSFEERATE._serialized_start=5009 + _LISTPEERSPEERSCHANNELSFEERATE._serialized_end=5070 + _LISTPEERSPEERSCHANNELSINFLIGHT._serialized_start=5073 + _LISTPEERSPEERSCHANNELSINFLIGHT._serialized_end=5316 + _LISTPEERSPEERSCHANNELSFUNDING._serialized_start=5319 + _LISTPEERSPEERSCHANNELSFUNDING._serialized_end=5602 + _LISTPEERSPEERSCHANNELSALIAS._serialized_start=5604 + _LISTPEERSPEERSCHANNELSALIAS._serialized_end=5695 + _LISTPEERSPEERSCHANNELSHTLCS._serialized_start=5698 + _LISTPEERSPEERSCHANNELSHTLCS._serialized_end=6067 + _LISTPEERSPEERSCHANNELSHTLCS_LISTPEERSPEERSCHANNELSHTLCSDIRECTION._serialized_start=5983 + _LISTPEERSPEERSCHANNELSHTLCS_LISTPEERSPEERSCHANNELSHTLCSDIRECTION._serialized_end=6038 + _LISTFUNDSREQUEST._serialized_start=6069 + _LISTFUNDSREQUEST._serialized_end=6117 + _LISTFUNDSRESPONSE._serialized_start=6119 + _LISTFUNDSRESPONSE._serialized_end=6220 + _LISTFUNDSOUTPUTS._serialized_start=6223 + _LISTFUNDSOUTPUTS._serialized_end=6610 + _LISTFUNDSOUTPUTS_LISTFUNDSOUTPUTSSTATUS._serialized_start=6484 + _LISTFUNDSOUTPUTS_LISTFUNDSOUTPUTSSTATUS._serialized_end=6565 + _LISTFUNDSCHANNELS._serialized_start=6613 + _LISTFUNDSCHANNELS._serialized_end=6912 + _SENDPAYREQUEST._serialized_start=6915 + _SENDPAYREQUEST._serialized_end=7264 + _SENDPAYRESPONSE._serialized_start=7267 + _SENDPAYRESPONSE._serialized_end=7860 + _SENDPAYRESPONSE_SENDPAYSTATUS._serialized_start=7681 + _SENDPAYRESPONSE_SENDPAYSTATUS._serialized_end=7723 + _SENDPAYROUTE._serialized_start=7862 + _SENDPAYROUTE._serialized_end=7954 + _LISTCHANNELSREQUEST._serialized_start=7957 + _LISTCHANNELSREQUEST._serialized_end=8104 + _LISTCHANNELSRESPONSE._serialized_start=8106 + _LISTCHANNELSRESPONSE._serialized_end=8173 + _LISTCHANNELSCHANNELS._serialized_start=8176 + _LISTCHANNELSCHANNELS._serialized_end=8611 + _ADDGOSSIPREQUEST._serialized_start=8613 + _ADDGOSSIPREQUEST._serialized_end=8648 + _ADDGOSSIPRESPONSE._serialized_start=8650 + _ADDGOSSIPRESPONSE._serialized_end=8669 + _AUTOCLEANINVOICEREQUEST._serialized_start=8671 + _AUTOCLEANINVOICEREQUEST._serialized_end=8782 + _AUTOCLEANINVOICERESPONSE._serialized_start=8785 + _AUTOCLEANINVOICERESPONSE._serialized_end=8914 + _CHECKMESSAGEREQUEST._serialized_start=8916 + _CHECKMESSAGEREQUEST._serialized_end=9001 + _CHECKMESSAGERESPONSE._serialized_start=9003 + _CHECKMESSAGERESPONSE._serialized_end=9059 + _CLOSEREQUEST._serialized_start=9062 + _CLOSEREQUEST._serialized_end=9393 + _CLOSERESPONSE._serialized_start=9396 + _CLOSERESPONSE._serialized_end=9567 + _CLOSERESPONSE_CLOSETYPE._serialized_start=9498 + _CLOSERESPONSE_CLOSETYPE._serialized_end=9551 + _CONNECTREQUEST._serialized_start=9569 + _CONNECTREQUEST._serialized_end=9653 + _CONNECTRESPONSE._serialized_start=9656 + _CONNECTRESPONSE._serialized_end=9836 + _CONNECTRESPONSE_CONNECTDIRECTION._serialized_start=9801 + _CONNECTRESPONSE_CONNECTDIRECTION._serialized_end=9836 + _CONNECTADDRESS._serialized_start=9839 + _CONNECTADDRESS._serialized_end=10090 + _CONNECTADDRESS_CONNECTADDRESSTYPE._serialized_start=9978 + _CONNECTADDRESS_CONNECTADDRESSTYPE._serialized_end=10058 + _CREATEINVOICEREQUEST._serialized_start=10092 + _CREATEINVOICEREQUEST._serialized_end=10166 + _CREATEINVOICERESPONSE._serialized_start=10169 + _CREATEINVOICERESPONSE._serialized_end=10856 + _CREATEINVOICERESPONSE_CREATEINVOICESTATUS._serialized_start=10631 + _CREATEINVOICERESPONSE_CREATEINVOICESTATUS._serialized_end=10687 + _DATASTOREREQUEST._serialized_start=10859 + _DATASTOREREQUEST._serialized_end=11167 + _DATASTOREREQUEST_DATASTOREMODE._serialized_start=11012 + _DATASTOREREQUEST_DATASTOREMODE._serialized_end=11124 + _DATASTORERESPONSE._serialized_start=11170 + _DATASTORERESPONSE._serialized_end=11300 + _CREATEONIONREQUEST._serialized_start=11303 + _CREATEONIONREQUEST._serialized_end=11460 + _CREATEONIONRESPONSE._serialized_start=11462 + _CREATEONIONRESPONSE._serialized_end=11522 + _CREATEONIONHOPS._serialized_start=11524 + _CREATEONIONHOPS._serialized_end=11574 + _DELDATASTOREREQUEST._serialized_start=11576 + _DELDATASTOREREQUEST._serialized_end=11650 + _DELDATASTORERESPONSE._serialized_start=11653 + _DELDATASTORERESPONSE._serialized_end=11786 + _DELEXPIREDINVOICEREQUEST._serialized_start=11788 + _DELEXPIREDINVOICEREQUEST._serialized_end=11860 + _DELEXPIREDINVOICERESPONSE._serialized_start=11862 + _DELEXPIREDINVOICERESPONSE._serialized_end=11889 + _DELINVOICEREQUEST._serialized_start=11892 + _DELINVOICEREQUEST._serialized_end=12074 + _DELINVOICEREQUEST_DELINVOICESTATUS._serialized_start=12008 + _DELINVOICEREQUEST_DELINVOICESTATUS._serialized_end=12061 + _DELINVOICERESPONSE._serialized_start=12077 + _DELINVOICERESPONSE._serialized_end=12622 + _DELINVOICERESPONSE_DELINVOICESTATUS._serialized_start=12008 + _DELINVOICERESPONSE_DELINVOICESTATUS._serialized_end=12061 + _INVOICEREQUEST._serialized_start=12625 + _INVOICEREQUEST._serialized_end=12875 + _INVOICERESPONSE._serialized_start=12878 + _INVOICERESPONSE._serialized_end=13283 + _LISTDATASTOREREQUEST._serialized_start=13285 + _LISTDATASTOREREQUEST._serialized_end=13320 + _LISTDATASTORERESPONSE._serialized_start=13322 + _LISTDATASTORERESPONSE._serialized_end=13393 + _LISTDATASTOREDATASTORE._serialized_start=13396 + _LISTDATASTOREDATASTORE._serialized_end=13531 + _LISTINVOICESREQUEST._serialized_start=13534 + _LISTINVOICESREQUEST._serialized_end=13884 + _LISTINVOICESREQUEST_LISTINVOICESINDEX._serialized_start=13755 + _LISTINVOICESREQUEST_LISTINVOICESINDEX._serialized_end=13800 + _LISTINVOICESRESPONSE._serialized_start=13886 + _LISTINVOICESRESPONSE._serialized_end=13953 + _LISTINVOICESINVOICES._serialized_start=13956 + _LISTINVOICESINVOICES._serialized_end=14722 + _LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS._serialized_start=14456 + _LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS._serialized_end=14519 + _SENDONIONREQUEST._serialized_start=14725 + _SENDONIONREQUEST._serialized_end=15119 + _SENDONIONRESPONSE._serialized_start=15122 + _SENDONIONRESPONSE._serialized_end=15645 + _SENDONIONRESPONSE_SENDONIONSTATUS._serialized_start=15493 + _SENDONIONRESPONSE_SENDONIONSTATUS._serialized_end=15537 + _SENDONIONFIRST_HOP._serialized_start=15647 + _SENDONIONFIRST_HOP._serialized_end=15728 + _LISTSENDPAYSREQUEST._serialized_start=15731 + _LISTSENDPAYSREQUEST._serialized_end=15966 + _LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS._serialized_start=15868 + _LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS._serialized_end=15927 + _LISTSENDPAYSRESPONSE._serialized_start=15968 + _LISTSENDPAYSRESPONSE._serialized_end=16035 + _LISTSENDPAYSPAYMENTS._serialized_start=16038 + _LISTSENDPAYSPAYMENTS._serialized_end=16666 + _LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS._serialized_start=16472 + _LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS._serialized_end=16539 + _LISTTRANSACTIONSREQUEST._serialized_start=16668 + _LISTTRANSACTIONSREQUEST._serialized_end=16693 + _LISTTRANSACTIONSRESPONSE._serialized_start=16695 + _LISTTRANSACTIONSRESPONSE._serialized_end=16778 + _LISTTRANSACTIONSTRANSACTIONS._serialized_start=16781 + _LISTTRANSACTIONSTRANSACTIONS._serialized_end=17029 + _LISTTRANSACTIONSTRANSACTIONSINPUTS._serialized_start=17031 + _LISTTRANSACTIONSTRANSACTIONSINPUTS._serialized_end=17114 + _LISTTRANSACTIONSTRANSACTIONSOUTPUTS._serialized_start=17116 + _LISTTRANSACTIONSTRANSACTIONSOUTPUTS._serialized_end=17224 + _PAYREQUEST._serialized_start=17227 + _PAYREQUEST._serialized_end=17701 + _PAYRESPONSE._serialized_start=17704 + _PAYRESPONSE._serialized_end=18083 + _PAYRESPONSE_PAYSTATUS._serialized_start=17986 + _PAYRESPONSE_PAYSTATUS._serialized_end=18036 + _LISTNODESREQUEST._serialized_start=18085 + _LISTNODESREQUEST._serialized_end=18127 + _LISTNODESRESPONSE._serialized_start=18129 + _LISTNODESRESPONSE._serialized_end=18184 + _LISTNODESNODES._serialized_start=18187 + _LISTNODESNODES._serialized_end=18412 + _LISTNODESNODESADDRESSES._serialized_start=18415 + _LISTNODESNODESADDRESSES._serialized_end=18647 + _LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE._serialized_start=18555 + _LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE._serialized_end=18635 + _WAITANYINVOICEREQUEST._serialized_start=18649 + _WAITANYINVOICEREQUEST._serialized_end=18752 + _WAITANYINVOICERESPONSE._serialized_start=18755 + _WAITANYINVOICERESPONSE._serialized_end=19378 + _WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS._serialized_start=19187 + _WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS._serialized_end=19232 + _WAITINVOICEREQUEST._serialized_start=19380 + _WAITINVOICEREQUEST._serialized_end=19415 + _WAITINVOICERESPONSE._serialized_start=19418 + _WAITINVOICERESPONSE._serialized_end=20029 + _WAITINVOICERESPONSE_WAITINVOICESTATUS._serialized_start=19841 + _WAITINVOICERESPONSE_WAITINVOICESTATUS._serialized_end=19883 + _WAITSENDPAYREQUEST._serialized_start=20032 + _WAITSENDPAYREQUEST._serialized_end=20174 + _WAITSENDPAYRESPONSE._serialized_start=20177 + _WAITSENDPAYRESPONSE._serialized_end=20739 + _WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS._serialized_start=20581 + _WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS._serialized_end=20614 + _NEWADDRREQUEST._serialized_start=20742 + _NEWADDRREQUEST._serialized_end=20893 + _NEWADDRREQUEST_NEWADDRADDRESSTYPE._serialized_start=20826 + _NEWADDRREQUEST_NEWADDRADDRESSTYPE._serialized_end=20877 + _NEWADDRRESPONSE._serialized_start=20895 + _NEWADDRRESPONSE._serialized_end=21014 + _WITHDRAWREQUEST._serialized_start=21017 + _WITHDRAWREQUEST._serialized_end=21219 + _WITHDRAWRESPONSE._serialized_start=21221 + _WITHDRAWRESPONSE._serialized_end=21279 + _KEYSENDREQUEST._serialized_start=21282 + _KEYSENDREQUEST._serialized_end=21668 + _KEYSENDRESPONSE._serialized_start=21671 + _KEYSENDRESPONSE._serialized_end=22041 + _KEYSENDRESPONSE_KEYSENDSTATUS._serialized_start=21965 + _KEYSENDRESPONSE_KEYSENDSTATUS._serialized_end=21994 + _FUNDPSBTREQUEST._serialized_start=22044 + _FUNDPSBTREQUEST._serialized_end=22464 + _FUNDPSBTRESPONSE._serialized_start=22467 + _FUNDPSBTRESPONSE._serialized_end=22684 + _FUNDPSBTRESERVATIONS._serialized_start=22686 + _FUNDPSBTRESERVATIONS._serialized_end=22803 + _SENDPSBTREQUEST._serialized_start=22805 + _SENDPSBTREQUEST._serialized_end=22870 + _SENDPSBTRESPONSE._serialized_start=22872 + _SENDPSBTRESPONSE._serialized_end=22916 + _SIGNPSBTREQUEST._serialized_start=22918 + _SIGNPSBTREQUEST._serialized_end=22967 + _SIGNPSBTRESPONSE._serialized_start=22969 + _SIGNPSBTRESPONSE._serialized_end=23008 + _UTXOPSBTREQUEST._serialized_start=23011 + _UTXOPSBTREQUEST._serialized_end=23422 + _UTXOPSBTRESPONSE._serialized_start=23425 + _UTXOPSBTRESPONSE._serialized_end=23642 + _UTXOPSBTRESERVATIONS._serialized_start=23644 + _UTXOPSBTRESERVATIONS._serialized_end=23761 + _TXDISCARDREQUEST._serialized_start=23763 + _TXDISCARDREQUEST._serialized_end=23795 + _TXDISCARDRESPONSE._serialized_start=23797 + _TXDISCARDRESPONSE._serialized_end=23851 + _TXPREPAREREQUEST._serialized_start=23854 + _TXPREPAREREQUEST._serialized_end=24018 + _TXPREPARERESPONSE._serialized_start=24020 + _TXPREPARERESPONSE._serialized_end=24088 + _TXSENDREQUEST._serialized_start=24090 + _TXSENDREQUEST._serialized_end=24119 + _TXSENDRESPONSE._serialized_start=24121 + _TXSENDRESPONSE._serialized_end=24177 + _LISTPEERCHANNELSREQUEST._serialized_start=24179 + _LISTPEERCHANNELSREQUEST._serialized_end=24228 + _LISTPEERCHANNELSRESPONSE._serialized_start=24230 + _LISTPEERCHANNELSRESPONSE._serialized_end=24305 + _LISTPEERCHANNELSCHANNELS._serialized_start=24308 + _LISTPEERCHANNELSCHANNELS._serialized_end=27535 + _LISTPEERCHANNELSCHANNELS_LISTPEERCHANNELSCHANNELSSTATE._serialized_start=26299 + _LISTPEERCHANNELSCHANNELS_LISTPEERCHANNELSCHANNELSSTATE._serialized_end=26620 + _LISTPEERCHANNELSCHANNELSFEERATE._serialized_start=27537 + _LISTPEERCHANNELSCHANNELSFEERATE._serialized_end=27630 + _LISTPEERCHANNELSCHANNELSINFLIGHT._serialized_start=27633 + _LISTPEERCHANNELSCHANNELSINFLIGHT._serialized_end=28017 + _LISTPEERCHANNELSCHANNELSFUNDING._serialized_start=28020 + _LISTPEERCHANNELSCHANNELSFUNDING._serialized_end=28358 + _LISTPEERCHANNELSCHANNELSALIAS._serialized_start=28360 + _LISTPEERCHANNELSCHANNELSALIAS._serialized_end=28453 + _LISTPEERCHANNELSCHANNELSHTLCS._serialized_start=28456 + _LISTPEERCHANNELSCHANNELSHTLCS._serialized_end=28938 + _LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION._serialized_start=28777 + _LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION._serialized_end=28834 + _LISTCLOSEDCHANNELSREQUEST._serialized_start=28940 + _LISTCLOSEDCHANNELSREQUEST._serialized_end=28991 + _LISTCLOSEDCHANNELSRESPONSE._serialized_start=28993 + _LISTCLOSEDCHANNELSRESPONSE._serialized_end=29084 + _LISTCLOSEDCHANNELSCLOSEDCHANNELS._serialized_start=29087 + _LISTCLOSEDCHANNELSCLOSEDCHANNELS._serialized_end=30289 + _LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSE_CAUSE._serialized_start=29987 + _LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSE_CAUSE._serialized_end=30105 + _LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS._serialized_start=30291 + _LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS._serialized_end=30392 + _DECODEPAYREQUEST._serialized_start=30394 + _DECODEPAYREQUEST._serialized_end=30470 + _DECODEPAYRESPONSE._serialized_start=30473 + _DECODEPAYRESPONSE._serialized_end=30998 + _DECODEPAYFALLBACKS._serialized_start=31001 + _DECODEPAYFALLBACKS._serialized_end=31199 + _DECODEPAYFALLBACKS_DECODEPAYFALLBACKSTYPE._serialized_start=31122 + _DECODEPAYFALLBACKS_DECODEPAYFALLBACKSTYPE._serialized_end=31190 + _DECODEPAYEXTRA._serialized_start=31201 + _DECODEPAYEXTRA._serialized_end=31244 + _DECODEREQUEST._serialized_start=31246 + _DECODEREQUEST._serialized_end=31277 + _DECODERESPONSE._serialized_start=31280 + _DECODERESPONSE._serialized_end=35546 + _DECODERESPONSE_DECODETYPE._serialized_start=33848 + _DECODERESPONSE_DECODETYPE._serialized_end=33956 + _DECODEOFFER_PATHS._serialized_start=35548 + _DECODEOFFER_PATHS._serialized_end=35608 + _DECODEOFFER_RECURRENCEPAYWINDOW._serialized_start=35611 + _DECODEOFFER_RECURRENCEPAYWINDOW._serialized_end=35749 + _DECODEINVOICE_PATHSPATH._serialized_start=35751 + _DECODEINVOICE_PATHSPATH._serialized_end=35835 + _DECODEINVOICE_FALLBACKS._serialized_start=35837 + _DECODEINVOICE_FALLBACKS._serialized_end=35926 + _DECODEFALLBACKS._serialized_start=35928 + _DECODEFALLBACKS._serialized_end=36047 + _DECODEEXTRA._serialized_start=36049 + _DECODEEXTRA._serialized_end=36089 + _DECODERESTRICTIONS._serialized_start=36091 + _DECODERESTRICTIONS._serialized_end=36150 + _DISCONNECTREQUEST._serialized_start=36152 + _DISCONNECTREQUEST._serialized_end=36213 + _DISCONNECTRESPONSE._serialized_start=36215 + _DISCONNECTRESPONSE._serialized_end=36235 + _FEERATESREQUEST._serialized_start=36237 + _FEERATESREQUEST._serialized_end=36344 + _FEERATESREQUEST_FEERATESSTYLE._serialized_start=36307 + _FEERATESREQUEST_FEERATESSTYLE._serialized_end=36344 + _FEERATESRESPONSE._serialized_start=36347 + _FEERATESRESPONSE._serialized_end=36631 + _FEERATESPERKB._serialized_start=36634 + _FEERATESPERKB._serialized_end=37101 + _FEERATESPERKBESTIMATES._serialized_start=37104 + _FEERATESPERKBESTIMATES._serialized_end=37254 + _FEERATESPERKW._serialized_start=37257 + _FEERATESPERKW._serialized_end=37724 + _FEERATESPERKWESTIMATES._serialized_start=37727 + _FEERATESPERKWESTIMATES._serialized_end=37877 + _FEERATESONCHAIN_FEE_ESTIMATES._serialized_start=37880 + _FEERATESONCHAIN_FEE_ESTIMATES._serialized_end=38163 + _FUNDCHANNELREQUEST._serialized_start=38166 + _FUNDCHANNELREQUEST._serialized_end=38651 + _FUNDCHANNELRESPONSE._serialized_start=38654 + _FUNDCHANNELRESPONSE._serialized_end=38809 + _GETROUTEREQUEST._serialized_start=38812 + _GETROUTEREQUEST._serialized_end=39048 + _GETROUTERESPONSE._serialized_start=39050 + _GETROUTERESPONSE._serialized_end=39103 + _GETROUTEROUTE._serialized_start=39106 + _GETROUTEROUTE._serialized_end=39303 + _GETROUTEROUTE_GETROUTEROUTESTYLE._serialized_start=39274 + _GETROUTEROUTE_GETROUTEROUTESTYLE._serialized_end=39303 + _LISTFORWARDSREQUEST._serialized_start=39306 + _LISTFORWARDSREQUEST._serialized_end=39564 + _LISTFORWARDSREQUEST_LISTFORWARDSSTATUS._serialized_start=39446 + _LISTFORWARDSREQUEST_LISTFORWARDSSTATUS._serialized_end=39522 + _LISTFORWARDSRESPONSE._serialized_start=39566 + _LISTFORWARDSRESPONSE._serialized_end=39633 + _LISTFORWARDSFORWARDS._serialized_start=39636 + _LISTFORWARDSFORWARDS._serialized_end=40242 + _LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS._serialized_start=40025 + _LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS._serialized_end=40109 + _LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE._serialized_start=40111 + _LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE._serialized_end=40159 + _LISTPAYSREQUEST._serialized_start=40245 + _LISTPAYSREQUEST._serialized_end=40464 + _LISTPAYSREQUEST_LISTPAYSSTATUS._serialized_start=40370 + _LISTPAYSREQUEST_LISTPAYSSTATUS._serialized_end=40425 + _LISTPAYSRESPONSE._serialized_start=40466 + _LISTPAYSRESPONSE._serialized_end=40517 + _LISTPAYSPAYS._serialized_start=40520 + _LISTPAYSPAYS._serialized_end=41159 + _LISTPAYSPAYS_LISTPAYSPAYSSTATUS._serialized_start=40934 + _LISTPAYSPAYS_LISTPAYSPAYSSTATUS._serialized_end=40993 + _LISTHTLCSREQUEST._serialized_start=41161 + _LISTHTLCSREQUEST._serialized_end=41203 + _LISTHTLCSRESPONSE._serialized_start=41205 + _LISTHTLCSRESPONSE._serialized_end=41260 + _LISTHTLCSHTLCS._serialized_start=41263 + _LISTHTLCSHTLCS._serialized_end=41528 + _LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION._serialized_start=41486 + _LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION._serialized_end=41528 + _PINGREQUEST._serialized_start=41530 + _PINGREQUEST._serialized_end=41619 + _PINGRESPONSE._serialized_start=41621 + _PINGRESPONSE._serialized_end=41651 + _SENDCUSTOMMSGREQUEST._serialized_start=41653 + _SENDCUSTOMMSGREQUEST._serialized_end=41705 + _SENDCUSTOMMSGRESPONSE._serialized_start=41707 + _SENDCUSTOMMSGRESPONSE._serialized_end=41746 + _SETCHANNELREQUEST._serialized_start=41749 + _SETCHANNELREQUEST._serialized_end=42047 + _SETCHANNELRESPONSE._serialized_start=42049 + _SETCHANNELRESPONSE._serialized_end=42112 + _SETCHANNELCHANNELS._serialized_start=42115 + _SETCHANNELCHANNELS._serialized_end=42573 + _SIGNINVOICEREQUEST._serialized_start=42575 + _SIGNINVOICEREQUEST._serialized_end=42614 + _SIGNINVOICERESPONSE._serialized_start=42616 + _SIGNINVOICERESPONSE._serialized_end=42653 + _SIGNMESSAGEREQUEST._serialized_start=42655 + _SIGNMESSAGEREQUEST._serialized_end=42692 + _SIGNMESSAGERESPONSE._serialized_start=42694 + _SIGNMESSAGERESPONSE._serialized_end=42764 + _STOPREQUEST._serialized_start=42766 + _STOPREQUEST._serialized_end=42779 + _STOPRESPONSE._serialized_start=42781 + _STOPRESPONSE._serialized_end=42795 + _PREAPPROVEKEYSENDREQUEST._serialized_start=42798 + _PREAPPROVEKEYSENDREQUEST._serialized_end=42965 + _PREAPPROVEKEYSENDRESPONSE._serialized_start=42967 + _PREAPPROVEKEYSENDRESPONSE._serialized_end=42994 + _PREAPPROVEINVOICEREQUEST._serialized_start=42996 + _PREAPPROVEINVOICEREQUEST._serialized_end=43054 + _PREAPPROVEINVOICERESPONSE._serialized_start=43056 + _PREAPPROVEINVOICERESPONSE._serialized_end=43083 + _STATICBACKUPREQUEST._serialized_start=43085 + _STATICBACKUPREQUEST._serialized_end=43106 + _STATICBACKUPRESPONSE._serialized_start=43108 + _STATICBACKUPRESPONSE._serialized_end=43143 + _NODE._serialized_start=43146 + _NODE._serialized_end=46873 # @@protoc_insertion_point(module_scope) diff --git a/doc/Makefile b/doc/Makefile index ce7ea26c8583..021a2eb2d6af 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -98,6 +98,9 @@ MANPAGES := doc/lightning-cli.1 \ doc/lightning-sendcustommsg.7 \ doc/lightning-signinvoice.7 \ doc/lightning-signmessage.7 \ + doc/lightning-splice_init.7 \ + doc/lightning-splice_update.7 \ + doc/lightning-splice_signed.7 \ doc/lightning-staticbackup.7 \ doc/lightning-txprepare.7 \ doc/lightning-txdiscard.7 \ diff --git a/doc/index.rst b/doc/index.rst index c2f2ce237f92..ebbb5412fb69 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -114,6 +114,8 @@ Core Lightning Documentation lightning-signmessage lightning-signpsbt lightning-splice_init + lightning-splice_signed + lightning-splice_update lightning-sql lightning-staticbackup lightning-stop diff --git a/doc/lightning-splice_init.7.md b/doc/lightning-splice_init.7.md index 291b4ea9e71b..b461cc135f6a 100644 --- a/doc/lightning-splice_init.7.md +++ b/doc/lightning-splice_init.7.md @@ -49,7 +49,7 @@ RESULT=$(lightning-cli splice_update $CHANNEL_ID $PSBT) PSBT=$(echo $RESULT | jq -r ".psbt") echo $RESULT -RESULT=$(lightning-cli signpsbt $PSBT) +RESULT=$(lightning-cli signpsbt -k psbt="$PSBT") PSBT=$(echo $RESULT | jq -r ".signed_psbt") echo $RESULT @@ -79,4 +79,4 @@ RESOURCES Main web site: -[comment]: # ( SHA256STAMP:40121e2e7b0db8c99de12b4fd086f58f63e0d6643b9da1c1697a34dd5057454e) +[comment]: # ( SHA256STAMP:28e857bb214a084bb638c7db3e7277291b7d60d78360fb8603423bc4d1d427a1) diff --git a/doc/lightning-splice_signed.7.md b/doc/lightning-splice_signed.7.md new file mode 100644 index 000000000000..de281cc965a2 --- /dev/null +++ b/doc/lightning-splice_signed.7.md @@ -0,0 +1,93 @@ +lightning-splice\_signed -- Command to initiate a channel to a peer +===================================================================== + +SYNOPSIS +-------- +**(WARNING: experimental-splicing only)** + +**splice\_signed** *channel\_id* *psbt* [*sign\_first*] + +DESCRIPTION +----------- + +`splice_signed` is a low level RPC command which finishes the active channel +splice associated with `channel_id`. + +*channel\_id* is the channel id of the channel being spliced. + +*psbt* is the final version of the psbt to complete the splice with. + +*sign\_first* is a flag that makes our node offer the final splice signature +first (defaults to false). When false, the node will calculate who should +sign first based off who is adding inputting the least sats to the splice as per +spec. + +The *psbt* must have all signatures attached to all inputs that you have added +to it or it will fail. + +In this example we funded the psbt from our lightning node, so we can use the +lightning node to sign for its funds. +```shell +RESULT=$(lightning-cli signpsbt $PSBT) +PSBT=$(echo $RESULT | jq -r ".signed_psbt") +echo $RESULT + +lightning-cli splice_signed $CHANNEL_ID $PSBT +``` + +Here is a full example set of splice commands that will splice in 100,000 sats +to the first channel that comes out of `listpeerchannels`. The example assumes +you already have at least one confirmed channel. +```shell +RESULT=$(lightning-cli listpeerchannels) +CHANNEL_ID=$(echo $RESULT| jq -r ".channels[0].channel_id") +echo $RESULT + +RESULT=$(lightning-cli fundpsbt -k satoshi=100000sat feerate=urgent startweight=800 excess_as_change=true) +INITIALPSBT=$(echo $RESULT | jq -r ".psbt") +echo $RESULT + +RESULT=$(lightning-cli splice_init $CHANNEL_ID 100000 $INITIALPSBT) +PSBT=$(echo $RESULT | jq -r ".psbt") +echo $RESULT + +RESULT="{\"commitments_secured\":false}" +while [[ $(echo $RESULT | jq -r ".commitments_secured") == "false" ]] +do + RESULT=$(lightning-cli splice_update $CHANNEL_ID $PSBT) + PSBT=$(echo $RESULT | jq -r ".psbt") + echo $RESULT +done + +RESULT=$(lightning-cli signpsbt -k psbt="$PSBT") +PSBT=$(echo $RESULT | jq -r ".signed_psbt") +echo $RESULT + +lightning-cli splice_signed $CHANNEL_ID $PSBT +``` + +RETURN VALUE +------------ + +[comment]: # (GENERATE-FROM-SCHEMA-START) +On success, an object is returned, containing: + +- **tx** (hex): The hex representation of the final transaction that is published +- **txid** (txid): The txid is of the final transaction + +[comment]: # (GENERATE-FROM-SCHEMA-END) + +SEE ALSO +-------- + +AUTHOR +------ + +@dusty\_daemon + +RESOURCES +--------- + +Main web site: + +[comment]: # ( SHA256STAMP:c084b5d6ce24db28226d5f37176f339009f4a2a761104404e7a41ed32cb2664c) diff --git a/doc/lightning-splice_update.7.md b/doc/lightning-splice_update.7.md new file mode 100644 index 000000000000..0b1629bc28cd --- /dev/null +++ b/doc/lightning-splice_update.7.md @@ -0,0 +1,106 @@ +lightning-splice\_update -- Command to initiate a channel to a peer +===================================================================== + +SYNOPSIS +-------- +**(WARNING: experimental-splicing only)** + +**splice\_update** *channel\_id* *psbt* + +DESCRIPTION +----------- + +`splice_update` is a low level RPC command which updates the active channel +splice associated with `channel_id`. + +*channel\_id* is the channel id of the channel being spliced. + +*psbt* is the base 64 encoded PSBT returned from `splice_init` with any changes +added by the user. + +`splice_update` must be called repeatidly until the result `commitments_secured` +is `true`. Each time `splice_update` is called, it will return a new PSBT that +may have changes. In the simplest case, you take the returned `psbt` and pass +it back into `splice_update` for the incoming `psbt` field. + +For more complex use cases, you may modify the `psbt` both before calling +`splice_update` and inbetween subsequent calls until `commitments_secured` is +`true`. After which point you can no long make modifications to the PSBT (beyond +signing, which comes later with `splice_signed`). + +Each `splice_update` result may include changes to the PSBT specified by your +channel peer. You can review these changes between calls to `splice_update` to +perform additional validation or strategy adjustment. + +Typically, `splice_update` will return `commitments_secured` true after one call +but you should assume it will need multiple calls. Here is an example way to +call `splice_update` +```shell +RESULT="{\"commitments_secured\":false}" +while [[ $(echo $RESULT | jq -r ".commitments_secured") == "false" ]] +do + RESULT=$(lightning-cli splice_update $CHANNEL_ID $PSBT) + PSBT=$(echo $RESULT | jq -r ".psbt") + echo $RESULT +done +``` + +Before each call to `splice_update` you have the opportunity +to make additional changes. + +Here is a full example set of splice commands that will splice in 100,000 sats +to the first channel that comes out of `listpeerchannels`. The example assumes +you already have at least one confirmed channel. +```shell +RESULT=$(lightning-cli listpeerchannels) +CHANNEL_ID=$(echo $RESULT| jq -r ".channels[0].channel_id") +echo $RESULT + +RESULT=$(lightning-cli fundpsbt -k satoshi=100000sat feerate=urgent startweight=800 excess_as_change=true) +INITIALPSBT=$(echo $RESULT | jq -r ".psbt") +echo $RESULT + +RESULT=$(lightning-cli splice_init $CHANNEL_ID 100000 $INITIALPSBT) +PSBT=$(echo $RESULT | jq -r ".psbt") +echo $RESULT + +RESULT="{\"commitments_secured\":false}" +while [[ $(echo $RESULT | jq -r ".commitments_secured") == "false" ]] +do + RESULT=$(lightning-cli splice_update $CHANNEL_ID $PSBT) + PSBT=$(echo $RESULT | jq -r ".psbt") + echo $RESULT +done + +RESULT=$(lightning-cli signpsbt -k psbt="$PSBT") +PSBT=$(echo $RESULT | jq -r ".signed_psbt") +echo $RESULT + +lightning-cli splice_signed $CHANNEL_ID $PSBT +``` + +RETURN VALUE +------------ + +[comment]: # (GENERATE-FROM-SCHEMA-START) +On success, an object is returned, containing: + +- **psbt** (string): the (incomplete) PSBT of the splice transaction +- **commitments\_secured** (boolean): whether or not the commitments were secured + +[comment]: # (GENERATE-FROM-SCHEMA-END) + +SEE ALSO +-------- + +AUTHOR +------ + +@dusty\_daemon + +RESOURCES +--------- + +Main web site: + +[comment]: # ( SHA256STAMP:e7f65170f8d32eb56b327a4eae0b5978517aba8e4f12e8271e71481afc33e0f3) diff --git a/doc/schemas/splice_init.request.json b/doc/schemas/splice_init.request.json new file mode 100644 index 000000000000..ed01150df351 --- /dev/null +++ b/doc/schemas/splice_init.request.json @@ -0,0 +1,32 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "required": [ + "channel_id", + "relative_amount" + ], + "added": "v23.08", + "properties": { + "channel_id": { + "type": "string", + "description": "the channel id of the channel to be spliced" + }, + "relative_amount": { + "type": "integer", + "description": "a positive or negative amount of satoshis to add or subtract from the channel" + }, + "initialpsbt": { + "type": "string", + "description": "the (optional) base 64 encoded PSBT to begin with. If not specified, one will be generated automatically" + }, + "feerate_per_kw": { + "type": "u32", + "description": "the miner fee we promise our peer to pay for our side of the splice transaction. It is calculated by `feerate_per_kw` * our_bytes_in_splice_tx / 1000" + }, + "force_feerate": { + "type": "boolean", + "description": "By default splices will fail if the fee provided looks too high. This is to protect against accidentally setting your fee higher than intended. Set `force_feerate` to true to skip this saftey check" + } + } +} diff --git a/doc/schemas/splice_init.schema.json b/doc/schemas/splice_init.schema.json new file mode 100644 index 000000000000..0551f7e8180b --- /dev/null +++ b/doc/schemas/splice_init.schema.json @@ -0,0 +1,15 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "required": [ + "psbt" + ], + "added": "v23.08", + "properties": { + "psbt": { + "type": "string", + "description": "the (incomplete) PSBT of the splice transaction" + } + } +} diff --git a/doc/schemas/splice_signed.request.json b/doc/schemas/splice_signed.request.json new file mode 100644 index 000000000000..8e6b8dec2515 --- /dev/null +++ b/doc/schemas/splice_signed.request.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "required": [ + "channel_id", + "psbt" + ], + "added": "v23.08", + "properties": { + "channel_id": { + "type": "string", + "description": "the channel id of the channel to be spliced" + }, + "psbt": { + "type": "string", + "description": "the final version of the psbt to complete the splice with" + }, + "sign_first": { + "type": "boolean", + "description": "a flag that makes our node offer the final splice signature first (defaults to false). When false, the node will calculate who should sign first based off who is adding inputting the least sats to the splice as per spec" + } + } +} diff --git a/doc/schemas/splice_signed.schema.json b/doc/schemas/splice_signed.schema.json new file mode 100644 index 000000000000..0457c2d346d4 --- /dev/null +++ b/doc/schemas/splice_signed.schema.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "required": [ + "tx", + "txid" + ], + "added": "v23.08", + "properties": { + "tx": { + "type": "hex", + "description": "The hex representation of the final transaction that is published" + }, + "txid": { + "type": "txid", + "description": "The txid is of the final transaction" + } + } +} diff --git a/doc/schemas/splice_update.request.json b/doc/schemas/splice_update.request.json new file mode 100644 index 000000000000..08bf814a49a8 --- /dev/null +++ b/doc/schemas/splice_update.request.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "required": [ + "channel_id", + "psbt" + ], + "added": "v23.08", + "properties": { + "channel_id": { + "type": "string", + "description": "the channel id of the channel to be spliced" + }, + "psbt": { + "type": "string", + "description": "the (optional) base 64 encoded PSBT to begin with. If not specified, one will be generated automatically" + } + } +} diff --git a/doc/schemas/splice_update.schema.json b/doc/schemas/splice_update.schema.json new file mode 100644 index 000000000000..96e04edac6d1 --- /dev/null +++ b/doc/schemas/splice_update.schema.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "required": [ + "psbt", + "commitments_secured" + ], + "added": "v23.08", + "properties": { + "psbt": { + "type": "string", + "description": "the (incomplete) PSBT of the splice transaction" + }, + "commitments_secured": { + "type": "boolean", + "description": "whether or not the commitments were secured" + } + } +} From f56ba464b8c62bbb33d8e3b36e8792af6182cf1f Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Thu, 3 Aug 2023 15:09:49 +0200 Subject: [PATCH 07/30] meta: Remove ZmnSCPxj from codeowners --- .github/CODEOWNERS | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 93d668a6efa8..d3ceaac3bd67 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -15,9 +15,5 @@ contrib/pyln-testing/ @cdecker # Needed to ensure hsmd wire compatibility between releases hsmd/hsmd_wire.csv @cdecker -wallet/invoices.* @ZmnSCPxj -plugins/multifundchannel.c @ZmnSCPxj -doc/BACKUP.md @ZmnSCPxj - # See https://help.github.com/articles/about-codeowners/ for more # information From 0bf5ee6bbae2cdaef073979171c59bdad3e2d232 Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Thu, 3 Aug 2023 15:11:58 +0200 Subject: [PATCH 08/30] meta: Add the VLS team as codeowners of hsmd/hsmd_wire.csv We use this file as a proxy for breaking changes in the signer protocol. It may not catch all the breaking changes, but it's a good first approximation. --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d3ceaac3bd67..4c3303f738f2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -13,7 +13,7 @@ contrib/msggen/ @cdecker contrib/pyln-client/ @cdecker contrib/pyln-testing/ @cdecker # Needed to ensure hsmd wire compatibility between releases -hsmd/hsmd_wire.csv @cdecker +hsmd/hsmd_wire.csv @cdecker @ksedgwic @devrandom # See https://help.github.com/articles/about-codeowners/ for more # information From 91a58a0bdc8f5d95170cc47777154e970e72db1c Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 7 Aug 2023 13:11:56 +0930 Subject: [PATCH 09/30] channeld: don't send splice TLV fields unless negotiated. This make ACINQ seize up, and not send revoke_and_ack. Eventually, this can cause a bad signature error, should payments go in both directions, which is a separate bug, but this is the trigger. See: #6500 Signed-off-by: Rusty Russell --- channeld/channeld.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/channeld/channeld.c b/channeld/channeld.c index 264d54aac11f..13c5a4fcd11f 100644 --- a/channeld/channeld.c +++ b/channeld/channeld.c @@ -1486,15 +1486,21 @@ static u8 *send_commit_part(struct peer *peer, const struct htlc **htlc_map; struct wally_tx_output *direct_outputs[NUM_SIDES]; struct penalty_base *pbase; - - status_debug("send_commit_part(splice: %d, remote_splice: %d)", - (int)splice_amnt, (int)remote_splice_amnt); - - struct tlv_commitment_signed_tlvs *cs_tlv = tlv_commitment_signed_tlvs_new(tmpctx); - cs_tlv->splice_info = tal(cs_tlv, struct channel_id); - derive_channel_id(cs_tlv->splice_info, funding); + + /* In theory, peer will ignore TLV 1 as unknown, but while + * spec is in flux this is dangerous, as it may change: so don't + * send unless negotiated */ + if (feature_negotiated(peer->our_features, + peer->their_features, + OPT_SPLICE)) { + status_debug("send_commit_part(splice: %d, remote_splice: %d)", + (int)splice_amnt, (int)remote_splice_amnt); + + cs_tlv->splice_info = tal(cs_tlv, struct channel_id); + derive_channel_id(cs_tlv->splice_info, funding); + } txs = channel_splice_txs(tmpctx, funding, funding_sats, &htlc_map, direct_outputs, &funding_wscript, From 248b34acec464a0fe03d465e41d770603c285e8c Mon Sep 17 00:00:00 2001 From: ShahanaFarooqui Date: Fri, 4 Aug 2023 17:12:52 -0700 Subject: [PATCH 10/30] docker: bitcoin and elements version update Updated bitcoin and elements versions to 22.0. --- contrib/docker/Dockerfile.tester | 30 +++++++++++++++--------------- contrib/docker/scripts/setup.sh | 15 +++++++-------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/contrib/docker/Dockerfile.tester b/contrib/docker/Dockerfile.tester index 6da1aad543f7..14b61e7b1eb4 100644 --- a/contrib/docker/Dockerfile.tester +++ b/contrib/docker/Dockerfile.tester @@ -1,9 +1,9 @@ -FROM ubuntu:18.04 -MAINTAINER Christian Decker +FROM ubuntu:22.04 +LABEL mantainer="Christian Decker " ENV DEBIAN_FRONTEND noninteractive -ENV BITCOIN_VERSION 0.20.1 -ENV ELEMENTS_VERSION 0.18.1.8 +ENV BITCOIN_VERSION 22.0 +ENV ELEMENTS_VERSION 22.0.2 RUN useradd -ms /bin/bash tester RUN mkdir /build /bolts && chown tester -R /build /bolts @@ -62,16 +62,16 @@ RUN echo "tester ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/tester && \ chmod 0440 /etc/sudoers.d/tester RUN cd /tmp/ && \ - wget https://storage.googleapis.com/c-lightning-tests/bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.bz2 && \ - wget -q https://storage.googleapis.com/c-lightning-tests/elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.bz2 && \ - tar -xjf bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.bz2 && \ - tar -xjf elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.bz2 && \ - mv bitcoin-$BITCOIN_VERSION/bin/* /usr/local/bin && \ - mv elements-$ELEMENTS_VERSION/bin/* /usr/local/bin && \ - rm -rf \ - bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.gz \ - bitcoin-$BITCOIN_VERSION \ - elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.bz2 \ - elements-$ELEMENTS_VERSION + wget https://bitcoincore.org/bin/bitcoin-core-$BITCOIN_VERSION/bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.gz && \ + wget https://github.com/ElementsProject/elements/releases/download/elements-$ELEMENTS_VERSION/elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.gz && \ + tar -xzf bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.gz && \ + tar -xzf elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.gz && \ + mv bitcoin-$BITCOIN_VERSION/bin/* /usr/local/bin && \ + mv elements-$ELEMENTS_VERSION/bin/* /usr/local/bin && \ + rm -rf \ + bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.gz \ + bitcoin-$BITCOIN_VERSION \ + elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.gz \ + elements-$ELEMENTS_VERSION USER tester diff --git a/contrib/docker/scripts/setup.sh b/contrib/docker/scripts/setup.sh index 6f9cbdb76022..9af49030ee9e 100755 --- a/contrib/docker/scripts/setup.sh +++ b/contrib/docker/scripts/setup.sh @@ -1,8 +1,8 @@ #!/bin/bash export DEBIAN_FRONTEND=noninteractive -export BITCOIN_VERSION=0.20.1 -export ELEMENTS_VERSION=0.18.1.8 +export BITCOIN_VERSION=22.0 +export ELEMENTS_VERSION=22.0.2 export RUST_VERSION=nightly export TZ="Europe/London" @@ -50,19 +50,18 @@ sudo apt-get -qq install --no-install-recommends --allow-unauthenticated -yy \ xsltproc \ zlib1g-dev - ( cd /tmp/ || exit 1 - wget https://storage.googleapis.com/c-lightning-tests/bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.bz2 - wget -q https://storage.googleapis.com/c-lightning-tests/elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.bz2 - tar -xjf bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.bz2 - tar -xjf elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.bz2 + wget https://bitcoincore.org/bin/bitcoin-core-$BITCOIN_VERSION/bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.gz + wget https://github.com/ElementsProject/elements/releases/download/elements-$ELEMENTS_VERSION/elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.gz + tar -xzf bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.gz + tar -xzf elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.gz sudo mv bitcoin-$BITCOIN_VERSION/bin/* /usr/local/bin sudo mv elements-$ELEMENTS_VERSION/bin/* /usr/local/bin rm -rf \ bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.gz \ bitcoin-$BITCOIN_VERSION \ - elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.bz2 \ + elements-$ELEMENTS_VERSION-x86_64-linux-gnu.tar.gz \ elements-$ELEMENTS_VERSION ) From 2042b50978937e424a9789ab49539ae5e9ffed27 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 24 Jul 2023 13:19:56 +0930 Subject: [PATCH 11/30] plugins/bcli: update minimum required bitcoind version. Less than 22 is obsolete anyway, so we should increment this from 16.0 at least! Closes: #6234 Signed-off-by: Rusty Russell --- plugins/bcli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/bcli.c b/plugins/bcli.c index 759a21010579..ce07b78a60a7 100644 --- a/plugins/bcli.c +++ b/plugins/bcli.c @@ -918,7 +918,7 @@ static void parse_getnetworkinfo_result(struct plugin *p, const char *buf) { const jsmntok_t *result; bool tx_relay; - u32 min_version = 160000; + u32 min_version = 220000; const char *err; result = json_parse_simple(NULL, buf, strlen(buf)); From f556be5d826afa2f60637a9ee0fcad295362791b Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 7 Aug 2023 13:35:54 +0930 Subject: [PATCH 12/30] renepay: allow it to die gracefully without crashing lightningd. Suggested-by: @Lagrang3 Signed-off-by: Rusty Russell --- lightningd/plugin.c | 3 ++- tests/test_plugin.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lightningd/plugin.c b/lightningd/plugin.c index 3e7aa88fe475..8734dc6da24e 100644 --- a/lightningd/plugin.c +++ b/lightningd/plugin.c @@ -2340,7 +2340,8 @@ void plugins_set_builtin_plugins_dir(struct plugins *plugins, take(path_join(NULL, dir, list_of_builtin_plugins[i])), NULL, - /* important = */ true, + /* important = */ + !streq(list_of_builtin_plugins[i], "cln-renepay"), NULL, NULL); } diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 16344423221d..c5549edd7d42 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -4255,3 +4255,21 @@ def test_all_subscription(node_factory, directory): # shutdown and connect are subscribed before the wildcard, so is handled by that handler assert not l2.daemon.is_in_log(f'.*test_libplugin: all: shutdown.*') assert not l2.daemon.is_in_log(f'.*test_libplugin: all: connect.*') + + +def test_renepay_not_important(node_factory): + # I mean, it's *important*, it's just not "mission-critical" just yet! + l1 = node_factory.get_node(options={'allow-deprecated-apis': True}) + + assert not any([p['name'] == 'cln-renepay' for p in l1.rpc.listconfigs()['important-plugins']]) + assert [p['name'] for p in l1.rpc.listconfigs()['plugins'] if p['name'] == 'cln-renepay'] == ['cln-renepay'] + + # We can kill it without cln dying. + line = l1.daemon.is_in_log(r'.*started\([0-9]*\).*plugins/cln-renepay') + pidstr = re.search(r'.*started\(([0-9]*)\).*plugins/cln-renepay', line).group(1) + os.kill(int(pidstr), signal.SIGKILL) + l1.daemon.wait_for_log('plugin-cln-renepay: Killing plugin: exited during normal operation') + + # But we don't shut down, and we can restrart. + assert [p['name'] for p in l1.rpc.listconfigs()['plugins'] if p['name'] == 'cln-renepay'] == [] + l1.rpc.plugin_start(os.path.join(os.getcwd(), 'plugins/cln-renepay')) From d4ed1c7f6f0bc27edb0091d803380f2447049e21 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 7 Aug 2023 13:11:49 +0930 Subject: [PATCH 13/30] pytest: test that we close connection if adding an HTLC times out. Signed-off-by: Rusty Russell --- tests/test_closing.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_closing.py b/tests/test_closing.py index aca67f264c4e..c4de52d265db 100644 --- a/tests/test_closing.py +++ b/tests/test_closing.py @@ -3641,6 +3641,7 @@ def test_close_weight_estimate(node_factory, bitcoind): assert signed_weight + 6 >= final_estimate # 70byte signature +@pytest.mark.xfail(strict=True) @pytest.mark.developer("needs dev_disconnect") def test_onchain_close_upstream(node_factory, bitcoind): """https://github.com/ElementsProject/lightning/issues/4649 @@ -3677,6 +3678,10 @@ def test_onchain_close_upstream(node_factory, bitcoind): with pytest.raises(RpcError, match=r'WIRE_TEMPORARY_CHANNEL_FAILURE \(reply from remote\)'): l1.rpc.waitsendpay(ph2, timeout=TIMEOUT) + # An important response to the timeout is to force a reconnect, + # since the problem may be TCP connectivity. + assert only_one(l2.rpc.listpeerchannels(l3.info['id'])['channels'])['peer_connected'] is False + # Make close unilaterally. l3.rpc.close(l2.info['id'], 1) From 91ea85be36f1b8884af761a07907fad2b27ab80e Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 7 Aug 2023 13:11:50 +0930 Subject: [PATCH 14/30] lightningd: close connection when HTLC addition times out. I noticed this while debugging an issue with ACINQ, that we got upset, but didn't trigger a reconnect cycle. Signed-off-by: Rusty Russell Changelog-Fixed: Protocol: We now close connection with a peer if adding an HTLC times out (which may be a TCP connectivity issue). --- lightningd/peer_htlcs.c | 9 +++++++++ tests/test_closing.py | 1 - 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lightningd/peer_htlcs.c b/lightningd/peer_htlcs.c index 0688099cb129..242f29de9cb3 100644 --- a/lightningd/peer_htlcs.c +++ b/lightningd/peer_htlcs.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -591,6 +592,14 @@ static void htlc_offer_timeout(struct htlc_out *out) tal_free(channel->owner); channel_set_billboard(channel, false, "Adding HTLC timed out: killed connection"); + + /* Force a disconnect in case the issue is with TCP */ + if (channel->peer->ld->connectd) { + const struct peer *peer = channel->peer; + subd_send_msg(peer->ld->connectd, + take(towire_connectd_discard_peer(NULL, &peer->id, + peer->connectd_counter))); + } } /* Returns failmsg, or NULL on success. */ diff --git a/tests/test_closing.py b/tests/test_closing.py index c4de52d265db..7c6be181f522 100644 --- a/tests/test_closing.py +++ b/tests/test_closing.py @@ -3641,7 +3641,6 @@ def test_close_weight_estimate(node_factory, bitcoind): assert signed_weight + 6 >= final_estimate # 70byte signature -@pytest.mark.xfail(strict=True) @pytest.mark.developer("needs dev_disconnect") def test_onchain_close_upstream(node_factory, bitcoind): """https://github.com/ElementsProject/lightning/issues/4649 From 7a88900476830393ab2fb198bee67b28efd24852 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 7 Aug 2023 16:01:33 +0930 Subject: [PATCH 15/30] pytest: test for listsendpays and lightning: prefix crash. Signed-off-by: Rusty Russell --- tests/test_pay.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_pay.py b/tests/test_pay.py index 4122da3e2cf3..7838dff25220 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -5380,3 +5380,11 @@ def test_strip_lightning_suffix_from_inv(node_factory): listpays = l1.rpc.listpays()["pays"] assert len(listpays) == 3, f"the list pays is bigger than what we expected {listpays}" assert listpays[2]['bolt11'] == inv, f"list pays contains a different invoice, expected is {inv} but we get {listpays[0]['bolt11']}" + + +@pytest.mark.xfail(strict=True) +def test_listsendpays_crash(node_factory): + l1 = node_factory.get_node() + + inv = l1.rpc.invoice(40, "inv", "inv")["bolt11"] + l1.rpc.listsendpays('lightning:' + inv) From 54bcb102276f661590a75dcffc174f8848a633fb Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 7 Aug 2023 16:01:41 +0930 Subject: [PATCH 16/30] lightningd: fix bolt11 parsing in preapproveinvocie, sendonion, listsendpays and renepay Since bolt11_decode now insists that any `lightning:` prefix be removed, we need to make sure to use param_invstring not param_string for all bolt11 parameters: ``` 2023-08-07T05:55:32.515Z **BROKEN** lightningd: FATAL SIGNAL 6 (version v23.08rc1-21-g0bf5ee6) 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: common/daemon.c:38 (send_backtrace) 0x55dd94934154 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: common/daemon.c:75 (crashdump) 0x55dd949342e6 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: ./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0 ((null)) 0x7f5cf5a3bcef 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: ./nptl/pthread_kill.c:44 (__pthread_kill_implementation) 0x7f5cf5a9226b 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: ./nptl/pthread_kill.c:78 (__pthread_kill_internal) 0x7f5cf5a9226b 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: ./nptl/pthread_kill.c:89 (__GI___pthread_kill) 0x7f5cf5a9226b 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: ../sysdeps/posix/raise.c:26 (__GI_raise) 0x7f5cf5a3bc45 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: ./stdlib/abort.c:79 (__GI_abort) 0x7f5cf5a227fb 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: ./assert/assert.c:92 (__assert_fail_base) 0x7f5cf5a2271a 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: ./assert/assert.c:101 (__GI___assert_fail) 0x7f5cf5a33595 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: common/bolt11.c:734 (bolt11_decode_nosig) 0x55dd94929967 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: common/bolt11.c:953 (bolt11_decode) 0x55dd9492a44f 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: lightningd/pay.c:1730 (json_listsendpays) 0x55dd948d7d72 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: lightningd/jsonrpc.c:658 (command_exec) 0x55dd948b525b 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: lightningd/jsonrpc.c:786 (rpc_command_hook_final) 0x55dd948b5876 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: lightningd/plugin_hook.c:285 (plugin_hook_call_) 0x55dd948f6446 2023-08-07T05:55:32.515Z **BROKEN** lightningd: backtrace: lightningd/jsonrpc.c:874 (plugin_hook_call_rpc_command) 0x55dd948b5c77 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: lightningd/jsonrpc.c:984 (parse_request) 0x55dd948b6234 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: lightningd/jsonrpc.c:1090 (read_json) 0x55dd948b670f 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: ccan/ccan/io/io.c:59 (next_plan) 0x55dd94ac9bf4 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: ccan/ccan/io/io.c:407 (do_plan) 0x55dd94aca823 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: ccan/ccan/io/io.c:417 (io_ready) 0x55dd94aca865 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: ccan/ccan/io/poll.c:453 (io_loop) 0x55dd94accbff 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: lightningd/io_loop_with_timers.c:22 (io_loop_with_timers) 0x55dd948b33c4 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: lightningd/lightningd.c:1332 (main) 0x55dd948ba429 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: ../sysdeps/nptl/libc_start_call_main.h:58 (__libc_start_call_main) 0x7f5cf5a2350f 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: ../csu/libc-start.c:381 (__libc_start_main_impl) 0x7f5cf5a235c8 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: (null):0 ((null)) 0x55dd94881e74 2023-08-07T05:55:32.516Z **BROKEN** lightningd: backtrace: (null):0 ((null)) 0xffffffffffffffff ``` Fixes: #6524 Signed-off-by: Rusty Russell Changelog-None: broken in master since last release. --- lightningd/invoice.c | 2 +- lightningd/pay.c | 4 ++-- plugins/renepay/pay.c | 4 ++-- tests/test_pay.py | 1 - 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lightningd/invoice.c b/lightningd/invoice.c index 512edde957a0..cc7580a4f4aa 100644 --- a/lightningd/invoice.c +++ b/lightningd/invoice.c @@ -1852,7 +1852,7 @@ static struct command_result *json_preapproveinvoice(struct command *cmd, if (!param(cmd, buffer, params, /* FIXME: parameter should be invstring now */ - p_req("bolt11", param_string, &invstring), + p_req("bolt11", param_invstring, &invstring), NULL)) return command_param_failed(); diff --git a/lightningd/pay.c b/lightningd/pay.c index 0dd517317f21..e74d92533f51 100644 --- a/lightningd/pay.c +++ b/lightningd/pay.c @@ -1333,7 +1333,7 @@ static struct command_result *json_sendonion(struct command *cmd, p_opt("shared_secrets", param_secrets_array, &path_secrets), p_opt_def("partid", param_u64, &partid, 0), /* FIXME: parameter should be invstring now */ - p_opt("bolt11", param_string, &invstring), + p_opt("bolt11", param_invstring, &invstring), p_opt_def("amount_msat|msatoshi", param_msat, &msat, AMOUNT_MSAT(0)), p_opt("destination", param_node_id, &destination), p_opt("localinvreqid", param_sha256, &local_invreq_id), @@ -1711,7 +1711,7 @@ static struct command_result *json_listsendpays(struct command *cmd, if (!param(cmd, buffer, params, /* FIXME: parameter should be invstring now */ - p_opt("bolt11", param_string, &invstring), + p_opt("bolt11", param_invstring, &invstring), p_opt("payment_hash", param_sha256, &rhash), p_opt("status", param_payment_status, &status), NULL)) diff --git a/plugins/renepay/pay.c b/plugins/renepay/pay.c index 27888cae471a..ff11721447df 100644 --- a/plugins/renepay/pay.c +++ b/plugins/renepay/pay.c @@ -625,7 +625,7 @@ static struct command_result *json_paystatus(struct command *cmd, struct payment *p; if (!param(cmd, buf, params, - p_opt("invstring", param_string, &invstring), + p_opt("invstring", param_invstring, &invstring), NULL)) return command_param_failed(); @@ -940,7 +940,7 @@ static struct command_result *json_pay(struct command *cmd, #endif if (!param(cmd, buf, params, - p_req("invstring", param_string, &invstr), + p_req("invstring", param_invstring, &invstr), p_opt("amount_msat", param_msat, &msat), p_opt("maxfee", param_msat, &maxfee), diff --git a/tests/test_pay.py b/tests/test_pay.py index 7838dff25220..b16a2d7b088e 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -5382,7 +5382,6 @@ def test_strip_lightning_suffix_from_inv(node_factory): assert listpays[2]['bolt11'] == inv, f"list pays contains a different invoice, expected is {inv} but we get {listpays[0]['bolt11']}" -@pytest.mark.xfail(strict=True) def test_listsendpays_crash(node_factory): l1 = node_factory.get_node() From 98c805e267f663077717adeeacd4e3ba073bdcc1 Mon Sep 17 00:00:00 2001 From: Adi Shankara <85787690+adi-shankara@users.noreply.github.com> Date: Mon, 7 Aug 2023 21:45:44 +0530 Subject: [PATCH 17/30] fix flake8 errors in the script file (#6528) * fix flake8 errors * fix E126 error * fix E123 error --- .github/scripts/sync-rpc-cmds.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/.github/scripts/sync-rpc-cmds.py b/.github/scripts/sync-rpc-cmds.py index b0b5bf9c6b5a..efb3134d791e 100644 --- a/.github/scripts/sync-rpc-cmds.py +++ b/.github/scripts/sync-rpc-cmds.py @@ -14,61 +14,63 @@ def checkIfDocIsPresent(title, headers): check_url = URL + "/" + title response = requests.get(check_url, headers=headers) - if (response.status_code == 200): + if response.status_code == 200: return True else: return False def publishDoc(title, body, order): - key = os.environ.get('README_API_KEY') + key = os.environ.get("README_API_KEY") payload = { "title": title, "type": "basic", "body": body, "category": CATEGORY_ID, "hidden": False, - "order": order + "order": order, } headers = { "accept": "application/json", "content-type": "application/json", - "authorization": "Basic " + key + "authorization": "Basic " + key, } isDocPresent = checkIfDocIsPresent(title, headers) - if (isDocPresent): + if isDocPresent: # update doc update_url = URL + "/" + title # title == slug response = requests.put(update_url, json=payload, headers=headers) - if (response.status_code != 200): + if response.status_code != 200: print(response.text) else: print("Updated ", title) else: # create doc response = requests.post(URL, json=payload, headers=headers) - if (response.status_code != 201): + if response.status_code != 201: print(response.text) else: print("Created ", title) def extract_rpc_commands(rst_content): - manpages_block = re.search - (r"\.\. block_start manpages(.*?)\.\. block_end manpages", - rst_content, re.DOTALL) + manpages_block = re.search( + r"\.\. block_start manpages(.*?)" r"\.\. block_end manpages", + rst_content, + re.DOTALL, + ) if manpages_block: - commands = re.findall - (r'\b([a-zA-Z0-9_-]+)\s+<([^>]+)>\n', - manpages_block.group(1)) + commands = re.findall( + r"\b([a-zA-Z0-9_-]+)" r"\s+<([^>]+)>\n", manpages_block.group(1) + ) return commands return [] def main(): # path to the rst file from where we fetch all the RPC commands - path_to_rst = 'doc/index.rst' + path_to_rst = "doc/index.rst" with open(path_to_rst, "r") as file: rst_content = file.read() From 1fbe87f6e4b5153b1d922e8a857e5e5fbadb0843 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 7 Aug 2023 12:29:58 +0930 Subject: [PATCH 18/30] lightningd: use fsync not fdatasync. Apparently MacOS doesn't always have fdatasync, so use fsync. Even more importantly check whether it succeeds! Fixes: #6516 Signed-off-by: Rusty Russell --- lightningd/configs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lightningd/configs.c b/lightningd/configs.c index 65b325a221fa..564dde853b50 100644 --- a/lightningd/configs.c +++ b/lightningd/configs.c @@ -504,7 +504,8 @@ static bool configfile_replace_var(struct lightningd *ld, contents = tal_strjoin(tmpctx, take(lines), "\n", STR_TRAIL); if (!write_all(outfd, contents, strlen(contents))) fatal("Writing %s: %s", template, strerror(errno)); - fdatasync(outfd); + if (fsync(outfd) != 0) + fatal("Syncing %s: %s", template, strerror(errno)); if (rename(template, cv->file) != 0) fatal("Renaming %s over %s: %s", From 29fea55980fa1b8d31ece52e32d3836f729ebcb7 Mon Sep 17 00:00:00 2001 From: Peter Neuroth Date: Sun, 18 Jun 2023 09:33:32 +0200 Subject: [PATCH 19/30] doc: Fix typo in the description of fields `private` Signed-off-by: Peter Neuroth [ Regenerated man pages --RR ] --- doc/lightning-listclosedchannels.7.md | 4 ++-- doc/lightning-listpeerchannels.7.md | 4 ++-- doc/lightning-listpeers.7.md | 4 ++-- doc/schemas/listclosedchannels.schema.json | 2 +- doc/schemas/listpeerchannels.schema.json | 2 +- doc/schemas/listpeers.schema.json | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/lightning-listclosedchannels.7.md b/doc/lightning-listclosedchannels.7.md index 4e193428d928..8fd24df7d3e3 100644 --- a/doc/lightning-listclosedchannels.7.md +++ b/doc/lightning-listclosedchannels.7.md @@ -25,7 +25,7 @@ On success, an object containing **closedchannels** is returned. It is an array - **channel\_id** (hash): The full channel\_id (funding txid Xored with output number) - **opener** (string): Who initiated the channel (one of "local", "remote") -- **private** (boolean): if False, we will not announce this channel +- **private** (boolean): if True, we will not announce this channel - **total\_local\_commitments** (u64): Number of commitment transaction we made - **total\_remote\_commitments** (u64): Number of commitment transaction they made - **total\_htlcs\_sent** (u64): Number of HTLCs we ever sent @@ -76,4 +76,4 @@ RESOURCES Main web site: Lightning -[comment]: # ( SHA256STAMP:0c368cb41f46a2124e9b3f0b760494d1f4b9c3b248267f56b887fbf96f26e176) +[comment]: # ( SHA256STAMP:3020e068d48a43494983df1a902d7483a52d0c41faef85e6d858dcf7c64c188d) diff --git a/doc/lightning-listpeerchannels.7.md b/doc/lightning-listpeerchannels.7.md index 426e7ad6cfa0..08fb9f62c7e5 100644 --- a/doc/lightning-listpeerchannels.7.md +++ b/doc/lightning-listpeerchannels.7.md @@ -58,7 +58,7 @@ On success, an object containing **channels** is returned. It is an array of ob - **our\_funding\_msat** (msat): amount we have in the channel - **scratch\_txid** (txid): The commitment transaction txid we would use if we went onchain now - **close\_to** (hex, optional): scriptPubkey which we have to close to if we mutual close -- **private** (boolean, optional): if False, we will not announce this channel +- **private** (boolean, optional): if True, we will not announce this channel - **closer** (string, optional): Who initiated the channel close (only present if closing) (one of "local", "remote") - **funding** (object, optional): - **local\_funds\_msat** (msat): Amount of channel we funded @@ -196,4 +196,4 @@ Main web site: Lightning RFC site (BOLT \#9): -[comment]: # ( SHA256STAMP:dade32248bd309f2514a237cb71be6ddbe12220e1b6899693a032b45b7980a01) +[comment]: # ( SHA256STAMP:359d0035f98350d2de5f539ce8d2c3d82ccf633d3cbee4ed992a71687a25770a) diff --git a/doc/lightning-listpeers.7.md b/doc/lightning-listpeers.7.md index 3b95a1688068..4f79be6b00b8 100644 --- a/doc/lightning-listpeers.7.md +++ b/doc/lightning-listpeers.7.md @@ -92,7 +92,7 @@ On success, an object containing **peers** is returned. It is an array of objec - **splice\_amount** (integer): The amouont of sats we're splicing in or out *(added v23.08)* - **scratch\_txid** (txid): The commitment transaction txid we would use if we went onchain now - **close\_to** (hex, optional): scriptPubkey which we have to close to if we mutual close - - **private** (boolean, optional): if False, we will not announce this channel + - **private** (boolean, optional): if True, we will not announce this channel - **closer** (string, optional): Who initiated the channel close (one of "local", "remote") - **funding** (object, optional): - **local\_funds\_msat** (msat): Amount of channel we funded @@ -399,4 +399,4 @@ Main web site: Lightning RFC site (BOLT \#9): -[comment]: # ( SHA256STAMP:d75b5070288f26a39df39831212f40c397f1389e7c1765f22829d3f3389a56aa) +[comment]: # ( SHA256STAMP:7402bcd43be7c031c1e8e1ec7a4d58e94beb44ca48ba2f8f06e4ea908ab8940b) diff --git a/doc/schemas/listclosedchannels.schema.json b/doc/schemas/listclosedchannels.schema.json index 7ee9ae5c4ab8..b090bf2cbcc0 100644 --- a/doc/schemas/listclosedchannels.schema.json +++ b/doc/schemas/listclosedchannels.schema.json @@ -73,7 +73,7 @@ }, "private": { "type": "boolean", - "description": "if False, we will not announce this channel" + "description": "if True, we will not announce this channel" }, "channel_type": { "type": "object", diff --git a/doc/schemas/listpeerchannels.schema.json b/doc/schemas/listpeerchannels.schema.json index 3d994c08cb8b..dca3e6febd73 100644 --- a/doc/schemas/listpeerchannels.schema.json +++ b/doc/schemas/listpeerchannels.schema.json @@ -199,7 +199,7 @@ }, "private": { "type": "boolean", - "description": "if False, we will not announce this channel" + "description": "if True, we will not announce this channel" }, "opener": { "type": "string", diff --git a/doc/schemas/listpeers.schema.json b/doc/schemas/listpeers.schema.json index efe4c8f5227e..a30cbb44da7f 100644 --- a/doc/schemas/listpeers.schema.json +++ b/doc/schemas/listpeers.schema.json @@ -315,7 +315,7 @@ }, "private": { "type": "boolean", - "description": "if False, we will not announce this channel" + "description": "if True, we will not announce this channel" }, "opener": { "type": "string", From 32b88a23409b3af08f44ced45bd39cf659a59515 Mon Sep 17 00:00:00 2001 From: junderw Date: Wed, 2 Aug 2023 23:55:45 -0700 Subject: [PATCH 20/30] Fix: Remove Sync requirements on Futures returned in the Rust plugin library. See: https://github.com/bitcoindevkit/bdk/issues/1047#issuecomment-1660645669 In general, futures produced by most libraries in the ecosystem of Rust, and bounds placed on users of famous runtimes like tokio and its spawn method all lack Sync requirements. Because of this, anyone who creates a callback using any sort of library that returns a non-Sync future (which most libraries fit this description) inside of it will get some cryptic error messages (async error messages still leave a lot to be desired). Removing these Sync requirements will make the library more useful. --- plugins/src/lib.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/src/lib.rs b/plugins/src/lib.rs index c3d58bcd6470..1db632caa0cf 100644 --- a/plugins/src/lib.rs +++ b/plugins/src/lib.rs @@ -104,7 +104,7 @@ where impl Builder where O: Send + AsyncWrite + Unpin + 'static, - S: Clone + Sync + Send + Clone + 'static, + S: Clone + Sync + Send + 'static, I: AsyncRead + Send + Unpin + 'static, { pub fn new(input: I, output: O) -> Self { @@ -146,7 +146,7 @@ where where C: Send + Sync + 'static, C: Fn(Plugin, Request) -> F + 'static, - F: Future> + Send + Sync + 'static, + F: Future> + Send + 'static, { self.subscriptions.insert( topic.to_string(), @@ -162,7 +162,7 @@ where where C: Send + Sync + 'static, C: Fn(Plugin, Request) -> F + 'static, - F: Future + Send + Sync + 'static, + F: Future + Send + 'static, { self.hooks.insert( hookname.to_string(), @@ -179,7 +179,7 @@ where where C: Send + Sync + 'static, C: Fn(Plugin, Request) -> F + 'static, - F: Future + Send + Sync + 'static, + F: Future + Send + 'static, { self.rpcmethods.insert( name.to_string(), @@ -504,7 +504,7 @@ where impl PluginDriver where - S: Send + Clone + Sync, + S: Send + Clone, { /// Run the plugin until we get a shutdown command. async fn run( From d95cfc0b64f9627c69c482c7cf53cbb2d23b0ff4 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 7 Aug 2023 15:21:40 +0930 Subject: [PATCH 21/30] hsmd: rename "capabilities" flags for hsm fds to "permissions" I obviously like the word "capabilities" since I reused it to refer to the HSM's overall features :( Suggested-by: @ksedgwic Signed-off-by: Rusty Russell --- common/hsm_version.h | 1 + hsmd/Makefile | 2 +- hsmd/capabilities.h | 14 -------------- hsmd/hsmd.c | 4 ++-- hsmd/hsmd_wire.csv | 4 ++-- hsmd/libhsmd.c | 18 +++++++++--------- hsmd/permissions.h | 14 ++++++++++++++ lightningd/channel_control.c | 14 +++++++------- lightningd/closing_control.c | 6 +++--- lightningd/connect_control.c | 4 ++-- lightningd/dual_open_control.c | 14 +++++++------- lightningd/gossip_control.c | 4 ++-- lightningd/hsm_control.c | 12 ++++++------ lightningd/hsm_control.h | 4 ++-- lightningd/onchain_control.c | 6 +++--- lightningd/opening_control.c | 6 +++--- 16 files changed, 64 insertions(+), 63 deletions(-) delete mode 100644 hsmd/capabilities.h create mode 100644 hsmd/permissions.h diff --git a/common/hsm_version.h b/common/hsm_version.h index 8470dce64226..3f7ea9f6f59e 100644 --- a/common/hsm_version.h +++ b/common/hsm_version.h @@ -16,6 +16,7 @@ * v4 with sign_anchorspend: 8a30722e38b56e82af566b9629ff18da01fcebd1e80ec67f04d8b3a2fa66d81c * v4 with sign_htlc_tx_mingle: b9247e75d41ee1b3fc2f7db0bac8f4e92d544ab2f017d430ae3a000589c384e5 * v4 with splicing: 06f21012936f825913af289fa81af1512c9ada1cb97c611698975a8fd287edbb + * v4 with capabilities called permissions: 7c5bf8ec7cf30302740db85260a9d1ac2c5b0323a2376c28df6b611831f91655 */ #define HSM_MIN_VERSION 3 #define HSM_MAX_VERSION 4 diff --git a/hsmd/Makefile b/hsmd/Makefile index 40f74edb5389..c50c7a4e0cc4 100644 --- a/hsmd/Makefile +++ b/hsmd/Makefile @@ -4,7 +4,7 @@ HSMD_SRC := hsmd/hsmd.c \ hsmd/hsmd_wiregen.c \ hsmd/libhsmd.c -HSMD_HEADERS := hsmd/hsmd_wiregen.h +HSMD_HEADERS := hsmd/hsmd_wiregen.h hsmd/permissions.h HSMD_OBJS := $(HSMD_SRC:.c=.o) $(HSMD_OBJS): $(HSMD_HEADERS) diff --git a/hsmd/capabilities.h b/hsmd/capabilities.h deleted file mode 100644 index e538ed35b3f1..000000000000 --- a/hsmd/capabilities.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef LIGHTNING_HSMD_CAPABILITIES_H -#define LIGHTNING_HSMD_CAPABILITIES_H -#include "config.h" - -#define HSM_CAP_ECDH 1 -#define HSM_CAP_SIGN_GOSSIP 2 -#define HSM_CAP_SIGN_ONCHAIN_TX 4 -#define HSM_CAP_COMMITMENT_POINT 8 -#define HSM_CAP_SIGN_REMOTE_TX 16 -#define HSM_CAP_SIGN_CLOSING_TX 32 -#define HSM_CAP_SIGN_WILL_FUND_OFFER 64 - -#define HSM_CAP_MASTER 1024 -#endif /* LIGHTNING_HSMD_CAPABILITIES_H */ diff --git a/hsmd/hsmd.c b/hsmd/hsmd.c index 73119731d8e5..1af682ffe8a3 100644 --- a/hsmd/hsmd.c +++ b/hsmd/hsmd.c @@ -22,9 +22,9 @@ #include #include #include -#include /*~ _wiregen files are autogenerated by tools/generate-wire.py */ #include +#include #include #include #include @@ -754,7 +754,7 @@ int main(int argc, char *argv[]) uintmap_init(&clients); master = new_client(NULL, NULL, NULL, 0, - HSM_CAP_MASTER | HSM_CAP_SIGN_GOSSIP | HSM_CAP_ECDH, + HSM_PERM_MASTER | HSM_PERM_SIGN_GOSSIP | HSM_PERM_ECDH, REQ_FD); /* First client == lightningd. */ diff --git a/hsmd/hsmd_wire.csv b/hsmd/hsmd_wire.csv index 66179b3c9f27..2eefd6962cd8 100644 --- a/hsmd/hsmd_wire.csv +++ b/hsmd/hsmd_wire.csv @@ -46,13 +46,13 @@ msgdata,hsmd_new_channel,dbid,u64, # No value returned. msgtype,hsmd_new_channel_reply,130 -# Get a new HSM FD, with the specified capabilities +# Get a new HSM FD, with the specified permissions msgtype,hsmd_client_hsmfd,9 # Which identity to use for requests msgdata,hsmd_client_hsmfd,id,node_id, # Database id for this client, if any. msgdata,hsmd_client_hsmfd,dbid,u64, -msgdata,hsmd_client_hsmfd,capabilities,u64, +msgdata,hsmd_client_hsmfd,permissions,u64, # No content, just an fd. msgtype,hsmd_client_hsmfd_reply,109 diff --git a/hsmd/libhsmd.c b/hsmd/libhsmd.c index b157f4f250c3..204ae3971937 100644 --- a/hsmd/libhsmd.c +++ b/hsmd/libhsmd.c @@ -8,8 +8,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -79,38 +79,38 @@ bool hsmd_check_client_capabilities(struct hsmd_client *client, */ switch (t) { case WIRE_HSMD_ECDH_REQ: - return (client->capabilities & HSM_CAP_ECDH) != 0; + return (client->capabilities & HSM_PERM_ECDH) != 0; case WIRE_HSMD_CANNOUNCEMENT_SIG_REQ: case WIRE_HSMD_CUPDATE_SIG_REQ: case WIRE_HSMD_NODE_ANNOUNCEMENT_SIG_REQ: - return (client->capabilities & HSM_CAP_SIGN_GOSSIP) != 0; + return (client->capabilities & HSM_PERM_SIGN_GOSSIP) != 0; case WIRE_HSMD_SIGN_DELAYED_PAYMENT_TO_US: case WIRE_HSMD_SIGN_REMOTE_HTLC_TO_US: case WIRE_HSMD_SIGN_PENALTY_TO_US: case WIRE_HSMD_SIGN_LOCAL_HTLC_TX: - return (client->capabilities & HSM_CAP_SIGN_ONCHAIN_TX) != 0; + return (client->capabilities & HSM_PERM_SIGN_ONCHAIN_TX) != 0; case WIRE_HSMD_GET_PER_COMMITMENT_POINT: case WIRE_HSMD_CHECK_FUTURE_SECRET: case WIRE_HSMD_READY_CHANNEL: - return (client->capabilities & HSM_CAP_COMMITMENT_POINT) != 0; + return (client->capabilities & HSM_PERM_COMMITMENT_POINT) != 0; case WIRE_HSMD_SIGN_REMOTE_COMMITMENT_TX: case WIRE_HSMD_SIGN_REMOTE_HTLC_TX: case WIRE_HSMD_VALIDATE_COMMITMENT_TX: case WIRE_HSMD_VALIDATE_REVOCATION: - return (client->capabilities & HSM_CAP_SIGN_REMOTE_TX) != 0; + return (client->capabilities & HSM_PERM_SIGN_REMOTE_TX) != 0; case WIRE_HSMD_SIGN_MUTUAL_CLOSE_TX: - return (client->capabilities & HSM_CAP_SIGN_CLOSING_TX) != 0; + return (client->capabilities & HSM_PERM_SIGN_CLOSING_TX) != 0; case WIRE_HSMD_SIGN_SPLICE_TX: return (client->capabilities & WIRE_HSMD_SIGN_SPLICE_TX) != 0; case WIRE_HSMD_SIGN_OPTION_WILL_FUND_OFFER: - return (client->capabilities & HSM_CAP_SIGN_WILL_FUND_OFFER) != 0; + return (client->capabilities & HSM_PERM_SIGN_WILL_FUND_OFFER) != 0; case WIRE_HSMD_INIT: case WIRE_HSMD_NEW_CHANNEL: @@ -133,7 +133,7 @@ bool hsmd_check_client_capabilities(struct hsmd_client *client, case WIRE_HSMD_SIGN_ANY_LOCAL_HTLC_TX: case WIRE_HSMD_SIGN_ANCHORSPEND: case WIRE_HSMD_SIGN_HTLC_TX_MINGLE: - return (client->capabilities & HSM_CAP_MASTER) != 0; + return (client->capabilities & HSM_PERM_MASTER) != 0; /*~ These are messages sent by the HSM so we should never receive them. */ /* FIXME: Since we autogenerate these, we should really generate separate diff --git a/hsmd/permissions.h b/hsmd/permissions.h new file mode 100644 index 000000000000..d91ea22727cf --- /dev/null +++ b/hsmd/permissions.h @@ -0,0 +1,14 @@ +#ifndef LIGHTNING_HSMD_PERMISSIONS_H +#define LIGHTNING_HSMD_PERMISSIONS_H +#include "config.h" + +#define HSM_PERM_ECDH 1 +#define HSM_PERM_SIGN_GOSSIP 2 +#define HSM_PERM_SIGN_ONCHAIN_TX 4 +#define HSM_PERM_COMMITMENT_POINT 8 +#define HSM_PERM_SIGN_REMOTE_TX 16 +#define HSM_PERM_SIGN_CLOSING_TX 32 +#define HSM_PERM_SIGN_WILL_FUND_OFFER 64 + +#define HSM_PERM_MASTER 1024 +#endif /* LIGHTNING_HSMD_PERMISSIONS_H */ diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index f3c6bc633c9b..0553692a59d5 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -1264,12 +1264,12 @@ bool peer_start_channeld(struct channel *channel, hsmfd = hsm_get_client_fd(ld, &channel->peer->id, channel->dbid, - HSM_CAP_SIGN_GOSSIP - | HSM_CAP_ECDH - | HSM_CAP_COMMITMENT_POINT - | HSM_CAP_SIGN_REMOTE_TX - | HSM_CAP_SIGN_ONCHAIN_TX - | HSM_CAP_SIGN_CLOSING_TX); + HSM_PERM_SIGN_GOSSIP + | HSM_PERM_ECDH + | HSM_PERM_COMMITMENT_POINT + | HSM_PERM_SIGN_REMOTE_TX + | HSM_PERM_SIGN_ONCHAIN_TX + | HSM_PERM_SIGN_CLOSING_TX); channel_set_owner(channel, new_channel_subd(channel, ld, diff --git a/lightningd/closing_control.c b/lightningd/closing_control.c index 53732c0c66a1..93d2602fd25e 100644 --- a/lightningd/closing_control.c +++ b/lightningd/closing_control.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include #include @@ -379,8 +379,8 @@ void peer_start_closingd(struct channel *channel, struct peer_fd *peer_fd) } hsmfd = hsm_get_client_fd(ld, &channel->peer->id, channel->dbid, - HSM_CAP_SIGN_CLOSING_TX - | HSM_CAP_COMMITMENT_POINT); + HSM_PERM_SIGN_CLOSING_TX + | HSM_PERM_COMMITMENT_POINT); channel_set_owner(channel, new_channel_subd(channel, ld, diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index 290bc1fd727c..ae253c5a4939 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include @@ -661,7 +661,7 @@ int connectd_init(struct lightningd *ld) if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds) != 0) fatal("Could not socketpair for connectd<->gossipd"); - hsmfd = hsm_get_global_fd(ld, HSM_CAP_ECDH); + hsmfd = hsm_get_global_fd(ld, HSM_PERM_ECDH); ld->connectd = new_global_subd(ld, "lightning_connectd", connectd_wire_name, connectd_msg, diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index eb0f9b7927e7..6f70dd4362bb 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -3695,9 +3695,9 @@ bool peer_start_dualopend(struct peer *peer, const u8 *msg; hsmfd = hsm_get_client_fd(peer->ld, &peer->id, channel->unsaved_dbid, - HSM_CAP_COMMITMENT_POINT - | HSM_CAP_SIGN_REMOTE_TX - | HSM_CAP_SIGN_WILL_FUND_OFFER); + HSM_PERM_COMMITMENT_POINT + | HSM_PERM_SIGN_REMOTE_TX + | HSM_PERM_SIGN_WILL_FUND_OFFER); channel->owner = new_channel_subd(channel, peer->ld, @@ -3767,9 +3767,9 @@ bool peer_restart_dualopend(struct peer *peer, return peer_start_dualopend(peer, peer_fd, channel); hsmfd = hsm_get_client_fd(peer->ld, &peer->id, channel->dbid, - HSM_CAP_COMMITMENT_POINT - | HSM_CAP_SIGN_REMOTE_TX - | HSM_CAP_SIGN_WILL_FUND_OFFER); + HSM_PERM_COMMITMENT_POINT + | HSM_PERM_SIGN_REMOTE_TX + | HSM_PERM_SIGN_WILL_FUND_OFFER); channel_set_owner(channel, new_channel_subd(channel, peer->ld, diff --git a/lightningd/gossip_control.c b/lightningd/gossip_control.c index 7b2779d490cb..bc9b894473da 100644 --- a/lightningd/gossip_control.c +++ b/lightningd/gossip_control.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include @@ -270,7 +270,7 @@ void gossip_init(struct lightningd *ld, int connectd_fd) int hsmfd; void *ret; - hsmfd = hsm_get_global_fd(ld, HSM_CAP_ECDH|HSM_CAP_SIGN_GOSSIP); + hsmfd = hsm_get_global_fd(ld, HSM_PERM_ECDH|HSM_PERM_SIGN_GOSSIP); ld->gossip = new_global_subd(ld, "lightning_gossipd", gossipd_wire_name, gossip_msg, diff --git a/lightningd/hsm_control.c b/lightningd/hsm_control.c index c4e660647d2f..bd703c75c608 100644 --- a/lightningd/hsm_control.c +++ b/lightningd/hsm_control.c @@ -24,12 +24,12 @@ static int hsm_get_fd(struct lightningd *ld, const struct node_id *id, u64 dbid, - int capabilities) + u64 permissions) { int hsm_fd; const u8 *msg; - msg = towire_hsmd_client_hsmfd(NULL, id, dbid, capabilities); + msg = towire_hsmd_client_hsmfd(NULL, id, dbid, permissions); msg = hsm_sync_req(tmpctx, ld, take(msg)); if (!fromwire_hsmd_client_hsmfd_reply(msg)) fatal("Bad reply from HSM: %s", tal_hex(tmpctx, msg)); @@ -43,16 +43,16 @@ static int hsm_get_fd(struct lightningd *ld, int hsm_get_client_fd(struct lightningd *ld, const struct node_id *id, u64 dbid, - int capabilities) + u64 permissions) { assert(dbid); - return hsm_get_fd(ld, id, dbid, capabilities); + return hsm_get_fd(ld, id, dbid, permissions); } -int hsm_get_global_fd(struct lightningd *ld, int capabilities) +int hsm_get_global_fd(struct lightningd *ld, u64 permissions) { - return hsm_get_fd(ld, &ld->id, 0, capabilities); + return hsm_get_fd(ld, &ld->id, 0, permissions); } static unsigned int hsm_msg(struct subd *hsmd, diff --git a/lightningd/hsm_control.h b/lightningd/hsm_control.h index 9a8fcc01bf70..355f8bd51e45 100644 --- a/lightningd/hsm_control.h +++ b/lightningd/hsm_control.h @@ -11,10 +11,10 @@ struct ext_key; int hsm_get_client_fd(struct lightningd *ld, const struct node_id *id, u64 dbid, - int capabilities); + u64 permissions); /* Ask HSM for an fd for a global subdaemon to use (gossipd, connectd) */ -int hsm_get_global_fd(struct lightningd *ld, int capabilities); +int hsm_get_global_fd(struct lightningd *ld, u64 permissions); /* Is this capability supported by the HSM? (So far, always a message * number) */ diff --git a/lightningd/onchain_control.c b/lightningd/onchain_control.c index edb143cd1d10..1982ba6b1cf6 100644 --- a/lightningd/onchain_control.c +++ b/lightningd/onchain_control.c @@ -9,8 +9,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -1553,8 +1553,8 @@ enum watch_result onchaind_funding_spent(struct channel *channel, hsmfd = hsm_get_client_fd(ld, &channel->peer->id, channel->dbid, - HSM_CAP_SIGN_ONCHAIN_TX - | HSM_CAP_COMMITMENT_POINT); + HSM_PERM_SIGN_ONCHAIN_TX + | HSM_PERM_COMMITMENT_POINT); channel_set_owner(channel, new_channel_subd(channel, ld, "lightning_onchaind", diff --git a/lightningd/opening_control.c b/lightningd/opening_control.c index 180a9067cb5d..85f9c9c6ecf0 100644 --- a/lightningd/opening_control.c +++ b/lightningd/opening_control.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include @@ -933,8 +933,8 @@ bool peer_start_openingd(struct peer *peer, struct peer_fd *peer_fd) assert(!uc->open_daemon); hsmfd = hsm_get_client_fd(peer->ld, &uc->peer->id, uc->dbid, - HSM_CAP_COMMITMENT_POINT - | HSM_CAP_SIGN_REMOTE_TX); + HSM_PERM_COMMITMENT_POINT + | HSM_PERM_SIGN_REMOTE_TX); uc->open_daemon = new_channel_subd(peer, peer->ld, "lightning_openingd", From ac092c0bf96d47cd57f7a4afdd3beea9fabf1d23 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 7 Aug 2023 15:21:41 +0930 Subject: [PATCH 22/30] hsmd: fix capability check for signing splices. The nomenclature confusion mean that we were ANDING a capability with a message number (29) which always returned non-zero. We really do need a new capability which we can hand to channeld to make these splice txs. Signed-off-by: Rusty Russell --- hsmd/libhsmd.c | 2 +- hsmd/permissions.h | 1 + lightningd/channel_control.c | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/hsmd/libhsmd.c b/hsmd/libhsmd.c index 204ae3971937..1eb0e5b7cf2a 100644 --- a/hsmd/libhsmd.c +++ b/hsmd/libhsmd.c @@ -107,7 +107,7 @@ bool hsmd_check_client_capabilities(struct hsmd_client *client, return (client->capabilities & HSM_PERM_SIGN_CLOSING_TX) != 0; case WIRE_HSMD_SIGN_SPLICE_TX: - return (client->capabilities & WIRE_HSMD_SIGN_SPLICE_TX) != 0; + return (client->capabilities & HSM_PERM_SIGN_SPLICE_TX) != 0; case WIRE_HSMD_SIGN_OPTION_WILL_FUND_OFFER: return (client->capabilities & HSM_PERM_SIGN_WILL_FUND_OFFER) != 0; diff --git a/hsmd/permissions.h b/hsmd/permissions.h index d91ea22727cf..afc396c2246a 100644 --- a/hsmd/permissions.h +++ b/hsmd/permissions.h @@ -9,6 +9,7 @@ #define HSM_PERM_SIGN_REMOTE_TX 16 #define HSM_PERM_SIGN_CLOSING_TX 32 #define HSM_PERM_SIGN_WILL_FUND_OFFER 64 +#define HSM_PERM_SIGN_SPLICE_TX 128 #define HSM_PERM_MASTER 1024 #endif /* LIGHTNING_HSMD_PERMISSIONS_H */ diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index 0553692a59d5..cd59faf9154a 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -1269,7 +1269,8 @@ bool peer_start_channeld(struct channel *channel, | HSM_PERM_COMMITMENT_POINT | HSM_PERM_SIGN_REMOTE_TX | HSM_PERM_SIGN_ONCHAIN_TX - | HSM_PERM_SIGN_CLOSING_TX); + | HSM_PERM_SIGN_CLOSING_TX + | HSM_PERM_SIGN_SPLICE_TX); channel_set_owner(channel, new_channel_subd(channel, ld, From dabd6c6b702052e294f02630fae9b60302e0b979 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 8 Aug 2023 09:42:50 +0930 Subject: [PATCH 23/30] pytest: run splicing test on every run. EXPERIMENTAL_SPLICING=1 turns it on for *all* tests, to make sure we don't accidentally break those. But we can (and should!) run the splice test under every possible CI scenario. Signed-off-by: Rusty Russell --- tests/test_splicing.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_splicing.py b/tests/test_splicing.py index 614c0f52257f..f59017454ee4 100644 --- a/tests/test_splicing.py +++ b/tests/test_splicing.py @@ -1,13 +1,14 @@ from fixtures import * # noqa: F401,F403 -import os +from utils import TEST_NETWORK import pytest import unittest -@unittest.skipIf(os.environ.get("EXPERIMENTAL_SPLICING", '0') != '1', "Need experimental splicing turned on") +@pytest.mark.openchannel('v1') @pytest.mark.openchannel('v2') +@unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_splice(node_factory, bitcoind): - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True) + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) chan_id = l1.get_channel_id(l2) From 961ad21281b6976ce1fc75c77913039db69f58b9 Mon Sep 17 00:00:00 2001 From: Lagrang3 Date: Mon, 7 Aug 2023 10:30:20 +0100 Subject: [PATCH 24/30] renepay: add help for renepay & renepaystatus Signed-off-by: Lagrang3 --- doc/Makefile | 2 + doc/index.rst | 2 + doc/lightning-renepay.7.md | 152 ++++++++++++++++++++++++++ doc/lightning-renepaystatus.7.md | 55 ++++++++++ doc/schemas/renepay.schema.json | 54 +++++++++ doc/schemas/renepaystatus.schema.json | 83 ++++++++++++++ 6 files changed, 348 insertions(+) create mode 100644 doc/lightning-renepay.7.md create mode 100644 doc/lightning-renepaystatus.7.md create mode 100644 doc/schemas/renepay.schema.json create mode 100644 doc/schemas/renepaystatus.schema.json diff --git a/doc/Makefile b/doc/Makefile index 021a2eb2d6af..692203230ba4 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -87,6 +87,8 @@ MANPAGES := doc/lightning-cli.1 \ doc/lightning-preapproveinvoice.7 \ doc/lightning-preapprovekeysend.7 \ doc/lightning-recoverchannel.7 \ + doc/lightning-renepay.7 \ + doc/lightning-renepaystatus.7 \ doc/lightning-reserveinputs.7 \ doc/lightning-sendinvoice.7 \ doc/lightning-sendonion.7 \ diff --git a/doc/index.rst b/doc/index.rst index ebbb5412fb69..d59d7700cf9f 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -99,6 +99,8 @@ Core Lightning Documentation lightning-preapproveinvoice lightning-preapprovekeysend lightning-recoverchannel + lightning-renepay + lightning-renepaystatus lightning-reserveinputs lightning-sendcustommsg lightning-sendinvoice diff --git a/doc/lightning-renepay.7.md b/doc/lightning-renepay.7.md new file mode 100644 index 000000000000..826ae9bbb6f4 --- /dev/null +++ b/doc/lightning-renepay.7.md @@ -0,0 +1,152 @@ +lightning-renepay -- Command for sending a payment to a BOLT11 invoice +====================================================================== + +SYNOPSIS +-------- + +**renepay** *invstring* [*amount\_msat*] [*maxfee*] [*maxdelay*] +[*retry\_for*] [*description*] [*label*] + + +DESCRIPTION +----------- + +**renepay** is a new payment plugin based on Pickhardt-Richter optimization +method for Multi-Path-Payments. This implementation has not been thoroughly +tested and it should be used with caution. + +The **renepay** RPC command attempts to pay the invoice specified +as *invstring*. Currently, **renepay** supports bolt11 invoices only. + +The response will occur when the payment fails or succeeds. Once a +payment has succeeded, calls to **renepay** with the same *invstring* +will not lead to a new payment attempt, but instead it will succeed immediately. + +If the *invstring* does not contain an amount, +*amount\_msat* is required, otherwise if it is specified +it must be *null*. *amount\_msat* is in millisatoshi precision; it can be a +whole number, or a whole number with suffix *msat* or *sat*, or a three +decimal point number with suffix *sat*, or an 1 to 11 decimal point +number suffixed by *btc*. + +*maxfee* limits how much is paid fees and it is measured in millisatoshi +by default, but also in this case the unit can be specified with a suffix: *msat*, *sat* or *btc*. +The default value is 5 sats or 0.5% whichever is higher. + +*maxdelay* overrides the value of `max-locktime-blocks` for this payment. +It serves to limit the locktime of funds in the payment HTLC measured in blocks. + +*retry\_for* measured in seconds (default: 60) specifies how much time it is +allowed for the command to keep retrying the payment. + +*description* is only required for bolt11 invoices which do not +contain a description themselves, but contain a description hash: +in this case *description* is required. +*description* is then checked against the hash inside the invoice +before it will be paid. + +The *label* field is used to attach a label to payments, and is returned +in lightning-listpays(7) and lightning-listsendpays(7). + +When using *lightning-cli*, you may skip optional parameters by using +*null*. Alternatively, use **-k** option to provide parameters by name. + + +OPTIMALITY +---------- + +**renepay** is based on the work by Pickhardt-Richter's +*Optimally Reliable & Cheap Payment Flows on the Lightning Network*. +Which means the payment command will prefer routes that have a higher +probability of success while keeping fees low. + +The algorithm records some partial knowledge of the state of the Network +deduced from the responses obtained after evey payment attempt. +This knowledge is kept through different payment requests, but decays with time +to account for the dynamics of the Network (after 1 hour all previous knowledge +will be erased). +Knowledge from previous payment attempts increases the reliability for +subsequent ones. + +Higher probabilities of success and lower fees cannot generally by optimized at +once. Hence **renepay** combines the two in different amounts seeking solutions +that satisfy *maxfee* bound and a target for 90% probability of success. +*maxfee* is a hard bound, in the sense that the command will never attempt a +payment when the fees exceed that value. While the probability target is not +compulsory (but desirable), i.e. if the best route does not satisfy the +90% probability target it will be tried anyways. + +When *maxfee* and the 90% probability bounds are satified, the algorithm will +optimize the fees to its lowest value. + + +RANDOMIZATION +------------- + +To protect user privacy, the payment algorithm performs *shadow route* +randomization. +Which means the payment algorithm will virtually extend the route +by adding delays and fees along it, making it appear to intermediate nodes +that the route is longer than it actually is. This prevents intermediate +nodes from reliably guessing their distance from the payee. + +Route randomization will never exceed *maxfee* of the payment. +Route randomization and shadow routing will not take routes that would +exceed *maxdelay*. + +RETURN VALUE +------------ + +[comment]: # (GENERATE-FROM-SCHEMA-START) +On success, an object is returned, containing: + +- **payment\_preimage** (secret): the proof of payment: SHA256 of this **payment\_hash** +- **payment\_hash** (hash): the hash of the *payment\_preimage* which will prove payment +- **created\_at** (number): the UNIX timestamp showing when this payment was initiated +- **parts** (u32): how many attempts this took +- **amount\_msat** (msat): amount the recipient received +- **amount\_sent\_msat** (msat): total amount we sent (including fees) +- **status** (string): status of payment (one of "complete", "pending", "failed") +- **destination** (pubkey, optional): the final destination of the payment + +[comment]: # (GENERATE-FROM-SCHEMA-END) + +You can monitor the progress and retries of a payment using the +lightning-renepaystatus(7) command. + +The following error codes may occur: + +-1: Catchall nonspecific error. + +200: Other payment attempts are in progress. + +203: Permanent failure at destination. + +205: Unable to find a route. + +206: Payment routes are too expensive. + +207: Invoice expired. Payment took too long before expiration, or +already expired at the time you initiated payment. + +210: Payment timed out without a payment in progress. + +212: Invoice is invalid. + +AUTHOR +------ + +Eduardo Quintana-Miranda <> is mainly responsible. + +SEE ALSO +-------- + +lightning-renepaystatus(7), lightning-listpays(7), lightning-invoice(7). + +RESOURCES +--------- + +- Main web site: +- Pickhardt R. and Richter S., *Optimally Reliable & Cheap Payment Flows on the Lightning Network* + +[comment]: # ( SHA256STAMP:505a2ea336078020826b5897f2db02d4c4e0e03a9561170458afae008e47e06e) diff --git a/doc/lightning-renepaystatus.7.md b/doc/lightning-renepaystatus.7.md new file mode 100644 index 000000000000..df78aabe7624 --- /dev/null +++ b/doc/lightning-renepaystatus.7.md @@ -0,0 +1,55 @@ +lightning-renepaystatus -- Command for quering the status of previous renepay attempts +====================================================================================== + +SYNOPSIS +-------- + +**renepaystatus** [*invstring*] + + +DESCRIPTION +----------- + +The **renepaystatus** RPC command queries the payment plugin **renepay** +for the status of previous payment attempts. +If *invstring* is specified, the command will return a list of payment attempts +whose invoice matches *invstring*, otherwise all payments with be listed. +This command always succeeds. + +RETURN VALUE +------------ + +[comment]: # (GENERATE-FROM-SCHEMA-START) +On success, an object containing **paystatus** is returned. It is an array of objects, where each object contains: + +- **bolt11** (string): invoice string BOLT11 +- **payment\_hash** (hash): the hash of the *payment\_preimage* which will prove payment +- **created\_at** (number): the UNIX timestamp showing when this payment was initiated +- **groupid** (u32): the id for this payment attempt +- **amount\_msat** (msat): amount the recipient received +- **status** (string): status of payment (one of "complete", "pending", "failed") +- **notes** (array of strings): a list of messages for debugging purposes: + - a message generated by renepay +- **payment\_preimage** (secret, optional): the proof of payment: SHA256 of this **payment\_hash** (for completed payments only) +- **parts** (u32, optional): how many attempts this took +- **amount\_sent\_msat** (msat, optional): total amount we sent including fees (for completed payments only) +- **destination** (pubkey, optional): the final destination of the payment + +[comment]: # (GENERATE-FROM-SCHEMA-END) + +AUTHOR +------ + +Eduardo Quintana-Miranda <> is mainly responsible. + +SEE ALSO +-------- + +lightning-renepay(7), lightning-listpays(7). + +RESOURCES +--------- + +Main web site: + +[comment]: # ( SHA256STAMP:3dfae7499b76853c08d307d8d723933ab680f6827ff079569af97ba2dda03833) diff --git a/doc/schemas/renepay.schema.json b/doc/schemas/renepay.schema.json new file mode 100644 index 000000000000..2700a5e92608 --- /dev/null +++ b/doc/schemas/renepay.schema.json @@ -0,0 +1,54 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "added": "v23.08", + "type": "object", + "additionalProperties": false, + "required": [ + "payment_preimage", + "payment_hash", + "created_at", + "parts", + "amount_msat", + "amount_sent_msat", + "status" + ], + "properties": { + "payment_preimage": { + "type": "secret", + "description": "the proof of payment: SHA256 of this **payment_hash**" + }, + "payment_hash": { + "type": "hash", + "description": "the hash of the *payment_preimage* which will prove payment" + }, + "created_at": { + "type": "number", + "description": "the UNIX timestamp showing when this payment was initiated" + }, + "parts": { + "type": "u32", + "description": "how many attempts this took" + }, + "amount_msat": { + "type": "msat", + "description": "amount the recipient received" + }, + "amount_sent_msat": { + "type": "msat", + "description": "total amount we sent (including fees)" + }, + "status": { + "type": "string", + "enum": [ + "complete", + "pending", + "failed" + ], + "description": "status of payment" + }, + "destination": { + "type": "pubkey", + "description": "the final destination of the payment" + } + } +} diff --git a/doc/schemas/renepaystatus.schema.json b/doc/schemas/renepaystatus.schema.json new file mode 100644 index 000000000000..03da45dc14d8 --- /dev/null +++ b/doc/schemas/renepaystatus.schema.json @@ -0,0 +1,83 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "added": "v23.08", + "type": "object", + "additionalProperties": false, + "required": [ + "paystatus" + ], + "properties": { + "paystatus": { + "type": "array", + "description": "a list of payments attempted by renepay", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "bolt11", + "payment_hash", + "created_at", + "groupid", + "amount_msat", + "status", + "notes" + ], + "properties": { + "bolt11": { + "type": "string", + "description": "invoice string BOLT11" + }, + "payment_preimage": { + "type": "secret", + "description": "the proof of payment: SHA256 of this **payment_hash** (for completed payments only)" + }, + "payment_hash": { + "type": "hash", + "description": "the hash of the *payment_preimage* which will prove payment" + }, + "created_at": { + "type": "number", + "description": "the UNIX timestamp showing when this payment was initiated" + }, + "groupid": { + "type": "u32", + "description": "the id for this payment attempt" + }, + "parts": { + "type": "u32", + "description": "how many attempts this took" + }, + "amount_msat": { + "type": "msat", + "description": "amount the recipient received" + }, + "amount_sent_msat": { + "type": "msat", + "description": "total amount we sent including fees (for completed payments only)" + }, + "status": { + "type": "string", + "enum": [ + "complete", + "pending", + "failed" + ], + "description": "status of payment" + }, + "destination": { + "type": "pubkey", + "description": "the final destination of the payment" + }, + "notes": { + "type": "array", + "description": "a list of messages for debugging purposes", + "items": { + "type": "string", + "description": "a message generated by renepay" + } + } + } + } + } + } +} From 5f8b77480cbf6a14606e56df4ff83c9e908ed0e6 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 8 Aug 2023 06:58:10 +0930 Subject: [PATCH 25/30] plugins: fix error report from bitcoin-cli exec failure. We've stomped errno, so if exec fails we don't get a reliable result: ``` 2023-08-07T17:58:45.713Z **BROKEN** plugin-bcli: bitcoin-cli exec failed: Bad file descriptor ``` Signed-off-by: Rusty Russell --- plugins/bcli.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/bcli.c b/plugins/bcli.c index ce07b78a60a7..d7bd4fac809a 100644 --- a/plugins/bcli.c +++ b/plugins/bcli.c @@ -298,16 +298,16 @@ static void next_bcli(enum bitcoind_prio prio) bcli->pid = pipecmdarr(&in, &bcli->fd, &bcli->fd, cast_const2(char **, bcli->args)); + if (bcli->pid < 0) + plugin_err(bcli->cmd->plugin, "%s exec failed: %s", + bcli->args[0], strerror(errno)); + if (bitcoind->rpcpass) write_all(in, bitcoind->rpcpass, strlen(bitcoind->rpcpass)); close(in); - if (bcli->pid < 0) - plugin_err(bcli->cmd->plugin, "%s exec failed: %s", - bcli->args[0], strerror(errno)); - bcli->start = time_now(); bitcoind->num_requests[prio]++; From c50e93d9fbd8ba6a2b01f8174c6e7d7aeb2fcc6e Mon Sep 17 00:00:00 2001 From: Dusty Daemon Date: Thu, 10 Aug 2023 09:50:29 +0930 Subject: [PATCH 26/30] splice: Move splice to experimental feature bit This was recommended by @t-bast: if the final spec commits to something compatible, we can simply advertize and accept both features, but if it does change in incompatible ways we won't cause problems for nodes who implement the official spec. (I split this, so first, we remove the OPT_SPLICE entirely, to make sure we caught them all. --RR) Suggested-by: @t-bast Changelog-None --- channeld/channeld.c | 2 +- common/features.c | 37 +++++++++++++++++++++- common/features.h | 6 +++- contrib/pyln-client/pyln/client/gossmap.py | 1 + lightningd/channel_control.c | 2 +- lightningd/options.c | 4 +-- tests/utils.py | 4 +-- 7 files changed, 48 insertions(+), 8 deletions(-) diff --git a/channeld/channeld.c b/channeld/channeld.c index 13c5a4fcd11f..5d3ae1dde63e 100644 --- a/channeld/channeld.c +++ b/channeld/channeld.c @@ -1494,7 +1494,7 @@ static u8 *send_commit_part(struct peer *peer, * send unless negotiated */ if (feature_negotiated(peer->our_features, peer->their_features, - OPT_SPLICE)) { + OPT_EXPERIMENTAL_SPLICE)) { status_debug("send_commit_part(splice: %d, remote_splice: %d)", (int)splice_amnt, (int)remote_splice_amnt); diff --git a/common/features.c b/common/features.c index 89c1bd04746d..daeaa58758f2 100644 --- a/common/features.c +++ b/common/features.c @@ -142,7 +142,7 @@ static const struct feature_style feature_styles[] = { { OPT_PROVIDE_PEER_BACKUP_STORAGE, .copy_style = { [INIT_FEATURE] = FEATURE_REPRESENT, [NODE_ANNOUNCE_FEATURE] = FEATURE_REPRESENT } }, - { OPT_SPLICE, + { OPT_EXPERIMENTAL_SPLICE, .copy_style = { [INIT_FEATURE] = FEATURE_REPRESENT, [NODE_ANNOUNCE_FEATURE] = FEATURE_REPRESENT, [CHANNEL_FEATURE] = FEATURE_DONT_REPRESENT} }, @@ -491,6 +491,41 @@ const char *feature_name(const tal_t *ctx, size_t f) NULL, NULL, NULL, /* 100/101 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 110/111 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 120/121 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 130/131 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 140/141 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 150/151 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 160/161 */ + "option_experimental_splice", /* https://github.com/lightning/bolts/pull/863 */ + NULL, + NULL, + NULL, + NULL, /* 170/171 */ }; if (f / 2 >= ARRAY_SIZE(fnames) || !fnames[f / 2]) diff --git a/common/features.h b/common/features.h index 31728d1f2758..27e0811ab724 100644 --- a/common/features.h +++ b/common/features.h @@ -136,7 +136,11 @@ struct feature_set *feature_set_dup(const tal_t *ctx, #define OPT_SHUTDOWN_ANYSEGWIT 26 #define OPT_CHANNEL_TYPE 44 #define OPT_PAYMENT_METADATA 48 -#define OPT_SPLICE 62 + +/* BOLT-splice #9: + * | 62/63 | `option_splice` | ... IN ... + */ +#define OPT_EXPERIMENTAL_SPLICE 162 /* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #9: * | 28/29 | `option_dual_fund` | ... IN9 ... diff --git a/contrib/pyln-client/pyln/client/gossmap.py b/contrib/pyln-client/pyln/client/gossmap.py index ad6e681b861d..88641cbba617 100755 --- a/contrib/pyln-client/pyln/client/gossmap.py +++ b/contrib/pyln-client/pyln/client/gossmap.py @@ -74,6 +74,7 @@ class LnFeatureBits(object): OPTION_PROPOSED_UPFRONT_FEE = 56 # IN9 #1052 OPTION_PROPOSED_CLOSING_REJECTED = 60 # IN #1016 OPTION_PROPOSED_SPLICE = 62 # IN #863 + OPTION_PROPOSED_EXPERIMENTAL_SPLICE = 162 # IN #863 def _parse_features(featurebytes): diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index cd59faf9154a..ab698564b068 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -1869,7 +1869,7 @@ static struct command_result *param_channel_for_splice(struct command *cmd, if (!feature_negotiated(cmd->ld->our_features, (*channel)->peer->their_features, - OPT_SPLICE)) + OPT_EXPERIMENTAL_SPLICE)) return command_fail(cmd, SPLICE_NOT_SUPPORTED, "splicing not supported"); diff --git a/lightningd/options.c b/lightningd/options.c index e1a30d3e6a60..856a1086e521 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -1196,7 +1196,7 @@ static char *opt_set_splicing(struct lightningd *ld) OPTIONAL_FEATURE(OPT_QUIESCE)))); feature_set_or(ld->our_features, take(feature_set_for_feature(NULL, - OPTIONAL_FEATURE(OPT_SPLICE)))); + OPTIONAL_FEATURE(OPT_EXPERIMENTAL_SPLICE)))); return NULL; } @@ -1911,7 +1911,7 @@ void add_config_deprecated(struct lightningd *ld, json_add_bool(response, name0, feature_offered(ld->our_features ->bits[INIT_FEATURE], - OPT_SPLICE)); + OPT_EXPERIMENTAL_SPLICE)); } else if (opt->cb == (void *)opt_set_onion_messages) { json_add_bool(response, name0, feature_offered(ld->our_features diff --git a/tests/utils.py b/tests/utils.py index 789b7b8026a1..3063b89aff4c 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -44,7 +44,7 @@ def expected_peer_features(wumbo_channels=False, extra=[]): features += [29] if EXPERIMENTAL_SPLICING: features += [35] # option_quiesce - features += [63] # option_splice + features += [163] # option_experimental_splice return hex_bits(features + extra) @@ -60,7 +60,7 @@ def expected_node_features(wumbo_channels=False, extra=[]): features += [29] if EXPERIMENTAL_SPLICING: features += [35] # option_quiesce - features += [63] # option_splice + features += [163] # option_experimental_splice return hex_bits(features + extra) From 0281111ca128cbff4ea332f012a60e7f62eb2560 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 10 Aug 2023 09:50:38 +0930 Subject: [PATCH 27/30] common: restore OPT_SPLICE definition for the day it's ratified. Signed-off-by: Rusty Russell --- common/features.c | 4 ++++ common/features.h | 1 + 2 files changed, 5 insertions(+) diff --git a/common/features.c b/common/features.c index daeaa58758f2..121f96ee9e38 100644 --- a/common/features.c +++ b/common/features.c @@ -142,6 +142,10 @@ static const struct feature_style feature_styles[] = { { OPT_PROVIDE_PEER_BACKUP_STORAGE, .copy_style = { [INIT_FEATURE] = FEATURE_REPRESENT, [NODE_ANNOUNCE_FEATURE] = FEATURE_REPRESENT } }, + { OPT_SPLICE, + .copy_style = { [INIT_FEATURE] = FEATURE_REPRESENT, + [NODE_ANNOUNCE_FEATURE] = FEATURE_REPRESENT, + [CHANNEL_FEATURE] = FEATURE_DONT_REPRESENT} }, { OPT_EXPERIMENTAL_SPLICE, .copy_style = { [INIT_FEATURE] = FEATURE_REPRESENT, [NODE_ANNOUNCE_FEATURE] = FEATURE_REPRESENT, diff --git a/common/features.h b/common/features.h index 27e0811ab724..640fce1248e1 100644 --- a/common/features.h +++ b/common/features.h @@ -140,6 +140,7 @@ struct feature_set *feature_set_dup(const tal_t *ctx, /* BOLT-splice #9: * | 62/63 | `option_splice` | ... IN ... */ +#define OPT_SPLICE 62 #define OPT_EXPERIMENTAL_SPLICE 162 /* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #9: From 846cec4f2a70429c0a366b0b3884edf7a9edcd97 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 10 Aug 2023 10:31:52 +0930 Subject: [PATCH 28/30] gossipd: ignore redundant node_announcement in gossip_store. Don't know how this is happening, but it is not harmful to ignore it for now. Fixes: #6531 Signed-off-by: Rusty Russell --- gossipd/gossip_store.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gossipd/gossip_store.c b/gossipd/gossip_store.c index d16866e8f9ff..248fd81d3242 100644 --- a/gossipd/gossip_store.c +++ b/gossipd/gossip_store.c @@ -926,8 +926,9 @@ u32 gossip_store_load(struct routing_state *rstate, struct gossip_store *gs) if (!routing_add_node_announcement(rstate, take(msg), gs->len, NULL, NULL, spam)) { - bad = "Bad node_announcement"; - goto badmsg; + /* FIXME: This has been reported: routing.c + * has logged, so ignore. */ + break; } stats[2]++; break; From 4b533f514c1978f7f1392f97064c29444bfe1ac2 Mon Sep 17 00:00:00 2001 From: Justin Date: Fri, 11 Aug 2023 16:33:41 -0500 Subject: [PATCH 29/30] CHANNELD_AWAITING_SPLICE provided in listpeerchannel state history --- doc/schemas/listpeerchannels.schema.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/schemas/listpeerchannels.schema.json b/doc/schemas/listpeerchannels.schema.json index dca3e6febd73..b08970247c2b 100644 --- a/doc/schemas/listpeerchannels.schema.json +++ b/doc/schemas/listpeerchannels.schema.json @@ -378,7 +378,8 @@ "FUNDING_SPEND_SEEN", "ONCHAIN", "DUALOPEND_OPEN_INIT", - "DUALOPEND_AWAITING_LOCKIN" + "DUALOPEND_AWAITING_LOCKIN", + "CHANNELD_AWAITING_SPLICE" ], "description": "Previous state" }, @@ -395,7 +396,8 @@ "FUNDING_SPEND_SEEN", "ONCHAIN", "DUALOPEND_OPEN_INIT", - "DUALOPEND_AWAITING_LOCKIN" + "DUALOPEND_AWAITING_LOCKIN", + "CHANNELD_AWAITING_SPLICE" ], "description": "New state" }, From 990b2b405b268c574d85126a69583069409a4869 Mon Sep 17 00:00:00 2001 From: Justin Date: Fri, 11 Aug 2023 16:39:08 -0500 Subject: [PATCH 30/30] Failing test is provided --- tests/test_splicing.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/test_splicing.py b/tests/test_splicing.py index f59017454ee4..fb675afcc048 100644 --- a/tests/test_splicing.py +++ b/tests/test_splicing.py @@ -10,8 +10,13 @@ def test_splice(node_factory, bitcoind): l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + # get channel id chan_id = l1.get_channel_id(l2) + + channels = l1.rpc.listpeerchannels()['channels'] + original_scid = channels[0].get('short_channel_id') + # add extra sats to pay fee funds_result = l1.rpc.fundpsbt("109000sat", "slow", 166, excess_as_change=True) @@ -27,10 +32,20 @@ def test_splice(node_factory, bitcoind): assert len(list(mempool.keys())) == 1 assert result['txid'] in list(mempool.keys()) - bitcoind.generate_block(6, wait_for_mempool=1) + bitcoind.generate_block(9, wait_for_mempool=1) l2.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_NORMAL') l1.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_NORMAL') inv = l2.rpc.invoice(10**2, '3', 'no_3') l1.rpc.pay(inv['bolt11']) + + peer_channels = l1.rpc.listpeerchannels()['channels'] + assert len(peer_channels) > 0 + + new_scid = peer_channels[0].get('short_channel_id') + + assert new_scid != original_scid + all_channels = l1.rpc.listchannels()['channels'] + print("ALL CHANNELS: {}".format(all_channels)) + assert len(all_channels) > 0 \ No newline at end of file