From e32118aa9e764d246cbac73ab5212dc666810e77 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Sun, 1 Oct 2023 13:49:40 +1030 Subject: [PATCH 01/28] poetry: run poetry update. Signed-off-by: Rusty Russell --- poetry.lock | 568 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 325 insertions(+), 243 deletions(-) diff --git a/poetry.lock b/poetry.lock index c295fffbc5df..b042c47eea68 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,9 +1,10 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry and should not be changed by hand. [[package]] name = "aniso8601" version = "9.0.1" description = "A library for parsing ISO 8601 strings." +category = "main" optional = false python-versions = "*" files = [ @@ -18,6 +19,7 @@ dev = ["black", "coverage", "isort", "pre-commit", "pyenchant", "pylint"] name = "asn1crypto" version = "1.5.1" description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" +category = "main" optional = false python-versions = "*" files = [ @@ -29,6 +31,7 @@ files = [ name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -47,6 +50,7 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "base58" version = "2.1.1" description = "Base58 and Base58Check implementation." +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -61,6 +65,7 @@ tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", " name = "bidict" version = "0.22.1" description = "The bidirectional mapping library for Python." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -77,6 +82,7 @@ test = ["hypothesis", "pytest", "pytest-benchmark[histogram]", "pytest-cov", "py name = "bitstring" version = "3.1.9" description = "Simple construction, analysis and modification of binary data." +category = "main" optional = false python-versions = "*" files = [ @@ -89,6 +95,7 @@ files = [ name = "blinker" version = "1.6.2" description = "Fast, simple object-to-object and broadcast signaling" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -98,75 +105,64 @@ files = [ [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." +category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -176,6 +172,7 @@ pycparser = "*" name = "cheroot" version = "8.6.0" description = "Highly-optimized, pure-python HTTP server" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ @@ -195,6 +192,7 @@ docs = ["furo", "jaraco.packaging (>=3.2)", "python-dateutil", "sphinx (>=1.8.2) name = "click" version = "8.1.7" description = "Composable command line interface toolkit" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -209,6 +207,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "clnrest" version = "23.08" description = "Transforms RPC calls into REST APIs" +category = "main" optional = false python-versions = "^3.8" files = [] @@ -233,6 +232,7 @@ url = "plugins/clnrest" name = "coincurve" version = "18.0.0" description = "Cross-platform Python CFFI bindings for libsecp256k1" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -288,6 +288,7 @@ cffi = ">=1.3.0" name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -299,6 +300,7 @@ files = [ name = "crc32c" version = "2.3.post0" description = "A python package implementing the crc32c algorithm in hardware and software" +category = "dev" optional = false python-versions = "*" files = [ @@ -386,6 +388,7 @@ files = [ name = "cryptography" version = "41.0.4" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -431,6 +434,7 @@ test-randomorder = ["pytest-randomly"] name = "ephemeral-port-reserve" version = "1.1.4" description = "Bind to an ephemeral port, force it into the TIME_WAIT state, and unbind it." +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -442,6 +446,7 @@ files = [ name = "exceptiongroup" version = "1.1.3" description = "Backport of PEP 654 (exception groups)" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -456,6 +461,7 @@ test = ["pytest (>=6)"] name = "execnet" version = "2.0.2" description = "execnet: rapid multi-Python deployment" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -470,6 +476,7 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] name = "flake8" version = "4.0.1" description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -486,6 +493,7 @@ pyflakes = ">=2.4.0,<2.5.0" name = "flask" version = "2.3.3" description = "A simple framework for building complex web applications." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -509,6 +517,7 @@ dotenv = ["python-dotenv"] name = "flask-cors" version = "4.0.0" description = "A Flask extension adding a decorator for CORS support" +category = "main" optional = false python-versions = "*" files = [ @@ -523,6 +532,7 @@ Flask = ">=0.9" name = "flask-restx" version = "1.1.0" description = "Fully featured framework for fast, easy and documented API development with Flask" +category = "main" optional = false python-versions = "*" files = [ @@ -546,6 +556,7 @@ test = ["Faker (==2.0.0)", "blinker", "invoke (==2.0.0)", "mock (==3.0.5)", "pyt name = "flask-socketio" version = "5.3.6" description = "Socket.IO integration for Flask applications" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -564,6 +575,7 @@ docs = ["sphinx"] name = "gevent" version = "23.9.1" description = "Coroutine-based network library" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -629,6 +641,7 @@ test = ["cffi (>=1.12.2)", "coverage (>=5.0)", "dnspython (>=1.16.0,<2.0)", "idn name = "gevent-websocket" version = "0.10.1" description = "Websocket handler for the gevent pywsgi server, a Python network library" +category = "main" optional = false python-versions = "*" files = [ @@ -643,6 +656,7 @@ gevent = "*" name = "greenlet" version = "2.0.2" description = "Lightweight in-process concurrent programming" +category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -720,6 +734,7 @@ test = ["objgraph", "psutil"] name = "greenlet" version = "3.0.0rc3" description = "Lightweight in-process concurrent programming" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -789,117 +804,137 @@ test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.58.0" +version = "1.59.0" description = "HTTP/2-based RPC framework" +category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.58.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3e6bebf1dfdbeb22afd95650e4f019219fef3ab86d3fca8ebade52e4bc39389a"}, - {file = "grpcio-1.58.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cde11577d5b6fd73a00e6bfa3cf5f428f3f33c2d2878982369b5372bbc4acc60"}, - {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a2d67ff99e70e86b2be46c1017ae40b4840d09467d5455b2708de6d4c127e143"}, - {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ed979b273a81de36fc9c6716d9fb09dd3443efa18dcc8652501df11da9583e9"}, - {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:458899d2ebd55d5ca2350fd3826dfd8fcb11fe0f79828ae75e2b1e6051d50a29"}, - {file = "grpcio-1.58.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc7ffef430b80345729ff0a6825e9d96ac87efe39216e87ac58c6c4ef400de93"}, - {file = "grpcio-1.58.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5b23d75e5173faa3d1296a7bedffb25afd2fddb607ef292dfc651490c7b53c3d"}, - {file = "grpcio-1.58.0-cp310-cp310-win32.whl", hash = "sha256:fad9295fe02455d4f158ad72c90ef8b4bcaadfdb5efb5795f7ab0786ad67dd58"}, - {file = "grpcio-1.58.0-cp310-cp310-win_amd64.whl", hash = "sha256:bc325fed4d074367bebd465a20763586e5e1ed5b943e9d8bc7c162b1f44fd602"}, - {file = "grpcio-1.58.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:652978551af02373a5a313e07bfef368f406b5929cf2d50fa7e4027f913dbdb4"}, - {file = "grpcio-1.58.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:9f13a171281ebb4d7b1ba9f06574bce2455dcd3f2f6d1fbe0fd0d84615c74045"}, - {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8774219e21b05f750eef8adc416e9431cf31b98f6ce9def288e4cea1548cbd22"}, - {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09206106848462763f7f273ca93d2d2d4d26cab475089e0de830bb76be04e9e8"}, - {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62831d5e251dd7561d9d9e83a0b8655084b2a1f8ea91e4bd6b3cedfefd32c9d2"}, - {file = "grpcio-1.58.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:212f38c6a156862098f6bdc9a79bf850760a751d259d8f8f249fc6d645105855"}, - {file = "grpcio-1.58.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4b12754af201bb993e6e2efd7812085ddaaef21d0a6f0ff128b97de1ef55aa4a"}, - {file = "grpcio-1.58.0-cp311-cp311-win32.whl", hash = "sha256:3886b4d56bd4afeac518dbc05933926198aa967a7d1d237a318e6fbc47141577"}, - {file = "grpcio-1.58.0-cp311-cp311-win_amd64.whl", hash = "sha256:002f228d197fea12797a14e152447044e14fb4fdb2eb5d6cfa496f29ddbf79ef"}, - {file = "grpcio-1.58.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b5e8db0aff0a4819946215f156bd722b6f6c8320eb8419567ffc74850c9fd205"}, - {file = "grpcio-1.58.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:201e550b7e2ede113b63e718e7ece93cef5b0fbf3c45e8fe4541a5a4305acd15"}, - {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:d79b660681eb9bc66cc7cbf78d1b1b9e335ee56f6ea1755d34a31108b80bd3c8"}, - {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ef8d4a76d2c7d8065aba829f8d0bc0055495c998dce1964ca5b302d02514fb3"}, - {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cba491c638c76d3dc6c191d9c75041ca5b8f5c6de4b8327ecdcab527f130bb4"}, - {file = "grpcio-1.58.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6801ff6652ecd2aae08ef994a3e49ff53de29e69e9cd0fd604a79ae4e545a95c"}, - {file = "grpcio-1.58.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:24edec346e69e672daf12b2c88e95c6f737f3792d08866101d8c5f34370c54fd"}, - {file = "grpcio-1.58.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7e473a7abad9af48e3ab5f3b5d237d18208024d28ead65a459bd720401bd2f8f"}, - {file = "grpcio-1.58.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:4891bbb4bba58acd1d620759b3be11245bfe715eb67a4864c8937b855b7ed7fa"}, - {file = "grpcio-1.58.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:e9f995a8a421405958ff30599b4d0eec244f28edc760de82f0412c71c61763d2"}, - {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2f85f87e2f087d9f632c085b37440a3169fda9cdde80cb84057c2fc292f8cbdf"}, - {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb6b92036ff312d5b4182fa72e8735d17aceca74d0d908a7f08e375456f03e07"}, - {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d81c2b2b24c32139dd2536972f1060678c6b9fbd106842a9fcdecf07b233eccd"}, - {file = "grpcio-1.58.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fbcecb6aedd5c1891db1d70efbfbdc126c986645b5dd616a045c07d6bd2dfa86"}, - {file = "grpcio-1.58.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92ae871a902cf19833328bd6498ec007b265aabf2fda845ab5bd10abcaf4c8c6"}, - {file = "grpcio-1.58.0-cp38-cp38-win32.whl", hash = "sha256:dc72e04620d49d3007771c0e0348deb23ca341c0245d610605dddb4ac65a37cb"}, - {file = "grpcio-1.58.0-cp38-cp38-win_amd64.whl", hash = "sha256:1c1c5238c6072470c7f1614bf7c774ffde6b346a100521de9ce791d1e4453afe"}, - {file = "grpcio-1.58.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:fe643af248442221db027da43ed43e53b73e11f40c9043738de9a2b4b6ca7697"}, - {file = "grpcio-1.58.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:128eb1f8e70676d05b1b0c8e6600320fc222b3f8c985a92224248b1367122188"}, - {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:039003a5e0ae7d41c86c768ef8b3ee2c558aa0a23cf04bf3c23567f37befa092"}, - {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f061722cad3f9aabb3fbb27f3484ec9d4667b7328d1a7800c3c691a98f16bb0"}, - {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0af11938acf8cd4cf815c46156bcde36fa5850518120920d52620cc3ec1830"}, - {file = "grpcio-1.58.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d4cef77ad2fed42b1ba9143465856d7e737279854e444925d5ba45fc1f3ba727"}, - {file = "grpcio-1.58.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24765a627eb4d9288ace32d5104161c3654128fe27f2808ecd6e9b0cfa7fc8b9"}, - {file = "grpcio-1.58.0-cp39-cp39-win32.whl", hash = "sha256:f0241f7eb0d2303a545136c59bc565a35c4fc3b924ccbd69cb482f4828d6f31c"}, - {file = "grpcio-1.58.0-cp39-cp39-win_amd64.whl", hash = "sha256:dcfba7befe3a55dab6fe1eb7fc9359dc0c7f7272b30a70ae0af5d5b063842f28"}, - {file = "grpcio-1.58.0.tar.gz", hash = "sha256:532410c51ccd851b706d1fbc00a87be0f5312bd6f8e5dbf89d4e99c7f79d7499"}, + {file = "grpcio-1.59.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:225e5fa61c35eeaebb4e7491cd2d768cd8eb6ed00f2664fa83a58f29418b39fd"}, + {file = "grpcio-1.59.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b95ec8ecc4f703f5caaa8d96e93e40c7f589bad299a2617bdb8becbcce525539"}, + {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:1a839ba86764cc48226f50b924216000c79779c563a301586a107bda9cbe9dcf"}, + {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6cfe44a5d7c7d5f1017a7da1c8160304091ca5dc64a0f85bca0d63008c3137a"}, + {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0fcf53df684fcc0154b1e61f6b4a8c4cf5f49d98a63511e3f30966feff39cd0"}, + {file = "grpcio-1.59.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa66cac32861500f280bb60fe7d5b3e22d68c51e18e65367e38f8669b78cea3b"}, + {file = "grpcio-1.59.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8cd2d38c2d52f607d75a74143113174c36d8a416d9472415eab834f837580cf7"}, + {file = "grpcio-1.59.0-cp310-cp310-win32.whl", hash = "sha256:228b91ce454876d7eed74041aff24a8f04c0306b7250a2da99d35dd25e2a1211"}, + {file = "grpcio-1.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:ca87ee6183421b7cea3544190061f6c1c3dfc959e0b57a5286b108511fd34ff4"}, + {file = "grpcio-1.59.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c173a87d622ea074ce79be33b952f0b424fa92182063c3bda8625c11d3585d09"}, + {file = "grpcio-1.59.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:ec78aebb9b6771d6a1de7b6ca2f779a2f6113b9108d486e904bde323d51f5589"}, + {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:0b84445fa94d59e6806c10266b977f92fa997db3585f125d6b751af02ff8b9fe"}, + {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c251d22de8f9f5cca9ee47e4bade7c5c853e6e40743f47f5cc02288ee7a87252"}, + {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:956f0b7cb465a65de1bd90d5a7475b4dc55089b25042fe0f6c870707e9aabb1d"}, + {file = "grpcio-1.59.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:38da5310ef84e16d638ad89550b5b9424df508fd5c7b968b90eb9629ca9be4b9"}, + {file = "grpcio-1.59.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63982150a7d598281fa1d7ffead6096e543ff8be189d3235dd2b5604f2c553e5"}, + {file = "grpcio-1.59.0-cp311-cp311-win32.whl", hash = "sha256:50eff97397e29eeee5df106ea1afce3ee134d567aa2c8e04fabab05c79d791a7"}, + {file = "grpcio-1.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f03bd714f987d48ae57fe092cf81960ae36da4e520e729392a59a75cda4f29"}, + {file = "grpcio-1.59.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:f1feb034321ae2f718172d86b8276c03599846dc7bb1792ae370af02718f91c5"}, + {file = "grpcio-1.59.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d09bd2a4e9f5a44d36bb8684f284835c14d30c22d8ec92ce796655af12163588"}, + {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:2f120d27051e4c59db2f267b71b833796770d3ea36ca712befa8c5fff5da6ebd"}, + {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0ca727a173ee093f49ead932c051af463258b4b493b956a2c099696f38aa66"}, + {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5711c51e204dc52065f4a3327dca46e69636a0b76d3e98c2c28c4ccef9b04c52"}, + {file = "grpcio-1.59.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d74f7d2d7c242a6af9d4d069552ec3669965b74fed6b92946e0e13b4168374f9"}, + {file = "grpcio-1.59.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3859917de234a0a2a52132489c4425a73669de9c458b01c9a83687f1f31b5b10"}, + {file = "grpcio-1.59.0-cp312-cp312-win32.whl", hash = "sha256:de2599985b7c1b4ce7526e15c969d66b93687571aa008ca749d6235d056b7205"}, + {file = "grpcio-1.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:598f3530231cf10ae03f4ab92d48c3be1fee0c52213a1d5958df1a90957e6a88"}, + {file = "grpcio-1.59.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b34c7a4c31841a2ea27246a05eed8a80c319bfc0d3e644412ec9ce437105ff6c"}, + {file = "grpcio-1.59.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:c4dfdb49f4997dc664f30116af2d34751b91aa031f8c8ee251ce4dcfc11277b0"}, + {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:61bc72a00ecc2b79d9695220b4d02e8ba53b702b42411397e831c9b0589f08a3"}, + {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f367e4b524cb319e50acbdea57bb63c3b717c5d561974ace0b065a648bb3bad3"}, + {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:849c47ef42424c86af069a9c5e691a765e304079755d5c29eff511263fad9c2a"}, + {file = "grpcio-1.59.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c0488c2b0528e6072010182075615620071371701733c63ab5be49140ed8f7f0"}, + {file = "grpcio-1.59.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:611d9aa0017fa386809bddcb76653a5ab18c264faf4d9ff35cb904d44745f575"}, + {file = "grpcio-1.59.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e5378785dce2b91eb2e5b857ec7602305a3b5cf78311767146464bfa365fc897"}, + {file = "grpcio-1.59.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fe976910de34d21057bcb53b2c5e667843588b48bf11339da2a75f5c4c5b4055"}, + {file = "grpcio-1.59.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:c041a91712bf23b2a910f61e16565a05869e505dc5a5c025d429ca6de5de842c"}, + {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:0ae444221b2c16d8211b55326f8ba173ba8f8c76349bfc1768198ba592b58f74"}, + {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceb1e68135788c3fce2211de86a7597591f0b9a0d2bb80e8401fd1d915991bac"}, + {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4b1cc3a9dc1924d2eb26eec8792fedd4b3fcd10111e26c1d551f2e4eda79ce"}, + {file = "grpcio-1.59.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:871371ce0c0055d3db2a86fdebd1e1d647cf21a8912acc30052660297a5a6901"}, + {file = "grpcio-1.59.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:93e9cb546e610829e462147ce724a9cb108e61647a3454500438a6deef610be1"}, + {file = "grpcio-1.59.0-cp38-cp38-win32.whl", hash = "sha256:f21917aa50b40842b51aff2de6ebf9e2f6af3fe0971c31960ad6a3a2b24988f4"}, + {file = "grpcio-1.59.0-cp38-cp38-win_amd64.whl", hash = "sha256:14890da86a0c0e9dc1ea8e90101d7a3e0e7b1e71f4487fab36e2bfd2ecadd13c"}, + {file = "grpcio-1.59.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:34341d9e81a4b669a5f5dca3b2a760b6798e95cdda2b173e65d29d0b16692857"}, + {file = "grpcio-1.59.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:986de4aa75646e963466b386a8c5055c8b23a26a36a6c99052385d6fe8aaf180"}, + {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:aca8a24fef80bef73f83eb8153f5f5a0134d9539b4c436a716256b311dda90a6"}, + {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:936b2e04663660c600d5173bc2cc84e15adbad9c8f71946eb833b0afc205b996"}, + {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc8bf2e7bc725e76c0c11e474634a08c8f24bcf7426c0c6d60c8f9c6e70e4d4a"}, + {file = "grpcio-1.59.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81d86a096ccd24a57fa5772a544c9e566218bc4de49e8c909882dae9d73392df"}, + {file = "grpcio-1.59.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ea95cd6abbe20138b8df965b4a8674ec312aaef3147c0f46a0bac661f09e8d0"}, + {file = "grpcio-1.59.0-cp39-cp39-win32.whl", hash = "sha256:3b8ff795d35a93d1df6531f31c1502673d1cebeeba93d0f9bd74617381507e3f"}, + {file = "grpcio-1.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:38823bd088c69f59966f594d087d3a929d1ef310506bee9e3648317660d65b81"}, + {file = "grpcio-1.59.0.tar.gz", hash = "sha256:acf70a63cf09dd494000007b798aff88a436e1c03b394995ce450be437b8e54f"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.58.0)"] +protobuf = ["grpcio-tools (>=1.59.0)"] [[package]] name = "grpcio-tools" -version = "1.58.0" +version = "1.59.0" description = "Protobuf code generator for gRPC" +category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-tools-1.58.0.tar.gz", hash = "sha256:6f4d80ceb591e31ca4dceec747dbe56132e1392a0a9bb1c8fe001d1b5cac898a"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:60c874908f3b40f32f1bb0221f7b3ab65ecb53a4d0a9f0a394f031f1b292c177"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:1852e798f31e5437ca7b37abc910e028b34732fb19364862cedb87b1dab66fad"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:149fb48f53cb691a6328f68bed8e4036c730f7106b7f98e92c2c0403f0b9e93c"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba3d383e5ca93826038b70f326fce8e8d12dd9b2f64d363a3d612f7475f12dd2"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6997511e9d2979f7a2389479682dbb06823f21a904e8fb0a5c6baaf1b4b4a863"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8de0b701da479643f71fad71fe66885cddd89441ae16e2c724939b47742dc72e"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43cc23908b63fcaefe690b10f68a2d8652c994b5b36ab77d2271d9608c895320"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-win32.whl", hash = "sha256:2c2221123d010dc6231799e63a37f2f4786bf614ef65b23009c387cd20d8b193"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-win_amd64.whl", hash = "sha256:df2788736bdf58abe7b0e4d6b1ff806f7686c98c5ad900da312252e3322d91c4"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:b6ea5578712cdb29b0ff60bfc6405bf0e8d681b9c71d106dd1cda54fe7fe4e55"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:c29880f491581c83181c0a84a4d11402af2b13166a5266f64e246adf1da7aa66"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:32d51e933c3565414dd0835f930bb28a1cdeba435d9d2c87fa3cf8b1d284db3c"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ad9d77f25514584b1ddc981d70c9e50dfcfc388aa5ba943eee67520c5267ed9"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4882382631e6352819059278a5c878ce0b067008dd490911d16d5616e8a36d85"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d84091a189d848d94645b7c48b61734c12ec03b0d46e5fc0049343a26989ac5c"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:85ac28a9621e9b92a3fc416288c4ce45542db0b4c31b3e23031dd8e0a0ec5590"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-win32.whl", hash = "sha256:7371d8ea80234b29affec145e25569523f549520ed7e53b2aa92bed412cdecfd"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-win_amd64.whl", hash = "sha256:6997df6e7c5cf4d3ddc764240c1ff6a04b45d70ec28913b38fbc6396ef743e12"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:ac65b8d6e3acaf88b815edf9af88ff844b6600ff3d2591c05ba4f655b45d5fb4"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:88e8191d0dd789bebf42533808728f5ce75d2c51e2a72bdf20abe5b5e3fbec42"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:a3dbece2a121761499a659b799979d4b738586d1065439053de553773eee11ca"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1086fe240c4c879b9721952b47d46996deb283c2d9355a8dc24a804811aacf70"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ae3dca059d5b358dd03fb63277428fa7d771605d4074a019138dd38d70719a"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3f8904ac7fc3da2e874f00b3a986e8b7e004f499344a8e7eb213c26dfb025041"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:aadbd8393ae332e49731adb31e741f2e689989150569b7acc939f5ea43124e2d"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1cb6e24194786687d4f23c64de1f0ce553af51de22746911bc37340f85f9783e"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:6ec43909095c630df3e479e77469bdad367067431f4af602f6ccb978a3b78afd"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:4be49ed320b0ebcbc21d19ef555fbf229c1c452105522b728e1171ee2052078e"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:28eefebddec3d3adf19baca78f8b82a2287d358e1b1575ae018cdca8eacc6269"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ef8c696e9d78676cc3f583a92bbbf2c84e94e350f7ad22f150a52559f4599d1"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9aeb5949e46558d21c51fd3ec3eeecc59c94dbca76c67c0a80d3da6b7437930c"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f7144aad9396d35fb1b80429600a970b559c2ad4d07020eeb180fe83cea2bee"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ee26e9253a721fff355737649678535f76cf5d642aa3ac0cd937832559b90af"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-win32.whl", hash = "sha256:343f572312039059a8797d6e29a7fc62196e73131ab01755660a9d48202267c1"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-win_amd64.whl", hash = "sha256:cd7acfbb43b7338a78cf4a67528d05530d574d92b7c829d185b78dfc451d158f"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:46628247fbce86d18232eead24bd22ed0826c79f3fe2fc2fbdbde45971361049"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:51587842a54e025a3d0d37afcf4ef2b7ac1def9a5d17448665cb424b53d6c287"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:a062ae3072a2a39a3c057f4d68b57b021f1dd2956cd09aab39709f6af494e1de"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eec3c93a08df11c80ef1c29a616bcbb0d83dbc6ea41b48306fcacc720416dfa7"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b63f823ac991ff77104da614d2a2485a59d37d57830eb2e387a6e2a3edc7fa2b"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:579c11a9f198847ed48dbc4f211c67fe96a73320b87c81f01b044b72e24a7d77"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ca2fc1dd8049d417a5034d944c9df05cee76f855b3e431627ab4292e7c01c47"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-win32.whl", hash = "sha256:453023120114c35d3d9d6717ea0820e5d5c140f51f9d0b621de4397ff854471b"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-win_amd64.whl", hash = "sha256:b6c896f1df99c35cf062d4803c15663ff00a33ff09add28baa6e475cf6b5e258"}, + {file = "grpcio-tools-1.59.0.tar.gz", hash = "sha256:aa4018f2d8662ac4d9830445d3d253a11b3e096e8afe20865547137aa1160e93"}, + {file = "grpcio_tools-1.59.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:882b809b42b5464bee55288f4e60837297f9618e53e69ae3eea6d61b05ce48fa"}, + {file = "grpcio_tools-1.59.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:4499d4bc5aa9c7b645018d8b0db4bebd663d427aabcd7bee7777046cb1bcbca7"}, + {file = "grpcio_tools-1.59.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f381ae3ad6a5eb27aad8d810438937d8228977067c54e0bd456fce7e11fdbf3d"}, + {file = "grpcio_tools-1.59.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1c684c0d9226d04cadafced620a46ab38c346d0780eaac7448da96bf12066a3"}, + {file = "grpcio_tools-1.59.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40cbf712769242c2ba237745285ef789114d7fcfe8865fc4817d87f20015e99a"}, + {file = "grpcio_tools-1.59.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1df755951f204e65bf9232a9cac5afe7d6b8e4c87ac084d3ecd738fdc7aa4174"}, + {file = "grpcio_tools-1.59.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:de156c18b0c638aaee3be6ad650c8ba7dec94ed4bac26403aec3dce95ffe9407"}, + {file = "grpcio_tools-1.59.0-cp310-cp310-win32.whl", hash = "sha256:9af7e138baa9b2895cf1f3eb718ac96fc5ae2f8e31fca405e21e0e5cd1643c52"}, + {file = "grpcio_tools-1.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:f14a6e4f700dfd30ff8f0e6695f944affc16ae5a1e738666b3fae4e44b65637e"}, + {file = "grpcio_tools-1.59.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:db030140d0da2368319e2f23655df3baec278c7e0078ecbe051eaf609a69382c"}, + {file = "grpcio_tools-1.59.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:eeed386971bb8afc3ec45593df6a1154d680d87be1209ef8e782e44f85f47e64"}, + {file = "grpcio_tools-1.59.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:962d1a3067129152cee3e172213486cb218a6bad703836991f46f216caefcf00"}, + {file = "grpcio_tools-1.59.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26eb2eebf150a33ebf088e67c1acf37eb2ac4133d9bfccbaa011ad2148c08b42"}, + {file = "grpcio_tools-1.59.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2d6da553980c590487f2e7fd3ec9c1ad8805ff2ec77977b92faa7e3ca14e1f"}, + {file = "grpcio_tools-1.59.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:335e2f355a0c544a88854e2c053aff8a3f398b84a263a96fa19d063ca1fe513a"}, + {file = "grpcio_tools-1.59.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:204e08f807b1d83f5f0efea30c4e680afe26a43dec8ba614a45fa698a7ef0a19"}, + {file = "grpcio_tools-1.59.0-cp311-cp311-win32.whl", hash = "sha256:05bf7b3ed01c8a562bb7e840f864c58acedbd6924eb616367c0bd0a760bdf483"}, + {file = "grpcio_tools-1.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:df85096fcac7cea8aa5bd84b7a39c4cdbf556b93669bb4772eb96aacd3222a4e"}, + {file = "grpcio_tools-1.59.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:240a7a3c2c54f77f1f66085a635bca72003d02f56a670e7db19aec531eda8f78"}, + {file = "grpcio_tools-1.59.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:6119f62c462d119c63227b9534210f0f13506a888151b9bf586f71e7edf5088b"}, + {file = "grpcio_tools-1.59.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:387662bee8e4c0b52cc0f61eaaca0ca583f5b227103f685b76083a3590a71a3e"}, + {file = "grpcio_tools-1.59.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f0da5861ee276ca68493b217daef358960e8527cc63c7cb292ca1c9c54939af"}, + {file = "grpcio_tools-1.59.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f0806de1161c7f248e4c183633ee7a58dfe45c2b77ddf0136e2e7ad0650b1b"}, + {file = "grpcio_tools-1.59.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c683be38a9bf4024c223929b4cd2f0a0858c94e9dc8b36d7eaa5a48ce9323a6f"}, + {file = "grpcio_tools-1.59.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f965707da2b48a33128615bcfebedd215a3a30e346447e885bb3da37a143177a"}, + {file = "grpcio_tools-1.59.0-cp312-cp312-win32.whl", hash = "sha256:2ee960904dde12a7fa48e1591a5b3eeae054bdce57bacf9fd26685a98138f5bf"}, + {file = "grpcio_tools-1.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:71cc6db1d66da3bc3730d9937bddc320f7b1f1dfdff6342bcb5741515fe4110b"}, + {file = "grpcio_tools-1.59.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:f6263b85261b62471cb97b7505df72d72b8b62e5e22d8184924871a6155b4dbf"}, + {file = "grpcio_tools-1.59.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:b8e95d921cc2a1521d4750eedefec9f16031457920a6677edebe9d1b2ad6ae60"}, + {file = "grpcio_tools-1.59.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:cb63055739808144b541986291679d643bae58755d0eb082157c4d4c04443905"}, + {file = "grpcio_tools-1.59.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c4634b3589efa156a8d5860c0a2547315bd5c9e52d14c960d716fe86e0927be"}, + {file = "grpcio_tools-1.59.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d970aa26854f535ffb94ea098aa8b43de020d9a14682e4a15dcdaeac7801b27"}, + {file = "grpcio_tools-1.59.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:821dba464d84ebbcffd9d420302404db2fa7a40c7ff4c4c4c93726f72bfa2769"}, + {file = "grpcio_tools-1.59.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0548e901894399886ff4a4cd808cb850b60c021feb4a8977a0751f14dd7e55d9"}, + {file = "grpcio_tools-1.59.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bb87158dbbb9e5a79effe78d54837599caa16df52d8d35366e06a91723b587ae"}, + {file = "grpcio_tools-1.59.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:1d551ff42962c7c333c3da5c70d5e617a87dee581fa2e2c5ae2d5137c8886779"}, + {file = "grpcio_tools-1.59.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:4ee443abcd241a5befb05629013fbf2eac637faa94aaa3056351aded8a31c1bc"}, + {file = "grpcio_tools-1.59.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:520c0c83ea79d14b0679ba43e19c64ca31d30926b26ad2ca7db37cbd89c167e2"}, + {file = "grpcio_tools-1.59.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fc02a6e517c34dcf885ff3b57260b646551083903e3d2c780b4971ce7d4ab7c"}, + {file = "grpcio_tools-1.59.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aec8a4ed3808b7dfc1276fe51e3e24bec0eeaf610d395bcd42934647cf902a3"}, + {file = "grpcio_tools-1.59.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:99b3bde646720bbfb77f263f5ba3e1a0de50632d43c38d405a0ef9c7e94373cd"}, + {file = "grpcio_tools-1.59.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51d9595629998d8b519126c5a610f15deb0327cd6325ed10796b47d1d292e70b"}, + {file = "grpcio_tools-1.59.0-cp38-cp38-win32.whl", hash = "sha256:bfa4b2b7d21c5634b62e5f03462243bd705adc1a21806b5356b8ce06d902e160"}, + {file = "grpcio_tools-1.59.0-cp38-cp38-win_amd64.whl", hash = "sha256:9ed05197c5ab071e91bcef28901e97ca168c4ae94510cb67a14cb4931b94255a"}, + {file = "grpcio_tools-1.59.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:498e7be0b14385980efa681444ba481349c131fc5ec88003819f5d929646947c"}, + {file = "grpcio_tools-1.59.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:b519f2ecde9a579cad2f4a7057d5bb4e040ad17caab8b5e691ed7a13b9db0be9"}, + {file = "grpcio_tools-1.59.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:ef3e8aca2261f7f07436d4e2111556c1fb9bf1f9cfcdf35262743ccdee1b6ce9"}, + {file = "grpcio_tools-1.59.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a7f226b741b2ebf7e2d0779d2c9b17f446d1b839d59886c1619e62cc2ae472"}, + {file = "grpcio_tools-1.59.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:784aa52965916fec5afa1a28eeee6f0073bb43a2a1d7fedf963393898843077a"}, + {file = "grpcio_tools-1.59.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e312ddc2d8bec1a23306a661ad52734f984c9aad5d8f126ebb222a778d95407d"}, + {file = "grpcio_tools-1.59.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:868892ad9e00651a38dace3e4924bae82fc4fd4df2c65d37b74381570ee8deb1"}, + {file = "grpcio_tools-1.59.0-cp39-cp39-win32.whl", hash = "sha256:a4f6cae381f21fee1ef0a5cbbbb146680164311157ae618edf3061742d844383"}, + {file = "grpcio_tools-1.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:4a10e59cca462208b489478340b52a96d64e8b8b6f1ac097f3e8cb211d3f66c0"}, ] [package.dependencies] -grpcio = ">=1.58.0" +grpcio = ">=1.59.0" protobuf = ">=4.21.6,<5.0dev" setuptools = "*" @@ -907,6 +942,7 @@ setuptools = "*" name = "gunicorn" version = "21.2.0" description = "WSGI HTTP Server for UNIX" +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -927,6 +963,7 @@ tornado = ["tornado (>=0.2)"] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -938,6 +975,7 @@ files = [ name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -955,26 +993,28 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs [[package]] name = "importlib-resources" -version = "6.0.1" +version = "6.1.0" description = "Read resources from Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, - {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, + {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, + {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -986,6 +1026,7 @@ files = [ name = "itsdangerous" version = "2.1.2" description = "Safely pass data to untrusted environments and back." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -997,6 +1038,7 @@ files = [ name = "jaraco-functools" version = "3.9.0" description = "Functools like those found in stdlib" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1016,6 +1058,7 @@ testing = ["jaraco.classes", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-c name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1033,6 +1076,7 @@ i18n = ["Babel (>=2.7)"] name = "json5" version = "0.9.14" description = "A Python implementation of the JSON5 data format." +category = "main" optional = false python-versions = "*" files = [ @@ -1045,13 +1089,14 @@ dev = ["hypothesis"] [[package]] name = "jsonschema" -version = "4.19.0" +version = "4.19.1" description = "An implementation of JSON Schema validation for Python" +category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.19.0-py3-none-any.whl", hash = "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb"}, - {file = "jsonschema-4.19.0.tar.gz", hash = "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f"}, + {file = "jsonschema-4.19.1-py3-none-any.whl", hash = "sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e"}, + {file = "jsonschema-4.19.1.tar.gz", hash = "sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf"}, ] [package.dependencies] @@ -1070,6 +1115,7 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.7.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1085,6 +1131,7 @@ referencing = ">=0.28.0" name = "mako" version = "1.2.4" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1104,6 +1151,7 @@ testing = ["pytest"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1127,16 +1175,6 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -1173,6 +1211,7 @@ files = [ name = "mccabe" version = "0.6.1" description = "McCabe checker, plugin for flake8" +category = "dev" optional = false python-versions = "*" files = [ @@ -1184,6 +1223,7 @@ files = [ name = "more-itertools" version = "10.1.0" description = "More routines for operating on iterables, beyond itertools" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1195,6 +1235,7 @@ files = [ name = "mypy" version = "0.931" description = "Optional static typing for Python" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1233,6 +1274,7 @@ python2 = ["typed-ast (>=1.4.0,<2)"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1244,6 +1286,7 @@ files = [ name = "packaging" version = "23.1" description = "Core utilities for Python packages" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1255,6 +1298,7 @@ files = [ name = "pkgutil-resolve-name" version = "1.3.10" description = "Resolve a name to an object." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1266,6 +1310,7 @@ files = [ name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1281,6 +1326,7 @@ testing = ["pytest", "pytest-benchmark"] name = "protobuf" version = "4.21.12" description = "" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1304,6 +1350,7 @@ files = [ name = "protobuf3" version = "0.2.1" description = "Protocol buffers library for Python 3" +category = "dev" optional = false python-versions = "*" files = [ @@ -1314,6 +1361,7 @@ files = [ name = "psutil" version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1338,77 +1386,79 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "psycopg2-binary" -version = "2.9.7" +version = "2.9.8" description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "psycopg2-binary-2.9.7.tar.gz", hash = "sha256:1b918f64a51ffe19cd2e230b3240ba481330ce1d4b7875ae67305bd1d37b041c"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ea5f8ee87f1eddc818fc04649d952c526db4426d26bab16efbe5a0c52b27d6ab"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2993ccb2b7e80844d534e55e0f12534c2871952f78e0da33c35e648bf002bbff"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbbc3c5d15ed76b0d9db7753c0db40899136ecfe97d50cbde918f630c5eb857a"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:692df8763b71d42eb8343f54091368f6f6c9cfc56dc391858cdb3c3ef1e3e584"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dcfd5d37e027ec393a303cc0a216be564b96c80ba532f3d1e0d2b5e5e4b1e6e"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17cc17a70dfb295a240db7f65b6d8153c3d81efb145d76da1e4a096e9c5c0e63"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e5666632ba2b0d9757b38fc17337d84bdf932d38563c5234f5f8c54fd01349c9"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7db7b9b701974c96a88997d458b38ccb110eba8f805d4b4f74944aac48639b42"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c82986635a16fb1fa15cd5436035c88bc65c3d5ced1cfaac7f357ee9e9deddd4"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4fe13712357d802080cfccbf8c6266a3121dc0e27e2144819029095ccf708372"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-win32.whl", hash = "sha256:122641b7fab18ef76b18860dd0c772290566b6fb30cc08e923ad73d17461dc63"}, - {file = "psycopg2_binary-2.9.7-cp310-cp310-win_amd64.whl", hash = "sha256:f8651cf1f144f9ee0fa7d1a1df61a9184ab72962531ca99f077bbdcba3947c58"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ecc15666f16f97709106d87284c136cdc82647e1c3f8392a672616aed3c7151"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fbb1184c7e9d28d67671992970718c05af5f77fc88e26fd7136613c4ece1f89"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7968fd20bd550431837656872c19575b687f3f6f98120046228e451e4064df"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:094af2e77a1976efd4956a031028774b827029729725e136514aae3cdf49b87b"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26484e913d472ecb6b45937ea55ce29c57c662066d222fb0fbdc1fab457f18c5"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f309b77a7c716e6ed9891b9b42953c3ff7d533dc548c1e33fddc73d2f5e21f9"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d92e139ca388ccfe8c04aacc163756e55ba4c623c6ba13d5d1595ed97523e4b"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2df562bb2e4e00ee064779902d721223cfa9f8f58e7e52318c97d139cf7f012d"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4eec5d36dbcfc076caab61a2114c12094c0b7027d57e9e4387b634e8ab36fd44"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1011eeb0c51e5b9ea1016f0f45fa23aca63966a4c0afcf0340ccabe85a9f65bd"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-win32.whl", hash = "sha256:ded8e15f7550db9e75c60b3d9fcbc7737fea258a0f10032cdb7edc26c2a671fd"}, - {file = "psycopg2_binary-2.9.7-cp311-cp311-win_amd64.whl", hash = "sha256:8a136c8aaf6615653450817a7abe0fc01e4ea720ae41dfb2823eccae4b9062a3"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2dec5a75a3a5d42b120e88e6ed3e3b37b46459202bb8e36cd67591b6e5feebc1"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc10da7e7df3380426521e8c1ed975d22df678639da2ed0ec3244c3dc2ab54c8"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee919b676da28f78f91b464fb3e12238bd7474483352a59c8a16c39dfc59f0c5"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb1c0e682138f9067a58fc3c9a9bf1c83d8e08cfbee380d858e63196466d5c86"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00d8db270afb76f48a499f7bb8fa70297e66da67288471ca873db88382850bf4"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b0c2b466b2f4d89ccc33784c4ebb1627989bd84a39b79092e560e937a11d4ac"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:51d1b42d44f4ffb93188f9b39e6d1c82aa758fdb8d9de65e1ddfe7a7d250d7ad"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:11abdbfc6f7f7dea4a524b5f4117369b0d757725798f1593796be6ece20266cb"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f02f4a72cc3ab2565c6d9720f0343cb840fb2dc01a2e9ecb8bc58ccf95dc5c06"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-win32.whl", hash = "sha256:81d5dd2dd9ab78d31a451e357315f201d976c131ca7d43870a0e8063b6b7a1ec"}, - {file = "psycopg2_binary-2.9.7-cp37-cp37m-win_amd64.whl", hash = "sha256:62cb6de84d7767164a87ca97e22e5e0a134856ebcb08f21b621c6125baf61f16"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:59f7e9109a59dfa31efa022e94a244736ae401526682de504e87bd11ce870c22"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:95a7a747bdc3b010bb6a980f053233e7610276d55f3ca506afff4ad7749ab58a"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c721ee464e45ecf609ff8c0a555018764974114f671815a0a7152aedb9f3343"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4f37bbc6588d402980ffbd1f3338c871368fb4b1cfa091debe13c68bb3852b3"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac83ab05e25354dad798401babaa6daa9577462136ba215694865394840e31f8"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:024eaeb2a08c9a65cd5f94b31ace1ee3bb3f978cd4d079406aef85169ba01f08"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1c31c2606ac500dbd26381145684d87730a2fac9a62ebcfbaa2b119f8d6c19f4"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:42a62ef0e5abb55bf6ffb050eb2b0fcd767261fa3faf943a4267539168807522"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7952807f95c8eba6a8ccb14e00bf170bb700cafcec3924d565235dffc7dc4ae8"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e02bc4f2966475a7393bd0f098e1165d470d3fa816264054359ed4f10f6914ea"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-win32.whl", hash = "sha256:fdca0511458d26cf39b827a663d7d87db6f32b93efc22442a742035728603d5f"}, - {file = "psycopg2_binary-2.9.7-cp38-cp38-win_amd64.whl", hash = "sha256:d0b16e5bb0ab78583f0ed7ab16378a0f8a89a27256bb5560402749dbe8a164d7"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6822c9c63308d650db201ba22fe6648bd6786ca6d14fdaf273b17e15608d0852"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f94cb12150d57ea433e3e02aabd072205648e86f1d5a0a692d60242f7809b15"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5ee89587696d808c9a00876065d725d4ae606f5f7853b961cdbc348b0f7c9a1"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad5ec10b53cbb57e9a2e77b67e4e4368df56b54d6b00cc86398578f1c635f329"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:642df77484b2dcaf87d4237792246d8068653f9e0f5c025e2c692fc56b0dda70"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6a8b575ac45af1eaccbbcdcf710ab984fd50af048fe130672377f78aaff6fc1"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f955aa50d7d5220fcb6e38f69ea126eafecd812d96aeed5d5f3597f33fad43bb"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ad26d4eeaa0d722b25814cce97335ecf1b707630258f14ac4d2ed3d1d8415265"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ced63c054bdaf0298f62681d5dcae3afe60cbae332390bfb1acf0e23dcd25fc8"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2b04da24cbde33292ad34a40db9832a80ad12de26486ffeda883413c9e1b1d5e"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-win32.whl", hash = "sha256:18f12632ab516c47c1ac4841a78fddea6508a8284c7cf0f292cb1a523f2e2379"}, - {file = "psycopg2_binary-2.9.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb3b8d55924a6058a26db69fb1d3e7e32695ff8b491835ba9f479537e14dcf9f"}, + {file = "psycopg2-binary-2.9.8.tar.gz", hash = "sha256:80451e6b6b7c486828d5c7ed50769532bbb04ec3a411f1e833539d5c10eb691c"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e271ad6692d50d70ca75db3bd461bfc26316de78de8fe1f504ef16dcea8f2312"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ae22a0fa5c516b84ddb189157fabfa3f12eded5d630e1ce260a18e1771f8707"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a971086db0069aef2fd22ccffb670baac427f4ee2174c4f5c7206254f1e6794"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b6928a502af71ca2ac9aad535e78c8309892ed3bfa7933182d4c760580c8af4"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f955fe6301b84b6fd13970a05f3640fbb62ca3a0d19342356585006c830e038"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3723c3f009e2b2771f2491b330edb7091846f1aad0c08fbbd9a1383d6a0c0841"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e3142c7e51b92855cff300580de949e36a94ab3bfa8f353b27fe26535e9b3542"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:de85105c568dc5f0f0efe793209ba83e4675d53d00faffc7a7c7a8bea9e0e19a"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c7ff2b6a79a92b1b169b03bb91b41806843f0cdf6055256554495bffed1d496d"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59f45cca0765aabb52a5822c72d5ff2ec46a28b1c1702de90dc0d306ec5c2001"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-win32.whl", hash = "sha256:1dbad789ebd1e61201256a19dc2e90fed4706bc966ccad4f374648e5336b1ab4"}, + {file = "psycopg2_binary-2.9.8-cp310-cp310-win_amd64.whl", hash = "sha256:15458c81b0d199ab55825007115f697722831656e6477a427783fe75c201c82b"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:395c217156723fe21809dfe8f7a433c5bf8e9bce229944668e4ec709c37c5442"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:14f85ff2d5d826a7ce9e6c31e803281ed5a096789f47f52cb728c88f488de01b"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e11373d8e4f1f46cf3065bf613f0df9854803dc95aa4a35354ffac19f8c52127"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01f9731761f711e42459f87bd2ad5d744b9773b5dd05446f3b579a0f077e78e3"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bf5c27bd5867a5fa5341fad29f0d5838e2fed617ef5346884baf8b8b16dd82"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bfabbd7e70785af726cc0209e8e64b926abf91741eca80678b221aad9e72135"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6369f4bd4d27944498094dccced1ae7ca43376a59dbfe4c8b6a16e9e3dc3ccce"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4879ee1d07a6b2c232ae6a74570f4788cd7a29b3cd38bc39bf60225b1d075c78"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4336afc0e81726350bd5863e3c3116d8c12aa7f457d3d0b3b3dc36137fec6feb"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63ce1dccfd08d9c5341ac82d62aa04345bc4bf41b5e5b7b2c6c172a28e0eda27"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-win32.whl", hash = "sha256:59421806c1a0803ea7de9ed061d656c041a84db0da7e73266b98db4c7ba263da"}, + {file = "psycopg2_binary-2.9.8-cp311-cp311-win_amd64.whl", hash = "sha256:ccaa2ae03990cedde1f618ff11ec89fefa84622da73091a67b44553ca8be6711"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5aa0c99c12075c593dcdccbb8a7aaa714b716560cc99ef9206f9e75b77520801"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91719f53ed2a95ebecefac48d855d811cba9d9fe300acc162993bdfde9bc1c3b"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c68a2e1afb4f2a5bb4b7bb8f90298d21196ac1c66418523e549430b8c4b7cb1e"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278ebd63ced5a5f3af5394cb75a9a067243eee21f42f0126c6f1cf85eaeb90f9"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c84ff9682bc4520504c474e189b3de7c4a4029e529c8b775e39c95c33073767"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6f5e70e40dae47a4dc7f8eb390753bb599b0f4ede314580e6faa3b7383695d19"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:673eafbdaa4ed9f5164c90e191c3895cc5f866b9b379fdb59f3a2294e914d9bd"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5a0a6e4004697ec98035ff3b8dfc4dba8daa477b23ee891d831cd3cd65ace6be"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d29efab3c5d6d978115855a0f2643e0ee8c6450dc536d5b4afec6f52ab99e99e"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-win32.whl", hash = "sha256:d4a19a3332f2ac6d093e60a6f1c589f97eb9f9de7e27ea80d67f188384e31572"}, + {file = "psycopg2_binary-2.9.8-cp37-cp37m-win_amd64.whl", hash = "sha256:5262713988d97a9d4cd54b682dec4a413b87b76790e5b16f480450550d11a8f7"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e46b0f4683539965ce849f2c13fc53e323bb08d84d4ba2e4b3d976f364c84210"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3fd44b52bc9c74c1512662e8da113a1c55127adeeacebaf460babe766517b049"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b6c607ecb6a9c245ebe162d63ccd9222d38efa3c858bbe38d32810b08b8f87e"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6ef615d48fa60361e57f998327046bd89679c25d06eee9e78156be5a7a76e03"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65403113ac3a4813a1409fb6a1e43c658b459cc8ed8afcc5f4baf02ec8be4334"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debcb23a052f3fb4c165789ea513b562b2fac0f0f4f53eaf3cf4dc648907ff8"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dc145a241e1f6381efb924bcf3e3462d6020b8a147363f9111eb0a9c89331ad7"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1d669887df169a9b0c09e0f5b46891511850a9ddfcde3593408af9d9774c5c3a"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:19d40993701e39c49b50e75cd690a6af796d7e7210941ee0fe49cf12b25840e5"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b8b2cdf3bce4dd91dc035fbff4eb812f5607dda91364dc216b0920b97b521c7"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-win32.whl", hash = "sha256:4960c881471ca710b81a67ef148c33ee121c1f8e47a639cf7e06537fe9fee337"}, + {file = "psycopg2_binary-2.9.8-cp38-cp38-win_amd64.whl", hash = "sha256:aeb09db95f38e75ae04e947d283e07be34d03c4c2ace4f0b73dbb9143d506e67"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5aef3296d44d05805e634dbbd2972aa8eb7497926dd86047f5e39a79c3ecc086"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4d6b592ecc8667e608b9e7344259fbfb428cc053df0062ec3ac75d8270cd5a9f"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:693a4e7641556f0b421a7d6c6a74058aead407d860ac1cb9d0bf25be0ca73de8"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf60c599c40c266a01c458e9c71db7132b11760f98f08233f19b3e0a2153cbf1"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cbe1e19f59950afd66764e3c905ecee9f2aee9f8df2ef35af6f7948ad93f620"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc37de7e3a87f5966965fc874d33c9b68d638e6c3718fdf32a5083de563428b0"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6e1bb4eb0d9925d65dabaaabcbb279fab444ba66d73f86d4c07dfd11f0139c06"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e7bdc94217ae20ad03b375a991e107a31814053bee900ad8c967bf82ef3ff02e"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:565edaf9f691b17a7fdbabd368b5b3e67d0fdc8f7f6b52177c1d3289f4e763fd"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0e3071c947bda6afc6fe2e7b64ebd64fb2cad1bc0e705a3594cb499291f2dfec"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-win32.whl", hash = "sha256:205cecdd81ff4f1ddd687ce7d06879b9b80cccc428d8d6ebf36fcba08bb6d361"}, + {file = "psycopg2_binary-2.9.8-cp39-cp39-win_amd64.whl", hash = "sha256:1f279ba74f0d6b374526e5976c626d2ac3b8333b6a7b08755c513f4d380d3add"}, ] [[package]] name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1420,6 +1470,7 @@ files = [ name = "pycodestyle" version = "2.8.0" description = "Python style guide checker" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1431,6 +1482,7 @@ files = [ name = "pycparser" version = "2.21" description = "C parser in Python" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1442,6 +1494,7 @@ files = [ name = "pyflakes" version = "2.4.0" description = "passive checker of Python programs" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1453,6 +1506,7 @@ files = [ name = "pyln-bolt7" version = "1.0.246" description = "BOLT7" +category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -1464,6 +1518,7 @@ files = [ name = "pyln-client" version = "23.08" description = "Client library and plugin library for Core Lightning" +category = "main" optional = false python-versions = "^3.8" files = [] @@ -1481,6 +1536,7 @@ url = "contrib/pyln-client" name = "pyln-grpc-proto" version = "0.1.1" description = "The compiled GRPC proto for CLN" +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -1495,6 +1551,7 @@ protobuf3 = "*" name = "pyln-proto" version = "23.08" description = "This package implements some of the Lightning Network protocol in pure python. It is intended for protocol testing and some minor tooling only. It is not deemed secure enough to handle any amount of real funds (you have been warned!)." +category = "main" optional = false python-versions = "^3.8" files = [] @@ -1515,6 +1572,7 @@ url = "contrib/pyln-proto" name = "pyln-testing" version = "23.08" description = "Test your Core Lightning integration, plugins or whatever you want" +category = "dev" optional = false python-versions = "^3.8" files = [] @@ -1544,6 +1602,7 @@ url = "contrib/pyln-testing" name = "pysocks" version = "1.7.1" description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1556,6 +1615,7 @@ files = [ name = "pytest" version = "7.4.2" description = "pytest: simple powerful testing with Python" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1578,6 +1638,7 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-custom-exit-code" version = "0.3.0" description = "Exit pytest test session with custom exit code in different scenarios" +category = "dev" optional = false python-versions = ">2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1592,6 +1653,7 @@ pytest = ">=4.0.2" name = "pytest-forked" version = "1.6.0" description = "run tests in isolated forked subprocesses" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1607,6 +1669,7 @@ pytest = ">=3.10" name = "pytest-test-groups" version = "1.0.3" description = "A Pytest plugin for running a subset of your tests by splitting them in to equally sized groups." +category = "dev" optional = false python-versions = "*" files = [ @@ -1620,6 +1683,7 @@ pytest = ">=2.5" name = "pytest-timeout" version = "2.1.0" description = "pytest plugin to abort hanging tests" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1634,6 +1698,7 @@ pytest = ">=5.0.0" name = "pytest-xdist" version = "2.5.0" description = "pytest xdist plugin for distributed testing and loop-on-failing modes" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1655,6 +1720,7 @@ testing = ["filelock"] name = "python-bitcoinlib" version = "0.11.2" description = "The Swiss Army Knife of the Bitcoin protocol." +category = "dev" optional = false python-versions = "*" files = [ @@ -1666,6 +1732,7 @@ files = [ name = "python-engineio" version = "4.7.1" description = "Engine.IO server and client for Python" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1685,6 +1752,7 @@ docs = ["sphinx"] name = "python-socketio" version = "5.9.0" description = "Socket.IO server and client for Python" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1705,6 +1773,7 @@ docs = ["sphinx"] name = "pytz" version = "2023.3.post1" description = "World timezone definitions, modern and historical" +category = "main" optional = false python-versions = "*" files = [ @@ -1716,6 +1785,7 @@ files = [ name = "referencing" version = "0.30.2" description = "JSON Referencing + Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1731,6 +1801,7 @@ rpds-py = ">=0.7.0" name = "rpds-py" version = "0.10.3" description = "Python bindings to Rust's persistent data structures (rpds)" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1837,6 +1908,7 @@ files = [ name = "setuptools" version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1853,6 +1925,7 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar name = "simple-websocket" version = "0.10.1" description = "Simple WebSocket server and client for Python" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1867,6 +1940,7 @@ wsproto = "*" name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1878,6 +1952,7 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1889,6 +1964,7 @@ files = [ name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1900,6 +1976,7 @@ files = [ name = "websocket-client" version = "1.6.3" description = "WebSocket client for Python with low level API options" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1914,13 +1991,14 @@ test = ["websockets"] [[package]] name = "werkzeug" -version = "2.3.7" +version = "3.0.0" description = "The comprehensive WSGI web application library." +category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-2.3.7-py3-none-any.whl", hash = "sha256:effc12dba7f3bd72e605ce49807bbe692bd729c3bb122a3b91747a6ae77df528"}, - {file = "werkzeug-2.3.7.tar.gz", hash = "sha256:2b8c0e447b4b9dbcc85dd97b6eeb4dcbaf6c8b6c3be0bd654e25553e0a2157d8"}, + {file = "werkzeug-3.0.0-py3-none-any.whl", hash = "sha256:cbb2600f7eabe51dbc0502f58be0b3e1b96b893b05695ea2b35b43d4de2d9962"}, + {file = "werkzeug-3.0.0.tar.gz", hash = "sha256:3ffff4dcc32db52ef3cc94dff3000a3c2846890f3a5a51800a27b909c5e770f0"}, ] [package.dependencies] @@ -1933,6 +2011,7 @@ watchdog = ["watchdog (>=2.3)"] name = "wsproto" version = "1.2.0" description = "WebSockets state-machine based protocol implementation" +category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -1947,6 +2026,7 @@ h11 = ">=0.9.0,<1" name = "zipp" version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1962,6 +2042,7 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p name = "zope-event" version = "5.0" description = "Very basic event publishing system" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1980,6 +2061,7 @@ test = ["zope.testrunner"] name = "zope-interface" version = "6.0" description = "Interfaces for Python" +category = "main" optional = false python-versions = ">=3.7" files = [ From 35aa3bc54677a15e1a5606f8ad1d8e9b1a8e0178 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Sun, 1 Oct 2023 13:49:58 +1030 Subject: [PATCH 02/28] contrib/pyln-grpc-proto/ regenerate. Signed-off-by: Rusty Russell --- contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py | 1 - contrib/pyln-grpc-proto/pyln/grpc/primitives_pb2.py | 1 - 2 files changed, 2 deletions(-) diff --git a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py index 6555787e456e..66b0187161b7 100644 --- a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py +++ b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py @@ -20,7 +20,6 @@ _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 diff --git a/contrib/pyln-grpc-proto/pyln/grpc/primitives_pb2.py b/contrib/pyln-grpc-proto/pyln/grpc/primitives_pb2.py index 067c8a155a5d..c1f8caeaa4e0 100644 --- a/contrib/pyln-grpc-proto/pyln/grpc/primitives_pb2.py +++ b/contrib/pyln-grpc-proto/pyln/grpc/primitives_pb2.py @@ -19,7 +19,6 @@ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'primitives_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None _globals['_CHANNELSIDE']._serialized_start=718 _globals['_CHANNELSIDE']._serialized_end=754 From 0f29c802078713c5a35a60124fde41f01cbc309c Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:39 +1030 Subject: [PATCH 03/28] pytest: fix flake in upfront warning. This is actually a real issue (l1 doesn't see the warning before l2 drops the connection), but it's unrelated to this PR, and will require another one to fix. Signed-off-by: Rusty Russell --- tests/test_closing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_closing.py b/tests/test_closing.py index cbeb19d35470..42d4f268e65d 100644 --- a/tests/test_closing.py +++ b/tests/test_closing.py @@ -3178,7 +3178,7 @@ def test_option_upfront_shutdown_script(node_factory, bitcoind, executor, chainp fut = executor.submit(l1.rpc.close, l2.info['id']) # l2 will send a warning when it dislikes shutdown script. - l1.daemon.wait_for_log(r'WARNING.*scriptpubkey .* is not as agreed upfront \(00143d43d226bcc27019ade52d7a3dc52a7ac1be28b8\)') + l2.daemon.wait_for_log(r'scriptpubkey .* is not as agreed upfront \(00143d43d226bcc27019ade52d7a3dc52a7ac1be28b8\)') # Close from l2's side and clear channel. l2.rpc.close(l1.info['id'], unilateraltimeout=1) @@ -3194,7 +3194,7 @@ def test_option_upfront_shutdown_script(node_factory, bitcoind, executor, chainp fut = executor.submit(l2.rpc.close, l1.info['id']) # l2 will send warning unilaterally when it dislikes shutdown script. - l1.daemon.wait_for_log(r'WARNING.*scriptpubkey .* is not as agreed upfront \(00143d43d226bcc27019ade52d7a3dc52a7ac1be28b8\)') + l2.daemon.wait_for_log(r'scriptpubkey .* is not as agreed upfront \(00143d43d226bcc27019ade52d7a3dc52a7ac1be28b8\)') l2.rpc.close(l1.info['id'], unilateraltimeout=1) fut.result(TIMEOUT) From e82fa353902354f9f38c9cb07a055c20b3fa1ace Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:48 +1030 Subject: [PATCH 04/28] patch remove-developer-test-annotations.patch --- tests/test_pay.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_pay.py b/tests/test_pay.py index c71cc9526706..59641087ae1b 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -5340,7 +5340,6 @@ def test_listsendpays_crash(node_factory): l1.rpc.listsendpays('lightning:' + inv) -@pytest.mark.developer("updates are delayed without --dev-fast-gossip") def test_pay_routehint_minhtlc(node_factory, bitcoind): # l1 -> l2 -> l3 private -> l4 l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True) From 0050dbc8a2665e5724a904df0acdf1f8edb4ba66 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:48 +1030 Subject: [PATCH 05/28] doc: fix listpeerchannels schema to allow CHANNELD_AWAITING_SPLICE in state. Signed-off-by: Rusty Russell --- doc/lightning-listpeerchannels.7.md | 6 +++--- doc/schemas/listpeerchannels.schema.json | 6 ++++-- tests/test_closing.py | 2 -- tests/test_gossip.py | 1 - 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/doc/lightning-listpeerchannels.7.md b/doc/lightning-listpeerchannels.7.md index 08fb9f62c7e5..1b5acb79861c 100644 --- a/doc/lightning-listpeerchannels.7.md +++ b/doc/lightning-listpeerchannels.7.md @@ -89,8 +89,8 @@ On success, an object containing **channels** is returned. It is an array of ob - **remote** (short\_channel\_id, optional): An alias assigned by the remote node to this channel, usable in routehints and invoices - **state\_changes** (array of objects, optional): Prior state changes: - **timestamp** (string): UTC timestamp of form YYYY-mm-ddTHH:MM:SS.%03dZ - - **old\_state** (string): Previous state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN") - - **new\_state** (string): New state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN") + - **old\_state** (string): Previous state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "CHANNELD\_AWAITING\_SPLICE") + - **new\_state** (string): New state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "CHANNELD\_AWAITING\_SPLICE") - **cause** (string): What caused the change (one of "unknown", "local", "user", "remote", "protocol", "onchain") - **message** (string): Human-readable explanation - **status** (array of strings, optional): @@ -196,4 +196,4 @@ Main web site: Lightning RFC site (BOLT \#9): -[comment]: # ( SHA256STAMP:359d0035f98350d2de5f539ce8d2c3d82ccf633d3cbee4ed992a71687a25770a) +[comment]: # ( SHA256STAMP:e0b7cb41d6117b353d4895e7da9ae2a492614dd6c006177f0f0825ca721df7f5) 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" }, diff --git a/tests/test_closing.py b/tests/test_closing.py index 42d4f268e65d..67f2412f0cd4 100644 --- a/tests/test_closing.py +++ b/tests/test_closing.py @@ -3319,7 +3319,6 @@ def test_segwit_shutdown_script(node_factory, bitcoind, executor): l1.rpc.fundchannel(l2.info['id'], 10**6) -@pytest.mark.developer("needs to set dev-disconnect") @pytest.mark.parametrize("anchors", [False, True]) def test_closing_higherfee(node_factory, bitcoind, executor, anchors): """We can ask for a *higher* fee than the last commit tx""" @@ -3863,7 +3862,6 @@ def test_closing_tx_valid(node_factory, bitcoind): assert bitcoind.rpc.getrawtransaction(close['txid']) == close['tx'] -@pytest.mark.developer("needs dev-no-reconnect") @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd does not provide feerates on regtest') def test_closing_minfee(node_factory, bitcoind): l1, l2 = node_factory.line_graph(2, opts={'feerates': None}) diff --git a/tests/test_gossip.py b/tests/test_gossip.py index bf992facf686..36cf2efff9be 100644 --- a/tests/test_gossip.py +++ b/tests/test_gossip.py @@ -2344,7 +2344,6 @@ def test_dump_own_gossip(node_factory): assert expect == [] -@pytest.mark.developer("needs --dev-gossip-time") @unittest.skipIf( TEST_NETWORK != 'regtest', "Channel announcement contains genesis hash, receiving node discards on mismatch" From 4bef9dfd090d43f597d30420f610447275f5f972 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:48 +1030 Subject: [PATCH 06/28] pytest: make test_splice_gossip more precise. Check the exact scids. Makes it simpler when failures occur. Signed-off-by: Rusty Russell --- tests/test_splicing.py | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/tests/test_splicing.py b/tests/test_splicing.py index d48e0287b3cc..345ce66110cf 100644 --- a/tests/test_splicing.py +++ b/tests/test_splicing.py @@ -3,7 +3,7 @@ import unittest import time from utils import ( - wait_for, TEST_NETWORK + wait_for, TEST_NETWORK, first_scid, only_one ) @@ -50,6 +50,7 @@ def test_splice_gossip(node_factory, bitcoind): l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) chan_id = l1.get_channel_id(l2) + pre_splice_scid = first_scid(l1, l2) # add extra sats to pay fee funds_result = l1.rpc.fundpsbt("109000sat", "slow", 166, excess_as_change=True) @@ -59,30 +60,42 @@ def test_splice_gossip(node_factory, bitcoind): result = l1.rpc.signpsbt(result['psbt']) result = l1.rpc.splice_signed(chan_id, result['signed_psbt']) - l2.daemon.wait_for_log(r'CHANNELD_NORMAL to CHANNELD_AWAITING_SPLICE') - l1.daemon.wait_for_log(r'CHANNELD_NORMAL to CHANNELD_AWAITING_SPLICE') + wait_for(lambda: only_one(l2.rpc.listpeerchannels(l1.info['id'])['channels'])['state'] == 'CHANNELD_AWAITING_SPLICE') + wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['state'] == 'CHANNELD_AWAITING_SPLICE') - mempool = bitcoind.rpc.getrawmempool(True) - assert len(list(mempool.keys())) == 1 - assert result['txid'] in list(mempool.keys()) + bitcoind.generate_block(6, wait_for_mempool=result['txid']) - bitcoind.generate_block(6, wait_for_mempool=1) + # l3 will see channel dying, but still consider it OK for 12 blocks. + l3.daemon.wait_for_log(f'gossipd: channel {pre_splice_scid} closing soon due to the funding outpoint being spent') + assert len(l3.rpc.listchannels(short_channel_id=pre_splice_scid)['channels']) == 2 + assert len(l3.rpc.listchannels(source=l1.info['id'])['channels']) == 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') + wait_for(lambda: only_one(l2.rpc.listpeerchannels(l1.info['id'])['channels'])['state'] == 'CHANNELD_NORMAL') + wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['state'] == 'CHANNELD_NORMAL') - # l3 should see the old channel and new channel at the same time here - wait_for(lambda: len(l3.rpc.listchannels()['channels']) == 6) + post_splice_scid = first_scid(l1, l2) + assert post_splice_scid != pre_splice_scid + + # l3 should see the new channel now. + wait_for(lambda: l3.rpc.listchannels(short_channel_id=post_splice_scid)['channels'] != []) + assert len(l3.rpc.listchannels(short_channel_id=pre_splice_scid)['channels']) == 2 bitcoind.generate_block(7) # The old channel should fall off l3's perspective - wait_for(lambda: len(l3.rpc.listchannels()['channels']) == 4) + wait_for(lambda: l3.rpc.listchannels(short_channel_id=pre_splice_scid)['channels'] == []) + assert len(l3.rpc.listchannels(short_channel_id=post_splice_scid)['channels']) == 2 # Check that the splice doesn't generate a unilateral close transaction time.sleep(5) assert l1.db_query("SELECT count(*) as c FROM channeltxs;")[0]['c'] == 0 + # Still looks normal from both sides + assert only_one(l1.rpc.listpeerchannels()['channels'])['short_channel_id'] == post_splice_scid + assert only_one(l1.rpc.listpeerchannels()['channels'])['state'] == 'CHANNELD_NORMAL' + assert only_one(l2.rpc.listpeerchannels(l1.info['id'])['channels'])['short_channel_id'] == post_splice_scid + assert only_one(l2.rpc.listpeerchannels(l1.info['id'])['channels'])['state'] == 'CHANNELD_NORMAL' + # Check for channel announcement failure assert not l1.daemon.is_in_log("invalid local_channel_announcement") assert not l2.daemon.is_in_log("invalid local_channel_announcement") From bb8c49f16c99c538ea9ee80dc991200c650558ba Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:48 +1030 Subject: [PATCH 07/28] lightningd: disconnect on *any* transient error, except abort Not just if htlc addition is too slow, make this the default. dual-open's txabort is excluded, however. Signed-off-by: Rusty Russell --- lightningd/channel.c | 14 +++++++++++--- lightningd/channel.h | 5 +++-- lightningd/channel_control.c | 2 +- lightningd/dual_open_control.c | 9 +++++---- lightningd/peer_control.c | 10 +++++----- lightningd/peer_htlcs.c | 11 +---------- lightningd/test/run-invoice-select-inchan.c | 1 + 7 files changed, 27 insertions(+), 25 deletions(-) diff --git a/lightningd/channel.c b/lightningd/channel.c index 89e788151ace..7bf1f6f3b6fe 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -1036,7 +1036,7 @@ void channel_set_billboard(struct channel *channel, bool perm, const char *str) } } -static void channel_err(struct channel *channel, const char *why) +static void channel_err(struct channel *channel, bool disconnect, const char *why) { /* Nothing to do if channel isn't actually owned! */ if (!channel->owner) @@ -1053,14 +1053,22 @@ static void channel_err(struct channel *channel, const char *why) } channel_set_owner(channel, NULL); + + /* Force a disconnect in case the issue is with TCP */ + if (disconnect && 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))); + } } -void channel_fail_transient(struct channel *channel, const char *fmt, ...) +void channel_fail_transient(struct channel *channel, bool disconnect, const char *fmt, ...) { va_list ap; va_start(ap, fmt); - channel_err(channel, tal_vfmt(tmpctx, fmt, ap)); + channel_err(channel, disconnect, tal_vfmt(tmpctx, fmt, ap)); va_end(ap); } diff --git a/lightningd/channel.h b/lightningd/channel.h index 33ad7d9ef38b..1b1352e9ea02 100644 --- a/lightningd/channel.h +++ b/lightningd/channel.h @@ -413,9 +413,10 @@ bool channel_state_closish(enum channel_state channel_state); void channel_set_owner(struct channel *channel, struct subd *owner); -/* Channel has failed, but can try again. */ +/* Channel has failed, but can try again. Usually, set disconnect to true. */ void channel_fail_transient(struct channel *channel, - const char *fmt, ...) PRINTF_FMT(2,3); + bool disconnect, + const char *fmt, ...) PRINTF_FMT(3, 4); /* Channel has failed, give up on it. */ void channel_fail_permanent(struct channel *channel, diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index 36c5cda5a6ec..3f14f92217ba 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -922,7 +922,7 @@ static void peer_got_shutdown(struct channel *channel, const u8 *msg) &channel->peer->id, channel->peer->connectd_counter, warning))); - channel_fail_transient(channel, "Bad shutdown scriptpubkey %s", + channel_fail_transient(channel, true, "Bad shutdown scriptpubkey %s", tal_hex(tmpctx, scriptpubkey)); return; } diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 1d7fe1e958e0..066f31e40bd1 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -48,7 +48,7 @@ static void channel_disconnect(struct channel *channel, log_(channel->log, level, NULL, false, "%s", desc); channel_cleanup_commands(channel, desc); - channel_fail_transient(channel, "%s: %s", + channel_fail_transient(channel, true, "%s: %s", channel->owner ? channel->owner->name : "dualopend-dead", @@ -1415,7 +1415,7 @@ static void handle_peer_wants_to_close(struct subd *dualopend, &channel->peer->id, channel->peer->connectd_counter, warning))); - channel_fail_transient(channel, "Bad shutdown scriptpubkey %s", + channel_fail_transient(channel, true, "Bad shutdown scriptpubkey %s", tal_hex(tmpctx, scriptpubkey)); return; } @@ -3607,7 +3607,7 @@ static void dualopen_errmsg(struct channel *channel, /* No peer_fd means a subd crash or disconnection. */ if (!peer_fd) { /* If the channel is unsaved, we forget it */ - channel_fail_transient(channel, "%s: %s", + channel_fail_transient(channel, true, "%s: %s", channel->owner->name, desc); return; } @@ -3621,7 +3621,8 @@ static void dualopen_errmsg(struct channel *channel, * and we would close the channel on them. We now support warnings * for this case. */ if (warning || aborted) { - channel_fail_transient(channel, "%s %s: %s", + /* We *don't* hang up if they aborted: that's fine! */ + channel_fail_transient(channel, !aborted, "%s %s: %s", channel->owner->name, warning ? "WARNING" : "ABORTED", desc); diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 8a0e7f1f0b56..255601f89384 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -178,7 +178,7 @@ static void peer_channels_cleanup(struct lightningd *ld, c = channels[i]; if (channel_active(c)) { channel_cleanup_commands(c, "Disconnected"); - channel_fail_transient(c, "Disconnected"); + channel_fail_transient(c, true, "Disconnected"); } else if (channel_unsaved(c)) { channel_unsaved_close_conn(c, "Disconnected"); } @@ -391,7 +391,7 @@ void channel_errmsg(struct channel *channel, /* No peer_fd means a subd crash or disconnection. */ if (!peer_fd) { /* If the channel is unsaved, we forget it */ - channel_fail_transient(channel, "%s: %s", + channel_fail_transient(channel, true, "%s: %s", channel->owner->name, desc); return; } @@ -405,7 +405,7 @@ void channel_errmsg(struct channel *channel, * would recover after a reconnect. So we downgrade, but snark * about it in the logs. */ if (!err_for_them && strends(desc, "internal error")) { - channel_fail_transient(channel, "%s: %s", + channel_fail_transient(channel, true, "%s: %s", channel->owner->name, "lnd sent 'internal error':" " let's give it some space"); @@ -414,7 +414,7 @@ void channel_errmsg(struct channel *channel, /* This is us, sending a warning. */ if (warning) { - channel_fail_transient(channel, "%s sent %s", + channel_fail_transient(channel, true, "%s sent %s", channel->owner->name, desc); return; @@ -1922,7 +1922,7 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, warning))); /* When we restart channeld, it will be initialized with updated scid * and also adds it (at least our halve_chan) to rtable. */ - channel_fail_transient(channel, + channel_fail_transient(channel, true, "short_channel_id changed to %s (was %s)", short_channel_id_to_str(tmpctx, &scid), short_channel_id_to_str(tmpctx, channel->scid)); diff --git a/lightningd/peer_htlcs.c b/lightningd/peer_htlcs.c index 8f30b29203ca..2575b6c5d48f 100644 --- a/lightningd/peer_htlcs.c +++ b/lightningd/peer_htlcs.c @@ -590,17 +590,8 @@ static void htlc_offer_timeout(struct htlc_out *out) log_unusual(channel->owner->log, "Adding HTLC %"PRIu64" too slow: killing connection", out->key.id); - tal_free(channel->owner); - channel_set_billboard(channel, false, + channel_fail_transient(channel, true, "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/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 462adaecc341..a378d6667483 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -80,6 +80,7 @@ void channel_fail_permanent(struct channel *channel UNNEEDED, { fprintf(stderr, "channel_fail_permanent called!\n"); abort(); } /* Generated stub for channel_fail_transient */ void channel_fail_transient(struct channel *channel UNNEEDED, + bool disconnect UNNEEDED, const char *fmt UNNEEDED, ...) { fprintf(stderr, "channel_fail_transient called!\n"); abort(); } /* Generated stub for channel_has_htlc_in */ From 4162cd91e678963d042a64c5a3175b374f56ea16 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:49 +1030 Subject: [PATCH 08/28] lightningd: clean up channel_tell_depth. It's a mess right now. Try to express it as a switch() statement over the states we can be in. Signed-off-by: Rusty Russell --- lightningd/channel_control.c | 178 ++++++++++++++++++++--------------- 1 file changed, 103 insertions(+), 75 deletions(-) diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index 3f14f92217ba..e92560e68c04 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -1515,14 +1515,63 @@ bool peer_start_channeld(struct channel *channel, return true; } +static bool channel_splice_set_scid(struct channel *channel, + const struct bitcoin_txid *txid) +{ + struct txlocator *loc; + u32 outnum; + + if (!get_inflight_outpoint_index(channel, txid, &outnum)) { + log_debug(channel->log, "Can't locate splice inflight" + " txid %s", + type_to_string(tmpctx, struct bitcoin_txid, txid)); + return false; + } + + loc = wallet_transaction_locate(tmpctx, channel->peer->ld->wallet, txid); + if (!loc) { + channel_fail_permanent(channel, + REASON_LOCAL, + "Can't locate splice transaction" + " in wallet txid %s", + type_to_string(tmpctx, struct bitcoin_txid, txid)); + return false; + } + + if (!mk_short_channel_id(channel->scid, + loc->blkheight, loc->index, + outnum)) { + channel_fail_permanent(channel, + REASON_LOCAL, + "Invalid splice scid %u:%u:%u", + loc->blkheight, loc->index, + channel->funding.n); + return false; + } + return true; +} + +/* Actually send the depth message to channeld */ +static void channeld_tell_depth(struct channel *channel, + const struct bitcoin_txid *txid, + u32 depth) +{ + log_debug(channel->log, + "Sending towire_channeld_funding_depth with channel state %s", + channel_state_str(channel->state)); + + subd_send_msg(channel->owner, + take(towire_channeld_funding_depth( + NULL, channel->scid, channel->alias[LOCAL], depth, + channel->state == CHANNELD_AWAITING_SPLICE, txid))); +} + bool channel_tell_depth(struct lightningd *ld, struct channel *channel, const struct bitcoin_txid *txid, u32 depth) { const char *txidstr; - struct txlocator *loc; - u32 outnum; txidstr = type_to_string(tmpctx, struct bitcoin_txid, txid); channel->depth = depth; @@ -1534,94 +1583,73 @@ bool channel_tell_depth(struct lightningd *ld, return false; } - if (channel->state == CHANNELD_AWAITING_SPLICE - && depth >= channel->minimum_depth) { - if (!get_inflight_outpoint_index(channel, txid, &outnum)) { - log_debug(channel->log, "Can't locate splice inflight" - " txid %s", txidstr); - return false; - } - - loc = wallet_transaction_locate(tmpctx, ld->wallet, txid); - if (!loc) { - channel_fail_permanent(channel, - REASON_LOCAL, - "Can't locate splice transaction" - " in wallet txid %s", txidstr); - return false; - } - - if (!mk_short_channel_id(channel->scid, - loc->blkheight, loc->index, - outnum)) { - channel_fail_permanent(channel, - REASON_LOCAL, - "Invalid splice scid %u:%u:%u", - loc->blkheight, loc->index, - channel->funding.n); - return false; - } - } - - if (streq(channel->owner->name, "dualopend")) { - if (channel->state != DUALOPEND_AWAITING_LOCKIN) { - log_debug(channel->log, - "Funding tx %s confirmed, but peer in" - " state %s", - txidstr, channel_state_name(channel)); - return true; + switch (channel->state) { + case CHANNELD_AWAITING_SPLICE: + if (depth >= channel->minimum_depth) { + if (!channel_splice_set_scid(channel, txid)) + return false; } + channeld_tell_depth(channel, txid, depth); + /* We're done, don't track depth any more. */ + return true; + case DUALOPEND_AWAITING_LOCKIN: log_debug(channel->log, "Funding tx %s confirmed, telling peer", txidstr); dualopen_tell_depth(channel->owner, channel, txid, depth); + /* We're done, don't track depth any more. */ return true; - } else if (channel->state != CHANNELD_AWAITING_LOCKIN - && !channel_state_normalish(channel)) { - /* If not awaiting lockin/announce, it doesn't - * care any more */ - log_debug(channel->log, - "Funding tx %s confirmed, but peer in state %s", - txidstr, channel_state_name(channel)); - return true; - } - - log_debug(channel->log, - "Sending towire_channeld_funding_depth with channel state %s", - channel_state_str(channel->state)); - subd_send_msg(channel->owner, - take(towire_channeld_funding_depth( - NULL, channel->scid, channel->alias[LOCAL], depth, - channel->state == CHANNELD_AWAITING_SPLICE, txid))); + case CHANNELD_AWAITING_LOCKIN: + channeld_tell_depth(channel, txid, depth); + if (channel->remote_channel_ready + && depth >= channel->minimum_depth) { + lockin_complete(channel, CHANNELD_AWAITING_LOCKIN); + return true; + } + return false; - if (channel->remote_channel_ready && - channel->state == CHANNELD_AWAITING_LOCKIN && - depth >= channel->minimum_depth) { - lockin_complete(channel, CHANNELD_AWAITING_LOCKIN); - } else if (depth == 1 && channel->minimum_depth == 0) { + case CHANNELD_NORMAL: /* If we have a zeroconf channel, i.e., no scid yet * but have exchange `channel_ready` messages, then we * need to fire a second time, in order to trigger the * `coin_movement` event. This is a subset of the - * `lockin_complete` function below. */ - - assert(channel->scid != NULL); - /* Fees might have changed (and we use IMMEDIATE once we're - * funded), so update now. */ - try_update_feerates(channel->peer->ld, channel); - - try_update_blockheight( - channel->peer->ld, channel, - get_block_height(channel->peer->ld->topology)); + * `lockin_complete` function above. */ + if (depth == 1 && channel->minimum_depth == 0) { + assert(channel->scid != NULL); + /* Fees might have changed (and we use IMMEDIATE once we're + * funded), so update now. */ + try_update_feerates(channel->peer->ld, channel); + + try_update_blockheight( + channel->peer->ld, channel, + get_block_height(channel->peer->ld->topology)); + + /* Emit channel_open event */ + channel_record_open(channel, + short_channel_id_blocknum(channel->scid), + false); + } + /* Still might want to know, for announcement reasons */ + channeld_tell_depth(channel, txid, depth); + return false; - /* Emit channel_open event */ - channel_record_open(channel, - short_channel_id_blocknum(channel->scid), - false); + case AWAITING_UNILATERAL: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_SIGEXCHANGE: + case CLOSINGD_COMPLETE: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + case DUALOPEND_OPEN_INIT: + /* If not awaiting lockin/announce, it doesn't care any more */ + log_debug(channel->log, + "Funding tx %s confirmed, but peer in state %s", + txidstr, channel_state_name(channel)); + return true; } - return true; + abort(); } /* Check if we are the fundee of this channel, the channel From 00fabc547387c8c72e140819361e50ed0f64fc3c Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:49 +1030 Subject: [PATCH 09/28] lightningd: don't report original depth once splice started. This is a workaround, the real fix is to use a different callback for inflight splice attempts, which comes later. Signed-off-by: Rusty Russell --- lightningd/channel_control.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index e92560e68c04..751f45af7e27 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -1585,6 +1585,9 @@ bool channel_tell_depth(struct lightningd *ld, switch (channel->state) { case CHANNELD_AWAITING_SPLICE: + /* Once we're waiting for splice, don't watch original any more */ + if (bitcoin_txid_eq(txid, &channel->funding.txid)) + return true; if (depth >= channel->minimum_depth) { if (!channel_splice_set_scid(channel, txid)) return false; From 441e61c0efd95725c53496eb2d695880e1ac6181 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:49 +1030 Subject: [PATCH 10/28] lightningd: make dualopen_tell_depth match channeld_tell_depth. Rename slightly, remove first arg, and make it a noop of there's no owner on channel. Signed-off-by: Rusty Russell --- lightningd/channel_control.c | 2 +- lightningd/dual_open_control.c | 21 ++++++++++++++------- lightningd/dual_open_control.h | 7 +++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index 751f45af7e27..24f0d972c142 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -1599,7 +1599,7 @@ bool channel_tell_depth(struct lightningd *ld, case DUALOPEND_AWAITING_LOCKIN: log_debug(channel->log, "Funding tx %s confirmed, telling peer", txidstr); - dualopen_tell_depth(channel->owner, channel, + dualopend_tell_depth(channel, txid, depth); /* We're done, don't track depth any more. */ return true; diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 066f31e40bd1..2cdd5598bf39 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -1824,16 +1824,23 @@ static void handle_channel_locked(struct subd *dualopend, return; } - - -void dualopen_tell_depth(struct subd *dualopend, - struct channel *channel, - const struct bitcoin_txid *txid, - u32 depth) +void dualopend_tell_depth(struct channel *channel, + const struct bitcoin_txid *txid, + u32 depth) { const u8 *msg; u32 to_go; + if (!channel->owner) { + log_debug(channel->log, + "Funding tx %s confirmed, but peer disconnected", + type_to_string(tmpctx, struct bitcoin_txid, txid)); + return; + } + + log_debug(channel->log, + "Funding tx %s confirmed, telling peer", + type_to_string(tmpctx, struct bitcoin_txid, txid)); if (depth < channel->minimum_depth) { to_go = channel->minimum_depth - depth; } else @@ -1851,7 +1858,7 @@ void dualopen_tell_depth(struct subd *dualopend, to_go)); msg = towire_dualopend_depth_reached(NULL, depth); - subd_send_msg(dualopend, take(msg)); + subd_send_msg(channel->owner, take(msg)); } else channel_set_billboard(channel, false, tal_fmt(tmpctx, "Funding needs %d more" diff --git a/lightningd/dual_open_control.h b/lightningd/dual_open_control.h index e3e0e92677fd..8bacce793094 100644 --- a/lightningd/dual_open_control.h +++ b/lightningd/dual_open_control.h @@ -14,10 +14,9 @@ bool peer_restart_dualopend(struct peer *peer, struct channel *channel, bool from_abort); -void dualopen_tell_depth(struct subd *dualopend, - struct channel *channel, - const struct bitcoin_txid *txid, - u32 depth); +void dualopend_tell_depth(struct channel *channel, + const struct bitcoin_txid *txid, + u32 depth); /* Close connection to an unsaved channel */ void channel_unsaved_close_conn(struct channel *channel, const char *why); From d32177d8ce29f58df143ac92c5224a892f84467c Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:49 +1030 Subject: [PATCH 11/28] lightningd: fold funding tx depth into a single function. Currently it's half done in funding_depth_cb, and half in channeld_tell_depth. It's very confusing as a result, with splicing, dual-funding and zeroconf. This does introduce a behaviour change: if a channel is NORMAL and it gets reorganized, we force close (unless we were the one who funded it, or it's zeroconf anyway). This is safer than continuing to use the channel in this case! Some tests are changed to zeroconf to make them work, but v2 doesn't support zeroconf, so that's removed. Signed-off-by: Rusty Russell --- lightningd/channel_control.c | 185 +++----------- lightningd/channel_control.h | 18 +- lightningd/peer_control.c | 258 +++++++++++++------- lightningd/test/run-invoice-select-inchan.c | 23 +- tests/test_misc.py | 30 ++- wallet/test/run-wallet.c | 23 +- 6 files changed, 274 insertions(+), 263 deletions(-) diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index 24f0d972c142..3369a1b95aeb 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -721,8 +721,25 @@ void channel_record_open(struct channel *channel, u32 blockheight, bool record_p channel->opener == REMOTE)); } -static void lockin_complete(struct channel *channel, - enum channel_state expected_state) +void lockin_has_completed(struct channel *channel, bool record_push) +{ + /* Fees might have changed (and we use IMMEDIATE once we're funded), + * so update now. */ + try_update_feerates(channel->peer->ld, channel); + + try_update_blockheight(channel->peer->ld, channel, + get_block_height(channel->peer->ld->topology)); + + /* Emit an event for the channel open (or channel proposal if blockheight + * is zero) */ + channel_record_open(channel, + channel->scid ? + short_channel_id_blocknum(channel->scid) : 0, + record_push); +} + +void lockin_complete(struct channel *channel, + enum channel_state expected_state) { if (!channel->scid && (!channel->alias[REMOTE] || !channel->alias[LOCAL])) { @@ -751,19 +768,7 @@ static void lockin_complete(struct channel *channel, REASON_UNKNOWN, "Lockin complete"); - /* Fees might have changed (and we use IMMEDIATE once we're funded), - * so update now. */ - try_update_feerates(channel->peer->ld, channel); - - try_update_blockheight(channel->peer->ld, channel, - get_block_height(channel->peer->ld->topology)); - - /* Emit an event for the channel open (or channel proposal if blockheight - * is zero) */ - channel_record_open(channel, - channel->scid ? - short_channel_id_blocknum(channel->scid) : 0, - true); + lockin_has_completed(channel, true); } bool channel_on_channel_ready(struct channel *channel, @@ -1113,22 +1118,6 @@ static void handle_channel_upgrade(struct channel *channel, wallet_channel_save(channel->peer->ld->wallet, channel); } -static bool get_inflight_outpoint_index(struct channel *channel, - const struct bitcoin_txid *txid, - u32 *index) -{ - struct channel_inflight *inflight; - - list_for_each(&channel->inflights, inflight, list) { - if (bitcoin_txid_eq(txid, &inflight->funding->outpoint.txid)) { - *index = inflight->funding->outpoint.n; - return true; - } - } - - return false; -} - static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds) { enum channeld_wire t = fromwire_peektype(msg); @@ -1515,47 +1504,18 @@ bool peer_start_channeld(struct channel *channel, return true; } -static bool channel_splice_set_scid(struct channel *channel, - const struct bitcoin_txid *txid) +/* Actually send the depth message to channeld */ +void channeld_tell_depth(struct channel *channel, + const struct bitcoin_txid *txid, + u32 depth) { - struct txlocator *loc; - u32 outnum; - - if (!get_inflight_outpoint_index(channel, txid, &outnum)) { - log_debug(channel->log, "Can't locate splice inflight" - " txid %s", + if (!channel->owner) { + log_debug(channel->log, + "Funding tx %s confirmed, but peer disconnected", type_to_string(tmpctx, struct bitcoin_txid, txid)); - return false; - } - - loc = wallet_transaction_locate(tmpctx, channel->peer->ld->wallet, txid); - if (!loc) { - channel_fail_permanent(channel, - REASON_LOCAL, - "Can't locate splice transaction" - " in wallet txid %s", - type_to_string(tmpctx, struct bitcoin_txid, txid)); - return false; - } - - if (!mk_short_channel_id(channel->scid, - loc->blkheight, loc->index, - outnum)) { - channel_fail_permanent(channel, - REASON_LOCAL, - "Invalid splice scid %u:%u:%u", - loc->blkheight, loc->index, - channel->funding.n); - return false; + return; } - return true; -} -/* Actually send the depth message to channeld */ -static void channeld_tell_depth(struct channel *channel, - const struct bitcoin_txid *txid, - u32 depth) -{ log_debug(channel->log, "Sending towire_channeld_funding_depth with channel state %s", channel_state_str(channel->state)); @@ -1566,95 +1526,6 @@ static void channeld_tell_depth(struct channel *channel, channel->state == CHANNELD_AWAITING_SPLICE, txid))); } -bool channel_tell_depth(struct lightningd *ld, - struct channel *channel, - const struct bitcoin_txid *txid, - u32 depth) -{ - const char *txidstr; - - txidstr = type_to_string(tmpctx, struct bitcoin_txid, txid); - channel->depth = depth; - - if (!channel->owner) { - log_debug(channel->log, - "Funding tx %s confirmed, but peer disconnected", - txidstr); - return false; - } - - switch (channel->state) { - case CHANNELD_AWAITING_SPLICE: - /* Once we're waiting for splice, don't watch original any more */ - if (bitcoin_txid_eq(txid, &channel->funding.txid)) - return true; - if (depth >= channel->minimum_depth) { - if (!channel_splice_set_scid(channel, txid)) - return false; - } - channeld_tell_depth(channel, txid, depth); - /* We're done, don't track depth any more. */ - return true; - - case DUALOPEND_AWAITING_LOCKIN: - log_debug(channel->log, - "Funding tx %s confirmed, telling peer", txidstr); - dualopend_tell_depth(channel, - txid, depth); - /* We're done, don't track depth any more. */ - return true; - - case CHANNELD_AWAITING_LOCKIN: - channeld_tell_depth(channel, txid, depth); - if (channel->remote_channel_ready - && depth >= channel->minimum_depth) { - lockin_complete(channel, CHANNELD_AWAITING_LOCKIN); - return true; - } - return false; - - case CHANNELD_NORMAL: - /* If we have a zeroconf channel, i.e., no scid yet - * but have exchange `channel_ready` messages, then we - * need to fire a second time, in order to trigger the - * `coin_movement` event. This is a subset of the - * `lockin_complete` function above. */ - if (depth == 1 && channel->minimum_depth == 0) { - assert(channel->scid != NULL); - /* Fees might have changed (and we use IMMEDIATE once we're - * funded), so update now. */ - try_update_feerates(channel->peer->ld, channel); - - try_update_blockheight( - channel->peer->ld, channel, - get_block_height(channel->peer->ld->topology)); - - /* Emit channel_open event */ - channel_record_open(channel, - short_channel_id_blocknum(channel->scid), - false); - } - /* Still might want to know, for announcement reasons */ - channeld_tell_depth(channel, txid, depth); - return false; - - case AWAITING_UNILATERAL: - case CHANNELD_SHUTTING_DOWN: - case CLOSINGD_SIGEXCHANGE: - case CLOSINGD_COMPLETE: - case FUNDING_SPEND_SEEN: - case ONCHAIN: - case CLOSED: - case DUALOPEND_OPEN_INIT: - /* If not awaiting lockin/announce, it doesn't care any more */ - log_debug(channel->log, - "Funding tx %s confirmed, but peer in state %s", - txidstr, channel_state_name(channel)); - return true; - } - abort(); -} - /* Check if we are the fundee of this channel, the channel * funding transaction is still not yet seen onchain, and * it has been too long since the channel was first opened. diff --git a/lightningd/channel_control.h b/lightningd/channel_control.h index 857ac2ec155f..1bdba25589d6 100644 --- a/lightningd/channel_control.h +++ b/lightningd/channel_control.h @@ -16,11 +16,12 @@ bool peer_start_channeld(struct channel *channel, bool reconnected, bool reestablish_only); -/* Returns true if subd told, otherwise false. */ -bool channel_tell_depth(struct lightningd *ld, - struct channel *channel, - const struct bitcoin_txid *txid, - u32 depth); +/* Send message to channeld (if connected) to tell it about depth + * c.f. dualopen_tell_depth! */ +void channeld_tell_depth(struct channel *channel, + const struct bitcoin_txid *txid, + u32 depth); + /* Notify channels of new blocks. */ void channel_notify_new_block(struct lightningd *ld, u32 block_height); @@ -45,4 +46,11 @@ void channel_replace_update(struct channel *channel, u8 *update TAKES); /* Tell channel about new feerates (owner must be channeld!) */ void channel_update_feerates(struct lightningd *ld, const struct channel *channel); + +/* This channel is now locked in (the normal way, not zeroconf) */ +void lockin_complete(struct channel *channel, + enum channel_state expected_state); + +/* Accessor for zeroconf to tell us we've actually got an scid */ +void lockin_has_completed(struct channel *channel, bool record_push); #endif /* LIGHTNING_LIGHTNINGD_CHANNEL_CONTROL_H */ diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 255601f89384..981b69ecd0bd 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1829,18 +1829,50 @@ void update_channel_from_inflight(struct lightningd *ld, wallet_channel_save(ld->wallet, channel); } +static void subd_tell_depth(struct channel *channel, + const struct bitcoin_txid *txid, + unsigned int depth) +{ + /* We always tell every owner who's interested about the depth */ + switch (channel->state) { + case AWAITING_UNILATERAL: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_SIGEXCHANGE: + case CLOSINGD_COMPLETE: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + case DUALOPEND_OPEN_INIT: + return; + + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_LOCKIN: + case CHANNELD_AWAITING_SPLICE: + channeld_tell_depth(channel, txid, depth); + return; + + case DUALOPEND_AWAITING_LOCKIN: + dualopend_tell_depth(channel, txid, depth); + return; + } + abort(); +} + static enum watch_result funding_depth_cb(struct lightningd *ld, struct channel *channel, const struct bitcoin_txid *txid, const struct bitcoin_tx *tx, unsigned int depth) { - const char *txidstr; struct short_channel_id scid; + struct txlocator *loc; + + /* This is stub channel, we don't activate anything! */ + if (is_stub_scid(channel->scid)) + return DELETE_WATCH; - /* Sanity check, but we'll have to make an exception - * for stub channels(1x1x1) */ - if (!check_funding_tx(tx, channel) && !is_stub_scid(channel->scid)) { + /* Sanity check */ + if (!check_funding_tx(tx, channel)) { channel_internal_error(channel, "Bad tx %s: %s", type_to_string(tmpctx, struct bitcoin_txid, txid), @@ -1849,102 +1881,162 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, return DELETE_WATCH; } - txidstr = type_to_string(tmpctx, struct bitcoin_txid, txid); + channel->depth = depth; + log_debug(channel->log, "Funding tx %s depth %u of %u", - txidstr, depth, channel->minimum_depth); - tal_free(txidstr); + type_to_string(tmpctx, struct bitcoin_txid, txid), + depth, channel->minimum_depth); + + /* Reorged out? */ + if (depth == 0) { + /* That's not entirely unexpected in early states */ + switch (channel->state) { + case CHANNELD_AWAITING_SPLICE: + case DUALOPEND_AWAITING_LOCKIN: + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + log_debug(channel->log, "Funding tx %s reorganized out!", + type_to_string(tmpctx, struct bitcoin_txid, txid)); + channel->scid = tal_free(channel->scid); + return KEEP_WATCHING; - bool min_depth_reached = depth >= channel->minimum_depth; - bool min_depth_no_scid = min_depth_reached && !channel->scid; - bool some_depth_has_scid = depth != 0 && channel->scid; + /* But it's often Bad News in later states */ + case CHANNELD_NORMAL: + /* If we opened, or it's zero-conf, we trust them anyway. */ + if (channel->opener == LOCAL + || channel->minimum_depth == 0) { + const char *str; + + str = tal_fmt(tmpctx, + "Funding tx %s reorganized out, but %s...", + type_to_string(tmpctx, struct bitcoin_txid, txid), + channel->opener == LOCAL ? "we opened it" : "zeroconf anyway"); + + /* Log even if not connected! */ + if (!channel->owner) + log_info(channel->log, "%s", str); + channel_fail_transient(channel, true, "%s", str); + return KEEP_WATCHING; + } + /* fall thru */ + case AWAITING_UNILATERAL: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_SIGEXCHANGE: + case CLOSINGD_COMPLETE: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + break; + } + channel_internal_error(channel, + "Funding transaction has been reorged out in state %s!", + channel_state_name(channel)); + return KEEP_WATCHING; + } - /* Reorg can change scid, so always update/save scid when possible (depth=0 - * means the stale block with our funding tx was removed) */ - if (min_depth_no_scid || some_depth_has_scid) { - struct txlocator *loc; - struct channel_inflight *inf; + /* What scid is this giving us? */ + loc = wallet_transaction_locate(tmpctx, ld->wallet, txid); + if (!mk_short_channel_id(&scid, + loc->blkheight, loc->index, + channel->funding.n)) { + channel_fail_permanent(channel, + REASON_LOCAL, + "Invalid funding scid %u:%u:%u", + loc->blkheight, loc->index, + channel->funding.n); + return DELETE_WATCH; + } + if (!channel->scid) { + wallet_annotate_txout(ld->wallet, &channel->funding, + TX_CHANNEL_FUNDING, channel->dbid); + channel->scid = tal_dup(channel, struct short_channel_id, &scid); + + /* If we have a zeroconf channel, i.e., no scid yet + * but have exchange `channel_ready` messages, then we + * need to fire a second time, in order to trigger the + * `coin_movement` event. This is a subset of the + * `lockin_complete` function called from + * AWAITING_LOCKIN->NORMAL otherwise. */ + if (channel->minimum_depth == 0) + lockin_has_completed(channel, false); + + wallet_channel_save(ld->wallet, channel); + } else if (!short_channel_id_eq(channel->scid, &scid)) { + /* We freaked out if required when original was + * removed, so just update now */ + log_info(channel->log, "Short channel id changed from %s->%s", + type_to_string(tmpctx, struct short_channel_id, channel->scid), + type_to_string(tmpctx, struct short_channel_id, &scid)); + *channel->scid = scid; + wallet_channel_save(ld->wallet, channel); + } + + /* Always tell owner about depth change */ + subd_tell_depth(channel, txid, depth); + + /* Have we not reached minimum depth? */ + if (depth < channel->minimum_depth) + return KEEP_WATCHING; + + switch (channel->state) { + case AWAITING_UNILATERAL: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_SIGEXCHANGE: + case CLOSINGD_COMPLETE: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + /* If not awaiting lockin/announce, it doesn't care any more */ + log_debug(channel->log, + "Funding tx %s confirmed, but peer in state %s", + type_to_string(tmpctx, struct bitcoin_txid, txid), + channel_state_name(channel)); + return DELETE_WATCH; + + case CHANNELD_AWAITING_LOCKIN: + if (channel->remote_channel_ready) + lockin_complete(channel, CHANNELD_AWAITING_LOCKIN); + return KEEP_WATCHING; + + case CHANNELD_NORMAL: + if (depth < ANNOUNCE_MIN_DEPTH) + return KEEP_WATCHING; + /* Normal state and past announce depth? Stop bothering us! */ + return DELETE_WATCH; + + case DUALOPEND_OPEN_INIT: + /* You cannot be watching yet */ + abort(); + + case DUALOPEND_AWAITING_LOCKIN: /* Update the channel's info to the correct tx, if needed to * It's possible an 'inflight' has reached depth */ - if (channel->state != CHANNELD_AWAITING_SPLICE - && !list_empty(&channel->inflights)) { + if (!list_empty(&channel->inflights)) { + struct channel_inflight *inf; + inf = channel_inflight_find(channel, txid); if (!inf) { log_debug(channel->log, - "Ignoring event for txid %s for channel" - " not found in inflights. (peer %s)", - type_to_string(tmpctx, - struct bitcoin_txid, - txid), - type_to_string(tmpctx, - struct node_id, - &channel->peer->id)); + "Ignoring event for txid %s for channel" + " not found in inflights.", + type_to_string(tmpctx, + struct bitcoin_txid, + txid)); return DELETE_WATCH; } update_channel_from_inflight(ld, channel, inf); } - - wallet_annotate_txout(ld->wallet, &channel->funding, - TX_CHANNEL_FUNDING, channel->dbid); - loc = wallet_transaction_locate(tmpctx, ld->wallet, txid); - if (!mk_short_channel_id(&scid, - loc->blkheight, loc->index, - channel->funding.n)) { - channel_fail_permanent(channel, - REASON_LOCAL, - "Invalid funding scid %u:%u:%u", - loc->blkheight, loc->index, - channel->funding.n); - return DELETE_WATCH; - } - - /* If we restart, we could already have peer->scid from database, - * we don't need to update scid for stub channels(1x1x1) */ - if (!channel->scid || channel->state == CHANNELD_AWAITING_SPLICE) { - if(!channel->scid) - channel->scid = tal(channel, struct short_channel_id); - *channel->scid = scid; - wallet_channel_save(ld->wallet, channel); - - } else if (!short_channel_id_eq(channel->scid, &scid) && - !is_stub_scid(channel->scid)) { - /* Send warning: that will make connectd disconnect, and then we'll - * try to reconnect. */ - u8 *warning = towire_warningfmt(tmpctx, &channel->cid, - "short_channel_id changed to %s (was %s)", - short_channel_id_to_str(tmpctx, &scid), - short_channel_id_to_str(tmpctx, channel->scid)); - if (channel->peer->connected != PEER_DISCONNECTED) - subd_send_msg(ld->connectd, - take(towire_connectd_peer_final_msg(NULL, - &channel->peer->id, - channel->peer->connectd_counter, - warning))); - /* When we restart channeld, it will be initialized with updated scid - * and also adds it (at least our halve_chan) to rtable. */ - channel_fail_transient(channel, true, - "short_channel_id changed to %s (was %s)", - short_channel_id_to_str(tmpctx, &scid), - short_channel_id_to_str(tmpctx, channel->scid)); - - *channel->scid = scid; - wallet_channel_save(ld->wallet, channel); - return KEEP_WATCHING; - } - } - - /* Try to tell subdaemon */ - if (!channel_tell_depth(ld, channel, txid, depth)) - return KEEP_WATCHING; - - if (!min_depth_reached) return KEEP_WATCHING; - /* We keep telling it depth/scid until we get to announce depth. */ - if (depth < ANNOUNCE_MIN_DEPTH) + case CHANNELD_AWAITING_SPLICE: + /* Once we're waiting for splice, don't watch original any more */ + if (bitcoin_txid_eq(txid, &channel->funding.txid)) + return true; return KEEP_WATCHING; + } - return DELETE_WATCH; + abort(); } static enum watch_result funding_spent(struct channel *channel, diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index a378d6667483..ad5f97662422 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -110,12 +110,6 @@ const char *channel_state_name(const struct channel *channel UNNEEDED) /* Generated stub for channel_state_str */ const char *channel_state_str(enum channel_state state UNNEEDED) { fprintf(stderr, "channel_state_str called!\n"); abort(); } -/* Generated stub for channel_tell_depth */ -bool channel_tell_depth(struct lightningd *ld UNNEEDED, - struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED, - u32 depth UNNEEDED) -{ fprintf(stderr, "channel_tell_depth called!\n"); abort(); } /* Generated stub for channel_type_has */ bool channel_type_has(const struct channel_type *type UNNEEDED, int feature UNNEEDED) { fprintf(stderr, "channel_type_has called!\n"); abort(); } @@ -133,6 +127,11 @@ void channel_update_reserve(struct channel *channel UNNEEDED, struct channel_config *their_config UNNEEDED, struct amount_sat funding_total UNNEEDED) { fprintf(stderr, "channel_update_reserve called!\n"); abort(); } +/* Generated stub for channeld_tell_depth */ +void channeld_tell_depth(struct channel *channel UNNEEDED, + const struct bitcoin_txid *txid UNNEEDED, + u32 depth UNNEEDED) +{ fprintf(stderr, "channeld_tell_depth called!\n"); abort(); } /* Generated stub for cmd_id_from_close_command */ const char *cmd_id_from_close_command(const tal_t *ctx UNNEEDED, struct lightningd *ld UNNEEDED, struct channel *channel UNNEEDED) @@ -202,6 +201,11 @@ void delete_channel(struct channel *channel STEALS UNNEEDED) /* Generated stub for dev_disconnect_permanent */ bool dev_disconnect_permanent(struct lightningd *ld UNNEEDED) { fprintf(stderr, "dev_disconnect_permanent called!\n"); abort(); } +/* Generated stub for dualopend_tell_depth */ +void dualopend_tell_depth(struct channel *channel UNNEEDED, + const struct bitcoin_txid *txid UNNEEDED, + u32 depth UNNEEDED) +{ fprintf(stderr, "dualopend_tell_depth called!\n"); abort(); } /* Generated stub for encode_scriptpubkey_to_addr */ char *encode_scriptpubkey_to_addr(const tal_t *ctx UNNEEDED, const struct chainparams *chainparams UNNEEDED, @@ -646,6 +650,13 @@ struct jsonrpc_request *jsonrpc_request_start_( void kill_uncommitted_channel(struct uncommitted_channel *uc UNNEEDED, const char *why UNNEEDED) { fprintf(stderr, "kill_uncommitted_channel called!\n"); abort(); } +/* Generated stub for lockin_complete */ +void lockin_complete(struct channel *channel UNNEEDED, + enum channel_state expected_state UNNEEDED) +{ fprintf(stderr, "lockin_complete called!\n"); abort(); } +/* Generated stub for lockin_has_completed */ +void lockin_has_completed(struct channel *channel UNNEEDED, bool record_push UNNEEDED) +{ fprintf(stderr, "lockin_has_completed called!\n"); abort(); } /* Generated stub for log_ */ void log_(struct logger *logger UNNEEDED, enum log_level level UNNEEDED, const struct node_id *node_id UNNEEDED, diff --git a/tests/test_misc.py b/tests/test_misc.py index f9de934a7132..aa758372c07c 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -1241,7 +1241,6 @@ def chan_active(node, scid, is_active): return [c['active'] for c in chans] == [is_active, is_active] -@pytest.mark.openchannel('v2') @pytest.mark.openchannel('v1') def test_funding_reorg_private(node_factory, bitcoind): """Change funding tx height after lockin, between node restart. @@ -1253,7 +1252,10 @@ def test_funding_reorg_private(node_factory, bitcoind): # gossipd send lightning update for original channel. 'allow_broken_log': True, 'allow_warning': True, - 'dev-fast-reconnect': None} + 'dev-fast-reconnect': None, + # if it's not zeroconf, we'll terminate on reorg. + 'plugin': os.path.join(os.getcwd(), 'tests/plugins/zeroconf-selective.py'), + 'zeroconf-allow': 'any'} l1, l2 = node_factory.line_graph(2, fundchannel=False, opts=opts) l1.fundwallet(10000000) sync_blockheight(bitcoind, [l1]) # height 102 @@ -1264,7 +1266,7 @@ def test_funding_reorg_private(node_factory, bitcoind): daemon = 'DUALOPEND' if l1.config('experimental-dual-fund') else 'CHANNELD' wait_for(lambda: only_one(l1.rpc.listpeerchannels()['channels'])['status'] - == ['{}_AWAITING_LOCKIN:Funding needs 1 more confirmations to be ready.'.format(daemon)]) + == ["{}_AWAITING_LOCKIN:They've confirmed channel ready, we haven't yet.".format(daemon)]) bitcoind.generate_block(1) # height 107 l1.wait_channel_active('106x1x0') l2.wait_channel_active('106x1x0') @@ -1290,13 +1292,15 @@ def test_funding_reorg_private(node_factory, bitcoind): @pytest.mark.openchannel('v1') -@pytest.mark.openchannel('v2') def test_funding_reorg_remote_lags(node_factory, bitcoind): """Nodes may disagree about short_channel_id before channel announcement """ # may_reconnect so channeld will restart; bad gossip can happen due to reorg opts = {'funding-confirms': 1, 'may_reconnect': True, 'allow_bad_gossip': True, - 'allow_warning': True, 'dev-fast-reconnect': None} + 'allow_warning': True, 'dev-fast-reconnect': None, + # if it's not zeroconf, l2 will terminate on reorg. + 'plugin': os.path.join(os.getcwd(), 'tests/plugins/zeroconf-selective.py'), + 'zeroconf-allow': 'any'} l1, l2 = node_factory.line_graph(2, fundchannel=False, opts=opts) l1.fundwallet(10000000) sync_blockheight(bitcoind, [l1]) # height 102 @@ -1317,7 +1321,7 @@ def no_more_blocks(req): bitcoind.simple_reorg(103, 1) # heights 103 - 108 # But now it's height 104, we need another block to make it announceable. bitcoind.generate_block(1) - l1.daemon.wait_for_log(r'Peer transient failure .* short_channel_id changed to 104x1x0 \(was 103x1x0\)') + l1.daemon.wait_for_log(r'Short channel id changed from 103x1x0->104x1x0') l2.daemon.wait_for_logs([r'Peer transient failure in CHANNELD_NORMAL: channeld sent Bad node_signature*']) @@ -1337,6 +1341,20 @@ def no_more_blocks(req): l2.daemon.wait_for_log(r'Deleting channel') +@pytest.mark.openchannel('v1') +@pytest.mark.openchannel('v2') +def test_funding_reorg_get_upset(node_factory, bitcoind): + l1, l2 = node_factory.line_graph(2, opts=[{}, {'allow_broken_log': True}]) + bitcoind.simple_reorg(103, 1) + + # l1 is ok, as funder. + l1.daemon.wait_for_log('Funding tx .* reorganized out, but we opened it...') + assert only_one(l1.rpc.listpeerchannels()['channels'])['state'] == 'CHANNELD_NORMAL' + # l2 is upset! + l2.daemon.wait_for_log('Funding transaction has been reorged out in state CHANNELD_NORMAL') + assert only_one(l2.rpc.listpeerchannels()['channels'])['state'] == 'AWAITING_UNILATERAL' + + @unittest.skipIf(os.getenv('TEST_DB_PROVIDER', 'sqlite3') != 'sqlite3', "deletes database, which is assumed sqlite3") def test_recover(node_factory, bitcoind): """Test the recover option diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index 2b951ee84908..5064621e5b10 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -72,12 +72,6 @@ void broadcast_tx_(struct chain_topology *topo UNNEEDED, bool (*refresh)(struct channel * UNNEEDED, const struct bitcoin_tx ** UNNEEDED, void *) UNNEEDED, void *cbarg TAKES UNNEEDED) { fprintf(stderr, "broadcast_tx_ called!\n"); abort(); } -/* Generated stub for channel_tell_depth */ -bool channel_tell_depth(struct lightningd *ld UNNEEDED, - struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED, - u32 depth UNNEEDED) -{ fprintf(stderr, "channel_tell_depth called!\n"); abort(); } /* Generated stub for channel_unsaved_close_conn */ void channel_unsaved_close_conn(struct channel *channel UNNEEDED, const char *why UNNEEDED) { fprintf(stderr, "channel_unsaved_close_conn called!\n"); abort(); } @@ -89,6 +83,11 @@ void channel_update_reserve(struct channel *channel UNNEEDED, struct channel_config *their_config UNNEEDED, struct amount_sat funding_total UNNEEDED) { fprintf(stderr, "channel_update_reserve called!\n"); abort(); } +/* Generated stub for channeld_tell_depth */ +void channeld_tell_depth(struct channel *channel UNNEEDED, + const struct bitcoin_txid *txid UNNEEDED, + u32 depth UNNEEDED) +{ fprintf(stderr, "channeld_tell_depth called!\n"); abort(); } /* Generated stub for cmd_id_from_close_command */ const char *cmd_id_from_close_command(const tal_t *ctx UNNEEDED, struct lightningd *ld UNNEEDED, struct channel *channel UNNEEDED) @@ -147,6 +146,11 @@ void derive_channel_id(struct channel_id *channel_id UNNEEDED, /* Generated stub for dev_disconnect_permanent */ bool dev_disconnect_permanent(struct lightningd *ld UNNEEDED) { fprintf(stderr, "dev_disconnect_permanent called!\n"); abort(); } +/* Generated stub for dualopend_tell_depth */ +void dualopend_tell_depth(struct channel *channel UNNEEDED, + const struct bitcoin_txid *txid UNNEEDED, + u32 depth UNNEEDED) +{ fprintf(stderr, "dualopend_tell_depth called!\n"); abort(); } /* Generated stub for ecdh */ void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED) { fprintf(stderr, "ecdh called!\n"); abort(); } @@ -434,6 +438,13 @@ bool json_tok_streq(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, void kill_uncommitted_channel(struct uncommitted_channel *uc UNNEEDED, const char *why UNNEEDED) { fprintf(stderr, "kill_uncommitted_channel called!\n"); abort(); } +/* Generated stub for lockin_complete */ +void lockin_complete(struct channel *channel UNNEEDED, + enum channel_state expected_state UNNEEDED) +{ fprintf(stderr, "lockin_complete called!\n"); abort(); } +/* Generated stub for lockin_has_completed */ +void lockin_has_completed(struct channel *channel UNNEEDED, bool record_push UNNEEDED) +{ fprintf(stderr, "lockin_has_completed called!\n"); abort(); } /* Generated stub for logv */ void logv(struct logger *logger UNNEEDED, enum log_level level UNNEEDED, const struct node_id *node_id UNNEEDED, bool call_notifier UNNEEDED, const char *fmt UNNEEDED, va_list ap UNNEEDED) From 2b2caa5aad8aada95098ab1cb40717b94a7f70e3 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:49 +1030 Subject: [PATCH 12/28] lightningd: generalize peer_any_active_channel to peer_any_channel. Take an optional filter function, so callers can say exactly what they want. Signed-off-by: Rusty Russell --- lightningd/channel.c | 6 +- lightningd/channel.h | 31 ++- lightningd/channel_control.c | 4 +- lightningd/closing_control.c | 29 ++- lightningd/connect_control.c | 2 +- lightningd/dual_open_control.c | 2 +- lightningd/opening_control.c | 2 +- lightningd/peer_control.c | 199 ++++++++++---------- lightningd/peer_control.h | 3 +- lightningd/test/run-invoice-select-inchan.c | 8 +- 10 files changed, 172 insertions(+), 114 deletions(-) diff --git a/lightningd/channel.c b/lightningd/channel.c index 7bf1f6f3b6fe..70b1bbe58ae5 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -606,12 +606,14 @@ bool channel_state_closish(enum channel_state channel_state) return channel_state > CHANNELD_NORMAL && channel_state <= CLOSED; } -struct channel *peer_any_active_channel(struct peer *peer, bool *others) +struct channel *peer_any_channel(struct peer *peer, + bool (*channel_state_filter)(const struct channel *), + bool *others) { struct channel *channel, *ret = NULL; list_for_each(&peer->channels, channel, list) { - if (!channel_active(channel)) + if (channel_state_filter && !channel_state_filter(channel)) continue; /* Already found one? */ if (ret) { diff --git a/lightningd/channel.h b/lightningd/channel.h index 1b1352e9ea02..82aca50cfa61 100644 --- a/lightningd/channel.h +++ b/lightningd/channel.h @@ -440,9 +440,11 @@ void channel_set_state(struct channel *channel, const char *channel_change_state_reason_str(enum state_change reason); -/* Find a channel which is not onchain, if any: sets *others if there +/* Find a channel which is passes filter, if any: sets *others if there * is more than one. */ -struct channel *peer_any_active_channel(struct peer *peer, bool *others); +struct channel *peer_any_channel(struct peer *peer, + bool (*channel_state_filter)(const struct channel *), + bool *others); /* Find a channel which is not yet saved to disk */ struct channel *peer_any_unsaved_channel(struct peer *peer, bool *others); @@ -532,6 +534,31 @@ static inline bool channel_closed(const struct channel *channel) || channel->state == CLOSED; } +/* Established enough, that we could reach out to peer to discuss */ +static inline bool channel_wants_peercomms(const struct channel *channel) +{ + if (channel_unsaved(channel)) + return false; + + switch (channel->state) { + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CLOSINGD_SIGEXCHANGE: + case CHANNELD_SHUTTING_DOWN: + return true; + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + return false; + } + abort(); +} + static inline bool channel_has(const struct channel *channel, int f) { return channel_type_has(channel->type, f); diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index 3369a1b95aeb..adb13bbd0206 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -2013,7 +2013,7 @@ static struct command_result *json_dev_feerate(struct command *cmd, if (!peer) return command_fail(cmd, LIGHTNINGD, "Peer not connected"); - channel = peer_any_active_channel(peer, &more_than_one); + channel = peer_any_channel(peer, NULL, &more_than_one); if (!channel || !channel->owner || !channel_state_normalish(channel)) return command_fail(cmd, LIGHTNINGD, "Peer bad state"); /* This is a dev command: fix the api if you need this! */ @@ -2074,7 +2074,7 @@ static struct command_result *json_dev_quiesce(struct command *cmd, return command_fail(cmd, LIGHTNINGD, "Peer not connected"); /* FIXME: If this becomes a real API, check for OPT_QUIESCE! */ - channel = peer_any_active_channel(peer, &more_than_one); + channel = peer_any_channel(peer, NULL, &more_than_one); if (!channel || !channel->owner || !channel_state_normalish(channel)) return command_fail(cmd, LIGHTNINGD, "Peer bad state"); /* This is a dev command: fix the api if you need this! */ diff --git a/lightningd/closing_control.c b/lightningd/closing_control.c index 797a2e48b00a..24abb4cb9acb 100644 --- a/lightningd/closing_control.c +++ b/lightningd/closing_control.c @@ -562,6 +562,27 @@ struct some_channel { struct uncommitted_channel *uc; }; +static bool channel_state_can_close(const struct channel *channel) +{ + switch (channel->state) { + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + case CLOSINGD_SIGEXCHANGE: + case CHANNELD_SHUTTING_DOWN: + return true; + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + return false; + } + abort(); +} + static struct command_result *param_channel_or_peer(struct command *cmd, const char *name, const char *buffer, @@ -575,7 +596,7 @@ static struct command_result *param_channel_or_peer(struct command *cmd, (*sc)->uc = NULL; if (peer) { - (*sc)->channel = peer_any_active_channel(peer, &more_than_one); + (*sc)->channel = peer_any_channel(peer, channel_state_can_close, &more_than_one); if ((*sc)->channel) { if (more_than_one) goto more_than_one; @@ -583,10 +604,14 @@ static struct command_result *param_channel_or_peer(struct command *cmd, } } else { struct command_result *res; - res = command_find_channel(cmd, buffer, tok, &(*sc)->channel); + res = command_find_channel(cmd, name, buffer, tok, &(*sc)->channel); if (res) return res; assert((*sc)->channel); + if (!channel_state_can_close((*sc)->channel)) + return command_fail_badparam(cmd, name, buffer, tok, + tal_fmt(tmpctx, "Channel in state %s", + channel_state_name((*sc)->channel))); return NULL; } diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index bb89f2f5cd00..daf0f93923ac 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -425,7 +425,7 @@ static void connect_failed(struct lightningd *ld, /* If we have an active channel, then reconnect. */ peer = peer_by_id(ld, id); - if (peer && peer_any_active_channel(peer, NULL)) { + if (peer && peer_any_channel(peer, channel_wants_peercomms, NULL)) { try_reconnect(peer, peer, addrhint); } else log_peer_debug(ld->log, id, "Not reconnecting: %s", diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 2cdd5598bf39..e30f5b7e7152 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -1220,7 +1220,7 @@ wallet_commit_channel(struct lightningd *ld, { struct amount_msat our_msat, lease_fee_msat; struct channel_inflight *inflight; - bool any_active = peer_any_active_channel(channel->peer, NULL); + bool any_active = peer_any_channel(channel->peer, channel_wants_peercomms, NULL); if (!amount_sat_to_msat(&our_msat, our_funding)) { log_broken(channel->log, "Unable to convert funds"); diff --git a/lightningd/opening_control.c b/lightningd/opening_control.c index 991737eaaa91..05903e96a1ad 100644 --- a/lightningd/opening_control.c +++ b/lightningd/opening_control.c @@ -112,7 +112,7 @@ wallet_commit_channel(struct lightningd *ld, u32 lease_start_blockheight = 0; /* No leases on v1 */ struct short_channel_id *alias_local; struct timeabs timestamp; - bool any_active = peer_any_active_channel(uc->peer, NULL); + bool any_active = peer_any_channel(uc->peer, channel_wants_peercomms, NULL); /* We cannot both be the fundee *and* have a `fundchannel_start` * command running! diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 981b69ecd0bd..9fb05cf1f665 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -2319,6 +2319,7 @@ AUTODATA(json_command, &listpeerchannels_command); struct command_result * command_find_channel(struct command *cmd, + const char *name, const char *buffer, const jsmntok_t *tok, struct channel **channel) { @@ -2340,25 +2341,16 @@ command_find_channel(struct command *cmd, return NULL; } } - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "Channel ID not found: '%.*s'", - tok->end - tok->start, - buffer + tok->start); + return command_fail_badparam(cmd, name, buffer, tok, + "Channel id not found"); } else if (json_to_short_channel_id(buffer, tok, &scid)) { *channel = any_channel_by_scid(ld, &scid, true); if (!*channel) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "Short channel ID not found: '%.*s'", - tok->end - tok->start, - buffer + tok->start); - if (!channel_active(*channel)) - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "Short channel ID not active: '%.*s'", - tok->end - tok->start, - buffer + tok->start); + return command_fail_badparam(cmd, name, buffer, tok, + "Short channel id not found"); return NULL; } else { - return command_fail_badparam(cmd, "id", buffer, tok, + return command_fail_badparam(cmd, name, buffer, tok, "should be a channel ID or short channel ID"); } } @@ -2468,32 +2460,47 @@ struct htlc_in_map *load_channels_from_wallet(struct lightningd *ld) return unconnected_htlcs_in; } +static struct command_result *param_peer(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + struct peer **peer) +{ + struct node_id peerid; + + if (!json_to_node_id(buffer, tok, &peerid)) + return command_fail_badparam(cmd, name, buffer, tok, + "invalid peer id"); + *peer = peer_by_id(cmd->ld, &peerid); + if (!*peer) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Unknown peer '%.*s'", + tok->end - tok->start, + buffer + tok->start); + return NULL; +} + static struct command_result *json_disconnect(struct command *cmd, const char *buffer, const jsmntok_t *obj UNNEEDED, const jsmntok_t *params) { - struct node_id *id; struct disconnect_command *dc; struct peer *peer; struct channel *channel; bool *force; if (!param(cmd, buffer, params, - p_req("id", param_node_id, &id), + p_req("id", param_peer, &peer), p_opt_def("force", param_bool, &force, false), NULL)) return command_param_failed(); - peer = peer_by_id(cmd->ld, id); - if (!peer) { - return command_fail(cmd, LIGHTNINGD, "Unknown peer"); - } if (peer->connected == PEER_DISCONNECTED) { return command_fail(cmd, LIGHTNINGD, "Peer not connected"); } - channel = peer_any_active_channel(peer, NULL); + channel = peer_any_channel(peer, channel_wants_peercomms, NULL); if (channel && !*force) { return command_fail(cmd, LIGHTNINGD, "Peer has (at least one) channel in state %s", @@ -2507,7 +2514,7 @@ static struct command_result *json_disconnect(struct command *cmd, /* Connectd tells us when it's finally disconnected */ dc = tal(cmd, struct disconnect_command); dc->cmd = cmd; - dc->id = *id; + dc->id = peer->id; list_add_tail(&cmd->ld->disconnect_commands, &dc->list); tal_add_destructor(dc, destroy_disconnect_command); @@ -2753,6 +2760,27 @@ static const struct json_command waitblockheight_command = { }; AUTODATA(json_command, &waitblockheight_command); +static bool channel_state_can_setchannel(enum channel_state state) +{ + switch (state) { + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_AWAITING_LOCKIN: + return true; + case DUALOPEND_OPEN_INIT: + case CLOSINGD_SIGEXCHANGE: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + return false; + } + abort(); +} + static struct command_result *param_channel_or_all(struct command *cmd, const char *name, const char *buffer, @@ -2761,45 +2789,40 @@ static struct command_result *param_channel_or_all(struct command *cmd, { struct command_result *res; struct peer *peer; + struct channel *channel; + + *channels = tal_arr(cmd, struct channel *, 0); /* early return the easy case */ if (json_tok_streq(buffer, tok, "all")) { - *channels = NULL; + *channels = tal_free(*channels); return NULL; } /* Find channels by peer_id */ peer = peer_from_json(cmd->ld, buffer, tok); if (peer) { - struct channel *channel; - *channels = tal_arr(cmd, struct channel *, 0); list_for_each(&peer->channels, channel, list) { - if (channel->state != CHANNELD_NORMAL - && channel->state != CHANNELD_AWAITING_SPLICE - && channel->state != CHANNELD_AWAITING_LOCKIN - && channel->state != DUALOPEND_AWAITING_LOCKIN) - continue; - - tal_arr_expand(channels, channel); + if (channel_state_can_setchannel(channel->state)) + tal_arr_expand(channels, channel); } if (tal_count(*channels) == 0) return command_fail(cmd, LIGHTNINGD, "Could not find any active channels of peer with that id"); return NULL; - /* Find channel by id or scid */ - } else { - struct channel *channel; - res = command_find_channel(cmd, buffer, tok, &channel); - if (res) - return res; - /* check channel is found and in valid state */ - if (!channel) - return command_fail(cmd, LIGHTNINGD, - "Could not find channel with that id"); - *channels = tal_arr(cmd, struct channel *, 1); - (*channels)[0] = channel; - return NULL; } + + /* Find channel by id or scid */ + res = command_find_channel(cmd, name, buffer, tok, &channel); + if (res) + return res; + /* check channel is found and in valid state */ + if (!channel_state_can_setchannel(channel->state)) + return command_fail_badparam(cmd, name, buffer, tok, + tal_fmt(tmpctx, "Channel in state %s", + channel_state_name(channel))); + tal_arr_expand(channels, channel); + return NULL; } /* Fee base is a u32, but it's convenient to let them specify it using @@ -3006,34 +3029,47 @@ static const struct json_command setchannel_command = { }; AUTODATA(json_command, &setchannel_command); +/* dev hack, don't use for real interfaces, which have to handle channel ids, or multiple channels */ +static struct command_result *param_dev_channel(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + struct channel **channel) +{ + struct peer *peer; + struct command_result *res; + bool more_than_one; + + res = param_peer(cmd, name, buffer, tok, &peer); + if (res) + return res; + + *channel = peer_any_channel(peer, channel_wants_peercomms, &more_than_one); + if (!*channel) + return command_fail_badparam(cmd, name, buffer, tok, + "No channel with that peer"); + + if (more_than_one) + return command_fail_badparam(cmd, name, buffer, tok, + "More than one channel with that peer"); + + return NULL; +} + static struct command_result *json_sign_last_tx(struct command *cmd, const char *buffer, const jsmntok_t *obj UNNEEDED, const jsmntok_t *params) { - struct node_id *peerid; - struct peer *peer; struct json_stream *response; struct channel *channel; struct bitcoin_tx *tx; - bool more_than_one; if (!param(cmd, buffer, params, - p_req("id", param_node_id, &peerid), + p_req("id", param_dev_channel, &channel), NULL)) return command_param_failed(); - peer = peer_by_id(cmd->ld, peerid); - if (!peer) { - return command_fail(cmd, LIGHTNINGD, - "Could not find peer with that id"); - } - channel = peer_any_active_channel(peer, &more_than_one); - if (!channel || more_than_one) { - return command_fail(cmd, LIGHTNINGD, - "Could not find single active channel"); - } - response = json_stream_success(cmd); log_debug(channel->log, "dev-sign-last-tx: signing tx with %zu outputs", channel->last_tx->wtx->num_outputs); @@ -3075,28 +3111,13 @@ static struct command_result *json_dev_fail(struct command *cmd, const jsmntok_t *obj UNNEEDED, const jsmntok_t *params) { - struct node_id *peerid; - struct peer *peer; struct channel *channel; - bool more_than_one; if (!param(cmd, buffer, params, - p_req("id", param_node_id, &peerid), + p_req("id", param_dev_channel, &channel), NULL)) return command_param_failed(); - peer = peer_by_id(cmd->ld, peerid); - if (!peer) { - return command_fail(cmd, LIGHTNINGD, - "Could not find peer with that id"); - } - - channel = peer_any_active_channel(peer, &more_than_one); - if (!channel || more_than_one) { - return command_fail(cmd, LIGHTNINGD, - "Could not find single active channel with peer"); - } - channel_fail_permanent(channel, REASON_USER, "Failing due to dev-fail command"); @@ -3125,28 +3146,14 @@ static struct command_result *json_dev_reenable_commit(struct command *cmd, const jsmntok_t *obj UNNEEDED, const jsmntok_t *params) { - struct node_id *peerid; - struct peer *peer; u8 *msg; struct channel *channel; - bool more_than_one; if (!param(cmd, buffer, params, - p_req("id", param_node_id, &peerid), + p_req("id", param_dev_channel, &channel), NULL)) return command_param_failed(); - peer = peer_by_id(cmd->ld, peerid); - if (!peer) { - return command_fail(cmd, LIGHTNINGD, - "Could not find peer with that id"); - } - - channel = peer_any_active_channel(peer, &more_than_one); - if (!channel || more_than_one) { - return command_fail(cmd, LIGHTNINGD, - "Peer has no active channel"); - } if (!channel->owner) { return command_fail(cmd, LIGHTNINGD, "Peer has no owner"); @@ -3158,7 +3165,7 @@ static struct command_result *json_dev_reenable_commit(struct command *cmd, } msg = towire_channeld_dev_reenable_commit(channel); - subd_req(peer, channel->owner, take(msg), -1, 0, + subd_req(channel, channel->owner, take(msg), -1, 0, dev_reenable_commit_finished, cmd); return command_still_pending(cmd); } @@ -3215,7 +3222,6 @@ static struct command_result *json_dev_forget_channel(struct command *cmd, const jsmntok_t *obj UNNEEDED, const jsmntok_t *params) { - struct node_id *peerid; struct peer *peer; struct channel *channel; struct short_channel_id *scid; @@ -3225,7 +3231,7 @@ static struct command_result *json_dev_forget_channel(struct command *cmd, bool *force; if (!param(cmd, buffer, params, - p_req("id", param_node_id, &peerid), + p_req("id", param_peer, &peer), p_opt("short_channel_id", param_short_channel_id, &scid), p_opt("channel_id", param_channel_id, &find_cid), p_opt_def("force", param_bool, &force, false), @@ -3233,11 +3239,6 @@ static struct command_result *json_dev_forget_channel(struct command *cmd, return command_param_failed(); forget->force = *force; - peer = peer_by_id(cmd->ld, peerid); - if (!peer) { - return command_fail(cmd, LIGHTNINGD, - "Could not find channel with that peer"); - } forget->channel = NULL; list_for_each(&peer->channels, channel, list) { diff --git a/lightningd/peer_control.h b/lightningd/peer_control.h index ec9c527cec80..e92a20a75419 100644 --- a/lightningd/peer_control.h +++ b/lightningd/peer_control.h @@ -140,9 +140,10 @@ void waitblockheight_notify_new_block(struct lightningd *ld, u32 block_height); -/* JSON parameter by channel_id or scid */ +/* JSON parameter by channel_id or scid (caller must check state!) */ struct command_result * command_find_channel(struct command *cmd, + const char *name, const char *buffer, const jsmntok_t *tok, struct channel **channel); diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index ad5f97662422..8454ec9afd92 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -813,9 +813,11 @@ struct command_result *param_u64(struct command *cmd UNNEEDED, const char *name const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, uint64_t **num UNNEEDED) { fprintf(stderr, "param_u64 called!\n"); abort(); } -/* Generated stub for peer_any_active_channel */ -struct channel *peer_any_active_channel(struct peer *peer UNNEEDED, bool *others UNNEEDED) -{ fprintf(stderr, "peer_any_active_channel called!\n"); abort(); } +/* Generated stub for peer_any_channel */ +struct channel *peer_any_channel(struct peer *peer UNNEEDED, + bool (*channel_state_filter)(const struct channel *) UNNEEDED, + bool *others UNNEEDED) +{ fprintf(stderr, "peer_any_channel called!\n"); abort(); } /* Generated stub for peer_restart_dualopend */ bool peer_restart_dualopend(struct peer *peer UNNEEDED, struct peer_fd *peer_fd UNNEEDED, From f55c20707c2ac6c44993a41590a6e23d4332937d Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:49 +1030 Subject: [PATCH 13/28] lightningd/channel.h: clean up channel states. We should use capability tests for states (can you add htlcs?) rather than vague descriptions (are you closing?). And as much as possible, use switch () statements to force us to think about all the cases, especially when we add new states! Signed-off-by: Rusty Russell --- lightningd/channel.c | 21 +-- lightningd/channel.h | 285 +++++++++++++++++++++++++---------- lightningd/channel_control.c | 19 +-- lightningd/closing_control.c | 10 +- lightningd/coin_mvts.c | 21 ++- lightningd/connect_control.c | 2 +- lightningd/peer_control.c | 56 +++++-- lightningd/peer_htlcs.c | 14 +- lightningd/routehint.c | 3 +- 9 files changed, 288 insertions(+), 143 deletions(-) diff --git a/lightningd/channel.c b/lightningd/channel.c index 70b1bbe58ae5..4c40541421d5 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -589,23 +589,6 @@ const char *channel_state_str(enum channel_state state) return "unknown"; } -bool channel_state_normalish(const struct channel *channel) -{ - return channel->state == CHANNELD_NORMAL - || channel->state == CHANNELD_AWAITING_SPLICE; -} - -bool channel_state_awaitish(const struct channel *channel) -{ - return channel->state == CHANNELD_AWAITING_LOCKIN - || channel->state == CHANNELD_AWAITING_SPLICE; -} - -bool channel_state_closish(enum channel_state channel_state) -{ - return channel_state > CHANNELD_NORMAL && channel_state <= CLOSED; -} - struct channel *peer_any_channel(struct peer *peer, bool (*channel_state_filter)(const struct channel *), bool *others) @@ -821,7 +804,7 @@ void channel_set_state(struct channel *channel, struct timeabs timestamp; /* set closer, if known */ - if (channel_state_closish(state) && channel->closer == NUM_SIDES) { + if (channel_state_closing(state) && channel->closer == NUM_SIDES) { if (reason == REASON_LOCAL) channel->closer = LOCAL; if (reason == REASON_USER) channel->closer = LOCAL; if (reason == REASON_REMOTE) channel->closer = REMOTE; @@ -910,7 +893,7 @@ void channel_fail_permanent(struct channel *channel, /* Drop non-cooperatively (unilateral) to chain. */ drop_to_chain(ld, channel, false); - if (channel_active(channel)) + if (channel_wants_onchain_fail(channel)) channel_set_state(channel, channel->state, AWAITING_UNILATERAL, diff --git a/lightningd/channel.h b/lightningd/channel.h index 82aca50cfa61..10a7212f032d 100644 --- a/lightningd/channel.h +++ b/lightningd/channel.h @@ -402,14 +402,210 @@ void delete_channel(struct channel *channel STEALS); const char *channel_state_name(const struct channel *channel); const char *channel_state_str(enum channel_state state); -/* Is the channel in NORMAL or AWAITING_SPLICE state? */ -bool channel_state_normalish(const struct channel *channel); +/* Can this channel send an HTLC? */ +static inline bool channel_can_add_htlc(const struct channel *channel) +{ + switch (channel->state) { + case CHANNELD_AWAITING_LOCKIN: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_SIGEXCHANGE: + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + return false; + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + return true; + } + abort(); +} + +/* Can this channel remove an HTLC? */ +static inline bool channel_can_remove_htlc(const struct channel *channel) +{ + switch (channel->state) { + case CHANNELD_AWAITING_LOCKIN: + case CLOSINGD_SIGEXCHANGE: + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + return false; + case CHANNELD_SHUTTING_DOWN: + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + return true; + } + abort(); +} + +static inline bool channel_state_closing(enum channel_state state) +{ + switch (state) { + case CHANNELD_AWAITING_LOCKIN: + case CHANNELD_NORMAL: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + case CHANNELD_AWAITING_SPLICE: + return false; + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_SIGEXCHANGE: + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + return true; + } + abort(); +} + +static inline bool channel_state_fees_can_change(enum channel_state state) +{ + switch (state) { + case CHANNELD_AWAITING_LOCKIN: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + return false; + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CLOSINGD_SIGEXCHANGE: + return true; + } + abort(); +} + +static inline bool channel_state_failing_onchain(enum channel_state state) +{ + switch (state) { + case CHANNELD_AWAITING_LOCKIN: + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CLOSINGD_SIGEXCHANGE: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_COMPLETE: + case CLOSED: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + return false; + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + return true; + } + abort(); +} + +static inline bool channel_state_pre_open(enum channel_state state) +{ + switch (state) { + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + return true; + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CLOSINGD_SIGEXCHANGE: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + return false; + } + abort(); +} + +static inline bool channel_state_closed(enum channel_state state) +{ + switch (state) { + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CLOSINGD_SIGEXCHANGE: + case CHANNELD_SHUTTING_DOWN: + return false; + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + return true; + } + abort(); +} + +static inline bool channel_unsaved(const struct channel *channel) +{ + return channel->state == DUALOPEND_OPEN_INIT + && channel->dbid == 0; +} + +/* Established enough, that we could reach out to peer to discuss */ +static inline bool channel_wants_peercomms(const struct channel *channel) +{ + if (channel_unsaved(channel)) + return false; + + switch (channel->state) { + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CLOSINGD_SIGEXCHANGE: + case CHANNELD_SHUTTING_DOWN: + return true; + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + return false; + } + abort(); +} -/* Is the channel in AWAITING_*? */ -bool channel_state_awaitish(const struct channel *channel); +/* Established enough, that we have to fail onto chain */ +static inline bool channel_wants_onchain_fail(const struct channel *channel) +{ + if (channel_unsaved(channel)) + return false; -/* Is the channel in one of the CLOSING or CLOSED like states? */ -bool channel_state_closish(enum channel_state channel_state); + switch (channel->state) { + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CLOSINGD_SIGEXCHANGE: + case CHANNELD_SHUTTING_DOWN: + return true; + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + return false; + } + abort(); +} void channel_set_owner(struct channel *channel, struct subd *owner); @@ -482,83 +678,6 @@ void channel_set_last_tx(struct channel *channel, struct bitcoin_tx *tx, const struct bitcoin_signature *sig); -static inline bool channel_can_add_htlc(const struct channel *channel) -{ - return channel_state_normalish(channel); -} - -static inline bool channel_fees_can_change(const struct channel *channel) -{ - return channel_state_normalish(channel) - || channel->state == CHANNELD_SHUTTING_DOWN; -} - -static inline bool channel_state_on_chain(enum channel_state state) -{ - return state == ONCHAIN; -} - -static inline bool channel_on_chain(const struct channel *channel) -{ - return channel_state_on_chain(channel->state); -} - -static inline bool channel_unsaved(const struct channel *channel) -{ - return channel->state == DUALOPEND_OPEN_INIT - && channel->dbid == 0; -} - -static inline bool channel_pre_open(const struct channel *channel) -{ - return channel->state == CHANNELD_AWAITING_LOCKIN - || channel->state == DUALOPEND_OPEN_INIT - || channel->state == DUALOPEND_AWAITING_LOCKIN; -} - -static inline bool channel_active(const struct channel *channel) -{ - return channel->state != FUNDING_SPEND_SEEN - && channel->state != CLOSINGD_COMPLETE - && channel->state != AWAITING_UNILATERAL - && !channel_unsaved(channel) - && !channel_on_chain(channel); -} - -static inline bool channel_closed(const struct channel *channel) -{ - return channel->state == CLOSINGD_COMPLETE - || channel->state == AWAITING_UNILATERAL - || channel->state == FUNDING_SPEND_SEEN - || channel->state == ONCHAIN - || channel->state == CLOSED; -} - -/* Established enough, that we could reach out to peer to discuss */ -static inline bool channel_wants_peercomms(const struct channel *channel) -{ - if (channel_unsaved(channel)) - return false; - - switch (channel->state) { - case CHANNELD_AWAITING_LOCKIN: - case DUALOPEND_OPEN_INIT: - case DUALOPEND_AWAITING_LOCKIN: - case CHANNELD_NORMAL: - case CHANNELD_AWAITING_SPLICE: - case CLOSINGD_SIGEXCHANGE: - case CHANNELD_SHUTTING_DOWN: - return true; - case CLOSINGD_COMPLETE: - case AWAITING_UNILATERAL: - case FUNDING_SPEND_SEEN: - case ONCHAIN: - case CLOSED: - return false; - } - abort(); -} - static inline bool channel_has(const struct channel *channel, int f) { return channel_type_has(channel->type, f); diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index adb13bbd0206..bbd8f9549d31 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -77,7 +77,7 @@ void channel_update_feerates(struct lightningd *ld, const struct channel *channe static void try_update_feerates(struct lightningd *ld, struct channel *channel) { /* No point until funding locked in */ - if (!channel_fees_can_change(channel)) + if (!channel_state_fees_can_change(channel->state)) return; /* Can't if no daemon listening. */ @@ -130,7 +130,7 @@ static void try_update_blockheight(struct lightningd *ld, } /* If we're not opened/locked in yet, don't send update */ - if (!channel_fees_can_change(channel)) + if (!channel_state_fees_can_change(channel->state)) return; /* We don't update the blockheight for non-leased chans */ @@ -1006,8 +1006,7 @@ static void peer_start_closingd_after_shutdown(struct channel *channel, peer_start_closingd(channel, peer_fd); /* We might have reconnected, so already be here. */ - if (!channel_closed(channel) - && channel->state != CLOSINGD_SIGEXCHANGE) + if (channel->state == CHANNELD_SHUTTING_DOWN) channel_set_state(channel, CHANNELD_SHUTTING_DOWN, CLOSINGD_SIGEXCHANGE, @@ -1455,9 +1454,7 @@ bool peer_start_channeld(struct channel *channel, reconnected, /* Anything that indicates we are or have * shut down */ - channel->state == CHANNELD_SHUTTING_DOWN - || channel->state == CLOSINGD_SIGEXCHANGE - || channel_closed(channel), + channel_state_closing(channel->state), channel->shutdown_scriptpubkey[REMOTE] != NULL, channel->final_key_idx, &final_ext_key, @@ -2013,8 +2010,8 @@ static struct command_result *json_dev_feerate(struct command *cmd, if (!peer) return command_fail(cmd, LIGHTNINGD, "Peer not connected"); - channel = peer_any_channel(peer, NULL, &more_than_one); - if (!channel || !channel->owner || !channel_state_normalish(channel)) + channel = peer_any_channel(peer, channel_can_add_htlc, &more_than_one); + if (!channel || !channel->owner) return command_fail(cmd, LIGHTNINGD, "Peer bad state"); /* This is a dev command: fix the api if you need this! */ if (more_than_one) @@ -2074,8 +2071,8 @@ static struct command_result *json_dev_quiesce(struct command *cmd, return command_fail(cmd, LIGHTNINGD, "Peer not connected"); /* FIXME: If this becomes a real API, check for OPT_QUIESCE! */ - channel = peer_any_channel(peer, NULL, &more_than_one); - if (!channel || !channel->owner || !channel_state_normalish(channel)) + channel = peer_any_channel(peer, channel_wants_peercomms, &more_than_one); + if (!channel || !channel->owner) return command_fail(cmd, LIGHTNINGD, "Peer bad state"); /* This is a dev command: fix the api if you need this! */ if (more_than_one) diff --git a/lightningd/closing_control.c b/lightningd/closing_control.c index 24abb4cb9acb..37b5b3e45fad 100644 --- a/lightningd/closing_control.c +++ b/lightningd/closing_control.c @@ -303,7 +303,7 @@ static void peer_closing_complete(struct channel *channel, const u8 *msg) channel_set_billboard(channel, false, NULL); /* Retransmission only, ignore closing. */ - if (channel_closed(channel)) + if (channel->state != CLOSINGD_SIGEXCHANGE) return; /* Channel gets dropped to chain cooperatively. */ @@ -896,7 +896,13 @@ static struct command_result *json_close(struct command *cmd, break; case CLOSINGD_SIGEXCHANGE: break; - default: + + case DUALOPEND_OPEN_INIT: + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: return command_fail(cmd, LIGHTNINGD, "Channel is in state %s", channel_state_name(channel)); } diff --git a/lightningd/coin_mvts.c b/lightningd/coin_mvts.c index 52445986a19e..67294ca421ad 100644 --- a/lightningd/coin_mvts.c +++ b/lightningd/coin_mvts.c @@ -82,9 +82,24 @@ struct channel_coin_mvt *new_channel_mvt_routed_hout(const tal_t *ctx, static bool report_chan_balance(const struct channel *chan) { - return (channel_active(chan) - || chan->state == AWAITING_UNILATERAL) - && !channel_pre_open(chan); + switch (chan->state) { + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case ONCHAIN: + case CLOSED: + return false; + + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_SIGEXCHANGE: + case FUNDING_SPEND_SEEN: + return true; + } + abort(); } void send_account_balance_snapshot(struct lightningd *ld, u32 blockheight) diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index daf0f93923ac..7784d6c14154 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -355,7 +355,7 @@ static void try_connect(const tal_t *ctx, if (peer) { struct channel *channel; list_for_each(&peer->channels, channel, list) { - if (!channel_active(channel)) + if (!channel_wants_peercomms(channel)) continue; channel_set_billboard(channel, false, tal_fmt(tmpctx, diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 9fb05cf1f665..371f76b884b4 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -176,7 +176,7 @@ static void peer_channels_cleanup(struct lightningd *ld, for (size_t i = 0; i < tal_count(channels); i++) { c = channels[i]; - if (channel_active(c)) { + if (channel_wants_peercomms(c)) { channel_cleanup_commands(c, "Disconnected"); channel_fail_transient(c, true, "Disconnected"); } else if (channel_unsaved(c)) { @@ -363,10 +363,26 @@ void resend_closing_transactions(struct lightningd *ld) peer; peer = peer_node_id_map_next(ld->peers, &it)) { list_for_each(&peer->channels, channel, list) { - if (channel->state == CLOSINGD_COMPLETE) + switch (channel->state) { + case CHANNELD_AWAITING_LOCKIN: + case CHANNELD_NORMAL: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: + case CHANNELD_AWAITING_SPLICE: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_SIGEXCHANGE: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + continue; + case CLOSINGD_COMPLETE: drop_to_chain(ld, channel, true); - else if (channel->state == AWAITING_UNILATERAL) + continue; + case AWAITING_UNILATERAL: drop_to_chain(ld, channel, false); + continue; + } + abort(); } } } @@ -1280,7 +1296,7 @@ static void peer_connected_hook_final(struct peer_connected_hook_payload *payloa /* connect appropriate subds for all (active) channels! */ list_for_each(&peer->channels, channel, list) { /* FIXME: It can race by opening a channel before this! */ - if (channel_active(channel) && !channel->owner) { + if (channel_wants_peercomms(channel) && !channel->owner) { log_debug(channel->log, "Peer has reconnected, state %s: connecting subd", channel_state_name(channel)); @@ -1530,7 +1546,7 @@ void peer_spoke(struct lightningd *ld, const u8 *msg) /* If channel is active, we raced, so ignore this: * subd will get it soon. */ - if (channel_active(channel)) { + if (channel_wants_peercomms(channel)) { log_debug(channel->log, "channel already active"); if (!channel->owner && @@ -2335,7 +2351,7 @@ command_find_channel(struct command *cmd, peer; peer = peer_node_id_map_next(ld->peers, &it)) { list_for_each(&peer->channels, (*channel), list) { - if (!channel_active(*channel)) + if (!channel_wants_peercomms(*channel)) continue; if (channel_id_eq(&(*channel)->cid, &cid)) return NULL; @@ -2378,7 +2394,7 @@ static void setup_peer(struct peer *peer, u32 delay) channel_watch_inflight(ld, channel, inflight); } - if (channel_active(channel)) + if (channel_wants_peercomms(channel)) connect = true; } @@ -2557,15 +2573,27 @@ static struct command_result *json_getinfo(struct command *cmd, num_peers++; list_for_each(&peer->channels, channel, list) { - if (channel->state == CHANNELD_AWAITING_LOCKIN - || channel->state == DUALOPEND_AWAITING_LOCKIN - || channel->state == DUALOPEND_OPEN_INIT) { + switch (channel->state) { + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_AWAITING_LOCKIN: pending_channels++; - } else if (channel_active(channel)) { + continue; + case CHANNELD_AWAITING_SPLICE: + case CHANNELD_SHUTTING_DOWN: + case CHANNELD_NORMAL: + case CLOSINGD_SIGEXCHANGE: active_channels++; - } else { + continue; + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: inactive_channels++; + continue; } + abort(); } } json_add_num(response, "num_peers", num_peers); @@ -2992,9 +3020,7 @@ static struct command_result *json_setchannel(struct command *cmd, peer = peer_node_id_map_next(cmd->ld->peers, &it)) { struct channel *channel; list_for_each(&peer->channels, channel, list) { - if (channel->state != CHANNELD_NORMAL && - channel->state != CHANNELD_AWAITING_LOCKIN && - channel->state != DUALOPEND_AWAITING_LOCKIN) + if (!channel_state_can_setchannel(channel->state)) continue; set_channel_config(cmd, channel, base, ppm, htlc_min, htlc_max, diff --git a/lightningd/peer_htlcs.c b/lightningd/peer_htlcs.c index 2575b6c5d48f..a0710f1b0b96 100644 --- a/lightningd/peer_htlcs.c +++ b/lightningd/peer_htlcs.c @@ -170,7 +170,7 @@ static void tell_channeld_htlc_failed(const struct htlc_in *hin, return; /* onchaind doesn't care, it can't do anything but wait */ - if (!channel_active(hin->key.channel)) + if (!channel_can_remove_htlc(hin->key.channel)) return; subd_send_msg(hin->key.channel->owner, @@ -584,7 +584,7 @@ static void htlc_offer_timeout(struct htlc_out *out) assert(out->hstate == SENT_ADD_HTLC); /* If owner died, we should already be taken care of. */ - if (!channel->owner || !channel_state_normalish(channel)) + if (!channel->owner || !channel_can_add_htlc(channel)) return; log_unusual(channel->owner->log, @@ -716,7 +716,7 @@ static void forward_htlc(struct htlc_in *hin, next = NULL; /* Unknown peer, or peer not ready. */ - if (!next || !channel_active(next)) { + if (!next || !channel_can_add_htlc(next)) { local_fail_in_htlc(hin, take(towire_unknown_next_peer(NULL))); wallet_forwarded_payment_add(hin->key.channel->peer->ld->wallet, hin, FORWARD_STYLE_TLV, @@ -1339,7 +1339,7 @@ static bool peer_accepted_htlc(const tal_t *ctx, * * - SHOULD fail to route any HTLC added after it has sent `shutdown`. */ - if (channel->state == CHANNELD_SHUTTING_DOWN) { + if (!channel_can_add_htlc(channel)) { *failmsg = towire_permanent_channel_failure(ctx); log_debug(channel->log, "Rejecting their htlc %"PRIu64 @@ -2781,8 +2781,8 @@ void htlcs_notify_new_block(struct lightningd *ld, u32 height) if (height < htlc_out_deadline(hout)) continue; - /* Peer on chain already? */ - if (channel_on_chain(hout->key.channel)) { + /* Channel dying already? */ + if (!channel_can_add_htlc(hout->key.channel)) { consider_failing_incoming(ld, height, hout); continue; } @@ -2834,7 +2834,7 @@ void htlcs_notify_new_block(struct lightningd *ld, u32 height) continue; /* Peer on chain already? */ - if (channel_on_chain(channel)) + if (channel_state_failing_onchain(channel->state)) continue; /* Peer already failed, or we hit it? */ diff --git a/lightningd/routehint.c b/lightningd/routehint.c index 43fa7580ed98..0cbd8717fe24 100644 --- a/lightningd/routehint.c +++ b/lightningd/routehint.c @@ -126,8 +126,7 @@ routehint_candidates(const tal_t *ctx, continue; } - if (candidate.c->state != CHANNELD_NORMAL - && candidate.c->state != CHANNELD_AWAITING_SPLICE) { + if (!channel_can_add_htlc(candidate.c)) { log_debug(ld->log, "%s: abnormal channel", type_to_string(tmpctx, struct short_channel_id, From 1c9722ddb733112fd08d518e395efbe162a17da1 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:50 +1030 Subject: [PATCH 14/28] lightningd: remove peer_any_unsaved_channel and use peer_any_channel. Signed-off-by: Rusty Russell --- lightningd/channel.c | 20 -------------------- lightningd/channel.h | 3 --- lightningd/closing_control.c | 2 +- 3 files changed, 1 insertion(+), 24 deletions(-) diff --git a/lightningd/channel.c b/lightningd/channel.c index 4c40541421d5..e072a7b4a2f8 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -611,26 +611,6 @@ struct channel *peer_any_channel(struct peer *peer, return ret; } -struct channel *peer_any_unsaved_channel(struct peer *peer, bool *others) -{ - struct channel *channel, *ret = NULL; - - list_for_each(&peer->channels, channel, list) { - if (!channel_unsaved(channel)) - continue; - /* Already found one? */ - if (ret) { - if (others) - *others = true; - } else { - if (others) - *others = false; - ret = channel; - } - } - return ret; -} - struct channel_inflight *channel_inflight_find(struct channel *channel, const struct bitcoin_txid *txid) { diff --git a/lightningd/channel.h b/lightningd/channel.h index 10a7212f032d..7d2bd6edd851 100644 --- a/lightningd/channel.h +++ b/lightningd/channel.h @@ -642,9 +642,6 @@ struct channel *peer_any_channel(struct peer *peer, bool (*channel_state_filter)(const struct channel *), bool *others); -/* Find a channel which is not yet saved to disk */ -struct channel *peer_any_unsaved_channel(struct peer *peer, bool *others); - struct channel *channel_by_dbid(struct lightningd *ld, const u64 dbid); /* Includes both real scids and aliases. If !privacy_leak_ok, then private diff --git a/lightningd/closing_control.c b/lightningd/closing_control.c index 37b5b3e45fad..2ae178bb6120 100644 --- a/lightningd/closing_control.c +++ b/lightningd/closing_control.c @@ -620,7 +620,7 @@ static struct command_result *param_channel_or_peer(struct command *cmd, if ((*sc)->uc) return NULL; - (*sc)->unsaved_channel = peer_any_unsaved_channel(peer, &more_than_one); + (*sc)->unsaved_channel = peer_any_channel(peer, channel_unsaved, &more_than_one); if ((*sc)->unsaved_channel) { if (more_than_one) goto more_than_one; From d9c54df6fed12cdbb3b31d50c91f8cdac2e4af43 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:50 +1030 Subject: [PATCH 15/28] wallet: add standard sanity-check function for channel_state. Signed-off-by: Rusty Russell --- wallet/wallet.c | 10 +++++----- wallet/wallet.h | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/wallet/wallet.c b/wallet/wallet.c index 962bcf9113a0..b6ec8da26fcf 100644 --- a/wallet/wallet.c +++ b/wallet/wallet.c @@ -1601,7 +1601,7 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm chan = new_channel(peer, db_col_u64(stmt, "id"), &wshachain, - db_col_int(stmt, "state"), + channel_state_in_db(db_col_int(stmt, "state")), db_col_int(stmt, "funder"), NULL, /* Set up fresh log */ "Loaded from database", @@ -2168,7 +2168,7 @@ void wallet_channel_save(struct wallet *w, struct channel *chan) db_bind_null(stmt); db_bind_channel_id(stmt, &chan->cid); - db_bind_int(stmt, chan->state); + db_bind_int(stmt, channel_state_in_db(chan->state)); db_bind_int(stmt, chan->opener); db_bind_int(stmt, chan->channel_flags); db_bind_int(stmt, chan->minimum_depth); @@ -2352,8 +2352,8 @@ void wallet_state_change_add(struct wallet *w, db_bind_u64(stmt, channel_id); db_bind_timeabs(stmt, *timestamp); - db_bind_int(stmt, old_state); - db_bind_int(stmt, new_state); + db_bind_int(stmt, channel_state_in_db(old_state)); + db_bind_int(stmt, channel_state_in_db(new_state)); db_bind_int(stmt, state_change_in_db(cause)); db_bind_text(stmt, message); @@ -2525,7 +2525,7 @@ void wallet_channel_close(struct wallet *w, u64 wallet_id) stmt = db_prepare_v2(w->db, SQL("UPDATE channels " "SET state=? " "WHERE channels.id=?")); - db_bind_u64(stmt, CLOSED); + db_bind_u64(stmt, channel_state_in_db(CLOSED)); db_bind_u64(stmt, wallet_id); db_exec_prepared_v2(take(stmt)); } diff --git a/wallet/wallet.h b/wallet/wallet.h index b0f2c1a9a3c8..5dfce3c38933 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -23,8 +24,6 @@ struct node_id; struct oneshot; struct peer; struct timers; -enum channel_state; -enum state_change; struct wallet { struct lightningd *ld; @@ -273,6 +272,50 @@ static inline enum htlc_state htlc_state_in_db(enum htlc_state s) fatal("%s: %u is invalid", __func__, s); } +/* DB wrapper to check channel_state */ +static inline enum channel_state channel_state_in_db(enum channel_state s) +{ + switch (s) { + case CHANNELD_AWAITING_LOCKIN: + BUILD_ASSERT(CHANNELD_AWAITING_LOCKIN == 2); + return s; + case CHANNELD_NORMAL: + BUILD_ASSERT(CHANNELD_NORMAL == 3); + return s; + case CHANNELD_SHUTTING_DOWN: + BUILD_ASSERT(CHANNELD_SHUTTING_DOWN == 4); + return s; + case CLOSINGD_SIGEXCHANGE: + BUILD_ASSERT(CLOSINGD_SIGEXCHANGE == 5); + return s; + case CLOSINGD_COMPLETE: + BUILD_ASSERT(CLOSINGD_COMPLETE == 6); + return s; + case AWAITING_UNILATERAL: + BUILD_ASSERT(AWAITING_UNILATERAL == 7); + return s; + case FUNDING_SPEND_SEEN: + BUILD_ASSERT(FUNDING_SPEND_SEEN == 8); + return s; + case ONCHAIN: + BUILD_ASSERT(ONCHAIN == 9); + return s; + case CLOSED: + BUILD_ASSERT(CLOSED == 10); + return s; + case DUALOPEND_OPEN_INIT: + BUILD_ASSERT(DUALOPEND_OPEN_INIT == 11); + return s; + case DUALOPEND_AWAITING_LOCKIN: + BUILD_ASSERT(DUALOPEND_AWAITING_LOCKIN == 12); + return s; + case CHANNELD_AWAITING_SPLICE: + BUILD_ASSERT(CHANNELD_AWAITING_SPLICE == 13); + return s; + } + fatal("%s: %u is invalid", __func__, s); +} + struct forwarding { /* channel_out is all-zero if unknown. */ struct short_channel_id channel_in, channel_out; From 947a5160923d924746e2a17d656ef2a75eb22633 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:50 +1030 Subject: [PATCH 16/28] lightningd/channel.h: rename channel_unsaved to the more explicit channel_state_uncommitted. Signed-off-by: Rusty Russell --- lightningd/channel.c | 3 ++- lightningd/channel.h | 26 +++++++++++++++++++++----- lightningd/channel_control.c | 2 +- lightningd/closing_control.c | 2 +- lightningd/dual_open_control.c | 12 ++++++------ lightningd/peer_control.c | 12 ++++++------ wallet/walletrpc.c | 2 +- 7 files changed, 38 insertions(+), 21 deletions(-) diff --git a/lightningd/channel.c b/lightningd/channel.c index e072a7b4a2f8..a048c31583d6 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -968,7 +968,8 @@ void channel_internal_error(struct channel *channel, const char *fmt, ...) channel_cleanup_commands(channel, why); - if (channel_unsaved(channel)) { + /* Nothing ventured, nothing lost! */ + if (channel_state_uncommitted(channel)) { channel_set_owner(channel, NULL); delete_channel(channel); tal_free(why); diff --git a/lightningd/channel.h b/lightningd/channel.h index 7d2bd6edd851..bcda5a547ebb 100644 --- a/lightningd/channel.h +++ b/lightningd/channel.h @@ -551,16 +551,32 @@ static inline bool channel_state_closed(enum channel_state state) abort(); } -static inline bool channel_unsaved(const struct channel *channel) +/* Not even int the database yet? */ +static inline bool channel_state_uncommitted(const struct channel *channel) { - return channel->state == DUALOPEND_OPEN_INIT - && channel->dbid == 0; + switch (channel->state) { + case DUALOPEND_OPEN_INIT: + return channel->dbid == 0; + case CHANNELD_AWAITING_LOCKIN: + case DUALOPEND_AWAITING_LOCKIN: + case CHANNELD_NORMAL: + case CHANNELD_AWAITING_SPLICE: + case CLOSINGD_SIGEXCHANGE: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + return false; + } + abort(); } /* Established enough, that we could reach out to peer to discuss */ static inline bool channel_wants_peercomms(const struct channel *channel) { - if (channel_unsaved(channel)) + if (channel_state_uncommitted(channel)) return false; switch (channel->state) { @@ -585,7 +601,7 @@ static inline bool channel_wants_peercomms(const struct channel *channel) /* Established enough, that we have to fail onto chain */ static inline bool channel_wants_onchain_fail(const struct channel *channel) { - if (channel_unsaved(channel)) + if (channel_state_uncommitted(channel)) return false; switch (channel->state) { diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index bbd8f9549d31..ab788fe32486 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -1585,7 +1585,7 @@ void channel_notify_new_block(struct lightningd *ld, peer; peer = peer_node_id_map_next(ld->peers, &it)) { list_for_each(&peer->channels, channel, list) { - if (channel_unsaved(channel)) + if (channel_state_uncommitted(channel)) continue; if (is_fundee_should_forget(ld, channel, block_height)) { tal_arr_expand(&to_forget, channel); diff --git a/lightningd/closing_control.c b/lightningd/closing_control.c index 2ae178bb6120..ae95e807b0b9 100644 --- a/lightningd/closing_control.c +++ b/lightningd/closing_control.c @@ -620,7 +620,7 @@ static struct command_result *param_channel_or_peer(struct command *cmd, if ((*sc)->uc) return NULL; - (*sc)->unsaved_channel = peer_any_channel(peer, channel_unsaved, &more_than_one); + (*sc)->unsaved_channel = peer_any_channel(peer, channel_state_uncommitted, &more_than_one); if ((*sc)->unsaved_channel) { if (more_than_one) goto more_than_one; diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index e30f5b7e7152..4b74125ad40e 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -58,7 +58,7 @@ static void channel_disconnect(struct channel *channel, void channel_unsaved_close_conn(struct channel *channel, const char *why) { /* Gotta be unsaved */ - assert(channel_unsaved(channel)); + assert(channel_state_uncommitted(channel)); log_info(channel->log, "Unsaved peer failed." " Disconnecting and deleting channel. Reason: %s", why); @@ -77,7 +77,7 @@ static void channel_saved_err_broken_reconn(struct channel *channel, const char *errmsg; /* We only reconnect to 'saved' channel peers */ - assert(!channel_unsaved(channel)); + assert(!channel_state_uncommitted(channel)); va_start(ap, fmt); errmsg = tal_vfmt(tmpctx, fmt, ap); @@ -97,7 +97,7 @@ static void channel_err_broken(struct channel *channel, errmsg = tal_vfmt(tmpctx, fmt, ap); va_end(ap); - if (channel_unsaved(channel)) { + if (channel_state_uncommitted(channel)) { log_broken(channel->log, "%s", errmsg); channel_unsaved_close_conn(channel, errmsg); } else @@ -1374,7 +1374,7 @@ static void handle_peer_wants_to_close(struct subd *dualopend, OPT_ANCHORS_ZERO_FEE_HTLC_TX); /* We shouldn't get this message while we're waiting to finish */ - if (channel_unsaved(channel)) { + if (channel_state_uncommitted(channel)) { log_broken(dualopend->ld->log, "Channel in wrong state for" " shutdown, still has uncommitted" " channel pending."); @@ -3604,7 +3604,7 @@ static void dualopen_errmsg(struct channel *channel, /* Clean up any in-progress open attempts */ channel_cleanup_commands(channel, desc); - if (channel_unsaved(channel)) { + if (channel_state_uncommitted(channel)) { log_info(channel->log, "%s", "Unsaved peer failed." " Deleting channel."); delete_channel(channel); @@ -3769,7 +3769,7 @@ bool peer_restart_dualopend(struct peer *peer, u32 *local_shutdown_script_wallet_index; u8 *msg; - if (channel_unsaved(channel)) + if (channel_state_uncommitted(channel)) return peer_start_dualopend(peer, peer_fd, channel); hsmfd = hsm_get_client_fd(peer->ld, &peer->id, channel->dbid, diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 371f76b884b4..c266555b3110 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -179,7 +179,7 @@ static void peer_channels_cleanup(struct lightningd *ld, if (channel_wants_peercomms(c)) { channel_cleanup_commands(c, "Disconnected"); channel_fail_transient(c, true, "Disconnected"); - } else if (channel_unsaved(c)) { + } else if (channel_state_uncommitted(c)) { channel_unsaved_close_conn(c, "Disconnected"); } } @@ -397,7 +397,7 @@ void channel_errmsg(struct channel *channel, /* Clean up any in-progress open attempts */ channel_cleanup_commands(channel, desc); - if (channel_unsaved(channel)) { + if (channel_state_uncommitted(channel)) { log_info(channel->log, "%s", "Unsaved peer failed." " Deleting channel."); delete_channel(channel); @@ -2162,7 +2162,7 @@ static void json_add_peer(struct lightningd *ld, json_add_uncommitted_channel(response, p->uncommitted_channel, NULL); list_for_each(&p->channels, channel, list) { - if (channel_unsaved(channel)) + if (channel_state_uncommitted(channel)) json_add_unsaved_channel(response, channel, NULL); else json_add_channel(ld, response, NULL, channel, NULL); @@ -2281,7 +2281,7 @@ static void json_add_peerchannels(struct lightningd *ld, json_add_uncommitted_channel(response, peer->uncommitted_channel, peer); list_for_each(&peer->channels, channel, list) { - if (channel_unsaved(channel)) + if (channel_state_uncommitted(channel)) json_add_unsaved_channel(response, channel, peer); else json_add_channel(ld, response, NULL, channel, peer); @@ -2379,7 +2379,7 @@ static void setup_peer(struct peer *peer, u32 delay) bool connect = false; list_for_each(&peer->channels, channel, list) { - if (channel_unsaved(channel)) + if (channel_state_uncommitted(channel)) continue; /* Watching lockin may be unnecessary, but it's harmless. */ channel_watch_funding(ld, channel); @@ -3300,7 +3300,7 @@ static struct command_result *json_dev_forget_channel(struct command *cmd, "or `dev-fail` instead."); } - if (!channel_unsaved(forget->channel)) + if (!channel_state_uncommitted(forget->channel)) bitcoind_getutxout(cmd->ld->topology->bitcoind, &forget->channel->funding, process_dev_forget_channel, forget); diff --git a/wallet/walletrpc.c b/wallet/walletrpc.c index a6d76a8129d2..ef3e9afd5cb3 100644 --- a/wallet/walletrpc.c +++ b/wallet/walletrpc.c @@ -382,7 +382,7 @@ static struct command_result *json_listfunds(struct command *cmd, struct channel *c; list_for_each(&p->channels, c, list) { /* We don't print out uncommitted channels */ - if (channel_unsaved(c)) + if (channel_state_uncommitted(c)) continue; json_object_start(response, NULL); json_add_node_id(response, "peer_id", &p->id); From e95202a3084c2de05a7b33e71bc5ec35e19f1cc4 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:50 +1030 Subject: [PATCH 17/28] common/json_stream, lightningd/notification: clean up function APIs We usually hand times by copy, not by pointer (and if we did, they should be const!). I noticed this particularly for the state changed code, but it goes down to to json_add_timeiso, so I fixed that too. Signed-off-by: Rusty Russell --- common/json_stream.c | 6 ++-- common/json_stream.h | 2 +- lightningd/channel.c | 4 +-- lightningd/notification.c | 32 ++++++++++----------- lightningd/notification.h | 10 +++---- lightningd/opening_control.c | 2 +- lightningd/peer_control.c | 2 +- lightningd/test/run-invoice-select-inchan.c | 2 +- wallet/test/run-wallet.c | 12 ++++---- wallet/wallet.c | 6 ++-- wallet/wallet.h | 4 +-- 11 files changed, 41 insertions(+), 41 deletions(-) diff --git a/common/json_stream.c b/common/json_stream.c index 1abfaed289cc..24ccf1291e20 100644 --- a/common/json_stream.c +++ b/common/json_stream.c @@ -387,15 +387,15 @@ void json_add_timestr(struct json_stream *result, const char *fieldname, void json_add_timeiso(struct json_stream *result, const char *fieldname, - struct timeabs *time) + struct timeabs time) { char iso8601_msec_fmt[sizeof("YYYY-mm-ddTHH:MM:SS.%03dZ")]; char iso8601_s[sizeof("YYYY-mm-ddTHH:MM:SS.nnnZ")]; strftime(iso8601_msec_fmt, sizeof(iso8601_msec_fmt), - "%FT%T.%%03dZ", gmtime(&time->ts.tv_sec)); + "%FT%T.%%03dZ", gmtime(&time.ts.tv_sec)); snprintf(iso8601_s, sizeof(iso8601_s), - iso8601_msec_fmt, (int) time->ts.tv_nsec / 1000000); + iso8601_msec_fmt, (int) time.ts.tv_nsec / 1000000); json_add_string(result, fieldname, iso8601_s); } diff --git a/common/json_stream.h b/common/json_stream.h index 4b37aee83ab5..4b53666cfbc1 100644 --- a/common/json_stream.h +++ b/common/json_stream.h @@ -261,7 +261,7 @@ void json_add_timestr(struct json_stream *result, const char *fieldname, /* Add ISO_8601 timestamp string, i.e. "2019-09-07T15:50+01:00" */ void json_add_timeiso(struct json_stream *result, const char *fieldname, - struct timeabs *time); + struct timeabs time); /* Add any json token */ void json_add_tok(struct json_stream *result, const char *fieldname, diff --git a/lightningd/channel.c b/lightningd/channel.c index a048c31583d6..df24f52fad70 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -813,7 +813,7 @@ void channel_set_state(struct channel *channel, timestamp = time_now(); wallet_state_change_add(channel->peer->ld->wallet, channel->dbid, - ×tamp, + timestamp, old_state, state, reason, @@ -822,7 +822,7 @@ void channel_set_state(struct channel *channel, &channel->peer->id, &channel->cid, channel->scid, - ×tamp, + timestamp, old_state, state, reason, diff --git a/lightningd/notification.c b/lightningd/notification.c index 8012477d164e..2983c843190e 100644 --- a/lightningd/notification.c +++ b/lightningd/notification.c @@ -137,7 +137,7 @@ static void warning_notification_serialize(struct json_stream *stream, /* unsuaul/broken event is rare, plugin pay more attentions on * the absolute time, like when channels failed. */ json_add_timestr(stream, "time", l->time.ts); - json_add_timeiso(stream, "timestamp", &l->time); + json_add_timeiso(stream, "timestamp", l->time); json_add_string(stream, "source", l->prefix->prefix); json_add_string(stream, "log", l->log); json_object_end(stream); /* .warning */ @@ -264,14 +264,14 @@ void notify_channel_opened(struct lightningd *ld, struct node_id *node_id, } static void channel_state_changed_notification_serialize(struct json_stream *stream, - struct node_id *peer_id, - struct channel_id *cid, - struct short_channel_id *scid, - struct timeabs *timestamp, + const struct node_id *peer_id, + const struct channel_id *cid, + const struct short_channel_id *scid, + struct timeabs timestamp, enum channel_state old_state, enum channel_state new_state, enum state_change cause, - char *message) + const char *message) { json_object_start(stream, "channel_state_changed"); json_add_node_id(stream, "peer_id", peer_id); @@ -296,24 +296,24 @@ REGISTER_NOTIFICATION(channel_state_changed, channel_state_changed_notification_serialize) void notify_channel_state_changed(struct lightningd *ld, - struct node_id *peer_id, - struct channel_id *cid, - struct short_channel_id *scid, - struct timeabs *timestamp, + const struct node_id *peer_id, + const struct channel_id *cid, + const struct short_channel_id *scid, + struct timeabs timestamp, enum channel_state old_state, enum channel_state new_state, enum state_change cause, - char *message) + const char *message) { void (*serialize)(struct json_stream *, - struct node_id *, - struct channel_id *, - struct short_channel_id *, - struct timeabs *timestamp, + const struct node_id *, + const struct channel_id *, + const struct short_channel_id *, + struct timeabs timestamp, enum channel_state, enum channel_state, enum state_change, - char *message) = channel_state_changed_notification_gen.serialize; + const char *message) = channel_state_changed_notification_gen.serialize; struct jsonrpc_notification *n = jsonrpc_notification_start(NULL, channel_state_changed_notification_gen.topic); diff --git a/lightningd/notification.h b/lightningd/notification.h index d14df085f7e1..ce11d7cac36f 100644 --- a/lightningd/notification.h +++ b/lightningd/notification.h @@ -51,14 +51,14 @@ void notify_channel_opened(struct lightningd *ld, struct node_id *node_id, bool channel_ready); void notify_channel_state_changed(struct lightningd *ld, - struct node_id *peer_id, - struct channel_id *cid, - struct short_channel_id *scid, - struct timeabs *timestamp, + const struct node_id *peer_id, + const struct channel_id *cid, + const struct short_channel_id *scid, + struct timeabs timestamp, enum channel_state old_state, enum channel_state new_state, enum state_change cause, - char *message); + const char *message); void notify_forward_event(struct lightningd *ld, const struct htlc_in *in, diff --git a/lightningd/opening_control.c b/lightningd/opening_control.c index 05903e96a1ad..6f2be5c874ba 100644 --- a/lightningd/opening_control.c +++ b/lightningd/opening_control.c @@ -242,7 +242,7 @@ wallet_commit_channel(struct lightningd *ld, notify_channel_state_changed(ld, &channel->peer->id, &channel->cid, channel->scid, /* NULL */ - ×tamp, + timestamp, 0, /* No prior state */ channel->state, channel->state_change_cause, diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index c266555b3110..7574a23d1832 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1070,7 +1070,7 @@ static void json_add_channel(struct lightningd *ld, for (size_t i = 0; i < tal_count(state_changes); i++) { json_object_start(response, NULL); json_add_timeiso(response, "timestamp", - &state_changes[i].timestamp); + state_changes[i].timestamp); json_add_string(response, "old_state", channel_state_str(state_changes[i].old_state)); json_add_string(response, "new_state", diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 8454ec9afd92..ab657a72b5c0 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -537,7 +537,7 @@ void json_add_stringn(struct json_stream *result UNNEEDED, const char *fieldname /* Generated stub for json_add_timeiso */ void json_add_timeiso(struct json_stream *result UNNEEDED, const char *fieldname UNNEEDED, - struct timeabs *time UNNEEDED) + struct timeabs time UNNEEDED) { fprintf(stderr, "json_add_timeiso called!\n"); abort(); } /* Generated stub for json_add_tx */ void json_add_tx(struct json_stream *result UNNEEDED, diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index 5064621e5b10..f1179964d786 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -346,7 +346,7 @@ void json_add_timeabs(struct json_stream *result UNNEEDED, const char *fieldname /* Generated stub for json_add_timeiso */ void json_add_timeiso(struct json_stream *result UNNEEDED, const char *fieldname UNNEEDED, - struct timeabs *time UNNEEDED) + struct timeabs time UNNEEDED) { fprintf(stderr, "json_add_timeiso called!\n"); abort(); } /* Generated stub for json_add_tx */ void json_add_tx(struct json_stream *result UNNEEDED, @@ -503,14 +503,14 @@ void notify_channel_open_failed(struct lightningd *ld UNNEEDED, { fprintf(stderr, "notify_channel_open_failed called!\n"); abort(); } /* Generated stub for notify_channel_state_changed */ void notify_channel_state_changed(struct lightningd *ld UNNEEDED, - struct node_id *peer_id UNNEEDED, - struct channel_id *cid UNNEEDED, - struct short_channel_id *scid UNNEEDED, - struct timeabs *timestamp UNNEEDED, + const struct node_id *peer_id UNNEEDED, + const struct channel_id *cid UNNEEDED, + const struct short_channel_id *scid UNNEEDED, + struct timeabs timestamp UNNEEDED, enum channel_state old_state UNNEEDED, enum channel_state new_state UNNEEDED, enum state_change cause UNNEEDED, - char *message UNNEEDED) + const char *message UNNEEDED) { fprintf(stderr, "notify_channel_state_changed called!\n"); abort(); } /* Generated stub for notify_connect */ void notify_connect(struct lightningd *ld UNNEEDED, diff --git a/wallet/wallet.c b/wallet/wallet.c index b6ec8da26fcf..c4c91d397b67 100644 --- a/wallet/wallet.c +++ b/wallet/wallet.c @@ -2333,11 +2333,11 @@ void wallet_channel_save(struct wallet *w, struct channel *chan) void wallet_state_change_add(struct wallet *w, const u64 channel_id, - struct timeabs *timestamp, + struct timeabs timestamp, enum channel_state old_state, enum channel_state new_state, enum state_change cause, - char *message) + const char *message) { struct db_stmt *stmt; stmt = db_prepare_v2(w->db, @@ -2351,7 +2351,7 @@ void wallet_state_change_add(struct wallet *w, ") VALUES (?, ?, ?, ?, ?, ?);")); db_bind_u64(stmt, channel_id); - db_bind_timeabs(stmt, *timestamp); + db_bind_timeabs(stmt, timestamp); db_bind_int(stmt, channel_state_in_db(old_state)); db_bind_int(stmt, channel_state_in_db(new_state)); db_bind_int(stmt, state_change_in_db(cause)); diff --git a/wallet/wallet.h b/wallet/wallet.h index 5dfce3c38933..ff4b5db44305 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -697,11 +697,11 @@ void wallet_channel_close(struct wallet *w, u64 wallet_id); */ void wallet_state_change_add(struct wallet *w, const u64 channel_id, - struct timeabs *timestamp, + struct timeabs timestamp, enum channel_state old_state, enum channel_state new_state, enum state_change cause, - char *message); + const char *message); /** * Gets all state change history entries for a channel from the database From eef8c96dc080ffa57aa60b542965702f005d446e Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:50 +1030 Subject: [PATCH 18/28] doc: introduce new state DUALOPEND_OPEN_COMMITTED. This is the variant of DUALOPEND_OPEN_INIT which you see once the channel is in the db: we'll be adding it next, but to reduce clutter the docs are added as a separate commit. Signed-off-by: Rusty Russell --- .msggen.json | 2 + cln-grpc/proto/node.proto | 2 + cln-rpc/src/model.rs | 8 + contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py | 786 +++++++++--------- doc/lightning-listfunds.7.md | 4 +- doc/lightning-listpeerchannels.7.md | 8 +- doc/lightning-listpeers.7.md | 8 +- doc/schemas/listfunds.schema.json | 3 +- doc/schemas/listpeerchannels.schema.json | 5 +- doc/schemas/listpeers.schema.json | 9 +- 10 files changed, 427 insertions(+), 408 deletions(-) diff --git a/.msggen.json b/.msggen.json index 6f2a54c05a7b..e89f1024cb7b 100644 --- a/.msggen.json +++ b/.msggen.json @@ -188,6 +188,7 @@ "CLOSINGD_COMPLETE": 5, "CLOSINGD_SIGEXCHANGE": 4, "DUALOPEND_AWAITING_LOCKIN": 10, + "DUALOPEND_OPEN_COMMITTED": 12, "DUALOPEND_OPEN_INIT": 9, "FUNDING_SPEND_SEEN": 7, "ONCHAIN": 8, @@ -251,6 +252,7 @@ "CLOSINGD_COMPLETE": 5, "CLOSINGD_SIGEXCHANGE": 4, "DUALOPEND_AWAITING_LOCKIN": 10, + "DUALOPEND_OPEN_COMMITTED": 11, "DUALOPEND_OPEN_INIT": 9, "FUNDING_SPEND_SEEN": 7, "ONCHAIN": 8, diff --git a/cln-grpc/proto/node.proto b/cln-grpc/proto/node.proto index f26f85620235..fffeaa799fd4 100644 --- a/cln-grpc/proto/node.proto +++ b/cln-grpc/proto/node.proto @@ -181,6 +181,7 @@ message ListpeersPeersChannels { ONCHAIN = 8; DUALOPEND_OPEN_INIT = 9; DUALOPEND_AWAITING_LOCKIN = 10; + DUALOPEND_OPEN_COMMITTED = 11; } ListpeersPeersChannelsState state = 1; optional bytes scratch_txid = 2; @@ -1125,6 +1126,7 @@ message ListpeerchannelsChannels { DUALOPEND_OPEN_INIT = 9; DUALOPEND_AWAITING_LOCKIN = 10; CHANNELD_AWAITING_SPLICE = 11; + DUALOPEND_OPEN_COMMITTED = 12; } optional bytes peer_id = 1; optional bool peer_connected = 2; diff --git a/cln-rpc/src/model.rs b/cln-rpc/src/model.rs index c99a1fce7cb5..cd68c6e443f8 100644 --- a/cln-rpc/src/model.rs +++ b/cln-rpc/src/model.rs @@ -1829,6 +1829,8 @@ pub mod responses { DUALOPEND_OPEN_INIT, #[serde(rename = "DUALOPEND_AWAITING_LOCKIN")] DUALOPEND_AWAITING_LOCKIN, + #[serde(rename = "DUALOPEND_OPEN_COMMITTED")] + DUALOPEND_OPEN_COMMITTED, } impl TryFrom for ListpeersPeersChannelsState { @@ -1846,6 +1848,7 @@ pub mod responses { 8 => Ok(ListpeersPeersChannelsState::ONCHAIN), 9 => Ok(ListpeersPeersChannelsState::DUALOPEND_OPEN_INIT), 10 => Ok(ListpeersPeersChannelsState::DUALOPEND_AWAITING_LOCKIN), + 11 => Ok(ListpeersPeersChannelsState::DUALOPEND_OPEN_COMMITTED), o => Err(anyhow::anyhow!("Unknown variant {} for enum ListpeersPeersChannelsState", o)), } } @@ -1865,6 +1868,7 @@ pub mod responses { ListpeersPeersChannelsState::ONCHAIN => "ONCHAIN", ListpeersPeersChannelsState::DUALOPEND_OPEN_INIT => "DUALOPEND_OPEN_INIT", ListpeersPeersChannelsState::DUALOPEND_AWAITING_LOCKIN => "DUALOPEND_AWAITING_LOCKIN", + ListpeersPeersChannelsState::DUALOPEND_OPEN_COMMITTED => "DUALOPEND_OPEN_COMMITTED", }.to_string() } } @@ -3649,6 +3653,8 @@ pub mod responses { DUALOPEND_AWAITING_LOCKIN, #[serde(rename = "CHANNELD_AWAITING_SPLICE")] CHANNELD_AWAITING_SPLICE, + #[serde(rename = "DUALOPEND_OPEN_COMMITTED")] + DUALOPEND_OPEN_COMMITTED, } impl TryFrom for ListpeerchannelsChannelsState { @@ -3667,6 +3673,7 @@ pub mod responses { 9 => Ok(ListpeerchannelsChannelsState::DUALOPEND_OPEN_INIT), 10 => Ok(ListpeerchannelsChannelsState::DUALOPEND_AWAITING_LOCKIN), 11 => Ok(ListpeerchannelsChannelsState::CHANNELD_AWAITING_SPLICE), + 12 => Ok(ListpeerchannelsChannelsState::DUALOPEND_OPEN_COMMITTED), o => Err(anyhow::anyhow!("Unknown variant {} for enum ListpeerchannelsChannelsState", o)), } } @@ -3687,6 +3694,7 @@ pub mod responses { ListpeerchannelsChannelsState::DUALOPEND_OPEN_INIT => "DUALOPEND_OPEN_INIT", ListpeerchannelsChannelsState::DUALOPEND_AWAITING_LOCKIN => "DUALOPEND_AWAITING_LOCKIN", ListpeerchannelsChannelsState::CHANNELD_AWAITING_SPLICE => "CHANNELD_AWAITING_SPLICE", + ListpeerchannelsChannelsState::DUALOPEND_OPEN_COMMITTED => "DUALOPEND_OPEN_COMMITTED", }.to_string() } } diff --git a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py index 66b0187161b7..7741da55a5a2 100644 --- a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py +++ b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py @@ -14,7 +14,7 @@ from pyln.grpc import primitives_pb2 as primitives__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nnode.proto\x12\x03\x63ln\x1a\x10primitives.proto\"\x10\n\x0eGetinfoRequest\"\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(\rH\x00\x88\x01\x01\x12\x13\n\x06\x66romid\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x66uzzpercent\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\x07 \x03(\t\x12\x14\n\x07maxhops\x18\x08 \x01(\rH\x03\x88\x01\x01\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') +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\"\xf4\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\"\xbf\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\n\x12\x1c\n\x18\x44UALOPEND_OPEN_COMMITTED\x10\x0b\x42\x0f\n\r_scratch_txidB\n\n\x08_feerateB\x08\n\x06_ownerB\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x0f\n\r_funding_txidB\x11\n\x0f_funding_outnumB\x12\n\x10_initial_feerateB\x0f\n\r_last_feerateB\x0f\n\r_next_feerateB\x10\n\x0e_next_fee_stepB\x0b\n\t_close_toB\n\n\x08_privateB\t\n\x07_closerB\n\n\x08_fundingB\r\n\x0b_to_us_msatB\x11\n\x0f_min_to_us_msatB\x11\n\x0f_max_to_us_msatB\r\n\x0b_total_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x12\n\x10_dust_limit_msatB\x19\n\x17_max_total_htlc_in_msatB\x15\n\x13_their_reserve_msatB\x13\n\x11_our_reserve_msatB\x11\n\x0f_spendable_msatB\x12\n\x10_receivable_msatB\x17\n\x15_minimum_htlc_in_msatB\x18\n\x16_minimum_htlc_out_msatB\x18\n\x16_maximum_htlc_out_msatB\x16\n\x14_their_to_self_delayB\x14\n\x12_our_to_self_delayB\x15\n\x13_max_accepted_htlcsB\x08\n\x06_aliasB\x16\n\x14_in_payments_offeredB\x12\n\x10_in_offered_msatB\x18\n\x16_in_payments_fulfilledB\x14\n\x12_in_fulfilled_msatB\x17\n\x15_out_payments_offeredB\x13\n\x11_out_offered_msatB\x19\n\x17_out_payments_fulfilledB\x15\n\x13_out_fulfilled_msatB\x10\n\x0e_close_to_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\"\xb9\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\"\xdf\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\x12\x1c\n\x18\x44UALOPEND_OPEN_COMMITTED\x10\x0c\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(\rH\x00\x88\x01\x01\x12\x13\n\x06\x66romid\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x66uzzpercent\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\x07 \x03(\t\x12\x14\n\x07maxhops\x18\x08 \x01(\rH\x03\x88\x01\x01\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) @@ -46,397 +46,397 @@ _globals['_LISTPEERSPEERSLOG_LISTPEERSPEERSLOGTYPE']._serialized_start=1804 _globals['_LISTPEERSPEERSLOG_LISTPEERSPEERSLOGTYPE']._serialized_end=1909 _globals['_LISTPEERSPEERSCHANNELS']._serialized_start=1977 - _globals['_LISTPEERSPEERSCHANNELS']._serialized_end=5007 + _globals['_LISTPEERSPEERSCHANNELS']._serialized_end=5037 _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 + _globals['_LISTPEERSPEERSCHANNELS_LISTPEERSPEERSCHANNELSSTATE']._serialized_end=4196 + _globals['_LISTPEERSPEERSCHANNELSFEERATE']._serialized_start=5039 + _globals['_LISTPEERSPEERSCHANNELSFEERATE']._serialized_end=5100 + _globals['_LISTPEERSPEERSCHANNELSINFLIGHT']._serialized_start=5103 + _globals['_LISTPEERSPEERSCHANNELSINFLIGHT']._serialized_end=5346 + _globals['_LISTPEERSPEERSCHANNELSFUNDING']._serialized_start=5349 + _globals['_LISTPEERSPEERSCHANNELSFUNDING']._serialized_end=5632 + _globals['_LISTPEERSPEERSCHANNELSALIAS']._serialized_start=5634 + _globals['_LISTPEERSPEERSCHANNELSALIAS']._serialized_end=5725 + _globals['_LISTPEERSPEERSCHANNELSHTLCS']._serialized_start=5728 + _globals['_LISTPEERSPEERSCHANNELSHTLCS']._serialized_end=6097 + _globals['_LISTPEERSPEERSCHANNELSHTLCS_LISTPEERSPEERSCHANNELSHTLCSDIRECTION']._serialized_start=6013 + _globals['_LISTPEERSPEERSCHANNELSHTLCS_LISTPEERSPEERSCHANNELSHTLCSDIRECTION']._serialized_end=6068 + _globals['_LISTFUNDSREQUEST']._serialized_start=6099 + _globals['_LISTFUNDSREQUEST']._serialized_end=6147 + _globals['_LISTFUNDSRESPONSE']._serialized_start=6149 + _globals['_LISTFUNDSRESPONSE']._serialized_end=6250 + _globals['_LISTFUNDSOUTPUTS']._serialized_start=6253 + _globals['_LISTFUNDSOUTPUTS']._serialized_end=6640 + _globals['_LISTFUNDSOUTPUTS_LISTFUNDSOUTPUTSSTATUS']._serialized_start=6514 + _globals['_LISTFUNDSOUTPUTS_LISTFUNDSOUTPUTSSTATUS']._serialized_end=6595 + _globals['_LISTFUNDSCHANNELS']._serialized_start=6643 + _globals['_LISTFUNDSCHANNELS']._serialized_end=6942 + _globals['_SENDPAYREQUEST']._serialized_start=6945 + _globals['_SENDPAYREQUEST']._serialized_end=7294 + _globals['_SENDPAYRESPONSE']._serialized_start=7297 + _globals['_SENDPAYRESPONSE']._serialized_end=7890 + _globals['_SENDPAYRESPONSE_SENDPAYSTATUS']._serialized_start=7711 + _globals['_SENDPAYRESPONSE_SENDPAYSTATUS']._serialized_end=7753 + _globals['_SENDPAYROUTE']._serialized_start=7892 + _globals['_SENDPAYROUTE']._serialized_end=7984 + _globals['_LISTCHANNELSREQUEST']._serialized_start=7987 + _globals['_LISTCHANNELSREQUEST']._serialized_end=8134 + _globals['_LISTCHANNELSRESPONSE']._serialized_start=8136 + _globals['_LISTCHANNELSRESPONSE']._serialized_end=8203 + _globals['_LISTCHANNELSCHANNELS']._serialized_start=8206 + _globals['_LISTCHANNELSCHANNELS']._serialized_end=8641 + _globals['_ADDGOSSIPREQUEST']._serialized_start=8643 + _globals['_ADDGOSSIPREQUEST']._serialized_end=8678 + _globals['_ADDGOSSIPRESPONSE']._serialized_start=8680 + _globals['_ADDGOSSIPRESPONSE']._serialized_end=8699 + _globals['_AUTOCLEANINVOICEREQUEST']._serialized_start=8701 + _globals['_AUTOCLEANINVOICEREQUEST']._serialized_end=8812 + _globals['_AUTOCLEANINVOICERESPONSE']._serialized_start=8815 + _globals['_AUTOCLEANINVOICERESPONSE']._serialized_end=8944 + _globals['_CHECKMESSAGEREQUEST']._serialized_start=8946 + _globals['_CHECKMESSAGEREQUEST']._serialized_end=9031 + _globals['_CHECKMESSAGERESPONSE']._serialized_start=9033 + _globals['_CHECKMESSAGERESPONSE']._serialized_end=9089 + _globals['_CLOSEREQUEST']._serialized_start=9092 + _globals['_CLOSEREQUEST']._serialized_end=9423 + _globals['_CLOSERESPONSE']._serialized_start=9426 + _globals['_CLOSERESPONSE']._serialized_end=9597 + _globals['_CLOSERESPONSE_CLOSETYPE']._serialized_start=9528 + _globals['_CLOSERESPONSE_CLOSETYPE']._serialized_end=9581 + _globals['_CONNECTREQUEST']._serialized_start=9599 + _globals['_CONNECTREQUEST']._serialized_end=9683 + _globals['_CONNECTRESPONSE']._serialized_start=9686 + _globals['_CONNECTRESPONSE']._serialized_end=9866 + _globals['_CONNECTRESPONSE_CONNECTDIRECTION']._serialized_start=9831 + _globals['_CONNECTRESPONSE_CONNECTDIRECTION']._serialized_end=9866 + _globals['_CONNECTADDRESS']._serialized_start=9869 + _globals['_CONNECTADDRESS']._serialized_end=10120 + _globals['_CONNECTADDRESS_CONNECTADDRESSTYPE']._serialized_start=10008 + _globals['_CONNECTADDRESS_CONNECTADDRESSTYPE']._serialized_end=10088 + _globals['_CREATEINVOICEREQUEST']._serialized_start=10122 + _globals['_CREATEINVOICEREQUEST']._serialized_end=10196 + _globals['_CREATEINVOICERESPONSE']._serialized_start=10199 + _globals['_CREATEINVOICERESPONSE']._serialized_end=10886 + _globals['_CREATEINVOICERESPONSE_CREATEINVOICESTATUS']._serialized_start=10661 + _globals['_CREATEINVOICERESPONSE_CREATEINVOICESTATUS']._serialized_end=10717 + _globals['_DATASTOREREQUEST']._serialized_start=10889 + _globals['_DATASTOREREQUEST']._serialized_end=11197 + _globals['_DATASTOREREQUEST_DATASTOREMODE']._serialized_start=11042 + _globals['_DATASTOREREQUEST_DATASTOREMODE']._serialized_end=11154 + _globals['_DATASTORERESPONSE']._serialized_start=11200 + _globals['_DATASTORERESPONSE']._serialized_end=11330 + _globals['_CREATEONIONREQUEST']._serialized_start=11333 + _globals['_CREATEONIONREQUEST']._serialized_end=11490 + _globals['_CREATEONIONRESPONSE']._serialized_start=11492 + _globals['_CREATEONIONRESPONSE']._serialized_end=11552 + _globals['_CREATEONIONHOPS']._serialized_start=11554 + _globals['_CREATEONIONHOPS']._serialized_end=11604 + _globals['_DELDATASTOREREQUEST']._serialized_start=11606 + _globals['_DELDATASTOREREQUEST']._serialized_end=11680 + _globals['_DELDATASTORERESPONSE']._serialized_start=11683 + _globals['_DELDATASTORERESPONSE']._serialized_end=11816 + _globals['_DELEXPIREDINVOICEREQUEST']._serialized_start=11818 + _globals['_DELEXPIREDINVOICEREQUEST']._serialized_end=11890 + _globals['_DELEXPIREDINVOICERESPONSE']._serialized_start=11892 + _globals['_DELEXPIREDINVOICERESPONSE']._serialized_end=11919 + _globals['_DELINVOICEREQUEST']._serialized_start=11922 + _globals['_DELINVOICEREQUEST']._serialized_end=12104 + _globals['_DELINVOICEREQUEST_DELINVOICESTATUS']._serialized_start=12038 + _globals['_DELINVOICEREQUEST_DELINVOICESTATUS']._serialized_end=12091 + _globals['_DELINVOICERESPONSE']._serialized_start=12107 + _globals['_DELINVOICERESPONSE']._serialized_end=12652 + _globals['_DELINVOICERESPONSE_DELINVOICESTATUS']._serialized_start=12038 + _globals['_DELINVOICERESPONSE_DELINVOICESTATUS']._serialized_end=12091 + _globals['_INVOICEREQUEST']._serialized_start=12655 + _globals['_INVOICEREQUEST']._serialized_end=12905 + _globals['_INVOICERESPONSE']._serialized_start=12908 + _globals['_INVOICERESPONSE']._serialized_end=13313 + _globals['_LISTDATASTOREREQUEST']._serialized_start=13315 + _globals['_LISTDATASTOREREQUEST']._serialized_end=13350 + _globals['_LISTDATASTORERESPONSE']._serialized_start=13352 + _globals['_LISTDATASTORERESPONSE']._serialized_end=13423 + _globals['_LISTDATASTOREDATASTORE']._serialized_start=13426 + _globals['_LISTDATASTOREDATASTORE']._serialized_end=13561 + _globals['_LISTINVOICESREQUEST']._serialized_start=13564 + _globals['_LISTINVOICESREQUEST']._serialized_end=13914 + _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_start=13785 + _globals['_LISTINVOICESREQUEST_LISTINVOICESINDEX']._serialized_end=13830 + _globals['_LISTINVOICESRESPONSE']._serialized_start=13916 + _globals['_LISTINVOICESRESPONSE']._serialized_end=13983 + _globals['_LISTINVOICESINVOICES']._serialized_start=13986 + _globals['_LISTINVOICESINVOICES']._serialized_end=14752 + _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_start=14486 + _globals['_LISTINVOICESINVOICES_LISTINVOICESINVOICESSTATUS']._serialized_end=14549 + _globals['_SENDONIONREQUEST']._serialized_start=14755 + _globals['_SENDONIONREQUEST']._serialized_end=15149 + _globals['_SENDONIONRESPONSE']._serialized_start=15152 + _globals['_SENDONIONRESPONSE']._serialized_end=15675 + _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_start=15523 + _globals['_SENDONIONRESPONSE_SENDONIONSTATUS']._serialized_end=15567 + _globals['_SENDONIONFIRST_HOP']._serialized_start=15677 + _globals['_SENDONIONFIRST_HOP']._serialized_end=15758 + _globals['_LISTSENDPAYSREQUEST']._serialized_start=15761 + _globals['_LISTSENDPAYSREQUEST']._serialized_end=15996 + _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_start=15898 + _globals['_LISTSENDPAYSREQUEST_LISTSENDPAYSSTATUS']._serialized_end=15957 + _globals['_LISTSENDPAYSRESPONSE']._serialized_start=15998 + _globals['_LISTSENDPAYSRESPONSE']._serialized_end=16065 + _globals['_LISTSENDPAYSPAYMENTS']._serialized_start=16068 + _globals['_LISTSENDPAYSPAYMENTS']._serialized_end=16696 + _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_start=16502 + _globals['_LISTSENDPAYSPAYMENTS_LISTSENDPAYSPAYMENTSSTATUS']._serialized_end=16569 + _globals['_LISTTRANSACTIONSREQUEST']._serialized_start=16698 + _globals['_LISTTRANSACTIONSREQUEST']._serialized_end=16723 + _globals['_LISTTRANSACTIONSRESPONSE']._serialized_start=16725 + _globals['_LISTTRANSACTIONSRESPONSE']._serialized_end=16808 + _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_start=16811 + _globals['_LISTTRANSACTIONSTRANSACTIONS']._serialized_end=17059 + _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_start=17061 + _globals['_LISTTRANSACTIONSTRANSACTIONSINPUTS']._serialized_end=17144 + _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_start=17146 + _globals['_LISTTRANSACTIONSTRANSACTIONSOUTPUTS']._serialized_end=17254 + _globals['_PAYREQUEST']._serialized_start=17257 + _globals['_PAYREQUEST']._serialized_end=17731 + _globals['_PAYRESPONSE']._serialized_start=17734 + _globals['_PAYRESPONSE']._serialized_end=18113 + _globals['_PAYRESPONSE_PAYSTATUS']._serialized_start=18016 + _globals['_PAYRESPONSE_PAYSTATUS']._serialized_end=18066 + _globals['_LISTNODESREQUEST']._serialized_start=18115 + _globals['_LISTNODESREQUEST']._serialized_end=18157 + _globals['_LISTNODESRESPONSE']._serialized_start=18159 + _globals['_LISTNODESRESPONSE']._serialized_end=18214 + _globals['_LISTNODESNODES']._serialized_start=18217 + _globals['_LISTNODESNODES']._serialized_end=18442 + _globals['_LISTNODESNODESADDRESSES']._serialized_start=18445 + _globals['_LISTNODESNODESADDRESSES']._serialized_end=18677 + _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_start=18585 + _globals['_LISTNODESNODESADDRESSES_LISTNODESNODESADDRESSESTYPE']._serialized_end=18665 + _globals['_WAITANYINVOICEREQUEST']._serialized_start=18679 + _globals['_WAITANYINVOICEREQUEST']._serialized_end=18782 + _globals['_WAITANYINVOICERESPONSE']._serialized_start=18785 + _globals['_WAITANYINVOICERESPONSE']._serialized_end=19408 + _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_start=19217 + _globals['_WAITANYINVOICERESPONSE_WAITANYINVOICESTATUS']._serialized_end=19262 + _globals['_WAITINVOICEREQUEST']._serialized_start=19410 + _globals['_WAITINVOICEREQUEST']._serialized_end=19445 + _globals['_WAITINVOICERESPONSE']._serialized_start=19448 + _globals['_WAITINVOICERESPONSE']._serialized_end=20059 + _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_start=19871 + _globals['_WAITINVOICERESPONSE_WAITINVOICESTATUS']._serialized_end=19913 + _globals['_WAITSENDPAYREQUEST']._serialized_start=20062 + _globals['_WAITSENDPAYREQUEST']._serialized_end=20204 + _globals['_WAITSENDPAYRESPONSE']._serialized_start=20207 + _globals['_WAITSENDPAYRESPONSE']._serialized_end=20769 + _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_start=20611 + _globals['_WAITSENDPAYRESPONSE_WAITSENDPAYSTATUS']._serialized_end=20644 + _globals['_NEWADDRREQUEST']._serialized_start=20772 + _globals['_NEWADDRREQUEST']._serialized_end=20923 + _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_start=20856 + _globals['_NEWADDRREQUEST_NEWADDRADDRESSTYPE']._serialized_end=20907 + _globals['_NEWADDRRESPONSE']._serialized_start=20925 + _globals['_NEWADDRRESPONSE']._serialized_end=21044 + _globals['_WITHDRAWREQUEST']._serialized_start=21047 + _globals['_WITHDRAWREQUEST']._serialized_end=21249 + _globals['_WITHDRAWRESPONSE']._serialized_start=21251 + _globals['_WITHDRAWRESPONSE']._serialized_end=21309 + _globals['_KEYSENDREQUEST']._serialized_start=21312 + _globals['_KEYSENDREQUEST']._serialized_end=21698 + _globals['_KEYSENDRESPONSE']._serialized_start=21701 + _globals['_KEYSENDRESPONSE']._serialized_end=22071 + _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_start=21995 + _globals['_KEYSENDRESPONSE_KEYSENDSTATUS']._serialized_end=22024 + _globals['_FUNDPSBTREQUEST']._serialized_start=22074 + _globals['_FUNDPSBTREQUEST']._serialized_end=22494 + _globals['_FUNDPSBTRESPONSE']._serialized_start=22497 + _globals['_FUNDPSBTRESPONSE']._serialized_end=22714 + _globals['_FUNDPSBTRESERVATIONS']._serialized_start=22716 + _globals['_FUNDPSBTRESERVATIONS']._serialized_end=22833 + _globals['_SENDPSBTREQUEST']._serialized_start=22835 + _globals['_SENDPSBTREQUEST']._serialized_end=22900 + _globals['_SENDPSBTRESPONSE']._serialized_start=22902 + _globals['_SENDPSBTRESPONSE']._serialized_end=22946 + _globals['_SIGNPSBTREQUEST']._serialized_start=22948 + _globals['_SIGNPSBTREQUEST']._serialized_end=22997 + _globals['_SIGNPSBTRESPONSE']._serialized_start=22999 + _globals['_SIGNPSBTRESPONSE']._serialized_end=23038 + _globals['_UTXOPSBTREQUEST']._serialized_start=23041 + _globals['_UTXOPSBTREQUEST']._serialized_end=23452 + _globals['_UTXOPSBTRESPONSE']._serialized_start=23455 + _globals['_UTXOPSBTRESPONSE']._serialized_end=23672 + _globals['_UTXOPSBTRESERVATIONS']._serialized_start=23674 + _globals['_UTXOPSBTRESERVATIONS']._serialized_end=23791 + _globals['_TXDISCARDREQUEST']._serialized_start=23793 + _globals['_TXDISCARDREQUEST']._serialized_end=23825 + _globals['_TXDISCARDRESPONSE']._serialized_start=23827 + _globals['_TXDISCARDRESPONSE']._serialized_end=23881 + _globals['_TXPREPAREREQUEST']._serialized_start=23884 + _globals['_TXPREPAREREQUEST']._serialized_end=24048 + _globals['_TXPREPARERESPONSE']._serialized_start=24050 + _globals['_TXPREPARERESPONSE']._serialized_end=24118 + _globals['_TXSENDREQUEST']._serialized_start=24120 + _globals['_TXSENDREQUEST']._serialized_end=24149 + _globals['_TXSENDRESPONSE']._serialized_start=24151 + _globals['_TXSENDRESPONSE']._serialized_end=24207 + _globals['_LISTPEERCHANNELSREQUEST']._serialized_start=24209 + _globals['_LISTPEERCHANNELSREQUEST']._serialized_end=24258 + _globals['_LISTPEERCHANNELSRESPONSE']._serialized_start=24260 + _globals['_LISTPEERCHANNELSRESPONSE']._serialized_end=24335 + _globals['_LISTPEERCHANNELSCHANNELS']._serialized_start=24338 + _globals['_LISTPEERCHANNELSCHANNELS']._serialized_end=27595 + _globals['_LISTPEERCHANNELSCHANNELS_LISTPEERCHANNELSCHANNELSSTATE']._serialized_start=26329 + _globals['_LISTPEERCHANNELSCHANNELS_LISTPEERCHANNELSCHANNELSSTATE']._serialized_end=26680 + _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_start=27597 + _globals['_LISTPEERCHANNELSCHANNELSFEERATE']._serialized_end=27690 + _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_start=27693 + _globals['_LISTPEERCHANNELSCHANNELSINFLIGHT']._serialized_end=28077 + _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_start=28080 + _globals['_LISTPEERCHANNELSCHANNELSFUNDING']._serialized_end=28418 + _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_start=28420 + _globals['_LISTPEERCHANNELSCHANNELSALIAS']._serialized_end=28513 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_start=28516 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS']._serialized_end=28998 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_start=28837 + _globals['_LISTPEERCHANNELSCHANNELSHTLCS_LISTPEERCHANNELSCHANNELSHTLCSDIRECTION']._serialized_end=28894 + _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_start=29000 + _globals['_LISTCLOSEDCHANNELSREQUEST']._serialized_end=29051 + _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_start=29053 + _globals['_LISTCLOSEDCHANNELSRESPONSE']._serialized_end=29144 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_start=29147 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS']._serialized_end=30349 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSE_CAUSE']._serialized_start=30047 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELS_LISTCLOSEDCHANNELSCLOSEDCHANNELSCLOSE_CAUSE']._serialized_end=30165 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_start=30351 + _globals['_LISTCLOSEDCHANNELSCLOSEDCHANNELSALIAS']._serialized_end=30452 + _globals['_DECODEPAYREQUEST']._serialized_start=30454 + _globals['_DECODEPAYREQUEST']._serialized_end=30530 + _globals['_DECODEPAYRESPONSE']._serialized_start=30533 + _globals['_DECODEPAYRESPONSE']._serialized_end=31058 + _globals['_DECODEPAYFALLBACKS']._serialized_start=31061 + _globals['_DECODEPAYFALLBACKS']._serialized_end=31259 + _globals['_DECODEPAYFALLBACKS_DECODEPAYFALLBACKSTYPE']._serialized_start=31182 + _globals['_DECODEPAYFALLBACKS_DECODEPAYFALLBACKSTYPE']._serialized_end=31250 + _globals['_DECODEPAYEXTRA']._serialized_start=31261 + _globals['_DECODEPAYEXTRA']._serialized_end=31304 + _globals['_DECODEREQUEST']._serialized_start=31306 + _globals['_DECODEREQUEST']._serialized_end=31337 + _globals['_DECODERESPONSE']._serialized_start=31340 + _globals['_DECODERESPONSE']._serialized_end=35606 + _globals['_DECODERESPONSE_DECODETYPE']._serialized_start=33908 + _globals['_DECODERESPONSE_DECODETYPE']._serialized_end=34016 + _globals['_DECODEOFFER_PATHS']._serialized_start=35608 + _globals['_DECODEOFFER_PATHS']._serialized_end=35668 + _globals['_DECODEOFFER_RECURRENCEPAYWINDOW']._serialized_start=35671 + _globals['_DECODEOFFER_RECURRENCEPAYWINDOW']._serialized_end=35809 + _globals['_DECODEINVOICE_PATHSPATH']._serialized_start=35811 + _globals['_DECODEINVOICE_PATHSPATH']._serialized_end=35895 + _globals['_DECODEINVOICE_FALLBACKS']._serialized_start=35897 + _globals['_DECODEINVOICE_FALLBACKS']._serialized_end=35986 + _globals['_DECODEFALLBACKS']._serialized_start=35988 + _globals['_DECODEFALLBACKS']._serialized_end=36107 + _globals['_DECODEEXTRA']._serialized_start=36109 + _globals['_DECODEEXTRA']._serialized_end=36149 + _globals['_DECODERESTRICTIONS']._serialized_start=36151 + _globals['_DECODERESTRICTIONS']._serialized_end=36210 + _globals['_DISCONNECTREQUEST']._serialized_start=36212 + _globals['_DISCONNECTREQUEST']._serialized_end=36273 + _globals['_DISCONNECTRESPONSE']._serialized_start=36275 + _globals['_DISCONNECTRESPONSE']._serialized_end=36295 + _globals['_FEERATESREQUEST']._serialized_start=36297 + _globals['_FEERATESREQUEST']._serialized_end=36404 + _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_start=36367 + _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_end=36404 + _globals['_FEERATESRESPONSE']._serialized_start=36407 + _globals['_FEERATESRESPONSE']._serialized_end=36691 + _globals['_FEERATESPERKB']._serialized_start=36694 + _globals['_FEERATESPERKB']._serialized_end=37161 + _globals['_FEERATESPERKBESTIMATES']._serialized_start=37164 + _globals['_FEERATESPERKBESTIMATES']._serialized_end=37314 + _globals['_FEERATESPERKW']._serialized_start=37317 + _globals['_FEERATESPERKW']._serialized_end=37784 + _globals['_FEERATESPERKWESTIMATES']._serialized_start=37787 + _globals['_FEERATESPERKWESTIMATES']._serialized_end=37937 + _globals['_FEERATESONCHAIN_FEE_ESTIMATES']._serialized_start=37940 + _globals['_FEERATESONCHAIN_FEE_ESTIMATES']._serialized_end=38223 + _globals['_FUNDCHANNELREQUEST']._serialized_start=38226 + _globals['_FUNDCHANNELREQUEST']._serialized_end=38711 + _globals['_FUNDCHANNELRESPONSE']._serialized_start=38714 + _globals['_FUNDCHANNELRESPONSE']._serialized_end=38869 + _globals['_GETROUTEREQUEST']._serialized_start=38872 + _globals['_GETROUTEREQUEST']._serialized_end=39108 + _globals['_GETROUTERESPONSE']._serialized_start=39110 + _globals['_GETROUTERESPONSE']._serialized_end=39163 + _globals['_GETROUTEROUTE']._serialized_start=39166 + _globals['_GETROUTEROUTE']._serialized_end=39363 + _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_start=39334 + _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_end=39363 + _globals['_LISTFORWARDSREQUEST']._serialized_start=39366 + _globals['_LISTFORWARDSREQUEST']._serialized_end=39624 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_start=39506 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_end=39582 + _globals['_LISTFORWARDSRESPONSE']._serialized_start=39626 + _globals['_LISTFORWARDSRESPONSE']._serialized_end=39693 + _globals['_LISTFORWARDSFORWARDS']._serialized_start=39696 + _globals['_LISTFORWARDSFORWARDS']._serialized_end=40302 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_start=40085 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_end=40169 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_start=40171 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_end=40219 + _globals['_LISTPAYSREQUEST']._serialized_start=40305 + _globals['_LISTPAYSREQUEST']._serialized_end=40524 + _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_start=40430 + _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_end=40485 + _globals['_LISTPAYSRESPONSE']._serialized_start=40526 + _globals['_LISTPAYSRESPONSE']._serialized_end=40577 + _globals['_LISTPAYSPAYS']._serialized_start=40580 + _globals['_LISTPAYSPAYS']._serialized_end=41219 + _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_start=40994 + _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_end=41053 + _globals['_LISTHTLCSREQUEST']._serialized_start=41221 + _globals['_LISTHTLCSREQUEST']._serialized_end=41263 + _globals['_LISTHTLCSRESPONSE']._serialized_start=41265 + _globals['_LISTHTLCSRESPONSE']._serialized_end=41320 + _globals['_LISTHTLCSHTLCS']._serialized_start=41323 + _globals['_LISTHTLCSHTLCS']._serialized_end=41588 + _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_start=41546 + _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_end=41588 + _globals['_PINGREQUEST']._serialized_start=41590 + _globals['_PINGREQUEST']._serialized_end=41679 + _globals['_PINGRESPONSE']._serialized_start=41681 + _globals['_PINGRESPONSE']._serialized_end=41711 + _globals['_SENDCUSTOMMSGREQUEST']._serialized_start=41713 + _globals['_SENDCUSTOMMSGREQUEST']._serialized_end=41765 + _globals['_SENDCUSTOMMSGRESPONSE']._serialized_start=41767 + _globals['_SENDCUSTOMMSGRESPONSE']._serialized_end=41806 + _globals['_SETCHANNELREQUEST']._serialized_start=41809 + _globals['_SETCHANNELREQUEST']._serialized_end=42107 + _globals['_SETCHANNELRESPONSE']._serialized_start=42109 + _globals['_SETCHANNELRESPONSE']._serialized_end=42172 + _globals['_SETCHANNELCHANNELS']._serialized_start=42175 + _globals['_SETCHANNELCHANNELS']._serialized_end=42633 + _globals['_SIGNINVOICEREQUEST']._serialized_start=42635 + _globals['_SIGNINVOICEREQUEST']._serialized_end=42674 + _globals['_SIGNINVOICERESPONSE']._serialized_start=42676 + _globals['_SIGNINVOICERESPONSE']._serialized_end=42713 + _globals['_SIGNMESSAGEREQUEST']._serialized_start=42715 + _globals['_SIGNMESSAGEREQUEST']._serialized_end=42752 + _globals['_SIGNMESSAGERESPONSE']._serialized_start=42754 + _globals['_SIGNMESSAGERESPONSE']._serialized_end=42824 + _globals['_STOPREQUEST']._serialized_start=42826 + _globals['_STOPREQUEST']._serialized_end=42839 + _globals['_STOPRESPONSE']._serialized_start=42841 + _globals['_STOPRESPONSE']._serialized_end=42855 + _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_start=42858 + _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_end=43025 + _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_start=43027 + _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_end=43054 + _globals['_PREAPPROVEINVOICEREQUEST']._serialized_start=43056 + _globals['_PREAPPROVEINVOICEREQUEST']._serialized_end=43114 + _globals['_PREAPPROVEINVOICERESPONSE']._serialized_start=43116 + _globals['_PREAPPROVEINVOICERESPONSE']._serialized_end=43143 + _globals['_STATICBACKUPREQUEST']._serialized_start=43145 + _globals['_STATICBACKUPREQUEST']._serialized_end=43166 + _globals['_STATICBACKUPRESPONSE']._serialized_start=43168 + _globals['_STATICBACKUPRESPONSE']._serialized_end=43203 + _globals['_NODE']._serialized_start=43206 + _globals['_NODE']._serialized_end=46933 # @@protoc_insertion_point(module_scope) diff --git a/doc/lightning-listfunds.7.md b/doc/lightning-listfunds.7.md index 30dcb85cb86d..44f2a31f14d4 100644 --- a/doc/lightning-listfunds.7.md +++ b/doc/lightning-listfunds.7.md @@ -46,7 +46,7 @@ On success, an object is returned, containing: - **funding\_txid** (txid): funding transaction id - **funding\_output** (u32): the 0-based index of the output in the funding transaction - **connected** (boolean): whether the channel peer is connected - - **state** (string): the channel state, in particular "CHANNELD\_NORMAL" means the channel can be used normally (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN") + - **state** (string): the channel state, in particular "CHANNELD\_NORMAL" means the channel can be used normally (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "DUALOPEND\_OPEN\_COMMITTED") - **channel\_id** (hash): The full channel\_id (funding txid Xored with output number) *(added v23.05)* If **state** is "CHANNELD\_NORMAL": @@ -74,4 +74,4 @@ RESOURCES Main web site: -[comment]: # ( SHA256STAMP:02deef0c91e587aafe3a4b75fa45075c7246566b4baf1e73e00564d36d5a38f4) +[comment]: # ( SHA256STAMP:f4b639bb4e7a4544e7015a67225c1ead6a2e0b9817eca5b328908576f1d17dd2) diff --git a/doc/lightning-listpeerchannels.7.md b/doc/lightning-listpeerchannels.7.md index 1b5acb79861c..265f305e24d7 100644 --- a/doc/lightning-listpeerchannels.7.md +++ b/doc/lightning-listpeerchannels.7.md @@ -26,7 +26,7 @@ On success, an object containing **channels** is returned. It is an array of ob - **peer\_id** (pubkey): Node Public key - **peer\_connected** (boolean): A boolean flag that is set to true if the peer is online -- **state** (string): the channel state, in particular "CHANNELD\_NORMAL" means the channel can be used normally (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "CHANNELD\_AWAITING\_SPLICE") +- **state** (string): the channel state, in particular "CHANNELD\_NORMAL" means the channel can be used normally (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "CHANNELD\_AWAITING\_SPLICE", "DUALOPEND\_OPEN\_COMMITTED") - **opener** (string): Who initiated the channel (one of "local", "remote") - **features** (array of strings): - BOLT #9 features which apply to this channel (one of "option\_static\_remotekey", "option\_anchor\_outputs", "option\_anchors\_zero\_fee\_htlc\_tx", "option\_scid\_alias", "option\_zeroconf") @@ -89,8 +89,8 @@ On success, an object containing **channels** is returned. It is an array of ob - **remote** (short\_channel\_id, optional): An alias assigned by the remote node to this channel, usable in routehints and invoices - **state\_changes** (array of objects, optional): Prior state changes: - **timestamp** (string): UTC timestamp of form YYYY-mm-ddTHH:MM:SS.%03dZ - - **old\_state** (string): Previous state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "CHANNELD\_AWAITING\_SPLICE") - - **new\_state** (string): New state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "CHANNELD\_AWAITING\_SPLICE") + - **old\_state** (string): Previous state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "DUALOPEND\_OPEN\_COMMITTED", "CHANNELD\_AWAITING\_SPLICE") + - **new\_state** (string): New state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "DUALOPEND\_OPEN\_COMMITTED", "CHANNELD\_AWAITING\_SPLICE") - **cause** (string): What caused the change (one of "unknown", "local", "user", "remote", "protocol", "onchain") - **message** (string): Human-readable explanation - **status** (array of strings, optional): @@ -196,4 +196,4 @@ Main web site: Lightning RFC site (BOLT \#9): -[comment]: # ( SHA256STAMP:e0b7cb41d6117b353d4895e7da9ae2a492614dd6c006177f0f0825ca721df7f5) +[comment]: # ( SHA256STAMP:c69bd45ebbfc508c0b3998d6b875993d321f26dc4e8ba88830999851623e5206) diff --git a/doc/lightning-listpeers.7.md b/doc/lightning-listpeers.7.md index 4f79be6b00b8..110f48f8de8e 100644 --- a/doc/lightning-listpeers.7.md +++ b/doc/lightning-listpeers.7.md @@ -66,7 +66,7 @@ On success, an object containing **peers** is returned. It is an array of objec - **node\_id** (pubkey): The peer this is associated with - **data** (hex): The IO which occurred - **channels** (array of objects, optional) **deprecated, removal in v23.11**: - - **state** (string): the channel state, in particular "CHANNELD\_NORMAL" means the channel can be used normally (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN") + - **state** (string): the channel state, in particular "CHANNELD\_NORMAL" means the channel can be used normally (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "DUALOPEND\_OPEN\_COMMITTED") - **opener** (string): Who initiated the channel (one of "local", "remote") - **features** (array of strings): - BOLT #9 features which apply to this channel (one of "option\_static\_remotekey", "option\_anchor\_outputs", "option\_scid\_alias", "option\_zeroconf") @@ -123,8 +123,8 @@ On success, an object containing **peers** is returned. It is an array of objec - **remote** (short\_channel\_id, optional): An alias assigned by the remote node to this channel, usable in routehints and invoices - **state\_changes** (array of objects, optional): Prior state changes: - **timestamp** (string): UTC timestamp of form YYYY-mm-ddTHH:MM:SS.%03dZ - - **old\_state** (string): Previous state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN") - - **new\_state** (string): New state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN") + - **old\_state** (string): Previous state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "DUALOPEND\_OPEN\_COMMITTED") + - **new\_state** (string): New state (one of "OPENINGD", "CHANNELD\_AWAITING\_LOCKIN", "CHANNELD\_NORMAL", "CHANNELD\_SHUTTING\_DOWN", "CLOSINGD\_SIGEXCHANGE", "CLOSINGD\_COMPLETE", "AWAITING\_UNILATERAL", "FUNDING\_SPEND\_SEEN", "ONCHAIN", "DUALOPEND\_OPEN\_INIT", "DUALOPEND\_AWAITING\_LOCKIN", "DUALOPEND\_OPEN\_COMMITTED") - **cause** (string): What caused the change (one of "unknown", "local", "user", "remote", "protocol", "onchain") - **message** (string): Human-readable explanation - **status** (array of strings, optional): @@ -399,4 +399,4 @@ Main web site: Lightning RFC site (BOLT \#9): -[comment]: # ( SHA256STAMP:7402bcd43be7c031c1e8e1ec7a4d58e94beb44ca48ba2f8f06e4ea908ab8940b) +[comment]: # ( SHA256STAMP:32075bc65e686b04617f4c1fa068b5fd0ac84afec057f06f19df6f56328d2dd9) diff --git a/doc/schemas/listfunds.schema.json b/doc/schemas/listfunds.schema.json index edd43fc74a0e..3602d2078c75 100644 --- a/doc/schemas/listfunds.schema.json +++ b/doc/schemas/listfunds.schema.json @@ -184,7 +184,8 @@ "FUNDING_SPEND_SEEN", "ONCHAIN", "DUALOPEND_OPEN_INIT", - "DUALOPEND_AWAITING_LOCKIN" + "DUALOPEND_AWAITING_LOCKIN", + "DUALOPEND_OPEN_COMMITTED" ], "description": "the channel state, in particular \"CHANNELD_NORMAL\" means the channel can be used normally" }, diff --git a/doc/schemas/listpeerchannels.schema.json b/doc/schemas/listpeerchannels.schema.json index b08970247c2b..4467a6609a71 100644 --- a/doc/schemas/listpeerchannels.schema.json +++ b/doc/schemas/listpeerchannels.schema.json @@ -42,7 +42,8 @@ "ONCHAIN", "DUALOPEND_OPEN_INIT", "DUALOPEND_AWAITING_LOCKIN", - "CHANNELD_AWAITING_SPLICE" + "CHANNELD_AWAITING_SPLICE", + "DUALOPEND_OPEN_COMMITTED" ], "description": "the channel state, in particular \"CHANNELD_NORMAL\" means the channel can be used normally" }, @@ -379,6 +380,7 @@ "ONCHAIN", "DUALOPEND_OPEN_INIT", "DUALOPEND_AWAITING_LOCKIN", + "DUALOPEND_OPEN_COMMITTED", "CHANNELD_AWAITING_SPLICE" ], "description": "Previous state" @@ -397,6 +399,7 @@ "ONCHAIN", "DUALOPEND_OPEN_INIT", "DUALOPEND_AWAITING_LOCKIN", + "DUALOPEND_OPEN_COMMITTED", "CHANNELD_AWAITING_SPLICE" ], "description": "New state" diff --git a/doc/schemas/listpeers.schema.json b/doc/schemas/listpeers.schema.json index a30cbb44da7f..6a6a353f80ad 100644 --- a/doc/schemas/listpeers.schema.json +++ b/doc/schemas/listpeers.schema.json @@ -196,7 +196,8 @@ "FUNDING_SPEND_SEEN", "ONCHAIN", "DUALOPEND_OPEN_INIT", - "DUALOPEND_AWAITING_LOCKIN" + "DUALOPEND_AWAITING_LOCKIN", + "DUALOPEND_OPEN_COMMITTED" ], "description": "the channel state, in particular \"CHANNELD_NORMAL\" means the channel can be used normally" }, @@ -493,7 +494,8 @@ "FUNDING_SPEND_SEEN", "ONCHAIN", "DUALOPEND_OPEN_INIT", - "DUALOPEND_AWAITING_LOCKIN" + "DUALOPEND_AWAITING_LOCKIN", + "DUALOPEND_OPEN_COMMITTED" ], "description": "Previous state" }, @@ -510,7 +512,8 @@ "FUNDING_SPEND_SEEN", "ONCHAIN", "DUALOPEND_OPEN_INIT", - "DUALOPEND_AWAITING_LOCKIN" + "DUALOPEND_AWAITING_LOCKIN", + "DUALOPEND_OPEN_COMMITTED" ], "description": "New state" }, From cf373f9b06953cb8496f2cde30634fcd4c071ff3 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:51 +1030 Subject: [PATCH 19/28] lightningd: split DUALOPEND_OPEN_INIT into DUALOPEND_OPEN_INIT and DUALOPEND_OPEN_COMMITTED. The latter is used when we're put in the db, the former is the uncommitted state. Currently dbid == 0 is used in addition to the state, which is unwieldy. Signed-off-by: Rusty Russell Changelog-Experimental: JSON-RPC: added new dual-funding state `DUALOPEND_OPEN_COMMITTED` --- lightningd/channel.h | 22 +++++++----- lightningd/channel_state.h | 13 ++++--- lightningd/closing_control.c | 2 ++ lightningd/coin_mvts.c | 1 + lightningd/dual_open_control.c | 20 +++++++++-- lightningd/peer_control.c | 9 ++++- tests/test_connection.py | 2 +- tests/test_opening.py | 4 +-- tests/test_plugin.py | 65 ++++++++++++++++++++++++---------- wallet/wallet.h | 7 ++-- 10 files changed, 104 insertions(+), 41 deletions(-) diff --git a/lightningd/channel.h b/lightningd/channel.h index bcda5a547ebb..0e326723e2a0 100644 --- a/lightningd/channel.h +++ b/lightningd/channel.h @@ -415,6 +415,7 @@ static inline bool channel_can_add_htlc(const struct channel *channel) case ONCHAIN: case CLOSED: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: return false; case CHANNELD_NORMAL: @@ -436,6 +437,7 @@ static inline bool channel_can_remove_htlc(const struct channel *channel) case ONCHAIN: case CLOSED: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: return false; case CHANNELD_SHUTTING_DOWN: @@ -452,6 +454,7 @@ static inline bool channel_state_closing(enum channel_state state) case CHANNELD_AWAITING_LOCKIN: case CHANNELD_NORMAL: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: case CHANNELD_AWAITING_SPLICE: return false; @@ -478,6 +481,7 @@ static inline bool channel_state_fees_can_change(enum channel_state state) case ONCHAIN: case CLOSED: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: return false; case CHANNELD_NORMAL: @@ -499,6 +503,7 @@ static inline bool channel_state_failing_onchain(enum channel_state state) case CLOSINGD_COMPLETE: case CLOSED: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: return false; case AWAITING_UNILATERAL: @@ -514,6 +519,7 @@ static inline bool channel_state_pre_open(enum channel_state state) switch (state) { case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: return true; case CHANNELD_NORMAL: @@ -535,6 +541,7 @@ static inline bool channel_state_closed(enum channel_state state) switch (state) { case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: case CHANNELD_NORMAL: case CHANNELD_AWAITING_SPLICE: @@ -556,7 +563,8 @@ static inline bool channel_state_uncommitted(const struct channel *channel) { switch (channel->state) { case DUALOPEND_OPEN_INIT: - return channel->dbid == 0; + return true; + case DUALOPEND_OPEN_COMMITTED: case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_AWAITING_LOCKIN: case CHANNELD_NORMAL: @@ -576,18 +584,16 @@ static inline bool channel_state_uncommitted(const struct channel *channel) /* Established enough, that we could reach out to peer to discuss */ static inline bool channel_wants_peercomms(const struct channel *channel) { - if (channel_state_uncommitted(channel)) - return false; - switch (channel->state) { case CHANNELD_AWAITING_LOCKIN: - case DUALOPEND_OPEN_INIT: case DUALOPEND_AWAITING_LOCKIN: + case DUALOPEND_OPEN_COMMITTED: case CHANNELD_NORMAL: case CHANNELD_AWAITING_SPLICE: case CLOSINGD_SIGEXCHANGE: case CHANNELD_SHUTTING_DOWN: return true; + case DUALOPEND_OPEN_INIT: case CLOSINGD_COMPLETE: case AWAITING_UNILATERAL: case FUNDING_SPEND_SEEN: @@ -601,18 +607,16 @@ static inline bool channel_wants_peercomms(const struct channel *channel) /* Established enough, that we have to fail onto chain */ static inline bool channel_wants_onchain_fail(const struct channel *channel) { - if (channel_state_uncommitted(channel)) - return false; - switch (channel->state) { case CHANNELD_AWAITING_LOCKIN: - case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: case CHANNELD_NORMAL: case CHANNELD_AWAITING_SPLICE: case CLOSINGD_SIGEXCHANGE: case CHANNELD_SHUTTING_DOWN: return true; + case DUALOPEND_OPEN_INIT: case CLOSINGD_COMPLETE: case AWAITING_UNILATERAL: case FUNDING_SPEND_SEEN: diff --git a/lightningd/channel_state.h b/lightningd/channel_state.h index 8ba616fbeb7a..147c33015175 100644 --- a/lightningd/channel_state.h +++ b/lightningd/channel_state.h @@ -6,8 +6,12 @@ /* These are in the database, so don't renumber them! */ enum channel_state { + /* For dual-funded channels: goes to DUALOPEND_OPEN_COMMITTED + * after sigs have been exchanged */ + DUALOPEND_OPEN_INIT = 1, + /* In channeld, still waiting for lockin. */ - CHANNELD_AWAITING_LOCKIN = 2, + CHANNELD_AWAITING_LOCKIN, /* Normal operating state. */ CHANNELD_NORMAL, @@ -33,16 +37,15 @@ enum channel_state { /* Final state after we have fully settled on-chain */ CLOSED, - /* For dual-funded channels, we start at a different state. - * We transition to 'awaiting lockin' after sigs have - * been exchanged */ - DUALOPEND_OPEN_INIT, + /* Dual-funded initialized and committed. */ + DUALOPEND_OPEN_COMMITTED, /* Dual-funded channel, waiting for lock-in */ DUALOPEND_AWAITING_LOCKIN, /* Channel has started splice and is awaiting lock-in */ CHANNELD_AWAITING_SPLICE, + }; #define CHANNEL_STATE_MAX CHANNELD_AWAITING_SPLICE diff --git a/lightningd/closing_control.c b/lightningd/closing_control.c index ae95e807b0b9..9065a2a19670 100644 --- a/lightningd/closing_control.c +++ b/lightningd/closing_control.c @@ -570,6 +570,7 @@ static bool channel_state_can_close(const struct channel *channel) case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_AWAITING_LOCKIN: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case CLOSINGD_SIGEXCHANGE: case CHANNELD_SHUTTING_DOWN: return true; @@ -898,6 +899,7 @@ static struct command_result *json_close(struct command *cmd, break; case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case CLOSINGD_COMPLETE: case AWAITING_UNILATERAL: case FUNDING_SPEND_SEEN: diff --git a/lightningd/coin_mvts.c b/lightningd/coin_mvts.c index 67294ca421ad..c64f206ae65d 100644 --- a/lightningd/coin_mvts.c +++ b/lightningd/coin_mvts.c @@ -85,6 +85,7 @@ static bool report_chan_balance(const struct channel *chan) switch (chan->state) { case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: case CLOSINGD_COMPLETE: case AWAITING_UNILATERAL: diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 4b74125ad40e..56a8e6ba4247 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -1248,6 +1248,22 @@ wallet_commit_channel(struct lightningd *ld, assert(channel->unsaved_dbid != 0); channel->dbid = channel->unsaved_dbid; channel->unsaved_dbid = 0; + /* We can't call channel_set_state here: channel isn't in db, so + * really this is a "channel creation" event. */ + assert(channel->state == DUALOPEND_OPEN_INIT); + log_info(channel->log, "State changed from %s to %s", + channel_state_name(channel), + channel_state_str(DUALOPEND_OPEN_COMMITTED)); + channel->state = DUALOPEND_OPEN_COMMITTED; + notify_channel_state_changed(channel->peer->ld, + &channel->peer->id, + &channel->cid, + channel->scid, + time_now(), + DUALOPEND_OPEN_INIT, + DUALOPEND_OPEN_COMMITTED, + REASON_REMOTE, + "Commitment transaction committed"); channel->funding = *funding; channel->funding_sats = total_funding; @@ -1675,7 +1691,7 @@ static void handle_peer_tx_sigs_sent(struct subd *dualopend, send_funding_tx(channel, take(wtx)); /* Must be in an "init" state */ - assert(channel->state == DUALOPEND_OPEN_INIT + assert(channel->state == DUALOPEND_OPEN_COMMITTED || channel->state == DUALOPEND_AWAITING_LOCKIN); channel_set_state(channel, channel->state, @@ -2060,7 +2076,7 @@ static void handle_peer_tx_sigs_msg(struct subd *dualopend, send_funding_tx(channel, take(wtx)); - assert(channel->state == DUALOPEND_OPEN_INIT + assert(channel->state == DUALOPEND_OPEN_COMMITTED /* We might be reconnecting */ || channel->state == DUALOPEND_AWAITING_LOCKIN); channel_set_state(channel, channel->state, diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 7574a23d1832..1187181139bf 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -367,6 +367,7 @@ void resend_closing_transactions(struct lightningd *ld) case CHANNELD_AWAITING_LOCKIN: case CHANNELD_NORMAL: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: case CHANNELD_AWAITING_SPLICE: case CHANNELD_SHUTTING_DOWN: @@ -1168,6 +1169,7 @@ static void connect_activate_subd(struct lightningd *ld, struct channel *channel case FUNDING_SPEND_SEEN: case CLOSINGD_COMPLETE: case CLOSED: + case DUALOPEND_OPEN_INIT: /* Channel is active */ abort(); case AWAITING_UNILATERAL: @@ -1177,7 +1179,7 @@ static void connect_activate_subd(struct lightningd *ld, struct channel *channel "Awaiting unilateral close"); goto send_error; - case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: assert(!channel->owner); if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds) != 0) { @@ -1859,6 +1861,7 @@ static void subd_tell_depth(struct channel *channel, case ONCHAIN: case CLOSED: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: return; case CHANNELD_NORMAL: @@ -1911,6 +1914,7 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, case DUALOPEND_AWAITING_LOCKIN: case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: log_debug(channel->log, "Funding tx %s reorganized out!", type_to_string(tmpctx, struct bitcoin_txid, txid)); channel->scid = tal_free(channel->scid); @@ -2022,6 +2026,7 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, return DELETE_WATCH; case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: /* You cannot be watching yet */ abort(); @@ -2576,6 +2581,7 @@ static struct command_result *json_getinfo(struct command *cmd, switch (channel->state) { case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: pending_channels++; continue; @@ -2797,6 +2803,7 @@ static bool channel_state_can_setchannel(enum channel_state state) case DUALOPEND_AWAITING_LOCKIN: return true; case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: case CLOSINGD_SIGEXCHANGE: case CHANNELD_SHUTTING_DOWN: case CLOSINGD_COMPLETE: diff --git a/tests/test_connection.py b/tests/test_connection.py index efb14094a3ce..001b844b88a1 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -682,7 +682,7 @@ def test_reconnect_signed(node_factory): # Technically, this is async to fundchannel (and could reconnect first) if EXPERIMENTAL_DUAL_FUND: l1.daemon.wait_for_logs(['sendrawtx exit 0', - 'Peer has reconnected, state DUALOPEND_OPEN_INIT']) + 'Peer has reconnected, state DUALOPEND_OPEN_COMMITTED']) else: l1.daemon.wait_for_logs(['sendrawtx exit 0', 'Peer has reconnected, state CHANNELD_AWAITING_LOCKIN']) diff --git a/tests/test_opening.py b/tests/test_opening.py index 78037121da34..8a10fa846017 100644 --- a/tests/test_opening.py +++ b/tests/test_opening.py @@ -166,7 +166,7 @@ def test_v2_open_sigs_restart(node_factory, bitcoind): assert log psbt = re.search("psbt (.*)", log).group(1) - l1.daemon.wait_for_log('Peer has reconnected, state DUALOPEND_OPEN_INIT') + l1.daemon.wait_for_log('Peer has reconnected, state DUALOPEND_OPEN_COMMITTED') try: # FIXME: why do we need to retry signed? l1.rpc.openchannel_signed(chan_id, psbt) @@ -254,7 +254,7 @@ def test_v2_open_sigs_restart_while_dead(node_factory, bitcoind): assert log psbt = re.search("psbt (.*)", log).group(1) - l1.daemon.wait_for_log('Peer has reconnected, state DUALOPEND_OPEN_INIT') + l1.daemon.wait_for_log('Peer has reconnected, state DUALOPEND_OPEN_COMMITTED') try: # FIXME: why do we need to retry signed? l1.rpc.openchannel_signed(chan_id, psbt) diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 9e65a40474c9..b20836c77992 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -799,25 +799,47 @@ def wait_for_event(node): assert 'closer' not in l1.rpc.listpeerchannels()['channels'][0] assert 'closer' not in l2.rpc.listpeerchannels()['channels'][0] - event1 = wait_for_event(l1) - event2 = wait_for_event(l2) - assert(event1['peer_id'] == l2_id) # we only test these IDs the first time - assert(event1['channel_id'] == cid) - assert(event1['short_channel_id'] is None) # None until locked in - assert(event1['cause'] == "user") - - assert(event2['peer_id'] == l1_id) # we only test these IDs the first time - assert(event2['channel_id'] == cid) - assert(event2['short_channel_id'] is None) # None until locked in - assert(event2['cause'] == "remote") - - for ev in [event1, event2]: - # Dual funded channels - if l1.config('experimental-dual-fund'): + if l1.config('experimental-dual-fund'): + # Dual funded channels go through two state transitions. + event1a, event1b = wait_for_event(l1), wait_for_event(l1) + event2a, event2b = wait_for_event(l2), wait_for_event(l2) + + for ev in [event1a, event1b]: + assert(ev['peer_id'] == l2_id) # we only test these IDs the first time + assert(ev['channel_id'] == cid) + assert(ev['short_channel_id'] is None) # None until locked in + assert(event1a['cause'] == "remote") + assert(event1b['cause'] == "user") + + for ev in [event2a, event2b]: + assert(ev['peer_id'] == l1_id) # we only test these IDs the first time + assert(ev['channel_id'] == cid) + assert(ev['short_channel_id'] is None) # None until locked in + assert(ev['cause'] == "remote") + + for ev in [event1a, event2a]: assert(ev['old_state'] == "DUALOPEND_OPEN_INIT") + assert(ev['new_state'] == "DUALOPEND_OPEN_COMMITTED") + assert(ev['message'] == "Commitment transaction committed") + + for ev in [event1b, event2b]: + assert(ev['old_state'] == "DUALOPEND_OPEN_COMMITTED") assert(ev['new_state'] == "DUALOPEND_AWAITING_LOCKIN") assert(ev['message'] == "Sigs exchanged, waiting for lock-in") - else: + else: + event1 = wait_for_event(l1) + event2 = wait_for_event(l2) + assert(event1['peer_id'] == l2_id) # we only test these IDs the first time + assert(event1['channel_id'] == cid) + assert(event1['short_channel_id'] is None) # None until locked in + assert(event1['cause'] == "user") + + assert(event2['peer_id'] == l1_id) # we only test these IDs the first time + assert(event2['channel_id'] == cid) + assert(event2['short_channel_id'] is None) # None until locked in + assert(event2['cause'] == "remote") + + for ev in [event1, event2]: assert(ev['old_state'] == "unknown") assert(ev['new_state'] == "CHANNELD_AWAITING_LOCKIN") assert(ev['message'] == "new channel opened") @@ -942,8 +964,13 @@ def wait_for_event(node): if l2.config('experimental-dual-fund'): assert(event2['old_state'] == "DUALOPEND_OPEN_INIT") - assert(event2['new_state'] == "DUALOPEND_AWAITING_LOCKIN") - assert(event2['message'] == "Sigs exchanged, waiting for lock-in") + assert(event2['new_state'] == "DUALOPEND_OPEN_COMMITTED") + assert(event2['message'] == "Commitment transaction committed") + + event2 = wait_for_event(l2) + assert event2['old_state'] == "DUALOPEND_OPEN_COMMITTED" + assert event2['new_state'] == "DUALOPEND_AWAITING_LOCKIN" + assert event2['message'] == "Sigs exchanged, waiting for lock-in" else: assert(event2['old_state'] == "unknown") assert(event2['new_state'] == "CHANNELD_AWAITING_LOCKIN") @@ -1037,7 +1064,7 @@ def test_channel_state_change_history(node_factory, bitcoind): history = l1.rpc.listpeerchannels()['channels'][0]['state_changes'] if l1.config('experimental-dual-fund'): assert(history[0]['cause'] == "user") - assert(history[0]['old_state'] == "DUALOPEND_OPEN_INIT") + assert(history[0]['old_state'] == "DUALOPEND_OPEN_COMMITTED") assert(history[0]['new_state'] == "DUALOPEND_AWAITING_LOCKIN") assert(history[1]['cause'] == "user") assert(history[1]['old_state'] == "DUALOPEND_AWAITING_LOCKIN") diff --git a/wallet/wallet.h b/wallet/wallet.h index ff4b5db44305..a7512cad938d 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -303,8 +303,8 @@ static inline enum channel_state channel_state_in_db(enum channel_state s) case CLOSED: BUILD_ASSERT(CLOSED == 10); return s; - case DUALOPEND_OPEN_INIT: - BUILD_ASSERT(DUALOPEND_OPEN_INIT == 11); + case DUALOPEND_OPEN_COMMITTED: + BUILD_ASSERT(DUALOPEND_OPEN_COMMITTED == 11); return s; case DUALOPEND_AWAITING_LOCKIN: BUILD_ASSERT(DUALOPEND_AWAITING_LOCKIN == 12); @@ -312,6 +312,9 @@ static inline enum channel_state channel_state_in_db(enum channel_state s) case CHANNELD_AWAITING_SPLICE: BUILD_ASSERT(CHANNELD_AWAITING_SPLICE == 13); return s; + case DUALOPEND_OPEN_INIT: + /* Never appears in db! */ + break; } fatal("%s: %u is invalid", __func__, s); } From e326f85c26eea0744efa269b665f1b5db6baf970 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:51 +1030 Subject: [PATCH 20/28] lightningd: make channel-query functions all take state. It has the information we need, now. Signed-off-by: Rusty Russell --- lightningd/channel.c | 8 +++---- lightningd/channel.h | 22 ++++++++--------- lightningd/channel_control.c | 6 ++--- lightningd/closing_control.c | 6 ++--- lightningd/connect_control.c | 4 ++-- lightningd/dual_open_control.c | 14 +++++------ lightningd/opening_control.c | 2 +- lightningd/pay.c | 6 ++--- lightningd/peer_control.c | 26 ++++++++++----------- lightningd/peer_htlcs.c | 14 +++++------ lightningd/routehint.c | 2 +- lightningd/test/run-invoice-select-inchan.c | 2 +- wallet/walletrpc.c | 2 +- 13 files changed, 57 insertions(+), 57 deletions(-) diff --git a/lightningd/channel.c b/lightningd/channel.c index df24f52fad70..2dc3755d368d 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -590,13 +590,13 @@ const char *channel_state_str(enum channel_state state) } struct channel *peer_any_channel(struct peer *peer, - bool (*channel_state_filter)(const struct channel *), + bool (*channel_state_filter)(enum channel_state), bool *others) { struct channel *channel, *ret = NULL; list_for_each(&peer->channels, channel, list) { - if (channel_state_filter && !channel_state_filter(channel)) + if (channel_state_filter && !channel_state_filter(channel->state)) continue; /* Already found one? */ if (ret) { @@ -873,7 +873,7 @@ void channel_fail_permanent(struct channel *channel, /* Drop non-cooperatively (unilateral) to chain. */ drop_to_chain(ld, channel, false); - if (channel_wants_onchain_fail(channel)) + if (channel_state_wants_onchain_fail(channel->state)) channel_set_state(channel, channel->state, AWAITING_UNILATERAL, @@ -969,7 +969,7 @@ void channel_internal_error(struct channel *channel, const char *fmt, ...) channel_cleanup_commands(channel, why); /* Nothing ventured, nothing lost! */ - if (channel_state_uncommitted(channel)) { + if (channel_state_uncommitted(channel->state)) { channel_set_owner(channel, NULL); delete_channel(channel); tal_free(why); diff --git a/lightningd/channel.h b/lightningd/channel.h index 0e326723e2a0..0c707aef3c77 100644 --- a/lightningd/channel.h +++ b/lightningd/channel.h @@ -403,9 +403,9 @@ const char *channel_state_name(const struct channel *channel); const char *channel_state_str(enum channel_state state); /* Can this channel send an HTLC? */ -static inline bool channel_can_add_htlc(const struct channel *channel) +static inline bool channel_state_can_add_htlc(enum channel_state state) { - switch (channel->state) { + switch (state) { case CHANNELD_AWAITING_LOCKIN: case CHANNELD_SHUTTING_DOWN: case CLOSINGD_SIGEXCHANGE: @@ -426,9 +426,9 @@ static inline bool channel_can_add_htlc(const struct channel *channel) } /* Can this channel remove an HTLC? */ -static inline bool channel_can_remove_htlc(const struct channel *channel) +static inline bool channel_state_can_remove_htlc(enum channel_state state) { - switch (channel->state) { + switch (state) { case CHANNELD_AWAITING_LOCKIN: case CLOSINGD_SIGEXCHANGE: case CLOSINGD_COMPLETE: @@ -559,9 +559,9 @@ static inline bool channel_state_closed(enum channel_state state) } /* Not even int the database yet? */ -static inline bool channel_state_uncommitted(const struct channel *channel) +static inline bool channel_state_uncommitted(enum channel_state state) { - switch (channel->state) { + switch (state) { case DUALOPEND_OPEN_INIT: return true; case DUALOPEND_OPEN_COMMITTED: @@ -582,9 +582,9 @@ static inline bool channel_state_uncommitted(const struct channel *channel) } /* Established enough, that we could reach out to peer to discuss */ -static inline bool channel_wants_peercomms(const struct channel *channel) +static inline bool channel_state_wants_peercomms(enum channel_state state) { - switch (channel->state) { + switch (state) { case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_AWAITING_LOCKIN: case DUALOPEND_OPEN_COMMITTED: @@ -605,9 +605,9 @@ static inline bool channel_wants_peercomms(const struct channel *channel) } /* Established enough, that we have to fail onto chain */ -static inline bool channel_wants_onchain_fail(const struct channel *channel) +static inline bool channel_state_wants_onchain_fail(enum channel_state state) { - switch (channel->state) { + switch (state) { case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_OPEN_COMMITTED: case DUALOPEND_AWAITING_LOCKIN: @@ -659,7 +659,7 @@ const char *channel_change_state_reason_str(enum state_change reason); /* Find a channel which is passes filter, if any: sets *others if there * is more than one. */ struct channel *peer_any_channel(struct peer *peer, - bool (*channel_state_filter)(const struct channel *), + bool (*channel_state_filter)(enum channel_state), bool *others); struct channel *channel_by_dbid(struct lightningd *ld, const u64 dbid); diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index ab788fe32486..af91c20f4064 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -1585,7 +1585,7 @@ void channel_notify_new_block(struct lightningd *ld, peer; peer = peer_node_id_map_next(ld->peers, &it)) { list_for_each(&peer->channels, channel, list) { - if (channel_state_uncommitted(channel)) + if (channel_state_uncommitted(channel->state)) continue; if (is_fundee_should_forget(ld, channel, block_height)) { tal_arr_expand(&to_forget, channel); @@ -2010,7 +2010,7 @@ static struct command_result *json_dev_feerate(struct command *cmd, if (!peer) return command_fail(cmd, LIGHTNINGD, "Peer not connected"); - channel = peer_any_channel(peer, channel_can_add_htlc, &more_than_one); + channel = peer_any_channel(peer, channel_state_can_add_htlc, &more_than_one); if (!channel || !channel->owner) return command_fail(cmd, LIGHTNINGD, "Peer bad state"); /* This is a dev command: fix the api if you need this! */ @@ -2071,7 +2071,7 @@ static struct command_result *json_dev_quiesce(struct command *cmd, return command_fail(cmd, LIGHTNINGD, "Peer not connected"); /* FIXME: If this becomes a real API, check for OPT_QUIESCE! */ - channel = peer_any_channel(peer, channel_wants_peercomms, &more_than_one); + channel = peer_any_channel(peer, channel_state_wants_peercomms, &more_than_one); if (!channel || !channel->owner) return command_fail(cmd, LIGHTNINGD, "Peer bad state"); /* This is a dev command: fix the api if you need this! */ diff --git a/lightningd/closing_control.c b/lightningd/closing_control.c index 9065a2a19670..c0b8997b0e6b 100644 --- a/lightningd/closing_control.c +++ b/lightningd/closing_control.c @@ -562,9 +562,9 @@ struct some_channel { struct uncommitted_channel *uc; }; -static bool channel_state_can_close(const struct channel *channel) +static bool channel_state_can_close(enum channel_state state) { - switch (channel->state) { + switch (state) { case CHANNELD_NORMAL: case CHANNELD_AWAITING_SPLICE: case CHANNELD_AWAITING_LOCKIN: @@ -609,7 +609,7 @@ static struct command_result *param_channel_or_peer(struct command *cmd, if (res) return res; assert((*sc)->channel); - if (!channel_state_can_close((*sc)->channel)) + if (!channel_state_can_close((*sc)->channel->state)) return command_fail_badparam(cmd, name, buffer, tok, tal_fmt(tmpctx, "Channel in state %s", channel_state_name((*sc)->channel))); diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index 7784d6c14154..de7f2b4d59d9 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -355,7 +355,7 @@ static void try_connect(const tal_t *ctx, if (peer) { struct channel *channel; list_for_each(&peer->channels, channel, list) { - if (!channel_wants_peercomms(channel)) + if (!channel_state_wants_peercomms(channel->state)) continue; channel_set_billboard(channel, false, tal_fmt(tmpctx, @@ -425,7 +425,7 @@ static void connect_failed(struct lightningd *ld, /* If we have an active channel, then reconnect. */ peer = peer_by_id(ld, id); - if (peer && peer_any_channel(peer, channel_wants_peercomms, NULL)) { + if (peer && peer_any_channel(peer, channel_state_wants_peercomms, NULL)) { try_reconnect(peer, peer, addrhint); } else log_peer_debug(ld->log, id, "Not reconnecting: %s", diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 56a8e6ba4247..8e19c2671750 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -58,7 +58,7 @@ static void channel_disconnect(struct channel *channel, void channel_unsaved_close_conn(struct channel *channel, const char *why) { /* Gotta be unsaved */ - assert(channel_state_uncommitted(channel)); + assert(channel_state_uncommitted(channel->state)); log_info(channel->log, "Unsaved peer failed." " Disconnecting and deleting channel. Reason: %s", why); @@ -77,7 +77,7 @@ static void channel_saved_err_broken_reconn(struct channel *channel, const char *errmsg; /* We only reconnect to 'saved' channel peers */ - assert(!channel_state_uncommitted(channel)); + assert(!channel_state_uncommitted(channel->state)); va_start(ap, fmt); errmsg = tal_vfmt(tmpctx, fmt, ap); @@ -97,7 +97,7 @@ static void channel_err_broken(struct channel *channel, errmsg = tal_vfmt(tmpctx, fmt, ap); va_end(ap); - if (channel_state_uncommitted(channel)) { + if (channel_state_uncommitted(channel->state)) { log_broken(channel->log, "%s", errmsg); channel_unsaved_close_conn(channel, errmsg); } else @@ -1220,7 +1220,7 @@ wallet_commit_channel(struct lightningd *ld, { struct amount_msat our_msat, lease_fee_msat; struct channel_inflight *inflight; - bool any_active = peer_any_channel(channel->peer, channel_wants_peercomms, NULL); + bool any_active = peer_any_channel(channel->peer, channel_state_wants_peercomms, NULL); if (!amount_sat_to_msat(&our_msat, our_funding)) { log_broken(channel->log, "Unable to convert funds"); @@ -1390,7 +1390,7 @@ static void handle_peer_wants_to_close(struct subd *dualopend, OPT_ANCHORS_ZERO_FEE_HTLC_TX); /* We shouldn't get this message while we're waiting to finish */ - if (channel_state_uncommitted(channel)) { + if (channel_state_uncommitted(channel->state)) { log_broken(dualopend->ld->log, "Channel in wrong state for" " shutdown, still has uncommitted" " channel pending."); @@ -3620,7 +3620,7 @@ static void dualopen_errmsg(struct channel *channel, /* Clean up any in-progress open attempts */ channel_cleanup_commands(channel, desc); - if (channel_state_uncommitted(channel)) { + if (channel_state_uncommitted(channel->state)) { log_info(channel->log, "%s", "Unsaved peer failed." " Deleting channel."); delete_channel(channel); @@ -3785,7 +3785,7 @@ bool peer_restart_dualopend(struct peer *peer, u32 *local_shutdown_script_wallet_index; u8 *msg; - if (channel_state_uncommitted(channel)) + if (channel_state_uncommitted(channel->state)) return peer_start_dualopend(peer, peer_fd, channel); hsmfd = hsm_get_client_fd(peer->ld, &peer->id, channel->dbid, diff --git a/lightningd/opening_control.c b/lightningd/opening_control.c index 6f2be5c874ba..7c10942e30a8 100644 --- a/lightningd/opening_control.c +++ b/lightningd/opening_control.c @@ -112,7 +112,7 @@ wallet_commit_channel(struct lightningd *ld, u32 lease_start_blockheight = 0; /* No leases on v1 */ struct short_channel_id *alias_local; struct timeabs timestamp; - bool any_active = peer_any_channel(uc->peer, channel_wants_peercomms, NULL); + bool any_active = peer_any_channel(uc->peer, channel_state_wants_peercomms, NULL); /* We cannot both be the fundee *and* have a `fundchannel_start` * command running! diff --git a/lightningd/pay.c b/lightningd/pay.c index e74d92533f51..b483884328e1 100644 --- a/lightningd/pay.c +++ b/lightningd/pay.c @@ -847,12 +847,12 @@ find_channel_for_htlc_add(struct lightningd *ld, const struct node_id *node, return NULL; channel = find_channel_by_scid(peer, scid_or_alias); - if (channel && channel_can_add_htlc(channel)) { + if (channel && channel_state_can_add_htlc(channel->state)) { goto found; } channel = find_channel_by_alias(peer, scid_or_alias, LOCAL); - if (channel && channel_can_add_htlc(channel)) { + if (channel && channel_state_can_add_htlc(channel->state)) { goto found; } @@ -860,7 +860,7 @@ find_channel_for_htlc_add(struct lightningd *ld, const struct node_id *node, if (!channel && (ld->deprecated_apis || memeqzero(scid_or_alias, sizeof(*scid_or_alias)))) { list_for_each(&peer->channels, channel, list) { - if (channel_can_add_htlc(channel) && + if (channel_state_can_add_htlc(channel->state) && amount_msat_greater(channel->our_msat, *amount)) { goto found; } diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 1187181139bf..58e455426e21 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -176,10 +176,10 @@ static void peer_channels_cleanup(struct lightningd *ld, for (size_t i = 0; i < tal_count(channels); i++) { c = channels[i]; - if (channel_wants_peercomms(c)) { + if (channel_state_wants_peercomms(c->state)) { channel_cleanup_commands(c, "Disconnected"); channel_fail_transient(c, true, "Disconnected"); - } else if (channel_state_uncommitted(c)) { + } else if (channel_state_uncommitted(c->state)) { channel_unsaved_close_conn(c, "Disconnected"); } } @@ -398,7 +398,7 @@ void channel_errmsg(struct channel *channel, /* Clean up any in-progress open attempts */ channel_cleanup_commands(channel, desc); - if (channel_state_uncommitted(channel)) { + if (channel_state_uncommitted(channel->state)) { log_info(channel->log, "%s", "Unsaved peer failed." " Deleting channel."); delete_channel(channel); @@ -1298,7 +1298,7 @@ static void peer_connected_hook_final(struct peer_connected_hook_payload *payloa /* connect appropriate subds for all (active) channels! */ list_for_each(&peer->channels, channel, list) { /* FIXME: It can race by opening a channel before this! */ - if (channel_wants_peercomms(channel) && !channel->owner) { + if (channel_state_wants_peercomms(channel->state) && !channel->owner) { log_debug(channel->log, "Peer has reconnected, state %s: connecting subd", channel_state_name(channel)); @@ -1548,7 +1548,7 @@ void peer_spoke(struct lightningd *ld, const u8 *msg) /* If channel is active, we raced, so ignore this: * subd will get it soon. */ - if (channel_wants_peercomms(channel)) { + if (channel_state_wants_peercomms(channel->state)) { log_debug(channel->log, "channel already active"); if (!channel->owner && @@ -2167,7 +2167,7 @@ static void json_add_peer(struct lightningd *ld, json_add_uncommitted_channel(response, p->uncommitted_channel, NULL); list_for_each(&p->channels, channel, list) { - if (channel_state_uncommitted(channel)) + if (channel_state_uncommitted(channel->state)) json_add_unsaved_channel(response, channel, NULL); else json_add_channel(ld, response, NULL, channel, NULL); @@ -2286,7 +2286,7 @@ static void json_add_peerchannels(struct lightningd *ld, json_add_uncommitted_channel(response, peer->uncommitted_channel, peer); list_for_each(&peer->channels, channel, list) { - if (channel_state_uncommitted(channel)) + if (channel_state_uncommitted(channel->state)) json_add_unsaved_channel(response, channel, peer); else json_add_channel(ld, response, NULL, channel, peer); @@ -2356,7 +2356,7 @@ command_find_channel(struct command *cmd, peer; peer = peer_node_id_map_next(ld->peers, &it)) { list_for_each(&peer->channels, (*channel), list) { - if (!channel_wants_peercomms(*channel)) + if (!channel_state_wants_peercomms((*channel)->state)) continue; if (channel_id_eq(&(*channel)->cid, &cid)) return NULL; @@ -2384,7 +2384,7 @@ static void setup_peer(struct peer *peer, u32 delay) bool connect = false; list_for_each(&peer->channels, channel, list) { - if (channel_state_uncommitted(channel)) + if (channel_state_uncommitted(channel->state)) continue; /* Watching lockin may be unnecessary, but it's harmless. */ channel_watch_funding(ld, channel); @@ -2399,7 +2399,7 @@ static void setup_peer(struct peer *peer, u32 delay) channel_watch_inflight(ld, channel, inflight); } - if (channel_wants_peercomms(channel)) + if (channel_state_wants_peercomms(channel->state)) connect = true; } @@ -2521,7 +2521,7 @@ static struct command_result *json_disconnect(struct command *cmd, return command_fail(cmd, LIGHTNINGD, "Peer not connected"); } - channel = peer_any_channel(peer, channel_wants_peercomms, NULL); + channel = peer_any_channel(peer, channel_state_wants_peercomms, NULL); if (channel && !*force) { return command_fail(cmd, LIGHTNINGD, "Peer has (at least one) channel in state %s", @@ -3077,7 +3077,7 @@ static struct command_result *param_dev_channel(struct command *cmd, if (res) return res; - *channel = peer_any_channel(peer, channel_wants_peercomms, &more_than_one); + *channel = peer_any_channel(peer, channel_state_wants_peercomms, &more_than_one); if (!*channel) return command_fail_badparam(cmd, name, buffer, tok, "No channel with that peer"); @@ -3307,7 +3307,7 @@ static struct command_result *json_dev_forget_channel(struct command *cmd, "or `dev-fail` instead."); } - if (!channel_state_uncommitted(forget->channel)) + if (!channel_state_uncommitted(forget->channel->state)) bitcoind_getutxout(cmd->ld->topology->bitcoind, &forget->channel->funding, process_dev_forget_channel, forget); diff --git a/lightningd/peer_htlcs.c b/lightningd/peer_htlcs.c index a0710f1b0b96..ebbaa869e2dd 100644 --- a/lightningd/peer_htlcs.c +++ b/lightningd/peer_htlcs.c @@ -170,7 +170,7 @@ static void tell_channeld_htlc_failed(const struct htlc_in *hin, return; /* onchaind doesn't care, it can't do anything but wait */ - if (!channel_can_remove_htlc(hin->key.channel)) + if (!channel_state_can_remove_htlc(hin->key.channel->state)) return; subd_send_msg(hin->key.channel->owner, @@ -584,7 +584,7 @@ static void htlc_offer_timeout(struct htlc_out *out) assert(out->hstate == SENT_ADD_HTLC); /* If owner died, we should already be taken care of. */ - if (!channel->owner || !channel_can_add_htlc(channel)) + if (!channel->owner || !channel_state_can_add_htlc(channel->state)) return; log_unusual(channel->owner->log, @@ -611,7 +611,7 @@ const u8 *send_htlc_out(const tal_t *ctx, *houtp = NULL; - if (!channel_can_add_htlc(out)) { + if (!channel_state_can_add_htlc(out->state)) { log_info(out->log, "Attempt to send HTLC but not ready (%s)", channel_state_name(out)); return towire_unknown_next_peer(ctx); @@ -667,7 +667,7 @@ static struct channel *best_channel(struct lightningd *ld, /* Seek channel with largest spendable! */ list_for_each(&next_peer->channels, channel, list) { struct amount_msat spendable; - if (!channel_can_add_htlc(channel)) + if (!channel_state_can_add_htlc(channel->state)) continue; spendable = channel_amount_spendable(channel); if (!amount_msat_greater(spendable, best_spendable)) @@ -716,7 +716,7 @@ static void forward_htlc(struct htlc_in *hin, next = NULL; /* Unknown peer, or peer not ready. */ - if (!next || !channel_can_add_htlc(next)) { + if (!next || !channel_state_can_add_htlc(next->state)) { local_fail_in_htlc(hin, take(towire_unknown_next_peer(NULL))); wallet_forwarded_payment_add(hin->key.channel->peer->ld->wallet, hin, FORWARD_STYLE_TLV, @@ -1339,7 +1339,7 @@ static bool peer_accepted_htlc(const tal_t *ctx, * * - SHOULD fail to route any HTLC added after it has sent `shutdown`. */ - if (!channel_can_add_htlc(channel)) { + if (!channel_state_can_add_htlc(channel->state)) { *failmsg = towire_permanent_channel_failure(ctx); log_debug(channel->log, "Rejecting their htlc %"PRIu64 @@ -2782,7 +2782,7 @@ void htlcs_notify_new_block(struct lightningd *ld, u32 height) continue; /* Channel dying already? */ - if (!channel_can_add_htlc(hout->key.channel)) { + if (!channel_state_can_add_htlc(hout->key.channel->state)) { consider_failing_incoming(ld, height, hout); continue; } diff --git a/lightningd/routehint.c b/lightningd/routehint.c index 0cbd8717fe24..0ac8b6dcce7e 100644 --- a/lightningd/routehint.c +++ b/lightningd/routehint.c @@ -126,7 +126,7 @@ routehint_candidates(const tal_t *ctx, continue; } - if (!channel_can_add_htlc(candidate.c)) { + if (!channel_state_can_add_htlc(candidate.c->state)) { log_debug(ld->log, "%s: abnormal channel", type_to_string(tmpctx, struct short_channel_id, diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index ab657a72b5c0..aa5a25d0304c 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -815,7 +815,7 @@ struct command_result *param_u64(struct command *cmd UNNEEDED, const char *name { fprintf(stderr, "param_u64 called!\n"); abort(); } /* Generated stub for peer_any_channel */ struct channel *peer_any_channel(struct peer *peer UNNEEDED, - bool (*channel_state_filter)(const struct channel *) UNNEEDED, + bool (*channel_state_filter)(enum channel_state) UNNEEDED, bool *others UNNEEDED) { fprintf(stderr, "peer_any_channel called!\n"); abort(); } /* Generated stub for peer_restart_dualopend */ diff --git a/wallet/walletrpc.c b/wallet/walletrpc.c index ef3e9afd5cb3..198bfb559344 100644 --- a/wallet/walletrpc.c +++ b/wallet/walletrpc.c @@ -382,7 +382,7 @@ static struct command_result *json_listfunds(struct command *cmd, struct channel *c; list_for_each(&p->channels, c, list) { /* We don't print out uncommitted channels */ - if (channel_state_uncommitted(c)) + if (channel_state_uncommitted(c->state)) continue; json_object_start(response, NULL); json_add_node_id(response, "peer_id", &p->id); From 055d600fd407b559756069fd5ef9218b7af7e104 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:51 +1030 Subject: [PATCH 21/28] lightningd: remove watch_tx() in favor of watch_txid(). It was a wrapper only used in one place anyway. Signed-off-by: Rusty Russell --- lightningd/onchain_control.c | 5 +++-- lightningd/watch.c | 17 ----------------- lightningd/watch.h | 10 ---------- 3 files changed, 3 insertions(+), 29 deletions(-) diff --git a/lightningd/onchain_control.c b/lightningd/onchain_control.c index 0f7a33e9ae58..c55ea26fc81a 100644 --- a/lightningd/onchain_control.c +++ b/lightningd/onchain_control.c @@ -255,8 +255,9 @@ static void watch_tx_and_outputs(struct channel *channel, bitcoin_txid(tx, &outpoint.txid); /* Make txwatch a parent of txo watches, so we can unwatch together. */ - txw = watch_tx(channel->owner, ld->topology, channel, tx, - onchain_tx_watched); + txw = watch_txid(channel->owner, ld->topology, channel, + &outpoint.txid, + onchain_tx_watched); for (outpoint.n = 0; outpoint.n < tx->wtx->num_outputs; outpoint.n++) watch_txo(txw, ld->topology, channel, &outpoint, diff --git a/lightningd/watch.c b/lightningd/watch.c index d851b69b7938..dacc19359ca9 100644 --- a/lightningd/watch.c +++ b/lightningd/watch.c @@ -168,23 +168,6 @@ bool watching_txid(const struct chain_topology *topo, return txwatch_hash_get(topo->txwatches, txid) != NULL; } -struct txwatch *watch_tx(const tal_t *ctx, - struct chain_topology *topo, - struct channel *channel, - const struct bitcoin_tx *tx, - enum watch_result (*cb)(struct lightningd *ld, - struct channel *channel, - const struct bitcoin_txid *, - const struct bitcoin_tx *, - unsigned int depth)) -{ - struct bitcoin_txid txid; - - bitcoin_txid(tx, &txid); - /* FIXME: Save populate txwatch->tx here, too! */ - return watch_txid(ctx, topo, channel, &txid, cb); -} - struct txowatch *watch_txo(const tal_t *ctx, struct chain_topology *topo, struct channel *channel, diff --git a/lightningd/watch.h b/lightningd/watch.h index dbdd43d4ecac..d722eb9d767d 100644 --- a/lightningd/watch.h +++ b/lightningd/watch.h @@ -40,16 +40,6 @@ struct txwatch *watch_txid(const tal_t *ctx, const struct bitcoin_tx *, unsigned int depth)); -struct txwatch *watch_tx(const tal_t *ctx, - struct chain_topology *topo, - struct channel *channel, - const struct bitcoin_tx *tx, - enum watch_result (*cb)(struct lightningd *ld, - struct channel *, - const struct bitcoin_txid *, - const struct bitcoin_tx *, - unsigned int depth)); - struct txowatch *watch_txo(const tal_t *ctx, struct chain_topology *topo, struct channel *channel, From add836eb5308b3bcd102a53a36439e36bdb73cbc Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:51 +1030 Subject: [PATCH 22/28] lightningd: make watch_txid more generic. Don't assume the arg is a channel. Signed-off-by: Rusty Russell --- lightningd/chaintopology.c | 26 +++++------ lightningd/onchain_control.c | 11 +++-- lightningd/peer_control.c | 19 ++++---- lightningd/test/run-invoice-select-inchan.c | 22 ++++----- lightningd/watch.c | 52 ++++++++++----------- lightningd/watch.h | 49 ++++++++++++++----- wallet/test/run-wallet.c | 22 ++++----- 7 files changed, 111 insertions(+), 90 deletions(-) diff --git a/lightningd/chaintopology.c b/lightningd/chaintopology.c index 49be23683d42..4fb2d8abf747 100644 --- a/lightningd/chaintopology.c +++ b/lightningd/chaintopology.c @@ -306,10 +306,10 @@ void broadcast_tx_(struct chain_topology *topo, } static enum watch_result closeinfo_txid_confirmed(struct lightningd *ld, - struct channel *channel, const struct bitcoin_txid *txid, const struct bitcoin_tx *tx, - unsigned int depth) + unsigned int depth, + void *unused) { /* Sanity check. */ if (tx != NULL) { @@ -317,14 +317,13 @@ static enum watch_result closeinfo_txid_confirmed(struct lightningd *ld, bitcoin_txid(tx, &txid2); if (!bitcoin_txid_eq(txid, &txid2)) { - channel_internal_error(channel, "Txid for %s is not %s", - type_to_string(tmpctx, - struct bitcoin_tx, - tx), - type_to_string(tmpctx, - struct bitcoin_txid, - txid)); - return DELETE_WATCH; + fatal("Txid for %s is not %s", + type_to_string(tmpctx, + struct bitcoin_tx, + tx), + type_to_string(tmpctx, + struct bitcoin_txid, + txid)); } } @@ -358,12 +357,13 @@ static void watch_for_utxo_reconfirmation(struct chain_topology *topo, assert(unconfirmed[i]->close_info != NULL); assert(unconfirmed[i]->blockheight == NULL); - if (find_txwatch(topo, &unconfirmed[i]->outpoint.txid, NULL)) + if (find_txwatch(topo, &unconfirmed[i]->outpoint.txid, + closeinfo_txid_confirmed, NULL)) continue; - watch_txid(topo, topo, NULL, + watch_txid(topo, topo, &unconfirmed[i]->outpoint.txid, - closeinfo_txid_confirmed); + closeinfo_txid_confirmed, NULL); } } diff --git a/lightningd/onchain_control.c b/lightningd/onchain_control.c index c55ea26fc81a..252c98427256 100644 --- a/lightningd/onchain_control.c +++ b/lightningd/onchain_control.c @@ -160,10 +160,10 @@ static void onchain_tx_depth(struct channel *channel, * Entrypoint for the txwatch callback, calls onchain_tx_depth. */ static enum watch_result onchain_tx_watched(struct lightningd *ld, - struct channel *channel, const struct bitcoin_txid *txid, const struct bitcoin_tx *tx, - unsigned int depth) + unsigned int depth, + struct channel *channel) { u32 blockheight = get_block_height(ld->topology); @@ -255,9 +255,9 @@ static void watch_tx_and_outputs(struct channel *channel, bitcoin_txid(tx, &outpoint.txid); /* Make txwatch a parent of txo watches, so we can unwatch together. */ - txw = watch_txid(channel->owner, ld->topology, channel, + txw = watch_txid(channel->owner, ld->topology, &outpoint.txid, - onchain_tx_watched); + onchain_tx_watched, channel); for (outpoint.n = 0; outpoint.n < tx->wtx->num_outputs; outpoint.n++) watch_txo(txw, ld->topology, channel, &outpoint, @@ -295,7 +295,8 @@ static void handle_onchain_unwatch_tx(struct channel *channel, const u8 *msg) } /* Frees the txo watches, too: see watch_tx_and_outputs() */ - txw = find_txwatch(channel->peer->ld->topology, &txid, channel); + txw = find_txwatch(channel->peer->ld->topology, &txid, + onchain_tx_watched, channel); if (!txw) log_unusual(channel->log, "Can't unwatch txid %s", type_to_string(tmpctx, struct bitcoin_txid, &txid)); diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 58e455426e21..c80f9c8da8cc 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1878,10 +1878,10 @@ static void subd_tell_depth(struct channel *channel, } static enum watch_result funding_depth_cb(struct lightningd *ld, - struct channel *channel, - const struct bitcoin_txid *txid, - const struct bitcoin_tx *tx, - unsigned int depth) + const struct bitcoin_txid *txid, + const struct bitcoin_tx *tx, + unsigned int depth, + struct channel *channel) { struct short_channel_id scid; struct txlocator *loc; @@ -2097,7 +2097,6 @@ void channel_watch_wrong_funding(struct lightningd *ld, struct channel *channel) { /* Watch the "wrong" funding too, in case we spend it. */ if (channel->shutdown_wrong_funding) { - /* FIXME: Remove arg from cb? */ watch_txo(channel, ld->topology, channel, channel->shutdown_wrong_funding, funding_spent); @@ -2106,11 +2105,10 @@ void channel_watch_wrong_funding(struct lightningd *ld, struct channel *channel) void channel_watch_funding(struct lightningd *ld, struct channel *channel) { - /* FIXME: Remove arg from cb? */ log_debug(channel->log, "Watching for funding txid: %s", type_to_string(tmpctx, struct bitcoin_txid, &channel->funding.txid)); - watch_txid(channel, ld->topology, channel, - &channel->funding.txid, funding_depth_cb); + watch_txid(channel, ld->topology, + &channel->funding.txid, funding_depth_cb, channel); watch_txo(channel, ld->topology, channel, &channel->funding, funding_spent); @@ -2121,9 +2119,8 @@ void channel_watch_inflight(struct lightningd *ld, struct channel *channel, struct channel_inflight *inflight) { - /* FIXME: Remove arg from cb? */ - watch_txid(channel, ld->topology, channel, - &inflight->funding->outpoint.txid, funding_depth_cb); + watch_txid(channel, ld->topology, + &inflight->funding->outpoint.txid, funding_depth_cb, channel); watch_txo(channel, ld->topology, channel, &inflight->funding->outpoint, funding_spent); diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index aa5a25d0304c..3c9fc3013379 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -1009,17 +1009,17 @@ void wallet_transaction_add(struct wallet *w UNNEEDED, const struct wally_tx *tx struct txlocator *wallet_transaction_locate(const tal_t *ctx UNNEEDED, struct wallet *w UNNEEDED, const struct bitcoin_txid *txid UNNEEDED) { fprintf(stderr, "wallet_transaction_locate called!\n"); abort(); } -/* Generated stub for watch_txid */ -struct txwatch *watch_txid(const tal_t *ctx UNNEEDED, - struct chain_topology *topo UNNEEDED, - struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED, - enum watch_result (*cb)(struct lightningd *ld UNNEEDED, - struct channel * UNNEEDED, - const struct bitcoin_txid * UNNEEDED, - const struct bitcoin_tx * UNNEEDED, - unsigned int depth)) -{ fprintf(stderr, "watch_txid called!\n"); abort(); } +/* Generated stub for watch_txid_ */ +struct txwatch *watch_txid_(const tal_t *ctx UNNEEDED, + struct chain_topology *topo UNNEEDED, + const struct bitcoin_txid *txid UNNEEDED, + enum watch_result (*cb)(struct lightningd *ld UNNEEDED, + const struct bitcoin_txid * UNNEEDED, + const struct bitcoin_tx * UNNEEDED, + unsigned int depth UNNEEDED, + void *arg) UNNEEDED, + void *arg UNNEEDED) +{ fprintf(stderr, "watch_txid_ called!\n"); abort(); } /* Generated stub for watch_txo */ struct txowatch *watch_txo(const tal_t *ctx UNNEEDED, struct chain_topology *topo UNNEEDED, diff --git a/lightningd/watch.c b/lightningd/watch.c index dacc19359ca9..f533044b5c17 100644 --- a/lightningd/watch.c +++ b/lightningd/watch.c @@ -53,9 +53,6 @@ struct txowatch { struct txwatch { struct chain_topology *topo; - /* Channel who owns us (or NULL, for wallet usage). */ - struct channel *channel; - /* Transaction to watch. */ struct bitcoin_txid txid; @@ -66,10 +63,11 @@ struct txwatch { /* A new depth (0 if kicked out, otherwise 1 = tip, etc.) */ enum watch_result (*cb)(struct lightningd *ld, - struct channel *channel, const struct bitcoin_txid *txid, const struct bitcoin_tx *tx, - unsigned int depth); + unsigned int depth, + void *arg); + void *cbarg; }; const struct bitcoin_outpoint *txowatch_keyof(const struct txowatch *w) @@ -118,15 +116,15 @@ static void destroy_txwatch(struct txwatch *w) txwatch_hash_del(w->topo->txwatches, w); } -struct txwatch *watch_txid(const tal_t *ctx, - struct chain_topology *topo, - struct channel *channel, - const struct bitcoin_txid *txid, - enum watch_result (*cb)(struct lightningd *ld, - struct channel *, - const struct bitcoin_txid *, - const struct bitcoin_tx *, - unsigned int depth)) +struct txwatch *watch_txid_(const tal_t *ctx, + struct chain_topology *topo, + const struct bitcoin_txid *txid, + enum watch_result (*cb)(struct lightningd *ld, + const struct bitcoin_txid *, + const struct bitcoin_tx *, + unsigned int depth, + void *arg), + void *arg) { struct txwatch *w; @@ -135,8 +133,8 @@ struct txwatch *watch_txid(const tal_t *ctx, w->depth = 0; w->txid = *txid; w->tx = NULL; - w->channel = channel; w->cb = cb; + w->cbarg = arg; txwatch_hash_add(w->topo->txwatches, w); tal_add_destructor(w, destroy_txwatch); @@ -144,9 +142,14 @@ struct txwatch *watch_txid(const tal_t *ctx, return w; } -struct txwatch *find_txwatch(struct chain_topology *topo, - const struct bitcoin_txid *txid, - const struct channel *channel) +struct txwatch *find_txwatch_(struct chain_topology *topo, + const struct bitcoin_txid *txid, + enum watch_result (*cb)(struct lightningd *ld, + const struct bitcoin_txid *, + const struct bitcoin_tx *, + unsigned int depth, + void *arg), + void *arg) { struct txwatch_hash_iter i; struct txwatch *w; @@ -156,7 +159,7 @@ struct txwatch *find_txwatch(struct chain_topology *topo, for (w = txwatch_hash_getfirst(topo->txwatches, txid, &i); w; w = txwatch_hash_getnext(topo->txwatches, txid, &i)) { - if (w->channel == channel) + if (w->cb == cb && w->cbarg == arg) break; } return w; @@ -196,24 +199,19 @@ static bool txw_fire(struct txwatch *txw, unsigned int depth) { enum watch_result r; - struct logger *log; if (depth == txw->depth) return false; - if (txw->channel) - log = txw->channel->log; - else - log = txw->topo->log; /* We assume zero depth signals a reorganization */ - log_debug(log, + log_debug(txw->topo->log, "Got depth change %u->%u for %s%s", txw->depth, depth, type_to_string(tmpctx, struct bitcoin_txid, &txw->txid), depth ? "" : " REORG"); txw->depth = depth; - r = txw->cb(txw->topo->bitcoind->ld, txw->channel, txid, txw->tx, - txw->depth); + r = txw->cb(txw->topo->bitcoind->ld, txid, txw->tx, txw->depth, + txw->cbarg); switch (r) { case DELETE_WATCH: tal_free(txw); diff --git a/lightningd/watch.h b/lightningd/watch.h index d722eb9d767d..07a7b9ad137d 100644 --- a/lightningd/watch.h +++ b/lightningd/watch.h @@ -30,15 +30,25 @@ HTABLE_DEFINE_TYPE(struct txwatch, txwatch_keyof, txid_hash, txwatch_eq, txwatch_hash); -struct txwatch *watch_txid(const tal_t *ctx, - struct chain_topology *topo, - struct channel *channel, - const struct bitcoin_txid *txid, - enum watch_result (*cb)(struct lightningd *ld, - struct channel *, - const struct bitcoin_txid *, - const struct bitcoin_tx *, - unsigned int depth)); +struct txwatch *watch_txid_(const tal_t *ctx, + struct chain_topology *topo, + const struct bitcoin_txid *txid, + enum watch_result (*cb)(struct lightningd *ld, + const struct bitcoin_txid *, + const struct bitcoin_tx *, + unsigned int depth, + void *arg), + void *arg); + +#define watch_txid(ctx, topo, txid, cb, arg) \ + watch_txid_((ctx), (topo), (txid), \ + typesafe_cb_preargs(enum watch_result, void *, \ + (cb), (arg), \ + struct lightningd *, \ + const struct bitcoin_txid *, \ + const struct bitcoin_tx *, \ + unsigned int depth), \ + (arg)) struct txowatch *watch_txo(const tal_t *ctx, struct chain_topology *topo, @@ -49,9 +59,24 @@ struct txowatch *watch_txo(const tal_t *ctx, size_t input_num, const struct block *block)); -struct txwatch *find_txwatch(struct chain_topology *topo, - const struct bitcoin_txid *txid, - const struct channel *channel); +struct txwatch *find_txwatch_(struct chain_topology *topo, + const struct bitcoin_txid *txid, + enum watch_result (*cb)(struct lightningd *ld, + const struct bitcoin_txid *, + const struct bitcoin_tx *, + unsigned int depth, + void *arg), + void *arg); + +#define find_txwatch(topo, txid, cb, arg) \ + find_txwatch_((topo), (txid), \ + typesafe_cb_preargs(enum watch_result, void *, \ + (cb), (arg), \ + struct lightningd *, \ + const struct bitcoin_txid *, \ + const struct bitcoin_tx *, \ + unsigned int depth), \ + (arg)) void txwatch_fire(struct chain_topology *topo, const struct bitcoin_txid *txid, diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index f1179964d786..c6c58384f408 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -898,17 +898,17 @@ const char *wait_index_name(enum wait_index index UNNEEDED) /* Generated stub for wait_subsystem_name */ const char *wait_subsystem_name(enum wait_subsystem subsystem UNNEEDED) { fprintf(stderr, "wait_subsystem_name called!\n"); abort(); } -/* Generated stub for watch_txid */ -struct txwatch *watch_txid(const tal_t *ctx UNNEEDED, - struct chain_topology *topo UNNEEDED, - struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED, - enum watch_result (*cb)(struct lightningd *ld UNNEEDED, - struct channel * UNNEEDED, - const struct bitcoin_txid * UNNEEDED, - const struct bitcoin_tx * UNNEEDED, - unsigned int depth)) -{ fprintf(stderr, "watch_txid called!\n"); abort(); } +/* Generated stub for watch_txid_ */ +struct txwatch *watch_txid_(const tal_t *ctx UNNEEDED, + struct chain_topology *topo UNNEEDED, + const struct bitcoin_txid *txid UNNEEDED, + enum watch_result (*cb)(struct lightningd *ld UNNEEDED, + const struct bitcoin_txid * UNNEEDED, + const struct bitcoin_tx * UNNEEDED, + unsigned int depth UNNEEDED, + void *arg) UNNEEDED, + void *arg UNNEEDED) +{ fprintf(stderr, "watch_txid_ called!\n"); abort(); } /* Generated stub for watch_txo */ struct txowatch *watch_txo(const tal_t *ctx UNNEEDED, struct chain_topology *topo UNNEEDED, From b95e2fa2fc44959ab5936b6b98479a52db556fb4 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:51 +1030 Subject: [PATCH 23/28] lightningd: fix watch on existing tx. We never do this, but we're about to (we always watch before we broadcast a tx). We use a `depth` member to avoid calling the callback multiple times for the same event, but we initialize it to 0. This means if we register a watch, and the first thing that happens is that it reorganizes out, we *don't* make the callback. Use an impossible value at initialization, instead. Signed-off-by: Rusty Russell --- lightningd/watch.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/lightningd/watch.c b/lightningd/watch.c index f533044b5c17..32fab750c5e9 100644 --- a/lightningd/watch.c +++ b/lightningd/watch.c @@ -59,7 +59,7 @@ struct txwatch { /* May be NULL if we haven't seen it yet. */ const struct bitcoin_tx *tx; - unsigned int depth; + int depth; /* A new depth (0 if kicked out, otherwise 1 = tip, etc.) */ enum watch_result (*cb)(struct lightningd *ld, @@ -130,7 +130,7 @@ struct txwatch *watch_txid_(const tal_t *ctx, w = tal(ctx, struct txwatch); w->topo = topo; - w->depth = 0; + w->depth = -1; w->txid = *txid; w->tx = NULL; w->cb = cb; @@ -203,12 +203,19 @@ static bool txw_fire(struct txwatch *txw, if (depth == txw->depth) return false; - /* We assume zero depth signals a reorganization */ - log_debug(txw->topo->log, - "Got depth change %u->%u for %s%s", - txw->depth, depth, - type_to_string(tmpctx, struct bitcoin_txid, &txw->txid), - depth ? "" : " REORG"); + if (txw->depth == -1) { + log_debug(txw->topo->log, + "Got first depth change ->%u for %s", + txw->depth, + type_to_string(tmpctx, struct bitcoin_txid, &txw->txid)); + } else { + /* zero depth signals a reorganization */ + log_debug(txw->topo->log, + "Got depth change %u->%u for %s%s", + txw->depth, depth, + type_to_string(tmpctx, struct bitcoin_txid, &txw->txid), + depth ? "" : " REORG"); + } txw->depth = depth; r = txw->cb(txw->topo->bitcoind->ld, txid, txw->tx, txw->depth, txw->cbarg); From 5dabdea99fac2691990f1aac76601727ec199a89 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:51 +1030 Subject: [PATCH 24/28] lightningd: don't share funding_depth_cb for non-funding txs. We use the *same* callback for the funding tx, as well as for inflight dual-funding txs, as well as inflight splice txs. This is deeply confusing! Instead, use explicit cbs for splicing and df. Once they're locked in, use the normal callback. Signed-off-by: Rusty Russell --- lightningd/channel_control.c | 93 ++++++++++++++++++++- lightningd/channel_control.h | 8 ++ lightningd/dual_open_control.c | 70 +++++++++++++++- lightningd/dual_open_control.h | 3 + lightningd/peer_control.c | 92 +++++++------------- lightningd/peer_control.h | 4 +- lightningd/test/run-invoice-select-inchan.c | 24 +++--- wallet/test/run-wallet.c | 15 +++- 8 files changed, 225 insertions(+), 84 deletions(-) diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index af91c20f4064..c8d57cfdd46d 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -542,6 +542,94 @@ static void handle_splice_confirmed_signed(struct lightningd *ld, send_splice_tx(channel, tx, cc, output_index); } +bool depthcb_update_scid(struct channel *channel, + const struct bitcoin_txid *txid) +{ + struct txlocator *loc; + struct lightningd *ld = channel->peer->ld; + struct short_channel_id scid; + + /* What scid is this giving us? */ + loc = wallet_transaction_locate(tmpctx, ld->wallet, txid); + if (!mk_short_channel_id(&scid, + loc->blkheight, loc->index, + channel->funding.n)) { + channel_fail_permanent(channel, + REASON_LOCAL, + "Invalid funding scid %u:%u:%u", + loc->blkheight, loc->index, + channel->funding.n); + return false; + } + + if (!channel->scid) { + wallet_annotate_txout(ld->wallet, &channel->funding, + TX_CHANNEL_FUNDING, channel->dbid); + channel->scid = tal_dup(channel, struct short_channel_id, &scid); + + /* If we have a zeroconf channel, i.e., no scid yet + * but have exchange `channel_ready` messages, then we + * need to fire a second time, in order to trigger the + * `coin_movement` event. This is a subset of the + * `lockin_complete` function called from + * AWAITING_LOCKIN->NORMAL otherwise. */ + if (channel->minimum_depth == 0) + lockin_has_completed(channel, false); + + wallet_channel_save(ld->wallet, channel); + } else if (!short_channel_id_eq(channel->scid, &scid)) { + /* We freaked out if required when original was + * removed, so just update now */ + log_info(channel->log, "Short channel id changed from %s->%s", + type_to_string(tmpctx, struct short_channel_id, channel->scid), + type_to_string(tmpctx, struct short_channel_id, &scid)); + *channel->scid = scid; + wallet_channel_save(ld->wallet, channel); + } + + return true; +} + +static enum watch_result splice_depth_cb(struct lightningd *ld, + const struct bitcoin_txid *txid, + const struct bitcoin_tx *tx, + unsigned int depth, + struct channel_inflight *inflight) +{ + /* Usually, we're here because we're awaiting a splice, but + * we could also mutual shutdown, or that weird splice_locked_memonly + * hack... */ + if (inflight->channel->state != CHANNELD_AWAITING_SPLICE) + return DELETE_WATCH; + + /* Reorged out? OK, we're not committed yet. */ + if (depth == 0) + return KEEP_WATCHING; + + if (!depthcb_update_scid(inflight->channel, txid)) + return DELETE_WATCH; + + if (inflight->channel->owner) { + subd_send_msg(inflight->channel->owner, + take(towire_channeld_funding_depth( + NULL, inflight->channel->scid, + inflight->channel->alias[LOCAL], + depth, true, txid))); + } + + /* channeld will tell us when splice is locked in: we'll clean + * this watch up then. */ + return KEEP_WATCHING; +} + +void watch_splice_inflight(struct lightningd *ld, + struct channel_inflight *inflight) +{ + watch_txid(inflight, ld->topology, + &inflight->funding->outpoint.txid, + splice_depth_cb, inflight); +} + static void handle_add_inflight(struct lightningd *ld, struct channel *channel, const u8 *msg) @@ -596,7 +684,7 @@ static void handle_add_inflight(struct lightningd *ld, &inflight->funding->outpoint.txid)); wallet_inflight_add(ld->wallet, inflight); - channel_watch_inflight(ld, channel, inflight); + watch_splice_inflight(ld, inflight); subd_send_msg(channel->owner, take(towire_channeld_got_inflight(NULL))); } @@ -830,6 +918,9 @@ static void handle_peer_splice_locked(struct channel *channel, const u8 *msg) wallet_channel_clear_inflights(channel->peer->ld->wallet, channel); + /* That freed watchers in inflights: now watch funding tx */ + channel_watch_funding(channel->peer->ld, channel); + /* Put the successful inflight back in as a memory-only object. * peer_control's funding_spent function will pick this up and clean up * our inflight. diff --git a/lightningd/channel_control.h b/lightningd/channel_control.h index 1bdba25589d6..85ddf70697db 100644 --- a/lightningd/channel_control.h +++ b/lightningd/channel_control.h @@ -53,4 +53,12 @@ void lockin_complete(struct channel *channel, /* Accessor for zeroconf to tell us we've actually got an scid */ void lockin_has_completed(struct channel *channel, bool record_push); + +/* Watch this incoming splice */ +void watch_splice_inflight(struct lightningd *ld, + struct channel_inflight *inflight); + +/* Update/set scid now this txid is mined. */ +bool depthcb_update_scid(struct channel *channel, + const struct bitcoin_txid *txid); #endif /* LIGHTNING_LIGHTNINGD_CHANNEL_CONTROL_H */ diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 8e19c2671750..ac582fef0e97 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -953,6 +953,68 @@ openchannel2_signed_deserialize(struct openchannel2_psbt_payload *payload, return true; } +static enum watch_result opening_depth_cb(struct lightningd *ld, + const struct bitcoin_txid *txid, + const struct bitcoin_tx *tx, + unsigned int depth, + struct channel_inflight *inflight) +{ + struct txlocator *loc; + struct short_channel_id scid; + + /* Usually, we're here because we're awaiting a lockin, but + * we could also mutual shutdown */ + if (inflight->channel->state != DUALOPEND_AWAITING_LOCKIN) + return DELETE_WATCH; + + /* Reorged out? OK, we're not committed yet. */ + if (depth == 0) + return KEEP_WATCHING; + + /* FIXME: Don't do this until we're actually locked in! */ + loc = wallet_transaction_locate(tmpctx, ld->wallet, txid); + if (!mk_short_channel_id(&scid, + loc->blkheight, loc->index, + inflight->funding->outpoint.n)) { + channel_fail_permanent(inflight->channel, + REASON_LOCAL, + "Invalid funding scid %u:%u:%u", + loc->blkheight, loc->index, + inflight->funding->outpoint.n); + return DELETE_WATCH; + } + + if (!inflight->channel->scid) { + wallet_annotate_txout(ld->wallet, &inflight->funding->outpoint, + TX_CHANNEL_FUNDING, inflight->channel->dbid); + inflight->channel->scid = tal_dup(inflight->channel, struct short_channel_id, &scid); + wallet_channel_save(ld->wallet, inflight->channel); + } else if (!short_channel_id_eq(inflight->channel->scid, &scid)) { + /* We freaked out if required when original was + * removed, so just update now */ + log_info(inflight->channel->log, "Short channel id changed from %s->%s", + type_to_string(tmpctx, struct short_channel_id, inflight->channel->scid), + type_to_string(tmpctx, struct short_channel_id, &scid)); + *inflight->channel->scid = scid; + wallet_channel_save(ld->wallet, inflight->channel); + } + + dualopend_tell_depth(inflight->channel, txid, depth); + + if (depth >= inflight->channel->minimum_depth) + update_channel_from_inflight(ld, inflight->channel, inflight); + + return KEEP_WATCHING; +} + +void watch_opening_inflight(struct lightningd *ld, + struct channel_inflight *inflight) +{ + watch_txid(inflight, ld->topology, + &inflight->funding->outpoint.txid, + opening_depth_cb, inflight); +} + static void openchannel2_sign_hook_cb(struct openchannel2_psbt_payload *payload STEALS) { @@ -1007,7 +1069,7 @@ openchannel2_sign_hook_cb(struct openchannel2_psbt_payload *payload STEALS) cast_const(struct wally_psbt *, payload->psbt)); wallet_inflight_save(payload->ld->wallet, inflight); - channel_watch_funding(payload->ld, channel); + watch_opening_inflight(payload->ld, inflight); msg = towire_dualopend_send_tx_sigs(NULL, inflight->funding_psbt); send_msg: @@ -1835,6 +1897,9 @@ static void handle_channel_locked(struct subd *dualopend, /* Empty out the inflights */ wallet_channel_clear_inflights(dualopend->ld->wallet, channel); + /* That freed watchers in inflights: now watch funding tx */ + channel_watch_funding(dualopend->ld, channel); + /* FIXME: LND sigs/update_fee msgs? */ peer_start_channeld(channel, peer_fd, NULL, false, NULL); return; @@ -2611,8 +2676,7 @@ json_openchannel_signed(struct command *cmd, /* Update the PSBT on disk */ wallet_inflight_save(cmd->ld->wallet, inflight); - /* Uses the channel->funding_txid, which we verified above */ - channel_watch_funding(cmd->ld, channel); + watch_opening_inflight(cmd->ld, inflight); /* Send our tx_sigs to the peer */ subd_send_msg(channel->owner, diff --git a/lightningd/dual_open_control.h b/lightningd/dual_open_control.h index 8bacce793094..80a2d7ab1faa 100644 --- a/lightningd/dual_open_control.h +++ b/lightningd/dual_open_control.h @@ -18,6 +18,9 @@ void dualopend_tell_depth(struct channel *channel, const struct bitcoin_txid *txid, u32 depth); +void watch_opening_inflight(struct lightningd *ld, + struct channel_inflight *inflight); + /* Close connection to an unsaved channel */ void channel_unsaved_close_conn(struct channel *channel, const char *why); diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index c80f9c8da8cc..b987d953db34 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -350,7 +350,6 @@ void drop_to_chain(struct lightningd *ld, struct channel *channel, resolve_close_command(ld, channel, cooperative, tx); } - } void resend_closing_transactions(struct lightningd *ld) @@ -1883,9 +1882,6 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, unsigned int depth, struct channel *channel) { - struct short_channel_id scid; - struct txlocator *loc; - /* This is stub channel, we don't activate anything! */ if (is_stub_scid(channel->scid)) return DELETE_WATCH; @@ -1954,43 +1950,8 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, return KEEP_WATCHING; } - /* What scid is this giving us? */ - loc = wallet_transaction_locate(tmpctx, ld->wallet, txid); - if (!mk_short_channel_id(&scid, - loc->blkheight, loc->index, - channel->funding.n)) { - channel_fail_permanent(channel, - REASON_LOCAL, - "Invalid funding scid %u:%u:%u", - loc->blkheight, loc->index, - channel->funding.n); + if (!depthcb_update_scid(channel, txid)) return DELETE_WATCH; - } - - if (!channel->scid) { - wallet_annotate_txout(ld->wallet, &channel->funding, - TX_CHANNEL_FUNDING, channel->dbid); - channel->scid = tal_dup(channel, struct short_channel_id, &scid); - - /* If we have a zeroconf channel, i.e., no scid yet - * but have exchange `channel_ready` messages, then we - * need to fire a second time, in order to trigger the - * `coin_movement` event. This is a subset of the - * `lockin_complete` function called from - * AWAITING_LOCKIN->NORMAL otherwise. */ - if (channel->minimum_depth == 0) - lockin_has_completed(channel, false); - - wallet_channel_save(ld->wallet, channel); - } else if (!short_channel_id_eq(channel->scid, &scid)) { - /* We freaked out if required when original was - * removed, so just update now */ - log_info(channel->log, "Short channel id changed from %s->%s", - type_to_string(tmpctx, struct short_channel_id, channel->scid), - type_to_string(tmpctx, struct short_channel_id, &scid)); - *channel->scid = scid; - wallet_channel_save(ld->wallet, channel); - } /* Always tell owner about depth change */ subd_tell_depth(channel, txid, depth); @@ -2115,17 +2076,6 @@ void channel_watch_funding(struct lightningd *ld, struct channel *channel) channel_watch_wrong_funding(ld, channel); } -void channel_watch_inflight(struct lightningd *ld, - struct channel *channel, - struct channel_inflight *inflight) -{ - watch_txid(channel, ld->topology, - &inflight->funding->outpoint.txid, funding_depth_cb, channel); - watch_txo(channel, ld->topology, channel, - &inflight->funding->outpoint, - funding_spent); -} - static void json_add_peer(struct lightningd *ld, struct json_stream *response, struct peer *p, @@ -2381,21 +2331,39 @@ static void setup_peer(struct peer *peer, u32 delay) bool connect = false; list_for_each(&peer->channels, channel, list) { - if (channel_state_uncommitted(channel->state)) + switch (channel->state) { + case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: + /* Nothing to watch */ continue; - /* Watching lockin may be unnecessary, but it's harmless. */ - channel_watch_funding(ld, channel); - /* Also watch any inflight txs */ - list_for_each(&channel->inflights, inflight, list) { - /* Don't double watch the txid that's also in - * channel->funding_txid */ - if (bitcoin_txid_eq(&channel->funding.txid, - &inflight->funding->outpoint.txid)) - continue; + /* Normal cases where we watch funding */ + case CHANNELD_AWAITING_LOCKIN: + case CHANNELD_NORMAL: + case CHANNELD_SHUTTING_DOWN: + case CLOSINGD_SIGEXCHANGE: + /* We still want to watch spend, to tell onchaind: */ + case CLOSINGD_COMPLETE: + case AWAITING_UNILATERAL: + case FUNDING_SPEND_SEEN: + case ONCHAIN: + case CLOSED: + channel_watch_funding(ld, channel); + break; + + /* We need to watch all inflights which may open channel */ + case DUALOPEND_AWAITING_LOCKIN: + list_for_each(&channel->inflights, inflight, list) + watch_opening_inflight(ld, inflight); + break; - channel_watch_inflight(ld, channel, inflight); + /* We need to watch all inflights which may splice */ + case CHANNELD_AWAITING_SPLICE: + list_for_each(&channel->inflights, inflight, list) + watch_splice_inflight(ld, inflight); + break; } + if (channel_state_wants_peercomms(channel->state)) connect = true; } diff --git a/lightningd/peer_control.h b/lightningd/peer_control.h index e92a20a75419..32d5b2c5ae37 100644 --- a/lightningd/peer_control.h +++ b/lightningd/peer_control.h @@ -116,9 +116,7 @@ void update_channel_from_inflight(struct lightningd *ld, const struct channel_inflight *inflight); void channel_watch_funding(struct lightningd *ld, struct channel *channel); -void channel_watch_inflight(struct lightningd *ld, - struct channel *channel, - struct channel_inflight *inflight); + /* If this channel has a "wrong funding" shutdown, watch that too. */ void channel_watch_wrong_funding(struct lightningd *ld, struct channel *channel); diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 3c9fc3013379..bc7c511adab8 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -198,6 +198,10 @@ void db_commit_transaction(struct db *db UNNEEDED) /* Generated stub for delete_channel */ void delete_channel(struct channel *channel STEALS UNNEEDED) { fprintf(stderr, "delete_channel called!\n"); abort(); } +/* Generated stub for depthcb_update_scid */ +bool depthcb_update_scid(struct channel *channel UNNEEDED, + const struct bitcoin_txid *txid UNNEEDED) +{ fprintf(stderr, "depthcb_update_scid called!\n"); abort(); } /* Generated stub for dev_disconnect_permanent */ bool dev_disconnect_permanent(struct lightningd *ld UNNEEDED) { fprintf(stderr, "dev_disconnect_permanent called!\n"); abort(); } @@ -654,9 +658,6 @@ void kill_uncommitted_channel(struct uncommitted_channel *uc UNNEEDED, void lockin_complete(struct channel *channel UNNEEDED, enum channel_state expected_state UNNEEDED) { fprintf(stderr, "lockin_complete called!\n"); abort(); } -/* Generated stub for lockin_has_completed */ -void lockin_has_completed(struct channel *channel UNNEEDED, bool record_push UNNEEDED) -{ fprintf(stderr, "lockin_has_completed called!\n"); abort(); } /* Generated stub for log_ */ void log_(struct logger *logger UNNEEDED, enum log_level level UNNEEDED, const struct node_id *node_id UNNEEDED, @@ -952,11 +953,6 @@ void try_reconnect(const tal_t *ctx UNNEEDED, /* Generated stub for version */ const char *version(void) { fprintf(stderr, "version called!\n"); abort(); } -/* Generated stub for wallet_annotate_txout */ -void wallet_annotate_txout(struct wallet *w UNNEEDED, - const struct bitcoin_outpoint *outpoint UNNEEDED, - enum wallet_tx_type type UNNEEDED, u64 channel UNNEEDED) -{ fprintf(stderr, "wallet_annotate_txout called!\n"); abort(); } /* Generated stub for wallet_channel_save */ void wallet_channel_save(struct wallet *w UNNEEDED, struct channel *chan UNNEEDED) { fprintf(stderr, "wallet_channel_save called!\n"); abort(); } @@ -1005,10 +1001,14 @@ struct amount_msat wallet_total_forward_fees(struct wallet *w UNNEEDED) void wallet_transaction_add(struct wallet *w UNNEEDED, const struct wally_tx *tx UNNEEDED, const u32 blockheight UNNEEDED, const u32 txindex UNNEEDED) { fprintf(stderr, "wallet_transaction_add called!\n"); abort(); } -/* Generated stub for wallet_transaction_locate */ -struct txlocator *wallet_transaction_locate(const tal_t *ctx UNNEEDED, struct wallet *w UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED) -{ fprintf(stderr, "wallet_transaction_locate called!\n"); abort(); } +/* Generated stub for watch_opening_inflight */ +void watch_opening_inflight(struct lightningd *ld UNNEEDED, + struct channel_inflight *inflight UNNEEDED) +{ fprintf(stderr, "watch_opening_inflight called!\n"); abort(); } +/* Generated stub for watch_splice_inflight */ +void watch_splice_inflight(struct lightningd *ld UNNEEDED, + struct channel_inflight *inflight UNNEEDED) +{ fprintf(stderr, "watch_splice_inflight called!\n"); abort(); } /* Generated stub for watch_txid_ */ struct txwatch *watch_txid_(const tal_t *ctx UNNEEDED, struct chain_topology *topo UNNEEDED, diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index c6c58384f408..d47886ddb1ae 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -139,6 +139,10 @@ struct onionreply *create_onionreply(const tal_t *ctx UNNEEDED, const struct secret *shared_secret UNNEEDED, const u8 *failure_msg UNNEEDED) { fprintf(stderr, "create_onionreply called!\n"); abort(); } +/* Generated stub for depthcb_update_scid */ +bool depthcb_update_scid(struct channel *channel UNNEEDED, + const struct bitcoin_txid *txid UNNEEDED) +{ fprintf(stderr, "depthcb_update_scid called!\n"); abort(); } /* Generated stub for derive_channel_id */ void derive_channel_id(struct channel_id *channel_id UNNEEDED, const struct bitcoin_outpoint *outpoint UNNEEDED) @@ -442,9 +446,6 @@ void kill_uncommitted_channel(struct uncommitted_channel *uc UNNEEDED, void lockin_complete(struct channel *channel UNNEEDED, enum channel_state expected_state UNNEEDED) { fprintf(stderr, "lockin_complete called!\n"); abort(); } -/* Generated stub for lockin_has_completed */ -void lockin_has_completed(struct channel *channel UNNEEDED, bool record_push UNNEEDED) -{ fprintf(stderr, "lockin_has_completed called!\n"); abort(); } /* Generated stub for logv */ void logv(struct logger *logger UNNEEDED, enum log_level level UNNEEDED, const struct node_id *node_id UNNEEDED, bool call_notifier UNNEEDED, const char *fmt UNNEEDED, va_list ap UNNEEDED) @@ -898,6 +899,14 @@ const char *wait_index_name(enum wait_index index UNNEEDED) /* Generated stub for wait_subsystem_name */ const char *wait_subsystem_name(enum wait_subsystem subsystem UNNEEDED) { fprintf(stderr, "wait_subsystem_name called!\n"); abort(); } +/* Generated stub for watch_opening_inflight */ +void watch_opening_inflight(struct lightningd *ld UNNEEDED, + struct channel_inflight *inflight UNNEEDED) +{ fprintf(stderr, "watch_opening_inflight called!\n"); abort(); } +/* Generated stub for watch_splice_inflight */ +void watch_splice_inflight(struct lightningd *ld UNNEEDED, + struct channel_inflight *inflight UNNEEDED) +{ fprintf(stderr, "watch_splice_inflight called!\n"); abort(); } /* Generated stub for watch_txid_ */ struct txwatch *watch_txid_(const tal_t *ctx UNNEEDED, struct chain_topology *topo UNNEEDED, From d54226bf1f71ace09472c78da77b2031a27b6990 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:52 +1030 Subject: [PATCH 25/28] lightningd: fix bug where we didn't correctly change outpoint of splice scid. We used the original channel funding output number. I'm not sure if this was true in the previous code, or a regression I introduced, but it caused occasonal failures in test_splice_gossip! Signed-off-by: Rusty Russell --- lightningd/channel_control.c | 11 ++++++----- lightningd/channel_control.h | 3 ++- lightningd/peer_control.c | 2 +- lightningd/test/run-invoice-select-inchan.c | 3 ++- wallet/test/run-wallet.c | 3 ++- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index c8d57cfdd46d..9f544524f34d 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -543,7 +543,8 @@ static void handle_splice_confirmed_signed(struct lightningd *ld, } bool depthcb_update_scid(struct channel *channel, - const struct bitcoin_txid *txid) + const struct bitcoin_txid *txid, + const struct bitcoin_outpoint *outpoint) { struct txlocator *loc; struct lightningd *ld = channel->peer->ld; @@ -553,17 +554,17 @@ bool depthcb_update_scid(struct channel *channel, loc = wallet_transaction_locate(tmpctx, ld->wallet, txid); if (!mk_short_channel_id(&scid, loc->blkheight, loc->index, - channel->funding.n)) { + outpoint->n)) { channel_fail_permanent(channel, REASON_LOCAL, "Invalid funding scid %u:%u:%u", loc->blkheight, loc->index, - channel->funding.n); + outpoint->n); return false; } if (!channel->scid) { - wallet_annotate_txout(ld->wallet, &channel->funding, + wallet_annotate_txout(ld->wallet, outpoint, TX_CHANNEL_FUNDING, channel->dbid); channel->scid = tal_dup(channel, struct short_channel_id, &scid); @@ -606,7 +607,7 @@ static enum watch_result splice_depth_cb(struct lightningd *ld, if (depth == 0) return KEEP_WATCHING; - if (!depthcb_update_scid(inflight->channel, txid)) + if (!depthcb_update_scid(inflight->channel, txid, &inflight->funding->outpoint)) return DELETE_WATCH; if (inflight->channel->owner) { diff --git a/lightningd/channel_control.h b/lightningd/channel_control.h index 85ddf70697db..d8c52bdb1141 100644 --- a/lightningd/channel_control.h +++ b/lightningd/channel_control.h @@ -60,5 +60,6 @@ void watch_splice_inflight(struct lightningd *ld, /* Update/set scid now this txid is mined. */ bool depthcb_update_scid(struct channel *channel, - const struct bitcoin_txid *txid); + const struct bitcoin_txid *txid, + const struct bitcoin_outpoint *outpoint); #endif /* LIGHTNING_LIGHTNINGD_CHANNEL_CONTROL_H */ diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index b987d953db34..eb711889e23d 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1950,7 +1950,7 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, return KEEP_WATCHING; } - if (!depthcb_update_scid(channel, txid)) + if (!depthcb_update_scid(channel, txid, &channel->funding)) return DELETE_WATCH; /* Always tell owner about depth change */ diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index bc7c511adab8..418762514d52 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -200,7 +200,8 @@ void delete_channel(struct channel *channel STEALS UNNEEDED) { fprintf(stderr, "delete_channel called!\n"); abort(); } /* Generated stub for depthcb_update_scid */ bool depthcb_update_scid(struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED) + const struct bitcoin_txid *txid UNNEEDED, + const struct bitcoin_outpoint *outpoint UNNEEDED) { fprintf(stderr, "depthcb_update_scid called!\n"); abort(); } /* Generated stub for dev_disconnect_permanent */ bool dev_disconnect_permanent(struct lightningd *ld UNNEEDED) diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index d47886ddb1ae..813869a78299 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -141,7 +141,8 @@ struct onionreply *create_onionreply(const tal_t *ctx UNNEEDED, { fprintf(stderr, "create_onionreply called!\n"); abort(); } /* Generated stub for depthcb_update_scid */ bool depthcb_update_scid(struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED) + const struct bitcoin_txid *txid UNNEEDED, + const struct bitcoin_outpoint *outpoint UNNEEDED) { fprintf(stderr, "depthcb_update_scid called!\n"); abort(); } /* Generated stub for derive_channel_id */ void derive_channel_id(struct channel_id *channel_id UNNEEDED, From bd5e8d29752ec1172fcf9b1a2fadaaedc28d8efa Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:52 +1030 Subject: [PATCH 26/28] lightningd: ensure we *always* watch channel spend. Now we're not always using the same functions to watch during dual-funding opening, we need to make sure we're watching the close (in particular, df close before the opening is confirmed). So, keep a pointer, and if it's not set in drop_to_chain, set it. Signed-off-by: Rusty Russell --- lightningd/channel.c | 2 ++ lightningd/channel.h | 3 +++ lightningd/peer_control.c | 24 +++++++++++++++++++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lightningd/channel.c b/lightningd/channel.c index 2dc3755d368d..976d690a2b0e 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -234,6 +234,7 @@ struct channel *new_unsaved_channel(struct peer *peer, channel->next_index[LOCAL] = 1; channel->next_index[REMOTE] = 1; channel->next_htlc_id = 0; + channel->funding_spend_watch = NULL; /* FIXME: remove push when v1 deprecated */ channel->push = AMOUNT_MSAT(0); channel->closing_fee_negotiation_step = 50; @@ -465,6 +466,7 @@ struct channel *new_channel(struct peer *peer, u64 dbid, channel->next_htlc_id = next_htlc_id; channel->funding = *funding; channel->funding_sats = funding_sats; + channel->funding_spend_watch = NULL; channel->push = push; channel->our_funds = our_funds; channel->remote_channel_ready = remote_channel_ready; diff --git a/lightningd/channel.h b/lightningd/channel.h index 0c707aef3c77..6027b57565a5 100644 --- a/lightningd/channel.h +++ b/lightningd/channel.h @@ -155,6 +155,9 @@ struct channel { struct bitcoin_outpoint funding; struct amount_sat funding_sats; + /* Watch we have on funding output. */ + struct txowatch *funding_spend_watch; + /* Our original funds, in funding amount */ struct amount_sat our_funds; diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index eb711889e23d..a371482cb2b3 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -311,12 +311,28 @@ static struct bitcoin_tx *sign_and_send_last(const tal_t *ctx, return tx; } +/* FIXME: reorder! */ +static enum watch_result funding_spent(struct channel *channel, + const struct bitcoin_tx *tx, + size_t inputnum UNUSED, + const struct block *block); + void drop_to_chain(struct lightningd *ld, struct channel *channel, bool cooperative) { struct channel_inflight *inflight; const char *cmd_id; + /* If we're not already (e.g. close before channel fully open), + * make sure we're watching for the funding spend */ + if (!channel->funding_spend_watch) { + log_debug(channel->log, "Adding funding_spend_watch"); + channel->funding_spend_watch = watch_txo(channel, + ld->topology, channel, + &channel->funding, + funding_spent); + } + /* If this was triggered by a close command, get a copy of the cmd id */ cmd_id = cmd_id_from_close_command(tmpctx, ld, channel); @@ -2070,9 +2086,11 @@ void channel_watch_funding(struct lightningd *ld, struct channel *channel) type_to_string(tmpctx, struct bitcoin_txid, &channel->funding.txid)); watch_txid(channel, ld->topology, &channel->funding.txid, funding_depth_cb, channel); - watch_txo(channel, ld->topology, channel, - &channel->funding, - funding_spent); + + tal_free(channel->funding_spend_watch); + channel->funding_spend_watch = watch_txo(channel, ld->topology, channel, + &channel->funding, + funding_spent); channel_watch_wrong_funding(ld, channel); } From 8fea8cd02cf35d2d8fa72c22a98fa91b96c356ce Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:52 +1030 Subject: [PATCH 27/28] lightningd: fix dual-funding case where we coop close and an RBF confirms. Signed-off-by: Rusty Russell --- lightningd/peer_control.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index a371482cb2b3..b931edd67e1b 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -317,6 +317,25 @@ static enum watch_result funding_spent(struct channel *channel, size_t inputnum UNUSED, const struct block *block); +/* We coop-closed channel: if another inflight confirms, force close */ +static enum watch_result closed_inflight_depth_cb(struct lightningd *ld, + const struct bitcoin_txid *txid, + const struct bitcoin_tx *tx, + unsigned int depth, + struct channel_inflight *inflight) +{ + if (depth == 0) + return KEEP_WATCHING; + + /* This is now the main tx. */ + update_channel_from_inflight(ld, inflight->channel, inflight); + channel_fail_permanent(inflight->channel, + REASON_UNKNOWN, + "Inflight tx %s confirmed after mutual close", + type_to_string(tmpctx, struct bitcoin_txid, txid)); + return DELETE_WATCH; +} + void drop_to_chain(struct lightningd *ld, struct channel *channel, bool cooperative) { @@ -366,6 +385,22 @@ void drop_to_chain(struct lightningd *ld, struct channel *channel, resolve_close_command(ld, channel, cooperative, tx); } + + /* In cooperative mode, we're assuming that we closed the right one: + * this might not happen if we're splicing, or dual-funding still + * opening. So, if we get any unexpected inflight confirming, we + * force close. */ + if (cooperative) { + list_for_each(&channel->inflights, inflight, list) { + if (bitcoin_outpoint_eq(&inflight->funding->outpoint, + &channel->funding)) { + continue; + } + watch_txid(inflight, ld->topology, + &inflight->funding->outpoint.txid, + closed_inflight_depth_cb, inflight); + } + } } void resend_closing_transactions(struct lightningd *ld) From d333f199133e942a3ef1aec544029e21c05cad27 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:52 +1030 Subject: [PATCH 28/28] lightningd: simplify funding_depth_cb now it only handles main funding tx. We make dualopend_tell_depth static, which means we move it higher in the file. Signed-off-by: Rusty Russell --- lightningd/dual_open_control.c | 84 +++++----- lightningd/dual_open_control.h | 4 - lightningd/peer_control.c | 163 +++----------------- lightningd/test/run-invoice-select-inchan.c | 9 -- wallet/test/run-wallet.c | 5 - 5 files changed, 66 insertions(+), 199 deletions(-) diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index ac582fef0e97..a4dd72b50522 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -953,6 +953,48 @@ openchannel2_signed_deserialize(struct openchannel2_psbt_payload *payload, return true; } +static void dualopend_tell_depth(struct channel *channel, + const struct bitcoin_txid *txid, + u32 depth) +{ + const u8 *msg; + u32 to_go; + + if (!channel->owner) { + log_debug(channel->log, + "Funding tx %s confirmed, but peer disconnected", + type_to_string(tmpctx, struct bitcoin_txid, txid)); + return; + } + + log_debug(channel->log, + "Funding tx %s confirmed, telling peer", + type_to_string(tmpctx, struct bitcoin_txid, txid)); + if (depth < channel->minimum_depth) { + to_go = channel->minimum_depth - depth; + } else + to_go = 0; + + /* Are we there yet? */ + if (to_go == 0) { + assert(channel->scid); + assert(bitcoin_txid_eq(&channel->funding.txid, txid)); + + channel_set_billboard(channel, false, + tal_fmt(tmpctx, "Funding depth reached" + " %d confirmations, alerting peer" + " we're locked-in.", + to_go)); + + msg = towire_dualopend_depth_reached(NULL, depth); + subd_send_msg(channel->owner, take(msg)); + } else + channel_set_billboard(channel, false, + tal_fmt(tmpctx, "Funding needs %d more" + " confirmations to be ready.", + to_go)); +} + static enum watch_result opening_depth_cb(struct lightningd *ld, const struct bitcoin_txid *txid, const struct bitcoin_tx *tx, @@ -1905,48 +1947,6 @@ static void handle_channel_locked(struct subd *dualopend, return; } -void dualopend_tell_depth(struct channel *channel, - const struct bitcoin_txid *txid, - u32 depth) -{ - const u8 *msg; - u32 to_go; - - if (!channel->owner) { - log_debug(channel->log, - "Funding tx %s confirmed, but peer disconnected", - type_to_string(tmpctx, struct bitcoin_txid, txid)); - return; - } - - log_debug(channel->log, - "Funding tx %s confirmed, telling peer", - type_to_string(tmpctx, struct bitcoin_txid, txid)); - if (depth < channel->minimum_depth) { - to_go = channel->minimum_depth - depth; - } else - to_go = 0; - - /* Are we there yet? */ - if (to_go == 0) { - assert(channel->scid); - assert(bitcoin_txid_eq(&channel->funding.txid, txid)); - - channel_set_billboard(channel, false, - tal_fmt(tmpctx, "Funding depth reached" - " %d confirmations, alerting peer" - " we're locked-in.", - to_go)); - - msg = towire_dualopend_depth_reached(NULL, depth); - subd_send_msg(channel->owner, take(msg)); - } else - channel_set_billboard(channel, false, - tal_fmt(tmpctx, "Funding needs %d more" - " confirmations to be ready.", - to_go)); -} - static void rbf_got_offer(struct subd *dualopend, const u8 *msg) { /* We expect the channel to still exist?! */ diff --git a/lightningd/dual_open_control.h b/lightningd/dual_open_control.h index 80a2d7ab1faa..e7b7989a0194 100644 --- a/lightningd/dual_open_control.h +++ b/lightningd/dual_open_control.h @@ -14,10 +14,6 @@ bool peer_restart_dualopend(struct peer *peer, struct channel *channel, bool from_abort); -void dualopend_tell_depth(struct channel *channel, - const struct bitcoin_txid *txid, - u32 depth); - void watch_opening_inflight(struct lightningd *ld, struct channel_inflight *inflight); diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index b931edd67e1b..c7417e449e14 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1787,61 +1787,6 @@ void peer_disconnect_done(struct lightningd *ld, const u8 *msg) maybe_delete_peer(p); } -static bool check_funding_details(const struct bitcoin_tx *tx, - const u8 *wscript, - struct amount_sat funding, - u32 funding_outnum) -{ - struct amount_asset asset; - - if (funding_outnum >= tx->wtx->num_outputs) - return false; - - asset = bitcoin_tx_output_get_amount(tx, funding_outnum); - - if (!amount_asset_is_main(&asset)) - return false; - - if (!amount_sat_eq(amount_asset_to_sat(&asset), funding)) - return false; - - return scripteq(scriptpubkey_p2wsh(tmpctx, wscript), - bitcoin_tx_output_get_script(tmpctx, tx, - funding_outnum)); -} - - -/* FIXME: Unify our watch code so we get notified by txout, instead, like - * the wallet code does. */ -static bool check_funding_tx(const struct bitcoin_tx *tx, - const struct channel *channel) -{ - struct channel_inflight *inflight; - const u8 *wscript; - wscript = bitcoin_redeem_2of2(tmpctx, - &channel->local_funding_pubkey, - &channel->channel_info.remote_fundingkey); - - /* Since we've enabled "RBF" for funding transactions, - * it's possible that it's one of "inflights". - * Worth noting that this check was added to prevent - * a peer from sending us a 'bogus' transaction id (that didn't - * actually contain the funding output). As of v2 (where - * RBF is introduced), this isn't a problem so much as - * both sides have full access to the funding transaction */ - if (check_funding_details(tx, wscript, channel->funding_sats, - channel->funding.n)) - return true; - - list_for_each(&channel->inflights, inflight, list) { - if (check_funding_details(tx, wscript, - inflight->funding->total_funds, - inflight->funding->outpoint.n)) - return true; - } - return false; -} - void update_channel_from_inflight(struct lightningd *ld, struct channel *channel, const struct channel_inflight *inflight) @@ -1897,36 +1842,6 @@ void update_channel_from_inflight(struct lightningd *ld, wallet_channel_save(ld->wallet, channel); } -static void subd_tell_depth(struct channel *channel, - const struct bitcoin_txid *txid, - unsigned int depth) -{ - /* We always tell every owner who's interested about the depth */ - switch (channel->state) { - case AWAITING_UNILATERAL: - case CHANNELD_SHUTTING_DOWN: - case CLOSINGD_SIGEXCHANGE: - case CLOSINGD_COMPLETE: - case FUNDING_SPEND_SEEN: - case ONCHAIN: - case CLOSED: - case DUALOPEND_OPEN_INIT: - case DUALOPEND_OPEN_COMMITTED: - return; - - case CHANNELD_NORMAL: - case CHANNELD_AWAITING_LOCKIN: - case CHANNELD_AWAITING_SPLICE: - channeld_tell_depth(channel, txid, depth); - return; - - case DUALOPEND_AWAITING_LOCKIN: - dualopend_tell_depth(channel, txid, depth); - return; - } - abort(); -} - static enum watch_result funding_depth_cb(struct lightningd *ld, const struct bitcoin_txid *txid, const struct bitcoin_tx *tx, @@ -1937,15 +1852,8 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, if (is_stub_scid(channel->scid)) return DELETE_WATCH; - /* Sanity check */ - if (!check_funding_tx(tx, channel)) { - channel_internal_error(channel, "Bad tx %s: %s", - type_to_string(tmpctx, - struct bitcoin_txid, txid), - type_to_string(tmpctx, - struct bitcoin_tx, tx)); - return DELETE_WATCH; - } + /* We only use this to watch the current funding tx */ + assert(bitcoin_txid_eq(txid, &channel->funding.txid)); channel->depth = depth; @@ -1957,17 +1865,24 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, if (depth == 0) { /* That's not entirely unexpected in early states */ switch (channel->state) { - case CHANNELD_AWAITING_SPLICE: case DUALOPEND_AWAITING_LOCKIN: - case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_OPEN_INIT: case DUALOPEND_OPEN_COMMITTED: + /* Shouldn't be here! */ + channel_internal_error(channel, + "Bad %s state: %s", + __func__, + channel_state_name(channel)); + return DELETE_WATCH; + case CHANNELD_AWAITING_LOCKIN: + /* That's not entirely unexpected in early states */ log_debug(channel->log, "Funding tx %s reorganized out!", type_to_string(tmpctx, struct bitcoin_txid, txid)); channel->scid = tal_free(channel->scid); return KEEP_WATCHING; /* But it's often Bad News in later states */ + case CHANNELD_AWAITING_SPLICE: case CHANNELD_NORMAL: /* If we opened, or it's zero-conf, we trust them anyway. */ if (channel->opener == LOCAL @@ -2004,14 +1919,13 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, if (!depthcb_update_scid(channel, txid, &channel->funding)) return DELETE_WATCH; - /* Always tell owner about depth change */ - subd_tell_depth(channel, txid, depth); - - /* Have we not reached minimum depth? */ - if (depth < channel->minimum_depth) - return KEEP_WATCHING; - switch (channel->state) { + /* We should not be in the callback! */ + case DUALOPEND_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: + abort(); + case AWAITING_UNILATERAL: case CHANNELD_SHUTTING_DOWN: case CLOSINGD_SIGEXCHANGE: @@ -2027,48 +1941,19 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, return DELETE_WATCH; case CHANNELD_AWAITING_LOCKIN: - if (channel->remote_channel_ready) + if (depth >= channel->minimum_depth + && channel->remote_channel_ready) { lockin_complete(channel, CHANNELD_AWAITING_LOCKIN); - return KEEP_WATCHING; - + } + /* Fall thru */ case CHANNELD_NORMAL: - if (depth < ANNOUNCE_MIN_DEPTH) + case CHANNELD_AWAITING_SPLICE: + channeld_tell_depth(channel, txid, depth); + if (depth < ANNOUNCE_MIN_DEPTH || depth < channel->minimum_depth) return KEEP_WATCHING; /* Normal state and past announce depth? Stop bothering us! */ return DELETE_WATCH; - - case DUALOPEND_OPEN_INIT: - case DUALOPEND_OPEN_COMMITTED: - /* You cannot be watching yet */ - abort(); - - case DUALOPEND_AWAITING_LOCKIN: - /* Update the channel's info to the correct tx, if needed to - * It's possible an 'inflight' has reached depth */ - if (!list_empty(&channel->inflights)) { - struct channel_inflight *inf; - - inf = channel_inflight_find(channel, txid); - if (!inf) { - log_debug(channel->log, - "Ignoring event for txid %s for channel" - " not found in inflights.", - type_to_string(tmpctx, - struct bitcoin_txid, - txid)); - return DELETE_WATCH; - } - update_channel_from_inflight(ld, channel, inf); - } - return KEEP_WATCHING; - - case CHANNELD_AWAITING_SPLICE: - /* Once we're waiting for splice, don't watch original any more */ - if (bitcoin_txid_eq(txid, &channel->funding.txid)) - return true; - return KEEP_WATCHING; } - abort(); } diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 418762514d52..bd6080970094 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -89,10 +89,6 @@ struct htlc_in *channel_has_htlc_in(struct channel *channel UNNEEDED) /* Generated stub for channel_has_htlc_out */ struct htlc_out *channel_has_htlc_out(struct channel *channel UNNEEDED) { fprintf(stderr, "channel_has_htlc_out called!\n"); abort(); } -/* Generated stub for channel_inflight_find */ -struct channel_inflight *channel_inflight_find(struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED) -{ fprintf(stderr, "channel_inflight_find called!\n"); abort(); } /* Generated stub for channel_internal_error */ void channel_internal_error(struct channel *channel UNNEEDED, const char *fmt UNNEEDED, ...) { fprintf(stderr, "channel_internal_error called!\n"); abort(); } @@ -206,11 +202,6 @@ bool depthcb_update_scid(struct channel *channel UNNEEDED, /* Generated stub for dev_disconnect_permanent */ bool dev_disconnect_permanent(struct lightningd *ld UNNEEDED) { fprintf(stderr, "dev_disconnect_permanent called!\n"); abort(); } -/* Generated stub for dualopend_tell_depth */ -void dualopend_tell_depth(struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED, - u32 depth UNNEEDED) -{ fprintf(stderr, "dualopend_tell_depth called!\n"); abort(); } /* Generated stub for encode_scriptpubkey_to_addr */ char *encode_scriptpubkey_to_addr(const tal_t *ctx UNNEEDED, const struct chainparams *chainparams UNNEEDED, diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index 813869a78299..c76624d8b90c 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -151,11 +151,6 @@ void derive_channel_id(struct channel_id *channel_id UNNEEDED, /* Generated stub for dev_disconnect_permanent */ bool dev_disconnect_permanent(struct lightningd *ld UNNEEDED) { fprintf(stderr, "dev_disconnect_permanent called!\n"); abort(); } -/* Generated stub for dualopend_tell_depth */ -void dualopend_tell_depth(struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED, - u32 depth UNNEEDED) -{ fprintf(stderr, "dualopend_tell_depth called!\n"); abort(); } /* Generated stub for ecdh */ void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED) { fprintf(stderr, "ecdh called!\n"); abort(); }