diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index 285433d30e54..95561ec57393 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -9,51 +9,60 @@ jobs: timeout-minutes: 120 strategy: fail-fast: true + matrix: + bitcoind-version: ["27.1"] steps: - name: Checkout uses: actions/checkout@v4 + - name: Download Bitcoin ${{ matrix.bitcoind-version }} & install binaries + run: | + export BITCOIND_VERSION=${{ matrix.bitcoind-version }} + export TARGET_ARCH="arm64-apple-darwin" + + wget https://bitcoincore.org/bin/bitcoin-core-${BITCOIND_VERSION}/bitcoin-${BITCOIND_VERSION}-${TARGET_ARCH}.tar.gz + tar -xzf bitcoin-${BITCOIND_VERSION}-${TARGET_ARCH}.tar.gz + sudo mv bitcoin-${BITCOIND_VERSION}/bin/* /usr/local/bin + rm -rf bitcoin-${BITCOIND_VERSION}-${TARGET_ARCH}.tar.gz bitcoin-${BITCOIND_VERSION} + - name: Install dependencies run: | export PATH="/usr/local/opt:/Users/runner/.local/bin:/Users/runner/Library/Python/3.10/bin:$PATH" - export BITCOIN_VERSION=27.1 - brew install wget autoconf automake libtool python@3.10 gnu-sed gettext libsodium - - ( - cd /tmp/ - wget https://storage.googleapis.com/c-lightning-tests/bitcoin-$BITCOIN_VERSION-osx64.tar.gz -O bitcoin.tar.gz - tar -xvzf bitcoin.tar.gz - sudo mv bitcoin-$BITCOIN_VERSION/bin/* /usr/local/bin - ) + brew install wget autoconf automake libtool python@3.10 gnu-sed gettext libsodium protobuf python3.10 -m pip install -U --user poetry wheel pip python3.10 -m poetry install python3.10 -m pip install -U --user mako - - ln -s /usr/local/Cellar/gettext/0.20.1/bin/xgettext /usr/local/opt - - - name: Build - env: - PYTEST_PAR: ${{ matrix.PYTEST_PAR }} - PYTEST_OPTS: ${{ matrix.PYTEST_OPTS }} - NO_PYTHON: ${{ matrix.NO_PYTHON }} - COPTFLAGS: ${{ matrix.COPTFLAGS }} - NETWORK: ${{ matrix.NETWORK }} - TEST_CMD: ${{ matrix.TEST_CMD }} - TEST_GROUP_COUNT: ${{ matrix.TEST_GROUP_COUNT }} - TEST_GROUP: ${{ matrix.TEST_GROUP }} - run: | - export PATH="/usr/local/opt:/Users/runner/.local/bin:/Users/runner/Library/Python/3.10/bin:/usr/local/opt:$PATH" - export LDFLAGS="-L/usr/local/opt/sqlite/lib" - export CPPFLAGS="-I/usr/local/opt/sqlite/include" - cat << EOF > pytest.ini - [pytest] - addopts=-p no:logging --color=yes --timeout=600 --timeout-method=thread --test-group-random-seed=42 --junitxml=report.xml --json-report --json-report-file=report.json --json-report-indent=2 - markers = - slow_test: marks tests as slow (deselect with '-m "not slow_test"') - EOF + sudo ln -s /usr/local/Cellar/gettext/0.20.1/bin/xgettext /usr/local/opt + + - name: Build and install + run: | + export CPATH=/opt/homebrew/include + export LIBRARY_PATH=/opt/homebrew/lib python3.10 -m poetry run ./configure --disable-valgrind --disable-compat python3.10 -m poetry run make + + # sudo PATH="/usr/local/opt:$PATH" LIBRARY_PATH=/opt/homebrew/lib CPATH=/opt/homebrew/include make install + + - name: Start bitcoind in regtest mode + run: | + bitcoind -regtest -daemon + sleep 5 + + - name: Generate initial block + run: | + bitcoin-cli -regtest createwallet default_wallet + bitcoin-cli -regtest generatetoaddress 1 $(bitcoin-cli -regtest getnewaddress) + sleep 2 + + - name: Start lightningd in regtest mode + run: | + lightningd/lightningd --network=regtest --log-file=/tmp/l1.log --daemon + sleep 5 + + - name: Verify lightningd is running + run: | + cli/lightning-cli --regtest getinfo diff --git a/.gitignore b/.gitignore index 27f6934f050a..602f9710da06 100644 --- a/.gitignore +++ b/.gitignore @@ -92,3 +92,4 @@ release/ # Ignore release verification Sha256Sums SHA256SUMS-* doc/.doc_version +autogenerate-examples-status.log diff --git a/.msggen.json b/.msggen.json index 4909f9f0505a..2d92d5c0f1a6 100644 --- a/.msggen.json +++ b/.msggen.json @@ -907,6 +907,17 @@ "Decode.invoice_paths[].path[].blinded_node_id": 1, "Decode.invoice_paths[].path[].encrypted_recipient_data": 2 }, + "DecodeInvreq_paths": { + "Decode.invreq_paths[].blinding": 2, + "Decode.invreq_paths[].first_node_id": 3, + "Decode.invreq_paths[].first_scid": 4, + "Decode.invreq_paths[].first_scid_dir": 1, + "Decode.invreq_paths[].path[]": 5 + }, + "DecodeInvreq_pathsPath": { + "Decode.invreq_paths[].path[].blinded_node_id": 1, + "Decode.invreq_paths[].path[].encrypted_recipient_data": 2 + }, "DecodeOffer_paths": { "Decode.offer_paths[].blinding": 2, "Decode.offer_paths[].first_node_id": 1, @@ -948,6 +959,7 @@ "Decode.invreq_chain": 27, "Decode.invreq_features": 29, "Decode.invreq_metadata": 25, + "Decode.invreq_paths[]": 85, "Decode.invreq_payer_id": 26, "Decode.invreq_payer_note": 31, "Decode.invreq_quantity": 30, @@ -963,6 +975,7 @@ "Decode.offer_features": 13, "Decode.offer_id": 3, "Decode.offer_issuer": 12, + "Decode.offer_issuer_id": 83, "Decode.offer_metadata": 5, "Decode.offer_node_id": 17, "Decode.offer_paths[]": 16, @@ -984,6 +997,7 @@ "Decode.unknown_offer_tlvs[]": 19, "Decode.valid": 2, "Decode.version": 71, + "Decode.warning_empty_blinded_path": 86, "Decode.warning_invalid_invoice_request_signature": 39, "Decode.warning_invalid_invoice_signature": 58, "Decode.warning_invalid_invreq_payer_note": 37, @@ -1002,6 +1016,7 @@ "Decode.warning_missing_invreq_metadata": 35, "Decode.warning_missing_invreq_payer_id": 36, "Decode.warning_missing_offer_description": 22, + "Decode.warning_missing_offer_issuer_id": 84, "Decode.warning_missing_offer_node_id": 20, "Decode.warning_rune_invalid_utf8": 74, "Decode.warning_unknown_offer_currency": 7 @@ -3335,39 +3350,39 @@ }, "AddGossip.message": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AddPsbtOutput": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AddPsbtOutput.destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AddPsbtOutput.estimated_added_weight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AddPsbtOutput.initialpsbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AddPsbtOutput.locktime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AddPsbtOutput.outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AddPsbtOutput.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AddPsbtOutput.satoshi": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once": { "added": "pre-v0.10.1", @@ -3375,87 +3390,87 @@ }, "AutoClean-Once.age": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.expiredinvoices": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.expiredinvoices.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.expiredinvoices.uncleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.failedforwards": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.failedforwards.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.failedforwards.uncleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.failedpays": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.failedpays.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.failedpays.uncleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.paidinvoices": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.paidinvoices.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.paidinvoices.uncleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.succeededforwards": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.succeededforwards.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.succeededforwards.uncleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.succeededpays": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.succeededpays.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.autoclean.succeededpays.uncleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Once.subsystem": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status": { "added": "pre-v0.10.1", @@ -3463,107 +3478,107 @@ }, "AutoClean-Status.autoclean": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.expiredinvoices": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.expiredinvoices.age": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.expiredinvoices.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.expiredinvoices.enabled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.failedforwards": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.failedforwards.age": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.failedforwards.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.failedforwards.enabled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.failedpays": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.failedpays.age": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.failedpays.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.failedpays.enabled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.paidinvoices": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.paidinvoices.age": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.paidinvoices.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.paidinvoices.enabled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.succeededforwards": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.succeededforwards.age": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.succeededforwards.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.succeededforwards.enabled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.succeededpays": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.succeededpays.age": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.succeededpays.cleaned": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.autoclean.succeededpays.enabled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoClean-Status.subsystem": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoCleanInvoice": { "added": "pre-v0.10.1", @@ -3571,15 +3586,15 @@ }, "AutoCleanInvoice.cycle_seconds": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoCleanInvoice.enabled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "AutoCleanInvoice.expired_by": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy": { "added": "pre-v0.10.1", @@ -3587,103 +3602,103 @@ }, "Bkpr-ChannelsApy.channels_apy[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].account": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].apy_in": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].apy_in_initial": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].apy_lease": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].apy_out": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].apy_out_initial": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].apy_total": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].apy_total_initial": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].channel_start_balance_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].fees_in_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].fees_out_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].lease_fee_earned_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].lease_fee_paid_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].our_start_balance_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].pushed_in_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].pushed_out_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].routed_in_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].routed_out_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].utilization_in": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].utilization_in_initial": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].utilization_out": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.channels_apy[].utilization_out_initial": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.end_time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ChannelsApy.start_time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-DumpIncomeCsv": { "added": "pre-v0.10.1", @@ -3691,23 +3706,23 @@ }, "Bkpr-DumpIncomeCsv.consolidate_fees": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-DumpIncomeCsv.csv_file": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-DumpIncomeCsv.csv_format": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-DumpIncomeCsv.end_time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-DumpIncomeCsv.start_time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect": { "added": "pre-v0.10.1", @@ -3715,71 +3730,71 @@ }, "Bkpr-Inspect.account": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].blockheight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].fees_paid_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].account": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].credit_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].currency": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].debit_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].originating_account": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].output_tag": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].output_value_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].payment_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].spend_tag": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].outputs[].spending_txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-Inspect.txs[].txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents": { "added": "pre-v0.10.1", @@ -3787,75 +3802,75 @@ }, "Bkpr-ListAccountEvents.account": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].account": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].blockheight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].credit_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].currency": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].debit_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].fees_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].is_rebalance": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].origin": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].outpoint": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].part_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].payment_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].tag": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].timestamp": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListAccountEvents.events[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListBalances": { "added": "pre-v0.10.1", @@ -3863,43 +3878,43 @@ }, "Bkpr-ListBalances.accounts[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListBalances.accounts[].account": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListBalances.accounts[].account_closed": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListBalances.accounts[].account_resolved": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListBalances.accounts[].balances[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListBalances.accounts[].balances[].balance_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListBalances.accounts[].balances[].coin_type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListBalances.accounts[].peer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListBalances.accounts[].resolved_at_block": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListBalances.accounts[].we_opened": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome": { "added": "pre-v0.10.1", @@ -3907,59 +3922,59 @@ }, "Bkpr-ListIncome.consolidate_fees": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.end_time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[].account": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[].credit_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[].currency": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[].debit_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[].description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[].outpoint": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[].payment_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[].tag": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[].timestamp": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.income_events[].txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Bkpr-ListIncome.start_time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "BlacklistRune": { "added": "pre-v0.10.1", @@ -3967,23 +3982,23 @@ }, "BlacklistRune.blacklist[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "BlacklistRune.blacklist[].end": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "BlacklistRune.blacklist[].start": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "BlacklistRune.end": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "BlacklistRune.start": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CheckMessage": { "added": "pre-v0.10.1", @@ -3991,19 +4006,19 @@ }, "CheckMessage.message": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CheckMessage.pubkey": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CheckMessage.verified": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CheckMessage.zbase": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CheckRune": { "added": "pre-v0.10.1", @@ -4011,23 +4026,23 @@ }, "CheckRune.method": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CheckRune.nodeid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CheckRune.params": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CheckRune.rune": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CheckRune.valid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Close": { "added": "pre-v0.10.1", @@ -4035,43 +4050,43 @@ }, "Close.destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Close.fee_negotiation_step": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Close.feerange[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Close.force_lease_closed": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Close.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Close.tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Close.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Close.type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Close.unilateraltimeout": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Close.wrong_funding": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Connect": { "added": "pre-v0.10.1", @@ -4079,43 +4094,43 @@ }, "Connect.address": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Connect.address.address": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Connect.address.port": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Connect.address.socket": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Connect.address.type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Connect.direction": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Connect.features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Connect.host": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Connect.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Connect.port": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice": { "added": "pre-v0.10.1", @@ -4123,83 +4138,83 @@ }, "CreateInvoice.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.amount_received_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.created_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "CreateInvoice.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.expires_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.invreq_payer_note": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.invstring": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.local_offer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.paid_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.paid_outpoint": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "CreateInvoice.paid_outpoint.outnum": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "CreateInvoice.paid_outpoint.txid": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "CreateInvoice.pay_index": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateInvoice.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateOnion": { "added": "pre-v0.10.1", @@ -4207,35 +4222,35 @@ }, "CreateOnion.assocdata": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateOnion.hops[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateOnion.hops[].payload": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateOnion.hops[].pubkey": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateOnion.onion": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateOnion.onion_size": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateOnion.session_key": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateOnion.shared_secrets[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateRune": { "added": "pre-v0.10.1", @@ -4243,19 +4258,19 @@ }, "CreateRune.restrictions": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateRune.rune": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateRune.unique_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "CreateRune.warning_unrestricted_rune": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Datastore": { "added": "pre-v0.10.1", @@ -4263,43 +4278,43 @@ }, "Datastore.generation": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Datastore.hex": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Datastore.key": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Datastore.mode": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Datastore.string": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DatastoreUsage": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "DatastoreUsage.datastoreusage": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "DatastoreUsage.datastoreusage.key": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "DatastoreUsage.datastoreusage.total_bytes": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "DatastoreUsage.key": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "Decode": { "added": "v23.05", @@ -4307,547 +4322,591 @@ }, "Decode.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.currency": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.currency_minor_unit": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.decrypted": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "Decode.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.description_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.extra[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.extra[].data": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.extra[].tag": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.fallbacks[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.fallbacks[].addr": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.fallbacks[].hex": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.fallbacks[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.fallbacks[].warning_invoice_fallbacks_version_invalid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.hex": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_fallbacks[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_fallbacks[].address": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_fallbacks[].hex": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_fallbacks[].version": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].blinding": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].first_node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].first_scid": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].first_scid_dir": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].path[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].path[].blinded_node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].path[].encrypted_recipient_data": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].payinfo": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].payinfo.cltv_expiry_delta": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].payinfo.features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].payinfo.fee_base_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_paths[].payinfo.fee_proportional_millionths": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_recurrence_basetime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invoice_relative_expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invreq_amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invreq_chain": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invreq_features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invreq_metadata": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null + }, + "Decode.invreq_paths[]": { + "added": "v24.08", + "deprecated": null + }, + "Decode.invreq_paths[].blinding": { + "added": "v24.08", + "deprecated": null + }, + "Decode.invreq_paths[].first_node_id": { + "added": "v24.08", + "deprecated": null + }, + "Decode.invreq_paths[].first_scid": { + "added": "v24.08", + "deprecated": null + }, + "Decode.invreq_paths[].first_scid_dir": { + "added": "v24.08", + "deprecated": null + }, + "Decode.invreq_paths[].path[]": { + "added": "v24.08", + "deprecated": null + }, + "Decode.invreq_paths[].path[].blinded_node_id": { + "added": "v24.08", + "deprecated": null + }, + "Decode.invreq_paths[].path[].encrypted_recipient_data": { + "added": "v24.08", + "deprecated": null }, "Decode.invreq_payer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invreq_payer_note": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invreq_quantity": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invreq_recurrence_counter": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.invreq_recurrence_start": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.min_final_cltv_expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_absolute_expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_chains[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_currency": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_issuer": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null + }, + "Decode.offer_issuer_id": { + "added": "v24.08", + "deprecated": null }, "Decode.offer_metadata": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": "v24.08" }, "Decode.offer_paths[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_paths[].blinding": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_paths[].first_node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_paths[].first_scid": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Decode.offer_paths[].first_scid_dir": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Decode.offer_paths[].path[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_paths[].path[].blinded_node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_paths[].path[].encrypted_recipient_data": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_quantity_max": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence.basetime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence.limit": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence.paywindow": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence.paywindow.proportional_amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence.paywindow.seconds_after": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence.paywindow.seconds_before": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence.period": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence.start_any_period": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence.time_unit": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.offer_recurrence.time_unit_name": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.payee": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.payment_metadata": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.payment_secret": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.restrictions[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.restrictions[].alternatives[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.restrictions[].summary": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.routes": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.routes[][]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.routes[][].cltv_expiry_delta": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.routes[][].fee_base_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.routes[][].fee_proportional_millionths": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.routes[][].pubkey": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.routes[][].short_channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.signature": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.string": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unique_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_invoice_request_tlvs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_invoice_request_tlvs[].length": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_invoice_request_tlvs[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_invoice_request_tlvs[].value": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_invoice_tlvs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_invoice_tlvs[].length": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_invoice_tlvs[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_invoice_tlvs[].value": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_offer_tlvs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_offer_tlvs[].length": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_offer_tlvs[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.unknown_offer_tlvs[].value": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.valid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.version": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null + }, + "Decode.warning_empty_blinded_path": { + "added": "v24.08", + "deprecated": null }, "Decode.warning_invalid_invoice_request_signature": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_invalid_invoice_signature": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_invalid_invreq_payer_note": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_invalid_offer_currency": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_invalid_offer_description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_invalid_offer_issuer": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invoice_amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invoice_blindedpay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invoice_created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invoice_node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invoice_paths": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invoice_payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invoice_recurrence_basetime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invoice_request_signature": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invoice_signature": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invreq_metadata": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_invreq_payer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_missing_offer_description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null + }, + "Decode.warning_missing_offer_issuer_id": { + "added": "v24.08", + "deprecated": null }, "Decode.warning_missing_offer_node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": "v24.08" }, "Decode.warning_rune_invalid_utf8": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Decode.warning_unknown_offer_currency": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay": { "added": "v23.05", @@ -4855,115 +4914,115 @@ }, "DecodePay.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.currency": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.description_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.extra[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.extra[].data": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.extra[].tag": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.fallbacks[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.fallbacks[].addr": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.fallbacks[].hex": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.fallbacks[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.min_final_cltv_expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.payee": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.payment_metadata": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.payment_secret": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.routes": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.routes[][]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.routes[][].cltv_expiry_delta": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.routes[][].fee_base_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.routes[][].fee_proportional_millionths": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.routes[][].pubkey": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.routes[][].short_channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DecodePay.signature": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelDatastore": { "added": "pre-v0.10.1", @@ -4971,19 +5030,19 @@ }, "DelDatastore.generation": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelDatastore.hex": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelDatastore.key": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelDatastore.string": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelExpiredInvoice": { "added": "pre-v0.10.1", @@ -4991,7 +5050,7 @@ }, "DelExpiredInvoice.maxexpirytime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelForward": { "added": "pre-v0.10.1", @@ -4999,15 +5058,15 @@ }, "DelForward.in_channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelForward.in_htlc_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelForward.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice": { "added": "pre-v0.10.1", @@ -5015,71 +5074,71 @@ }, "DelInvoice.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.amount_received_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.created_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "DelInvoice.desconly": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.expires_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.invreq_payer_note": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.local_offer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.paid_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.pay_index": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelInvoice.updated_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "DelPay": { "added": "pre-v0.10.1", @@ -5087,91 +5146,91 @@ }, "DelPay.groupid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.partid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].completed_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].created_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "DelPay.payments[].destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].erroronion": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].groupid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].partid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DelPay.payments[].updated_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "DelPay.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Dev-Forget-Channel": { "added": "pre-v0.10.1", @@ -5179,31 +5238,31 @@ }, "Dev-Forget-Channel.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Dev-Forget-Channel.force": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Dev-Forget-Channel.forced": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Dev-Forget-Channel.funding_txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Dev-Forget-Channel.funding_unspent": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Dev-Forget-Channel.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Dev-Forget-Channel.short_channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableInvoiceRequest": { "added": "pre-v0.10.1", @@ -5211,27 +5270,27 @@ }, "DisableInvoiceRequest.active": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableInvoiceRequest.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableInvoiceRequest.invreq_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableInvoiceRequest.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableInvoiceRequest.single_use": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableInvoiceRequest.used": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableOffer": { "added": "pre-v0.10.1", @@ -5239,27 +5298,27 @@ }, "DisableOffer.active": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableOffer.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableOffer.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableOffer.offer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableOffer.single_use": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "DisableOffer.used": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Disconnect": { "added": "pre-v0.10.1", @@ -5267,11 +5326,11 @@ }, "Disconnect.force": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Disconnect.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "EmergencyRecover": { "added": "pre-v0.10.1", @@ -5279,7 +5338,7 @@ }, "EmergencyRecover.stubs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates": { "added": "pre-v0.10.1", @@ -5287,35 +5346,35 @@ }, "Feerates.onchain_fee_estimates": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.onchain_fee_estimates.htlc_success_satoshis": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.onchain_fee_estimates.htlc_timeout_satoshis": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.onchain_fee_estimates.mutual_close_satoshis": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.onchain_fee_estimates.opening_channel_satoshis": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.onchain_fee_estimates.unilateral_close_nonanchor_satoshis": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "Feerates.onchain_fee_estimates.unilateral_close_satoshis": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkb": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkb.delayed_to_us": { "added": "pre-v0.10.1", @@ -5323,23 +5382,23 @@ }, "Feerates.perkb.estimates[]": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Feerates.perkb.estimates[].blockcount": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Feerates.perkb.estimates[].feerate": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Feerates.perkb.estimates[].smoothed_feerate": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Feerates.perkb.floor": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Feerates.perkb.htlc_resolution": { "added": "pre-v0.10.1", @@ -5347,35 +5406,35 @@ }, "Feerates.perkb.max_acceptable": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkb.min_acceptable": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkb.mutual_close": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkb.opening": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkb.penalty": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkb.unilateral_anchor_close": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "Feerates.perkb.unilateral_close": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkw": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkw.delayed_to_us": { "added": "pre-v0.10.1", @@ -5383,23 +5442,23 @@ }, "Feerates.perkw.estimates[]": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Feerates.perkw.estimates[].blockcount": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Feerates.perkw.estimates[].feerate": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Feerates.perkw.estimates[].smoothed_feerate": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Feerates.perkw.floor": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Feerates.perkw.htlc_resolution": { "added": "pre-v0.10.1", @@ -5407,39 +5466,39 @@ }, "Feerates.perkw.max_acceptable": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkw.min_acceptable": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkw.mutual_close": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkw.opening": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkw.penalty": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.perkw.unilateral_anchor_close": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "Feerates.perkw.unilateral_close": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.style": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Feerates.warning_missing_feerates": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice": { "added": "pre-v0.10.1", @@ -5447,87 +5506,87 @@ }, "FetchInvoice.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.changes": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.changes.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.changes.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.changes.description_appended": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.changes.vendor": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.changes.vendor_removed": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.invoice": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.next_period": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.next_period.counter": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.next_period.endtime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.next_period.paywindow_end": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.next_period.paywindow_start": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.next_period.starttime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.offer": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.payer_note": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.quantity": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.recurrence_counter": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.recurrence_label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.recurrence_start": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FetchInvoice.timeout": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel": { "added": "pre-v0.10.1", @@ -5535,83 +5594,83 @@ }, "FundChannel.amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.announce": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.channel_type": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "FundChannel.channel_type.bits[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "FundChannel.channel_type.names[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "FundChannel.channel_type[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "FundChannel.close_to": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.compact_lease": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.minconf": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.mindepth": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.push_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.request_amt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.reserve": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel.utxos[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Cancel": { "added": "pre-v0.10.1", @@ -5619,11 +5678,11 @@ }, "FundChannel_Cancel.cancelled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Cancel.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Complete": { "added": "pre-v0.10.1", @@ -5631,19 +5690,19 @@ }, "FundChannel_Complete.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Complete.commitments_secured": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Complete.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Complete.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start": { "added": "pre-v0.10.1", @@ -5651,63 +5710,63 @@ }, "FundChannel_Start.amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.announce": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.channel_type": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "FundChannel_Start.channel_type.bits[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "FundChannel_Start.channel_type.names[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "FundChannel_Start.channel_type[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.close_to": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.funding_address": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.mindepth": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.push_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.reserve": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.scriptpubkey": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundChannel_Start.warning_usage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt": { "added": "pre-v0.10.1", @@ -5715,87 +5774,87 @@ }, "FundPsbt.change_outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.estimated_final_weight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.excess_as_change": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.excess_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.feerate_per_kw": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.locktime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.min_witness_weight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.minconf": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.nonwrapped": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "FundPsbt.opening_anchor_channel": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "FundPsbt.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.reservations[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.reservations[].reserved": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.reservations[].reserved_to_block": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.reservations[].txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.reservations[].vout": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.reservations[].was_reserved": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.reserve": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.satoshi": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FundPsbt.startweight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate": { "added": "pre-v0.10.1", @@ -5803,71 +5862,71 @@ }, "FunderUpdate.channel_fee_max_base_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.channel_fee_max_proportional_thousandths": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.compact_lease": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.fund_probability": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.funding_weight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.fuzz_percent": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.lease_fee_base_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.lease_fee_basis": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.leases_only": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.max_their_funding_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.min_their_funding_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.per_channel_max_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.per_channel_min_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.policy": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.policy_mod": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.reserve_tank_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "FunderUpdate.summary": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog": { "added": "pre-v0.10.1", @@ -5875,51 +5934,51 @@ }, "GetLog.bytes_max": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.bytes_used": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.level": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.log[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.log[].data": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.log[].log": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.log[].node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.log[].num_skipped": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.log[].source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.log[].time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetLog.log[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute": { "added": "pre-v0.10.1", @@ -5927,63 +5986,63 @@ }, "GetRoute.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.cltv": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.exclude[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.fromid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.fuzzpercent": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.maxhops": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.riskfactor": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.route[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.route[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.route[].channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.route[].delay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.route[].direction": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.route[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "GetRoute.route[].style": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo": { "added": "pre-v0.10.1", @@ -5991,119 +6050,119 @@ }, "Getinfo.address[]": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "Getinfo.address[].address": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.address[].port": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.address[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.alias": { "added": "v0.12.0", - "deprecated": false + "deprecated": null }, "Getinfo.binding[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.binding[].address": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.binding[].port": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.binding[].socket": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.binding[].subtype": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.binding[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.blockheight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.color": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.fees_collected_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.lightning-dir": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.network": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.num_active_channels": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.num_inactive_channels": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.num_peers": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.num_pending_channels": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.our_features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.our_features.channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.our_features.init": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.our_features.invoice": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.our_features.node": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.version": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.warning_bitcoind_sync": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Getinfo.warning_lightningd_sync": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Help": { "added": "pre-v0.10.1", @@ -6111,31 +6170,31 @@ }, "Help.command": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Help.format-hint": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Help.help[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Help.help[].category": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Help.help[].command": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Help.help[].description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Help.help[].verbose": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice": { "added": "pre-v0.10.1", @@ -6143,79 +6202,79 @@ }, "Invoice.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.cltv": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.created_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "Invoice.deschashonly": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.expires_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.exposeprivatechannels": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.fallbacks[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.payment_secret": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.warning_capacity": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.warning_deadends": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.warning_mpp": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.warning_offline": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Invoice.warning_private_unused": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "InvoiceRequest": { "added": "pre-v0.10.1", @@ -6223,43 +6282,43 @@ }, "InvoiceRequest.absolute_expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "InvoiceRequest.active": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "InvoiceRequest.amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "InvoiceRequest.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "InvoiceRequest.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "InvoiceRequest.invreq_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "InvoiceRequest.issuer": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "InvoiceRequest.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "InvoiceRequest.single_use": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "InvoiceRequest.used": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend": { "added": "pre-v0.10.1", @@ -6267,67 +6326,67 @@ }, "KeySend.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.exemptfee": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.extratlvs": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.maxdelay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.maxfeepercent": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.parts": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.retry_for": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.routehints": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "KeySend.warning_partial_completion": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels": { "added": "pre-v0.10.1", @@ -6335,83 +6394,83 @@ }, "ListChannels.channels[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].active": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].base_fee_millisatoshi": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].channel_flags": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].delay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].direction": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].fee_per_millionth": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].htlc_maximum_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].htlc_minimum_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].last_update": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].message_flags": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].public": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].short_channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.channels[].source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.short_channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListChannels.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels": { "added": "v23.05", @@ -6419,127 +6478,127 @@ }, "ListClosedChannels.closedchannels[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].alias": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].alias.local": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].alias.remote": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].channel_type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].channel_type.bits[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].channel_type.names[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].close_cause": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].closer": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].final_to_us_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].funding_fee_paid_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].funding_fee_rcvd_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].funding_outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].funding_pushed_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].funding_txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].last_commitment_fee_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].last_commitment_txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].last_stable_connection": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].leased": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].max_to_us_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].min_to_us_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].opener": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].peer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].private": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].short_channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].total_htlcs_sent": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].total_local_commitments": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].total_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.closedchannels[].total_remote_commitments": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListClosedChannels.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs": { "added": "pre-v0.10.1", @@ -6615,7 +6674,7 @@ }, "ListConfigs.commit-feerate-offset": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListConfigs.commit-time": { "added": "pre-v0.10.1", @@ -6627,619 +6686,619 @@ }, "ListConfigs.config": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.accept-htlc-tlv-types": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.accept-htlc-tlv-types.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.accept-htlc-tlv-types.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.addr": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.addr.sources[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.addr.values_str[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.alias": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.alias.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.alias.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.allow-deprecated-apis": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.allow-deprecated-apis.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.allow-deprecated-apis.value_bool": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.always-use-proxy": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.always-use-proxy.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.always-use-proxy.value_bool": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr-discovered": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr-discovered-port": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr-discovered-port.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr-discovered-port.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr-discovered.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr-discovered.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr-dns": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr-dns.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr-dns.value_bool": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr.sources[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.announce-addr.values_str[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.autolisten": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.autolisten.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.autolisten.value_bool": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.bind-addr": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.bind-addr.sources[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.bind-addr.values_str[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.clear-plugins": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.clear-plugins.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.clear-plugins.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.cltv-delta": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.cltv-delta.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.cltv-delta.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.cltv-final": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.cltv-final.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.cltv-final.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.commit-fee": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.commit-fee.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.commit-fee.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.commit-feerate-offset": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.commit-feerate-offset.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.commit-feerate-offset.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.commit-time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.commit-time.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.commit-time.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.conf": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.conf.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.conf.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.daemon": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.daemon.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.daemon.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.database-upgrade": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.database-upgrade.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.database-upgrade.value_bool": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.developer": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.developer.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.developer.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.disable-dns": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.disable-dns.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.disable-dns.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.disable-mpp": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.disable-mpp.plugin": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.disable-mpp.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.disable-mpp.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.disable-plugin": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.disable-plugin.sources[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.disable-plugin.values_str[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.encrypted-hsm": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.encrypted-hsm.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.encrypted-hsm.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-anchors": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-anchors.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-anchors.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-dual-fund": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-dual-fund.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-dual-fund.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-offers": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-offers.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-offers.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-onion-messages": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-onion-messages.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-onion-messages.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-peer-storage": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-peer-storage.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-peer-storage.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-shutdown-wrong-funding": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-shutdown-wrong-funding.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-shutdown-wrong-funding.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-splicing": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-splicing.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.experimental-splicing.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.fee-base": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.fee-base.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.fee-base.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.fee-per-satoshi": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.fee-per-satoshi.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.fee-per-satoshi.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.fetchinvoice-noconnect": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.fetchinvoice-noconnect.plugin": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.fetchinvoice-noconnect.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.fetchinvoice-noconnect.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.force-feerates": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.force-feerates.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.force-feerates.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.funding-confirms": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.funding-confirms.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.funding-confirms.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.htlc-maximum-msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.htlc-maximum-msat.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.htlc-maximum-msat.value_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.htlc-minimum-msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.htlc-minimum-msat.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.htlc-minimum-msat.value_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.ignore-fee-limits": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.ignore-fee-limits.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.ignore-fee-limits.value_bool": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.important-plugin": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.important-plugin.sources[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.important-plugin.values_str[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.large-channels": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.large-channels.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.large-channels.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.lightning-dir": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.lightning-dir.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.lightning-dir.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-file": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-file.sources[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-file.values_str[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-level": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-level.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-level.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-prefix": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-prefix.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-prefix.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-timestamps": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-timestamps.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.log-timestamps.value_bool": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.mainnet": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.mainnet.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.mainnet.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.max-concurrent-htlcs": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.max-concurrent-htlcs.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.max-concurrent-htlcs.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.max-dust-htlc-exposure-msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.max-dust-htlc-exposure-msat.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.max-dust-htlc-exposure-msat.value_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.max-locktime-blocks": { "added": "pre-v0.10.1", @@ -7247,243 +7306,243 @@ }, "ListConfigs.configs.max-locktime-blocks.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.max-locktime-blocks.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.min-capacity-sat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.min-capacity-sat.dynamic": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.min-capacity-sat.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.min-capacity-sat.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.network": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.network.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.network.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.offline": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.offline.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.offline.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.pid-file": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.pid-file.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.pid-file.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.plugin": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.plugin-dir": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.plugin-dir.sources[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.plugin-dir.values_str[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.plugin.sources[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.plugin.values_str[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.proxy": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.proxy.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.proxy.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.regtest": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.regtest.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.regtest.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.require-confirmed-inputs": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.require-confirmed-inputs.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.require-confirmed-inputs.value_bool": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rescan": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rescan.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rescan.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rgb": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rgb.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rgb.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rpc-file": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rpc-file-mode": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rpc-file-mode.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rpc-file-mode.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rpc-file.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.rpc-file.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.signet": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.signet.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.signet.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.subdaemon": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.subdaemon.sources[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.subdaemon.values_str[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.testnet": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.testnet.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.testnet.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.tor-service-password": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.tor-service-password.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.tor-service-password.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.wallet": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.wallet.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.wallet.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.watchtime-blocks": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.watchtime-blocks.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.configs.watchtime-blocks.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.daemon": { "added": "pre-v0.10.1", @@ -7499,7 +7558,7 @@ }, "ListConfigs.developer": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListConfigs.disable-dns": { "added": "pre-v0.10.1", @@ -7583,19 +7642,19 @@ }, "ListConfigs.important-plugins[].name": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.important-plugins[].options": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.important-plugins[].path": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.invoices-onchain-fallback": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListConfigs.large-channels": { "added": "pre-v0.10.1", @@ -7639,7 +7698,7 @@ }, "ListConfigs.min-emergency-msat": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListConfigs.network": { "added": "pre-v0.10.1", @@ -7659,15 +7718,15 @@ }, "ListConfigs.plugins[].name": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.plugins[].options": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.plugins[].path": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListConfigs.proxy": { "added": "pre-v0.10.1", @@ -7715,27 +7774,27 @@ }, "ListDatastore.datastore[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListDatastore.datastore[].generation": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListDatastore.datastore[].hex": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListDatastore.datastore[].key[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListDatastore.datastore[].string": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListDatastore.key": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards": { "added": "pre-v0.10.1", @@ -7743,91 +7802,91 @@ }, "ListForwards.forwards[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].created_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].failcode": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].failreason": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].fee_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].in_channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].in_htlc_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].in_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].out_channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].out_htlc_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].out_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].received_time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].resolved_time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].style": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.forwards[].updated_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListForwards.in_channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListForwards.limit": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListForwards.out_channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListForwards.start": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListForwards.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds": { "added": "pre-v0.10.1", @@ -7835,91 +7894,91 @@ }, "ListFunds.channels[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.channels[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.channels[].channel_id": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "ListFunds.channels[].connected": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.channels[].funding_output": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.channels[].funding_txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.channels[].our_amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.channels[].peer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.channels[].short_channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.channels[].state": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[].address": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[].blockheight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[].output": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[].redeemscript": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[].reserved": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[].reserved_to_block": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[].scriptpubkey": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[].status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.outputs[].txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListFunds.spent": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListHtlcs": { "added": "v23.02", @@ -7927,39 +7986,39 @@ }, "ListHtlcs.htlcs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListHtlcs.htlcs[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListHtlcs.htlcs[].direction": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListHtlcs.htlcs[].expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListHtlcs.htlcs[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListHtlcs.htlcs[].payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListHtlcs.htlcs[].short_channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListHtlcs.htlcs[].state": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListHtlcs.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoiceRequests": { "added": "pre-v0.10.1", @@ -7967,39 +8026,39 @@ }, "ListInvoiceRequests.active_only": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoiceRequests.invoicerequests[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoiceRequests.invoicerequests[].active": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoiceRequests.invoicerequests[].bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoiceRequests.invoicerequests[].invreq_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoiceRequests.invoicerequests[].label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoiceRequests.invoicerequests[].single_use": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoiceRequests.invoicerequests[].used": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoiceRequests.invreq_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices": { "added": "pre-v0.10.1", @@ -8007,111 +8066,111 @@ }, "ListInvoices.index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].amount_received_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].created_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].expires_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].invreq_payer_note": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].local_offer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].paid_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].paid_outpoint": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].paid_outpoint.outnum": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].paid_outpoint.txid": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].pay_index": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.invoices[].updated_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListInvoices.invstring": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.limit": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListInvoices.offer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListInvoices.start": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListNodes": { "added": "pre-v0.10.1", @@ -8119,75 +8178,75 @@ }, "ListNodes.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].addresses[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].addresses[].address": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].addresses[].port": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].addresses[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].alias": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].color": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].last_timestamp": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].nodeid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].option_will_fund": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].option_will_fund.channel_fee_max_base_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].option_will_fund.channel_fee_max_proportional_thousandths": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].option_will_fund.compact_lease": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].option_will_fund.funding_weight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].option_will_fund.lease_fee_base_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListNodes.nodes[].option_will_fund.lease_fee_basis": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListOffers": { "added": "pre-v0.10.1", @@ -8195,39 +8254,39 @@ }, "ListOffers.active_only": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListOffers.offer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListOffers.offers[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListOffers.offers[].active": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListOffers.offers[].bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListOffers.offers[].label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListOffers.offers[].offer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListOffers.offers[].single_use": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListOffers.offers[].used": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays": { "added": "pre-v0.10.1", @@ -8235,83 +8294,83 @@ }, "ListPays.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].completed_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].erroronion": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].number_of_parts": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.pays[].status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPays.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeerChannels": { "added": "v23.02", @@ -8319,423 +8378,423 @@ }, "ListPeerChannels.channels[]": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].alias": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].alias.local": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].alias.remote": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].channel_id": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].channel_type": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].channel_type.bits[]": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].channel_type.names[]": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].close_to": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].close_to_addr": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].closer": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].direction": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].dust_limit_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].features[]": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].fee_base_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].fee_proportional_millionths": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].feerate": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].feerate.perkb": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].feerate.perkw": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].funding": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].funding.fee_paid_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].funding.fee_rcvd_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].funding.local_funds_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].funding.pushed_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].funding.remote_funds_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].funding_outnum": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].funding_txid": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].htlcs[]": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].htlcs[].amount_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].htlcs[].direction": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].htlcs[].expiry": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].htlcs[].id": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].htlcs[].local_trimmed": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].htlcs[].payment_hash": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].htlcs[].state": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].htlcs[].status": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].ignore_fee_limits": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].in_fulfilled_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].in_offered_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].in_payments_fulfilled": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].in_payments_offered": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].inflight[]": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].inflight[].feerate": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].inflight[].funding_outnum": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].inflight[].funding_txid": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].inflight[].our_funding_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].inflight[].scratch_txid": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].inflight[].splice_amount": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].inflight[].total_funding_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].initial_feerate": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].last_feerate": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].last_stable_connection": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].last_tx_fee_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].lost_state": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].max_accepted_htlcs": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].max_to_us_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].max_total_htlc_in_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].maximum_htlc_out_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].min_to_us_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].minimum_htlc_in_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].minimum_htlc_out_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].next_fee_step": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].next_feerate": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].opener": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].our_reserve_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].our_to_self_delay": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].out_fulfilled_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].out_offered_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].out_payments_fulfilled": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].out_payments_offered": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].owner": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].peer_connected": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].peer_id": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].private": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].receivable_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].reestablished": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].scratch_txid": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].short_channel_id": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].spendable_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].state": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].state_changes[]": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].state_changes[].cause": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].state_changes[].message": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].state_changes[].new_state": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].state_changes[].old_state": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].state_changes[].timestamp": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].status[]": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].their_reserve_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].their_to_self_delay": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].to_us_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].total_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.local": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.local.cltv_expiry_delta": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.local.fee_base_msat": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.local.fee_proportional_millionths": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.local.htlc_maximum_msat": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.local.htlc_minimum_msat": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.remote": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.remote.cltv_expiry_delta": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.remote.fee_base_msat": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.remote.fee_proportional_millionths": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.remote.htlc_maximum_msat": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.channels[].updates.remote.htlc_minimum_msat": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "ListPeerChannels.id": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeers": { "added": "pre-v0.10.1", @@ -8743,15 +8802,15 @@ }, "ListPeers.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.level": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[]": { "added": "pre-v0.10.1", @@ -8759,375 +8818,375 @@ }, "ListPeers.peers[].channels[].alias": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].alias.local": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].alias.remote": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].close_to": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].close_to_addr": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].closer": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].dust_limit_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].features[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].fee_base_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].fee_proportional_millionths": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].feerate.perkb": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].feerate.perkw": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].funding": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].funding.fee_paid_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].funding.fee_rcvd_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].funding.local_funds_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].funding.pushed_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].funding.remote_funds_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].funding_outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].funding_txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].htlcs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].htlcs[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].htlcs[].direction": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].htlcs[].expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].htlcs[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].htlcs[].local_trimmed": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].htlcs[].payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].htlcs[].state": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].htlcs[].status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].in_fulfilled_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].in_offered_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].in_payments_fulfilled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].in_payments_offered": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].inflight[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].inflight[].feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].inflight[].funding_outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].inflight[].funding_txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].inflight[].our_funding_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].inflight[].scratch_txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].inflight[].splice_amount": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].inflight[].total_funding_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].initial_feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].last_feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].max_accepted_htlcs": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].max_to_us_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].max_total_htlc_in_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].maximum_htlc_out_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].min_to_us_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].minimum_htlc_in_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].minimum_htlc_out_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].next_fee_step": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].next_feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].opener": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].our_reserve_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].our_to_self_delay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].out_fulfilled_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].out_offered_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].out_payments_fulfilled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].out_payments_offered": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].owner": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].private": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].receivable_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].scratch_txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].short_channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].spendable_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].state": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].state_changes[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].state_changes[].cause": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].state_changes[].message": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].state_changes[].new_state": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].state_changes[].old_state": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].state_changes[].timestamp": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].status[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].their_reserve_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].their_to_self_delay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].to_us_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].channels[].total_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].connected": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].features": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].log[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].log[].data": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].log[].log": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].log[].node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].log[].num_skipped": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].log[].source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].log[].time": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].log[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].netaddr[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].num_channels": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "ListPeers.peers[].remote_addr": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays": { "added": "pre-v0.10.1", @@ -9135,103 +9194,103 @@ }, "ListSendPays.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListSendPays.limit": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListSendPays.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].completed_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].created_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].erroronion": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].groupid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].partid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListSendPays.payments[].updated_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListSendPays.start": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ListSendPays.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions": { "added": "pre-v0.10.1", @@ -9239,79 +9298,79 @@ }, "ListTransactions.transactions[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].blockheight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].inputs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].inputs[].channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].inputs[].index": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].inputs[].sequence": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].inputs[].txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].inputs[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].locktime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].outputs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].outputs[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].outputs[].channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].outputs[].index": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].outputs[].scriptPubKey": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].outputs[].type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].rawtx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].txindex": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ListTransactions.transactions[].version": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MakeSecret": { "added": "pre-v0.10.1", @@ -9319,15 +9378,15 @@ }, "MakeSecret.hex": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MakeSecret.secret": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MakeSecret.string": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel": { "added": "pre-v0.10.1", @@ -9335,127 +9394,127 @@ }, "MultiFundChannel.channel_ids[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.channel_ids[].channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.channel_ids[].channel_type": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "MultiFundChannel.channel_ids[].channel_type.bits[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "MultiFundChannel.channel_ids[].channel_type.names[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "MultiFundChannel.channel_ids[].close_to": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.channel_ids[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.channel_ids[].outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.commitment_feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.destinations[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.destinations[].amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.destinations[].announce": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.destinations[].close_to": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.destinations[].compact_lease": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.destinations[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.destinations[].mindepth": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.destinations[].push_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.destinations[].request_amt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.destinations[].reserve": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.failed[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.failed[].error": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.failed[].error.code": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.failed[].error.message": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.failed[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.failed[].method": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.minchannels": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.minconf": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiFundChannel.utxos[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiWithdraw": { "added": "pre-v0.10.1", @@ -9463,27 +9522,27 @@ }, "MultiWithdraw.feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiWithdraw.minconf": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiWithdraw.outputs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiWithdraw.tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiWithdraw.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "MultiWithdraw.utxos[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "NewAddr": { "added": "pre-v0.10.1", @@ -9491,15 +9550,15 @@ }, "NewAddr.addresstype": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "NewAddr.bech32": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "NewAddr.p2tr": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "Offer": { "added": "pre-v0.10.1", @@ -9507,103 +9566,103 @@ }, "Offer.absolute_expiry": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.active": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.created": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.issuer": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.offer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.quantity_max": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence.period": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence.time_unit": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence.time_unit_name": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence_base": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence_base.basetime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence_base.start_any_period": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence_limit": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence_paywindow": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence_paywindow.proportional_amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence_paywindow.seconds_after": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence_paywindow.seconds_before": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.recurrence_start_any_period": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "Offer.single_use": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Offer.used": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Abort": { "added": "pre-v0.10.1", @@ -9611,15 +9670,15 @@ }, "OpenChannel_Abort.channel_canceled": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Abort.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Abort.reason": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump": { "added": "pre-v0.10.1", @@ -9627,47 +9686,47 @@ }, "OpenChannel_Bump.amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump.channel_type": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump.channel_type.bits[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump.channel_type.names[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump.commitments_secured": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump.funding_feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump.funding_serial": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump.initialpsbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Bump.requires_confirmed_inputs": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init": { "added": "pre-v0.10.1", @@ -9675,75 +9734,75 @@ }, "OpenChannel_Init.amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.announce": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.channel_type": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.channel_type.bits[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.channel_type.names[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.channel_type[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.close_to": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.commitment_feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.commitments_secured": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.compact_lease": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.funding_feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.funding_serial": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.initialpsbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.request_amt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Init.requires_confirmed_inputs": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Signed": { "added": "pre-v0.10.1", @@ -9751,19 +9810,19 @@ }, "OpenChannel_Signed.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Signed.signed_psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Signed.tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Signed.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Update": { "added": "pre-v0.10.1", @@ -9771,39 +9830,39 @@ }, "OpenChannel_Update.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Update.channel_type": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "OpenChannel_Update.channel_type.bits[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "OpenChannel_Update.channel_type.names[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "OpenChannel_Update.close_to": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Update.commitments_secured": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Update.funding_outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Update.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "OpenChannel_Update.requires_confirmed_inputs": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay": { "added": "pre-v0.10.1", @@ -9811,87 +9870,87 @@ }, "Pay.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.exclude": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.exemptfee": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.localinvreqid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.maxdelay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.maxfee": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.maxfeepercent": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.partial_msat": { "added": "v23.05", - "deprecated": false + "deprecated": null }, "Pay.parts": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.retry_for": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.riskfactor": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Pay.warning_partial_completion": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Ping": { "added": "pre-v0.10.1", @@ -9899,19 +9958,19 @@ }, "Ping.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Ping.len": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Ping.pongbytes": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Ping.totlen": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Plugin": { "added": "pre-v0.10.1", @@ -9919,43 +9978,43 @@ }, "Plugin.command": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Plugin.directory": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Plugin.options[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Plugin.plugin": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Plugin.plugins[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Plugin.plugins[].active": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Plugin.plugins[].dynamic": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Plugin.plugins[].name": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Plugin.result": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Plugin.subcommand": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "PreApproveInvoice": { "added": "v23.02", @@ -9963,7 +10022,7 @@ }, "PreApproveInvoice.bolt11": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "PreApproveKeysend": { "added": "v23.02", @@ -9971,15 +10030,15 @@ }, "PreApproveKeysend.amount_msat": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "PreApproveKeysend.destination": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "PreApproveKeysend.payment_hash": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "Recover": { "added": "pre-v0.10.1", @@ -9987,11 +10046,11 @@ }, "Recover.hsmsecret": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Recover.result": { "added": "v24.05", - "deprecated": false + "deprecated": null }, "RecoverChannel": { "added": "pre-v0.10.1", @@ -9999,11 +10058,11 @@ }, "RecoverChannel.scb[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RecoverChannel.stubs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay": { "added": "pre-v0.10.1", @@ -10011,63 +10070,63 @@ }, "RenePay.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.dev_use_shadow": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.invstring": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.maxdelay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.maxfee": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.parts": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.retry_for": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePay.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus": { "added": "pre-v0.10.1", @@ -10075,55 +10134,55 @@ }, "RenePayStatus.invstring": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].groupid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].notes[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].parts": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "RenePayStatus.paystatus[].status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ReserveInputs": { "added": "pre-v0.10.1", @@ -10131,39 +10190,39 @@ }, "ReserveInputs.exclusive": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ReserveInputs.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ReserveInputs.reservations[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ReserveInputs.reservations[].reserved": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ReserveInputs.reservations[].reserved_to_block": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ReserveInputs.reservations[].txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ReserveInputs.reservations[].vout": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ReserveInputs.reservations[].was_reserved": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ReserveInputs.reserve": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendCustomMsg": { "added": "v0.10.1", @@ -10171,15 +10230,15 @@ }, "SendCustomMsg.msg": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendCustomMsg.node_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendCustomMsg.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice": { "added": "pre-v0.10.1", @@ -10187,67 +10246,67 @@ }, "SendInvoice.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.amount_received_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.created_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "SendInvoice.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.expires_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.invreq": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.paid_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.pay_index": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.quantity": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.timeout": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendInvoice.updated_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "SendOnion": { "added": "pre-v0.10.1", @@ -10255,99 +10314,99 @@ }, "SendOnion.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.created_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "SendOnion.description": { "added": "v0.11.0", - "deprecated": false + "deprecated": null }, "SendOnion.destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.first_hop": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.first_hop.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.first_hop.delay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.first_hop.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.groupid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.localinvreqid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.message": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.onion": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.partid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.shared_secrets[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnion.updated_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "SendOnionMessage": { "added": "pre-v0.10.1", @@ -10355,23 +10414,23 @@ }, "SendOnionMessage.blinding": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnionMessage.first_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnionMessage.hops[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnionMessage.hops[].node": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendOnionMessage.hops[].tlv": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay": { "added": "pre-v0.10.1", @@ -10379,107 +10438,107 @@ }, "SendPay.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.completed_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.created_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "SendPay.description": { "added": "v0.11.0", - "deprecated": false + "deprecated": null }, "SendPay.destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.groupid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.localinvreqid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.message": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.partid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.payment_metadata": { "added": "v0.11.0", - "deprecated": false + "deprecated": null }, "SendPay.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.payment_secret": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.route[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.route[].amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.route[].channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.route[].delay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.route[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPay.updated_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "SendPsbt": { "added": "pre-v0.10.1", @@ -10487,19 +10546,19 @@ }, "SendPsbt.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPsbt.reserve": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPsbt.tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SendPsbt.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel": { "added": "pre-v0.10.1", @@ -10507,75 +10566,75 @@ }, "SetChannel.channels[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.channels[].channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.channels[].fee_base_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.channels[].fee_proportional_millionths": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.channels[].ignore_fee_limits": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "SetChannel.channels[].maximum_htlc_out_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.channels[].minimum_htlc_out_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.channels[].peer_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.channels[].short_channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.channels[].warning_htlcmax_too_high": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.channels[].warning_htlcmin_too_low": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.enforcedelay": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.feebase": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.feeppm": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.htlcmax": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.htlcmin": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetChannel.ignorefeelimits": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "SetConfig": { "added": "pre-v0.10.1", @@ -10583,47 +10642,47 @@ }, "SetConfig.config": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetConfig.config.config": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetConfig.config.dynamic": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetConfig.config.plugin": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetConfig.config.set": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetConfig.config.source": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetConfig.config.value_bool": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetConfig.config.value_int": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetConfig.config.value_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetConfig.config.value_str": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetConfig.val": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetPsbtVersion": { "added": "pre-v0.10.1", @@ -10631,11 +10690,11 @@ }, "SetPsbtVersion.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SetPsbtVersion.version": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes": { "added": "pre-v0.10.1", @@ -10643,67 +10702,67 @@ }, "ShowRunes.rune": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].blacklisted": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].last_used": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].our_rune": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].restrictions[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].restrictions[].alternatives[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].restrictions[].alternatives[].condition": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].restrictions[].alternatives[].english": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].restrictions[].alternatives[].fieldname": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].restrictions[].alternatives[].value": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].restrictions[].english": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].restrictions_as_english": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].rune": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].stored": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "ShowRunes.runes[].unique_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SignInvoice": { "added": "v23.02", @@ -10711,11 +10770,11 @@ }, "SignInvoice.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SignInvoice.invstring": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SignMessage": { "added": "pre-v0.10.1", @@ -10723,19 +10782,19 @@ }, "SignMessage.message": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SignMessage.recid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SignMessage.signature": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SignMessage.zbase": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SignPsbt": { "added": "pre-v0.10.1", @@ -10743,15 +10802,15 @@ }, "SignPsbt.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SignPsbt.signed_psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "SignPsbt.signonly[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Init": { "added": "pre-v0.10.1", @@ -10759,27 +10818,27 @@ }, "Splice_Init.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Init.feerate_per_kw": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Init.force_feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Init.initialpsbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Init.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Init.relative_amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Signed": { "added": "pre-v0.10.1", @@ -10787,27 +10846,27 @@ }, "Splice_Signed.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Signed.outnum": { "added": "v24.08", - "deprecated": false + "deprecated": null }, "Splice_Signed.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Signed.sign_first": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Signed.tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Signed.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Update": { "added": "pre-v0.10.1", @@ -10815,15 +10874,15 @@ }, "Splice_Update.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Update.commitments_secured": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Splice_Update.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "StaticBackup": { "added": "pre-v0.10.1", @@ -10831,7 +10890,7 @@ }, "StaticBackup.scb[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Stop": { "added": "pre-v0.10.1", @@ -10839,7 +10898,7 @@ }, "Stop.result": { "added": "v24.05", - "deprecated": false + "deprecated": null }, "TxDiscard": { "added": "pre-v0.10.1", @@ -10847,11 +10906,11 @@ }, "TxDiscard.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxDiscard.unsigned_tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxPrepare": { "added": "pre-v0.10.1", @@ -10859,31 +10918,31 @@ }, "TxPrepare.feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxPrepare.minconf": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxPrepare.outputs[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxPrepare.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxPrepare.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxPrepare.unsigned_tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxPrepare.utxos[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxSend": { "added": "pre-v0.10.1", @@ -10891,15 +10950,15 @@ }, "TxSend.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxSend.tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "TxSend.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UnreserveInputs": { "added": "pre-v0.10.1", @@ -10907,35 +10966,35 @@ }, "UnreserveInputs.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UnreserveInputs.reservations[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UnreserveInputs.reservations[].reserved": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UnreserveInputs.reservations[].reserved_to_block": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UnreserveInputs.reservations[].txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UnreserveInputs.reservations[].vout": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UnreserveInputs.reservations[].was_reserved": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UnreserveInputs.reserve": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UpgradeWallet": { "added": "pre-v0.10.1", @@ -10943,27 +11002,27 @@ }, "UpgradeWallet.feerate": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "UpgradeWallet.psbt": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "UpgradeWallet.reservedok": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "UpgradeWallet.tx": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "UpgradeWallet.txid": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "UpgradeWallet.upgraded_outs": { "added": "v23.02", - "deprecated": false + "deprecated": null }, "UtxoPsbt": { "added": "pre-v0.10.1", @@ -10971,87 +11030,87 @@ }, "UtxoPsbt.change_outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.estimated_final_weight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.excess_as_change": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.excess_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.feerate_per_kw": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.locktime": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.min_witness_weight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.opening_anchor_channel": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "UtxoPsbt.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.reservations[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.reservations[].reserved": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.reservations[].reserved_to_block": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.reservations[].txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.reservations[].vout": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.reservations[].was_reserved": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.reserve": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.reservedok": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.satoshi": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.startweight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "UtxoPsbt.utxos[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait": { "added": "v23.08", @@ -11059,79 +11118,79 @@ }, "Wait.created": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.deleted": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.groupid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.in_channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.in_htlc_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.in_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.out_channel": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.partid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.details.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.indexname": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.nextvalue": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.subsystem": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Wait.updated": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice": { "added": "pre-v0.10.1", @@ -11139,79 +11198,79 @@ }, "WaitAnyInvoice.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.amount_received_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.created_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.expires_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.lastpay_index": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.paid_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.paid_outpoint": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.paid_outpoint.outnum": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.paid_outpoint.txid": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.pay_index": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.timeout": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitAnyInvoice.updated_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "WaitBlockHeight": { "added": "pre-v0.10.1", @@ -11219,11 +11278,11 @@ }, "WaitBlockHeight.blockheight": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitBlockHeight.timeout": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice": { "added": "pre-v0.10.1", @@ -11231,71 +11290,71 @@ }, "WaitInvoice.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.amount_received_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.created_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "WaitInvoice.description": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.expires_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.paid_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.paid_outpoint": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "WaitInvoice.paid_outpoint.outnum": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "WaitInvoice.paid_outpoint.txid": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "WaitInvoice.pay_index": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitInvoice.updated_index": { "added": "v23.08", - "deprecated": false + "deprecated": null }, "WaitSendPay": { "added": "pre-v0.10.1", @@ -11303,71 +11362,71 @@ }, "WaitSendPay.amount_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.amount_sent_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.bolt11": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.bolt12": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.completed_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.created_at": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.created_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "WaitSendPay.destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.groupid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.label": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.partid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.payment_hash": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.payment_preimage": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.status": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.timeout": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "WaitSendPay.updated_index": { "added": "v23.11", - "deprecated": false + "deprecated": null }, "Withdraw": { "added": "pre-v0.10.1", @@ -11375,35 +11434,35 @@ }, "Withdraw.destination": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Withdraw.feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Withdraw.minconf": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Withdraw.psbt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Withdraw.satoshi": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Withdraw.tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Withdraw.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "Withdraw.utxos[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "block_added": { "added": "v22.11", @@ -11411,11 +11470,11 @@ }, "block_added.hash": { "added": "v22.11", - "deprecated": false + "deprecated": null }, "block_added.height": { "added": "v22.11", - "deprecated": false + "deprecated": null }, "channel_open_failed": { "added": "pre-v0.10.1", @@ -11423,7 +11482,7 @@ }, "channel_open_failed.channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "channel_opened": { "added": "pre-v0.10.1", @@ -11431,19 +11490,19 @@ }, "channel_opened.channel_ready": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "channel_opened.funding_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "channel_opened.funding_txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "channel_opened.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "connect": { "added": "pre-v0.10.1", @@ -11451,31 +11510,31 @@ }, "connect.address": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "connect.address.address": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "connect.address.port": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "connect.address.socket": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "connect.address.type": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "connect.direction": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "connect.id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "custommsg": { "added": "v24.02", @@ -11483,11 +11542,11 @@ }, "custommsg.payload": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "custommsg.peer_id": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "multifundchannel": { "added": "pre-v0.10.1", @@ -11495,127 +11554,127 @@ }, "multifundchannel.channel_ids[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.channel_ids[].channel_id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.channel_ids[].channel_type": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "multifundchannel.channel_ids[].channel_type.bits[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "multifundchannel.channel_ids[].channel_type.names[]": { "added": "v24.02", - "deprecated": false + "deprecated": null }, "multifundchannel.channel_ids[].close_to": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.channel_ids[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.channel_ids[].outnum": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.commitment_feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.destinations[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.destinations[].amount": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.destinations[].announce": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.destinations[].close_to": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.destinations[].compact_lease": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.destinations[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.destinations[].mindepth": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.destinations[].push_msat": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.destinations[].request_amt": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.destinations[].reserve": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.failed[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.failed[].error": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.failed[].error.code": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.failed[].error.message": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.failed[].id": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.failed[].method": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.feerate": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.minchannels": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.minconf": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.tx": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.txid": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null }, "multifundchannel.utxos[]": { "added": "pre-v0.10.1", - "deprecated": false + "deprecated": null } } } \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 0f13eaa235bb..7ecd83ae16da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -19,24 +19,24 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.1.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "asn1-rs" -version = "0.5.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d" dependencies = [ "asn1-rs-derive", "asn1-rs-impl", @@ -50,25 +50,25 @@ dependencies = [ [[package]] name = "asn1-rs-derive" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.72", "synstructure", ] [[package]] name = "asn1-rs-impl" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.72", ] [[package]] @@ -90,25 +90,25 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", ] [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "axum" @@ -157,9 +157,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -178,9 +178,15 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.4" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bech32" @@ -190,9 +196,9 @@ checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] name = "bitcoin" -version = "0.30.1" +version = "0.30.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e99ff7289b20a7385f66a0feda78af2fc119d28fb56aea8886a9cd0a4abdd75" +checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462" dependencies = [ "bech32", "bitcoin-private", @@ -226,30 +232,27 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" [[package]] name = "cc" -version = "1.0.83" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" [[package]] name = "cfg-if" @@ -331,15 +334,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "der-parser" -version = "8.2.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" dependencies = [ "asn1-rs", "displaydoc", @@ -351,32 +354,35 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] [[package]] name = "displaydoc" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", ] [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -393,30 +399,19 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.3" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ - "errno-dragonfly", "libc", "windows-sys", ] -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fixedbitset" @@ -432,9 +427,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -447,9 +442,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -463,9 +458,9 @@ checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -474,38 +469,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -521,9 +516,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -532,15 +527,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "h2" -version = "0.3.21" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -548,7 +543,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -563,9 +558,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" @@ -575,9 +570,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -593,18 +588,18 @@ checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ "windows-sys", ] [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -613,9 +608,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -624,9 +619,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -642,9 +637,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -657,7 +652,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2", "tokio", "tower-service", "tracing", @@ -688,22 +683,22 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.5", ] [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ "hermit-abi", - "rustix", + "libc", "windows-sys", ] @@ -718,42 +713,42 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "linux-raw-sys" -version = "0.4.7" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "matchers" @@ -772,9 +767,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.6.3" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -790,19 +785,20 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.10" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" dependencies = [ + "hermit-abi", "libc", "wasi", "windows-sys", @@ -836,67 +832,61 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "object" -version = "0.32.1" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" dependencies = [ "memchr", ] [[package]] name = "oid-registry" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d" dependencies = [ "asn1-rs", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "overload" @@ -906,54 +896,55 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pem" -version = "1.1.1" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.13.1", + "base64 0.22.1", + "serde", ] [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.0.0", + "indexmap 2.2.6", ] [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -961,6 +952,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -979,9 +976,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -1042,9 +1039,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1081,36 +1078,28 @@ dependencies = [ [[package]] name = "rcgen" -version = "0.10.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +checksum = "54077e1872c46788540de1ea3d7f4ccb1983d12f9aa909b234468676c1a36779" dependencies = [ "pem", - "ring", + "ring 0.17.8", + "rustls-pki-types", "time", "x509-parser", "yasna", ] -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "regex" -version = "1.9.5" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.8", - "regex-syntax 0.7.5", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] @@ -1124,13 +1113,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.8" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.5", + "regex-syntax 0.8.4", ] [[package]] @@ -1141,9 +1130,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "ring" @@ -1154,17 +1143,32 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys", +] + [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rusticata-macros" @@ -1177,11 +1181,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.14" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -1195,40 +1199,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" dependencies = [ "log", - "ring", + "ring 0.16.20", "sct", "webpki", ] [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.4", + "base64 0.21.7", ] +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring", - "untrusted", + "ring 0.17.8", + "untrusted 0.9.0", ] [[package]] @@ -1253,31 +1263,32 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.196" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -1302,25 +1313,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" - -[[package]] -name = "socket2" -version = "0.4.9" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys", @@ -1332,6 +1333,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "syn" version = "1.0.109" @@ -1345,9 +1352,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -1362,63 +1369,61 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "synstructure" -version = "0.12.6" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", - "unicode-xid", + "syn 2.0.72", ] [[package]] name = "tempfile" -version = "3.8.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", "rustix", "windows-sys", ] [[package]] name = "termcolor" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -1426,12 +1431,14 @@ dependencies = [ [[package]] name = "time" -version = "0.3.29" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "num-conv", + "powerfmt", "serde", "time-core", "time-macros", @@ -1445,26 +1452,26 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] [[package]] name = "tokio" -version = "1.36.0" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", - "socket2 0.5.5", + "socket2", "tokio-macros", "windows-sys", ] @@ -1481,13 +1488,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", ] [[package]] @@ -1503,9 +1510,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -1515,9 +1522,9 @@ dependencies = [ [[package]] name = "tokio-test" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b3cbabd3ae862100094ae433e1def582cf86451b4e9bf83aa7ac1d8a7d719" +checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" dependencies = [ "async-stream", "bytes", @@ -1528,16 +1535,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -1639,7 +1645,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", ] [[package]] @@ -1693,9 +1699,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "unicode-ident" @@ -1704,16 +1710,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] -name = "unicode-xid" -version = "0.2.4" +name = "untrusted" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "valuable" @@ -1738,9 +1744,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1748,24 +1754,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1773,28 +1779,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.72", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -1802,12 +1808,12 @@ dependencies = [ [[package]] name = "webpki" -version = "0.22.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e74f82d49d545ad128049b7e88f6576df2da6b02e9ce565c6f533be576957e" +checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring", - "untrusted", + "ring 0.17.8", + "untrusted 0.9.0", ] [[package]] @@ -1840,11 +1846,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys", ] [[package]] @@ -1855,22 +1861,23 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -1879,60 +1886,65 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "x509-parser" -version = "0.14.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" dependencies = [ "asn1-rs", - "base64 0.13.1", "data-encoding", "der-parser", "lazy_static", "nom", "oid-registry", - "ring", + "ring 0.17.8", "rusticata-macros", "thiserror", "time", diff --git a/Makefile b/Makefile index adbd60098c6a..43055ffa0e1d 100644 --- a/Makefile +++ b/Makefile @@ -252,7 +252,7 @@ CPATH := /usr/local/include LIBRARY_PATH := /usr/local/lib endif -CPPFLAGS += -DCLN_NEXT_VERSION="\"$(CLN_NEXT_VERSION)\"" -DBINTOPKGLIBEXECDIR="\"$(shell sh tools/rel.sh $(bindir) $(pkglibexecdir))\"" -DCCAN_TAL_NEVER_RETURN_NULL=1 +CPPFLAGS += -DCLN_NEXT_VERSION="\"$(CLN_NEXT_VERSION)\"" -DPKGLIBEXECDIR="\"$(pkglibexecdir)\"" -DPLUGINDIR="\"$(plugindir)\"" -DCCAN_TAL_NEVER_RETURN_NULL=1 CFLAGS = $(CPPFLAGS) $(CWARNFLAGS) $(CDEBUGFLAGS) $(COPTFLAGS) -I $(CCANDIR) $(EXTERNAL_INCLUDE_FLAGS) -I . -I$(CPATH) $(SQLITE3_CFLAGS) $(POSTGRES_INCLUDE) $(FEATURES) $(COVFLAGS) $(DEV_CFLAGS) -DSHACHAIN_BITS=48 -DJSMN_PARENT_LINKS $(PIE_CFLAGS) $(COMPAT_CFLAGS) $(CSANFLAGS) # If CFLAGS is already set in the environment of make (to whatever value, it @@ -658,7 +658,7 @@ $(ALL_TEST_PROGRAMS) $(ALL_FUZZ_TARGETS): %: %.o # uses some ccan modules internally). We want to rely on -lwallycore etc. # (as per EXTERNAL_LDLIBS) so we filter them out here. $(ALL_PROGRAMS) $(ALL_TEST_PROGRAMS): - @$(call VERBOSE, "ld $@", $(LINK.o) $(filter-out %.a,$^) $(LOADLIBES) $(EXTERNAL_LDLIBS) $(LDLIBS) libccan.a -o $@) + @$(call VERBOSE, "ld $@", $(LINK.o) $(filter-out %.a,$^) $(LOADLIBES) $(EXTERNAL_LDLIBS) $(LDLIBS) libccan.a $($(@)_LDLIBS) -o $@) # We special case the fuzzing target binaries, as they need to link against libfuzzer, # which brings its own main(). @@ -743,7 +743,11 @@ update-wss-proxy-version: cd plugins/wss-proxy && $(MAKE) upgrade-version update-poetry-lock: - poetry update clnrest wss-proxy pyln-client pyln-proto pyln-testing + poetry update clnrest wss-proxy pyln-client pyln-proto pyln-testing update-reckless-version + +update-reckless-version: + @if [ -z "$(NEW_VERSION)" ]; then echo "Set NEW_VERSION!" >&2; exit 1; fi + @sed -i "s/__VERSION__ = '\([.-z]*\)'/__VERSION__ = '$(NEW_VERSION)'/" tools/reckless update-mocks: $(ALL_TEST_PROGRAMS:%=update-mocks/%.c) @@ -882,7 +886,7 @@ uninstall: installcheck: all-programs @rm -rf testinstall || true $(MAKE) DESTDIR=$$(pwd)/testinstall install - testinstall$(bindir)/lightningd --test-daemons-only --lightning-dir=testinstall + DEV_LIGHTNINGD_DESTDIR_PREFIX=$$(pwd)/testinstall/ testinstall$(bindir)/lightningd --test-daemons-only --lightning-dir=testinstall $(MAKE) DESTDIR=$$(pwd)/testinstall uninstall @if test `find testinstall '!' -type d | wc -l` -ne 0; then \ echo 'make uninstall left some files in testinstall directory!'; \ diff --git a/bitcoin/psbt.c b/bitcoin/psbt.c index 12ed9030af6f..5a1a2494679a 100644 --- a/bitcoin/psbt.c +++ b/bitcoin/psbt.c @@ -449,10 +449,9 @@ void psbt_elements_normalize_fees(struct wally_psbt *psbt) } void wally_psbt_input_get_txid(const struct wally_psbt_input *in, - struct bitcoin_txid *txid) + struct bitcoin_txid *txid) { - BUILD_ASSERT(sizeof(struct bitcoin_txid) == sizeof(in->txhash)); - memcpy(txid, in->txhash, sizeof(struct bitcoin_txid)); + CROSS_TYPE_ASSIGNMENT(txid, &in->txhash); } bool psbt_has_input(const struct wally_psbt *psbt, @@ -886,25 +885,21 @@ struct amount_sat psbt_compute_fee(const struct wally_psbt *psbt) } bool wally_psbt_input_spends(const struct wally_psbt_input *input, - const struct bitcoin_outpoint *outpoint) + const struct bitcoin_outpoint *outpoint) { - /* Useful, as tx_part can have some NULL inputs */ - if (!input) - return false; - BUILD_ASSERT(sizeof(outpoint->txid) == sizeof(input->txhash)); + /* Useful, as tx_part can have some NULL inputs */ + if (!input) + return false; if (input->index != outpoint->n) return false; - if (memcmp(&outpoint->txid, input->txhash, sizeof(outpoint->txid)) != 0) - return false; - return true; + return CROSS_TYPE_EQ(&outpoint->txid, &input->txhash); } void wally_psbt_input_get_outpoint(const struct wally_psbt_input *in, - struct bitcoin_outpoint *outpoint) + struct bitcoin_outpoint *outpoint) { - BUILD_ASSERT(sizeof(struct bitcoin_txid) == sizeof(in->txhash)); - memcpy(&outpoint->txid, in->txhash, sizeof(struct bitcoin_txid)); - outpoint->n = in->index; + CROSS_TYPE_ASSIGNMENT(&outpoint->txid, &in->txhash); + outpoint->n = in->index; } const u8 *wally_psbt_output_get_script(const tal_t *ctx, diff --git a/bitcoin/short_channel_id.h b/bitcoin/short_channel_id.h index 8dd2dacb5c60..cf382d693804 100644 --- a/bitcoin/short_channel_id.h +++ b/bitcoin/short_channel_id.h @@ -41,6 +41,12 @@ struct short_channel_id_dir { int dir; }; +static inline bool short_channel_id_dir_eq(const struct short_channel_id_dir *a, + const struct short_channel_id_dir *b) +{ + return short_channel_id_eq(a->scid, b->scid) && a->dir == b->dir; +} + static inline u32 short_channel_id_blocknum(struct short_channel_id scid) { return scid.u64 >> 40; diff --git a/bitcoin/tx.c b/bitcoin/tx.c index 4245fda3b932..2d844b0c6c8c 100644 --- a/bitcoin/tx.c +++ b/bitcoin/tx.c @@ -403,8 +403,7 @@ void bitcoin_tx_input_set_outpoint(struct bitcoin_tx *tx, int innum, assert(innum < tx->wtx->num_inputs); in = &tx->wtx->inputs[innum]; - BUILD_ASSERT(sizeof(struct bitcoin_txid) == sizeof(in->txhash)); - memcpy(in->txhash, &outpoint->txid, sizeof(struct bitcoin_txid)); + CROSS_TYPE_ASSIGNMENT(&in->txhash, &outpoint->txid); in->index = outpoint->n; } @@ -412,15 +411,13 @@ void bitcoin_tx_input_set_outpoint(struct bitcoin_tx *tx, int innum, void wally_tx_input_get_txid(const struct wally_tx_input *in, struct bitcoin_txid *txid) { - BUILD_ASSERT(sizeof(struct bitcoin_txid) == sizeof(in->txhash)); - memcpy(txid, in->txhash, sizeof(struct bitcoin_txid)); + CROSS_TYPE_ASSIGNMENT(txid, &in->txhash); } void wally_tx_input_get_outpoint(const struct wally_tx_input *in, struct bitcoin_outpoint *outpoint) { - BUILD_ASSERT(sizeof(struct bitcoin_txid) == sizeof(in->txhash)); - memcpy(&outpoint->txid, in->txhash, sizeof(struct bitcoin_txid)); + wally_tx_input_get_txid(in, &outpoint->txid); outpoint->n = in->index; } @@ -824,8 +821,7 @@ bool wally_tx_input_spends(const struct wally_tx_input *input, /* Useful, as tx_part can have some NULL inputs */ if (!input) return false; - BUILD_ASSERT(sizeof(outpoint->txid) == sizeof(input->txhash)); - if (memcmp(&outpoint->txid, input->txhash, sizeof(outpoint->txid)) != 0) + if (!CROSS_TYPE_EQ(&outpoint->txid, &input->txhash)) return false; return input->index == outpoint->n; } diff --git a/cli/lightning-cli.c b/cli/lightning-cli.c index 117f6b19b99c..31a47f7fdf0b 100644 --- a/cli/lightning-cli.c +++ b/cli/lightning-cli.c @@ -179,13 +179,9 @@ static void human_help(char *buffer, const jsmntok_t *result) unsigned int i; /* `curr` is used as a temporary token */ const jsmntok_t *curr; - const char *prev_cat; /* Contains all commands objects, which have the following structure : * { - * "command": "The command name and usage", - * "category": "The command category", - * "description": "The command's description", - * "verbose": "The command's detailed description" + * "command": "The command name and usage" * } */ const jsmntok_t * help_array = json_get_member(buffer, result, "help"); @@ -198,22 +194,11 @@ static void human_help(char *buffer, const jsmntok_t *result) asort(help, tal_count(help), compare_help, buffer); - prev_cat = ""; for (i = 0; i < tal_count(help); i++) { - const jsmntok_t *category, *command, *desc; - - category = json_get_member(buffer, help[i], "category"); - if (category && !json_tok_streq(buffer, category, prev_cat)) { - prev_cat = json_strdup(help, buffer, category); - printf("=== %s ===\n\n", prev_cat); - } - + const jsmntok_t *command; command = json_get_member(buffer, help[i], "command"); - desc = json_get_member(buffer, help[i], "description"); - printf("%.*s\n", + printf("%.*s\n\n", command->end - command->start, buffer + command->start); - printf(" %.*s\n\n", - desc->end - desc->start, buffer + desc->start); } tal_free(help); diff --git a/cln-grpc/proto/node.proto b/cln-grpc/proto/node.proto index 193dc8fad931..5db68396bb0f 100644 --- a/cln-grpc/proto/node.proto +++ b/cln-grpc/proto/node.proto @@ -1660,6 +1660,10 @@ message DecodeResponse { optional string description = 80; optional bytes features = 81; optional DecodeRoutehintList routes = 82; + optional bytes offer_issuer_id = 83; + optional string warning_missing_offer_issuer_id = 84; + repeated DecodeInvreq_paths invreq_paths = 85; + optional string warning_empty_blinded_path = 86; } message DecodeOffer_paths { @@ -1675,6 +1679,19 @@ message DecodeOffer_recurrencePaywindow { optional bool proportional_amount = 3; } +message DecodeInvreq_paths { + optional uint32 first_scid_dir = 1; + bytes blinding = 2; + optional bytes first_node_id = 3; + optional string first_scid = 4; + repeated DecodeInvreq_pathsPath path = 5; +} + +message DecodeInvreq_pathsPath { + bytes blinded_node_id = 1; + bytes encrypted_recipient_data = 2; +} + message DecodeInvoice_pathsPath { bytes blinded_node_id = 1; bytes encrypted_recipient_data = 2; @@ -3307,9 +3324,6 @@ message HelpResponse { message HelpHelp { string command = 1; - string category = 2; - string description = 3; - string verbose = 4; } message PreapprovekeysendRequest { diff --git a/cln-grpc/src/convert.rs b/cln-grpc/src/convert.rs index 612227ca9500..2cf5b263eca1 100644 --- a/cln-grpc/src/convert.rs +++ b/cln-grpc/src/convert.rs @@ -1483,6 +1483,30 @@ impl From for pb::DecodeInvoiceFallbacks { } } +#[allow(unused_variables)] +impl From for pb::DecodeInvreqPathsPath { + fn from(c: responses::DecodeInvreq_pathsPath) -> Self { + Self { + blinded_node_id: c.blinded_node_id.serialize().to_vec(), // Rule #2 for type pubkey + encrypted_recipient_data: hex::decode(&c.encrypted_recipient_data).unwrap(), // Rule #2 for type hex + } + } +} + +#[allow(unused_variables)] +impl From for pb::DecodeInvreqPaths { + fn from(c: responses::DecodeInvreq_paths) -> Self { + Self { + blinding: c.blinding.serialize().to_vec(), // Rule #2 for type pubkey + first_node_id: c.first_node_id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey? + first_scid: c.first_scid.map(|v| v.to_string()), // Rule #2 for type short_channel_id? + first_scid_dir: c.first_scid_dir, // Rule #2 for type u32? + // Field: Decode.invreq_paths[].path[] + path: c.path.into_iter().map(|i| i.into()).collect(), // Rule #3 for type DecodeInvreq_pathsPath + } + } +} + #[allow(unused_variables)] impl From for pb::DecodeOfferPaths { fn from(c: responses::DecodeOffer_paths) -> Self { @@ -1506,7 +1530,7 @@ impl From for pb::DecodeRestrictions { } } -#[allow(unused_variables)] +#[allow(unused_variables,deprecated)] impl From for pb::DecodeResponse { fn from(c: responses::DecodeResponse) -> Self { Self { @@ -1537,6 +1561,8 @@ impl From for pb::DecodeResponse { invreq_chain: c.invreq_chain.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex? invreq_features: c.invreq_features.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex? invreq_metadata: c.invreq_metadata.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex? + // Field: Decode.invreq_paths[] + invreq_paths: c.invreq_paths.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 invreq_payer_id: c.invreq_payer_id.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex? invreq_payer_note: c.invreq_payer_note, // Rule #2 for type string? invreq_quantity: c.invreq_quantity, // Rule #2 for type u64? @@ -1553,7 +1579,9 @@ impl From for pb::DecodeResponse { offer_features: c.offer_features.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex? offer_id: c.offer_id.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex? offer_issuer: c.offer_issuer, // Rule #2 for type string? + offer_issuer_id: c.offer_issuer_id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey? offer_metadata: c.offer_metadata.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex? + #[allow(deprecated)] offer_node_id: c.offer_node_id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey? // Field: Decode.offer_paths[] offer_paths: c.offer_paths.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 @@ -1571,6 +1599,7 @@ impl From for pb::DecodeResponse { unique_id: c.unique_id, // Rule #2 for type string? valid: c.valid, // Rule #2 for type boolean version: c.version, // Rule #2 for type string? + warning_empty_blinded_path: c.warning_empty_blinded_path, // Rule #2 for type string? warning_invalid_invoice_request_signature: c.warning_invalid_invoice_request_signature, // Rule #2 for type string? warning_invalid_invoice_signature: c.warning_invalid_invoice_signature, // Rule #2 for type string? warning_invalid_invreq_payer_note: c.warning_invalid_invreq_payer_note, // Rule #2 for type string? @@ -1589,6 +1618,8 @@ impl From for pb::DecodeResponse { warning_missing_invreq_metadata: c.warning_missing_invreq_metadata, // Rule #2 for type string? warning_missing_invreq_payer_id: c.warning_missing_invreq_payer_id, // Rule #2 for type string? warning_missing_offer_description: c.warning_missing_offer_description, // Rule #2 for type string? + warning_missing_offer_issuer_id: c.warning_missing_offer_issuer_id, // Rule #2 for type string? + #[allow(deprecated)] warning_missing_offer_node_id: c.warning_missing_offer_node_id, // Rule #2 for type string? warning_rune_invalid_utf8: c.warning_rune_invalid_utf8, // Rule #2 for type string? warning_unknown_offer_currency: c.warning_unknown_offer_currency, // Rule #2 for type string? @@ -2282,7 +2313,7 @@ impl From for pb::RenepaystatusPaystatus { destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey? groupid: c.groupid, // Rule #2 for type u32 // Field: RenePayStatus.paystatus[].notes[] - notes: c.notes.into_iter().map(|i| i.into()).collect(), // Rule #3 for type string + notes: c.notes.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3 parts: c.parts, // Rule #2 for type u32? payment_hash: >::as_ref(&c.payment_hash).to_vec(), // Rule #2 for type hash payment_preimage: c.payment_preimage.map(|v| v.to_vec()), // Rule #2 for type secret? @@ -3553,10 +3584,7 @@ impl From for pb::StopResponse { impl From for pb::HelpHelp { fn from(c: responses::HelpHelp) -> Self { Self { - category: c.category, // Rule #2 for type string command: c.command, // Rule #2 for type string - description: c.description, // Rule #2 for type string - verbose: c.verbose, // Rule #2 for type string } } } diff --git a/cln-rpc/src/model.rs b/cln-rpc/src/model.rs index 537380f745b1..a58c9a5950bd 100644 --- a/cln-rpc/src/model.rs +++ b/cln-rpc/src/model.rs @@ -6689,6 +6689,24 @@ pub mod responses { pub version: u8, } + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct DecodeInvreq_pathsPath { + pub blinded_node_id: PublicKey, + pub encrypted_recipient_data: String, + } + + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct DecodeInvreq_paths { + #[serde(skip_serializing_if = "Option::is_none")] + pub first_node_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub first_scid: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub first_scid_dir: Option, + pub blinding: PublicKey, + pub path: Vec, + } + #[derive(Clone, Debug, Deserialize, Serialize)] pub struct DecodeOffer_paths { #[serde(skip_serializing_if = "Option::is_none")] @@ -6753,6 +6771,12 @@ pub mod responses { #[derive(Clone, Debug, Deserialize, Serialize)] pub struct DecodeResponse { + #[deprecated] + #[serde(skip_serializing_if = "Option::is_none")] + pub offer_node_id: Option, + #[deprecated] + #[serde(skip_serializing_if = "Option::is_none")] + pub warning_missing_offer_node_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub amount_msat: Option, #[serde(skip_serializing_if = "Option::is_none")] @@ -6824,9 +6848,9 @@ pub mod responses { #[serde(skip_serializing_if = "Option::is_none")] pub offer_issuer: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub offer_metadata: Option, + pub offer_issuer_id: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub offer_node_id: Option, + pub offer_metadata: Option, #[serde(skip_serializing_if = "Option::is_none")] pub offer_quantity_max: Option, #[serde(skip_serializing_if = "Option::is_none")] @@ -6848,6 +6872,8 @@ pub mod responses { #[serde(skip_serializing_if = "Option::is_none")] pub version: Option, #[serde(skip_serializing_if = "Option::is_none")] + pub warning_empty_blinded_path: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub warning_invalid_invoice_request_signature: Option, #[serde(skip_serializing_if = "Option::is_none")] pub warning_invalid_invoice_signature: Option, @@ -6884,7 +6910,7 @@ pub mod responses { #[serde(skip_serializing_if = "Option::is_none")] pub warning_missing_offer_description: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub warning_missing_offer_node_id: Option, + pub warning_missing_offer_issuer_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub warning_rune_invalid_utf8: Option, #[serde(skip_serializing_if = "Option::is_none")] @@ -6896,6 +6922,8 @@ pub mod responses { #[serde(skip_serializing_if = "crate::is_none_or_empty")] pub invoice_fallbacks: Option>, #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub invreq_paths: Option>, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] pub offer_chains: Option>, #[serde(skip_serializing_if = "crate::is_none_or_empty")] pub offer_paths: Option>, @@ -8120,13 +8148,14 @@ pub mod responses { pub parts: Option, #[serde(skip_serializing_if = "Option::is_none")] pub payment_preimage: Option, + #[serde(skip_serializing_if = "crate::is_none_or_empty")] + pub notes: Option>, // Path `RenePayStatus.paystatus[].status` pub status: RenepaystatusPaystatusStatus, pub amount_msat: Amount, pub bolt11: String, pub created_at: f64, pub groupid: u32, - pub notes: Vec, pub payment_hash: Sha256, } @@ -9741,10 +9770,7 @@ pub mod responses { #[derive(Clone, Debug, Deserialize, Serialize)] pub struct HelpHelp { - pub category: String, pub command: String, - pub description: String, - pub verbose: String, } #[derive(Clone, Debug, Deserialize, Serialize)] diff --git a/common/Makefile b/common/Makefile index 28751e7bf8d1..a594f91f3354 100644 --- a/common/Makefile +++ b/common/Makefile @@ -16,6 +16,7 @@ COMMON_SRC_NOGEN := \ common/bolt11.c \ common/bolt11_json.c \ common/bolt12.c \ + common/bolt12_id.c \ common/bolt12_merkle.c \ common/channel_config.c \ common/channel_id.c \ @@ -52,7 +53,6 @@ COMMON_SRC_NOGEN := \ common/interactivetx.c \ common/initial_channel.c \ common/initial_commit_tx.c \ - common/invoice_path_id.c \ common/iso4217.c \ common/json_blinded_path.c \ common/json_channel_type.c \ diff --git a/common/amount.h b/common/amount.h index 5c3d70e04a2e..e94e1d2d85a2 100644 --- a/common/amount.h +++ b/common/amount.h @@ -144,6 +144,19 @@ bool amount_msat_eq_sat(struct amount_msat msat, struct amount_sat sat); /* a / b */ double amount_msat_ratio(struct amount_msat a, struct amount_msat b); +/* min(a,b) and max(a,b) */ +static inline struct amount_msat amount_msat_min(struct amount_msat a, + struct amount_msat b) +{ + return amount_msat_less(a, b) ? a : b; +} + +static inline struct amount_msat amount_msat_max(struct amount_msat a, + struct amount_msat b) +{ + return amount_msat_greater(a, b) ? a : b; +} + /* Check whether this asset is actually the main / fee-paying asset of the * current chain. */ bool amount_asset_is_main(struct amount_asset *asset); diff --git a/common/bolt12.c b/common/bolt12.c index 86f74a77a834..7c812bd56461 100644 --- a/common/bolt12.c +++ b/common/bolt12.c @@ -171,6 +171,7 @@ struct tlv_offer *offer_decode(const tal_t *ctx, struct tlv_offer *offer; const u8 *data; size_t dlen; + const struct tlv_field *badf; data = string_to_data(tmpctx, b12, b12len, "lno", &dlen, fail); if (!data) @@ -193,7 +194,7 @@ struct tlv_offer *offer_decode(const tal_t *ctx, /* BOLT-offers #12: * A reader of an offer: - * - if the offer contains any TLV fields greater or equal to 80: + * - if the offer contains any TLV fields outside the inclusive ranges: 1 to 79 and 1000000000 to 1999999999: * - MUST NOT respond to the offer. * - if `offer_features` contains unknown _odd_ bits that are non-zero: * - MUST ignore the bit. @@ -201,18 +202,19 @@ struct tlv_offer *offer_decode(const tal_t *ctx, * - MUST NOT respond to the offer. * - SHOULD indicate the unknown bit to the user. */ - for (size_t i = 0; i < tal_count(offer->fields); i++) { - if (offer->fields[i].numtype > 80) { - *fail = tal_fmt(ctx, - "Offer %"PRIu64" field >= 80", - offer->fields[i].numtype); - return tal_free(offer); - } + badf = any_field_outside_range(offer->fields, false, + 1, 79, + 1000000000, 1999999999); + if (badf) { + *fail = tal_fmt(ctx, + "Offer %"PRIu64" field outside offer range", + badf->numtype); + return tal_free(offer); } /* BOLT-offers #12: * - * - if offer_amount is set and offer_description is not set: + * - if `offer_amount` is set and `offer_description` is not set: * - MUST NOT respond to the offer. */ if (!offer->offer_description && offer->offer_amount) { @@ -220,12 +222,27 @@ struct tlv_offer *offer_decode(const tal_t *ctx, return tal_free(offer); } - /* FIXME(vincenzopalazzo): node id can be null when we use blinded path. */ - if (!offer->offer_node_id) { - *fail = tal_strdup(ctx, "Offer does not contain a node_id"); + /* BOLT-offers #12: + * + * - if neither `offer_issuer_id` nor `offer_paths` are set: + * - MUST NOT respond to the offer. + */ + if (!offer->offer_issuer_id && !offer->offer_paths) { + *fail = tal_strdup(ctx, "Offer does not contain an issuer_id or paths"); return tal_free(offer); } + /* BOLT-offers #12: + * - if `num_hops` is 0 in any `blinded_path` in `offer_paths`: + * - MUST NOT respond to the offer. + */ + for (size_t i = 0; i < tal_count(offer->offer_paths); i++) { + if (tal_count(offer->offer_paths[i]->path) == 0) { + *fail = tal_strdup(ctx, "Offer contains an empty offer_path"); + return tal_free(offer); + } + } + return offer; } @@ -248,6 +265,7 @@ struct tlv_invoice_request *invrequest_decode(const tal_t *ctx, struct tlv_invoice_request *invrequest; const u8 *data; size_t dlen; + const struct tlv_field *badf; data = string_to_data(tmpctx, b12, b12len, "lnr", &dlen, fail); if (!data) @@ -267,6 +285,32 @@ struct tlv_invoice_request *invrequest_decode(const tal_t *ctx, if (*fail) return tal_free(invrequest); + /* BOLT-offers #12: + * The reader: + *... + * - MUST fail the request if any non-signature TLV fields are outside the inclusive ranges: 0 to 159 and 1000000000 to 2999999999 + */ + badf = any_field_outside_range(invrequest->fields, true, + 0, 159, + 1000000000, 2999999999); + if (badf) { + *fail = tal_fmt(ctx, + "Invoice request %"PRIu64" field outside invoice request range", + badf->numtype); + return tal_free(invrequest); + } + + /* BOLT-offers #12: + * - if `num_hops` is 0 in any `blinded_path` in `invreq_paths`: + * - MUST fail the request. + */ + for (size_t i = 0; i < tal_count(invrequest->invreq_paths); i++) { + if (tal_count(invrequest->invreq_paths[i]->path) == 0) { + *fail = tal_strdup(ctx, "Invoice request contains an empty invreq_path"); + return tal_free(invrequest); + } + } + return invrequest; } @@ -497,14 +541,20 @@ size_t tlv_span(const u8 *tlvstream, u64 minfield, u64 maxfield, static void calc_offer(const u8 *tlvstream, struct sha256 *id) { - size_t start, len; + size_t start1, len1, start2, len2; + struct sha256_ctx ctx; /* BOLT-offers #12: * A writer of an offer: - * - MUST NOT set any tlv fields greater or equal to 80, or tlv field 0. + * - MUST NOT set any TLV fields outside the inclusive ranges: 1 to 79 and 1000000000 to 1999999999. */ - len = tlv_span(tlvstream, 1, 79, &start); - sha256(id, tlvstream + start, len); + len1 = tlv_span(tlvstream, 1, 79, &start1); + len2 = tlv_span(tlvstream, 1000000000, 1999999999, &start2); + + sha256_init(&ctx); + sha256_update(&ctx, tlvstream + start1, len1); + sha256_update(&ctx, tlvstream + start2, len2); + sha256_done(&ctx, id); } void offer_offer_id(const struct tlv_offer *offer, struct sha256 *id) @@ -533,15 +583,21 @@ void invoice_offer_id(const struct tlv_invoice *invoice, struct sha256 *id) static void calc_invreq(const u8 *tlvstream, struct sha256 *id) { - size_t start, len; + size_t start1, len1, start2, len2; + struct sha256_ctx ctx; /* BOLT-offers #12: - * - if the invoice is a response to an `invoice_request`: - * - MUST reject the invoice if all fields less than type 160 - * do not exactly match the `invoice_request`. + * The writer: + *... + * - MUST NOT set any non-signature TLV fields outside the inclusive ranges: 0 to 159 and 1000000000 to 2999999999 */ - len = tlv_span(tlvstream, 0, 159, &start); - sha256(id, tlvstream + start, len); + len1 = tlv_span(tlvstream, 0, 159, &start1); + len2 = tlv_span(tlvstream, 1000000000, 2999999999, &start2); + + sha256_init(&ctx); + sha256_update(&ctx, tlvstream + start1, len1); + sha256_update(&ctx, tlvstream + start2, len2); + sha256_done(&ctx, id); } void invreq_invreq_id(const struct tlv_invoice_request *invreq, struct sha256 *id) @@ -588,8 +644,9 @@ struct tlv_invoice *invoice_for_invreq(const tal_t *ctx, const struct tlv_invoice_request *invreq) { const u8 *cursor; - size_t start, len; + size_t start1, len1, start2, len2; u8 *wire = tal_arr(tmpctx, u8, 0); + towire_tlv_invoice_request(&wire, invreq); /* BOLT-offers #12: @@ -599,8 +656,50 @@ struct tlv_invoice *invoice_for_invreq(const tal_t *ctx, * - MUST copy all non-signature fields from the `invoice_request` (including * unknown fields). */ - len = tlv_span(wire, 0, 159, &start); - cursor = wire + start; - return fromwire_tlv_invoice(ctx, &cursor, &len); + len1 = tlv_span(wire, 0, 159, &start1); + len2 = tlv_span(wire, 1000000000, 2999999999, &start2); + + /* Move second span adjacent first span */ + memmove(wire + start1 + len1, wire + start2, len2); + + /* Unmarshal combined result */ + len1 = len1 + len2; + cursor = wire + start1; + return fromwire_tlv_invoice(ctx, &cursor, &len1); } +bool is_bolt12_signature_field(u64 typenum) +{ + /* BOLT-offers #12: + * Each form is signed using one or more *signature TLV elements*: TLV + * types 240 through 1000 (inclusive). */ + return typenum >= 240 && typenum <= 1000; +} + +static bool in_ranges(u64 numtype, + u64 r1_start, u64 r1_end, + u64 r2_start, u64 r2_end) +{ + if (numtype >= r1_start && numtype <= r1_end) + return true; + if (numtype >= r2_start && numtype <= r2_end) + return true; + return false; +} + +const struct tlv_field *any_field_outside_range(const struct tlv_field *fields, + bool ignore_signature_fields, + size_t r1_start, size_t r1_end, + size_t r2_start, size_t r2_end) +{ + for (size_t i = 0; i < tal_count(fields); i++) { + if (ignore_signature_fields + && is_bolt12_signature_field(fields[i].numtype)) + continue; + if (!in_ranges(fields[i].numtype, + r1_start, r1_end, + r2_start, r2_end)) + return &fields[i]; + } + return NULL; +} diff --git a/common/bolt12.h b/common/bolt12.h index 4ad89bd4f5eb..cd272e8d2fac 100644 --- a/common/bolt12.h +++ b/common/bolt12.h @@ -154,4 +154,18 @@ struct tlv_invoice_request *invoice_request_for_offer(const tal_t *ctx, struct tlv_invoice *invoice_for_invreq(const tal_t *ctx, const struct tlv_invoice_request *invreq); +/* BOLT-offers #12: + * Each form is signed using one or more *signature TLV elements*: TLV + * types 240 through 1000 (inclusive). */ +bool is_bolt12_signature_field(u64 typenum); + +/** + * Return the first field (if any) outside the inclusive ranges. + */ +const struct tlv_field *any_field_outside_range(const struct tlv_field *fields, + bool ignore_signature_fields, + size_t r1_start, size_t r1_end, + size_t r2_start, size_t r2_end); + + #endif /* LIGHTNING_COMMON_BOLT12_H */ diff --git a/common/bolt12_id.c b/common/bolt12_id.c new file mode 100644 index 000000000000..3348b995ae47 --- /dev/null +++ b/common/bolt12_id.c @@ -0,0 +1,47 @@ +#include "config.h" +#include +#include +#include +#include + +/* Given a base secret, an easy one-way function is SHA(base || input) */ +static void hash_from_base(const struct secret *base_secret, + const void *input, + size_t input_len, + struct sha256 *hash) +{ + struct sha256_ctx shactx; + + sha256_init(&shactx); + sha256_update(&shactx, base_secret, sizeof(*base_secret)); + sha256_update(&shactx, input, input_len); + sha256_done(&shactx, hash); +} + +void bolt12_path_secret(const struct secret *base_secret, + const struct sha256 *payment_hash, + struct secret *path_secret) +{ + struct sha256 hash; + hash_from_base(base_secret, payment_hash, sizeof(*payment_hash), &hash); + + CROSS_TYPE_ASSIGNMENT(path_secret, &hash); +} + +u8 *bolt12_path_id(const tal_t *ctx, + const struct secret *base_secret, + const struct sha256 *payment_hash) +{ + struct secret path_secret; + bolt12_path_secret(base_secret, payment_hash, &path_secret); + + return (u8 *)tal_dup(ctx, struct secret, &path_secret); +} + +void bolt12_alias_tweak(const struct secret *base_secret, + const void *input, + size_t input_len, + struct sha256 *tweak) +{ + hash_from_base(base_secret, input, input_len, tweak); +} diff --git a/common/bolt12_id.h b/common/bolt12_id.h new file mode 100644 index 000000000000..f99b275fdfb1 --- /dev/null +++ b/common/bolt12_id.h @@ -0,0 +1,54 @@ +#ifndef LIGHTNING_COMMON_BOLT12_ID_H +#define LIGHTNING_COMMON_BOLT12_ID_H +#include "config.h" +#include +#include + +struct secret; +struct sha256; + +/* String to use with makesecret to get the bolt12 base secret */ +#define BOLT12_ID_BASE_STRING "bolt12-invoice-base" + +/* String to use with makesecret to get node aliases */ +#define NODE_ALIAS_BASE_STRING "node-alias-base" + +/** + * bolt12_path_secret: generate the "path_" field for the tlv_encrypted_data_tlv + * @base_secret: the node-specific secret makesecret(BOLT12_ID_BASE_STRING) + * @payment_hash: the invoice payment hash + * @path_secret: the path_secret to populate. + * + * Receiving a blinded, encrypted tlv_encrypted_data_tlv containing + * the correct path_id is how we know this blinded path is the correct + * one for this invoice payment. + * + * It's exposed here as plugins may want to generate blinded paths. + */ +void bolt12_path_secret(const struct secret *base_secret, + const struct sha256 *payment_hash, + struct secret *path_secret); + +/* This variant gives the result as a u8 talarr, as expected by + * the tlv interface */ +u8 *bolt12_path_id(const tal_t *ctx, + const struct secret *base_secret, + const struct sha256 *payment_hash); + +/** + * bolt12_alias_tweak: generate a tweak to disguise our node id for this offer/invoice_request + * @base_secret: the node-specific secret makesecret(NODE_ALIAS_BASE_STRING) + * @input: the byte array to use to generate the tweak. + * @input_len: the length of @input. + * @tweak: the resulting tweak. + * + * We use this tweak to disguise our node_id when we want a temporary id for a specific + * purpose. The "input" can be shared publicly, as the base_secret prevents + * others from linking the tweak (or the resulting pubkey) to us. + */ +void bolt12_alias_tweak(const struct secret *base_secret, + const void *input, + size_t input_len, + struct sha256 *tweak); + +#endif /* LIGHTNING_COMMON_BOLT12_ID_H */ diff --git a/common/bolt12_merkle.c b/common/bolt12_merkle.c index 39939fd0cc9d..c4e01bc4b23e 100644 --- a/common/bolt12_merkle.c +++ b/common/bolt12_merkle.c @@ -218,23 +218,3 @@ void sighash_from_merkle(const char *messagename, sha256_update(&sctx, merkle, sizeof(*merkle)); sha256_done(&sctx, sighash); } - -/* We use the SHA(pubkey | publictweak); so reader cannot figure out the - * tweak and derive the base key. - */ -void payer_key_tweak(const struct pubkey *bolt12, - const u8 *publictweak, size_t publictweaklen, - struct sha256 *tweak) -{ - u8 rawkey[PUBKEY_CMPR_LEN]; - struct sha256_ctx sha; - - pubkey_to_der(rawkey, bolt12); - - sha256_init(&sha); - sha256_update(&sha, rawkey, sizeof(rawkey)); - sha256_update(&sha, - memcheck(publictweak, publictweaklen), - publictweaklen); - sha256_done(&sha, tweak); -} diff --git a/common/bolt12_merkle.h b/common/bolt12_merkle.h index cf7f91813b79..8e6ab5173f54 100644 --- a/common/bolt12_merkle.h +++ b/common/bolt12_merkle.h @@ -21,12 +21,4 @@ void sighash_from_merkle(const char *messagename, const char *fieldname, const struct sha256 *merkle, struct sha256 *sighash); - -/** - * payer_key_tweak - get the actual tweak to use for a payer_key - */ -void payer_key_tweak(const struct pubkey *bolt12, - const u8 *publictweak, size_t publictweaklen, - struct sha256 *tweak); - #endif /* LIGHTNING_COMMON_BOLT12_MERKLE_H */ diff --git a/common/channel_id.c b/common/channel_id.c index dbf5b15f9c44..5caffe233007 100644 --- a/common/channel_id.c +++ b/common/channel_id.c @@ -9,8 +9,7 @@ void derive_channel_id(struct channel_id *channel_id, const struct bitcoin_outpoint *outpoint) { - BUILD_ASSERT(sizeof(*channel_id) == sizeof(outpoint->txid)); - memcpy(channel_id, &outpoint->txid, sizeof(*channel_id)); + CROSS_TYPE_ASSIGNMENT(channel_id, &outpoint->txid); channel_id->id[sizeof(*channel_id)-2] ^= outpoint->n >> 8; channel_id->id[sizeof(*channel_id)-1] ^= outpoint->n; } @@ -43,8 +42,7 @@ void derive_channel_id_v2(struct channel_id *channel_id, pubkey_to_der(der_keys + offset_1, basepoint_1); pubkey_to_der(der_keys + offset_2, basepoint_2); sha256(&sha, der_keys, sizeof(der_keys)); - BUILD_ASSERT(sizeof(*channel_id) == sizeof(sha)); - memcpy(channel_id, &sha, sizeof(*channel_id)); + CROSS_TYPE_ASSIGNMENT(channel_id, &sha); } void derive_tmp_channel_id(struct channel_id *channel_id, @@ -61,8 +59,7 @@ void derive_tmp_channel_id(struct channel_id *channel_id, memset(der_keys, 0, PUBKEY_CMPR_LEN); pubkey_to_der(der_keys + PUBKEY_CMPR_LEN, opener_basepoint); sha256(&sha, der_keys, sizeof(der_keys)); - BUILD_ASSERT(sizeof(*channel_id) == sizeof(sha)); - memcpy(channel_id, &sha, sizeof(*channel_id)); + CROSS_TYPE_ASSIGNMENT(channel_id, &sha); } /* BOLT #2: diff --git a/common/coin_mvt.c b/common/coin_mvt.c index 504f3b9fbf6f..c28d71f62ced 100644 --- a/common/coin_mvt.c +++ b/common/coin_mvt.c @@ -40,6 +40,7 @@ static const char *mvt_tags[] = { "leased", "stealable", "channel_proposed", + "splice", }; const char *mvt_tag_str(enum mvt_tag tag) @@ -177,19 +178,31 @@ struct chain_coin_mvt *new_onchaind_deposit(const tal_t *ctx, } struct chain_coin_mvt *new_coin_channel_close(const tal_t *ctx, + const struct channel_id *chan_id, const struct bitcoin_txid *txid, const struct bitcoin_outpoint *out, u32 blockheight, const struct amount_msat amount, const struct amount_sat output_val, - u32 output_count) + u32 output_count, + bool is_splice) { - return new_chain_coin_mvt(ctx, NULL, txid, + struct chain_coin_mvt *mvt; + enum mvt_tag *tags = new_tag_arr(NULL, CHANNEL_CLOSE); + + if (is_splice) + tal_arr_expand(&tags, SPLICE); + + mvt = new_chain_coin_mvt(ctx, NULL, txid, out, NULL, blockheight, - take(new_tag_arr(NULL, CHANNEL_CLOSE)), + take(tags), amount, false, output_val, output_count); + if (chan_id) + mvt->account_name = fmt_channel_id(mvt, chan_id); + + return mvt; } struct chain_coin_mvt *new_coin_channel_open_proposed(const tal_t *ctx, diff --git a/common/coin_mvt.h b/common/coin_mvt.h index d35340073cff..9b34c69a9a38 100644 --- a/common/coin_mvt.h +++ b/common/coin_mvt.h @@ -14,7 +14,7 @@ enum mvt_type { CHANNEL_MVT = 1, }; -#define NUM_MVT_TAGS (CHANNEL_PROPOSED + 1) +#define NUM_MVT_TAGS (SPLICE + 1) enum mvt_tag { DEPOSIT = 0, WITHDRAWAL = 1, @@ -40,6 +40,7 @@ enum mvt_tag { LEASED = 21, STEALABLE = 22, CHANNEL_PROPOSED = 23, + SPLICE = 24, }; struct channel_coin_mvt { @@ -181,13 +182,15 @@ struct chain_coin_mvt *new_onchaind_deposit(const tal_t *ctx, NON_NULL_ARGS(2); struct chain_coin_mvt *new_coin_channel_close(const tal_t *ctx, + const struct channel_id *chan_id, const struct bitcoin_txid *txid, const struct bitcoin_outpoint *out, u32 blockheight, const struct amount_msat amount, const struct amount_sat output_val, - u32 output_count) - NON_NULL_ARGS(2, 3); + u32 output_count, + bool is_splice) + NON_NULL_ARGS(3, 4); struct chain_coin_mvt *new_coin_channel_open_proposed(const tal_t *ctx, const struct channel_id *chan_id, diff --git a/common/configvar.c b/common/configvar.c index e7e734565c4a..4a3dff39df39 100644 --- a/common/configvar.c +++ b/common/configvar.c @@ -31,7 +31,7 @@ const struct opt_table *configvar_unparsed(struct configvar *cv) ot = opt_find_short(cv->configline[0]); cv->optarg = NULL; } else { - ot = opt_find_long(cv->configline, &cv->optarg); + ot = opt_find_long(cv->configline, cast_const2(const char **, &cv->optarg)); } if (!ot) return NULL; @@ -51,6 +51,15 @@ const struct opt_table *configvar_unparsed(struct configvar *cv) return ot; } +static void trim_whitespace(char *s) +{ + size_t len = strlen(s); + + while (len > 0 && cisspace(s[len - 1])) + len--; + s[len] = '\0'; +} + const char *configvar_parse(struct configvar *cv, bool early, bool full_knowledge, @@ -82,6 +91,8 @@ const char *configvar_parse(struct configvar *cv, } else { if (!cv->optarg) return "requires an argument"; + if (!(ot->type & OPT_KEEP_WHITESPACE)) + trim_whitespace(cv->optarg); return ot->cb_arg(cv->optarg, ot->u.arg); } } diff --git a/common/configvar.h b/common/configvar.h index 9a308ecd5b11..4453f455ffd2 100644 --- a/common/configvar.h +++ b/common/configvar.h @@ -35,13 +35,13 @@ struct configvar { /* Where did we get this from? */ enum configvar_src src; /* Never NULL, the whole line */ - const char *configline; + char *configline; /* These are filled in by configvar_parse */ /* The variable name (without any =) */ const char *optvar; /* NULL for no-arg options, otherwise points after =. */ - const char *optarg; + char *optarg; /* Was this overridden by a following option? */ bool overridden; }; @@ -60,6 +60,8 @@ struct configvar { #define OPT_SHOWBOOL (1 << (OPT_USER_START+5)) /* Can be changed at runtime: cb will get called with NULL for `check`! */ #define OPT_DYNAMIC (1 << (OPT_USER_START+6)) +/* Keep whitespace at the end of the option argument */ +#define OPT_KEEP_WHITESPACE (1 << (OPT_USER_START+7)) /* Use this instead of opt_register_*_arg if you want OPT_* from above */ #define clnopt_witharg(names, type, cb, show, arg, desc) \ diff --git a/common/derive_basepoints.c b/common/derive_basepoints.c index f365d3d6c01e..4f872da65cdc 100644 --- a/common/derive_basepoints.c +++ b/common/derive_basepoints.c @@ -100,8 +100,7 @@ bool per_commit_secret(const struct sha256 *shaseed, shachain_from_seed(shaseed, shachain_index(per_commit_index), &s); - BUILD_ASSERT(sizeof(s) == sizeof(*commit_secret)); - memcpy(commit_secret, &s, sizeof(s)); + CROSS_TYPE_ASSIGNMENT(commit_secret, &s); return true; } @@ -262,7 +261,6 @@ bool shachain_get_secret(const struct shachain *shachain, if (!shachain_get_hash(shachain, shachain_index(commit_num), &sha)) return false; - BUILD_ASSERT(sizeof(*preimage) == sizeof(sha)); - memcpy(preimage, &sha, sizeof(*preimage)); + CROSS_TYPE_ASSIGNMENT(preimage, &sha); return true; } diff --git a/common/gossmap.c b/common/gossmap.c index da92b4d6b7b0..068a25c41566 100644 --- a/common/gossmap.c +++ b/common/gossmap.c @@ -444,7 +444,8 @@ void gossmap_remove_node(struct gossmap *map, struct gossmap_node *node) * * [`point`:`node_id_2`] */ static struct gossmap_chan *add_channel(struct gossmap *map, - size_t cannounce_off) + size_t cannounce_off, + size_t msglen) { /* Note that first two bytes are message type */ const size_t feature_len_off = 2 + (64 + 64 + 64 + 64); @@ -473,6 +474,12 @@ static struct gossmap_chan *add_channel(struct gossmap *map, return NULL; } + /* gossipd writes WIRE_GOSSIP_STORE_CHANNEL_AMOUNT after this (not for + * local channels), so ignore channel_announcement until that appears */ + if (msglen + && (map->map_size < cannounce_off + msglen + sizeof(struct gossip_hdr) + sizeof(u16) + sizeof(u64))) + return NULL; + /* We carefully map pointers to indexes, since new_node can move them! */ n[0] = gossmap_find_node(map, &node_id[0]); if (n[0]) @@ -668,9 +675,11 @@ static bool map_catchup(struct gossmap *map, bool *changed) off = map->map_end + sizeof(ghdr); type = map_be16(map, off); - if (type == WIRE_CHANNEL_ANNOUNCEMENT) - add_channel(map, off); - else if (type == WIRE_CHANNEL_UPDATE) + if (type == WIRE_CHANNEL_ANNOUNCEMENT) { + /* Don't read yet if amount field is not there! */ + if (!add_channel(map, off, be16_to_cpu(ghdr.len))) + break; + } else if (type == WIRE_CHANNEL_UPDATE) update_channel(map, off); else if (type == WIRE_GOSSIP_STORE_DELETE_CHAN) remove_channel_by_deletemsg(map, off); @@ -944,7 +953,7 @@ void gossmap_apply_localmods(struct gossmap *map, continue; /* Create new channel, pointing into local. */ - chan = add_channel(map, map->map_size + mod->local_off); + chan = add_channel(map, map->map_size + mod->local_off, 0); } /* Save old, overwrite (keep nodeidx) */ @@ -1144,7 +1153,7 @@ bool gossmap_chan_get_capacity(const struct gossmap *map, off += sizeof(ghdr) + be16_to_cpu(ghdr.len); /* Partial write, this can happen. */ - if (off + sizeof(ghdr) + 2 > map->map_size) + if (off + sizeof(ghdr) + sizeof(u16) + sizeof(u64) > map->map_size) return false; /* Get type of next field. */ @@ -1634,6 +1643,8 @@ void gossmap_iter_fast_forward(const struct gossmap *map, if (be32_to_cpu(ghdr.timestamp) >= timestamp) break; + + iter->offset += be16_to_cpu(ghdr.len) + sizeof(ghdr); } } diff --git a/common/gossmap.h b/common/gossmap.h index f4fbc883addb..ade384f16465 100644 --- a/common/gossmap.h +++ b/common/gossmap.h @@ -161,7 +161,7 @@ static inline bool gossmap_chan_set(const struct gossmap_chan *chan, int dir) return chan->cupdate_off[dir] != 0; } -/* Return capacity if it's known (fails only on race condition, or a local mod) */ +/* Return capacity if it's known (fails on a local mod) */ bool gossmap_chan_get_capacity(const struct gossmap *map, const struct gossmap_chan *c, struct amount_sat *amount); @@ -242,6 +242,19 @@ bool gossmap_chan_has_capacity(const struct gossmap_chan *chan, int direction, struct amount_msat amount); +/* Convenience routines to get htlc min/max as amount_msat */ +static inline struct amount_msat +gossmap_chan_htlc_max(const struct gossmap_chan *chan, const int dir) +{ + return amount_msat(fp16_to_u64(chan->half[dir].htlc_max)); +} + +static inline struct amount_msat +gossmap_chan_htlc_min(const struct gossmap_chan *chan, const int dir) +{ + return amount_msat(fp16_to_u64(chan->half[dir].htlc_min)); +} + /* Remove a channel from the map (warning! realloc can move gossmap_chan * and gossmap_node ptrs!) */ void gossmap_remove_chan(struct gossmap *map, struct gossmap_chan *chan); diff --git a/common/hmac.c b/common/hmac.c index 3b83e3b28cf0..28719f3d6ed8 100644 --- a/common/hmac.c +++ b/common/hmac.c @@ -3,6 +3,7 @@ #include #include #include +#include #include void hmac_start(crypto_auth_hmacsha256_state *state, @@ -40,8 +41,7 @@ void subkey_from_hmac(const char *prefix, { struct hmac h; hmac(base->data, sizeof(base->data), prefix, strlen(prefix), &h); - BUILD_ASSERT(sizeof(h.bytes) == sizeof(key->data)); - memcpy(key->data, h.bytes, sizeof(key->data)); + CROSS_TYPE_ASSIGNMENT(&key->data, &h.bytes); } void towire_hmac(u8 **pptr, const struct hmac *hmac) diff --git a/common/hsm_version.h b/common/hsm_version.h index 5720c3f9cc9c..e4c4cecf2e7e 100644 --- a/common/hsm_version.h +++ b/common/hsm_version.h @@ -26,6 +26,7 @@ * v5 with dev_preinit: b93e18534a468a4aa9f7015db42e9c363c32aeee5f9146b36dc953ebbdc3d33c * v5 with preapprove_check: 0ed6dd4ea2c02b67c51b1420b3d07ab2227a4c06ce7e2942d946967687e9baf7 * v6 no secret from get_per_commitment_point: 0cad1790beb3473d64355f4cb4f64daa80c28c8a241998b7ef0223385d7ffff9 + * v6 with sign_bolt12_2 (tweak using node id): 8fcb731279a10af3f95aeb8be1da6b2ced76a1984afa18c5f46a03515d70ea0e */ #define HSM_MIN_VERSION 5 #define HSM_MAX_VERSION 6 diff --git a/common/invoice_path_id.c b/common/invoice_path_id.c deleted file mode 100644 index 5cccbcc50430..000000000000 --- a/common/invoice_path_id.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "config.h" -#include -#include -#include - -u8 *invoice_path_id(const tal_t *ctx, - const struct secret *base_secret, - const struct sha256 *payment_hash) -{ - struct sha256_ctx shactx; - struct sha256 secret; - - sha256_init(&shactx); - sha256_update(&shactx, base_secret, sizeof(*base_secret)); - sha256_update(&shactx, payment_hash, sizeof(*payment_hash)); - sha256_done(&shactx, &secret); - - return (u8 *)tal_dup(ctx, struct sha256, &secret); -} diff --git a/common/invoice_path_id.h b/common/invoice_path_id.h deleted file mode 100644 index 4e4566de4f1b..000000000000 --- a/common/invoice_path_id.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef LIGHTNING_COMMON_INVOICE_PATH_ID_H -#define LIGHTNING_COMMON_INVOICE_PATH_ID_H -#include "config.h" -#include -#include - -struct secret; -struct sha256; - -/* String to use with makesecret to get the invoice base secret */ -#define INVOICE_PATH_BASE_STRING "bolt12-invoice-base" - -/** - * invoice_path_id: generate the "path_id" field for the tlv_encrypted_data_tlv - * @ctx: tal context - * @payment_hash: the invoice payment hash - * @base_secret: the node-specific secret makesecret("bolt12-invoice-base") - * - * Receiving a blinded, encrypted tlv_encrypted_data_tlv containing - * the correct path_id is how we know this blinded path is the correct - * one for this invoice payment. - * - * It's exposed here as plugins may want to generate blinded paths. - */ -u8 *invoice_path_id(const tal_t *ctx, - const struct secret *base_secret, - const struct sha256 *payment_hash); - -#endif /* LIGHTNING_COMMON_INVOICE_PATH_ID_H */ diff --git a/common/json_param.c b/common/json_param.c index 6b6196fe3a3c..3a25e1684b2f 100644 --- a/common/json_param.c +++ b/common/json_param.c @@ -520,6 +520,18 @@ struct command_result *param_sha256(struct command *cmd, const char *name, "should be a 32 byte hex value"); } +struct command_result *param_u16(struct command *cmd, const char *name, + const char *buffer, const jsmntok_t *tok, + uint16_t **num) +{ + *num = tal(cmd, uint16_t); + if (json_to_u16(buffer, tok, *num)) + return NULL; + + return command_fail_badparam(cmd, name, buffer, tok, + "should be an unsigned 16 bit integer"); +} + struct command_result *param_u32(struct command *cmd, const char *name, const char *buffer, const jsmntok_t *tok, uint32_t **num) diff --git a/common/json_param.h b/common/json_param.h index a5b65a52c259..83e4f3b3a70a 100644 --- a/common/json_param.h +++ b/common/json_param.h @@ -219,6 +219,11 @@ struct command_result *param_sha256(struct command *cmd, const char *name, const char *buffer, const jsmntok_t *tok, struct sha256 **hash); +/* Extract number from this (may be a string, or a number literal) */ +struct command_result *param_u16(struct command *cmd, const char *name, + const char *buffer, const jsmntok_t *tok, + uint16_t **num); + /* Extract number from this (may be a string, or a number literal) */ struct command_result *param_u32(struct command *cmd, const char *name, const char *buffer, const jsmntok_t *tok, diff --git a/common/json_parse.c b/common/json_parse.c index 9fc9882e22e7..639c35b2e70b 100644 --- a/common/json_parse.c +++ b/common/json_parse.c @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -574,6 +573,25 @@ bool json_to_short_channel_id(const char *buffer, const jsmntok_t *tok, tok->end - tok->start, scid)); } +bool json_to_short_channel_id_dir(const char *buffer, const jsmntok_t *tok, + struct short_channel_id_dir *scidd) +{ + jsmntok_t scidtok, numtok; + u32 dir; + + if (!split_tok(buffer, tok, '/', &scidtok, &numtok)) + return false; + + if (!json_to_short_channel_id(buffer, &scidtok, &scidd->scid)) + return false; + + if (!json_to_u32(buffer, &numtok, &dir) || (dir > 1)) + return false; + + scidd->dir = dir; + return true; +} + bool json_to_txid(const char *buffer, const jsmntok_t *tok, struct bitcoin_txid *txid) { diff --git a/common/json_parse.h b/common/json_parse.h index 1569a4a4e56e..7eca7284c2d6 100644 --- a/common/json_parse.h +++ b/common/json_parse.h @@ -1,6 +1,7 @@ #ifndef LIGHTNING_COMMON_JSON_PARSE_H #define LIGHTNING_COMMON_JSON_PARSE_H #include "config.h" +#include #include #include #include @@ -110,6 +111,10 @@ bool json_to_outpoint(const char *buffer, const jsmntok_t *tok, bool json_to_channel_id(const char *buffer, const jsmntok_t *tok, struct channel_id *cid); +/* Extract a channel id + dir from this */ +bool json_to_short_channel_id_dir(const char *buffer, const jsmntok_t *tok, + struct short_channel_id_dir *scidd); + /* Extract a coin movement 'tag' from this */ bool json_to_coin_mvt_tag(const char *buffer, const jsmntok_t *tok, enum mvt_tag *tag); diff --git a/common/json_stream.c b/common/json_stream.c index f0667b37dc24..31a5367b15e4 100644 --- a/common/json_stream.c +++ b/common/json_stream.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -485,6 +484,16 @@ void json_add_short_channel_id(struct json_stream *response, short_channel_id_outnum(scid)); } +void json_add_short_channel_id_dir(struct json_stream *response, + const char *fieldname, + struct short_channel_id_dir scidd) +{ + json_add_str_fmt(response, fieldname, "%dx%dx%d/%d", + short_channel_id_blocknum(scidd.scid), + short_channel_id_txnum(scidd.scid), + short_channel_id_outnum(scidd.scid), scidd.dir); +} + static void json_add_address_fields(struct json_stream *response, const struct wireaddr *addr, const char *typefield) diff --git a/common/json_stream.h b/common/json_stream.h index b2963dfedc15..eeca272c3e09 100644 --- a/common/json_stream.h +++ b/common/json_stream.h @@ -5,6 +5,7 @@ #define LIGHTNING_COMMON_JSON_STREAM_H #include "config.h" +#include #define JSMN_STRICT 1 # include @@ -313,6 +314,11 @@ void json_add_short_channel_id(struct json_stream *response, const char *fieldname, struct short_channel_id id); +/* '"fieldname" : "1234:5:6/1"' */ +void json_add_short_channel_id_dir(struct json_stream *response, + const char *fieldname, + struct short_channel_id_dir idd); + /* JSON serialize a network address for a node */ void json_add_address(struct json_stream *response, const char *fieldname, const struct wireaddr *addr); diff --git a/common/jsonrpc_errors.h b/common/jsonrpc_errors.h index f2b7d975f3da..ca69a9bfc0d9 100644 --- a/common/jsonrpc_errors.h +++ b/common/jsonrpc_errors.h @@ -48,6 +48,9 @@ enum jsonrpc_errcode { PAY_INVOICE_REQUEST_INVALID = 212, PAY_INVOICE_PREAPPROVAL_DECLINED = 213, PAY_KEYSEND_PREAPPROVAL_DECLINED = 214, + PAY_INSUFFICIENT_FUNDS = 215, + PAY_UNREACHABLE = 216, + PAY_USER_ERROR = 217, /* `fundchannel` or `withdraw` errors */ FUND_MAX_EXCEEDED = 300, @@ -109,6 +112,7 @@ enum jsonrpc_errcode { OFFER_ROUTE_NOT_FOUND = 1003, OFFER_BAD_INVREQ_REPLY = 1004, OFFER_TIMEOUT = 1005, + OFFER_ALREADY_ENABLED = 1006, /* Errors from datastore command */ DATASTORE_DEL_DOES_NOT_EXIST = 1200, diff --git a/common/test/run-bolt12-encode-test.c b/common/test/run-bolt12-encode-test.c index d73d81092e36..0b59adaef473 100644 --- a/common/test/run-bolt12-encode-test.c +++ b/common/test/run-bolt12-encode-test.c @@ -146,21 +146,23 @@ static void print_invalid_offer(const struct tlv_offer *offer, const char *why) int main(int argc, char *argv[]) { struct tlv_offer *offer; - struct secret alice, bob, carol; + struct secret alice, bob; + struct blinded_path **paths; common_setup(argv[0]); memset(&alice, 'A', sizeof(alice)); memset(&bob, 'B', sizeof(bob)); - memset(&carol, 'C', sizeof(carol)); offer = tlv_offer_new(tmpctx); - offer->offer_node_id = tal(offer, struct pubkey); - assert(pubkey_from_secret(&alice, offer->offer_node_id)); - offer->offer_description = tal_utf8(tmpctx, "Test vectors"); + offer->offer_issuer_id = tal(offer, struct pubkey); + assert(pubkey_from_secret(&alice, offer->offer_issuer_id)); printf("[\n"); print_valid_offer(offer, "Minimal bolt12 offer", NULL, NULL); + offer->offer_description = tal_utf8(tmpctx, "Test vectors"); + print_valid_offer(offer, "with description (but no amount)", + "description is 'Test vectors'", NULL); offer->offer_chains = tal_arr(offer, struct bitcoin_blkid, 1); offer->offer_chains[0] = chainparams_for_network("testnet")->genesis_blockhash; @@ -243,10 +245,24 @@ int main(int argc, char *argv[]) print_valid_offer(offer, "with blinded path via Bob (0x424242...), blinding 020202...", "path is [id=02020202..., enc=0x00*16], [id=02020202..., enc=0x11*8]", NULL); + /* BOLT-offers #12: + * - if it includes `offer_paths`: + * - SHOULD ignore any invoice_request which does not use the path. + * - MAY set `offer_issuer_id`. + * - otherwise: + * - MUST set `offer_issuer_id` to the node's public key to request the invoice from. + */ + offer->offer_issuer_id = tal_free(offer->offer_issuer_id); + print_valid_offer(offer, "with no issuer_id and blinded path via Bob (0x424242...), blinding 020202...", + "path is [id=02020202..., enc=0x00*16], [id=02020202..., enc=0x11*8]", NULL); + offer->offer_issuer_id = tal(offer, struct pubkey); + assert(pubkey_from_secret(&alice, offer->offer_issuer_id)); + tal_resize(&offer->offer_paths, 2); offer->offer_paths[1] = tal(offer->offer_paths, struct blinded_path); - offer->offer_paths[1]->first_node_id.is_pubkey = true; - assert(pubkey_from_secret(&carol, &offer->offer_paths[1]->first_node_id.pubkey)); + offer->offer_paths[1]->first_node_id.is_pubkey = false; + assert(short_channel_id_dir_from_str("1x2x3/1", strlen("1x2x3/1"), + &offer->offer_paths[1]->first_node_id.scidd)); /* Random blinding secret. */ assert(pubkey_from_hexstr("020202020202020202020202020202020202020202020202020202020202020202", 66, &offer->offer_paths[1]->blinding)); offer->offer_paths[1]->path = tal_arr(offer->offer_paths[1], @@ -260,8 +276,9 @@ int main(int argc, char *argv[]) struct onionmsg_hop); assert(pubkey_from_hexstr("020202020202020202020202020202020202020202020202020202020202020202", 66, &offer->offer_paths[1]->path[1]->blinded_node_id)); offer->offer_paths[1]->path[1]->encrypted_recipient_data = tal_hexdata(offer->offer_paths[1]->path[1], "2222222222222222", 16); - print_valid_offer(offer, "... and with second blinded path via Carol (0x434343...), blinding 020202...", + print_valid_offer(offer, "... and with second blinded path via 1x2x3 (direction 1), blinding 020202...", "path is [id=02020202..., enc=0x00*16], [id=02020202..., enc=0x22*8]", NULL); + paths = offer->offer_paths; offer->offer_paths = NULL; /* Unknown odd fields are fine */ @@ -272,17 +289,23 @@ int main(int argc, char *argv[]) print_valid_offer(offer, "unknown odd field", "type 33 is 'helloworld'", &extra); + extra.numtype = 1000000033; + extra.length = 10; + extra.value = (u8 *)"helloworld"; + print_valid_offer(offer, "unknown odd experimental field", + "type 1000000033 is 'helloworld'", &extra); + /* Now let's do the invalid ones! */ /* Invalid encoding forms. */ - /* offer_node_id then description */ + /* offer_issuer_id then description */ print_malformed_tlv("lno", - "1621020202020202020202020202020202020202020202020202020202020202020202" /* offer_node_id */ + "1621020202020202020202020202020202020202020202020202020202020202020202" /* offer_issuer_id */ "0A05414C494345", /* offer_description */ "Malformed: fields out of order"); print_malformed_tlv("lno", "0A05414C494345" /* offer_description */ - "1621020202020202020202020202020202020202020202020202020202020202020202" /* offer_node_id */ + "1621020202020202020202020202020202020202020202020202020202020202020202" /* offer_issuer_id */ "48206fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000", "Malformed: unknown even TLV type 78"); /* various forms of truncation */ @@ -360,23 +383,35 @@ int main(int argc, char *argv[]) print_malformed_tlv("lno", "0A05414C494345" "1621020303030303030303030303030303030303030303030303030303030303030303", - "Malformed: invalid offer_node_id"); + "Malformed: invalid offer_issuer_id"); /* Now these are simply invalid, not bad encodings */ /* BOLT-offers #12: * A reader of an offer: - * - if the offer contains any TLV fields greater or equal to 80: + * - if the offer contains any TLV fields outside the inclusive ranges: 1 to 79 and 1000000000 to 1999999999: * - MUST NOT respond to the offer. */ print_malformed_tlv("lno", "0A05414C494345" /* offer_description */ - "1621020202020202020202020202020202020202020202020202020202020202020202" /* offer_node_id */ + "1621020202020202020202020202020202020202020202020202020202020202020202" /* offer_issuer_id */ "50206fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000", "Contains type >= 80"); + print_malformed_tlv("lno", + "0A05414C494345" /* offer_description */ + "1621020202020202020202020202020202020202020202020202020202020202020202" /* offer_issuer_id */ + "FD7735940050206fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000", + "Contains type > 1999999999"); + + print_malformed_tlv("lno", + "0A05414C494345" /* offer_description */ + "1621020202020202020202020202020202020202020202020202020202020202020202" /* offer_issuer_id */ + "FD3B9ACA0250206fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000", + "Contains unknown even type (1000000002)"); + offer = tlv_offer_new(tmpctx); - offer->offer_node_id = tal(offer, struct pubkey); - assert(pubkey_from_secret(&alice, offer->offer_node_id)); + offer->offer_issuer_id = tal(offer, struct pubkey); + assert(pubkey_from_secret(&alice, offer->offer_issuer_id)); offer->offer_description = tal_utf8(tmpctx, "Test vectors"); offer->offer_features = tal_arr(offer, u8, 0); @@ -390,19 +425,21 @@ int main(int argc, char *argv[]) offer->offer_features = NULL; /* BOLT-offers #12: - * - if `offer_description` is not set: + * - if `offer_amount` is set and `offer_description` is not set: * - MUST NOT respond to the offer. - * - if `offer_node_id` is not set: + * - if neither `offer_issuer_id` nor `offer_paths` are set: * - MUST NOT respond to the offer. */ offer->offer_description = NULL; - print_invalid_offer(offer, "Missing offer_description"); + print_invalid_offer(offer, "Missing offer_description and offer_amount"); offer->offer_description = tal_utf8(tmpctx, "Test vectors"); - offer->offer_node_id = NULL; - print_invalid_offer(offer, "Missing offer_node_id"); - offer->offer_node_id = tal(offer, struct pubkey); - assert(pubkey_from_secret(&alice, offer->offer_node_id)); + offer->offer_issuer_id = NULL; + print_invalid_offer(offer, "Missing offer_issuer_id and no offer_path"); + + offer->offer_paths = paths; + offer->offer_paths[1]->path = NULL; + print_invalid_offer(offer, "Second offer_path is empty"); printf("]\n"); common_shutdown(); diff --git a/common/test/run-bolt12-format-string-test.c b/common/test/run-bolt12-format-string-test.c index 2a6ed854d393..4f325d9637af 100644 --- a/common/test/run-bolt12-format-string-test.c +++ b/common/test/run-bolt12-format-string-test.c @@ -117,10 +117,7 @@ int main(int argc, char *argv[]) offer = tlv_offer_new(tmpctx); /* BOLT-offers #12: * A writer of an offer: - * - MUST NOT set any tlv fields greater or equal to 80, or tlv field 0. - * - MUST set `offer_node_id` to the node's public key to request the invoice from. - * - MUST set `offer_description` to a complete description of the purpose - * of the payment. + * - MUST NOT set any TLV fields outside the inclusive ranges: 1 to 79 and 1000000000 to 1999999999. * - if the chain for the invoice is not solely bitcoin: * - MUST specify `offer_chains` the offer is valid for. * - otherwise: @@ -134,9 +131,12 @@ int main(int argc, char *argv[]) * - MUST specify `offer_currency` `iso4217` as an ISO 4712 three-letter code. * - MUST specify `offer_amount` in the currency unit adjusted by the ISO 4712 * exponent (e.g. USD cents). + * - MUST set `offer_description` to a complete description of the purpose + * of the payment. * - otherwise: * - MUST NOT set `offer_amount` * - MUST NOT set `offer_currency` + * - MAY set `offer_description` * - MAY set `offer_metadata` for its own use. * - if it supports bolt12 offer features: * - MUST set `offer_features`.`features` to the bitmap of bolt12 features. @@ -151,6 +151,9 @@ int main(int argc, char *argv[]) * - MAY include `offer_paths`. * - if it includes `offer_paths`: * - SHOULD ignore any invoice_request which does not use the path. + * - MAY set `offer_issuer_id`. + * - otherwise: + * - MUST set `offer_issuer_id` to the node's public key to request the invoice from. * - if it sets `offer_issuer`: * - SHOULD set it to identify the issuer of the invoice clearly. * - if it includes a domain name: @@ -166,8 +169,8 @@ int main(int argc, char *argv[]) * - MUST NOT set `offer_quantity_max`. */ memset(&alice, 'A', sizeof(alice)); - offer->offer_node_id = tal(offer, struct pubkey); - assert(pubkey_from_secret(&alice, offer->offer_node_id)); + offer->offer_issuer_id = tal(offer, struct pubkey); + assert(pubkey_from_secret(&alice, offer->offer_issuer_id)); offer->offer_description = tal_utf8(offer, "An example description"); offer->offer_issuer = tal_utf8(offer, "BOLT 12 industries"); offer->offer_amount = tal(offer, u64); diff --git a/common/test/run-bolt12_merkle.c b/common/test/run-bolt12_merkle.c index 228da66d08b1..36c31627b246 100644 --- a/common/test/run-bolt12_merkle.c +++ b/common/test/run-bolt12_merkle.c @@ -317,7 +317,7 @@ int main(int argc, char *argv[]) memset(&bob_secret, 'B', sizeof(bob_secret)); pubkey_from_secret(&bob_secret, &bob); - invreq->offer_node_id = tal_dup(invreq, struct pubkey, &alice); + invreq->offer_issuer_id = tal_dup(invreq, struct pubkey, &alice); invreq->offer_description = tal_dup_arr(invreq, char, "A Mathematical Treatise", strlen("A Mathematical Treatise"), 0); invreq->offer_amount = tal(invreq, u64); *invreq->offer_amount = 100; @@ -326,7 +326,7 @@ int main(int argc, char *argv[]) invreq->invreq_metadata = tal_arrz(invreq, u8, 8); /* Populate ->fields array, for merkle routine */ - invreq->fields = tlv_make_fields(invreq, tlv_invoice_request); + tlv_update_fields(invreq, tlv_invoice_request, &invreq->fields); merkle_tlv(invreq->fields, &test_m); /* BOLT-offers #12: @@ -343,7 +343,7 @@ int main(int argc, char *argv[]) char *invreqtext = invrequest_encode(tmpctx, invreq); invreq = invrequest_decode(tmpctx, invreqtext, strlen(invreqtext), NULL, NULL, &fail); - json_out("{\"comment\": \"invoice_request test: offer_node_id = Alice (privkey 0x414141...), offer_description = 'A Mathematical Treatise', offer_amount = 100, offer_currency = 'USD', invreq_payer_id = Bob (privkey 0x424242...), invreq_metadata = 0x0000000000000000\","); + json_out("{\"comment\": \"invoice_request test: offer_issuer_id = Alice (privkey 0x414141...), offer_description = 'A Mathematical Treatise', offer_amount = 100, offer_currency = 'USD', invreq_payer_id = Bob (privkey 0x424242...), invreq_metadata = 0x0000000000000000\","); json_out("\"bolt12\": \"%s\",", invreqtext); json_out("\"tlv\": \"invoice_request\","); @@ -358,7 +358,7 @@ int main(int argc, char *argv[]) fieldwires[2] = tlv(8, "\x64", 1); /* offer_description: A Mathematical Treatise */ fieldwires[3] = tlv(10, "A Mathematical Treatise", strlen("A Mathematical Treatise")); - /* offer_node_id: Alice */ + /* offer_issuer_id: Alice */ pubkey_to_der(node_id, &alice); fieldwires[4] = tlv(22, node_id, PUBKEY_CMPR_LEN); /* invreq_payer_id: Bob */ diff --git a/common/test/run-tlv_unknown.c b/common/test/run-tlv_unknown.c new file mode 100644 index 000000000000..fdecc469965d --- /dev/null +++ b/common/test/run-tlv_unknown.c @@ -0,0 +1,236 @@ +#include "config.h" +#include "../../wire/fromwire.c" +#include "../../wire/peer_wiregen.c" +#include "../../wire/tlvstream.c" +#include "../../wire/towire.c" +#include "../bigsize.c" +#include "../bolt12.c" +#include +#include + +/* AUTOGENERATED MOCKS START */ +/* Generated stub for amount_asset_is_main */ +bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) +{ fprintf(stderr, "amount_asset_is_main called!\n"); abort(); } +/* Generated stub for amount_asset_to_sat */ +struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) +{ fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_feerate */ + bool amount_feerate(u32 *feerate UNNEEDED, struct amount_sat fee UNNEEDED, size_t weight UNNEEDED) +{ fprintf(stderr, "amount_feerate called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } +/* Generated stub for amount_sat_add */ + bool amount_sat_add(struct amount_sat *val UNNEEDED, + struct amount_sat a UNNEEDED, + struct amount_sat b UNNEEDED) +{ fprintf(stderr, "amount_sat_add called!\n"); abort(); } +/* Generated stub for amount_sat_eq */ +bool amount_sat_eq(struct amount_sat a UNNEEDED, struct amount_sat b UNNEEDED) +{ fprintf(stderr, "amount_sat_eq called!\n"); abort(); } +/* Generated stub for amount_sat_greater_eq */ +bool amount_sat_greater_eq(struct amount_sat a UNNEEDED, struct amount_sat b UNNEEDED) +{ fprintf(stderr, "amount_sat_greater_eq called!\n"); abort(); } +/* Generated stub for amount_sat_sub */ + bool amount_sat_sub(struct amount_sat *val UNNEEDED, + struct amount_sat a UNNEEDED, + struct amount_sat b UNNEEDED) +{ fprintf(stderr, "amount_sat_sub called!\n"); abort(); } +/* Generated stub for amount_sat_to_asset */ +struct amount_asset amount_sat_to_asset(struct amount_sat *sat UNNEEDED, const u8 *asset UNNEEDED) +{ fprintf(stderr, "amount_sat_to_asset called!\n"); abort(); } +/* Generated stub for amount_tx_fee */ +struct amount_sat amount_tx_fee(u32 fee_per_kw UNNEEDED, size_t weight UNNEEDED) +{ fprintf(stderr, "amount_tx_fee called!\n"); abort(); } +/* Generated stub for features_unsupported */ +int features_unsupported(const struct feature_set *our_features UNNEEDED, + const u8 *their_features UNNEEDED, + enum feature_place p UNNEEDED) +{ fprintf(stderr, "features_unsupported called!\n"); abort(); } +/* Generated stub for from_bech32_charset */ +bool from_bech32_charset(const tal_t *ctx UNNEEDED, + const char *bech32 UNNEEDED, size_t bech32_len UNNEEDED, + char **hrp UNNEEDED, u8 **data UNNEEDED) +{ fprintf(stderr, "from_bech32_charset called!\n"); abort(); } +/* Generated stub for fromwire_amount_msat */ +struct amount_msat fromwire_amount_msat(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_amount_msat called!\n"); abort(); } +/* Generated stub for fromwire_amount_sat */ +struct amount_sat fromwire_amount_sat(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_amount_sat called!\n"); abort(); } +/* Generated stub for fromwire_channel_id */ +bool fromwire_channel_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, + struct channel_id *channel_id UNNEEDED) +{ fprintf(stderr, "fromwire_channel_id called!\n"); abort(); } +/* Generated stub for fromwire_node_id */ +void fromwire_node_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct node_id *id UNNEEDED) +{ fprintf(stderr, "fromwire_node_id called!\n"); abort(); } +/* Generated stub for fromwire_tlv_invoice */ +struct tlv_invoice *fromwire_tlv_invoice(const tal_t *ctx UNNEEDED, + const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_tlv_invoice called!\n"); abort(); } +/* Generated stub for fromwire_tlv_invoice_request */ +struct tlv_invoice_request *fromwire_tlv_invoice_request(const tal_t *ctx UNNEEDED, + const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_tlv_invoice_request called!\n"); abort(); } +/* Generated stub for fromwire_tlv_offer */ +struct tlv_offer *fromwire_tlv_offer(const tal_t *ctx UNNEEDED, + const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_tlv_offer called!\n"); abort(); } +/* Generated stub for merkle_tlv */ +void merkle_tlv(const struct tlv_field *fields UNNEEDED, struct sha256 *merkle UNNEEDED) +{ fprintf(stderr, "merkle_tlv called!\n"); abort(); } +/* Generated stub for sighash_from_merkle */ +void sighash_from_merkle(const char *messagename UNNEEDED, + const char *fieldname UNNEEDED, + const struct sha256 *merkle UNNEEDED, + struct sha256 *sighash UNNEEDED) +{ fprintf(stderr, "sighash_from_merkle called!\n"); abort(); } +/* Generated stub for to_bech32_charset */ +char *to_bech32_charset(const tal_t *ctx UNNEEDED, + const char *hrp UNNEEDED, const u8 *data UNNEEDED) +{ fprintf(stderr, "to_bech32_charset called!\n"); abort(); } +/* Generated stub for towire_amount_msat */ +void towire_amount_msat(u8 **pptr UNNEEDED, const struct amount_msat msat UNNEEDED) +{ fprintf(stderr, "towire_amount_msat called!\n"); abort(); } +/* Generated stub for towire_amount_sat */ +void towire_amount_sat(u8 **pptr UNNEEDED, const struct amount_sat sat UNNEEDED) +{ fprintf(stderr, "towire_amount_sat called!\n"); abort(); } +/* Generated stub for towire_channel_id */ +void towire_channel_id(u8 **pptr UNNEEDED, const struct channel_id *channel_id UNNEEDED) +{ fprintf(stderr, "towire_channel_id called!\n"); abort(); } +/* Generated stub for towire_node_id */ +void towire_node_id(u8 **pptr UNNEEDED, const struct node_id *id UNNEEDED) +{ fprintf(stderr, "towire_node_id called!\n"); abort(); } +/* Generated stub for towire_tlv_invoice */ +void towire_tlv_invoice(u8 **pptr UNNEEDED, const struct tlv_invoice *record UNNEEDED) +{ fprintf(stderr, "towire_tlv_invoice called!\n"); abort(); } +/* Generated stub for towire_tlv_invoice_request */ +void towire_tlv_invoice_request(u8 **pptr UNNEEDED, const struct tlv_invoice_request *record UNNEEDED) +{ fprintf(stderr, "towire_tlv_invoice_request called!\n"); abort(); } +/* Generated stub for towire_tlv_offer */ +void towire_tlv_offer(u8 **pptr UNNEEDED, const struct tlv_offer *record UNNEEDED) +{ fprintf(stderr, "towire_tlv_offer called!\n"); abort(); } +/* AUTOGENERATED MOCKS END */ + +/* BOLT #1: + * + * 1. `tlv_stream`: `n1` + * 2. types: + * 1. type: 1 (`tlv1`) + * 2. data: + * * [`tu64`:`amount_msat`] + * 1. type: 2 (`tlv2`) + * 2. data: + * * [`short_channel_id`:`scid`] + * 1. type: 3 (`tlv3`) + * 2. data: + * * [`point`:`node_id`] + * * [`u64`:`amount_msat_1`] + * * [`u64`:`amount_msat_2`] + * 1. type: 254 (`tlv4`) + * 2. data: + * * [`u16`:`cltv_delta`] + */ +int main(int argc, char *argv[]) +{ + u8 *wire_in, *wire_out; + struct tlv_n1 *n1; + const u8 *cursor; + size_t len; + + common_setup(argv[0]); + + /* Only an unknown field. */ + wire_in = tal_hexdata(tmpctx, "050199", strlen("050199")); + cursor = wire_in; + len = tal_bytelen(wire_in); + n1 = fromwire_tlv_n1(tmpctx, &cursor, &len); + assert(len == 0); + assert(!n1->tlv1); + assert(!n1->tlv2); + assert(!n1->tlv3); + assert(!n1->tlv4); + assert(tal_count(n1->fields) == 1); + assert(n1->fields[0].meta == NULL); + assert(n1->fields[0].numtype == 5); + assert(n1->fields[0].length == 1); + assert(n1->fields[0].value[0] == 0x99); + + wire_out = tal_arr(tmpctx, u8, 0); + towire_tlv_n1(&wire_out, n1); + assert(memeq(wire_in, tal_bytelen(wire_in), + wire_out, tal_bytelen(wire_out))); + + /* Known field and unknown field. */ + wire_in = tal_hexdata(tmpctx, "0100050199", strlen("0100050199")); + cursor = wire_in; + len = tal_bytelen(wire_in); + n1 = fromwire_tlv_n1(tmpctx, &cursor, &len); + assert(len == 0); + assert(*n1->tlv1 == 0); + assert(!n1->tlv2); + assert(!n1->tlv3); + assert(!n1->tlv4); + assert(tal_count(n1->fields) == 2); + assert(n1->fields[1].meta == NULL); + assert(n1->fields[1].numtype == 5); + assert(n1->fields[1].length == 1); + assert(n1->fields[1].value[0] == 0x99); + + wire_out = tal_arr(tmpctx, u8, 0); + towire_tlv_n1(&wire_out, n1); + assert(memeq(wire_in, tal_bytelen(wire_in), + wire_out, tal_bytelen(wire_out))); + + /* Unknown field between known fields */ + wire_in = tal_hexdata(tmpctx, "0100050199FD00FE020000", strlen("0100050199FD00FE020000")); + cursor = wire_in; + len = tal_bytelen(wire_in); + n1 = fromwire_tlv_n1(tmpctx, &cursor, &len); + assert(len == 0); + assert(*n1->tlv1 == 0); + assert(!n1->tlv2); + assert(!n1->tlv3); + assert(*n1->tlv4 == 0); + assert(tal_count(n1->fields) == 3); + assert(n1->fields[1].meta == NULL); + assert(n1->fields[1].numtype == 5); + assert(n1->fields[1].length == 1); + assert(n1->fields[1].value[0] == 0x99); + + wire_out = tal_arr(tmpctx, u8, 0); + towire_tlv_n1(&wire_out, n1); + assert(memeq(wire_in, tal_bytelen(wire_in), + wire_out, tal_bytelen(wire_out))); + + /* And finally, a field at the end */ + wire_in = tal_hexdata(tmpctx, "0100050199FD00FE020000FE3B9ACA0102AABB", strlen("0100050199FD00FE020000FE3B9ACA0102AABB")); + cursor = wire_in; + len = tal_bytelen(wire_in); + n1 = fromwire_tlv_n1(tmpctx, &cursor, &len); + assert(len == 0); + assert(*n1->tlv1 == 0); + assert(!n1->tlv2); + assert(!n1->tlv3); + assert(*n1->tlv4 == 0); + assert(tal_count(n1->fields) == 4); + assert(n1->fields[1].meta == NULL); + assert(n1->fields[1].numtype == 5); + assert(n1->fields[1].length == 1); + assert(n1->fields[1].value[0] == 0x99); + assert(n1->fields[3].meta == NULL); + assert(n1->fields[3].numtype == 1000000001); + assert(n1->fields[3].length == 2); + assert(n1->fields[3].value[0] == 0xAA); + assert(n1->fields[3].value[1] == 0xBB); + + wire_out = tal_arr(tmpctx, u8, 0); + towire_tlv_n1(&wire_out, n1); + assert(memeq(wire_in, tal_bytelen(wire_in), + wire_out, tal_bytelen(wire_out))); + + common_shutdown(); + return 0; +} diff --git a/common/utils.h b/common/utils.h index ae9060a76f22..4fd54aab3680 100644 --- a/common/utils.h +++ b/common/utils.h @@ -153,4 +153,20 @@ int tmpdir_mkstemp(const tal_t *ctx, const char *template TAKES, char **created) */ char *str_lowering(const void *ctx, const char *string TAKES); +/** + * Assign two different structs which are the same size. + * We use this for assigning secrets <-> sha256 for example. + */ +#define CROSS_TYPE_ASSIGNMENT(dst, src) \ + memcpy((dst), (src), \ + sizeof(*(dst)) + BUILD_ASSERT_OR_ZERO(sizeof(*(dst)) == sizeof(*(src)))) + +/** + * Compare two different structs which are the same size. + * We use this for comparing bitcoin_txid <-> sha256 for example. + */ +#define CROSS_TYPE_EQ(a, b) \ + (memcmp((a), (b), \ + sizeof(*(a)) + BUILD_ASSERT_OR_ZERO(sizeof(*(a)) == sizeof(*(b)))) == 0) + #endif /* LIGHTNING_COMMON_UTILS_H */ diff --git a/common/wireaddr.c b/common/wireaddr.c index 508a0eccb9eb..b8d23d643f5a 100644 --- a/common/wireaddr.c +++ b/common/wireaddr.c @@ -773,8 +773,7 @@ bool wireaddr_to_sockname(const struct wireaddr_internal *addr, if (addr->itype != ADDR_INTERNAL_SOCKNAME) return false; sun->sun_family = AF_LOCAL; - BUILD_ASSERT(sizeof(sun->sun_path) == sizeof(addr->u.sockname)); - memcpy(sun->sun_path, addr->u.sockname, sizeof(addr->u.sockname)); + CROSS_TYPE_ASSIGNMENT(&sun->sun_path, &addr->u.sockname); return true; } diff --git a/configure b/configure index cba529fbdfdc..3819dc1e10d7 100755 --- a/configure +++ b/configure @@ -367,6 +367,20 @@ trap "rm -f $CONFIG_VAR_FILE.$$" 0 $CONFIGURATOR --extra-tests --autotools-style --var-file=$CONFIG_VAR_FILE.$$ --header-file=$CONFIG_HEADER.$$ --configurator-cc="$CONFIGURATOR_CC" --wrapper="$CONFIGURATOR_WRAPPER" "$CC" ${CWARNFLAGS-$BASE_WARNFLAGS} $CDEBUGFLAGS $COPTFLAGS $CSANFLAGS -I$CPATH -L$LIBRARY_PATH $SQLITE3_CFLAGS $POSTGRES_INCLUDE < +#include + +int main(void) +{ + gzFile f = gzopen("/dev/null", "wb"); + return f != NULL ? 0 : 1; +} +/*END*/ var=HAVE_GOOD_LIBSODIUM desc=libsodium with IETF chacha20 variants style=DEFINES_EVERYTHING|EXECUTE|MAY_NOT_COMPILE diff --git a/conftest.py b/conftest.py index c88f4ae2b4cd..65b3e3236cd6 100644 --- a/conftest.py +++ b/conftest.py @@ -69,4 +69,4 @@ def pytest_pyfunc_call(pyfuncitem): except Exception as e: import warnings - warnings.warn(f"Error reporting testrun: {e}: {e.read()}") + warnings.warn(f"Error reporting testrun: {e}") diff --git a/connectd/handshake.c b/connectd/handshake.c index 0f0a4dcd55a6..3a11dead0ec0 100644 --- a/connectd/handshake.c +++ b/connectd/handshake.c @@ -422,8 +422,7 @@ static struct handshake *new_handshake(const tal_t *ctx, * * 2. `ck = h` */ - BUILD_ASSERT(sizeof(handshake->h) == sizeof(handshake->ck)); - memcpy(&handshake->ck, &handshake->h, sizeof(handshake->ck)); + CROSS_TYPE_ASSIGNMENT(&handshake->ck, &handshake->h); SUPERVERBOSE("# ck=%s", tal_hexstr(tmpctx, &handshake->ck, sizeof(handshake->ck))); diff --git a/contrib/msggen/msggen/model.py b/contrib/msggen/msggen/model.py index 4ea1a3df8d3e..6296635bd2ed 100644 --- a/contrib/msggen/msggen/model.py +++ b/contrib/msggen/msggen/model.py @@ -305,7 +305,7 @@ def merge_dicts(dict1, dict2): ) if field is not None: - field.deprecated = ftype.get("deprecated", False) + field.deprecated = ftype.get("deprecated", None) field.required = fname in required fields.append(field) logger.debug(field) diff --git a/contrib/msggen/msggen/schema.json b/contrib/msggen/msggen/schema.json index 54364243cdfa..04085f206044 100644 --- a/contrib/msggen/msggen/schema.json +++ b/contrib/msggen/msggen/schema.json @@ -144,52 +144,707 @@ "examples": [ { "description": [ - "Here is a command to make a PSBT with a 100,000 sat output that leads to the on-chain wallet." + "Here is a command to make a PSBT with a 1,000,000 sat output that leads to the on-chain wallet:" ], "request": { "id": "example:addpsbtoutput#1", "method": "addpsbtoutput", "params": { - "satoshi": 100000 + "satoshi": 1000000, + "locktime": 111 + } + }, + "response": { + "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAA==", + "estimated_added_weight": 172, + "outnum": 0 + } + }, + { + "request": { + "id": "example:addpsbtoutput#2", + "method": "addpsbtoutput", + "params": [ + 3333333, + "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQECAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQA=" + ] + }, + "response": { + "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQECAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQA=", + "estimated_added_weight": 172, + "outnum": 1 + } + }, + { + "request": { + "id": "example:addpsbtoutput#3", + "method": "addpsbtoutput", + "params": { + "satoshi": 3333333, + "initialpsbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQECAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQA=", + "destination": "bcrt1p52spc7t99z0wu444elxahxzkcu86gakzvnfp7ugudf567am2uspsuneuq9" + } + }, + "response": { + "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEDAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQABAwjV3DIAAAAAAAEEIlEgoqAceWUonu5Wtc/N25hWxw+kdsJk0h9xHGppr3dq5AMA", + "estimated_added_weight": 172, + "outnum": 2 + } + } + ] + }, + "lightning-askrene-age.json": { + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-age", + "title": "Command for expiring information in a layer (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-age** RPC command tells askrene that information added to a layer by *askrene-inform-channel* beyond a certain age is less useful. It currently completely forgets constraints older than *cutoff*." + ], + "request": { + "required": [ + "layer", + "cutoff" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer to apply this change to." + ] + }, + "cutoff": { + "type": "u64", + "description": [ + "The UNIX timestamp: constraints older than this will be forgotten." + ] + } + } + }, + "response": { + "required": [ + "layer", + "num_removed" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The *layer* parameter provided." + ] + }, + "num_removed": { + "type": "u64", + "description": [ + "The number of constraints removed from *layer*" + ] + } + } + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-listlayers(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] + }, + "lightning-askrene-create-channel.json": { + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-create-channel", + "title": "Command to add a channel to layer (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-create-channel** RPC command tells askrene to populate one direction of a channel in the given layer. If the channel already exists, it will be overridden. If the layer does not exist, it will be created." + ], + "request": { + "required": [ + "layer", + "source", + "destination", + "short_channel_id", + "capacity_msat", + "htlc_min", + "htlc_max", + "base_fee", + "proportional_fee", + "delay" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer to apply this change to." + ] + }, + "source": { + "type": "pubkey", + "description": [ + "The source node id for the channel." + ] + }, + "destination": { + "type": "pubkey", + "description": [ + "The destination node id for the channel." + ] + }, + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The short channel id for the channel. If a channel with this short channel id already exists in *layer*, the *source*, *destination* and *capacity_msat* must be the same." + ] + }, + "capacity_msat": { + "type": "msat", + "description": [ + "The capacity (onchain size) of the channel." + ] + }, + "htlc_min": { + "type": "msat", + "description": [ + "The minimum value allowed in this direction." + ] + }, + "htlc_max": { + "type": "msat", + "description": [ + "The maximum value allowed in this direction." + ] + }, + "base_fee": { + "type": "msat", + "description": [ + "The base fee to apply to use the channel in this direction." + ] + }, + "proportional_fee": { + "type": "u32", + "description": [ + "The proportional fee (in parts per million) to apply to use the channel in this direction." + ] + }, + "delay": { + "type": "u16", + "description": [ + "The CLTV delay required for this direction." + ] + } + } + }, + "response": { + "required": [], + "properties": {} + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-listlayers(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] + }, + "lightning-askrene-disable-node.json": { + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-disable-node", + "title": "Command to disable all channels to/from a node in a layer (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-disable-node** RPC command tells askrene to disable all channels connected to a node whenever the given layer is used. This is mainly useful to force the use of alternate paths: while individual channels can be disabled using askrene-create-channel or askrene-inform-channel, that would be racy if new channels appeared." + ], + "request": { + "required": [ + "layer", + "node" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer to apply this change to." + ] + }, + "node": { + "type": "pubkey", + "description": [ + "The node to disable. It does not need to exist." + ] + } + } + }, + "response": { + "required": [], + "properties": {} + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-listlayers(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] + }, + "lightning-askrene-inform-channel.json": { + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-inform-channel", + "title": "Command to add channel capacity restrictions to layer (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-inform-channel** RPC command tells askrene about the minimum or maximum current capacity of a given channel. It can be applied whether the curren channel exists or not. If the layer does not exist, it will be created." + ], + "request": { + "required": [ + "layer", + "short_channel_id", + "direction" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer to apply this change to." + ] + }, + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The short channel id to apply this change to." + ] + }, + "direction": { + "type": "u32", + "description": [ + "The direction to apply this change to." + ] + }, + "maximum_msat": { + "type": "msat", + "description": [ + "The maximum value which this channel could pass. This or *minimum_msat* must be specified, but not both." + ] + }, + "minimum_msat": { + "type": "msat", + "description": [ + "The minumum value which this channel could pass. This or *minimum_msat* must be specified, but not both." + ] + } + } + }, + "response": { + "required": [ + "constraint" + ], + "properties": { + "constraint": { + "type": "object", + "required": [ + "short_channel_id", + "direction", + "timestamp" + ], + "properties": { + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The *short_channel_id* specified." + ] + }, + "direction": { + "type": "u32", + "description": [ + "The *direction* specified." + ] + }, + "timestamp": { + "type": "u64", + "description": [ + "The UNIX time (seconds since 1970) this was created." + ] + }, + "maximum_msat": { + "type": "msat", + "description": [ + "The *minimum_msat* (if specified)" + ] + }, + "minimum_msat": { + "type": "msat", + "description": [ + "The *maximum_msat* (if specified)" + ] + } + } + } + } + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-listlayers(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] + }, + "lightning-askrene-listlayers.json": { + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-listlayers", + "title": "Command to display information about layers (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-listlayers** RPC command reports any modifications each layer (or, the layer specified) would make to the topology, if it were used for *getroutes*." + ], + "request": { + "required": [], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer to report on." + ] + } + } + }, + "response": { + "required": [ + "layers" + ], + "properties": { + "layers": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "layer", + "disabled_nodes", + "created_channels", + "constraints" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer." + ] + }, + "disabled_nodes": { + "type": "array", + "items": { + "type": "pubkey", + "description": [ + "The id of the disabled node." + ] + } + }, + "created_channels": { + "type": "array", + "items": { + "type": "object", + "required": [ + "source", + "destination", + "short_channel_id", + "capacity_msat", + "htlc_minimum_msat", + "htlc_maximum_msat", + "fee_base_msat", + "fee_proportional_millionths", + "delay" + ], + "properties": { + "source": { + "type": "pubkey", + "description": [ + "The source node id for the channel." + ] + }, + "destination": { + "type": "pubkey", + "description": [ + "The destination node id for the channel." + ] + }, + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The short channel id for the channel." + ] + }, + "capacity_msat": { + "type": "msat", + "description": [ + "The capacity (onchain size) of the channel." + ] + }, + "htlc_minimum_msat": { + "type": "msat", + "description": [ + "The minimum value allowed in this direction." + ] + }, + "htlc_maximum_msat": { + "type": "msat", + "description": [ + "The maximum value allowed in this direction." + ] + }, + "fee_base_msat": { + "type": "msat", + "description": [ + "The base fee to apply to use the channel in this direction." + ] + }, + "fee_proportional_millionths": { + "type": "u32", + "description": [ + "The proportional fee (in parts per million) to apply to use the channel in this direction." + ] + }, + "delay": { + "type": "u16", + "description": [ + "The CLTV delay required for this direction." + ] + } + } + } + }, + "constraints": { + "type": "array", + "items": { + "type": "object", + "required": [ + "short_channel_id", + "direction" + ], + "properties": { + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The short channel id." + ] + }, + "direction": { + "type": "u32", + "description": [ + "The direction." + ] + }, + "maximum_msat": { + "type": "msat", + "description": [ + "The maximum value which this channel could pass. This or *minimum_msat* will be present, but not both." + ] + }, + "minimum_msat": { + "type": "msat", + "description": [ + "The minimum value which this channel could pass. This or *minimum_msat* will be present, but not both." + ] + } + } + } + } + } } - }, - "response": { - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIoIYBAAAAAAABBCJRIHg2NV/cioLcTLAKdyxVVBUdBjhKTdZejT9orAhWa4S+AA==", - "estimated_added_weight": 172, - "outnum": 0 } - }, - { - "request": { - "id": "example:addpsbtoutput#2", - "method": "addpsbtoutput", - "params": { - "satoshi": 1000000, - "locktime": 111 + } + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] + }, + "lightning-askrene-reserve.json": { + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-reserve", + "title": "Command for informing askrene that you are trying a path (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-reserve** RPC command tells askrene that a path is being attempted. This allows it to take that into account when other *getroutes* calls are made. You should call **askrene-unreserve** after the attempt has completed.", + "", + "Note that additional properties inside the *path* elements are ignored, which is useful when used with the result of *getroutes*." + ], + "request": { + "required": [ + "path" + ], + "properties": { + "path": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true, + "required": [ + "short_channel_id", + "direction", + "amount_msat" + ], + "properties": { + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The channel joining these nodes." + ] + }, + "direction": { + "type": "u32", + "description": [ + "0 if this channel is traversed from lesser to greater **id**, otherwise 1." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount to send into this hop." + ] + } + } } - }, - "response": { - "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIJd6ICNAQALFOMhoUHuSVSuzcaUdkDKlk4K+A+DR9+4uAA==", - "estimated_added_weight": 172, - "outnum": 0 } - }, - { - "request": { - "id": "example:addpsbtoutput#3", - "method": "addpsbtoutput", - "params": { - "satoshi": 974343, - "initialpsbt": "cHNidP8BAF4CAAAAAfwbEpvpi6D14YV4VLnuVB47Y0uF41kXEyJRL4IusySSAQAAAAD9////ASICAAAAAAAAIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL5nAAAAAAEA9gIAAAAAAQFEkxvLatohY6mw5gr5qG1aiArSrziFPR2YoqD21Hv+RAAAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNrz8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIEu1nfVRt9i+rFM219mwhMqdwJsqygWSWTFUS+cemdh6AiBG3Qo8g9J/aAMO2RHDsIBScscj6pTTIwZp7Gw8G3EOKAEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPZgAAAAEBK68/DwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oAAA==", - "destination": "bcrt1q9tc6q49l6wrrtp8ul45rj92hsleehwwxty32zu" + } + }, + "response": { + "required": [], + "properties": {} + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-unreserve(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-listlayers(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] + }, + "lightning-askrene-unreserve.json": { + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-unreserve", + "title": "Command for informing askrene that you are no longer trying a path (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-unreserve** RPC command tells askrene that a path attempt has finished: it should only be called after a successful **askrene-reserve** call.", + "", + "Note that additional properties inside the *path* elements are ignored, which is useful when used with the result of *getroutes*." + ], + "request": { + "required": [ + "path" + ], + "properties": { + "path": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true, + "required": [ + "short_channel_id", + "direction", + "amount_msat" + ], + "properties": { + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The channel joining these nodes." + ] + }, + "direction": { + "type": "u32", + "description": [ + "0 if this channel is traversed from lesser to greater **id**, otherwise 1." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount to send into this hop." + ] + } + } } - }, - "response": { - "psbt": "cHNidP8BAH0CAAAAAfwbEpvpi6D14YV4VLnuVB47Y0uF41kXEyJRL4IusySSAQAAAAD9////AiICAAAAAAAAIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4H3g4AAAAAABYAFCrxoFS/04Y1hPz9aDkVV4fzm7nGZwAAAAABAPYCAAAAAAEBRJMby2raIWOpsOYK+ahtWogK0q84hT0dmKKg9tR7/kQAAAAAAP3///8CQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAza8/DwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oCRzBEAiBLtZ31UbfYvqxTNtfZsITKncCbKsoFklkxVEvnHpnYegIgRt0KPIPSf2gDDtkRw7CAUnLHI+qU0yMGaexsPBtxDigBIQPXRURck2JmXyLg2W6edm8nPzJg3qOcina/oF3SaE3cz2YAAAABASuvPw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAAAA", - "estimated_added_weight": 172, - "outnum": 1 } } + }, + "response": { + "required": [], + "properties": {} + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-reserve(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-listlayers(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " ] }, "lightning-autoclean-once.json": { @@ -403,8 +1058,8 @@ "response": { "autoclean": { "failedpays": { - "cleaned": 1, - "uncleaned": 1 + "cleaned": 0, + "uncleaned": 7 } } } @@ -421,7 +1076,7 @@ "response": { "autoclean": { "succeededpays": { - "cleaned": 1, + "cleaned": 7, "uncleaned": 0 } } @@ -869,7 +1524,8 @@ "response": { "autoclean": { "expiredinvoices": { - "enabled": false, + "enabled": true, + "age": 300, "cleaned": 0 } } @@ -893,7 +1549,7 @@ }, "succeededpays": { "enabled": false, - "cleaned": 0 + "cleaned": 7 }, "failedpays": { "enabled": false, @@ -905,7 +1561,7 @@ }, "expiredinvoices": { "enabled": true, - "age": 2, + "age": 300, "cleaned": 0 } } @@ -1179,8 +1835,28 @@ "response": { "channels_apy": [ { - "account": "e41b2ec83e9139a9fd8f1d89b01e5d7df73099494e6b91504c39445e37485b0d", - "routed_out_msat": 1431440, + "account": "252d1b0a1e57895e84137f28cf19ab2c35847e284c112fefdecc7afeaa5c1de7", + "routed_out_msat": 1000000, + "routed_in_msat": 510081208, + "lease_fee_paid_msat": 0, + "lease_fee_earned_msat": 0, + "pushed_out_msat": 0, + "pushed_in_msat": 0, + "our_start_balance_msat": 0, + "channel_start_balance_msat": 1000000000, + "fees_out_msat": 0, + "fees_in_msat": 106, + "utilization_out": "0.1000%", + "utilization_in": "51.0081%", + "utilization_in_initial": "51.0081%", + "apy_out": "0.0000%", + "apy_in": "0.0252%", + "apy_in_initial": "0.0252%", + "apy_total": "0.0252%" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "routed_out_msat": 510181102, "routed_in_msat": 0, "lease_fee_paid_msat": 0, "lease_fee_earned_msat": 0, @@ -1188,20 +1864,20 @@ "pushed_in_msat": 0, "our_start_balance_msat": 1000000000, "channel_start_balance_msat": 1000000000, - "fees_out_msat": 0, + "fees_out_msat": 106, "fees_in_msat": 0, - "utilization_out": "0.1431%", - "utilization_out_initial": "0.1431%", + "utilization_out": "51.0181%", + "utilization_out_initial": "51.0181%", "utilization_in": "0.0000%", - "apy_out": "0.0000%", - "apy_out_initial": "0.0000%", + "apy_out": "0.0505%", + "apy_out_initial": "0.0505%", "apy_in": "0.0000%", - "apy_total": "0.0000%", - "apy_total_initial": "0.0000%" + "apy_total": "0.0505%", + "apy_total_initial": "0.0505%" }, { - "account": "net", - "routed_out_msat": 1431440, + "account": "f8fc83a432cbfb2fffe222cc06727fdd977b5dd10ebd6707158e799e6f522d9f", + "routed_out_msat": 500000000, "routed_in_msat": 0, "lease_fee_paid_msat": 0, "lease_fee_earned_msat": 0, @@ -1211,14 +1887,37 @@ "channel_start_balance_msat": 1000000000, "fees_out_msat": 0, "fees_in_msat": 0, - "utilization_out": "0.1431%", - "utilization_out_initial": "0.1431%", + "utilization_out": "50.0000%", + "utilization_out_initial": "50.0000%", "utilization_in": "0.0000%", "apy_out": "0.0000%", "apy_out_initial": "0.0000%", "apy_in": "0.0000%", "apy_total": "0.0000%", "apy_total_initial": "0.0000%" + }, + { + "account": "net", + "routed_out_msat": 1011181102, + "routed_in_msat": 510081208, + "lease_fee_paid_msat": 0, + "lease_fee_earned_msat": 0, + "pushed_out_msat": 0, + "pushed_in_msat": 0, + "our_start_balance_msat": 2000000000, + "channel_start_balance_msat": 3000000000, + "fees_out_msat": 106, + "fees_in_msat": 106, + "utilization_out": "33.7060%", + "utilization_out_initial": "50.5591%", + "utilization_in": "17.0027%", + "utilization_in_initial": "51.0081%", + "apy_out": "0.0084%", + "apy_out_initial": "0.0126%", + "apy_in": "0.0084%", + "apy_in_initial": "0.0252%", + "apy_total": "0.0168%", + "apy_total_initial": "0.0168%" } ] } @@ -1543,23 +2242,51 @@ "request": { "id": "example:bkpr-inspect#1", "method": "bkpr-inspect", - "params": [ - "f30a7bab1ec077622d8fe877634bc6dd38bb08122ad49606199c565e0383b2ab" - ] + "params": { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2" + } }, "response": { "txs": [ { - "txid": "abb283035e569c190696d42a1208bb38ddc64b6377e88f2d6277c01eab7b0af3", - "fees_paid_msat": 0, + "txid": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483", + "blockheight": 111, + "fees_paid_msat": 4927000, "outputs": [ { - "account": "f30a7bab1ec077622d8fe877634bc6dd38bb08122ad49606199c565e0383b2ab", + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "outnum": 0, - "output_tag": "channel_proposed", - "output_value_msat": 996363000, - "credit_msat": 996363000, + "output_tag": "channel_open", + "output_value_msat": 1000000000, + "credit_msat": 1000000000, + "currency": "bcrt", + "spend_tag": "channel_close", + "spending_txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305", + "debit_msat": 489818898 + } + ] + }, + { + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305", + "blockheight": 121, + "fees_paid_msat": 2895898, + "outputs": [ + { + "account": "wallet", + "outnum": 0, + "output_tag": "deposit", + "output_value_msat": 486923000, + "credit_msat": 486923000, "currency": "bcrt" + }, + { + "account": "external", + "outnum": 1, + "output_tag": "to_them", + "output_value_msat": 510181000, + "credit_msat": 510181000, + "currency": "bcrt", + "originating_account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2" } ] } @@ -1835,182 +2562,411 @@ "response": { "events": [ { - "account": "wallet", + "account": "wallet", + "type": "chain", + "tag": "deposit", + "credit_msat": 200000000000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "386ad532212a5cffd753a39c2d7260793e0c885fc28bc1235362c2b133a4f6a4:0", + "timestamp": 1722303635, + "blockheight": 105 + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "chain", + "tag": "channel_open", + "credit_msat": 0, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483:0", + "timestamp": 1722303653, + "blockheight": 111 + }, + { + "account": "wallet", + "type": "chain", + "tag": "deposit", + "credit_msat": 2000000000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "b19a249c64f2c952b4b9a400bdec159b56af2af63939c9ecb8fd937f344a7056:0", + "timestamp": 1722303656, + "blockheight": 112 + }, + { + "account": "wallet", + "type": "chain", + "tag": "withdrawal", + "credit_msat": 0, + "debit_msat": 2000000000, + "currency": "bcrt", + "outpoint": "b19a249c64f2c952b4b9a400bdec159b56af2af63939c9ecb8fd937f344a7056:0", + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2", + "timestamp": 1722303659, + "blockheight": 113 + }, + { + "account": "wallet", + "type": "chain", + "tag": "deposit", + "credit_msat": 995073000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2:0", + "timestamp": 1722303659, + "blockheight": 113 + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "chain", + "tag": "channel_open", + "credit_msat": 1000000000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2:1", + "timestamp": 1722303659, + "blockheight": 113 + }, + { + "account": "wallet", + "type": "onchain_fee", + "tag": "onchain_fee", + "credit_msat": 1004927000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" + }, + { + "account": "wallet", + "type": "onchain_fee", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 1004927000, + "currency": "bcrt", + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "onchain_fee", + "tag": "onchain_fee", + "credit_msat": 4927000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 500000000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "7f74f064ff4528b7ec7c578df662617657cae9af4a74f5f24f68cb8465b18670", + "part_id": 0, + "timestamp": 1722303673, + "description": "description send some sats l2 to l3", + "is_rebalance": false + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", "type": "channel", - "tag": "journal_entry", + "tag": "invoice", "credit_msat": 0, + "debit_msat": 500000000, + "currency": "bcrt", + "payment_id": "365522e0e6c2fe84987153324cc9fac02986855d849bbd650426ba6064463166", + "part_id": 0, + "timestamp": 1722303675, + "description": "description send some sats l3 to l4", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706152911, + "payment_id": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", + "part_id": 0, + "timestamp": 1722303677, + "description": "Invoice description l31", "is_rebalance": false }, { - "account": "wallet", - "type": "chain", - "tag": "deposit", - "credit_msat": 2000000000, + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "7e202b3b1016e8eb6f4e936215ed6b5bdc63c17e6ebb5e6bce2f98e6757ba44c:0", - "timestamp": 1706152914, - "blockheight": 102 + "payment_id": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", + "part_id": 0, + "timestamp": 1722303679, + "description": "keysend", + "is_rebalance": false }, { - "account": "wallet", - "type": "chain", - "tag": "withdrawal", + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "channel", + "tag": "routed", "credit_msat": 0, - "debit_msat": 2000000000, + "debit_msat": 10000000, + "fees_msat": 101, "currency": "bcrt", - "outpoint": "7e202b3b1016e8eb6f4e936215ed6b5bdc63c17e6ebb5e6bce2f98e6757ba44c:0", - "txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b", - "timestamp": 1706152921, - "blockheight": 103 + "payment_id": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "part_id": 0, + "timestamp": 1722303682, + "is_rebalance": false }, { - "account": "wallet", - "type": "chain", - "tag": "deposit", - "credit_msat": 995073000, + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "routed", + "credit_msat": 10000101, "debit_msat": 0, + "fees_msat": 101, "currency": "bcrt", - "outpoint": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b:1", - "timestamp": 1706152921, - "blockheight": 103 + "payment_id": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "part_id": 0, + "timestamp": 1722303682, + "is_rebalance": false }, { - "account": "wallet", - "type": "onchain_fee", - "tag": "onchain_fee", - "credit_msat": 1004927000, + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706152921, - "txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b" + "payment_id": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "part_id": 0, + "timestamp": 1722303686, + "description": "keysend", + "is_rebalance": false }, { - "account": "wallet", - "type": "onchain_fee", - "tag": "onchain_fee", - "credit_msat": 0, - "debit_msat": 1004927000, + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 50000, + "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706152921, - "txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b" + "payment_id": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "part_id": 0, + "timestamp": 1722303688, + "description": "l32 description", + "is_rebalance": false }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", - "type": "chain", - "tag": "channel_open", - "credit_msat": 1000000000, + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 100000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b:0", - "timestamp": 1706152922, - "blockheight": 103 + "payment_id": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68", + "part_id": 0, + "timestamp": 1722303689, + "description": "l33 description", + "is_rebalance": false }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", - "type": "onchain_fee", - "tag": "onchain_fee", - "credit_msat": 4927000, - "debit_msat": 0, + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "channel", + "tag": "routed", + "credit_msat": 0, + "debit_msat": 1000, + "fees_msat": 1, "currency": "bcrt", - "timestamp": 1706152922, - "txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b" + "payment_id": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "part_id": 0, + "timestamp": 1722303692, + "is_rebalance": false }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "type": "channel", - "tag": "invoice", - "credit_msat": 0, - "debit_msat": 11000000, + "tag": "routed", + "credit_msat": 1001, + "debit_msat": 0, + "fees_msat": 1, "currency": "bcrt", - "payment_id": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", + "payment_id": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", "part_id": 0, - "timestamp": 1706152934, - "description": [ - "XEoCR94SIz6UIRUEkxum." - ], + "timestamp": 1722303692, "is_rebalance": false }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "wallet", + "type": "chain", + "tag": "deposit", + "credit_msat": 510181000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305:1", + "timestamp": 1722303693, + "blockheight": 121 + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "chain", + "tag": "channel_close", + "credit_msat": 0, + "debit_msat": 489999000, + "currency": "bcrt", + "outpoint": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2:1", + "txid": "2849a5c5cd182ebec02d18ba6348bb01e70a544d0ce9aa8b5533fb09d24c969e", + "timestamp": 1722303693, + "blockheight": 121 + }, + { + "account": "external", + "origin": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "chain", + "tag": "to_them", + "credit_msat": 510001000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "2849a5c5cd182ebec02d18ba6348bb01e70a544d0ce9aa8b5533fb09d24c969e:1", + "timestamp": 1722303693, + "blockheight": 121 + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "type": "chain", "tag": "channel_close", "credit_msat": 0, - "debit_msat": 989000000, + "debit_msat": 510181102, "currency": "bcrt", - "outpoint": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b:0", - "txid": "7178638c13a0573f440d9516a23901874b6138338d378b3291cb306c90b3f998", - "timestamp": 1706152938, - "blockheight": 104 + "outpoint": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483:0", + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305", + "timestamp": 1722303693, + "blockheight": 121 }, { "account": "external", - "origin": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "origin": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "type": "chain", "tag": "to_them", - "credit_msat": 10899000, + "credit_msat": 486923000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "7178638c13a0573f440d9516a23901874b6138338d378b3291cb306c90b3f998:0", - "timestamp": 1706152938, - "blockheight": 104 + "outpoint": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305:0", + "timestamp": 1722303693, + "blockheight": 121 }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "type": "onchain_fee", "tag": "onchain_fee", - "credit_msat": 7967000, + "credit_msat": 102, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303693, + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305" + }, + { + "account": "ecabe6d86abdd57565b3fb7e7c5d724e60ca1a07633951769b5dbfa48dc884b3", + "type": "chain", + "tag": "channel_open", + "credit_msat": 0, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706152938, - "txid": "7178638c13a0573f440d9516a23901874b6138338d378b3291cb306c90b3f998" + "outpoint": "f2f4e67dbf2791a3b57dd986418156b116b452c5fc27b077da7c529db82f06f5:1", + "timestamp": 1722303702, + "blockheight": 123 }, { "account": "wallet", "type": "chain", "tag": "deposit", - "credit_msat": 980912000, + "credit_msat": 2000000000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "85477738281c1afd652c350025f1d28658fe541c83adc9a7d5276c30cf715a11:0", - "timestamp": 1706152941, - "blockheight": 109 + "outpoint": "4c4b46acfd0c9d4b8393a2c3fbc27cb70bfa9270bf47ade3348c4acd949b770b:0", + "timestamp": 1722303705, + "blockheight": 124 + }, + { + "account": "wallet", + "type": "chain", + "tag": "withdrawal", + "credit_msat": 0, + "debit_msat": 510181000, + "currency": "bcrt", + "outpoint": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305:1", + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee", + "timestamp": 1722303708, + "blockheight": 125 + }, + { + "account": "wallet", + "type": "chain", + "tag": "withdrawal", + "credit_msat": 0, + "debit_msat": 2000000000, + "currency": "bcrt", + "outpoint": "4c4b46acfd0c9d4b8393a2c3fbc27cb70bfa9270bf47ade3348c4acd949b770b:0", + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee", + "timestamp": 1722303708, + "blockheight": 125 }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "wallet", "type": "chain", - "tag": "delayed_to_us", - "credit_msat": 981033000, + "tag": "deposit", + "credit_msat": 1503221000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "7178638c13a0573f440d9516a23901874b6138338d378b3291cb306c90b3f998:1", - "timestamp": 1706152941, - "blockheight": 104 + "outpoint": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee:0", + "timestamp": 1722303708, + "blockheight": 125 }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", "type": "chain", - "tag": "to_wallet", + "tag": "channel_open", + "credit_msat": 1000000000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee:1", + "timestamp": 1722303708, + "blockheight": 125 + }, + { + "account": "wallet", + "type": "onchain_fee", + "tag": "onchain_fee", + "credit_msat": 1006960000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" + }, + { + "account": "wallet", + "type": "onchain_fee", + "tag": "onchain_fee", "credit_msat": 0, - "debit_msat": 981033000, + "debit_msat": 1006960000, "currency": "bcrt", - "outpoint": "7178638c13a0573f440d9516a23901874b6138338d378b3291cb306c90b3f998:1", - "txid": "85477738281c1afd652c350025f1d28658fe541c83adc9a7d5276c30cf715a11", - "timestamp": 1706152941, - "blockheight": 109 + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", "type": "onchain_fee", "tag": "onchain_fee", - "credit_msat": 121000, + "credit_msat": 6960000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706152941, - "txid": "85477738281c1afd652c350025f1d28658fe541c83adc9a7d5276c30cf715a11" + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" } ] } @@ -2020,31 +2976,147 @@ "id": "example:bkpr-listaccountevents#2", "method": "bkpr-listaccountevents", "params": [ - "f30a7bab1ec077622d8fe877634bc6dd38bb08122ad49606199c565e0383b2ab" + "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2" ] }, "response": { "events": [ { - "account": "f30a7bab1ec077622d8fe877634bc6dd38bb08122ad49606199c565e0383b2ab", + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "type": "chain", - "tag": "channel_proposed", - "credit_msat": 996363000, + "tag": "channel_open", + "credit_msat": 0, "debit_msat": 0, "currency": "bcrt", - "outpoint": "abb283035e569c190696d42a1208bb38ddc64b6377e88f2d6277c01eab7b0af3:0", - "timestamp": 1706246949, - "blockheight": 0 + "outpoint": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483:0", + "timestamp": 1722303653, + "blockheight": 111 }, { - "account": "f30a7bab1ec077622d8fe877634bc6dd38bb08122ad49606199c565e0383b2ab", + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "type": "channel", - "tag": "pushed", - "credit_msat": 0, - "debit_msat": 20000000, + "tag": "invoice", + "credit_msat": 500000000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "7f74f064ff4528b7ec7c578df662617657cae9af4a74f5f24f68cb8465b18670", + "part_id": 0, + "timestamp": 1722303673, + "description": "description send some sats l2 to l3", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", + "part_id": 0, + "timestamp": 1722303677, + "description": "Invoice description l31", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", + "part_id": 0, + "timestamp": 1722303679, + "description": "keysend", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "routed", + "credit_msat": 10000101, + "debit_msat": 0, + "fees_msat": 101, + "currency": "bcrt", + "payment_id": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "part_id": 0, + "timestamp": 1722303682, + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "part_id": 0, + "timestamp": 1722303686, + "description": "keysend", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 50000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "part_id": 0, + "timestamp": 1722303688, + "description": "l32 description", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 100000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68", + "part_id": 0, + "timestamp": 1722303689, + "description": "l33 description", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "routed", + "credit_msat": 1001, + "debit_msat": 0, + "fees_msat": 1, "currency": "bcrt", - "timestamp": 1706246949, + "payment_id": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "part_id": 0, + "timestamp": 1722303692, "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "chain", + "tag": "channel_close", + "credit_msat": 0, + "debit_msat": 510181102, + "currency": "bcrt", + "outpoint": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483:0", + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305", + "timestamp": 1722303693, + "blockheight": 121 + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "onchain_fee", + "tag": "onchain_fee", + "credit_msat": 102, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303693, + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305" } ] } @@ -2201,7 +3273,60 @@ "account": "wallet", "balances": [ { - "balance_msat": 2222222000, + "balance_msat": 202498294000, + "coin_type": "bcrt" + } + ] + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "we_opened": false, + "account_closed": true, + "account_resolved": true, + "resolved_at_block": 121, + "balances": [ + { + "balance_msat": 0, + "coin_type": "bcrt" + } + ] + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "peer_id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "we_opened": true, + "account_closed": true, + "account_resolved": false, + "balances": [ + { + "balance_msat": 0, + "coin_type": "bcrt" + } + ] + }, + { + "account": "ecabe6d86abdd57565b3fb7e7c5d724e60ca1a07633951769b5dbfa48dc884b3", + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "we_opened": false, + "account_closed": false, + "account_resolved": false, + "balances": [ + { + "balance_msat": 0, + "coin_type": "bcrt" + } + ] + }, + { + "account": "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", + "peer_id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "we_opened": true, + "account_closed": false, + "account_resolved": false, + "balances": [ + { + "balance_msat": 1000000000, "coin_type": "bcrt" } ] @@ -2352,22 +3477,146 @@ "response": { "income_events": [ { - "account": "wallet", - "tag": "deposit", - "credit_msat": 1111111000, + "account": "wallet", + "tag": "deposit", + "credit_msat": 200000000000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303635, + "outpoint": "386ad532212a5cffd753a39c2d7260793e0c885fc28bc1235362c2b133a4f6a4:0" + }, + { + "account": "wallet", + "tag": "deposit", + "credit_msat": 2000000000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303656, + "outpoint": "b19a249c64f2c952b4b9a400bdec159b56af2af63939c9ecb8fd937f344a7056:0" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 500000000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303673, + "description": "description send some sats l2 to l3", + "payment_id": "7f74f064ff4528b7ec7c578df662617657cae9af4a74f5f24f68cb8465b18670" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "invoice", + "credit_msat": 0, + "debit_msat": 500000000, + "currency": "bcrt", + "timestamp": 1722303675, + "description": "description send some sats l3 to l4", + "payment_id": "365522e0e6c2fe84987153324cc9fac02986855d849bbd650426ba6064463166" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303677, + "description": "Invoice description l31", + "payment_id": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303679, + "description": "keysend", + "payment_id": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "routed", + "credit_msat": 101, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303682, + "payment_id": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303686, + "description": "keysend", + "payment_id": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 50000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303688, + "description": "l32 description", + "payment_id": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 100000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303689, + "description": "l33 description", + "payment_id": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "routed", + "credit_msat": 1, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706153060, - "outpoint": "6d813d2e99ae7181b61e59ff224c43de698bd08b8ca5b8034ccc13aa7b6428ef:0" + "timestamp": 1722303692, + "payment_id": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 102, + "currency": "bcrt", + "timestamp": 1722303693, + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 4927000, + "currency": "bcrt", + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" }, { "account": "wallet", "tag": "deposit", - "credit_msat": 1111111000, + "credit_msat": 2000000000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706153060, - "outpoint": "0bbbe965f76525af3876ae6f1520d91047d4be04cb4e46b7229120a60c5dc9c5:0" + "timestamp": 1722303705, + "outpoint": "4c4b46acfd0c9d4b8393a2c3fbc27cb70bfa9270bf47ade3348c4acd949b770b:0" + }, + { + "account": "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 6960000, + "currency": "bcrt", + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" } ] } @@ -2385,38 +3634,180 @@ { "account": "wallet", "tag": "deposit", - "credit_msat": 1111111000, + "credit_msat": 200000000000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1708624181, - "outpoint": "895b5eaad4544d24c99628883b4d84b2c6024d6a2da4c1de54098d985f280943:1" + "timestamp": 1722303635, + "outpoint": "386ad532212a5cffd753a39c2d7260793e0c885fc28bc1235362c2b133a4f6a4:0" }, { "account": "wallet", - "tag": "withdrawal", + "tag": "deposit", + "credit_msat": 2000000000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303656, + "outpoint": "b19a249c64f2c952b4b9a400bdec159b56af2af63939c9ecb8fd937f344a7056:0" + }, + { + "account": "wallet", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 1004927000, + "currency": "bcrt", + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" + }, + { + "account": "wallet", + "tag": "onchain_fee", + "credit_msat": 1004927000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 4927000, + "currency": "bcrt", + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 500000000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303673, + "description": "description send some sats l2 to l3", + "payment_id": "7f74f064ff4528b7ec7c578df662617657cae9af4a74f5f24f68cb8465b18670" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "invoice", + "credit_msat": 0, + "debit_msat": 500000000, + "currency": "bcrt", + "timestamp": 1722303675, + "description": "description send some sats l3 to l4", + "payment_id": "365522e0e6c2fe84987153324cc9fac02986855d849bbd650426ba6064463166" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303677, + "description": "Invoice description l31", + "payment_id": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303679, + "description": "keysend", + "payment_id": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "routed", + "credit_msat": 101, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303682, + "payment_id": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303686, + "description": "keysend", + "payment_id": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 50000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303688, + "description": "l32 description", + "payment_id": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 100000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303689, + "description": "l33 description", + "payment_id": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "routed", + "credit_msat": 1, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303692, + "payment_id": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "onchain_fee", "credit_msat": 0, - "debit_msat": 555555000, + "debit_msat": 102, + "currency": "bcrt", + "timestamp": 1722303693, + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305" + }, + { + "account": "wallet", + "tag": "deposit", + "credit_msat": 2000000000, + "debit_msat": 0, "currency": "bcrt", - "timestamp": 1708624182, - "outpoint": "d28a2cba55da10700ddd7f1f23618160dafb3134650055654551d9b0382dcd71:0" + "timestamp": 1722303705, + "outpoint": "4c4b46acfd0c9d4b8393a2c3fbc27cb70bfa9270bf47ade3348c4acd949b770b:0" }, { "account": "wallet", "tag": "onchain_fee", "credit_msat": 0, - "debit_msat": 555556000, + "debit_msat": 1006960000, "currency": "bcrt", - "timestamp": 1708624183, - "txid": "d28a2cba55da10700ddd7f1f23618160dafb3134650055654551d9b0382dcd71" + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" }, { "account": "wallet", "tag": "onchain_fee", - "credit_msat": 554947000, + "credit_msat": 1006960000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1708624183, - "txid": "d28a2cba55da10700ddd7f1f23618160dafb3134650055654551d9b0382dcd71" + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" + }, + { + "account": "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 6960000, + "currency": "bcrt", + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" } ] } @@ -2510,14 +3901,14 @@ "id": "example:blacklistrune#1", "method": "blacklistrune", "params": { - "start": 2 + "start": 1 } }, "response": { "blacklist": [ { - "start": 2, - "end": 2 + "start": 1, + "end": 3 } ] } @@ -2527,19 +3918,15 @@ "id": "example:blacklistrune#2", "method": "blacklistrune", "params": { - "start": 5, - "end": 7 + "start": 0, + "end": 2 } }, "response": { "blacklist": [ { - "start": 2, - "end": 2 - }, - { - "start": 5, - "end": 7 + "start": 0, + "end": 3 } ] } @@ -2556,8 +3943,8 @@ "response": { "blacklist": [ { - "start": 2, - "end": 7 + "start": 0, + "end": 4 } ] } @@ -2619,15 +4006,15 @@ "route": [ { "amount_msat": 1011, - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "delay": 20, - "channel": "1x1x1" + "channel": "111x1x0" }, { "amount_msat": 1000, - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", "delay": 10, - "channel": "2x2x2" + "channel": "113x1x1" } ], "payment_hash": "0000000000000000000000000000000000000000000000000000000000000000" @@ -2864,29 +4251,8 @@ "id": "example:checkrune#1", "method": "checkrune", "params": { - "nodeid": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "617Obfct0oRBj_uqGFQxDk3XZ1sDFiC2Q5ltm5z1i_k9NSZtZXRob2Q9aW52b2ljZSZwbmFtZWRlc2NyaXB0aW9uPUB0aXBqYXJcfGpiNTVAc2VuZHNhdHMubG9s", - "method": "invoice", - "params": { - "amount_msat": "any", - "label": "lbl", - "description": [ - "@tipjar|jb55@sendsats.lol." - ] - } - } - }, - "response": { - "valid": true - } - }, - { - "request": { - "id": "example:checkrune#2", - "method": "checkrune", - "params": { - "nodeid": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", + "nodeid": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "rune": "_RWaZZRI7wAYU2hqlFBmYgC_dFczcpAdI_9O87YbDpg9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", "method": "listpeers", "params": {} } @@ -2897,16 +4263,14 @@ }, { "request": { - "id": "example:checkrune#3", + "id": "example:checkrune#2", "method": "checkrune", "params": { - "nodeid": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "617Obfct0oRBj_uqGFQxDk3XZ1sDFiC2Q5ltm5z1i_k9NSZtZXRob2Q9aW52b2ljZSZwbmFtZWRlc2NyaXB0aW9uPUB0aXBqYXJcfGpiNTVAc2VuZHNhdHMubG9s", - "method": "invoice", + "nodeid": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "rune": "QUJEYMLGgiaJvMDv_MhR2hiMKIBTbq-PrL-KxcIlirQ9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "method": "pay", "params": { - "amount_msat": "any", - "label": "lbl", - "description": "@tipjar|jb55@sendsats.lol" + "amount_msat": 9999 } } }, @@ -3078,14 +4442,14 @@ "id": "example:close#1", "method": "close", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "unilateraltimeout": 1 } }, "response": { - "tx": "020000000001018d388ffcd216c92d25163a62096ce47d5c9bbd6270ced51c5a1484f89df33e5700000000009db0e28002a00f00000000000016001445503fa4b65ade3ffdb1a92057688456c9ffae1380130f0000000000220020be82765fdb17fd5568f2dd31c6cf1aabc620ef338995ec5d9a2f3e42f43ae4870400473044022058dcde893655f40fc8162a79596440ef3e304273f8d530401fc17bc92c58159b0220428900ca6537538ba237d569a4a09003d663a991aeb331a9f18dfe807ee78806014730440220111270eeed8b4b1a231d3ce6e0e0daad718623ad159a0fd3781fb18118a8fec70220539826ee7c76cad4116d1d8852329f80314b3434cf21c765d8004186451a4cd50147522102324266de8403b3ab157a09f1f784d587af61831c998c151bcc21bb74c2b2314b2102e3bd38009866c9da8ec4aa99cc4ea9c6c0dd46df15c61ef0ce1f271291714e5752ae9c3ed620", - "txid": "5d8d917dd7d39fe5a12f121457fc6d712b5e393ed4f16bc8f5976fc08cbbfecd", - "type": "unilateral" + "tx": "020000000001018304b0bbf2ea662c053e0377df4652059bb107eb5312989471c2ef7e51f023cd0000000000ffffffff020b6e07000000000022512085d72025e78fd08bb61119f0987ab0041f50561ada6e130c645343db8c44c2afe5c8070000000000225120a7583f0c421663b8ca76fa579018b40682ef8553d73fd061cd8f216ecdced6a304004730440220369e36994b74172c67b738891a22a8f7cf3ad3d6051a1c08b641277c2b129134022060b96175b5046a0e8814c03076da885e4546f11e72188582473f0ca901001a0b0147304402206733aaa116b30474dfcdcc2ce48fbc6f222ed0eae7ac6e4c95da6a6f2a2105a502200ab85229e9981e0364ab1bef38e9a581067a9c7d9fe30487e34fd8e13eff56320147522102d595ae92b3544c3250fb772f214ad8d4c51425033740a5bcc357190add6d7e7a2102d6063d022691b2490ab454dee73a57c6ff5d308352b461ece69f3c284f2c241252ae00000000", + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305", + "type": "mutual" } }, { @@ -3093,29 +4457,13 @@ "id": "example:close#2", "method": "close", "params": { - "id": "103x1x0", - "destination": "bcrt1qeyyk6sl5pr49ycpqyckvmttus5ttj25pd0zpvg" + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "destination": "bcrt1qwvp8fktkxp07v0fp9jyqe7yl6rcgyu585a7pzr" } }, "response": { - "tx": "0200000000010132cbce7d5f96b4003c3b5c0eab2a29fef90bb6abb833ff312fa122f31e8301810000000000ffffffff02a0860100000000002251205779a060f200d40e8f871a40eb91614cc5bfa6d0a5f852e053400a7feff8615005b10d0000000000160014c9096d43f408ea526020262ccdad7c8516b92a81040047304402207e171d056e81cf8ad2d5a613ecbaa212d5dcbd0bf713145d18911d2cbe9d858802206222911660a26d7ffddc2563ae6d41d6ffad9fbd2fc26cf40eab501a31153b9e0147304402204ae7cdc68dc7966eab73f16a1978643336333d54ae0b6f87bc11a2c19174a9710220601e5276aee0825466cc272c4eb7d353b393ef0dd230d303f46772790dee19190147522102324266de8403b3ab157a09f1f784d587af61831c998c151bcc21bb74c2b2314b2102e3bd38009866c9da8ec4aa99cc4ea9c6c0dd46df15c61ef0ce1f271291714e5752ae00000000", - "txid": "4a08e0508e2e39ea033fab5f77b318337f345550421799f6e0eb1b15a892eda4", - "type": "mutual" - } - }, - { - "request": { - "id": "example:close#3", - "method": "close", - "params": [ - "107x1x0", - null, - "bcrt1qeyyk6sl5pr49ycpqyckvmttus5ttj25pd0zpvg" - ] - }, - "response": { - "tx": "02000000000101233b513665836d240423f45ffcd1fe19aeb08d62303fa5382ad3285f770683a60000000000ffffffff02a086010000000000225120b47216ab60a0fad97de0ba9b8b370d281dfe55f552d82034e2a8d054c2246e4405b10d0000000000160014c9096d43f408ea526020262ccdad7c8516b92a81040047304402207a9e3ca258861b33827d91514690a757e76730ba8c15dd222340bb13d993a1a502204d0ae329273b69abe62df1ffccce808d5f1a29101a8ee95dae99888376dbaef801473044022033c03f406db9f1c9d924cfd8f6ea42d0962f0ab02e3217aef518aea517ca5ba40220076e2af9d40c676316a2765a86f9efd481de3fc4465ceba33b0782c505ae3452014752210212284c004a3d24146e54b2a24db48f650370a08e1fe9abe8ff41f92b09cd50542102a3032ef980cc735579aa5295d927b9a1bdbafc459f2da14163dc9bd530e0a21152ae00000000", - "txid": "d44a1374a30c1a936d2d4fdbe73c0ffff42fec8c27c6cbaec2758b3042f61d08", + "tx": "02000000000101e23fcc9e6306ce636b203217b22409bf9bab2211f9f432de781dedb6377dab5a0100000000ffffffff02746f070000000000160014730274d976305fe63d212c880cf89fd0f082728731c80700000000002251202bdd81f95d64ed2cc37d2eae725de428c91bff072d7503d87446970eedc63030040047304402205834de4c5c994a50f3ba5406534254b68e35836f98b4d5371b78225a79d087dd02201f54e1ae045e9a33dd3dd5a2b589903f305af5ead515a8e55feb2447b090415c0147304402202dd2efc52e5b4a78cbc1cf5664a0a3e3a5e67e16b0de37fc6818dbb838b6be17022062a071e81ecaec4808a44b049e091fa60b5fcf9e7f7bbdf85bc564a0a467e13601475221021c29746e4136ddff456483df3980c2d0d5f31c93ef5ded564f7294a10d7414aa2103c47b1b2afcfd68c7b86c0976adb9a4f0835bc78242fced745d78433497a867d652ae00000000", + "txid": "2849a5c5cd182ebec02d18ba6348bb01e70a544d0ce9aa8b5533fb09d24c969e", "type": "mutual" } } @@ -3209,14 +4557,14 @@ "id": "example:commando-blacklist#1", "method": "commando-blacklist", "params": { - "start": 2 + "start": 1 } }, "response": { "blacklist": [ { - "start": 2, - "end": 2 + "start": 1, + "end": 1 } ] } @@ -3226,37 +4574,15 @@ "id": "example:commando-blacklist#2", "method": "commando-blacklist", "params": { - "start": 5, - "end": 7 - } - }, - "response": { - "blacklist": [ - { - "start": 2, - "end": 2 - }, - { - "start": 5, - "end": 7 - } - ] - } - }, - { - "request": { - "id": "example:commando-blacklist#3", - "method": "commando-blacklist", - "params": { - "start": 3, - "end": 4 + "start": 2, + "end": 3 } }, "response": { "blacklist": [ { - "start": 2, - "end": 7 + "start": 1, + "end": 3 } ] } @@ -3440,23 +4766,40 @@ "request": { "id": "example:commando-listrunes#1", "method": "commando-listrunes", - "params": {} + "params": { + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz" + } }, "response": { "runes": [ { - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", - "unique_id": "0", - "restrictions": [], - "restrictions_as_english": "" - }, - { - "rune": "Am3W_wI0PRn4qVNEsJ2iInHyFPQK8wfdqEXztm8-icQ9MA==", - "stored": false, - "our_rune": false, + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", "unique_id": "1", - "restrictions": [], - "restrictions_as_english": "" + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "id", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "id starts with 0266e4598d1d3c415f57" + } + ], + "english": "id starts with 0266e4598d1d3c415f57" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + } + ], + "restrictions_as_english": "id starts with 0266e4598d1d3c415f57 AND method equal to listpeers" } ] } @@ -3465,48 +4808,88 @@ "request": { "id": "example:commando-listrunes#2", "method": "commando-listrunes", - "params": { - "rune": "Am3W_wI0PRn4qVNEsJ2iInHyFPQK8wfdqEXztm8-icQ9MA==" - } + "params": {} }, "response": { "runes": [ { - "rune": "Am3W_wI0PRn4qVNEsJ2iInHyFPQK8wfdqEXztm8-icQ9MA==", - "stored": false, - "our_rune": false, - "unique_id": "1", + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", + "unique_id": "0", "restrictions": [], "restrictions_as_english": "" - } - ] - } - }, - { - "request": { - "id": "example:commando-listrunes#3", - "method": "commando-listrunes", - "params": { - "rune": "m_tyR0qqHUuLEbFJW6AhmBg-9npxVX2yKocQBFi9cvY9MyZpZF4wMjJkMjIzNjIwYTM1OWE0N2ZmNyZtZXRob2Q9bGlzdHBlZXJzJnBuYW1lbGV2ZWwhfHBuYW1lbGV2ZWwvaW8mcGFycjEhfHBhcnIxL2lv" - } - }, - "response": { - "runes": [ + }, + { + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", + "unique_id": "1", + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "id", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "id starts with 0266e4598d1d3c415f57" + } + ], + "english": "id starts with 0266e4598d1d3c415f57" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + } + ], + "restrictions_as_english": "id starts with 0266e4598d1d3c415f57 AND method equal to listpeers" + }, + { + "rune": "QUJEYMLGgiaJvMDv_MhR2hiMKIBTbq-PrL-KxcIlirQ9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "unique_id": "2", + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "method", + "value": "pay", + "condition": "=", + "english": "method equal to pay" + } + ], + "english": "method equal to pay" + }, + { + "alternatives": [ + { + "fieldname": "pnameamountmsat", + "value": "10000", + "condition": "<", + "english": "pnameamountmsat < 10000" + } + ], + "english": "pnameamountmsat < 10000" + } + ], + "restrictions_as_english": "method equal to pay AND pnameamountmsat < 10000" + }, { - "rune": "m_tyR0qqHUuLEbFJW6AhmBg-9npxVX2yKocQBFi9cvY9MyZpZF4wMjJkMjIzNjIwYTM1OWE0N2ZmNyZtZXRob2Q9bGlzdHBlZXJzJnBuYW1lbGV2ZWwhfHBuYW1lbGV2ZWwvaW8mcGFycjEhfHBhcnIxL2lv", - "stored": false, + "rune": "jEx3l0c7NMZPSDYT7xnXXvNA83z5PDNBHRQTIk1BwNw9MyZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTh8cGFycjA9MDI2NmU0NTk4ZDFkM2M0MTVmNTcyYTg0ODg4MzBiNjBmN2U3NDRlZDkyMzVlYjBiMWJhOTMyODNiMzE1YzAzNTE4", "unique_id": "3", "restrictions": [ { "alternatives": [ { "fieldname": "id", - "value": "022d223620a359a47ff7", - "condition": "^", - "english": "id starts with 022d223620a359a47ff7" + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" } ], - "english": "id starts with 022d223620a359a47ff7" + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" }, { "alternatives": [ @@ -3522,39 +4905,90 @@ { "alternatives": [ { - "fieldname": "pnamelevel", - "value": "", - "condition": "!", - "english": "pnamelevel is missing" + "fieldname": "pnum", + "value": "1", + "condition": "=", + "english": "pnum equal to 1" + } + ], + "english": "pnum equal to 1" + }, + { + "alternatives": [ + { + "fieldname": "pnameid", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" }, { - "fieldname": "pnamelevel", - "value": "io", - "condition": "/", - "english": "pnamelevel unequal to io" + "fieldname": "parr0", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "english": "pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 OR parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "restrictions_as_english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 AND method equal to listpeers AND pnum equal to 1 AND pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 OR parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, + { + "rune": "8_CRIJ4arWAz72A4ILOZ46MESSJtQQQ9iQZjU28qulA9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + "unique_id": "4", + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "id", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + }, + { + "alternatives": [ + { + "fieldname": "pnum", + "value": "1", + "condition": "=", + "english": "pnum equal to 1" } ], - "english": "pnamelevel is missing OR pnamelevel unequal to io" + "english": "pnum equal to 1" }, { "alternatives": [ { - "fieldname": "parr1", - "value": "", - "condition": "!", - "english": "parr1 is missing" + "fieldname": "pnameid", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "pnameid starts with 0266e4598d1d3c415f57" }, { - "fieldname": "parr1", - "value": "io", - "condition": "/", - "english": "parr1 unequal to io" + "fieldname": "parr0", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "parr0 starts with 0266e4598d1d3c415f57" } ], - "english": "parr1 is missing OR parr1 unequal to io" + "english": "pnameid starts with 0266e4598d1d3c415f57 OR parr0 starts with 0266e4598d1d3c415f57" } ], - "restrictions_as_english": "id starts with 022d223620a359a47ff7 AND method equal to listpeers AND pnamelevel is missing OR pnamelevel unequal to io AND parr1 is missing OR parr1 unequal to io" + "restrictions_as_english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 AND method equal to listpeers AND pnum equal to 1 AND pnameid starts with 0266e4598d1d3c415f57 OR parr0 starts with 0266e4598d1d3c415f57" } ] } @@ -3758,9 +5192,9 @@ "", "The `readonly` restriction is a short-cut for two restrictions:", "", - "1: `[\"method^list\", \"method^get\", \"method=summary\"]`: You may call list, get or summary.", + "1: `['method^list', 'method^get', 'method=summary']`: You may call list, get or summary.", "", - "2: `[\"method/listdatastore\"]`: But not listdatastore: that contains sensitive stuff!" + "2: `['method/listdatastore']`: But not listdatastore: that contains sensitive stuff!" ], "request": { "id": "example:commando-rune#2", @@ -3771,8 +5205,8 @@ } }, "response": { - "rune": "zm0x_eLgHexaTvZn3Cz7gb_YlvrlYGDo_w4BYlR9SS09MSZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", - "unique_id": "1" + "rune": "oVkzoiQ67VCU1h_aRjPqCeWktGX54ARDsqqQgDL-uMs9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", + "unique_id": "0" } }, { @@ -3798,12 +5232,12 @@ }, "response": { "rune": "oVkzoiQ67VCU1h_aRjPqCeWktGX54ARDsqqQgDL-uMs9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", - "unique_id": "2" + "unique_id": "0" } }, { "description": [ - "Let's create a rune which lets a specific peer (024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605) run listpeers on themselves:" + "This will allow the rune to be used for id starting with 0266e4598d1d3c415f57, and for the method listpeers:" ], "request": { "id": "example:commando-rune#4", @@ -3811,29 +5245,22 @@ "params": { "restrictions": [ [ - "id=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" + "id^0266e4598d1d3c415f57" ], [ "method=listpeers" - ], - [ - "pnum=1" - ], - [ - "pnameid=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605", - "parr0=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" ] ] } }, "response": { - "rune": "FE8GHiGVvxcFqCQcClVRRiNE_XEeLYQzyG2jmqto4jM9MiZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDV8cGFycjA9MDI0YjlhMWZhOGUwMDZmMWUzOTM3ZjY1ZjY2YzQwOGU2ZGE4ZTFjYTcyOGVhNDMyMjJhNzM4MWRmMWNjNDQ5NjA1", - "unique_id": "3" + "rune": "AzR2J3ym3qYCQpnTCuA7EXd90jhK9qzfRVTiMXhOpzk9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", + "unique_id": "1" } }, { "description": [ - "This allows `listpeers` with 1 argument (`pnum=1`), which is either by name (`pnameid`), or position (`parr0`). We could shorten this in several ways: either allowing only positional or named parameters, or by testing the start of the parameters only. Here's an example which only checks the first 9 bytes of the `listpeers` parameter:" + "This will allow the rune to be used for the method pay, and for the parameter amount\\_msat to be less than 10000:" ], "request": { "id": "example:commando-rune#5", @@ -3841,51 +5268,52 @@ "params": { "restrictions": [ [ - "id=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" - ], - [ - "method=listpeers" - ], - [ - "pnum=1" + "method=pay" ], [ - "pnameid^024b9a1fa8e006f1e393", - "parr0^024b9a1fa8e006f1e393" + "pnameamountmsat<10000" ] ] } }, "response": { - "rune": "fTQnfL05coEbiBO8SS0cvQwCcPLxE9c02pZCC6HRVEY9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5Mw==", - "unique_id": "4" + "rune": "4Ab5jUyjTVuYBxGTz3KtnR7kT__KDIjYBCvza5e4EVU9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "unique_id": "2" } }, { "description": [ - "Before we give this to our peer, let's add two more restrictions: that it only be usable for 24 hours from now (`time<`), and that it can only be used twice a minute (`rate=2`). `date +%s` can give us the current time in seconds:" + "Let's create a rune which lets a specific peer run listpeers on themselves:" ], "request": { "id": "example:commando-rune#6", "method": "commando-rune", "params": { - "rune": "fTQnfL05coEbiBO8SS0cvQwCcPLxE9c02pZCC6HRVEY9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5Mw==", "restrictions": [ [ - "time<'$(($(date +%s) + 24*60*60))'", - "rate=2" + "id=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + ], + [ + "method=listpeers" + ], + [ + "pnum=1" + ], + [ + "pnameid=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "parr0=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ] ] } }, "response": { - "rune": "tU-RLjMiDpY2U0o3W1oFowar36RFGpWloPbW9-RuZdo9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5MyZ0aW1lPDE2NTY5MjA1MzgmcmF0ZT0y", - "unique_id": "5" + "rune": "M8_ecN6cRSI0k14vMKNkkSbI6HIzrS49txY_WFe30y09MyZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTh8cGFycjA9MDI2NmU0NTk4ZDFkM2M0MTVmNTcyYTg0ODg4MzBiNjBmN2U3NDRlZDkyMzVlYjBiMWJhOTMyODNiMzE1YzAzNTE4", + "unique_id": "3" } }, { "description": [ - "This will allow the rune to be used for id starting with 022d223620a359a47ff7, and for the method listpeers:" + "This allows `listpeers` with 1 argument (`pnum=1`), which is either by name (`pnameid`), or position (`parr0`). We could shorten this in several ways: either allowing only positional or named parameters, or by testing the start of the parameters only. Here's an example which only checks the first 10 bytes of the `listpeers` parameter:" ], "request": { "id": "example:commando-rune#7", @@ -3893,40 +5321,46 @@ "params": { "restrictions": [ [ - "id^022d223620a359a47ff7" + "id=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ], [ "method=listpeers" + ], + [ + "pnum=1" + ], + [ + "pnameid^0266e4598d1d3c415f57", + "parr0^0266e4598d1d3c415f57" ] ] } }, "response": { - "rune": "YPojv9qgHPa3im0eiqRb-g8aRq76OasyfltGGqdFUOU9MyZpZF4wMjJkMjIzNjIwYTM1OWE0N2ZmNyZtZXRob2Q9bGlzdHBlZXJz", - "unique_id": "6" + "rune": "lCryeRwU6TfdsWTzmtv72TBUBAjgyWPwZ0r4GQm8vUs9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + "unique_id": "4" } }, { "description": [ - "This will allow the rune to be used for the method pay, and for the parameter amount\\_msat to be less than 10000:" + "Before we give this to our peer, let's add two more restrictions: that it only be usable for 24 hours from now (`time<`), and that it can only be used twice a minute (`rate=2`). `date +%s` can give us the current time in seconds:" ], "request": { "id": "example:commando-rune#8", "method": "commando-rune", - "params": { - "restrictions": [ - [ - "method=pay" - ], + "params": [ + "lCryeRwU6TfdsWTzmtv72TBUBAjgyWPwZ0r4GQm8vUs9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + [ [ - "pnameamountmsat<10000" + "time<\"$(($(date +%s) + 24*60*60))\"", + "rate=2" ] ] - } + ] }, "response": { - "rune": "b3hXuEM7Pqzk-C7HUw83xzvHOV7fmuGaWjdo-wHdfg89MCZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", - "unique_id": "7" + "rune": "7nvN7uG2CyTOXe3dYQL38YVdGsnD6d5VNNyeHVl6inc9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZ0aW1lPCIkKCgkKGRhdGUgKyVzKSArIDI0KjYwKjYwKSkifHJhdGU9Mg==", + "unique_id": "4" } } ] @@ -4022,36 +5456,36 @@ "id": "example:commando#1", "method": "commando", "params": { - "peer_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "zm0x_eLgHexaTvZn3Cz7gb_YlvrlYGDo_w4BYlR9SS09MSZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "rune": "_RWaZZRI7wAYU2hqlFBmYgC_dFczcpAdI_9O87YbDpg9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", "method": "getinfo", "params": {} } }, "response": { - "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "alias": "JUNIORBEAM-v23.11-415-gd120eba", - "color": "0266e4", - "num_peers": 1, + "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "alias": "SILENTARTIST-190-g5fd2f9c-modded", + "color": "022d22", + "num_peers": 3, "num_pending_channels": 0, - "num_active_channels": 0, - "num_inactive_channels": 0, + "num_active_channels": 3, + "num_inactive_channels": 1, "address": [], "binding": [ { "type": "ipv4", "address": "127.0.0.1", - "port": 42513 + "port": 41219 } ], - "version": "v23.11-415-gd120eba", - "blockheight": 101, + "version": "v24.05-190-g5fd2f9c-modded", + "blockheight": 130, "network": "regtest", - "fees_collected_msat": 0, - "lightning-dir": "/tmp/ltests-7u_8_rtu/test_commando_rune_1/lightning-1/regtest", + "fees_collected_msat": 106, + "lightning-dir": "/tmp/.lightning/regtest", "our_features": { - "init": "08a0000a8a5961", - "node": "88a0000a8a5961", + "init": "08a0802a8a59a1", + "node": "88a0802a8a59a1", "channel": "", "invoice": "02000002024100" } @@ -4062,31 +5496,24 @@ "id": "example:commando#2", "method": "commando", "params": { - "peer_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "m_tyR0qqHUuLEbFJW6AhmBg-9npxVX2yKocQBFi9cvY9MyZpZF4wMjJkMjIzNjIwYTM1OWE0N2ZmNyZtZXRob2Q9bGlzdHBlZXJzJnBuYW1lbGV2ZWwhfHBuYW1lbGV2ZWwvaW8mcGFycjEhfHBhcnIxL2lv", + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", "method": "listpeers", "params": [ - "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "broken" + "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d" ] } }, "response": { "peers": [ { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "connected": true, - "num_channels": 0, + "num_channels": 2, "netaddr": [ - "127.0.0.1:40119" + "127.0.0.1:34785" ], - "features": "08a0000a8a5961", - "log": [ - { - "type": "SKIPPED", - "num_skipped": 30 - } - ] + "features": "08a0802a8a59a1" } ] } @@ -4096,23 +5523,23 @@ "id": "example:commando#3", "method": "commando", "params": { - "peer_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "b3hXuEM7Pqzk-C7HUw83xzvHOV7fmuGaWjdo-wHdfg89MCZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "rune": "QUJEYMLGgiaJvMDv_MhR2hiMKIBTbq-PrL-KxcIlirQ9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", "method": "pay", "params": { - "bolt11": "lnbcrt1pja05v6sp5n6gnm380ckkrnhzvytz0hvym0vcf0mlrk586nlp72cq7e2hhhffspp5cwhuvl4jhlqep3st2703z89jp7j6wucm8ytlj7rk9ckk0mv7whysdq5v3jhxcmjd9c8g6t0dceqxqyjw5qcqp99qxpqysgq40udwjtktkry0yyq9408q5vtmj534h88j5nn562lamam0rtfqfu3093t2dhhc63qnqe5maa5jc9ad5pm08q2k2udvp6skw9f6ez9c9qptatlau", - "amount_msat": 9999 + "bolt11": "lnbcrt1pn2s38zsp5lv49w44a8tvkwtkxfxwts8rnr864u59srp7sxuua3haahdhlhtrqpp5p928w8rmsg2hjeymedcn54vxhsz372qhcedgf003nmsknhx9594sdqcdserxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqt5h8te9lkn0jpdkhkmlkzs80aw7mt5kdm6jxmvddkavt3vj0vakkmfcs0hsde8y8g8za46sch2lp4jxy56u8ve25sgpgcsya0vp92sgphzw570", + "amount_msat": 9900 } } }, "response": { "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "payment_hash": "c3afc67eb2bfc190c60b579f111cb20fa5a7731b3917f978762e2d67ed9e75c9", - "created_at": 1708642714.8110592, + "payment_hash": "0954771c7b821579649bcb713a5586bc051f2817c65a84bdf19ee169dcc5a16b", + "created_at": 1722303715.008808, "parts": 1, - "amount_msat": 9999, - "amount_sent_msat": 9999, - "payment_preimage": "17632717785b1a833a296ba1831cb968602872e68881c2f324e06e87979296dc", + "amount_msat": 9900, + "amount_sent_msat": 9900, + "payment_preimage": "f3a3b40d63e62785f537aad60f93980914c5639872c7746299a6a1228abbc303", "status": "complete" } } @@ -4311,17 +5738,17 @@ "params": { "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", "host": "localhost", - "port": 44619 + "port": 41219 } }, "response": { "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "features": "08a0000a0a69a2", + "features": "08a0802a8a59a1", "direction": "out", "address": { "type": "ipv4", "address": "127.0.0.1", - "port": 44619 + "port": 41219 } } }, @@ -4330,19 +5757,19 @@ "id": "example:connect#2", "method": "connect", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "host": "127.0.0.1", - "port": 42839 + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "host": "localhost", + "port": 34785 } }, "response": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "features": "08a0000a8a5961", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "features": "08a0802a8a59a1", "direction": "out", "address": { "type": "ipv4", "address": "127.0.0.1", - "port": 42839 + "port": 34785 } } } @@ -4553,6 +5980,29 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:createinvoice#1", + "method": "createinvoice", + "params": { + "invstring": "lnbcrt1u1pn2s38zsp5j9w8t9p2y6an5se63n3vkpp8c20vdsthtn78sv5t2lmt57l742wqpp5wtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7fsdqcdscnxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgq4sjk5smmjpgu6v8k7xc7q5evf370kdvt8s8t6x9he6jh9sgagxyqw8l7ctdldf8vgyz3pdfwr4hn9r6u5xvd48w2f2atu752zwqsulspwpxne4", + "label": "lbl_l13", + "preimage": "0101010101010101010101010101010101010101010101010101010101010101" + } + }, + "response": { + "label": "lbl_l13", + "bolt11": "lnbcrt1u1pn2s38zsp5j9w8t9p2y6an5se63n3vkpp8c20vdsthtn78sv5t2lmt57l742wqpp5wtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7fsdqcdscnxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqcjq9fq26ph2skcsm65xjwnw3crgygpampszjcvqs8aw2zf3jzcxqg4dh58fm8mxul29vh5urpyjkll9m4dq3807xcmq2q9yvgd5qt7qp695qvu", + "payment_hash": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "amount_msat": 100000, + "status": "unpaid", + "description": "l13 description", + "expires_at": 1722908514, + "created_index": 7 + } + } ] }, "lightning-createonion.json": { @@ -4658,46 +6108,6 @@ ], "examples": [ { - "description": [ - "The *hops* parameter is very similar to the result from `getroute` however it needs to be modified slightly.", - "", - "The following is the `getroute` response from which the above *hops* parameter was generated:", - "", - "```json", - "[", - " {", - " \"id\": \"022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59\",", - " \"channel\": \"103x2x1\",", - " \"direction\": 1,", - " \"msatoshi\": 1002,", - " \"amount_msat\": \"1002msat\",", - " \"delay\": 21,", - " }, {", - " \"id\": \"035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d\",", - " \"channel\": \"103x1x1\",", - " \"direction\": 0,", - " \"msatoshi\": 1001,", - " \"amount_msat\": \"1001msat\",", - " \"delay\": 15,", - " }, {", - " \"id\": \"0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199\",", - " \"channel\": \"103x3x1\",", - " \"direction\": 0,", - " \"msatoshi\": 1000,", - " \"amount_msat\": \"1000msat\",", - " \"delay\": 9,", - " }", - "]", - "```", - "", - " - Notice that the payload in the *hops* parameter is the hex-encoded TLV of the parameters in the `getroute` response, with length prepended as a `bigsize_t`.", - " - Except for the pubkey, the values are shifted left by one, i.e., the 1st payload in `createonion` corresponds to the 2nd set of values from `getroute`.", - " - The final payload is a copy of the last payload sans `channel`", - "", - "These rules are directly derived from the onion construction. Please refer BOLT 04 for details and rationale.", - "", - "The `onion` corresponds to 1366 hex-encoded bytes. Each shared secret consists of 32 hex-encoded bytes. Both arguments can be passed on to **sendonion**." - ], "request": { "id": "example:createonion#1", "method": "createonion", @@ -4705,25 +6115,26 @@ "hops": [ { "pubkey": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "payload": "11020203e904017b06080000670000010001" + "payload": "11020203e9040187060800006f0000010000" }, { "pubkey": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "payload": "11020203e804017506080000670000030001" + "payload": "11020203e804018106080000710000010001" }, { "pubkey": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", - "payload": "07020203e8040175" + "payload": "2b020203e80401810822810248b37c63b882804cf746c5b1d7595d26713d89a443ec5808a18ed2327a1903e8" } - ] + ], + "assocdata": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13" } }, "response": { - "onion": "0003f3f80d2142b953319336d2fe4097[...]6af33fcf4fb113bce01f56dd62248a9e5fcbbfba35c", + "onion": "0003ccc1f8876af4810e23bd4cccd8f2f38ee5dc117f527c783fefa4e632f857c98d588d2e3150d16b78f9458777502e4829b490e8a2d560841eb0c2368311bf9bb4e8ded0356badafd915839409ad60866c24dd7580b468c14097575565ca95425b9f44211d9ad0305ddba2391a70892ac8c9fd7c3b67d0fe22faf5a0b6905ee2e22278fe224e89ea72c3fcc598b35afaa255123e61ae7a697703e3bb8aec4d36ea487df6ec27942aadff0527d178c897e75f1ee284995196b5ead963ee9d0df798c8265c00c5c73daac917d298cc17e5d813189321d914c45ef30170c4d617dae12bb3a760d1665705e61bb6c52789e15623cefc68d96b86a6f17159c4a86bb196c9f5e40a0744d08d6da0cfd587717b6d0d074d42ac0893fa6ae1497c84824f1d27670d4e201af5e9e5a3493b603cfc209bb0ee41b573ca647c5b9882272c972cd18f19fd895e8995097d86882a473f4d26118a7ed656c5ea04c2a183b05cc0191d07fab5e78edab4ab8ec58e05e03f32d150449c0c8e3505e46ae58e77c87616144873f72f4571b00ccf8e71bcdf33a7d32345aecb660970fa73c4844ab157aa322f140f5d47b66a0590273728ddb5b8a7f3577cff5a268935b93fe598d6df4413c67c45efa9461abaf3294070a484418aa28c03ac20d08856eb0c74dfca851e8ed110bdcacb2a2fb90954b04e99986fde0678846a709120b5d1eeab9cde8d9f27d77448f4591e00bf30d7580703e6c189c658746cf7a7cc1430ce41f84244612b438c3d895333848e5f55e99b2a9d28860863c11aaa8e3ef01ead7ba1545156c356424c33aeeaa2f1e2c290d1d8dd52cd7b8116159025aba26db6fb81ad7f9cc4554c6f9f13d16defe38918b32d62a0516521934a0009a8d37c9a84689bfd8fc1f0beceb92701dca11175e0099d7541698956ba5d93efff996f538ee47717ae6c5cda98111bc28c822e99cf8957b707de270f447b6e52d30bcf9b8a9befd8663bc54612b543d0e167da67e2f295207b70857d0a7cae8932d905db2f48c873dec20aeafa07e15fa98a088e529424c8b404f03ba0ee78a6639fde5cd37dee42877ff6489ce1de5a8992cae25dd20a6521955c19129fdcc0ea157913373bf47a8018a1dd825a2f8e26194d5008161360ae9b25fc701b2accbe88eb47eee6a50b7ee6d6e169e3905e03ca72e00eb6a51b7ed3d27501715428368662b822e2262749d3e7d3243c4fd3d825b3e72bebdeebf6e035f1ad6634523ab5dc0335611c19c9936d006f2e4cd8818eb4f8b4857c8f35d18a4891e35ff91e3b54b384398574d673fcc8da50b22b8f485a41223c97e3b8ee5b8e5ff9c00a2cbfe7360509d3fee9248b5eaa81bb83da3be45dfa8cbbbf5c52ba8749c9d6261d4239feea1e7ce85ad40ad0c66bbeb1c6898626ae4e710a66f9c39a5ee94581353b46e070cfcff9a14e3f9a6108d55bb92852eb3a50e89b1e45d31b760f2a4e263a6a876ad638b123ffee7a2b0b48e16175e3eb92bfaad4dbe0af8b2bc1c15fec5a9d92d3970c2ffab2ab8fa2c9de0bd276680a4284707cd8543a97bca2394e9514236129f1c50a932f7e9bfb98c2aaa6ffc9a4a30641061246de6edf0f711a8d25d59af42ee4445b22ce2f832f3ece52c18ca62d90c590729e04c47accaec95b556ee2541c84843c54a116f5cc45bc251a8023b695f0bf79c43a97bece8a761d387a466821984fb5ec438af20d14cebb7f0026988c81b5a1b895ef94df61aa509e53083b4306c42132b5ce302fd5a2fbb1cee30a7078ccaa3bdccf781b8c9d6ae016a5f8e5cb13f7ac1f3fd0d74a182c9abea67d346f0dfcfc211aaa7ff47196465398fce3e6e0f3b73a944a7f57a90cc6a8f1bfcd385f8312e23af6f508f4f8a976d750660ac3d63630555a3a2e7fe158a982aaf0278d9f8819e5cb", "shared_secrets": [ - "88ce98c73e4d9293ab1797b0a913fe9bca0213a566252047d01b8af6da871f3e", - "4474d296810e57bd460ef8b83d2e7d288321f8a99ff7686f87384699747bcfc4", - "2a862e4123e01799a732be487fbce297f7dc7cc1467e410f18369cfee476adc2" + "7d856ece68ddf5a89b909f888bc0c37207800a6cdba89db12a7cf7e7c26e5209", + "d1dfacfabba80f07461b890fc660440a105460b687c21bf78f7e6050c2889a98", + "46ff1895fde58206d5b437d39bb149995456ede6b9af75c0135210efbff23333" ] } }, @@ -4731,62 +6142,31 @@ "request": { "id": "example:createonion#2", "method": "createonion", - "params": { - "hops": [ - { - "pubkey": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "payload": "e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - }, - { - "pubkey": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c", - "payload": "e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - }, + "params": [ + [ { - "pubkey": "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007", - "payload": "e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "pubkey": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "payload": "11020203e9040187060800006f0000010000" }, { - "pubkey": "032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991", - "payload": "e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "pubkey": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "payload": "11020203e804018106080000710000010001" }, { - "pubkey": "02edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145", - "payload": "e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "pubkey": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "payload": "2b020203e80401810822810248b37c63b882804cf746c5b1d7595d26713d89a443ec5808a18ed2327a1903e8" } ], - "assocdata": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", - "onion_size": 1301 - } - }, - "response": { - "onion": "00034c3f9e11d92555260db3ee4ba0378a645d01c2556451f4289a1d9b43c7afa9a4f9ecc7010dafb26787bb583c514c3b3990d40c8168b1046659d7bc2512d2f1ee0afd2b87c42de2b70102b649634d211b38049593dbb6ed8ee8f93f0b9ff23cd9654c1341137711ce67751d40867cc90c290a9446be2b8a5a43641d4549505b13e807b4240b5b82ffaf22cb534cff01be46db3985ac83b7db465fbd86d4c8d472f60678946c71eca97dd5db732fe5a6d3765e5a5afad72f035207173e7eaaa0da4f0a4540472c7dd269a030428ae586a61b2a70a428055c3848427d2a2e8bd521aadbaf79d56ea39df63c059772e026d57f0b6844c1ab99e936beadf42aaa78193b05f7380e242258deeaa90db316a943d311ef4f2a08f422422c9da454f9666742ad61c6ae003bce83cf6243adf64a728ea50bdaf129ab2ac70e1988a117609cbefc01c884f86b2494349d1067f5cf17760cdab6ae076631693147e8712412d4f0b17cf288b394fd9e29419156ee629966553c2e7598631cbf7493820388eef1ae9f4d2f9da88872e8afbbedb3b46cd7c461cbe4c5491dc6f4a68bc244584bc79b1bb227c869fae16dab4b16412523c984d3ed2b872f63b95a62f66563d2b03c3d1b5fff0290411b293569ce8435b96b447be776b49395a8d94f48cb2f7699a38e8de58d6fff04075d226dcac07668512b6d2c20d4c49d03ad300a52769e4ebbacf97378633126958df1817effc12fd679723123df244fd9b5421f8a2aedb9a8b6fb4049e3a7cae3985059081239bea38351f0c90ed5a0ff45cc492e6ab353e4c13d22ff48912d6ecfda711edfb88dc0767ecfc5dddf8fb0e112a538aeee55c0f73b3b8afc4f40ef3588eabde5b95344a4525adf67841dd67b1db10da180fb346e0bd2958f095d011827063c42361964f8ac2c356d2ec1868a9498dcd6b5915a4df4601c58fcbeb688e14de61300f13183c154b3320cc8e80042a46f22d796f56ff1fdd7e28440c05f14b960c1d0a7c627b09295112bcb635b0e2447a9374fafc4a23ceaf9de4d10b29b2f6cabd7f0c7706cf0404452681d7372d559b644627b2695960deb3b4ae57028e0164b29d5ef9e701d3122b6a5715c502e1dca5252e8c215ed754b01a193041ad9751ed2fff1b55991e256edd6099a38004a367ad097c7caf953da302201263715517f6d32cff57969be994df42fd6cadb649e3c738be798f779aaf4c07cada6bf1e4115b74e2670baf4b1592c70b10a6c043b6606b428b3f79545dc8e9783c876e5402909858f9c604963c37fbc477137c8908e6cfa11ece18c8784a6f25428a5ee1e91d0095fe310d6a91139a7c5c6624bbfcaa15ee847a25b06f57332917f68526a6317f575792e9bcba8576a96bc5859b1f2a00fd8ab08a5ac4ab71833b0b711d1f120cbdb374bcedcdcbeba3806644f5082ec737a945221f5d99562fcbb02a43beeafb16ceecd4e35f06a04c9ff9f4f33725ab62cf22c36650280e4cfb9e150a2c4ebee7785108522e8ecb4682d2d751168e7597299346c3a5e885e36eda66b9a1112997111135767972d771b02c1a36c1d1fb1ce539ecfb98e9e1d8f8fdbf89aec28ad34ff5c00c1a4a8c59848dc8b64c0e65f6f10122e60b4adc1cfc602f49d6cfbdd54be6b0951d3f9cafe8cdd0428f9ce6994844e92d8b72d44edda623bad428b398f88643c3904bda16dd15e886ca4ef6ea7f1450744ac38ffce902569d2e9026bcedd6d0ee54aceabda22bf2de72cba89e6c274064619e32a1192cf2d78b56cf497f7785a6d599de9f8383d1f66f47fc385dc569ee1f08ddbbc7f1aeb0a0126fc4020d948dda10255f11e776db7a037059a40fde38a2ee0c0ce49c7f3df175881bf12371fa72fec3fba657107892a97efe41dcc18aeecd99f3e46c33cf42c2a0ba8b75cf000", - "shared_secrets": [ - "ccf2512684e2508cb4a842393757e6040b7d25e29d3a2031f29d00a000af6128", - "d4cec39fe6287d41165bf5c608b0c720a411208a83c64c805a012c86662a2e5a", - "91bc712ebd4a900e05830394ca8b1f1168777ecdd6996029d96ec8838b9903b9", - "93c373dcb14dc36ababa3e0c5c55869a667ca175e09913a98c3be67e6af97e16", - "b2642a5770a6b61ade071fdf69d3ea365cf48434fc2a2c399512778821a33e5c" + "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "4141414141414141414141414141414141414141414141414141414141414141" ] - } - }, - { - "request": { - "id": "example:createonion#3", - "method": "createonion", - "params": { - "hops": [ - { - "pubkey": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "payload": "0cfdb000084869207468657265" - } - ], - "assocdata": "36bf44cc8d80498b95eb05e36ae5811206d3a1d8b5c8d59bbcad035d386a4de8" - } }, "response": { - "onion": "0002cdce4bfaa9faa2c060afafe001b80bde07fc670e882c063a80b4738d5f78c9351825c6461cdfcd4fe4144d3b51f63da6351b28dd49c7bfdb0b4f7d8bda4ad0d99699eda39e551084c0a095746c358d1dc6d2eec8082f2aa2f69ae8f61b1f1437ae0ed673078fec6c0510a34058167ad1a34e819a3813d4cf27b2c4917a8c6ca3d70c3381a2a41b4c1b4540adf0e922e25f57d1cfc3064f29cfec4c17244160121975cab59b44c83b4a4905bf7ebfbd308de376334bf86d8aa92c674f7bcfec85680d73e9fee72642c98c603128e358c86e0bc88a60aaebc2637441a57261c61c6be145f00f2fc56164a6495f4b52d3172cb0ef52e91fa0d32a9ae2502d17433bda58d93fbc24a70ec6b5e740952a61404c7370eafe52599c7ee52e77b1cda87c46da98d2ff0d02fe09db5adcb2d2e9bcd083ef58392907b8a21681fa4ea1e4806b4676656457fea000fa504f9b4d159fe8b241266ac91dcc0351053c6dcc1493a6b02bed652cc8b92a8470c98924ebfde6ddc5cf7fd75f6e83a7350642053b70d4834179c30eb56d8c86656cda784daf3b6cd125779bec51099301e3f79f78d85d0454aef8bf5f9058491881b73e99b662b64080cd3eb16fd7f9d9640c18738736cfc15f391232b7df92f46ceb5abf08732ff833e9409ee541d7c926f7a0fe3e233d3eee4a63b65ab23b7c835b7cdd809ddfac8abb1df471fa66a54092815aa41e6fc1a026b86c5675d39c4e8c5c4b4acd48534165239f5634b9e828a7f9df94efcd2a39045efdee4d2f006a63ae828e6e90e3610c522085da6e0198141d6e501d83aba32057f4e59f9b7dfb0bf949c5ef91917cb54561d45a9e7ead049c57deb62d14ba6e18f5d7b0fb9f15e97bf5bd9f909f99c86c787357946654b87c489d34245d07fbb72119166e338b608a4178b452695235dd96bf7fd338e29a9f054ec1a63a442e12602d2329834297f6a197d8a377d608f402f0bcc936f45f33c8d2f9d40e5aef41816dd883add81ca20f1e0631457fe00aa2bd75c9165ffcd96c100c1db83a53aeee23d59f2a542ee3ba39ba62298ddfbd9ecfafd6b5d2121eb003ee23a2ebb8c6b6b687f42492c962510c5acf5231ff96635eba37354559ba39b042d9b6883cac662f418d7c62f9908b2a67964af5e5471804f7684e0d582b8bfec99816bb3442cca1d1fe4efd75d573ebf09fa9cad811063864fb14be4a7768ec2ddb118a77969e986c6584c4b20f8622941ca73d73562857d36e17a46a68d6e10147aaefff1ffb9809f0652a5f760148ed33550661b63c8176d5679e701c221d8a49d4062eb04010ea74cc1132fbeb8934c6e582ba2a16162b7e9171f95bce4ec3e339e70c781f95aaca406cd718b74397658fdefdd093486664be7ed13efa437012f1f57f9f1f4fb4eef7501ccf0e0ac4edc01fde138038c4dd65cb5c3291ad02a6728d6761b1afa35d49bd6ef117012bdd9bd6ee8a175620feb2249aa18d6175351b4bfc2b2b4fd57ff52f5969b109aa9b6cb2cde8f350917c0da2da1bc3d52eb0c7e6080b8f69c5783f2ed26feceb05ba4e7ed66676041d03d0acd3dd6343a85ac0b9c36f9640ddd0db884822f98dc42ea7911a6938dc14ba19d3d25a2b2f82794a2b5dd751dc856d7a9ccdb2d351a0b84e7030fa925ac949a37594f3aa2ba28ae5155b0aaac9c6820b8888d0b8a9db148513b9e3dbde68333ac30a0720289b6a0145d88629d49e76a6d3538330c5aececc9d54127b0a5a0e92d5a5a73beb71132c208b589cab61d53ed357c907929198c559426ae729b374a803dd3321a45ccca39efd39eddaba6e79a2f8911bdf74e18733dc7efc51132b5608d97fd2d0f22fa8961de04cdf6d0dbfbab21e362e7abaef3976f993088aa97ed3f1f4bcf3fffb012f583558bd2f15face9cba20b3e6754b70", + "onion": "0002eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f2836866191c78fd992bdb6323814526c8ea3ab57e22cd7739942f3a3f117d1191ed07d90599edc15c1d83a85b3f00350f4ec0f4b78894d38499e802a15843122723857ebddb629cf308d485de6bdbef80209059e3409ee47154e1b7e8f20d7ce02826c734601240c31ea9fa2c0caea8677b0db9e98835e762cb32e42da32f60bd000fe44350e8e87b69d83363c41d8d22f1639e8701901d74b64bf51f1c21cdc785b54dc5a6ba39fc75f956b60a372f6421a84f6001b294487baf1bb049b7bd901c5854c0999a82095874b02da90021a685f7c77f4b724a3d27489c091807b32bcdfb2c68f69b50c0b43c78288c333dbb007874f36fcf224fbc2ed89690f64a62b5ecfe6275750eb1a5575f689ca6d59c9a570689372db120cf6a29177caaace5ac671a3607d37a3048af18d1d736ac8a4dde8efc4884f8eab23cdc8cb15170471ee7b416b5cf089dee8ab8ac3eea6700a6040839c1e86f6d2b5acf9c7bac856cae96e9d1b7142f91ac4818cf0007a23100ae621470ac2552116f30948f21602237d12d29f58ca73f10f05b38f7b4b728fcfd8aafc1a82502aae3081c4bc8a77771aef16247bcf26d8569140441c405a3c21a649a8439797f45e7c37a2025318f4c88e3eba454fd4cc37e9978b59fa7b1e41af450523713fdad8070c7abdeea299474c99b2bde737e8c8ad79cb9fdd70a935ad29504d185bf100a339d203cd929030454a6450132255fea11ba0c6a520fa7cc3b8638f8032a61c492f7f9d1ec591a851f25df9238945ae467126b64019f21a71a2d3ef46cdd7b61773ad632dc77e0bda7d06b493efe940d9b975ebb85c423a83d24966f5e2ae2ec9c3b2257cc21a4989dd016d688865ba5245667c302e408dc56ffdf4282ad834f0c5af1ce49b3997fe397faf6874cac24ae346b4e72e468506c0e724efe6f805e0fd115de39b6fa29d05e11bbe2ec27548517f93ebd7b977b13237ab9c40ff5766f7263ea1f2eabba460600cd7da082fcf8d0a7bd37054abfd6040f886dde48cf600612b5b73a44026e79d46336de73f2ea5fbfc9603ccd89f6954e5093b6bfe556e6f67deb0878128049186f7ac6ef461a56c2bb4f24a9679fb386e06052c3da2f367f14bc41ec191f5b0b7b3ccad1f2cc58c863c49055c889b8b04b6b6cbaec50d0d103d4ea0da75952a730b07cea0da43914b5ab3f30b5104d9a75eb003da0b5b97bf9eb9081194cc5b50362041a972841bdafde31909929237ed5b94c88dd05126cdb3fd25add0c777c2ad021e1a0e7140d6c4c2005cb353a7a6a747ee75467c052f55faa485cbcf3758eafba7a8ef00d1481cc0f05af539116f443cb02a7b30a3de899dc66cb0781ccccf5c8d93b34be0665d11cbca55cd7a424b958124edf1289c7f4fc19c1be8fc7a861ce47c43a641bafdb195e1c74a1fbf69dbd518013f3dbf2860818b5a3e6f1dd36a5546bfd416e9714dec29818ecd1aeeb29c319b407c497621248d232680417486698a3e1262f03a8bc6441d1de40ae351dae4527a8efe25fc68a3f1571aa556edd6bfb9db7caba4d2c02bab003c43055f5d3ebf961735c3b1f4cd3e0a96038697a95cceac08c0aff084450cf571f81c95d468826aa4292997ccfeba32db77c4c22a9d3caa0a37a8a961ac2f2c8a6965687143bc93c620503839fd7bd7fc2e6d9c966586b713f824b8e9d3de55cb1b81f9204b92dfaa066920c0910e62e59650e904e05b94bde3e467d45719d6a3b85a71c8ff1dcca5a5f497928db5f64c55aad93513e87f4f0c93a6fa5a9afe929cf8223ea509f584913844044aa23a4afa4bc0ad975f4904aab5d77b5e51511460a3b7a982d3b0adcf3fd2ffc2494d16add2825a929fc7c4f0c97159e6fa6aba8569433", "shared_secrets": [ - "3f53c03f98eb83db88ff97c2c4004051ce23265ed2414a7aebf7a3e7078839ab" + "2d7581974cde41b42da1d0a3147704aae5a71e8987fa30dc920c8cdf784b661d", + "bb599b824ce9e123c8cb27cd50a996e5035b8ae903356dcbff224496aab3a891", + "7bc4f97c2d18d5372ef572334e31590ec36b33220d7a71fa4e0fe841174eaccb" ] } } @@ -4981,7 +6361,7 @@ "params": {} }, "response": { - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", "unique_id": "0", "warning_unrestricted_rune": "WARNING: This rune has no restrictions! Anyone who has access to this rune could drain funds from your node. Be careful when giving this to apps that you don't trust. Consider using the restrictions parameter to only allow access to specific rpc methods." } @@ -4992,21 +6372,21 @@ "", "The `readonly` restriction is a short-cut for two restrictions:", "", - "1: `[\"method^list\", \"method^get\", \"method=summary\"]`: You may call list, get or summary.", + "1: `['method^list', 'method^get', 'method=summary']`: You may call list, get or summary.", "", - "2: `[\"method/listdatastore\"]`: But not listdatastore: that contains sensitive stuff!" + "2: `['method/listdatastore']`: But not listdatastore: that contains sensitive stuff!" ], "request": { "id": "example:createrune#2", "method": "createrune", "params": { - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", "restrictions": "readonly" } }, "response": { - "rune": "zm0x_eLgHexaTvZn3Cz7gb_YlvrlYGDo_w4BYlR9SS09MSZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", - "unique_id": "1" + "rune": "_RWaZZRI7wAYU2hqlFBmYgC_dFczcpAdI_9O87YbDpg9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", + "unique_id": "0" } }, { @@ -5017,7 +6397,7 @@ "id": "example:createrune#3", "method": "createrune", "params": { - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", "restrictions": [ [ "method^list", @@ -5031,13 +6411,13 @@ } }, "response": { - "rune": "oVkzoiQ67VCU1h_aRjPqCeWktGX54ARDsqqQgDL-uMs9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", - "unique_id": "2" + "rune": "_RWaZZRI7wAYU2hqlFBmYgC_dFczcpAdI_9O87YbDpg9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", + "unique_id": "0" } }, { "description": [ - "Let's create a rune which lets a specific peer (024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605) run listpeers on themselves:" + "This will allow the rune to be used for id starting with 0266e4598d1d3c415f57, and for the method listpeers:" ], "request": { "id": "example:createrune#4", @@ -5045,29 +6425,22 @@ "params": { "restrictions": [ [ - "id=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" + "id^0266e4598d1d3c415f57" ], [ "method=listpeers" - ], - [ - "pnum=1" - ], - [ - "pnameid=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605", - "parr0=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" ] ] } }, "response": { - "rune": "FE8GHiGVvxcFqCQcClVRRiNE_XEeLYQzyG2jmqto4jM9MiZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDV8cGFycjA9MDI0YjlhMWZhOGUwMDZmMWUzOTM3ZjY1ZjY2YzQwOGU2ZGE4ZTFjYTcyOGVhNDMyMjJhNzM4MWRmMWNjNDQ5NjA1", - "unique_id": "3" + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", + "unique_id": "1" } }, { "description": [ - "This allows `listpeers` with 1 argument (`pnum=1`), which is either by name (`pnameid`), or position (`parr0`). We could shorten this in several ways: either allowing only positional or named parameters, or by testing the start of the parameters only. Here's an example which only checks the first 9 bytes of the `listpeers` parameter:" + "This will allow the rune to be used for the method pay, and for the parameter amount\\_msat to be less than 10000:" ], "request": { "id": "example:createrune#5", @@ -5075,51 +6448,52 @@ "params": { "restrictions": [ [ - "id=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" - ], - [ - "method=listpeers" - ], - [ - "pnum=1" + "method=pay" ], [ - "pnameid^024b9a1fa8e006f1e393", - "parr0^024b9a1fa8e006f1e393" + "pnameamountmsat<10000" ] ] } }, "response": { - "rune": "fTQnfL05coEbiBO8SS0cvQwCcPLxE9c02pZCC6HRVEY9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5Mw==", - "unique_id": "4" + "rune": "QUJEYMLGgiaJvMDv_MhR2hiMKIBTbq-PrL-KxcIlirQ9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "unique_id": "2" } }, { "description": [ - "Before we give this to our peer, let's add two more restrictions: that it only be usable for 24 hours from now (`time<`), and that it can only be used twice a minute (`rate=2`). `date +%s` can give us the current time in seconds:" + "Let's create a rune which lets a specific peer run listpeers on themselves:" ], "request": { "id": "example:createrune#6", "method": "createrune", "params": { - "rune": "fTQnfL05coEbiBO8SS0cvQwCcPLxE9c02pZCC6HRVEY9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5Mw==", "restrictions": [ [ - "time<'$(($(date +%s) + 24*60*60))'", - "rate=2" + "id=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + ], + [ + "method=listpeers" + ], + [ + "pnum=1" + ], + [ + "pnameid=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "parr0=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ] ] } }, "response": { - "rune": "tU-RLjMiDpY2U0o3W1oFowar36RFGpWloPbW9-RuZdo9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5MyZ0aW1lPDE2NTY5MjA1MzgmcmF0ZT0y", - "unique_id": "5" + "rune": "jEx3l0c7NMZPSDYT7xnXXvNA83z5PDNBHRQTIk1BwNw9MyZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTh8cGFycjA9MDI2NmU0NTk4ZDFkM2M0MTVmNTcyYTg0ODg4MzBiNjBmN2U3NDRlZDkyMzVlYjBiMWJhOTMyODNiMzE1YzAzNTE4", + "unique_id": "3" } }, { "description": [ - "This will allow the rune to be used for id starting with 022d223620a359a47ff7, and for the method listpeers:" + "This allows `listpeers` with 1 argument (`pnum=1`), which is either by name (`pnameid`), or position (`parr0`). We could shorten this in several ways: either allowing only positional or named parameters, or by testing the start of the parameters only. Here's an example which only checks the first 10 bytes of the `listpeers` parameter:" ], "request": { "id": "example:createrune#7", @@ -5127,40 +6501,46 @@ "params": { "restrictions": [ [ - "id^022d223620a359a47ff7" + "id=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ], [ "method=listpeers" + ], + [ + "pnum=1" + ], + [ + "pnameid^0266e4598d1d3c415f57", + "parr0^0266e4598d1d3c415f57" ] ] } }, "response": { - "rune": "YPojv9qgHPa3im0eiqRb-g8aRq76OasyfltGGqdFUOU9MyZpZF4wMjJkMjIzNjIwYTM1OWE0N2ZmNyZtZXRob2Q9bGlzdHBlZXJz", - "unique_id": "6" + "rune": "8_CRIJ4arWAz72A4ILOZ46MESSJtQQQ9iQZjU28qulA9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + "unique_id": "4" } }, { "description": [ - "This will allow the rune to be used for the method pay, and for the parameter amount\\_msat to be less than 10000:" + "Before we give this to our peer, let's add two more restrictions: that it only be usable for 24 hours from now (`time<`), and that it can only be used twice a minute (`rate=2`). `date +%s` can give us the current time in seconds:" ], "request": { "id": "example:createrune#8", "method": "createrune", - "params": { - "restrictions": [ - [ - "method=pay" - ], + "params": [ + "8_CRIJ4arWAz72A4ILOZ46MESSJtQQQ9iQZjU28qulA9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + [ [ - "pnameamountmsat<10000" + "time<\"$(($(date +%s) + 24*60*60))\"", + "rate=2" ] ] - } + ] }, "response": { - "rune": "b3hXuEM7Pqzk-C7HUw83xzvHOV7fmuGaWjdo-wHdfg89MCZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", - "unique_id": "7" + "rune": "GJb2PC-4jYslzIVz6-425bOtpkz_A_zaEhekPlrXdj09NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZ0aW1lPCIkKCgkKGRhdGUgKyVzKSArIDI0KjYwKjYwKSkifHJhdGU9Mg==", + "unique_id": "4" } } ] @@ -5297,70 +6677,81 @@ "request": { "id": "example:datastore#1", "method": "datastore", + "params": { + "key": "somekey", + "hex": "61", + "mode": "create-or-append" + } + }, + "response": { + "key": [ + "somekey" + ], + "generation": 0, + "hex": "61", + "string": "a" + } + }, + { + "request": { + "id": "example:datastore#2", + "method": "datastore", "params": { "key": [ - "test_libplugin", + "test", "name" ], - "string": "foobar", - "mode": "must-replace" + "string": "saving data to the store", + "mode": "must-create" } }, "response": { "key": [ - "test_libplugin", + "test", "name" ], - "generation": 1, - "hex": "666f6f626172", - "string": "foobar" + "generation": 0, + "hex": "736176696e67206461746120746f207468652073746f7265", + "string": "saving data to the store" } }, { "request": { - "id": "example:datastore#2", + "id": "example:datastore#3", "method": "datastore", "params": { - "key": "somekey", - "hex": "61", - "mode": "create-or-append" + "key": "otherkey", + "string": "foo", + "mode": "must-create" } }, "response": { "key": [ - "somekey" + "otherkey" ], - "generation": 3, - "hex": "736f6d6564617461", - "string": "somedata" + "generation": 0, + "hex": "666f6f", + "string": "foo" } }, { "request": { - "id": "example:datastore#3", + "id": "example:datastore#4", "method": "datastore", "params": { - "key": [ - "a", - "d", - "e", - "f", - "g" - ], - "string": "somedatatostoreinthedatastore" + "key": "otherkey", + "string": "bar", + "mode": "must-append", + "generation": 0 } }, "response": { "key": [ - "a", - "d", - "e", - "f", - "g" + "otherkey" ], - "generation": 0, - "hex": "736f6d6564617461746f73746f7265696e7468656461746173746f7265", - "string": "somedatatostoreinthedatastore" + "generation": 1, + "hex": "666f6f626172", + "string": "foobar" } } ] @@ -5450,7 +6841,7 @@ "response": { "datastoreusage": { "key": "[]", - "total_bytes": 0 + "total_bytes": 55 } } }, @@ -5459,13 +6850,16 @@ "id": "example:datastoreusage#2", "method": "datastoreusage", "params": { - "key": "a" + "key": [ + "test", + "name" + ] } }, "response": { "datastoreusage": { - "key": "[a]", - "total_bytes": 32 + "key": "[test,name]", + "total_bytes": 33 } } }, @@ -5474,16 +6868,13 @@ "id": "example:datastoreusage#3", "method": "datastoreusage", "params": { - "key": [ - "a", - "thisissomelongkeythattriestostore46bytesofdata" - ] + "key": "otherkey" } }, "response": { "datastoreusage": { - "key": "[a,thisissomelongkeythattriestostore46bytesofdata]", - "total_bytes": 77 + "key": "[otherkey]", + "total_bytes": 14 } } } @@ -5562,9 +6953,7 @@ }, "then": { "required": [ - "offer_id", - "offer_node_id", - "offer_description" + "offer_id" ], "additionalProperties": false, "properties": { @@ -5728,10 +7117,28 @@ } } }, + "warning_empty_blinded_path": { + "added": "v24.08", + "type": "string", + "description": [ + "The blinded path has 0 hops." + ] + }, "offer_node_id": { "type": "pubkey", + "deprecated": [ + "v24.08", + "v24.11" + ], "description": [ - "Public key of the offering node." + "Obsolete name for offer_issuer_id." + ] + }, + "offer_issuer_id": { + "type": "pubkey", + "added": "v24.08", + "description": [ + "The pubkey associated with the offer (can be a node id)." ] }, "offer_recurrence": { @@ -5899,10 +7306,21 @@ "recurrence": {}, "warning_missing_offer_node_id": { "type": "string", + "deprecated": [ + "v24.08", + "v24.11" + ], "description": [ "`offer_node_id` is not present." ] }, + "warning_missing_offer_issuer_id": { + "type": "string", + "added": "v24.08", + "description": [ + "`offer_issuer_id` is not present and there are no offer_paths" + ] + }, "warning_invalid_offer_description": { "type": "string", "description": [ @@ -5949,8 +7367,6 @@ }, "then": { "required": [ - "offer_node_id", - "offer_description", "invreq_metadata", "invreq_payer_id", "signature" @@ -6121,10 +7537,21 @@ }, "offer_node_id": { "type": "pubkey", + "deprecated": [ + "v24.08", + "v24.11" + ], "description": [ "Public key of the offering node." ] }, + "offer_issuer_id": { + "type": "pubkey", + "added": "v24.08", + "description": [ + "Public key of the offering node (can be a node id)." + ] + }, "offer_recurrence": { "type": "object", "description": [ @@ -6253,6 +7680,82 @@ "A note attached by the payer." ] }, + "invreq_paths": { + "type": "array", + "added": "v24.08", + "description": [ + "Paths to the destination." + ], + "items": { + "type": "object", + "required": [ + "blinding", + "path" + ], + "additionalProperties": false, + "properties": { + "first_node_id": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "The (presumably well-known) public key of the start of the path." + ] + }, + "first_scid": { + "added": "v24.08", + "type": "short_channel_id", + "description": [ + "the short channel id of the start of the path (alternative to first_node_id)" + ] + }, + "first_scid_dir": { + "added": "v24.08", + "type": "u32", + "description": [ + "which end of the first_scid is the start of the path" + ] + }, + "blinding": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "Blinding factor for this path." + ] + }, + "path": { + "type": "array", + "added": "v24.08", + "description": [ + "An individual path." + ], + "items": { + "type": "object", + "required": [ + "blinded_node_id", + "encrypted_recipient_data" + ], + "additionalProperties": false, + "properties": { + "blinded_node_id": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "Node_id of the hop." + ] + }, + "encrypted_recipient_data": { + "added": "v24.08", + "type": "hex", + "description": [ + "Encrypted TLV entry for this hop." + ] + } + } + } + } + } + } + }, "invreq_recurrence_counter": { "type": "u32", "description": [ @@ -6347,6 +7850,7 @@ "offer_quantity_max": {}, "offer_paths": {}, "offer_node_id": {}, + "offer_issuer_id": {}, "offer_recurrence": {}, "invreq_metadata": {}, "invreq_payer_id": {}, @@ -6355,6 +7859,7 @@ "invreq_features": {}, "invreq_quantity": {}, "invreq_payer_note": {}, + "invreq_paths": {}, "invreq_recurrence_counter": {}, "invreq_recurrence_start": {}, "warning_invalid_offer_description": { @@ -6433,8 +7938,6 @@ }, "then": { "required": [ - "offer_node_id", - "offer_description", "invreq_metadata", "invreq_payer_id", "invoice_paths", @@ -6609,10 +8112,21 @@ }, "offer_node_id": { "type": "pubkey", + "deprecated": [ + "v24.08", + "v24.11" + ], "description": [ "Public key of the offering node." ] }, + "offer_issuer_id": { + "type": "pubkey", + "added": "v24.08", + "description": [ + "Public key of the offering node (can be a node id)." + ] + }, "offer_recurrence": { "type": "object", "description": [ @@ -6741,6 +8255,82 @@ "A note attached by the payer." ] }, + "invreq_paths": { + "type": "array", + "added": "v24.08", + "description": [ + "Paths to the destination." + ], + "items": { + "type": "object", + "required": [ + "blinding", + "path" + ], + "additionalProperties": false, + "properties": { + "first_node_id": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "The (presumably well-known) public key of the start of the path." + ] + }, + "first_scid": { + "added": "v24.08", + "type": "short_channel_id", + "description": [ + "the short channel id of the start of the path (alternative to first_node_id)" + ] + }, + "first_scid_dir": { + "added": "v24.08", + "type": "u32", + "description": [ + "which end of the first_scid is the start of the path" + ] + }, + "blinding": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "Blinding factor for this path." + ] + }, + "path": { + "type": "array", + "added": "v24.08", + "description": [ + "An individual path." + ], + "items": { + "type": "object", + "required": [ + "blinded_node_id", + "encrypted_recipient_data" + ], + "additionalProperties": false, + "properties": { + "blinded_node_id": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "Node_id of the hop." + ] + }, + "encrypted_recipient_data": { + "added": "v24.08", + "type": "hex", + "description": [ + "Encrypted TLV entry for this hop." + ] + } + } + } + } + } + } + }, "invreq_recurrence_counter": { "type": "u32", "description": [ @@ -6929,7 +8519,7 @@ "invoice_node_id": { "type": "pubkey", "description": [ - "The id to pay (usually the same as offer_node_id)." + "The id to pay (usually the same as offer_issuer_id)." ] }, "invoice_recurrence_basetime": { @@ -6941,7 +8531,7 @@ "signature": { "type": "bip340sig", "description": [ - "BIP-340 signature of the `offer_node_id` on this invoice." + "BIP-340 signature of the `offer_issuer_id` on this invoice." ] }, "unknown_invoice_tlvs": { @@ -7020,6 +8610,7 @@ "offer_quantity_max": {}, "offer_paths": {}, "offer_node_id": {}, + "offer_issuer_id": {}, "offer_recurrence": {}, "invreq_metadata": {}, "invreq_payer_id": {}, @@ -7028,6 +8619,7 @@ "invreq_features": {}, "invreq_quantity": {}, "invreq_payer_note": {}, + "invreq_paths": {}, "invreq_node_id": {}, "invreq_recurrence_counter": {}, "invreq_recurrence_start": {}, @@ -7576,29 +9168,14 @@ "id": "example:decode#1", "method": "decode", "params": [ - "zm0x_eLgHexaTvZn3Cz7gb_YlvrlYGDo_w4BYlR9SS09MSZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl" + "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==" ] }, "response": { "type": "rune", - "unique_id": "1", - "string": "ce6d31fde2e01dec5a4ef667dc2cfb81bfd896fae56060e8ff0e0162547d492d:=1&method^list|method^get|method=summary&method/listdatastore", - "restrictions": [ - { - "alternatives": [ - "method^list", - "method^get", - "method=summary" - ], - "summary": "method (of command) starts with 'list' OR method (of command) starts with 'get' OR method (of command) equal to 'summary'" - }, - { - "alternatives": [ - "method/listdatastore" - ], - "summary": "method (of command) unequal to 'listdatastore'" - } - ], + "unique_id": "0", + "string": "cc531dd5f8e1ac063151e140e784e396866a3adf09ac0fe2fe76302205e46a0e:=0", + "restrictions": [], "valid": true } }, @@ -7607,33 +9184,33 @@ "id": "example:decode#2", "method": "decode", "params": [ - "lnbcrt1m1pja0f2hsp5xyssdvdsu24dmmesrt6x84wfrm4mscsnzq7hl2suzeu90wy6g53qpp5zyyu3anwfsfl64pewe0tg7j28map2wwnhvaam5nt70rlwxa0cegqdqjv3jhxcmjd9c8g6t0dcxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqvuqqqqgqqqqqqqlgqqqq86qqqc9qxpqysgq7u4f99u4kepagme27t5c3gdl7czlnjaw7kxryxgm87w2j02j3g94r2vrukhpgedhcdkcdec27m7jrl2lvcr6uh3rdv9lgpz0vc0zcfcqnugjdw" + "lnbcrt2u1pn2s3xxsp5cpcdj2cy5wpd2nphp2evrp9kqymxf9434zftkmdd6dlgmy8cu78qpp58yq5qf3h0694xwymzjs5e8eejce83vjmxv6cpwqv8cs9e05dxe4qdqcdserygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq9wlpxf8ur0q798646w94tduf6wfkaw7m0ecmxepgatd4utvsyvcy0pku9t8m39rlsjzhe8x53mup5jkn0f84clfj3ctc6qj09t35wxspycpup2" ] }, "response": { "type": "bolt11 invoice", "currency": "bcrt", - "created_at": 1708631383, + "created_at": 1722303686, "expiry": 604800, - "payee": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "amount_msat": 100000000, - "description": "description", + "payee": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "amount_msat": 200000, + "description": "l22 description", "min_final_cltv_expiry": 5, - "payment_secret": "312106b1b0e2aaddef301af463d5c91eebb86213103d7faa1c167857b89a4522", + "payment_secret": "c070d92b04a382d54c370ab2c184b601366496b1a892bb6dadd37e8d90f8e78e", "features": "02024100", "routes": [ [ { - "pubkey": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "short_channel_id": "103x1x0", - "fee_base_msat": 1000, - "fee_proportional_millionths": 1000, + "pubkey": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "111x1x0", + "fee_base_msat": 1, + "fee_proportional_millionths": 10, "cltv_expiry_delta": 6 } ] ], - "payment_hash": "1109c8f66e4c13fd5439765eb47a4a3efa1539d3bb3bddd26bf3c7f71bafc650", - "signature": "3045022100f72a929795b643d46f2af2e988a1bff605f9cbaef58c32191b3f9ca93d528a0b022051a983e5ae1465b7c36d86e70af6fd21fd5f6607ae5e236b0bf4044f661e2c27", + "payment_hash": "39014026377e8b53389b14a14c9f39963278b25b333580b80c3e205cbe8d366a", + "signature": "304402202bbe1324fc1bc1e29f55d38b55b789d3936ebbdb7e71b36428eadb5e2d90233002204786dc2acfb8947f84857c9cd48ef81a4ad37a4f5c7d328e178d024f2ae3471a", "valid": true } } @@ -7907,23 +9484,32 @@ "id": "example:decodepay#1", "method": "decodepay", "params": { - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk" + "bolt11": "lnbcrt100n1pn2s3xxsp5s4wvy67lduz0tpxzmw0x0m8z5krfn6ppeu3a9t559tcdxquqwjfqpp5r0zx30ded4lpxp7vrdxqenmwr9rqftn93dcymvmuaxpu8y5zxunqdqcdscnzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqyk0lnqhsl07405jsqzyyaheu3dhxdv6s498ex97yvacs04gf6carplepnh5drlse8spy8nluz4uwj78h47ez6hak9md2s8mtg6yy5tcqt8yfsj" } }, "response": { "currency": "bcrt", - "created_at": 1706152930, + "created_at": 1722303686, "expiry": 604800, - "payee": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 11000000, - "description": [ - "XEoCR94SIz6UIRUEkxum." - ], + "payee": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "amount_msat": 10000, + "description": "l11 description", "min_final_cltv_expiry": 5, - "payment_secret": "82644944d3f70d42aad1d5f7b5d7a629e7afa30b529cc952a4c59fc0e3790ea2", + "payment_secret": "855cc26bdf6f04f584c2db9e67ece2a58699e821cf23d2ae942af0d303807492", "features": "02024100", - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", - "signature": "3045022100e3b7d8886eae1a7c9e55e1797aa0dcb77b8c5a19d56c657cad030e360c90682802203a35713acb098245e53a37faeac98754a29a7078db5ed6f2166f917e55b94484" + "routes": [ + [ + { + "pubkey": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "short_channel_id": "109x1x1", + "fee_base_msat": 1, + "fee_proportional_millionths": 10, + "cltv_expiry_delta": 6 + } + ] + ], + "payment_hash": "1bc468bdb96d7e1307cc1b4c0ccf6e194604ae658b704db37ce983c392823726", + "signature": "30440220259ff982f0fbfd57d25000884edf3c8b6e66b350a94f9317c4677107d509d63a022030ff219de8d1fe193c0243cffc1578e978f7afb22d5fb62edaa81f6b46884a2f" } } ] @@ -8026,17 +9612,20 @@ "id": "example:deldatastore#1", "method": "deldatastore", "params": { - "key": "otherkey", - "generation": 1 + "key": [ + "test", + "name" + ] } }, "response": { "key": [ - "otherkey" + "test", + "name" ], - "generation": 1, - "hex": "6f746865726461746161", - "string": "otherdataa" + "generation": 0, + "hex": "736176696e67206461746120746f207468652073746f7265", + "string": "saving data to the store" } }, { @@ -8044,18 +9633,17 @@ "id": "example:deldatastore#2", "method": "deldatastore", "params": { - "key": [ - "a" - ] + "key": "otherkey", + "generation": 1 } }, "response": { "key": [ - "a" + "otherkey" ], - "generation": 0, - "hex": "6176616c", - "string": "aval" + "generation": 1, + "hex": "666f6f626172", + "string": "foobar" } } ] @@ -8127,8 +9715,8 @@ "id": "example:delforward#1", "method": "delforward", "params": { - "in_channel": "103x1x0", - "in_htlc_id": 2, + "in_channel": "109x1x1", + "in_htlc_id": 4, "status": "local_failed" } }, @@ -8139,8 +9727,8 @@ "id": "example:delforward#2", "method": "delforward", "params": [ - "103x1x0", - 1, + "109x1x1", + 19, "failed" ] }, @@ -8445,19 +10033,19 @@ "id": "example:delinvoice#1", "method": "delinvoice", "params": { - "label": "invlabel2", - "status": "unpaid", - "desconly": true + "label": "lbl_l36", + "status": "unpaid" } }, "response": { - "label": "invlabel2", - "bolt11": "lnbcrt420p1pja0tefsp5vvzg40t4g24l0eqk0jch7mc6jm3ec52ts8w8gwzpwtx9c8nv05rspp533e9csxurt7j9sn2cx7hsn6m00475qgrau8sux5r7djpdedwy2fshp5xqsmrtgfcwsnhxcxmf3tuc65kl6fxvqhvujfmxw2kpeh95yy2x8sxqyjw5qcqp99qxpqysgqgfjrz4q5zcq2lluxxg9h475mq2d3w0tpdstm5274zmhadjl8cqapylfskzk96apka5599a2flm90rmavsk7q8mhh87yle3sgh5vrlycq72fern", - "payment_hash": "8c725c40dc1afd22c26ac1bd784f5b7bebea0103ef0f0e1a83f36416e5ae2293", - "amount_msat": 42, + "label": "lbl_l36", + "bolt11": "lnbcrt500u1pn2s3fwsp5e6nltgzk3yqn5033r6z2q32pzduys3zs5dtzc5cjs60ppcgytrsqpp5ykhhcxzcqeng2gfggmsdja3x8h0qmkl35lw9z7n99pfkg8w0s8asdqcdsenvgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqwn7uwmy3x8u9c4ea0ka0yp3qvs0w9m7459g65kalm553vusctq8kseaph7tav4ryjfghnhu0ggjhhkrqmafarqkdsrzsk8stcvdmpmcqwfsajc", + "payment_hash": "25af7c1858066685212846e0d976263dde0ddbf1a7dc517a652853641dcf81fb", + "amount_msat": 50000000, "status": "unpaid", - "expires_at": 1709238697, - "created_index": 3 + "description": "l36 description", + "expires_at": 1722908590, + "created_index": 9 } }, { @@ -8465,23 +10053,24 @@ "id": "example:delinvoice#2", "method": "delinvoice", "params": { - "label": "keysend-1708640419.666098582", - "status": "paid" + "label": "lbl_l37", + "status": "paid", + "desconly": true } }, "response": { - "label": "keysend-1708640419.666098582", - "bolt11": "lnbcrt1pja0j9rsp5tg3zvj846gcdzw394njazq40s946sq2ur3hkl4xu4xudtjdtckxspp5fuunrfzsnyz2uxjmg2n95mqhghv4fpvv2kud3kvq4fkys3vmzu5sdqvddjhjum9dejqxqyjw5qcqp99qxpqysgqwt7r0gjlgt7zrfldc3um9myfc36acpqnsdn77c2m42facjtps30yufc5nsmwzhgexlj59f6xa5hess6e3tqrxynt9fejzj3rrshddtcqnappmj", - "payment_hash": "4f3931a4509904ae1a5b42a65a6c1745d954858c55b8d8d980aa6c48459b1729", + "label": "lbl_l37", + "bolt11": "lnbcrt500u1pn2s3fwsp5g96a3t3kn2we3ulrepd8eg4nw900wc324r06zlpr8py7p4zyftrspp5ggs9vzev5gcgthdysjrk0pcjgl3r5fwy4zgw6m48kk9nwx4h9slqdqcdsenwgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqwkmgxwugmtjvf9cu324h87x5ux3cwa6glefyfxvergy3mw8gwtnzg05mrf69yz0dafk4n7u7asaxh2nx5jsylwvqttzxmr9krpc9rlsquhqkt4", + "payment_hash": "4220560b2ca23085dda4848767871247e23a25c4a890ed6ea7b58b371ab72c3e", + "amount_msat": 50000000, "status": "paid", - "pay_index": 1, - "amount_received_msat": 10000000, - "paid_at": 1708640419, - "payment_preimage": "b760af47f456a217e8dfda21a282f1f78c903487c1b21b3b318135f75aa3bf11", - "description": "keysend", - "expires_at": 1709245219, - "created_index": 1, - "updated_index": 1 + "pay_index": 9, + "amount_received_msat": 50000000, + "paid_at": 1722303802, + "payment_preimage": "e876ca5ae4ed9897178b2b3a17997256ad669335eb9201e05e3c97ffb83c634b", + "expires_at": 1722908590, + "created_index": 10, + "updated_index": 9 } } ] @@ -8700,24 +10289,26 @@ "id": "example:delpay#1", "method": "delpay", "params": { - "payment_hash": "4fa2f1b001067ec06d7f95b8695b8acd9ef04c1b4d1110e3b94e1fa0687bb1e0", + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", "status": "complete" } }, "response": { "payments": [ { + "created_index": 1, "id": 1, - "payment_hash": "8dfd6538eeb33811c9114a75f792a143728d7f05643f38c3d574d3097e8910c0", - "destination": "0219f8900ee78a89f050c24d8b69492954f9fdbabed753710845eb75d3a75a5880", - "msatoshi": 1000, - "amount_msat": "1000msat", - "msatoshi_sent": 1000, - "amount_sent_msat": "1000msat", - "created_at": 1596224858, + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", + "groupid": 1, + "updated_index": 1, + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "amount_msat": 500000000, + "amount_sent_msat": 500000000, + "created_at": 1722303670, + "completed_at": 1722303671, "status": "complete", - "payment_preimage": "35bd4e2b481a1a84a22215b5372672cf81460a671816960ddb206464359e1822", - "bolt11": "lntb10n1p0jga20pp53h7k2w8wkvuprjg3ff6l0y4pgdeg6lc9vsln3s74wnfsjl5fzrqqdqdw3jhxazldahx2xqyjw5qcqp2sp5wut5jnhr6n7jd5747ky2g5flmw7hgx9yjnqzu60ps2jf6f7tc0us9qy9qsqu2a0k37nckl62005p69xavlkydkvhnypk4dphffy4x09zltwh9437ad7xkl83tefdarzhu5t30ju5s56wlrg97qkx404pq3srfc425cq3ke9af" + "payment_preimage": "bed4140e1db302720d7f9547dc9127d45b115080447cce7e23cfd00b60991831", + "bolt11": "lnbcrt5m1pn2s39ksp53sknyy2mxxurt4y0wqgp730z0cnm0vz3zmzth8p79xsrtmg5llxspp5dp94v59nm6c99jf7lc07zmnhqw6kyujx3mkdav7643dczgtdedfqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcvfqw3hjqmpjxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqdz9cftkxe6kcqfddyrvr7j57ulsfxxxkgkjyhr3k77n8v59mzs5rmuexz9lxusyhhehlemd9ujclgahln8e0n8y86stc7u8uys6mjqgqerm6q4" } ] } @@ -8727,25 +10318,25 @@ "id": "example:delpay#2", "method": "delpay", "params": [ - "c9d4547473d0d646f1fdd8ca7f01803e4d31ceab01df33c79456f9c24b04034e", + "25af7c1858066685212846e0d976263dde0ddbf1a7dc517a652853641dcf81fb", "failed" ] }, "response": { "payments": [ { - "created_index": 2, - "id": 2, - "payment_hash": "c9d4547473d0d646f1fdd8ca7f01803e4d31ceab01df33c79456f9c24b04034e", + "created_index": 20, + "id": 20, + "payment_hash": "25af7c1858066685212846e0d976263dde0ddbf1a7dc517a652853641dcf81fb", "groupid": 1, - "updated_index": 2, + "updated_index": 19, "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "amount_msat": 100000, - "amount_sent_msat": 100002, - "created_at": 1706316468, - "completed_at": 1706316471, + "amount_msat": 50000000, + "amount_sent_msat": 50000501, + "created_at": 1722303803, + "completed_at": 1722303806, "status": "failed", - "bolt11": "lnbcrt1u1pjmg54nsp5ke626txv6wwwmqmpuy63t3jnu9hqxwj880zsfkkj7jjqagdaz2sqpp5e829garn6rtydu0amr987qvq8exnrn4tq80n83u52muuyjcyqd8qdq8v3jhxccxqyjw5qcqp99qxpqysgqalktfwy9svsamvvvrzzzzpdaa4rh7n6s5p7t9lx7qv0raz4vnm9knkh5ury3u5cmnhx2gms98nxkclm3833uhjrlnzmftc685vz2f0gpfnjy4y" + "bolt11": "lnbcrt500u1pn2s3fwsp5e6nltgzk3yqn5033r6z2q32pzduys3zs5dtzc5cjs60ppcgytrsqpp5ykhhcxzcqeng2gfggmsdja3x8h0qmkl35lw9z7n99pfkg8w0s8asdqcdsenvgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqwn7uwmy3x8u9c4ea0ka0yp3qvs0w9m7459g65kalm553vusctq8kseaph7tav4ryjfghnhu0ggjhhkrqmafarqkdsrzsk8stcvdmpmcqwfsajc" } ] } @@ -8755,28 +10346,27 @@ "id": "example:delpay#3", "method": "delpay", "params": { - "payment_hash": "bbc35e0a46d1483292a4ff8d4daaceaab8c3c084dd835be4128785b52e469c64", - "status": "complete", + "payment_hash": "647252f7e45fce7bb964523206874f40f58fbb7b208bc08967caa0e2404990c9", + "status": "failed", "groupid": 1, - "partid": 1 + "partid": 2 } }, "response": { "payments": [ { - "created_index": 3, - "id": 3, - "payment_hash": "bbc35e0a46d1483292a4ff8d4daaceaab8c3c084dd835be4128785b52e469c64", + "created_index": 17, + "id": 17, + "payment_hash": "647252f7e45fce7bb964523206874f40f58fbb7b208bc08967caa0e2404990c9", "groupid": 1, - "updated_index": 3, - "partid": 1, - "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "amount_msat": 100000, - "amount_sent_msat": 102100, - "created_at": 1708641193, - "completed_at": 1708641194, - "status": "complete", - "payment_preimage": "a6ebb1cfbf69e76200f196f1eafd28a3d850633499c223a7eb7a7dba3b995286" + "updated_index": 16, + "partid": 2, + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "amount_msat": 1000000, + "amount_sent_msat": 1000000, + "created_at": 1722303798, + "completed_at": 1722303799, + "status": "failed" } ] } @@ -8829,6 +10419,16 @@ "request": { "id": "example:deprecations#1", "method": "deprecations", + "params": { + "enable": true + } + }, + "response": {} + }, + { + "request": { + "id": "example:deprecations#2", + "method": "deprecations", "params": { "enable": false } @@ -8931,39 +10531,38 @@ "examples": [ { "description": [ - "Forget a channel by peer pubkey when only one channel exists with the peer." + "Forget a channel by peer pubkey when only one channel exists with the peer:" ], "request": { "id": "example:dev-forget-channel#1", "method": "dev-forget-channel", "params": { - "id": "023d28435ce4b49f068c964aacbcb6dd114317a70f03e5a731ea72d25df1cff35b" - }, - "test": "test" + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e" + } }, "response": { "forced": false, - "funding_unspent": true, - "funding_txid": "g6efdfb11bee25aa8b2249055a4162e4bd5fa9134bc865c3f054ca666d7ab744" + "funding_unspent": false, + "funding_txid": "c40c9d52aaac47f76c67163a2efc005df189b36b855b0ad209da7d0d066358b1" } }, { "description": [ - "Forget a channel by short channel id when peer has multiple channels." + "Forget a channel by short channel id when peer has multiple channels:" ], "request": { "id": "example:dev-forget-channel#2", "method": "dev-forget-channel", "params": { - "id": "0348e58210bbc128b1cc3cc1a520a654aaa01e5fe65c65341e21b61a1f09da94d5", - "short_channel_id": "337x1x0", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "111x1x0", "force": true } }, "response": { "forced": true, - "funding_unspent": true, - "funding_txid": "b254f30a58adde9326b7e8a701f9d5b3c4db2160b58c5378afbe04448018ec8a" + "funding_unspent": false, + "funding_txid": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483" } } ] @@ -9056,6 +10655,24 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:disableinvoicerequest#1", + "method": "disableinvoicerequest", + "params": { + "invreq_id": "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9" + } + }, + "response": { + "invreq_id": "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9", + "active": false, + "single_use": true, + "bolt12": "lnr1qqgx5t5hcw5ru9fgkhgxj4thjq4ugzsk2fjhzat9wd6xjmn8ypnx7u3qd9h8vmmfvdj3yyrrd35kw6r5de5kueeqwd6x7un92qsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzr6jqwvfdqzcyypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgpvamrunx5t6vdaeu7nmmlh5u6f0dnscasy2alyxq79f5wnc043gxrzyqt640dmuj7c94644j5ae6wfse7tsejwqnmc575ly9t38h4hf", + "used": false + } + } ] }, "lightning-disableoffer.json": { @@ -9140,6 +10757,7 @@ "Rusty Russell <> is mainly responsible." ], "see_also": [ + "lightning-enableoffer(7)", "lightning-offer(7)", "lightning-listoffers(7)" ], @@ -9152,14 +10770,14 @@ "id": "example:disableoffer#1", "method": "disableoffer", "params": { - "offer_id": "713a16ccd4eb10438bdcfbc2c8276be301020dd9d489c530773ba64f3b33307d" + "offer_id": "b791f88cebf775853112c30828e116487f4d6c252d669372532b468bc7de8a24" } }, "response": { - "offer_id": "053a5c566fbea2681a5ff9c05a913da23e45b95d09ef5bd25d7d408f23da7084", + "offer_id": "b791f88cebf775853112c30828e116487f4d6c252d669372532b468bc7de8a24", "active": false, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqvqcdgq2z9pk7enxv4jjqen0wgs8yatnw3ujz83qkc6rvp4j28rt3dtrn32zkvdy7efhnlrpr5rp5geqxs783wtlj550qs8czzku4nk3pqp6m593qxgunzuqcwkmgqkmp6ty0wyvjcqdguv3pnpukedwn6cr87m89t74h3auyaeg89xkvgzpac70z3m9rn5xzu28c", + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqv0gfqq2zp8kven9wgs8gmeqg35hxctzd3j3vggz953rvg9rtxj8lalh43z8epwydjfrmffn3y3p5qz5cywpu09rr4vs", "used": false } } @@ -9218,7 +10836,7 @@ "id": "example:disconnect#1", "method": "disconnect", "params": { - "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", "force": false } }, @@ -9229,7 +10847,7 @@ "id": "example:disconnect#2", "method": "disconnect", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", "force": true } }, @@ -9296,8 +10914,122 @@ }, "response": { "stubs": [ - "c00734472f344fdadd0bf787de182e5cf144ccda5d731b0f7c75befd1f1eff52" + "e13472d6512413eb1bf03b9a0bb391d0e4152fd337fa6d1014e3de5e131918d9", + "f8fc83a432cbfb2fffe222cc06727fdd977b5dd10ebd6707158e799e6f522d9f", + "1267da6521b372d7c6407a74066f7a3a5bc3489bbda5eb9f0e990e1e913e2eb9" + ] + } + } + ] + }, + "lightning-enableoffer.json": { + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "disableoffer", + "title": "Command for re-enabling an offer", + "warning": "experimental-offers only", + "description": [ + "The **enableoffer** RPC command enables an offer, after it has been disabled." + ], + "request": { + "required": [ + "offer_id" + ], + "properties": { + "offer_id": { + "type": "hash", + "description": [ + "The id we use to identify this offer." + ] + } + } + }, + "response": { + "required": [ + "offer_id", + "active", + "single_use", + "bolt12", + "used" + ], + "properties": { + "offer_id": { + "type": "hash", + "description": [ + "The merkle hash of the offer." + ] + }, + "active": { + "type": "boolean", + "enum": [ + true + ], + "description": [ + "Whether the offer can produce invoices/payments." + ] + }, + "single_use": { + "type": "boolean", + "description": [ + "Whether the offer is disabled after first successful use." + ] + }, + "bolt12": { + "type": "string", + "description": [ + "The bolt12 string representing this offer." + ] + }, + "used": { + "type": "boolean", + "description": [ + "Whether the offer has had an invoice paid / payment made." ] + }, + "label": { + "type": "string", + "description": [ + "The label provided when offer was created." + ] + } + }, + "pre_return_value_notes": [ + "Note: the returned object is the same format as **listoffers**." + ] + }, + "errors": [ + "On failure, one of the following error codes may be returned:", + "", + "- -32602: Error in given parameters.", + "- 1006: offer already enabled." + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "see_also": [ + "lightning-offer(7)", + "lightning-disableoffer(7)", + "lightning-listoffers(7)" + ], + "resources": [ + "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:enableoffer#1", + "method": "enableoffer", + "params": { + "offer_id": "713a16ccd4eb10438bdcfbc2c8276be301020dd9d489c530773ba64f3b33307d" + } + }, + "response": { + "offer_id": "053a5c566fbea2681a5ff9c05a913da23e45b95d09ef5bd25d7d408f23da7084", + "active": true, + "single_use": false, + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqvqcdgq2z9pk7enxv4jjqen0wgs8yatnw3ujz83qkc6rvp4j28rt3dtrn32zkvdy7efhnlrpr5rp5geqxs783wtlj550qs8czzku4nk3pqp6m593qxgunzuqcwkmgqkmp6ty0wyvjcqdguv3pnpukedwn6cr87m89t74h3auyaeg89xkvgzpac70z3m9rn5xzu28c", + "used": false } } ] @@ -9697,44 +11429,44 @@ }, "response": { "perkw": { - "opening": 1000000, - "mutual_close": 26362, - "unilateral_close": 26362, - "unilateral_anchor_close": 1000000, - "penalty": 26362, - "min_acceptable": 3750, - "max_acceptable": 10000000, + "opening": 7500, + "mutual_close": 3750, + "unilateral_close": 11000, + "unilateral_anchor_close": 3750, + "penalty": 7500, + "min_acceptable": 1875, + "max_acceptable": 150000, "floor": 253, "estimates": [ { "blockcount": 2, - "feerate": 1000000, - "smoothed_feerate": 26362 + "feerate": 15000, + "smoothed_feerate": 15000 }, { "blockcount": 6, - "feerate": 1000000, - "smoothed_feerate": 26362 + "feerate": 11000, + "smoothed_feerate": 11000 }, { "blockcount": 12, - "feerate": 1000000, - "smoothed_feerate": 26362 + "feerate": 7500, + "smoothed_feerate": 7500 }, { "blockcount": 100, - "feerate": 1000000, - "smoothed_feerate": 26362 + "feerate": 3750, + "smoothed_feerate": 3750 } ] }, "onchain_fee_estimates": { - "opening_channel_satoshis": 702000, - "mutual_close_satoshis": 17741, - "unilateral_close_satoshis": 1112000, - "unilateral_close_nonanchor_satoshis": 15764, - "htlc_timeout_satoshis": 17478, - "htlc_success_satoshis": 18532 + "opening_channel_satoshis": 5265, + "mutual_close_satoshis": 2523, + "unilateral_close_satoshis": 4170, + "unilateral_close_nonanchor_satoshis": 6578, + "htlc_timeout_satoshis": 7293, + "htlc_success_satoshis": 7733 } } }, @@ -9748,12 +11480,12 @@ }, "response": { "perkb": { - "opening": 25000, - "mutual_close": 25000, + "opening": 30000, + "mutual_close": 15000, "unilateral_close": 44000, - "unilateral_anchor_close": 25000, - "penalty": 25000, - "min_acceptable": 12500, + "unilateral_anchor_close": 15000, + "penalty": 30000, + "min_acceptable": 7500, "max_acceptable": 600000, "floor": 1012, "estimates": [ @@ -9769,15 +11501,20 @@ }, { "blockcount": 12, - "feerate": 25000, - "smoothed_feerate": 25000 + "feerate": 30000, + "smoothed_feerate": 30000 + }, + { + "blockcount": 100, + "feerate": 15000, + "smoothed_feerate": 15000 } ] }, "onchain_fee_estimates": { - "opening_channel_satoshis": 4387, - "mutual_close_satoshis": 4206, - "unilateral_close_satoshis": 6578, + "opening_channel_satoshis": 5265, + "mutual_close_satoshis": 2523, + "unilateral_close_satoshis": 4170, "unilateral_close_nonanchor_satoshis": 6578, "htlc_timeout_satoshis": 7293, "htlc_success_satoshis": 7733 @@ -9978,12 +11715,12 @@ "id": "example:fetchinvoice#1", "method": "fetchinvoice", "params": { - "offer": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqypq5zmnd9khqmr9yp6x2um5zcssxhftzxfdlwsnfcgw2sy8t5mxa0ytcdfat2nkdwqvpy9nnsa9mzza", + "offer": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqgn3qzs2ge5hx6pqwdskcefpzcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", "payer_note": "Thanks for the fish!" } }, "response": { - "invoice": "lni1qqgvcm9h7yakcmw4mzazspu8vfgpwq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqgzpg9hx6tdwpkx2gr5v4ehg93pqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky965pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84sggren772kj8mau5jp86nc6fszx48rv7ep0quszyyls8rlld3sshjr94j9z5dpsku6mnypnx7u3qw35x2grxd9eksgdqnqp462c3jt0m5y6wzrj5pp6axehtez7r20265antsrqfpvuu8fwcshgr0tsv8e6829e8xmv7laz0kwhtlx6vtk8q3d6rtthdhtwvnn6j585szquc2t7us8kguxypzasg8ewkakgx2ny5ugks0f32x67sm9e5fms4asqrylajc2dqh8ag55mv5p5ghy3e2z8zwmllle8uu7jsxv5ke8d6rr5h7kthmz7ya0hxp4nt7elvw7vghcl6fgsuqqqqqqqqqqqqqqq9qqqqqqqqqqqqq8fykt06c5sqqqqqpfqyvhtunn4gyzy0lphn4wn6ctzlsajy46wscjcglf3hxcnvlaxqs3ydkhgaklsc42spq2czzq6a9vge9ha6zd8ppe2qsawnvm4u30p484d2we4cpsyskwwr5hvgthcyqyuen02ejwpa9cjjrttvp223yxsqkrwnlaszkhas84w0ape300ued4p75xu3cqtcg0cslsx9fvh7dhdqx565t6wa0alf6u2hug90j2hs", + "invoice": "lni1qqg9g04gczk9ntk4gsjg3aptwykk2q3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssq38zq9q53nfwd5zqumpd3jjz93pqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4j5pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84sggztuesttnr6atmya7afycpsvcg0wnzprn58n54lfhf2ragp0jq0e04j9z5dpsku6mnypnx7u3qw35x2grxd9eksgdqnqpz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336kgr6euj6p39a209zw5kpkftk7h9te69vlmjg0arceagpaajague0zsszqk96htpgqn2wsznaas0zfdtf8v97ryz29jrn7rwgs5687ghgq5jusqr99dtx4jdj9nqpep5zxmynegrg6e7rm2l53ur8043h2yqzldyl5vh08h8ssaeq5jrvw9y24kztlwvc4nwagsuqqqqqqqqqqqqqqq9qqqqqqqqqqqqq8fykt06c5sqqqqqpfqyv65yfedgyqrp2s7qpxpjse8q8796qcrr5xwgfkqjue3urd6rs2rt2f68tk0vl2szyugtqggz953rvg9rtxj8lalh43z8epwydjfrmffn3y3p5qz5cywpu09rr4vlqsy2n7vmpn67ltzrj70znp70sk4m530j5vceq6jhk97h7ttzn09sh8m9gecarrt27v2tux8z6rr06sj9h60r05p4vhkhzsp0xf9ea4jgg", "changes": {} } }, @@ -9992,26 +11729,13 @@ "id": "example:fetchinvoice#2", "method": "fetchinvoice", "params": { - "offer": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqypq5zmnd9khqmr9yp6x2um5zcssxhftzxfdlwsnfcgw2sy8t5mxa0ytcdfat2nkdwqvpy9nnsa9mzza", - "amount_msat": 3 - } - }, - "response": { - "invoice": "lni1qqg0mfchkz0gkmn8zzu5zaxd0qvlzq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqgzpg9hx6tdwpkx2gr5v4ehg93pqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky965pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84yqgrtqss8d4vgzd3286u9rk0zg9qr7a6z2xm6mjnz9pydztcn0j74tjvch0f5zvqxhftzxfdlwsnfcgw2sy8t5mxa0ytcdfat2nkdwqvpy9nnsa9mzzaqth4fzjqxxmsaxvc4v2urs6hsh6k0e564x00g68vuyp5w7yjedzxvqgr8ltzmj0n7ltxr0tz9rafn9zcy9jldjqfuf20w6gjmr7nj04d360sqvkdwprxn22dlp3xay9yq4nhrw2jm0c8t6r7japhdad6leawxyqzkg92tx8gqxp9f2d8j5k2axta0gr7yr9zrsqqqqqqqqqqqqqqq5qqqqqqqqqqqqqayjedltzjqqqqqq9yq3ja0jwj4qswt3kgs9mxq7gck66x60m5rndykpw3a7hf4ntlp9qe2vgwzzrvcwd2qypmqggrt543ryklhgf5uy89gzr46dnwhj9ux5744fmxhqxqjzeecwja3pwlqsxyjcdwur4hl4qf7nsjgg8euvy45lznufh5kydkwz6llsucuhvwp9ezeggaj3k057ge6ftvaffjkwn6j3y7faeuysrx3m2xccphu65sx", - "changes": {} - } - }, - { - "request": { - "id": "example:fetchinvoice#3", - "method": "fetchinvoice", - "params": { - "offer": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqypq5zmnd9khqmr9yp6x2um5zsqs593pqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4j", + "offer": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqv85ysq2qepk7enxv4j3gqg2zcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", + "amount_msat": 2000000, "quantity": 2 } }, "response": { - "invoice": "lni1qqgd508mv9rpjg2ec8dr8qcslf2cjq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqgzpg9hx6tdwpkx2gr5v4ehg9qppgtzzq3dygmzpg6e53ll0aavg37gt3rvjg762vufygdqq4xprs0regcat9gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02cqsykppqfkyy6q8ry9pchxtuajh456hhcf7dxx733cx76etuv5ftfmfa2ymhgycqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jq6uhkeymz26zx7zgw4gdmw2vj9xqn4hu2sqxhp0pcgt87pf9chyfvqsywtejxjh603kx7am3zaf6d6xuumw30p8zmcdz7r95nn4lr92exk3qqe2x6xqwpdzh2zwq3vnyra8nfc6d7y6hegpkvc7p2nulj7hvhwl5hjfr23wn60mjftqspn7d4ejhrpsr5m2y8qqqqqqqqqqqqqqqpgqqqqqqqqqqqqp6f9jm7k9yqqqqqq2gpr96l9mt2pqxuyr0gqw92h0xz2y2uy5uxss4ujcac5jehj9ay2sxkapr80t5ha65qgykqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e7pqxhl4u29cjluw5s8fwa9wtvh0qytr7vqk0vtndsz07mrrtmjw629m8mnqkjaf43kt889qeq2f7deu6t853lngpzclapt8nj0g528v9ay", + "invoice": "lni1qqg86u6jfl660zfuk22sexem37r7xq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqc0gfqq5pjrdanxvet9zsqs593pqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4j5pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84yqc7sjq9vqgztqssxq2dwgnpqyhz3j68zx5cts28t6aqfgq937wsgvsmfncau3uhz8t05zvqytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82eq2rdjuqaychg3jndvsjrlu6y08aeuh4ytw6f6ak5n24p5n8zmsz2sqgrg3rg89hqfh6n7dfr0fugvq20ehecd3ezc438l6uh4r8epaakn4lsqv4qgr3ks4yxngyflq339lza456xt8uly085umq3gwql3qyfge0ec03dezeg8xulz33ntlj8yd7dcra9564zrsqqqqqqqqqqqqqqq5qqqqqqqqqqqqqayjedltzjqqqqqq9yq3n2s3894qsfwwvj3szk4yplg4fkw68nwzlwyc23457qx6v7xe38znuha72km6a2qv0gfq9syypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgz2rxjcsxs6s3lnngq9xeqn9pzy53n50p4ulcdvkx8dye7h8xgxpvjyg928m2txk2knl0zzfl7j82c6lq7xqlx83ey7z4aux9pjp4sp7", "changes": {} } } @@ -10261,33 +11985,15 @@ "id": "example:fundchannel#1", "method": "fundchannel", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", "amount": 1000000, "announce": true } }, "response": { - "tx": "020000000001014ca47b75e6982fce6b5ebb6e7ec163dc5b6bed1562934e6febe816103b2b207e0000000000fdffffff0240420f00000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd012f0f000000000022512063ffee4ea7d51e6cadf9086e286a2527922aaa25b8c53aebf32fa32a0a627f5a02473044022058fc4d51c8254d37b266d3db3f8fda7420882b6ec9226d66b8c0139f2707c09602205798d8ce23d4c692a7384362a2e0afd9703f062239a786d7a1840a28d3a1152e012103d745445c9362665f22e0d96e9e766f273f3260dea39c8a76bfa05dd2684ddccf66000000", - "txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b", - "channel_id": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", - "outnum": 0 - } - }, - { - "request": { - "id": "example:fundchannel#2", - "method": "fundchannel", - "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount": 10000000, - "announce": true, - "push_msat": 1000000000 - } - }, - "response": { - "tx": "0200000000010141cfa0e9957c7c6d0bb5069d92937f9545e6e6ee9b4650f47f509d5ea65df4690100000000fdffffff0280969800000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd4118530b0000000022512063ffee4ea7d51e6cadf9086e286a2527922aaa25b8c53aebf32fa32a0a627f5a0247304402206488c7dfbc4180781ed0d5ca7ff2c8ce134480c349d03978765053a393229d9a022066c75dee1f19b410ea1c7756d0cb2c097e52b13f4d9bbd033efa4ed95d817e14012103d745445c9362665f22e0d96e9e766f273f3260dea39c8a76bfa05dd2684ddccf66000000", - "txid": "6aa1231b6356777468a55aea1f49dad6415592aef6c1e652f8a64357c7235301", - "channel_id": "015323c75743a6f852e6c1f6ae925541d6da491fea5aa568747756631b23a16a", + "tx": "02000000000101a4f6a433b1c2625323c18bc25f880c3e7960722d9ca353d7ff5c2a2132d56a380000000000fdffffff0240420f0000000000220020b41521751a8eb257315f73a531763071cc39b7cece470f630fd5149fe7b7057a816cdc0b00000000225120a5410daebf4fc3cba618a840af497fbec4c3a084534f2b7b6a7d30bf35f8f566024730440220700ee63053ba1fea998685e721016c15cf7809fd77698560230457e122566f220220181aaa01f472ec575edc532bc612c749e7a3829f5616fc3289fd4dc7d96e98d8012102c8a8f25ed135cd671c88bd4e407bb3746678cfacbcf65ce89f8efc2aa0abe53596000000", + "txid": "8326851788c6da23bc883c960affc6126f766348c131eda53d73bc06f0bd90ff", + "channel_id": "1267da6521b372d7c6407a74066f7a3a5bc3489bbda5eb9f0e990e1e913e2eb9", "channel_type": { "bits": [ 12, @@ -10303,25 +12009,25 @@ }, { "description": [ - "This example shows how to to open new channel with peer 034...4d5 from one whole utxo 961...aeb:1 (you can use **listfunds** command to get txid and vout):" + "This example shows how to to open new channel with peer 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 from one whole utxo c8afe317789f3ecbd52893d2ac08be7499486df5a03c95ad063e395e931eb50a:1 (you can use **listfunds** command to get txid and vout):" ], "request": { - "id": "example:fundchannel#3", + "id": "example:fundchannel#2", "method": "fundchannel", "params": { - "id": "0348e58210bbc128b1cc3cc1a520a654aaa01e5fe65c65341e21b61a1f09da94d5", + "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", "amount": "all", "feerate": "normal", - "push_msat": 1000000000, + "push_msat": 100000, "utxos": [ - "9619a4ccc08512f9520363c7163c95c54723ee8d40802e763a1598fec7bdaaeb:1" + "c8afe317789f3ecbd52893d2ac08be7499486df5a03c95ad063e395e931eb50a:1" ] } }, "response": { - "tx": "02000000000101ebaabdc7fe98153a762e80408dee2347c5953c16c7630352f91285c0cca419960100000000fdffffff02a861000000000000225120b348ab8875cbcfad71e5f3f96e8b3cb25b3495701fb1e06e7f01c70c6e3d7776ec00510200000000220020b71d4d6b2224c9a6b234fde9ca8922ca83be1bc440c08da2156fc3b154c476ff014035ccc897ca0097be7088e397bab0215c967257a25d3efb2d96259d5a7051078b1caaddacc702fced9289d556be70c55bf10fae0bb761526f3d165ff106da140c2f030000", - "txid": "dbeeb2320ddf3ae0bb7887df8226ecdbcec3583ea027a2c1d86bfb167b0f93ea", - "channel_id": "c4e607b4743fa4ee516fd247dbdaf4cb17b8462b2468bd84f15d6f78ac82bf1a", + "tx": "020000000001010ab51e935e393e06ad953ca0f56d489974be08acd29328d5cb3e9f7817e3afc80100000000fdffffff01cbb3eb0b00000000220020752dd5af63b98ff64fedf94683b0306c43f6eec74fbfe917639735b305e1b6d9024730440220431a00efd961f417160bd7180970a61b57c01b7c1e082d41429bb0c4e220d4180220542d0c9a1a59048751364b0ede571117fd8abdbf63d83d67a181c17ea3d3ef9e0121024740cce0e548f4ffe80c9914e43444d8e66ee8991dc9d93ec56dff4c56b933159a000000", + "txid": "20bbe695f309285479e6b63b8ab4346ce66b2db7018485e09d59175cec6156b1", + "channel_id": "222d999f537e32e9458c5db17a63e012dcced61340de06fda5bc30566270b0aa", "channel_type": { "bits": [ 12, @@ -10332,7 +12038,7 @@ "anchors/even" ] }, - "outnum": 1 + "outnum": 0 } } ] @@ -10406,9 +12112,9 @@ "request": { "id": "example:fundchannel_cancel#1", "method": "fundchannel_cancel", - "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" - } + "params": [ + "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc" + ] }, "response": { "cancelled": "Channel open canceled by RPC" @@ -10419,11 +12125,11 @@ "id": "example:fundchannel_cancel#2", "method": "fundchannel_cancel", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" + "id": "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc" } }, "response": { - "cancelled": "Channel open canceled by RPC(after fundchannel_complete)" + "cancelled": "Channel open canceled by RPC" } } ] @@ -10514,13 +12220,27 @@ "request": { "id": "example:fundchannel_complete#1", "method": "fundchannel_complete", + "params": [ + "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc", + "cHNidP8BAgQCAAAAAQMElQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAFpz79e9wou5mbmtaiB+6WfRTf8SpZxmrd6n+rIFcWewQAAAAAA/f///wLS79/eAAAAABYAFE35CMxYA4yQx9XLuFj0/q5uNmligJaYAQAAAAAWABT/hTPq8LE5vAc9KiJjjmygoIN81UsAAAABAR+AlpgBAAAAABYAFP+FM+rwsTm8Bz0qImOObKCgg3zVAQ4gl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywBDwQBAAAAARAE/f///wABAwgAAAABAAAAAAEEIgAgrcWu1QvOE7IcR/Pw6wFIFh6/TLwoeKjo5eUoi7suzsEAAQMIQYOYAAAAAAABBCJRIIHaDT4wURNaieL52F4urfZh+Vm/sF5nEJeFRnLP0Kx9AA==" + ] + }, + "response": { + "channel_id": "4ef7fbec78160e41ac53e32bb7d4d491222070cf719bd236a03a27109a306ced", + "commitments_secured": true + } + }, + { + "request": { + "id": "example:fundchannel_complete#2", + "method": "fundchannel_complete", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "psbt": "cHNidP8BAIkCAAAAASYd4TeOHEIzrUbbELM2DK0IX09WaXqWsJFlLD455MPPAAAAAAD9////Av///wAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM1c8QUpAQAAACJRIH8AZYBKMKON4/oVmJVsVt6zy/+PkBPzziE+LtkuFvWXAAAAAAABAIMCAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wJRAP////8CAPIFKgEAAAAWABQ5FIjuMd8ar9WFRV9eGNLF+3RMcAAAAAAAAAAAJmokqiGp7eL2HD9x0d79P6mZ36NpU3VcaQaJeZlitIvr2DaXToz5AAAAAAEBHwDyBSoBAAAAFgAUORSI7jHfGq/VhUVfXhjSxft0THAiBgMegIxEPDa2OseVTaV6ANtSwQuoj/j2an7X/Is2EekvWBhhFDNgVAAAgAEAAIAAAACAAAAAAAAAAAAAAAEFIEm9AFgqUlJwbPFtyt3a9dzvb+nAGZiQ3CT1CImhjBFpIQdJvQBYKlJScGzxbcrd2vXc72/pwBmYkNwk9QiJoYwRaRkAYRQzYFYAAIABAACAAAAAgAEAAAAAAAAAAA==" + "id": "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc", + "psbt": "cHNidP8BAgQCAAAAAQMETgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAEAAAAA/f///wIAAAABAAAAACIAIK3FrtULzhOyHEfz8OsBSBYev0y8KHio6OXlKIu7Ls7BQYOYAAAAAAAiUSCB2g0+MFETWoni+dheLq32YflZv7BeZxCXhUZyz9CsfZUAAAABAStBg5gAAAAAACJRIIHaDT4wURNaieL52F4urfZh+Vm/sF5nEJeFRnLP0Kx9AQ4gTvf77HgWDkGsU+Mrt9TUkSIgcM9xm9I2oDonEJowbO0BDwQBAAAAARAE/f///wABAwhAQg8AAAAAAAEEIgAgyeosZcqM3Ce8Ew/hH15S4XVHXg4xtkWx3MODLcT3540AAQMIwi2JAAAAAAABBCJRIHdLHCqbSwqdzkO0Y5WUDaIAERXUAPo2Z5CeyGpdNlGLAA==" } }, "response": { - "channel_id": "049217e5035a4a60449c6382c445b5c105bd63588d66137ad0511c57a16db6d9", + "channel_id": "589340033fb4e1ace8a5f6239a9bcc88e2d65191f68e4ad3f2ad37818718a2e9", "commitments_secured": true } } @@ -10738,15 +12458,24 @@ "request": { "id": "example:fundchannel_start#1", "method": "fundchannel_start", - "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount": 16777216, - "announce": true - } + "params": [ + "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc", + 16777216 + ] }, "response": { - "funding_address": "bcrt1qtwxd8wg5eanumk86vfeujvp48hfkgannf77evggzct048wggsrxsum2pmm", - "scriptpubkey": "00205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd", + "funding_address": "bcrt1q5ptrvwlgcldm2ygf3nzsl09zfpp7dmtduqlczer97xvc4x5z5zwsc2ulv4", + "scriptpubkey": "0020a056363be8c7dbb511098cc50fbca24843e6ed6de03f816465f1998a9a82a09d", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, "warning_usage": "The funding transaction MUST NOT be broadcast until after channel establishment has been successfully completed by running `fundchannel_complete`" } }, @@ -10755,14 +12484,13 @@ "id": "example:fundchannel_start#2", "method": "fundchannel_start", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount": "100000sat", - "announce": true + "id": "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc", + "amount": 16777216 } }, "response": { - "funding_address": "bcrt1qtwxd8wg5eanumk86vfeujvp48hfkgannf77evggzct048wggsrxsum2pmm", - "scriptpubkey": "00205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd", + "funding_address": "bcrt1q4hz6a4gtecfmy8z870cwkq2gzc0t7n9u9pu23689u55ghwewemqsv4v2zs", + "scriptpubkey": "0020adc5aed50bce13b21c47f3f0eb0148161ebf4cbc2878a8e8e5e5288bbb2ecec1", "channel_type": { "bits": [ 12, @@ -11065,9 +12793,9 @@ "params": {} }, "response": { - "summary": "match (100%)", - "policy": "match", - "policy_mod": 100, + "summary": "fixed (0sat)", + "policy": "fixed", + "policy_mod": 0, "leases_only": true, "min_their_funding_msat": 10000000, "max_their_funding_msat": 4294967295000, @@ -11075,13 +12803,7 @@ "per_channel_max_msat": 4294967295000, "reserve_tank_msat": 0, "fuzz_percent": 0, - "fund_probability": 100, - "lease_fee_base_msat": 100000, - "lease_fee_basis": 100, - "funding_weight": 666, - "channel_fee_max_base_msat": 5000000, - "channel_fee_max_proportional_thousandths": 100, - "compact_lease": "029a00640064000000644c4b40" + "fund_probability": 100 } }, { @@ -11329,18 +13051,18 @@ "id": "example:fundpsbt#1", "method": "fundpsbt", "params": { - "satoshi": 16777216, + "satoshi": 1000000, "feerate": "253perkw", "startweight": 250, - "reserve": 0, - "excess_as_change": false + "reserve": 0 } }, "response": { - "psbt": "cHNidP8BADMCAAAAAWzmSFzhTtXBnQewytc32WaMwJSunScwsYndBNdU80JqAAAAAAD9////AGYAAAAAAQDeAgAAAAABAU1MpIJeOOzqAYVkZaytJCmzUadBVltKar8kWtzKSVeYAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFD8W5uBNZAxN6n1jqU62dxWQbyGAAkcwRAIgUK+vMOeWiDPiJM8fpgKCjjwXog4yfWPvtKES1ZZPaM8CIB3cgouGpV6Gc7nEvAu28Mg9tkAWt/Xl5FDOseEyeZqHASECTwjR0I3gLHdSW7jRmnVXdm0+MgJ1hihnqEfXYeFWA/NlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQA=", + "psbt": "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AahhAAAAAAAAIlEg+3d9jpNmK0getyg5W+Mp31CPIRDKcJg/mZs/uaVrQ+GZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA", "feerate_per_kw": 253, - "estimated_final_weight": 521, - "excess_msat": 9999869000 + "estimated_final_weight": 693, + "excess_msat": 196962507000, + "change_outnum": 0 } }, { @@ -11348,55 +13070,20 @@ "id": "example:fundpsbt#2", "method": "fundpsbt", "params": { - "satoshi": "all", - "feerate": "1000perkw", - "startweight": 1000, - "excess_as_change": false - } - }, - "response": { - "psbt": "cHNidP8BAF4CAAAAAfwbEpvpi6D14YV4VLnuVB47Y0uF41kXEyJRL4IusySSAQAAAAD9////ASICAAAAAAAAIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL5nAAAAAAEA9gIAAAAAAQFEkxvLatohY6mw5gr5qG1aiArSrziFPR2YoqD21Hv+RAAAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNrz8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIEu1nfVRt9i+rFM219mwhMqdwJsqygWSWTFUS+cemdh6AiBG3Qo8g9J/aAMO2RHDsIBScscj6pTTIwZp7Gw8G3EOKAEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPZgAAAAEBK68/DwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oAAA==", - "feerate_per_kw": 1000, - "estimated_final_weight": 1443, - "excess_msat": 997354000, - "change_outnum": 0, - "reservations": [ - { - "txid": "9224b32e822f5122131759e3854b633b1e54eeb9547885e1f5a08be99b121bfc", - "vout": 1, - "was_reserved": false, - "reserved": true, - "reserved_to_block": 175 - } - ] - } - }, - { - "request": { - "id": "example:fundpsbt#3", - "method": "fundpsbt", - "params": { - "satoshi": "109000sat", - "feerate": "slow", + "satoshi": 500000, + "feerate": "urgent", "startweight": 166, - "excess_as_change": true + "reserve": 0, + "excess_as_change": true, + "min_witness_weight": 110 } }, "response": { - "psbt": "cHNidP8BAF4CAAAAAbEf44mT/BPDxLkUjKy1byWksyLyuM6hbe8shzEbbXhGAQAAAAD9////AU58DQAAAAAAIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL5sAAAAAAEA9gIAAAAAAQEV9Sj1wfHqO/ECZeHp/u7cFL5eRaa1Vu4hXWbwH72pxgEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIGILT3DrcNn6/WKOhsxxKq7lDWq47dV0IjRhj0bYHs4yAiApzODtmrz7ifK32G81A2XbBxWboFk2vN4T3ng/hYmb1wEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPZgAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oAAA==", - "feerate_per_kw": 3750, - "estimated_final_weight": 609, + "psbt": "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AfZRxQsAAAAAIlEg21kTTo7K2doCG6F2JqgaDjc1kRCrH7AL08oPVVJhuE+ZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA", + "feerate_per_kw": 11000, + "estimated_final_weight": 612, "excess_msat": 0, - "change_outnum": 0, - "reservations": [ - { - "txid": "46786d1b31872cef6da1ceb8f222b3a4256fb5ac8c14b9c4c313fc9389e31fb1", - "vout": 1, - "was_reserved": false, - "reserved": true, - "reserved_to_block": 180 - } - ] + "change_outnum": 0 } } ] @@ -11410,6 +13097,9 @@ "description": [ "The **getinfo** gives a summary of the current running node." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": {} @@ -11797,18 +13487,7 @@ "num_pending_channels": 0, "num_active_channels": 0, "num_inactive_channels": 0, - "address": [ - { - "type": "torv3", - "address": "fp463inc4w3lamhhduytrwdwq6q6uzugtaeapylqfc43agrdnnqsheyd.onion", - "port": 9736 - }, - { - "type": "torv3", - "address": "ifnntp5ak4homxrti2fp6ckyllaqcike447ilqfrgdw64ayrmkyashid.onion", - "port": 9736 - } - ], + "address": [], "binding": [ { "type": "ipv4", @@ -11823,10 +13502,10 @@ "fees_collected_msat": "0msat", "lightning-dir": "/media/vincent/Maxtor/C-lightning/node/bitcoin", "our_features": { - "init": "8828226aa2", - "node": "80008828226aa2", + "init": "08a0802a8a59a1", + "node": "88a0802a8a59a1", "channel": "", - "invoice": "20024200" + "invoice": "02000002024100" } } } @@ -11841,6 +13520,9 @@ "description": [ "The **getlog** the RPC command to show logs, with optional log *level*." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -12067,23 +13749,59 @@ "id": "example:getlog#1", "method": "getlog", "params": { - "level": "debug" + "level": "unusual" } }, "response": { - "created_at": "1598192543.820753463", - "bytes_used": 89285843, - "bytes_max": 104857600, + "created_at": "1722303623.956237697", + "bytes_used": 1723719, + "bytes_max": 10485760, "log": [ { "type": "SKIPPED", - "num_skipped": 45 + "num_skipped": 2927 + }, + { + "type": "UNUSUAL", + "time": "59.598510878", + "node_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "source": "chan#1", + "log": "No peer channel with scid=6250403x3681116x19863" + }, + { + "type": "SKIPPED", + "num_skipped": 1183 + }, + { + "type": "UNUSUAL", + "time": "71.923794351", + "node_id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "source": "chan#2", + "log": "Peer permanent failure in CLOSINGD_COMPLETE: Funding transaction spent (reason=unknown)" + }, + { + "type": "SKIPPED", + "num_skipped": 557 + }, + { + "type": "BROKEN", + "time": "89.108598990", + "source": "plugin-topology", + "log": "DEPRECATED API USED: listchannels.include_private by \\\"-c:listchannels#114/cln:listchannels#175\\\"" + }, + { + "type": "SKIPPED", + "num_skipped": 1246 }, { - "type": "INFO", - "time": "0.453627568", - "source": "plugin-autopilot.py", - "log": "RPCmethod'autopilot-run-once'doesnothaveadocstring." + "type": "UNUSUAL", + "time": "95.217065000", + "source": "plugin-cln-renepay", + "log": "Failed to update hint channel 111x1x0: Failed to update scid=111x1x0 in the local_gossmods." + }, + { + "type": "SKIPPED", + "num_skipped": 1696 } ] } @@ -12101,6 +13819,9 @@ "", "There are two considerations for how good a route is: how low the fees are, and how long your payment will get stuck in a delayed output if a node goes down during the process. ." ], + "categories": [ + "readonly" + ], "request": { "required": [ "id", @@ -12460,35 +14181,26 @@ "id": "example:getroute#1", "method": "getroute", "params": { - "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "amount_msat": 50000000, - "riskfactor": 1, - "cltv": 9 + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "riskfactor": 1 } }, "response": { "route": [ - { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "channel": "103x3x0", - "direction": 1, - "amount_msat": 50001002, - "delay": 21, - "style": "tlv" - }, { "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "channel": "103x1x0", + "channel": "109x1x1", "direction": 1, - "amount_msat": 50000501, + "amount_msat": 10001, "delay": 15, "style": "tlv" }, { - "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "channel": "103x2x0", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "channel": "111x1x0", "direction": 0, - "amount_msat": 50000000, + "amount_msat": 10000, "delay": 9, "style": "tlv" } @@ -12500,26 +14212,27 @@ "id": "example:getroute#2", "method": "getroute", "params": { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "amount_msat": "50000sat", - "riskfactor": 10 + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "amount_msat": 500000, + "riskfactor": 10, + "cltv": 9 } }, "response": { "route": [ { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "channel": "103x2x0", - "direction": 1, - "amount_msat": 50051000, + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "channel": "111x1x0", + "direction": 0, + "amount_msat": 500006, "delay": 15, "style": "tlv" }, { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "channel": "103x1x0", + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "channel": "113x1x1", "direction": 0, - "amount_msat": 50000000, + "amount_msat": 500000, "delay": 9, "style": "tlv" } @@ -12528,6 +14241,180 @@ } ] }, + "lightning-getroutes.json": { + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "getroutes", + "title": "Command for routing a payment (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **getroutes** RPC command attempts to find the best set of paths for the payment from *source* to *destination* of *amount_msat*, using the given *layers* on top of the gossip information. The result is constrained by *maxfee*, and will arrive at the destiation with *finalcltv*.", + "", + "Layers are generally maintained by plugins, either to contain persistent information about capacities which have been discovered, or to contain transient information for this particular payment (such as blinded paths or routehints).", + "", + "There are two automatic layers: *auto.localchans* contains information on local channels from this node (including non-public ones), and their exact current spendable capacities, and *auto.sourcefree* overrides all channels leading out of the *source* to be zero fee and zero delay. These are both useful in the case where the source is the current node." + ], + "categories": [ + "readonly" + ], + "request": { + "required": [ + "source", + "destination", + "amount_msat", + "layers", + "maxfee_msat", + "finalcltv" + ], + "properties": { + "source": { + "type": "pubkey", + "description": [ + "Node pubkey to start the paths" + ] + }, + "destination": { + "type": "pubkey", + "description": [ + "Node pubkey to end the paths" + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "Amount to send. It can be a whole number, or a whole number ending in *msat* or *sat*, or a number with three decimal places ending in *sat*, or a number with 1 to 11 decimal places ending in *btc*." + ] + }, + "layers": { + "type": "array", + "items": { + "type": "string", + "description": [ + "Layer to apply to the gossip map before attempting to find routes." + ] + } + }, + "maxfee_msat": { + "type": "msat", + "description": [ + "Maximum fee to spend: we will never return a set of routes more expensive than this. It can be a whole number, or a whole number ending in *msat* or *sat*, or a number with three decimal places ending in *sat*, or a number with 1 to 11 decimal places ending in *btc*." + ] + }, + "finalcltv": { + "type": "u32", + "description": [ + "Number of blocks for the final node. We need to know this because no HTLC is allowed to have a CLTV delay more than 2016 blocks." + ] + } + } + }, + "response": { + "required": [ + "probability_ppm", + "routes" + ], + "properties": { + "probability_ppm": { + "type": "u64", + "description": [ + "The estimated probability of success using these routes, in millionths." + ] + }, + "routes": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "probability_ppm", + "amount_msat", + "path" + ], + "properties": { + "probability_ppm": { + "type": "u64", + "description": [ + "The estimated probability of success using this route, in millionths." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount delivered to the *destination* by this path." + ] + }, + "path": { + "type": "array", + "description": [ + "The hops to get from *source* to *destination*." + ], + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "short_channel_id", + "direction", + "next_node_id", + "amount_msat", + "delay" + ], + "properties": { + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The channel joining these nodes." + ] + }, + "direction": { + "type": "u32", + "description": [ + "0 if this channel is traversed from lesser to greater **id**, otherwise 1." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount to send into this hop." + ] + }, + "next_node_id": { + "type": "pubkey", + "description": [ + "The peer id at the end of this hop." + ] + }, + "delay": { + "type": "u32", + "description": [ + "The total CLTV expected by the node at the start of this hop." + ] + } + } + } + } + } + } + } + } + }, + "author": [ + "<> wrote the minimum-cost-flow solver, Rusty Russell <> wrote the API and this documentation." + ], + "see_also": [ + "lightning-askrene-reserve(7)", + "lightning-askrene-unreserve(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-report(7)", + "lightning-askrene-age(7)" + ], + "resources": [ + "Main web site: " + ] + }, "lightning-help.json": { "$schema": "../rpc-schema-draft.json", "type": "object", @@ -12561,10 +14448,7 @@ "type": "object", "additionalProperties": true, "required": [ - "command", - "category", - "description", - "verbose" + "command" ], "properties": { "command": { @@ -12572,24 +14456,6 @@ "description": [ "The command." ] - }, - "category": { - "type": "string", - "description": [ - "The category for this command (useful for grouping)." - ] - }, - "description": { - "type": "string", - "description": [ - "A one-line description of the purpose of this command." - ] - }, - "verbose": { - "type": "string", - "description": [ - "A full description of this command (including whether it's deprecated)." - ] } } } @@ -12629,10 +14495,7 @@ "response": { "help": [ { - "command": "pay bolt11 [amount_msat] [label] [riskfactor] [maxfeepercent] [retry_for] [maxdelay] [exemptfee] [localinvreqid] [exclude] [maxfee] [description] [dev_use_shadow]", - "category": "plugin", - "description": "Send payment specified by {bolt11}", - "verbose": "Attempt to pay the {bolt11} invoice." + "command": "pay bolt11 [amount_msat] [label] [riskfactor] [maxfeepercent] [retry_for] [maxdelay] [exemptfee] [localinvreqid] [exclude] [maxfee] [description] [partial_msat] [dev_use_shadow]" } ], "format-hint": "simple" @@ -12649,10 +14512,7 @@ "response": { "help": [ { - "command": "dev subcommand=crash|rhash|slowcmd", - "category": "developer", - "description": "Developer command test multiplexer", - "verbose": "dev rhash {secret}\n\tShow SHA256 of {secret}\ndev crash\n\tCrash lightningd by calling fatal()\ndev slowcmd {msec}\n\tTorture test for slow commands, optional {msec}\n" + "command": "dev subcommand=crash|rhash|slowcmd" } ], "format-hint": "simple" @@ -12867,20 +14727,17 @@ "id": "example:invoice#1", "method": "invoice", "params": { - "amount_msat": 11000000, - "label": "xEoCR94SIz6UIRUEkxum", - "description": [ - "XEoCR94SIz6UIRUEkxum." - ] + "amount_msat": 10000, + "label": "lbl_l31", + "description": "Invoice description l31" } }, "response": { - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", - "expires_at": 1706757730, - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk", - "payment_secret": "82644944d3f70d42aad1d5f7b5d7a629e7afa30b529cc952a4c59fc0e3790ea2", - "created_index": 1, - "warning_deadends": "Insufficient incoming capacity, once dead-end peers were excluded" + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", + "expires_at": 1722908474, + "bolt11": "lnbcrt100n1pn2s396sp5v3en0qa3rrljw4m0wtz88sx99q20rarufhjpfysefhwhs42gvqjqpp56kvvl33d594nsxu0hzhesvazgqzlwv89fnpjcvtlanz3rl7x623qdp9f9h8vmmfvdjjqer9wd3hy6tsw35k7m3qdsenzxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq7za6z8kx2k5nul45zwttfz2njx3836v69mxqsl4ty9228pyjrkfnkymysy8ygsrrje9qf6j4tpalt5qkqusfp2esrsqc5ak7t4yzajgpezef54", + "payment_secret": "64733783b118ff27576f72c473c0c52814f1f47c4de41492194ddd7855486024", + "created_index": 2 } }, { @@ -12888,18 +14745,17 @@ "id": "example:invoice#2", "method": "invoice", "params": { - "amount_msat": 100, - "label": "8", - "description": "inv" + "amount_msat": "50000msat", + "label": "lbl_l32", + "description": "l32 description" } }, "response": { - "payment_hash": "f59ae0204dfe8e913207ea36646255b9d2c7c8229e8693d30547fc622eddb6b4", - "expires_at": 1709229182, - "bolt11": "lnbcrt1n1pja0z07sp5n8fk890nrq7zlcue0lgu7cduaaz765u5rg0kcud4amphuppu8wxspp57kdwqgzdl68fzvs8agmxgcj4h8fv0jpzn6rf85c9gl7xytkak66qdq9d9h8vxqyjw5qcqp99qxpqysgqrneaxh0plvjft457yv3q92rak57a6xw33m6phr0mrsy69sudzgez3adkzdsgwzy32z5usjpxm4rjgcg70h047wf0pgc4l9gyaj2h9ssqcrtv32", - "payment_secret": "99d36395f3183c2fe3997fd1cf61bcef45ed53941a1f6c71b5eec37e043c3b8d", - "created_index": 9, - "warning_capacity": "Insufficient incoming channel capacity to pay invoice" + "payment_hash": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "expires_at": 1722908474, + "bolt11": "lnbcrt500n1pn2s396sp5h5tz6fpm3dxvrlwcnwmfq85v45wfj43mdmplpce6ku2vmfdhrx5qpp50z9w5u57meydx9dpn889mmtkz6tqrfsa65hfwd88ql4hc5hyu70qdqcdsenygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqt5m8qx0t25a0gygya7u4sxulyyp2dec87pwsxuuwtg0u66c07703g9j6vlwgmlhqk7qgn95qw7allhnuj2m9hf0xkcr2zkaxltv3t6gqjcdpll", + "payment_secret": "bd162d243b8b4cc1fdd89bb6901e8cad1c99563b6ec3f0e33ab714cda5b719a8", + "created_index": 3 } } ] @@ -13033,17 +14889,34 @@ "request": { "id": "example:invoicerequest#1", "method": "invoicerequest", + "params": { + "amount": 1000000, + "description": "Simple test" + } + }, + "response": { + "invreq_id": "93f193cd2432d292f8b64af08942989d71c0a0366fb52d57ddb688c8fb066399", + "active": true, + "single_use": true, + "bolt12": "lnr1qqgypua5g7rp293k00s66ayvnv26czst2d5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gps7sjqtqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e7pq947t0ks7a4yejz8w79x4zj25s3pu6zrnw2e0v2ugdescpcqsq307z4p2dlxe92fv7xd43qut0pjkg4y094hupqyhsj8dlhvmmfng6sv", + "used": false + } + }, + { + "request": { + "id": "example:invoicerequest#2", + "method": "invoicerequest", "params": { "amount": "10000sat", - "description": "simple test", - "issuer": "clightning test suite" + "description": "Requesting for invoice", + "issuer": "clightning store" } }, "response": { - "invreq_id": "715484ead84bcdae5b33e3015c686fa1bdd4ae9ade3c4729b58257a98cfcd9b5", + "invreq_id": "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9", "active": true, "single_use": true, - "bolt12": "lnr1qqgteyhfyp40c79a5y3gfe33nxfs6zstwd5k6urvv5s8getnwsfp2cmvd9nksarwd9hxwgr5v4ehggrnw45hge2syqrzymjxzydqkkw24ufxqslttwlj3s608f0rx2slc7etw0833zgs75srnztgqkppqfnwgkvdr57yzh6h92zg3qctvrm7w38djg67kzcm4yeg8vc4cq633uzq99smfawuu6pz0zh9jl6dl8v25u3kzes975x2j9tr0qp0ux0tlzcxjrgehxh9luz5vwjpk92tys9f9zlm038krcz4uqfxgelwf43tgfc", + "bolt12": "lnr1qqgx5t5hcw5ru9fgkhgxj4thjq4ugzsk2fjhzat9wd6xjmn8ypnx7u3qd9h8vmmfvdj3yyrrd35kw6r5de5kueeqwd6x7un92qsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzr6jqwvfdqzcyypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgpvamrunx5t6vdaeu7nmmlh5u6f0dnscasy2alyxq79f5wnc043gxrzyqt640dmuj7c94644j5ae6wfse7tsejwqnmc575ly9t38h4hf", "used": false } } @@ -13286,12 +15159,12 @@ }, "response": { "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "payment_hash": "b6f88603008a9f7dd84b1b94c7b972c8efbaf0b86c8d3c04512955992da9028e", - "created_at": 1706315742.6861734, + "payment_hash": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", + "created_at": 1722303677.1300898, "parts": 1, "amount_msat": 10000, "amount_sent_msat": 10001, - "payment_preimage": "7178cf708e34dce816fc35aa692a65e1f85b92ae03bbc8ae6543302511823174", + "payment_preimage": "0d802c9c611bae611d51afa8ddf396df8ba4e0580a2eccfd1120da97e70482a0", "status": "complete" } }, @@ -13300,7 +15173,7 @@ "id": "example:keysend#2", "method": "keysend", "params": { - "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", "amount_msat": 10000000, "extratlvs": { "133773310": "68656c6c6f776f726c64", @@ -13309,13 +15182,13 @@ } }, "response": { - "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "payment_hash": "e8474eea8d5673e8407ef5f4924e58479b51a68afd136384683d5d6a97c9520d", - "created_at": 1708640424.1810749, + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "payment_hash": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "created_at": 1722303679.3164163, "parts": 1, "amount_msat": 10000000, - "amount_sent_msat": 10000000, - "payment_preimage": "40e47272ea7da20c57a2381d81a5513ec03bd8ead9d51fbd2a91ec76d3f4bcbf", + "amount_sent_msat": 10000202, + "payment_preimage": "f76d6b7ef362f33e25eb5571e616f6e539a2c77caf0afa4227d1351546823664", "status": "complete" } }, @@ -13329,33 +15202,24 @@ "routehints": [ [ { - "scid": "4615051x2233541x57738", + "scid": "6250403x3681116x19863", "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "feebase": 1, + "feebase": "1msat", "feeprop": 10, "expirydelta": 9 } - ], - [ - { - "scid": "1x2x3", - "id": "020202020202020202020202020202020202020202020202020202020202020202", - "feebase": 1, - "feeprop": 1, - "expirydelta": 9 - } ] ] } }, "response": { "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "payment_hash": "56e12e6f45120bef7385c9bf307319eaa6a1b9160cdb3e62a3f492abf5bfa4bc", - "created_at": 1708640437.2895157, - "parts": 1, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "created_at": 1722303682.5805738, + "parts": 2, "amount_msat": 10000, "amount_sent_msat": 10001, - "payment_preimage": "682870b8f96e2aed1c86694dbb2c3e64cd396b9bba9fafd824d90eb0bd371b85", + "payment_preimage": "4dad6dcf625f650a35a8199fbda18ea4f6717cdfadb40e6bed2bf5f96a4742b0", "status": "complete" } } @@ -13372,6 +15236,9 @@ "", "Only one of *short_channel_id*, *source* or *destination* can be supplied. If nothing is supplied, data on all lightning channels known to this node, are returned. These can be local channels or public channels broadcast on the gossip network." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -13550,11 +15417,48 @@ "id": "example:listchannels#1", "method": "listchannels", "params": { - "short_channel_id": "103x1x0" + "short_channel_id": "109x1x1" } }, "response": { - "channels": [] + "channels": [ + { + "source": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "short_channel_id": "109x1x1", + "direction": 0, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 0, + "active": true, + "last_update": 1722303662, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "short_channel_id": "109x1x1", + "direction": 1, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 1, + "active": true, + "last_update": 1722303662, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + } + ] } }, { @@ -13567,15 +15471,87 @@ "channels": [ { "source": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "short_channel_id": "103x1x0", + "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "short_channel_id": "109x1x1", + "direction": 0, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 0, + "active": true, + "last_update": 1722303662, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "short_channel_id": "109x1x1", + "direction": 1, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 1, + "active": true, + "last_update": 1722303662, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "111x1x0", + "direction": 0, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 2, + "active": false, + "last_update": 1722303692, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "short_channel_id": "111x1x0", + "direction": 1, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 1, + "active": true, + "last_update": 1722303669, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "short_channel_id": "113x1x1", "direction": 0, "public": true, "amount_msat": 1000000000, "message_flags": 1, "channel_flags": 0, "active": true, - "last_update": 1706153393, + "last_update": 1722303669, "base_fee_millisatoshi": 1, "fee_per_millionth": 10, "delay": 6, @@ -13584,16 +15560,88 @@ "features": "" }, { - "source": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "source": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "113x1x1", + "direction": 1, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 1, + "active": true, + "last_update": 1722303669, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "123x1x1", + "direction": 0, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 0, + "active": true, + "last_update": 1722303711, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "short_channel_id": "103x1x0", + "short_channel_id": "123x1x1", + "direction": 1, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 1, + "active": true, + "last_update": 1722303711, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "short_channel_id": "125x1x1", + "direction": 0, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 0, + "active": true, + "last_update": 1722303714, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "125x1x1", "direction": 1, "public": true, "amount_msat": 1000000000, "message_flags": 1, "channel_flags": 1, "active": true, - "last_update": 1706153393, + "last_update": 1722303714, "base_fee_millisatoshi": 1, "fee_per_millionth": 10, "delay": 6, @@ -13616,6 +15664,9 @@ "description": [ "The **listclosedchannels** RPC command returns data on channels which are otherwise forgotten (more than 100 blocks after they're completely resolved onchain)." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -13890,6 +15941,18 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:listclosedchannels#1", + "method": "listclosedchannels", + "params": {} + }, + "response": { + "closedchannels": [] + } + } ] }, "lightning-listconfigs.json": { @@ -13901,6 +15964,9 @@ "description": [ "The **listconfigs** RPC command to list all configuration options, or with *config* only one." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -16367,102 +18433,191 @@ } }, "response": { - "#version": "v0.9.0-1", - "lightning-dir": "/media/vincent/Maxtor/sanboxTestWrapperRPC/lightning_dir_dev", - "network": "testnet", - "allow-deprecated-apis": true, + "network": "regtest", + "configs": { + "network": { + "value_str": "regtest", + "source": "cmdline" + } + } + } + }, + { + "request": { + "id": "example:listconfigs#2", + "method": "listconfigs", + "params": { + "config": "experimental-dual-fund" + } + }, + "response": { + "experimental-dual-fund": true, + "configs": { + "experimental-dual-fund": { + "set": true, + "source": "cmdline" + } + } + } + }, + { + "request": { + "id": "example:listconfigs#3", + "method": "listconfigs", + "params": {} + }, + "response": { + "# version": "v24.05-190-g5fd2f9c-modded", + "developer": true, + "lightning-dir": "/tmp/.lightning/", + "network": "regtest", "rpc-file": "lightning-rpc", + "allow-deprecated-apis": true, "plugins": [ { - "path": "/home/vincent/Github/plugins/sauron/sauron.py", - "name": "sauron.py", - "options": { - "sauron-api-endpoint": "http://blockstream.info/testnet/api/", - "sauron-tor-proxy": "" - } - }, - { - "path": "/home/vincent/Github/reckless/reckless.py", - "name": "reckless.py" + "path": "/root/lightning/plugins/cln-renepay", + "name": "cln-renepay", + "options": {} } ], "important-plugins": [ { - "path": "/home/vincent/Github/lightning/lightningd/../plugins/autoclean", + "path": "/root/lightning/plugins/autoclean", "name": "autoclean", "options": { - "autocleaninvoice-cycle": null, - "autocleaninvoice-expired-by": null + "autoclean-cycle": 3600, + "dev-autoclean-max-batch": 10000 } }, { - "path": "/home/vincent/Github/lightning/lightningd/../plugins/fundchannel", - "name": "fundchannel" + "path": "/root/lightning/plugins/chanbackup", + "name": "chanbackup" }, { - "path": "/home/vincent/Github/lightning/lightningd/../plugins/keysend", - "name": "keysend" + "path": "/root/lightning/plugins/bcli", + "name": "bcli", + "options": { + "bitcoin-datadir": "/tmp/.lightning/", + "bitcoin-rpcuser": "rpcuser", + "bitcoin-rpcpassword": "rpcpass", + "bitcoin-rpcport": 51251, + "bitcoin-rpcclienttimeout": 60, + "bitcoin-retry-timeout": 60 + } }, { - "path": "/home/vincent/Github/lightning/lightningd/../plugins/pay", - "name": "pay", + "path": "/root/lightning/plugins/commando", + "name": "commando" + }, + { + "path": "/root/lightning/plugins/funder", + "name": "funder", "options": { - "disable-mpp": false + "funder-policy": "fixed", + "funder-policy-mod": "0", + "funder-min-their-funding": "10000sat", + "funder-max-their-funding": "4294967295sat", + "funder-per-channel-min": "10000sat", + "funder-per-channel-max": "4294967295sat", + "funder-reserve-tank": "0sat", + "funder-fuzz-percent": 0, + "funder-fund-probability": 100, + "funder-lease-requests-only": true } + }, + { + "path": "/root/lightning/plugins/topology", + "name": "topology" + }, + { + "path": "/root/lightning/plugins/keysend", + "name": "keysend" + }, + { + "path": "/root/lightning/plugins/offers", + "name": "offers", + "options": {} + }, + { + "path": "/root/lightning/plugins/pay", + "name": "pay", + "options": {} + }, + { + "path": "/root/lightning/plugins/recover", + "name": "recover" + }, + { + "path": "/root/lightning/plugins/txprepare", + "name": "txprepare" + }, + { + "path": "/root/lightning/plugins/spenderp", + "name": "spenderp" + }, + { + "path": "/root/lightning/plugins/sql", + "name": "sql", + "options": {} + }, + { + "path": "/root/lightning/plugins/bookkeeper", + "name": "bookkeeper", + "options": {} } ], - "important-plugin": "/home/vincent/Github/lightning/lightningd/../plugins/pay", - "plugin": "/home/vincent/Github/reckless/reckless.py", - "disable-plugin": [ - "bcli" - ], + "disable-plugin": [], "always-use-proxy": false, - "daemon": "false", - "wallet": "sqlite3:///media/vincent/Maxtor/sanboxTestWrapperRPC/lightning_dir_dev/testnet/lightningd.sqlite3", - "wumbo": true, - "rgb": "03ad98", - "alias": "BRUCEWAYN-TES-DEV", - "pid-file": "/media/vincent/Maxtor/sanboxTestWrapperRPC/lightning_dir_dev/lightningd-testne...", - "ignore-fee-limits": true, - "watchtime-blocks": 6, + "daemon": false, + "wallet": "sqlite3:///tmp/.lightning/regtest/lightningd.sqlite3", + "experimental-dual-fund": true, + "experimental-splicing": false, + "experimental-offers": true, + "experimental-shutdown-wrong-funding": false, + "experimental-peer-storage": false, + "experimental-quiesce": false, + "rgb": "022d22", + "alias": "SILENTARTIST-190-g5fd2f9c-modded", + "pid-file": "/tmp/.lightning/lightningd-regtest.pid", + "ignore-fee-limits": false, + "watchtime-blocks": 5, "funding-confirms": 1, - "commit-fee-min": 0, - "commit-fee-max": 0, + "require-confirmed-inputs": false, "cltv-delta": 6, - "cltv-final": 10, + "cltv-final": 5, "commit-time": 10, "fee-base": 1, - "rescan": 30, + "rescan": 1, "fee-per-satoshi": 10, + "htlc-minimum-msat": 0, + "htlc-maximum-msat": 18446744073709552000, "max-concurrent-htlcs": 483, + "max-dust-htlc-exposure-msat": 50000000, "min-capacity-sat": 10000, - "addr": "autotor:127.0.0.1:9051", - "bind-addr": "127.0.0.1:9735", - "announce-addr": "fp463inc4w3lamhhduytrwdwq6q6uzugtaeapylqfc43agrdnnqsheyd.onion:9735", - "offline": "false", - "autolisten": true, - "proxy": "127.0.0.1:9050", - "disable-dns": "false", + "addr": "127.0.0.1:41219", + "announce-addr-discovered": "auto", + "announce-addr-discovered-port": 19846, + "offline": false, + "autolisten": false, + "disable-dns": true, "encrypted-hsm": false, "rpc-file-mode": "0600", - "log-level": "DEBUG", - "log-prefix": "lightningd" - } - }, - { - "request": { - "id": "example:listconfigs#2", - "method": "listconfigs", - "params": {} - }, - "response": { + "commit-fee": 100, + "commit-feerate-offset": 5, + "min-emergency-msat": 25000000, + "experimental-upgrade-protocol": false, + "invoices-onchain-fallback": false, + "log-level": "debug", + "log-timestamps": true, + "log-prefix": "lightningd-2 ", + "log-file": "/tmp/.lightning/log", "configs": { "developer": { "set": true, "source": "cmdline" }, "lightning-dir": { - "value_str": "/tmp/ltests-giwf5tc7/test_plugin_start_1/lightning-1/", + "value_str": "/tmp/.lightning/", "source": "cmdline" }, "network": { @@ -16490,16 +18645,12 @@ "source": "default" }, "allow-deprecated-apis": { - "value_bool": false, + "value_bool": true, "source": "cmdline" }, "plugin": { - "values_str": [ - "~/lightning/target/debug/examples/cln-plugin-startup" - ], - "sources": [ - "cmdline" - ] + "values_str": [], + "sources": [] }, "plugin-dir": { "values_str": [], @@ -16526,20 +18677,16 @@ "source": "default" }, "experimental-dual-fund": { - "set": false, - "source": "default" + "set": true, + "source": "cmdline" }, "experimental-splicing": { "set": false, "source": "default" }, - "experimental-onion-messages": { - "set": false, - "source": "default" - }, "experimental-offers": { - "set": false, - "source": "default" + "set": true, + "source": "cmdline" }, "experimental-shutdown-wrong-funding": { "set": false, @@ -16553,20 +18700,16 @@ "set": false, "source": "default" }, - "experimental-anchors": { - "set": false, - "source": "default" - }, "rgb": { - "value_str": "0266e4", + "value_str": "022d22", "source": "default" }, "alias": { - "value_str": "JUNIORBEAM-1-102-g7549e10-modded", + "value_str": "SILENTARTIST-190-g5fd2f9c-modded", "source": "default" }, "pid-file": { - "value_str": "/tmp/ltests-giwf5tc7/test_plugin_start_1/lightning-1/lightningd-regtest.pid", + "value_str": "/tmp/.lightning/lightningd-regtest.pid", "source": "default" }, "ignore-fee-limits": { @@ -16577,10 +18720,6 @@ "value_int": 5, "source": "cmdline" }, - "max-locktime-blocks": { - "value_int": 2016, - "source": "default" - }, "funding-confirms": { "value_int": 1, "source": "default" @@ -16636,7 +18775,7 @@ }, "addr": { "values_str": [ - "127.0.0.1:33157" + "127.0.0.1:41219" ], "sources": [ "cmdline" @@ -16706,6 +18845,10 @@ "set": false, "source": "default" }, + "i-promise-to-fix-broken-api-user": { + "values_str": [], + "sources": [] + }, "log-level": { "value_str": "debug", "source": "cmdline" @@ -16715,95 +18858,151 @@ "source": "default" }, "log-prefix": { - "value_str": "lightningd-1 ", + "value_str": "lightningd-2 ", "source": "cmdline" }, "log-file": { "values_str": [ "-", - "/tmp/ltests-giwf5tc7/test_plugin_start_1/lightning-1/log" + "/tmp/.lightning/log" ], "sources": [ "cmdline", "cmdline" ] }, - "dev-no-plugin-checksum": { + "dev-fail-on-subdaemon-fail": { "set": true, "source": "cmdline" }, - "dev-no-reconnect": { - "set": true, + "dev-bitcoind-poll": { + "value_int": 3, "source": "cmdline" }, - "dev-fail-on-subdaemon-fail": { + "dev-fast-gossip": { "set": true, "source": "cmdline" }, - "dev-bitcoind-poll": { - "value_int": 1, + "dev-hsmd-no-preapprove-check": { + "set": true, "source": "cmdline" }, - "dev-fast-gossip": { - "set": true, - "source": "cmdline" + "autoclean-cycle": { + "value_int": 3600, + "source": "default", + "plugin": "/root/lightning/plugins/autoclean", + "dynamic": true + }, + "dev-autoclean-max-batch": { + "value_int": 10000, + "source": "default", + "plugin": "/root/lightning/plugins/autoclean", + "dynamic": true + }, + "bitcoin-datadir": { + "value_str": "/tmp/.lightning/", + "source": "cmdline", + "plugin": "/root/lightning/plugins/bcli" + }, + "bitcoin-rpcuser": { + "value_str": "rpcuser", + "source": "cmdline", + "plugin": "/root/lightning/plugins/bcli" + }, + "bitcoin-rpcpassword": { + "value_str": "rpcpass", + "source": "cmdline", + "plugin": "/root/lightning/plugins/bcli" + }, + "bitcoin-rpcport": { + "value_int": 51251, + "source": "cmdline", + "plugin": "/root/lightning/plugins/bcli" + }, + "bitcoin-rpcclienttimeout": { + "value_int": 60, + "source": "default", + "plugin": "/root/lightning/plugins/bcli" + }, + "bitcoin-retry-timeout": { + "value_int": 60, + "source": "default", + "plugin": "/root/lightning/plugins/bcli" + }, + "funder-policy": { + "value_str": "fixed", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-policy-mod": { + "value_str": "0", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-min-their-funding": { + "value_str": "10000sat", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-max-their-funding": { + "value_str": "4294967295sat", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-per-channel-min": { + "value_str": "10000sat", + "source": "default", + "plugin": "/root/lightning/plugins/funder" }, - "renepay-debug-mcf": { - "set": false, + "funder-per-channel-max": { + "value_str": "4294967295sat", "source": "default", - "plugin": "~/lightning/plugins/cln-renepay" + "plugin": "/root/lightning/plugins/funder" }, - "renepay-debug-payflow": { - "set": false, + "funder-reserve-tank": { + "value_str": "0sat", "source": "default", - "plugin": "~/lightning/plugins/cln-renepay" + "plugin": "/root/lightning/plugins/funder" }, - "test-option": { - "value_int": 31337, - "source": "cmdline", - "plugin": "~/lightning/target/debug/examples/cln-plugin-startup" + "funder-fuzz-percent": { + "value_int": 0, + "source": "default", + "plugin": "/root/lightning/plugins/funder" }, - "bitcoin-datadir": { - "value_str": "/tmp/ltests-giwf5tc7/test_plugin_start_1/lightning-1/", - "source": "cmdline", - "plugin": "~/lightning/plugins/bcli" + "funder-fund-probability": { + "value_int": 100, + "source": "default", + "plugin": "/root/lightning/plugins/funder" }, - "bitcoin-rpcuser": { - "value_str": "rpcuser", - "source": "cmdline", - "plugin": "~/lightning/plugins/bcli" + "funder-lease-requests-only": { + "value_bool": true, + "source": "default", + "plugin": "/root/lightning/plugins/funder" }, - "bitcoin-rpcpassword": { - "value_str": "rpcpass", - "source": "cmdline", - "plugin": "~/lightning/plugins/bcli" + "fetchinvoice-noconnect": { + "set": false, + "source": "default", + "plugin": "/root/lightning/plugins/offers" }, - "bitcoin-rpcport": { - "value_int": 51309, - "source": "cmdline", - "plugin": "~/lightning/plugins/bcli" + "dev-invoice-bpath-scid": { + "set": false, + "source": "default", + "plugin": "/root/lightning/plugins/offers" }, "disable-mpp": { "set": false, "source": "default", - "plugin": "~/lightning/plugins/pay" - } - } - } - }, - { - "request": { - "id": "example:listconfigs#3", - "method": "listconfigs", - "params": { - "config": "experimental-dual-fund" - } - }, - "response": { - "configs": { - "experimental-dual-fund": { + "plugin": "/root/lightning/plugins/pay" + }, + "renepay-debug-mcf": { "set": false, - "source": "default" + "source": "default", + "plugin": "/root/lightning/plugins/cln-renepay" + }, + "renepay-debug-payflow": { + "set": false, + "source": "default", + "plugin": "/root/lightning/plugins/cln-renepay" } } } @@ -16911,12 +19110,22 @@ "method": "listdatastore", "params": { "key": [ - "commando" + "test" ] } }, "response": { - "datastore": [] + "datastore": [ + { + "key": [ + "test", + "name" + ], + "generation": 0, + "hex": "736176696e67206461746120746f207468652073746f7265", + "string": "saving data to the store" + } + ] } }, { @@ -16933,9 +19142,9 @@ "key": [ "otherkey" ], - "generation": 0, - "hex": "6f7468657264617461", - "string": "otherdata" + "generation": 1, + "hex": "666f6f626172", + "string": "foobar" } ] } @@ -16951,6 +19160,9 @@ "description": [ "The **listforwards** RPC command displays all htlcs that have been attempted to be forwarded by the Core Lightning node." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -17321,55 +19533,103 @@ "request": { "id": "example:listforwards#1", "method": "listforwards", - "params": {} + "params": { + "in_channel": "109x1x1", + "out_channel": "111x1x0", + "status": "settled" + } }, "response": { "forwards": [ { "created_index": 1, "updated_index": 1, - "in_channel": "103x1x0", - "in_htlc_id": 0, - "out_channel": "104x1x0", - "out_htlc_id": 0, - "in_msat": 100001001, - "out_msat": 100000000, - "fee_msat": 1001, + "in_channel": "109x1x1", + "in_htlc_id": 1, + "out_channel": "111x1x0", + "out_htlc_id": 1, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, "status": "settled", "style": "tlv", - "received_time": 1706229285.5934534, - "resolved_time": 1706229288.830004 + "received_time": 1722303675.3853297, + "resolved_time": 1722303676.8396847 }, { "created_index": 2, "updated_index": 2, - "in_channel": "103x1x0", - "in_htlc_id": 1, - "out_channel": "105x1x0", - "out_htlc_id": 0, - "in_msat": 100001001, - "out_msat": 100000000, - "fee_msat": 1001, - "status": "failed", + "in_channel": "109x1x1", + "in_htlc_id": 2, + "out_channel": "111x1x0", + "out_htlc_id": 2, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, + "status": "settled", "style": "tlv", - "received_time": 1706229290.0289993, - "resolved_time": 1706229292.9487684 + "received_time": 1722303677.6214294, + "resolved_time": 1722303679.0363395 }, { "created_index": 3, "updated_index": 3, - "in_channel": "103x1x0", - "in_htlc_id": 2, - "out_channel": "106x1x0", - "out_htlc_id": 0, - "in_msat": 100001000, - "out_msat": 99999999, - "fee_msat": 1001, - "status": "local_failed", - "failcode": 16392, - "failreason": "WIRE_PERMANENT_CHANNEL_FAILURE", + "in_channel": "109x1x1", + "in_htlc_id": 3, + "out_channel": "111x1x0", + "out_htlc_id": 3, + "in_msat": 10000202, + "out_msat": 10000101, + "fee_msat": 101, + "status": "settled", + "style": "tlv", + "received_time": 1722303679.8093705, + "resolved_time": 1722303682.2599013 + }, + { + "created_index": 5, + "updated_index": 4, + "in_channel": "109x1x1", + "in_htlc_id": 5, + "out_channel": "111x1x0", + "out_htlc_id": 4, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303684.4914763, + "resolved_time": 1722303685.8940926 + }, + { + "created_index": 6, + "updated_index": 5, + "in_channel": "109x1x1", + "in_htlc_id": 6, + "out_channel": "111x1x0", + "out_htlc_id": 5, + "in_msat": 50001, + "out_msat": 50000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303686.7160892, + "resolved_time": 1722303688.1316907 + }, + { + "created_index": 7, + "updated_index": 6, + "in_channel": "109x1x1", + "in_htlc_id": 7, + "out_channel": "111x1x0", + "out_htlc_id": 7, + "in_msat": 1002, + "out_msat": 1001, + "fee_msat": 1, + "status": "settled", "style": "tlv", - "received_time": 1706229295.3175724 + "received_time": 1722303689.9082303, + "resolved_time": 1722303692.3156552 } ] } @@ -17378,14 +19638,125 @@ "request": { "id": "example:listforwards#2", "method": "listforwards", - "params": { - "in_channel": "0x1x2", - "out_channel": "0x2x3", - "status": "settled" - } + "params": {} }, "response": { - "forwards": [] + "forwards": [ + { + "created_index": 1, + "updated_index": 1, + "in_channel": "109x1x1", + "in_htlc_id": 1, + "out_channel": "111x1x0", + "out_htlc_id": 1, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303675.3853297, + "resolved_time": 1722303676.8396847 + }, + { + "created_index": 2, + "updated_index": 2, + "in_channel": "109x1x1", + "in_htlc_id": 2, + "out_channel": "111x1x0", + "out_htlc_id": 2, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303677.6214294, + "resolved_time": 1722303679.0363395 + }, + { + "created_index": 3, + "updated_index": 3, + "in_channel": "109x1x1", + "in_htlc_id": 3, + "out_channel": "111x1x0", + "out_htlc_id": 3, + "in_msat": 10000202, + "out_msat": 10000101, + "fee_msat": 101, + "status": "settled", + "style": "tlv", + "received_time": 1722303679.8093705, + "resolved_time": 1722303682.2599013 + }, + { + "created_index": 4, + "in_channel": "109x1x1", + "in_htlc_id": 4, + "out_channel": "6250403x3681116x19863", + "in_msat": 10001, + "status": "local_failed", + "failcode": 16394, + "failreason": "WIRE_UNKNOWN_NEXT_PEER", + "style": "tlv", + "received_time": 1722303683.0972922 + }, + { + "created_index": 5, + "updated_index": 4, + "in_channel": "109x1x1", + "in_htlc_id": 5, + "out_channel": "111x1x0", + "out_htlc_id": 4, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303684.4914763, + "resolved_time": 1722303685.8940926 + }, + { + "created_index": 6, + "updated_index": 5, + "in_channel": "109x1x1", + "in_htlc_id": 6, + "out_channel": "111x1x0", + "out_htlc_id": 5, + "in_msat": 50001, + "out_msat": 50000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303686.7160892, + "resolved_time": 1722303688.1316907 + }, + { + "created_index": 7, + "updated_index": 6, + "in_channel": "109x1x1", + "in_htlc_id": 7, + "out_channel": "111x1x0", + "out_htlc_id": 7, + "in_msat": 1002, + "out_msat": 1001, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303689.9082303, + "resolved_time": 1722303692.3156552 + }, + { + "created_index": 8, + "in_channel": "109x1x1", + "in_htlc_id": 8, + "out_channel": "111x1x0", + "in_msat": 10001, + "status": "local_failed", + "failcode": 16394, + "failreason": "WIRE_UNKNOWN_NEXT_PEER", + "style": "tlv", + "received_time": 1722303697.0961268 + } + ] } } ] @@ -17399,6 +19770,9 @@ "description": [ "The **listfunds** RPC command displays all funds available, either in unspent outputs (UTXOs) in the internal wallet or funds locked in currently open channels." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -17743,27 +20117,49 @@ "response": { "outputs": [ { - "txid": "0f184b101569bf777af3449fa266948a9d55768f97867e48416a2c92858dd1bc", - "output": 1, - "amount_msat": 1111111000, - "scriptpubkey": "001401fad90abcd66697e2592164722de4a95ebee165", - "address": "bcrt1qq8adjz4u6enf0cjey9j8yt0y490tact93fzgsf", + "txid": "9454852bb62e304ee8933662284e10bd22a7f3710c262da4c94bdcc8b05ae407", + "output": 0, + "amount_msat": 19993653000, + "scriptpubkey": "51206c27e1956acfa61e68292c80908880e813450f754132e8a2ac471a86bf1326b5", + "address": "bcrt1pdsn7r9t2e7npu6pf9jqfpzyqaqf52rm4gyew3g4vgudgd0cny66srft45s", "status": "confirmed", - "blockheight": 102, + "blockheight": 103, "reserved": false }, { - "txid": "4bee7dc3a28f2434e9bb3e9aaab418dd276485a8705b0f787bf741d3f979ec3b", - "output": 1, - "amount_msat": 1111111000, - "scriptpubkey": "001401fad90abcd66697e2592164722de4a95ebee165", - "address": "bcrt1qq8adjz4u6enf0cjey9j8yt0y490tact93fzgsf", + "txid": "7547ffc11396c62852104f7100d5ca27a2b9c0d5d43d08122147b2b03eb157a5", + "output": 0, + "amount_msat": 2000000000, + "scriptpubkey": "00149fb67bfcefee6cb7db4c7e55d9c6bfd749e31d1e", + "address": "bcrt1qn7m8hl80aekt0k6v0e2an34l6ay7x8g703x07y", "status": "confirmed", - "blockheight": 102, + "blockheight": 108, + "reserved": false + }, + { + "txid": "737d6835ddafd515ba9e9def733bb4e4211f6053a32b1422bf1c8cc240850f96", + "output": 0, + "amount_msat": 198995073000, + "scriptpubkey": "512035f1184f6b470c9df347da62c4b28e7ec9ee10b220bac3accd22209def0036ea", + "address": "bcrt1pxhc3snmtguxfmu68mf3vfv5w0my7uy9jyzav8txdygsfmmcqxm4q0mms62", + "status": "confirmed", + "blockheight": 109, "reserved": false } ], - "channels": [] + "channels": [ + { + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "connected": true, + "state": "CHANNELD_NORMAL", + "channel_id": "252d1b0a1e57895e84137f28cf19ab2c35847e284c112fefdecc7afeaa5c1de7", + "short_channel_id": "109x1x1", + "our_amount_msat": 490518792, + "amount_msat": 1000000000, + "funding_txid": "737d6835ddafd515ba9e9def733bb4e4211f6053a32b1422bf1c8cc240850f96", + "funding_output": 1 + } + ] } } ] @@ -17777,6 +20173,9 @@ "description": [ "The **listhtlcs** RPC command gets all HTLCs (which, generally, we remember for as long as a channel is open, even if they've completed long ago)." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -17895,45 +20294,110 @@ "request": { "id": "example:listhtlcs#1", "method": "listhtlcs", - "params": {} + "params": [ + "109x1x1" + ] }, "response": { "htlcs": [ { - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "id": 0, - "expiry": 117, + "expiry": 126, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "d2668e77c5a2220496e813de36f1fc09ba804b16af4c6bb38299d8a6eb8a5f10", + "amount_msat": 500000000, + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "id": 1, - "expiry": 117, + "expiry": 136, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "286e08ac8f575f10508d751fcfc93871b4344271967c7b9e5eacb3f3573b8307", + "amount_msat": 10001, + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "id": 2, - "expiry": 135, + "expiry": 149, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "3e4baa750ee3dfb934578f041ccb40b87432bf37ec65c9d7bce5ff28fecbd95f", + "amount_msat": 10001, + "payment_hash": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "id": 3, - "expiry": 135, + "expiry": 155, + "direction": "out", + "amount_msat": 10000202, + "payment_hash": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 4, + "expiry": 152, + "direction": "out", + "amount_msat": 10001, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 5, + "expiry": 149, + "direction": "out", + "amount_msat": 10001, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 6, + "expiry": 132, + "direction": "out", + "amount_msat": 50001, + "payment_hash": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 7, + "expiry": 142, + "direction": "out", + "amount_msat": 1002, + "payment_hash": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 8, + "expiry": 137, + "direction": "out", + "amount_msat": 10001, + "payment_hash": "968c136c07c39b17d1925358dd36f5dd86f8691c666ec27f24de5a84d590dc49", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 0, + "expiry": 136, + "direction": "in", + "amount_msat": 1000000, + "payment_hash": "a003badd6ad30f05f56e3607fd538456b05b9aad6135a494dad5320010af5844", + "state": "SENT_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 9, + "expiry": 136, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "4c3ce32565dc10ef2bd230c32802ce2fe8b007208c0a90757aa289f75c994d49", - "state": "SENT_REMOVE_REVOCATION" + "amount_msat": 400000, + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "state": "RCVD_REMOVE_ACK_REVOCATION" } ] } @@ -17942,86 +20406,107 @@ "request": { "id": "example:listhtlcs#2", "method": "listhtlcs", - "params": [ - "103x2x0" - ] + "params": {} }, "response": { "htlcs": [ { - "short_channel_id": "103x2x0", + "short_channel_id": "109x1x1", "id": 0, - "expiry": 117, + "expiry": 126, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "12bb14b1d119e1ae0759e5ff6f1f6653e3fd8f71ea59411500d2871404a47a98", + "amount_msat": 500000000, + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x2x0", + "short_channel_id": "109x1x1", "id": 1, - "expiry": 117, + "expiry": 136, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "57d950209cc0b4fcc5e3027569232f96cf83ef85314c6b139a5713848d811a66", + "amount_msat": 10001, + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x2x0", + "short_channel_id": "109x1x1", "id": 2, - "expiry": 135, + "expiry": 149, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "45ad4654715411a07a0ad6ec3f4bfaa918c90e3d1934b10b1c1c5846523ddd7f", + "amount_msat": 10001, + "payment_hash": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x2x0", + "short_channel_id": "109x1x1", "id": 3, - "expiry": 135, + "expiry": 155, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "cc0dcd214aa71c62bfba711a0746da821f2cdba1770b11c225920bdde12c931e", + "amount_msat": 10000202, + "payment_hash": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", "state": "RCVD_REMOVE_ACK_REVOCATION" - } - ] - } - }, - { - "request": { - "id": "example:listhtlcs#3", - "method": "listhtlcs", - "params": [ - "436c2658eb4f4689b42ff11b8b05f31ba09860d0df7168085e0796cdf40f85e0" - ] - }, - "response": { - "htlcs": [ + }, { - "short_channel_id": "103x1x0", - "id": 0, - "expiry": 124, + "short_channel_id": "109x1x1", + "id": 4, + "expiry": 152, "direction": "out", - "amount_msat": 1001, - "payment_hash": "2ab653668c8017ff2f36ac36678a8da04e11380bd9580a2926b170523b0c6e3b", + "amount_msat": 10001, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x1x0", - "id": 1, - "expiry": 124, + "short_channel_id": "109x1x1", + "id": 5, + "expiry": 149, "direction": "out", - "amount_msat": 2001, - "payment_hash": "92f889cb2e48aa28e1e577228b907cdbcc371a2c018e9c8f60fa7036e232cf1d", + "amount_msat": 10001, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x1x0", - "id": 2, - "expiry": 128, + "short_channel_id": "109x1x1", + "id": 6, + "expiry": 132, + "direction": "out", + "amount_msat": 50001, + "payment_hash": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 7, + "expiry": 142, + "direction": "out", + "amount_msat": 1002, + "payment_hash": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 8, + "expiry": 137, "direction": "out", - "amount_msat": 4001, - "payment_hash": "14ef01c9fb12d7dcac288f48ce87b19a7d5c3d5779aaed1e4adcb5c5d0e9fa45", + "amount_msat": 10001, + "payment_hash": "968c136c07c39b17d1925358dd36f5dd86f8691c666ec27f24de5a84d590dc49", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 0, + "expiry": 136, + "direction": "in", + "amount_msat": 1000000, + "payment_hash": "a003badd6ad30f05f56e3607fd538456b05b9aad6135a494dad5320010af5844", + "state": "SENT_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 9, + "expiry": 136, + "direction": "out", + "amount_msat": 400000, + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", "state": "RCVD_REMOVE_ACK_REVOCATION" } ] @@ -18039,6 +20524,9 @@ "description": [ "The **listinvoicerequests** RPC command gets the status of a specific `invoice_request`, if it exists, or the status of all `invoice_requests` if given no argument." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -18132,16 +20620,41 @@ "id": "example:listinvoicerequests#1", "method": "listinvoicerequests", "params": [ - "cf0b41d4eb248d975909deb9accf9722b1c86839de80ee8815ce907bbb700a1d" + "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9" ] }, "response": { "invoicerequests": [ { - "invreq_id": "cf0b41d4eb248d975909deb9accf9722b1c86839de80ee8815ce907bbb700a1d", - "active": true, + "invreq_id": "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9", + "active": false, + "single_use": true, + "bolt12": "lnr1qqgx5t5hcw5ru9fgkhgxj4thjq4ugzsk2fjhzat9wd6xjmn8ypnx7u3qd9h8vmmfvdj3yyrrd35kw6r5de5kueeqwd6x7un92qsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzr6jqwvfdqzcyypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgpvamrunx5t6vdaeu7nmmlh5u6f0dnscasy2alyxq79f5wnc043gxrzyqt640dmuj7c94644j5ae6wfse7tsejwqnmc575ly9t38h4hf", + "used": false + } + ] + } + }, + { + "request": { + "id": "example:listinvoicerequests#2", + "method": "listinvoicerequests", + "params": {} + }, + "response": { + "invoicerequests": [ + { + "invreq_id": "93f193cd2432d292f8b64af08942989d71c0a0366fb52d57ddb688c8fb066399", + "active": false, + "single_use": true, + "bolt12": "lnr1qqgypua5g7rp293k00s66ayvnv26czst2d5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gps7sjqtqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e7pq947t0ks7a4yejz8w79x4zj25s3pu6zrnw2e0v2ugdescpcqsq307z4p2dlxe92fv7xd43qut0pjkg4y094hupqyhsj8dlhvmmfng6sv", + "used": true + }, + { + "invreq_id": "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9", + "active": false, "single_use": true, - "bolt12": "lnr1qqgx9ag7nmtns87htndlgcfndlq0wzstwd5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gzqta0pqpvzzqnxu3vc68fug904w25y3zpskc8huazwmy34av93h2fjswe3tsp4rrcyps5sf5jwnn2tr3ghn32mdta8jvax62pwzhna8sktmaezl3f4s3zy35gx6dfay7r8zn299uwr7ugpze74zft4m8q3fnk2sr0ljqpve3jq", + "bolt12": "lnr1qqgx5t5hcw5ru9fgkhgxj4thjq4ugzsk2fjhzat9wd6xjmn8ypnx7u3qd9h8vmmfvdj3yyrrd35kw6r5de5kueeqwd6x7un92qsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzr6jqwvfdqzcyypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgpvamrunx5t6vdaeu7nmmlh5u6f0dnscasy2alyxq79f5wnc043gxrzyqt640dmuj7c94644j5ae6wfse7tsejwqnmc575ly9t38h4hf", "used": false } ] @@ -18160,6 +20673,9 @@ "", "Only one of the query parameters can be used from *label*, *invstring*, *payment_hash*, or *offer_id*." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -18455,22 +20971,151 @@ "id": "example:listinvoices#1", "method": "listinvoices", "params": { - "label": "xEoCR94SIz6UIRUEkxum" + "label": "lbl_l21" } }, "response": { "invoices": [ { - "label": "xEoCR94SIz6UIRUEkxum", - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk", - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", - "amount_msat": 11000000, + "label": "lbl_l21", + "bolt11": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7", + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "status": "paid", + "pay_index": 3, + "amount_received_msat": 400000, + "paid_at": 1722303718, + "payment_preimage": "af67b48518e78e157db404d13cb42987c31e034634203d10b224302b05fc6c90", + "description": "l21 description", + "expires_at": 1722908486, + "created_index": 2, + "updated_index": 3 + } + ] + } + }, + { + "request": { + "id": "example:listinvoices#2", + "method": "listinvoices", + "params": {} + }, + "response": { + "invoices": [ + { + "label": "lbl balance l1 to l2", + "bolt11": "lnbcrt5m1pn2s39ksp53sknyy2mxxurt4y0wqgp730z0cnm0vz3zmzth8p79xsrtmg5llxspp5dp94v59nm6c99jf7lc07zmnhqw6kyujx3mkdav7643dczgtdedfqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcvfqw3hjqmpjxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqdz9cftkxe6kcqfddyrvr7j57ulsfxxxkgkjyhr3k77n8v59mzs5rmuexz9lxusyhhehlemd9ujclgahln8e0n8y86stc7u8uys6mjqgqerm6q4", + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", + "amount_msat": 500000000, + "status": "paid", + "pay_index": 1, + "amount_received_msat": 500000000, + "paid_at": 1722303671, + "payment_preimage": "bed4140e1db302720d7f9547dc9127d45b115080447cce7e23cfd00b60991831", + "description": "description send some sats l1 to l2", + "expires_at": 1722908470, + "created_index": 1, + "updated_index": 1 + }, + { + "label": "lbl_l21", + "bolt11": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7", + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "status": "paid", + "pay_index": 3, + "amount_received_msat": 400000, + "paid_at": 1722303718, + "payment_preimage": "af67b48518e78e157db404d13cb42987c31e034634203d10b224302b05fc6c90", + "description": "l21 description", + "expires_at": 1722908486, + "created_index": 2, + "updated_index": 3 + }, + { + "label": "lbl_l22", + "bolt11": "lnbcrt2u1pn2s3xxsp5cpcdj2cy5wpd2nphp2evrp9kqymxf9434zftkmdd6dlgmy8cu78qpp58yq5qf3h0694xwymzjs5e8eejce83vjmxv6cpwqv8cs9e05dxe4qdqcdserygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq9wlpxf8ur0q798646w94tduf6wfkaw7m0ecmxepgatd4utvsyvcy0pku9t8m39rlsjzhe8x53mup5jkn0f84clfj3ctc6qj09t35wxspycpup2", + "payment_hash": "39014026377e8b53389b14a14c9f39963278b25b333580b80c3e205cbe8d366a", + "amount_msat": 200000, + "status": "unpaid", + "description": "l22 description", + "expires_at": 1722908486, + "created_index": 3 + }, + { + "label": "label inv_l24", + "bolt11": "lnbcrt1230n1pn2s38psp5jf2zk7py4wmutyq4pdr6783egft24nkyhfrxegrzzqnef2matw2qpp5rf5zgqyexdt7q5ean83cvcjuc3jafn8etm3c0za6xldwcyllvffqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydqcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgq8nn5qkcp9xl5u7dlqamdys6e6yc0ngyqe676cqajnwax6657verj7at5gvdqu6nk3l0wcagq4muyhqqms4t0t9sfvyazpga5eywj6uqpyc409e", + "payment_hash": "1a682400993357e0533d99e386625cc465d4ccf95ee3878bba37daec13ff6252", + "amount_msat": 123000, "status": "unpaid", - "description": [ - "XEoCR94SIz6UIRUEkxum." - ], - "expires_at": 1706757730, - "created_index": 1 + "description": "description inv_l24", + "expires_at": 1722307313, + "created_index": 4 + }, + { + "label": "label inv_l25", + "bolt11": "lnbcrt1240n1pn2s38psp5ufjqj6kuxlvl65xue9p06ulyvwf9sm0utxlch59d0ynl05778vwspp5qlacxkrdmc2p50yl8lsl75pwmlhve2ret2yd2f34z7jfs7yffwvqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydgcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqkml60qaytvnd08p57w7enuna95s7cqej8cfuvsgjzpeq9u83s0hqh60667nrp40qkqxkdu36z8wqtmac5z3208rwyn0q2pv56sgz5dcp9mn5hc", + "payment_hash": "07fb83586dde141a3c9f3fe1ff502edfeecca8795a88d5263517a49878894b98", + "amount_msat": 124000, + "status": "unpaid", + "description": "description inv_l25", + "expires_at": 1722307313, + "created_index": 5 + }, + { + "label": "label inv_l26", + "bolt11": "lnbcrt1250n1pn2s38psp5u22hlvy5mk7keq57m4fatz7aqnmh4whcuk45npdexrw4m5athcvqpp5ps4h5lt8waz5pprvad3skzssnksl2wxng985rcsuedp8teh29rkqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydscqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqyljtru0gcvqh7k5l9u8ulcuxw8fwa9qycyd32hl7wwdpjtlefgrpyjch6aprcdah2pthx3pku3y7c6dzluzjjy9c32cs3m5hqq6ww3sp0j4tr8", + "payment_hash": "0c2b7a7d67774540846ceb630b0a109da1f538d3414f41e21ccb4275e6ea28ec", + "amount_msat": 125000, + "status": "unpaid", + "description": "description inv_l26", + "expires_at": 1722307313, + "created_index": 6 + }, + { + "label": "lbl_l13", + "bolt11": "lnbcrt1u1pn2s38zsp5j9w8t9p2y6an5se63n3vkpp8c20vdsthtn78sv5t2lmt57l742wqpp5wtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7fsdqcdscnxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqcjq9fq26ph2skcsm65xjwnw3crgygpampszjcvqs8aw2zf3jzcxqg4dh58fm8mxul29vh5urpyjkll9m4dq3807xcmq2q9yvgd5qt7qp695qvu", + "payment_hash": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "amount_msat": 100000, + "status": "unpaid", + "description": "l13 description", + "expires_at": 1722908514, + "created_index": 7 + }, + { + "label": "lbl_l23", + "bolt11": "lnbcrt1pn2s38zsp5lv49w44a8tvkwtkxfxwts8rnr864u59srp7sxuua3haahdhlhtrqpp5p928w8rmsg2hjeymedcn54vxhsz372qhcedgf003nmsknhx9594sdqcdserxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqt5h8te9lkn0jpdkhkmlkzs80aw7mt5kdm6jxmvddkavt3vj0vakkmfcs0hsde8y8g8za46sch2lp4jxy56u8ve25sgpgcsya0vp92sgphzw570", + "payment_hash": "0954771c7b821579649bcb713a5586bc051f2817c65a84bdf19ee169dcc5a16b", + "status": "paid", + "pay_index": 2, + "amount_received_msat": 9900, + "paid_at": 1722303715, + "payment_preimage": "f3a3b40d63e62785f537aad60f93980914c5639872c7746299a6a1228abbc303", + "description": "l23 description", + "expires_at": 1722908514, + "created_index": 8, + "updated_index": 2 + }, + { + "label": "dca9774ba2925b48c42eb12e599c09389d9d80d44445c4d0c944556c7228746e-025f3305ae63d757b277dd49301833087ba6208e743ce95fa6e950fa80be407e5f-0", + "bolt12": "lni1qqg9g04gczk9ntk4gsjg3aptwykk2q3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssq38zq9q53nfwd5zqumpd3jjz93pqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4j5pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84sggztuesttnr6atmya7afycpsvcg0wnzprn58n54lfhf2ragp0jq0e04j9z5dpsku6mnypnx7u3qw35x2grxd9eksgdqnqpz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336kgr6euj6p39a209zw5kpkftk7h9te69vlmjg0arceagpaajague0zsszqk96htpgqn2wsznaas0zfdtf8v97ryz29jrn7rwgs5687ghgq5jusqr99dtx4jdj9nqpep5zxmynegrg6e7rm2l53ur8043h2yqzldyl5vh08h8ssaeq5jrvw9y24kztlwvc4nwagsuqqqqqqqqqqqqqqq9qqqqqqqqqqqqq8fykt06c5sqqqqqpfqyv65yfedgyqrp2s7qpxpjse8q8796qcrr5xwgfkqjue3urd6rs2rt2f68tk0vl2szyugtqggz953rvg9rtxj8lalh43z8epwydjfrmffn3y3p5qz5cywpu09rr4vlqsy2n7vmpn67ltzrj70znp70sk4m530j5vceq6jhk97h7ttzn09sh8m9gecarrt27v2tux8z6rr06sj9h60r05p4vhkhzsp0xf9ea4jgg", + "payment_hash": "061543c009832864e03f8ba06063a19c84d812e663c1b7438286b527475d9ecf", + "amount_msat": 10000, + "status": "unpaid", + "description": "Fish sale!", + "expires_at": 1722310917, + "local_offer_id": "dca9774ba2925b48c42eb12e599c09389d9d80d44445c4d0c944556c7228746e", + "invreq_payer_note": "Thanks for the fish!", + "created_index": 9 + }, + { + "label": "f901018768e13ea2da95f437749e24d22d47b2a6ea3030ef66ae0281df49d94b-03014d72261012e28cb4711a985c1475eba04a0058f9d04321b4cf1de479711d6f-0", + "bolt12": "lni1qqg86u6jfl660zfuk22sexem37r7xq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqc0gfqq5pjrdanxvet9zsqs593pqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4j5pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84yqc7sjq9vqgztqssxq2dwgnpqyhz3j68zx5cts28t6aqfgq937wsgvsmfncau3uhz8t05zvqytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82eq2rdjuqaychg3jndvsjrlu6y08aeuh4ytw6f6ak5n24p5n8zmsz2sqgrg3rg89hqfh6n7dfr0fugvq20ehecd3ezc438l6uh4r8epaakn4lsqv4qgr3ks4yxngyflq339lza456xt8uly085umq3gwql3qyfge0ec03dezeg8xulz33ntlj8yd7dcra9564zrsqqqqqqqqqqqqqqq5qqqqqqqqqqqqqayjedltzjqqqqqq9yq3n2s3894qsfwwvj3szk4yplg4fkw68nwzlwyc23457qx6v7xe38znuha72km6a2qv0gfq9syypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgz2rxjcsxs6s3lnngq9xeqn9pzy53n50p4ulcdvkx8dye7h8xgxpvjyg928m2txk2knl0zzfl7j82c6lq7xqlx83ey7z4aux9pjp4sp7", + "payment_hash": "9739928c056a903f45536768f370bee26151ad3c03699e3662714f97ef956deb", + "amount_msat": 2000000, + "status": "unpaid", + "description": "Coffee", + "expires_at": 1722310917, + "local_offer_id": "f901018768e13ea2da95f437749e24d22d47b2a6ea3030ef66ae0281df49d94b", + "created_index": 10 } ] } @@ -18486,6 +21131,9 @@ "description": [ "The **listnodes** command returns nodes the node has learned about via gossip messages, or a single one if the node *id* was specified." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -18744,24 +21392,18 @@ "id": "example:listnodes#1", "method": "listnodes", "params": { - "id": "02e29856dab8ddd9044c18486e4cab79ec717b490447af2d4831e290e48d57638a" + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d" } }, "response": { "nodes": [ { - "nodeid": "02e29856dab8ddd9044c14586e4cab79ec717b490447af2d4831e290e48d58638a", - "alias": "some_alias", - "color": "68f442", - "last_timestamp": 1597213741, - "features": "02a2a1", - "addresses": [ - { - "type": "ipv4", - "address": "zzz.yy.xx.xx", - "port": 9735 - } - ] + "nodeid": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "alias": "HOPPINGFIRE--190-g5fd2f9c-modded", + "color": "035d2b", + "last_timestamp": 1722303669, + "features": "88a0802a8a59a1", + "addresses": [] } ] } @@ -18776,34 +21418,34 @@ "nodes": [ { "nodeid": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "alias": "SILENTARTIST-v23.11-415-gd120eba", + "alias": "SILENTARTIST-190-g5fd2f9c-modded", "color": "022d22", - "last_timestamp": 1708624765, - "features": "88a0000a8a5961", + "last_timestamp": 1722303662, + "features": "88a0802a8a59a1", "addresses": [] }, { "nodeid": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "alias": "JUNIORBEAM-v23.11-415-gd120eba", + "alias": "JUNIORBEAM-5-190-g5fd2f9c-modded", "color": "0266e4", - "last_timestamp": 1708624765, - "features": "88a0000a8a5961", + "last_timestamp": 1722303662, + "features": "88a0802a8a59a1", "addresses": [] }, { "nodeid": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "alias": "HOPPINGFIRE-v23.11-415-gd120eba", + "alias": "HOPPINGFIRE--190-g5fd2f9c-modded", "color": "035d2b", - "last_timestamp": 1708624765, - "features": "88a0000a8a5961", + "last_timestamp": 1722303669, + "features": "88a0802a8a59a1", "addresses": [] }, { "nodeid": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", - "alias": "JUNIORFELONY-v23.11-415-gd120eba", + "alias": "JUNIORFELONY-190-g5fd2f9c-modded", "color": "0382ce", - "last_timestamp": 1708624766, - "features": "88a0000a8a5961", + "last_timestamp": 1722303669, + "features": "88a0802a8a59a1", "addresses": [] } ] @@ -18821,6 +21463,9 @@ "description": [ "The **listoffers** RPC command list all offers, or with `offer_id`, only the offer with that offer_id (if it exists)." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -18919,18 +21564,18 @@ "response": { "offers": [ { - "offer_id": "053a5c566fbea2681a5ff9c05a913da23e45b95d09ef5bd25d7d408f23da7084", + "offer_id": "dca9774ba2925b48c42eb12e599c09389d9d80d44445c4d0c944556c7228746e", "active": true, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqvqcdgq2z9pk7enxv4jjqen0wgs8yatnw3ujz83qkc6rvp4j28rt3dtrn32zkvdy7efhnlrpr5rp5geqxs783wtlj550qs8czzku4nk3pqp6m593qxgunzuqcwkmgqkmp6ty0wyvjcqdguv3pnpukedwn6cr87m89t74h3auyaeg89xkvgzpac70z3m9rn5xzu28c", + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqgn3qzs2ge5hx6pqwdskcefpzcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", "used": false }, { - "offer_id": "3247d3597fec19e362ca683416a48a0f76a44c1600725a7ee1936548feadacca", + "offer_id": "f901018768e13ea2da95f437749e24d22d47b2a6ea3030ef66ae0281df49d94b", "active": true, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcxqd24x3qgqgqlgzs3gdhkven9v5sxvmmjype82um50ys3ug9kxsmqdvj3c6ut2cuu2s4nrf8k2dulccgaqcdzxgp583utjlu49rcyqt8hc3s797umxn3r9367rdqc577rma7key58fywkajxnuzyapge86hj2pg80rjrma40xdqrxnsnva5l3ce7hz4ua8wf755dees4y9vnq", - "used": true + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqv85ysq2qepk7enxv4j3gqg2zcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", + "used": false } ] } @@ -18940,16 +21585,16 @@ "id": "example:listoffers#2", "method": "listoffers", "params": [ - "f61cca153d1948dade19349792d9bcdc9cef687fd27db0b553a67979f55aae48" + "b791f88cebf775853112c30828e116487f4d6c252d669372532b468bc7de8a24" ] }, "response": { "offers": [ { - "offer_id": "f61cca153d1948dade19349792d9bcdc9cef687fd27db0b553a67979f55aae48", - "active": true, + "offer_id": "b791f88cebf775853112c30828e116487f4d6c252d669372532b468bc7de8a24", + "active": false, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqyqs5rn5v4ehggrxdaezqvtdwdshg93pqfnwgkvdr57yzh6h92zg3qctvrm7w38djg67kzcm4yeg8vc4cq63s", + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqv0gfqq2zp8kven9wgs8gmeqg35hxctzd3j3vggz953rvg9rtxj8lalh43z8epwydjfrmffn3y3p5qz5cywpu09rr4vs", "used": false } ] @@ -18966,6 +21611,9 @@ "description": [ "The **listpay** RPC command gets the status of all *pay* commands, or a single one if either *bolt11* or *payment_hash* was specified." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -19185,42 +21833,86 @@ "id": "example:listpays#1", "method": "listpays", "params": { - "bolt11": "lnbcrt123n1pjmxp7qsp5hxu7u28y0nx4v689u3hwzdzse2w9yaylhheavf9dxvwtdup7pvespp5ha66gxse68j4n6755v7299dnmq4w34gp0znxu0xzahdc43zrg40qdq5v3jhxcmjd9c8g6t0dc6sxqrp7scqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqvuqqqqsqqqqqqqqpqqqqqzsqqc9qxpqysgqk74dvqlvr92ayy5s7x0r0u9xywez6wu4h8pfta386cw6x7cdrvn8pz87kyg5c930aent423gm9ylpaw5p35k72f02hg0s9dulg4d8fqpgj7gpm" + "bolt11": "lnbcrt500n1pn2s396sp5h5tz6fpm3dxvrlwcnwmfq85v45wfj43mdmplpce6ku2vmfdhrx5qpp50z9w5u57meydx9dpn889mmtkz6tqrfsa65hfwd88ql4hc5hyu70qdqcdsenygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqt5m8qx0t25a0gygya7u4sxulyyp2dec87pwsxuuwtg0u66c07703g9j6vlwgmlhqk7qgn95qw7allhnuj2m9hf0xkcr2zkaxltv3t6gqjcdpll" } }, "response": { - "pays": [ - { - "bolt11": "lnbcrt123n1pjmxp7qsp5hxu7u28y0nx4v689u3hwzdzse2w9yaylhheavf9dxvwtdup7pvespp5ha66gxse68j4n6755v7299dnmq4w34gp0znxu0xzahdc43zrg40qdq5v3jhxcmjd9c8g6t0dc6sxqrp7scqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqvuqqqqsqqqqqqqqpqqqqqzsqqc9qxpqysgqk74dvqlvr92ayy5s7x0r0u9xywez6wu4h8pfta386cw6x7cdrvn8pz87kyg5c930aent423gm9ylpaw5p35k72f02hg0s9dulg4d8fqpgj7gpm", - "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "payment_hash": "bf75a41a19d1e559ebd4a33ca295b3d82ae8d50178a66e3cc2eddb8ac443455e", - "status": "failed", - "created_at": 1706231854, - "amount_sent_msat": 0 - } - ] + "pays": [] } }, { "request": { "id": "example:listpays#2", "method": "listpays", - "params": { - "bolt11": "lnbcrt123n1pjmxp7qsp5u84368dz7yhzcqm955h96wdqch7uarasun45cr0vs5d8t0cv5avqpp5r9p0dp92guaatrmhf302m0dyj4n79gk93qu2l5tagfxq3dedgfqsdq5v3jhxcmjd9c8g6t0dc6qxqrp7scqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqvuqqqqsqqqqqqqqpqqqqqzsqqc9qxpqysgq46wu0fznfx27rcnyzhcttf8yqx3lwqs482yxlead0fyt8mefrrrj5m379fa5qukgquf9tnwsuj3nnfmwkzkfg6pyhzq6w8gauuh6m5cqgur64n" - } + "params": {} }, "response": { "pays": [ { - "bolt11": "lnbcrt123n1pjmxp7qsp5u84368dz7yhzcqm955h96wdqch7uarasun45cr0vs5d8t0cv5avqpp5r9p0dp92guaatrmhf302m0dyj4n79gk93qu2l5tagfxq3dedgfqsdq5v3jhxcmjd9c8g6t0dc6qxqrp7scqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqvuqqqqsqqqqqqqqpqqqqqzsqqc9qxpqysgq46wu0fznfx27rcnyzhcttf8yqx3lwqs482yxlead0fyt8mefrrrj5m379fa5qukgquf9tnwsuj3nnfmwkzkfg6pyhzq6w8gauuh6m5cqgur64n", + "bolt11": "lnbcrt5m1pn2s39hsp50pekdm9axtcfm0ttsxzg2z0738ujk5uc3n0v5rul2y2ghkeh772qpp50a60qe8lg55t0mru27xlvcnpwetu46d0ff60tuj0dr9cged3secqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcv3qw3hjqmpnxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqcjj3uz0ux4qxt4ev4patfwz44e7ns57tmvxdwzfq2pj5drm5xhk5agm8j2wha32g664a0mw6casy44vfdf76jj38n3669fsjps4jkaqpaydvjr", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "payment_hash": "7f74f064ff4528b7ec7c578df662617657cae9af4a74f5f24f68cb8465b18670", + "status": "complete", + "created_at": 1722303671, + "completed_at": 1722303672, + "preimage": "d9893938f4464933d87f5123a8c09b4e98e106c9c34c1812340c9570d72d16a2", + "amount_msat": 500000000, + "amount_sent_msat": 500000000 + }, + { + "bolt11": "lnbcrt5m1pn2s39csp59778k5kecnjhyqu7amy99kt8nhu43ap74m8q3xryvqxrjnsrnxpqpp5s3fd8u9xnhgwtqpsq9jtcspzu4dmxvcatpvl2a3dje5055fmqrdqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcv3qw3hjqmp4xqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jx3rjwmh5d5rmgqqqqqpqqqqqzsqqc9qxpqysgqe4hfa6arms4pz6ajwhq07lhc57g60vrdqyfdsewu84q823m8zqdjtcsv7aun8zqxr86amyz0lclf8pfts0hqy60s9fcvvsjyxnnmpugpjcq9xk", + "destination": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", + "payment_hash": "8452d3f0a69dd0e580300164bc4022e55bb3331d5859f5762d9668fa513b00da", + "status": "complete", + "created_at": 1722303672, + "completed_at": 1722303673, + "preimage": "576f5426f339b3db80d1b3c3546d6832274171609f25795c64b6cc74aa158d8c", + "amount_msat": 500000000, + "amount_sent_msat": 500000000 + }, + { + "bolt11": "lnbcrt1u1pn2s3xxsp5xk8hs6zuv0yqhq7hhl0sps6mxuj78pzwryejaljh48vr4htykujqpp593ndc8wrukteld5j4nqnt6tedavh8ezv48dmrkqen3440ajnre5qdqcdsenxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq0asve9rdtfd9fe20u5vjujzmm0phpq538z8ndhn5ts62aflhktqn6338e45xcxkyf7askjjq25ksxt4eqarjjame8wfdmau7kq7m4csqs0n32n", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "payment_hash": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68", + "status": "complete", + "created_at": 1722303688, + "completed_at": 1722303689, + "preimage": "1ce8370d3a179cee3af25a5a6c7058e8e12033a842efd6d34abae53334bc94bf", + "amount_msat": 100000, + "amount_sent_msat": 100000 + }, + { + "bolt12": "lni1qqgypua5g7rp293k00s66ayvnv26czst2d5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gps7sjqtqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e5zvqyehytxx360zptatj4pygsv9kpal8gnkeyd0tpvd6jv5rkv2uqdgcq2s27mvxt0arlnulnmce53cuz00vzaqvgvhpphxgavl89r8zrdhaxqgzpvxkkmwsmxnuwflttmnpc8vtzwlgd3cfty3xwlnlc9r2gcjesguqqv4xey4m7l4wxem27vxyxfhwznlc62kffsd5xncx9w49m4g72u2y7lcl6a3x5cpu52j6gm8q5x0q8k7myxdzrsqqqqqqqqqqqqqqq5qqqqqqqqqqqqqayjedltzjqqqqqq9yq3n2s38p5cq442pq5qpm4ht26v8statwxcrl65uy26c9hx4dvy66f9x665eqqy90tpz25qc0gfqtqggzvmj9nrga83q474e2sjygxzmq7ln5fmvjxh4skxafx2pmx9wqx5v0qsqfkcrpht0d3nnt8txkcgf5wr6gzrlacls2gyrvj5hhwuu98shurrn6ayruunju7k9yu9clvaj354tr064ruuht88q5dj73kzru20uzj", + "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "payment_hash": "a003badd6ad30f05f56e3607fd538456b05b9aad6135a494dad5320010af5844", + "status": "complete", + "created_at": 1722303713, + "completed_at": 1722303714, + "preimage": "6f154ed7d108349cb6385eba5f160294ef83862c2c560ba6446b2a3da5c2b3b3", + "amount_msat": 1000000, + "amount_sent_msat": 1000000 + }, + { + "bolt11": "lnbcrt1pn2s38zsp5lv49w44a8tvkwtkxfxwts8rnr864u59srp7sxuua3haahdhlhtrqpp5p928w8rmsg2hjeymedcn54vxhsz372qhcedgf003nmsknhx9594sdqcdserxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqt5h8te9lkn0jpdkhkmlkzs80aw7mt5kdm6jxmvddkavt3vj0vakkmfcs0hsde8y8g8za46sch2lp4jxy56u8ve25sgpgcsya0vp92sgphzw570", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "payment_hash": "0954771c7b821579649bcb713a5586bc051f2817c65a84bdf19ee169dcc5a16b", + "status": "complete", + "created_at": 1722303715, + "completed_at": 1722303715, + "preimage": "f3a3b40d63e62785f537aad60f93980914c5639872c7746299a6a1228abbc303", + "amount_msat": 9900, + "amount_sent_msat": 9900 + }, + { + "bolt11": "lnbcrt40n1pn2s3xxsp5j329vez86jvxw6543zlcla2fusm7v6h74pf7ftmmyfv6zm9uedlspp5j6xpxmq8cwd305vj2dvd6dh4mkr0s6guvehvyleymedgf4vsm3ysdqaveskjmr9vssxgetnvdexjur5d9hkuxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqk6uwy8pkv42jzhdna3z4vxpwkapdzzpn2tcpjnqj738nlpkjc583l9v72vlskt8y33rr4z3jma32xx7ve0jfy7anvn6r98cr5flhcuqqhr4shx", "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "payment_hash": "1942f684aa473bd58f774c5eadbda49567e2a2c58838afd17d424c08b72d4241", + "payment_hash": "968c136c07c39b17d1925358dd36f5dd86f8691c666ec27f24de5a84d590dc49", "status": "complete", - "created_at": 1706231849, - "completed_at": 1706231854, - "preimage": "89ce412a2089cbcb72a73ce755337cf693859ea58f21ef0d1caf286a9b0f2a7c", - "amount_msat": 12300, - "amount_sent_msat": 12301 + "created_at": 1722303719, + "completed_at": 1722303720, + "preimage": "8815ee921dba644c076f9f879abb520d8539a6913856a439752eaaadff1e21ac", + "amount_msat": 4000, + "amount_sent_msat": 4000 } ] } @@ -19239,6 +21931,9 @@ "", "If no *id* is supplied, then channel data on all lightning nodes that are connected, or not connected but have open channels with this node, are returned." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -20643,12 +23338,15 @@ { "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", "peer_connected": true, + "reestablished": true, "channel_type": { "bits": [ - 12 + 12, + 22 ], "names": [ - "static_remotekey/even" + "static_remotekey/even", + "anchors/even" ] }, "updates": { @@ -20658,37 +23356,50 @@ "cltv_expiry_delta": 6, "fee_base_msat": 1, "fee_proportional_millionths": 10 + }, + "remote": { + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "cltv_expiry_delta": 6, + "fee_base_msat": 1, + "fee_proportional_millionths": 10 } }, - "state": "CHANNELD_AWAITING_LOCKIN", - "scratch_txid": "4e9c2866b9ae1f765b89ea7ec37428c900ea97f717f85f00e3db852cb6aea3a8", - "last_tx_fee_msat": 5430000, + "last_stable_connection": 1722303707, + "state": "CHANNELD_NORMAL", + "scratch_txid": "80aa008578b3b6924f2362146907e46ad83351d5b9b056bd8537befc3f1d7d65", + "last_tx_fee_msat": 4221000, + "lost_state": false, "feerate": { - "perkw": 7500, - "perkb": 30000 + "perkw": 3755, + "perkb": 15020 }, "owner": "channeld", + "short_channel_id": "109x1x1", "direction": 1, - "channel_id": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", - "funding_txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b", - "funding_outnum": 0, - "close_to_addr": "bcrt1pamt5tqzd49uyessr7437l2vllf20muqmzdauje8x8scjgpc0l0nqhyqcyp", - "close_to": "5120eed745804da9784cc203f563efa99ffa54fdf01b137bc964e63c3124070ffbe6", + "channel_id": "252d1b0a1e57895e84137f28cf19ab2c35847e284c112fefdecc7afeaa5c1de7", + "funding_txid": "737d6835ddafd515ba9e9def733bb4e4211f6053a32b1422bf1c8cc240850f96", + "funding_outnum": 1, + "close_to_addr": "bcrt1p8c0ku4mpxq3443rss8e6rjwamztvv8yxvmxtetal5d0n6v39rlwqvfqy6n", + "close_to": "51203e1f6e576130235ac47081f3a1c9ddd896c61c8666ccbcafbfa35f3d32251fdc", "private": false, "opener": "local", "alias": { - "local": "5589251x14022525x17398" + "local": "2240075x4300189x56636", + "remote": "3321841x5311416x1695" }, "features": [ - "option_static_remotekey" + "option_static_remotekey", + "option_anchors_zero_fee_htlc_tx", + "option_anchors" ], "funding": { "local_funds_msat": 1000000000, "remote_funds_msat": 0, "pushed_msat": 0 }, - "to_us_msat": 1000000000, - "min_to_us_msat": 1000000000, + "to_us_msat": 490518792, + "min_to_us_msat": 489918792, "max_to_us_msat": 1000000000, "total_msat": 1000000000, "fee_base_msat": 1, @@ -20697,24 +23408,41 @@ "max_total_htlc_in_msat": 18446744073709552000, "their_reserve_msat": 10000000, "our_reserve_msat": 10000000, - "spendable_msat": 973980000, - "receivable_msat": 0, + "spendable_msat": 469223792, + "receivable_msat": 499481208, "minimum_htlc_in_msat": 0, "minimum_htlc_out_msat": 0, "maximum_htlc_out_msat": 990000000, "their_to_self_delay": 5, "our_to_self_delay": 5, "max_accepted_htlcs": 483, - "state_changes": [], - "status": [], - "in_payments_offered": 0, - "in_offered_msat": 0, - "in_payments_fulfilled": 0, - "in_fulfilled_msat": 0, - "out_payments_offered": 0, - "out_offered_msat": 0, - "out_payments_fulfilled": 0, - "out_fulfilled_msat": 0, + "state_changes": [ + { + "timestamp": "2024-07-30T01:40:45.942Z", + "old_state": "DUALOPEND_OPEN_COMMITTED", + "new_state": "DUALOPEND_AWAITING_LOCKIN", + "cause": "user", + "message": "Sigs exchanged, waiting for lock-in" + }, + { + "timestamp": "2024-07-30T01:40:47.619Z", + "old_state": "DUALOPEND_AWAITING_LOCKIN", + "new_state": "CHANNELD_NORMAL", + "cause": "user", + "message": "Lockin complete" + } + ], + "status": [ + "CHANNELD_NORMAL:Channel ready for use." + ], + "in_payments_offered": 1, + "in_offered_msat": 1000000, + "in_payments_fulfilled": 1, + "in_fulfilled_msat": 1000000, + "out_payments_offered": 10, + "out_offered_msat": 510501210, + "out_payments_fulfilled": 8, + "out_fulfilled_msat": 510481208, "htlcs": [] } ] @@ -20758,30 +23486,32 @@ "fee_proportional_millionths": 10 } }, + "last_stable_connection": 1722303707, "state": "CHANNELD_NORMAL", - "scratch_txid": "ece66657d6203a4ea77807f566fd5b98a78b659f0cd59ce9200aa3bd6875ee25", - "last_tx_fee_msat": 4545000, + "scratch_txid": "80aa008578b3b6924f2362146907e46ad83351d5b9b056bd8537befc3f1d7d65", + "last_tx_fee_msat": 4221000, "lost_state": false, "feerate": { - "perkw": 3750, - "perkb": 15000 + "perkw": 3755, + "perkb": 15020 }, "owner": "channeld", - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "direction": 1, - "channel_id": "def5ef03e0d36ed65de814c0a8d6599a502fe1afb8e956529320bb350e876b5f", - "funding_txid": "5f6b870e35bb20935256e9b8afe12f509a59d6a8c014e85dd66ed3e003eff5de", - "funding_outnum": 0, - "close_to_addr": "bcrt1pamt5tqzd49uyessr7437l2vllf20muqmzdauje8x8scjgpc0l0nqhyqcyp", - "close_to": "5120eed745804da9784cc203f563efa99ffa54fdf01b137bc964e63c3124070ffbe6", + "channel_id": "252d1b0a1e57895e84137f28cf19ab2c35847e284c112fefdecc7afeaa5c1de7", + "funding_txid": "737d6835ddafd515ba9e9def733bb4e4211f6053a32b1422bf1c8cc240850f96", + "funding_outnum": 1, + "close_to_addr": "bcrt1p8c0ku4mpxq3443rss8e6rjwamztvv8yxvmxtetal5d0n6v39rlwqvfqy6n", + "close_to": "51203e1f6e576130235ac47081f3a1c9ddd896c61c8666ccbcafbfa35f3d32251fdc", "private": false, "opener": "local", "alias": { - "local": "15447035x5589520x8959", - "remote": "6036590x13481428x5501" + "local": "2240075x4300189x56636", + "remote": "3321841x5311416x1695" }, "features": [ "option_static_remotekey", + "option_anchors_zero_fee_htlc_tx", "option_anchors" ], "funding": { @@ -20789,8 +23519,8 @@ "remote_funds_msat": 0, "pushed_msat": 0 }, - "to_us_msat": 1000000000, - "min_to_us_msat": 1000000000, + "to_us_msat": 490518792, + "min_to_us_msat": 489918792, "max_to_us_msat": 1000000000, "total_msat": 1000000000, "fee_base_msat": 1, @@ -20799,8 +23529,8 @@ "max_total_htlc_in_msat": 18446744073709552000, "their_reserve_msat": 10000000, "our_reserve_msat": 10000000, - "spendable_msat": 978330000, - "receivable_msat": 0, + "spendable_msat": 469223792, + "receivable_msat": 499481208, "minimum_htlc_in_msat": 0, "minimum_htlc_out_msat": 0, "maximum_htlc_out_msat": 990000000, @@ -20809,8 +23539,15 @@ "max_accepted_htlcs": 483, "state_changes": [ { - "timestamp": "2024-02-22T17:48:57.127Z", - "old_state": "CHANNELD_AWAITING_LOCKIN", + "timestamp": "2024-07-30T01:40:45.942Z", + "old_state": "DUALOPEND_OPEN_COMMITTED", + "new_state": "DUALOPEND_AWAITING_LOCKIN", + "cause": "user", + "message": "Sigs exchanged, waiting for lock-in" + }, + { + "timestamp": "2024-07-30T01:40:47.619Z", + "old_state": "DUALOPEND_AWAITING_LOCKIN", "new_state": "CHANNELD_NORMAL", "cause": "user", "message": "Lockin complete" @@ -20819,14 +23556,14 @@ "status": [ "CHANNELD_NORMAL:Channel ready for use." ], - "in_payments_offered": 0, - "in_offered_msat": 0, - "in_payments_fulfilled": 0, - "in_fulfilled_msat": 0, - "out_payments_offered": 0, - "out_offered_msat": 0, - "out_payments_fulfilled": 0, - "out_fulfilled_msat": 0, + "in_payments_offered": 1, + "in_offered_msat": 1000000, + "in_payments_fulfilled": 1, + "in_fulfilled_msat": 1000000, + "out_payments_offered": 10, + "out_offered_msat": 510501210, + "out_payments_fulfilled": 8, + "out_fulfilled_msat": 510481208, "htlcs": [] } ] @@ -20851,6 +23588,9 @@ "", "The channel will remain open for a set blocktime, after which if the connection has not been re-established, the channel will close and the node will no longer appear in the command output." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -21159,19 +23899,19 @@ "id": "example:listpeers#1", "method": "listpeers", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d" } }, "response": { "peers": [ { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "connected": true, - "num_channels": 1, + "num_channels": 2, "netaddr": [ - "127.0.0.1:44619" + "127.0.0.1:34785" ], - "features": "08a0000a0a69a2" + "features": "08a0802a8a59a1" } ] } @@ -21184,14 +23924,32 @@ }, "response": { "peers": [ + { + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "connected": true, + "num_channels": 2, + "netaddr": [ + "127.0.0.1:34785" + ], + "features": "08a0802a8a59a1" + }, + { + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", + "connected": true, + "num_channels": 1, + "netaddr": [ + "127.0.0.1:38251" + ], + "features": "08a0802a8a59a1" + }, { "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", "connected": true, "num_channels": 1, "netaddr": [ - "127.0.0.1:48862" + "127.0.0.1:47032" ], - "features": "08a0000a0a69a2" + "features": "08a0802a8a59a1" } ] } @@ -21209,6 +23967,9 @@ "", "Note that there may be more than one concurrent *sendpay* command per *pay*, so this command should be used with caution." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -21538,33 +24299,25 @@ "request": { "id": "example:listsendpays#1", "method": "listsendpays", - "params": {} + "params": { + "bolt11": "lnbcrt100n1pn2s396sp5v3en0qa3rrljw4m0wtz88sx99q20rarufhjpfysefhwhs42gvqjqpp56kvvl33d594nsxu0hzhesvazgqzlwv89fnpjcvtlanz3rl7x623qdp9f9h8vmmfvdjjqer9wd3hy6tsw35k7m3qdsenzxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq7za6z8kx2k5nul45zwttfz2njx3836v69mxqsl4ty9228pyjrkfnkymysy8ygsrrje9qf6j4tpalt5qkqusfp2esrsqc5ak7t4yzajgpezef54" + } }, "response": { "payments": [ - { - "created_index": 1, - "id": 1, - "payment_hash": "e3b43574acd074b0c4ba1b13b5155ff5f9c76742e643ed003e17301c5a2db149", - "groupid": 1, - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 20000, - "amount_sent_msat": 20000, - "created_at": 1706225269, - "status": "pending", - "bolt11": "lnbcrt200n1pjm9mn5sp5gq84lgga959m6gg4g0kj29ypwjaxxnm4cu5csymq8p6nqxv800mspp5uw6r2a9v6p6tp396rvfm292l7huuwe6zuep76qp7zucpck3dk9ysdpqf9grgmt62fmk5stswefh23n2tpykvcmzxqyjw5qcqp99qxpqysgqz8s496zmwed278jvp075zlhrnj0ncg45kcfw5s2lkhtxd3wc39f8wflp5gmd827dk470xpasfpx0azsfu0k8ttwae7620h8d050w28cqan776g" - }, { "created_index": 2, "id": 2, - "payment_hash": "f55d92cfe019b5a015f5e5956e9255053cda14786171d5002feb12ae5254e5a5", + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", "groupid": 1, - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 30000, - "amount_sent_msat": 30000, - "created_at": 1706225269, - "status": "pending", - "bolt11": "lnbcrt300n1pjm9mn5sp5zqfkr93rp92mdyj6m8lzpcu90rfefcaqff8fxdd2sc5mace23ujspp574we9nlqrx66q904uk2kayj4q57d59rcv9ca2qp0avf2u5j5ukjsdpq29j55nfcgfcnsvzw2er57knhwcmhzwt0xqyjw5qcqp99qxpqysgq76p2jpnegtzlxmn0aqt6d3f89q4p6y5v3v2qz7t2mm6xt90nt324cq400tl82k28562aux8jxs57d603g7s0q4g3dapu9a7vln94j7spsut799" + "updated_index": 2, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303675, + "completed_at": 1722303677, + "status": "complete", + "payment_preimage": "984a10782218478cd39e1f9a16795d756c337662067023a3b690bffdb1593f76" } ] } @@ -21573,26 +24326,150 @@ "request": { "id": "example:listsendpays#2", "method": "listsendpays", - "params": { - "bolt11": "lnbcrt1230n1pja03q9sp5xu9aypccf3n6vld2waxcysy47ct2wl5x5adtm7k8u30knqes22lspp5duw2v8csh0zh4xg9ql3amem98avlkc2ecre99tgmr2340amf9kmsdqjv3jhxcmjd9c8g6t0dcxqyjw5qcqp99qxpqysgqwh78s8wqg0kepspw0epcxmxteh5wu8n6ddlwdnyj758fqxpqk8ejf597x8ju3r32xqgae3yzjjz9e5s6l2vs5zxvkayhmemmx74wvyqqyqf8c9" - } + "params": {} }, "response": { "payments": [ { "created_index": 1, "id": 1, - "payment_hash": "6f1ca61f10bbc57a990507e3dde7653f59fb6159c0f252ad1b1aa357f7692db7", + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", "groupid": 1, "updated_index": 1, "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 123000, - "amount_sent_msat": 123000, - "created_at": 1708639237, - "completed_at": 1708639238, + "amount_msat": 500000000, + "amount_sent_msat": 500000000, + "created_at": 1722303670, + "completed_at": 1722303671, + "status": "complete", + "payment_preimage": "bed4140e1db302720d7f9547dc9127d45b115080447cce7e23cfd00b60991831", + "bolt11": "lnbcrt5m1pn2s39ksp53sknyy2mxxurt4y0wqgp730z0cnm0vz3zmzth8p79xsrtmg5llxspp5dp94v59nm6c99jf7lc07zmnhqw6kyujx3mkdav7643dczgtdedfqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcvfqw3hjqmpjxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqdz9cftkxe6kcqfddyrvr7j57ulsfxxxkgkjyhr3k77n8v59mzs5rmuexz9lxusyhhehlemd9ujclgahln8e0n8y86stc7u8uys6mjqgqerm6q4" + }, + { + "created_index": 2, + "id": 2, + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", + "groupid": 1, + "updated_index": 2, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303675, + "completed_at": 1722303677, + "status": "complete", + "payment_preimage": "984a10782218478cd39e1f9a16795d756c337662067023a3b690bffdb1593f76" + }, + { + "created_index": 3, + "id": 3, + "payment_hash": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", + "groupid": 0, + "updated_index": 3, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303677, + "completed_at": 1722303679, + "status": "complete", + "payment_preimage": "0d802c9c611bae611d51afa8ddf396df8ba4e0580a2eccfd1120da97e70482a0" + }, + { + "created_index": 4, + "id": 4, + "payment_hash": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "groupid": 0, + "updated_index": 4, + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "amount_msat": 10000000, + "amount_sent_msat": 10000202, + "created_at": 1722303679, + "completed_at": 1722303682, + "status": "complete", + "payment_preimage": "f76d6b7ef362f33e25eb5571e616f6e539a2c77caf0afa4227d1351546823664" + }, + { + "created_index": 5, + "id": 5, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "groupid": 0, + "updated_index": 5, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303682, + "completed_at": 1722303684, + "status": "failed" + }, + { + "created_index": 6, + "id": 6, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "groupid": 0, + "updated_index": 6, + "partid": 1, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303684, + "completed_at": 1722303686, + "status": "complete", + "payment_preimage": "4dad6dcf625f650a35a8199fbda18ea4f6717cdfadb40e6bed2bf5f96a4742b0" + }, + { + "created_index": 7, + "id": 7, + "payment_hash": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "groupid": 1, + "updated_index": 7, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 50000, + "amount_sent_msat": 50001, + "created_at": 1722303686, + "completed_at": 1722303688, + "status": "complete", + "payment_preimage": "0e07efd883f66b6b22ec7f2e7116e203c3fecc22eb8596a73eaf06c4befb0641", + "bolt11": "lnbcrt500n1pn2s396sp5h5tz6fpm3dxvrlwcnwmfq85v45wfj43mdmplpce6ku2vmfdhrx5qpp50z9w5u57meydx9dpn889mmtkz6tqrfsa65hfwd88ql4hc5hyu70qdqcdsenygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqt5m8qx0t25a0gygya7u4sxulyyp2dec87pwsxuuwtg0u66c07703g9j6vlwgmlhqk7qgn95qw7allhnuj2m9hf0xkcr2zkaxltv3t6gqjcdpll" + }, + { + "created_index": 8, + "id": 8, + "payment_hash": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "groupid": 1, + "updated_index": 8, + "amount_sent_msat": 1002, + "created_at": 1722303689, + "completed_at": 1722303692, + "status": "complete", + "payment_preimage": "5e49b520e86aaec8d798bf8107892fb87053d4cb27342518e4588aa609cf35cf" + }, + { + "created_index": 9, + "id": 9, + "payment_hash": "968c136c07c39b17d1925358dd36f5dd86f8691c666ec27f24de5a84d590dc49", + "groupid": 1, + "updated_index": 9, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303696, + "completed_at": 1722303698, + "status": "failed" + }, + { + "created_index": 10, + "id": 10, + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "groupid": 1, + "updated_index": 10, + "partid": 1, + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "amount_msat": 400000, + "amount_sent_msat": 400000, + "created_at": 1722303718, + "completed_at": 1722303719, "status": "complete", - "payment_preimage": "91f8366681fdfd309c048082fcde81a79116f85a7b2dd09aef1e34f5f7c3397b", - "bolt11": "lnbcrt1230n1pja03q9sp5xu9aypccf3n6vld2waxcysy47ct2wl5x5adtm7k8u30knqes22lspp5duw2v8csh0zh4xg9ql3amem98avlkc2ecre99tgmr2340amf9kmsdqjv3jhxcmjd9c8g6t0dcxqyjw5qcqp99qxpqysgqwh78s8wqg0kepspw0epcxmxteh5wu8n6ddlwdnyj758fqxpqk8ejf597x8ju3r32xqgae3yzjjz9e5s6l2vs5zxvkayhmemmx74wvyqqyqf8c9" + "payment_preimage": "af67b48518e78e157db404d13cb42987c31e034634203d10b224302b05fc6c90", + "bolt11": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7" } ] } @@ -21611,6 +24488,9 @@ "", "If *table* is given, only that table is in the resulting list, otherwise all tables are listed." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -21720,6 +24600,10 @@ { "tablename": "offers", "columns": [ + { + "name": "rowid", + "type": "INTEGER" + }, { "name": "offer_id", "type": "BLOB" @@ -21736,10 +24620,6 @@ "name": "bolt12", "type": "TEXT" }, - { - "name": "bolt12_unsigned", - "type": "TEXT" - }, { "name": "used", "type": "INTEGER" @@ -21870,6 +24750,10 @@ { "name": "close_cause", "type": "TEXT" + }, + { + "name": "last_stable_connection", + "type": "INTEGER" } ] } @@ -21887,6 +24771,9 @@ "description": [ "The **listtransactions** command returns transactions tracked in the wallet. This includes deposits, withdrawals and transactions related to channels. A transaction may have multiple types, e.g., a transaction may both be a close and a deposit if it closes the channel and returns funds to the wallet." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": {} @@ -22049,29 +24936,132 @@ "response": { "transactions": [ { - "hash": "05985072bbe20747325e69a159fe08176cc1bbc96d25e8848edad2dddc1165d0", - "rawtx": "02000000027032912651fc25a3e0893acd5f9640598707e2dfef92143bb5a4020e335442800100000017160014a5f48b9aa3cb8ca6cc1040c11e386745bb4dc932ffffffffd229a4b4f78638ebcac10a68b0561585a5d6e4d3b769ad0a909e9b9afaeae24e00000000171600145c83da9b685f9142016c6f5eb5f98a45cfa6f686ffffffff01915a01000000000017a9143a4dfd59e781f9c3018e7d0a9b7a26d58f8d22bf8700000000", - "blockheight": 0, - "txindex": 0, - "locktime": 0, + "hash": "1712c8af55f6853be3179bf20398689bb9204695fe3d6171c3248783218814e3", + "rawtx": "02000000000101096b01ae63d631e321f039d49df4c5b055ce3afa655a3d5c22c2a8594f41f5cd0000000000fdffffff02002d31010000000017a914655728f36cfe36d01aa50d3236704469f84a55408771c4d4280100000017a9147cdfb08e6e44fc1152c4f423225d2b7148248a9d870247304402202ff40c938d644198c10d60fe660c1380bd601b6dc4533b64c64d3809290edf4a022028206e39cc36423524816a34806a721061814478b297c2bfb2bc3c417548c466012102129f00a7502a031999fe81aa35afed6f09617a9748e5fdde0f7a0191d364f59b65000000", + "blockheight": 102, + "txindex": 1, + "locktime": 101, + "version": 2, + "inputs": [ + { + "txid": "cdf5414f59a8c2225c3d5a65fa3ace55b0c5f49dd439f021e331d663ae016b09", + "index": 0, + "sequence": 4294967293 + } + ], + "outputs": [ + { + "index": 0, + "amount_msat": 20000000000, + "scriptPubKey": "a914655728f36cfe36d01aa50d3236704469f84a554087" + }, + { + "index": 1, + "amount_msat": 4979999857000, + "scriptPubKey": "a9147cdfb08e6e44fc1152c4f423225d2b7148248a9d87" + } + ] + }, + { + "hash": "9454852bb62e304ee8933662284e10bd22a7f3710c262da4c94bdcc8b05ae407", + "rawtx": "02000000000101e3148821838724c371613dfe954620b99b689803f29b17e33b85f655afc812170000000017160014d6b969d36dffdad9869193f663ee480dfdc73488fdffffff0135143101000000002251206c27e1956acfa61e68292c80908880e813450f754132e8a2ac471a86bf1326b50247304402201b09adb26aa7674b2e4954bef85e5d4cb5baee1e20c91e6d26db624407588b4e022044bae97372215531507b464b7978e6f9dc25f986aed5ab62dbc011c1e80a544f012102b9c0c6844e12a531c968e55c55078ec16d9bf76be9290fd87d1cca72b4839a1766000000", + "blockheight": 103, + "txindex": 1, + "locktime": 102, + "version": 2, + "inputs": [ + { + "txid": "1712c8af55f6853be3179bf20398689bb9204695fe3d6171c3248783218814e3", + "index": 0, + "sequence": 4294967293 + } + ], + "outputs": [ + { + "index": 0, + "amount_msat": 19993653000, + "scriptPubKey": "51206c27e1956acfa61e68292c80908880e813450f754132e8a2ac471a86bf1326b5" + } + ] + }, + { + "hash": "706e569239dfe88a33ae6d276ae68d6c787a2403ecf0ac97ed14eec28aa6039d", + "rawtx": "02000000000101e3148821838724c371613dfe954620b99b689803f29b17e33b85f655afc8121701000000171600142577677b3b18e431cfe9ac900e842b4d0567d251fdffffff0200c2eb0b00000000160014661c23b790dd3491373af0b1d8bed0877d5cde22cd01e91c010000001600140527f5b39d5b246fc5ed823c59ccdc5cc50e70580247304402205d01bd83c715b11e29040b0e8a193629194f638b7369270d668df172616d872302205bbad12ce8fc7a4694195dc3871302e808547b24e7098ffd089d0e340ccf3b950121034bcbb11214c52ca895d87add0c0de5a1dfb429966aa50f59afe33669319ea99266000000", + "blockheight": 103, + "txindex": 2, + "locktime": 102, "version": 2, "inputs": [ { - "txid": "804254330e02a4b53b1492efdfe207875940965fcd3a89e0a325fc5126913270", + "txid": "1712c8af55f6853be3179bf20398689bb9204695fe3d6171c3248783218814e3", + "index": 1, + "sequence": 4294967293 + } + ], + "outputs": [ + { + "index": 0, + "amount_msat": 200000000000, + "scriptPubKey": "0014661c23b790dd3491373af0b1d8bed0877d5cde22" + }, + { "index": 1, - "sequence": 4294967295 + "amount_msat": 4779999693000, + "scriptPubKey": "00140527f5b39d5b246fc5ed823c59ccdc5cc50e7058" + } + ] + }, + { + "hash": "7547ffc11396c62852104f7100d5ca27a2b9c0d5d43d08122147b2b03eb157a5", + "rawtx": "02000000000101e4f55092d059070e27bc6d3a8cce1ba7137244e997c499ce47ca9828d82319fc0000000000fdffffff0280841e00000000001600149fb67bfcefee6cb7db4c7e55d9c6bfd749e31d1e8c721bed0000000016001442e74d56791e0c6447ebb87c612d324a8fd1e9f90247304402201843081a5417aec6d9e77e894ca159622d76360a16b9ee66e7d363a38ccd2a6102206b2dfb4bd0b0e8c25ed798842288c0ef3a0e328fa4f42d6fb5c479715ab2f0710121023770a6280695342030684ebaf25094a197f97acbb988e1ec8459b6228e20f8596b000000", + "blockheight": 108, + "txindex": 1, + "locktime": 107, + "version": 2, + "inputs": [ + { + "txid": "fc1923d82898ca47ce99c497e9447213a71bce8c3a6dbc270e0759d09250f5e4", + "index": 0, + "sequence": 4294967293 + } + ], + "outputs": [ + { + "index": 0, + "amount_msat": 2000000000, + "scriptPubKey": "00149fb67bfcefee6cb7db4c7e55d9c6bfd749e31d1e" }, { - "txid": "4ee2eafa9a9b9e900aad69b7d3e4d6a5851556b0680ac1caeb3886f7b4a429d2", + "index": 1, + "amount_msat": 3977998988000, + "scriptPubKey": "001442e74d56791e0c6447ebb87c612d324a8fd1e9f9" + } + ] + }, + { + "hash": "737d6835ddafd515ba9e9def733bb4e4211f6053a32b1422bf1c8cc240850f96", + "rawtx": "020000000001019d03a68ac2ee14ed97acf0ec03247a786c8de66a276dae338ae8df3992566e700000000000fdffffff02816cdc0b0000000022512035f1184f6b470c9df347da62c4b28e7ec9ee10b220bac3accd22209def0036ea40420f00000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd0247304402207336a772e8643be4dc672957feaa3c9d97dde0aa5d8014a35ebc4772d8dacf91022074cd9cf97077fbf2f5d380b3917565f05232cc07db22aef12f327d6603861d6f012103fa9c95085e42b1e5003cd1f418178c30c96e4ae77954ca0fc48c58826ff4eb0e6c000000", + "blockheight": 109, + "txindex": 1, + "locktime": 108, + "version": 2, + "inputs": [ + { + "txid": "706e569239dfe88a33ae6d276ae68d6c787a2403ecf0ac97ed14eec28aa6039d", "index": 0, - "sequence": 4294967295 + "sequence": 4294967293 } ], "outputs": [ { "index": 0, - "satoshis": "88721000msat", - "scriptPubKey": "a9143a4dfd59e781f9c3018e7d0a9b7a26d58f8d22bf87" + "amount_msat": 198995073000, + "scriptPubKey": "512035f1184f6b470c9df347da62c4b28e7ec9ee10b220bac3accd22209def0036ea" + }, + { + "index": 1, + "amount_msat": 1000000000, + "scriptPubKey": "00205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd" } ] } @@ -22140,20 +25130,19 @@ ] }, "response": { - "secret": "a9a2e742405c28f059349132923a99337ae7f71168b7485496e3365f5bc664ed" + "secret": "82d3e65651ac89124448cb88b5f4cd009f6c321f58ada0fca6e9e3f2d1c5889e" } }, { "request": { "id": "example:makesecret#2", "method": "makesecret", - "params": [ - null, - "scb secret" - ] + "params": { + "string": "scb secret" + } }, "response": { - "secret": "a9a2e742405c28f059349132923a99337ae7f71168b7485496e3365f5bc664ed" + "secret": "82d3e65651ac89124448cb88b5f4cd009f6c321f58ada0fca6e9e3f2d1c5889e" } } ] @@ -22493,7 +25482,7 @@ "examples": [ { "description": [ - "This example opens three channels at once, with amounts 200,000 sats, 3,000,000 sats", + "This example opens three channels at once, with amounts 20,000 sats, 30,000 sats", "and the final channel using all remaining funds (actually, capped at 16,777,215 sats", "because large-channels is not enabled):" ], @@ -22503,71 +25492,67 @@ "params": { "destinations": [ { - "id": "0201f42e167959c74d396ac57652fcea63c63940f78e8239cce5720df4d85ef857@127.0.0.1:7272", - "amount": "200000sat" + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d@127.0.0.1:34785", + "amount": "20000sat" }, { - "id": "0304a2468065535f9459567686e0f02b40f06e341d3eb2a62ec6763bcf2ccfd207@127.0.0.1:7373", - "amount": "0.03btc" + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199@127.0.0.1:46213", + "amount": "0.0003btc" }, { - "id": "0391f4c475050bb15871da5a72b1f3a1798de3d2e5fb4ffa262899b8d8e1f0b764@127.0.0.1:7474", + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e@127.0.0.1:38251", "amount": "all" } - ] + ], + "feerate": "10000perkw", + "commitment_feerate": "2000perkw" } }, "response": { - "tx": "02000000000101fbe3c68db87b72f82c3f5447b0bc032469c78e71f229ac99c230807ff378a9d80000000000fdffffff04400d0300000000002200202e9897ed5f9b237aa27fd5d02d24157cd452b0d3f0a5bb03d38ff73f9f8f384bffffff0000000000220020439d797ada249e1e12f8d27cabb7330de3c8de0456fb54892deb7b9c72b0ff7c1dc9b50400000000225120046e3966a2d5e43c1f1e0676161905782e1e7c00811485c618f5144f328f4e2bc0c62d0000000000220020e36fd5c03c3586c3763d8b4c9d8650f396ff1c8a460137fb09b60ee82536a3b20140ea4d564e91c919b50a2d32886f1d414de773491119beb1364b92f15d6d03e1810e5ddea89c265e42f2e96bb028dfb3aa0b5b30072ddcc78daad727503c53e37fa9010000", - "txid": "90dc53922b70628fc9e7804ad0b8cd0fb41f050d94ffa2db3b16e918c96c022a", + "tx": "02000000000107feed56fc07fe7a3094f5f7c104f4ac8f3c96f6bf7c44df90619307d6f75c06850200000000fdffffff72819eb0ce9892c1025fd83e5e1a39fd30f79f843b489a32c20f45e67f37c5f30100000000fdffffff187f8d1b7292d57a46e23ae746c530741b8493dff74a7f62ca7e200204f6ec800000000000fdfffffffeed56fc07fe7a3094f5f7c104f4ac8f3c96f6bf7c44df90619307d6f75c06850100000000fdffffff07e45ab0c8dc4bc9a42d260c71f3a722bd104e28623693e84e302eb62b8554940000000000fdffffff187f8d1b7292d57a46e23ae746c530741b8493dff74a7f62ca7e200204f6ec800700000000fdffffff187f8d1b7292d57a46e23ae746c530741b8493dff74a7f62ca7e200204f6ec800400000000fdffffff040a8b250700000000220020f7bbe8f915381b4b9b1ca14cccbfd156eea19888550d01a5014f977e98c7fc8c204e000000000000220020369444aad3ac8c5452be625479f761587c42fbf66fecf644447daabc73c498223075000000000000220020d90c23ede7b77f89f4cae93da9326ba176d158a0b65faeaede5684c3c0f7c839a86100000000000022512018ece00b736f9ed77ed3a87426643c242223e3d6116a4cd6d90946f73de2ce71024730440220296f0d677ae2151a2fceb00c717483488f46aff309e28f36934ec3bcf914443f02204a7a20186d9b936e029c6b55df302386ad306f6738176945cf5d8607c18d16c7012102272a9a25f1ffed52fab04a2cc88aeab135b53723856a8f1481c26417f88a922e02473044022063c77ad73bd1993abc48b04b2f7b66ab7aa34f56f55c69b1c3e1868a4580554c0220466333d7e6e9163ec6ad6ef755be6e61a79a6a50ac8ad32d071b2819f2a113a60121029da47016812598be384212ce15793496c0ec2176a87e81c6432dae964f87c9870247304402205dfb4fcf67b12cf0fc3a1f3527bc37964c1604fb7ac11df2fd80b2bde605689d02203bbd1bcf5f92a6cd31c9459c9252d84fcd102fdfc8e367360e71ef047c704015012103d034f788f410c2ec2d89d161df3c3715f965248aa53eace463d10eca443eb1f20247304402203b12894f094c85c94bf7a898ddfe8d82359486aedb56b0891e5db83fee628dff0220478b954fd0514de5ff0d3273ed93d54f87e7d90e63f2d4b478a9a7669af2e1110121028a599168d3c97debc71bc66e6270ecf054f300d888309ba05471a482175dd9300140508f9706e9d6353d0a19a9128353fc8090948de09ee79afc35ae10c17ab0f894ec04eabf9187082bd31d3b63e9e52d99cbaef4c1f79dd6121024a7d3b4d994ec014054bdc1bab81661fd3ad8c0a65402abf2c2228da8f2150b6ce0cb8fddafd4c25a0318cc16cdbf72c5142dd6bbccb606cc7c2c39f91a218309dc5dadb7a74fe56b024730440220203ba0cc960cb70555e2096ecba5a5992b6b35ff621f736625360f836d208ce202207fa53d5ac33847fc166e03d888ef27c709dc65bfb79ece85d9d93bdda62c0ca501210267f4468ffafe6f919ae871f57f09690467f494e83e0358dc64d10472f9072f4c9b000000", + "txid": "9c3d4a6491eaa04c378101a7a7836f07409d04db8295b14930f89f7562744e18", "channel_ids": [ { - "id": "0201f42e167959c74d396ac57652fcea63c63940f78e8239cce5720df4d85ef857", - "channel_id": "25c8253e66a860d17916cc0c21386e310eba9900030a68ec6ff6f59a8401a872", - "outnum": "0" + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "channel_id": "a9c39915cfa357205e3597ec62d92c541a2be7f44b9c6292e126aeddb11bf97e", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, + "outnum": 1 }, { - "id": "0304a2468065535f9459567686e0f02b40f06e341d3eb2a62ec6763bcf2ccfd207", - "channel_id": "51749d724892a406896f6bf2e2f8c0b03399d0436691f294839897fa167e6521", - "outnum": "3" + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "channel_id": "a4a379248e49d207cc984646e632e1a31105a85708b9d6d961a5018fdd489f5a", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, + "outnum": 2 }, { - "id": "0391f4c475050bb15871da5a72b1f3a1798de3d2e5fb4ffa262899b8d8e1f0b764", - "channel_id": "7e1414e72c081f0754fa18c1657cedabe696aa9ffeaf0b936bfbe3a28f2829d1", - "outnum": "1" - } - ], - "failed": [] - } - }, - { - "request": { - "id": "example:multifundchannel#2", - "method": "multifundchannel", - "params": { - "destinations": [ - { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59@localhost:41939", - "amount": 50000 - } - ], - "feerate": "10000perkw", - "commitment_feerate": "2000perkw" - } - }, - "response": { - "tx": "0200000000010100a8ceb6f76c49c8c0c809ca359461540708a9a5ac56e56e6a7aaafb35f4d3850000000000fdffffff0250c30000000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd0623ff030000000022512063ffee4ea7d51e6cadf9086e286a2527922aaa25b8c53aebf32fa32a0a627f5a02473044022064763837f2cc84507eb1fc28c9e95d51174e1da4b8755da8e67fe21e37d0a8b402206295d0f19625f014819361a20572b936d81f6c5ba419e56997e882f3a7be094a012103d745445c9362665f22e0d96e9e766f273f3260dea39c8a76bfa05dd2684ddccf66000000", - "txid": "ecba36e93bcf40542d43a05ef550bb0e4be51d766aa2ec8c5640a0d431ab0d06", - "channel_ids": [ - { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "channel_id": "060dab31d4a040568ceca26a761de54b0ebb50f55ea0432d5440cf3be936baec", + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", + "channel_id": "e13472d6512413eb1bf03b9a0bb391d0e4152fd337fa6d1014e3de5e131918d9", "channel_type": { "bits": [ - 12 + 12, + 22 ], "names": [ - "static_remotekey/even" + "static_remotekey/even", + "anchors/even" ] }, "outnum": 0 @@ -22578,20 +25563,20 @@ }, { "request": { - "id": "example:multifundchannel#3", + "id": "example:multifundchannel#2", "method": "multifundchannel", "params": { "destinations": [ { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59@localhost:44663", + "id": "03a389b3a2f7aa6f9f4ccc19f2bd7a2eba83596699e86b715caaaa147fc37f3144@127.0.0.1:34785", "amount": 50000 }, { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d@localhost:34631", + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199@127.0.0.1:46213", "amount": 50000 }, { - "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199@localhost:34617", + "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518@127.0.0.1:39877", "amount": 50000 } ], @@ -22599,12 +25584,12 @@ } }, "response": { - "tx": "020000000001023041611dac05004825ab64781b4a33bf622380bf90196fae689196b1850a1f8f0000000000fdffffff5646519c565466c9588a88400ec71a39a2c0b6988beadb32491a13d9b89f85360100000000fdffffff0250c3000000000000220020181492c29a989f099fd2cf412c74b192dd095e81f4e4f6bec45bd1fbfdd2cfd983720000000000002251203e8a03f678bb7ca048baecc39788530560ea049816d604f72925e425288446c80140caa3b93c6667e4fe0026417cc87ae9dfd16d80018e7c6dcd6dfcee4d6cab7c7e84181baeb95ba25934ad1aa6b57f83c8287bf1b727123350b35549a3abe15b060140b3c6626b9b57081cc7eb5e4f518669764d265fb84316d8fb610e19ede13c5a370c1072861b909ec923acec980adb4a3e488ee3c6f9c49164bd4596945b52f62678000000", - "txid": "1fcc6d46200443ad21e3a1a1628b862bafd0d75c0b4454f5494957097bc7930d", + "tx": "0200000000010289da71f14f2e28c351f3f2cea6c9008fbf316cd353f6a084a17851afd37e5be70000000000fdffffffdcb684b96d9a2a37ef441c5eca75d15ef35ca8e16a6df21dca5fb6558400ca840000000000fdffffff022610250700000000225120def24e878a66b695c4d5b414b42b7ce94471dac985bb0afb0367e8bbb92c5a5250c30000000000002200209bd3269fda069b7ee0584622d458bb437635b3a179265dee3843ef18f42f35c601404a5e8638f6961d1c42609a5497346af9ba4cffb7f44cc8869c7e158627a8bb35884652fe1927d0b1917e9c22328339c33adedf93a7c86d90edba49eef4d949f301400373733215aeb64ca95e21b16be5772d3ad2ba7fa92faf842eeffab2c5741a66076cd1fb8af1c6c65456eeaf05f9ac80ce5502ae3ff88c40b632d8785bcd63799c000000", + "txid": "313dc9366eeab30a094fb85297673187cfb93aec0ec8610215f75d129d7c06e9", "channel_ids": [ { "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", - "channel_id": "0d93c77b09574949f554440b5cd7d0af2b868b62a1a1e321ad430420466dcc1f", + "channel_id": "09eb55872cd9039ecd08281af756e23b15aad4129fd6a9bcd71b472114ebf43a", "channel_type": { "bits": [ 12, @@ -22615,24 +25600,24 @@ "anchors/even" ] }, - "outnum": 0 + "outnum": 1 } ], "failed": [ { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "03a389b3a2f7aa6f9f4ccc19f2bd7a2eba83596699e86b715caaaa147fc37f3144", "method": "connect", "error": { "code": 401, - "message": "All addresses failed: 127.0.0.1:44663: Connection establishment: Connection refused. " + "message": "All addresses failed: 127.0.0.1:34785: Cryptographic handshake: peer closed connection (wrong key?). " } }, { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", "method": "connect", "error": { - "code": 401, - "message": "All addresses failed: 127.0.0.1:34631: Connection establishment: Connection refused. " + "code": 402, + "message": "disconnected during connection" } } ] @@ -22736,17 +25721,17 @@ "params": { "outputs": [ { - "bcrt1qyusnugshkn6kh5vmdjpe8hylvxlxjy3ns0hmrs": "2222000msat" + "bcrt1q84payf4ucfcpnt0994arm3f20tqmu29cna738w": "2222000msat" }, { - "bcrt1q6r4vvt7uack33qf9n05umfxy8h5s2rdcmq7ra3": "3333000msat" + "bcrt1q64wyjwvrmdj3uyz8w32mr4qgcv08a833zepjm3": "3333000msat" } ] } }, "response": { - "tx": "02000000000101b75863b811587b4c15bb94d9285c31d6369b8ff609e44de399936f8acb268f600000000000fdffffff03050d000000000000160014d0eac62fdcee2d1881259be9cda4c43de9050db8ae0800000000000016001427213e2217b4f56bd19b6c8393dc9f61be691233d4b5f5050000000022512063ffee4ea7d51e6cadf9086e286a2527922aaa25b8c53aebf32fa32a0a627f5a0247304402203a001463da125de5615ff1c18f9cd4a1d2a138c91d40189d350821ac8fb3ae4f02207a507eec27e15fe43476233cd9fe8b690ebd265073a58ed18ff79a1416886f18012103d745445c9362665f22e0d96e9e766f273f3260dea39c8a76bfa05dd2684ddccf66000000", - "txid": "94e803b98257855569d35b675d65fb4fa0061a8b5f828992e2104a2882bb18bf" + "tx": "02000000000101057342aca7062873a4edd5a673980757885e5da8f68de3af254fe7c26d46e0700000000000fdffffff03df420700000000002251202b5dd0613b6e534f572dbcf4311b66e6cc8bb07e285928ddb6fa5791e4737874ae080000000000001600143d43d226bcc27019ade52d7a3dc52a7ac1be28b8050d000000000000160014d55c493983db651e10477455b1d408c31e7e9e310140beb27b31860b45464367b0f08334a0c90f3409ad176b9e21a35079495d6ce3dee0bbed786225ae56f59294466c9a14daf983375486dccaad7df3a7bc56b03faa87000000", + "txid": "85065cf7d607936190df447cbff6963c8facf404c1f7f594307afe07fc56edfe" } }, { @@ -22756,35 +25741,32 @@ "params": { "outputs": [ { - "BCRT1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KYGT080": 1000 - }, - { - "bcrt1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qzf4jry": 1000 + "bcrt1p97zrhgxgm6wscsdx8gjafj4jyqetunat7fynrk4cyg2rz6lzrr9q6dlrp2": 1000 }, { - "bcrt1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k0ylj56": 1000 + "bcrt1qm7k64cvd2ljw758ptwrrm8ny30u67ea3cfkxpn": 1000 }, { - "BCRT1SW50QT2UWHA": 1000 + "bcrt1qswadp7rqx7m0zx2tffhzmqfansdrpfesr2la7k": 1000 }, { - "bcrt1zw508d6qejxtdg4y5r3zarvaryv2wuatf": 1000 + "bcrt1q68wfpfam8tu3a457jv7u8r64tdvqltgfs0kj84": 1000 }, { - "bcrt1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvseswlauz7": 1000 + "bcrt1qq7g9ccvfcxhg4lcj2e4s8u6l75tdzl5y7krmtl": 1000 }, { - "bcrt1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesyga46z": 1000 + "bcrt1pp9uw53lnrtt9v8vkemhpf6z3jfex2dkyu8je6z0jzlem2a3tqccqvseg2y": 1000 }, { - "bcrt1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqc8gma6": 1000 + "bcrt1q5sacyx5hjrugpcgn5w2mw9aq7d2tnkwxmmjp06": 1000 } ] } }, "response": { - "tx": "02000000000101dc5a50dfbafc30697b930b44e763ff7a255475d17d975fa0e2003431312098cf0100000000fdffffff09e803000000000000225120000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433e803000000000000046002751ee8030000000000002a5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6e80300000000000022512079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817983b939700000000002251200518e92cd94e0f62c06f126dff98b9abe79b7ed845a156d5245678e26554475de803000000000000160014751e76e8199196d454941c45d1b3a323f1433bd6e8030000000000002200201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262e803000000000000125210751e76e8199196d454941c45d1b3a323e803000000000000220020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e8643301407f0d9bc098c5439ff611507b6a7d403047ed4e0b883f293db19d4e109d350a24f790acb55547384ff2a23fcfde0eba9af7cebc321c19cfc4817ecd47d50c2cd854000000", - "txid": "062383a7c9a19a2768939087a5c89826a4ea3531080f20cc06aa1cbf431be505" + "tx": "02000000000101b621d886a10f33d5ad58c163a35cddf03bd435e3ed100f14af3fcdac1a7dff510100000000fdffffff08e803000000000000160014dfadaae18d57e4ef50e15b863d9e648bf9af67b1e8030000000000002251200978ea47f31ad6561d96ceee14e85192726536c4e1e59d09f217f3b5762b0630b53e1e000000000022512000dea9b3b059044ed411fe24d7bff4d1b3bbdd09a16034a096a4b175f7f5ac0fe80300000000000016001407905c6189c1ae8aff12566b03f35ff516d17e84e803000000000000160014a43b821a9790f880e113a395b717a0f354b9d9c6e80300000000000016001483bad0f86037b6f1194b4a6e2d813d9c1a30a730e803000000000000160014d1dc90a7bb3af91ed69e933dc38f555b580fad09e8030000000000002251202f843ba0c8de9d0c41a63a25d4cab22032be4fabf24931dab82214316be218ca0247304402203c885a48d44614905673678d31e1c6a42af612ca6cd20d65a2e81670cd11bf8a0220738dc66ca4c1c1d466d6195ddaaf7b0c98a60769b782c282ad1f9db30bb9784201210330a75acaed258be6bc02da9fab058abbe0e770caceb7c6496eaaea7014c3d39b87000000", + "txid": "80ecf60402207eca627f4af7df93841b7430c546e73ae2467ad592721b8d7f18" } } ] @@ -22860,7 +25842,7 @@ "params": {} }, "response": { - "bech32": "bcrt1qq8adjz4u6enf0cjey9j8yt0y490tact93fzgsf" + "bech32": "bcrt1qcqqvkswps3e6ck3jmqf86f9tcaeke5z04d3tv4" } }, { @@ -22868,11 +25850,11 @@ "id": "example:newaddr#2", "method": "newaddr", "params": { - "addresstype": "bech32" + "addresstype": "p2tr" } }, "response": { - "bech32": "bcrt1qq8adjz4u6enf0cjey9j8yt0y490tact93fzgsf" + "p2tr": "bcrt1phtprcvhz842sxe8qw0yryvc0g6n6dw2puweklcpnfye273kjpfhs0d6d2e" } } ] @@ -23156,15 +26138,15 @@ "id": "example:offer#1", "method": "offer", "params": { - "amount": "1msat", - "description": "test for 1msat" + "amount": "10000msat", + "description": "Fish sale!" } }, "response": { - "offer_id": "f61cca153d1948dade19349792d9bcdc9cef687fd27db0b553a67979f55aae48", + "offer_id": "dca9774ba2925b48c42eb12e599c09389d9d80d44445c4d0c944556c7228746e", "active": true, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqyqs5rn5v4ehggrxdaezqvtdwdshg93pqfnwgkvdr57yzh6h92zg3qctvrm7w38djg67kzcm4yeg8vc4cq63s", + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqgn3qzs2ge5hx6pqwdskcefpzcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", "used": false, "created": true } @@ -23174,16 +26156,16 @@ "id": "example:offer#2", "method": "offer", "params": { - "amount": "100000sat", - "description": "quantity_max test", - "recurrence": "1week" + "amount": "1000sat", + "description": "Coffee", + "quantity_max": 10 } }, "response": { - "offer_id": "f7a501e51e2a90d032150b9100b1977c625f05cfda22469bdc81d8a20b1e303f", + "offer_id": "f901018768e13ea2da95f437749e24d22d47b2a6ea3030ef66ae0281df49d94b", "active": true, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqszltcgqpgghzatpde6xjaretakkz7pqw3jhxaqkyypxdeze35wncs2l2u4gfzyrpds00e6yakfrt6ctrw5n9qanzhqr2xq6qgqsw", + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqv85ysq2qepk7enxv4j3gqg2zcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", "used": false, "created": true } @@ -23272,12 +26254,12 @@ "id": "example:openchannel_abort#1", "method": "openchannel_abort", "params": { - "channel_id": "aec3dfd0c7643a23b679cd2e493c053f8fdf621ff2624949f9582c4118b818c6" + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5" } }, "response": { - "channel_id": "aec3dfd0c7643a23b679cd2e493c053f8fdf621ff2624949f9582c4118b818c6", - "channel_canceled": true, + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "channel_canceled": false, "reason": "Abort requested" } } @@ -23454,6 +26436,95 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:openchannel_bump#1", + "method": "openchannel_bump", + "params": [ + "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + 1000000, + "cHNidP8BAF4CAAAAAbMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQAAAAD9////AUFZ3AsAAAAAIlEgO+E35aPNS3YQRaiMByjTJDUYNvBO1Z39o3m42EZGUreYAAAAAAEAcQIAAAABl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywAAAAAAP3///8Ceh/00gAAAAAWABSauB3UBW2CVXly9l1sU6aMmVAq+ADC6wsAAAAAFgAUA8/shxXh9ASjbsAR5COPhjKfkJyXAAAAAQEfAMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnAAA", + "15000perkw" + ] + }, + "response": { + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEITP+kZdFBsOIAAQMIQEIPAAAAAAABBCIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfDPwJbGlnaHRuaW5nAQg8VGAuu93kPAABAwhBWdwLAAAAAAEEIlEgO+E35aPNS3YQRaiMByjTJDUYNvBO1Z39o3m42EZGUrcM/AlsaWdodG5pbmcBCJhXLSQQ2IEcAA==", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, + "commitments_secured": false, + "funding_serial": 4347205294156014600, + "requires_confirmed_inputs": false + } + }, + { + "request": { + "id": "example:openchannel_bump#2", + "method": "openchannel_bump", + "params": { + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "amount": 1000000, + "initialpsbt": "cHNidP8BAF4CAAAAAbMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQAAAAD9////AUFZ3AsAAAAAIlEgO+E35aPNS3YQRaiMByjTJDUYNvBO1Z39o3m42EZGUreYAAAAAAEAcQIAAAABl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywAAAAAAP3///8Ceh/00gAAAAAWABSauB3UBW2CVXly9l1sU6aMmVAq+ADC6wsAAAAAFgAUA8/shxXh9ASjbsAR5COPhjKfkJyXAAAAAQEfAMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnAAA", + "funding_feerate": "15000perkw" + } + }, + "response": { + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIQCsNB0i02NIAAQMIQVncCwAAAAABBCJRIDvhN+WjzUt2EEWojAco0yQ1GDbwTtWd/aN5uNhGRlK3DPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, + "commitments_secured": false, + "funding_serial": 10324133783552127000, + "requires_confirmed_inputs": false + } + }, + { + "request": { + "id": "example:openchannel_bump#3", + "method": "openchannel_bump", + "params": [ + "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + 2000000, + "cHNidP8BAF4CAAAAAbMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQAAAAD9////AWINzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAAEAcQIAAAABl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywAAAAAAP3///8Ceh/00gAAAAAWABSauB3UBW2CVXly9l1sU6aMmVAq+ADC6wsAAAAAFgAUA8/shxXh9ASjbsAR5COPhjKfkJyXAAAAAQEfAMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnAAA", + "18750perkw" + ] + }, + "response": { + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIwRR1uu1r8GoAAQMIgIQeAAAAAAABBCIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfDPwJbGlnaHRuaW5nAQjdRD+FoUsRIAABAwhiDc0LAAAAAAEEIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2gM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, + "commitments_secured": false, + "funding_serial": 15943938423967650000, + "requires_confirmed_inputs": false + } + } ] }, "lightning-openchannel_init.json": { @@ -23676,18 +26747,14 @@ "id": "example:openchannel_init#1", "method": "openchannel_init", "params": { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "amount": 999000, - "initialpsbt": "cHNidP8BADMCAAAAAYbThUhSzYr7ph6Z434bdcW7eoirYOFMmUt2GXZ79sF/AQAAAAD9////AGYAAAAAAQDeAgAAAAABARVD4QKlmwy8SNcNypf1o9TzbIFZjj4dqVzHAL0SLDoTAAAAAAD9////AjOv9ikBAAAAFgAUXJGglH7At5HOVY4ZHp0+19kv655AQg8AAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFlAkcwRAIgVIxRXqIykOOxm/6YPaFFx2Qh1618qlXPUhDiliVQ2KUCIHQcHniUTcm1XT8SyRE8ev52jm0uiIYum15XcR/tPh+NASEC3Pby7xL4+Ig/Z8TchQ0QT1upLGet3da8qjSjgHO9LOJlAAAAAQEfQEIPAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQA=", - "channel_type": [ - 12, - 22 - ] + "id": "03a00f49374e4bb876e766e9305e5fefa86e53dbc89a4f27d794b02f59ca316426", + "amount": 1000000, + "initialpsbt": "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AahhAAAAAAAAIlEg+3d9jpNmK0getyg5W+Mp31CPIRDKcJg/mZs/uaVrQ+GZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA" } }, "response": { - "channel_id": "53fa2b1ca0d8f21abeaaac0495ab9925cdfaf2ca8b04dbe4aeb061823e1ff2c8", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABARVD4QKlmwy8SNcNypf1o9TzbIFZjj4dqVzHAL0SLDoTAAAAAAD9////AjOv9ikBAAAAFgAUXJGglH7At5HOVY4ZHp0+19kv655AQg8AAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFlAkcwRAIgVIxRXqIykOOxm/6YPaFFx2Qh1618qlXPUhDiliVQ2KUCIHQcHniUTcm1XT8SyRE8ev52jm0uiIYum15XcR/tPh+NASEC3Pby7xL4+Ig/Z8TchQ0QT1upLGet3da8qjSjgHO9LOJlAAAAAQEfQEIPAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIIbThUhSzYr7ph6Z434bdcW7eoirYOFMmUt2GXZ79sF/AQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCMCDK/6LyRi8AAEDCFg+DwAAAAAAAQQiACDYM+8ZRsbTj0OCG/yzqLt2buFQn9LuMPDZqFFcgmCmfAz8CWxpZ2h0bmluZwEIchtFHfZ5FBgA", + "channel_id": "a5be438539f73c018a98a4b9dd557d62430881c56552025b5579d180cc3887ed", + "psbt": "cHNidP8BAgQCAAAAAQMEmQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAGzBTzTCENk6ggdL+V/LHCYeHlRIcHBtyNYdon39dT7vwEAAAAA/f///wKAhB4AAAAAACIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aJgAAAABAStiDc0LAAAAACJRIMkYPt6RIfPG/RSYgixHp2AnMidmnJCVCIQ7rFu9gT9oAQ4gmJB/+YSzg1wUV8PgrzFq46BKlvP/F562hdVYA8IjSHoBDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEI/+im2BTLcnwAAQMIqGEAAAAAAAABBCJRIPt3fY6TZitIHrcoOVvjKd9QjyEQynCYP5mbP7mla0PhDPwJbGlnaHRuaW5nAQhfx1o3nKFaVgABAwhAQg8AAAAAAAEEIgAgBkixRgS2irzkjzD4bs/Wm7V/PQFNNgUvPR5aBVpSJHoM/AlsaWdodG5pbmcBCHHI3g73GwAQAA==", "channel_type": { "bits": [ 12, @@ -23699,7 +26766,7 @@ ] }, "commitments_secured": false, - "funding_serial": 8222241539686471000, + "funding_serial": 8199047277484638000, "requires_confirmed_inputs": false } }, @@ -23707,15 +26774,15 @@ "request": { "id": "example:openchannel_init#2", "method": "openchannel_init", - "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount": 16777216, - "initialpsbt": "cHNidP8BADMCAAAAAQVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAAAAAAD9////AGYAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQA=" - } + "params": [ + "03a00f49374e4bb876e766e9305e5fefa86e53dbc89a4f27d794b02f59ca316426", + 500000, + "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AfZRxQsAAAAAIlEg21kTTo7K2doCG6F2JqgaDjc1kRCrH7AL08oPVVJhuE+ZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA" + ] }, "response": { - "channel_id": "252d1b0a1e57895e84137f28cf19ab2c35847e284c112fefdecc7afeaa5c1de7", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIAVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAQ8EAAAAAAEQBP3///8M/AlsaWdodG5pbmcBCLR8RjOq9lmcAAEDCAAAAAEAAAAAAQQiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQz8CWxpZ2h0bmluZwEIZZtc7LD4y9YA", + "channel_id": "b3b2e46371876858784cd1b87ecf406e32d8f98b7a44b7f436d1dca317ce0f1b", + "psbt": "cHNidP8BAgQCAAAAAQMEmQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAGzBTzTCENk6ggdL+V/LHCYeHlRIcHBtyNYdon39dT7vwEAAAAA/f///wKAhB4AAAAAACIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aJgAAAABAStiDc0LAAAAACJRIMkYPt6RIfPG/RSYgixHp2AnMidmnJCVCIQ7rFu9gT9oAQ4gmJB/+YSzg1wUV8PgrzFq46BKlvP/F562hdVYA8IjSHoBDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEILfzCFE4M1pQAAQMIIKEHAAAAAAABBCIAIMG0H4vceOuMkzqvG9svQmglTygLSd9kn0qrQFRmpEvIDPwJbGlnaHRuaW5nAQhU+Hu3eGH5tgABAwj2UcULAAAAAAEEIlEg21kTTo7K2doCG6F2JqgaDjc1kRCrH7AL08oPVVJhuE8M/AlsaWdodG5pbmcBCG0sGEoFgVYuAA==", "channel_type": { "bits": [ 12, @@ -23727,7 +26794,7 @@ ] }, "commitments_secured": false, - "funding_serial": 7321547790872006000, + "funding_serial": 6122779721339107000, "requires_confirmed_inputs": false } } @@ -23821,6 +26888,38 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:openchannel_signed#1", + "method": "openchannel_signed", + "params": { + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "signed_psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcIgICRz15z0oQ57qDTAJqrEPqGLCn+3Xs2lGEv6+oxGYV9rdHMEQCIHlCL2oKhnYn6hhaUG8+V+8D6GHFlI61OM507VB6aBwoAiACA2d5TnCdlJ1j2rF/EIHkxl3W0hBp3QqweO7hEul9aQEiBgJHPXnPShDnuoNMAmqsQ+oYsKf7dezaUYS/r6jEZhX2twgDz+yHAAAAAAEOILMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCEArDQdItNjSAAEDCEFZ3AsAAAAAAQQiUSA74Tflo81LdhBFqIwHKNMkNRg28E7Vnf2jebjYRkZStyEHE0cioCqqq2UZ2npxQi9Q6DXNZheODM6F4GjHHS3XScEJAG/ctUwEAAAADPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==" + } + }, + "response": { + "tx": "02000000000101b3053cd3084364ea081d2fe57f2c709878795121c1c1b723587689f7f5d4fbbf0100000000fdffffff024159dc0b000000002251203be137e5a3cd4b761045a88c0728d324351836f04ed59dfda379b8d8464652b740420f0000000000220020c9bc5c063caefbf7a6c7814407b5627b4f81a8b56ecbe932c682f9cbac0d19df02473044022079422f6a0a867627ea185a506f3e57ef03e861c5948eb538ce74ed507a681c280220020367794e709d949d63dab17f1081e4c65dd6d21069dd0ab078eee112e97d69012102473d79cf4a10e7ba834c026aac43ea18b0a7fb75ecda5184bfafa8c46615f6b798000000", + "txid": "ed994900569f2fddca6d86675f2e2247000197ee69aa53348e63e16fbaf39409", + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5" + } + }, + { + "request": { + "id": "example:openchannel_signed#2", + "method": "openchannel_signed", + "params": [ + "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcIgICRz15z0oQ57qDTAJqrEPqGLCn+3Xs2lGEv6+oxGYV9rdHMEQCIA8+zCzZ59t2OEFHWefZeTypY89RRQ8dMQCjtGWw6gskAiArELH1MvjW6j1G1CKnLZdV+/oabLDU48ingGSPFDOYxwEiBgJHPXnPShDnuoNMAmqsQ+oYsKf7dezaUYS/r6jEZhX2twgDz+yHAAAAAAEOILMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCMEUdbrta/BqAAEDCICEHgAAAAAAAQQiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z3wz8CWxpZ2h0bmluZwEI3UQ/haFLESAAAQMIYg3NCwAAAAABBCJRIMkYPt6RIfPG/RSYgixHp2AnMidmnJCVCIQ7rFu9gT9oIQeffk+gJsmVIxDZ8UKPKgJB9CLvaUr9xqOEogpzJx1hbAkAEioNzwUAAAAM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==" + ] + }, + "response": { + "tx": "02000000000101b3053cd3084364ea081d2fe57f2c709878795121c1c1b723587689f7f5d4fbbf0100000000fdffffff0280841e0000000000220020c9bc5c063caefbf7a6c7814407b5627b4f81a8b56ecbe932c682f9cbac0d19df620dcd0b00000000225120c9183ede9121f3c6fd1498822c47a760273227669c909508843bac5bbd813f680247304402200f3ecc2cd9e7db7638414759e7d9793ca963cf51450f1d3100a3b465b0ea0b2402202b10b1f532f8d6ea3d46d422a72d9755fbfa1a6cb0d4e3c8a780648f143398c7012102473d79cf4a10e7ba834c026aac43ea18b0a7fb75ecda5184bfafa8c46615f6b798000000", + "txid": "7a4823c20358d585b69e17fff3964aa0e36a31afe0c357145c83b384f97f9098", + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5" + } + } ] }, "lightning-openchannel_update.json": { @@ -24034,13 +27133,13 @@ "id": "example:openchannel_update#1", "method": "openchannel_update", "params": { - "channel_id": "c3a282c1136f44dc2e499c116a9d9e6ea64649c3eabdd396cb96fb30a86fad8e", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIAVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAQ8EAAAAAAEQBP3///8M/AlsaWdodG5pbmcBCH932EuFXyxeAAEDCEBCDwAAAAAAAQQiACA/FzDCfUe+WFEBa+aPSY4TZTYt6liPHz5OHo04w2gQ3wz8CWxpZ2h0bmluZwEI42voJCAYLKQA" + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIQCsNB0i02NIAAQMIQVncCwAAAAABBCJRIDvhN+WjzUt2EEWojAco0yQ1GDbwTtWd/aN5uNhGRlK3DPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==" } }, "response": { - "channel_id": "c3a282c1136f44dc2e499c116a9d9e6ea64649c3eabdd396cb96fb30a86fad8e", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIAVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAQ8EAAAAAAEQBP3///8M/AlsaWdodG5pbmcBCH932EuFXyxeAAEDCEBCDwAAAAAAAQQiACA/FzDCfUe+WFEBa+aPSY4TZTYt6liPHz5OHo04w2gQ3wz8CWxpZ2h0bmluZwEI42voJCAYLKQA", + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIQCsNB0i02NIAAQMIQVncCwAAAAABBCJRIDvhN+WjzUt2EEWojAco0yQ1GDbwTtWd/aN5uNhGRlK3DPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==", "channel_type": { "bits": [ 12, @@ -24052,21 +27151,22 @@ ] }, "commitments_secured": true, - "funding_outnum": 0 + "funding_outnum": 1, + "close_to": "51202321a432c9022a560c7dae78bdb72c605c373961edd29c42aa98c183782d052a" } }, { "request": { "id": "example:openchannel_update#2", "method": "openchannel_update", - "params": { - "channel_id": "c3a282c1136f44dc2e499c116a9d9e6ea64649c3eabdd396cb96fb30a86fad8e", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIAVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAQ8EAAAAAAEQBP3///8M/AlsaWdodG5pbmcBCH932EuFXyxeAAEDCEBCDwAAAAAAAQQiACA/FzDCfUe+WFEBa+aPSY4TZTYt6liPHz5OHo04w2gQ3wz8CWxpZ2h0bmluZwEI42voJCAYLKQA" - } + "params": [ + "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIwRR1uu1r8GoAAQMIgIQeAAAAAAABBCIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfDPwJbGlnaHRuaW5nAQjdRD+FoUsRIAABAwhiDc0LAAAAAAEEIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2gM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==" + ] }, "response": { - "channel_id": "c3a282c1136f44dc2e499c116a9d9e6ea64649c3eabdd396cb96fb30a86fad8e", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIAVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAQ8EAAAAAAEQBP3///8M/AlsaWdodG5pbmcBCH932EuFXyxeAAEDCEBCDwAAAAAAAQQiACA/FzDCfUe+WFEBa+aPSY4TZTYt6liPHz5OHo04w2gQ3wz8CWxpZ2h0bmluZwEI42voJCAYLKQA", + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIwRR1uu1r8GoAAQMIgIQeAAAAAAABBCIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfDPwJbGlnaHRuaW5nAQjdRD+FoUsRIAABAwhiDc0LAAAAAAEEIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2gM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==", "channel_type": { "bits": [ 12, @@ -24079,7 +27179,7 @@ }, "commitments_secured": true, "funding_outnum": 0, - "close_to": "5120eed745804da9784cc203f563efa99ffa54fdf01b137bc964e63c3124070ffbe6" + "close_to": "51202321a432c9022a560c7dae78bdb72c605c373961edd29c42aa98c183782d052a" } } ] @@ -24424,18 +27524,37 @@ "request": { "id": "example:pay#1", "method": "pay", + "params": [ + "lnbcrt500n1pn2s396sp5h5tz6fpm3dxvrlwcnwmfq85v45wfj43mdmplpce6ku2vmfdhrx5qpp50z9w5u57meydx9dpn889mmtkz6tqrfsa65hfwd88ql4hc5hyu70qdqcdsenygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqt5m8qx0t25a0gygya7u4sxulyyp2dec87pwsxuuwtg0u66c07703g9j6vlwgmlhqk7qgn95qw7allhnuj2m9hf0xkcr2zkaxltv3t6gqjcdpll" + ] + }, + "response": { + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "payment_hash": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "created_at": 1722303686.2193663, + "parts": 1, + "amount_msat": 50000, + "amount_sent_msat": 50001, + "payment_preimage": "0e07efd883f66b6b22ec7f2e7116e203c3fecc22eb8596a73eaf06c4befb0641", + "status": "complete" + } + }, + { + "request": { + "id": "example:pay#2", + "method": "pay", "params": { - "bolt11": "lni1qqgxr7gha7gusyg83lsr8qcqg4axgq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqtypg3hgetnwsszycn0d36rzv3zypjx2umrwf5hqarfdahzcg8sn7jmpuyl423pvggzvmj9nrga83q474e2sjygxzmq7ln5fmvjxh4skxafx2pmx9wqx5v9qgqxyfhyvyg6pdvu4tcjvpp7kkal9rp57wj7xv4pl3ajku70rzy3pavzzqjz06c8s2vvmrpjlkcse0txx0gmc6jalqqxmeyjm75qcnfnqxwyt2sfsqnxu3vc68fug904w25y3zpskc8huazwmy34av93h2fjswe3tsp4rqpe8qlx9xssexfc0aguke3q6u0jgw2qmn008mzu04mkmqmjmhes3gcpqdqdnzl270s48vsp635rd4jm04snvgkcp65qlkgp8qztu2mdp7c5uqpj2rll3pzu56st537rct3v62gfqeamzthjuwkr0pkvsdnnffpn4sq9sz0lryaufktx0nfxlffum3yesqev5gwqqqqqqqqqqqqqqqzsqqqqqqqqqqqqr5jt9hav2gqqqqqq5szxtvwkyz5zq2000hlwvadejz366lqjt9sd2j4rf5tfd9rgmmyegt4dqd34cf6v4gqkfvppqfnwgkvdr57yzh6h92zg3qctvrm7w38djg67kzcm4yeg8vc4cq633uzqn3n74ccym4wcvq20vsx7lmk450kprpvlrh4cukk8xy9ptjcef4rnhytnkyn4vnxxtd57yeaksze2s30y26cs6u3rjd9322eg9puk24q" + "bolt11": "lnbcrt1u1pn2s3xxsp5xk8hs6zuv0yqhq7hhl0sps6mxuj78pzwryejaljh48vr4htykujqpp593ndc8wrukteld5j4nqnt6tedavh8ezv48dmrkqen3440ajnre5qdqcdsenxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq0asve9rdtfd9fe20u5vjujzmm0phpq538z8ndhn5ts62aflhktqn6338e45xcxkyf7askjjq25ksxt4eqarjjame8wfdmau7kq7m4csqs0n32n" } }, "response": { - "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "payment_hash": "29ef7dfee675b990a3ad7c125960d54aa34d16969468dec9942ead03635c274c", - "created_at": 1706153504.76628, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "payment_hash": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68", + "created_at": 1722303688.41859, "parts": 1, - "amount_msat": 100, - "amount_sent_msat": 100, - "payment_preimage": "6634c1b549c6615d234832f377e06d5a5ab088c40cebdc5cfb8c1262030abcad", + "amount_msat": 100000, + "amount_sent_msat": 100000, + "payment_preimage": "1ce8370d3a179cee3af25a5a6c7058e8e12033a842efd6d34abae53334bc94bf", "status": "complete" } } @@ -24511,6 +27630,7 @@ "id": "example:ping#1", "method": "ping", "params": { + "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", "len": 128, "pongbytes": 128 } @@ -24524,7 +27644,7 @@ "id": "example:ping#2", "method": "ping", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "len": 1000, "pongbytes": 65535 } @@ -24725,7 +27845,116 @@ "examples": [ { "request": { - "id": "example:plugin#1", + "id": "example:plugin#1", + "method": "plugin", + "params": { + "subcommand": "start", + "plugin": "/root/lightning/tests/plugins/allow_even_msgs.py" + } + }, + "response": { + "command": "start", + "plugins": [ + { + "name": "/root/lightning/plugins/autoclean", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/chanbackup", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/bcli", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/commando", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/funder", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/topology", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/keysend", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/offers", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/pay", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/recover", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/txprepare", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/cln-renepay", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/spenderp", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/sql", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/bookkeeper", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/tests/plugins/allow_even_msgs.py", + "active": true, + "dynamic": true + } + ] + } + }, + { + "request": { + "id": "example:plugin#2", + "method": "plugin", + "params": { + "subcommand": "stop", + "plugin": "/root/lightning/tests/plugins/allow_even_msgs.py" + } + }, + "response": { + "command": "stop", + "result": "Successfully stopped allow_even_msgs.py." + } + }, + { + "request": { + "id": "example:plugin#3", "method": "plugin", "params": [ "list" @@ -24735,96 +27964,82 @@ "command": "list", "plugins": [ { - "name": "~/lightning/plugins/autoclean", + "name": "/root/lightning/plugins/autoclean", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/chanbackup", + "name": "/root/lightning/plugins/chanbackup", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/bcli", + "name": "/root/lightning/plugins/bcli", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/commando", + "name": "/root/lightning/plugins/commando", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/funder", + "name": "/root/lightning/plugins/funder", "active": true, "dynamic": true }, { - "name": "~/lightning/plugins/topology", + "name": "/root/lightning/plugins/topology", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/keysend", + "name": "/root/lightning/plugins/keysend", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/offers", + "name": "/root/lightning/plugins/offers", "active": true, "dynamic": true }, { - "name": "~/lightning/plugins/pay", + "name": "/root/lightning/plugins/pay", "active": true, "dynamic": true }, { - "name": "~/lightning/plugins/txprepare", + "name": "/root/lightning/plugins/recover", "active": true, - "dynamic": true + "dynamic": false }, { - "name": "~/lightning/plugins/cln-renepay", + "name": "/root/lightning/plugins/txprepare", "active": true, "dynamic": true }, { - "name": "~/lightning/plugins/spenderp", + "name": "/root/lightning/plugins/cln-renepay", "active": true, - "dynamic": false + "dynamic": true }, { - "name": "~/lightning/plugins/sql", + "name": "/root/lightning/plugins/spenderp", "active": true, - "dynamic": true + "dynamic": false }, { - "name": "~/lightning/plugins/bookkeeper", + "name": "/root/lightning/plugins/sql", "active": true, - "dynamic": false + "dynamic": true }, { - "name": "~/lightning/target/debug/examples/cln-plugin-startup", + "name": "/root/lightning/plugins/bookkeeper", "active": true, "dynamic": false } ] } - }, - { - "request": { - "id": "example:plugin#2", - "method": "plugin", - "params": { - "subcommand": "stop", - "plugin": "fail_htlcs.py" - } - }, - "response": { - "command": "stop", - "result": "Successfully stopped fail_htlcs.py." - } } ] }, @@ -24871,6 +28086,28 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:preapproveinvoice#1", + "method": "preapproveinvoice", + "params": { + "bolt11": "lnbcrt1230n1pn2s38psp5jf2zk7py4wmutyq4pdr6783egft24nkyhfrxegrzzqnef2matw2qpp5rf5zgqyexdt7q5ean83cvcjuc3jafn8etm3c0za6xldwcyllvffqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydqcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgq8nn5qkcp9xl5u7dlqamdys6e6yc0ngyqe676cqajnwax6657verj7at5gvdqu6nk3l0wcagq4muyhqqms4t0t9sfvyazpga5eywj6uqpyc409e" + } + }, + "response": {} + }, + { + "request": { + "id": "example:preapproveinvoice#2", + "method": "preapproveinvoice", + "params": [ + "lnbcrt1240n1pn2s38psp5ufjqj6kuxlvl65xue9p06ulyvwf9sm0utxlch59d0ynl05778vwspp5qlacxkrdmc2p50yl8lsl75pwmlhve2ret2yd2f34z7jfs7yffwvqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydgcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqkml60qaytvnd08p57w7enuna95s7cqej8cfuvsgjzpeq9u83s0hqh60667nrp40qkqxkdu36z8wqtmac5z3208rwyn0q2pv56sgz5dcp9mn5hc" + ] + }, + "response": {} + } ] }, "lightning-preapprovekeysend.json": { @@ -24934,6 +28171,32 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:preapprovekeysend#1", + "method": "preapprovekeysend", + "params": { + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "payment_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "amount_msat": 1000 + } + }, + "response": {} + }, + { + "request": { + "id": "example:preapprovekeysend#2", + "method": "preapprovekeysend", + "params": [ + "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", + "0101010101010101010101010101010101010101010101010101010101010101", + 2000 + ] + }, + "response": {} + } ] }, "lightning-recover.json": { @@ -24991,17 +28254,19 @@ "id": "example:recover#1", "method": "recover", "params": { - "hsmsecret": "cl10leetsd35kw6r5de5kueedxgqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdeuq7xuh94k9g" + "hsmsecret": "6c696768746e696e672d36000000000000000000000000000000000000000000" } }, - "response": {} + "response": { + "result": "Recovery restart in progress" + } }, { "request": { "id": "example:recover#2", "method": "recover", "params": { - "hsmsecret": "6c696768746e696e672d31000000000000000000000000000000000000000000" + "hsmsecret": "cl10leetsd35kw6r5de5kueedxyesqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqluplcg0lxenqd" } }, "response": { @@ -25069,13 +28334,23 @@ "method": "recoverchannel", "params": [ [ - "0000000000000001c3a7b9d74a174497122bc52d74d6d69836acadc77e0429c6d8b68b48d5c9139a022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d5904017f0000019f0bc3a7b9d74a174497122bc52d74d6d69836acadc77e0429c6d8b68b48d5c9139a0000000000000000000186a000021000" + "0000000000000006f4e1de801de57374d5737da622611e3a1ad9f16d5df9c30fceecc11ce732eeeb022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d5900017f0000019b987577c455da982b1753df79c56f9d8d2b75d1401e60a5af322ab27b13b20d75970000000100000000000f42400003401000", + "000000000000000121bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d00017f000001e610e23fcc9e6306ce636b203217b22409bf9bab2211f9f432de781dedb6377dab5a0000000100000000000f42400003401000", + "00000000000000027512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d00017f000001e610ee1db407eb3e47be3e93e1abc05b13806ee7aef8550c517a4974c72bf91866410000000100000000000f42400003401000", + "0000000000000003222d999f537e32e9458c5db17a63e012dcced61340de06fda5bc30566270b0aa0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f0000019bc5b15661ec5c17599de0858401b72d6be66c34b48a3bb6e679542809f395e6bb2000000000000000000bebb3cb0003401000", + "0000000000000004a4a379248e49d207cc984646e632e1a31105a85708b9d6d961a5018fdd489f5a0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f000001c1ac184e7462759ff83049b19582db049d40076f83a7a70181374ca0ea91644a3d9c0000000200000000000075300003401000", + "000000000000000509eb55872cd9039ecd08281af756e23b15aad4129fd6a9bcd71b472114ebf43a0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f000001c1ace9067c9d125df7150261c80eec3ab9cf8731679752b84f090ab3ea6e36c93d3100000001000000000000c3500003401000" ] ] }, "response": { "stubs": [ - "c3a7b9d74a174497122bc52d74d6d69836acadc77e0429c6d8b68b48d5c9139a" + "f4e1de801de57374d5737da622611e3a1ad9f16d5df9c30fceecc11ce732eeeb", + "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", + "222d999f537e32e9458c5db17a63e012dcced61340de06fda5bc30566270b0aa", + "a4a379248e49d207cc984646e632e1a31105a85708b9d6d961a5018fdd489f5a", + "09eb55872cd9039ecd08281af756e23b15aad4129fd6a9bcd71b472114ebf43a" ] } } @@ -25263,18 +28538,21 @@ "id": "example:renepay#1", "method": "renepay", "params": { - "invstring": "lnbcrt1230n1pjmxj9jsp5suc4cag0lv3wemllkvms56e6ll0w867cczqfttuu8cpfl089f9kspp56wvxtdh8fxg5r5y3kg3klxceakqaydskwzatga25v95da8nzkmwqdqjv3jhxcmjd9c8g6t0dcxqyjw5qcqp99qxpqysgqkmyhymt0j7hy38vzqxx465s4ys0fg78flnjqfx4clvdq9mrmgglpcnjrrnhtk7maa87pfvjez88hke8w97zvuecwswaf9gzyqlsthegpza67eu" + "invstring": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7", + "amount_msat": 400000 } }, "response": { - "payment_preimage": "0a3fd704b34f47d6e306dbac78141753be83848d3a19725c972abfc367dcc591", - "payment_hash": "d39865b6e7499141d091b2236f9b19ed81d2361670bab475546168de9e62b6dc", - "created_at": 1706248370.6267352, - "parts": 1, - "amount_msat": 123000, - "amount_sent_msat": 123000, + "bolt11": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7", + "amount_msat": 400000, + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "created_at": 1722303718.0730329, + "groupid": 1, + "parts": 2, "status": "complete", - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" + "payment_preimage": "af67b48518e78e157db404d13cb42987c31e034634203d10b224302b05fc6c90", + "amount_sent_msat": 400000 } }, { @@ -25282,19 +28560,20 @@ "id": "example:renepay#2", "method": "renepay", "params": { - "invstring": "lnbcrt1pja0f9asp50kzadmeyy78eymjvhnlk5dznl3g5k5x8agh52ewjtg0jclas4ylspp5crsutd9hg05lxyhzphdcuyng6z3knrsdae83mxwawa842gz3vj3sdqjv3jhxcmjd9c8g6t0dcxqyjw5qcqp99qxpqysgqr5yzhxmup4muyaz6x8u2dy4qyu9t5qzuf5k9xayvj5kg7tve60gjk4jrv2l76exnj2xkuzhtwky23pkkxedzy6p9yrsgyqdwj7dv5gsp4zcw6v", - "amount_msat": 548925 + "invstring": "lnbcrt40n1pn2s3xxsp5j329vez86jvxw6543zlcla2fusm7v6h74pf7ftmmyfv6zm9uedlspp5j6xpxmq8cwd305vj2dvd6dh4mkr0s6guvehvyleymedgf4vsm3ysdqaveskjmr9vssxgetnvdexjur5d9hkuxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqk6uwy8pkv42jzhdna3z4vxpwkapdzzpn2tcpjnqj738nlpkjc583l9v72vlskt8y33rr4z3jma32xx7ve0jfy7anvn6r98cr5flhcuqqhr4shx" } }, "response": { - "payment_preimage": "a635e92d024beebfc58519e6544888aa560ba3bcaba7e74924e4b8432eaa56f5", - "payment_hash": "c0e1c5b4b743e9f312e20ddb8e1268d0a3698e0dee4f1d99dd774f55205164a3", - "created_at": 1708631229.7841823, - "parts": 1, - "amount_msat": 548925, - "amount_sent_msat": 548925, + "bolt11": "lnbcrt40n1pn2s3xxsp5j329vez86jvxw6543zlcla2fusm7v6h74pf7ftmmyfv6zm9uedlspp5j6xpxmq8cwd305vj2dvd6dh4mkr0s6guvehvyleymedgf4vsm3ysdqaveskjmr9vssxgetnvdexjur5d9hkuxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqk6uwy8pkv42jzhdna3z4vxpwkapdzzpn2tcpjnqj738nlpkjc583l9v72vlskt8y33rr4z3jma32xx7ve0jfy7anvn6r98cr5flhcuqqhr4shx", + "amount_msat": 4000, + "payment_hash": "968c136c07c39b17d1925358dd36f5dd86f8691c666ec27f24de5a84d590dc49", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "created_at": 1722303719.1643083, + "groupid": 1, + "parts": 2, "status": "complete", - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" + "payment_preimage": "8815ee921dba644c076f9f879abb520d8539a6913856a439752eaaadff1e21ac", + "amount_sent_msat": 4000 } } ] @@ -25341,8 +28620,7 @@ "created_at", "groupid", "amount_msat", - "status", - "notes" + "status" ], "properties": { "bolt11": { @@ -25436,6 +28714,33 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:renepaystatus#1", + "method": "renepaystatus", + "params": { + "invstring": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7" + } + }, + "response": { + "paystatus": [ + { + "bolt11": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7", + "amount_msat": 400000, + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "created_at": 1722303718.0730329, + "groupid": 1, + "parts": 2, + "status": "complete", + "payment_preimage": "af67b48518e78e157db404d13cb42987c31e034634203d10b224302b05fc6c90", + "amount_sent_msat": 400000 + } + ] + } + } ] }, "lightning-reserveinputs.json": { @@ -25552,17 +28857,17 @@ "id": "example:reserveinputs#1", "method": "reserveinputs", "params": { - "psbt": "cHNidP8BAFwCAAAAAkwJVUqB0xXTO7JZ3PnPdGnxoYfQxhU+xqXGFYXsyX0RAAAAAAD9////TAlVSoHTFdM7slnc+c90afGhh9DGFT7GpcYVhezJfREBAAAAAP3///8AAAAAAAAAAA==" + "psbt": "cHNidP8BADMCAAAAAfcJ+tPRXly5UFuX2jOOOBUcBBjfDGAC8vLWfrkJf/O2AQAAAAD9////AAAAAAAAAA==" } }, "response": { "reservations": [ { - "txid": "117dc9ec8515c6a5c63e15c6d087a1f16974cff9dc59b23bd315d3814a55094c", + "txid": "b6f37f09b97ed6f2f202600cdf18041c15388e33da975b50b95c5ed1d3fa09f7", "vout": 1, "was_reserved": false, "reserved": true, - "reserved_to_block": 175 + "reserved_to_block": 226 } ] } @@ -25572,95 +28877,17 @@ "id": "example:reserveinputs#2", "method": "reserveinputs", "params": { - "psbt": "cHNidP8BAP32AQIAAAAMgnW099dbh1uD153ih5eU5WhluynLxekXjAOjkEdNBg8BAAAAAP3///9FWKQt8C+1y4741+beFSqWAaj9DuvzHNpxvpxS+GB8lwEAAAAA/f///6E5TAGqktI29Oso6b9kZZoAFFGGvpJQUM8VO+3LMTlmAAAAAAD9////nSDT7hrkuoQtAV1yNnbpkJsB5ifKoM2zP+CcLPfis1gBAAAAAP3///+P1rW90UXfD0gIk58h3sXxxy3ZfJJLP0H1I4Jpzy/87QEAAAAA/f///w0UKZ/s9DnPpV+FJ8h2BEI7tl+qVxSGRFRv9FYw4girAQAAAAD9////EPNsUFrEOZyfjbqbh8rfHQ4C9RQECw12n3c1yhFqkzoAAAAAAP3///8QW9LEsSmuvSnvVzy+FDktM7ewQmZnIJI/TJMahLmSzwEAAAAA/f///+4edbWRHDdRJcMeHHElgSmb+nENPsz/g/0AmAEU6hXeAAAAAAD9////T15YLGmk7HBsrL+awdcxi3db3esp8AcCTS9XGrEnfoAAAAAAAP3///8q7xInvEk7J0Ir9cpKXqU2lArUskkYLrimIE0+Yb6a2QEAAAAA/f///8hBLKyMa2zRJqwNOk7DmsDIfG7IvJtQiJ+QnkkHl6atAAAAAAD9////AAAAAAAAAAAAAAAAAAAAAAAA", - "exclusive": false + "psbt": "cHNidP8BADMCAAAAAQmU87pv4WOONFOqae6XAQBHIi5fZ4Ztyt0vn1YASZntAAAAAAD9////AAAAAAAAAA==" } }, "response": { "reservations": [ { - "txid": "0f064d4790a3038c17e9c5cb29bb6568e5949787e29dd7835b875bd7f7b47582", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "977c60f8529cbe71da1cf3eb0efda801962a15dee6d7f88ecbb52ff02da45845", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "663931cbed3b15cf505092be865114009a6564bfe928ebf436d292aa014c39a1", - "vout": 0, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "58b3e2f72c9ce03fb3cda0ca27e6019b90e97636725d012d84bae41aeed3209d", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "edfc2fcf698223f5413f4b927cd92dc7f1c5de219f9308480fdf45d1bdb5d68f", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "ab08e23056f46f5444861457aa5fb63b420476c827855fa5cf39f4ec9f29140d", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "3a936a11ca35779f760d0b0414f5020e1ddfca879bba8d9f9c39c45a506cf310", - "vout": 0, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "cf92b9841a934c3f9220676642b0b7332d3914be3c57ef29bdae29b1c4d25b10", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "de15ea14019800fd83ffcc3e0d71fa9b298125711c1ec32551371c91b5751eee", - "vout": 0, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "807e27b11a572f4d0207f029ebdd5b778b31d7c19abfac6c70eca4692c585e4f", - "vout": 0, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "d99abe613e4d20a6b82e1849b2d40a9436a55e4acaf52b42273b49bc2712ef2a", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "ada69707499e909f88509bbcc86e7cc8c09ac34e3a0dac26d16c6b8cac2c41c8", + "txid": "ed994900569f2fddca6d86675f2e2247000197ee69aa53348e63e16fbaf39409", "vout": 0, - "was_reserved": true, + "was_reserved": false, "reserved": true, - "reserved_to_block": 246 + "reserved_to_block": 226 } ] } @@ -25730,10 +28957,10 @@ "examples": [ { "request": { - "id": "example:sendcustommsg#5", + "id": "example:sendcustommsg#1", "method": "sendcustommsg", "params": { - "node_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "node_id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "msg": "77770012" } }, @@ -25951,23 +29178,23 @@ "id": "example:sendinvoice#1", "method": "sendinvoice", "params": { - "invreq": "lnr1qqg804wzdsyn8g4mf2yc22k8xvjpjzstwd5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gqsykppqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4nuzqw5w7y7xqm2rushk5a5n3mcuvqel954raykd5nqa830nq9hpd4s4fcnxw266vp9d5c8f3m3w40hmm6gm8akxx3rsnr7d4usunv0x3q8q", - "label": "payme for real!" + "invreq": "lnr1qqgypua5g7rp293k00s66ayvnv26czst2d5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gps7sjqtqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e7pq947t0ks7a4yejz8w79x4zj25s3pu6zrnw2e0v2ugdescpcqsq307z4p2dlxe92fv7xd43qut0pjkg4y094hupqyhsj8dlhvmmfng6sv", + "label": "test sendinvoice" } }, "response": { - "label": "payme for real!", - "bolt12": "lni1qqg804wzdsyn8g4mf2yc22k8xvjpjzstwd5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gqsykppqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4ngycqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qmcmtl30xtt7jdakfyhzm8f0gny6f4d2ukx5gurem04z8lfd2wza5qs9pz6wp9vu7cm6n4wmmrz77y4w6z5xv4q93yudkdtkl5zmzdzuawzqqex7gd5v0x0r83pqj82udd542fl4krh50s0dkx47d0hd5wh77g52xxl75ccpkt35mc8n282wslju9ufyys2y8qqqqqqqqqqqqqqqpgqqqqqqqqqqqqp6f9jm7k9yqqqqqq2gpr96l99lfspt25zqnyfgu7hznmt2tzkjdt92d2wc3dsq7keph7w8gudjs46spfzqrlu4gqs9vppqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky9muzqpze8kk43g0wh4h8qlac5lswwesrvsaxcza2f5j90c2h3ts8yzmn9g4mxqe89fngrqny8nf52xxuxep6548etda8lp876jr0nnxgdkdq", - "payment_hash": "4c89473d714f6b52c56935655354ec45b007ad90dfce3a38d942ba8052200ffc", - "amount_msat": 2, + "label": "test sendinvoice", + "bolt12": "lni1qqgypua5g7rp293k00s66ayvnv26czst2d5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gps7sjqtqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e5zvqyehytxx360zptatj4pygsv9kpal8gnkeyd0tpvd6jv5rkv2uqdgcq2s27mvxt0arlnulnmce53cuz00vzaqvgvhpphxgavl89r8zrdhaxqgzpvxkkmwsmxnuwflttmnpc8vtzwlgd3cfty3xwlnlc9r2gcjesguqqv4xey4m7l4wxem27vxyxfhwznlc62kffsd5xncx9w49m4g72u2y7lcl6a3x5cpu52j6gm8q5x0q8k7myxdzrsqqqqqqqqqqqqqqq5qqqqqqqqqqqqqayjedltzjqqqqqq9yq3n2s38p5cq442pq5qpm4ht26v8statwxcrl65uy26c9hx4dvy66f9x665eqqy90tpz25qc0gfqtqggzvmj9nrga83q474e2sjygxzmq7ln5fmvjxh4skxafx2pmx9wqx5v0qsqfkcrpht0d3nnt8txkcgf5wr6gzrlacls2gyrvj5hhwuu98shurrn6ayruunju7k9yu9clvaj354tr064ruuht88q5dj73kzru20uzj", + "payment_hash": "a003badd6ad30f05f56e3607fd538456b05b9aad6135a494dad5320010af5844", + "amount_msat": 1000000, "status": "paid", "pay_index": 1, - "amount_received_msat": 2, - "paid_at": 1708640865, - "payment_preimage": "305951ab02cb2ea5eb884dbfd8fb110b4e088ecb8338b3e84e8f9c70919c19bf", - "description": "simple test", - "expires_at": 1708640953, - "created_index": 2, + "amount_received_msat": 1000000, + "paid_at": 1722303714, + "payment_preimage": "6f154ed7d108349cb6385eba5f160294ef83862c2c560ba6446b2a3da5c2b3b3", + "description": "Simple test", + "expires_at": 1722303803, + "created_index": 3, "updated_index": 1 } } @@ -26306,26 +29533,26 @@ "id": "example:sendonion#1", "method": "sendonion", "params": { - "onion": "00034928294556b10308f9aeac7a240223d4d5f72097db1ef36a36b10cab937f2f205ed7218b47d4600eaf7fd390940bf9a6cdac99aafdb4783c468150eeeab9b57e56a06778d023ffb3bb84c7d8c2ad8868b61c28b566634af52c288ed6569583db66f5bd0edfb801c252f078020e1df6359af5969296b4698a71d17c5ca6e5ee4b64b7cce3ad0a1aa31e6be4d5fe3a31fa7a25259c640716020a9a248ca3ebb68eb823f8884b5df3710969f4c2ffb153779a923bab946ed43c1f6658d7f8e7e25303bb78ef4862fb550b8b1c79d522b035eedfda9ab70a61322522acf7233bb8ea2423958448fc8ac3d000835fda04bf661f1bf2ad2d091f506840bb2f10f82c0812149d99267a47824defe90877ed70db526b2200e18dccb92b17516de3778c055645728eadf4c74375aa0aae80a7773a536a908ca1e25c0fdca90e50ce0be05eeb973ec5e83ce3ab6b35818e021780428af81320a694483c1c15f64e685ba1fd3b1e1b926e6b4ec9eeeac8aca60c60e0f0f583e35e7f081dc6f4c64157e100c79c4c25101bed77cd9f93416f9a67d9f1916a782c498c38365af4a5fabb1b745fa840a054a06564c3f4b376aeb72cdd059d3794c82bbbf12a1f62234016a6912b384e7e4cebbd39ee4395aeff43c461e226d1e0151cce508a181a9c61275bf4b89e4556cf24df13b993dec96541555f8b9a699be9488568a11ac7f25849da62765472511ad74a6660c10e37f5fa13d4e4665ef7825ae1f2da4a86d5581912262de89b4b11a722fd127b31aa0d7fab8c679b07bf95e65cb80b2dacb5b90794399fb8f23823f68058431aa1c399b5baceccaf8521d004f45dba6ec1fddc54473343e9e67cd50cc3f2f3d8a5dab8a7ab9ae553dc3cd34e74b858da75975265f7c673a25e8d01a5130ab40eaba712b80c608cd0431b4b45ea0d81af595e21f24976608429127bf586f7507666500bc7245cf9266fa0bd0e58404c496e190c873cd143ace9048e9d5021c23967a24e09f2e54166e54b4ee8888dc1af535624e7ee8b426c1628175017a9e8a73eb1d0d49028a4f4d77897f3c08f1cd7bdee2b00f9bb9eadc49a69bf4f6c0cb2c95a16f03d7958f1b8f83cb40ae87ddf75f26050e2c2ed9f8f8523b3d389a50b217bda651dc21f095fe7d2d3851a0a6cf01051f3f3c6f1ad59ed46d44928d15a0e6e1bd4df4c99bdb82a05b0e781b69a73bc30fe579c8ac9fe8aeb6beb1c0f44def2775b7341af37e6ef58ceb34958b29d3e36112b78644612228761b8badc802f0b2b8fcaeb1db8f3a8db4afa2d7b4540a7c331db6f5141fa3909a513df875ff8a63f5b542d662781ca96a69e3b2925d6a63555b2c5825ffb2ad848d71122f54110e0d203000f3e9cc23b793c3540dfb8d881caedd25055a8f495e9e7a0391dbf9cbd9344f7df659ee8d3ce5ec16217ab83e1394ba991eb8ffd9a869f8ebb2e2428845e779979c57b5f8875f502728229a55ce87b3eba85c75264d30eaf7b373f6b09ba3086d9e98348d87b049468c2c30a6501cb2a3862f1703bbf29895e8b4262353eae720ed8ae678750011e2eb51f4800d3f4725fa873d7deec1c46f77a5f61c73dc938239e77f432bcc245c7b935413c51c0bc92bdaae144452aa95910909e46e500557961203f4e1483b9c09c124464907825e1ff74c87c58d6e2e91970baac9b89a554beca6df9acee16d77dd929d0caa7797e06f2c384c03fdedc89c697b9c34787a50cf399a8d7f195e79b347efc8267c474a477ce210f11049d432b280eaf3fccd451f6218d35c64cbd1006bcc54eeea8b856855c9aa92bc3adc6900a7c7a0eee09834c5a1f2da3d8ea9a478aea90c954952ad2a72d3856350ac3132d17e1e8116fa774066a22c857a827699c98285111a405e74685a3ae579ae78c545774f45491e4935bf4", + "onion": "0003ccc1f8876af4810e23bd4cccd8f2f38ee5dc117f527c783fefa4e632f857c98d588d2e3150d16b78f9458777502e4829b490e8a2d560841eb0c2368311bf9bb4e8ded0356badafd915839409ad60866c24dd7580b468c14097575565ca95425b9f44211d9ad0305ddba2391a70892ac8c9fd7c3b67d0fe22faf5a0b6905ee2e22278fe224e89ea72c3fcc598b35afaa255123e61ae7a697703e3bb8aec4d36ea487df6ec27942aadff0527d178c897e75f1ee284995196b5ead963ee9d0df798c8265c00c5c73daac917d298cc17e5d813189321d914c45ef30170c4d617dae12bb3a760d1665705e61bb6c52789e15623cefc68d96b86a6f17159c4a86bb196c9f5e40a0744d08d6da0cfd587717b6d0d074d42ac0893fa6ae1497c84824f1d27670d4e201af5e9e5a3493b603cfc209bb0ee41b573ca647c5b9882272c972cd18f19fd895e8995097d86882a473f4d26118a7ed656c5ea04c2a183b05cc0191d07fab5e78edab4ab8ec58e05e03f32d150449c0c8e3505e46ae58e77c87616144873f72f4571b00ccf8e71bcdf33a7d32345aecb660970fa73c4844ab157aa322f140f5d47b66a0590273728ddb5b8a7f3577cff5a268935b93fe598d6df4413c67c45efa9461abaf3294070a484418aa28c03ac20d08856eb0c74dfca851e8ed110bdcacb2a2fb90954b04e99986fde0678846a709120b5d1eeab9cde8d9f27d77448f4591e00bf30d7580703e6c189c658746cf7a7cc1430ce41f84244612b438c3d895333848e5f55e99b2a9d28860863c11aaa8e3ef01ead7ba1545156c356424c33aeeaa2f1e2c290d1d8dd52cd7b8116159025aba26db6fb81ad7f9cc4554c6f9f13d16defe38918b32d62a0516521934a0009a8d37c9a84689bfd8fc1f0beceb92701dca11175e0099d7541698956ba5d93efff996f538ee47717ae6c5cda98111bc28c822e99cf8957b707de270f447b6e52d30bcf9b8a9befd8663bc54612b543d0e167da67e2f295207b70857d0a7cae8932d905db2f48c873dec20aeafa07e15fa98a088e529424c8b404f03ba0ee78a6639fde5cd37dee42877ff6489ce1de5a8992cae25dd20a6521955c19129fdcc0ea157913373bf47a8018a1dd825a2f8e26194d5008161360ae9b25fc701b2accbe88eb47eee6a50b7ee6d6e169e3905e03ca72e00eb6a51b7ed3d27501715428368662b822e2262749d3e7d3243c4fd3d825b3e72bebdeebf6e035f1ad6634523ab5dc0335611c19c9936d006f2e4cd8818eb4f8b4857c8f35d18a4891e35ff91e3b54b384398574d673fcc8da50b22b8f485a41223c97e3b8ee5b8e5ff9c00a2cbfe7360509d3fee9248b5eaa81bb83da3be45dfa8cbbbf5c52ba8749c9d6261d4239feea1e7ce85ad40ad0c66bbeb1c6898626ae4e710a66f9c39a5ee94581353b46e070cfcff9a14e3f9a6108d55bb92852eb3a50e89b1e45d31b760f2a4e263a6a876ad638b123ffee7a2b0b48e16175e3eb92bfaad4dbe0af8b2bc1c15fec5a9d92d3970c2ffab2ab8fa2c9de0bd276680a4284707cd8543a97bca2394e9514236129f1c50a932f7e9bfb98c2aaa6ffc9a4a30641061246de6edf0f711a8d25d59af42ee4445b22ce2f832f3ece52c18ca62d90c590729e04c47accaec95b556ee2541c84843c54a116f5cc45bc251a8023b695f0bf79c43a97bece8a761d387a466821984fb5ec438af20d14cebb7f0026988c81b5a1b895ef94df61aa509e53083b4306c42132b5ce302fd5a2fbb1cee30a7078ccaa3bdccf781b8c9d6ae016a5f8e5cb13f7ac1f3fd0d74a182c9abea67d346f0dfcfc211aaa7ff47196465398fce3e6e0f3b73a944a7f57a90cc6a8f1bfcd385f8312e23af6f508f4f8a976d750660ac3d63630555a3a2e7fe158a982aaf0278d9f8819e5cb", "first_hop": { "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "channel": "103x3x0", + "channel": "109x1x1", "direction": 1, "amount_msat": 1002, "delay": 21, "style": "tlv" }, - "payment_hash": "f584c14bb23506acdd94cf3cea377f3cc5805f3cba5430bc3756ef83ede1a0dc" + "payment_hash": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13" } }, "response": { "message": "Monitor status with listpays or waitsendpay", - "created_index": 1, - "id": 1, - "payment_hash": "f584c14bb23506acdd94cf3cea377f3cc5805f3cba5430bc3756ef83ede1a0dc", + "created_index": 8, + "id": 8, + "payment_hash": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", "groupid": 1, "amount_sent_msat": 1002, - "created_at": 1706315098, + "created_at": 1722303689, "status": "pending" } } @@ -26688,79 +29915,39 @@ "request": { "id": "example:sendpay#1", "method": "sendpay", - "params": { - "route": [ - { - "amount_msat": 11000000, - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "delay": 5, - "channel": "103x1x0" - } - ], - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk", - "payment_secret": "82644944d3f70d42aad1d5f7b5d7a629e7afa30b529cc952a4c59fc0e3790ea2" - } - }, - "response": { - "message": "Monitor status with listpays or waitsendpay", - "created_index": 1, - "id": 1, - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", - "groupid": 1, - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 11000000, - "amount_sent_msat": 11000000, - "created_at": 1706152930, - "status": "pending", - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk" - } - }, - { - "request": { - "id": "example:sendpay#2", - "method": "sendpay", "params": { "route": [ { "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "channel": "103x1x0", + "channel": "109x1x1", "direction": 1, - "amount_msat": 4211, - "style": "tlv", - "delay": 24 + "amount_msat": 10001, + "delay": 15, + "style": "tlv" }, { "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "channel": "105x1x0", + "channel": "111x1x0", "direction": 0, - "amount_msat": 3710, - "style": "tlv", - "delay": 16 - }, - { - "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "channel": "107x1x0", - "direction": 1, - "amount_msat": 3210, - "style": "tlv", - "delay": 8 + "amount_msat": 10000, + "delay": 9, + "style": "tlv" } ], - "payment_hash": "bc747053329402620a26bdc187cd134cdb699130d85be499ecd24160aff04c5c", - "payment_secret": "c36a2fe9aced78c06960e2f21b369ed03f0492c97e53ba3b662163bcdaf1d7fa" + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", + "payment_secret": "64733783b118ff27576f72c473c0c52814f1f47c4de41492194ddd7855486024" } }, "response": { "message": "Monitor status with listpays or waitsendpay", "created_index": 2, "id": 2, - "payment_hash": "bc747053329402620a26bdc187cd134cdb699130d85be499ecd24160aff04c5c", + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", "groupid": 1, - "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "amount_msat": 3210, - "amount_sent_msat": 4211, - "created_at": 1708624260, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303675, "status": "pending" } } @@ -26838,25 +30025,12 @@ "id": "example:sendpsbt#1", "method": "sendpsbt", "params": { - "psbt": "some_psbt" - } - }, - "response": { - "txid": "05985072bbe20747325e69a159fe08176cc1bbc96d25e8848edad2dddc1165d0", - "tx": "02000000027032912651fc25a3e0893acd5f9640598707e2dfef92143bb5a4020e335442800100000017160014a5f48b9aa3cb8ca6cc1040c11e386745bb4dc932ffffffffd229a4b4f78638ebcac10a68b0561585a5d6e4d3b769ad0a909e9b9afaeae24e00000000171600145c83da9b685f9142016c6f5eb5f98a45cfa6f686ffffffff01915a01000000000017a9143a4dfd59e781f9c3018e7d0a9b7a26d58f8d22bf8700000000" - } - }, - { - "request": { - "id": "example:sendpsbt#2", - "method": "sendpsbt", - "params": { - "psbt": "cHNidP8BAM0CAAAABEV+dnFRINmyeHxi4Id0OrcuzI5au5/BlPtTfu7E2m3EAAAAAAD9////cv8oioDx+0NCEnjBSYtnwF0H4VR13j+bkyb5gOOQLUUBAAAAAP3///8ehOrKm7JEq6zflkp9+zmSwE1iPe1yh3KTXvk+om/legEAAAAA/f///2s31wNrI1UavMgjC1GyrOHNbxOm68KYa13WX/mGfmjcAQAAAAD9////AcEAPQAAAAAAFgAUyQltQ/QI6lJgICYsza18hRa5KoEAAAAAAAEAcQIAAAABTzfqjIqV1wPpqc/3/Cb+tMX5EDrLmnhb5BMNx3aB/hYAAAAAAP3///8CQEIPAAAAAAAWABR9CNmX36nN45+GhjqvD4LjLMMMg/+juSkBAAAAFgAUJB0adsMdjkacZWrLwyteqfOaTrRlAAAAAQEfQEIPAAAAAAAWABR9CNmX36nN45+GhjqvD4LjLMMMgyICA1p5u7tAbUvCjfBfpqhzKM+wKn4TdDvs3NHfz+BxwuAQRzBEAiBwFb9rA0nUVlIPGd2aaiRbJ+KH4MLM3Bu+f0JuXB/hwAIgT2rrIUG9gXBZoH9fcPjCnbbM1SR4GiLYGLeALB8yENoBIgYDWnm7u0BtS8KN8F+mqHMoz7AqfhN0O+zc0d/P4HHC4BAIfQjZlwAAAAAAAQBxAgAAAAGANpEFI+CgfALTim/MWsAa62g+EmFWrFrzBDBCmCB3MgAAAAAA/f///wKZKdgpAQAAABYAFB+xhfU1pgl9WIvDKzAHZp8UeNkzQEIPAAAAAAAWABQHHEnK0vQg88gF+fa5ilcmnLFBUGUAAAABAR9AQg8AAAAAABYAFAccScrS9CDzyAX59rmKVyacsUFQIgICXTcoCCnxhsuZXNzL8jirRWQBOTlzUTljJKNldd803f9HMEQCIDtx/kEoc4PHDDm4eX5SEOmuRGu7ShpEG7xKBbuD/NjiAiBYkIKod39dcBarCT7Dbchkuwx70tJhOxQSJi2EMioGrwEiBgJdNygIKfGGy5lc3MvyOKtFZAE5OXNROWMko2V13zTd/wgHHEnKAAAAAAABAHECAAAAAVHU7RCZylzRMdlMBJ2ba4XKxv0l7LdWVnPYS6mhkf60AAAAAAD9////Av5VbSkBAAAAFgAU0BhRKzRbIC6H+s6j86d6cMpTNNhAQg8AAAAAABYAFD1D0ia8wnAZreUtej3FKnrBvii4ZQAAAAEBH0BCDwAAAAAAFgAUPUPSJrzCcBmt5S16PcUqesG+KLgiAgKKWZFo08l968cbxm5icOzwVPMA2Igwm6BUcaSCF13ZMEcwRAIgNAeIVGvUj9MWM18am0dx3JtEf79iQMX7Rqz1tttes3ICIAtNCglUlvpSidAxc/xoiy9cA13bgimJx25G+eZXfYJeASIGAopZkWjTyX3rxxvGbmJw7PBU8wDYiDCboFRxpIIXXdkwCD1D0iYAAAAAAAEAcQIAAAABRX52cVEg2bJ4fGLgh3Q6ty7Mjlq7n8GU+1N+7sTabcQBAAAAAP3///8CMmGqKQEAAAAWABSxLq0p9YAKl+hX7pFc0K/X+PIWmUBCDwAAAAAAFgAUZhwjt5DdNJE3OvCx2L7Qh31c3iJlAAAAAQEfQEIPAAAAAAAWABRmHCO3kN00kTc68LHYvtCHfVzeIiICA/qclQheQrHlADzR9BgXjDDJbkrneVTKD8SMWIJv9OsORzBEAiBKABqNV7cF5DKhtd+m+ZEmWF21vBt2uBKnzeDuUFqvDwIgJc6+/6GQqIfz869kJpUFTAMYTeL2qWR6d28EQEOJgkMBIgYD+pyVCF5CseUAPNH0GBeMMMluSud5VMoPxIxYgm/06w4IZhwjtwAAAAAAAA==" + "psbt": "cHNidP8BAHsCAAAAApYPhUDCjBy/IhQro1NgHyHktDtz752euhXVr901aH1zAAAAAAD9////pVexPrCyRyESCD3U1cC5oifK1QBxTxBSKMaWE8H/R3UAAAAAAP3///8Buuz6CwAAAAAWABTJCW1D9AjqUmAgJizNrXyFFrkqgQAAAAAAAQCJAgAAAAGdA6aKwu4U7Zes8OwDJHp4bI3maidtrjOK6N85klZucAAAAAAA/f///wKBbNwLAAAAACJRIDXxGE9rRwyd80faYsSyjn7J7hCyILrDrM0iIJ3vADbqQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzWwAAAABASuBbNwLAAAAACJRIDXxGE9rRwyd80faYsSyjn7J7hCyILrDrM0iIJ3vADbqARNAslo/GrzGxD6jx0S7hhxvKR8Eus+sP130lZLzFdEP0jIHUZnjDgbwVW/xgkL6M6xdWTIft2LwO6Jg/VxrnLUVniEWn8HNAfLSdwuCgeK6vBpMJF7dN7ty0S4gcjpp309fAfYJAMEg7UIAAAAAAAEAcQIAAAAB5PVQktBZBw4nvG06jM4bpxNyROmXxJnOR8qYKNgjGfwAAAAAAP3///8CgIQeAAAAAAAWABSftnv87+5st9tMflXZxr/XSeMdHoxyG+0AAAAAFgAUQudNVnkeDGRH67h8YS0ySo/R6flrAAAAAQEfgIQeAAAAAAAWABSftnv87+5st9tMflXZxr/XSeMdHiICAyjMj8l44gnxaV+ltWVQYdsaqyMRtSQXaUW/EBXvLUuJRzBEAiA9G0zR8z6JjbBAeg4wDezU0rLQB462lpdGQJwqrUxQFwIgL70Z0p7ASr4w+lDjPk0+m6WY5PafSiEiEO4tFuoHsHMBIgYDKMyPyXjiCfFpX6W1ZVBh2xqrIxG1JBdpRb8QFe8tS4kIn7Z7/AAAAAAAAA==" } }, "response": { - "tx": "02000000000104457e76715120d9b2787c62e087743ab72ecc8e5abb9fc194fb537eeec4da6dc40000000000fdffffff72ff288a80f1fb43421278c1498b67c05d07e15475de3f9b9326f980e3902d450100000000fdffffff1e84eaca9bb244abacdf964a7dfb3992c04d623ded728772935ef93ea26fe57a0100000000fdffffff6b37d7036b23551abcc8230b51b2ace1cd6f13a6ebc2986b5dd65ff9867e68dc0100000000fdffffff01c1003d0000000000160014c9096d43f408ea526020262ccdad7c8516b92a810247304402207015bf6b0349d456520f19dd9a6a245b27e287e0c2ccdc1bbe7f426e5c1fe1c002204f6aeb2141bd817059a07f5f70f8c29db6ccd524781a22d818b7802c1f3210da0121035a79bbbb406d4bc28df05fa6a87328cfb02a7e13743becdcd1dfcfe071c2e0100247304402203b71fe41287383c70c39b8797e5210e9ae446bbb4a1a441bbc4a05bb83fcd8e20220589082a8777f5d7016ab093ec36dc864bb0c7bd2d2613b1412262d84322a06af0121025d37280829f186cb995cdccbf238ab45640139397351396324a36575df34ddff024730440220340788546bd48fd316335f1a9b4771dc9b447fbf6240c5fb46acf5b6db5eb37202200b4d0a095496fa5289d03173fc688b2f5c035ddb822989c76e46f9e6577d825e0121028a599168d3c97debc71bc66e6270ecf054f300d888309ba05471a482175dd9300247304402204a001a8d57b705e432a1b5dfa6f99126585db5bc1b76b812a7cde0ee505aaf0f022025cebeffa190a887f3f3af642695054c03184de2f6a9647a776f044043898243012103fa9c95085e42b1e5003cd1f418178c30c96e4ae77954ca0fc48c58826ff4eb0e00000000", - "txid": "43bb1c1bce6763ffe4d5df6b49f152f907f36f7849e55bb56075e2b256d17502" + "tx": "02000000000102960f8540c28c1cbf22142ba353601f21e4b43b73ef9d9eba15d5afdd35687d730000000000fdffffffa557b13eb0b2472112083dd4d5c0b9a227cad500714f105228c69613c1ff47750000000000fdffffff01baecfa0b00000000160014c9096d43f408ea526020262ccdad7c8516b92a810140b25a3f1abcc6c43ea3c744bb861c6f291f04bacfac3f5df49592f315d10fd232075199e30e06f0556ff18242fa33ac5d59321fb762f03ba260fd5c6b9cb5159e0247304402203d1b4cd1f33e898db0407a0e300decd4d2b2d0078eb6969746409c2aad4c501702202fbd19d29ec04abe30fa50e33e4d3e9ba598e4f69f4a212210ee2d16ea07b07301210328cc8fc978e209f1695fa5b5655061db1aab2311b524176945bf1015ef2d4b8900000000", + "txid": "8861058bff4b5310d587d7a8b6936886a290b0bdaf2485b53c79972a32daa758" } } ] @@ -27038,16 +30212,16 @@ "id": "example:setchannel#1", "method": "setchannel", "params": { - "id": "103x1x0", + "id": "123x1x1", "ignorefeelimits": true } }, "response": { "channels": [ { - "peer_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "channel_id": "90210d39d12a65d239ece267c5f48e0a82e7cb95724e658f6d99f370064faad1", - "short_channel_id": "103x1x0", + "peer_id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "channel_id": "ecabe6d86abdd57565b3fb7e7c5d724e60ca1a07633951769b5dbfa48dc884b3", + "short_channel_id": "123x1x1", "fee_base_msat": 1, "fee_proportional_millionths": 10, "minimum_htlc_out_msat": 0, @@ -27062,7 +30236,7 @@ "id": "example:setchannel#2", "method": "setchannel", "params": { - "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "id": "115x1x0", "feebase": 4000, "feeppm": 300, "enforcedelay": 0 @@ -27071,9 +30245,9 @@ "response": { "channels": [ { - "peer_id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", - "channel_id": "9c54c71bbbe59591cc3162e14fc4ff58c146f085c07d0f206ea679a8231d03ab", - "short_channel_id": "103x3x0", + "peer_id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", + "channel_id": "f8fc83a432cbfb2fffe222cc06727fdd977b5dd10ebd6707158e799e6f522d9f", + "short_channel_id": "115x1x0", "fee_base_msat": 4000, "fee_proportional_millionths": 300, "minimum_htlc_out_msat": 0, @@ -27227,16 +30401,16 @@ "id": "example:setconfig#1", "method": "setconfig", "params": [ - "autoclean-paidinvoices-age", - 1 + "autoclean-expiredinvoices-age", + 300 ] }, "response": { "config": { - "config": "autoclean-paidinvoices-age", - "value_int": 1, - "source": "/tmp/ltests-7u_8_rtu/test_autoclean_1/lightning-3/regtest/config:6", - "plugin": "~/lightning/plugins/autoclean", + "config": "autoclean-expiredinvoices-age", + "value_int": 300, + "source": "/tmp/.lightning/regtest/config:2", + "plugin": "/root/lightning/plugins/autoclean", "dynamic": true } } @@ -27245,25 +30419,6 @@ "request": { "id": "example:setconfig#2", "method": "setconfig", - "params": [ - "test-dynamic-config", - "changed" - ] - }, - "response": { - "config": { - "config": "test-dynamic-config", - "value_str": "changed", - "source": "/tmp/ltests-7u_8_rtu/test_dynamic_option_python_plugin_1/lightning-1/regtest/config:2", - "plugin": "~/lightning/tests/plugins/dynamic_option.py", - "dynamic": true - } - } - }, - { - "request": { - "id": "example:setconfig#3", - "method": "setconfig", "params": { "config": "min-capacity-sat", "val": 500000 @@ -27273,7 +30428,7 @@ "config": { "config": "min-capacity-sat", "value_int": 500000, - "source": "/tmp/ltests-nvfdbou2/test_setconfig_1/lightning-2/regtest/config:2", + "source": "/tmp/.lightning/regtest/config:4", "dynamic": true } } @@ -27344,12 +30499,12 @@ "id": "example:setpsbtversion#1", "method": "setpsbtversion", "params": { - "psbt": "cHNidP8BAAoCAAAAAAAAAAAAAA==", - "version": "2" + "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAA==", + "version": 0 } }, "response": { - "psbt": "cHNidP8BAgQCAAAAAQQBAAEFAQABBgEDAfsEAgAAAAA=" + "psbt": "cHNidP8BADUCAAAAAAFAQg8AAAAAACJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbbwAAAAAA" } }, { @@ -27357,12 +30512,12 @@ "id": "example:setpsbtversion#2", "method": "setpsbtversion", "params": [ - "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIJd6ICNAQALFOMhoUHuSVSuzcaUdkDKlk4K+A+DR9+4uAA==", - 0 + "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEDAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQABAwjV3DIAAAAAAAEEIlEgoqAceWUonu5Wtc/N25hWxw+kdsJk0h9xHGppr3dq5AMA", + 2 ] }, "response": { - "psbt": "cHNidP8BADUCAAAAAAFAQg8AAAAAACJRIJd6ICNAQALFOMhoUHuSVSuzcaUdkDKlk4K+A+DR9+4ubwAAAAAA" + "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEDAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQABAwjV3DIAAAAAAAEEIlEgoqAceWUonu5Wtc/N25hWxw+kdsJk0h9xHGppr3dq5AMA" } } ] @@ -27538,70 +30693,210 @@ "request": { "id": "example:showrunes#1", "method": "showrunes", + "params": { + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==" + } + }, + "response": { + "runes": [ + { + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", + "last_used": 1722303715.068215, + "unique_id": "0", + "restrictions": [], + "restrictions_as_english": "" + } + ] + } + }, + { + "request": { + "id": "example:showrunes#2", + "method": "showrunes", "params": {} }, "response": { "runes": [ { - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", + "last_used": 1722303715.068215, "unique_id": "0", "restrictions": [], "restrictions_as_english": "" }, { - "rune": "geZmO6U7yqpHn-moaX93FVMVWrDRfSNY4AXx9ypLcqg9MQ==", + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", + "last_used": 1722303714.9302285, "unique_id": "1", - "restrictions": [], - "restrictions_as_english": "" + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "id", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "id starts with 0266e4598d1d3c415f57" + } + ], + "english": "id starts with 0266e4598d1d3c415f57" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + } + ], + "restrictions_as_english": "id starts with 0266e4598d1d3c415f57 AND method equal to listpeers" }, { - "rune": "Bl0V_vkVkGr4h356JbCMCcoDyyKE8djkoQ2156iPB509MCZwZXI9MTAwMDAwMDAwMG5zZWM=", + "rune": "QUJEYMLGgiaJvMDv_MhR2hiMKIBTbq-PrL-KxcIlirQ9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "last_used": 1722303715.1267006, "unique_id": "2", "restrictions": [ { "alternatives": [ { - "fieldname": "per", - "value": "1000000000nsec", + "fieldname": "method", + "value": "pay", + "condition": "=", + "english": "method equal to pay" + } + ], + "english": "method equal to pay" + }, + { + "alternatives": [ + { + "fieldname": "pnameamountmsat", + "value": "10000", + "condition": "<", + "english": "pnameamountmsat < 10000" + } + ], + "english": "pnameamountmsat < 10000" + } + ], + "restrictions_as_english": "method equal to pay AND pnameamountmsat < 10000" + }, + { + "rune": "jEx3l0c7NMZPSDYT7xnXXvNA83z5PDNBHRQTIk1BwNw9MyZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTh8cGFycjA9MDI2NmU0NTk4ZDFkM2M0MTVmNTcyYTg0ODg4MzBiNjBmN2U3NDRlZDkyMzVlYjBiMWJhOTMyODNiMzE1YzAzNTE4", + "unique_id": "3", + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "id", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + }, + { + "alternatives": [ + { + "fieldname": "pnum", + "value": "1", "condition": "=", - "english": "per equal to 1000000000nsec" + "english": "pnum equal to 1" } ], - "english": "per equal to 1000000000nsec" + "english": "pnum equal to 1" + }, + { + "alternatives": [ + { + "fieldname": "pnameid", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, + { + "fieldname": "parr0", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "english": "pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 OR parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" } ], - "restrictions_as_english": "per equal to 1000000000nsec" - } - ] - } - }, - { - "request": { - "id": "example:showrunes#2", - "method": "showrunes", - "params": { - "rune": "Bl0V_vkVkGr4h356JbCMCcoDyyKE8djkoQ2156iPB509MCZwZXI9MTAwMDAwMDAwMG5zZWM=" - } - }, - "response": { - "runes": [ + "restrictions_as_english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 AND method equal to listpeers AND pnum equal to 1 AND pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 OR parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, { - "rune": "Bl0V_vkVkGr4h356JbCMCcoDyyKE8djkoQ2156iPB509MCZwZXI9MTAwMDAwMDAwMG5zZWM=", - "unique_id": "2", + "rune": "8_CRIJ4arWAz72A4ILOZ46MESSJtQQQ9iQZjU28qulA9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + "unique_id": "4", "restrictions": [ { "alternatives": [ { - "fieldname": "per", - "value": "1000000000nsec", + "fieldname": "id", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + }, + { + "alternatives": [ + { + "fieldname": "pnum", + "value": "1", "condition": "=", - "english": "per equal to 1000000000nsec" + "english": "pnum equal to 1" + } + ], + "english": "pnum equal to 1" + }, + { + "alternatives": [ + { + "fieldname": "pnameid", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "pnameid starts with 0266e4598d1d3c415f57" + }, + { + "fieldname": "parr0", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "parr0 starts with 0266e4598d1d3c415f57" } ], - "english": "per equal to 1000000000nsec" + "english": "pnameid starts with 0266e4598d1d3c415f57 OR parr0 starts with 0266e4598d1d3c415f57" } ], - "restrictions_as_english": "per equal to 1000000000nsec" + "restrictions_as_english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 AND method equal to listpeers AND pnum equal to 1 AND pnameid starts with 0266e4598d1d3c415f57 OR parr0 starts with 0266e4598d1d3c415f57" } ] } @@ -27669,12 +30964,24 @@ "request": { "id": "example:signinvoice#1", "method": "signinvoice", + "params": { + "invstring": "lnbcrt10n1pn2s38psp5qnpucxgdnkrqur47x6vtxdk7xpzy3lf47kjqehm6wnuadj9rt86qpp5qg2ltzlhu2yn08f99t9zz6fjzhfmajg8h4eum43zg3gr0gdeamcsdqlv3jhxcmjd9c8g6t0dcsxjmnktakrzvsxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqg2kj0ma6weclle29pwpsdvnwa4r4yhw38wvly80mtysjf463r5y428k23dkp8ty0fugtzyjpcjsy0w7hhfmyzkwrlve93cr8jnm5sdgqzv7m0x" + } + }, + "response": { + "bolt11": "lnbcrt10n1pn2s38psp5qnpucxgdnkrqur47x6vtxdk7xpzy3lf47kjqehm6wnuadj9rt86qpp5qg2ltzlhu2yn08f99t9zz6fjzhfmajg8h4eum43zg3gr0gdeamcsdqlv3jhxcmjd9c8g6t0dcsxjmnktakrzvsxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqq757xfxhd6hpctdfsq6vr2pltjvdv06t0z200hk0qslcydpf0pthmnzhu404w4qv89d25zv3smtsnyvqsaw6tf6tcl0lles6n29qh9gpyd3ml0" + } + }, + { + "request": { + "id": "example:signinvoice#2", + "method": "signinvoice", "params": [ - "lnbcrt10n1pjmxt3lsp5jumuz2sv3ca68kzd92hp3wdtpx8ghnxur65fs6maw6dyxsleqd0spp5nadvvh7uzk2qzh8d9d7tsxr08l9uaz2vjeuuahqtufjv52d0eassdq8d9h8vvgxqyjw5qcqp99qxpqysgq4rrn702eum6c9ld9khlz39vdyd8zcwrav5ygqvu6w54aep6yarkyfrnk990yf5prpasgzmj52stektf6mzwdl5hc6qlsglt2a0pwp0spwww44w" + "lnbcrt1250n1pn2s38psp5u22hlvy5mk7keq57m4fatz7aqnmh4whcuk45npdexrw4m5athcvqpp5ps4h5lt8waz5pprvad3skzssnksl2wxng985rcsuedp8teh29rkqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydscqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqyljtru0gcvqh7k5l9u8ulcuxw8fwa9qycyd32hl7wwdpjtlefgrpyjch6aprcdah2pthx3pku3y7c6dzluzjjy9c32cs3m5hqq6ww3sp0j4tr8" ] }, "response": { - "bolt11": "lnbcrt10n1pjmxt3lsp5jumuz2sv3ca68kzd92hp3wdtpx8ghnxur65fs6maw6dyxsleqd0spp5nadvvh7uzk2qzh8d9d7tsxr08l9uaz2vjeuuahqtufjv52d0eassdq8d9h8vvgxqyjw5qcqp99qxpqysgq3nhrd72qe7wmc2hvwhaqnx05y6dzxh2tal02kw055er7uutkkrcreccm37ce6wv7ee8q70ktlr9fy3fd635hc2k98a4svd9c8v4cpjsppm2eee" + "bolt11": "lnbcrt1250n1pn2s38psp5u22hlvy5mk7keq57m4fatz7aqnmh4whcuk45npdexrw4m5athcvqpp5ps4h5lt8waz5pprvad3skzssnksl2wxng985rcsuedp8teh29rkqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydscqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgq303kchnu5dvmrjam0m2yapk4d8vyx2uud3z0cpwsxern0d6f5sxqcg4rf05qczp5ncrpq4e6fsth28fxegv5gx9y7kt9f6tfhgw9dfqqckwpfv" } } ] @@ -27753,9 +31060,9 @@ } }, "response": { - "signature": "a2ec227012795f9d6b80a3f5ea98374c6d2886917517c05336799923fcf37caf08344c0431275e1a8189da01b444ae978007fe70f0cc9009f38cabe074ade87d", + "signature": "9ea05929890e40489edbd5fe0552d22bcffe00bbd29da4fcf93ed5d8f1973e421509071a64935231a126637e3615225ddda86d2d0926ae537d9c3be149f9b21f", "recid": "00", - "zbase": "d6tqaeuonjhi98mmont9m4wag7gg4krg1f4txonug3h31e9h6p6k6nbwjondnj46dkyausobstnk7fhyy998bhgc1yr98dfmhb4k54d7" + "zbase": "d6xkysjjtr8ry1r65xk9hbk14eih99oyzxjj5j8h9r9pms8t1h9rrfejyhpgjr41ggo1ca56gak1rzq7ibs14njgi3jz58b5hfr9uco9" } }, { @@ -27767,9 +31074,9 @@ } }, "response": { - "signature": "85843b010bc517b32eaafe70232e2c44bb5a354c74d2202390af1b272e4c6ac23ac3f97ea663d8b49116ad6c2d080515b43bcdf1ea4f38cdb18af0edf8209cd8", + "signature": "8149401781108c1c2fda12d91969bfe2306afe06c387394d47a83a85a14702a16b6fcd0060693da436ff1c2b25cc470d7db68fe45d833733d8dca660a3f4d67d", "recid": "00", - "zbase": "d6naeqabbxntxc3qim98ye3qftnmsstijt4prebd1nztsj3qjticrqsd9f9kca6as1etpmmcfwrykfpw8xg9d41x8dg5dnzo7zhnb8ga" + "zbase": "d6yw1oyzoreea8bx5ejp1gmjz9tdy4z6y5baqqkpe6wdibpbehbkn45x3wygy4j7wo5x68bmrzgrqdm7s486ezcdgh37tzfgcnt9jiu7" } } ] @@ -27844,26 +31151,23 @@ "id": "example:signpsbt#1", "method": "signpsbt", "params": { - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAAAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCCvyYqqdIt0mAAEA9gIAAAAAAQGLpTM0gWEqICjgcZNyoPhzdB5fNZBrEFbsNpsKHrTd9wEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIBZa5i8jVPdfV4pbIzSebMb5RN+l5lJkQKAw9+ivAWfnAiBNhehz79143DbFOoTjmPYVErlY0FLlVqojX9wat0aKXgEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPGAAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oBDiBWd3IcNaQkoj1tzHyQkDblBa5oZQ4J1ZcztLfnMAOk3AEPBAEAAAABEAT9////DPwJbGlnaHRuaW5nAQg5j4QWOQoUFAABAwhOfA0AAAAAAAEEIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4M/AlsaWdodG5pbmcBCMbeD+3qn9/kAAEDCODIEAAAAAAAAQQiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQz8CWxpZ2h0bmluZwEI4upB+mjl6AIA" + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIQCsNB0i02NIAAQMIQVncCwAAAAABBCJRIDvhN+WjzUt2EEWojAco0yQ1GDbwTtWd/aN5uNhGRlK3DPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==" } }, "response": { - "signed_psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAAAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCCvyYqqdIt0mAAEA9gIAAAAAAQGLpTM0gWEqICjgcZNyoPhzdB5fNZBrEFbsNpsKHrTd9wEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIBZa5i8jVPdfV4pbIzSebMb5RN+l5lJkQKAw9+ivAWfnAiBNhehz79143DbFOoTjmPYVErlY0FLlVqojX9wat0aKXgEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPGAAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oBDiBWd3IcNaQkoj1tzHyQkDblBa5oZQ4J1ZcztLfnMAOk3AEPBAEAAAABEAT9////ARNACI9TcWG+6uC9ElBFN3qhND7amsor/dtBhJ5ujEQAT/80548avrt7d7IJiOAaCNzzYLSXITdL2xjx6mhbBi9hTiEWkUUygSpECk12bHHNORk2lKNArhHgEuW6Gtnvum52ylMJAMLMqxcAAAAADPwJbGlnaHRuaW5nAQg5j4QWOQoUFAABAwhOfA0AAAAAAAEEIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4hB7nAxoROEqUxyWjlXFUHjsFtm/dr6SkP2H0cynK0g5oXCQDWuWnTBAAAAAz8CWxpZ2h0bmluZwEIxt4P7eqf3+QAAQMI4MgQAAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNDPwJbGlnaHRuaW5nAQji6kH6aOXoAgA=" + "signed_psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcIgICRz15z0oQ57qDTAJqrEPqGLCn+3Xs2lGEv6+oxGYV9rdHMEQCIHlCL2oKhnYn6hhaUG8+V+8D6GHFlI61OM507VB6aBwoAiACA2d5TnCdlJ1j2rF/EIHkxl3W0hBp3QqweO7hEul9aQEiBgJHPXnPShDnuoNMAmqsQ+oYsKf7dezaUYS/r6jEZhX2twgDz+yHAAAAAAEOILMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCEArDQdItNjSAAEDCEFZ3AsAAAAAAQQiUSA74Tflo81LdhBFqIwHKNMkNRg28E7Vnf2jebjYRkZStyEHE0cioCqqq2UZ2npxQi9Q6DXNZheODM6F4GjHHS3XScEJAG/ctUwEAAAADPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==" } }, { "request": { "id": "example:signpsbt#2", "method": "signpsbt", - "params": { - "psbt": "cHNidP8BAP1xAQIAAAAIFTef27H2GAJBzP4UZMeDePsDVkglO47/q4jqK18ibCYAAAAAAP3///+axwap6WKnEHvLjIJZX0ZeJ87cs7PKkXBfwvbGVmjpTQEAAAAA/f///wQ1cVzb9NR7nXadyRuhQBv+2iqhZkhvUA+sPo5z/SsSAQAAAAD9////lXQ788meUtSxhBX13mx2XhyM3Ddo30QtmNW0YuE2TDABAAAAAP3///8Kr4BwElAScx3bA5ZdavrHwh4Zh+rFNvkE/+7gu1WbngEAAAAA/f///3Uei7j3k/b5tnjFGvNZhe2iWz8O6FQjTEpM5XIoduNsAQAAAAD9////fm5Om4MojcnfZiTmrwb4b5Byw9emrjITi/nkEqTK9MsBAAAAAP3///8lwdpZqt3ILPRwhINY4PGvkg2CSw7agcMPSuFoHDDkIQAAAAAA/f///wGCAXoAAAAAABYAFMkJbUP0COpSYCAmLM2tfIUWuSqBAAAAAAABAHECAAAAAZVxzFxyEg7tiQTgRHwGleR8Srxw6taAGOoEpJK/Xj5sAAAAAAD9////AkBCDwAAAAAAFgAUKvGgVL/ThjWE/P1oORVXh/ObucYzr/YpAQAAABYAFKmkod5S53U4m5tKFApyeC35UbnbZwAAAAEBH0BCDwAAAAAAFgAUKvGgVL/ThjWE/P1oORVXh/ObucYAAQBxAgAAAAEVN5/bsfYYAkHM/hRkx4N4+wNWSCU7jv+riOorXyJsJgEAAAAA/f///wJmbOcpAQAAABYAFCCSJBD9wY/VwxnBcnFiu1tA6CGTQEIPAAAAAAAWABSjI8KCqaGX/BGOwJza8hyiuxuIcmcAAAABAR9AQg8AAAAAABYAFKMjwoKpoZf8EY7AnNryHKK7G4hyAAEAcQIAAAAB98EwKZMOHiyRYWyToae6Kce3gCwqUvnVXXHlB/ps9ocBAAAAAP3///8CmNuLKQEAAAAWABQ4roxw+phYHelaRr71DYB3FEy/30BCDwAAAAAAFgAUwSDtQiY7PVvBc7ww56Y72YIQdjllAAAAAQEfQEIPAAAAAAAWABTBIO1CJjs9W8FzvDDnpjvZghB2OQABAHECAAAAAZH/SvCXvDW7b8qb55CDC4M+jgZ61H/e8rZnAGaXp+Z+AAAAAAD9////Apkp2CkBAAAAFgAUc/Y+sIq3oYyEe40GkKJsXawkzwFAQg8AAAAAABYAFLdt1h5Bte8FKvIc2jJgiIwHC7mvZwAAAAEBH0BCDwAAAAAAFgAUt23WHkG17wUq8hzaMmCIjAcLua8AAQBxAgAAAAETC3wMCv9qK3lvVkVJu9b/v2VgMepZtnfngMp2xMXRnwAAAAAA/f///wJk0E4pAQAAABYAFEIsc4cBl+BTN33Kn80+YYfkMt+cQEIPAAAAAAAWABT2/7RIxKohhGbacpBz0BZNYcnfsGUAAAABAR9AQg8AAAAAABYAFPb/tEjEqiGEZtpykHPQFk1hyd+wAAEAcQIAAAABA8J/OnC+cuH79Z6wZmzwdAjhBDaPHavh3yvhr4odDXQBAAAAAP3///8CykowKQEAAAAWABTVHuO8cKOOX/JlmMU66on6Uc54mkBCDwAAAAAAFgAUunZMZryWMqCTiMuVWNF/cleg6dVnAAAAAQEfQEIPAAAAAAAWABS6dkxmvJYyoJOIy5VY0X9yV6Dp1QABAHECAAAAAfRxBaZZ3FfDGwxhZQLYCurN+7kJj0x6nzChg434dnjRAAAAAAD9////AszmyCkBAAAAFgAULSqRp54barF/7R9XOmsLDCVWdAFAQg8AAAAAABYAFNa5adNt/9rZhpGT9mPuSA39xzSIZQAAAAEBH0BCDwAAAAAAFgAU1rlp023/2tmGkZP2Y+5IDf3HNIgAAQBxAgAAAAEgk1JYyP4oIoPoYYcTPPDvZynVfXWINJnBEFBsLv0MtAAAAAAA/f///wJAQg8AAAAAABYAFGYcI7eQ3TSRNzrwsdi+0Id9XN4iMmGqKQEAAAAWABT5XKNwVIFsUKh26sqHFSlOLq5TFGUAAAABAR9AQg8AAAAAABYAFGYcI7eQ3TSRNzrwsdi+0Id9XN4iAAA=", - "signonly": [ - 7 - ] - } + "params": [ + "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIwRR1uu1r8GoAAQMIgIQeAAAAAAABBCIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfDPwJbGlnaHRuaW5nAQjdRD+FoUsRIAABAwhiDc0LAAAAAAEEIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2gM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==" + ] }, "response": { - "signed_psbt": "cHNidP8BAP1xAQIAAAAIFTef27H2GAJBzP4UZMeDePsDVkglO47/q4jqK18ibCYAAAAAAP3///+axwap6WKnEHvLjIJZX0ZeJ87cs7PKkXBfwvbGVmjpTQEAAAAA/f///wQ1cVzb9NR7nXadyRuhQBv+2iqhZkhvUA+sPo5z/SsSAQAAAAD9////lXQ788meUtSxhBX13mx2XhyM3Ddo30QtmNW0YuE2TDABAAAAAP3///8Kr4BwElAScx3bA5ZdavrHwh4Zh+rFNvkE/+7gu1WbngEAAAAA/f///3Uei7j3k/b5tnjFGvNZhe2iWz8O6FQjTEpM5XIoduNsAQAAAAD9////fm5Om4MojcnfZiTmrwb4b5Byw9emrjITi/nkEqTK9MsBAAAAAP3///8lwdpZqt3ILPRwhINY4PGvkg2CSw7agcMPSuFoHDDkIQAAAAAA/f///wGCAXoAAAAAABYAFMkJbUP0COpSYCAmLM2tfIUWuSqBAAAAAAABAHECAAAAAZVxzFxyEg7tiQTgRHwGleR8Srxw6taAGOoEpJK/Xj5sAAAAAAD9////AkBCDwAAAAAAFgAUKvGgVL/ThjWE/P1oORVXh/ObucYzr/YpAQAAABYAFKmkod5S53U4m5tKFApyeC35UbnbZwAAAAEBH0BCDwAAAAAAFgAUKvGgVL/ThjWE/P1oORVXh/ObucYAAQBxAgAAAAEVN5/bsfYYAkHM/hRkx4N4+wNWSCU7jv+riOorXyJsJgEAAAAA/f///wJmbOcpAQAAABYAFCCSJBD9wY/VwxnBcnFiu1tA6CGTQEIPAAAAAAAWABSjI8KCqaGX/BGOwJza8hyiuxuIcmcAAAABAR9AQg8AAAAAABYAFKMjwoKpoZf8EY7AnNryHKK7G4hyAAEAcQIAAAAB98EwKZMOHiyRYWyToae6Kce3gCwqUvnVXXHlB/ps9ocBAAAAAP3///8CmNuLKQEAAAAWABQ4roxw+phYHelaRr71DYB3FEy/30BCDwAAAAAAFgAUwSDtQiY7PVvBc7ww56Y72YIQdjllAAAAAQEfQEIPAAAAAAAWABTBIO1CJjs9W8FzvDDnpjvZghB2OQABAHECAAAAAZH/SvCXvDW7b8qb55CDC4M+jgZ61H/e8rZnAGaXp+Z+AAAAAAD9////Apkp2CkBAAAAFgAUc/Y+sIq3oYyEe40GkKJsXawkzwFAQg8AAAAAABYAFLdt1h5Bte8FKvIc2jJgiIwHC7mvZwAAAAEBH0BCDwAAAAAAFgAUt23WHkG17wUq8hzaMmCIjAcLua8AAQBxAgAAAAETC3wMCv9qK3lvVkVJu9b/v2VgMepZtnfngMp2xMXRnwAAAAAA/f///wJk0E4pAQAAABYAFEIsc4cBl+BTN33Kn80+YYfkMt+cQEIPAAAAAAAWABT2/7RIxKohhGbacpBz0BZNYcnfsGUAAAABAR9AQg8AAAAAABYAFPb/tEjEqiGEZtpykHPQFk1hyd+wAAEAcQIAAAABA8J/OnC+cuH79Z6wZmzwdAjhBDaPHavh3yvhr4odDXQBAAAAAP3///8CykowKQEAAAAWABTVHuO8cKOOX/JlmMU66on6Uc54mkBCDwAAAAAAFgAUunZMZryWMqCTiMuVWNF/cleg6dVnAAAAAQEfQEIPAAAAAAAWABS6dkxmvJYyoJOIy5VY0X9yV6Dp1QABAHECAAAAAfRxBaZZ3FfDGwxhZQLYCurN+7kJj0x6nzChg434dnjRAAAAAAD9////AszmyCkBAAAAFgAULSqRp54barF/7R9XOmsLDCVWdAFAQg8AAAAAABYAFNa5adNt/9rZhpGT9mPuSA39xzSIZQAAAAEBH0BCDwAAAAAAFgAU1rlp023/2tmGkZP2Y+5IDf3HNIgAAQBxAgAAAAEgk1JYyP4oIoPoYYcTPPDvZynVfXWINJnBEFBsLv0MtAAAAAAA/f///wJAQg8AAAAAABYAFGYcI7eQ3TSRNzrwsdi+0Id9XN4iMmGqKQEAAAAWABT5XKNwVIFsUKh26sqHFSlOLq5TFGUAAAABAR9AQg8AAAAAABYAFGYcI7eQ3TSRNzrwsdi+0Id9XN4iIgID+pyVCF5CseUAPNH0GBeMMMluSud5VMoPxIxYgm/06w5HMEQCIG90DSr+fGNoWhCrgLbJG3Wt8PJNMWYqaa5MLWRwA0oTAiA9rsLEqqVhjV6wENfzzpudaE949uLlVqWgDjE/FSgKNAEiBgP6nJUIXkKx5QA80fQYF4wwyW5K53lUyg/EjFiCb/TrDghmHCO3AAAAAAAA" + "signed_psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcIgICRz15z0oQ57qDTAJqrEPqGLCn+3Xs2lGEv6+oxGYV9rdHMEQCIA8+zCzZ59t2OEFHWefZeTypY89RRQ8dMQCjtGWw6gskAiArELH1MvjW6j1G1CKnLZdV+/oabLDU48ingGSPFDOYxwEiBgJHPXnPShDnuoNMAmqsQ+oYsKf7dezaUYS/r6jEZhX2twgDz+yHAAAAAAEOILMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCMEUdbrta/BqAAEDCICEHgAAAAAAAQQiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z3wz8CWxpZ2h0bmluZwEI3UQ/haFLESAAAQMIYg3NCwAAAAABBCJRIMkYPt6RIfPG/RSYgixHp2AnMidmnJCVCIQ7rFu9gT9oIQeffk+gJsmVIxDZ8UKPKgJB9CLvaUr9xqOEogpzJx1hbAkAEioNzwUAAAAM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==" } } ] @@ -27982,27 +31286,27 @@ "id": "example:splice_init#1", "method": "splice_init", "params": { - "channel_id": "5677721c35a424a23d6dcc7c909036e505ae68650e09d59733b4b7e73003a4dc", + "channel_id": "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", "relative_amount": 100000, - "initialpsbt": "cHNidP8BAF4CAAAAAVZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQAAAAD9////AU58DQAAAAAAIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL5sAAAAAAEA9gIAAAAAAQGLpTM0gWEqICjgcZNyoPhzdB5fNZBrEFbsNpsKHrTd9wEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIBZa5i8jVPdfV4pbIzSebMb5RN+l5lJkQKAw9+ivAWfnAiBNhehz79143DbFOoTjmPYVErlY0FLlVqojX9wat0aKXgEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPGAAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oAAA==" + "initialpsbt": "cHNidP8BAF4CAAAAAfYhJqy04agRPrPOQO2A40pJ1JsDXLnTZBexwTMyJxEsAQAAAAD9////Ac652gsAAAAAIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGCSAAAAAAEAiQIAAAAB+fmfTbLExUIRcwBZD0qxCoNAHIDe7sEfYHguS6nfkn4AAAAAAP3///8CQEIPAAAAAAAiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJloFs3AsAAAAAIlEgW7Q7f9oXFdDdAUFoJaGFIqLX7LFkdbiHgOj6/Bxz74mNAAAAAQErgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviQAA" } }, "response": { - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEFR1IhAjJCZt6EA7OrFXoJ8feE1YevYYMcmYwVG8whu3TCsjFLIQLjvTgAmGbJ2o7EqpnMTqnGwN1G3xXGHvDOHycSkXFOV1KuAQ4gVndyHDWkJKI9bcx8kJA25QWuaGUOCdWXM7S35zADpNwBDwQAAAAAARAEAAAAAAz8CWxpZ2h0bmluZwEIK/Jiqp0i3SYAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCDmPhBY5ChQUAAEDCE58DQAAAAAAAQQiUSB4NjVf3IqC3EywCncsVVQVHQY4Sk3WXo0/aKwIVmuEvgz8CWxpZ2h0bmluZwEIxt4P7eqf3+QAAQMIAAAAAAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNDPwJbGlnaHRuaW5nAQji6kH6aOXoAgA=" + "psbt": "cHNidP8BAgQCAAAAAQMEkgAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABASuBbNwLAAAAACJRIFu0O3/aFxXQ3QFBaCWhhSKi1+yxZHW4h4Do+vwcc++JAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEImfI55kWjFBwAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABAStAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWAQVHUiECVw7AtutUVmMwIYOmLqx10I/e62TzE1IZIGXWAcjKUh0hAmaGfDQrglCra07axtuuL95TeCtpzRcTmUn71PIISH/yUq4BDiD2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEPBAAAAAABEAQAAAAADPwJbGlnaHRuaW5nAQijTD4R+uEvhAABAwjOudoLAAAAAAEEIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGAM/AlsaWdodG5pbmcBCI/PBFM/C09aAAEDCAAAAAAAAAAAAQQiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJlgz8CWxpZ2h0bmluZwEIreWkThWNrsoA" } }, { "request": { "id": "example:splice_init#2", "method": "splice_init", - "params": { - "channel_id": "a40bb442dab0231b51d8f842d95aad548aa35e1d13c4cfcf2997344f805453a1", - "relative_amount": -105000, - "initialpsbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIoIYBAAAAAAABBCJRIHg2NV/cioLcTLAKdyxVVBUdBjhKTdZejT9orAhWa4S+AA==" - } + "params": [ + "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", + -105000, + "cHNidP8BAgQCAAAAAQMElAAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIoIYBAAAAAAABBCJRIMTSgkFfmoHRjgi2GaGdEWuGVssb9JPl9UC797egWEzaAA==" + ] }, "response": { - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABARzi7RBt64yrfqRL2p+KiUw8cYtiKICRFHmp/4eCSemSAQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgTCjR9L+TfzP7pLJVVto5egTRbRNj/RaBhyrA3UW0aEcCIAJO5FZjXvdpRcGR949C4DnfHs3soklTjn/1upkia+TgASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M9mAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEFR1IhAjJCZt6EA7OrFXoJ8feE1YevYYMcmYwVG8whu3TCsjFLIQLjvTgAmGbJ2o7EqpnMTqnGwN1G3xXGHvDOHycSkXFOV1KuAQ4gpAu0QtqwIxtR2PhC2VqtVIqjXh0TxM/PKZc0T4BUU6EBDwQAAAAAARAEAAAAAAz8CWxpZ2h0bmluZwEIn2Ac8fyFEJwAAQMIAAAAAAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNDPwJbGlnaHRuaW5nAQgu7JK9IpBWOAABAwighgEAAAAAAAEEIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4M/AlsaWdodG5pbmcBCOZ1GpRwbKfuAA==" + "psbt": "cHNidP8BAgQCAAAAAQMElAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCyAgAAAAL2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEAAAAA/f////YhJqy04agRPrPOQO2A40pJ1JsDXLnTZBexwTMyJxEsAAAAAAAAAAAAAs652gsAAAAAIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGDgyBAAAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWkgAAAAEBK+DIEAAAAAAAIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYBBUdSIQJXDsC261RWYzAhg6YurHXQj97rZPMTUhkgZdYByMpSHSECZoZ8NCuCUKtrTtrG264v3lN4K2nNFxOZSfvU8ghIf/JSrgEOIJW7FYF67zRaxARLQco1KmOXtFQY8yFwpGexdGngFEX4AQ8EAQAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCF4tdoSn7LwCAAEDCAAAAAAAAAAAAQQiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJlgz8CWxpZ2h0bmluZwEIGQ1Quuj5CvAAAQMIoIYBAAAAAAABBCJRIMTSgkFfmoHRjgi2GaGdEWuGVssb9JPl9UC797egWEzaDPwJbGlnaHRuaW5nAQi4FyJ2dePgEAA=" } } ] @@ -28138,13 +31442,29 @@ "id": "example:splice_signed#1", "method": "splice_signed", "params": { - "channel_id": "5677721c35a424a23d6dcc7c909036e505ae68650e09d59733b4b7e73003a4dc", - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAAAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCCvyYqqdIt0mAAEA9gIAAAAAAQGLpTM0gWEqICjgcZNyoPhzdB5fNZBrEFbsNpsKHrTd9wEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIBZa5i8jVPdfV4pbIzSebMb5RN+l5lJkQKAw9+ivAWfnAiBNhehz79143DbFOoTjmPYVErlY0FLlVqojX9wat0aKXgEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPGAAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oBDiBWd3IcNaQkoj1tzHyQkDblBa5oZQ4J1ZcztLfnMAOk3AEPBAEAAAABEAT9////ARNACI9TcWG+6uC9ElBFN3qhND7amsor/dtBhJ5ujEQAT/80548avrt7d7IJiOAaCNzzYLSXITdL2xjx6mhbBi9hTiEWkUUygSpECk12bHHNORk2lKNArhHgEuW6Gtnvum52ylMJAMLMqxcAAAAADPwJbGlnaHRuaW5nAQg5j4QWOQoUFAABAwhOfA0AAAAAAAEEIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4hB7nAxoROEqUxyWjlXFUHjsFtm/dr6SkP2H0cynK0g5oXCQDWuWnTBAAAAAz8CWxpZ2h0bmluZwEIxt4P7eqf3+QAAQMI4MgQAAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNDPwJbGlnaHRuaW5nAQji6kH6aOXoAgA=" + "channel_id": "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", + "psbt": "cHNidP8BAgQCAAAAAQMEkgAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABASuBbNwLAAAAACJRIFu0O3/aFxXQ3QFBaCWhhSKi1+yxZHW4h4Do+vwcc++JAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQBAAAAARAE/f///wETQKcuGy6h+BqXM6UBaTWpiX1wgQdVDWQdu3poUITFMK4JR7Jjaqy0IsnjfOXmaFZAUIS01Heqa7RbgzHF+5qDI/AhFvTEPeeTGXjlJSGiyNDqLm+lpUC+f31Q3j7YhyeyShxZCQD2T+TUAAAAAAz8CWxpZ2h0bmluZwEImfI55kWjFBwAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABAStAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQAAAAAARAEAAAAAAz8CWxpZ2h0bmluZwEIo0w+EfrhL4QAAQMIzrnaCwAAAAABBCJRII+O1EYnVX28zEKuAYqcVHSpkShXksTKiRwfWcVmXTRgIQf4l/XsahrhZhlxJbtZN6e213tQQFKbPCTiBwSf3CvcvAkA9Hbq9AUAAAAM/AlsaWdodG5pbmcBCI/PBFM/C09aAAEDCODIEAAAAAAAAQQiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJlgz8CWxpZ2h0bmluZwEIreWkThWNrsoA" } }, "response": { - "tx": "020000000001025677721c35a424a23d6dcc7c909036e505ae68650e09d59733b4b7e73003a4dc0000000000000000005677721c35a424a23d6dcc7c909036e505ae68650e09d59733b4b7e73003a4dc0100000000fdffffff024e7c0d00000000002251207836355fdc8a82dc4cb00a772c5554151d06384a4dd65e8d3f68ac08566b84bee0c81000000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd0400473044022053269f3951a1fc942174ac0dde8462405a86c89b31b444890664ee9735872cff02204cd822c4456c15e90ad342b23e9bb252d383d4e17a8a04818c4919e4fd61efd80147304402205ac0787c79e74ebfa0eaf18964625c53eb672cc4bed2c65303bd9cc192dad6f902206c6c0cded47201dae0020f50a8998555e654d3420c64e801fc668238e3c1cdfa0147522102324266de8403b3ab157a09f1f784d587af61831c998c151bcc21bb74c2b2314b2102e3bd38009866c9da8ec4aa99cc4ea9c6c0dd46df15c61ef0ce1f271291714e5752ae0140088f537161beeae0bd125045377aa1343eda9aca2bfddb41849e6e8c44004fff34e78f1abebb7b77b20988e01a08dcf360b49721374bdb18f1ea685b062f614e6c000000", - "txid": "f00d5e230b401274c88d3e6205e2c6117028cb9878b7d2bc52b1441f0b589427" + "tx": "02000000000102f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c0100000000fdfffffff62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c00000000000000000002ceb9da0b000000002251208f8ed44627557dbccc42ae018a9c5474a991285792c4ca891c1f59c5665d3460e0c810000000000022002093dedd0c265bca868576d3ee2e59eebbb20ebc296e58f7edca93d5eeaec089960140a72e1b2ea1f81a9733a5016935a9897d708107550d641dbb7a685084c530ae0947b2636aacb422c9e37ce5e66856405084b4d477aa6bb45b8331c5fb9a8323f00400473044022024af89f1987cfee986aacf511ed101aa083a8300d4ae4d6b87cd68fef4f722c60220263fd2a4750c7fbb08c433cc0d14e500c714820175454d18b5bef74e01cdc2f9014730440220306e4f6a09653e44f9306c6c47afb58d756d7ba2803f61184db3730ab208a8a302207c40845740e1e791d05957c75eb1b3e62db18fb5ec75039768972dc5efb881710147522102570ec0b6eb545663302183a62eac75d08fdeeb64f31352192065d601c8ca521d210266867c342b8250ab6b4edac6dbae2fde53782b69cd17139949fbd4f208487ff252ae92000000", + "txid": "f84514e06974b167a47021f31854b497632a35ca414b04c45a34ef7a8115bb95", + "outnum": 1 + } + }, + { + "request": { + "id": "example:splice_signed#2", + "method": "splice_signed", + "params": [ + "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", + "cHNidP8BAgQCAAAAAQMElAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCyAgAAAAL2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEAAAAA/f////YhJqy04agRPrPOQO2A40pJ1JsDXLnTZBexwTMyJxEsAAAAAAAAAAAAAs652gsAAAAAIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGDgyBAAAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWkgAAAAEBK+DIEAAAAAAAIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYBDiCVuxWBeu80WsQES0HKNSpjl7RUGPMhcKRnsXRp4BRF+AEPBAEAAAABEAQAAAAADPwJbGlnaHRuaW5nAQheLXaEp+y8AgABAwi4Lg8AAAAAAAEEIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYM/AlsaWdodG5pbmcBCBkNULro+QrwAAEDCKCGAQAAAAAAAQQiUSDE0oJBX5qB0Y4IthmhnRFrhlbLG/ST5fVAu/e3oFhM2gz8CWxpZ2h0bmluZwEIuBcidnXj4BAA" + ] + }, + "response": { + "tx": "0200000000010195bb15817aef345ac4044b41ca352a6397b45418f32170a467b17469e01445f801000000000000000002b82e0f000000000022002093dedd0c265bca868576d3ee2e59eebbb20ebc296e58f7edca93d5eeaec08996a086010000000000225120c4d282415f9a81d18e08b619a19d116b8656cb1bf493e5f540bbf7b7a0584cda04004730440220259ff7ffc38775f34aed9be01a57b3002b2cba938e8bdf37ee0d529401ca0ae102206f77ba80e128ed5096679a304078efbff423394f2ffeb286e307fc71af06773d0147304402206e715aa27e9f192a787949dd322dd8c41d69dbf0b134099b942f40f3727ecaa80220154ab1a180d2103884ac73307f6f5faa0e384d7d40dcda44a26c17fdd83a89910147522102570ec0b6eb545663302183a62eac75d08fdeeb64f31352192065d601c8ca521d210266867c342b8250ab6b4edac6dbae2fde53782b69cd17139949fbd4f208487ff252ae94000000", + "txid": "b81ed02d0235b63cb73d1ee840345a696bc7224ba28be590165aa340bc9e37de", + "outnum": 0 } } ] @@ -28279,12 +31599,26 @@ "id": "example:splice_update#1", "method": "splice_update", "params": { - "channel_id": "5677721c35a424a23d6dcc7c909036e505ae68650e09d59733b4b7e73003a4dc", - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEFR1IhAjJCZt6EA7OrFXoJ8feE1YevYYMcmYwVG8whu3TCsjFLIQLjvTgAmGbJ2o7EqpnMTqnGwN1G3xXGHvDOHycSkXFOV1KuAQ4gVndyHDWkJKI9bcx8kJA25QWuaGUOCdWXM7S35zADpNwBDwQAAAAAARAEAAAAAAz8CWxpZ2h0bmluZwEIK/Jiqp0i3SYAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCDmPhBY5ChQUAAEDCE58DQAAAAAAAQQiUSB4NjVf3IqC3EywCncsVVQVHQY4Sk3WXo0/aKwIVmuEvgz8CWxpZ2h0bmluZwEIxt4P7eqf3+QAAQMIAAAAAAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNDPwJbGlnaHRuaW5nAQji6kH6aOXoAgA=" + "channel_id": "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", + "psbt": "cHNidP8BAgQCAAAAAQMEkgAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABASuBbNwLAAAAACJRIFu0O3/aFxXQ3QFBaCWhhSKi1+yxZHW4h4Do+vwcc++JAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEImfI55kWjFBwAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABAStAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWAQVHUiECVw7AtutUVmMwIYOmLqx10I/e62TzE1IZIGXWAcjKUh0hAmaGfDQrglCra07axtuuL95TeCtpzRcTmUn71PIISH/yUq4BDiD2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEPBAAAAAABEAQAAAAADPwJbGlnaHRuaW5nAQijTD4R+uEvhAABAwjOudoLAAAAAAEEIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGAM/AlsaWdodG5pbmcBCI/PBFM/C09aAAEDCAAAAAAAAAAAAQQiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJlgz8CWxpZ2h0bmluZwEIreWkThWNrsoA" } }, "response": { - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAAAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCCvyYqqdIt0mAAEA9gIAAAAAAQGLpTM0gWEqICjgcZNyoPhzdB5fNZBrEFbsNpsKHrTd9wEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIBZa5i8jVPdfV4pbIzSebMb5RN+l5lJkQKAw9+ivAWfnAiBNhehz79143DbFOoTjmPYVErlY0FLlVqojX9wat0aKXgEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPGAAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oBDiBWd3IcNaQkoj1tzHyQkDblBa5oZQ4J1ZcztLfnMAOk3AEPBAEAAAABEAT9////DPwJbGlnaHRuaW5nAQg5j4QWOQoUFAABAwhOfA0AAAAAAAEEIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4M/AlsaWdodG5pbmcBCMbeD+3qn9/kAAEDCODIEAAAAAAAAQQiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQz8CWxpZ2h0bmluZwEI4upB+mjl6AIA", + "psbt": "cHNidP8BAgQCAAAAAQMEkgAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABASuBbNwLAAAAACJRIFu0O3/aFxXQ3QFBaCWhhSKi1+yxZHW4h4Do+vwcc++JAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEImfI55kWjFBwAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABAStAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQAAAAAARAEAAAAAAz8CWxpZ2h0bmluZwEIo0w+EfrhL4QAAQMIzrnaCwAAAAABBCJRII+O1EYnVX28zEKuAYqcVHSpkShXksTKiRwfWcVmXTRgDPwJbGlnaHRuaW5nAQiPzwRTPwtPWgABAwjgyBAAAAAAAAEEIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYM/AlsaWdodG5pbmcBCK3lpE4Vja7KAA==", + "commitments_secured": true + } + }, + { + "request": { + "id": "example:splice_update#2", + "method": "splice_update", + "params": [ + "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", + "cHNidP8BAgQCAAAAAQMElAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCyAgAAAAL2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEAAAAA/f////YhJqy04agRPrPOQO2A40pJ1JsDXLnTZBexwTMyJxEsAAAAAAAAAAAAAs652gsAAAAAIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGDgyBAAAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWkgAAAAEBK+DIEAAAAAAAIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYBBUdSIQJXDsC261RWYzAhg6YurHXQj97rZPMTUhkgZdYByMpSHSECZoZ8NCuCUKtrTtrG264v3lN4K2nNFxOZSfvU8ghIf/JSrgEOIJW7FYF67zRaxARLQco1KmOXtFQY8yFwpGexdGngFEX4AQ8EAQAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCF4tdoSn7LwCAAEDCAAAAAAAAAAAAQQiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJlgz8CWxpZ2h0bmluZwEIGQ1Quuj5CvAAAQMIoIYBAAAAAAABBCJRIMTSgkFfmoHRjgi2GaGdEWuGVssb9JPl9UC797egWEzaDPwJbGlnaHRuaW5nAQi4FyJ2dePgEAA=" + ] + }, + "response": { + "psbt": "cHNidP8BAgQCAAAAAQMElAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCyAgAAAAL2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEAAAAA/f////YhJqy04agRPrPOQO2A40pJ1JsDXLnTZBexwTMyJxEsAAAAAAAAAAAAAs652gsAAAAAIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGDgyBAAAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWkgAAAAEBK+DIEAAAAAAAIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYBDiCVuxWBeu80WsQES0HKNSpjl7RUGPMhcKRnsXRp4BRF+AEPBAEAAAABEAQAAAAADPwJbGlnaHRuaW5nAQheLXaEp+y8AgABAwi4Lg8AAAAAAAEEIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYM/AlsaWdodG5pbmcBCBkNULro+QrwAAEDCKCGAQAAAAAAAQQiUSDE0oJBX5qB0Y4IthmhnRFrhlbLG/ST5fVAu/e3oFhM2gz8CWxpZ2h0bmluZwEIuBcidnXj4BAA", "commitments_secured": true } } @@ -28423,38 +31757,51 @@ "examples": [ { "description": [ - "A simple peer selection query:" + "A simple peers selection query:" ], "request": { "id": "example:sql#1", "method": "sql", - "params": [ - "SELECT id FROM peers" - ] + "params": { + "query": "SELECT id FROM peers" + } }, "response": { "rows": [ [ - "02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da00" + "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" ] ] } }, { "description": [ - "A statement containing using `=` needs `-o`:" + "A statement containing `=` needs `-o` in shell:" ], "request": { "id": "example:sql#2", "method": "sql", "params": [ - " -o 'SELECT node_id,last_timestamp FROM nodes WHERE last_timestamp>=1669578892'" + "SELECT nodeid,last_timestamp FROM nodes WHERE last_timestamp>=1669578892" ] }, "response": { "rows": [ [ - "02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da001669601603" + "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + 1722303662 + ], + [ + "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + 1722303662 + ], + [ + "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + 1722303669 + ], + [ + "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + 1722303669 ] ] } @@ -28467,16 +31814,19 @@ "id": "example:sql#3", "method": "sql", "params": [ - " -o 'SELECT nodeid FROM nodes WHERE nodeid != x'03c9d25b6c0ce4bde5ad97d7ab83f00ae8bd3800a98ccbee36f3c3205315147de1''" + "SELECT nodeid FROM nodes WHERE nodeid != x'035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d'" ] }, "response": { "rows": [ [ - "0214739d625944f8fdc0da9d2ef44dbd7af58443685e494117b51410c5c3ff973a" + "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" ], [ - "02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da00" + "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + ], + [ + "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199" ] ] } @@ -28489,16 +31839,16 @@ "id": "example:sql#4", "method": "sql", "params": [ - " -o 'SELECT nodeid FROM nodes WHERE nodeid IN (x'03c9d25b6c0ce4bde5ad97d7ab83f00ae8bd3800a98ccbee36f3c3205315147de1', x'02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da00')'" + "SELECT nodeid FROM nodes WHERE nodeid IN (x'0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518', x'035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d')" ] }, "response": { "rows": [ [ - "02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da00" + "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ], [ - "03c9d25b6c0ce4bde5ad97d7ab83f00ae8bd3800a98ccbee36f3c3205315147de1" + "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d" ] ] } @@ -28511,24 +31861,17 @@ "id": "example:sql#5", "method": "sql", "params": [ - " -o 'SELECT nodeid, alias, nodes_addresses.type, nodes_addresses.port, nodes_addresses.address FROM nodes INNER JOIN nodes_addresses ON nodes_addresses.row = nodes.rowid'" + "SELECT peer_id, short_channel_id, to_us_msat, total_msat, peerchannels_status.status FROM peerchannels INNER JOIN peerchannels_status ON peerchannels_status.row = peerchannels.rowid" ] }, "response": { "rows": [ [ - "02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da00", - "YELLOWWATCH-22.11rc2-31-gcd7593b", - "dns", - "7272", - "localhost" - ], - [ - "0214739d625944f8fdc0da9d2ef44dbd7af58443685e494117b51410c5c3ff973a", - "HOPPINGSQUIRREL-1rc2-31-gcd7593b", - "dns", - "7171", - "localhost" + "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "109x1x1", + 490503792, + 1000000000, + "CHANNELD_NORMAL:Channel ready for use." ] ] } @@ -28541,13 +31884,13 @@ "id": "example:sql#6", "method": "sql", "params": [ - "SELECT COUNT(*) FROM nodes" + "SELECT COUNT(*) FROM forwards" ] }, "response": { "rows": [ [ - "3" + 8 ] ] } @@ -28556,18 +31899,6 @@ "request": { "id": "example:sql#7", "method": "sql", - "params": [ - "SELECT * FROM forwards;" - ] - }, - "response": { - "rows": [] - } - }, - { - "request": { - "id": "example:sql#8", - "method": "sql", "params": [ "SELECT * from peerchannels_features" ] @@ -28575,27 +31906,21 @@ "response": { "rows": [ [ - 6, - 1, + 23, + 18, 0, "option_static_remotekey" ], [ - 7, - 1, + 24, + 18, 1, - "option_anchors" - ], - [ - 16, - 11, - 0, - "option_static_remotekey" + "option_anchors_zero_fee_htlc_tx" ], [ - 17, - 11, - 1, + 25, + 18, + 2, "option_anchors" ] ] @@ -28650,7 +31975,12 @@ }, "response": { "scb": [ - "0000000000000001c707da9b230e1655b0a6c082b8daf4fa44d9d1f68163ed4d531d45cf453dc651022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d5900017f000001b2e3c707da9b230e1655b0a6c082b8daf4fa44d9d1f68163ed4d531d45cf453dc6510000000000000000000186a000021000" + "0000000000000006f4e1de801de57374d5737da622611e3a1ad9f16d5df9c30fceecc11ce732eeeb022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d5900017f0000019b987577c455da982b1753df79c56f9d8d2b75d1401e60a5af322ab27b13b20d75970000000100000000000f42400003401000", + "000000000000000121bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d00017f000001e610e23fcc9e6306ce636b203217b22409bf9bab2211f9f432de781dedb6377dab5a0000000100000000000f42400003401000", + "00000000000000027512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d00017f000001e610ee1db407eb3e47be3e93e1abc05b13806ee7aef8550c517a4974c72bf91866410000000100000000000f42400003401000", + "0000000000000003222d999f537e32e9458c5db17a63e012dcced61340de06fda5bc30566270b0aa0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f0000019bc5b15661ec5c17599de0858401b72d6be66c34b48a3bb6e679542809f395e6bb2000000000000000000bebb3cb0003401000", + "0000000000000004a4a379248e49d207cc984646e632e1a31105a85708b9d6d961a5018fdd489f5a0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f000001c1ac184e7462759ff83049b19582db049d40076f83a7a70181374ca0ea91644a3d9c0000000200000000000075300003401000", + "000000000000000509eb55872cd9039ecd08281af756e23b15aad4129fd6a9bcd71b472114ebf43a0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f000001c1ace9067c9d125df7150261c80eec3ab9cf8731679752b84f090ab3ea6e36c93d3100000001000000000000c3500003401000" ] } } @@ -28768,13 +32098,26 @@ "request": { "id": "example:txdiscard#1", "method": "txdiscard", + "params": [ + "cafef1e6936d05584c8406e9ec5e9631b03513fe8b2a0444c5824e1a1f3d7c67" + ] + }, + "response": { + "unsigned_tx": "0200000001974bc23173b7bca9b060dac12abd1bb158e8ed69a3e74d4f6af5919b15f5772c0100000000fdffffff020000000100000000220020a056363be8c7dbb511098cc50fbca24843e6ed6de03f816465f1998a9a82a09d4183980000000000225120f1393467c717cd50de2760167d4311141a8f750c89f54fd2c900601a7da8434c95000000", + "txid": "cafef1e6936d05584c8406e9ec5e9631b03513fe8b2a0444c5824e1a1f3d7c67" + } + }, + { + "request": { + "id": "example:txdiscard#2", + "method": "txdiscard", "params": { - "txid": "6e680cb76077f11c838cc7aee0c0aa360f9857f00856bb1614025a1af53739fc" + "txid": "91a189eb69a436e49735ae1e8619fd96a342a4e5c63fa2baa7e9f69ecdc7434c" } }, "response": { - "unsigned_tx": "020000000142dc00d81359c3a551e170e3bf5262fa9cacc2eb2e283a10e579491cd86dce4b0000000000fdffffff02ffffff00000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd42839800000000002251207836355fdc8a82dc4cb00a772c5554151d06384a4dd65e8d3f68ac08566b84be66000000", - "txid": "6e680cb76077f11c838cc7aee0c0aa360f9857f00856bb1614025a1af53739fc" + "unsigned_tx": "02000000010cbdd42439292d7a59620493020f2a204488bfa4d640eedb84af5d3bd6479aea0000000000fdffffff0240420f00000000002200200fefd5034808bec0c94b857b7a3ddeeece7cae1b2101b2f23f1c114b14073f31b7a1f000000000002251205c54c6ff7b25c08e66a91d4256a5ca2c374ab1faf56377e8d65466cf997614ce97000000", + "txid": "91a189eb69a436e49735ae1e8619fd96a342a4e5c63fa2baa7e9f69ecdc7434c" } } ] @@ -28880,18 +32223,18 @@ "request": { "id": "example:txprepare#1", "method": "txprepare", - "params": { - "outputs": [ + "params": [ + [ { - "bcrt1qtwxd8wg5eanumk86vfeujvp48hfkgannf77evggzct048wggsrxsum2pmm": 16777215 + "bcrt1q5ptrvwlgcldm2ygf3nzsl09zfpp7dmtduqlczer97xvc4x5z5zwsc2ulv4": 16777216 } ] - } + ] }, "response": { - "unsigned_tx": "020000000142dc00d81359c3a551e170e3bf5262fa9cacc2eb2e283a10e579491cd86dce4b0000000000fdffffff02ffffff00000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd42839800000000002251207836355fdc8a82dc4cb00a772c5554151d06384a4dd65e8d3f68ac08566b84be66000000", - "txid": "6e680cb76077f11c838cc7aee0c0aa360f9857f00856bb1614025a1af53739fc", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQDeAgAAAAABATRHoQ9tEMHRHpf06v5uTEdjdMk1rccIaA6MNGMipNQWAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFLnqitWTi465LGxeucwoSAj16NGbAkcwRAIgVtOsUaQaPgH86aW6e6qmJa1xVb8KWvc+HALGosqVVmQCIFi4JU8Gy+vl2a2/frY+71hitYIBB/tjsRP7fpgb8b9TASECHUIV5q1r2ownjOlAFPQASTlZxxNgBvi5O3hCRvajwdJlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIELcANgTWcOlUeFw479SYvqcrMLrLig6EOV5SRzYbc5LAQ8EAAAAAAEQBP3///8AAQMI////AAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAAEDCEKDmAAAAAAAAQQiUSB4NjVf3IqC3EywCncsVVQVHQY4Sk3WXo0/aKwIVmuEvgA=" + "unsigned_tx": "0200000001974bc23173b7bca9b060dac12abd1bb158e8ed69a3e74d4f6af5919b15f5772c0100000000fdffffff020000000100000000220020a056363be8c7dbb511098cc50fbca24843e6ed6de03f816465f1998a9a82a09d4183980000000000225120f1393467c717cd50de2760167d4311141a8f750c89f54fd2c900601a7da8434c95000000", + "txid": "cafef1e6936d05584c8406e9ec5e9631b03513fe8b2a0444c5824e1a1f3d7c67", + "psbt": "cHNidP8BAgQCAAAAAQMElQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAFpz79e9wou5mbmtaiB+6WfRTf8SpZxmrd6n+rIFcWewQAAAAAA/f///wLS79/eAAAAABYAFE35CMxYA4yQx9XLuFj0/q5uNmligJaYAQAAAAAWABT/hTPq8LE5vAc9KiJjjmygoIN81UsAAAABAR+AlpgBAAAAABYAFP+FM+rwsTm8Bz0qImOObKCgg3zVAQ4gl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywBDwQBAAAAARAE/f///wABAwgAAAABAAAAAAEEIgAgoFY2O+jH27URCYzFD7yiSEPm7W3gP4FkZfGZipqCoJ0AAQMIQYOYAAAAAAABBCJRIPE5NGfHF81Q3idgFn1DERQaj3UMifVP0skAYBp9qENMAA==" } }, { @@ -28901,15 +32244,15 @@ "params": { "outputs": [ { - "bcrt1qyhu7rxj3rrlcj84jtzp2mk9d89xm9v2rx4d4h8au830axugx6mmqsuplng": "100000sat" + "bcrt1q4hz6a4gtecfmy8z870cwkq2gzc0t7n9u9pu23689u55ghwewemqsv4v2zs": 16777216 } ] } }, "response": { - "unsigned_tx": "0200000001a91077a134fb9fe4a8d13a482b718368bfd9ce3eff61ff7d96549480a1f97dca0100000000fdffffff02a08601000000000022002025f9e19a5118ff891eb25882add8ad394db2b143355b5b9fbc3c5fd37106d6f66173010000000000225120a2a01c7965289eee56b5cfcddb9856c70fa476c264d21f711c6a69af776ae40366000000", - "txid": "f11d436054607603e903fc69c4bd9b39ce97421341c7cf814ad025cb5bf59c1c", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQDeAgAAAAABAYZ4QwAgPq6Os8kk073f5Yx4T9LXYfbOjAdkzMXfuBQdAAAAAAD9////AjPkAioBAAAAFgAUeOeqzyifepeJAMCl4vnnJ/TRptRADQMAAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFlAkcwRAIgYBFwmqWCrVkxxZ0/tte3z4lIem0L7MkhXzGAOvBWa6YCIFx7H4zOzxjixlZMi0DYYbIEflDjYHJXLfN1wVcXYuekASEDgztw/3Rks6vKGYMXJ83VEvQcNIjg3rJW6KdxEh26uwplAAAAAQEfQA0DAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIKkQd6E0+5/kqNE6SCtxg2i/2c4+/2H/fZZUlICh+X3KAQ8EAQAAAAEQBP3///8AAQMIoIYBAAAAAAABBCIAICX54ZpRGP+JHrJYgq3YrTlNsrFDNVtbn7w8X9NxBtb2AAEDCGFzAQAAAAAAAQQiUSCioBx5ZSie7la1z83bmFbHD6R2wmTSH3Ecammvd2rkAwA=" + "unsigned_tx": "0200000001974bc23173b7bca9b060dac12abd1bb158e8ed69a3e74d4f6af5919b15f5772c0100000000fdffffff020000000100000000220020adc5aed50bce13b21c47f3f0eb0148161ebf4cbc2878a8e8e5e5288bbb2ecec1418398000000000022512081da0d3e3051135a89e2f9d85e2eadf661f959bfb05e671097854672cfd0ac7d95000000", + "txid": "ed6c309a10273aa036d29b71cf70202291d4d4b72be353ac410e1678ecfbf74e", + "psbt": "cHNidP8BAgQCAAAAAQMElQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAFpz79e9wou5mbmtaiB+6WfRTf8SpZxmrd6n+rIFcWewQAAAAAA/f///wLS79/eAAAAABYAFE35CMxYA4yQx9XLuFj0/q5uNmligJaYAQAAAAAWABT/hTPq8LE5vAc9KiJjjmygoIN81UsAAAABAR+AlpgBAAAAABYAFP+FM+rwsTm8Bz0qImOObKCgg3zVAQ4gl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywBDwQBAAAAARAE/f///wABAwgAAAABAAAAAAEEIgAgrcWu1QvOE7IcR/Pw6wFIFh6/TLwoeKjo5eUoi7suzsEAAQMIQYOYAAAAAAABBCJRIIHaDT4wURNaieL52F4urfZh+Vm/sF5nEJeFRnLP0Kx9AA==" } } ] @@ -28983,14 +32326,28 @@ "request": { "id": "example:txsend#1", "method": "txsend", + "params": [ + "ed6c309a10273aa036d29b71cf70202291d4d4b72be353ac410e1678ecfbf74e" + ] + }, + "response": { + "tx": "0200000001974bc23173b7bca9b060dac12abd1bb158e8ed69a3e74d4f6af5919b15f5772c0100000000fdffffff020000000100000000220020adc5aed50bce13b21c47f3f0eb0148161ebf4cbc2878a8e8e5e5288bbb2ecec1418398000000000022512081da0d3e3051135a89e2f9d85e2eadf661f959bfb05e671097854672cfd0ac7d95000000", + "txid": "ed6c309a10273aa036d29b71cf70202291d4d4b72be353ac410e1678ecfbf74e", + "psbt": "cHNidP8BAgQCAAAAAQMElQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAFpz79e9wou5mbmtaiB+6WfRTf8SpZxmrd6n+rIFcWewQAAAAAA/f///wLS79/eAAAAABYAFE35CMxYA4yQx9XLuFj0/q5uNmligJaYAQAAAAAWABT/hTPq8LE5vAc9KiJjjmygoIN81UsAAAABAR+AlpgBAAAAABYAFP+FM+rwsTm8Bz0qImOObKCgg3zVIgICrdS+fDe+nFDye7Mp6i6PaAV6YeEglyQM1Lypkk6qiU5HMEQCID5oPTp8udytiNikLxBRfm+iAL2LeYa9bJBKih0OcN2CAiApOyjSHogrEppHHuTPuUqEeLq/psjaa8cEKHXw6Hz7cQEiBgKt1L58N76cUPJ7synqLo9oBXph4SCXJAzUvKmSTqqJTgj/hTPqAAAAAAEOIJdLwjFzt7ypsGDawSq9G7FY6O1po+dNT2r1kZsV9XcsAQ8EAQAAAAEQBP3///8AAQMIAAAAAQAAAAABBCIAIK3FrtULzhOyHEfz8OsBSBYev0y8KHio6OXlKIu7Ls7BAAEDCEGDmAAAAAAAAQQiUSCB2g0+MFETWoni+dheLq32YflZv7BeZxCXhUZyz9CsfSEHPXxCgubxwYgC9mDabmKYMY13V5d4yQepeZJ7VCvUFqIJAEDR+iMDAAAAAA==" + } + }, + { + "request": { + "id": "example:txsend#2", + "method": "txsend", "params": { - "txid": "c9f59ba6bda8e095bb43ecabfa37de8d5194e5c839b6b63be4e29bceaae483ce" + "txid": "e9a218878137adf2d34a8ef69151d6e288cc9b9a23f6a5e8ace1b43f03409358" } }, "response": { - "tx": "020000000142dc00d81359c3a551e170e3bf5262fa9cacc2eb2e283a10e579491cd86dce4b0000000000fdffffff020000000100000000220020b636f07026ea64952ece5b7620a9337d9ac2321c796a499260994d1b373667504183980000000000225120754a77b503fcba0fd80f0a1a8226ed6764ff9a9d9bb61b485d40d4c9f4be245966000000", - "txid": "c9f59ba6bda8e095bb43ecabfa37de8d5194e5c839b6b63be4e29bceaae483ce", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQDeAgAAAAABATRHoQ9tEMHRHpf06v5uTEdjdMk1rccIaA6MNGMipNQWAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFLnqitWTi465LGxeucwoSAj16NGbAkcwRAIgVtOsUaQaPgH86aW6e6qmJa1xVb8KWvc+HALGosqVVmQCIFi4JU8Gy+vl2a2/frY+71hitYIBB/tjsRP7fpgb8b9TASECHUIV5q1r2ownjOlAFPQASTlZxxNgBvi5O3hCRvajwdJlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZSICA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPRzBEAiBp/HPhg1ObOXqTr5rIjUYLMspGLz+sk1pjD9pjRFzf3wIgWycOB/dQPzwZAK3OXYs269h8o85ucDpdVhH4AyX69a0BIgYD10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8IAfrZCgAAAAABDiBC3ADYE1nDpVHhcOO/UmL6nKzC6y4oOhDleUkc2G3OSwEPBAAAAAABEAT9////AAEDCAAAAAEAAAAAAQQiACC2NvBwJupklS7OW3YgqTN9msIyHHlqSZJgmU0bNzZnUAABAwhBg5gAAAAAAAEEIlEgdUp3tQP8ug/YDwoagibtZ2T/mp2bthtIXUDUyfS+JFkhBycqmiXx/+1S+rBKLMiK6rE1tTcjhWqPFIHCZBf4ipIuCQDVXEk5CwAAAAA=" + "tx": "02000000014ef7fbec78160e41ac53e32bb7d4d491222070cf719bd236a03a27109a306ced0100000000fdffffff0240420f0000000000220020c9ea2c65ca8cdc27bc130fe11f5e52e175475e0e31b645b1dcc3832dc4f7e78dc22d890000000000225120774b1c2a9b4b0a9dce43b46395940da2001115d400fa3667909ec86a5d36518b4e000000", + "txid": "e9a218878137adf2d34a8ef69151d6e288cc9b9a23f6a5e8ace1b43f03409358", + "psbt": "cHNidP8BAgQCAAAAAQMETgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAEAAAAA/f///wIAAAABAAAAACIAIK3FrtULzhOyHEfz8OsBSBYev0y8KHio6OXlKIu7Ls7BQYOYAAAAAAAiUSCB2g0+MFETWoni+dheLq32YflZv7BeZxCXhUZyz9CsfZUAAAABAStBg5gAAAAAACJRIIHaDT4wURNaieL52F4urfZh+Vm/sF5nEJeFRnLP0Kx9AQ4gTvf77HgWDkGsU+Mrt9TUkSIgcM9xm9I2oDonEJowbO0BDwQBAAAAARAE/f///wETQIRl9k9MarVBCdz+jTkHVLk/f0KpyiwelXb3+0KqyEUNKPpgLxiJskis5PEsQfEjatvrDCm8cl1CnutfbKUUTGchFj18QoLm8cGIAvZg2m5imDGNd1eXeMkHqXmSe1Qr1BaiCQBA0fojAAAAAAABAwhAQg8AAAAAAAEEIgAgyeosZcqM3Ce8Ew/hH15S4XVHXg4xtkWx3MODLcT3540AAQMIwi2JAAAAAAABBCJRIHdLHCqbSwqdzkO0Y5WUDaIAERXUAPo2Z5CeyGpdNlGLIQeEMcD3iRgEiqSnJRphfipArfPS8md+1DjVMvR3UrU8wwkA1WaCQwYAAAAA" } } ] @@ -29123,28 +32480,21 @@ "id": "example:unreserveinputs#1", "method": "unreserveinputs", "params": { - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQDeAgAAAAABAXyy20ynmOFyRbegGyApk50yNIAb4C+RKV5c2n5VKL3lAAAAAAD9////Akf0EAAAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WUs/fQpAQAAABYAFN9HebR4q6498ytdeRKjC64CkCOMAkcwRAIgSTJCpWVH1FLZYPdwFe7gZckxCtk+AxPp20KUVKqPIdUCIA3hkoUco68vffiwt6TrE3KgX09JE9m7PDUUgrHQANMRASEDBOBlCza/8qXE5q8uJ+OWsKscDERWfdA+LLCa/lwMH0BlAAAAAQEfR/QQAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZSICA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPRzBEAiBKjSasyN29ODqXSemEQCZfRIvbJP8thKRBrd4e+NLEMQIgMGNz3+DWDnLmjnIDCaVcC7BKxuycwvtJq1qlKFtTaXcBIgYD10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8IAfrZCgAAAAABDiAoXS6QUlCcOApG/j+hr4OhNt0tT4GvCzI6z16Hepi7OwEPBAAAAAABEAT9////AAEDCCN6CAAAAAAAAQQWABQfJ4Qjje0sa2yGBz++6jkM2hGRmAz8CWxpZ2h0bmluZwQCAAEAAQMIinkIAAAAAAABBCJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aIQeRRTKBKkQKTXZscc05GTaUo0CuEeAS5boa2e+6bnbKUwkAwsyrFwIAAAAA", + "psbt": "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AahhAAAAAAAAIlEg+3d9jpNmK0getyg5W+Mp31CPIRDKcJg/mZs/uaVrQ+GZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA", "reserve": 200 } }, "response": { - "reservations": [ - { - "txid": "3bbb987a875ecf3a320baf814f2ddd36a183afa13ffe460a389c5052902e5d28", - "vout": 0, - "was_reserved": true, - "reserved": false - } - ] + "reservations": [] } }, { "request": { "id": "example:unreserveinputs#2", "method": "unreserveinputs", - "params": { - "psbt": "cHNidP8BAF4CAAAAAVa79WPJoiYrzo/RgzIAn5HanoBFZo0vZvEjxPAVwLv4AAAAAAD9////AXzpHAAAAAAAIlEgBRjpLNlOD2LAbxJt/5i5q+ebfthFoVbVJFZ44mVUR11mAAAAAAEA3gIAAAAAAQENwcSElLyC0jcwUHiODBhtapHyzIdiwytOGiu/Raf4BwAAAAAA/f///wKAhB4AAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFl82znKQEAAAAWABQyIWyAI6LDf6dJ58BDPdkh+PWUZwJHMEQCIGiJFhVi/d/Hz19Cz48uHTjhgBJ6WAlgl/bLVS7A6VtxAiAwlb7xYzIM4uopFvMnpOmGIOp3+upOPPF2F8VaB8U/HQEhA6BAjey7RADP4ifoh2VXhX7QXkh+sZqozv1EPuU5TxZmZQAAAAEBH4CEHgAAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WUAAA==" - } + "params": [ + "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AfZRxQsAAAAAIlEg21kTTo7K2doCG6F2JqgaDjc1kRCrH7AL08oPVVJhuE+ZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA" + ] }, "response": { "reservations": [] @@ -29253,9 +32603,9 @@ } }, "response": { - "tx": "0200000001c08ce0a9ea1e00179ea603cb8619ec2a2df990ef931e1ccd87fa7a0e271ed8370100000000fdffffff013514310100000000225120888ab14b6e1655d1d00039b836d70b66e3351543ab6cd2f94166255f3d5e6cb5cf000000", - "txid": "de5f1d6f0b2f95cfe5cfbf8cc33bd3f279a8f800ee0efc27bbfafb2b6ead9560", - "psbt": "cHNidP8BAgQCAAAAAQMEzwAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDgAgAAAAABAZRZ0m0kaJA+ubJw1eYurGROu1BYc0i7l9xbyG06R6uZAQAAAAD9////AmQtPCgBAAAAF6kUnoGu9IUv0FGnzol3Lb/BNBNkOViHAC0xAQAAAAAXqRRlVyjzbP420BqlDTI2cERp+EpVQIcCRzBEAiBliJpjBsipwFgsLZMlzbESZ6hMTh+pgKQlXUIL0nLb3wIga/xwr/IJgEc7Ie6ApS4aVDr9xr1TZ3wj+8bRvI6WqScBIQPgYuc48PzUufScX6A6YOsdmJwn+bAQjLZ/g9jhQYduHM4AAAABASAALTEBAAAAABepFGVXKPNs/jbQGqUNMjZwRGn4SlVAhyICArnAxoROEqUxyWjlXFUHjsFtm/dr6SkP2H0cynK0g5oXRzBEAiBlTUNYfS5n5rGRVmoNb0z3AMGJjHijwpXROGIVxfoBnQIgeTx32KY3CcfYTYzXUIRQAMUQB7rlPWRptWMDD3UttkcBAQQWABTWuWnTbf/a2YaRk/Zj7kgN/cc0iCIGArnAxoROEqUxyWjlXFUHjsFtm/dr6SkP2H0cynK0g5oXCNa5adMAAAAAAQ4gwIzgqeoeABeepgPLhhnsKi35kO+THhzNh/p6Dice2DcBDwQBAAAAARAE/f///wABAwg1FDEBAAAAAAEEIlEgiIqxS24WVdHQADm4NtcLZuM1FUOrbNL5QWYlXz1ebLUhByjMj8l44gnxaV+ltWVQYdsaqyMRtSQXaUW/EBXvLUuJCQCftnv8BwAAAAA=", + "tx": "0200000001e3148821838724c371613dfe954620b99b689803f29b17e33b85f655afc812170000000000fdffffff0135143101000000002251206c27e1956acfa61e68292c80908880e813450f754132e8a2ac471a86bf1326b566000000", + "txid": "52b8957df7b017c4c187641491b80ca209c52b286eba60afac7292a868fdf9d0", + "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQBzAgAAAAEJawGuY9Yx4yHwOdSd9MWwVc46+mVaPVwiwqhZT0H1zQAAAAAA/f///wIALTEBAAAAABepFGVXKPNs/jbQGqUNMjZwRGn4SlVAh3HE1CgBAAAAF6kUfN+wjm5E/BFSxPQjIl0rcUgkip2HZQAAAAEBIAAtMQEAAAAAF6kUZVco82z+NtAapQ0yNnBEafhKVUCHIgICucDGhE4SpTHJaOVcVQeOwW2b92vpKQ/YfRzKcrSDmhdHMEQCIBsJrbJqp2dLLklUvvheXUy1uu4eIMkebSbbYkQHWItOAiBEuulzciFVMVB7Rkt5eOb53CX5hq7Vq2LbwBHB6ApUTwEBBBYAFNa5adNt/9rZhpGT9mPuSA39xzSIIgYCucDGhE4SpTHJaOVcVQeOwW2b92vpKQ/YfRzKcrSDmhcI1rlp0wAAAAABDiDjFIghg4ckw3FhPf6VRiC5m2iYA/KbF+M7hfZVr8gSFwEPBAAAAAABEAT9////AAEDCDUUMQEAAAAAAQQiUSBsJ+GVas+mHmgpLICQiIDoE0UPdUEy6KKsRxqGvxMmtSEHWnm7u0BtS8KN8F+mqHMoz7AqfhN0O+zc0d/P4HHC4BAJAH0I2ZcFAAAAAA==", "upgraded_outs": 1 } } @@ -29469,23 +32819,35 @@ "request": { "id": "example:utxopsbt#1", "method": "utxopsbt", - "params": { - "satoshi": 0, - "feerate": "253perkw", - "startweight": 0, - "utxos": [ - "d82a99192fb333106ea8d08f5231ed45f2ed5b1ef9eb81b0fef8f9ea354d2637:1" + "params": [ + 1000000, + "15000perkw", + 214, + [ + "bffbd4f5f789765823b7c1c12151797898702c7fe52f1d08ea644308d33c05b3:1" ], - "reserve": 0, - "reservedok": true, - "excess_as_change": false - } + null, + true, + null, + null, + true + ] }, "response": { - "psbt": "cHNidP8BADMCAAAAATcmTTXq+fj+sIHr+R5b7fJF7TFSj9CobhAzsy8ZmSrYAQAAAAD9////AGYAAAAAAQDeAgAAAAABAWQACJva49ga8OCYXvPRWQRhoXndrJykwjgXbwT251dEAAAAAAD9////AiOI9ikBAAAAFgAU3gClv/YpAKRpfDuiFu6mIL2E4+5QaQ8AAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFlAkcwRAIgUXIQFs7oRkorVThUn3sLj7WI7g8c8RHai4ChoCvIkWsCICp1CqHl4BlMJCKFHRWHXhhekaj0r1EFSNrh8UnvysQPASEDqHIAEdaH3H6pb3VJzbJNDG4lL8PTfsheL+h2p6baK3JlAAAAAQEfUGkPAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQA=", - "feerate_per_kw": 253, - "estimated_final_weight": 271, - "excess_msat": 1009932000 + "psbt": "cHNidP8BAF4CAAAAAbMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQAAAAD9////AUFZ3AsAAAAAIlEgO+E35aPNS3YQRaiMByjTJDUYNvBO1Z39o3m42EZGUreYAAAAAAEAcQIAAAABl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywAAAAAAP3///8Ceh/00gAAAAAWABSauB3UBW2CVXly9l1sU6aMmVAq+ADC6wsAAAAAFgAUA8/shxXh9ASjbsAR5COPhjKfkJyXAAAAAQEfAMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnAAA", + "feerate_per_kw": 15000, + "estimated_final_weight": 657, + "excess_msat": 0, + "change_outnum": 0, + "reservations": [ + { + "txid": "bffbd4f5f789765823b7c1c12151797898702c7fe52f1d08ea644308d33c05b3", + "vout": 1, + "was_reserved": true, + "reserved": true, + "reserved_to_block": 2240 + } + ] } }, { @@ -29493,36 +32855,29 @@ "id": "example:utxopsbt#2", "method": "utxopsbt", "params": { - "satoshi": 1000000, - "feerate": "7500perkw", - "startweight": 0, + "satoshi": 2000000, + "feerate": "18750perkw", + "startweight": 214, "utxos": [ - "2fc3b9f8d4aed120f6d9a6f206f07c35ef4d518ec0305d1d974873d256e38ca7:1", - "2f669f6a605ee5c7ddd2abb753bc64b1a90bd1b7448264f5d78a7ca823c00a1b:1" + "bffbd4f5f789765823b7c1c12151797898702c7fe52f1d08ea644308d33c05b3:1" ], "reservedok": true, - "excess_as_change": false + "excess_as_change": true } }, "response": { - "psbt": "cHNidP8BAFwCAAAAAqeM41bSc0iXHV0wwI5RTe81fPAG8qbZ9iDRrtT4ucMvAQAAAAD9////GwrAI6h8itf1ZIJEt9ELqbFkvFO3q9Ldx+VeYGqfZi8BAAAAAP3///8AZgAAAAABAN4CAAAAAAEBEaK0TQ97IsrzuO1gLt+vYbvLBG90NrCOZp7SCgrRknYAAAAAAP3///8CM6/2KQEAAAAWABQ1B/KkIVbg7yFRcCEN/VOptfOX/EBCDwAAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WUCRzBEAiA1oI1us81XEa/DRlvcP2qnbWLsV5pZcRfvj9MLyT202gIgb7noMqHYWMmm7H7VNEfWa29jjtuV9yrrSc9ui11ECQ0BIQKhZOHR4gFKMu2EKKgZ/7qnhzq9PvhtnAW2sxPZ4c9RIWUAAAABAR9AQg8AAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFlAAEA3gIAAAAAAQGnjONW0nNIlx1dMMCOUU3vNXzwBvKm2fYg0a7U+LnDLwAAAAAA/f///wJmbOcpAQAAABYAFOwPo5eUrDF7UgZBFQLRHOeX6PiGQEIPAAAAAAAWABTCzKsXHCpb6dq1LsQbglhjAkxUZgJHMEQCICgjGlauGj2eiMS4MWUK6zAWqMe1OuidQR+Hy9ZgSTuzAiA8JTb9OrLqS3hiWtT+TQ/NBsKJ2hhHLDaKUUNdgi4OkAEhA9g3oH5ejmGIqUY2ZWxc8YWF2+T+XpE/6oC40Cx3+e97ZQAAAAEBH0BCDwAAAAAAFgAUwsyrFxwqW+natS7EG4JYYwJMVGYA", - "feerate_per_kw": 7500, - "estimated_final_weight": 542, - "excess_msat": 995935000, + "psbt": "cHNidP8BAF4CAAAAAbMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQAAAAD9////AWINzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAAEAcQIAAAABl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywAAAAAAP3///8Ceh/00gAAAAAWABSauB3UBW2CVXly9l1sU6aMmVAq+ADC6wsAAAAAFgAUA8/shxXh9ASjbsAR5COPhjKfkJyXAAAAAQEfAMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnAAA", + "feerate_per_kw": 18750, + "estimated_final_weight": 657, + "excess_msat": 0, + "change_outnum": 0, "reservations": [ { - "txid": "2fc3b9f8d4aed120f6d9a6f206f07c35ef4d518ec0305d1d974873d256e38ca7", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "2f669f6a605ee5c7ddd2abb753bc64b1a90bd1b7448264f5d78a7ca823c00a1b", + "txid": "bffbd4f5f789765823b7c1c12151797898702c7fe52f1d08ea644308d33c05b3", "vout": 1, "was_reserved": true, "reserved": true, - "reserved_to_block": 246 + "reserved_to_block": 2312 } ] } @@ -29848,17 +33203,12 @@ "params": { "subsystem": "invoices", "indexname": "created", - "nextvalue": 1 + "nextvalue": 0 } }, "response": { "subsystem": "invoices", - "created": 1, - "details": { - "status": "unpaid", - "label": "invlabel", - "bolt11": "lnbcrt420p1pjmxtevsp5d8c6gnaj8lyjy2qly783vklda9dfaqeyzyc37agxxp8h3uguv8pqpp5w6lhwxhqnuew4hle5h7qwjm27zz784mvsrzhmayhscy5t2hy5c4qdqvd9h8ver9wd3sxqyjw5qcqp99qxpqysgq09gxhjhwu9u3z6dlt5ln5f4g8zl78wz4pgh0am3kz54m9lllhqckf4gmhmt2ftrclq5x62zkqmggc7y0ju0ghdfwjz8hyd8l5cqvemgpyyhm6w" - } + "created": 15 } }, { @@ -29866,16 +33216,19 @@ "id": "example:wait#2", "method": "wait", "params": { - "subsystem": "invoices", - "indexname": "updated", - "nextvalue": 2 + "subsystem": "sendpays", + "indexname": "created", + "nextvalue": 15 } }, "response": { - "subsystem": "invoices", - "updated": 2, + "subsystem": "sendpays", + "created": 15, "details": { - "status": "expired" + "status": "pending", + "partid": 0, + "groupid": 1, + "payment_hash": "4c6f04eaf19dd956b616f1ba8718df40e387c4a56be36cf4e881a009cbf66899" } } }, @@ -29883,20 +33236,20 @@ "request": { "id": "example:wait#3", "method": "wait", - "params": { - "subsystem": "sendpays", - "indexname": "updated", - "nextvalue": 2 - } + "params": [ + "sendpays", + "updated", + 15 + ] }, "response": { "subsystem": "sendpays", - "updated": 2, + "updated": 15, "details": { "status": "complete", "partid": 0, "groupid": 1, - "payment_hash": "220dcfcf43e1fab3ce30f70eb943c3ce962393f5a65ced52d749e324b443d19e" + "payment_hash": "4c6f04eaf19dd956b616f1ba8718df40e387c4a56be36cf4e881a009cbf66899" } } } @@ -30137,19 +33490,17 @@ "params": {} }, "response": { - "label": "inv1", - "bolt11": "lnbcrt10n1pjmxtsxsp56sn02x8lccjfsvunnhz5858zuyxztug9luy226w4qsmfm4r8pkcspp5gw5r0dw99yf3zqxrg24l8g9m9hun9cu06ldg4rga8s9t9kv8z45sdq8d9h8vvgxqyjw5qcqp99qxpqysgqv537uh2sx8ch640mf4t43t8qjtpg3z7gukgm07tlyq986m7nvsnxkapg37z4vsxtl4thfqzc64anqr83geygkc2xaftxgr97dltqfjqpe3mhja", - "payment_hash": "43a837b5c529131100c342abf3a0bb2df932e38fd7da8a8d1d3c0ab2d9871569", - "amount_msat": 1000, + "label": "lbl balance l1 to l2", + "bolt11": "lnbcrt5m1pn2s39ksp53sknyy2mxxurt4y0wqgp730z0cnm0vz3zmzth8p79xsrtmg5llxspp5dp94v59nm6c99jf7lc07zmnhqw6kyujx3mkdav7643dczgtdedfqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcvfqw3hjqmpjxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqdz9cftkxe6kcqfddyrvr7j57ulsfxxxkgkjyhr3k77n8v59mzs5rmuexz9lxusyhhehlemd9ujclgahln8e0n8y86stc7u8uys6mjqgqerm6q4", + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", + "amount_msat": 500000000, "status": "paid", "pay_index": 1, - "amount_received_msat": 1000, - "paid_at": 1706241546, - "payment_preimage": "a0c668998de14b975f33e1060b3efd7efc0bde784ac266ab667a1b2fddab3cd1", - "description": [ - "Inv1." - ], - "expires_at": 1706846342, + "amount_received_msat": 500000000, + "paid_at": 1722303671, + "payment_preimage": "bed4140e1db302720d7f9547dc9127d45b115080447cce7e23cfd00b60991831", + "description": "description send some sats l1 to l2", + "expires_at": 1722908470, "created_index": 1, "updated_index": 1 } @@ -30159,24 +33510,23 @@ "id": "example:waitanyinvoice#2", "method": "waitanyinvoice", "params": { - "lastpay_index": 3, + "lastpay_index": 1, "timeout": 0 } }, "response": { - "label": "inv4", - "bolt11": "lnbcrt10n1pja0tkmsp57j4z9zwvdsyh57unh3da7aac5z20clfnrwy5nqm6wujaelduw23qpp580mdrwakz9xewc2vhvpucset9gjkgdvyhw7h9frcy2d6p2lwdw2qdq8d9h8vdqxqyjw5qcqp99qxpqysgqtgyzhtxs3p2dyk8wk9q028033303702d2hml4frmu38qe79mrkgzgxvyjmq2q4nhjgcuz3uhmlda3jnhf9w6mj8mj97pkgnda9l5kdcqsdgewf", - "payment_hash": "3bf6d1bbb6114d97614cbb03cc432b2a25643584bbbd72a478229ba0abee6b94", - "amount_msat": 1000, + "label": "lbl_l23", + "bolt11": "lnbcrt1pn2s38zsp5lv49w44a8tvkwtkxfxwts8rnr864u59srp7sxuua3haahdhlhtrqpp5p928w8rmsg2hjeymedcn54vxhsz372qhcedgf003nmsknhx9594sdqcdserxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqt5h8te9lkn0jpdkhkmlkzs80aw7mt5kdm6jxmvddkavt3vj0vakkmfcs0hsde8y8g8za46sch2lp4jxy56u8ve25sgpgcsya0vp92sgphzw570", + "payment_hash": "0954771c7b821579649bcb713a5586bc051f2817c65a84bdf19ee169dcc5a16b", "status": "paid", - "pay_index": 4, - "amount_received_msat": 1000, - "paid_at": 1708633825, - "payment_preimage": "77336a342dde76050c7ee7fc18599e407dfc1edad3c784ba68e9603004365b94", - "description": "inv4", - "expires_at": 1709238619, - "created_index": 4, - "updated_index": 4 + "pay_index": 2, + "amount_received_msat": 9900, + "paid_at": 1722303715, + "payment_preimage": "f3a3b40d63e62785f537aad60f93980914c5639872c7746299a6a1228abbc303", + "description": "l23 description", + "expires_at": 1722908514, + "created_index": 8, + "updated_index": 2 } } ] @@ -30243,11 +33593,12 @@ "id": "example:waitblockheight#1", "method": "waitblockheight", "params": { - "blockheight": 99 + "blockheight": 129, + "timeout": 600 } }, "response": { - "blockheight": 99 + "blockheight": 130 } }, { @@ -30255,12 +33606,11 @@ "id": "example:waitblockheight#2", "method": "waitblockheight", "params": { - "blockheight": 103, - "timeout": 600 + "blockheight": 131 } }, "response": { - "blockheight": 103 + "blockheight": 131 } } ] @@ -30506,20 +33856,42 @@ }, "response": { "label": "inv2", - "bolt11": "lnbcrt10n1pjmxtwjsp5mzvdu6v8hqsf2tlj0nlyks23afqp7ejs444syjxf74p60ztmld8qpp5q4ayz5pys3t0yj0dmkmh7ctarkv9z434paz4u9rdwnj4f43thhaqdq8d9h8vvsxqyjw5qcqp99qxpqysgqn0055ttns6pafsxh6xuqce6e4vz8gtxlzqx0l9d9f5crmqx4jymh4zy9jdaszm0dj89sq39fvhpwcs626dt0n3gw8kassfdehp5sy3sq7fzy3w", - "payment_hash": "057a4150248456f249edddb77f617d1d985156350f455e146d74e554d62bbdfa", - "amount_msat": 1000, + "bolt11": "lnbcrt20n1pn2s38fsp55xnux6tuzuutlqhekzytnexpqj6w3q00h6e7wu08ex43rdr4xqdqpp5znq67nu5secgcf79ncjtqfdpjfqh7acaxvngcqwqsvvxwnkyl35qdq8d9h8vvsxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgq9ptnru6v58v8qd58xdqypr86utn6fhssx8rwegsspfp9d975h0t47xn0hea6qrmy2ucxt4l02nkxu7va7d5lqgy8nrqmhxqpm5qauegqjjqr02", + "payment_hash": "14c1af4f9486708c27c59e24b025a192417f771d33268c01c08318674ec4fc68", + "amount_msat": 2000, "status": "paid", - "pay_index": 1, - "amount_received_msat": 1000, - "paid_at": 1706241494, - "payment_preimage": "34ccd37cc85e067cb376f9ea8c70d70469f58bf296f2566ed9ad4dfb70971a26", - "description": [ - "Inv2." - ], - "expires_at": 1706846290, - "created_index": 2, - "updated_index": 1 + "pay_index": 4, + "amount_received_msat": 2000, + "paid_at": 1722303723, + "payment_preimage": "1bda6e78384905bc476c6f50b447cf7fbba13a2644d49d85d797a826e8b9a6a0", + "description": "inv2", + "expires_at": 1722908521, + "created_index": 12, + "updated_index": 4 + } + }, + { + "request": { + "id": "example:waitinvoice#2", + "method": "waitinvoice", + "params": [ + "inv3" + ] + }, + "response": { + "label": "inv3", + "bolt11": "lnbcrt30n1pn2s38fsp5syqds2z0hgqgf3dcxt9kp5m2rtywxm4u4hr4xe90r885rr609vgqpp52y0xdhlzrua5clpuyw4wcfk9duxwwauzcjxrs9nj00258njmdjnsdq8d9h8vvcxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqkkeex45p62vc7nfjywwfle8yhk9wemyktw2m7924cfmlthk37q6ptjd8vxyaevtejfj44yp55xllqlljxv5vz6wc3gc9jlfkwrkngscqtl0xs8", + "payment_hash": "511e66dfe21f3b4c7c3c23aaec26c56f0ce77782c48c3816727bd543ce5b6ca7", + "amount_msat": 3000, + "status": "paid", + "pay_index": 5, + "amount_received_msat": 3000, + "paid_at": 1722303725, + "payment_preimage": "86e637cb70631a0db88cc8f6ef9a21457b1b85be30236efb769a611b356225cd", + "description": "inv3", + "expires_at": 1722908521, + "created_index": 13, + "updated_index": 5 } } ] @@ -30760,23 +34132,22 @@ "id": "example:waitsendpay#1", "method": "waitsendpay", "params": { - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a" + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2" } }, "response": { - "created_index": 1, - "id": 1, - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", + "created_index": 2, + "id": 2, + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", "groupid": 1, - "updated_index": 1, - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 11000000, - "amount_sent_msat": 11000000, - "created_at": 1706152930, - "completed_at": 1706152933, + "updated_index": 2, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303675, + "completed_at": 1722303677, "status": "complete", - "payment_preimage": "af7ba559629f719c04c43a82767fe3622790a539164d6270db07f765203e574b", - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk" + "payment_preimage": "984a10782218478cd39e1f9a16795d756c337662067023a3b690bffdb1593f76" } } ] @@ -30887,14 +34258,14 @@ "id": "example:withdraw#1", "method": "withdraw", "params": { - "destination": "bcrt1qjc7j2l5es4haw35c9jzm8dfm763ng5djp8f0s0", + "destination": "bcrt1qcqqvkswps3e6ck3jmqf86f9tcaeke5z04d3tv4", "satoshi": 555555 } }, "response": { - "tx": "0200000001ef28647baa13cc4c03b8a58c8bd08b69de434c22ff591eb68171ae992e3d816d0000000000fdffffff02237a080000000000160014963d257e99856fd746982c85b3b53bf6a33451b24d6808000000000022512063ffee4ea7d51e6cadf9086e286a2527922aaa25b8c53aebf32fa32a0a627f5a66000000", - "txid": "ccb97d7dc695cabb78b217c0b27d7d00d2941966199480e6443e0680d24d69eb", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQDeAgAAAAABAWPCRda9hy4QKqUEmtb7gK7SAqzh1xBP8nZ7PCj+7+JDAAAAAAD9////Akf0EAAAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WUs/fQpAQAAABYAFOIj6yaI/g85utJBtkPPdK1X59cfAkcwRAIgH7J57HuUTpnCbDrDqE8W7ryuCXk+i/TszQ/NF55lWncCIDeN4y+EzIDP3l2XO5/wjk98krYqnzvEhrStk+0+fTowASEC6Ng5r5KTNIXBRRvjivsd8SKnHF59r/ViDj2+CLJVb75lAAAAAQEfR/QQAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZSICA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPRzBEAiBY0urYSHLnnXaAJH7yaGfvGmm+VuNCNIBhQaJU6iDNEgIgA7EASW+V00Su+lRQAE3Qbe4wavLq7l6Jn2vR+6Snyd0BIgYD10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8IAfrZCgAAAAABDiDvKGR7qhPMTAO4pYyL0Itp3kNMIv9ZHraBca6ZLj2BbQEPBAAAAAABEAT9////AAEDCCN6CAAAAAAAAQQWABSWPSV+mYVv10aYLIWztTv2ozRRsgz8CWxpZ2h0bmluZwQCAAEAAQMITWgIAAAAAAABBCJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aIQeRRTKBKkQKTXZscc05GTaUo0CuEeAS5boa2e+6bnbKUwkAwsyrFwIAAAAA" + "tx": "0200000001187e8867dc9462f0acbf9b7ecad69c786bdb04bdc89eb0bea45db35f8cf7dd860000000000fdffffff02237a080000000000160014c000cb41c18473ac5a32d8127d24abc7736cd04f0636e30b0000000022512052021c61da23b2eda3d5000c6d812d0c9b088c237ed2a510abd94d8c3f7c421d20000000", + "txid": "faf2ac1e15fe8df73c411d404224cb481f01cabdde58df83c56d5d6050ec53a9", + "psbt": "cHNidP8BAgQCAAAAAQMEIAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGdA6aKwu4U7Zes8OwDJHp4bI3maidtrjOK6N85klZucAEAAAAA/f///wIAwusLAAAAABYAFCchPiIXtPVr0Ztsg5Pcn2G+aRIzQD/9EAEAAAAWABRz0UYcTRX0fJpAf766DfDa2wbGUGcAAAABAR8AwusLAAAAABYAFCchPiIXtPVr0Ztsg5Pcn2G+aRIzIgICB+wrNVNHEthq4DDdm/rsCOLd6h7Bzs/7lyXtessSq2ZHMEQCIEW+oeZvFbmuQidamye9/iuDhJ41SARdgZV8yWWjfq8vAiAS3no++NDmJjip3G/y4VTfQ/jiJv2jv9lQKqBUK9hQ0wEiBgIH7Cs1U0cS2GrgMN2b+uwI4t3qHsHOz/uXJe16yxKrZggnIT4iAAAAAAEOIBh+iGfclGLwrL+bfsrWnHhr2wS9yJ6wvqRds1+M992GAQ8EAAAAAAEQBP3///8AIgICLKJZZMteDpQ8BfcEOrSAECukrPM9dXeamXREWCtGR1AIwADLQQwAAAABAwgjeggAAAAAAAEEFgAUwADLQcGEc6xaMtgSfSSrx3Ns0E8M/AlsaWdodG5pbmcEAgABAAEDCAY24wsAAAAAAQQiUSBSAhxh2iOy7aPVAAxtgS0MmwiMI37SpRCr2U2MP3xCHSEHxKQ1JAGJOzVxgiryRaI4NGaYWWe35WSg4OUGHU+NcXEJAIvHqlwOAAAAAA==" } }, { @@ -30902,19 +34273,19 @@ "id": "example:withdraw#2", "method": "withdraw", "params": { - "destination": "bcrt1q66ukn5mdllddnp53j0mx8mjgph7uwdygn0uy45", + "destination": "bcrt1phtprcvhz842sxe8qw0yryvc0g6n6dw2puweklcpnfye273kjpfhs0d6d2e", "satoshi": "all", "feerate": "20000perkb", "minconf": 0, "utxos": [ - "218390859cf94d869e33f69161f4187a98f691afe868c20811528f589e90a61f:1" + "f2f4e67dbf2791a3b57dd986418156b116b452c5fc27b077da7c529db82f06f5:0" ] } }, "response": { - "tx": "02000000011fa6909e588f521108c268e8af91f6987a18f46191f6339e864df99c859083210100000000fdffffff0158070f0000000000160014d6b969d36dffdad9869193f663ee480dfdc7348867000000", - "txid": "ad9a712a201214c68c39ca5be68c9d153d1cac91e540d88aa3207b241e23acf8", - "psbt": "cHNidP8BAgQCAAAAAQMEZwAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQD9ZQECAAAAAAEBVa+m1d1amChv4Dwq1rVoS4KSm0BUUnVa3fUYcB3dH9oAAAAAAP////8CECcAAAAAAAAiUSBXeaBg8gDUDo+HGkDrkWFMxb+m0KX4UuBTQAp/7/hhUOEPDwAAAAAAIlEg7tdFgE2peEzCA/Vj76mf+lT98BsTe8lk5jwxJAcP++YEAEcwRAIgPsWO/4IxeW6OclDdXVnwL99X7B18sRlxgFqyvUAzN7gCIGOQOq0wZ6bV+wdYQP+9sH8IkfmqWZbQRRDkZEgfcprMAUcwRAIgb5/dI4+uVhluQjSA2q/3oAGxZd4vYzQWexfmcRQML7ECIFfgRwCaHYdyu5/H5moOPlfQlLc2gPgB6bgtfNSfRA6jAUdSIQIyQmbehAOzqxV6CfH3hNWHr2GDHJmMFRvMIbt0wrIxSyEC4704AJhmydqOxKqZzE6pxsDdRt8Vxh7wzh8nEpFxTldSrgAAAAABASvhDw8AAAAAACJRIO7XRYBNqXhMwgP1Y++pn/pU/fAbE3vJZOY8MSQHD/vmAQ4gH6aQnliPUhEIwmjor5H2mHoY9GGR9jOehk35nIWQgyEBDwQBAAAAARAE/f///wETQL0MqyYsx9Z9q14BhByMgWLW4oJHOqED5qcZ3wyJ4eDuLYfNGq6Ck30dAqFzJL4VhZLSuv87zN/1AEDNMl2DmTohFl03KAgp8YbLmVzcy/I4q0VkATk5c1E5YySjZXXfNN3/CQAHHEnKAAAAAAAiAgK5wMaEThKlMclo5VxVB47BbZv3a+kpD9h9HMpytIOaFwjWuWnTBAAAAAEDCFgHDwAAAAAAAQQWABTWuWnTbf/a2YaRk/Zj7kgN/cc0iAz8CWxpZ2h0bmluZwQCAAEA" + "tx": "0200000001f5062fb89d527cda77b027fcc552b416b156814186d97db5a39127bf7de6f4f20000000000fdffffff0119f70e0000000000225120bac23c32e23d550364e073c832330f46a7a6b941e3b36fe0334932af46d20a6f87000000", + "txid": "41dd478136c95acc82b7669fa4c70843da2ecd04baa7c53cbe8c73d0dd98e5c1", + "psbt": "cHNidP8BAgQCAAAAAQMEhwAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQCJAgAAAAGxWGMGDX3aCdIKW4Vrs4nxXQD8LjoWZ2z3R6yqUp0MxAEAAAAA/f///wKSAA8AAAAAACJRIP2rfAH65wwI4LH5rKzKEQpTEh513FSiXnVCQW80Kur3QEIPAAAAAAAiACCWVeKnMwzYbcafjtGEWvVYDdBrFaeUA0yVceU9Vjmzl3oAAAABASuSAA8AAAAAACJRIP2rfAH65wwI4LH5rKzKEQpTEh513FSiXnVCQW80Kur3AQ4g9QYvuJ1SfNp3sCf8xVK0FrFWgUGG2X21o5Env33m9PIBDwQAAAAAARAE/f///wETQFj1/T/JtePk1+LfX9fAK4QBBwl1Xt1YmoE2cQOo/0hAvCLgwb5zSZCrDGAhxdSujHXyVo3a19wl+ayqa0/nckAhFr2SP8yeYDMCCkVocL4aDjUqc7hPoTIp/uS7zAf7okk6CQDK3xgoAAAAAAABAwgZ9w4AAAAAAAEEIlEgusI8MuI9VQNk4HPIMjMPRqemuUHjs2/gM0kyr0bSCm8hB6Jvzf+c2c5Qrvvj78smeIzuWAjjEtHW01YDo2je0daMCQBxtd2rDQAAAAz8CWxpZ2h0bmluZwQCAAEA" } } ] diff --git a/contrib/pyln-client/pyln/client/plugin.py b/contrib/pyln-client/pyln/client/plugin.py index 1e7116b47677..922e6164c574 100644 --- a/contrib/pyln-client/pyln/client/plugin.py +++ b/contrib/pyln-client/pyln/client/plugin.py @@ -48,15 +48,11 @@ class Method(object): """ def __init__(self, name: str, func: Callable[..., JSONType], mtype: MethodType = MethodType.RPCMETHOD, - category: str = None, desc: str = None, - long_desc: str = None, deprecated: Union[bool, List[str]] = None): + deprecated: Union[bool, List[str]] = None): self.name = name self.func = func self.mtype = mtype - self.category = category self.background = False - self.desc = desc - self.long_desc = long_desc self.deprecated = deprecated self.before: List[str] = [] self.after: List[str] = [] @@ -327,9 +323,6 @@ def convert_featurebits( def add_method(self, name: str, func: Callable[..., Any], background: bool = False, - category: Optional[str] = None, - desc: Optional[str] = None, - long_desc: Optional[str] = None, deprecated: Optional[Union[bool, List[str]]] = None) -> None: """Add a plugin method to the dispatch table. @@ -357,9 +350,6 @@ def add_method(self, name: str, func: Callable[..., Any], `request.set_result` or `result.set_exception` to return a result or raise an exception for the call. - The `category` argument can be used to specify the category of the - newly created rpc command. - `deprecated` True means that it won't appear unless `allow-deprecated-apis` is true (the default), or if list of version string (e.g. "v23.08"), then start deprecation cycle at that version (and removal after second entry in list). @@ -370,11 +360,7 @@ def add_method(self, name: str, func: Callable[..., Any], ) # Register the function with the name - method = Method( - name, func, MethodType.RPCMETHOD, category, desc, long_desc, - deprecated - ) - + method = Method(name, func, MethodType.RPCMETHOD, deprecated) method.background = background self.methods[name] = method @@ -497,9 +483,10 @@ def async_method(self, method_name: str, category: Optional[str] = None, Internally uses add_method. """ def decorator(f: Callable[..., None]) -> Callable[..., None]: - self.add_method(method_name, f, background=True, category=category, - desc=desc, long_desc=long_desc, - deprecated=deprecated) + for attr, attr_name in [(category, "Category"), (desc, "Description"), (long_desc, "Long description")]: + if attr is not None: + self.log("{} is deprecated but defined in method {}; it will be ignored by Core Lightning".format(attr_name, method_name), level="warn") + self.add_method(method_name, f, background=True, deprecated=deprecated) return f return decorator @@ -512,13 +499,10 @@ def method(self, method_name: str, category: Optional[str] = None, Internally uses add_method. """ def decorator(f: Callable[..., JSONType]) -> Callable[..., JSONType]: - self.add_method(method_name, - f, - background=False, - category=category, - desc=desc, - long_desc=long_desc, - deprecated=deprecated) + for attr, attr_name in [(category, "Category"), (desc, "Description"), (long_desc, "Long description")]: + if attr is not None: + self.log("{} is deprecated but defined in method {}; it will be ignored by Core Lightning".format(attr_name, method_name), level="warn") + self.add_method(method_name, f, background=False, deprecated=deprecated) return f return decorator @@ -957,13 +941,8 @@ def _getmanifest(self, **kwargs) -> JSONType: methods.append({ 'name': method.name, - 'category': method.category if method.category else "plugin", - 'usage': " ".join(args), - 'description': doc if not method.desc else method.desc + 'usage': " ".join(args) }) - if method.long_desc: - m = methods[len(methods) - 1] - m["long_description"] = method.long_desc manifest = { 'options': list(d.json() for d in self.options.values()), diff --git a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py index 57f2724deb75..2cfcf954fba3 100644 --- a/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py +++ b/contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py @@ -15,7 +15,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\"\xac\x02\n\x0eGetinfoBinding\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.GetinfoBinding.GetinfoBindingType\x12\x14\n\x07\x61\x64\x64ress\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04port\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06socket\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07subtype\x18\x05 \x01(\tH\x03\x88\x01\x01\"_\n\x12GetinfoBindingType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x12\r\n\tWEBSOCKET\x10\x05\x42\n\n\x08_addressB\x07\n\x05_portB\t\n\x07_socketB\n\n\x08_subtype\"\xb5\x01\n\x10ListpeersRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x38\n\x05level\x18\x02 \x01(\x0e\x32$.cln.ListpeersRequest.ListpeersLevelH\x01\x88\x01\x01\"E\n\x0eListpeersLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\x0b\n\x07UNUSUAL\x10\x03\x12\t\n\x05TRACE\x10\x04\x42\x05\n\x03_idB\x08\n\x06_level\"7\n\x11ListpeersResponse\x12\"\n\x05peers\x18\x01 \x03(\x0b\x32\x13.cln.ListpeersPeers\"\xdf\x01\n\x0eListpeersPeers\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x11\n\tconnected\x18\x02 \x01(\x08\x12#\n\x03log\x18\x03 \x03(\x0b\x32\x16.cln.ListpeersPeersLog\x12\x0f\n\x07netaddr\x18\x05 \x03(\t\x12\x15\n\x08\x66\x65\x61tures\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0bremote_addr\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0cnum_channels\x18\x08 \x01(\rH\x02\x88\x01\x01\x42\x0b\n\t_featuresB\x0e\n\x0c_remote_addrB\x0f\n\r_num_channels\"\x88\x03\n\x11ListpeersPeersLog\x12?\n\titem_type\x18\x01 \x01(\x0e\x32,.cln.ListpeersPeersLog.ListpeersPeersLogType\x12\x18\n\x0bnum_skipped\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04time\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03log\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07node_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x11\n\x04\x64\x61ta\x18\x07 \x01(\x0cH\x05\x88\x01\x01\"t\n\x15ListpeersPeersLogType\x12\x0b\n\x07SKIPPED\x10\x00\x12\n\n\x06\x42ROKEN\x10\x01\x12\x0b\n\x07UNUSUAL\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\t\n\x05IO_IN\x10\x05\x12\n\n\x06IO_OUT\x10\x06\x12\t\n\x05TRACE\x10\x07\x42\x0e\n\x0c_num_skippedB\x07\n\x05_timeB\t\n\x07_sourceB\x06\n\x04_logB\n\n\x08_node_idB\x07\n\x05_data\"0\n\x10ListfundsRequest\x12\x12\n\x05spent\x18\x01 \x01(\x08H\x00\x88\x01\x01\x42\x08\n\x06_spent\"e\n\x11ListfundsResponse\x12&\n\x07outputs\x18\x01 \x03(\x0b\x32\x15.cln.ListfundsOutputs\x12(\n\x08\x63hannels\x18\x02 \x03(\x0b\x32\x16.cln.ListfundsChannels\"\xb9\x03\n\x10ListfundsOutputs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06output\x18\x02 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0cscriptpubkey\x18\x04 \x01(\x0c\x12\x14\n\x07\x61\x64\x64ress\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0credeemscript\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12<\n\x06status\x18\x07 \x01(\x0e\x32,.cln.ListfundsOutputs.ListfundsOutputsStatus\x12\x18\n\x0b\x62lockheight\x18\x08 \x01(\rH\x02\x88\x01\x01\x12\x10\n\x08reserved\x18\t \x01(\x08\x12\x1e\n\x11reserved_to_block\x18\n \x01(\rH\x03\x88\x01\x01\"Q\n\x16ListfundsOutputsStatus\x12\x0f\n\x0bUNCONFIRMED\x10\x00\x12\r\n\tCONFIRMED\x10\x01\x12\t\n\x05SPENT\x10\x02\x12\x0c\n\x08IMMATURE\x10\x03\x42\n\n\x08_addressB\x0f\n\r_redeemscriptB\x0e\n\x0c_blockheightB\x14\n\x12_reserved_to_block\"\xab\x02\n\x11ListfundsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12$\n\x0four_amount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x04 \x01(\x0c\x12\x16\n\x0e\x66unding_output\x18\x05 \x01(\r\x12\x11\n\tconnected\x18\x06 \x01(\x08\x12 \n\x05state\x18\x07 \x01(\x0e\x32\x11.cln.ChannelState\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nchannel_id\x18\t \x01(\x0cH\x01\x88\x01\x01\x42\x13\n\x11_short_channel_idB\r\n\x0b_channel_id\"\xbb\x03\n\x0eSendpayRequest\x12 \n\x05route\x18\x01 \x03(\x0b\x32\x11.cln.SendpayRoute\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x13\n\x06partid\x18\x07 \x01(\x04H\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\t \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x08\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_bolt11B\x11\n\x0f_payment_secretB\t\n\x07_partidB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x13\n\x11_payment_metadataB\x0e\n\x0c_description\"\xad\x05\n\x0fSendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x32\n\x06status\x18\x04 \x01(\x0e\x32\".cln.SendpayResponse.SendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x14\n\x07message\x18\x0e \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0f \x01(\x04H\t\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\x0b\x88\x01\x01\"*\n\rSendpayStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\x0f\n\r_completed_atB\x10\n\x0e_created_indexB\x10\n\x0e_updated_index\"\\\n\x0cSendpayRoute\x12\n\n\x02id\x18\x02 \x01(\x0c\x12\r\n\x05\x64\x65lay\x18\x03 \x01(\r\x12\x0f\n\x07\x63hannel\x18\x04 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"\x93\x01\n\x13ListchannelsRequest\x12\x1d\n\x10short_channel_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06source\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\t\n\x07_sourceB\x0e\n\x0c_destination\"C\n\x14ListchannelsResponse\x12+\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x19.cln.ListchannelsChannels\"\xb3\x03\n\x14ListchannelsChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\x0e\n\x06public\x18\x04 \x01(\x08\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\rmessage_flags\x18\x06 \x01(\r\x12\x15\n\rchannel_flags\x18\x07 \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x08 \x01(\x08\x12\x13\n\x0blast_update\x18\t \x01(\r\x12\x1d\n\x15\x62\x61se_fee_millisatoshi\x18\n \x01(\r\x12\x19\n\x11\x66\x65\x65_per_millionth\x18\x0b \x01(\r\x12\r\n\x05\x64\x65lay\x18\x0c \x01(\r\x12&\n\x11htlc_minimum_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x11htlc_maximum_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x0f \x01(\x0c\x12\x11\n\tdirection\x18\x10 \x01(\rB\x14\n\x12_htlc_maximum_msat\"#\n\x10\x41\x64\x64gossipRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x13\n\x11\x41\x64\x64gossipResponse\"\xac\x01\n\x14\x41\x64\x64psbtoutputRequest\x12\x1c\n\x07satoshi\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\x08locktime\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_locktimeB\x0e\n\x0c_initialpsbtB\x0e\n\x0c_destination\"U\n\x15\x41\x64\x64psbtoutputResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1e\n\x16\x65stimated_added_weight\x18\x02 \x01(\r\x12\x0e\n\x06outnum\x18\x03 \x01(\r\"O\n\x14\x41utocleanonceRequest\x12*\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystem\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x04\"G\n\x15\x41utocleanonceResponse\x12.\n\tautoclean\x18\x01 \x01(\x0b\x32\x1b.cln.AutocleanonceAutoclean\"\xb1\x04\n\x16\x41utocleanonceAutoclean\x12L\n\x11succeededforwards\x18\x01 \x01(\x0b\x32,.cln.AutocleanonceAutocleanSucceededforwardsH\x00\x88\x01\x01\x12\x46\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32).cln.AutocleanonceAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x44\n\rsucceededpays\x18\x03 \x01(\x0b\x32(.cln.AutocleanonceAutocleanSucceededpaysH\x02\x88\x01\x01\x12>\n\nfailedpays\x18\x04 \x01(\x0b\x32%.cln.AutocleanonceAutocleanFailedpaysH\x03\x88\x01\x01\x12\x42\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32\'.cln.AutocleanonceAutocleanPaidinvoicesH\x04\x88\x01\x01\x12H\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32*.cln.AutocleanonceAutocleanExpiredinvoicesH\x05\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoices\"M\n\'AutocleanonceAutocleanSucceededforwards\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"J\n$AutocleanonceAutocleanFailedforwards\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"I\n#AutocleanonceAutocleanSucceededpays\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"F\n AutocleanonceAutocleanFailedpays\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"H\n\"AutocleanonceAutocleanPaidinvoices\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"K\n%AutocleanonceAutocleanExpiredinvoices\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"W\n\x16\x41utocleanstatusRequest\x12/\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystemH\x00\x88\x01\x01\x42\x0c\n\n_subsystem\"K\n\x17\x41utocleanstatusResponse\x12\x30\n\tautoclean\x18\x01 \x01(\x0b\x32\x1d.cln.AutocleanstatusAutoclean\"\xbf\x04\n\x18\x41utocleanstatusAutoclean\x12N\n\x11succeededforwards\x18\x01 \x01(\x0b\x32..cln.AutocleanstatusAutocleanSucceededforwardsH\x00\x88\x01\x01\x12H\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32+.cln.AutocleanstatusAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x46\n\rsucceededpays\x18\x03 \x01(\x0b\x32*.cln.AutocleanstatusAutocleanSucceededpaysH\x02\x88\x01\x01\x12@\n\nfailedpays\x18\x04 \x01(\x0b\x32\'.cln.AutocleanstatusAutocleanFailedpaysH\x03\x88\x01\x01\x12\x44\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32).cln.AutocleanstatusAutocleanPaidinvoicesH\x04\x88\x01\x01\x12J\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32,.cln.AutocleanstatusAutocleanExpiredinvoicesH\x05\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoices\"g\n)AutocleanstatusAutocleanSucceededforwards\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"d\n&AutocleanstatusAutocleanFailedforwards\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"c\n%AutocleanstatusAutocleanSucceededpays\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"`\n\"AutocleanstatusAutocleanFailedpays\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"b\n$AutocleanstatusAutocleanPaidinvoices\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"e\n\'AutocleanstatusAutocleanExpiredinvoices\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"U\n\x13\x43heckmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\r\n\x05zbase\x18\x02 \x01(\t\x12\x13\n\x06pubkey\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x42\t\n\x07_pubkey\"8\n\x14\x43heckmessageResponse\x12\x10\n\x08verified\x18\x01 \x01(\x08\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\"\xcb\x02\n\x0c\x43loseRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1e\n\x11unilateraltimeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\tH\x01\x88\x01\x01\x12!\n\x14\x66\x65\x65_negotiation_step\x18\x04 \x01(\tH\x02\x88\x01\x01\x12)\n\rwrong_funding\x18\x05 \x01(\x0b\x32\r.cln.OutpointH\x03\x88\x01\x01\x12\x1f\n\x12\x66orce_lease_closed\x18\x06 \x01(\x08H\x04\x88\x01\x01\x12\x1e\n\x08\x66\x65\x65range\x18\x07 \x03(\x0b\x32\x0c.cln.FeerateB\x14\n\x12_unilateraltimeoutB\x0e\n\x0c_destinationB\x17\n\x15_fee_negotiation_stepB\x10\n\x0e_wrong_fundingB\x15\n\x13_force_lease_closed\"\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\"\xfe\x05\n\x15\x43reateinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12>\n\x06status\x18\x06 \x01(\x0e\x32..cln.CreateinvoiceResponse.CreateinvoiceStatus\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x16\n\tpay_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x06\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\x08\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\x12;\n\rpaid_outpoint\x18\x11 \x01(\x0b\x32\x1f.cln.CreateinvoicePaid_outpointH\n\x88\x01\x01\"8\n\x13\x43reateinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_created_indexB\x10\n\x0e_paid_outpoint\":\n\x1a\x43reateinvoicePaid_outpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xb4\x02\n\x10\x44\x61tastoreRequest\x12\x10\n\x03hex\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x36\n\x04mode\x18\x03 \x01(\x0e\x32#.cln.DatastoreRequest.DatastoreModeH\x01\x88\x01\x01\x12\x17\n\ngeneration\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\t\x12\x13\n\x06string\x18\x06 \x01(\tH\x03\x88\x01\x01\"p\n\rDatastoreMode\x12\x0f\n\x0bMUST_CREATE\x10\x00\x12\x10\n\x0cMUST_REPLACE\x10\x01\x12\x15\n\x11\x43REATE_OR_REPLACE\x10\x02\x12\x0f\n\x0bMUST_APPEND\x10\x03\x12\x14\n\x10\x43REATE_OR_APPEND\x10\x04\x42\x06\n\x04_hexB\x07\n\x05_modeB\r\n\x0b_generationB\t\n\x07_string\"\x82\x01\n\x11\x44\x61tastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"$\n\x15\x44\x61tastoreusageRequest\x12\x0b\n\x03key\x18\x01 \x03(\t\"S\n\x16\x44\x61tastoreusageResponse\x12\x39\n\x0e\x64\x61tastoreusage\x18\x01 \x01(\x0b\x32!.cln.DatastoreusageDatastoreusage\"@\n\x1c\x44\x61tastoreusageDatastoreusage\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x13\n\x0btotal_bytes\x18\x02 \x01(\x04\"\x9d\x01\n\x12\x43reateonionRequest\x12\"\n\x04hops\x18\x01 \x03(\x0b\x32\x14.cln.CreateonionHops\x12\x11\n\tassocdata\x18\x02 \x01(\x0c\x12\x18\n\x0bsession_key\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x17\n\nonion_size\x18\x04 \x01(\rH\x01\x88\x01\x01\x42\x0e\n\x0c_session_keyB\r\n\x0b_onion_size\"<\n\x13\x43reateonionResponse\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x16\n\x0eshared_secrets\x18\x02 \x03(\x0c\"2\n\x0f\x43reateonionHops\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"J\n\x13\x44\x65ldatastoreRequest\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x03 \x03(\tB\r\n\x0b_generation\"\x85\x01\n\x14\x44\x65ldatastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xb6\x01\n\x11\x44\x65linvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\x12\x37\n\x06status\x18\x02 \x01(\x0e\x32\'.cln.DelinvoiceRequest.DelinvoiceStatus\x12\x15\n\x08\x64\x65sconly\x18\x03 \x01(\x08H\x00\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\x0b\n\t_desconly\"\xe6\x05\n\x12\x44\x65linvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x38\n\x06status\x18\x07 \x01(\x0e\x32(.cln.DelinvoiceResponse.DelinvoiceStatus\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x16\n\tpay_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\t\x88\x01\x01\x12\x14\n\x07paid_at\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x11 \x01(\x0cH\x0b\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\x9f\x01\n\x17\x44\x65vforgetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nchannel_id\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05\x66orce\x18\x04 \x01(\x08H\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x08\n\x06_force\"Y\n\x18\x44\x65vforgetchannelResponse\x12\x0e\n\x06\x66orced\x18\x01 \x01(\x08\x12\x17\n\x0f\x66unding_unspent\x18\x02 \x01(\x08\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\"\x19\n\x17\x45mergencyrecoverRequest\")\n\x18\x45mergencyrecoverResponse\x12\r\n\x05stubs\x18\x01 \x03(\x0c\"#\n\x0eRecoverRequest\x12\x11\n\thsmsecret\x18\x01 \x01(\t\"\x88\x01\n\x0fRecoverResponse\x12\x37\n\x06result\x18\x01 \x01(\x0e\x32\".cln.RecoverResponse.RecoverResultH\x00\x88\x01\x01\"1\n\rRecoverResult\x12 \n\x1cRECOVERY_RESTART_IN_PROGRESS\x10\x00\x42\t\n\x07_result\"$\n\x15RecoverchannelRequest\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"\'\n\x16RecoverchannelResponse\x12\r\n\x05stubs\x18\x01 \x03(\t\"\x99\x02\n\x0eInvoiceRequest\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05label\x18\x03 \x01(\t\x12\x11\n\tfallbacks\x18\x04 \x03(\t\x12\x15\n\x08preimage\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x11\n\x04\x63ltv\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18\x07 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x15\x65xposeprivatechannels\x18\x08 \x03(\t\x12\x19\n\x0c\x64\x65schashonly\x18\t \x01(\x08H\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x10.cln.AmountOrAnyB\x0b\n\t_preimageB\x07\n\x05_cltvB\t\n\x07_expiryB\x0f\n\r_deschashonly\"\x95\x03\n\x0fInvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x16\n\x0epayment_secret\x18\x03 \x01(\x0c\x12\x12\n\nexpires_at\x18\x04 \x01(\x04\x12\x1d\n\x10warning_capacity\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x0fwarning_offline\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10warning_deadends\x18\x07 \x01(\tH\x02\x88\x01\x01\x12#\n\x16warning_private_unused\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x0bwarning_mpp\x18\t \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rcreated_index\x18\n \x01(\x04H\x05\x88\x01\x01\x42\x13\n\x11_warning_capacityB\x12\n\x10_warning_offlineB\x13\n\x11_warning_deadendsB\x19\n\x17_warning_private_unusedB\x0e\n\x0c_warning_mppB\x10\n\x0e_created_index\"\xe1\x01\n\x15InvoicerequestRequest\x12\x1b\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x05 \x01(\x04H\x02\x88\x01\x01\x12\x17\n\nsingle_use\x18\x06 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_issuerB\x08\n\x06_labelB\x12\n\x10_absolute_expiryB\r\n\x0b_single_use\"\x8b\x01\n\x16InvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"1\n\x1c\x44isableinvoicerequestRequest\x12\x11\n\tinvreq_id\x18\x01 \x01(\t\"\x92\x01\n\x1d\x44isableinvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"l\n\x1aListinvoicerequestsRequest\x12\x16\n\tinvreq_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0c\n\n_invreq_idB\x0e\n\x0c_active_only\"_\n\x1bListinvoicerequestsResponse\x12@\n\x0finvoicerequests\x18\x01 \x03(\x0b\x32\'.cln.ListinvoicerequestsInvoicerequests\"\x97\x01\n\"ListinvoicerequestsInvoicerequests\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"#\n\x14ListdatastoreRequest\x12\x0b\n\x03key\x18\x02 \x03(\t\"G\n\x15ListdatastoreResponse\x12.\n\tdatastore\x18\x01 \x03(\x0b\x32\x1b.cln.ListdatastoreDatastore\"\x87\x01\n\x16ListdatastoreDatastore\x12\x0b\n\x03key\x18\x01 \x03(\t\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xde\x02\n\x13ListinvoicesRequest\x12\x12\n\x05label\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x15\n\x08offer_id\x18\x04 \x01(\tH\x03\x88\x01\x01\x12>\n\x05index\x18\x05 \x01(\x0e\x32*.cln.ListinvoicesRequest.ListinvoicesIndexH\x04\x88\x01\x01\x12\x12\n\x05start\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x12\n\x05limit\x18\x07 \x01(\rH\x06\x88\x01\x01\"-\n\x11ListinvoicesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x0f\n\r_payment_hashB\x0b\n\t_offer_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListinvoicesResponse\x12+\n\x08invoices\x18\x01 \x03(\x0b\x32\x19.cln.ListinvoicesInvoices\"\xd4\x06\n\x14ListinvoicesInvoices\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListinvoicesInvoices.ListinvoicesInvoicesStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x16\n\tpay_index\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x14\n\x07paid_at\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0e \x01(\x0cH\x08\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\t\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\x0b\x88\x01\x01\x12\x42\n\rpaid_outpoint\x18\x12 \x01(\x0b\x32&.cln.ListinvoicesInvoicesPaid_outpointH\x0c\x88\x01\x01\"?\n\x1aListinvoicesInvoicesStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x11\n\x0f_local_offer_idB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"A\n!ListinvoicesInvoicesPaid_outpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xb4\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\x18\n\x0b\x64\x65stination\x18\t \x01(\x0cH\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\x0e\n\x0c_destinationB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x0e\n\x0c_description\"\xe7\x04\n\x11SendonionResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x36\n\x06status\x18\x03 \x01(\x0e\x32&.cln.SendonionResponse.SendonionStatus\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x06 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\n \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0b \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x07message\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06partid\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0f \x01(\x04H\t\x88\x01\x01\",\n\x0fSendonionStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\t\n\x07_partidB\x10\n\x0e_created_indexB\x10\n\x0e_updated_index\"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\"\xa0\x03\n\x13ListsendpaysRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12@\n\x06status\x18\x03 \x01(\x0e\x32+.cln.ListsendpaysRequest.ListsendpaysStatusH\x02\x88\x01\x01\x12>\n\x05index\x18\x04 \x01(\x0e\x32*.cln.ListsendpaysRequest.ListsendpaysIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\";\n\x12ListsendpaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"-\n\x11ListsendpaysIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\t\n\x07_bolt11B\x0f\n\r_payment_hashB\t\n\x07_statusB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListsendpaysResponse\x12+\n\x08payments\x18\x01 \x03(\x0b\x32\x19.cln.ListsendpaysPayments\"\xfc\x05\n\x14ListsendpaysPayments\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListsendpaysPayments.ListsendpaysPaymentsStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\n \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0b \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\nerroronion\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06partid\x18\x0f \x01(\x04H\x08\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x12 \x01(\x04H\x0b\x88\x01\x01\"C\n\x1aListsendpaysPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\r\n\x0b_erroronionB\x0e\n\x0c_descriptionB\t\n\x07_partidB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x0f\n\r_completed_at\"\x19\n\x17ListtransactionsRequest\"S\n\x18ListtransactionsResponse\x12\x37\n\x0ctransactions\x18\x01 \x03(\x0b\x32!.cln.ListtransactionsTransactions\"\xf8\x01\n\x1cListtransactionsTransactions\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\r\n\x05rawtx\x18\x02 \x01(\x0c\x12\x13\n\x0b\x62lockheight\x18\x03 \x01(\r\x12\x0f\n\x07txindex\x18\x04 \x01(\r\x12\x10\n\x08locktime\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x37\n\x06inputs\x18\t \x03(\x0b\x32\'.cln.ListtransactionsTransactionsInputs\x12\x39\n\x07outputs\x18\n \x03(\x0b\x32(.cln.ListtransactionsTransactionsOutputs\"S\n\"ListtransactionsTransactionsInputs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\r\n\x05index\x18\x02 \x01(\r\x12\x10\n\x08sequence\x18\x03 \x01(\r\"l\n#ListtransactionsTransactionsOutputs\x12\r\n\x05index\x18\x01 \x01(\r\x12\x14\n\x0cscriptPubKey\x18\x03 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\"M\n\x11MakesecretRequest\x12\x10\n\x03hex\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x13\n\x06string\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x06\n\x04_hexB\t\n\x07_string\"$\n\x12MakesecretResponse\x12\x0e\n\x06secret\x18\x01 \x01(\x0c\"\x93\x04\n\nPayRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rmaxfeepercent\x18\x04 \x01(\x01H\x01\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x03\x88\x01\x01\x12#\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x17\n\nriskfactor\x18\x08 \x01(\x01H\x05\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\n \x03(\t\x12 \n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0c \x01(\tH\x07\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\r \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0e \x01(\x0cH\t\x88\x01\x01\x12&\n\x0cpartial_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x42\x08\n\x06_labelB\x10\n\x0e_maxfeepercentB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\x0c\n\n_exemptfeeB\r\n\x0b_riskfactorB\t\n\x07_maxfeeB\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x0f\n\r_partial_msat\"\xfb\x02\n\x0bPayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x18\n\x0b\x64\x65stination\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\r\n\x05parts\x18\x05 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\x1awarning_partial_completion\x18\x08 \x01(\tH\x01\x88\x01\x01\x12*\n\x06status\x18\t \x01(\x0e\x32\x1a.cln.PayResponse.PayStatus\"2\n\tPayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x0e\n\x0c_destinationB\x1d\n\x1b_warning_partial_completion\"*\n\x10ListnodesRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x05\n\x03_id\"7\n\x11ListnodesResponse\x12\"\n\x05nodes\x18\x01 \x03(\x0b\x32\x13.cln.ListnodesNodes\"\xba\x02\n\x0eListnodesNodes\x12\x0e\n\x06nodeid\x18\x01 \x01(\x0c\x12\x1b\n\x0elast_timestamp\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x12\n\x05\x61lias\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05\x63olor\x18\x04 \x01(\x0cH\x02\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18\x05 \x01(\x0cH\x03\x88\x01\x01\x12/\n\taddresses\x18\x06 \x03(\x0b\x32\x1c.cln.ListnodesNodesAddresses\x12\x42\n\x10option_will_fund\x18\x07 \x01(\x0b\x32#.cln.ListnodesNodesOption_will_fundH\x04\x88\x01\x01\x42\x11\n\x0f_last_timestampB\x08\n\x06_aliasB\x08\n\x06_colorB\x0b\n\t_featuresB\x13\n\x11_option_will_fund\"\xf4\x01\n\x1eListnodesNodesOption_will_fund\x12(\n\x13lease_fee_base_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x17\n\x0flease_fee_basis\x18\x02 \x01(\r\x12\x16\n\x0e\x66unding_weight\x18\x03 \x01(\r\x12.\n\x19\x63hannel_fee_max_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x30\n(channel_fee_max_proportional_thousandths\x18\x05 \x01(\r\x12\x15\n\rcompact_lease\x18\x06 \x01(\x0c\"\xe8\x01\n\x17ListnodesNodesAddresses\x12K\n\titem_type\x18\x01 \x01(\x0e\x32\x38.cln.ListnodesNodesAddresses.ListnodesNodesAddressesType\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x00\x88\x01\x01\"P\n\x1bListnodesNodesAddressesType\x12\x07\n\x03\x44NS\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\n\n\x08_address\"g\n\x15WaitanyinvoiceRequest\x12\x1a\n\rlastpay_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\x10\n\x0e_lastpay_indexB\n\n\x08_timeout\"\xbf\x05\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\x16\n\tpay_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x06\x88\x01\x01\x12\x1a\n\rcreated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12<\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32 .cln.WaitanyinvoicePaid_outpointH\t\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\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\";\n\x1bWaitanyinvoicePaid_outpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"#\n\x12WaitinvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\"\xb0\x05\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\x16\n\tpay_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x06\x88\x01\x01\x12\x1a\n\rcreated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12\x39\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1d.cln.WaitinvoicePaid_outpointH\t\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\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"8\n\x18WaitinvoicePaid_outpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\x8e\x01\n\x12WaitsendpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x13\n\x06partid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x02\x88\x01\x01\x42\t\n\x07_partidB\n\n\x08_timeoutB\n\n\x08_groupid\"\x8e\x05\n\x13WaitsendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.WaitsendpayResponse.WaitsendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0e \x01(\x01H\x08\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x0f \x01(\x04H\t\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x10 \x01(\x04H\n\x88\x01\x01\"!\n\x11WaitsendpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\x0f\n\r_completed_atB\x10\n\x0e_created_indexB\x10\n\x0e_updated_index\"\x97\x01\n\x0eNewaddrRequest\x12@\n\x0b\x61\x64\x64resstype\x18\x01 \x01(\x0e\x32&.cln.NewaddrRequest.NewaddrAddresstypeH\x00\x88\x01\x01\"3\n\x12NewaddrAddresstype\x12\n\n\x06\x42\x45\x43H32\x10\x00\x12\x07\n\x03\x41LL\x10\x02\x12\x08\n\x04P2TR\x10\x03\x42\x0e\n\x0c_addresstype\"M\n\x0fNewaddrResponse\x12\x13\n\x06\x62\x65\x63h32\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04p2tr\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_bech32B\x07\n\x05_p2tr\"\xb9\x01\n\x0fWithdrawRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\t\x12!\n\x07satoshi\x18\x02 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\"\n\x07\x66\x65\x65rate\x18\x05 \x01(\x0b\x32\x0c.cln.FeerateH\x01\x88\x01\x01\x42\n\n\x08_minconfB\n\n\x08_feerate\":\n\x10WithdrawResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0c\n\x04psbt\x18\x03 \x01(\t\"\x82\x03\n\x0eKeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rmaxfeepercent\x18\x04 \x01(\x01H\x01\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x03\x88\x01\x01\x12#\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12+\n\nroutehints\x18\x08 \x01(\x0b\x32\x12.cln.RoutehintListH\x05\x88\x01\x01\x12&\n\textratlvs\x18\t \x01(\x0b\x32\x0e.cln.TlvStreamH\x06\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountB\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(\rH\x00\x88\x01\x01\x42\n\n\x08_reserve\",\n\x10SendpsbtResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"1\n\x0fSignpsbtRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x10\n\x08signonly\x18\x02 \x03(\r\"\'\n\x10SignpsbtResponse\x12\x13\n\x0bsigned_psbt\x18\x01 \x01(\t\"\xa0\x03\n\x0fUtxopsbtRequest\x12!\n\x07satoshi\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x1d\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.Feerate\x12\x13\n\x0bstartweight\x18\x03 \x01(\r\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\x14\n\x07reserve\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08locktime\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1f\n\x12min_witness_weight\x18\x07 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nreservedok\x18\x08 \x01(\x08H\x03\x88\x01\x01\x12\x1d\n\x10\x65xcess_as_change\x18\t \x01(\x08H\x04\x88\x01\x01\x12#\n\x16opening_anchor_channel\x18\n \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_reserveB\x0b\n\t_locktimeB\x15\n\x13_min_witness_weightB\r\n\x0b_reservedokB\x13\n\x11_excess_as_changeB\x19\n\x17_opening_anchor_channel\"\xd9\x01\n\x10UtxopsbtResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\x0e\x66\x65\x65rate_per_kw\x18\x02 \x01(\r\x12\x1e\n\x16\x65stimated_final_weight\x18\x03 \x01(\r\x12 \n\x0b\x65xcess_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1a\n\rchange_outnum\x18\x05 \x01(\rH\x00\x88\x01\x01\x12/\n\x0creservations\x18\x06 \x03(\x0b\x32\x19.cln.UtxopsbtReservationsB\x10\n\x0e_change_outnum\"u\n\x14UtxopsbtReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\" \n\x10TxdiscardRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"6\n\x11TxdiscardResponse\x12\x13\n\x0bunsigned_tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xa4\x01\n\x10TxprepareRequest\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12 \n\x07outputs\x18\x05 \x03(\x0b\x32\x0f.cln.OutputDescB\n\n\x08_feerateB\n\n\x08_minconf\"D\n\x11TxprepareResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x13\n\x0bunsigned_tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"\x1d\n\rTxsendRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"8\n\x0eTxsendResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"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\"\xd7\x1b\n\x18ListpeerchannelsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x16\n\x0epeer_connected\x18\x02 \x01(\x08\x12J\n\x05state\x18\x03 \x01(\x0e\x32;.cln.ListpeerchannelsChannels.ListpeerchannelsChannelsState\x12\x19\n\x0cscratch_txid\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x12:\n\x07\x66\x65\x65rate\x18\x06 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFeerateH\x01\x88\x01\x01\x12\x12\n\x05owner\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x17\n\nchannel_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x19\n\x0c\x66unding_txid\x18\n \x01(\x0cH\x05\x88\x01\x01\x12\x1b\n\x0e\x66unding_outnum\x18\x0b \x01(\rH\x06\x88\x01\x01\x12\x1c\n\x0finitial_feerate\x18\x0c \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0clast_feerate\x18\r \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0cnext_feerate\x18\x0e \x01(\tH\t\x88\x01\x01\x12\x1a\n\rnext_fee_step\x18\x0f \x01(\rH\n\x88\x01\x01\x12\x37\n\x08inflight\x18\x10 \x03(\x0b\x32%.cln.ListpeerchannelsChannelsInflight\x12\x15\n\x08\x63lose_to\x18\x11 \x01(\x0cH\x0b\x88\x01\x01\x12\x14\n\x07private\x18\x12 \x01(\x08H\x0c\x88\x01\x01\x12 \n\x06opener\x18\x13 \x01(\x0e\x32\x10.cln.ChannelSide\x12%\n\x06\x63loser\x18\x14 \x01(\x0e\x32\x10.cln.ChannelSideH\r\x88\x01\x01\x12:\n\x07\x66unding\x18\x16 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFundingH\x0e\x88\x01\x01\x12$\n\nto_us_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x0f\x88\x01\x01\x12(\n\x0emin_to_us_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\x10\x88\x01\x01\x12(\n\x0emax_to_us_msat\x18\x19 \x01(\x0b\x32\x0b.cln.AmountH\x11\x88\x01\x01\x12$\n\ntotal_msat\x18\x1a \x01(\x0b\x32\x0b.cln.AmountH\x12\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x1b \x01(\x0b\x32\x0b.cln.AmountH\x13\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x1c \x01(\rH\x14\x88\x01\x01\x12)\n\x0f\x64ust_limit_msat\x18\x1d \x01(\x0b\x32\x0b.cln.AmountH\x15\x88\x01\x01\x12\x30\n\x16max_total_htlc_in_msat\x18\x1e \x01(\x0b\x32\x0b.cln.AmountH\x16\x88\x01\x01\x12,\n\x12their_reserve_msat\x18\x1f \x01(\x0b\x32\x0b.cln.AmountH\x17\x88\x01\x01\x12*\n\x10our_reserve_msat\x18 \x01(\x0b\x32\x0b.cln.AmountH\x18\x88\x01\x01\x12(\n\x0espendable_msat\x18! \x01(\x0b\x32\x0b.cln.AmountH\x19\x88\x01\x01\x12)\n\x0freceivable_msat\x18\" \x01(\x0b\x32\x0b.cln.AmountH\x1a\x88\x01\x01\x12.\n\x14minimum_htlc_in_msat\x18# \x01(\x0b\x32\x0b.cln.AmountH\x1b\x88\x01\x01\x12/\n\x15minimum_htlc_out_msat\x18$ \x01(\x0b\x32\x0b.cln.AmountH\x1c\x88\x01\x01\x12/\n\x15maximum_htlc_out_msat\x18% \x01(\x0b\x32\x0b.cln.AmountH\x1d\x88\x01\x01\x12 \n\x13their_to_self_delay\x18& \x01(\rH\x1e\x88\x01\x01\x12\x1e\n\x11our_to_self_delay\x18\' \x01(\rH\x1f\x88\x01\x01\x12\x1f\n\x12max_accepted_htlcs\x18( \x01(\rH \x88\x01\x01\x12\x36\n\x05\x61lias\x18) \x01(\x0b\x32\".cln.ListpeerchannelsChannelsAliasH!\x88\x01\x01\x12\x0e\n\x06status\x18+ \x03(\t\x12 \n\x13in_payments_offered\x18, \x01(\x04H\"\x88\x01\x01\x12)\n\x0fin_offered_msat\x18- \x01(\x0b\x32\x0b.cln.AmountH#\x88\x01\x01\x12\"\n\x15in_payments_fulfilled\x18. \x01(\x04H$\x88\x01\x01\x12+\n\x11in_fulfilled_msat\x18/ \x01(\x0b\x32\x0b.cln.AmountH%\x88\x01\x01\x12!\n\x14out_payments_offered\x18\x30 \x01(\x04H&\x88\x01\x01\x12*\n\x10out_offered_msat\x18\x31 \x01(\x0b\x32\x0b.cln.AmountH\'\x88\x01\x01\x12#\n\x16out_payments_fulfilled\x18\x32 \x01(\x04H(\x88\x01\x01\x12,\n\x12out_fulfilled_msat\x18\x33 \x01(\x0b\x32\x0b.cln.AmountH)\x88\x01\x01\x12\x31\n\x05htlcs\x18\x34 \x03(\x0b\x32\".cln.ListpeerchannelsChannelsHtlcs\x12\x1a\n\rclose_to_addr\x18\x35 \x01(\tH*\x88\x01\x01\x12\x1e\n\x11ignore_fee_limits\x18\x36 \x01(\x08H+\x88\x01\x01\x12:\n\x07updates\x18\x37 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsUpdatesH,\x88\x01\x01\x12#\n\x16last_stable_connection\x18\x38 \x01(\x04H-\x88\x01\x01\x12\x17\n\nlost_state\x18\x39 \x01(\x08H.\x88\x01\x01\x12\x1a\n\rreestablished\x18: \x01(\x08H/\x88\x01\x01\x12*\n\x10last_tx_fee_msat\x18; \x01(\x0b\x32\x0b.cln.AmountH0\x88\x01\x01\x12\x16\n\tdirection\x18< \x01(\rH1\x88\x01\x01\"\x80\x03\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\x12\x1f\n\x1b\x44UALOPEND_OPEN_COMMIT_READY\x10\rB\x0f\n\r_scratch_txidB\n\n\x08_feerateB\x08\n\x06_ownerB\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x0f\n\r_funding_txidB\x11\n\x0f_funding_outnumB\x12\n\x10_initial_feerateB\x0f\n\r_last_feerateB\x0f\n\r_next_feerateB\x10\n\x0e_next_fee_stepB\x0b\n\t_close_toB\n\n\x08_privateB\t\n\x07_closerB\n\n\x08_fundingB\r\n\x0b_to_us_msatB\x11\n\x0f_min_to_us_msatB\x11\n\x0f_max_to_us_msatB\r\n\x0b_total_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x12\n\x10_dust_limit_msatB\x19\n\x17_max_total_htlc_in_msatB\x15\n\x13_their_reserve_msatB\x13\n\x11_our_reserve_msatB\x11\n\x0f_spendable_msatB\x12\n\x10_receivable_msatB\x17\n\x15_minimum_htlc_in_msatB\x18\n\x16_minimum_htlc_out_msatB\x18\n\x16_maximum_htlc_out_msatB\x16\n\x14_their_to_self_delayB\x14\n\x12_our_to_self_delayB\x15\n\x13_max_accepted_htlcsB\x08\n\x06_aliasB\x16\n\x14_in_payments_offeredB\x12\n\x10_in_offered_msatB\x18\n\x16_in_payments_fulfilledB\x14\n\x12_in_fulfilled_msatB\x17\n\x15_out_payments_offeredB\x13\n\x11_out_offered_msatB\x19\n\x17_out_payments_fulfilledB\x15\n\x13_out_fulfilled_msatB\x10\n\x0e_close_to_addrB\x14\n\x12_ignore_fee_limitsB\n\n\x08_updatesB\x19\n\x17_last_stable_connectionB\r\n\x0b_lost_stateB\x10\n\x0e_reestablishedB\x13\n\x11_last_tx_fee_msatB\x0c\n\n_direction\"\xa7\x01\n\x1fListpeerchannelsChannelsUpdates\x12\x38\n\x05local\x18\x01 \x01(\x0b\x32).cln.ListpeerchannelsChannelsUpdatesLocal\x12?\n\x06remote\x18\x02 \x01(\x0b\x32*.cln.ListpeerchannelsChannelsUpdatesRemoteH\x00\x88\x01\x01\x42\t\n\x07_remote\"\xda\x01\n$ListpeerchannelsChannelsUpdatesLocal\x12&\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11htlc_maximum_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x11\x63ltv_expiry_delta\x18\x03 \x01(\r\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\"\xdb\x01\n%ListpeerchannelsChannelsUpdatesRemote\x12&\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11htlc_maximum_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x11\x63ltv_expiry_delta\x18\x03 \x01(\r\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\"?\n\x1fListpeerchannelsChannelsFeerate\x12\r\n\x05perkw\x18\x01 \x01(\r\x12\r\n\x05perkb\x18\x02 \x01(\r\"\x8b\x02\n ListpeerchannelsChannelsInflight\x12\x14\n\x0c\x66unding_txid\x18\x01 \x01(\x0c\x12\x16\n\x0e\x66unding_outnum\x18\x02 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x03 \x01(\t\x12\'\n\x12total_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10our_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x0cscratch_txid\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x1a\n\rsplice_amount\x18\x07 \x01(\x12H\x01\x88\x01\x01\x42\x0f\n\r_scratch_txidB\x10\n\x0e_splice_amount\"\x9d\x02\n\x1fListpeerchannelsChannelsFunding\x12%\n\x0bpushed_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12%\n\x10local_funds_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11remote_funds_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\rfee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\'\n\rfee_rcvd_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x42\x0e\n\x0c_pushed_msatB\x10\n\x0e_fee_paid_msatB\x10\n\x0e_fee_rcvd_msat\"]\n\x1dListpeerchannelsChannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"\xf9\x02\n\x1dListpeerchannelsChannelsHtlcs\x12\\\n\tdirection\x18\x01 \x01(\x0e\x32I.cln.ListpeerchannelsChannelsHtlcs.ListpeerchannelsChannelsHtlcsDirection\x12\n\n\x02id\x18\x02 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06\x65xpiry\x18\x04 \x01(\r\x12\x14\n\x0cpayment_hash\x18\x05 \x01(\x0c\x12\x1a\n\rlocal_trimmed\x18\x06 \x01(\x08H\x00\x88\x01\x01\x12\x13\n\x06status\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x05state\x18\x08 \x01(\x0e\x32\x0e.cln.HtlcState\"9\n&ListpeerchannelsChannelsHtlcsDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\x42\x10\n\x0e_local_trimmedB\t\n\x07_status\"3\n\x19ListclosedchannelsRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x05\n\x03_id\"[\n\x1aListclosedchannelsResponse\x12=\n\x0e\x63losedchannels\x18\x01 \x03(\x0b\x32%.cln.ListclosedchannelsClosedchannels\"\xf2\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\x12#\n\x16last_stable_connection\x18\x19 \x01(\x04H\t\x88\x01\x01\"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_msatB\x19\n\x17_last_stable_connection\"e\n%ListclosedchannelsClosedchannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"L\n\x10\x44\x65\x63odepayRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_description\"\xc7\x04\n\x11\x44\x65\x63odepayResponse\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\x12\x12\n\ncreated_at\x18\x02 \x01(\x04\x12\x0e\n\x06\x65xpiry\x18\x03 \x01(\x04\x12\r\n\x05payee\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x11\n\tsignature\x18\x07 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10\x64\x65scription_hash\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x1d\n\x15min_final_cltv_expiry\x18\n \x01(\r\x12\x1b\n\x0epayment_secret\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\r \x01(\x0cH\x05\x88\x01\x01\x12*\n\tfallbacks\x18\x0e \x03(\x0b\x32\x17.cln.DecodepayFallbacks\x12\"\n\x05\x65xtra\x18\x10 \x03(\x0b\x32\x13.cln.DecodepayExtra\x12-\n\x06routes\x18\x11 \x01(\x0b\x32\x18.cln.DecodeRoutehintListH\x06\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x13\n\x11_description_hashB\x11\n\x0f_payment_secretB\x0b\n\t_featuresB\x13\n\x11_payment_metadataB\t\n\x07_routes\"\xd0\x01\n\x12\x44\x65\x63odepayFallbacks\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.DecodepayFallbacks.DecodepayFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0b\n\x03hex\x18\x03 \x01(\x0c\"N\n\x16\x44\x65\x63odepayFallbacksType\x12\t\n\x05P2PKH\x10\x00\x12\x08\n\x04P2SH\x10\x01\x12\n\n\x06P2WPKH\x10\x02\x12\t\n\x05P2WSH\x10\x03\x12\x08\n\x04P2TR\x10\x04\x42\x07\n\x05_addr\"+\n\x0e\x44\x65\x63odepayExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x1f\n\rDecodeRequest\x12\x0e\n\x06string\x18\x01 \x01(\t\"\xf1#\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\x12\x16\n\tdecrypted\x18L \x01(\x0cH=\x88\x01\x01\x12\x16\n\tsignature\x18M \x01(\tH>\x88\x01\x01\x12\x15\n\x08\x63urrency\x18N \x01(\tH?\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18O \x01(\x0b\x32\x0b.cln.AmountH@\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18P \x01(\tHA\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18Q \x01(\x0cHB\x88\x01\x01\x12-\n\x06routes\x18R \x01(\x0b\x32\x18.cln.DecodeRoutehintListHC\x88\x01\x01\"\x83\x01\n\nDecodeType\x12\x10\n\x0c\x42OLT12_OFFER\x10\x00\x12\x12\n\x0e\x42OLT12_INVOICE\x10\x01\x12\x1a\n\x16\x42OLT12_INVOICE_REQUEST\x10\x02\x12\x12\n\x0e\x42OLT11_INVOICE\x10\x03\x12\x08\n\x04RUNE\x10\x04\x12\x15\n\x11\x45MERGENCY_RECOVER\x10\x05\x42\x0b\n\t_offer_idB\x11\n\x0f_offer_metadataB\x11\n\x0f_offer_currencyB!\n\x1f_warning_unknown_offer_currencyB\x16\n\x14_currency_minor_unitB\x0f\n\r_offer_amountB\x14\n\x12_offer_amount_msatB\x14\n\x12_offer_descriptionB\x0f\n\r_offer_issuerB\x11\n\x0f_offer_featuresB\x18\n\x16_offer_absolute_expiryB\x15\n\x13_offer_quantity_maxB\x10\n\x0e_offer_node_idB \n\x1e_warning_missing_offer_node_idB$\n\"_warning_invalid_offer_descriptionB$\n\"_warning_missing_offer_descriptionB!\n\x1f_warning_invalid_offer_currencyB\x1f\n\x1d_warning_invalid_offer_issuerB\x12\n\x10_invreq_metadataB\x12\n\x10_invreq_payer_idB\x0f\n\r_invreq_chainB\x15\n\x13_invreq_amount_msatB\x12\n\x10_invreq_featuresB\x12\n\x10_invreq_quantityB\x14\n\x12_invreq_payer_noteB\x1c\n\x1a_invreq_recurrence_counterB\x1a\n\x18_invreq_recurrence_startB\"\n _warning_missing_invreq_metadataB\"\n _warning_missing_invreq_payer_idB$\n\"_warning_invalid_invreq_payer_noteB,\n*_warning_missing_invoice_request_signatureB,\n*_warning_invalid_invoice_request_signatureB\x15\n\x13_invoice_created_atB\x1a\n\x18_invoice_relative_expiryB\x17\n\x15_invoice_payment_hashB\x16\n\x14_invoice_amount_msatB\x13\n\x11_invoice_featuresB\x12\n\x10_invoice_node_idB\x1e\n\x1c_invoice_recurrence_basetimeB \n\x1e_warning_missing_invoice_pathsB%\n#_warning_missing_invoice_blindedpayB%\n#_warning_missing_invoice_created_atB\'\n%_warning_missing_invoice_payment_hashB!\n\x1f_warning_missing_invoice_amountB.\n,_warning_missing_invoice_recurrence_basetimeB\"\n _warning_missing_invoice_node_idB$\n\"_warning_missing_invoice_signatureB$\n\"_warning_invalid_invoice_signatureB\r\n\x0b_created_atB\t\n\x07_expiryB\x08\n\x06_payeeB\x0f\n\r_payment_hashB\x13\n\x11_description_hashB\x18\n\x16_min_final_cltv_expiryB\x11\n\x0f_payment_secretB\x13\n\x11_payment_metadataB\x0c\n\n_unique_idB\n\n\x08_versionB\t\n\x07_stringB\x1c\n\x1a_warning_rune_invalid_utf8B\x06\n\x04_hexB\x0c\n\n_decryptedB\x0c\n\n_signatureB\x0b\n\t_currencyB\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x0b\n\t_featuresB\t\n\x07_routes\"\xab\x01\n\x11\x44\x65\x63odeOffer_paths\x12\x1a\n\rfirst_node_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x10\n\x08\x62linding\x18\x02 \x01(\x0c\x12\x1b\n\x0e\x66irst_scid_dir\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x05 \x01(\tH\x02\x88\x01\x01\x42\x10\n\x0e_first_node_idB\x11\n\x0f_first_scid_dirB\r\n\x0b_first_scid\"\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\"\xaa\x02\n\x0f\x44\x65\x63odeFallbacks\x12\x36\n)warning_invoice_fallbacks_version_invalid\x18\x01 \x01(\tH\x00\x88\x01\x01\x12;\n\titem_type\x18\x02 \x01(\x0e\x32(.cln.DecodeFallbacks.DecodeFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0b\n\x03hex\x18\x04 \x01(\x0c\"K\n\x13\x44\x65\x63odeFallbacksType\x12\t\n\x05P2PKH\x10\x00\x12\x08\n\x04P2SH\x10\x01\x12\n\n\x06P2WPKH\x10\x02\x12\t\n\x05P2WSH\x10\x03\x12\x08\n\x04P2TR\x10\x04\x42,\n*_warning_invoice_fallbacks_version_invalidB\x07\n\x05_addr\"(\n\x0b\x44\x65\x63odeExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\";\n\x12\x44\x65\x63odeRestrictions\x12\x14\n\x0c\x61lternatives\x18\x01 \x03(\t\x12\x0f\n\x07summary\x18\x02 \x01(\t\"\xc2\x01\n\rDelpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12/\n\x06status\x18\x02 \x01(\x0e\x32\x1f.cln.DelpayRequest.DelpayStatus\x12\x13\n\x06partid\x18\x03 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x01\x88\x01\x01\"(\n\x0c\x44\x65lpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x42\t\n\x07_partidB\n\n\x08_groupid\"7\n\x0e\x44\x65lpayResponse\x12%\n\x08payments\x18\x01 \x03(\x0b\x32\x13.cln.DelpayPayments\"\xcb\x05\n\x0e\x44\x65lpayPayments\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x38\n\x06status\x18\x04 \x01(\x0e\x32(.cln.DelpayPayments.DelpayPaymentsStatus\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x02\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x12\n\ncreated_at\x18\t \x01(\x04\x12\x1a\n\rupdated_index\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x14\n\x07groupid\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x08\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\t\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\n\x88\x01\x01\x12\x17\n\nerroronion\x18\x11 \x01(\x0cH\x0b\x88\x01\x01\"=\n\x14\x44\x65lpayPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x10\n\x0e_created_indexB\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x10\n\x0e_updated_indexB\x0f\n\r_completed_atB\n\n\x08_groupidB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\r\n\x0b_erroronion\"\xb3\x01\n\x11\x44\x65lforwardRequest\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x12\n\nin_htlc_id\x18\x02 \x01(\x04\x12\x37\n\x06status\x18\x03 \x01(\x0e\x32\'.cln.DelforwardRequest.DelforwardStatus\"=\n\x10\x44\x65lforwardStatus\x12\x0b\n\x07SETTLED\x10\x00\x12\x10\n\x0cLOCAL_FAILED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"\x14\n\x12\x44\x65lforwardResponse\"\'\n\x13\x44isableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\x88\x01\n\x14\x44isableofferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"=\n\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\x14\n\x07opening\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmutual_close\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1d\n\x10unilateral_close\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x1a\n\rdelayed_to_us\x18\x06 \x01(\rH\x03\x88\x01\x01\x12\x1c\n\x0fhtlc_resolution\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x14\n\x07penalty\x18\x08 \x01(\rH\x05\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkbEstimates\x12\x12\n\x05\x66loor\x18\n \x01(\rH\x06\x88\x01\x01\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x07\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\x10\n\x0e_delayed_to_usB\x12\n\x10_htlc_resolutionB\n\n\x08_penaltyB\x08\n\x06_floorB\x1a\n\x18_unilateral_anchor_close\"W\n\x16\x46\x65\x65ratesPerkbEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"\xd3\x03\n\rFeeratesPerkw\x12\x16\n\x0emin_acceptable\x18\x01 \x01(\r\x12\x16\n\x0emax_acceptable\x18\x02 \x01(\r\x12\x14\n\x07opening\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmutual_close\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1d\n\x10unilateral_close\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x1a\n\rdelayed_to_us\x18\x06 \x01(\rH\x03\x88\x01\x01\x12\x1c\n\x0fhtlc_resolution\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x14\n\x07penalty\x18\x08 \x01(\rH\x05\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkwEstimates\x12\x12\n\x05\x66loor\x18\n \x01(\rH\x06\x88\x01\x01\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x07\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\x10\n\x0e_delayed_to_usB\x12\n\x10_htlc_resolutionB\n\n\x08_penaltyB\x08\n\x06_floorB\x1a\n\x18_unilateral_anchor_close\"W\n\x16\x46\x65\x65ratesPerkwEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"\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\x1d\n\x15htlc_timeout_satoshis\x18\x04 \x01(\x04\x12\x1d\n\x15htlc_success_satoshis\x18\x05 \x01(\x04\x12\x30\n#unilateral_close_nonanchor_satoshis\x18\x06 \x01(\x04H\x00\x88\x01\x01\x42&\n$_unilateral_close_nonanchor_satoshis\"\xe9\x02\n\x13\x46\x65tchinvoiceRequest\x12\r\n\x05offer\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x15\n\x08quantity\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x1f\n\x12recurrence_counter\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x10recurrence_start\x18\x05 \x01(\x01H\x03\x88\x01\x01\x12\x1d\n\x10recurrence_label\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x14\n\x07timeout\x18\x07 \x01(\x01H\x05\x88\x01\x01\x12\x17\n\npayer_note\x18\x08 \x01(\tH\x06\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0b\n\t_quantityB\x15\n\x13_recurrence_counterB\x13\n\x11_recurrence_startB\x13\n\x11_recurrence_labelB\n\n\x08_timeoutB\r\n\x0b_payer_note\"\x9a\x01\n\x14\x46\x65tchinvoiceResponse\x12\x0f\n\x07invoice\x18\x01 \x01(\t\x12)\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x18.cln.FetchinvoiceChanges\x12\x36\n\x0bnext_period\x18\x03 \x01(\x0b\x32\x1c.cln.FetchinvoiceNext_periodH\x00\x88\x01\x01\x42\x0e\n\x0c_next_period\"\x82\x02\n\x13\x46\x65tchinvoiceChanges\x12!\n\x14\x64\x65scription_appended\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0evendor_removed\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06vendor\x18\x04 \x01(\tH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x42\x17\n\x15_description_appendedB\x0e\n\x0c_descriptionB\x11\n\x0f_vendor_removedB\t\n\x07_vendorB\x0e\n\x0c_amount_msat\"~\n\x17\x46\x65tchinvoiceNext_period\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x04\x12\x11\n\tstarttime\x18\x02 \x01(\x04\x12\x0f\n\x07\x65ndtime\x18\x03 \x01(\x04\x12\x17\n\x0fpaywindow_start\x18\x04 \x01(\x04\x12\x15\n\rpaywindow_end\x18\x05 \x01(\x04\"\'\n\x19\x46undchannel_cancelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\"/\n\x1a\x46undchannel_cancelResponse\x12\x11\n\tcancelled\x18\x01 \x01(\t\"7\n\x1b\x46undchannel_completeRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"O\n\x1c\x46undchannel_completeResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\"\xfb\x03\n\x12\x46undchannelRequest\x12 \n\x06\x61mount\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12#\n\tpush_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\tH\x03\x88\x01\x01\x12%\n\x0brequest_amt\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x08 \x01(\tH\x05\x88\x01\x01\x12\n\n\x02id\x18\t \x01(\x0c\x12\x14\n\x07minconf\x18\n \x01(\rH\x06\x88\x01\x01\x12\x1c\n\x05utxos\x18\x0b \x03(\x0b\x32\r.cln.Outpoint\x12\x15\n\x08mindepth\x18\x0c \x01(\rH\x07\x88\x01\x01\x12!\n\x07reserve\x18\r \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\x0e \x03(\rB\n\n\x08_feerateB\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\n\n\x08_minconfB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xe5\x01\n\x13\x46undchannelResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0e\n\x06outnum\x18\x03 \x01(\r\x12\x12\n\nchannel_id\x18\x04 \x01(\x0c\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\x08mindepth\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x37\n\x0c\x63hannel_type\x18\x07 \x01(\x0b\x32\x1c.cln.FundchannelChannel_typeH\x02\x88\x01\x01\x42\x0b\n\t_close_toB\x0b\n\t_mindepthB\x0f\n\r_channel_type\"L\n\x17\x46undchannelChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\xd7\x02\n\x18\x46undchannel_startRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1b\n\x06\x61mount\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\x07\x66\x65\x65rate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\tH\x02\x88\x01\x01\x12#\n\tpush_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08mindepth\x18\x07 \x01(\rH\x04\x88\x01\x01\x12!\n\x07reserve\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\t \x03(\rB\n\n\x08_feerateB\x0b\n\t_announceB\x0b\n\t_close_toB\x0c\n\n_push_msatB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xf9\x01\n\x19\x46undchannel_startResponse\x12\x17\n\x0f\x66unding_address\x18\x01 \x01(\t\x12\x14\n\x0cscriptpubkey\x18\x02 \x01(\x0c\x12=\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32\".cln.Fundchannel_startChannel_typeH\x00\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x12\x15\n\rwarning_usage\x18\x05 \x01(\t\x12\x15\n\x08mindepth\x18\x06 \x01(\rH\x02\x88\x01\x01\x42\x0f\n\r_channel_typeB\x0b\n\t_close_toB\x0b\n\t_mindepth\"R\n\x1d\x46undchannel_startChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x9d\x01\n\rGetlogRequest\x12\x32\n\x05level\x18\x01 \x01(\x0e\x32\x1e.cln.GetlogRequest.GetlogLevelH\x00\x88\x01\x01\"N\n\x0bGetlogLevel\x12\n\n\x06\x42ROKEN\x10\x00\x12\x0b\n\x07UNUSUAL\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\t\n\x05\x44\x45\x42UG\x10\x03\x12\x06\n\x02IO\x10\x04\x12\t\n\x05TRACE\x10\x05\x42\x08\n\x06_level\"h\n\x0eGetlogResponse\x12\x12\n\ncreated_at\x18\x01 \x01(\t\x12\x12\n\nbytes_used\x18\x02 \x01(\r\x12\x11\n\tbytes_max\x18\x03 \x01(\r\x12\x1b\n\x03log\x18\x04 \x03(\x0b\x32\x0e.cln.GetlogLog\"\xe8\x02\n\tGetlogLog\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.GetlogLog.GetlogLogType\x12\x18\n\x0bnum_skipped\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04time\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03log\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07node_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x11\n\x04\x64\x61ta\x18\x07 \x01(\x0cH\x05\x88\x01\x01\"l\n\rGetlogLogType\x12\x0b\n\x07SKIPPED\x10\x00\x12\n\n\x06\x42ROKEN\x10\x01\x12\x0b\n\x07UNUSUAL\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\t\n\x05IO_IN\x10\x05\x12\n\n\x06IO_OUT\x10\x06\x12\t\n\x05TRACE\x10\x07\x42\x0e\n\x0c_num_skippedB\x07\n\x05_timeB\t\n\x07_sourceB\x06\n\x04_logB\n\n\x08_node_idB\x07\n\x05_data\"\xd9\x08\n\x13\x46underupdateRequest\x12@\n\x06policy\x18\x01 \x01(\x0e\x32+.cln.FunderupdateRequest.FunderupdatePolicyH\x00\x88\x01\x01\x12$\n\npolicy_mod\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0bleases_only\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12\x30\n\x16min_their_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x30\n\x16max_their_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12.\n\x14per_channel_min_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12.\n\x14per_channel_max_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12+\n\x11reserve_tank_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x12\x19\n\x0c\x66uzz_percent\x18\t \x01(\rH\x08\x88\x01\x01\x12\x1d\n\x10\x66und_probability\x18\n \x01(\rH\t\x88\x01\x01\x12-\n\x13lease_fee_base_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x12\x1c\n\x0flease_fee_basis\x18\x0c \x01(\rH\x0b\x88\x01\x01\x12\x1b\n\x0e\x66unding_weight\x18\r \x01(\rH\x0c\x88\x01\x01\x12\x33\n\x19\x63hannel_fee_max_base_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\r\x88\x01\x01\x12\x35\n(channel_fee_max_proportional_thousandths\x18\x0f \x01(\rH\x0e\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x10 \x01(\x0cH\x0f\x88\x01\x01\"9\n\x12\x46underupdatePolicy\x12\t\n\x05MATCH\x10\x00\x12\r\n\tAVAILABLE\x10\x01\x12\t\n\x05\x46IXED\x10\x02\x42\t\n\x07_policyB\r\n\x0b_policy_modB\x0e\n\x0c_leases_onlyB\x19\n\x17_min_their_funding_msatB\x19\n\x17_max_their_funding_msatB\x17\n\x15_per_channel_min_msatB\x17\n\x15_per_channel_max_msatB\x14\n\x12_reserve_tank_msatB\x0f\n\r_fuzz_percentB\x13\n\x11_fund_probabilityB\x16\n\x14_lease_fee_base_msatB\x12\n\x10_lease_fee_basisB\x11\n\x0f_funding_weightB\x1c\n\x1a_channel_fee_max_base_msatB+\n)_channel_fee_max_proportional_thousandthsB\x10\n\x0e_compact_lease\"\xdf\x06\n\x14\x46underupdateResponse\x12\x0f\n\x07summary\x18\x01 \x01(\t\x12<\n\x06policy\x18\x02 \x01(\x0e\x32,.cln.FunderupdateResponse.FunderupdatePolicy\x12\x12\n\npolicy_mod\x18\x03 \x01(\r\x12\x13\n\x0bleases_only\x18\x04 \x01(\x08\x12+\n\x16min_their_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x16max_their_funding_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12)\n\x14per_channel_min_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12)\n\x14per_channel_max_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11reserve_tank_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66uzz_percent\x18\n \x01(\r\x12\x18\n\x10\x66und_probability\x18\x0b \x01(\r\x12-\n\x13lease_fee_base_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x1c\n\x0flease_fee_basis\x18\r \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0e\x66unding_weight\x18\x0e \x01(\rH\x02\x88\x01\x01\x12\x33\n\x19\x63hannel_fee_max_base_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x35\n(channel_fee_max_proportional_thousandths\x18\x10 \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x11 \x01(\x0cH\x05\x88\x01\x01\"9\n\x12\x46underupdatePolicy\x12\t\n\x05MATCH\x10\x00\x12\r\n\tAVAILABLE\x10\x01\x12\t\n\x05\x46IXED\x10\x02\x42\x16\n\x14_lease_fee_base_msatB\x12\n\x10_lease_fee_basisB\x11\n\x0f_funding_weightB\x1c\n\x1a_channel_fee_max_base_msatB+\n)_channel_fee_max_proportional_thousandthsB\x10\n\x0e_compact_lease\"\xec\x01\n\x0fGetrouteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\nriskfactor\x18\x03 \x01(\x04\x12\x11\n\x04\x63ltv\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x13\n\x06\x66romid\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x66uzzpercent\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\x07 \x03(\t\x12\x14\n\x07maxhops\x18\x08 \x01(\rH\x03\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountB\x07\n\x05_cltvB\t\n\x07_fromidB\x0e\n\x0c_fuzzpercentB\n\n\x08_maxhops\"5\n\x10GetrouteResponse\x12!\n\x05route\x18\x01 \x03(\x0b\x32\x12.cln.GetrouteRoute\"\xc5\x01\n\rGetrouteRoute\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x11\n\tdirection\x18\x03 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\r\n\x05\x64\x65lay\x18\x05 \x01(\r\x12\x34\n\x05style\x18\x06 \x01(\x0e\x32%.cln.GetrouteRoute.GetrouteRouteStyle\"\x1d\n\x12GetrouteRouteStyle\x12\x07\n\x03TLV\x10\x00\"\xb7\x03\n\x13ListforwardsRequest\x12@\n\x06status\x18\x01 \x01(\x0e\x32+.cln.ListforwardsRequest.ListforwardsStatusH\x00\x88\x01\x01\x12\x17\n\nin_channel\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bout_channel\x18\x03 \x01(\tH\x02\x88\x01\x01\x12>\n\x05index\x18\x04 \x01(\x0e\x32*.cln.ListforwardsRequest.ListforwardsIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\"L\n\x12ListforwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"-\n\x11ListforwardsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\t\n\x07_statusB\r\n\x0b_in_channelB\x0e\n\x0c_out_channelB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListforwardsResponse\x12+\n\x08\x66orwards\x18\x01 \x03(\x0b\x32\x19.cln.ListforwardsForwards\"\xb4\x06\n\x14ListforwardsForwards\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x1c\n\x07in_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x44\n\x06status\x18\x03 \x01(\x0e\x32\x34.cln.ListforwardsForwards.ListforwardsForwardsStatus\x12\x15\n\rreceived_time\x18\x04 \x01(\x01\x12\x18\n\x0bout_channel\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\"\n\x08out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12G\n\x05style\x18\t \x01(\x0e\x32\x33.cln.ListforwardsForwards.ListforwardsForwardsStyleH\x03\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x18\n\x0bout_htlc_id\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1a\n\rresolved_time\x18\x0e \x01(\x01H\x08\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x0f \x01(\rH\t\x88\x01\x01\x12\x17\n\nfailreason\x18\x10 \x01(\tH\n\x88\x01\x01\"T\n\x1aListforwardsForwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"0\n\x19ListforwardsForwardsStyle\x12\n\n\x06LEGACY\x10\x00\x12\x07\n\x03TLV\x10\x01\x42\x0e\n\x0c_out_channelB\x0b\n\t_fee_msatB\x0b\n\t_out_msatB\x08\n\x06_styleB\r\n\x0b_in_htlc_idB\x0e\n\x0c_out_htlc_idB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x10\n\x0e_resolved_timeB\x0b\n\t_failcodeB\r\n\x0b_failreason\"a\n\x11ListoffersRequest\x12\x15\n\x08offer_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0b\n\t_offer_idB\x0e\n\x0c_active_only\";\n\x12ListoffersResponse\x12%\n\x06offers\x18\x01 \x03(\x0b\x32\x15.cln.ListoffersOffers\"\x84\x01\n\x10ListoffersOffers\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"\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\x12\n\x05label\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12*\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x17\n\nerroronion\x18\n \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0b \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0c \x01(\x04H\x08\x88\x01\x01\x12\x15\n\x08preimage\x18\r \x01(\x0cH\t\x88\x01\x01\x12\x1c\n\x0fnumber_of_parts\x18\x0e \x01(\x04H\n\x88\x01\x01\";\n\x12ListpaysPaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x13\n\x11_amount_sent_msatB\r\n\x0b_erroronionB\x0e\n\x0c_descriptionB\x0f\n\r_completed_atB\x0b\n\t_preimageB\x12\n\x10_number_of_parts\"*\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\"\xb2\x02\n\x17MultifundchannelRequest\x12\x37\n\x0c\x64\x65stinations\x18\x01 \x03(\x0b\x32!.cln.MultifundchannelDestinations\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\x12H\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\x18\n\x0bminchannels\x18\x05 \x01(\x12H\x02\x88\x01\x01\x12-\n\x12\x63ommitment_feerate\x18\x06 \x01(\x0b\x32\x0c.cln.FeerateH\x03\x88\x01\x01\x42\n\n\x08_feerateB\n\n\x08_minconfB\x0e\n\x0c_minchannelsB\x15\n\x13_commitment_feerate\"\x98\x01\n\x18MultifundchannelResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x35\n\x0b\x63hannel_ids\x18\x03 \x03(\x0b\x32 .cln.MultifundchannelChannel_ids\x12+\n\x06\x66\x61iled\x18\x04 \x03(\x0b\x32\x1b.cln.MultifundchannelFailed\"\xff\x02\n\x1cMultifundchannelDestinations\x12\n\n\x02id\x18\x01 \x01(\t\x12 \n\x06\x61mount\x18\x02 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x15\n\x08\x61nnounce\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12#\n\tpush_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\tH\x02\x88\x01\x01\x12%\n\x0brequest_amt\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x07 \x01(\tH\x04\x88\x01\x01\x12\x15\n\x08mindepth\x18\x08 \x01(\rH\x05\x88\x01\x01\x12!\n\x07reserve\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x42\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xcb\x01\n\x1bMultifundchannelChannel_ids\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12\x12\n\nchannel_id\x18\x03 \x01(\x0c\x12G\n\x0c\x63hannel_type\x18\x04 \x01(\x0b\x32,.cln.MultifundchannelChannel_idsChannel_typeH\x00\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\x0b\n\t_close_to\"\\\n\'MultifundchannelChannel_idsChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x93\x02\n\x16MultifundchannelFailed\x12\n\n\x02id\x18\x01 \x01(\x0c\x12H\n\x06method\x18\x02 \x01(\x0e\x32\x38.cln.MultifundchannelFailed.MultifundchannelFailedMethod\x12/\n\x05\x65rror\x18\x03 \x01(\x0b\x32 .cln.MultifundchannelFailedError\"r\n\x1cMultifundchannelFailedMethod\x12\x0b\n\x07\x43ONNECT\x10\x00\x12\x14\n\x10OPENCHANNEL_INIT\x10\x01\x12\x15\n\x11\x46UNDCHANNEL_START\x10\x02\x12\x18\n\x14\x46UNDCHANNEL_COMPLETE\x10\x03\"<\n\x1bMultifundchannelFailedError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x12\x12\x0f\n\x07message\x18\x02 \x01(\t\"\xa8\x01\n\x14MultiwithdrawRequest\x12 \n\x07outputs\x18\x01 \x03(\x0b\x32\x0f.cln.OutputDesc\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.OutpointB\n\n\x08_feerateB\n\n\x08_minconf\"1\n\x15MultiwithdrawResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xa0\x04\n\x0cOfferRequest\x12\x0e\n\x06\x61mount\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0cquantity_max\x18\x05 \x01(\x04H\x03\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x06 \x01(\x04H\x04\x88\x01\x01\x12\x17\n\nrecurrence\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1c\n\x0frecurrence_base\x18\x08 \x01(\tH\x06\x88\x01\x01\x12!\n\x14recurrence_paywindow\x18\t \x01(\tH\x07\x88\x01\x01\x12\x1d\n\x10recurrence_limit\x18\n \x01(\rH\x08\x88\x01\x01\x12\x17\n\nsingle_use\x18\x0b \x01(\x08H\t\x88\x01\x01\x12(\n\x1brecurrence_start_any_period\x18\x0c \x01(\x08H\n\x88\x01\x01\x42\x0e\n\x0c_descriptionB\t\n\x07_issuerB\x08\n\x06_labelB\x0f\n\r_quantity_maxB\x12\n\x10_absolute_expiryB\r\n\x0b_recurrenceB\x12\n\x10_recurrence_baseB\x17\n\x15_recurrence_paywindowB\x13\n\x11_recurrence_limitB\r\n\x0b_single_useB\x1e\n\x1c_recurrence_start_any_period\"\x92\x01\n\rOfferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x0f\n\x07\x63reated\x18\x06 \x01(\x08\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\".\n\x18Openchannel_abortRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"Y\n\x19Openchannel_abortResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x18\n\x10\x63hannel_canceled\x18\x02 \x01(\x08\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x9f\x01\n\x17Openchannel_bumpRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0binitialpsbt\x18\x02 \x01(\t\x12*\n\x0f\x66unding_feerate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x1b\n\x06\x61mount\x18\x04 \x01(\x0b\x32\x0b.cln.AmountB\x12\n\x10_funding_feerate\"\x86\x02\n\x18Openchannel_bumpResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12<\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32!.cln.Openchannel_bumpChannel_typeH\x00\x88\x01\x01\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\x1c\n\x1a_requires_confirmed_inputs\"Q\n\x1cOpenchannel_bumpChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\xa0\x03\n\x17Openchannel_initRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x13\n\x0binitialpsbt\x18\x02 \x01(\t\x12-\n\x12\x63ommitment_feerate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12*\n\x0f\x66unding_feerate\x18\x04 \x01(\x0b\x32\x0c.cln.FeerateH\x01\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\tH\x03\x88\x01\x01\x12%\n\x0brequest_amt\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x08 \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\t \x03(\r\x12\x1b\n\x06\x61mount\x18\n \x01(\x0b\x32\x0b.cln.AmountB\x15\n\x13_commitment_feerateB\x12\n\x10_funding_feerateB\x0b\n\t_announceB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_lease\"\x86\x02\n\x18Openchannel_initResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12<\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32!.cln.Openchannel_initChannel_typeH\x00\x88\x01\x01\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\x1c\n\x1a_requires_confirmed_inputs\"Q\n\x1cOpenchannel_initChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"D\n\x19Openchannel_signedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_psbt\x18\x02 \x01(\t\"J\n\x1aOpenchannel_signedResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"=\n\x19Openchannel_updateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"\xae\x02\n\x1aOpenchannel_updateResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12>\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32#.cln.Openchannel_updateChannel_typeH\x00\x88\x01\x01\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_outnum\x18\x05 \x01(\r\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12&\n\x19requires_confirmed_inputs\x18\x07 \x01(\x08H\x02\x88\x01\x01\x42\x0f\n\r_channel_typeB\x0b\n\t_close_toB\x1c\n\x1a_requires_confirmed_inputs\"S\n\x1eOpenchannel_updateChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"Y\n\x0bPingRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x03len\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x16\n\tpongbytes\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x06\n\x04_lenB\x0c\n\n_pongbytes\"\x1e\n\x0cPingResponse\x12\x0e\n\x06totlen\x18\x01 \x01(\r\"\x91\x01\n\rPluginRequest\x12)\n\nsubcommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12\x13\n\x06plugin\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tdirectory\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x07options\x18\x04 \x03(\tB\t\n\x07_pluginB\x0c\n\n_directory\"}\n\x0ePluginResponse\x12&\n\x07\x63ommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12#\n\x07plugins\x18\x02 \x03(\x0b\x32\x12.cln.PluginPlugins\x12\x13\n\x06result\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_result\">\n\rPluginPlugins\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x0f\n\x07\x64ynamic\x18\x03 \x01(\x08\"<\n\x14RenepaystatusRequest\x12\x16\n\tinvstring\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_invstring\"G\n\x15RenepaystatusResponse\x12.\n\tpaystatus\x18\x01 \x03(\x0b\x32\x1b.cln.RenepaystatusPaystatus\"\xe2\x03\n\x16RenepaystatusPaystatus\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x1d\n\x10payment_preimage\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\x0f\n\x07groupid\x18\x05 \x01(\r\x12\x12\n\x05parts\x18\x06 \x01(\rH\x01\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12*\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12H\n\x06status\x18\t \x01(\x0e\x32\x38.cln.RenepaystatusPaystatus.RenepaystatusPaystatusStatus\x12\x18\n\x0b\x64\x65stination\x18\n \x01(\x0cH\x03\x88\x01\x01\x12\r\n\x05notes\x18\x0b \x03(\t\"E\n\x1cRenepaystatusPaystatusStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x13\n\x11_payment_preimageB\x08\n\x06_partsB\x13\n\x11_amount_sent_msatB\x0e\n\x0c_destination\"\xc9\x02\n\x0eRenepayRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x03\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x12\n\x05label\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1b\n\x0e\x64\x65v_use_shadow\x18\x08 \x01(\x08H\x06\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\t\n\x07_maxfeeB\x0b\n\t_maxdelayB\x0c\n\n_retry_forB\x0e\n\x0c_descriptionB\x08\n\x06_labelB\x11\n\x0f_dev_use_shadow\"\xc3\x02\n\x0fRenepayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\r\n\x05parts\x18\x04 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12\x32\n\x06status\x18\x07 \x01(\x0e\x32\".cln.RenepayResponse.RenepayStatus\x12\x18\n\x0b\x64\x65stination\x18\x08 \x01(\x0cH\x00\x88\x01\x01\"6\n\rRenepayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x0e\n\x0c_destination\"l\n\x14ReserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\texclusive\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x14\n\x07reserve\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x0c\n\n_exclusiveB\n\n\x08_reserve\"M\n\x15ReserveinputsResponse\x12\x34\n\x0creservations\x18\x01 \x03(\x0b\x32\x1e.cln.ReserveinputsReservations\"z\n\x19ReserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\"4\n\x14SendcustommsgRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x0c\x12\x0b\n\x03msg\x18\x02 \x01(\x0c\"\'\n\x15SendcustommsgResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\"\xb0\x01\n\x12SendinvoiceRequest\x12\x0e\n\x06invreq\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08quantity\x18\x05 \x01(\x04H\x02\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\n\n\x08_timeoutB\x0b\n\t_quantity\"\xcf\x04\n\x13SendinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.SendinvoiceResponse.SendinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x08 \x01(\x04H\x02\x88\x01\x01\x12\x1a\n\rupdated_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\n \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\"6\n\x11SendinvoiceStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_amount_msatB\t\n\x07_bolt12B\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\xaa\x02\n\x11SetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12!\n\x07\x66\x65\x65\x62\x61se\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x66\x65\x65ppm\x18\x03 \x01(\rH\x01\x88\x01\x01\x12!\n\x07htlcmin\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12!\n\x07htlcmax\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x19\n\x0c\x65nforcedelay\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1c\n\x0fignorefeelimits\x18\x07 \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_feebaseB\t\n\x07_feeppmB\n\n\x08_htlcminB\n\n\x08_htlcmaxB\x0f\n\r_enforcedelayB\x12\n\x10_ignorefeelimits\"?\n\x12SetchannelResponse\x12)\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x17.cln.SetchannelChannels\"\xca\x03\n\x12SetchannelChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\x12*\n\x15minimum_htlc_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x17warning_htlcmin_too_low\x18\x07 \x01(\tH\x01\x88\x01\x01\x12*\n\x15maximum_htlc_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x18warning_htlcmax_too_high\x18\t \x01(\tH\x02\x88\x01\x01\x12\x1e\n\x11ignore_fee_limits\x18\n \x01(\x08H\x03\x88\x01\x01\x42\x13\n\x11_short_channel_idB\x1a\n\x18_warning_htlcmin_too_lowB\x1b\n\x19_warning_htlcmax_too_highB\x14\n\x12_ignore_fee_limits\"<\n\x10SetconfigRequest\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x10\n\x03val\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x06\n\x04_val\"9\n\x11SetconfigResponse\x12$\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x14.cln.SetconfigConfig\"\xa5\x02\n\x0fSetconfigConfig\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x64ynamic\x18\x04 \x01(\x08\x12\x10\n\x03set\x18\x05 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tvalue_str\x18\x06 \x01(\tH\x02\x88\x01\x01\x12$\n\nvalue_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x16\n\tvalue_int\x18\x08 \x01(\x12H\x04\x88\x01\x01\x12\x17\n\nvalue_bool\x18\t \x01(\x08H\x05\x88\x01\x01\x42\t\n\x07_pluginB\x06\n\x04_setB\x0c\n\n_value_strB\r\n\x0b_value_msatB\x0c\n\n_value_intB\r\n\x0b_value_bool\"6\n\x15SetpsbtversionRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\r\"&\n\x16SetpsbtversionResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"\'\n\x12SigninvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\"%\n\x13SigninvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"%\n\x12SignmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"F\n\x13SignmessageResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\r\n\x05recid\x18\x02 \x01(\x0c\x12\r\n\x05zbase\x18\x03 \x01(\t\"\xc9\x01\n\x12Splice_initRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x17\n\x0frelative_amount\x18\x02 \x01(\x12\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x65\x65rate_per_kw\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x0e\n\x0c_initialpsbtB\x11\n\x0f_feerate_per_kwB\x10\n\x0e_force_feerate\"#\n\x13Splice_initResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"`\n\x14Splice_signedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x17\n\nsign_first\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_sign_first\"Q\n\x15Splice_signedResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x13\n\x06outnum\x18\x03 \x01(\rH\x00\x88\x01\x01\x42\t\n\x07_outnum\"8\n\x14Splice_updateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"B\n\x15Splice_updateResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\"H\n\x16UnreserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x14\n\x07reserve\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_reserve\"Q\n\x17UnreserveinputsResponse\x12\x36\n\x0creservations\x18\x01 \x03(\x0b\x32 .cln.UnreserveinputsReservations\"\x97\x01\n\x1bUnreserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x1e\n\x11reserved_to_block\x18\x05 \x01(\rH\x00\x88\x01\x01\x42\x14\n\x12_reserved_to_block\"n\n\x14UpgradewalletRequest\x12\"\n\x07\x66\x65\x65rate\x18\x01 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x17\n\nreservedok\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\n\n\x08_feerateB\r\n\x0b_reservedok\"\x95\x01\n\x15UpgradewalletResponse\x12\x1a\n\rupgraded_outs\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\x0cH\x03\x88\x01\x01\x42\x10\n\x0e_upgraded_outsB\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"O\n\x16WaitblockheightRequest\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\x12\x14\n\x07timeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_timeout\".\n\x17WaitblockheightResponse\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\"\xf9\x01\n\x0bWaitRequest\x12\x31\n\tsubsystem\x18\x01 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitSubsystem\x12\x31\n\tindexname\x18\x02 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitIndexname\x12\x11\n\tnextvalue\x18\x03 \x01(\x04\"9\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\"6\n\rWaitIndexname\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x12\x0b\n\x07\x44\x45LETED\x10\x02\"\x97\x02\n\x0cWaitResponse\x12\x32\n\tsubsystem\x18\x01 \x01(\x0e\x32\x1f.cln.WaitResponse.WaitSubsystem\x12\x14\n\x07\x63reated\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07updated\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x14\n\x07\x64\x65leted\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12&\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32\x10.cln.WaitDetailsH\x03\x88\x01\x01\"9\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\x42\n\n\x08_createdB\n\n\x08_updatedB\n\n\x08_deletedB\n\n\x08_details\"\xfc\x04\n\x0bWaitDetails\x12\x37\n\x06status\x18\x01 \x01(\x0e\x32\".cln.WaitDetails.WaitDetailsStatusH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x14\n\x07groupid\x18\x07 \x01(\x04H\x06\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x08 \x01(\x0cH\x07\x88\x01\x01\x12\x17\n\nin_channel\x18\t \x01(\tH\x08\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\t\x88\x01\x01\x12!\n\x07in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x12\x18\n\x0bout_channel\x18\x0c \x01(\tH\x0b\x88\x01\x01\"\x89\x01\n\x11WaitDetailsStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x12\x0b\n\x07PENDING\x10\x03\x12\n\n\x06\x46\x41ILED\x10\x04\x12\x0c\n\x08\x43OMPLETE\x10\x05\x12\x0b\n\x07OFFERED\x10\x06\x12\x0b\n\x07SETTLED\x10\x07\x12\x10\n\x0cLOCAL_FAILED\x10\x08\x42\t\n\x07_statusB\x08\n\x06_labelB\x0e\n\x0c_descriptionB\t\n\x07_bolt11B\t\n\x07_bolt12B\t\n\x07_partidB\n\n\x08_groupidB\x0f\n\r_payment_hashB\r\n\x0b_in_channelB\r\n\x0b_in_htlc_idB\n\n\x08_in_msatB\x0e\n\x0c_out_channel\"4\n\x12ListconfigsRequest\x12\x13\n\x06\x63onfig\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_config\"\xdf\x1b\n\x13ListconfigsResponse\x12-\n\x07\x63onfigs\x18\x01 \x01(\x0b\x32\x17.cln.ListconfigsConfigsH\x00\x88\x01\x01\x12(\n\x07plugins\x18\x03 \x03(\x0b\x32\x17.cln.ListconfigsPlugins\x12;\n\x11important_plugins\x18\x04 \x03(\x0b\x32 .cln.ListconfigsImportantplugins\x12\x11\n\x04\x63onf\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rlightning_dir\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07network\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\"\n\x15\x61llow_deprecated_apis\x18\x08 \x01(\x08H\x04\x88\x01\x01\x12\x15\n\x08rpc_file\x18\t \x01(\tH\x05\x88\x01\x01\x12\x16\n\x0e\x64isable_plugin\x18\n \x03(\t\x12\x1b\n\x0e\x62ookkeeper_dir\x18\x0b \x01(\tH\x06\x88\x01\x01\x12\x1a\n\rbookkeeper_db\x18\x0c \x01(\tH\x07\x88\x01\x01\x12\x1d\n\x10\x61lways_use_proxy\x18\r \x01(\x08H\x08\x88\x01\x01\x12\x13\n\x06\x64\x61\x65mon\x18\x0e \x01(\x08H\t\x88\x01\x01\x12\x13\n\x06wallet\x18\x0f \x01(\tH\n\x88\x01\x01\x12\x1b\n\x0elarge_channels\x18\x10 \x01(\x08H\x0b\x88\x01\x01\x12#\n\x16\x65xperimental_dual_fund\x18\x11 \x01(\x08H\x0c\x88\x01\x01\x12\"\n\x15\x65xperimental_splicing\x18\x12 \x01(\x08H\r\x88\x01\x01\x12(\n\x1b\x65xperimental_onion_messages\x18\x13 \x01(\x08H\x0e\x88\x01\x01\x12 \n\x13\x65xperimental_offers\x18\x14 \x01(\x08H\x0f\x88\x01\x01\x12\x30\n#experimental_shutdown_wrong_funding\x18\x15 \x01(\x08H\x10\x88\x01\x01\x12&\n\x19\x65xperimental_peer_storage\x18\x16 \x01(\x08H\x11\x88\x01\x01\x12!\n\x14\x65xperimental_quiesce\x18\x17 \x01(\x08H\x12\x88\x01\x01\x12*\n\x1d\x65xperimental_upgrade_protocol\x18\x18 \x01(\x08H\x13\x88\x01\x01\x12&\n\x19invoices_onchain_fallback\x18\x19 \x01(\x08H\x14\x88\x01\x01\x12\x1d\n\x10\x64\x61tabase_upgrade\x18\x1a \x01(\x08H\x15\x88\x01\x01\x12\x10\n\x03rgb\x18\x1b \x01(\x0cH\x16\x88\x01\x01\x12\x12\n\x05\x61lias\x18\x1c \x01(\tH\x17\x88\x01\x01\x12\x15\n\x08pid_file\x18\x1d \x01(\tH\x18\x88\x01\x01\x12\x1e\n\x11ignore_fee_limits\x18\x1e \x01(\x08H\x19\x88\x01\x01\x12\x1d\n\x10watchtime_blocks\x18\x1f \x01(\rH\x1a\x88\x01\x01\x12 \n\x13max_locktime_blocks\x18 \x01(\rH\x1b\x88\x01\x01\x12\x1d\n\x10\x66unding_confirms\x18! \x01(\rH\x1c\x88\x01\x01\x12\x17\n\ncltv_delta\x18\" \x01(\rH\x1d\x88\x01\x01\x12\x17\n\ncltv_final\x18# \x01(\rH\x1e\x88\x01\x01\x12\x18\n\x0b\x63ommit_time\x18$ \x01(\rH\x1f\x88\x01\x01\x12\x15\n\x08\x66\x65\x65_base\x18% \x01(\rH \x88\x01\x01\x12\x13\n\x06rescan\x18& \x01(\x12H!\x88\x01\x01\x12\x1c\n\x0f\x66\x65\x65_per_satoshi\x18\' \x01(\rH\"\x88\x01\x01\x12!\n\x14max_concurrent_htlcs\x18( \x01(\rH#\x88\x01\x01\x12+\n\x11htlc_minimum_msat\x18) \x01(\x0b\x32\x0b.cln.AmountH$\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18* \x01(\x0b\x32\x0b.cln.AmountH%\x88\x01\x01\x12\x35\n\x1bmax_dust_htlc_exposure_msat\x18+ \x01(\x0b\x32\x0b.cln.AmountH&\x88\x01\x01\x12\x1d\n\x10min_capacity_sat\x18, \x01(\x04H\'\x88\x01\x01\x12\x11\n\x04\x61\x64\x64r\x18- \x01(\tH(\x88\x01\x01\x12\x1a\n\rannounce_addr\x18. \x01(\tH)\x88\x01\x01\x12\x16\n\tbind_addr\x18/ \x01(\tH*\x88\x01\x01\x12\x14\n\x07offline\x18\x30 \x01(\x08H+\x88\x01\x01\x12\x17\n\nautolisten\x18\x31 \x01(\x08H,\x88\x01\x01\x12\x12\n\x05proxy\x18\x32 \x01(\tH-\x88\x01\x01\x12\x18\n\x0b\x64isable_dns\x18\x33 \x01(\x08H.\x88\x01\x01\x12%\n\x18\x61nnounce_addr_discovered\x18\x34 \x01(\tH/\x88\x01\x01\x12*\n\x1d\x61nnounce_addr_discovered_port\x18\x35 \x01(\x12H0\x88\x01\x01\x12\x1a\n\rencrypted_hsm\x18\x36 \x01(\x08H1\x88\x01\x01\x12\x1a\n\rrpc_file_mode\x18\x37 \x01(\tH2\x88\x01\x01\x12\x16\n\tlog_level\x18\x38 \x01(\tH3\x88\x01\x01\x12\x17\n\nlog_prefix\x18\x39 \x01(\tH4\x88\x01\x01\x12\x15\n\x08log_file\x18: \x01(\tH5\x88\x01\x01\x12\x1b\n\x0elog_timestamps\x18; \x01(\x08H6\x88\x01\x01\x12\x1b\n\x0e\x66orce_feerates\x18< \x01(\tH7\x88\x01\x01\x12\x16\n\tsubdaemon\x18= \x01(\tH8\x88\x01\x01\x12#\n\x16\x66\x65tchinvoice_noconnect\x18> \x01(\x08H9\x88\x01\x01\x12\"\n\x15\x61\x63\x63\x65pt_htlc_tlv_types\x18? \x01(\tH:\x88\x01\x01\x12!\n\x14tor_service_password\x18@ \x01(\tH;\x88\x01\x01\x12!\n\x14\x64\x65v_allowdustreserve\x18\x41 \x01(\x08H<\x88\x01\x01\x12\x1e\n\x11\x61nnounce_addr_dns\x18\x42 \x01(\x08H=\x88\x01\x01\x12%\n\x18require_confirmed_inputs\x18\x43 \x01(\x08H>\x88\x01\x01\x12\x16\n\tdeveloper\x18\x44 \x01(\x08H?\x88\x01\x01\x12\x17\n\ncommit_fee\x18\x45 \x01(\x04H@\x88\x01\x01\x12,\n\x12min_emergency_msat\x18\x46 \x01(\x0b\x32\x0b.cln.AmountHA\x88\x01\x01\x12\"\n\x15\x63ommit_feerate_offset\x18G \x01(\rHB\x88\x01\x01\x42\n\n\x08_configsB\x07\n\x05_confB\x10\n\x0e_lightning_dirB\n\n\x08_networkB\x18\n\x16_allow_deprecated_apisB\x0b\n\t_rpc_fileB\x11\n\x0f_bookkeeper_dirB\x10\n\x0e_bookkeeper_dbB\x13\n\x11_always_use_proxyB\t\n\x07_daemonB\t\n\x07_walletB\x11\n\x0f_large_channelsB\x19\n\x17_experimental_dual_fundB\x18\n\x16_experimental_splicingB\x1e\n\x1c_experimental_onion_messagesB\x16\n\x14_experimental_offersB&\n$_experimental_shutdown_wrong_fundingB\x1c\n\x1a_experimental_peer_storageB\x17\n\x15_experimental_quiesceB \n\x1e_experimental_upgrade_protocolB\x1c\n\x1a_invoices_onchain_fallbackB\x13\n\x11_database_upgradeB\x06\n\x04_rgbB\x08\n\x06_aliasB\x0b\n\t_pid_fileB\x14\n\x12_ignore_fee_limitsB\x13\n\x11_watchtime_blocksB\x16\n\x14_max_locktime_blocksB\x13\n\x11_funding_confirmsB\r\n\x0b_cltv_deltaB\r\n\x0b_cltv_finalB\x0e\n\x0c_commit_timeB\x0b\n\t_fee_baseB\t\n\x07_rescanB\x12\n\x10_fee_per_satoshiB\x17\n\x15_max_concurrent_htlcsB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x1e\n\x1c_max_dust_htlc_exposure_msatB\x13\n\x11_min_capacity_satB\x07\n\x05_addrB\x10\n\x0e_announce_addrB\x0c\n\n_bind_addrB\n\n\x08_offlineB\r\n\x0b_autolistenB\x08\n\x06_proxyB\x0e\n\x0c_disable_dnsB\x1b\n\x19_announce_addr_discoveredB \n\x1e_announce_addr_discovered_portB\x10\n\x0e_encrypted_hsmB\x10\n\x0e_rpc_file_modeB\x0c\n\n_log_levelB\r\n\x0b_log_prefixB\x0b\n\t_log_fileB\x11\n\x0f_log_timestampsB\x11\n\x0f_force_feeratesB\x0c\n\n_subdaemonB\x19\n\x17_fetchinvoice_noconnectB\x18\n\x16_accept_htlc_tlv_typesB\x17\n\x15_tor_service_passwordB\x17\n\x15_dev_allowdustreserveB\x14\n\x12_announce_addr_dnsB\x1b\n\x19_require_confirmed_inputsB\x0c\n\n_developerB\r\n\x0b_commit_feeB\x15\n\x13_min_emergency_msatB\x18\n\x16_commit_feerate_offset\"\xdf.\n\x12ListconfigsConfigs\x12.\n\x04\x63onf\x18\x01 \x01(\x0b\x32\x1b.cln.ListconfigsConfigsConfH\x00\x88\x01\x01\x12\x38\n\tdeveloper\x18\x02 \x01(\x0b\x32 .cln.ListconfigsConfigsDeveloperH\x01\x88\x01\x01\x12?\n\rclear_plugins\x18\x03 \x01(\x0b\x32#.cln.ListconfigsConfigsClearpluginsH\x02\x88\x01\x01\x12;\n\x0b\x64isable_mpp\x18\x04 \x01(\x0b\x32!.cln.ListconfigsConfigsDisablemppH\x03\x88\x01\x01\x12\x34\n\x07mainnet\x18\x05 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsMainnetH\x04\x88\x01\x01\x12\x34\n\x07regtest\x18\x06 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsRegtestH\x05\x88\x01\x01\x12\x32\n\x06signet\x18\x07 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsSignetH\x06\x88\x01\x01\x12\x34\n\x07testnet\x18\x08 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsTestnetH\x07\x88\x01\x01\x12\x45\n\x10important_plugin\x18\t \x01(\x0b\x32&.cln.ListconfigsConfigsImportantpluginH\x08\x88\x01\x01\x12\x32\n\x06plugin\x18\n \x01(\x0b\x32\x1d.cln.ListconfigsConfigsPluginH\t\x88\x01\x01\x12\x39\n\nplugin_dir\x18\x0b \x01(\x0b\x32 .cln.ListconfigsConfigsPlugindirH\n\x88\x01\x01\x12?\n\rlightning_dir\x18\x0c \x01(\x0b\x32#.cln.ListconfigsConfigsLightningdirH\x0b\x88\x01\x01\x12\x34\n\x07network\x18\r \x01(\x0b\x32\x1e.cln.ListconfigsConfigsNetworkH\x0c\x88\x01\x01\x12N\n\x15\x61llow_deprecated_apis\x18\x0e \x01(\x0b\x32*.cln.ListconfigsConfigsAllowdeprecatedapisH\r\x88\x01\x01\x12\x35\n\x08rpc_file\x18\x0f \x01(\x0b\x32\x1e.cln.ListconfigsConfigsRpcfileH\x0e\x88\x01\x01\x12\x41\n\x0e\x64isable_plugin\x18\x10 \x01(\x0b\x32$.cln.ListconfigsConfigsDisablepluginH\x0f\x88\x01\x01\x12\x44\n\x10\x61lways_use_proxy\x18\x11 \x01(\x0b\x32%.cln.ListconfigsConfigsAlwaysuseproxyH\x10\x88\x01\x01\x12\x32\n\x06\x64\x61\x65mon\x18\x12 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsDaemonH\x11\x88\x01\x01\x12\x32\n\x06wallet\x18\x13 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsWalletH\x12\x88\x01\x01\x12\x41\n\x0elarge_channels\x18\x14 \x01(\x0b\x32$.cln.ListconfigsConfigsLargechannelsH\x13\x88\x01\x01\x12P\n\x16\x65xperimental_dual_fund\x18\x15 \x01(\x0b\x32+.cln.ListconfigsConfigsExperimentaldualfundH\x14\x88\x01\x01\x12O\n\x15\x65xperimental_splicing\x18\x16 \x01(\x0b\x32+.cln.ListconfigsConfigsExperimentalsplicingH\x15\x88\x01\x01\x12Z\n\x1b\x65xperimental_onion_messages\x18\x17 \x01(\x0b\x32\x30.cln.ListconfigsConfigsExperimentalonionmessagesH\x16\x88\x01\x01\x12K\n\x13\x65xperimental_offers\x18\x18 \x01(\x0b\x32).cln.ListconfigsConfigsExperimentaloffersH\x17\x88\x01\x01\x12i\n#experimental_shutdown_wrong_funding\x18\x19 \x01(\x0b\x32\x37.cln.ListconfigsConfigsExperimentalshutdownwrongfundingH\x18\x88\x01\x01\x12V\n\x19\x65xperimental_peer_storage\x18\x1a \x01(\x0b\x32..cln.ListconfigsConfigsExperimentalpeerstorageH\x19\x88\x01\x01\x12M\n\x14\x65xperimental_anchors\x18\x1b \x01(\x0b\x32*.cln.ListconfigsConfigsExperimentalanchorsH\x1a\x88\x01\x01\x12\x45\n\x10\x64\x61tabase_upgrade\x18\x1c \x01(\x0b\x32&.cln.ListconfigsConfigsDatabaseupgradeH\x1b\x88\x01\x01\x12,\n\x03rgb\x18\x1d \x01(\x0b\x32\x1a.cln.ListconfigsConfigsRgbH\x1c\x88\x01\x01\x12\x30\n\x05\x61lias\x18\x1e \x01(\x0b\x32\x1c.cln.ListconfigsConfigsAliasH\x1d\x88\x01\x01\x12\x35\n\x08pid_file\x18\x1f \x01(\x0b\x32\x1e.cln.ListconfigsConfigsPidfileH\x1e\x88\x01\x01\x12\x46\n\x11ignore_fee_limits\x18 \x01(\x0b\x32&.cln.ListconfigsConfigsIgnorefeelimitsH\x1f\x88\x01\x01\x12\x45\n\x10watchtime_blocks\x18! \x01(\x0b\x32&.cln.ListconfigsConfigsWatchtimeblocksH \x88\x01\x01\x12J\n\x13max_locktime_blocks\x18\" \x01(\x0b\x32(.cln.ListconfigsConfigsMaxlocktimeblocksH!\x88\x01\x01\x12\x45\n\x10\x66unding_confirms\x18# \x01(\x0b\x32&.cln.ListconfigsConfigsFundingconfirmsH\"\x88\x01\x01\x12\x39\n\ncltv_delta\x18$ \x01(\x0b\x32 .cln.ListconfigsConfigsCltvdeltaH#\x88\x01\x01\x12\x39\n\ncltv_final\x18% \x01(\x0b\x32 .cln.ListconfigsConfigsCltvfinalH$\x88\x01\x01\x12;\n\x0b\x63ommit_time\x18& \x01(\x0b\x32!.cln.ListconfigsConfigsCommittimeH%\x88\x01\x01\x12\x35\n\x08\x66\x65\x65_base\x18\' \x01(\x0b\x32\x1e.cln.ListconfigsConfigsFeebaseH&\x88\x01\x01\x12\x32\n\x06rescan\x18( \x01(\x0b\x32\x1d.cln.ListconfigsConfigsRescanH\'\x88\x01\x01\x12\x42\n\x0f\x66\x65\x65_per_satoshi\x18) \x01(\x0b\x32$.cln.ListconfigsConfigsFeepersatoshiH(\x88\x01\x01\x12L\n\x14max_concurrent_htlcs\x18* \x01(\x0b\x32).cln.ListconfigsConfigsMaxconcurrenthtlcsH)\x88\x01\x01\x12\x46\n\x11htlc_minimum_msat\x18+ \x01(\x0b\x32&.cln.ListconfigsConfigsHtlcminimummsatH*\x88\x01\x01\x12\x46\n\x11htlc_maximum_msat\x18, \x01(\x0b\x32&.cln.ListconfigsConfigsHtlcmaximummsatH+\x88\x01\x01\x12X\n\x1bmax_dust_htlc_exposure_msat\x18- \x01(\x0b\x32..cln.ListconfigsConfigsMaxdusthtlcexposuremsatH,\x88\x01\x01\x12\x44\n\x10min_capacity_sat\x18. \x01(\x0b\x32%.cln.ListconfigsConfigsMincapacitysatH-\x88\x01\x01\x12.\n\x04\x61\x64\x64r\x18/ \x01(\x0b\x32\x1b.cln.ListconfigsConfigsAddrH.\x88\x01\x01\x12?\n\rannounce_addr\x18\x30 \x01(\x0b\x32#.cln.ListconfigsConfigsAnnounceaddrH/\x88\x01\x01\x12\x37\n\tbind_addr\x18\x31 \x01(\x0b\x32\x1f.cln.ListconfigsConfigsBindaddrH0\x88\x01\x01\x12\x34\n\x07offline\x18\x32 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsOfflineH1\x88\x01\x01\x12:\n\nautolisten\x18\x33 \x01(\x0b\x32!.cln.ListconfigsConfigsAutolistenH2\x88\x01\x01\x12\x30\n\x05proxy\x18\x34 \x01(\x0b\x32\x1c.cln.ListconfigsConfigsProxyH3\x88\x01\x01\x12;\n\x0b\x64isable_dns\x18\x35 \x01(\x0b\x32!.cln.ListconfigsConfigsDisablednsH4\x88\x01\x01\x12T\n\x18\x61nnounce_addr_discovered\x18\x36 \x01(\x0b\x32-.cln.ListconfigsConfigsAnnounceaddrdiscoveredH5\x88\x01\x01\x12]\n\x1d\x61nnounce_addr_discovered_port\x18\x37 \x01(\x0b\x32\x31.cln.ListconfigsConfigsAnnounceaddrdiscoveredportH6\x88\x01\x01\x12?\n\rencrypted_hsm\x18\x38 \x01(\x0b\x32#.cln.ListconfigsConfigsEncryptedhsmH7\x88\x01\x01\x12>\n\rrpc_file_mode\x18\x39 \x01(\x0b\x32\".cln.ListconfigsConfigsRpcfilemodeH8\x88\x01\x01\x12\x37\n\tlog_level\x18: \x01(\x0b\x32\x1f.cln.ListconfigsConfigsLoglevelH9\x88\x01\x01\x12\x39\n\nlog_prefix\x18; \x01(\x0b\x32 .cln.ListconfigsConfigsLogprefixH:\x88\x01\x01\x12\x35\n\x08log_file\x18< \x01(\x0b\x32\x1e.cln.ListconfigsConfigsLogfileH;\x88\x01\x01\x12\x41\n\x0elog_timestamps\x18= \x01(\x0b\x32$.cln.ListconfigsConfigsLogtimestampsH<\x88\x01\x01\x12\x41\n\x0e\x66orce_feerates\x18> \x01(\x0b\x32$.cln.ListconfigsConfigsForcefeeratesH=\x88\x01\x01\x12\x38\n\tsubdaemon\x18? \x01(\x0b\x32 .cln.ListconfigsConfigsSubdaemonH>\x88\x01\x01\x12Q\n\x16\x66\x65tchinvoice_noconnect\x18@ \x01(\x0b\x32,.cln.ListconfigsConfigsFetchinvoicenoconnectH?\x88\x01\x01\x12M\n\x15\x61\x63\x63\x65pt_htlc_tlv_types\x18\x41 \x01(\x0b\x32).cln.ListconfigsConfigsAccepthtlctlvtypesH@\x88\x01\x01\x12L\n\x14tor_service_password\x18\x42 \x01(\x0b\x32).cln.ListconfigsConfigsTorservicepasswordHA\x88\x01\x01\x12\x46\n\x11\x61nnounce_addr_dns\x18\x43 \x01(\x0b\x32&.cln.ListconfigsConfigsAnnounceaddrdnsHB\x88\x01\x01\x12T\n\x18require_confirmed_inputs\x18\x44 \x01(\x0b\x32-.cln.ListconfigsConfigsRequireconfirmedinputsHC\x88\x01\x01\x12\x39\n\ncommit_fee\x18\x45 \x01(\x0b\x32 .cln.ListconfigsConfigsCommitfeeHD\x88\x01\x01\x12N\n\x15\x63ommit_feerate_offset\x18\x46 \x01(\x0b\x32*.cln.ListconfigsConfigsCommitfeerateoffsetHE\x88\x01\x01\x42\x07\n\x05_confB\x0c\n\n_developerB\x10\n\x0e_clear_pluginsB\x0e\n\x0c_disable_mppB\n\n\x08_mainnetB\n\n\x08_regtestB\t\n\x07_signetB\n\n\x08_testnetB\x13\n\x11_important_pluginB\t\n\x07_pluginB\r\n\x0b_plugin_dirB\x10\n\x0e_lightning_dirB\n\n\x08_networkB\x18\n\x16_allow_deprecated_apisB\x0b\n\t_rpc_fileB\x11\n\x0f_disable_pluginB\x13\n\x11_always_use_proxyB\t\n\x07_daemonB\t\n\x07_walletB\x11\n\x0f_large_channelsB\x19\n\x17_experimental_dual_fundB\x18\n\x16_experimental_splicingB\x1e\n\x1c_experimental_onion_messagesB\x16\n\x14_experimental_offersB&\n$_experimental_shutdown_wrong_fundingB\x1c\n\x1a_experimental_peer_storageB\x17\n\x15_experimental_anchorsB\x13\n\x11_database_upgradeB\x06\n\x04_rgbB\x08\n\x06_aliasB\x0b\n\t_pid_fileB\x14\n\x12_ignore_fee_limitsB\x13\n\x11_watchtime_blocksB\x16\n\x14_max_locktime_blocksB\x13\n\x11_funding_confirmsB\r\n\x0b_cltv_deltaB\r\n\x0b_cltv_finalB\x0e\n\x0c_commit_timeB\x0b\n\t_fee_baseB\t\n\x07_rescanB\x12\n\x10_fee_per_satoshiB\x17\n\x15_max_concurrent_htlcsB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x1e\n\x1c_max_dust_htlc_exposure_msatB\x13\n\x11_min_capacity_satB\x07\n\x05_addrB\x10\n\x0e_announce_addrB\x0c\n\n_bind_addrB\n\n\x08_offlineB\r\n\x0b_autolistenB\x08\n\x06_proxyB\x0e\n\x0c_disable_dnsB\x1b\n\x19_announce_addr_discoveredB \n\x1e_announce_addr_discovered_portB\x10\n\x0e_encrypted_hsmB\x10\n\x0e_rpc_file_modeB\x0c\n\n_log_levelB\r\n\x0b_log_prefixB\x0b\n\t_log_fileB\x11\n\x0f_log_timestampsB\x11\n\x0f_force_feeratesB\x0c\n\n_subdaemonB\x19\n\x17_fetchinvoice_noconnectB\x18\n\x16_accept_htlc_tlv_typesB\x17\n\x15_tor_service_passwordB\x14\n\x12_announce_addr_dnsB\x1b\n\x19_require_confirmed_inputsB\r\n\x0b_commit_feeB\x18\n\x16_commit_feerate_offset\"\xa2\x01\n\x16ListconfigsConfigsConf\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12H\n\x06source\x18\x02 \x01(\x0e\x32\x38.cln.ListconfigsConfigsConf.ListconfigsConfigsConfSource\"+\n\x1cListconfigsConfigsConfSource\x12\x0b\n\x07\x43MDLINE\x10\x00\":\n\x1bListconfigsConfigsDeveloper\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x1eListconfigsConfigsClearplugins\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"[\n\x1cListconfigsConfigsDisablempp\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"8\n\x19ListconfigsConfigsMainnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsRegtest\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"7\n\x18ListconfigsConfigsSignet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsTestnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n!ListconfigsConfigsImportantplugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"?\n\x18ListconfigsConfigsPlugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"B\n\x1bListconfigsConfigsPlugindir\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"C\n\x1eListconfigsConfigsLightningdir\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsNetwork\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"K\n%ListconfigsConfigsAllowdeprecatedapis\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsRpcfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n\x1fListconfigsConfigsDisableplugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"F\n ListconfigsConfigsAlwaysuseproxy\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"7\n\x18ListconfigsConfigsDaemon\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x18ListconfigsConfigsWallet\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x1fListconfigsConfigsLargechannels\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"E\n&ListconfigsConfigsExperimentaldualfund\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"E\n&ListconfigsConfigsExperimentalsplicing\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"J\n+ListconfigsConfigsExperimentalonionmessages\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"C\n$ListconfigsConfigsExperimentaloffers\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"Q\n2ListconfigsConfigsExperimentalshutdownwrongfunding\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n)ListconfigsConfigsExperimentalpeerstorage\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n%ListconfigsConfigsExperimentalanchors\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsDatabaseupgrade\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\":\n\x15ListconfigsConfigsRgb\x12\x11\n\tvalue_str\x18\x01 \x01(\x0c\x12\x0e\n\x06source\x18\x02 \x01(\t\"<\n\x17ListconfigsConfigsAlias\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsPidfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsIgnorefeelimits\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n!ListconfigsConfigsWatchtimeblocks\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n#ListconfigsConfigsMaxlocktimeblocks\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n!ListconfigsConfigsFundingconfirms\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCltvdelta\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCltvfinal\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"A\n\x1cListconfigsConfigsCommittime\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsFeebase\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x18ListconfigsConfigsRescan\x12\x11\n\tvalue_int\x18\x01 \x01(\x12\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n\x1fListconfigsConfigsFeepersatoshi\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"I\n$ListconfigsConfigsMaxconcurrenthtlcs\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"T\n!ListconfigsConfigsHtlcminimummsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"T\n!ListconfigsConfigsHtlcmaximummsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"\\\n)ListconfigsConfigsMaxdusthtlcexposuremsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"g\n ListconfigsConfigsMincapacitysat\x12\x11\n\tvalue_int\x18\x01 \x01(\x04\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x14\n\x07\x64ynamic\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\n\n\x08_dynamic\"=\n\x16ListconfigsConfigsAddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"E\n\x1eListconfigsConfigsAnnounceaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"A\n\x1aListconfigsConfigsBindaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"8\n\x19ListconfigsConfigsOffline\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1cListconfigsConfigsAutolisten\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"<\n\x17ListconfigsConfigsProxy\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\";\n\x1cListconfigsConfigsDisabledns\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"\x82\x02\n(ListconfigsConfigsAnnounceaddrdiscovered\x12r\n\tvalue_str\x18\x01 \x01(\x0e\x32_.cln.ListconfigsConfigsAnnounceaddrdiscovered.ListconfigsConfigsAnnounceaddrdiscoveredValue_str\x12\x0e\n\x06source\x18\x02 \x01(\t\"R\n1ListconfigsConfigsAnnounceaddrdiscoveredValue_str\x12\x08\n\x04TRUE\x10\x00\x12\t\n\x05\x46\x41LSE\x10\x01\x12\x08\n\x04\x41UTO\x10\x02\"Q\n,ListconfigsConfigsAnnounceaddrdiscoveredport\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x1eListconfigsConfigsEncryptedhsm\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1dListconfigsConfigsRpcfilemode\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"?\n\x1aListconfigsConfigsLoglevel\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsLogprefix\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x19ListconfigsConfigsLogfile\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"E\n\x1fListconfigsConfigsLogtimestamps\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n\x1fListconfigsConfigsForcefeerates\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1bListconfigsConfigsSubdaemon\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"f\n\'ListconfigsConfigsFetchinvoicenoconnect\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"I\n$ListconfigsConfigsAccepthtlctlvtypes\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"I\n$ListconfigsConfigsTorservicepassword\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsAnnounceaddrdns\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"N\n(ListconfigsConfigsRequireconfirmedinputs\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCommitfee\x12\x11\n\tvalue_int\x18\x01 \x01(\x04\x12\x0e\n\x06source\x18\x02 \x01(\t\"J\n%ListconfigsConfigsCommitfeerateoffset\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"r\n\x12ListconfigsPlugins\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x34\n\x07options\x18\x03 \x01(\x0b\x32\x1e.cln.ListconfigsPluginsOptionsH\x00\x88\x01\x01\x42\n\n\x08_options\"\x1b\n\x19ListconfigsPluginsOptions\"\x84\x01\n\x1bListconfigsImportantplugins\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12=\n\x07options\x18\x03 \x01(\x0b\x32\'.cln.ListconfigsImportantpluginsOptionsH\x00\x88\x01\x01\x42\n\n\x08_options\"$\n\"ListconfigsImportantpluginsOptions\"\r\n\x0bStopRequest\"q\n\x0cStopResponse\x12\x31\n\x06result\x18\x01 \x01(\x0e\x32\x1c.cln.StopResponse.StopResultH\x00\x88\x01\x01\"#\n\nStopResult\x12\x15\n\x11SHUTDOWN_COMPLETE\x10\x00\x42\t\n\x07_result\"/\n\x0bHelpRequest\x12\x14\n\x07\x63ommand\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_command\"\x95\x01\n\x0cHelpResponse\x12\x1b\n\x04help\x18\x01 \x03(\x0b\x32\r.cln.HelpHelp\x12:\n\x0b\x66ormat_hint\x18\x02 \x01(\x0e\x32 .cln.HelpResponse.HelpFormathintH\x00\x88\x01\x01\"\x1c\n\x0eHelpFormathint\x12\n\n\x06SIMPLE\x10\x00\x42\x0e\n\x0c_format_hint\"S\n\x08HelpHelp\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x10\n\x08\x63\x61tegory\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x0f\n\x07verbose\x18\x04 \x01(\t\"g\n\x18PreapprovekeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"\x1b\n\x19PreapprovekeysendResponse\"*\n\x18PreapproveinvoiceRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"\x1b\n\x19PreapproveinvoiceResponse\"\x15\n\x13StaticbackupRequest\"#\n\x14StaticbackupResponse\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"d\n\x16\x42kprchannelsapyRequest\x12\x17\n\nstart_time\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\r\n\x0b_start_timeB\x0b\n\t_end_time\"Q\n\x17\x42kprchannelsapyResponse\x12\x36\n\x0c\x63hannels_apy\x18\x01 \x03(\x0b\x32 .cln.BkprchannelsapyChannels_apy\"\xfa\x06\n\x1b\x42kprchannelsapyChannels_apy\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12$\n\x0frouted_out_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0erouted_in_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12(\n\x13lease_fee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12*\n\x15lease_fee_earned_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x0fpushed_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0epushed_in_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x16our_start_balance_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12/\n\x1a\x63hannel_start_balance_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\rfees_out_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x0c\x66\x65\x65s_in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x17\n\x0futilization_out\x18\x0c \x01(\t\x12$\n\x17utilization_out_initial\x18\r \x01(\tH\x01\x88\x01\x01\x12\x16\n\x0eutilization_in\x18\x0e \x01(\t\x12#\n\x16utilization_in_initial\x18\x0f \x01(\tH\x02\x88\x01\x01\x12\x0f\n\x07\x61py_out\x18\x10 \x01(\t\x12\x1c\n\x0f\x61py_out_initial\x18\x11 \x01(\tH\x03\x88\x01\x01\x12\x0e\n\x06\x61py_in\x18\x12 \x01(\t\x12\x1b\n\x0e\x61py_in_initial\x18\x13 \x01(\tH\x04\x88\x01\x01\x12\x11\n\tapy_total\x18\x14 \x01(\t\x12\x1e\n\x11\x61py_total_initial\x18\x15 \x01(\tH\x05\x88\x01\x01\x12\x16\n\tapy_lease\x18\x16 \x01(\tH\x06\x88\x01\x01\x42\x0f\n\r_fees_in_msatB\x1a\n\x18_utilization_out_initialB\x19\n\x17_utilization_in_initialB\x12\n\x10_apy_out_initialB\x11\n\x0f_apy_in_initialB\x14\n\x12_apy_total_initialB\x0c\n\n_apy_lease\"\xd2\x01\n\x18\x42kprdumpincomecsvRequest\x12\x12\n\ncsv_format\x18\x01 \x01(\t\x12\x15\n\x08\x63sv_file\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1d\n\x10\x63onsolidate_fees\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x17\n\nstart_time\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x05 \x01(\x04H\x03\x88\x01\x01\x42\x0b\n\t_csv_fileB\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"\xd6\x01\n\x19\x42kprdumpincomecsvResponse\x12\x10\n\x08\x63sv_file\x18\x01 \x01(\t\x12N\n\ncsv_format\x18\x02 \x01(\x0e\x32:.cln.BkprdumpincomecsvResponse.BkprdumpincomecsvCsv_format\"W\n\x1b\x42kprdumpincomecsvCsv_format\x12\x0f\n\x0b\x43OINTRACKER\x10\x00\x12\n\n\x06KOINLY\x10\x01\x12\x0b\n\x07HARMONY\x10\x02\x12\x0e\n\nQUICKBOOKS\x10\x03\"%\n\x12\x42kprinspectRequest\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\"7\n\x13\x42kprinspectResponse\x12 \n\x03txs\x18\x01 \x03(\x0b\x32\x13.cln.BkprinspectTxs\"\x9a\x01\n\x0e\x42kprinspectTxs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x18\n\x0b\x62lockheight\x18\x02 \x01(\rH\x00\x88\x01\x01\x12#\n\x0e\x66\x65\x65s_paid_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x07outputs\x18\x04 \x03(\x0b\x32\x1a.cln.BkprinspectTxsOutputsB\x0e\n\x0c_blockheight\"\xbc\x03\n\x15\x42kprinspectTxsOutputs\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12&\n\x11output_value_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x04 \x01(\t\x12%\n\x0b\x63redit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12$\n\ndebit_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12 \n\x13originating_account\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x17\n\noutput_tag\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tspend_tag\x18\t \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rspending_txid\x18\n \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x42\x0e\n\x0c_credit_msatB\r\n\x0b_debit_msatB\x16\n\x14_originating_accountB\r\n\x0b_output_tagB\x0c\n\n_spend_tagB\x10\n\x0e_spending_txidB\r\n\x0b_payment_id\"@\n\x1c\x42kprlistaccounteventsRequest\x12\x14\n\x07\x61\x63\x63ount\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_account\"Q\n\x1d\x42kprlistaccounteventsResponse\x12\x30\n\x06\x65vents\x18\x01 \x03(\x0b\x32 .cln.BkprlistaccounteventsEvents\"\xa1\x05\n\x1b\x42kprlistaccounteventsEvents\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12S\n\titem_type\x18\x02 \x01(\x0e\x32@.cln.BkprlistaccounteventsEvents.BkprlistaccounteventsEventsType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\t \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\n \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x05\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x07\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x08\x88\x01\x01\"J\n\x1f\x42kprlistaccounteventsEventsType\x12\x0f\n\x0bONCHAIN_FEE\x10\x00\x12\t\n\x05\x43HAIN\x10\x01\x12\x0b\n\x07\x43HANNEL\x10\x02\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0e\n\x0c_descriptionB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_id\"\x19\n\x17\x42kprlistbalancesRequest\"K\n\x18\x42kprlistbalancesResponse\x12/\n\x08\x61\x63\x63ounts\x18\x01 \x03(\x0b\x32\x1d.cln.BkprlistbalancesAccounts\"\xc6\x02\n\x18\x42kprlistbalancesAccounts\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x37\n\x08\x62\x61lances\x18\x02 \x03(\x0b\x32%.cln.BkprlistbalancesAccountsBalances\x12\x14\n\x07peer_id\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x16\n\twe_opened\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x1b\n\x0e\x61\x63\x63ount_closed\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x1d\n\x10\x61\x63\x63ount_resolved\x18\x06 \x01(\x08H\x03\x88\x01\x01\x12\x1e\n\x11resolved_at_block\x18\x07 \x01(\rH\x04\x88\x01\x01\x42\n\n\x08_peer_idB\x0c\n\n_we_openedB\x11\n\x0f_account_closedB\x13\n\x11_account_resolvedB\x14\n\x12_resolved_at_block\"X\n BkprlistbalancesAccountsBalances\x12!\n\x0c\x62\x61lance_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\tcoin_type\x18\x02 \x01(\t\"\x97\x01\n\x15\x42kprlistincomeRequest\x12\x1d\n\x10\x63onsolidate_fees\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x17\n\nstart_time\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x03 \x01(\rH\x02\x88\x01\x01\x42\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"Q\n\x16\x42kprlistincomeResponse\x12\x37\n\rincome_events\x18\x01 \x03(\x0b\x32 .cln.BkprlistincomeIncome_events\"\xb5\x02\n\x1b\x42kprlistincomeIncome_events\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0b\n\x03tag\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x05 \x01(\t\x12\x11\n\ttimestamp\x18\x06 \x01(\r\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\n \x01(\x0cH\x03\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_outpointB\x07\n\x05_txidB\r\n\x0b_payment_id\"N\n\x14\x42lacklistruneRequest\x12\x12\n\x05start\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_end\"G\n\x15\x42lacklistruneResponse\x12.\n\tblacklist\x18\x01 \x03(\x0b\x32\x1b.cln.BlacklistruneBlacklist\"4\n\x16\x42lacklistruneBlacklist\x12\r\n\x05start\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\"p\n\x10\x43heckruneRequest\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x13\n\x06nodeid\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06method\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0e\n\x06params\x18\x04 \x03(\tB\t\n\x07_nodeidB\t\n\x07_method\"\"\n\x11\x43heckruneResponse\x12\r\n\x05valid\x18\x01 \x01(\x08\"E\n\x11\x43reateruneRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0crestrictions\x18\x02 \x03(\tB\x07\n\x05_rune\"{\n\x12\x43reateruneResponse\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12&\n\x19warning_unrestricted_rune\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x1c\n\x1a_warning_unrestricted_rune\".\n\x10ShowrunesRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_rune\"7\n\x11ShowrunesResponse\x12\"\n\x05runes\x18\x01 \x03(\x0b\x32\x13.cln.ShowrunesRunes\"\x9d\x02\n\x0eShowrunesRunes\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x35\n\x0crestrictions\x18\x03 \x03(\x0b\x32\x1f.cln.ShowrunesRunesRestrictions\x12\x1f\n\x17restrictions_as_english\x18\x04 \x01(\t\x12\x13\n\x06stored\x18\x05 \x01(\x08H\x00\x88\x01\x01\x12\x18\n\x0b\x62lacklisted\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tlast_used\x18\x07 \x01(\x01H\x02\x88\x01\x01\x12\x15\n\x08our_rune\x18\x08 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_storedB\x0e\n\x0c_blacklistedB\x0c\n\n_last_usedB\x0b\n\t_our_rune\"p\n\x1aShowrunesRunesRestrictions\x12\x41\n\x0c\x61lternatives\x18\x01 \x03(\x0b\x32+.cln.ShowrunesRunesRestrictionsAlternatives\x12\x0f\n\x07\x65nglish\x18\x02 \x01(\t\"n\n&ShowrunesRunesRestrictionsAlternatives\x12\x11\n\tfieldname\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x11\n\tcondition\x18\x03 \x01(\t\x12\x0f\n\x07\x65nglish\x18\x04 \x01(\t\"\x19\n\x17StreamBlockAddedRequest\"6\n\x16\x42lockAddedNotification\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\x0e\n\x06height\x18\x02 \x01(\r\" \n\x1eStreamChannelOpenFailedRequest\"3\n\x1d\x43hannelOpenFailedNotification\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"\x1c\n\x1aStreamChannelOpenedRequest\"w\n\x19\x43hannelOpenedNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12!\n\x0c\x66unding_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\x12\x15\n\rchannel_ready\x18\x04 \x01(\x08\"\x16\n\x14StreamConnectRequest\"\xbe\x01\n\x17PeerConnectNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x44\n\tdirection\x18\x02 \x01(\x0e\x32\x31.cln.PeerConnectNotification.PeerConnectDirection\x12(\n\x07\x61\x64\x64ress\x18\x03 \x01(\x0b\x32\x17.cln.PeerConnectAddress\"\'\n\x14PeerConnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\x8b\x02\n\x12PeerConnectAddress\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.PeerConnectAddress.PeerConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"T\n\x16PeerConnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"\x18\n\x16StreamCustomMsgRequest\"9\n\x15\x43ustomMsgNotification\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x32\xcb?\n\x04Node\x12\x36\n\x07Getinfo\x12\x13.cln.GetinfoRequest\x1a\x14.cln.GetinfoResponse\"\x00\x12<\n\tListPeers\x12\x15.cln.ListpeersRequest\x1a\x16.cln.ListpeersResponse\"\x00\x12<\n\tListFunds\x12\x15.cln.ListfundsRequest\x1a\x16.cln.ListfundsResponse\"\x00\x12\x36\n\x07SendPay\x12\x13.cln.SendpayRequest\x1a\x14.cln.SendpayResponse\"\x00\x12\x45\n\x0cListChannels\x12\x18.cln.ListchannelsRequest\x1a\x19.cln.ListchannelsResponse\"\x00\x12<\n\tAddGossip\x12\x15.cln.AddgossipRequest\x1a\x16.cln.AddgossipResponse\"\x00\x12H\n\rAddPsbtOutput\x12\x19.cln.AddpsbtoutputRequest\x1a\x1a.cln.AddpsbtoutputResponse\"\x00\x12H\n\rAutoCleanOnce\x12\x19.cln.AutocleanonceRequest\x1a\x1a.cln.AutocleanonceResponse\"\x00\x12N\n\x0f\x41utoCleanStatus\x12\x1b.cln.AutocleanstatusRequest\x1a\x1c.cln.AutocleanstatusResponse\"\x00\x12\x45\n\x0c\x43heckMessage\x12\x18.cln.CheckmessageRequest\x1a\x19.cln.CheckmessageResponse\"\x00\x12\x30\n\x05\x43lose\x12\x11.cln.CloseRequest\x1a\x12.cln.CloseResponse\"\x00\x12:\n\x0b\x43onnectPeer\x12\x13.cln.ConnectRequest\x1a\x14.cln.ConnectResponse\"\x00\x12H\n\rCreateInvoice\x12\x19.cln.CreateinvoiceRequest\x1a\x1a.cln.CreateinvoiceResponse\"\x00\x12<\n\tDatastore\x12\x15.cln.DatastoreRequest\x1a\x16.cln.DatastoreResponse\"\x00\x12K\n\x0e\x44\x61tastoreUsage\x12\x1a.cln.DatastoreusageRequest\x1a\x1b.cln.DatastoreusageResponse\"\x00\x12\x42\n\x0b\x43reateOnion\x12\x17.cln.CreateonionRequest\x1a\x18.cln.CreateonionResponse\"\x00\x12\x45\n\x0c\x44\x65lDatastore\x12\x18.cln.DeldatastoreRequest\x1a\x19.cln.DeldatastoreResponse\"\x00\x12?\n\nDelInvoice\x12\x16.cln.DelinvoiceRequest\x1a\x17.cln.DelinvoiceResponse\"\x00\x12Q\n\x10\x44\x65vForgetChannel\x12\x1c.cln.DevforgetchannelRequest\x1a\x1d.cln.DevforgetchannelResponse\"\x00\x12Q\n\x10\x45mergencyRecover\x12\x1c.cln.EmergencyrecoverRequest\x1a\x1d.cln.EmergencyrecoverResponse\"\x00\x12\x36\n\x07Recover\x12\x13.cln.RecoverRequest\x1a\x14.cln.RecoverResponse\"\x00\x12K\n\x0eRecoverChannel\x12\x1a.cln.RecoverchannelRequest\x1a\x1b.cln.RecoverchannelResponse\"\x00\x12\x36\n\x07Invoice\x12\x13.cln.InvoiceRequest\x1a\x14.cln.InvoiceResponse\"\x00\x12Q\n\x14\x43reateInvoiceRequest\x12\x1a.cln.InvoicerequestRequest\x1a\x1b.cln.InvoicerequestResponse\"\x00\x12`\n\x15\x44isableInvoiceRequest\x12!.cln.DisableinvoicerequestRequest\x1a\".cln.DisableinvoicerequestResponse\"\x00\x12Z\n\x13ListInvoiceRequests\x12\x1f.cln.ListinvoicerequestsRequest\x1a .cln.ListinvoicerequestsResponse\"\x00\x12H\n\rListDatastore\x12\x19.cln.ListdatastoreRequest\x1a\x1a.cln.ListdatastoreResponse\"\x00\x12\x45\n\x0cListInvoices\x12\x18.cln.ListinvoicesRequest\x1a\x19.cln.ListinvoicesResponse\"\x00\x12<\n\tSendOnion\x12\x15.cln.SendonionRequest\x1a\x16.cln.SendonionResponse\"\x00\x12\x45\n\x0cListSendPays\x12\x18.cln.ListsendpaysRequest\x1a\x19.cln.ListsendpaysResponse\"\x00\x12Q\n\x10ListTransactions\x12\x1c.cln.ListtransactionsRequest\x1a\x1d.cln.ListtransactionsResponse\"\x00\x12?\n\nMakeSecret\x12\x16.cln.MakesecretRequest\x1a\x17.cln.MakesecretResponse\"\x00\x12*\n\x03Pay\x12\x0f.cln.PayRequest\x1a\x10.cln.PayResponse\"\x00\x12<\n\tListNodes\x12\x15.cln.ListnodesRequest\x1a\x16.cln.ListnodesResponse\"\x00\x12K\n\x0eWaitAnyInvoice\x12\x1a.cln.WaitanyinvoiceRequest\x1a\x1b.cln.WaitanyinvoiceResponse\"\x00\x12\x42\n\x0bWaitInvoice\x12\x17.cln.WaitinvoiceRequest\x1a\x18.cln.WaitinvoiceResponse\"\x00\x12\x42\n\x0bWaitSendPay\x12\x17.cln.WaitsendpayRequest\x1a\x18.cln.WaitsendpayResponse\"\x00\x12\x36\n\x07NewAddr\x12\x13.cln.NewaddrRequest\x1a\x14.cln.NewaddrResponse\"\x00\x12\x39\n\x08Withdraw\x12\x14.cln.WithdrawRequest\x1a\x15.cln.WithdrawResponse\"\x00\x12\x36\n\x07KeySend\x12\x13.cln.KeysendRequest\x1a\x14.cln.KeysendResponse\"\x00\x12\x39\n\x08\x46undPsbt\x12\x14.cln.FundpsbtRequest\x1a\x15.cln.FundpsbtResponse\"\x00\x12\x39\n\x08SendPsbt\x12\x14.cln.SendpsbtRequest\x1a\x15.cln.SendpsbtResponse\"\x00\x12\x39\n\x08SignPsbt\x12\x14.cln.SignpsbtRequest\x1a\x15.cln.SignpsbtResponse\"\x00\x12\x39\n\x08UtxoPsbt\x12\x14.cln.UtxopsbtRequest\x1a\x15.cln.UtxopsbtResponse\"\x00\x12<\n\tTxDiscard\x12\x15.cln.TxdiscardRequest\x1a\x16.cln.TxdiscardResponse\"\x00\x12<\n\tTxPrepare\x12\x15.cln.TxprepareRequest\x1a\x16.cln.TxprepareResponse\"\x00\x12\x33\n\x06TxSend\x12\x12.cln.TxsendRequest\x1a\x13.cln.TxsendResponse\"\x00\x12Q\n\x10ListPeerChannels\x12\x1c.cln.ListpeerchannelsRequest\x1a\x1d.cln.ListpeerchannelsResponse\"\x00\x12W\n\x12ListClosedChannels\x12\x1e.cln.ListclosedchannelsRequest\x1a\x1f.cln.ListclosedchannelsResponse\"\x00\x12<\n\tDecodePay\x12\x15.cln.DecodepayRequest\x1a\x16.cln.DecodepayResponse\"\x00\x12\x33\n\x06\x44\x65\x63ode\x12\x12.cln.DecodeRequest\x1a\x13.cln.DecodeResponse\"\x00\x12\x33\n\x06\x44\x65lPay\x12\x12.cln.DelpayRequest\x1a\x13.cln.DelpayResponse\"\x00\x12?\n\nDelForward\x12\x16.cln.DelforwardRequest\x1a\x17.cln.DelforwardResponse\"\x00\x12\x45\n\x0c\x44isableOffer\x12\x18.cln.DisableofferRequest\x1a\x19.cln.DisableofferResponse\"\x00\x12?\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\x45\n\x0c\x46\x65tchInvoice\x12\x18.cln.FetchinvoiceRequest\x1a\x19.cln.FetchinvoiceResponse\"\x00\x12W\n\x12\x46undChannel_Cancel\x12\x1e.cln.Fundchannel_cancelRequest\x1a\x1f.cln.Fundchannel_cancelResponse\"\x00\x12]\n\x14\x46undChannel_Complete\x12 .cln.Fundchannel_completeRequest\x1a!.cln.Fundchannel_completeResponse\"\x00\x12\x42\n\x0b\x46undChannel\x12\x17.cln.FundchannelRequest\x1a\x18.cln.FundchannelResponse\"\x00\x12T\n\x11\x46undChannel_Start\x12\x1d.cln.Fundchannel_startRequest\x1a\x1e.cln.Fundchannel_startResponse\"\x00\x12\x33\n\x06GetLog\x12\x12.cln.GetlogRequest\x1a\x13.cln.GetlogResponse\"\x00\x12\x45\n\x0c\x46underUpdate\x12\x18.cln.FunderupdateRequest\x1a\x19.cln.FunderupdateResponse\"\x00\x12\x39\n\x08GetRoute\x12\x14.cln.GetrouteRequest\x1a\x15.cln.GetrouteResponse\"\x00\x12\x45\n\x0cListForwards\x12\x18.cln.ListforwardsRequest\x1a\x19.cln.ListforwardsResponse\"\x00\x12?\n\nListOffers\x12\x16.cln.ListoffersRequest\x1a\x17.cln.ListoffersResponse\"\x00\x12\x39\n\x08ListPays\x12\x14.cln.ListpaysRequest\x1a\x15.cln.ListpaysResponse\"\x00\x12<\n\tListHtlcs\x12\x15.cln.ListhtlcsRequest\x1a\x16.cln.ListhtlcsResponse\"\x00\x12Q\n\x10MultiFundChannel\x12\x1c.cln.MultifundchannelRequest\x1a\x1d.cln.MultifundchannelResponse\"\x00\x12H\n\rMultiWithdraw\x12\x19.cln.MultiwithdrawRequest\x1a\x1a.cln.MultiwithdrawResponse\"\x00\x12\x30\n\x05Offer\x12\x11.cln.OfferRequest\x1a\x12.cln.OfferResponse\"\x00\x12T\n\x11OpenChannel_Abort\x12\x1d.cln.Openchannel_abortRequest\x1a\x1e.cln.Openchannel_abortResponse\"\x00\x12Q\n\x10OpenChannel_Bump\x12\x1c.cln.Openchannel_bumpRequest\x1a\x1d.cln.Openchannel_bumpResponse\"\x00\x12Q\n\x10OpenChannel_Init\x12\x1c.cln.Openchannel_initRequest\x1a\x1d.cln.Openchannel_initResponse\"\x00\x12W\n\x12OpenChannel_Signed\x12\x1e.cln.Openchannel_signedRequest\x1a\x1f.cln.Openchannel_signedResponse\"\x00\x12W\n\x12OpenChannel_Update\x12\x1e.cln.Openchannel_updateRequest\x1a\x1f.cln.Openchannel_updateResponse\"\x00\x12-\n\x04Ping\x12\x10.cln.PingRequest\x1a\x11.cln.PingResponse\"\x00\x12\x33\n\x06Plugin\x12\x12.cln.PluginRequest\x1a\x13.cln.PluginResponse\"\x00\x12H\n\rRenePayStatus\x12\x19.cln.RenepaystatusRequest\x1a\x1a.cln.RenepaystatusResponse\"\x00\x12\x36\n\x07RenePay\x12\x13.cln.RenepayRequest\x1a\x14.cln.RenepayResponse\"\x00\x12H\n\rReserveInputs\x12\x19.cln.ReserveinputsRequest\x1a\x1a.cln.ReserveinputsResponse\"\x00\x12H\n\rSendCustomMsg\x12\x19.cln.SendcustommsgRequest\x1a\x1a.cln.SendcustommsgResponse\"\x00\x12\x42\n\x0bSendInvoice\x12\x17.cln.SendinvoiceRequest\x1a\x18.cln.SendinvoiceResponse\"\x00\x12?\n\nSetChannel\x12\x16.cln.SetchannelRequest\x1a\x17.cln.SetchannelResponse\"\x00\x12<\n\tSetConfig\x12\x15.cln.SetconfigRequest\x1a\x16.cln.SetconfigResponse\"\x00\x12K\n\x0eSetPsbtVersion\x12\x1a.cln.SetpsbtversionRequest\x1a\x1b.cln.SetpsbtversionResponse\"\x00\x12\x42\n\x0bSignInvoice\x12\x17.cln.SigninvoiceRequest\x1a\x18.cln.SigninvoiceResponse\"\x00\x12\x42\n\x0bSignMessage\x12\x17.cln.SignmessageRequest\x1a\x18.cln.SignmessageResponse\"\x00\x12\x42\n\x0bSplice_Init\x12\x17.cln.Splice_initRequest\x1a\x18.cln.Splice_initResponse\"\x00\x12H\n\rSplice_Signed\x12\x19.cln.Splice_signedRequest\x1a\x1a.cln.Splice_signedResponse\"\x00\x12H\n\rSplice_Update\x12\x19.cln.Splice_updateRequest\x1a\x1a.cln.Splice_updateResponse\"\x00\x12N\n\x0fUnreserveInputs\x12\x1b.cln.UnreserveinputsRequest\x1a\x1c.cln.UnreserveinputsResponse\"\x00\x12H\n\rUpgradeWallet\x12\x19.cln.UpgradewalletRequest\x1a\x1a.cln.UpgradewalletResponse\"\x00\x12N\n\x0fWaitBlockHeight\x12\x1b.cln.WaitblockheightRequest\x1a\x1c.cln.WaitblockheightResponse\"\x00\x12-\n\x04Wait\x12\x10.cln.WaitRequest\x1a\x11.cln.WaitResponse\"\x00\x12\x42\n\x0bListConfigs\x12\x17.cln.ListconfigsRequest\x1a\x18.cln.ListconfigsResponse\"\x00\x12-\n\x04Stop\x12\x10.cln.StopRequest\x1a\x11.cln.StopResponse\"\x00\x12-\n\x04Help\x12\x10.cln.HelpRequest\x1a\x11.cln.HelpResponse\"\x00\x12T\n\x11PreApproveKeysend\x12\x1d.cln.PreapprovekeysendRequest\x1a\x1e.cln.PreapprovekeysendResponse\"\x00\x12T\n\x11PreApproveInvoice\x12\x1d.cln.PreapproveinvoiceRequest\x1a\x1e.cln.PreapproveinvoiceResponse\"\x00\x12\x45\n\x0cStaticBackup\x12\x18.cln.StaticbackupRequest\x1a\x19.cln.StaticbackupResponse\"\x00\x12N\n\x0f\x42kprChannelsApy\x12\x1b.cln.BkprchannelsapyRequest\x1a\x1c.cln.BkprchannelsapyResponse\"\x00\x12T\n\x11\x42kprDumpIncomeCsv\x12\x1d.cln.BkprdumpincomecsvRequest\x1a\x1e.cln.BkprdumpincomecsvResponse\"\x00\x12\x42\n\x0b\x42kprInspect\x12\x17.cln.BkprinspectRequest\x1a\x18.cln.BkprinspectResponse\"\x00\x12`\n\x15\x42kprListAccountEvents\x12!.cln.BkprlistaccounteventsRequest\x1a\".cln.BkprlistaccounteventsResponse\"\x00\x12Q\n\x10\x42kprListBalances\x12\x1c.cln.BkprlistbalancesRequest\x1a\x1d.cln.BkprlistbalancesResponse\"\x00\x12K\n\x0e\x42kprListIncome\x12\x1a.cln.BkprlistincomeRequest\x1a\x1b.cln.BkprlistincomeResponse\"\x00\x12H\n\rBlacklistRune\x12\x19.cln.BlacklistruneRequest\x1a\x1a.cln.BlacklistruneResponse\"\x00\x12<\n\tCheckRune\x12\x15.cln.CheckruneRequest\x1a\x16.cln.CheckruneResponse\"\x00\x12?\n\nCreateRune\x12\x16.cln.CreateruneRequest\x1a\x17.cln.CreateruneResponse\"\x00\x12<\n\tShowRunes\x12\x15.cln.ShowrunesRequest\x1a\x16.cln.ShowrunesResponse\"\x00\x12T\n\x13SubscribeBlockAdded\x12\x1c.cln.StreamBlockAddedRequest\x1a\x1b.cln.BlockAddedNotification\"\x00\x30\x01\x12i\n\x1aSubscribeChannelOpenFailed\x12#.cln.StreamChannelOpenFailedRequest\x1a\".cln.ChannelOpenFailedNotification\"\x00\x30\x01\x12]\n\x16SubscribeChannelOpened\x12\x1f.cln.StreamChannelOpenedRequest\x1a\x1e.cln.ChannelOpenedNotification\"\x00\x30\x01\x12O\n\x10SubscribeConnect\x12\x19.cln.StreamConnectRequest\x1a\x1c.cln.PeerConnectNotification\"\x00\x30\x01\x12Q\n\x12SubscribeCustomMsg\x12\x1b.cln.StreamCustomMsgRequest\x1a\x1a.cln.CustomMsgNotification\"\x00\x30\x01\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\"\xac\x02\n\x0eGetinfoBinding\x12\x39\n\titem_type\x18\x01 \x01(\x0e\x32&.cln.GetinfoBinding.GetinfoBindingType\x12\x14\n\x07\x61\x64\x64ress\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04port\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06socket\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07subtype\x18\x05 \x01(\tH\x03\x88\x01\x01\"_\n\x12GetinfoBindingType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x12\r\n\tWEBSOCKET\x10\x05\x42\n\n\x08_addressB\x07\n\x05_portB\t\n\x07_socketB\n\n\x08_subtype\"\xb5\x01\n\x10ListpeersRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x38\n\x05level\x18\x02 \x01(\x0e\x32$.cln.ListpeersRequest.ListpeersLevelH\x01\x88\x01\x01\"E\n\x0eListpeersLevel\x12\x06\n\x02IO\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\x0b\n\x07UNUSUAL\x10\x03\x12\t\n\x05TRACE\x10\x04\x42\x05\n\x03_idB\x08\n\x06_level\"7\n\x11ListpeersResponse\x12\"\n\x05peers\x18\x01 \x03(\x0b\x32\x13.cln.ListpeersPeers\"\xdf\x01\n\x0eListpeersPeers\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x11\n\tconnected\x18\x02 \x01(\x08\x12#\n\x03log\x18\x03 \x03(\x0b\x32\x16.cln.ListpeersPeersLog\x12\x0f\n\x07netaddr\x18\x05 \x03(\t\x12\x15\n\x08\x66\x65\x61tures\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0bremote_addr\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0cnum_channels\x18\x08 \x01(\rH\x02\x88\x01\x01\x42\x0b\n\t_featuresB\x0e\n\x0c_remote_addrB\x0f\n\r_num_channels\"\x88\x03\n\x11ListpeersPeersLog\x12?\n\titem_type\x18\x01 \x01(\x0e\x32,.cln.ListpeersPeersLog.ListpeersPeersLogType\x12\x18\n\x0bnum_skipped\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04time\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03log\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07node_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x11\n\x04\x64\x61ta\x18\x07 \x01(\x0cH\x05\x88\x01\x01\"t\n\x15ListpeersPeersLogType\x12\x0b\n\x07SKIPPED\x10\x00\x12\n\n\x06\x42ROKEN\x10\x01\x12\x0b\n\x07UNUSUAL\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\t\n\x05IO_IN\x10\x05\x12\n\n\x06IO_OUT\x10\x06\x12\t\n\x05TRACE\x10\x07\x42\x0e\n\x0c_num_skippedB\x07\n\x05_timeB\t\n\x07_sourceB\x06\n\x04_logB\n\n\x08_node_idB\x07\n\x05_data\"0\n\x10ListfundsRequest\x12\x12\n\x05spent\x18\x01 \x01(\x08H\x00\x88\x01\x01\x42\x08\n\x06_spent\"e\n\x11ListfundsResponse\x12&\n\x07outputs\x18\x01 \x03(\x0b\x32\x15.cln.ListfundsOutputs\x12(\n\x08\x63hannels\x18\x02 \x03(\x0b\x32\x16.cln.ListfundsChannels\"\xb9\x03\n\x10ListfundsOutputs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06output\x18\x02 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0cscriptpubkey\x18\x04 \x01(\x0c\x12\x14\n\x07\x61\x64\x64ress\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0credeemscript\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12<\n\x06status\x18\x07 \x01(\x0e\x32,.cln.ListfundsOutputs.ListfundsOutputsStatus\x12\x18\n\x0b\x62lockheight\x18\x08 \x01(\rH\x02\x88\x01\x01\x12\x10\n\x08reserved\x18\t \x01(\x08\x12\x1e\n\x11reserved_to_block\x18\n \x01(\rH\x03\x88\x01\x01\"Q\n\x16ListfundsOutputsStatus\x12\x0f\n\x0bUNCONFIRMED\x10\x00\x12\r\n\tCONFIRMED\x10\x01\x12\t\n\x05SPENT\x10\x02\x12\x0c\n\x08IMMATURE\x10\x03\x42\n\n\x08_addressB\x0f\n\r_redeemscriptB\x0e\n\x0c_blockheightB\x14\n\x12_reserved_to_block\"\xab\x02\n\x11ListfundsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12$\n\x0four_amount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x04 \x01(\x0c\x12\x16\n\x0e\x66unding_output\x18\x05 \x01(\r\x12\x11\n\tconnected\x18\x06 \x01(\x08\x12 \n\x05state\x18\x07 \x01(\x0e\x32\x11.cln.ChannelState\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nchannel_id\x18\t \x01(\x0cH\x01\x88\x01\x01\x42\x13\n\x11_short_channel_idB\r\n\x0b_channel_id\"\xbb\x03\n\x0eSendpayRequest\x12 \n\x05route\x18\x01 \x03(\x0b\x32\x11.cln.SendpayRoute\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0epayment_secret\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x13\n\x06partid\x18\x07 \x01(\x04H\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\t \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\x0c \x01(\x0cH\x07\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x08\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_bolt11B\x11\n\x0f_payment_secretB\t\n\x07_partidB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x13\n\x11_payment_metadataB\x0e\n\x0c_description\"\xad\x05\n\x0fSendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x32\n\x06status\x18\x04 \x01(\x0e\x32\".cln.SendpayResponse.SendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x14\n\x07message\x18\x0e \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0f \x01(\x04H\t\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\x0b\x88\x01\x01\"*\n\rSendpayStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\x0f\n\r_completed_atB\x10\n\x0e_created_indexB\x10\n\x0e_updated_index\"\\\n\x0cSendpayRoute\x12\n\n\x02id\x18\x02 \x01(\x0c\x12\r\n\x05\x64\x65lay\x18\x03 \x01(\r\x12\x0f\n\x07\x63hannel\x18\x04 \x01(\t\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\"\x93\x01\n\x13ListchannelsRequest\x12\x1d\n\x10short_channel_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06source\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\t\n\x07_sourceB\x0e\n\x0c_destination\"C\n\x14ListchannelsResponse\x12+\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x19.cln.ListchannelsChannels\"\xb3\x03\n\x14ListchannelsChannels\x12\x0e\n\x06source\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x65stination\x18\x02 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x03 \x01(\t\x12\x0e\n\x06public\x18\x04 \x01(\x08\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\rmessage_flags\x18\x06 \x01(\r\x12\x15\n\rchannel_flags\x18\x07 \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x08 \x01(\x08\x12\x13\n\x0blast_update\x18\t \x01(\r\x12\x1d\n\x15\x62\x61se_fee_millisatoshi\x18\n \x01(\r\x12\x19\n\x11\x66\x65\x65_per_millionth\x18\x0b \x01(\r\x12\r\n\x05\x64\x65lay\x18\x0c \x01(\r\x12&\n\x11htlc_minimum_msat\x18\r \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x11htlc_maximum_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x10\n\x08\x66\x65\x61tures\x18\x0f \x01(\x0c\x12\x11\n\tdirection\x18\x10 \x01(\rB\x14\n\x12_htlc_maximum_msat\"#\n\x10\x41\x64\x64gossipRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x13\n\x11\x41\x64\x64gossipResponse\"\xac\x01\n\x14\x41\x64\x64psbtoutputRequest\x12\x1c\n\x07satoshi\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x15\n\x08locktime\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_locktimeB\x0e\n\x0c_initialpsbtB\x0e\n\x0c_destination\"U\n\x15\x41\x64\x64psbtoutputResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1e\n\x16\x65stimated_added_weight\x18\x02 \x01(\r\x12\x0e\n\x06outnum\x18\x03 \x01(\r\"O\n\x14\x41utocleanonceRequest\x12*\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystem\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x04\"G\n\x15\x41utocleanonceResponse\x12.\n\tautoclean\x18\x01 \x01(\x0b\x32\x1b.cln.AutocleanonceAutoclean\"\xb1\x04\n\x16\x41utocleanonceAutoclean\x12L\n\x11succeededforwards\x18\x01 \x01(\x0b\x32,.cln.AutocleanonceAutocleanSucceededforwardsH\x00\x88\x01\x01\x12\x46\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32).cln.AutocleanonceAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x44\n\rsucceededpays\x18\x03 \x01(\x0b\x32(.cln.AutocleanonceAutocleanSucceededpaysH\x02\x88\x01\x01\x12>\n\nfailedpays\x18\x04 \x01(\x0b\x32%.cln.AutocleanonceAutocleanFailedpaysH\x03\x88\x01\x01\x12\x42\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32\'.cln.AutocleanonceAutocleanPaidinvoicesH\x04\x88\x01\x01\x12H\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32*.cln.AutocleanonceAutocleanExpiredinvoicesH\x05\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoices\"M\n\'AutocleanonceAutocleanSucceededforwards\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"J\n$AutocleanonceAutocleanFailedforwards\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"I\n#AutocleanonceAutocleanSucceededpays\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"F\n AutocleanonceAutocleanFailedpays\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"H\n\"AutocleanonceAutocleanPaidinvoices\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"K\n%AutocleanonceAutocleanExpiredinvoices\x12\x0f\n\x07\x63leaned\x18\x01 \x01(\x04\x12\x11\n\tuncleaned\x18\x02 \x01(\x04\"W\n\x16\x41utocleanstatusRequest\x12/\n\tsubsystem\x18\x01 \x01(\x0e\x32\x17.cln.AutocleanSubsystemH\x00\x88\x01\x01\x42\x0c\n\n_subsystem\"K\n\x17\x41utocleanstatusResponse\x12\x30\n\tautoclean\x18\x01 \x01(\x0b\x32\x1d.cln.AutocleanstatusAutoclean\"\xbf\x04\n\x18\x41utocleanstatusAutoclean\x12N\n\x11succeededforwards\x18\x01 \x01(\x0b\x32..cln.AutocleanstatusAutocleanSucceededforwardsH\x00\x88\x01\x01\x12H\n\x0e\x66\x61iledforwards\x18\x02 \x01(\x0b\x32+.cln.AutocleanstatusAutocleanFailedforwardsH\x01\x88\x01\x01\x12\x46\n\rsucceededpays\x18\x03 \x01(\x0b\x32*.cln.AutocleanstatusAutocleanSucceededpaysH\x02\x88\x01\x01\x12@\n\nfailedpays\x18\x04 \x01(\x0b\x32\'.cln.AutocleanstatusAutocleanFailedpaysH\x03\x88\x01\x01\x12\x44\n\x0cpaidinvoices\x18\x05 \x01(\x0b\x32).cln.AutocleanstatusAutocleanPaidinvoicesH\x04\x88\x01\x01\x12J\n\x0f\x65xpiredinvoices\x18\x06 \x01(\x0b\x32,.cln.AutocleanstatusAutocleanExpiredinvoicesH\x05\x88\x01\x01\x42\x14\n\x12_succeededforwardsB\x11\n\x0f_failedforwardsB\x10\n\x0e_succeededpaysB\r\n\x0b_failedpaysB\x0f\n\r_paidinvoicesB\x12\n\x10_expiredinvoices\"g\n)AutocleanstatusAutocleanSucceededforwards\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"d\n&AutocleanstatusAutocleanFailedforwards\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"c\n%AutocleanstatusAutocleanSucceededpays\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"`\n\"AutocleanstatusAutocleanFailedpays\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"b\n$AutocleanstatusAutocleanPaidinvoices\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"e\n\'AutocleanstatusAutocleanExpiredinvoices\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x63leaned\x18\x02 \x01(\x04\x12\x10\n\x03\x61ge\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x06\n\x04_age\"U\n\x13\x43heckmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\r\n\x05zbase\x18\x02 \x01(\t\x12\x13\n\x06pubkey\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x42\t\n\x07_pubkey\"8\n\x14\x43heckmessageResponse\x12\x10\n\x08verified\x18\x01 \x01(\x08\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\"\xcb\x02\n\x0c\x43loseRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1e\n\x11unilateraltimeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x03 \x01(\tH\x01\x88\x01\x01\x12!\n\x14\x66\x65\x65_negotiation_step\x18\x04 \x01(\tH\x02\x88\x01\x01\x12)\n\rwrong_funding\x18\x05 \x01(\x0b\x32\r.cln.OutpointH\x03\x88\x01\x01\x12\x1f\n\x12\x66orce_lease_closed\x18\x06 \x01(\x08H\x04\x88\x01\x01\x12\x1e\n\x08\x66\x65\x65range\x18\x07 \x03(\x0b\x32\x0c.cln.FeerateB\x14\n\x12_unilateraltimeoutB\x0e\n\x0c_destinationB\x17\n\x15_fee_negotiation_stepB\x10\n\x0e_wrong_fundingB\x15\n\x13_force_lease_closed\"\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\"\xfe\x05\n\x15\x43reateinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12>\n\x06status\x18\x06 \x01(\x0e\x32..cln.CreateinvoiceResponse.CreateinvoiceStatus\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x16\n\tpay_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x06\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\x08\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\x12;\n\rpaid_outpoint\x18\x11 \x01(\x0b\x32\x1f.cln.CreateinvoicePaid_outpointH\n\x88\x01\x01\"8\n\x13\x43reateinvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_created_indexB\x10\n\x0e_paid_outpoint\":\n\x1a\x43reateinvoicePaid_outpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xb4\x02\n\x10\x44\x61tastoreRequest\x12\x10\n\x03hex\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x36\n\x04mode\x18\x03 \x01(\x0e\x32#.cln.DatastoreRequest.DatastoreModeH\x01\x88\x01\x01\x12\x17\n\ngeneration\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\t\x12\x13\n\x06string\x18\x06 \x01(\tH\x03\x88\x01\x01\"p\n\rDatastoreMode\x12\x0f\n\x0bMUST_CREATE\x10\x00\x12\x10\n\x0cMUST_REPLACE\x10\x01\x12\x15\n\x11\x43REATE_OR_REPLACE\x10\x02\x12\x0f\n\x0bMUST_APPEND\x10\x03\x12\x14\n\x10\x43REATE_OR_APPEND\x10\x04\x42\x06\n\x04_hexB\x07\n\x05_modeB\r\n\x0b_generationB\t\n\x07_string\"\x82\x01\n\x11\x44\x61tastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"$\n\x15\x44\x61tastoreusageRequest\x12\x0b\n\x03key\x18\x01 \x03(\t\"S\n\x16\x44\x61tastoreusageResponse\x12\x39\n\x0e\x64\x61tastoreusage\x18\x01 \x01(\x0b\x32!.cln.DatastoreusageDatastoreusage\"@\n\x1c\x44\x61tastoreusageDatastoreusage\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x13\n\x0btotal_bytes\x18\x02 \x01(\x04\"\x9d\x01\n\x12\x43reateonionRequest\x12\"\n\x04hops\x18\x01 \x03(\x0b\x32\x14.cln.CreateonionHops\x12\x11\n\tassocdata\x18\x02 \x01(\x0c\x12\x18\n\x0bsession_key\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x17\n\nonion_size\x18\x04 \x01(\rH\x01\x88\x01\x01\x42\x0e\n\x0c_session_keyB\r\n\x0b_onion_size\"<\n\x13\x43reateonionResponse\x12\r\n\x05onion\x18\x01 \x01(\x0c\x12\x16\n\x0eshared_secrets\x18\x02 \x03(\x0c\"2\n\x0f\x43reateonionHops\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"J\n\x13\x44\x65ldatastoreRequest\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x03 \x03(\tB\r\n\x0b_generation\"\x85\x01\n\x14\x44\x65ldatastoreResponse\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x0b\n\x03key\x18\x05 \x03(\tB\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xb6\x01\n\x11\x44\x65linvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\x12\x37\n\x06status\x18\x02 \x01(\x0e\x32\'.cln.DelinvoiceRequest.DelinvoiceStatus\x12\x15\n\x08\x64\x65sconly\x18\x03 \x01(\x08H\x00\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\x0b\n\t_desconly\"\xe6\x05\n\x12\x44\x65linvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x06\x62olt11\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x03 \x01(\tH\x01\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x38\n\x06status\x18\x07 \x01(\x0e\x32(.cln.DelinvoiceResponse.DelinvoiceStatus\x12\x12\n\nexpires_at\x18\x08 \x01(\x04\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x16\n\tpay_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\t\x88\x01\x01\x12\x14\n\x07paid_at\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x11 \x01(\x0cH\x0b\x88\x01\x01\"5\n\x10\x44\x65linvoiceStatus\x12\x08\n\x04PAID\x10\x00\x12\x0b\n\x07\x45XPIRED\x10\x01\x12\n\n\x06UNPAID\x10\x02\x42\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x11\n\x0f_local_offer_idB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\x9f\x01\n\x17\x44\x65vforgetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nchannel_id\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05\x66orce\x18\x04 \x01(\x08H\x02\x88\x01\x01\x42\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x08\n\x06_force\"Y\n\x18\x44\x65vforgetchannelResponse\x12\x0e\n\x06\x66orced\x18\x01 \x01(\x08\x12\x17\n\x0f\x66unding_unspent\x18\x02 \x01(\x08\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\"\x19\n\x17\x45mergencyrecoverRequest\")\n\x18\x45mergencyrecoverResponse\x12\r\n\x05stubs\x18\x01 \x03(\x0c\"#\n\x0eRecoverRequest\x12\x11\n\thsmsecret\x18\x01 \x01(\t\"\x88\x01\n\x0fRecoverResponse\x12\x37\n\x06result\x18\x01 \x01(\x0e\x32\".cln.RecoverResponse.RecoverResultH\x00\x88\x01\x01\"1\n\rRecoverResult\x12 \n\x1cRECOVERY_RESTART_IN_PROGRESS\x10\x00\x42\t\n\x07_result\"$\n\x15RecoverchannelRequest\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"\'\n\x16RecoverchannelResponse\x12\r\n\x05stubs\x18\x01 \x03(\t\"\x99\x02\n\x0eInvoiceRequest\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05label\x18\x03 \x01(\t\x12\x11\n\tfallbacks\x18\x04 \x03(\t\x12\x15\n\x08preimage\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x11\n\x04\x63ltv\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06\x65xpiry\x18\x07 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x15\x65xposeprivatechannels\x18\x08 \x03(\t\x12\x19\n\x0c\x64\x65schashonly\x18\t \x01(\x08H\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x10.cln.AmountOrAnyB\x0b\n\t_preimageB\x07\n\x05_cltvB\t\n\x07_expiryB\x0f\n\r_deschashonly\"\x95\x03\n\x0fInvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x16\n\x0epayment_secret\x18\x03 \x01(\x0c\x12\x12\n\nexpires_at\x18\x04 \x01(\x04\x12\x1d\n\x10warning_capacity\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x0fwarning_offline\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10warning_deadends\x18\x07 \x01(\tH\x02\x88\x01\x01\x12#\n\x16warning_private_unused\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x0bwarning_mpp\x18\t \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rcreated_index\x18\n \x01(\x04H\x05\x88\x01\x01\x42\x13\n\x11_warning_capacityB\x12\n\x10_warning_offlineB\x13\n\x11_warning_deadendsB\x19\n\x17_warning_private_unusedB\x0e\n\x0c_warning_mppB\x10\n\x0e_created_index\"\xe1\x01\n\x15InvoicerequestRequest\x12\x1b\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x05 \x01(\x04H\x02\x88\x01\x01\x12\x17\n\nsingle_use\x18\x06 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_issuerB\x08\n\x06_labelB\x12\n\x10_absolute_expiryB\r\n\x0b_single_use\"\x8b\x01\n\x16InvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"1\n\x1c\x44isableinvoicerequestRequest\x12\x11\n\tinvreq_id\x18\x01 \x01(\t\"\x92\x01\n\x1d\x44isableinvoicerequestResponse\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"l\n\x1aListinvoicerequestsRequest\x12\x16\n\tinvreq_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0c\n\n_invreq_idB\x0e\n\x0c_active_only\"_\n\x1bListinvoicerequestsResponse\x12@\n\x0finvoicerequests\x18\x01 \x03(\x0b\x32\'.cln.ListinvoicerequestsInvoicerequests\"\x97\x01\n\"ListinvoicerequestsInvoicerequests\x12\x11\n\tinvreq_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"#\n\x14ListdatastoreRequest\x12\x0b\n\x03key\x18\x02 \x03(\t\"G\n\x15ListdatastoreResponse\x12.\n\tdatastore\x18\x01 \x03(\x0b\x32\x1b.cln.ListdatastoreDatastore\"\x87\x01\n\x16ListdatastoreDatastore\x12\x0b\n\x03key\x18\x01 \x03(\t\x12\x17\n\ngeneration\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03hex\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x06string\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\r\n\x0b_generationB\x06\n\x04_hexB\t\n\x07_string\"\xde\x02\n\x13ListinvoicesRequest\x12\x12\n\x05label\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tinvstring\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x15\n\x08offer_id\x18\x04 \x01(\tH\x03\x88\x01\x01\x12>\n\x05index\x18\x05 \x01(\x0e\x32*.cln.ListinvoicesRequest.ListinvoicesIndexH\x04\x88\x01\x01\x12\x12\n\x05start\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x12\n\x05limit\x18\x07 \x01(\rH\x06\x88\x01\x01\"-\n\x11ListinvoicesIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\x08\n\x06_labelB\x0c\n\n_invstringB\x0f\n\r_payment_hashB\x0b\n\t_offer_idB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListinvoicesResponse\x12+\n\x08invoices\x18\x01 \x03(\x0b\x32\x19.cln.ListinvoicesInvoices\"\xd4\x06\n\x14ListinvoicesInvoices\x12\r\n\x05label\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListinvoicesInvoices.ListinvoicesInvoicesStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0elocal_offer_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x16\n\tpay_index\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x14\n\x07paid_at\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0e \x01(\x0cH\x08\x88\x01\x01\x12\x1e\n\x11invreq_payer_note\x18\x0f \x01(\tH\t\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x10 \x01(\x04H\n\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\x0b\x88\x01\x01\x12\x42\n\rpaid_outpoint\x18\x12 \x01(\x0b\x32&.cln.ListinvoicesInvoicesPaid_outpointH\x0c\x88\x01\x01\"?\n\x1aListinvoicesInvoicesStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\t\n\x07_bolt11B\t\n\x07_bolt12B\x11\n\x0f_local_offer_idB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x14\n\x12_invreq_payer_noteB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"A\n!ListinvoicesInvoicesPaid_outpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\xb4\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\x18\n\x0b\x64\x65stination\x18\t \x01(\x0cH\x03\x88\x01\x01\x12\x14\n\x07groupid\x18\x0b \x01(\x04H\x04\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x42\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\x0e\n\x0c_destinationB\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x0e\n\x0c_description\"\xe7\x04\n\x11SendonionResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x36\n\x06status\x18\x03 \x01(\x0e\x32&.cln.SendonionResponse.SendonionStatus\x12%\n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x06 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\n \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0b \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x07message\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x13\n\x06partid\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0f \x01(\x04H\t\x88\x01\x01\",\n\x0fSendonionStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\n\n\x08_messageB\t\n\x07_partidB\x10\n\x0e_created_indexB\x10\n\x0e_updated_index\"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\"\xa0\x03\n\x13ListsendpaysRequest\x12\x13\n\x06\x62olt11\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x12@\n\x06status\x18\x03 \x01(\x0e\x32+.cln.ListsendpaysRequest.ListsendpaysStatusH\x02\x88\x01\x01\x12>\n\x05index\x18\x04 \x01(\x0e\x32*.cln.ListsendpaysRequest.ListsendpaysIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\";\n\x12ListsendpaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08\x43OMPLETE\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"-\n\x11ListsendpaysIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\t\n\x07_bolt11B\x0f\n\r_payment_hashB\t\n\x07_statusB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListsendpaysResponse\x12+\n\x08payments\x18\x01 \x03(\x0b\x32\x19.cln.ListsendpaysPayments\"\xfc\x05\n\x14ListsendpaysPayments\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0f\n\x07groupid\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x44\n\x06status\x18\x04 \x01(\x0e\x32\x34.cln.ListsendpaysPayments.ListsendpaysPaymentsStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\n \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0b \x01(\tH\x04\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\nerroronion\x18\r \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0e \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06partid\x18\x0f \x01(\x04H\x08\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x10 \x01(\x04H\t\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x11 \x01(\x04H\n\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x12 \x01(\x04H\x0b\x88\x01\x01\"C\n\x1aListsendpaysPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\r\n\x0b_erroronionB\x0e\n\x0c_descriptionB\t\n\x07_partidB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x0f\n\r_completed_at\"\x19\n\x17ListtransactionsRequest\"S\n\x18ListtransactionsResponse\x12\x37\n\x0ctransactions\x18\x01 \x03(\x0b\x32!.cln.ListtransactionsTransactions\"\xf8\x01\n\x1cListtransactionsTransactions\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\r\n\x05rawtx\x18\x02 \x01(\x0c\x12\x13\n\x0b\x62lockheight\x18\x03 \x01(\r\x12\x0f\n\x07txindex\x18\x04 \x01(\r\x12\x10\n\x08locktime\x18\x07 \x01(\r\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x37\n\x06inputs\x18\t \x03(\x0b\x32\'.cln.ListtransactionsTransactionsInputs\x12\x39\n\x07outputs\x18\n \x03(\x0b\x32(.cln.ListtransactionsTransactionsOutputs\"S\n\"ListtransactionsTransactionsInputs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\r\n\x05index\x18\x02 \x01(\r\x12\x10\n\x08sequence\x18\x03 \x01(\r\"l\n#ListtransactionsTransactionsOutputs\x12\r\n\x05index\x18\x01 \x01(\r\x12\x14\n\x0cscriptPubKey\x18\x03 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\"M\n\x11MakesecretRequest\x12\x10\n\x03hex\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x13\n\x06string\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x06\n\x04_hexB\t\n\x07_string\"$\n\x12MakesecretResponse\x12\x0e\n\x06secret\x18\x01 \x01(\x0c\"\x93\x04\n\nPayRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rmaxfeepercent\x18\x04 \x01(\x01H\x01\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x03\x88\x01\x01\x12#\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x17\n\nriskfactor\x18\x08 \x01(\x01H\x05\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\n \x03(\t\x12 \n\x06maxfee\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0c \x01(\tH\x07\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\r \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x1a\n\rlocalinvreqid\x18\x0e \x01(\x0cH\t\x88\x01\x01\x12&\n\x0cpartial_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x42\x08\n\x06_labelB\x10\n\x0e_maxfeepercentB\x0c\n\n_retry_forB\x0b\n\t_maxdelayB\x0c\n\n_exemptfeeB\r\n\x0b_riskfactorB\t\n\x07_maxfeeB\x0e\n\x0c_descriptionB\x0e\n\x0c_amount_msatB\x10\n\x0e_localinvreqidB\x0f\n\r_partial_msat\"\xfb\x02\n\x0bPayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x18\n\x0b\x64\x65stination\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\r\n\x05parts\x18\x05 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\x1awarning_partial_completion\x18\x08 \x01(\tH\x01\x88\x01\x01\x12*\n\x06status\x18\t \x01(\x0e\x32\x1a.cln.PayResponse.PayStatus\"2\n\tPayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x0e\n\x0c_destinationB\x1d\n\x1b_warning_partial_completion\"*\n\x10ListnodesRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x05\n\x03_id\"7\n\x11ListnodesResponse\x12\"\n\x05nodes\x18\x01 \x03(\x0b\x32\x13.cln.ListnodesNodes\"\xba\x02\n\x0eListnodesNodes\x12\x0e\n\x06nodeid\x18\x01 \x01(\x0c\x12\x1b\n\x0elast_timestamp\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x12\n\x05\x61lias\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05\x63olor\x18\x04 \x01(\x0cH\x02\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18\x05 \x01(\x0cH\x03\x88\x01\x01\x12/\n\taddresses\x18\x06 \x03(\x0b\x32\x1c.cln.ListnodesNodesAddresses\x12\x42\n\x10option_will_fund\x18\x07 \x01(\x0b\x32#.cln.ListnodesNodesOption_will_fundH\x04\x88\x01\x01\x42\x11\n\x0f_last_timestampB\x08\n\x06_aliasB\x08\n\x06_colorB\x0b\n\t_featuresB\x13\n\x11_option_will_fund\"\xf4\x01\n\x1eListnodesNodesOption_will_fund\x12(\n\x13lease_fee_base_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x17\n\x0flease_fee_basis\x18\x02 \x01(\r\x12\x16\n\x0e\x66unding_weight\x18\x03 \x01(\r\x12.\n\x19\x63hannel_fee_max_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x30\n(channel_fee_max_proportional_thousandths\x18\x05 \x01(\r\x12\x15\n\rcompact_lease\x18\x06 \x01(\x0c\"\xe8\x01\n\x17ListnodesNodesAddresses\x12K\n\titem_type\x18\x01 \x01(\x0e\x32\x38.cln.ListnodesNodesAddresses.ListnodesNodesAddressesType\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x00\x88\x01\x01\"P\n\x1bListnodesNodesAddressesType\x12\x07\n\x03\x44NS\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\n\n\x08_address\"g\n\x15WaitanyinvoiceRequest\x12\x1a\n\rlastpay_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\x10\n\x0e_lastpay_indexB\n\n\x08_timeout\"\xbf\x05\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\x16\n\tpay_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x06\x88\x01\x01\x12\x1a\n\rcreated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12<\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32 .cln.WaitanyinvoicePaid_outpointH\t\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\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\";\n\x1bWaitanyinvoicePaid_outpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"#\n\x12WaitinvoiceRequest\x12\r\n\x05label\x18\x01 \x01(\t\"\xb0\x05\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\x16\n\tpay_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\x0c \x01(\x0cH\x06\x88\x01\x01\x12\x1a\n\rcreated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x0e \x01(\x04H\x08\x88\x01\x01\x12\x39\n\rpaid_outpoint\x18\x0f \x01(\x0b\x32\x1d.cln.WaitinvoicePaid_outpointH\t\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\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimageB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x10\n\x0e_paid_outpoint\"8\n\x18WaitinvoicePaid_outpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"\x8e\x01\n\x12WaitsendpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12\x13\n\x06partid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x02\x88\x01\x01\x42\t\n\x07_partidB\n\n\x08_timeoutB\n\n\x08_groupid\"\x8e\x05\n\x13WaitsendpayResponse\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x07groupid\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.WaitsendpayResponse.WaitsendpayStatus\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x06 \x01(\x0cH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x07 \x01(\x04\x12%\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12\x12\n\x05label\x18\t \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06partid\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0b \x01(\tH\x05\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x0c \x01(\tH\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0e \x01(\x01H\x08\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x0f \x01(\x04H\t\x88\x01\x01\x12\x1a\n\rupdated_index\x18\x10 \x01(\x04H\n\x88\x01\x01\"!\n\x11WaitsendpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x42\n\n\x08_groupidB\x0e\n\x0c_amount_msatB\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_partidB\t\n\x07_bolt11B\t\n\x07_bolt12B\x13\n\x11_payment_preimageB\x0f\n\r_completed_atB\x10\n\x0e_created_indexB\x10\n\x0e_updated_index\"\x97\x01\n\x0eNewaddrRequest\x12@\n\x0b\x61\x64\x64resstype\x18\x01 \x01(\x0e\x32&.cln.NewaddrRequest.NewaddrAddresstypeH\x00\x88\x01\x01\"3\n\x12NewaddrAddresstype\x12\n\n\x06\x42\x45\x43H32\x10\x00\x12\x07\n\x03\x41LL\x10\x02\x12\x08\n\x04P2TR\x10\x03\x42\x0e\n\x0c_addresstype\"M\n\x0fNewaddrResponse\x12\x13\n\x06\x62\x65\x63h32\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04p2tr\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_bech32B\x07\n\x05_p2tr\"\xb9\x01\n\x0fWithdrawRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\t\x12!\n\x07satoshi\x18\x02 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\"\n\x07\x66\x65\x65rate\x18\x05 \x01(\x0b\x32\x0c.cln.FeerateH\x01\x88\x01\x01\x42\n\n\x08_minconfB\n\n\x08_feerate\":\n\x10WithdrawResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0c\n\x04psbt\x18\x03 \x01(\t\"\x82\x03\n\x0eKeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12\x12\n\x05label\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rmaxfeepercent\x18\x04 \x01(\x01H\x01\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x06 \x01(\rH\x03\x88\x01\x01\x12#\n\texemptfee\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12+\n\nroutehints\x18\x08 \x01(\x0b\x32\x12.cln.RoutehintListH\x05\x88\x01\x01\x12&\n\textratlvs\x18\t \x01(\x0b\x32\x0e.cln.TlvStreamH\x06\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\n \x01(\x0b\x32\x0b.cln.AmountB\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(\rH\x00\x88\x01\x01\x42\n\n\x08_reserve\",\n\x10SendpsbtResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"1\n\x0fSignpsbtRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x10\n\x08signonly\x18\x02 \x03(\r\"\'\n\x10SignpsbtResponse\x12\x13\n\x0bsigned_psbt\x18\x01 \x01(\t\"\xa0\x03\n\x0fUtxopsbtRequest\x12!\n\x07satoshi\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x1d\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.Feerate\x12\x13\n\x0bstartweight\x18\x03 \x01(\r\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\x14\n\x07reserve\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08locktime\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1f\n\x12min_witness_weight\x18\x07 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nreservedok\x18\x08 \x01(\x08H\x03\x88\x01\x01\x12\x1d\n\x10\x65xcess_as_change\x18\t \x01(\x08H\x04\x88\x01\x01\x12#\n\x16opening_anchor_channel\x18\n \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_reserveB\x0b\n\t_locktimeB\x15\n\x13_min_witness_weightB\r\n\x0b_reservedokB\x13\n\x11_excess_as_changeB\x19\n\x17_opening_anchor_channel\"\xd9\x01\n\x10UtxopsbtResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\x0e\x66\x65\x65rate_per_kw\x18\x02 \x01(\r\x12\x1e\n\x16\x65stimated_final_weight\x18\x03 \x01(\r\x12 \n\x0b\x65xcess_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1a\n\rchange_outnum\x18\x05 \x01(\rH\x00\x88\x01\x01\x12/\n\x0creservations\x18\x06 \x03(\x0b\x32\x19.cln.UtxopsbtReservationsB\x10\n\x0e_change_outnum\"u\n\x14UtxopsbtReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\" \n\x10TxdiscardRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"6\n\x11TxdiscardResponse\x12\x13\n\x0bunsigned_tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xa4\x01\n\x10TxprepareRequest\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12 \n\x07outputs\x18\x05 \x03(\x0b\x32\x0f.cln.OutputDescB\n\n\x08_feerateB\n\n\x08_minconf\"D\n\x11TxprepareResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x13\n\x0bunsigned_tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"\x1d\n\rTxsendRequest\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\"8\n\x0eTxsendResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"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\"\xd7\x1b\n\x18ListpeerchannelsChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x16\n\x0epeer_connected\x18\x02 \x01(\x08\x12J\n\x05state\x18\x03 \x01(\x0e\x32;.cln.ListpeerchannelsChannels.ListpeerchannelsChannelsState\x12\x19\n\x0cscratch_txid\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x12:\n\x07\x66\x65\x65rate\x18\x06 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFeerateH\x01\x88\x01\x01\x12\x12\n\x05owner\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10short_channel_id\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x17\n\nchannel_id\x18\t \x01(\x0cH\x04\x88\x01\x01\x12\x19\n\x0c\x66unding_txid\x18\n \x01(\x0cH\x05\x88\x01\x01\x12\x1b\n\x0e\x66unding_outnum\x18\x0b \x01(\rH\x06\x88\x01\x01\x12\x1c\n\x0finitial_feerate\x18\x0c \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0clast_feerate\x18\r \x01(\tH\x08\x88\x01\x01\x12\x19\n\x0cnext_feerate\x18\x0e \x01(\tH\t\x88\x01\x01\x12\x1a\n\rnext_fee_step\x18\x0f \x01(\rH\n\x88\x01\x01\x12\x37\n\x08inflight\x18\x10 \x03(\x0b\x32%.cln.ListpeerchannelsChannelsInflight\x12\x15\n\x08\x63lose_to\x18\x11 \x01(\x0cH\x0b\x88\x01\x01\x12\x14\n\x07private\x18\x12 \x01(\x08H\x0c\x88\x01\x01\x12 \n\x06opener\x18\x13 \x01(\x0e\x32\x10.cln.ChannelSide\x12%\n\x06\x63loser\x18\x14 \x01(\x0e\x32\x10.cln.ChannelSideH\r\x88\x01\x01\x12:\n\x07\x66unding\x18\x16 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsFundingH\x0e\x88\x01\x01\x12$\n\nto_us_msat\x18\x17 \x01(\x0b\x32\x0b.cln.AmountH\x0f\x88\x01\x01\x12(\n\x0emin_to_us_msat\x18\x18 \x01(\x0b\x32\x0b.cln.AmountH\x10\x88\x01\x01\x12(\n\x0emax_to_us_msat\x18\x19 \x01(\x0b\x32\x0b.cln.AmountH\x11\x88\x01\x01\x12$\n\ntotal_msat\x18\x1a \x01(\x0b\x32\x0b.cln.AmountH\x12\x88\x01\x01\x12\'\n\rfee_base_msat\x18\x1b \x01(\x0b\x32\x0b.cln.AmountH\x13\x88\x01\x01\x12(\n\x1b\x66\x65\x65_proportional_millionths\x18\x1c \x01(\rH\x14\x88\x01\x01\x12)\n\x0f\x64ust_limit_msat\x18\x1d \x01(\x0b\x32\x0b.cln.AmountH\x15\x88\x01\x01\x12\x30\n\x16max_total_htlc_in_msat\x18\x1e \x01(\x0b\x32\x0b.cln.AmountH\x16\x88\x01\x01\x12,\n\x12their_reserve_msat\x18\x1f \x01(\x0b\x32\x0b.cln.AmountH\x17\x88\x01\x01\x12*\n\x10our_reserve_msat\x18 \x01(\x0b\x32\x0b.cln.AmountH\x18\x88\x01\x01\x12(\n\x0espendable_msat\x18! \x01(\x0b\x32\x0b.cln.AmountH\x19\x88\x01\x01\x12)\n\x0freceivable_msat\x18\" \x01(\x0b\x32\x0b.cln.AmountH\x1a\x88\x01\x01\x12.\n\x14minimum_htlc_in_msat\x18# \x01(\x0b\x32\x0b.cln.AmountH\x1b\x88\x01\x01\x12/\n\x15minimum_htlc_out_msat\x18$ \x01(\x0b\x32\x0b.cln.AmountH\x1c\x88\x01\x01\x12/\n\x15maximum_htlc_out_msat\x18% \x01(\x0b\x32\x0b.cln.AmountH\x1d\x88\x01\x01\x12 \n\x13their_to_self_delay\x18& \x01(\rH\x1e\x88\x01\x01\x12\x1e\n\x11our_to_self_delay\x18\' \x01(\rH\x1f\x88\x01\x01\x12\x1f\n\x12max_accepted_htlcs\x18( \x01(\rH \x88\x01\x01\x12\x36\n\x05\x61lias\x18) \x01(\x0b\x32\".cln.ListpeerchannelsChannelsAliasH!\x88\x01\x01\x12\x0e\n\x06status\x18+ \x03(\t\x12 \n\x13in_payments_offered\x18, \x01(\x04H\"\x88\x01\x01\x12)\n\x0fin_offered_msat\x18- \x01(\x0b\x32\x0b.cln.AmountH#\x88\x01\x01\x12\"\n\x15in_payments_fulfilled\x18. \x01(\x04H$\x88\x01\x01\x12+\n\x11in_fulfilled_msat\x18/ \x01(\x0b\x32\x0b.cln.AmountH%\x88\x01\x01\x12!\n\x14out_payments_offered\x18\x30 \x01(\x04H&\x88\x01\x01\x12*\n\x10out_offered_msat\x18\x31 \x01(\x0b\x32\x0b.cln.AmountH\'\x88\x01\x01\x12#\n\x16out_payments_fulfilled\x18\x32 \x01(\x04H(\x88\x01\x01\x12,\n\x12out_fulfilled_msat\x18\x33 \x01(\x0b\x32\x0b.cln.AmountH)\x88\x01\x01\x12\x31\n\x05htlcs\x18\x34 \x03(\x0b\x32\".cln.ListpeerchannelsChannelsHtlcs\x12\x1a\n\rclose_to_addr\x18\x35 \x01(\tH*\x88\x01\x01\x12\x1e\n\x11ignore_fee_limits\x18\x36 \x01(\x08H+\x88\x01\x01\x12:\n\x07updates\x18\x37 \x01(\x0b\x32$.cln.ListpeerchannelsChannelsUpdatesH,\x88\x01\x01\x12#\n\x16last_stable_connection\x18\x38 \x01(\x04H-\x88\x01\x01\x12\x17\n\nlost_state\x18\x39 \x01(\x08H.\x88\x01\x01\x12\x1a\n\rreestablished\x18: \x01(\x08H/\x88\x01\x01\x12*\n\x10last_tx_fee_msat\x18; \x01(\x0b\x32\x0b.cln.AmountH0\x88\x01\x01\x12\x16\n\tdirection\x18< \x01(\rH1\x88\x01\x01\"\x80\x03\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\x12\x1f\n\x1b\x44UALOPEND_OPEN_COMMIT_READY\x10\rB\x0f\n\r_scratch_txidB\n\n\x08_feerateB\x08\n\x06_ownerB\x13\n\x11_short_channel_idB\r\n\x0b_channel_idB\x0f\n\r_funding_txidB\x11\n\x0f_funding_outnumB\x12\n\x10_initial_feerateB\x0f\n\r_last_feerateB\x0f\n\r_next_feerateB\x10\n\x0e_next_fee_stepB\x0b\n\t_close_toB\n\n\x08_privateB\t\n\x07_closerB\n\n\x08_fundingB\r\n\x0b_to_us_msatB\x11\n\x0f_min_to_us_msatB\x11\n\x0f_max_to_us_msatB\r\n\x0b_total_msatB\x10\n\x0e_fee_base_msatB\x1e\n\x1c_fee_proportional_millionthsB\x12\n\x10_dust_limit_msatB\x19\n\x17_max_total_htlc_in_msatB\x15\n\x13_their_reserve_msatB\x13\n\x11_our_reserve_msatB\x11\n\x0f_spendable_msatB\x12\n\x10_receivable_msatB\x17\n\x15_minimum_htlc_in_msatB\x18\n\x16_minimum_htlc_out_msatB\x18\n\x16_maximum_htlc_out_msatB\x16\n\x14_their_to_self_delayB\x14\n\x12_our_to_self_delayB\x15\n\x13_max_accepted_htlcsB\x08\n\x06_aliasB\x16\n\x14_in_payments_offeredB\x12\n\x10_in_offered_msatB\x18\n\x16_in_payments_fulfilledB\x14\n\x12_in_fulfilled_msatB\x17\n\x15_out_payments_offeredB\x13\n\x11_out_offered_msatB\x19\n\x17_out_payments_fulfilledB\x15\n\x13_out_fulfilled_msatB\x10\n\x0e_close_to_addrB\x14\n\x12_ignore_fee_limitsB\n\n\x08_updatesB\x19\n\x17_last_stable_connectionB\r\n\x0b_lost_stateB\x10\n\x0e_reestablishedB\x13\n\x11_last_tx_fee_msatB\x0c\n\n_direction\"\xa7\x01\n\x1fListpeerchannelsChannelsUpdates\x12\x38\n\x05local\x18\x01 \x01(\x0b\x32).cln.ListpeerchannelsChannelsUpdatesLocal\x12?\n\x06remote\x18\x02 \x01(\x0b\x32*.cln.ListpeerchannelsChannelsUpdatesRemoteH\x00\x88\x01\x01\x42\t\n\x07_remote\"\xda\x01\n$ListpeerchannelsChannelsUpdatesLocal\x12&\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11htlc_maximum_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x11\x63ltv_expiry_delta\x18\x03 \x01(\r\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\"\xdb\x01\n%ListpeerchannelsChannelsUpdatesRemote\x12&\n\x11htlc_minimum_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11htlc_maximum_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x11\x63ltv_expiry_delta\x18\x03 \x01(\r\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\"?\n\x1fListpeerchannelsChannelsFeerate\x12\r\n\x05perkw\x18\x01 \x01(\r\x12\r\n\x05perkb\x18\x02 \x01(\r\"\x8b\x02\n ListpeerchannelsChannelsInflight\x12\x14\n\x0c\x66unding_txid\x18\x01 \x01(\x0c\x12\x16\n\x0e\x66unding_outnum\x18\x02 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x03 \x01(\t\x12\'\n\x12total_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10our_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x19\n\x0cscratch_txid\x18\x06 \x01(\x0cH\x00\x88\x01\x01\x12\x1a\n\rsplice_amount\x18\x07 \x01(\x12H\x01\x88\x01\x01\x42\x0f\n\r_scratch_txidB\x10\n\x0e_splice_amount\"\x9d\x02\n\x1fListpeerchannelsChannelsFunding\x12%\n\x0bpushed_msat\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12%\n\x10local_funds_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11remote_funds_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\'\n\rfee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\'\n\rfee_rcvd_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x42\x0e\n\x0c_pushed_msatB\x10\n\x0e_fee_paid_msatB\x10\n\x0e_fee_rcvd_msat\"]\n\x1dListpeerchannelsChannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"\xf9\x02\n\x1dListpeerchannelsChannelsHtlcs\x12\\\n\tdirection\x18\x01 \x01(\x0e\x32I.cln.ListpeerchannelsChannelsHtlcs.ListpeerchannelsChannelsHtlcsDirection\x12\n\n\x02id\x18\x02 \x01(\x04\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06\x65xpiry\x18\x04 \x01(\r\x12\x14\n\x0cpayment_hash\x18\x05 \x01(\x0c\x12\x1a\n\rlocal_trimmed\x18\x06 \x01(\x08H\x00\x88\x01\x01\x12\x13\n\x06status\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x05state\x18\x08 \x01(\x0e\x32\x0e.cln.HtlcState\"9\n&ListpeerchannelsChannelsHtlcsDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\x42\x10\n\x0e_local_trimmedB\t\n\x07_status\"3\n\x19ListclosedchannelsRequest\x12\x0f\n\x02id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x05\n\x03_id\"[\n\x1aListclosedchannelsResponse\x12=\n\x0e\x63losedchannels\x18\x01 \x03(\x0b\x32%.cln.ListclosedchannelsClosedchannels\"\xf2\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\x12#\n\x16last_stable_connection\x18\x19 \x01(\x04H\t\x88\x01\x01\"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_msatB\x19\n\x17_last_stable_connection\"e\n%ListclosedchannelsClosedchannelsAlias\x12\x12\n\x05local\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06remote\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_localB\t\n\x07_remote\"L\n\x10\x44\x65\x63odepayRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_description\"\xc7\x04\n\x11\x44\x65\x63odepayResponse\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\x12\x12\n\ncreated_at\x18\x02 \x01(\x04\x12\x0e\n\x06\x65xpiry\x18\x03 \x01(\x04\x12\r\n\x05payee\x18\x04 \x01(\x0c\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x06 \x01(\x0c\x12\x11\n\tsignature\x18\x07 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x1d\n\x10\x64\x65scription_hash\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x1d\n\x15min_final_cltv_expiry\x18\n \x01(\r\x12\x1b\n\x0epayment_secret\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x1d\n\x10payment_metadata\x18\r \x01(\x0cH\x05\x88\x01\x01\x12*\n\tfallbacks\x18\x0e \x03(\x0b\x32\x17.cln.DecodepayFallbacks\x12\"\n\x05\x65xtra\x18\x10 \x03(\x0b\x32\x13.cln.DecodepayExtra\x12-\n\x06routes\x18\x11 \x01(\x0b\x32\x18.cln.DecodeRoutehintListH\x06\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x13\n\x11_description_hashB\x11\n\x0f_payment_secretB\x0b\n\t_featuresB\x13\n\x11_payment_metadataB\t\n\x07_routes\"\xd0\x01\n\x12\x44\x65\x63odepayFallbacks\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.DecodepayFallbacks.DecodepayFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0b\n\x03hex\x18\x03 \x01(\x0c\"N\n\x16\x44\x65\x63odepayFallbacksType\x12\t\n\x05P2PKH\x10\x00\x12\x08\n\x04P2SH\x10\x01\x12\n\n\x06P2WPKH\x10\x02\x12\t\n\x05P2WSH\x10\x03\x12\x08\n\x04P2TR\x10\x04\x42\x07\n\x05_addr\"+\n\x0e\x44\x65\x63odepayExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x1f\n\rDecodeRequest\x12\x0e\n\x06string\x18\x01 \x01(\t\"\xec%\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\x12\x16\n\tdecrypted\x18L \x01(\x0cH=\x88\x01\x01\x12\x16\n\tsignature\x18M \x01(\tH>\x88\x01\x01\x12\x15\n\x08\x63urrency\x18N \x01(\tH?\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18O \x01(\x0b\x32\x0b.cln.AmountH@\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18P \x01(\tHA\x88\x01\x01\x12\x15\n\x08\x66\x65\x61tures\x18Q \x01(\x0cHB\x88\x01\x01\x12-\n\x06routes\x18R \x01(\x0b\x32\x18.cln.DecodeRoutehintListHC\x88\x01\x01\x12\x1c\n\x0foffer_issuer_id\x18S \x01(\x0cHD\x88\x01\x01\x12,\n\x1fwarning_missing_offer_issuer_id\x18T \x01(\tHE\x88\x01\x01\x12-\n\x0cinvreq_paths\x18U \x03(\x0b\x32\x17.cln.DecodeInvreq_paths\x12\'\n\x1awarning_empty_blinded_path\x18V \x01(\tHF\x88\x01\x01\"\x83\x01\n\nDecodeType\x12\x10\n\x0c\x42OLT12_OFFER\x10\x00\x12\x12\n\x0e\x42OLT12_INVOICE\x10\x01\x12\x1a\n\x16\x42OLT12_INVOICE_REQUEST\x10\x02\x12\x12\n\x0e\x42OLT11_INVOICE\x10\x03\x12\x08\n\x04RUNE\x10\x04\x12\x15\n\x11\x45MERGENCY_RECOVER\x10\x05\x42\x0b\n\t_offer_idB\x11\n\x0f_offer_metadataB\x11\n\x0f_offer_currencyB!\n\x1f_warning_unknown_offer_currencyB\x16\n\x14_currency_minor_unitB\x0f\n\r_offer_amountB\x14\n\x12_offer_amount_msatB\x14\n\x12_offer_descriptionB\x0f\n\r_offer_issuerB\x11\n\x0f_offer_featuresB\x18\n\x16_offer_absolute_expiryB\x15\n\x13_offer_quantity_maxB\x10\n\x0e_offer_node_idB \n\x1e_warning_missing_offer_node_idB$\n\"_warning_invalid_offer_descriptionB$\n\"_warning_missing_offer_descriptionB!\n\x1f_warning_invalid_offer_currencyB\x1f\n\x1d_warning_invalid_offer_issuerB\x12\n\x10_invreq_metadataB\x12\n\x10_invreq_payer_idB\x0f\n\r_invreq_chainB\x15\n\x13_invreq_amount_msatB\x12\n\x10_invreq_featuresB\x12\n\x10_invreq_quantityB\x14\n\x12_invreq_payer_noteB\x1c\n\x1a_invreq_recurrence_counterB\x1a\n\x18_invreq_recurrence_startB\"\n _warning_missing_invreq_metadataB\"\n _warning_missing_invreq_payer_idB$\n\"_warning_invalid_invreq_payer_noteB,\n*_warning_missing_invoice_request_signatureB,\n*_warning_invalid_invoice_request_signatureB\x15\n\x13_invoice_created_atB\x1a\n\x18_invoice_relative_expiryB\x17\n\x15_invoice_payment_hashB\x16\n\x14_invoice_amount_msatB\x13\n\x11_invoice_featuresB\x12\n\x10_invoice_node_idB\x1e\n\x1c_invoice_recurrence_basetimeB \n\x1e_warning_missing_invoice_pathsB%\n#_warning_missing_invoice_blindedpayB%\n#_warning_missing_invoice_created_atB\'\n%_warning_missing_invoice_payment_hashB!\n\x1f_warning_missing_invoice_amountB.\n,_warning_missing_invoice_recurrence_basetimeB\"\n _warning_missing_invoice_node_idB$\n\"_warning_missing_invoice_signatureB$\n\"_warning_invalid_invoice_signatureB\r\n\x0b_created_atB\t\n\x07_expiryB\x08\n\x06_payeeB\x0f\n\r_payment_hashB\x13\n\x11_description_hashB\x18\n\x16_min_final_cltv_expiryB\x11\n\x0f_payment_secretB\x13\n\x11_payment_metadataB\x0c\n\n_unique_idB\n\n\x08_versionB\t\n\x07_stringB\x1c\n\x1a_warning_rune_invalid_utf8B\x06\n\x04_hexB\x0c\n\n_decryptedB\x0c\n\n_signatureB\x0b\n\t_currencyB\x0e\n\x0c_amount_msatB\x0e\n\x0c_descriptionB\x0b\n\t_featuresB\t\n\x07_routesB\x12\n\x10_offer_issuer_idB\"\n _warning_missing_offer_issuer_idB\x1d\n\x1b_warning_empty_blinded_path\"\xab\x01\n\x11\x44\x65\x63odeOffer_paths\x12\x1a\n\rfirst_node_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x10\n\x08\x62linding\x18\x02 \x01(\x0c\x12\x1b\n\x0e\x66irst_scid_dir\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x05 \x01(\tH\x02\x88\x01\x01\x42\x10\n\x0e_first_node_idB\x11\n\x0f_first_scid_dirB\r\n\x0b_first_scid\"\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\"\xd7\x01\n\x12\x44\x65\x63odeInvreq_paths\x12\x1b\n\x0e\x66irst_scid_dir\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x10\n\x08\x62linding\x18\x02 \x01(\x0c\x12\x1a\n\rfirst_node_id\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x17\n\nfirst_scid\x18\x04 \x01(\tH\x02\x88\x01\x01\x12)\n\x04path\x18\x05 \x03(\x0b\x32\x1b.cln.DecodeInvreq_pathsPathB\x11\n\x0f_first_scid_dirB\x10\n\x0e_first_node_idB\r\n\x0b_first_scid\"S\n\x16\x44\x65\x63odeInvreq_pathsPath\x12\x17\n\x0f\x62linded_node_id\x18\x01 \x01(\x0c\x12 \n\x18\x65ncrypted_recipient_data\x18\x02 \x01(\x0c\"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\"\xaa\x02\n\x0f\x44\x65\x63odeFallbacks\x12\x36\n)warning_invoice_fallbacks_version_invalid\x18\x01 \x01(\tH\x00\x88\x01\x01\x12;\n\titem_type\x18\x02 \x01(\x0e\x32(.cln.DecodeFallbacks.DecodeFallbacksType\x12\x11\n\x04\x61\x64\x64r\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0b\n\x03hex\x18\x04 \x01(\x0c\"K\n\x13\x44\x65\x63odeFallbacksType\x12\t\n\x05P2PKH\x10\x00\x12\x08\n\x04P2SH\x10\x01\x12\n\n\x06P2WPKH\x10\x02\x12\t\n\x05P2WSH\x10\x03\x12\x08\n\x04P2TR\x10\x04\x42,\n*_warning_invoice_fallbacks_version_invalidB\x07\n\x05_addr\"(\n\x0b\x44\x65\x63odeExtra\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\";\n\x12\x44\x65\x63odeRestrictions\x12\x14\n\x0c\x61lternatives\x18\x01 \x03(\t\x12\x0f\n\x07summary\x18\x02 \x01(\t\"\xc2\x01\n\rDelpayRequest\x12\x14\n\x0cpayment_hash\x18\x01 \x01(\x0c\x12/\n\x06status\x18\x02 \x01(\x0e\x32\x1f.cln.DelpayRequest.DelpayStatus\x12\x13\n\x06partid\x18\x03 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07groupid\x18\x04 \x01(\x04H\x01\x88\x01\x01\"(\n\x0c\x44\x65lpayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x42\t\n\x07_partidB\n\n\x08_groupid\"7\n\x0e\x44\x65lpayResponse\x12%\n\x08payments\x18\x01 \x03(\x0b\x32\x13.cln.DelpayPayments\"\xcb\x05\n\x0e\x44\x65lpayPayments\x12\x1a\n\rcreated_index\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\n\n\x02id\x18\x02 \x01(\x04\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x38\n\x06status\x18\x04 \x01(\x0e\x32(.cln.DelpayPayments.DelpayPaymentsStatus\x12%\n\x10\x61mount_sent_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65stination\x18\x07 \x01(\x0cH\x02\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x12\n\ncreated_at\x18\t \x01(\x04\x12\x1a\n\rupdated_index\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x14\n\x07groupid\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\x12\x12\n\x05label\x18\x0e \x01(\tH\x08\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x0f \x01(\tH\t\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x10 \x01(\tH\n\x88\x01\x01\x12\x17\n\nerroronion\x18\x11 \x01(\x0cH\x0b\x88\x01\x01\"=\n\x14\x44\x65lpayPaymentsStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x10\n\x0e_created_indexB\t\n\x07_partidB\x0e\n\x0c_destinationB\x0e\n\x0c_amount_msatB\x10\n\x0e_updated_indexB\x0f\n\r_completed_atB\n\n\x08_groupidB\x13\n\x11_payment_preimageB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\r\n\x0b_erroronion\"\xb3\x01\n\x11\x44\x65lforwardRequest\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x12\n\nin_htlc_id\x18\x02 \x01(\x04\x12\x37\n\x06status\x18\x03 \x01(\x0e\x32\'.cln.DelforwardRequest.DelforwardStatus\"=\n\x10\x44\x65lforwardStatus\x12\x0b\n\x07SETTLED\x10\x00\x12\x10\n\x0cLOCAL_FAILED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"\x14\n\x12\x44\x65lforwardResponse\"\'\n\x13\x44isableofferRequest\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\"\x88\x01\n\x14\x44isableofferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"=\n\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\x14\n\x07opening\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmutual_close\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1d\n\x10unilateral_close\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x1a\n\rdelayed_to_us\x18\x06 \x01(\rH\x03\x88\x01\x01\x12\x1c\n\x0fhtlc_resolution\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x14\n\x07penalty\x18\x08 \x01(\rH\x05\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkbEstimates\x12\x12\n\x05\x66loor\x18\n \x01(\rH\x06\x88\x01\x01\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x07\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\x10\n\x0e_delayed_to_usB\x12\n\x10_htlc_resolutionB\n\n\x08_penaltyB\x08\n\x06_floorB\x1a\n\x18_unilateral_anchor_close\"W\n\x16\x46\x65\x65ratesPerkbEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"\xd3\x03\n\rFeeratesPerkw\x12\x16\n\x0emin_acceptable\x18\x01 \x01(\r\x12\x16\n\x0emax_acceptable\x18\x02 \x01(\r\x12\x14\n\x07opening\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmutual_close\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1d\n\x10unilateral_close\x18\x05 \x01(\rH\x02\x88\x01\x01\x12\x1a\n\rdelayed_to_us\x18\x06 \x01(\rH\x03\x88\x01\x01\x12\x1c\n\x0fhtlc_resolution\x18\x07 \x01(\rH\x04\x88\x01\x01\x12\x14\n\x07penalty\x18\x08 \x01(\rH\x05\x88\x01\x01\x12.\n\testimates\x18\t \x03(\x0b\x32\x1b.cln.FeeratesPerkwEstimates\x12\x12\n\x05\x66loor\x18\n \x01(\rH\x06\x88\x01\x01\x12$\n\x17unilateral_anchor_close\x18\x0b \x01(\rH\x07\x88\x01\x01\x42\n\n\x08_openingB\x0f\n\r_mutual_closeB\x13\n\x11_unilateral_closeB\x10\n\x0e_delayed_to_usB\x12\n\x10_htlc_resolutionB\n\n\x08_penaltyB\x08\n\x06_floorB\x1a\n\x18_unilateral_anchor_close\"W\n\x16\x46\x65\x65ratesPerkwEstimates\x12\x12\n\nblockcount\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65rate\x18\x02 \x01(\r\x12\x18\n\x10smoothed_feerate\x18\x03 \x01(\r\"\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\x1d\n\x15htlc_timeout_satoshis\x18\x04 \x01(\x04\x12\x1d\n\x15htlc_success_satoshis\x18\x05 \x01(\x04\x12\x30\n#unilateral_close_nonanchor_satoshis\x18\x06 \x01(\x04H\x00\x88\x01\x01\x42&\n$_unilateral_close_nonanchor_satoshis\"\xe9\x02\n\x13\x46\x65tchinvoiceRequest\x12\r\n\x05offer\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x15\n\x08quantity\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x1f\n\x12recurrence_counter\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x1d\n\x10recurrence_start\x18\x05 \x01(\x01H\x03\x88\x01\x01\x12\x1d\n\x10recurrence_label\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x14\n\x07timeout\x18\x07 \x01(\x01H\x05\x88\x01\x01\x12\x17\n\npayer_note\x18\x08 \x01(\tH\x06\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\x0b\n\t_quantityB\x15\n\x13_recurrence_counterB\x13\n\x11_recurrence_startB\x13\n\x11_recurrence_labelB\n\n\x08_timeoutB\r\n\x0b_payer_note\"\x9a\x01\n\x14\x46\x65tchinvoiceResponse\x12\x0f\n\x07invoice\x18\x01 \x01(\t\x12)\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x18.cln.FetchinvoiceChanges\x12\x36\n\x0bnext_period\x18\x03 \x01(\x0b\x32\x1c.cln.FetchinvoiceNext_periodH\x00\x88\x01\x01\x42\x0e\n\x0c_next_period\"\x82\x02\n\x13\x46\x65tchinvoiceChanges\x12!\n\x14\x64\x65scription_appended\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0evendor_removed\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06vendor\x18\x04 \x01(\tH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x42\x17\n\x15_description_appendedB\x0e\n\x0c_descriptionB\x11\n\x0f_vendor_removedB\t\n\x07_vendorB\x0e\n\x0c_amount_msat\"~\n\x17\x46\x65tchinvoiceNext_period\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x04\x12\x11\n\tstarttime\x18\x02 \x01(\x04\x12\x0f\n\x07\x65ndtime\x18\x03 \x01(\x04\x12\x17\n\x0fpaywindow_start\x18\x04 \x01(\x04\x12\x15\n\rpaywindow_end\x18\x05 \x01(\x04\"\'\n\x19\x46undchannel_cancelRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\"/\n\x1a\x46undchannel_cancelResponse\x12\x11\n\tcancelled\x18\x01 \x01(\t\"7\n\x1b\x46undchannel_completeRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"O\n\x1c\x46undchannel_completeResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\"\xfb\x03\n\x12\x46undchannelRequest\x12 \n\x06\x61mount\x18\x01 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12#\n\tpush_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\tH\x03\x88\x01\x01\x12%\n\x0brequest_amt\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x08 \x01(\tH\x05\x88\x01\x01\x12\n\n\x02id\x18\t \x01(\x0c\x12\x14\n\x07minconf\x18\n \x01(\rH\x06\x88\x01\x01\x12\x1c\n\x05utxos\x18\x0b \x03(\x0b\x32\r.cln.Outpoint\x12\x15\n\x08mindepth\x18\x0c \x01(\rH\x07\x88\x01\x01\x12!\n\x07reserve\x18\r \x01(\x0b\x32\x0b.cln.AmountH\x08\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\x0e \x03(\rB\n\n\x08_feerateB\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\n\n\x08_minconfB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xe5\x01\n\x13\x46undchannelResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0e\n\x06outnum\x18\x03 \x01(\r\x12\x12\n\nchannel_id\x18\x04 \x01(\x0c\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x00\x88\x01\x01\x12\x15\n\x08mindepth\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x37\n\x0c\x63hannel_type\x18\x07 \x01(\x0b\x32\x1c.cln.FundchannelChannel_typeH\x02\x88\x01\x01\x42\x0b\n\t_close_toB\x0b\n\t_mindepthB\x0f\n\r_channel_type\"L\n\x17\x46undchannelChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\xd7\x02\n\x18\x46undchannel_startRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x1b\n\x06\x61mount\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\x07\x66\x65\x65rate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\tH\x02\x88\x01\x01\x12#\n\tpush_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x15\n\x08mindepth\x18\x07 \x01(\rH\x04\x88\x01\x01\x12!\n\x07reserve\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\t \x03(\rB\n\n\x08_feerateB\x0b\n\t_announceB\x0b\n\t_close_toB\x0c\n\n_push_msatB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xf9\x01\n\x19\x46undchannel_startResponse\x12\x17\n\x0f\x66unding_address\x18\x01 \x01(\t\x12\x14\n\x0cscriptpubkey\x18\x02 \x01(\x0c\x12=\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32\".cln.Fundchannel_startChannel_typeH\x00\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x12\x15\n\rwarning_usage\x18\x05 \x01(\t\x12\x15\n\x08mindepth\x18\x06 \x01(\rH\x02\x88\x01\x01\x42\x0f\n\r_channel_typeB\x0b\n\t_close_toB\x0b\n\t_mindepth\"R\n\x1d\x46undchannel_startChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x9d\x01\n\rGetlogRequest\x12\x32\n\x05level\x18\x01 \x01(\x0e\x32\x1e.cln.GetlogRequest.GetlogLevelH\x00\x88\x01\x01\"N\n\x0bGetlogLevel\x12\n\n\x06\x42ROKEN\x10\x00\x12\x0b\n\x07UNUSUAL\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\t\n\x05\x44\x45\x42UG\x10\x03\x12\x06\n\x02IO\x10\x04\x12\t\n\x05TRACE\x10\x05\x42\x08\n\x06_level\"h\n\x0eGetlogResponse\x12\x12\n\ncreated_at\x18\x01 \x01(\t\x12\x12\n\nbytes_used\x18\x02 \x01(\r\x12\x11\n\tbytes_max\x18\x03 \x01(\r\x12\x1b\n\x03log\x18\x04 \x03(\x0b\x32\x0e.cln.GetlogLog\"\xe8\x02\n\tGetlogLog\x12/\n\titem_type\x18\x01 \x01(\x0e\x32\x1c.cln.GetlogLog.GetlogLogType\x12\x18\n\x0bnum_skipped\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04time\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03log\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07node_id\x18\x06 \x01(\x0cH\x04\x88\x01\x01\x12\x11\n\x04\x64\x61ta\x18\x07 \x01(\x0cH\x05\x88\x01\x01\"l\n\rGetlogLogType\x12\x0b\n\x07SKIPPED\x10\x00\x12\n\n\x06\x42ROKEN\x10\x01\x12\x0b\n\x07UNUSUAL\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\t\n\x05IO_IN\x10\x05\x12\n\n\x06IO_OUT\x10\x06\x12\t\n\x05TRACE\x10\x07\x42\x0e\n\x0c_num_skippedB\x07\n\x05_timeB\t\n\x07_sourceB\x06\n\x04_logB\n\n\x08_node_idB\x07\n\x05_data\"\xd9\x08\n\x13\x46underupdateRequest\x12@\n\x06policy\x18\x01 \x01(\x0e\x32+.cln.FunderupdateRequest.FunderupdatePolicyH\x00\x88\x01\x01\x12$\n\npolicy_mod\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x18\n\x0bleases_only\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12\x30\n\x16min_their_funding_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x30\n\x16max_their_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12.\n\x14per_channel_min_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12.\n\x14per_channel_max_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12+\n\x11reserve_tank_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x07\x88\x01\x01\x12\x19\n\x0c\x66uzz_percent\x18\t \x01(\rH\x08\x88\x01\x01\x12\x1d\n\x10\x66und_probability\x18\n \x01(\rH\t\x88\x01\x01\x12-\n\x13lease_fee_base_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x12\x1c\n\x0flease_fee_basis\x18\x0c \x01(\rH\x0b\x88\x01\x01\x12\x1b\n\x0e\x66unding_weight\x18\r \x01(\rH\x0c\x88\x01\x01\x12\x33\n\x19\x63hannel_fee_max_base_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\r\x88\x01\x01\x12\x35\n(channel_fee_max_proportional_thousandths\x18\x0f \x01(\rH\x0e\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x10 \x01(\x0cH\x0f\x88\x01\x01\"9\n\x12\x46underupdatePolicy\x12\t\n\x05MATCH\x10\x00\x12\r\n\tAVAILABLE\x10\x01\x12\t\n\x05\x46IXED\x10\x02\x42\t\n\x07_policyB\r\n\x0b_policy_modB\x0e\n\x0c_leases_onlyB\x19\n\x17_min_their_funding_msatB\x19\n\x17_max_their_funding_msatB\x17\n\x15_per_channel_min_msatB\x17\n\x15_per_channel_max_msatB\x14\n\x12_reserve_tank_msatB\x0f\n\r_fuzz_percentB\x13\n\x11_fund_probabilityB\x16\n\x14_lease_fee_base_msatB\x12\n\x10_lease_fee_basisB\x11\n\x0f_funding_weightB\x1c\n\x1a_channel_fee_max_base_msatB+\n)_channel_fee_max_proportional_thousandthsB\x10\n\x0e_compact_lease\"\xdf\x06\n\x14\x46underupdateResponse\x12\x0f\n\x07summary\x18\x01 \x01(\t\x12<\n\x06policy\x18\x02 \x01(\x0e\x32,.cln.FunderupdateResponse.FunderupdatePolicy\x12\x12\n\npolicy_mod\x18\x03 \x01(\r\x12\x13\n\x0bleases_only\x18\x04 \x01(\x08\x12+\n\x16min_their_funding_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x16max_their_funding_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12)\n\x14per_channel_min_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12)\n\x14per_channel_max_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x11reserve_tank_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66uzz_percent\x18\n \x01(\r\x12\x18\n\x10\x66und_probability\x18\x0b \x01(\r\x12-\n\x13lease_fee_base_msat\x18\x0c \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x1c\n\x0flease_fee_basis\x18\r \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0e\x66unding_weight\x18\x0e \x01(\rH\x02\x88\x01\x01\x12\x33\n\x19\x63hannel_fee_max_base_msat\x18\x0f \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x35\n(channel_fee_max_proportional_thousandths\x18\x10 \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x11 \x01(\x0cH\x05\x88\x01\x01\"9\n\x12\x46underupdatePolicy\x12\t\n\x05MATCH\x10\x00\x12\r\n\tAVAILABLE\x10\x01\x12\t\n\x05\x46IXED\x10\x02\x42\x16\n\x14_lease_fee_base_msatB\x12\n\x10_lease_fee_basisB\x11\n\x0f_funding_weightB\x1c\n\x1a_channel_fee_max_base_msatB+\n)_channel_fee_max_proportional_thousandthsB\x10\n\x0e_compact_lease\"\xec\x01\n\x0fGetrouteRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x12\n\nriskfactor\x18\x03 \x01(\x04\x12\x11\n\x04\x63ltv\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x13\n\x06\x66romid\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x12\x18\n\x0b\x66uzzpercent\x18\x06 \x01(\rH\x02\x88\x01\x01\x12\x0f\n\x07\x65xclude\x18\x07 \x03(\t\x12\x14\n\x07maxhops\x18\x08 \x01(\rH\x03\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountB\x07\n\x05_cltvB\t\n\x07_fromidB\x0e\n\x0c_fuzzpercentB\n\n\x08_maxhops\"5\n\x10GetrouteResponse\x12!\n\x05route\x18\x01 \x03(\x0b\x32\x12.cln.GetrouteRoute\"\xc5\x01\n\rGetrouteRoute\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x11\n\tdirection\x18\x03 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\r\n\x05\x64\x65lay\x18\x05 \x01(\r\x12\x34\n\x05style\x18\x06 \x01(\x0e\x32%.cln.GetrouteRoute.GetrouteRouteStyle\"\x1d\n\x12GetrouteRouteStyle\x12\x07\n\x03TLV\x10\x00\"\xb7\x03\n\x13ListforwardsRequest\x12@\n\x06status\x18\x01 \x01(\x0e\x32+.cln.ListforwardsRequest.ListforwardsStatusH\x00\x88\x01\x01\x12\x17\n\nin_channel\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bout_channel\x18\x03 \x01(\tH\x02\x88\x01\x01\x12>\n\x05index\x18\x04 \x01(\x0e\x32*.cln.ListforwardsRequest.ListforwardsIndexH\x03\x88\x01\x01\x12\x12\n\x05start\x18\x05 \x01(\x04H\x04\x88\x01\x01\x12\x12\n\x05limit\x18\x06 \x01(\rH\x05\x88\x01\x01\"L\n\x12ListforwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"-\n\x11ListforwardsIndex\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x42\t\n\x07_statusB\r\n\x0b_in_channelB\x0e\n\x0c_out_channelB\x08\n\x06_indexB\x08\n\x06_startB\x08\n\x06_limit\"C\n\x14ListforwardsResponse\x12+\n\x08\x66orwards\x18\x01 \x03(\x0b\x32\x19.cln.ListforwardsForwards\"\xb4\x06\n\x14ListforwardsForwards\x12\x12\n\nin_channel\x18\x01 \x01(\t\x12\x1c\n\x07in_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x44\n\x06status\x18\x03 \x01(\x0e\x32\x34.cln.ListforwardsForwards.ListforwardsForwardsStatus\x12\x15\n\rreceived_time\x18\x04 \x01(\x01\x12\x18\n\x0bout_channel\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\"\n\x08\x66\x65\x65_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\"\n\x08out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12G\n\x05style\x18\t \x01(\x0e\x32\x33.cln.ListforwardsForwards.ListforwardsForwardsStyleH\x03\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\x04\x88\x01\x01\x12\x18\n\x0bout_htlc_id\x18\x0b \x01(\x04H\x05\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1a\n\rupdated_index\x18\r \x01(\x04H\x07\x88\x01\x01\x12\x1a\n\rresolved_time\x18\x0e \x01(\x01H\x08\x88\x01\x01\x12\x15\n\x08\x66\x61ilcode\x18\x0f \x01(\rH\t\x88\x01\x01\x12\x17\n\nfailreason\x18\x10 \x01(\tH\n\x88\x01\x01\"T\n\x1aListforwardsForwardsStatus\x12\x0b\n\x07OFFERED\x10\x00\x12\x0b\n\x07SETTLED\x10\x01\x12\x10\n\x0cLOCAL_FAILED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"0\n\x19ListforwardsForwardsStyle\x12\n\n\x06LEGACY\x10\x00\x12\x07\n\x03TLV\x10\x01\x42\x0e\n\x0c_out_channelB\x0b\n\t_fee_msatB\x0b\n\t_out_msatB\x08\n\x06_styleB\r\n\x0b_in_htlc_idB\x0e\n\x0c_out_htlc_idB\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x10\n\x0e_resolved_timeB\x0b\n\t_failcodeB\r\n\x0b_failreason\"a\n\x11ListoffersRequest\x12\x15\n\x08offer_id\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0b\x61\x63tive_only\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x0b\n\t_offer_idB\x0e\n\x0c_active_only\";\n\x12ListoffersResponse\x12%\n\x06offers\x18\x01 \x03(\x0b\x32\x15.cln.ListoffersOffers\"\x84\x01\n\x10ListoffersOffers\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x12\n\x05label\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\"\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\x12\n\x05label\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x03\x88\x01\x01\x12%\n\x0b\x61mount_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12*\n\x10\x61mount_sent_msat\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x17\n\nerroronion\x18\n \x01(\x0cH\x06\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x0b \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0c\x63ompleted_at\x18\x0c \x01(\x04H\x08\x88\x01\x01\x12\x15\n\x08preimage\x18\r \x01(\x0cH\t\x88\x01\x01\x12\x1c\n\x0fnumber_of_parts\x18\x0e \x01(\x04H\n\x88\x01\x01\";\n\x12ListpaysPaysStatus\x12\x0b\n\x07PENDING\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0c\n\x08\x43OMPLETE\x10\x02\x42\x0e\n\x0c_destinationB\x08\n\x06_labelB\t\n\x07_bolt11B\t\n\x07_bolt12B\x0e\n\x0c_amount_msatB\x13\n\x11_amount_sent_msatB\r\n\x0b_erroronionB\x0e\n\x0c_descriptionB\x0f\n\r_completed_atB\x0b\n\t_preimageB\x12\n\x10_number_of_parts\"*\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\"\xb2\x02\n\x17MultifundchannelRequest\x12\x37\n\x0c\x64\x65stinations\x18\x01 \x03(\x0b\x32!.cln.MultifundchannelDestinations\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\x12H\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.Outpoint\x12\x18\n\x0bminchannels\x18\x05 \x01(\x12H\x02\x88\x01\x01\x12-\n\x12\x63ommitment_feerate\x18\x06 \x01(\x0b\x32\x0c.cln.FeerateH\x03\x88\x01\x01\x42\n\n\x08_feerateB\n\n\x08_minconfB\x0e\n\x0c_minchannelsB\x15\n\x13_commitment_feerate\"\x98\x01\n\x18MultifundchannelResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x35\n\x0b\x63hannel_ids\x18\x03 \x03(\x0b\x32 .cln.MultifundchannelChannel_ids\x12+\n\x06\x66\x61iled\x18\x04 \x03(\x0b\x32\x1b.cln.MultifundchannelFailed\"\xff\x02\n\x1cMultifundchannelDestinations\x12\n\n\x02id\x18\x01 \x01(\t\x12 \n\x06\x61mount\x18\x02 \x01(\x0b\x32\x10.cln.AmountOrAll\x12\x15\n\x08\x61nnounce\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12#\n\tpush_msat\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\tH\x02\x88\x01\x01\x12%\n\x0brequest_amt\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x07 \x01(\tH\x04\x88\x01\x01\x12\x15\n\x08mindepth\x18\x08 \x01(\rH\x05\x88\x01\x01\x12!\n\x07reserve\x18\t \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x42\x0b\n\t_announceB\x0c\n\n_push_msatB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_leaseB\x0b\n\t_mindepthB\n\n\x08_reserve\"\xcb\x01\n\x1bMultifundchannelChannel_ids\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12\x12\n\nchannel_id\x18\x03 \x01(\x0c\x12G\n\x0c\x63hannel_type\x18\x04 \x01(\x0b\x32,.cln.MultifundchannelChannel_idsChannel_typeH\x00\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\x0b\n\t_close_to\"\\\n\'MultifundchannelChannel_idsChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\x93\x02\n\x16MultifundchannelFailed\x12\n\n\x02id\x18\x01 \x01(\x0c\x12H\n\x06method\x18\x02 \x01(\x0e\x32\x38.cln.MultifundchannelFailed.MultifundchannelFailedMethod\x12/\n\x05\x65rror\x18\x03 \x01(\x0b\x32 .cln.MultifundchannelFailedError\"r\n\x1cMultifundchannelFailedMethod\x12\x0b\n\x07\x43ONNECT\x10\x00\x12\x14\n\x10OPENCHANNEL_INIT\x10\x01\x12\x15\n\x11\x46UNDCHANNEL_START\x10\x02\x12\x18\n\x14\x46UNDCHANNEL_COMPLETE\x10\x03\"<\n\x1bMultifundchannelFailedError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x12\x12\x0f\n\x07message\x18\x02 \x01(\t\"\xa8\x01\n\x14MultiwithdrawRequest\x12 \n\x07outputs\x18\x01 \x03(\x0b\x32\x0f.cln.OutputDesc\x12\"\n\x07\x66\x65\x65rate\x18\x02 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x14\n\x07minconf\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x05utxos\x18\x04 \x03(\x0b\x32\r.cln.OutpointB\n\n\x08_feerateB\n\n\x08_minconf\"1\n\x15MultiwithdrawResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\"\xa0\x04\n\x0cOfferRequest\x12\x0e\n\x06\x61mount\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06issuer\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05label\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0cquantity_max\x18\x05 \x01(\x04H\x03\x88\x01\x01\x12\x1c\n\x0f\x61\x62solute_expiry\x18\x06 \x01(\x04H\x04\x88\x01\x01\x12\x17\n\nrecurrence\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1c\n\x0frecurrence_base\x18\x08 \x01(\tH\x06\x88\x01\x01\x12!\n\x14recurrence_paywindow\x18\t \x01(\tH\x07\x88\x01\x01\x12\x1d\n\x10recurrence_limit\x18\n \x01(\rH\x08\x88\x01\x01\x12\x17\n\nsingle_use\x18\x0b \x01(\x08H\t\x88\x01\x01\x12(\n\x1brecurrence_start_any_period\x18\x0c \x01(\x08H\n\x88\x01\x01\x42\x0e\n\x0c_descriptionB\t\n\x07_issuerB\x08\n\x06_labelB\x0f\n\r_quantity_maxB\x12\n\x10_absolute_expiryB\r\n\x0b_recurrenceB\x12\n\x10_recurrence_baseB\x17\n\x15_recurrence_paywindowB\x13\n\x11_recurrence_limitB\r\n\x0b_single_useB\x1e\n\x1c_recurrence_start_any_period\"\x92\x01\n\rOfferResponse\x12\x10\n\x08offer_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x12\n\nsingle_use\x18\x03 \x01(\x08\x12\x0e\n\x06\x62olt12\x18\x04 \x01(\t\x12\x0c\n\x04used\x18\x05 \x01(\x08\x12\x0f\n\x07\x63reated\x18\x06 \x01(\x08\x12\x12\n\x05label\x18\x07 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_label\".\n\x18Openchannel_abortRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"Y\n\x19Openchannel_abortResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x18\n\x10\x63hannel_canceled\x18\x02 \x01(\x08\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x9f\x01\n\x17Openchannel_bumpRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0binitialpsbt\x18\x02 \x01(\t\x12*\n\x0f\x66unding_feerate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x1b\n\x06\x61mount\x18\x04 \x01(\x0b\x32\x0b.cln.AmountB\x12\n\x10_funding_feerate\"\x86\x02\n\x18Openchannel_bumpResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12<\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32!.cln.Openchannel_bumpChannel_typeH\x00\x88\x01\x01\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\x1c\n\x1a_requires_confirmed_inputs\"Q\n\x1cOpenchannel_bumpChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"\xa0\x03\n\x17Openchannel_initRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x13\n\x0binitialpsbt\x18\x02 \x01(\t\x12-\n\x12\x63ommitment_feerate\x18\x03 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12*\n\x0f\x66unding_feerate\x18\x04 \x01(\x0b\x32\x0c.cln.FeerateH\x01\x88\x01\x01\x12\x15\n\x08\x61nnounce\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\tH\x03\x88\x01\x01\x12%\n\x0brequest_amt\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x04\x88\x01\x01\x12\x1a\n\rcompact_lease\x18\x08 \x01(\x0cH\x05\x88\x01\x01\x12\x14\n\x0c\x63hannel_type\x18\t \x03(\r\x12\x1b\n\x06\x61mount\x18\n \x01(\x0b\x32\x0b.cln.AmountB\x15\n\x13_commitment_feerateB\x12\n\x10_funding_feerateB\x0b\n\t_announceB\x0b\n\t_close_toB\x0e\n\x0c_request_amtB\x10\n\x0e_compact_lease\"\x86\x02\n\x18Openchannel_initResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12<\n\x0c\x63hannel_type\x18\x03 \x01(\x0b\x32!.cln.Openchannel_initChannel_typeH\x00\x88\x01\x01\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_serial\x18\x05 \x01(\x04\x12&\n\x19requires_confirmed_inputs\x18\x06 \x01(\x08H\x01\x88\x01\x01\x42\x0f\n\r_channel_typeB\x1c\n\x1a_requires_confirmed_inputs\"Q\n\x1cOpenchannel_initChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"D\n\x19Openchannel_signedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_psbt\x18\x02 \x01(\t\"J\n\x1aOpenchannel_signedResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\n\n\x02tx\x18\x02 \x01(\x0c\x12\x0c\n\x04txid\x18\x03 \x01(\x0c\"=\n\x19Openchannel_updateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"\xae\x02\n\x1aOpenchannel_updateResponse\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12>\n\x0c\x63hannel_type\x18\x02 \x01(\x0b\x32#.cln.Openchannel_updateChannel_typeH\x00\x88\x01\x01\x12\x0c\n\x04psbt\x18\x03 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x04 \x01(\x08\x12\x16\n\x0e\x66unding_outnum\x18\x05 \x01(\r\x12\x15\n\x08\x63lose_to\x18\x06 \x01(\x0cH\x01\x88\x01\x01\x12&\n\x19requires_confirmed_inputs\x18\x07 \x01(\x08H\x02\x88\x01\x01\x42\x0f\n\r_channel_typeB\x0b\n\t_close_toB\x1c\n\x1a_requires_confirmed_inputs\"S\n\x1eOpenchannel_updateChannel_type\x12\x0c\n\x04\x62its\x18\x01 \x03(\r\x12#\n\x05names\x18\x02 \x03(\x0e\x32\x14.cln.ChannelTypeName\"Y\n\x0bPingRequest\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x10\n\x03len\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x16\n\tpongbytes\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x06\n\x04_lenB\x0c\n\n_pongbytes\"\x1e\n\x0cPingResponse\x12\x0e\n\x06totlen\x18\x01 \x01(\r\"\x91\x01\n\rPluginRequest\x12)\n\nsubcommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12\x13\n\x06plugin\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tdirectory\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x07options\x18\x04 \x03(\tB\t\n\x07_pluginB\x0c\n\n_directory\"}\n\x0ePluginResponse\x12&\n\x07\x63ommand\x18\x01 \x01(\x0e\x32\x15.cln.PluginSubcommand\x12#\n\x07plugins\x18\x02 \x03(\x0b\x32\x12.cln.PluginPlugins\x12\x13\n\x06result\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_result\">\n\rPluginPlugins\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x0f\n\x07\x64ynamic\x18\x03 \x01(\x08\"<\n\x14RenepaystatusRequest\x12\x16\n\tinvstring\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_invstring\"G\n\x15RenepaystatusResponse\x12.\n\tpaystatus\x18\x01 \x03(\x0b\x32\x1b.cln.RenepaystatusPaystatus\"\xe2\x03\n\x16RenepaystatusPaystatus\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\x12\x1d\n\x10payment_preimage\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\x0f\n\x07groupid\x18\x05 \x01(\r\x12\x12\n\x05parts\x18\x06 \x01(\rH\x01\x88\x01\x01\x12 \n\x0b\x61mount_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12*\n\x10\x61mount_sent_msat\x18\x08 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12H\n\x06status\x18\t \x01(\x0e\x32\x38.cln.RenepaystatusPaystatus.RenepaystatusPaystatusStatus\x12\x18\n\x0b\x64\x65stination\x18\n \x01(\x0cH\x03\x88\x01\x01\x12\r\n\x05notes\x18\x0b \x03(\t\"E\n\x1cRenepaystatusPaystatusStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x13\n\x11_payment_preimageB\x08\n\x06_partsB\x13\n\x11_amount_sent_msatB\x0e\n\x0c_destination\"\xc9\x02\n\x0eRenepayRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12 \n\x06maxfee\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12\x15\n\x08maxdelay\x18\x04 \x01(\rH\x02\x88\x01\x01\x12\x16\n\tretry_for\x18\x05 \x01(\rH\x03\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x06 \x01(\tH\x04\x88\x01\x01\x12\x12\n\x05label\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1b\n\x0e\x64\x65v_use_shadow\x18\x08 \x01(\x08H\x06\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\t\n\x07_maxfeeB\x0b\n\t_maxdelayB\x0c\n\n_retry_forB\x0e\n\x0c_descriptionB\x08\n\x06_labelB\x11\n\x0f_dev_use_shadow\"\xc3\x02\n\x0fRenepayResponse\x12\x18\n\x10payment_preimage\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\r\n\x05parts\x18\x04 \x01(\r\x12 \n\x0b\x61mount_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x10\x61mount_sent_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12\x32\n\x06status\x18\x07 \x01(\x0e\x32\".cln.RenepayResponse.RenepayStatus\x12\x18\n\x0b\x64\x65stination\x18\x08 \x01(\x0cH\x00\x88\x01\x01\"6\n\rRenepayStatus\x12\x0c\n\x08\x43OMPLETE\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x42\x0e\n\x0c_destination\"l\n\x14ReserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x16\n\texclusive\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x14\n\x07reserve\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x0c\n\n_exclusiveB\n\n\x08_reserve\"M\n\x15ReserveinputsResponse\x12\x34\n\x0creservations\x18\x01 \x03(\x0b\x32\x1e.cln.ReserveinputsReservations\"z\n\x19ReserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x19\n\x11reserved_to_block\x18\x05 \x01(\r\"4\n\x14SendcustommsgRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x0c\x12\x0b\n\x03msg\x18\x02 \x01(\x0c\"\'\n\x15SendcustommsgResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\"\xb0\x01\n\x12SendinvoiceRequest\x12\x0e\n\x06invreq\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12%\n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08quantity\x18\x05 \x01(\x04H\x02\x88\x01\x01\x42\x0e\n\x0c_amount_msatB\n\n\x08_timeoutB\x0b\n\t_quantity\"\xcf\x04\n\x13SendinvoiceResponse\x12\r\n\x05label\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x14\n\x0cpayment_hash\x18\x03 \x01(\x0c\x12:\n\x06status\x18\x04 \x01(\x0e\x32*.cln.SendinvoiceResponse.SendinvoiceStatus\x12\x12\n\nexpires_at\x18\x05 \x01(\x04\x12%\n\x0b\x61mount_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rcreated_index\x18\x08 \x01(\x04H\x02\x88\x01\x01\x12\x1a\n\rupdated_index\x18\t \x01(\x04H\x03\x88\x01\x01\x12\x16\n\tpay_index\x18\n \x01(\x04H\x04\x88\x01\x01\x12.\n\x14\x61mount_received_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x05\x88\x01\x01\x12\x14\n\x07paid_at\x18\x0c \x01(\x04H\x06\x88\x01\x01\x12\x1d\n\x10payment_preimage\x18\r \x01(\x0cH\x07\x88\x01\x01\"6\n\x11SendinvoiceStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x42\x0e\n\x0c_amount_msatB\t\n\x07_bolt12B\x10\n\x0e_created_indexB\x10\n\x0e_updated_indexB\x0c\n\n_pay_indexB\x17\n\x15_amount_received_msatB\n\n\x08_paid_atB\x13\n\x11_payment_preimage\"\xaa\x02\n\x11SetchannelRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12!\n\x07\x66\x65\x65\x62\x61se\x18\x02 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x13\n\x06\x66\x65\x65ppm\x18\x03 \x01(\rH\x01\x88\x01\x01\x12!\n\x07htlcmin\x18\x04 \x01(\x0b\x32\x0b.cln.AmountH\x02\x88\x01\x01\x12!\n\x07htlcmax\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x19\n\x0c\x65nforcedelay\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x1c\n\x0fignorefeelimits\x18\x07 \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_feebaseB\t\n\x07_feeppmB\n\n\x08_htlcminB\n\n\x08_htlcmaxB\x0f\n\r_enforcedelayB\x12\n\x10_ignorefeelimits\"?\n\x12SetchannelResponse\x12)\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x17.cln.SetchannelChannels\"\xca\x03\n\x12SetchannelChannels\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x12\n\nchannel_id\x18\x02 \x01(\x0c\x12\x1d\n\x10short_channel_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\"\n\rfee_base_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x1b\x66\x65\x65_proportional_millionths\x18\x05 \x01(\r\x12*\n\x15minimum_htlc_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x17warning_htlcmin_too_low\x18\x07 \x01(\tH\x01\x88\x01\x01\x12*\n\x15maximum_htlc_out_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12%\n\x18warning_htlcmax_too_high\x18\t \x01(\tH\x02\x88\x01\x01\x12\x1e\n\x11ignore_fee_limits\x18\n \x01(\x08H\x03\x88\x01\x01\x42\x13\n\x11_short_channel_idB\x1a\n\x18_warning_htlcmin_too_lowB\x1b\n\x19_warning_htlcmax_too_highB\x14\n\x12_ignore_fee_limits\"<\n\x10SetconfigRequest\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x10\n\x03val\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x06\n\x04_val\"9\n\x11SetconfigResponse\x12$\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x14.cln.SetconfigConfig\"\xa5\x02\n\x0fSetconfigConfig\x12\x0e\n\x06\x63onfig\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x64ynamic\x18\x04 \x01(\x08\x12\x10\n\x03set\x18\x05 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tvalue_str\x18\x06 \x01(\tH\x02\x88\x01\x01\x12$\n\nvalue_msat\x18\x07 \x01(\x0b\x32\x0b.cln.AmountH\x03\x88\x01\x01\x12\x16\n\tvalue_int\x18\x08 \x01(\x12H\x04\x88\x01\x01\x12\x17\n\nvalue_bool\x18\t \x01(\x08H\x05\x88\x01\x01\x42\t\n\x07_pluginB\x06\n\x04_setB\x0c\n\n_value_strB\r\n\x0b_value_msatB\x0c\n\n_value_intB\r\n\x0b_value_bool\"6\n\x15SetpsbtversionRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\r\"&\n\x16SetpsbtversionResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"\'\n\x12SigninvoiceRequest\x12\x11\n\tinvstring\x18\x01 \x01(\t\"%\n\x13SigninvoiceResponse\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"%\n\x12SignmessageRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"F\n\x13SignmessageResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\r\n\x05recid\x18\x02 \x01(\x0c\x12\r\n\x05zbase\x18\x03 \x01(\t\"\xc9\x01\n\x12Splice_initRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x17\n\x0frelative_amount\x18\x02 \x01(\x12\x12\x18\n\x0binitialpsbt\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x66\x65\x65rate_per_kw\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1a\n\rforce_feerate\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x0e\n\x0c_initialpsbtB\x11\n\x0f_feerate_per_kwB\x10\n\x0e_force_feerate\"#\n\x13Splice_initResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\"`\n\x14Splice_signedRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\x12\x17\n\nsign_first\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\r\n\x0b_sign_first\"Q\n\x15Splice_signedResponse\x12\n\n\x02tx\x18\x01 \x01(\x0c\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x13\n\x06outnum\x18\x03 \x01(\rH\x00\x88\x01\x01\x42\t\n\x07_outnum\"8\n\x14Splice_updateRequest\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\x12\x0c\n\x04psbt\x18\x02 \x01(\t\"B\n\x15Splice_updateResponse\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x1b\n\x13\x63ommitments_secured\x18\x02 \x01(\x08\"H\n\x16UnreserveinputsRequest\x12\x0c\n\x04psbt\x18\x01 \x01(\t\x12\x14\n\x07reserve\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_reserve\"Q\n\x17UnreserveinputsResponse\x12\x36\n\x0creservations\x18\x01 \x03(\x0b\x32 .cln.UnreserveinputsReservations\"\x97\x01\n\x1bUnreserveinputsReservations\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0c\n\x04vout\x18\x02 \x01(\r\x12\x14\n\x0cwas_reserved\x18\x03 \x01(\x08\x12\x10\n\x08reserved\x18\x04 \x01(\x08\x12\x1e\n\x11reserved_to_block\x18\x05 \x01(\rH\x00\x88\x01\x01\x42\x14\n\x12_reserved_to_block\"n\n\x14UpgradewalletRequest\x12\"\n\x07\x66\x65\x65rate\x18\x01 \x01(\x0b\x32\x0c.cln.FeerateH\x00\x88\x01\x01\x12\x17\n\nreservedok\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\n\n\x08_feerateB\r\n\x0b_reservedok\"\x95\x01\n\x15UpgradewalletResponse\x12\x1a\n\rupgraded_outs\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x11\n\x04psbt\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x0f\n\x02tx\x18\x03 \x01(\x0cH\x02\x88\x01\x01\x12\x11\n\x04txid\x18\x04 \x01(\x0cH\x03\x88\x01\x01\x42\x10\n\x0e_upgraded_outsB\x07\n\x05_psbtB\x05\n\x03_txB\x07\n\x05_txid\"O\n\x16WaitblockheightRequest\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\x12\x14\n\x07timeout\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\n\n\x08_timeout\".\n\x17WaitblockheightResponse\x12\x13\n\x0b\x62lockheight\x18\x01 \x01(\r\"\xf9\x01\n\x0bWaitRequest\x12\x31\n\tsubsystem\x18\x01 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitSubsystem\x12\x31\n\tindexname\x18\x02 \x01(\x0e\x32\x1e.cln.WaitRequest.WaitIndexname\x12\x11\n\tnextvalue\x18\x03 \x01(\x04\"9\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\"6\n\rWaitIndexname\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x12\x0b\n\x07\x44\x45LETED\x10\x02\"\x97\x02\n\x0cWaitResponse\x12\x32\n\tsubsystem\x18\x01 \x01(\x0e\x32\x1f.cln.WaitResponse.WaitSubsystem\x12\x14\n\x07\x63reated\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07updated\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x14\n\x07\x64\x65leted\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12&\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32\x10.cln.WaitDetailsH\x03\x88\x01\x01\"9\n\rWaitSubsystem\x12\x0c\n\x08INVOICES\x10\x00\x12\x0c\n\x08\x46ORWARDS\x10\x01\x12\x0c\n\x08SENDPAYS\x10\x02\x42\n\n\x08_createdB\n\n\x08_updatedB\n\n\x08_deletedB\n\n\x08_details\"\xfc\x04\n\x0bWaitDetails\x12\x37\n\x06status\x18\x01 \x01(\x0e\x32\".cln.WaitDetails.WaitDetailsStatusH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06\x62olt11\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x62olt12\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x13\n\x06partid\x18\x06 \x01(\x04H\x05\x88\x01\x01\x12\x14\n\x07groupid\x18\x07 \x01(\x04H\x06\x88\x01\x01\x12\x19\n\x0cpayment_hash\x18\x08 \x01(\x0cH\x07\x88\x01\x01\x12\x17\n\nin_channel\x18\t \x01(\tH\x08\x88\x01\x01\x12\x17\n\nin_htlc_id\x18\n \x01(\x04H\t\x88\x01\x01\x12!\n\x07in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\n\x88\x01\x01\x12\x18\n\x0bout_channel\x18\x0c \x01(\tH\x0b\x88\x01\x01\"\x89\x01\n\x11WaitDetailsStatus\x12\n\n\x06UNPAID\x10\x00\x12\x08\n\x04PAID\x10\x01\x12\x0b\n\x07\x45XPIRED\x10\x02\x12\x0b\n\x07PENDING\x10\x03\x12\n\n\x06\x46\x41ILED\x10\x04\x12\x0c\n\x08\x43OMPLETE\x10\x05\x12\x0b\n\x07OFFERED\x10\x06\x12\x0b\n\x07SETTLED\x10\x07\x12\x10\n\x0cLOCAL_FAILED\x10\x08\x42\t\n\x07_statusB\x08\n\x06_labelB\x0e\n\x0c_descriptionB\t\n\x07_bolt11B\t\n\x07_bolt12B\t\n\x07_partidB\n\n\x08_groupidB\x0f\n\r_payment_hashB\r\n\x0b_in_channelB\r\n\x0b_in_htlc_idB\n\n\x08_in_msatB\x0e\n\x0c_out_channel\"4\n\x12ListconfigsRequest\x12\x13\n\x06\x63onfig\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_config\"\xdf\x1b\n\x13ListconfigsResponse\x12-\n\x07\x63onfigs\x18\x01 \x01(\x0b\x32\x17.cln.ListconfigsConfigsH\x00\x88\x01\x01\x12(\n\x07plugins\x18\x03 \x03(\x0b\x32\x17.cln.ListconfigsPlugins\x12;\n\x11important_plugins\x18\x04 \x03(\x0b\x32 .cln.ListconfigsImportantplugins\x12\x11\n\x04\x63onf\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rlightning_dir\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07network\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\"\n\x15\x61llow_deprecated_apis\x18\x08 \x01(\x08H\x04\x88\x01\x01\x12\x15\n\x08rpc_file\x18\t \x01(\tH\x05\x88\x01\x01\x12\x16\n\x0e\x64isable_plugin\x18\n \x03(\t\x12\x1b\n\x0e\x62ookkeeper_dir\x18\x0b \x01(\tH\x06\x88\x01\x01\x12\x1a\n\rbookkeeper_db\x18\x0c \x01(\tH\x07\x88\x01\x01\x12\x1d\n\x10\x61lways_use_proxy\x18\r \x01(\x08H\x08\x88\x01\x01\x12\x13\n\x06\x64\x61\x65mon\x18\x0e \x01(\x08H\t\x88\x01\x01\x12\x13\n\x06wallet\x18\x0f \x01(\tH\n\x88\x01\x01\x12\x1b\n\x0elarge_channels\x18\x10 \x01(\x08H\x0b\x88\x01\x01\x12#\n\x16\x65xperimental_dual_fund\x18\x11 \x01(\x08H\x0c\x88\x01\x01\x12\"\n\x15\x65xperimental_splicing\x18\x12 \x01(\x08H\r\x88\x01\x01\x12(\n\x1b\x65xperimental_onion_messages\x18\x13 \x01(\x08H\x0e\x88\x01\x01\x12 \n\x13\x65xperimental_offers\x18\x14 \x01(\x08H\x0f\x88\x01\x01\x12\x30\n#experimental_shutdown_wrong_funding\x18\x15 \x01(\x08H\x10\x88\x01\x01\x12&\n\x19\x65xperimental_peer_storage\x18\x16 \x01(\x08H\x11\x88\x01\x01\x12!\n\x14\x65xperimental_quiesce\x18\x17 \x01(\x08H\x12\x88\x01\x01\x12*\n\x1d\x65xperimental_upgrade_protocol\x18\x18 \x01(\x08H\x13\x88\x01\x01\x12&\n\x19invoices_onchain_fallback\x18\x19 \x01(\x08H\x14\x88\x01\x01\x12\x1d\n\x10\x64\x61tabase_upgrade\x18\x1a \x01(\x08H\x15\x88\x01\x01\x12\x10\n\x03rgb\x18\x1b \x01(\x0cH\x16\x88\x01\x01\x12\x12\n\x05\x61lias\x18\x1c \x01(\tH\x17\x88\x01\x01\x12\x15\n\x08pid_file\x18\x1d \x01(\tH\x18\x88\x01\x01\x12\x1e\n\x11ignore_fee_limits\x18\x1e \x01(\x08H\x19\x88\x01\x01\x12\x1d\n\x10watchtime_blocks\x18\x1f \x01(\rH\x1a\x88\x01\x01\x12 \n\x13max_locktime_blocks\x18 \x01(\rH\x1b\x88\x01\x01\x12\x1d\n\x10\x66unding_confirms\x18! \x01(\rH\x1c\x88\x01\x01\x12\x17\n\ncltv_delta\x18\" \x01(\rH\x1d\x88\x01\x01\x12\x17\n\ncltv_final\x18# \x01(\rH\x1e\x88\x01\x01\x12\x18\n\x0b\x63ommit_time\x18$ \x01(\rH\x1f\x88\x01\x01\x12\x15\n\x08\x66\x65\x65_base\x18% \x01(\rH \x88\x01\x01\x12\x13\n\x06rescan\x18& \x01(\x12H!\x88\x01\x01\x12\x1c\n\x0f\x66\x65\x65_per_satoshi\x18\' \x01(\rH\"\x88\x01\x01\x12!\n\x14max_concurrent_htlcs\x18( \x01(\rH#\x88\x01\x01\x12+\n\x11htlc_minimum_msat\x18) \x01(\x0b\x32\x0b.cln.AmountH$\x88\x01\x01\x12+\n\x11htlc_maximum_msat\x18* \x01(\x0b\x32\x0b.cln.AmountH%\x88\x01\x01\x12\x35\n\x1bmax_dust_htlc_exposure_msat\x18+ \x01(\x0b\x32\x0b.cln.AmountH&\x88\x01\x01\x12\x1d\n\x10min_capacity_sat\x18, \x01(\x04H\'\x88\x01\x01\x12\x11\n\x04\x61\x64\x64r\x18- \x01(\tH(\x88\x01\x01\x12\x1a\n\rannounce_addr\x18. \x01(\tH)\x88\x01\x01\x12\x16\n\tbind_addr\x18/ \x01(\tH*\x88\x01\x01\x12\x14\n\x07offline\x18\x30 \x01(\x08H+\x88\x01\x01\x12\x17\n\nautolisten\x18\x31 \x01(\x08H,\x88\x01\x01\x12\x12\n\x05proxy\x18\x32 \x01(\tH-\x88\x01\x01\x12\x18\n\x0b\x64isable_dns\x18\x33 \x01(\x08H.\x88\x01\x01\x12%\n\x18\x61nnounce_addr_discovered\x18\x34 \x01(\tH/\x88\x01\x01\x12*\n\x1d\x61nnounce_addr_discovered_port\x18\x35 \x01(\x12H0\x88\x01\x01\x12\x1a\n\rencrypted_hsm\x18\x36 \x01(\x08H1\x88\x01\x01\x12\x1a\n\rrpc_file_mode\x18\x37 \x01(\tH2\x88\x01\x01\x12\x16\n\tlog_level\x18\x38 \x01(\tH3\x88\x01\x01\x12\x17\n\nlog_prefix\x18\x39 \x01(\tH4\x88\x01\x01\x12\x15\n\x08log_file\x18: \x01(\tH5\x88\x01\x01\x12\x1b\n\x0elog_timestamps\x18; \x01(\x08H6\x88\x01\x01\x12\x1b\n\x0e\x66orce_feerates\x18< \x01(\tH7\x88\x01\x01\x12\x16\n\tsubdaemon\x18= \x01(\tH8\x88\x01\x01\x12#\n\x16\x66\x65tchinvoice_noconnect\x18> \x01(\x08H9\x88\x01\x01\x12\"\n\x15\x61\x63\x63\x65pt_htlc_tlv_types\x18? \x01(\tH:\x88\x01\x01\x12!\n\x14tor_service_password\x18@ \x01(\tH;\x88\x01\x01\x12!\n\x14\x64\x65v_allowdustreserve\x18\x41 \x01(\x08H<\x88\x01\x01\x12\x1e\n\x11\x61nnounce_addr_dns\x18\x42 \x01(\x08H=\x88\x01\x01\x12%\n\x18require_confirmed_inputs\x18\x43 \x01(\x08H>\x88\x01\x01\x12\x16\n\tdeveloper\x18\x44 \x01(\x08H?\x88\x01\x01\x12\x17\n\ncommit_fee\x18\x45 \x01(\x04H@\x88\x01\x01\x12,\n\x12min_emergency_msat\x18\x46 \x01(\x0b\x32\x0b.cln.AmountHA\x88\x01\x01\x12\"\n\x15\x63ommit_feerate_offset\x18G \x01(\rHB\x88\x01\x01\x42\n\n\x08_configsB\x07\n\x05_confB\x10\n\x0e_lightning_dirB\n\n\x08_networkB\x18\n\x16_allow_deprecated_apisB\x0b\n\t_rpc_fileB\x11\n\x0f_bookkeeper_dirB\x10\n\x0e_bookkeeper_dbB\x13\n\x11_always_use_proxyB\t\n\x07_daemonB\t\n\x07_walletB\x11\n\x0f_large_channelsB\x19\n\x17_experimental_dual_fundB\x18\n\x16_experimental_splicingB\x1e\n\x1c_experimental_onion_messagesB\x16\n\x14_experimental_offersB&\n$_experimental_shutdown_wrong_fundingB\x1c\n\x1a_experimental_peer_storageB\x17\n\x15_experimental_quiesceB \n\x1e_experimental_upgrade_protocolB\x1c\n\x1a_invoices_onchain_fallbackB\x13\n\x11_database_upgradeB\x06\n\x04_rgbB\x08\n\x06_aliasB\x0b\n\t_pid_fileB\x14\n\x12_ignore_fee_limitsB\x13\n\x11_watchtime_blocksB\x16\n\x14_max_locktime_blocksB\x13\n\x11_funding_confirmsB\r\n\x0b_cltv_deltaB\r\n\x0b_cltv_finalB\x0e\n\x0c_commit_timeB\x0b\n\t_fee_baseB\t\n\x07_rescanB\x12\n\x10_fee_per_satoshiB\x17\n\x15_max_concurrent_htlcsB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x1e\n\x1c_max_dust_htlc_exposure_msatB\x13\n\x11_min_capacity_satB\x07\n\x05_addrB\x10\n\x0e_announce_addrB\x0c\n\n_bind_addrB\n\n\x08_offlineB\r\n\x0b_autolistenB\x08\n\x06_proxyB\x0e\n\x0c_disable_dnsB\x1b\n\x19_announce_addr_discoveredB \n\x1e_announce_addr_discovered_portB\x10\n\x0e_encrypted_hsmB\x10\n\x0e_rpc_file_modeB\x0c\n\n_log_levelB\r\n\x0b_log_prefixB\x0b\n\t_log_fileB\x11\n\x0f_log_timestampsB\x11\n\x0f_force_feeratesB\x0c\n\n_subdaemonB\x19\n\x17_fetchinvoice_noconnectB\x18\n\x16_accept_htlc_tlv_typesB\x17\n\x15_tor_service_passwordB\x17\n\x15_dev_allowdustreserveB\x14\n\x12_announce_addr_dnsB\x1b\n\x19_require_confirmed_inputsB\x0c\n\n_developerB\r\n\x0b_commit_feeB\x15\n\x13_min_emergency_msatB\x18\n\x16_commit_feerate_offset\"\xdf.\n\x12ListconfigsConfigs\x12.\n\x04\x63onf\x18\x01 \x01(\x0b\x32\x1b.cln.ListconfigsConfigsConfH\x00\x88\x01\x01\x12\x38\n\tdeveloper\x18\x02 \x01(\x0b\x32 .cln.ListconfigsConfigsDeveloperH\x01\x88\x01\x01\x12?\n\rclear_plugins\x18\x03 \x01(\x0b\x32#.cln.ListconfigsConfigsClearpluginsH\x02\x88\x01\x01\x12;\n\x0b\x64isable_mpp\x18\x04 \x01(\x0b\x32!.cln.ListconfigsConfigsDisablemppH\x03\x88\x01\x01\x12\x34\n\x07mainnet\x18\x05 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsMainnetH\x04\x88\x01\x01\x12\x34\n\x07regtest\x18\x06 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsRegtestH\x05\x88\x01\x01\x12\x32\n\x06signet\x18\x07 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsSignetH\x06\x88\x01\x01\x12\x34\n\x07testnet\x18\x08 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsTestnetH\x07\x88\x01\x01\x12\x45\n\x10important_plugin\x18\t \x01(\x0b\x32&.cln.ListconfigsConfigsImportantpluginH\x08\x88\x01\x01\x12\x32\n\x06plugin\x18\n \x01(\x0b\x32\x1d.cln.ListconfigsConfigsPluginH\t\x88\x01\x01\x12\x39\n\nplugin_dir\x18\x0b \x01(\x0b\x32 .cln.ListconfigsConfigsPlugindirH\n\x88\x01\x01\x12?\n\rlightning_dir\x18\x0c \x01(\x0b\x32#.cln.ListconfigsConfigsLightningdirH\x0b\x88\x01\x01\x12\x34\n\x07network\x18\r \x01(\x0b\x32\x1e.cln.ListconfigsConfigsNetworkH\x0c\x88\x01\x01\x12N\n\x15\x61llow_deprecated_apis\x18\x0e \x01(\x0b\x32*.cln.ListconfigsConfigsAllowdeprecatedapisH\r\x88\x01\x01\x12\x35\n\x08rpc_file\x18\x0f \x01(\x0b\x32\x1e.cln.ListconfigsConfigsRpcfileH\x0e\x88\x01\x01\x12\x41\n\x0e\x64isable_plugin\x18\x10 \x01(\x0b\x32$.cln.ListconfigsConfigsDisablepluginH\x0f\x88\x01\x01\x12\x44\n\x10\x61lways_use_proxy\x18\x11 \x01(\x0b\x32%.cln.ListconfigsConfigsAlwaysuseproxyH\x10\x88\x01\x01\x12\x32\n\x06\x64\x61\x65mon\x18\x12 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsDaemonH\x11\x88\x01\x01\x12\x32\n\x06wallet\x18\x13 \x01(\x0b\x32\x1d.cln.ListconfigsConfigsWalletH\x12\x88\x01\x01\x12\x41\n\x0elarge_channels\x18\x14 \x01(\x0b\x32$.cln.ListconfigsConfigsLargechannelsH\x13\x88\x01\x01\x12P\n\x16\x65xperimental_dual_fund\x18\x15 \x01(\x0b\x32+.cln.ListconfigsConfigsExperimentaldualfundH\x14\x88\x01\x01\x12O\n\x15\x65xperimental_splicing\x18\x16 \x01(\x0b\x32+.cln.ListconfigsConfigsExperimentalsplicingH\x15\x88\x01\x01\x12Z\n\x1b\x65xperimental_onion_messages\x18\x17 \x01(\x0b\x32\x30.cln.ListconfigsConfigsExperimentalonionmessagesH\x16\x88\x01\x01\x12K\n\x13\x65xperimental_offers\x18\x18 \x01(\x0b\x32).cln.ListconfigsConfigsExperimentaloffersH\x17\x88\x01\x01\x12i\n#experimental_shutdown_wrong_funding\x18\x19 \x01(\x0b\x32\x37.cln.ListconfigsConfigsExperimentalshutdownwrongfundingH\x18\x88\x01\x01\x12V\n\x19\x65xperimental_peer_storage\x18\x1a \x01(\x0b\x32..cln.ListconfigsConfigsExperimentalpeerstorageH\x19\x88\x01\x01\x12M\n\x14\x65xperimental_anchors\x18\x1b \x01(\x0b\x32*.cln.ListconfigsConfigsExperimentalanchorsH\x1a\x88\x01\x01\x12\x45\n\x10\x64\x61tabase_upgrade\x18\x1c \x01(\x0b\x32&.cln.ListconfigsConfigsDatabaseupgradeH\x1b\x88\x01\x01\x12,\n\x03rgb\x18\x1d \x01(\x0b\x32\x1a.cln.ListconfigsConfigsRgbH\x1c\x88\x01\x01\x12\x30\n\x05\x61lias\x18\x1e \x01(\x0b\x32\x1c.cln.ListconfigsConfigsAliasH\x1d\x88\x01\x01\x12\x35\n\x08pid_file\x18\x1f \x01(\x0b\x32\x1e.cln.ListconfigsConfigsPidfileH\x1e\x88\x01\x01\x12\x46\n\x11ignore_fee_limits\x18 \x01(\x0b\x32&.cln.ListconfigsConfigsIgnorefeelimitsH\x1f\x88\x01\x01\x12\x45\n\x10watchtime_blocks\x18! \x01(\x0b\x32&.cln.ListconfigsConfigsWatchtimeblocksH \x88\x01\x01\x12J\n\x13max_locktime_blocks\x18\" \x01(\x0b\x32(.cln.ListconfigsConfigsMaxlocktimeblocksH!\x88\x01\x01\x12\x45\n\x10\x66unding_confirms\x18# \x01(\x0b\x32&.cln.ListconfigsConfigsFundingconfirmsH\"\x88\x01\x01\x12\x39\n\ncltv_delta\x18$ \x01(\x0b\x32 .cln.ListconfigsConfigsCltvdeltaH#\x88\x01\x01\x12\x39\n\ncltv_final\x18% \x01(\x0b\x32 .cln.ListconfigsConfigsCltvfinalH$\x88\x01\x01\x12;\n\x0b\x63ommit_time\x18& \x01(\x0b\x32!.cln.ListconfigsConfigsCommittimeH%\x88\x01\x01\x12\x35\n\x08\x66\x65\x65_base\x18\' \x01(\x0b\x32\x1e.cln.ListconfigsConfigsFeebaseH&\x88\x01\x01\x12\x32\n\x06rescan\x18( \x01(\x0b\x32\x1d.cln.ListconfigsConfigsRescanH\'\x88\x01\x01\x12\x42\n\x0f\x66\x65\x65_per_satoshi\x18) \x01(\x0b\x32$.cln.ListconfigsConfigsFeepersatoshiH(\x88\x01\x01\x12L\n\x14max_concurrent_htlcs\x18* \x01(\x0b\x32).cln.ListconfigsConfigsMaxconcurrenthtlcsH)\x88\x01\x01\x12\x46\n\x11htlc_minimum_msat\x18+ \x01(\x0b\x32&.cln.ListconfigsConfigsHtlcminimummsatH*\x88\x01\x01\x12\x46\n\x11htlc_maximum_msat\x18, \x01(\x0b\x32&.cln.ListconfigsConfigsHtlcmaximummsatH+\x88\x01\x01\x12X\n\x1bmax_dust_htlc_exposure_msat\x18- \x01(\x0b\x32..cln.ListconfigsConfigsMaxdusthtlcexposuremsatH,\x88\x01\x01\x12\x44\n\x10min_capacity_sat\x18. \x01(\x0b\x32%.cln.ListconfigsConfigsMincapacitysatH-\x88\x01\x01\x12.\n\x04\x61\x64\x64r\x18/ \x01(\x0b\x32\x1b.cln.ListconfigsConfigsAddrH.\x88\x01\x01\x12?\n\rannounce_addr\x18\x30 \x01(\x0b\x32#.cln.ListconfigsConfigsAnnounceaddrH/\x88\x01\x01\x12\x37\n\tbind_addr\x18\x31 \x01(\x0b\x32\x1f.cln.ListconfigsConfigsBindaddrH0\x88\x01\x01\x12\x34\n\x07offline\x18\x32 \x01(\x0b\x32\x1e.cln.ListconfigsConfigsOfflineH1\x88\x01\x01\x12:\n\nautolisten\x18\x33 \x01(\x0b\x32!.cln.ListconfigsConfigsAutolistenH2\x88\x01\x01\x12\x30\n\x05proxy\x18\x34 \x01(\x0b\x32\x1c.cln.ListconfigsConfigsProxyH3\x88\x01\x01\x12;\n\x0b\x64isable_dns\x18\x35 \x01(\x0b\x32!.cln.ListconfigsConfigsDisablednsH4\x88\x01\x01\x12T\n\x18\x61nnounce_addr_discovered\x18\x36 \x01(\x0b\x32-.cln.ListconfigsConfigsAnnounceaddrdiscoveredH5\x88\x01\x01\x12]\n\x1d\x61nnounce_addr_discovered_port\x18\x37 \x01(\x0b\x32\x31.cln.ListconfigsConfigsAnnounceaddrdiscoveredportH6\x88\x01\x01\x12?\n\rencrypted_hsm\x18\x38 \x01(\x0b\x32#.cln.ListconfigsConfigsEncryptedhsmH7\x88\x01\x01\x12>\n\rrpc_file_mode\x18\x39 \x01(\x0b\x32\".cln.ListconfigsConfigsRpcfilemodeH8\x88\x01\x01\x12\x37\n\tlog_level\x18: \x01(\x0b\x32\x1f.cln.ListconfigsConfigsLoglevelH9\x88\x01\x01\x12\x39\n\nlog_prefix\x18; \x01(\x0b\x32 .cln.ListconfigsConfigsLogprefixH:\x88\x01\x01\x12\x35\n\x08log_file\x18< \x01(\x0b\x32\x1e.cln.ListconfigsConfigsLogfileH;\x88\x01\x01\x12\x41\n\x0elog_timestamps\x18= \x01(\x0b\x32$.cln.ListconfigsConfigsLogtimestampsH<\x88\x01\x01\x12\x41\n\x0e\x66orce_feerates\x18> \x01(\x0b\x32$.cln.ListconfigsConfigsForcefeeratesH=\x88\x01\x01\x12\x38\n\tsubdaemon\x18? \x01(\x0b\x32 .cln.ListconfigsConfigsSubdaemonH>\x88\x01\x01\x12Q\n\x16\x66\x65tchinvoice_noconnect\x18@ \x01(\x0b\x32,.cln.ListconfigsConfigsFetchinvoicenoconnectH?\x88\x01\x01\x12M\n\x15\x61\x63\x63\x65pt_htlc_tlv_types\x18\x41 \x01(\x0b\x32).cln.ListconfigsConfigsAccepthtlctlvtypesH@\x88\x01\x01\x12L\n\x14tor_service_password\x18\x42 \x01(\x0b\x32).cln.ListconfigsConfigsTorservicepasswordHA\x88\x01\x01\x12\x46\n\x11\x61nnounce_addr_dns\x18\x43 \x01(\x0b\x32&.cln.ListconfigsConfigsAnnounceaddrdnsHB\x88\x01\x01\x12T\n\x18require_confirmed_inputs\x18\x44 \x01(\x0b\x32-.cln.ListconfigsConfigsRequireconfirmedinputsHC\x88\x01\x01\x12\x39\n\ncommit_fee\x18\x45 \x01(\x0b\x32 .cln.ListconfigsConfigsCommitfeeHD\x88\x01\x01\x12N\n\x15\x63ommit_feerate_offset\x18\x46 \x01(\x0b\x32*.cln.ListconfigsConfigsCommitfeerateoffsetHE\x88\x01\x01\x42\x07\n\x05_confB\x0c\n\n_developerB\x10\n\x0e_clear_pluginsB\x0e\n\x0c_disable_mppB\n\n\x08_mainnetB\n\n\x08_regtestB\t\n\x07_signetB\n\n\x08_testnetB\x13\n\x11_important_pluginB\t\n\x07_pluginB\r\n\x0b_plugin_dirB\x10\n\x0e_lightning_dirB\n\n\x08_networkB\x18\n\x16_allow_deprecated_apisB\x0b\n\t_rpc_fileB\x11\n\x0f_disable_pluginB\x13\n\x11_always_use_proxyB\t\n\x07_daemonB\t\n\x07_walletB\x11\n\x0f_large_channelsB\x19\n\x17_experimental_dual_fundB\x18\n\x16_experimental_splicingB\x1e\n\x1c_experimental_onion_messagesB\x16\n\x14_experimental_offersB&\n$_experimental_shutdown_wrong_fundingB\x1c\n\x1a_experimental_peer_storageB\x17\n\x15_experimental_anchorsB\x13\n\x11_database_upgradeB\x06\n\x04_rgbB\x08\n\x06_aliasB\x0b\n\t_pid_fileB\x14\n\x12_ignore_fee_limitsB\x13\n\x11_watchtime_blocksB\x16\n\x14_max_locktime_blocksB\x13\n\x11_funding_confirmsB\r\n\x0b_cltv_deltaB\r\n\x0b_cltv_finalB\x0e\n\x0c_commit_timeB\x0b\n\t_fee_baseB\t\n\x07_rescanB\x12\n\x10_fee_per_satoshiB\x17\n\x15_max_concurrent_htlcsB\x14\n\x12_htlc_minimum_msatB\x14\n\x12_htlc_maximum_msatB\x1e\n\x1c_max_dust_htlc_exposure_msatB\x13\n\x11_min_capacity_satB\x07\n\x05_addrB\x10\n\x0e_announce_addrB\x0c\n\n_bind_addrB\n\n\x08_offlineB\r\n\x0b_autolistenB\x08\n\x06_proxyB\x0e\n\x0c_disable_dnsB\x1b\n\x19_announce_addr_discoveredB \n\x1e_announce_addr_discovered_portB\x10\n\x0e_encrypted_hsmB\x10\n\x0e_rpc_file_modeB\x0c\n\n_log_levelB\r\n\x0b_log_prefixB\x0b\n\t_log_fileB\x11\n\x0f_log_timestampsB\x11\n\x0f_force_feeratesB\x0c\n\n_subdaemonB\x19\n\x17_fetchinvoice_noconnectB\x18\n\x16_accept_htlc_tlv_typesB\x17\n\x15_tor_service_passwordB\x14\n\x12_announce_addr_dnsB\x1b\n\x19_require_confirmed_inputsB\r\n\x0b_commit_feeB\x18\n\x16_commit_feerate_offset\"\xa2\x01\n\x16ListconfigsConfigsConf\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12H\n\x06source\x18\x02 \x01(\x0e\x32\x38.cln.ListconfigsConfigsConf.ListconfigsConfigsConfSource\"+\n\x1cListconfigsConfigsConfSource\x12\x0b\n\x07\x43MDLINE\x10\x00\":\n\x1bListconfigsConfigsDeveloper\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x1eListconfigsConfigsClearplugins\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"[\n\x1cListconfigsConfigsDisablempp\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"8\n\x19ListconfigsConfigsMainnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsRegtest\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"7\n\x18ListconfigsConfigsSignet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"8\n\x19ListconfigsConfigsTestnet\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n!ListconfigsConfigsImportantplugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"?\n\x18ListconfigsConfigsPlugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"B\n\x1bListconfigsConfigsPlugindir\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"C\n\x1eListconfigsConfigsLightningdir\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsNetwork\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"K\n%ListconfigsConfigsAllowdeprecatedapis\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsRpcfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n\x1fListconfigsConfigsDisableplugin\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"F\n ListconfigsConfigsAlwaysuseproxy\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"7\n\x18ListconfigsConfigsDaemon\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x18ListconfigsConfigsWallet\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x1fListconfigsConfigsLargechannels\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"E\n&ListconfigsConfigsExperimentaldualfund\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"E\n&ListconfigsConfigsExperimentalsplicing\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"J\n+ListconfigsConfigsExperimentalonionmessages\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"C\n$ListconfigsConfigsExperimentaloffers\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"Q\n2ListconfigsConfigsExperimentalshutdownwrongfunding\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n)ListconfigsConfigsExperimentalpeerstorage\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n%ListconfigsConfigsExperimentalanchors\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsDatabaseupgrade\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\":\n\x15ListconfigsConfigsRgb\x12\x11\n\tvalue_str\x18\x01 \x01(\x0c\x12\x0e\n\x06source\x18\x02 \x01(\t\"<\n\x17ListconfigsConfigsAlias\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsPidfile\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsIgnorefeelimits\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n!ListconfigsConfigsWatchtimeblocks\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"H\n#ListconfigsConfigsMaxlocktimeblocks\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"F\n!ListconfigsConfigsFundingconfirms\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCltvdelta\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCltvfinal\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"A\n\x1cListconfigsConfigsCommittime\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\">\n\x19ListconfigsConfigsFeebase\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x18ListconfigsConfigsRescan\x12\x11\n\tvalue_int\x18\x01 \x01(\x12\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n\x1fListconfigsConfigsFeepersatoshi\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"I\n$ListconfigsConfigsMaxconcurrenthtlcs\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"T\n!ListconfigsConfigsHtlcminimummsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"T\n!ListconfigsConfigsHtlcmaximummsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"\\\n)ListconfigsConfigsMaxdusthtlcexposuremsat\x12\x1f\n\nvalue_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x0e\n\x06source\x18\x02 \x01(\t\"g\n ListconfigsConfigsMincapacitysat\x12\x11\n\tvalue_int\x18\x01 \x01(\x04\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x14\n\x07\x64ynamic\x18\x03 \x01(\x08H\x00\x88\x01\x01\x42\n\n\x08_dynamic\"=\n\x16ListconfigsConfigsAddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"E\n\x1eListconfigsConfigsAnnounceaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"A\n\x1aListconfigsConfigsBindaddr\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"8\n\x19ListconfigsConfigsOffline\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1cListconfigsConfigsAutolisten\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"<\n\x17ListconfigsConfigsProxy\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\";\n\x1cListconfigsConfigsDisabledns\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"\x82\x02\n(ListconfigsConfigsAnnounceaddrdiscovered\x12r\n\tvalue_str\x18\x01 \x01(\x0e\x32_.cln.ListconfigsConfigsAnnounceaddrdiscovered.ListconfigsConfigsAnnounceaddrdiscoveredValue_str\x12\x0e\n\x06source\x18\x02 \x01(\t\"R\n1ListconfigsConfigsAnnounceaddrdiscoveredValue_str\x12\x08\n\x04TRUE\x10\x00\x12\t\n\x05\x46\x41LSE\x10\x01\x12\x08\n\x04\x41UTO\x10\x02\"Q\n,ListconfigsConfigsAnnounceaddrdiscoveredport\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"=\n\x1eListconfigsConfigsEncryptedhsm\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1dListconfigsConfigsRpcfilemode\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"?\n\x1aListconfigsConfigsLoglevel\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsLogprefix\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x19ListconfigsConfigsLogfile\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"E\n\x1fListconfigsConfigsLogtimestamps\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"D\n\x1fListconfigsConfigsForcefeerates\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"B\n\x1bListconfigsConfigsSubdaemon\x12\x12\n\nvalues_str\x18\x01 \x03(\t\x12\x0f\n\x07sources\x18\x02 \x03(\t\"f\n\'ListconfigsConfigsFetchinvoicenoconnect\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x06plugin\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\t\n\x07_plugin\"I\n$ListconfigsConfigsAccepthtlctlvtypes\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"I\n$ListconfigsConfigsTorservicepassword\x12\x11\n\tvalue_str\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"G\n!ListconfigsConfigsAnnounceaddrdns\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"N\n(ListconfigsConfigsRequireconfirmedinputs\x12\x12\n\nvalue_bool\x18\x01 \x01(\x08\x12\x0e\n\x06source\x18\x02 \x01(\t\"@\n\x1bListconfigsConfigsCommitfee\x12\x11\n\tvalue_int\x18\x01 \x01(\x04\x12\x0e\n\x06source\x18\x02 \x01(\t\"J\n%ListconfigsConfigsCommitfeerateoffset\x12\x11\n\tvalue_int\x18\x01 \x01(\r\x12\x0e\n\x06source\x18\x02 \x01(\t\"r\n\x12ListconfigsPlugins\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x34\n\x07options\x18\x03 \x01(\x0b\x32\x1e.cln.ListconfigsPluginsOptionsH\x00\x88\x01\x01\x42\n\n\x08_options\"\x1b\n\x19ListconfigsPluginsOptions\"\x84\x01\n\x1bListconfigsImportantplugins\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12=\n\x07options\x18\x03 \x01(\x0b\x32\'.cln.ListconfigsImportantpluginsOptionsH\x00\x88\x01\x01\x42\n\n\x08_options\"$\n\"ListconfigsImportantpluginsOptions\"\r\n\x0bStopRequest\"q\n\x0cStopResponse\x12\x31\n\x06result\x18\x01 \x01(\x0e\x32\x1c.cln.StopResponse.StopResultH\x00\x88\x01\x01\"#\n\nStopResult\x12\x15\n\x11SHUTDOWN_COMPLETE\x10\x00\x42\t\n\x07_result\"/\n\x0bHelpRequest\x12\x14\n\x07\x63ommand\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_command\"\x95\x01\n\x0cHelpResponse\x12\x1b\n\x04help\x18\x01 \x03(\x0b\x32\r.cln.HelpHelp\x12:\n\x0b\x66ormat_hint\x18\x02 \x01(\x0e\x32 .cln.HelpResponse.HelpFormathintH\x00\x88\x01\x01\"\x1c\n\x0eHelpFormathint\x12\n\n\x06SIMPLE\x10\x00\x42\x0e\n\x0c_format_hint\"\x1b\n\x08HelpHelp\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\"g\n\x18PreapprovekeysendRequest\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\x0c\x12\x14\n\x0cpayment_hash\x18\x02 \x01(\x0c\x12 \n\x0b\x61mount_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\"\x1b\n\x19PreapprovekeysendResponse\"*\n\x18PreapproveinvoiceRequest\x12\x0e\n\x06\x62olt11\x18\x01 \x01(\t\"\x1b\n\x19PreapproveinvoiceResponse\"\x15\n\x13StaticbackupRequest\"#\n\x14StaticbackupResponse\x12\x0b\n\x03scb\x18\x01 \x03(\x0c\"d\n\x16\x42kprchannelsapyRequest\x12\x17\n\nstart_time\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\r\n\x0b_start_timeB\x0b\n\t_end_time\"Q\n\x17\x42kprchannelsapyResponse\x12\x36\n\x0c\x63hannels_apy\x18\x01 \x03(\x0b\x32 .cln.BkprchannelsapyChannels_apy\"\xfa\x06\n\x1b\x42kprchannelsapyChannels_apy\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12$\n\x0frouted_out_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0erouted_in_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12(\n\x13lease_fee_paid_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12*\n\x15lease_fee_earned_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12$\n\x0fpushed_out_msat\x18\x06 \x01(\x0b\x32\x0b.cln.Amount\x12#\n\x0epushed_in_msat\x18\x07 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x16our_start_balance_msat\x18\x08 \x01(\x0b\x32\x0b.cln.Amount\x12/\n\x1a\x63hannel_start_balance_msat\x18\t \x01(\x0b\x32\x0b.cln.Amount\x12\"\n\rfees_out_msat\x18\n \x01(\x0b\x32\x0b.cln.Amount\x12&\n\x0c\x66\x65\x65s_in_msat\x18\x0b \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12\x17\n\x0futilization_out\x18\x0c \x01(\t\x12$\n\x17utilization_out_initial\x18\r \x01(\tH\x01\x88\x01\x01\x12\x16\n\x0eutilization_in\x18\x0e \x01(\t\x12#\n\x16utilization_in_initial\x18\x0f \x01(\tH\x02\x88\x01\x01\x12\x0f\n\x07\x61py_out\x18\x10 \x01(\t\x12\x1c\n\x0f\x61py_out_initial\x18\x11 \x01(\tH\x03\x88\x01\x01\x12\x0e\n\x06\x61py_in\x18\x12 \x01(\t\x12\x1b\n\x0e\x61py_in_initial\x18\x13 \x01(\tH\x04\x88\x01\x01\x12\x11\n\tapy_total\x18\x14 \x01(\t\x12\x1e\n\x11\x61py_total_initial\x18\x15 \x01(\tH\x05\x88\x01\x01\x12\x16\n\tapy_lease\x18\x16 \x01(\tH\x06\x88\x01\x01\x42\x0f\n\r_fees_in_msatB\x1a\n\x18_utilization_out_initialB\x19\n\x17_utilization_in_initialB\x12\n\x10_apy_out_initialB\x11\n\x0f_apy_in_initialB\x14\n\x12_apy_total_initialB\x0c\n\n_apy_lease\"\xd2\x01\n\x18\x42kprdumpincomecsvRequest\x12\x12\n\ncsv_format\x18\x01 \x01(\t\x12\x15\n\x08\x63sv_file\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1d\n\x10\x63onsolidate_fees\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x17\n\nstart_time\x18\x04 \x01(\x04H\x02\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x05 \x01(\x04H\x03\x88\x01\x01\x42\x0b\n\t_csv_fileB\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"\xd6\x01\n\x19\x42kprdumpincomecsvResponse\x12\x10\n\x08\x63sv_file\x18\x01 \x01(\t\x12N\n\ncsv_format\x18\x02 \x01(\x0e\x32:.cln.BkprdumpincomecsvResponse.BkprdumpincomecsvCsv_format\"W\n\x1b\x42kprdumpincomecsvCsv_format\x12\x0f\n\x0b\x43OINTRACKER\x10\x00\x12\n\n\x06KOINLY\x10\x01\x12\x0b\n\x07HARMONY\x10\x02\x12\x0e\n\nQUICKBOOKS\x10\x03\"%\n\x12\x42kprinspectRequest\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\"7\n\x13\x42kprinspectResponse\x12 \n\x03txs\x18\x01 \x03(\x0b\x32\x13.cln.BkprinspectTxs\"\x9a\x01\n\x0e\x42kprinspectTxs\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x18\n\x0b\x62lockheight\x18\x02 \x01(\rH\x00\x88\x01\x01\x12#\n\x0e\x66\x65\x65s_paid_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12+\n\x07outputs\x18\x04 \x03(\x0b\x32\x1a.cln.BkprinspectTxsOutputsB\x0e\n\x0c_blockheight\"\xbc\x03\n\x15\x42kprinspectTxsOutputs\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0e\n\x06outnum\x18\x02 \x01(\r\x12&\n\x11output_value_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x04 \x01(\t\x12%\n\x0b\x63redit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.AmountH\x00\x88\x01\x01\x12$\n\ndebit_msat\x18\x06 \x01(\x0b\x32\x0b.cln.AmountH\x01\x88\x01\x01\x12 \n\x13originating_account\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x17\n\noutput_tag\x18\x08 \x01(\tH\x03\x88\x01\x01\x12\x16\n\tspend_tag\x18\t \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rspending_txid\x18\n \x01(\x0cH\x05\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x06\x88\x01\x01\x42\x0e\n\x0c_credit_msatB\r\n\x0b_debit_msatB\x16\n\x14_originating_accountB\r\n\x0b_output_tagB\x0c\n\n_spend_tagB\x10\n\x0e_spending_txidB\r\n\x0b_payment_id\"@\n\x1c\x42kprlistaccounteventsRequest\x12\x14\n\x07\x61\x63\x63ount\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_account\"Q\n\x1d\x42kprlistaccounteventsResponse\x12\x30\n\x06\x65vents\x18\x01 \x03(\x0b\x32 .cln.BkprlistaccounteventsEvents\"\xa1\x05\n\x1b\x42kprlistaccounteventsEvents\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12S\n\titem_type\x18\x02 \x01(\x0e\x32@.cln.BkprlistaccounteventsEvents.BkprlistaccounteventsEventsType\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x05 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\r\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x62lockheight\x18\t \x01(\rH\x01\x88\x01\x01\x12\x13\n\x06origin\x18\n \x01(\tH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\x0b \x01(\x0cH\x03\x88\x01\x01\x12\x11\n\x04txid\x18\x0c \x01(\x0cH\x04\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\r \x01(\tH\x05\x88\x01\x01\x12#\n\tfees_msat\x18\x0e \x01(\x0b\x32\x0b.cln.AmountH\x06\x88\x01\x01\x12\x19\n\x0cis_rebalance\x18\x0f \x01(\x08H\x07\x88\x01\x01\x12\x14\n\x07part_id\x18\x10 \x01(\rH\x08\x88\x01\x01\"J\n\x1f\x42kprlistaccounteventsEventsType\x12\x0f\n\x0bONCHAIN_FEE\x10\x00\x12\t\n\x05\x43HAIN\x10\x01\x12\x0b\n\x07\x43HANNEL\x10\x02\x42\x0b\n\t_outpointB\x0e\n\x0c_blockheightB\t\n\x07_originB\r\n\x0b_payment_idB\x07\n\x05_txidB\x0e\n\x0c_descriptionB\x0c\n\n_fees_msatB\x0f\n\r_is_rebalanceB\n\n\x08_part_id\"\x19\n\x17\x42kprlistbalancesRequest\"K\n\x18\x42kprlistbalancesResponse\x12/\n\x08\x61\x63\x63ounts\x18\x01 \x03(\x0b\x32\x1d.cln.BkprlistbalancesAccounts\"\xc6\x02\n\x18\x42kprlistbalancesAccounts\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x37\n\x08\x62\x61lances\x18\x02 \x03(\x0b\x32%.cln.BkprlistbalancesAccountsBalances\x12\x14\n\x07peer_id\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x16\n\twe_opened\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x1b\n\x0e\x61\x63\x63ount_closed\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x1d\n\x10\x61\x63\x63ount_resolved\x18\x06 \x01(\x08H\x03\x88\x01\x01\x12\x1e\n\x11resolved_at_block\x18\x07 \x01(\rH\x04\x88\x01\x01\x42\n\n\x08_peer_idB\x0c\n\n_we_openedB\x11\n\x0f_account_closedB\x13\n\x11_account_resolvedB\x14\n\x12_resolved_at_block\"X\n BkprlistbalancesAccountsBalances\x12!\n\x0c\x62\x61lance_msat\x18\x01 \x01(\x0b\x32\x0b.cln.Amount\x12\x11\n\tcoin_type\x18\x02 \x01(\t\"\x97\x01\n\x15\x42kprlistincomeRequest\x12\x1d\n\x10\x63onsolidate_fees\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x17\n\nstart_time\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08\x65nd_time\x18\x03 \x01(\rH\x02\x88\x01\x01\x42\x13\n\x11_consolidate_feesB\r\n\x0b_start_timeB\x0b\n\t_end_time\"Q\n\x16\x42kprlistincomeResponse\x12\x37\n\rincome_events\x18\x01 \x03(\x0b\x32 .cln.BkprlistincomeIncome_events\"\xb5\x02\n\x1b\x42kprlistincomeIncome_events\x12\x0f\n\x07\x61\x63\x63ount\x18\x01 \x01(\t\x12\x0b\n\x03tag\x18\x02 \x01(\t\x12 \n\x0b\x63redit_msat\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x1f\n\ndebit_msat\x18\x04 \x01(\x0b\x32\x0b.cln.Amount\x12\x10\n\x08\x63urrency\x18\x05 \x01(\t\x12\x11\n\ttimestamp\x18\x06 \x01(\r\x12\x18\n\x0b\x64\x65scription\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08outpoint\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04txid\x18\t \x01(\x0cH\x02\x88\x01\x01\x12\x17\n\npayment_id\x18\n \x01(\x0cH\x03\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0b\n\t_outpointB\x07\n\x05_txidB\r\n\x0b_payment_id\"N\n\x14\x42lacklistruneRequest\x12\x12\n\x05start\x18\x01 \x01(\x04H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x02 \x01(\x04H\x01\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_end\"G\n\x15\x42lacklistruneResponse\x12.\n\tblacklist\x18\x01 \x03(\x0b\x32\x1b.cln.BlacklistruneBlacklist\"4\n\x16\x42lacklistruneBlacklist\x12\r\n\x05start\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\"p\n\x10\x43heckruneRequest\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x13\n\x06nodeid\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06method\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x0e\n\x06params\x18\x04 \x03(\tB\t\n\x07_nodeidB\t\n\x07_method\"\"\n\x11\x43heckruneResponse\x12\r\n\x05valid\x18\x01 \x01(\x08\"E\n\x11\x43reateruneRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0crestrictions\x18\x02 \x03(\tB\x07\n\x05_rune\"{\n\x12\x43reateruneResponse\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12&\n\x19warning_unrestricted_rune\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x1c\n\x1a_warning_unrestricted_rune\".\n\x10ShowrunesRequest\x12\x11\n\x04rune\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_rune\"7\n\x11ShowrunesResponse\x12\"\n\x05runes\x18\x01 \x03(\x0b\x32\x13.cln.ShowrunesRunes\"\x9d\x02\n\x0eShowrunesRunes\x12\x0c\n\x04rune\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x35\n\x0crestrictions\x18\x03 \x03(\x0b\x32\x1f.cln.ShowrunesRunesRestrictions\x12\x1f\n\x17restrictions_as_english\x18\x04 \x01(\t\x12\x13\n\x06stored\x18\x05 \x01(\x08H\x00\x88\x01\x01\x12\x18\n\x0b\x62lacklisted\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x16\n\tlast_used\x18\x07 \x01(\x01H\x02\x88\x01\x01\x12\x15\n\x08our_rune\x18\x08 \x01(\x08H\x03\x88\x01\x01\x42\t\n\x07_storedB\x0e\n\x0c_blacklistedB\x0c\n\n_last_usedB\x0b\n\t_our_rune\"p\n\x1aShowrunesRunesRestrictions\x12\x41\n\x0c\x61lternatives\x18\x01 \x03(\x0b\x32+.cln.ShowrunesRunesRestrictionsAlternatives\x12\x0f\n\x07\x65nglish\x18\x02 \x01(\t\"n\n&ShowrunesRunesRestrictionsAlternatives\x12\x11\n\tfieldname\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x11\n\tcondition\x18\x03 \x01(\t\x12\x0f\n\x07\x65nglish\x18\x04 \x01(\t\"\x19\n\x17StreamBlockAddedRequest\"6\n\x16\x42lockAddedNotification\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\x0e\n\x06height\x18\x02 \x01(\r\" \n\x1eStreamChannelOpenFailedRequest\"3\n\x1d\x43hannelOpenFailedNotification\x12\x12\n\nchannel_id\x18\x01 \x01(\x0c\"\x1c\n\x1aStreamChannelOpenedRequest\"w\n\x19\x43hannelOpenedNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12!\n\x0c\x66unding_msat\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\x12\x14\n\x0c\x66unding_txid\x18\x03 \x01(\x0c\x12\x15\n\rchannel_ready\x18\x04 \x01(\x08\"\x16\n\x14StreamConnectRequest\"\xbe\x01\n\x17PeerConnectNotification\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x44\n\tdirection\x18\x02 \x01(\x0e\x32\x31.cln.PeerConnectNotification.PeerConnectDirection\x12(\n\x07\x61\x64\x64ress\x18\x03 \x01(\x0b\x32\x17.cln.PeerConnectAddress\"\'\n\x14PeerConnectDirection\x12\x06\n\x02IN\x10\x00\x12\x07\n\x03OUT\x10\x01\"\x8b\x02\n\x12PeerConnectAddress\x12\x41\n\titem_type\x18\x01 \x01(\x0e\x32..cln.PeerConnectAddress.PeerConnectAddressType\x12\x13\n\x06socket\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x61\x64\x64ress\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04port\x18\x04 \x01(\rH\x02\x88\x01\x01\"T\n\x16PeerConnectAddressType\x12\x10\n\x0cLOCAL_SOCKET\x10\x00\x12\x08\n\x04IPV4\x10\x01\x12\x08\n\x04IPV6\x10\x02\x12\t\n\x05TORV2\x10\x03\x12\t\n\x05TORV3\x10\x04\x42\t\n\x07_socketB\n\n\x08_addressB\x07\n\x05_port\"\x18\n\x16StreamCustomMsgRequest\"9\n\x15\x43ustomMsgNotification\x12\x0f\n\x07peer_id\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x32\xcb?\n\x04Node\x12\x36\n\x07Getinfo\x12\x13.cln.GetinfoRequest\x1a\x14.cln.GetinfoResponse\"\x00\x12<\n\tListPeers\x12\x15.cln.ListpeersRequest\x1a\x16.cln.ListpeersResponse\"\x00\x12<\n\tListFunds\x12\x15.cln.ListfundsRequest\x1a\x16.cln.ListfundsResponse\"\x00\x12\x36\n\x07SendPay\x12\x13.cln.SendpayRequest\x1a\x14.cln.SendpayResponse\"\x00\x12\x45\n\x0cListChannels\x12\x18.cln.ListchannelsRequest\x1a\x19.cln.ListchannelsResponse\"\x00\x12<\n\tAddGossip\x12\x15.cln.AddgossipRequest\x1a\x16.cln.AddgossipResponse\"\x00\x12H\n\rAddPsbtOutput\x12\x19.cln.AddpsbtoutputRequest\x1a\x1a.cln.AddpsbtoutputResponse\"\x00\x12H\n\rAutoCleanOnce\x12\x19.cln.AutocleanonceRequest\x1a\x1a.cln.AutocleanonceResponse\"\x00\x12N\n\x0f\x41utoCleanStatus\x12\x1b.cln.AutocleanstatusRequest\x1a\x1c.cln.AutocleanstatusResponse\"\x00\x12\x45\n\x0c\x43heckMessage\x12\x18.cln.CheckmessageRequest\x1a\x19.cln.CheckmessageResponse\"\x00\x12\x30\n\x05\x43lose\x12\x11.cln.CloseRequest\x1a\x12.cln.CloseResponse\"\x00\x12:\n\x0b\x43onnectPeer\x12\x13.cln.ConnectRequest\x1a\x14.cln.ConnectResponse\"\x00\x12H\n\rCreateInvoice\x12\x19.cln.CreateinvoiceRequest\x1a\x1a.cln.CreateinvoiceResponse\"\x00\x12<\n\tDatastore\x12\x15.cln.DatastoreRequest\x1a\x16.cln.DatastoreResponse\"\x00\x12K\n\x0e\x44\x61tastoreUsage\x12\x1a.cln.DatastoreusageRequest\x1a\x1b.cln.DatastoreusageResponse\"\x00\x12\x42\n\x0b\x43reateOnion\x12\x17.cln.CreateonionRequest\x1a\x18.cln.CreateonionResponse\"\x00\x12\x45\n\x0c\x44\x65lDatastore\x12\x18.cln.DeldatastoreRequest\x1a\x19.cln.DeldatastoreResponse\"\x00\x12?\n\nDelInvoice\x12\x16.cln.DelinvoiceRequest\x1a\x17.cln.DelinvoiceResponse\"\x00\x12Q\n\x10\x44\x65vForgetChannel\x12\x1c.cln.DevforgetchannelRequest\x1a\x1d.cln.DevforgetchannelResponse\"\x00\x12Q\n\x10\x45mergencyRecover\x12\x1c.cln.EmergencyrecoverRequest\x1a\x1d.cln.EmergencyrecoverResponse\"\x00\x12\x36\n\x07Recover\x12\x13.cln.RecoverRequest\x1a\x14.cln.RecoverResponse\"\x00\x12K\n\x0eRecoverChannel\x12\x1a.cln.RecoverchannelRequest\x1a\x1b.cln.RecoverchannelResponse\"\x00\x12\x36\n\x07Invoice\x12\x13.cln.InvoiceRequest\x1a\x14.cln.InvoiceResponse\"\x00\x12Q\n\x14\x43reateInvoiceRequest\x12\x1a.cln.InvoicerequestRequest\x1a\x1b.cln.InvoicerequestResponse\"\x00\x12`\n\x15\x44isableInvoiceRequest\x12!.cln.DisableinvoicerequestRequest\x1a\".cln.DisableinvoicerequestResponse\"\x00\x12Z\n\x13ListInvoiceRequests\x12\x1f.cln.ListinvoicerequestsRequest\x1a .cln.ListinvoicerequestsResponse\"\x00\x12H\n\rListDatastore\x12\x19.cln.ListdatastoreRequest\x1a\x1a.cln.ListdatastoreResponse\"\x00\x12\x45\n\x0cListInvoices\x12\x18.cln.ListinvoicesRequest\x1a\x19.cln.ListinvoicesResponse\"\x00\x12<\n\tSendOnion\x12\x15.cln.SendonionRequest\x1a\x16.cln.SendonionResponse\"\x00\x12\x45\n\x0cListSendPays\x12\x18.cln.ListsendpaysRequest\x1a\x19.cln.ListsendpaysResponse\"\x00\x12Q\n\x10ListTransactions\x12\x1c.cln.ListtransactionsRequest\x1a\x1d.cln.ListtransactionsResponse\"\x00\x12?\n\nMakeSecret\x12\x16.cln.MakesecretRequest\x1a\x17.cln.MakesecretResponse\"\x00\x12*\n\x03Pay\x12\x0f.cln.PayRequest\x1a\x10.cln.PayResponse\"\x00\x12<\n\tListNodes\x12\x15.cln.ListnodesRequest\x1a\x16.cln.ListnodesResponse\"\x00\x12K\n\x0eWaitAnyInvoice\x12\x1a.cln.WaitanyinvoiceRequest\x1a\x1b.cln.WaitanyinvoiceResponse\"\x00\x12\x42\n\x0bWaitInvoice\x12\x17.cln.WaitinvoiceRequest\x1a\x18.cln.WaitinvoiceResponse\"\x00\x12\x42\n\x0bWaitSendPay\x12\x17.cln.WaitsendpayRequest\x1a\x18.cln.WaitsendpayResponse\"\x00\x12\x36\n\x07NewAddr\x12\x13.cln.NewaddrRequest\x1a\x14.cln.NewaddrResponse\"\x00\x12\x39\n\x08Withdraw\x12\x14.cln.WithdrawRequest\x1a\x15.cln.WithdrawResponse\"\x00\x12\x36\n\x07KeySend\x12\x13.cln.KeysendRequest\x1a\x14.cln.KeysendResponse\"\x00\x12\x39\n\x08\x46undPsbt\x12\x14.cln.FundpsbtRequest\x1a\x15.cln.FundpsbtResponse\"\x00\x12\x39\n\x08SendPsbt\x12\x14.cln.SendpsbtRequest\x1a\x15.cln.SendpsbtResponse\"\x00\x12\x39\n\x08SignPsbt\x12\x14.cln.SignpsbtRequest\x1a\x15.cln.SignpsbtResponse\"\x00\x12\x39\n\x08UtxoPsbt\x12\x14.cln.UtxopsbtRequest\x1a\x15.cln.UtxopsbtResponse\"\x00\x12<\n\tTxDiscard\x12\x15.cln.TxdiscardRequest\x1a\x16.cln.TxdiscardResponse\"\x00\x12<\n\tTxPrepare\x12\x15.cln.TxprepareRequest\x1a\x16.cln.TxprepareResponse\"\x00\x12\x33\n\x06TxSend\x12\x12.cln.TxsendRequest\x1a\x13.cln.TxsendResponse\"\x00\x12Q\n\x10ListPeerChannels\x12\x1c.cln.ListpeerchannelsRequest\x1a\x1d.cln.ListpeerchannelsResponse\"\x00\x12W\n\x12ListClosedChannels\x12\x1e.cln.ListclosedchannelsRequest\x1a\x1f.cln.ListclosedchannelsResponse\"\x00\x12<\n\tDecodePay\x12\x15.cln.DecodepayRequest\x1a\x16.cln.DecodepayResponse\"\x00\x12\x33\n\x06\x44\x65\x63ode\x12\x12.cln.DecodeRequest\x1a\x13.cln.DecodeResponse\"\x00\x12\x33\n\x06\x44\x65lPay\x12\x12.cln.DelpayRequest\x1a\x13.cln.DelpayResponse\"\x00\x12?\n\nDelForward\x12\x16.cln.DelforwardRequest\x1a\x17.cln.DelforwardResponse\"\x00\x12\x45\n\x0c\x44isableOffer\x12\x18.cln.DisableofferRequest\x1a\x19.cln.DisableofferResponse\"\x00\x12?\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\x45\n\x0c\x46\x65tchInvoice\x12\x18.cln.FetchinvoiceRequest\x1a\x19.cln.FetchinvoiceResponse\"\x00\x12W\n\x12\x46undChannel_Cancel\x12\x1e.cln.Fundchannel_cancelRequest\x1a\x1f.cln.Fundchannel_cancelResponse\"\x00\x12]\n\x14\x46undChannel_Complete\x12 .cln.Fundchannel_completeRequest\x1a!.cln.Fundchannel_completeResponse\"\x00\x12\x42\n\x0b\x46undChannel\x12\x17.cln.FundchannelRequest\x1a\x18.cln.FundchannelResponse\"\x00\x12T\n\x11\x46undChannel_Start\x12\x1d.cln.Fundchannel_startRequest\x1a\x1e.cln.Fundchannel_startResponse\"\x00\x12\x33\n\x06GetLog\x12\x12.cln.GetlogRequest\x1a\x13.cln.GetlogResponse\"\x00\x12\x45\n\x0c\x46underUpdate\x12\x18.cln.FunderupdateRequest\x1a\x19.cln.FunderupdateResponse\"\x00\x12\x39\n\x08GetRoute\x12\x14.cln.GetrouteRequest\x1a\x15.cln.GetrouteResponse\"\x00\x12\x45\n\x0cListForwards\x12\x18.cln.ListforwardsRequest\x1a\x19.cln.ListforwardsResponse\"\x00\x12?\n\nListOffers\x12\x16.cln.ListoffersRequest\x1a\x17.cln.ListoffersResponse\"\x00\x12\x39\n\x08ListPays\x12\x14.cln.ListpaysRequest\x1a\x15.cln.ListpaysResponse\"\x00\x12<\n\tListHtlcs\x12\x15.cln.ListhtlcsRequest\x1a\x16.cln.ListhtlcsResponse\"\x00\x12Q\n\x10MultiFundChannel\x12\x1c.cln.MultifundchannelRequest\x1a\x1d.cln.MultifundchannelResponse\"\x00\x12H\n\rMultiWithdraw\x12\x19.cln.MultiwithdrawRequest\x1a\x1a.cln.MultiwithdrawResponse\"\x00\x12\x30\n\x05Offer\x12\x11.cln.OfferRequest\x1a\x12.cln.OfferResponse\"\x00\x12T\n\x11OpenChannel_Abort\x12\x1d.cln.Openchannel_abortRequest\x1a\x1e.cln.Openchannel_abortResponse\"\x00\x12Q\n\x10OpenChannel_Bump\x12\x1c.cln.Openchannel_bumpRequest\x1a\x1d.cln.Openchannel_bumpResponse\"\x00\x12Q\n\x10OpenChannel_Init\x12\x1c.cln.Openchannel_initRequest\x1a\x1d.cln.Openchannel_initResponse\"\x00\x12W\n\x12OpenChannel_Signed\x12\x1e.cln.Openchannel_signedRequest\x1a\x1f.cln.Openchannel_signedResponse\"\x00\x12W\n\x12OpenChannel_Update\x12\x1e.cln.Openchannel_updateRequest\x1a\x1f.cln.Openchannel_updateResponse\"\x00\x12-\n\x04Ping\x12\x10.cln.PingRequest\x1a\x11.cln.PingResponse\"\x00\x12\x33\n\x06Plugin\x12\x12.cln.PluginRequest\x1a\x13.cln.PluginResponse\"\x00\x12H\n\rRenePayStatus\x12\x19.cln.RenepaystatusRequest\x1a\x1a.cln.RenepaystatusResponse\"\x00\x12\x36\n\x07RenePay\x12\x13.cln.RenepayRequest\x1a\x14.cln.RenepayResponse\"\x00\x12H\n\rReserveInputs\x12\x19.cln.ReserveinputsRequest\x1a\x1a.cln.ReserveinputsResponse\"\x00\x12H\n\rSendCustomMsg\x12\x19.cln.SendcustommsgRequest\x1a\x1a.cln.SendcustommsgResponse\"\x00\x12\x42\n\x0bSendInvoice\x12\x17.cln.SendinvoiceRequest\x1a\x18.cln.SendinvoiceResponse\"\x00\x12?\n\nSetChannel\x12\x16.cln.SetchannelRequest\x1a\x17.cln.SetchannelResponse\"\x00\x12<\n\tSetConfig\x12\x15.cln.SetconfigRequest\x1a\x16.cln.SetconfigResponse\"\x00\x12K\n\x0eSetPsbtVersion\x12\x1a.cln.SetpsbtversionRequest\x1a\x1b.cln.SetpsbtversionResponse\"\x00\x12\x42\n\x0bSignInvoice\x12\x17.cln.SigninvoiceRequest\x1a\x18.cln.SigninvoiceResponse\"\x00\x12\x42\n\x0bSignMessage\x12\x17.cln.SignmessageRequest\x1a\x18.cln.SignmessageResponse\"\x00\x12\x42\n\x0bSplice_Init\x12\x17.cln.Splice_initRequest\x1a\x18.cln.Splice_initResponse\"\x00\x12H\n\rSplice_Signed\x12\x19.cln.Splice_signedRequest\x1a\x1a.cln.Splice_signedResponse\"\x00\x12H\n\rSplice_Update\x12\x19.cln.Splice_updateRequest\x1a\x1a.cln.Splice_updateResponse\"\x00\x12N\n\x0fUnreserveInputs\x12\x1b.cln.UnreserveinputsRequest\x1a\x1c.cln.UnreserveinputsResponse\"\x00\x12H\n\rUpgradeWallet\x12\x19.cln.UpgradewalletRequest\x1a\x1a.cln.UpgradewalletResponse\"\x00\x12N\n\x0fWaitBlockHeight\x12\x1b.cln.WaitblockheightRequest\x1a\x1c.cln.WaitblockheightResponse\"\x00\x12-\n\x04Wait\x12\x10.cln.WaitRequest\x1a\x11.cln.WaitResponse\"\x00\x12\x42\n\x0bListConfigs\x12\x17.cln.ListconfigsRequest\x1a\x18.cln.ListconfigsResponse\"\x00\x12-\n\x04Stop\x12\x10.cln.StopRequest\x1a\x11.cln.StopResponse\"\x00\x12-\n\x04Help\x12\x10.cln.HelpRequest\x1a\x11.cln.HelpResponse\"\x00\x12T\n\x11PreApproveKeysend\x12\x1d.cln.PreapprovekeysendRequest\x1a\x1e.cln.PreapprovekeysendResponse\"\x00\x12T\n\x11PreApproveInvoice\x12\x1d.cln.PreapproveinvoiceRequest\x1a\x1e.cln.PreapproveinvoiceResponse\"\x00\x12\x45\n\x0cStaticBackup\x12\x18.cln.StaticbackupRequest\x1a\x19.cln.StaticbackupResponse\"\x00\x12N\n\x0f\x42kprChannelsApy\x12\x1b.cln.BkprchannelsapyRequest\x1a\x1c.cln.BkprchannelsapyResponse\"\x00\x12T\n\x11\x42kprDumpIncomeCsv\x12\x1d.cln.BkprdumpincomecsvRequest\x1a\x1e.cln.BkprdumpincomecsvResponse\"\x00\x12\x42\n\x0b\x42kprInspect\x12\x17.cln.BkprinspectRequest\x1a\x18.cln.BkprinspectResponse\"\x00\x12`\n\x15\x42kprListAccountEvents\x12!.cln.BkprlistaccounteventsRequest\x1a\".cln.BkprlistaccounteventsResponse\"\x00\x12Q\n\x10\x42kprListBalances\x12\x1c.cln.BkprlistbalancesRequest\x1a\x1d.cln.BkprlistbalancesResponse\"\x00\x12K\n\x0e\x42kprListIncome\x12\x1a.cln.BkprlistincomeRequest\x1a\x1b.cln.BkprlistincomeResponse\"\x00\x12H\n\rBlacklistRune\x12\x19.cln.BlacklistruneRequest\x1a\x1a.cln.BlacklistruneResponse\"\x00\x12<\n\tCheckRune\x12\x15.cln.CheckruneRequest\x1a\x16.cln.CheckruneResponse\"\x00\x12?\n\nCreateRune\x12\x16.cln.CreateruneRequest\x1a\x17.cln.CreateruneResponse\"\x00\x12<\n\tShowRunes\x12\x15.cln.ShowrunesRequest\x1a\x16.cln.ShowrunesResponse\"\x00\x12T\n\x13SubscribeBlockAdded\x12\x1c.cln.StreamBlockAddedRequest\x1a\x1b.cln.BlockAddedNotification\"\x00\x30\x01\x12i\n\x1aSubscribeChannelOpenFailed\x12#.cln.StreamChannelOpenFailedRequest\x1a\".cln.ChannelOpenFailedNotification\"\x00\x30\x01\x12]\n\x16SubscribeChannelOpened\x12\x1f.cln.StreamChannelOpenedRequest\x1a\x1e.cln.ChannelOpenedNotification\"\x00\x30\x01\x12O\n\x10SubscribeConnect\x12\x19.cln.StreamConnectRequest\x1a\x1c.cln.PeerConnectNotification\"\x00\x30\x01\x12Q\n\x12SubscribeCustomMsg\x12\x1b.cln.StreamCustomMsgRequest\x1a\x1a.cln.CustomMsgNotification\"\x00\x30\x01\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -399,587 +399,591 @@ _globals['_DECODEREQUEST']._serialized_start=34188 _globals['_DECODEREQUEST']._serialized_end=34219 _globals['_DECODERESPONSE']._serialized_start=34222 - _globals['_DECODERESPONSE']._serialized_end=38815 - _globals['_DECODERESPONSE_DECODETYPE']._serialized_start=36997 - _globals['_DECODERESPONSE_DECODETYPE']._serialized_end=37128 - _globals['_DECODEOFFER_PATHS']._serialized_start=38818 - _globals['_DECODEOFFER_PATHS']._serialized_end=38989 - _globals['_DECODEOFFER_RECURRENCEPAYWINDOW']._serialized_start=38992 - _globals['_DECODEOFFER_RECURRENCEPAYWINDOW']._serialized_end=39130 - _globals['_DECODEINVOICE_PATHSPATH']._serialized_start=39132 - _globals['_DECODEINVOICE_PATHSPATH']._serialized_end=39216 - _globals['_DECODEINVOICE_FALLBACKS']._serialized_start=39218 - _globals['_DECODEINVOICE_FALLBACKS']._serialized_end=39307 - _globals['_DECODEFALLBACKS']._serialized_start=39310 - _globals['_DECODEFALLBACKS']._serialized_end=39608 - _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_start=39478 - _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_end=39553 - _globals['_DECODEEXTRA']._serialized_start=39610 - _globals['_DECODEEXTRA']._serialized_end=39650 - _globals['_DECODERESTRICTIONS']._serialized_start=39652 - _globals['_DECODERESTRICTIONS']._serialized_end=39711 - _globals['_DELPAYREQUEST']._serialized_start=39714 - _globals['_DELPAYREQUEST']._serialized_end=39908 - _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_start=39845 - _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_end=39885 - _globals['_DELPAYRESPONSE']._serialized_start=39910 - _globals['_DELPAYRESPONSE']._serialized_end=39965 - _globals['_DELPAYPAYMENTS']._serialized_start=39968 - _globals['_DELPAYPAYMENTS']._serialized_end=40683 - _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_start=40446 - _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_end=40507 - _globals['_DELFORWARDREQUEST']._serialized_start=40686 - _globals['_DELFORWARDREQUEST']._serialized_end=40865 - _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_start=40804 - _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_end=40865 - _globals['_DELFORWARDRESPONSE']._serialized_start=40867 - _globals['_DELFORWARDRESPONSE']._serialized_end=40887 - _globals['_DISABLEOFFERREQUEST']._serialized_start=40889 - _globals['_DISABLEOFFERREQUEST']._serialized_end=40928 - _globals['_DISABLEOFFERRESPONSE']._serialized_start=40931 - _globals['_DISABLEOFFERRESPONSE']._serialized_end=41067 - _globals['_DISCONNECTREQUEST']._serialized_start=41069 - _globals['_DISCONNECTREQUEST']._serialized_end=41130 - _globals['_DISCONNECTRESPONSE']._serialized_start=41132 - _globals['_DISCONNECTRESPONSE']._serialized_end=41152 - _globals['_FEERATESREQUEST']._serialized_start=41154 - _globals['_FEERATESREQUEST']._serialized_end=41261 - _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_start=41224 - _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_end=41261 - _globals['_FEERATESRESPONSE']._serialized_start=41264 - _globals['_FEERATESRESPONSE']._serialized_end=41548 - _globals['_FEERATESPERKB']._serialized_start=41551 - _globals['_FEERATESPERKB']._serialized_end=42018 - _globals['_FEERATESPERKBESTIMATES']._serialized_start=42020 - _globals['_FEERATESPERKBESTIMATES']._serialized_end=42107 - _globals['_FEERATESPERKW']._serialized_start=42110 - _globals['_FEERATESPERKW']._serialized_end=42577 - _globals['_FEERATESPERKWESTIMATES']._serialized_start=42579 - _globals['_FEERATESPERKWESTIMATES']._serialized_end=42666 - _globals['_FEERATESONCHAIN_FEE_ESTIMATES']._serialized_start=42669 - _globals['_FEERATESONCHAIN_FEE_ESTIMATES']._serialized_end=42952 - _globals['_FETCHINVOICEREQUEST']._serialized_start=42955 - _globals['_FETCHINVOICEREQUEST']._serialized_end=43316 - _globals['_FETCHINVOICERESPONSE']._serialized_start=43319 - _globals['_FETCHINVOICERESPONSE']._serialized_end=43473 - _globals['_FETCHINVOICECHANGES']._serialized_start=43476 - _globals['_FETCHINVOICECHANGES']._serialized_end=43734 - _globals['_FETCHINVOICENEXT_PERIOD']._serialized_start=43736 - _globals['_FETCHINVOICENEXT_PERIOD']._serialized_end=43862 - _globals['_FUNDCHANNEL_CANCELREQUEST']._serialized_start=43864 - _globals['_FUNDCHANNEL_CANCELREQUEST']._serialized_end=43903 - _globals['_FUNDCHANNEL_CANCELRESPONSE']._serialized_start=43905 - _globals['_FUNDCHANNEL_CANCELRESPONSE']._serialized_end=43952 - _globals['_FUNDCHANNEL_COMPLETEREQUEST']._serialized_start=43954 - _globals['_FUNDCHANNEL_COMPLETEREQUEST']._serialized_end=44009 - _globals['_FUNDCHANNEL_COMPLETERESPONSE']._serialized_start=44011 - _globals['_FUNDCHANNEL_COMPLETERESPONSE']._serialized_end=44090 - _globals['_FUNDCHANNELREQUEST']._serialized_start=44093 - _globals['_FUNDCHANNELREQUEST']._serialized_end=44600 - _globals['_FUNDCHANNELRESPONSE']._serialized_start=44603 - _globals['_FUNDCHANNELRESPONSE']._serialized_end=44832 - _globals['_FUNDCHANNELCHANNEL_TYPE']._serialized_start=44834 - _globals['_FUNDCHANNELCHANNEL_TYPE']._serialized_end=44910 - _globals['_FUNDCHANNEL_STARTREQUEST']._serialized_start=44913 - _globals['_FUNDCHANNEL_STARTREQUEST']._serialized_end=45256 - _globals['_FUNDCHANNEL_STARTRESPONSE']._serialized_start=45259 - _globals['_FUNDCHANNEL_STARTRESPONSE']._serialized_end=45508 - _globals['_FUNDCHANNEL_STARTCHANNEL_TYPE']._serialized_start=45510 - _globals['_FUNDCHANNEL_STARTCHANNEL_TYPE']._serialized_end=45592 - _globals['_GETLOGREQUEST']._serialized_start=45595 - _globals['_GETLOGREQUEST']._serialized_end=45752 - _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_start=45664 - _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_end=45742 - _globals['_GETLOGRESPONSE']._serialized_start=45754 - _globals['_GETLOGRESPONSE']._serialized_end=45858 - _globals['_GETLOGLOG']._serialized_start=45861 - _globals['_GETLOGLOG']._serialized_end=46221 - _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_start=46048 - _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_end=46156 - _globals['_FUNDERUPDATEREQUEST']._serialized_start=46224 - _globals['_FUNDERUPDATEREQUEST']._serialized_end=47337 - _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_start=46918 - _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_end=46975 - _globals['_FUNDERUPDATERESPONSE']._serialized_start=47340 - _globals['_FUNDERUPDATERESPONSE']._serialized_end=48203 - _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_start=46918 - _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_end=46975 - _globals['_GETROUTEREQUEST']._serialized_start=48206 - _globals['_GETROUTEREQUEST']._serialized_end=48442 - _globals['_GETROUTERESPONSE']._serialized_start=48444 - _globals['_GETROUTERESPONSE']._serialized_end=48497 - _globals['_GETROUTEROUTE']._serialized_start=48500 - _globals['_GETROUTEROUTE']._serialized_end=48697 - _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_start=48668 - _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_end=48697 - _globals['_LISTFORWARDSREQUEST']._serialized_start=48700 - _globals['_LISTFORWARDSREQUEST']._serialized_end=49139 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_start=48944 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_end=49020 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_start=49022 - _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_end=49067 - _globals['_LISTFORWARDSRESPONSE']._serialized_start=49141 - _globals['_LISTFORWARDSRESPONSE']._serialized_end=49208 - _globals['_LISTFORWARDSFORWARDS']._serialized_start=49211 - _globals['_LISTFORWARDSFORWARDS']._serialized_end=50031 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_start=49732 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_end=49816 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_start=49818 - _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_end=49866 - _globals['_LISTOFFERSREQUEST']._serialized_start=50033 - _globals['_LISTOFFERSREQUEST']._serialized_end=50130 - _globals['_LISTOFFERSRESPONSE']._serialized_start=50132 - _globals['_LISTOFFERSRESPONSE']._serialized_end=50191 - _globals['_LISTOFFERSOFFERS']._serialized_start=50194 - _globals['_LISTOFFERSOFFERS']._serialized_end=50326 - _globals['_LISTPAYSREQUEST']._serialized_start=50329 - _globals['_LISTPAYSREQUEST']._serialized_end=50548 - _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_start=50454 - _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_end=50509 - _globals['_LISTPAYSRESPONSE']._serialized_start=50550 - _globals['_LISTPAYSRESPONSE']._serialized_end=50601 - _globals['_LISTPAYSPAYS']._serialized_start=50604 - _globals['_LISTPAYSPAYS']._serialized_end=51243 - _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_start=51018 - _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_end=51077 - _globals['_LISTHTLCSREQUEST']._serialized_start=51245 - _globals['_LISTHTLCSREQUEST']._serialized_end=51287 - _globals['_LISTHTLCSRESPONSE']._serialized_start=51289 - _globals['_LISTHTLCSRESPONSE']._serialized_end=51344 - _globals['_LISTHTLCSHTLCS']._serialized_start=51347 - _globals['_LISTHTLCSHTLCS']._serialized_end=51612 - _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_start=51570 - _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_end=51612 - _globals['_MULTIFUNDCHANNELREQUEST']._serialized_start=51615 - _globals['_MULTIFUNDCHANNELREQUEST']._serialized_end=51921 - _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_start=51924 - _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_end=52076 - _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_start=52079 - _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_end=52462 - _globals['_MULTIFUNDCHANNELCHANNEL_IDS']._serialized_start=52465 - _globals['_MULTIFUNDCHANNELCHANNEL_IDS']._serialized_end=52668 - _globals['_MULTIFUNDCHANNELCHANNEL_IDSCHANNEL_TYPE']._serialized_start=52670 - _globals['_MULTIFUNDCHANNELCHANNEL_IDSCHANNEL_TYPE']._serialized_end=52762 - _globals['_MULTIFUNDCHANNELFAILED']._serialized_start=52765 - _globals['_MULTIFUNDCHANNELFAILED']._serialized_end=53040 - _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_start=52926 - _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_end=53040 - _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_start=53042 - _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_end=53102 - _globals['_MULTIWITHDRAWREQUEST']._serialized_start=53105 - _globals['_MULTIWITHDRAWREQUEST']._serialized_end=53273 - _globals['_MULTIWITHDRAWRESPONSE']._serialized_start=53275 - _globals['_MULTIWITHDRAWRESPONSE']._serialized_end=53324 - _globals['_OFFERREQUEST']._serialized_start=53327 - _globals['_OFFERREQUEST']._serialized_end=53871 - _globals['_OFFERRESPONSE']._serialized_start=53874 - _globals['_OFFERRESPONSE']._serialized_end=54020 - _globals['_OPENCHANNEL_ABORTREQUEST']._serialized_start=54022 - _globals['_OPENCHANNEL_ABORTREQUEST']._serialized_end=54068 - _globals['_OPENCHANNEL_ABORTRESPONSE']._serialized_start=54070 - _globals['_OPENCHANNEL_ABORTRESPONSE']._serialized_end=54159 - _globals['_OPENCHANNEL_BUMPREQUEST']._serialized_start=54162 - _globals['_OPENCHANNEL_BUMPREQUEST']._serialized_end=54321 - _globals['_OPENCHANNEL_BUMPRESPONSE']._serialized_start=54324 - _globals['_OPENCHANNEL_BUMPRESPONSE']._serialized_end=54586 - _globals['_OPENCHANNEL_BUMPCHANNEL_TYPE']._serialized_start=54588 - _globals['_OPENCHANNEL_BUMPCHANNEL_TYPE']._serialized_end=54669 - _globals['_OPENCHANNEL_INITREQUEST']._serialized_start=54672 - _globals['_OPENCHANNEL_INITREQUEST']._serialized_end=55088 - _globals['_OPENCHANNEL_INITRESPONSE']._serialized_start=55091 - _globals['_OPENCHANNEL_INITRESPONSE']._serialized_end=55353 - _globals['_OPENCHANNEL_INITCHANNEL_TYPE']._serialized_start=55355 - _globals['_OPENCHANNEL_INITCHANNEL_TYPE']._serialized_end=55436 - _globals['_OPENCHANNEL_SIGNEDREQUEST']._serialized_start=55438 - _globals['_OPENCHANNEL_SIGNEDREQUEST']._serialized_end=55506 - _globals['_OPENCHANNEL_SIGNEDRESPONSE']._serialized_start=55508 - _globals['_OPENCHANNEL_SIGNEDRESPONSE']._serialized_end=55582 - _globals['_OPENCHANNEL_UPDATEREQUEST']._serialized_start=55584 - _globals['_OPENCHANNEL_UPDATEREQUEST']._serialized_end=55645 - _globals['_OPENCHANNEL_UPDATERESPONSE']._serialized_start=55648 - _globals['_OPENCHANNEL_UPDATERESPONSE']._serialized_end=55950 - _globals['_OPENCHANNEL_UPDATECHANNEL_TYPE']._serialized_start=55952 - _globals['_OPENCHANNEL_UPDATECHANNEL_TYPE']._serialized_end=56035 - _globals['_PINGREQUEST']._serialized_start=56037 - _globals['_PINGREQUEST']._serialized_end=56126 - _globals['_PINGRESPONSE']._serialized_start=56128 - _globals['_PINGRESPONSE']._serialized_end=56158 - _globals['_PLUGINREQUEST']._serialized_start=56161 - _globals['_PLUGINREQUEST']._serialized_end=56306 - _globals['_PLUGINRESPONSE']._serialized_start=56308 - _globals['_PLUGINRESPONSE']._serialized_end=56433 - _globals['_PLUGINPLUGINS']._serialized_start=56435 - _globals['_PLUGINPLUGINS']._serialized_end=56497 - _globals['_RENEPAYSTATUSREQUEST']._serialized_start=56499 - _globals['_RENEPAYSTATUSREQUEST']._serialized_end=56559 - _globals['_RENEPAYSTATUSRESPONSE']._serialized_start=56561 - _globals['_RENEPAYSTATUSRESPONSE']._serialized_end=56632 - _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_start=56635 - _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_end=57117 - _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_start=56980 - _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_end=57049 - _globals['_RENEPAYREQUEST']._serialized_start=57120 - _globals['_RENEPAYREQUEST']._serialized_end=57449 - _globals['_RENEPAYRESPONSE']._serialized_start=57452 - _globals['_RENEPAYRESPONSE']._serialized_end=57775 - _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_start=57705 - _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_end=57759 - _globals['_RESERVEINPUTSREQUEST']._serialized_start=57777 - _globals['_RESERVEINPUTSREQUEST']._serialized_end=57885 - _globals['_RESERVEINPUTSRESPONSE']._serialized_start=57887 - _globals['_RESERVEINPUTSRESPONSE']._serialized_end=57964 - _globals['_RESERVEINPUTSRESERVATIONS']._serialized_start=57966 - _globals['_RESERVEINPUTSRESERVATIONS']._serialized_end=58088 - _globals['_SENDCUSTOMMSGREQUEST']._serialized_start=58090 - _globals['_SENDCUSTOMMSGREQUEST']._serialized_end=58142 - _globals['_SENDCUSTOMMSGRESPONSE']._serialized_start=58144 - _globals['_SENDCUSTOMMSGRESPONSE']._serialized_end=58183 - _globals['_SENDINVOICEREQUEST']._serialized_start=58186 - _globals['_SENDINVOICEREQUEST']._serialized_end=58362 - _globals['_SENDINVOICERESPONSE']._serialized_start=58365 - _globals['_SENDINVOICERESPONSE']._serialized_end=58956 - _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_start=58767 - _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_end=58821 - _globals['_SETCHANNELREQUEST']._serialized_start=58959 - _globals['_SETCHANNELREQUEST']._serialized_end=59257 - _globals['_SETCHANNELRESPONSE']._serialized_start=59259 - _globals['_SETCHANNELRESPONSE']._serialized_end=59322 - _globals['_SETCHANNELCHANNELS']._serialized_start=59325 - _globals['_SETCHANNELCHANNELS']._serialized_end=59783 - _globals['_SETCONFIGREQUEST']._serialized_start=59785 - _globals['_SETCONFIGREQUEST']._serialized_end=59845 - _globals['_SETCONFIGRESPONSE']._serialized_start=59847 - _globals['_SETCONFIGRESPONSE']._serialized_end=59904 - _globals['_SETCONFIGCONFIG']._serialized_start=59907 - _globals['_SETCONFIGCONFIG']._serialized_end=60200 - _globals['_SETPSBTVERSIONREQUEST']._serialized_start=60202 - _globals['_SETPSBTVERSIONREQUEST']._serialized_end=60256 - _globals['_SETPSBTVERSIONRESPONSE']._serialized_start=60258 - _globals['_SETPSBTVERSIONRESPONSE']._serialized_end=60296 - _globals['_SIGNINVOICEREQUEST']._serialized_start=60298 - _globals['_SIGNINVOICEREQUEST']._serialized_end=60337 - _globals['_SIGNINVOICERESPONSE']._serialized_start=60339 - _globals['_SIGNINVOICERESPONSE']._serialized_end=60376 - _globals['_SIGNMESSAGEREQUEST']._serialized_start=60378 - _globals['_SIGNMESSAGEREQUEST']._serialized_end=60415 - _globals['_SIGNMESSAGERESPONSE']._serialized_start=60417 - _globals['_SIGNMESSAGERESPONSE']._serialized_end=60487 - _globals['_SPLICE_INITREQUEST']._serialized_start=60490 - _globals['_SPLICE_INITREQUEST']._serialized_end=60691 - _globals['_SPLICE_INITRESPONSE']._serialized_start=60693 - _globals['_SPLICE_INITRESPONSE']._serialized_end=60728 - _globals['_SPLICE_SIGNEDREQUEST']._serialized_start=60730 - _globals['_SPLICE_SIGNEDREQUEST']._serialized_end=60826 - _globals['_SPLICE_SIGNEDRESPONSE']._serialized_start=60828 - _globals['_SPLICE_SIGNEDRESPONSE']._serialized_end=60909 - _globals['_SPLICE_UPDATEREQUEST']._serialized_start=60911 - _globals['_SPLICE_UPDATEREQUEST']._serialized_end=60967 - _globals['_SPLICE_UPDATERESPONSE']._serialized_start=60969 - _globals['_SPLICE_UPDATERESPONSE']._serialized_end=61035 - _globals['_UNRESERVEINPUTSREQUEST']._serialized_start=61037 - _globals['_UNRESERVEINPUTSREQUEST']._serialized_end=61109 - _globals['_UNRESERVEINPUTSRESPONSE']._serialized_start=61111 - _globals['_UNRESERVEINPUTSRESPONSE']._serialized_end=61192 - _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_start=61195 - _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_end=61346 - _globals['_UPGRADEWALLETREQUEST']._serialized_start=61348 - _globals['_UPGRADEWALLETREQUEST']._serialized_end=61458 - _globals['_UPGRADEWALLETRESPONSE']._serialized_start=61461 - _globals['_UPGRADEWALLETRESPONSE']._serialized_end=61610 - _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_start=61612 - _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_end=61691 - _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_start=61693 - _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_end=61739 - _globals['_WAITREQUEST']._serialized_start=61742 - _globals['_WAITREQUEST']._serialized_end=61991 - _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_start=61878 - _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_end=61935 - _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_start=61937 - _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_end=61991 - _globals['_WAITRESPONSE']._serialized_start=61994 - _globals['_WAITRESPONSE']._serialized_end=62273 - _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_start=61878 - _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_end=61935 - _globals['_WAITDETAILS']._serialized_start=62276 - _globals['_WAITDETAILS']._serialized_end=62912 - _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_start=62618 - _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_end=62755 - _globals['_LISTCONFIGSREQUEST']._serialized_start=62914 - _globals['_LISTCONFIGSREQUEST']._serialized_end=62966 - _globals['_LISTCONFIGSRESPONSE']._serialized_start=62969 - _globals['_LISTCONFIGSRESPONSE']._serialized_end=66520 - _globals['_LISTCONFIGSCONFIGS']._serialized_start=66523 - _globals['_LISTCONFIGSCONFIGS']._serialized_end=72506 - _globals['_LISTCONFIGSCONFIGSCONF']._serialized_start=72509 - _globals['_LISTCONFIGSCONFIGSCONF']._serialized_end=72671 - _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_start=72628 - _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_end=72671 - _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_start=72673 - _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_end=72731 - _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_start=72733 - _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_end=72794 - _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_start=72796 - _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_end=72887 - _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_start=72889 - _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_end=72945 - _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_start=72947 - _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_end=73003 - _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_start=73005 - _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_end=73060 - _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_start=73062 - _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_end=73118 - _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_start=73120 - _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_end=73192 - _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_start=73194 - _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_end=73257 - _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_start=73259 - _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_end=73325 - _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_start=73327 - _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_end=73394 - _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_start=73396 - _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_end=73458 - _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_start=73460 - _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_end=73535 - _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_start=73537 - _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_end=73599 - _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_start=73601 - _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_end=73671 - _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_start=73673 - _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_end=73743 - _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_start=73745 - _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_end=73800 - _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_start=73802 - _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_end=73863 - _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_start=73865 - _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_end=73927 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_start=73929 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_end=73998 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_start=74000 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_end=74069 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_start=74071 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_end=74145 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_start=74147 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_end=74214 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_start=74216 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_end=74297 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_start=74299 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_end=74371 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_start=74373 - _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_end=74441 - _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_start=74443 - _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_end=74514 - _globals['_LISTCONFIGSCONFIGSRGB']._serialized_start=74516 - _globals['_LISTCONFIGSCONFIGSRGB']._serialized_end=74574 - _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_start=74576 - _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_end=74636 - _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_start=74638 - _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_end=74700 - _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_start=74702 - _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_end=74773 - _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_start=74775 - _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_end=74845 - _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_start=74847 - _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_end=74919 - _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_start=74921 - _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_end=74991 - _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_start=74993 - _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_end=75057 - _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_start=75059 - _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_end=75123 - _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_start=75125 - _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_end=75190 - _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_start=75192 - _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_end=75254 - _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_start=75256 - _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_end=75317 - _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_start=75319 - _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_end=75387 - _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_start=75389 - _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_end=75462 - _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_start=75464 - _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_end=75548 - _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_start=75550 - _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_end=75634 - _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_start=75636 - _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_end=75728 - _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_start=75730 - _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_end=75833 - _globals['_LISTCONFIGSCONFIGSADDR']._serialized_start=75835 - _globals['_LISTCONFIGSCONFIGSADDR']._serialized_end=75896 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_start=75898 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_end=75967 - _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_start=75969 - _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_end=76034 - _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_start=76036 - _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_end=76092 - _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_start=76094 - _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_end=76160 - _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_start=76162 - _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_end=76222 - _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_start=76224 - _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_end=76283 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_start=76286 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_end=76544 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUE_STR']._serialized_start=76462 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUE_STR']._serialized_end=76544 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_start=76546 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_end=76627 - _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_start=76629 - _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_end=76690 - _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_start=76692 - _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_end=76758 - _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_start=76760 - _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_end=76823 - _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_start=76825 - _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_end=76889 - _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_start=76891 - _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_end=76955 - _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_start=76957 - _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_end=77026 - _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_start=77028 - _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_end=77096 - _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_start=77098 - _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_end=77164 - _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_start=77166 - _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_end=77268 - _globals['_LISTCONFIGSCONFIGSACCEPTHTLCTLVTYPES']._serialized_start=77270 - _globals['_LISTCONFIGSCONFIGSACCEPTHTLCTLVTYPES']._serialized_end=77343 - _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_start=77345 - _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_end=77418 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_start=77420 - _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_end=77491 - _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_start=77493 - _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_end=77571 - _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_start=77573 - _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_end=77637 - _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_start=77639 - _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_end=77713 - _globals['_LISTCONFIGSPLUGINS']._serialized_start=77715 - _globals['_LISTCONFIGSPLUGINS']._serialized_end=77829 - _globals['_LISTCONFIGSPLUGINSOPTIONS']._serialized_start=77831 - _globals['_LISTCONFIGSPLUGINSOPTIONS']._serialized_end=77858 - _globals['_LISTCONFIGSIMPORTANTPLUGINS']._serialized_start=77861 - _globals['_LISTCONFIGSIMPORTANTPLUGINS']._serialized_end=77993 - _globals['_LISTCONFIGSIMPORTANTPLUGINSOPTIONS']._serialized_start=77995 - _globals['_LISTCONFIGSIMPORTANTPLUGINSOPTIONS']._serialized_end=78031 - _globals['_STOPREQUEST']._serialized_start=78033 - _globals['_STOPREQUEST']._serialized_end=78046 - _globals['_STOPRESPONSE']._serialized_start=78048 - _globals['_STOPRESPONSE']._serialized_end=78161 - _globals['_STOPRESPONSE_STOPRESULT']._serialized_start=78115 - _globals['_STOPRESPONSE_STOPRESULT']._serialized_end=78150 - _globals['_HELPREQUEST']._serialized_start=78163 - _globals['_HELPREQUEST']._serialized_end=78210 - _globals['_HELPRESPONSE']._serialized_start=78213 - _globals['_HELPRESPONSE']._serialized_end=78362 - _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_start=78318 - _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_end=78346 - _globals['_HELPHELP']._serialized_start=78364 - _globals['_HELPHELP']._serialized_end=78447 - _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_start=78449 - _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_end=78552 - _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_start=78554 - _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_end=78581 - _globals['_PREAPPROVEINVOICEREQUEST']._serialized_start=78583 - _globals['_PREAPPROVEINVOICEREQUEST']._serialized_end=78625 - _globals['_PREAPPROVEINVOICERESPONSE']._serialized_start=78627 - _globals['_PREAPPROVEINVOICERESPONSE']._serialized_end=78654 - _globals['_STATICBACKUPREQUEST']._serialized_start=78656 - _globals['_STATICBACKUPREQUEST']._serialized_end=78677 - _globals['_STATICBACKUPRESPONSE']._serialized_start=78679 - _globals['_STATICBACKUPRESPONSE']._serialized_end=78714 - _globals['_BKPRCHANNELSAPYREQUEST']._serialized_start=78716 - _globals['_BKPRCHANNELSAPYREQUEST']._serialized_end=78816 - _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_start=78818 - _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_end=78899 - _globals['_BKPRCHANNELSAPYCHANNELS_APY']._serialized_start=78902 - _globals['_BKPRCHANNELSAPYCHANNELS_APY']._serialized_end=79792 - _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_start=79795 - _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_end=80005 - _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_start=80008 - _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_end=80222 - _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSV_FORMAT']._serialized_start=80135 - _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSV_FORMAT']._serialized_end=80222 - _globals['_BKPRINSPECTREQUEST']._serialized_start=80224 - _globals['_BKPRINSPECTREQUEST']._serialized_end=80261 - _globals['_BKPRINSPECTRESPONSE']._serialized_start=80263 - _globals['_BKPRINSPECTRESPONSE']._serialized_end=80318 - _globals['_BKPRINSPECTTXS']._serialized_start=80321 - _globals['_BKPRINSPECTTXS']._serialized_end=80475 - _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_start=80478 - _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_end=80922 - _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_start=80924 - _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_end=80988 - _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_start=80990 - _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_end=81071 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_start=81074 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_end=81747 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_start=81550 - _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_end=81624 - _globals['_BKPRLISTBALANCESREQUEST']._serialized_start=81749 - _globals['_BKPRLISTBALANCESREQUEST']._serialized_end=81774 - _globals['_BKPRLISTBALANCESRESPONSE']._serialized_start=81776 - _globals['_BKPRLISTBALANCESRESPONSE']._serialized_end=81851 - _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_start=81854 - _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_end=82180 - _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_start=82182 - _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_end=82270 - _globals['_BKPRLISTINCOMEREQUEST']._serialized_start=82273 - _globals['_BKPRLISTINCOMEREQUEST']._serialized_end=82424 - _globals['_BKPRLISTINCOMERESPONSE']._serialized_start=82426 - _globals['_BKPRLISTINCOMERESPONSE']._serialized_end=82507 - _globals['_BKPRLISTINCOMEINCOME_EVENTS']._serialized_start=82510 - _globals['_BKPRLISTINCOMEINCOME_EVENTS']._serialized_end=82819 - _globals['_BLACKLISTRUNEREQUEST']._serialized_start=82821 - _globals['_BLACKLISTRUNEREQUEST']._serialized_end=82899 - _globals['_BLACKLISTRUNERESPONSE']._serialized_start=82901 - _globals['_BLACKLISTRUNERESPONSE']._serialized_end=82972 - _globals['_BLACKLISTRUNEBLACKLIST']._serialized_start=82974 - _globals['_BLACKLISTRUNEBLACKLIST']._serialized_end=83026 - _globals['_CHECKRUNEREQUEST']._serialized_start=83028 - _globals['_CHECKRUNEREQUEST']._serialized_end=83140 - _globals['_CHECKRUNERESPONSE']._serialized_start=83142 - _globals['_CHECKRUNERESPONSE']._serialized_end=83176 - _globals['_CREATERUNEREQUEST']._serialized_start=83178 - _globals['_CREATERUNEREQUEST']._serialized_end=83247 - _globals['_CREATERUNERESPONSE']._serialized_start=83249 - _globals['_CREATERUNERESPONSE']._serialized_end=83372 - _globals['_SHOWRUNESREQUEST']._serialized_start=83374 - _globals['_SHOWRUNESREQUEST']._serialized_end=83420 - _globals['_SHOWRUNESRESPONSE']._serialized_start=83422 - _globals['_SHOWRUNESRESPONSE']._serialized_end=83477 - _globals['_SHOWRUNESRUNES']._serialized_start=83480 - _globals['_SHOWRUNESRUNES']._serialized_end=83765 - _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_start=83767 - _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_end=83879 - _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_start=83881 - _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_end=83991 - _globals['_STREAMBLOCKADDEDREQUEST']._serialized_start=83993 - _globals['_STREAMBLOCKADDEDREQUEST']._serialized_end=84018 - _globals['_BLOCKADDEDNOTIFICATION']._serialized_start=84020 - _globals['_BLOCKADDEDNOTIFICATION']._serialized_end=84074 - _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_start=84076 - _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_end=84108 - _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_start=84110 - _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_end=84161 - _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_start=84163 - _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_end=84191 - _globals['_CHANNELOPENEDNOTIFICATION']._serialized_start=84193 - _globals['_CHANNELOPENEDNOTIFICATION']._serialized_end=84312 - _globals['_STREAMCONNECTREQUEST']._serialized_start=84314 - _globals['_STREAMCONNECTREQUEST']._serialized_end=84336 - _globals['_PEERCONNECTNOTIFICATION']._serialized_start=84339 - _globals['_PEERCONNECTNOTIFICATION']._serialized_end=84529 - _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_start=84490 - _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_end=84529 - _globals['_PEERCONNECTADDRESS']._serialized_start=84532 - _globals['_PEERCONNECTADDRESS']._serialized_end=84799 - _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_start=84683 - _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_end=84767 - _globals['_STREAMCUSTOMMSGREQUEST']._serialized_start=84801 - _globals['_STREAMCUSTOMMSGREQUEST']._serialized_end=84825 - _globals['_CUSTOMMSGNOTIFICATION']._serialized_start=84827 - _globals['_CUSTOMMSGNOTIFICATION']._serialized_end=84884 - _globals['_NODE']._serialized_start=84887 - _globals['_NODE']._serialized_end=93026 + _globals['_DECODERESPONSE']._serialized_end=39066 + _globals['_DECODERESPONSE_DECODETYPE']._serialized_start=37161 + _globals['_DECODERESPONSE_DECODETYPE']._serialized_end=37292 + _globals['_DECODEOFFER_PATHS']._serialized_start=39069 + _globals['_DECODEOFFER_PATHS']._serialized_end=39240 + _globals['_DECODEOFFER_RECURRENCEPAYWINDOW']._serialized_start=39243 + _globals['_DECODEOFFER_RECURRENCEPAYWINDOW']._serialized_end=39381 + _globals['_DECODEINVREQ_PATHS']._serialized_start=39384 + _globals['_DECODEINVREQ_PATHS']._serialized_end=39599 + _globals['_DECODEINVREQ_PATHSPATH']._serialized_start=39601 + _globals['_DECODEINVREQ_PATHSPATH']._serialized_end=39684 + _globals['_DECODEINVOICE_PATHSPATH']._serialized_start=39686 + _globals['_DECODEINVOICE_PATHSPATH']._serialized_end=39770 + _globals['_DECODEINVOICE_FALLBACKS']._serialized_start=39772 + _globals['_DECODEINVOICE_FALLBACKS']._serialized_end=39861 + _globals['_DECODEFALLBACKS']._serialized_start=39864 + _globals['_DECODEFALLBACKS']._serialized_end=40162 + _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_start=40032 + _globals['_DECODEFALLBACKS_DECODEFALLBACKSTYPE']._serialized_end=40107 + _globals['_DECODEEXTRA']._serialized_start=40164 + _globals['_DECODEEXTRA']._serialized_end=40204 + _globals['_DECODERESTRICTIONS']._serialized_start=40206 + _globals['_DECODERESTRICTIONS']._serialized_end=40265 + _globals['_DELPAYREQUEST']._serialized_start=40268 + _globals['_DELPAYREQUEST']._serialized_end=40462 + _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_start=40399 + _globals['_DELPAYREQUEST_DELPAYSTATUS']._serialized_end=40439 + _globals['_DELPAYRESPONSE']._serialized_start=40464 + _globals['_DELPAYRESPONSE']._serialized_end=40519 + _globals['_DELPAYPAYMENTS']._serialized_start=40522 + _globals['_DELPAYPAYMENTS']._serialized_end=41237 + _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_start=41000 + _globals['_DELPAYPAYMENTS_DELPAYPAYMENTSSTATUS']._serialized_end=41061 + _globals['_DELFORWARDREQUEST']._serialized_start=41240 + _globals['_DELFORWARDREQUEST']._serialized_end=41419 + _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_start=41358 + _globals['_DELFORWARDREQUEST_DELFORWARDSTATUS']._serialized_end=41419 + _globals['_DELFORWARDRESPONSE']._serialized_start=41421 + _globals['_DELFORWARDRESPONSE']._serialized_end=41441 + _globals['_DISABLEOFFERREQUEST']._serialized_start=41443 + _globals['_DISABLEOFFERREQUEST']._serialized_end=41482 + _globals['_DISABLEOFFERRESPONSE']._serialized_start=41485 + _globals['_DISABLEOFFERRESPONSE']._serialized_end=41621 + _globals['_DISCONNECTREQUEST']._serialized_start=41623 + _globals['_DISCONNECTREQUEST']._serialized_end=41684 + _globals['_DISCONNECTRESPONSE']._serialized_start=41686 + _globals['_DISCONNECTRESPONSE']._serialized_end=41706 + _globals['_FEERATESREQUEST']._serialized_start=41708 + _globals['_FEERATESREQUEST']._serialized_end=41815 + _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_start=41778 + _globals['_FEERATESREQUEST_FEERATESSTYLE']._serialized_end=41815 + _globals['_FEERATESRESPONSE']._serialized_start=41818 + _globals['_FEERATESRESPONSE']._serialized_end=42102 + _globals['_FEERATESPERKB']._serialized_start=42105 + _globals['_FEERATESPERKB']._serialized_end=42572 + _globals['_FEERATESPERKBESTIMATES']._serialized_start=42574 + _globals['_FEERATESPERKBESTIMATES']._serialized_end=42661 + _globals['_FEERATESPERKW']._serialized_start=42664 + _globals['_FEERATESPERKW']._serialized_end=43131 + _globals['_FEERATESPERKWESTIMATES']._serialized_start=43133 + _globals['_FEERATESPERKWESTIMATES']._serialized_end=43220 + _globals['_FEERATESONCHAIN_FEE_ESTIMATES']._serialized_start=43223 + _globals['_FEERATESONCHAIN_FEE_ESTIMATES']._serialized_end=43506 + _globals['_FETCHINVOICEREQUEST']._serialized_start=43509 + _globals['_FETCHINVOICEREQUEST']._serialized_end=43870 + _globals['_FETCHINVOICERESPONSE']._serialized_start=43873 + _globals['_FETCHINVOICERESPONSE']._serialized_end=44027 + _globals['_FETCHINVOICECHANGES']._serialized_start=44030 + _globals['_FETCHINVOICECHANGES']._serialized_end=44288 + _globals['_FETCHINVOICENEXT_PERIOD']._serialized_start=44290 + _globals['_FETCHINVOICENEXT_PERIOD']._serialized_end=44416 + _globals['_FUNDCHANNEL_CANCELREQUEST']._serialized_start=44418 + _globals['_FUNDCHANNEL_CANCELREQUEST']._serialized_end=44457 + _globals['_FUNDCHANNEL_CANCELRESPONSE']._serialized_start=44459 + _globals['_FUNDCHANNEL_CANCELRESPONSE']._serialized_end=44506 + _globals['_FUNDCHANNEL_COMPLETEREQUEST']._serialized_start=44508 + _globals['_FUNDCHANNEL_COMPLETEREQUEST']._serialized_end=44563 + _globals['_FUNDCHANNEL_COMPLETERESPONSE']._serialized_start=44565 + _globals['_FUNDCHANNEL_COMPLETERESPONSE']._serialized_end=44644 + _globals['_FUNDCHANNELREQUEST']._serialized_start=44647 + _globals['_FUNDCHANNELREQUEST']._serialized_end=45154 + _globals['_FUNDCHANNELRESPONSE']._serialized_start=45157 + _globals['_FUNDCHANNELRESPONSE']._serialized_end=45386 + _globals['_FUNDCHANNELCHANNEL_TYPE']._serialized_start=45388 + _globals['_FUNDCHANNELCHANNEL_TYPE']._serialized_end=45464 + _globals['_FUNDCHANNEL_STARTREQUEST']._serialized_start=45467 + _globals['_FUNDCHANNEL_STARTREQUEST']._serialized_end=45810 + _globals['_FUNDCHANNEL_STARTRESPONSE']._serialized_start=45813 + _globals['_FUNDCHANNEL_STARTRESPONSE']._serialized_end=46062 + _globals['_FUNDCHANNEL_STARTCHANNEL_TYPE']._serialized_start=46064 + _globals['_FUNDCHANNEL_STARTCHANNEL_TYPE']._serialized_end=46146 + _globals['_GETLOGREQUEST']._serialized_start=46149 + _globals['_GETLOGREQUEST']._serialized_end=46306 + _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_start=46218 + _globals['_GETLOGREQUEST_GETLOGLEVEL']._serialized_end=46296 + _globals['_GETLOGRESPONSE']._serialized_start=46308 + _globals['_GETLOGRESPONSE']._serialized_end=46412 + _globals['_GETLOGLOG']._serialized_start=46415 + _globals['_GETLOGLOG']._serialized_end=46775 + _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_start=46602 + _globals['_GETLOGLOG_GETLOGLOGTYPE']._serialized_end=46710 + _globals['_FUNDERUPDATEREQUEST']._serialized_start=46778 + _globals['_FUNDERUPDATEREQUEST']._serialized_end=47891 + _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_start=47472 + _globals['_FUNDERUPDATEREQUEST_FUNDERUPDATEPOLICY']._serialized_end=47529 + _globals['_FUNDERUPDATERESPONSE']._serialized_start=47894 + _globals['_FUNDERUPDATERESPONSE']._serialized_end=48757 + _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_start=47472 + _globals['_FUNDERUPDATERESPONSE_FUNDERUPDATEPOLICY']._serialized_end=47529 + _globals['_GETROUTEREQUEST']._serialized_start=48760 + _globals['_GETROUTEREQUEST']._serialized_end=48996 + _globals['_GETROUTERESPONSE']._serialized_start=48998 + _globals['_GETROUTERESPONSE']._serialized_end=49051 + _globals['_GETROUTEROUTE']._serialized_start=49054 + _globals['_GETROUTEROUTE']._serialized_end=49251 + _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_start=49222 + _globals['_GETROUTEROUTE_GETROUTEROUTESTYLE']._serialized_end=49251 + _globals['_LISTFORWARDSREQUEST']._serialized_start=49254 + _globals['_LISTFORWARDSREQUEST']._serialized_end=49693 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_start=49498 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSSTATUS']._serialized_end=49574 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_start=49576 + _globals['_LISTFORWARDSREQUEST_LISTFORWARDSINDEX']._serialized_end=49621 + _globals['_LISTFORWARDSRESPONSE']._serialized_start=49695 + _globals['_LISTFORWARDSRESPONSE']._serialized_end=49762 + _globals['_LISTFORWARDSFORWARDS']._serialized_start=49765 + _globals['_LISTFORWARDSFORWARDS']._serialized_end=50585 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_start=50286 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTATUS']._serialized_end=50370 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_start=50372 + _globals['_LISTFORWARDSFORWARDS_LISTFORWARDSFORWARDSSTYLE']._serialized_end=50420 + _globals['_LISTOFFERSREQUEST']._serialized_start=50587 + _globals['_LISTOFFERSREQUEST']._serialized_end=50684 + _globals['_LISTOFFERSRESPONSE']._serialized_start=50686 + _globals['_LISTOFFERSRESPONSE']._serialized_end=50745 + _globals['_LISTOFFERSOFFERS']._serialized_start=50748 + _globals['_LISTOFFERSOFFERS']._serialized_end=50880 + _globals['_LISTPAYSREQUEST']._serialized_start=50883 + _globals['_LISTPAYSREQUEST']._serialized_end=51102 + _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_start=51008 + _globals['_LISTPAYSREQUEST_LISTPAYSSTATUS']._serialized_end=51063 + _globals['_LISTPAYSRESPONSE']._serialized_start=51104 + _globals['_LISTPAYSRESPONSE']._serialized_end=51155 + _globals['_LISTPAYSPAYS']._serialized_start=51158 + _globals['_LISTPAYSPAYS']._serialized_end=51797 + _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_start=51572 + _globals['_LISTPAYSPAYS_LISTPAYSPAYSSTATUS']._serialized_end=51631 + _globals['_LISTHTLCSREQUEST']._serialized_start=51799 + _globals['_LISTHTLCSREQUEST']._serialized_end=51841 + _globals['_LISTHTLCSRESPONSE']._serialized_start=51843 + _globals['_LISTHTLCSRESPONSE']._serialized_end=51898 + _globals['_LISTHTLCSHTLCS']._serialized_start=51901 + _globals['_LISTHTLCSHTLCS']._serialized_end=52166 + _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_start=52124 + _globals['_LISTHTLCSHTLCS_LISTHTLCSHTLCSDIRECTION']._serialized_end=52166 + _globals['_MULTIFUNDCHANNELREQUEST']._serialized_start=52169 + _globals['_MULTIFUNDCHANNELREQUEST']._serialized_end=52475 + _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_start=52478 + _globals['_MULTIFUNDCHANNELRESPONSE']._serialized_end=52630 + _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_start=52633 + _globals['_MULTIFUNDCHANNELDESTINATIONS']._serialized_end=53016 + _globals['_MULTIFUNDCHANNELCHANNEL_IDS']._serialized_start=53019 + _globals['_MULTIFUNDCHANNELCHANNEL_IDS']._serialized_end=53222 + _globals['_MULTIFUNDCHANNELCHANNEL_IDSCHANNEL_TYPE']._serialized_start=53224 + _globals['_MULTIFUNDCHANNELCHANNEL_IDSCHANNEL_TYPE']._serialized_end=53316 + _globals['_MULTIFUNDCHANNELFAILED']._serialized_start=53319 + _globals['_MULTIFUNDCHANNELFAILED']._serialized_end=53594 + _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_start=53480 + _globals['_MULTIFUNDCHANNELFAILED_MULTIFUNDCHANNELFAILEDMETHOD']._serialized_end=53594 + _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_start=53596 + _globals['_MULTIFUNDCHANNELFAILEDERROR']._serialized_end=53656 + _globals['_MULTIWITHDRAWREQUEST']._serialized_start=53659 + _globals['_MULTIWITHDRAWREQUEST']._serialized_end=53827 + _globals['_MULTIWITHDRAWRESPONSE']._serialized_start=53829 + _globals['_MULTIWITHDRAWRESPONSE']._serialized_end=53878 + _globals['_OFFERREQUEST']._serialized_start=53881 + _globals['_OFFERREQUEST']._serialized_end=54425 + _globals['_OFFERRESPONSE']._serialized_start=54428 + _globals['_OFFERRESPONSE']._serialized_end=54574 + _globals['_OPENCHANNEL_ABORTREQUEST']._serialized_start=54576 + _globals['_OPENCHANNEL_ABORTREQUEST']._serialized_end=54622 + _globals['_OPENCHANNEL_ABORTRESPONSE']._serialized_start=54624 + _globals['_OPENCHANNEL_ABORTRESPONSE']._serialized_end=54713 + _globals['_OPENCHANNEL_BUMPREQUEST']._serialized_start=54716 + _globals['_OPENCHANNEL_BUMPREQUEST']._serialized_end=54875 + _globals['_OPENCHANNEL_BUMPRESPONSE']._serialized_start=54878 + _globals['_OPENCHANNEL_BUMPRESPONSE']._serialized_end=55140 + _globals['_OPENCHANNEL_BUMPCHANNEL_TYPE']._serialized_start=55142 + _globals['_OPENCHANNEL_BUMPCHANNEL_TYPE']._serialized_end=55223 + _globals['_OPENCHANNEL_INITREQUEST']._serialized_start=55226 + _globals['_OPENCHANNEL_INITREQUEST']._serialized_end=55642 + _globals['_OPENCHANNEL_INITRESPONSE']._serialized_start=55645 + _globals['_OPENCHANNEL_INITRESPONSE']._serialized_end=55907 + _globals['_OPENCHANNEL_INITCHANNEL_TYPE']._serialized_start=55909 + _globals['_OPENCHANNEL_INITCHANNEL_TYPE']._serialized_end=55990 + _globals['_OPENCHANNEL_SIGNEDREQUEST']._serialized_start=55992 + _globals['_OPENCHANNEL_SIGNEDREQUEST']._serialized_end=56060 + _globals['_OPENCHANNEL_SIGNEDRESPONSE']._serialized_start=56062 + _globals['_OPENCHANNEL_SIGNEDRESPONSE']._serialized_end=56136 + _globals['_OPENCHANNEL_UPDATEREQUEST']._serialized_start=56138 + _globals['_OPENCHANNEL_UPDATEREQUEST']._serialized_end=56199 + _globals['_OPENCHANNEL_UPDATERESPONSE']._serialized_start=56202 + _globals['_OPENCHANNEL_UPDATERESPONSE']._serialized_end=56504 + _globals['_OPENCHANNEL_UPDATECHANNEL_TYPE']._serialized_start=56506 + _globals['_OPENCHANNEL_UPDATECHANNEL_TYPE']._serialized_end=56589 + _globals['_PINGREQUEST']._serialized_start=56591 + _globals['_PINGREQUEST']._serialized_end=56680 + _globals['_PINGRESPONSE']._serialized_start=56682 + _globals['_PINGRESPONSE']._serialized_end=56712 + _globals['_PLUGINREQUEST']._serialized_start=56715 + _globals['_PLUGINREQUEST']._serialized_end=56860 + _globals['_PLUGINRESPONSE']._serialized_start=56862 + _globals['_PLUGINRESPONSE']._serialized_end=56987 + _globals['_PLUGINPLUGINS']._serialized_start=56989 + _globals['_PLUGINPLUGINS']._serialized_end=57051 + _globals['_RENEPAYSTATUSREQUEST']._serialized_start=57053 + _globals['_RENEPAYSTATUSREQUEST']._serialized_end=57113 + _globals['_RENEPAYSTATUSRESPONSE']._serialized_start=57115 + _globals['_RENEPAYSTATUSRESPONSE']._serialized_end=57186 + _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_start=57189 + _globals['_RENEPAYSTATUSPAYSTATUS']._serialized_end=57671 + _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_start=57534 + _globals['_RENEPAYSTATUSPAYSTATUS_RENEPAYSTATUSPAYSTATUSSTATUS']._serialized_end=57603 + _globals['_RENEPAYREQUEST']._serialized_start=57674 + _globals['_RENEPAYREQUEST']._serialized_end=58003 + _globals['_RENEPAYRESPONSE']._serialized_start=58006 + _globals['_RENEPAYRESPONSE']._serialized_end=58329 + _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_start=58259 + _globals['_RENEPAYRESPONSE_RENEPAYSTATUS']._serialized_end=58313 + _globals['_RESERVEINPUTSREQUEST']._serialized_start=58331 + _globals['_RESERVEINPUTSREQUEST']._serialized_end=58439 + _globals['_RESERVEINPUTSRESPONSE']._serialized_start=58441 + _globals['_RESERVEINPUTSRESPONSE']._serialized_end=58518 + _globals['_RESERVEINPUTSRESERVATIONS']._serialized_start=58520 + _globals['_RESERVEINPUTSRESERVATIONS']._serialized_end=58642 + _globals['_SENDCUSTOMMSGREQUEST']._serialized_start=58644 + _globals['_SENDCUSTOMMSGREQUEST']._serialized_end=58696 + _globals['_SENDCUSTOMMSGRESPONSE']._serialized_start=58698 + _globals['_SENDCUSTOMMSGRESPONSE']._serialized_end=58737 + _globals['_SENDINVOICEREQUEST']._serialized_start=58740 + _globals['_SENDINVOICEREQUEST']._serialized_end=58916 + _globals['_SENDINVOICERESPONSE']._serialized_start=58919 + _globals['_SENDINVOICERESPONSE']._serialized_end=59510 + _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_start=59321 + _globals['_SENDINVOICERESPONSE_SENDINVOICESTATUS']._serialized_end=59375 + _globals['_SETCHANNELREQUEST']._serialized_start=59513 + _globals['_SETCHANNELREQUEST']._serialized_end=59811 + _globals['_SETCHANNELRESPONSE']._serialized_start=59813 + _globals['_SETCHANNELRESPONSE']._serialized_end=59876 + _globals['_SETCHANNELCHANNELS']._serialized_start=59879 + _globals['_SETCHANNELCHANNELS']._serialized_end=60337 + _globals['_SETCONFIGREQUEST']._serialized_start=60339 + _globals['_SETCONFIGREQUEST']._serialized_end=60399 + _globals['_SETCONFIGRESPONSE']._serialized_start=60401 + _globals['_SETCONFIGRESPONSE']._serialized_end=60458 + _globals['_SETCONFIGCONFIG']._serialized_start=60461 + _globals['_SETCONFIGCONFIG']._serialized_end=60754 + _globals['_SETPSBTVERSIONREQUEST']._serialized_start=60756 + _globals['_SETPSBTVERSIONREQUEST']._serialized_end=60810 + _globals['_SETPSBTVERSIONRESPONSE']._serialized_start=60812 + _globals['_SETPSBTVERSIONRESPONSE']._serialized_end=60850 + _globals['_SIGNINVOICEREQUEST']._serialized_start=60852 + _globals['_SIGNINVOICEREQUEST']._serialized_end=60891 + _globals['_SIGNINVOICERESPONSE']._serialized_start=60893 + _globals['_SIGNINVOICERESPONSE']._serialized_end=60930 + _globals['_SIGNMESSAGEREQUEST']._serialized_start=60932 + _globals['_SIGNMESSAGEREQUEST']._serialized_end=60969 + _globals['_SIGNMESSAGERESPONSE']._serialized_start=60971 + _globals['_SIGNMESSAGERESPONSE']._serialized_end=61041 + _globals['_SPLICE_INITREQUEST']._serialized_start=61044 + _globals['_SPLICE_INITREQUEST']._serialized_end=61245 + _globals['_SPLICE_INITRESPONSE']._serialized_start=61247 + _globals['_SPLICE_INITRESPONSE']._serialized_end=61282 + _globals['_SPLICE_SIGNEDREQUEST']._serialized_start=61284 + _globals['_SPLICE_SIGNEDREQUEST']._serialized_end=61380 + _globals['_SPLICE_SIGNEDRESPONSE']._serialized_start=61382 + _globals['_SPLICE_SIGNEDRESPONSE']._serialized_end=61463 + _globals['_SPLICE_UPDATEREQUEST']._serialized_start=61465 + _globals['_SPLICE_UPDATEREQUEST']._serialized_end=61521 + _globals['_SPLICE_UPDATERESPONSE']._serialized_start=61523 + _globals['_SPLICE_UPDATERESPONSE']._serialized_end=61589 + _globals['_UNRESERVEINPUTSREQUEST']._serialized_start=61591 + _globals['_UNRESERVEINPUTSREQUEST']._serialized_end=61663 + _globals['_UNRESERVEINPUTSRESPONSE']._serialized_start=61665 + _globals['_UNRESERVEINPUTSRESPONSE']._serialized_end=61746 + _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_start=61749 + _globals['_UNRESERVEINPUTSRESERVATIONS']._serialized_end=61900 + _globals['_UPGRADEWALLETREQUEST']._serialized_start=61902 + _globals['_UPGRADEWALLETREQUEST']._serialized_end=62012 + _globals['_UPGRADEWALLETRESPONSE']._serialized_start=62015 + _globals['_UPGRADEWALLETRESPONSE']._serialized_end=62164 + _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_start=62166 + _globals['_WAITBLOCKHEIGHTREQUEST']._serialized_end=62245 + _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_start=62247 + _globals['_WAITBLOCKHEIGHTRESPONSE']._serialized_end=62293 + _globals['_WAITREQUEST']._serialized_start=62296 + _globals['_WAITREQUEST']._serialized_end=62545 + _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_start=62432 + _globals['_WAITREQUEST_WAITSUBSYSTEM']._serialized_end=62489 + _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_start=62491 + _globals['_WAITREQUEST_WAITINDEXNAME']._serialized_end=62545 + _globals['_WAITRESPONSE']._serialized_start=62548 + _globals['_WAITRESPONSE']._serialized_end=62827 + _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_start=62432 + _globals['_WAITRESPONSE_WAITSUBSYSTEM']._serialized_end=62489 + _globals['_WAITDETAILS']._serialized_start=62830 + _globals['_WAITDETAILS']._serialized_end=63466 + _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_start=63172 + _globals['_WAITDETAILS_WAITDETAILSSTATUS']._serialized_end=63309 + _globals['_LISTCONFIGSREQUEST']._serialized_start=63468 + _globals['_LISTCONFIGSREQUEST']._serialized_end=63520 + _globals['_LISTCONFIGSRESPONSE']._serialized_start=63523 + _globals['_LISTCONFIGSRESPONSE']._serialized_end=67074 + _globals['_LISTCONFIGSCONFIGS']._serialized_start=67077 + _globals['_LISTCONFIGSCONFIGS']._serialized_end=73060 + _globals['_LISTCONFIGSCONFIGSCONF']._serialized_start=73063 + _globals['_LISTCONFIGSCONFIGSCONF']._serialized_end=73225 + _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_start=73182 + _globals['_LISTCONFIGSCONFIGSCONF_LISTCONFIGSCONFIGSCONFSOURCE']._serialized_end=73225 + _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_start=73227 + _globals['_LISTCONFIGSCONFIGSDEVELOPER']._serialized_end=73285 + _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_start=73287 + _globals['_LISTCONFIGSCONFIGSCLEARPLUGINS']._serialized_end=73348 + _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_start=73350 + _globals['_LISTCONFIGSCONFIGSDISABLEMPP']._serialized_end=73441 + _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_start=73443 + _globals['_LISTCONFIGSCONFIGSMAINNET']._serialized_end=73499 + _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_start=73501 + _globals['_LISTCONFIGSCONFIGSREGTEST']._serialized_end=73557 + _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_start=73559 + _globals['_LISTCONFIGSCONFIGSSIGNET']._serialized_end=73614 + _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_start=73616 + _globals['_LISTCONFIGSCONFIGSTESTNET']._serialized_end=73672 + _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_start=73674 + _globals['_LISTCONFIGSCONFIGSIMPORTANTPLUGIN']._serialized_end=73746 + _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_start=73748 + _globals['_LISTCONFIGSCONFIGSPLUGIN']._serialized_end=73811 + _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_start=73813 + _globals['_LISTCONFIGSCONFIGSPLUGINDIR']._serialized_end=73879 + _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_start=73881 + _globals['_LISTCONFIGSCONFIGSLIGHTNINGDIR']._serialized_end=73948 + _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_start=73950 + _globals['_LISTCONFIGSCONFIGSNETWORK']._serialized_end=74012 + _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_start=74014 + _globals['_LISTCONFIGSCONFIGSALLOWDEPRECATEDAPIS']._serialized_end=74089 + _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_start=74091 + _globals['_LISTCONFIGSCONFIGSRPCFILE']._serialized_end=74153 + _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_start=74155 + _globals['_LISTCONFIGSCONFIGSDISABLEPLUGIN']._serialized_end=74225 + _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_start=74227 + _globals['_LISTCONFIGSCONFIGSALWAYSUSEPROXY']._serialized_end=74297 + _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_start=74299 + _globals['_LISTCONFIGSCONFIGSDAEMON']._serialized_end=74354 + _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_start=74356 + _globals['_LISTCONFIGSCONFIGSWALLET']._serialized_end=74417 + _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_start=74419 + _globals['_LISTCONFIGSCONFIGSLARGECHANNELS']._serialized_end=74481 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_start=74483 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALDUALFUND']._serialized_end=74552 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_start=74554 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSPLICING']._serialized_end=74623 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_start=74625 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALONIONMESSAGES']._serialized_end=74699 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_start=74701 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALOFFERS']._serialized_end=74768 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_start=74770 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALSHUTDOWNWRONGFUNDING']._serialized_end=74851 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_start=74853 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALPEERSTORAGE']._serialized_end=74925 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_start=74927 + _globals['_LISTCONFIGSCONFIGSEXPERIMENTALANCHORS']._serialized_end=74995 + _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_start=74997 + _globals['_LISTCONFIGSCONFIGSDATABASEUPGRADE']._serialized_end=75068 + _globals['_LISTCONFIGSCONFIGSRGB']._serialized_start=75070 + _globals['_LISTCONFIGSCONFIGSRGB']._serialized_end=75128 + _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_start=75130 + _globals['_LISTCONFIGSCONFIGSALIAS']._serialized_end=75190 + _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_start=75192 + _globals['_LISTCONFIGSCONFIGSPIDFILE']._serialized_end=75254 + _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_start=75256 + _globals['_LISTCONFIGSCONFIGSIGNOREFEELIMITS']._serialized_end=75327 + _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_start=75329 + _globals['_LISTCONFIGSCONFIGSWATCHTIMEBLOCKS']._serialized_end=75399 + _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_start=75401 + _globals['_LISTCONFIGSCONFIGSMAXLOCKTIMEBLOCKS']._serialized_end=75473 + _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_start=75475 + _globals['_LISTCONFIGSCONFIGSFUNDINGCONFIRMS']._serialized_end=75545 + _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_start=75547 + _globals['_LISTCONFIGSCONFIGSCLTVDELTA']._serialized_end=75611 + _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_start=75613 + _globals['_LISTCONFIGSCONFIGSCLTVFINAL']._serialized_end=75677 + _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_start=75679 + _globals['_LISTCONFIGSCONFIGSCOMMITTIME']._serialized_end=75744 + _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_start=75746 + _globals['_LISTCONFIGSCONFIGSFEEBASE']._serialized_end=75808 + _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_start=75810 + _globals['_LISTCONFIGSCONFIGSRESCAN']._serialized_end=75871 + _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_start=75873 + _globals['_LISTCONFIGSCONFIGSFEEPERSATOSHI']._serialized_end=75941 + _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_start=75943 + _globals['_LISTCONFIGSCONFIGSMAXCONCURRENTHTLCS']._serialized_end=76016 + _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_start=76018 + _globals['_LISTCONFIGSCONFIGSHTLCMINIMUMMSAT']._serialized_end=76102 + _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_start=76104 + _globals['_LISTCONFIGSCONFIGSHTLCMAXIMUMMSAT']._serialized_end=76188 + _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_start=76190 + _globals['_LISTCONFIGSCONFIGSMAXDUSTHTLCEXPOSUREMSAT']._serialized_end=76282 + _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_start=76284 + _globals['_LISTCONFIGSCONFIGSMINCAPACITYSAT']._serialized_end=76387 + _globals['_LISTCONFIGSCONFIGSADDR']._serialized_start=76389 + _globals['_LISTCONFIGSCONFIGSADDR']._serialized_end=76450 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_start=76452 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDR']._serialized_end=76521 + _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_start=76523 + _globals['_LISTCONFIGSCONFIGSBINDADDR']._serialized_end=76588 + _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_start=76590 + _globals['_LISTCONFIGSCONFIGSOFFLINE']._serialized_end=76646 + _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_start=76648 + _globals['_LISTCONFIGSCONFIGSAUTOLISTEN']._serialized_end=76714 + _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_start=76716 + _globals['_LISTCONFIGSCONFIGSPROXY']._serialized_end=76776 + _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_start=76778 + _globals['_LISTCONFIGSCONFIGSDISABLEDNS']._serialized_end=76837 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_start=76840 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED']._serialized_end=77098 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUE_STR']._serialized_start=77016 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVERED_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDVALUE_STR']._serialized_end=77098 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_start=77100 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDISCOVEREDPORT']._serialized_end=77181 + _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_start=77183 + _globals['_LISTCONFIGSCONFIGSENCRYPTEDHSM']._serialized_end=77244 + _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_start=77246 + _globals['_LISTCONFIGSCONFIGSRPCFILEMODE']._serialized_end=77312 + _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_start=77314 + _globals['_LISTCONFIGSCONFIGSLOGLEVEL']._serialized_end=77377 + _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_start=77379 + _globals['_LISTCONFIGSCONFIGSLOGPREFIX']._serialized_end=77443 + _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_start=77445 + _globals['_LISTCONFIGSCONFIGSLOGFILE']._serialized_end=77509 + _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_start=77511 + _globals['_LISTCONFIGSCONFIGSLOGTIMESTAMPS']._serialized_end=77580 + _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_start=77582 + _globals['_LISTCONFIGSCONFIGSFORCEFEERATES']._serialized_end=77650 + _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_start=77652 + _globals['_LISTCONFIGSCONFIGSSUBDAEMON']._serialized_end=77718 + _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_start=77720 + _globals['_LISTCONFIGSCONFIGSFETCHINVOICENOCONNECT']._serialized_end=77822 + _globals['_LISTCONFIGSCONFIGSACCEPTHTLCTLVTYPES']._serialized_start=77824 + _globals['_LISTCONFIGSCONFIGSACCEPTHTLCTLVTYPES']._serialized_end=77897 + _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_start=77899 + _globals['_LISTCONFIGSCONFIGSTORSERVICEPASSWORD']._serialized_end=77972 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_start=77974 + _globals['_LISTCONFIGSCONFIGSANNOUNCEADDRDNS']._serialized_end=78045 + _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_start=78047 + _globals['_LISTCONFIGSCONFIGSREQUIRECONFIRMEDINPUTS']._serialized_end=78125 + _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_start=78127 + _globals['_LISTCONFIGSCONFIGSCOMMITFEE']._serialized_end=78191 + _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_start=78193 + _globals['_LISTCONFIGSCONFIGSCOMMITFEERATEOFFSET']._serialized_end=78267 + _globals['_LISTCONFIGSPLUGINS']._serialized_start=78269 + _globals['_LISTCONFIGSPLUGINS']._serialized_end=78383 + _globals['_LISTCONFIGSPLUGINSOPTIONS']._serialized_start=78385 + _globals['_LISTCONFIGSPLUGINSOPTIONS']._serialized_end=78412 + _globals['_LISTCONFIGSIMPORTANTPLUGINS']._serialized_start=78415 + _globals['_LISTCONFIGSIMPORTANTPLUGINS']._serialized_end=78547 + _globals['_LISTCONFIGSIMPORTANTPLUGINSOPTIONS']._serialized_start=78549 + _globals['_LISTCONFIGSIMPORTANTPLUGINSOPTIONS']._serialized_end=78585 + _globals['_STOPREQUEST']._serialized_start=78587 + _globals['_STOPREQUEST']._serialized_end=78600 + _globals['_STOPRESPONSE']._serialized_start=78602 + _globals['_STOPRESPONSE']._serialized_end=78715 + _globals['_STOPRESPONSE_STOPRESULT']._serialized_start=78669 + _globals['_STOPRESPONSE_STOPRESULT']._serialized_end=78704 + _globals['_HELPREQUEST']._serialized_start=78717 + _globals['_HELPREQUEST']._serialized_end=78764 + _globals['_HELPRESPONSE']._serialized_start=78767 + _globals['_HELPRESPONSE']._serialized_end=78916 + _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_start=78872 + _globals['_HELPRESPONSE_HELPFORMATHINT']._serialized_end=78900 + _globals['_HELPHELP']._serialized_start=78918 + _globals['_HELPHELP']._serialized_end=78945 + _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_start=78947 + _globals['_PREAPPROVEKEYSENDREQUEST']._serialized_end=79050 + _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_start=79052 + _globals['_PREAPPROVEKEYSENDRESPONSE']._serialized_end=79079 + _globals['_PREAPPROVEINVOICEREQUEST']._serialized_start=79081 + _globals['_PREAPPROVEINVOICEREQUEST']._serialized_end=79123 + _globals['_PREAPPROVEINVOICERESPONSE']._serialized_start=79125 + _globals['_PREAPPROVEINVOICERESPONSE']._serialized_end=79152 + _globals['_STATICBACKUPREQUEST']._serialized_start=79154 + _globals['_STATICBACKUPREQUEST']._serialized_end=79175 + _globals['_STATICBACKUPRESPONSE']._serialized_start=79177 + _globals['_STATICBACKUPRESPONSE']._serialized_end=79212 + _globals['_BKPRCHANNELSAPYREQUEST']._serialized_start=79214 + _globals['_BKPRCHANNELSAPYREQUEST']._serialized_end=79314 + _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_start=79316 + _globals['_BKPRCHANNELSAPYRESPONSE']._serialized_end=79397 + _globals['_BKPRCHANNELSAPYCHANNELS_APY']._serialized_start=79400 + _globals['_BKPRCHANNELSAPYCHANNELS_APY']._serialized_end=80290 + _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_start=80293 + _globals['_BKPRDUMPINCOMECSVREQUEST']._serialized_end=80503 + _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_start=80506 + _globals['_BKPRDUMPINCOMECSVRESPONSE']._serialized_end=80720 + _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSV_FORMAT']._serialized_start=80633 + _globals['_BKPRDUMPINCOMECSVRESPONSE_BKPRDUMPINCOMECSVCSV_FORMAT']._serialized_end=80720 + _globals['_BKPRINSPECTREQUEST']._serialized_start=80722 + _globals['_BKPRINSPECTREQUEST']._serialized_end=80759 + _globals['_BKPRINSPECTRESPONSE']._serialized_start=80761 + _globals['_BKPRINSPECTRESPONSE']._serialized_end=80816 + _globals['_BKPRINSPECTTXS']._serialized_start=80819 + _globals['_BKPRINSPECTTXS']._serialized_end=80973 + _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_start=80976 + _globals['_BKPRINSPECTTXSOUTPUTS']._serialized_end=81420 + _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_start=81422 + _globals['_BKPRLISTACCOUNTEVENTSREQUEST']._serialized_end=81486 + _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_start=81488 + _globals['_BKPRLISTACCOUNTEVENTSRESPONSE']._serialized_end=81569 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_start=81572 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS']._serialized_end=82245 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_start=82048 + _globals['_BKPRLISTACCOUNTEVENTSEVENTS_BKPRLISTACCOUNTEVENTSEVENTSTYPE']._serialized_end=82122 + _globals['_BKPRLISTBALANCESREQUEST']._serialized_start=82247 + _globals['_BKPRLISTBALANCESREQUEST']._serialized_end=82272 + _globals['_BKPRLISTBALANCESRESPONSE']._serialized_start=82274 + _globals['_BKPRLISTBALANCESRESPONSE']._serialized_end=82349 + _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_start=82352 + _globals['_BKPRLISTBALANCESACCOUNTS']._serialized_end=82678 + _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_start=82680 + _globals['_BKPRLISTBALANCESACCOUNTSBALANCES']._serialized_end=82768 + _globals['_BKPRLISTINCOMEREQUEST']._serialized_start=82771 + _globals['_BKPRLISTINCOMEREQUEST']._serialized_end=82922 + _globals['_BKPRLISTINCOMERESPONSE']._serialized_start=82924 + _globals['_BKPRLISTINCOMERESPONSE']._serialized_end=83005 + _globals['_BKPRLISTINCOMEINCOME_EVENTS']._serialized_start=83008 + _globals['_BKPRLISTINCOMEINCOME_EVENTS']._serialized_end=83317 + _globals['_BLACKLISTRUNEREQUEST']._serialized_start=83319 + _globals['_BLACKLISTRUNEREQUEST']._serialized_end=83397 + _globals['_BLACKLISTRUNERESPONSE']._serialized_start=83399 + _globals['_BLACKLISTRUNERESPONSE']._serialized_end=83470 + _globals['_BLACKLISTRUNEBLACKLIST']._serialized_start=83472 + _globals['_BLACKLISTRUNEBLACKLIST']._serialized_end=83524 + _globals['_CHECKRUNEREQUEST']._serialized_start=83526 + _globals['_CHECKRUNEREQUEST']._serialized_end=83638 + _globals['_CHECKRUNERESPONSE']._serialized_start=83640 + _globals['_CHECKRUNERESPONSE']._serialized_end=83674 + _globals['_CREATERUNEREQUEST']._serialized_start=83676 + _globals['_CREATERUNEREQUEST']._serialized_end=83745 + _globals['_CREATERUNERESPONSE']._serialized_start=83747 + _globals['_CREATERUNERESPONSE']._serialized_end=83870 + _globals['_SHOWRUNESREQUEST']._serialized_start=83872 + _globals['_SHOWRUNESREQUEST']._serialized_end=83918 + _globals['_SHOWRUNESRESPONSE']._serialized_start=83920 + _globals['_SHOWRUNESRESPONSE']._serialized_end=83975 + _globals['_SHOWRUNESRUNES']._serialized_start=83978 + _globals['_SHOWRUNESRUNES']._serialized_end=84263 + _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_start=84265 + _globals['_SHOWRUNESRUNESRESTRICTIONS']._serialized_end=84377 + _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_start=84379 + _globals['_SHOWRUNESRUNESRESTRICTIONSALTERNATIVES']._serialized_end=84489 + _globals['_STREAMBLOCKADDEDREQUEST']._serialized_start=84491 + _globals['_STREAMBLOCKADDEDREQUEST']._serialized_end=84516 + _globals['_BLOCKADDEDNOTIFICATION']._serialized_start=84518 + _globals['_BLOCKADDEDNOTIFICATION']._serialized_end=84572 + _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_start=84574 + _globals['_STREAMCHANNELOPENFAILEDREQUEST']._serialized_end=84606 + _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_start=84608 + _globals['_CHANNELOPENFAILEDNOTIFICATION']._serialized_end=84659 + _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_start=84661 + _globals['_STREAMCHANNELOPENEDREQUEST']._serialized_end=84689 + _globals['_CHANNELOPENEDNOTIFICATION']._serialized_start=84691 + _globals['_CHANNELOPENEDNOTIFICATION']._serialized_end=84810 + _globals['_STREAMCONNECTREQUEST']._serialized_start=84812 + _globals['_STREAMCONNECTREQUEST']._serialized_end=84834 + _globals['_PEERCONNECTNOTIFICATION']._serialized_start=84837 + _globals['_PEERCONNECTNOTIFICATION']._serialized_end=85027 + _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_start=84988 + _globals['_PEERCONNECTNOTIFICATION_PEERCONNECTDIRECTION']._serialized_end=85027 + _globals['_PEERCONNECTADDRESS']._serialized_start=85030 + _globals['_PEERCONNECTADDRESS']._serialized_end=85297 + _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_start=85181 + _globals['_PEERCONNECTADDRESS_PEERCONNECTADDRESSTYPE']._serialized_end=85265 + _globals['_STREAMCUSTOMMSGREQUEST']._serialized_start=85299 + _globals['_STREAMCUSTOMMSGREQUEST']._serialized_end=85323 + _globals['_CUSTOMMSGNOTIFICATION']._serialized_start=85325 + _globals['_CUSTOMMSGNOTIFICATION']._serialized_end=85382 + _globals['_NODE']._serialized_start=85385 + _globals['_NODE']._serialized_end=93524 # @@protoc_insertion_point(module_scope) diff --git a/contrib/pyln-proto/pyproject.toml b/contrib/pyln-proto/pyproject.toml index 977ca866899e..07ae8b6bab7c 100644 --- a/contrib/pyln-proto/pyproject.toml +++ b/contrib/pyln-proto/pyproject.toml @@ -15,7 +15,7 @@ python = "^3.8" base58 = "^2.1.1" bitstring = "^4.1.0" coincurve = "^20" -cryptography = "^41" +cryptography = "^42" PySocks = "^1" [tool.poetry.dev-dependencies] diff --git a/contrib/pyln-testing/pyln/testing/grpc2py.py b/contrib/pyln-testing/pyln/testing/grpc2py.py index bcbe5632a5f2..751abd053c67 100644 --- a/contrib/pyln-testing/pyln/testing/grpc2py.py +++ b/contrib/pyln-testing/pyln/testing/grpc2py.py @@ -1165,6 +1165,23 @@ def decode_invoice_paths2py(m): }) +def decode_invreq_paths_path2py(m): + return remove_default({ + "blinded_node_id": hexlify(m.blinded_node_id), # PrimitiveField in generate_composite + "encrypted_recipient_data": hexlify(m.encrypted_recipient_data), # PrimitiveField in generate_composite + }) + + +def decode_invreq_paths2py(m): + return remove_default({ + "path": [decode_invreq_paths_path2py(i) for i in m.path], # ArrayField[composite] in generate_composite + "blinding": hexlify(m.blinding), # PrimitiveField in generate_composite + "first_node_id": hexlify(m.first_node_id), # PrimitiveField in generate_composite + "first_scid": m.first_scid, # PrimitiveField in generate_composite + "first_scid_dir": m.first_scid_dir, # PrimitiveField in generate_composite + }) + + def decode_offer_paths_path2py(m): return remove_default({ "blinded_node_id": hexlify(m.blinded_node_id), # PrimitiveField in generate_composite @@ -1238,6 +1255,7 @@ def decode2py(m): "fallbacks": [decode_fallbacks2py(i) for i in m.fallbacks], # ArrayField[composite] in generate_composite "invoice_fallbacks": [decode_invoice_fallbacks2py(i) for i in m.invoice_fallbacks], # ArrayField[composite] in generate_composite "invoice_paths": [decode_invoice_paths2py(i) for i in m.invoice_paths], # ArrayField[composite] in generate_composite + "invreq_paths": [decode_invreq_paths2py(i) for i in m.invreq_paths], # ArrayField[composite] in generate_composite "offer_chains": [hexlify(m.offer_chains) for i in hexlify(m.offer_chains)], # ArrayField[primitive] in generate_composite "offer_paths": [decode_offer_paths2py(i) for i in m.offer_paths], # ArrayField[composite] in generate_composite "restrictions": [decode_restrictions2py(i) for i in m.restrictions], # ArrayField[composite] in generate_composite @@ -1280,6 +1298,7 @@ def decode2py(m): "offer_features": hexlify(m.offer_features), # PrimitiveField in generate_composite "offer_id": hexlify(m.offer_id), # PrimitiveField in generate_composite "offer_issuer": m.offer_issuer, # PrimitiveField in generate_composite + "offer_issuer_id": hexlify(m.offer_issuer_id), # PrimitiveField in generate_composite "offer_metadata": hexlify(m.offer_metadata), # PrimitiveField in generate_composite "offer_node_id": hexlify(m.offer_node_id), # PrimitiveField in generate_composite "offer_quantity_max": m.offer_quantity_max, # PrimitiveField in generate_composite @@ -1293,6 +1312,7 @@ def decode2py(m): "unique_id": m.unique_id, # PrimitiveField in generate_composite "valid": m.valid, # PrimitiveField in generate_composite "version": m.version, # PrimitiveField in generate_composite + "warning_empty_blinded_path": m.warning_empty_blinded_path, # PrimitiveField in generate_composite "warning_invalid_invoice_request_signature": m.warning_invalid_invoice_request_signature, # PrimitiveField in generate_composite "warning_invalid_invoice_signature": m.warning_invalid_invoice_signature, # PrimitiveField in generate_composite "warning_invalid_invreq_payer_note": m.warning_invalid_invreq_payer_note, # PrimitiveField in generate_composite @@ -1311,6 +1331,7 @@ def decode2py(m): "warning_missing_invreq_metadata": m.warning_missing_invreq_metadata, # PrimitiveField in generate_composite "warning_missing_invreq_payer_id": m.warning_missing_invreq_payer_id, # PrimitiveField in generate_composite "warning_missing_offer_description": m.warning_missing_offer_description, # PrimitiveField in generate_composite + "warning_missing_offer_issuer_id": m.warning_missing_offer_issuer_id, # PrimitiveField in generate_composite "warning_missing_offer_node_id": m.warning_missing_offer_node_id, # PrimitiveField in generate_composite "warning_rune_invalid_utf8": m.warning_rune_invalid_utf8, # PrimitiveField in generate_composite "warning_unknown_offer_currency": m.warning_unknown_offer_currency, # PrimitiveField in generate_composite @@ -2617,10 +2638,7 @@ def stop2py(m): def help_help2py(m): return remove_default({ - "category": m.category, # PrimitiveField in generate_composite "command": m.command, # PrimitiveField in generate_composite - "description": m.description, # PrimitiveField in generate_composite - "verbose": m.verbose, # PrimitiveField in generate_composite }) diff --git a/contrib/pyln-testing/pyln/testing/utils.py b/contrib/pyln-testing/pyln/testing/utils.py index e32038eb0289..79e4df0be7a9 100644 --- a/contrib/pyln-testing/pyln/testing/utils.py +++ b/contrib/pyln-testing/pyln/testing/utils.py @@ -416,6 +416,7 @@ def __init__(self, bitcoin_dir="/tmp/bitcoind-test", rpcport=None): '-debug=mempoolrej', '-debug=rpc', '-debug=validation', + '-rpcthreads=20', ] # For up to and including 0.16.1, this needs to be in main section. BITCOIND_CONFIG['rpcport'] = rpcport diff --git a/devtools/Makefile b/devtools/Makefile index 3632b5476f43..d7f86f9d78a4 100644 --- a/devtools/Makefile +++ b/devtools/Makefile @@ -1,4 +1,4 @@ -DEVTOOLS := devtools/bolt11-cli devtools/decodemsg devtools/onion devtools/dump-gossipstore devtools/gossipwith devtools/create-gossipstore devtools/mkcommit devtools/mkfunding devtools/mkclose devtools/mkgossip devtools/mkencoded devtools/mkquery devtools/lightning-checkmessage devtools/topology devtools/route devtools/bolt12-cli devtools/encodeaddr devtools/features devtools/fp16 devtools/rune +DEVTOOLS := devtools/bolt11-cli devtools/decodemsg devtools/onion devtools/dump-gossipstore devtools/gossipwith devtools/create-gossipstore devtools/mkcommit devtools/mkfunding devtools/mkclose devtools/mkgossip devtools/mkencoded devtools/mkquery devtools/lightning-checkmessage devtools/topology devtools/route devtools/bolt12-cli devtools/encodeaddr devtools/features devtools/fp16 devtools/rune devtools/gossmap-compress ifeq ($(HAVE_SQLITE3),1) DEVTOOLS += devtools/checkchannels endif @@ -11,6 +11,11 @@ ALL_C_SOURCES += $(DEVTOOLS_TOOL_SRC) ALL_C_HEADERS += ALL_PROGRAMS += $(DEVTOOLS) +# gossmap-compress wants -lz if we say we have it. +ifeq ($(HAVE_ZLIB),1) +devtools/gossmap-compress_LDLIBS=-lz +endif # ZLIB + DEVTOOLS_COMMON_OBJS := \ common/amount.o \ common/autodata.o \ @@ -57,6 +62,8 @@ devtools/bolt11-cli: $(DEVTOOLS_COMMON_OBJS) $(JSMN_OBJS) $(BITCOIN_OBJS) wire/f devtools/encodeaddr: common/utils.o common/bech32.o devtools/encodeaddr.o +devtools/gossmap-compress: $(DEVTOOLS_COMMON_OBJS) $(BITCOIN_OBJS) wire/fromwire.o wire/towire.o wire/tlvstream.o common/gossmap.o common/fp16.o devtools/gossmap-compress.o gossipd/gossip_store_wiregen.o + devtools/bolt12-cli: $(DEVTOOLS_COMMON_OBJS) $(BITCOIN_OBJS) wire/bolt12_wiregen.o wire/fromwire.o wire/towire.o common/bolt12.o common/bolt12_merkle.o devtools/bolt12-cli.o common/setup.o common/iso4217.o devtools/decodemsg: $(DEVTOOLS_COMMON_OBJS) $(JSMN_OBJS) $(BITCOIN_OBJS) $(WIRE_PRINT_OBJS) wire/fromwire.o wire/towire.o devtools/print_wire.o devtools/decodemsg.o diff --git a/devtools/bolt12-cli.c b/devtools/bolt12-cli.c index 837109946521..7b4dae1968c2 100644 --- a/devtools/bolt12-cli.c +++ b/devtools/bolt12-cli.c @@ -104,9 +104,12 @@ static bool print_offer_amount(const struct bitcoin_blkid *chains, * - MUST specify `offer_currency` `iso4217` as an ISO 4712 three-letter code. * - MUST specify `offer_amount` in the currency unit adjusted by the ISO 4712 * exponent (e.g. USD cents). + * - MUST set `offer_description` to a complete description of the purpose + * of the payment. * - otherwise: * - MUST NOT set `offer_amount` * - MUST NOT set `offer_currency` + * - MAY set `offer_description` */ if (!iso4217) { if (tal_count(chains) == 0) @@ -399,7 +402,7 @@ static bool print_extra_fields(const struct tlv_field *fields) for (size_t i = 0; i < tal_count(fields); i++) { if (fields[i].meta) continue; - if (fields[i].numtype % 2) { + if (fields[i].numtype % 2 == 0) { printf("UNKNOWN EVEN field %"PRIu64": %s\n", fields[i].numtype, tal_hexstr(tmpctx, fields[i].value, fields[i].length)); @@ -454,9 +457,9 @@ static u64 get_offer_type(const char *name) * 1. type: 20 (`offer_quantity_max`) * 2. data: * * [`tu64`:`max`] - * 1. type: 22 (`offer_node_id`) + * 1. type: 22 (`offer_issuer_id`) * 2. data: - * * [`point`:`node_id`] + * * [`point`:`id`] */ { "offer_chains", 2 }, { "offer_metadata", 4 }, @@ -468,7 +471,7 @@ static u64 get_offer_type(const char *name) { "offer_paths", 16 }, { "offer_issuer", 18 }, { "offer_quantity_max", 20 }, - { "offer_node_id", 22 }, + { "offer_issuer_id", 22 }, /* BOLT-offers #12: * 1. `tlv_stream`: `invoice_request` * 2. types: @@ -505,9 +508,9 @@ static u64 get_offer_type(const char *name) * 1. type: 20 (`offer_quantity_max`) * 2. data: * * [`tu64`:`max`] - * 1. type: 22 (`offer_node_id`) + * 1. type: 22 (`offer_issuer_id`) * 2. data: - * * [`point`:`node_id`] + * * [`point`:`id`] * 1. type: 80 (`invreq_chain`) * 2. data: * * [`chain_hash`:`chain`] @@ -526,6 +529,9 @@ static u64 get_offer_type(const char *name) * 1. type: 89 (`invreq_payer_note`) * 2. data: * * [`...*utf8`:`note`] + * 1. type: 90 (`invreq_paths`) + * 2. data: + * * [`...*blinded_path`:`paths`] * 1. type: 240 (`signature`) * 2. data: * * [`bip340sig`:`sig`] @@ -537,6 +543,7 @@ static u64 get_offer_type(const char *name) { "invreq_quantity", 86 }, { "invreq_payer_id", 88 }, { "invreq_payer_note", 89 }, + { "invreq_paths", 90 }, { "signature", 240 }, /* BOLT-offers #12: * 1. `tlv_stream`: `invoice` @@ -574,9 +581,9 @@ static u64 get_offer_type(const char *name) * 1. type: 20 (`offer_quantity_max`) * 2. data: * * [`tu64`:`max`] - * 1. type: 22 (`offer_node_id`) + * 1. type: 22 (`offer_issuer_id`) * 2. data: - * * [`point`:`node_id`] + * * [`point`:`id`] * 1. type: 80 (`invreq_chain`) * 2. data: * * [`chain_hash`:`chain`] @@ -595,6 +602,9 @@ static u64 get_offer_type(const char *name) * 1. type: 89 (`invreq_payer_note`) * 2. data: * * [`...*utf8`:`note`] + * 1. type: 90 (`invreq_paths`) + * 2. data: + * * [`...*blinded_path`:`paths`] * 1. type: 160 (`invoice_paths`) * 2. data: * * [`...*blinded_path`:`paths`] @@ -785,8 +795,16 @@ int main(int argc, char *argv[]) well_formed &= print_offer_amount(offer->offer_chains, offer->offer_currency, *offer->offer_amount); - if (must_have(offer, offer_description)) + if (offer->offer_description) well_formed &= print_utf8("offer_description", offer->offer_description); + /* BOLT-offers #12: + * - if `offer_amount` is set and `offer_description` is not set: + * - MUST NOT respond to the offer. + */ + if (offer->offer_amount && !offer->offer_description) { + fprintf(stderr, "Missing offer_description (with offer_amount)\n"); + well_formed = false; + } if (offer->offer_features) print_features("offer_features", offer->offer_features); if (offer->offer_absolute_expiry) @@ -797,8 +815,17 @@ int main(int argc, char *argv[]) well_formed &= print_utf8("offer_issuer", offer->offer_issuer); if (offer->offer_quantity_max) print_u64("offer_quantity_max", *offer->offer_quantity_max); - if (must_have(offer, offer_node_id)) - print_node_id("offer_node_id", offer->offer_node_id); + if (offer->offer_issuer_id) + print_node_id("offer_issuer_id", offer->offer_issuer_id); + /* BOLT-offers #12: + * + * - if neither `offer_issuer_id` nor `offer_paths` are set: + * - MUST NOT respond to the offer. + */ + if (!offer->offer_issuer_id && !offer->offer_paths) { + fprintf(stderr, "Missing offer_issuer_id and offer_paths\n"); + well_formed = false; + } if (offer->offer_recurrence) well_formed &= print_recurrance(offer->offer_recurrence, offer->offer_recurrence_paywindow, @@ -814,7 +841,7 @@ int main(int argc, char *argv[]) if (!invreq) errx(ERROR_BAD_DECODE, "Bad invreq: %s", fail); - if (invreq->offer_node_id) { + if (invreq->offer_issuer_id) { invreq_offer_id(invreq, &offer_id); print_hash("offer_id", &offer_id); } @@ -836,14 +863,14 @@ int main(int argc, char *argv[]) print_features("offer_features", invreq->offer_features); if (invreq->offer_absolute_expiry) print_abstime("offer_absolute_expiry", *invreq->offer_absolute_expiry); - if (must_have(invreq, offer_paths)) + if (invreq->offer_paths) print_blindedpaths("offer_paths", invreq->offer_paths, NULL); if (invreq->offer_issuer) well_formed &= print_utf8("offer_issuer", invreq->offer_issuer); if (invreq->offer_quantity_max) print_u64("offer_quantity_max", *invreq->offer_quantity_max); - if (invreq->offer_node_id) - print_node_id("offer_node_id", invreq->offer_node_id); + if (invreq->offer_issuer_id) + print_node_id("offer_issuer_id", invreq->offer_issuer_id); if (invreq->offer_recurrence) well_formed &= print_recurrance(invreq->offer_recurrence, invreq->offer_recurrence_paywindow, @@ -867,6 +894,8 @@ int main(int argc, char *argv[]) } else { must_not_have(invreq, invreq_recurrence_start); } + if (invreq->invreq_paths) + print_blindedpaths("invreq_paths", invreq->invreq_paths, NULL); if (must_have(invreq, signature)) { well_formed = print_signature("invoice_request", "signature", @@ -885,7 +914,7 @@ int main(int argc, char *argv[]) errx(ERROR_BAD_DECODE, "Bad invoice: %s", fail); if (invoice->invreq_payer_id) { - if (invoice->offer_node_id) { + if (invoice->offer_issuer_id) { invoice_offer_id(invoice, &offer_id); print_hash("offer_id", &offer_id); } @@ -908,14 +937,14 @@ int main(int argc, char *argv[]) print_features("offer_features", invoice->offer_features); if (invoice->offer_absolute_expiry) print_abstime("offer_absolute_expiry", *invoice->offer_absolute_expiry); - if (must_have(invoice, offer_paths)) + if (invoice->offer_paths) print_blindedpaths("offer_paths", invoice->offer_paths, NULL); if (invoice->offer_issuer) well_formed &= print_utf8("offer_issuer", invoice->offer_issuer); if (invoice->offer_quantity_max) print_u64("offer_quantity_max", *invoice->offer_quantity_max); - if (invoice->offer_node_id) - print_node_id("offer_node_id", invoice->offer_node_id); + if (invoice->offer_issuer_id) + print_node_id("offer_issuer_id", invoice->offer_issuer_id); if (invoice->offer_recurrence) well_formed &= print_recurrance(invoice->offer_recurrence, invoice->offer_recurrence_paywindow, @@ -940,6 +969,8 @@ int main(int argc, char *argv[]) } else { must_not_have(invoice, invreq_recurrence_start); } + if (invoice->invreq_paths) + print_blindedpaths("invreq_paths", invoice->invreq_paths, NULL); if (must_have(invoice, invoice_paths)) print_blindedpaths("invoice_paths", invoice->invoice_paths, diff --git a/devtools/gossmap-compress.c b/devtools/gossmap-compress.c new file mode 100644 index 000000000000..29d6e1398d90 --- /dev/null +++ b/devtools/gossmap-compress.c @@ -0,0 +1,763 @@ +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if HAVE_ZLIB +#include +#else +/* Worst... zlib... ever! */ +#define gzFile int +#define gzdopen(fd, mode) (fd) +#define gzclose(outf) close(outf) +static int gzread(int fd, void *buf, size_t len) +{ + if (read_all(fd, buf, len)) + return len; + return 0; +} +static int gzwrite(int fd, const void *buf, size_t len) +{ + if (write_all(fd, buf, len)) + return len; + return 0; +} +#endif + +static unsigned int verbose = 0; + +/* All {numbers} are bigsize. + * + * :=
+ *
:= "GOSSMAP_COMPRESSv1\0" + * := {channel_count} {start_nodeidx}*{channel_count} {end_nodeidx}*{channel_count} + * This describes each attached channel, eg if there are two + * channels, node 0 to node 1 and node 0 to node 2, this would be: + * 2 0 0 1 2 + * + * := * {channel_count*2} + * := {chanidx}*2+{direction} + * Selection of disabled channels and directions, expected to only be a few. Indexes into the + * first channel_ends array. Terminated by invalid index. + * + * := {channel_count}*{capacity_idx} + * := {capacity_count} {channel_count}*{capacity} + * This is one satoshi amount per channel. + * + * := {channel_count*2}*{htlc_min_idx} + * := {htlc_min_count} {htlc_min_count}*{htlc_min} + * These templates are all of the same form. A set of values, followed by + * an index into these values for each direction of each channel, in order + * 1. 0'th channel 1st direction + * 2. 0'th channel 2nd direction + * 3. 1'st channel 1st direction + * 4. 1'st channel 2nd direction + * + * := {channel_count*2}*{htlc_max_idx} + * Note that values 0 and 1 are special: 0 == channel capacity, 1 == 0.99 * channel capacity. + * := {htlc_max_count} {htlc_max_count}*{htlc_max} + * := {channel_count*2}*{basefee_idx} + * := {basefee_count} {basefee_count}*{basefee} + * := {channel_count*2}*{propfee_idx} + * := {propfee_count} {propfee_count}*{propfee} + * := {channel_count*2}*{delay_idx} + * := {delay_count} {delay_count}*{delay} + */ + +#define GC_HEADER "GOSSMAP_COMPRESSv1" +#define GC_HEADERLEN (sizeof(GC_HEADER)) +#define GOSSIP_STORE_VER ((0 << 5) | 14) + +static int cmp_node_num_chans(struct gossmap_node *const *a, + struct gossmap_node *const *b, + void *unused) +{ + return (int)(*a)->num_chans - (int)(*b)->num_chans; +} + +static void write_bigsize(gzFile outf, u64 val) +{ + u8 buf[BIGSIZE_MAX_LEN]; + size_t len; + + len = bigsize_put(buf, val); + if (gzwrite(outf, buf, len) == 0) + err(1, "Writing bigsize"); +} + +static u64 read_bigsize(gzFile inf) +{ + u64 val; + u8 buf[BIGSIZE_MAX_LEN]; + + if (gzread(inf, buf, 1) != 1) + errx(1, "Reading bigsize"); + + switch (buf[0]) { + case 0xfd: + if (gzread(inf, buf+1, 2) != 2) + errx(1, "Reading bigsize"); + break; + case 0xfe: + if (gzread(inf, buf+1, 4) != 4) + errx(1, "Reading bigsize"); + break; + case 0xff: + if (gzread(inf, buf+1, 8) != 8) + errx(1, "Reading bigsize"); + break; + } + + if (bigsize_get(buf, sizeof(buf), &val) == 0) + errx(1, "Bad bigsize"); + return val; +} + +static int cmp_u64(const u64 *a, + const u64 *b, + void *unused) +{ + if (*a > *b) + return 1; + else if (*a < *b) + return -1; + return 0; +} + +static const u64 *deduplicate(const tal_t *ctx, const u64 *vals) +{ + u64 *sorted; + u64 *dedup; + size_t n; + + /* Sort and remove dups */ + sorted = tal_dup_talarr(tmpctx, u64, vals); + asort(sorted, tal_count(sorted), cmp_u64, NULL); + + dedup = tal_arr(ctx, u64, tal_count(sorted)); + n = 0; + dedup[n++] = sorted[0]; + for (size_t i = 1; i < tal_count(sorted); i++) { + if (sorted[i] == dedup[n-1]) + continue; + dedup[n++] = sorted[i]; + } + tal_resize(&dedup, n); + + return dedup; +} + +static size_t find_index(const u64 *template, u64 val) +{ + for (size_t i = 0; i < tal_count(template); i++) { + if (template[i] == val) + return i; + } + abort(); +} + +/* All templates are of the same form. Output all the distinct values, then + * write out which one is used by each channel */ +static void write_template_and_values(gzFile outf, const u64 *vals, const char *what) +{ + /* Sort and remove dups */ + const u64 *template = deduplicate(tmpctx, vals); + + if (verbose) + printf("%zu unique %s\n", tal_count(template), what); + + assert(tal_count(vals) >= tal_count(template)); + + /* Write template. */ + write_bigsize(outf, tal_count(template)); + for (size_t i = 0; i < tal_count(template); i++) + write_bigsize(outf, template[i]); + + /* Tie every channel into the template. O(N^2) but who + * cares? */ + for (size_t i = 0; i < tal_count(vals); i++) { + write_bigsize(outf, find_index(template, vals[i])); + } +} + +static void write_bidir_perchan(gzFile outf, + struct gossmap *gossmap, + struct gossmap_chan **chans, + u64 (*get_value)(struct gossmap *, + const struct gossmap_chan *, + int), + const char *what) +{ + u64 *vals = tal_arr(tmpctx, u64, tal_count(chans) * 2); + + for (size_t i = 0; i < tal_count(chans); i++) { + for (size_t dir = 0; dir < 2; dir++) { + if (chans[i]->half[dir].enabled) + vals[i*2+dir] = get_value(gossmap, chans[i], dir); + else + vals[i*2+dir] = 0; + } + } + + write_template_and_values(outf, vals, what); +} + +static u64 get_htlc_min(struct gossmap *gossmap, + const struct gossmap_chan *chan, + int dir) +{ + struct amount_msat msat; + gossmap_chan_get_update_details(gossmap, chan, dir, + NULL, NULL, NULL, NULL, NULL, &msat, NULL); + return msat.millisatoshis; /* Raw: compressed format */ +} + +static u64 get_htlc_max(struct gossmap *gossmap, + const struct gossmap_chan *chan, + int dir) +{ + struct amount_msat msat, capacity_msat; + struct amount_sat capacity_sats; + gossmap_chan_get_capacity(gossmap, chan, &capacity_sats); + gossmap_chan_get_update_details(gossmap, chan, dir, + NULL, NULL, NULL, NULL, NULL, NULL, &msat); + + /* Special value for the common case of "max_htlc == capacity" */ + if (amount_msat_eq_sat(msat, capacity_sats)) { + return 0; + } + /* Other common case: "max_htlc == 99% capacity" */ + if (amount_sat_to_msat(&capacity_msat, capacity_sats) + && amount_msat_scale(&capacity_msat, capacity_msat, 0.99) + && amount_msat_eq(msat, capacity_msat)) { + return 1; + } + return msat.millisatoshis; /* Raw: compressed format */ +} + +static u64 get_basefee(struct gossmap *gossmap, + const struct gossmap_chan *chan, + int dir) +{ + u32 basefee; + gossmap_chan_get_update_details(gossmap, chan, dir, + NULL, NULL, NULL, &basefee, NULL, NULL, NULL); + return basefee; +} + +static u64 get_propfee(struct gossmap *gossmap, + const struct gossmap_chan *chan, + int dir) +{ + u32 propfee; + gossmap_chan_get_update_details(gossmap, chan, dir, + NULL, NULL, NULL, NULL, &propfee, NULL, NULL); + return propfee; +} + +static u64 get_delay(struct gossmap *gossmap, + const struct gossmap_chan *chan, + int dir) +{ + return chan->half[dir].delay; +} + +static void pubkey_for_node(size_t nodeidx, struct pubkey *key, + const struct pubkey *node_ids) +{ + struct secret seckey; + + if (nodeidx < tal_count(node_ids)) { + *key = node_ids[nodeidx]; + return; + } + + memset(&seckey, 1, sizeof(seckey)); + memcpy(&seckey, &nodeidx, sizeof(nodeidx)); + if (!pubkey_from_secret(&seckey, key)) + abort(); +} + +static void write_msg_to_gstore(int outfd, const u8 *msg TAKES) +{ + struct gossip_hdr hdr; + + hdr.flags = 0; + hdr.len = cpu_to_be16(tal_bytelen(msg)); + hdr.timestamp = 0; + hdr.crc = cpu_to_be32(crc32c(0, msg, tal_bytelen(msg))); + + if (!write_all(outfd, &hdr, sizeof(hdr)) + || !write_all(outfd, msg, tal_bytelen(msg))) { + err(1, "Writing gossip_store"); + } + if (taken(msg)) + tal_free(msg); +} + +/* BOLT #7: + * 1. type: 256 (`channel_announcement`) + * 2. data: + * * [`signature`:`node_signature_1`] + * * [`signature`:`node_signature_2`] + * * [`signature`:`bitcoin_signature_1`] + * * [`signature`:`bitcoin_signature_2`] + * * [`u16`:`len`] + * * [`len*byte`:`features`] + * * [`chain_hash`:`chain_hash`] + * * [`short_channel_id`:`short_channel_id`] + * * [`point`:`node_id_1`] + * * [`point`:`node_id_2`] + * * [`point`:`bitcoin_key_1`] + * * [`point`:`bitcoin_key_2`] + */ +static void write_announce(int outfd, + size_t node1, + size_t node2, + u64 capacity, + size_t i, + const struct pubkey *node_ids) +{ + struct { + secp256k1_ecdsa_signature sig; + struct bitcoin_blkid chain_hash; + } vals; + u8 *msg; + struct short_channel_id scid; + struct pubkey id1, id2; + struct node_id nodeid1, nodeid2; + + memset(&vals, 0, sizeof(vals)); + pubkey_for_node(node1, &id1, node_ids); + pubkey_for_node(node2, &id2, node_ids); + + /* Nodes in pubkey order */ + if (pubkey_cmp(&id1, &id2) < 0) { + node_id_from_pubkey(&nodeid1, &id1); + node_id_from_pubkey(&nodeid2, &id2); + } else { + node_id_from_pubkey(&nodeid1, &id2); + node_id_from_pubkey(&nodeid2, &id1); + } + /* Use i to avoid clashing scids even if two nodes have > 1 channel */ + if (!mk_short_channel_id(&scid, node1, node2, i & 0xFFFF)) + abort(); + + msg = towire_channel_announcement(NULL, &vals.sig, &vals.sig, &vals.sig, &vals.sig, + NULL, &vals.chain_hash, scid, + &nodeid1, &nodeid2, + &id1, &id1); + write_msg_to_gstore(outfd, take(msg)); + + msg = towire_gossip_store_channel_amount(NULL, amount_sat(capacity)); + write_msg_to_gstore(outfd, take(msg)); +} + +/* BOLT #7: + * 1. type: 258 (`channel_update`) + * 2. data: + * * [`signature`:`signature`] + * * [`chain_hash`:`chain_hash`] + * * [`short_channel_id`:`short_channel_id`] + * * [`u32`:`timestamp`] + * * [`byte`:`message_flags`] + * * [`byte`:`channel_flags`] + * * [`u16`:`cltv_expiry_delta`] + * * [`u64`:`htlc_minimum_msat`] + * * [`u32`:`fee_base_msat`] + * * [`u32`:`fee_proportional_millionths`] + * * [`u64`:`htlc_maximum_msat`] + */ +static void write_update(int outfd, + size_t node1, + size_t node2, + size_t i, + int dir, + bool disabled, + u64 htlc_min, u64 htlc_max, + u64 basefee, + u32 propfee, + u16 delay, + const struct pubkey *node_ids) +{ + struct vals { + secp256k1_ecdsa_signature sig; + struct bitcoin_blkid chain_hash; + u32 timestamp; + } vals; + u8 *msg; + u8 message_flags, channel_flags; + struct pubkey id1, id2; + struct short_channel_id scid; + + memset(&vals, 0, sizeof(vals)); + + /* Use i to avoid clashing scids even if two nodes have > 1 channel */ + if (!mk_short_channel_id(&scid, node1, node2, i & 0xFFFF)) + abort(); + + /* If node ids are backward, dir is reversed */ + pubkey_for_node(node1, &id1, node_ids); + pubkey_for_node(node2, &id2, node_ids); + if (pubkey_cmp(&id1, &id2) > 0) + dir = !dir; + + /* BOLT #7: + * The `channel_flags` bitfield is used to indicate the direction of + * the channel: it identifies the node that this update originated + * from and signals various options concerning the channel. The + * following table specifies the meaning of its individual bits: + * + * | Bit Position | Name | Meaning | + * | ------------- | ----------- | -------------------------------- | + * | 0 | `direction` | Direction this update refers to. | + * | 1 | `disable` | Disable the channel. | + * + * The `message_flags` bitfield is used to provide additional details about the message: + * + * | Bit Position | Name | + * | ------------- | ---------------| + * | 0 | `must_be_one` | + * | 1 | `dont_forward` | + */ + channel_flags = dir ? 1 : 0; + if (disabled) + channel_flags |= 2; + message_flags = 1; + msg = towire_channel_update(NULL, &vals.sig, &vals.chain_hash, scid, + 0, message_flags, channel_flags, + delay, + amount_msat(htlc_min), + basefee, propfee, + amount_msat(htlc_max)); + write_msg_to_gstore(outfd, take(msg)); +} + +static const u64 *read_template(const tal_t *ctx, gzFile inf, const char *what) +{ + size_t count = read_bigsize(inf); + u64 *template = tal_arr(ctx, u64, count); + + for (size_t i = 0; i < count; i++) + template[i] = read_bigsize(inf); + + if (verbose) + printf("%zu unique %s\n", count, what); + + return template; +} + +static u64 read_val(gzFile inf, const u64 *template) +{ + size_t idx = read_bigsize(inf); + assert(idx < tal_count(template)); + return template[idx]; +} + +static char *opt_add_one(unsigned int *val) +{ + (*val)++; + return NULL; +} + +static char *opt_nodes(const char *optarg, struct pubkey **node_ids) +{ + char **ids = tal_strsplit(tmpctx, optarg, ",", STR_EMPTY_OK); + + for (size_t i = 0; ids[i]; i++) { + struct pubkey n; + if (!pubkey_from_hexstr(ids[i], strlen(ids[i]), &n)) + return tal_fmt(tmpctx, "Invalid node id '%s'", ids[i]); + tal_arr_expand(node_ids, n); + } + return NULL; +} + +int main(int argc, char *argv[]) +{ + int infd, outfd; + struct pubkey *node_ids; + + common_setup(argv[0]); + setup_locale(); + + node_ids = tal_arr(tmpctx, struct pubkey, 0); + opt_register_noarg("--verbose|-v", opt_add_one, &verbose, + "Print details (each additional gives more!)."); + opt_register_arg("--nodes", opt_nodes, NULL, &node_ids, + "Comma separated node ids to give first nodes."); + opt_register_noarg("--help|-h", opt_usage_and_exit, + "[decompress|compress] infile outfile" + "Compress or decompress a gossmap file", + "Print this message."); + + opt_parse(&argc, argv, opt_log_stderr_exit); + if (argc != 4) + opt_usage_and_exit("Needs 4 arguments"); + + infd = open(argv[2], O_RDONLY); + if (infd < 0) + opt_usage_and_exit(tal_fmt(tmpctx, "Cannot open %s for reading: %s", + argv[2], strerror(errno))); + outfd = open(argv[3], O_WRONLY|O_CREAT|O_TRUNC, 0666); + if (outfd < 0) + opt_usage_and_exit(tal_fmt(tmpctx, "Cannot open %s for writing: %s", + argv[3], strerror(errno))); + + if (streq(argv[1], "compress")) { + struct gossmap_node **nodes, *n; + size_t *node_to_compr_idx; + size_t node_count, channel_count; + struct gossmap_chan **chans, *c; + gzFile outf = gzdopen(outfd, "wb9"); + + struct gossmap *gossmap = gossmap_load_fd(tmpctx, infd, NULL, NULL, NULL); + if (!gossmap) + opt_usage_and_exit("Cannot read gossmap"); + + nodes = tal_arr(gossmap, struct gossmap_node *, gossmap_max_node_idx(gossmap)); + for (node_count = 0, n = gossmap_first_node(gossmap); + n; + n = gossmap_next_node(gossmap, n), node_count++) { + nodes[node_count] = n; + } + tal_resize(&nodes, node_count); + if (verbose) + printf("%zu nodes\n", node_count); + + /* nodes with most channels go first */ + asort(nodes, tal_count(nodes), cmp_node_num_chans, NULL); + + /* Create map of gossmap index to compression index */ + node_to_compr_idx = tal_arr(nodes, size_t, gossmap_max_node_idx(gossmap)); + for (size_t i = 0; i < tal_count(nodes); i++) + node_to_compr_idx[gossmap_node_idx(gossmap, nodes[i])] = i; + + if (gzwrite(outf, GC_HEADER, GC_HEADERLEN) == 0) + err(1, "Writing header"); + + /* Now, output channels. First get exact count. */ + for (channel_count = 0, c = gossmap_first_chan(gossmap); + c; + c = gossmap_next_chan(gossmap, c)) { + channel_count++; + } + + if (verbose) + printf("%zu channels\n", channel_count); + chans = tal_arr(gossmap, struct gossmap_chan *, channel_count); + + /* * := {channel_count} {start_nodeidx}*{channel_count} {end_nodeidx}*{channel_count} */ + write_bigsize(outf, channel_count); + size_t chanidx = 0; + /* We iterate nodes to get to channels. This gives us nicer ordering for compression */ + for (size_t wanted_dir = 0; wanted_dir < 2; wanted_dir++) { + for (n = gossmap_first_node(gossmap); n; n = gossmap_next_node(gossmap, n)) { + for (size_t i = 0; i < n->num_chans; i++) { + int dir; + c = gossmap_nth_chan(gossmap, n, i, &dir); + if (dir != wanted_dir) + continue; + + write_bigsize(outf, + node_to_compr_idx[gossmap_node_idx(gossmap, n)]); + /* First time reflects channel index for reader */ + if (wanted_dir == 0) + chans[chanidx++] = c; + } + } + } + + /* := * {channel_count*2} */ + /* := {chanidx}*2+{direction} */ + size_t num_disabled = 0; + size_t num_unknown = 0; + for (size_t i = 0; i < channel_count; i++) { + for (size_t dir = 0; dir < 2; dir++) { + if (chans[i]->cupdate_off[dir] == 0) + num_unknown++; + if (!chans[i]->half[dir].enabled) { + write_bigsize(outf, i * 2 + dir); + num_disabled++; + } + } + } + write_bigsize(outf, channel_count * 2); + if (verbose) + printf("%zu disabled channels (%zu no update)\n", num_disabled, num_unknown); + + /* := {channel_count}*{capacity_idx} */ + /* := {capacity_count} {capacity_count}*{capacity} */ + u64 *vals = tal_arr(chans, u64, channel_count); + for (size_t i = 0; i < channel_count; i++) { + struct amount_sat sats; + gossmap_chan_get_capacity(gossmap, chans[i], &sats); + vals[i] = sats.satoshis; /* Raw: compression format */ + } + write_template_and_values(outf, vals, "capacities"); + + /* These are all of same form: one entry per direction per channel */ + /* := {channel_count}*{htlc_min_idx} */ + /* := {htlc_min_count} {htlc_min_count}*{htlc_min} */ + /* := {channel_count}*{htlc_max_idx} */ + /* := {htlc_max_count} {htlc_max_count}*{htlc_max} */ + /* := {channel_count}*{basefee_idx} */ + /* := {basefee_count} {basefee_count}*{basefee} */ + /* := {channel_count}*{propfee_idx} */ + /* := {propfee_count} {propfee_count}*{propfee} */ + /* := {channel_count}*{delay_idx} */ + /* := {delay_count} {delay_count}*{delay} */ + write_bidir_perchan(outf, gossmap, chans, get_htlc_min, "htlc_min"); + write_bidir_perchan(outf, gossmap, chans, get_htlc_max, "htlc_max"); + write_bidir_perchan(outf, gossmap, chans, get_basefee, "basefee"); + write_bidir_perchan(outf, gossmap, chans, get_propfee, "propfee"); + write_bidir_perchan(outf, gossmap, chans, get_delay, "delay"); + gzclose(outf); + } else if (streq(argv[1], "decompress")) { + char hdr[GC_HEADERLEN]; + size_t channel_count, chanidx; + const u64 *template; + struct fakechan { + size_t node1, node2; + u64 capacity; + struct halffake { + u64 htlc_min, htlc_max; + u32 basefee, propfee; + u32 delay; + bool disabled; + } half[2]; + } *chans; + const u8 version = GOSSIP_STORE_VER; + size_t disabled_count, node_limit; + gzFile inf = gzdopen(infd, "rb"); + + if (gzread(inf, hdr, sizeof(hdr)) != sizeof(hdr) + || !memeq(hdr, sizeof(hdr), GC_HEADER, GC_HEADERLEN)) + errx(1, "Not a valid compressed gossmap header"); + channel_count = read_bigsize(inf); + if (verbose) + printf("%zu channels\n", channel_count); + chans = tal_arrz(tmpctx, struct fakechan, channel_count); + + node_limit = 0; + for (size_t i = 0; i < channel_count; i++) { + chans[i].node1 = read_bigsize(inf); + if (chans[i].node1 >= node_limit) + node_limit = chans[i].node1 + 1; + } + for (size_t i = 0; i < channel_count; i++) { + chans[i].node2 = read_bigsize(inf); + if (chans[i].node2 >= node_limit) + node_limit = chans[i].node2 + 1; + } + + /* Useful so they can map their ids back to node ids. */ + for (size_t i = 0; i < node_limit; i++) { + struct pubkey node_id; + pubkey_for_node(i, &node_id, node_ids); + printf("%s\n", fmt_pubkey(tmpctx, &node_id)); + } + + if (verbose >= 2) { + for (size_t i = 0; i < channel_count; i++) { + struct pubkey id1, id2; + pubkey_for_node(chans[i].node1, &id1, node_ids); + pubkey_for_node(chans[i].node2, &id2, node_ids); + printf("Channel %zu: %s -> %s\n", + i, + fmt_pubkey(tmpctx, &id1), + fmt_pubkey(tmpctx, &id2)); + } + } + + disabled_count = 0; + while ((chanidx = read_bigsize(inf)) < channel_count*2) { + disabled_count++; + chans[chanidx/2].half[chanidx%2].disabled = true; + } + if (verbose) + printf("%zu disabled\n", disabled_count); + + template = read_template(tmpctx, inf, "capacities"); + for (size_t i = 0; i < channel_count; i++) + chans[i].capacity = read_val(inf, template); + + template = read_template(tmpctx, inf, "htlc_min"); + for (size_t i = 0; i < channel_count; i++) { + for (size_t dir = 0; dir < 2; dir++) { + chans[i].half[dir].htlc_min = read_val(inf, template); + } + } + template = read_template(tmpctx, inf, "htlc_max"); + for (size_t i = 0; i < channel_count; i++) { + for (size_t dir = 0; dir < 2; dir++) { + u64 v = read_val(inf, template); + if (v == 0) + v = chans[i].capacity; + else if (v == 1) + v = chans[i].capacity * 0.99; + chans[i].half[dir].htlc_max = v; + } + } + template = read_template(tmpctx, inf, "basefee"); + for (size_t i = 0; i < channel_count; i++) { + for (size_t dir = 0; dir < 2; dir++) { + chans[i].half[dir].basefee = read_val(inf, template); + } + } + template = read_template(tmpctx, inf, "propfee"); + for (size_t i = 0; i < channel_count; i++) { + for (size_t dir = 0; dir < 2; dir++) { + chans[i].half[dir].propfee = read_val(inf, template); + } + } + template = read_template(tmpctx, inf, "delay"); + for (size_t i = 0; i < channel_count; i++) { + for (size_t dir = 0; dir < 2; dir++) { + chans[i].half[dir].delay = read_val(inf, template); + } + } + + /* Now write out gossmap */ + if (write(outfd, &version, 1) != 1) + err(1, "Failed to write output"); + for (size_t i = 0; i < channel_count; i++) { + write_announce(outfd, + chans[i].node1, + chans[i].node2, + chans[i].capacity, + i, node_ids); + for (size_t dir = 0; dir < 2; dir++) { + write_update(outfd, + chans[i].node1, chans[i].node2, i, dir, + chans[i].half[dir].disabled, + chans[i].half[dir].htlc_min, + chans[i].half[dir].htlc_max, + chans[i].half[dir].basefee, + chans[i].half[dir].propfee, + chans[i].half[dir].delay, + node_ids); + } + } + gzclose(inf); + } else + opt_usage_and_exit("Unknown command"); + + close(outfd); + common_shutdown(); +} diff --git a/doc/Makefile b/doc/Makefile index c32d5a677ffa..674ca926270b 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -6,6 +6,12 @@ doc-wrongdir: GENERATE_MARKDOWN := doc/lightning-addgossip.7 \ doc/lightning-addpsbtoutput.7 \ + doc/lightning-askrene-create-channel.7 \ + doc/lightning-askrene-disable-node.7 \ + doc/lightning-askrene-inform-channel.7 \ + doc/lightning-askrene-listlayers.7 \ + doc/lightning-askrene-reserve.7 \ + doc/lightning-askrene-unreserve.7 \ doc/lightning-autoclean-once.7 \ doc/lightning-autoclean-status.7 \ doc/lightning-batching.7 \ @@ -53,6 +59,7 @@ GENERATE_MARKDOWN := doc/lightning-addgossip.7 \ doc/lightning-getinfo.7 \ doc/lightning-getlog.7 \ doc/lightning-getroute.7 \ + doc/lightning-getroutes.7 \ doc/lightning-help.7 \ doc/lightning-invoice.7 \ doc/lightning-invoicerequest.7 \ diff --git a/doc/contribute-to-core-lightning/coding-style-guidelines/writing-json-schemas.md b/doc/contribute-to-core-lightning/coding-style-guidelines/writing-json-schemas.md index f46292f7caa8..8b3d80cce91e 100644 --- a/doc/contribute-to-core-lightning/coding-style-guidelines/writing-json-schemas.md +++ b/doc/contribute-to-core-lightning/coding-style-guidelines/writing-json-schemas.md @@ -62,6 +62,21 @@ To add conditional fields: it can be defined as `"dependentUpon": { "index": ["start", "limit"] }` in the json and it will generate the markdown syntax as `[*index* [*start*] [*limit*]]`. +### Re-generate examples listed in rpc schemas (doc/schemas/lightning-*.json) + +1. The `autogenerate-rpc-examples.py` script regenerates RPC examples for methods listed in `doc/schemas/lightning-*.json` files. +2. It uses our pre-existing pytest suite to perform this task. +3. The script runs a test named `test_generate_examples`, which sets up test nodes, records RPC requests, and captures responses. +4. To prevent accidental overwriting of examples with other tests, set the environment variable `GENERATE_EXAMPLES=True` before running the script. +5. By default, all methods are regenerated. To specify which methods to regenerate, set the `REGENERATE` environment variable with a comma-separated list of method names. Eg. `REGENERATE='getinfo,connect'` will only regenerate examples for the getinfo and connect RPCs. +6. The dev-bitcoind-poll is set to 3 seconds. Ensure the `TIMEOUT` environment variable is set to more than 3 seconds to avoid test failures due to a short waiting time for bitcoind responses. +7. To run the script using Poetry, use the following command: +``` +rm -rf /tmp/ltests* && REGENERATE='getinfo,connect' VALGRIND=0 TIMEOUT=10 TEST_DEBUG=1 pytest -vvv -s -p no:logging -n 6 tests/autogenerate-rpc-examples.py +``` +8. The script saves logs in a file named `autogenerate-examples-status.log`, located in the root directory. +9. After running the script, execute make to ensure that the schema has been updated in all relevant locations, such as `...msggen/schema.json`. + ### JSON Drinking Game! 1. Sip whenever you have an additional comma at the end of a sequence. diff --git a/doc/developers-guide/plugin-development/a-day-in-the-life-of-a-plugin.md b/doc/developers-guide/plugin-development/a-day-in-the-life-of-a-plugin.md index 6e2a19411c88..4ca7df890120 100644 --- a/doc/developers-guide/plugin-development/a-day-in-the-life-of-a-plugin.md +++ b/doc/developers-guide/plugin-development/a-day-in-the-life-of-a-plugin.md @@ -51,14 +51,11 @@ The `getmanifest` method is required for all plugins and will be called on start "rpcmethods": [ { "name": "hello", - "usage": "[name]", - "description": "Returns a personalized greeting for {greeting} (set via options)." + "usage": "[name]" }, { "name": "gettime", "usage": "", - "description": "Returns the current time in {timezone}", - "long_description": "Returns the current time in the timezone that is given as the only parameter.\nThis description may be quite long and is allowed to span multiple lines.", "deprecated": false } ], @@ -101,7 +98,7 @@ The `getmanifest` method is required for all plugins and will be called on start During startup the `options` will be added to the list of command line options that `lightningd` accepts. If any `options` "name" is already taken startup will abort. The above will add a `--greeting` option with a default value of `World` and the specified description. _Notice that currently string, integers, bool, and flag options are supported._ If an option specifies `dynamic`: `true`, then it should allow a `setconfig` call for that option after initialization. -The `rpcmethods` are methods that will be exposed via `lightningd`'s JSON-RPC over Unix-Socket interface, just like the builtin commands. Any parameters given to the JSON-RPC calls will be passed through verbatim. Notice that the `name`, `description` and `usage` fields are mandatory, while the `long_description` can be omitted (it'll be set to `description` if it was not provided). `usage` should surround optional parameter names in `[]`. +The `rpcmethods` are methods that will be exposed via `lightningd`'s JSON-RPC over Unix-Socket interface, just like the builtin commands. Any parameters given to the JSON-RPC calls will be passed through verbatim. Notice that the `name` and `usage` fields are mandatory. `usage` should surround optional parameter names in `[]`. `options` and `rpcmethods` can mark themselves `deprecated: true` if you plan on removing them: this will disable them if the user sets `allow-deprecated-apis` to false, or in `--developer` mode. You can also specify `deprecated` as an array of one or two version numbers, indicating when deprecation starts, and the final version it will be permitted, e.g. `"deprecated": ["v24.02", "v24.02"]`. If only one version number is given, then the final version will be 6 months after the start version. diff --git a/doc/developers-guide/plugin-development/json-rpc-passthrough.md b/doc/developers-guide/plugin-development/json-rpc-passthrough.md index 07d52c104d75..c25244ff429c 100644 --- a/doc/developers-guide/plugin-development/json-rpc-passthrough.md +++ b/doc/developers-guide/plugin-development/json-rpc-passthrough.md @@ -7,9 +7,7 @@ updatedAt: "2023-02-03T08:53:50.840Z" --- Plugins may register their own JSON-RPC methods that are exposed through the JSON-RPC provided by `lightningd`. This provides users with a single interface to interact with, while allowing the addition of custom methods without having to modify the daemon itself. -JSON-RPC methods are registered as part of the `getmanifest` result. Each registered method must provide a `name` and a `description`. An optional `long_description` may also be -provided. This information is then added to the internal dispatch table, and used to return the help text when using `lightning-cli -help`, and the methods can be called using the `name`. +JSON-RPC methods are registered as part of the `getmanifest` result. Each registered method must provide a `name`. This information is then added to the internal dispatch table, and used to return the help text when using `lightning-cli help`, and the methods can be called using the `name`. For example, `getmanifest` result will register two methods, called `hello` and `gettime`: @@ -18,14 +16,11 @@ For example, `getmanifest` result will register two methods, called `hello` and "rpcmethods": [ { "name": "hello", - "usage": "[name]", - "description": "Returns a personalized greeting for {greeting} (set via options)." + "usage": "[name]" }, { "name": "gettime", - "description": "Returns the current time in {timezone}", "usage": "", - "long_description": "Returns the current time in the timezone that is given as the only parameter.\nThis description may be quite long and is allowed to span multiple lines." } ], ... diff --git a/doc/index.rst b/doc/index.rst index 0e3815b5b3cb..74937401325e 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -14,6 +14,12 @@ Core Lightning Documentation .. block_start manpages lightning-addgossip lightning-addpsbtoutput + lightning-askrene-create-channel + lightning-askrene-disable-node + lightning-askrene-inform-channel + lightning-askrene-listlayers + lightning-askrene-reserve + lightning-askrene-unreserve lightning-autoclean-once lightning-autoclean-status lightning-batching @@ -62,6 +68,7 @@ Core Lightning Documentation lightning-getinfo lightning-getlog lightning-getroute + lightning-getroutes lightning-help lightning-hsmtool lightning-invoice diff --git a/doc/lightningd-config.5.md b/doc/lightningd-config.5.md index b1545fd5db63..510fc37f9fff 100644 --- a/doc/lightningd-config.5.md +++ b/doc/lightningd-config.5.md @@ -83,6 +83,14 @@ re-enable it. Unless we've made a horrible mistake it's probably time to complain or fix to whatever is using the old API. It can be specified multiple times for different features. +### Whitespace Handling + +Because it's a common error, we automatically trim whitespace from the +end of most configuration options. Exceptions are noted below: + +- `log-prefix`: Preserves whitespace at the end. +- `alias`: Preserves whitespace at the end. + ### Bitcoin control options: Bitcoin control options: diff --git a/doc/rpc-schema-draft.json b/doc/rpc-schema-draft.json index 484652636ea5..f8e93970044a 100644 --- a/doc/rpc-schema-draft.json +++ b/doc/rpc-schema-draft.json @@ -366,6 +366,12 @@ "type": "string" } }, + "categories": { + "type": "array", + "items": { + "type": "string" + } + }, "request": { "$ref": "#/definitions/schemaRequest" }, diff --git a/doc/schemas/lightning-addpsbtoutput.json b/doc/schemas/lightning-addpsbtoutput.json index 434cd6846fee..fd8eac769a86 100644 --- a/doc/schemas/lightning-addpsbtoutput.json +++ b/doc/schemas/lightning-addpsbtoutput.json @@ -81,17 +81,18 @@ "examples": [ { "description": [ - "Here is a command to make a PSBT with a 100,000 sat output that leads to the on-chain wallet." + "Here is a command to make a PSBT with a 1,000,000 sat output that leads to the on-chain wallet:" ], "request": { "id": "example:addpsbtoutput#1", "method": "addpsbtoutput", "params": { - "satoshi": 100000 + "satoshi": 1000000, + "locktime": 111 } }, "response": { - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIoIYBAAAAAAABBCJRIHg2NV/cioLcTLAKdyxVVBUdBjhKTdZejT9orAhWa4S+AA==", + "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAA==", "estimated_added_weight": 172, "outnum": 0 } @@ -100,15 +101,15 @@ "request": { "id": "example:addpsbtoutput#2", "method": "addpsbtoutput", - "params": { - "satoshi": 1000000, - "locktime": 111 - } + "params": [ + 3333333, + "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQECAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQA=" + ] }, "response": { - "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIJd6ICNAQALFOMhoUHuSVSuzcaUdkDKlk4K+A+DR9+4uAA==", + "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQECAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQA=", "estimated_added_weight": 172, - "outnum": 0 + "outnum": 1 } }, { @@ -116,15 +117,15 @@ "id": "example:addpsbtoutput#3", "method": "addpsbtoutput", "params": { - "satoshi": 974343, - "initialpsbt": "cHNidP8BAF4CAAAAAfwbEpvpi6D14YV4VLnuVB47Y0uF41kXEyJRL4IusySSAQAAAAD9////ASICAAAAAAAAIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL5nAAAAAAEA9gIAAAAAAQFEkxvLatohY6mw5gr5qG1aiArSrziFPR2YoqD21Hv+RAAAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNrz8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIEu1nfVRt9i+rFM219mwhMqdwJsqygWSWTFUS+cemdh6AiBG3Qo8g9J/aAMO2RHDsIBScscj6pTTIwZp7Gw8G3EOKAEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPZgAAAAEBK68/DwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oAAA==", - "destination": "bcrt1q9tc6q49l6wrrtp8ul45rj92hsleehwwxty32zu" + "satoshi": 3333333, + "initialpsbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQECAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQA=", + "destination": "bcrt1p52spc7t99z0wu444elxahxzkcu86gakzvnfp7ugudf567am2uspsuneuq9" } }, "response": { - "psbt": "cHNidP8BAH0CAAAAAfwbEpvpi6D14YV4VLnuVB47Y0uF41kXEyJRL4IusySSAQAAAAD9////AiICAAAAAAAAIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4H3g4AAAAAABYAFCrxoFS/04Y1hPz9aDkVV4fzm7nGZwAAAAABAPYCAAAAAAEBRJMby2raIWOpsOYK+ahtWogK0q84hT0dmKKg9tR7/kQAAAAAAP3///8CQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAza8/DwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oCRzBEAiBLtZ31UbfYvqxTNtfZsITKncCbKsoFklkxVEvnHpnYegIgRt0KPIPSf2gDDtkRw7CAUnLHI+qU0yMGaexsPBtxDigBIQPXRURck2JmXyLg2W6edm8nPzJg3qOcina/oF3SaE3cz2YAAAABASuvPw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAAAA", + "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEDAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQABAwjV3DIAAAAAAAEEIlEgoqAceWUonu5Wtc/N25hWxw+kdsJk0h9xHGppr3dq5AMA", "estimated_added_weight": 172, - "outnum": 1 + "outnum": 2 } } ] diff --git a/doc/schemas/lightning-askrene-age.json b/doc/schemas/lightning-askrene-age.json new file mode 100644 index 000000000000..97527234d733 --- /dev/null +++ b/doc/schemas/lightning-askrene-age.json @@ -0,0 +1,63 @@ +{ + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-age", + "title": "Command for expiring information in a layer (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-age** RPC command tells askrene that information added to a layer by *askrene-inform-channel* beyond a certain age is less useful. It currently completely forgets constraints older than *cutoff*." + ], + "request": { + "required": [ + "layer", + "cutoff" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer to apply this change to." + ] + }, + "cutoff": { + "type": "u64", + "description": [ + "The UNIX timestamp: constraints older than this will be forgotten." + ] + } + } + }, + "response": { + "required": [ + "layer", + "num_removed" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The *layer* parameter provided." + ] + }, + "num_removed": { + "type": "u64", + "description": [ + "The number of constraints removed from *layer*" + ] + } + } + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-listlayers(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] +} diff --git a/doc/schemas/lightning-askrene-create-channel.json b/doc/schemas/lightning-askrene-create-channel.json new file mode 100644 index 000000000000..ff43fdf7eb99 --- /dev/null +++ b/doc/schemas/lightning-askrene-create-channel.json @@ -0,0 +1,105 @@ +{ + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-create-channel", + "title": "Command to add a channel to layer (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-create-channel** RPC command tells askrene to populate one direction of a channel in the given layer. If the channel already exists, it will be overridden. If the layer does not exist, it will be created." + ], + "request": { + "required": [ + "layer", + "source", + "destination", + "short_channel_id", + "capacity_msat", + "htlc_min", + "htlc_max", + "base_fee", + "proportional_fee", + "delay" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer to apply this change to." + ] + }, + "source": { + "type": "pubkey", + "description": [ + "The source node id for the channel." + ] + }, + "destination": { + "type": "pubkey", + "description": [ + "The destination node id for the channel." + ] + }, + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The short channel id for the channel. If a channel with this short channel id already exists in *layer*, the *source*, *destination* and *capacity_msat* must be the same." + ] + }, + "capacity_msat": { + "type": "msat", + "description": [ + "The capacity (onchain size) of the channel." + ] + }, + "htlc_min": { + "type": "msat", + "description": [ + "The minimum value allowed in this direction." + ] + }, + "htlc_max": { + "type": "msat", + "description": [ + "The maximum value allowed in this direction." + ] + }, + "base_fee": { + "type": "msat", + "description": [ + "The base fee to apply to use the channel in this direction." + ] + }, + "proportional_fee": { + "type": "u32", + "description": [ + "The proportional fee (in parts per million) to apply to use the channel in this direction." + ] + }, + "delay": { + "type": "u16", + "description": [ + "The CLTV delay required for this direction." + ] + } + } + }, + "response": { + "required": [], + "properties": {} + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-listlayers(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] +} diff --git a/doc/schemas/lightning-askrene-disable-node.json b/doc/schemas/lightning-askrene-disable-node.json new file mode 100644 index 000000000000..389dacaed91e --- /dev/null +++ b/doc/schemas/lightning-askrene-disable-node.json @@ -0,0 +1,49 @@ +{ + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-disable-node", + "title": "Command to disable all channels to/from a node in a layer (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-disable-node** RPC command tells askrene to disable all channels connected to a node whenever the given layer is used. This is mainly useful to force the use of alternate paths: while individual channels can be disabled using askrene-create-channel or askrene-inform-channel, that would be racy if new channels appeared." + ], + "request": { + "required": [ + "layer", + "node" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer to apply this change to." + ] + }, + "node": { + "type": "pubkey", + "description": [ + "The node to disable. It does not need to exist." + ] + } + } + }, + "response": { + "required": [], + "properties": {} + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-listlayers(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] +} diff --git a/doc/schemas/lightning-askrene-inform-channel.json b/doc/schemas/lightning-askrene-inform-channel.json new file mode 100644 index 000000000000..84017b2852e3 --- /dev/null +++ b/doc/schemas/lightning-askrene-inform-channel.json @@ -0,0 +1,111 @@ +{ + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-inform-channel", + "title": "Command to add channel capacity restrictions to layer (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-inform-channel** RPC command tells askrene about the minimum or maximum current capacity of a given channel. It can be applied whether the curren channel exists or not. If the layer does not exist, it will be created." + ], + "request": { + "required": [ + "layer", + "short_channel_id", + "direction" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer to apply this change to." + ] + }, + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The short channel id to apply this change to." + ] + }, + "direction": { + "type": "u32", + "description": [ + "The direction to apply this change to." + ] + }, + "maximum_msat": { + "type": "msat", + "description": [ + "The maximum value which this channel could pass. This or *minimum_msat* must be specified, but not both." + ] + }, + "minimum_msat": { + "type": "msat", + "description": [ + "The minumum value which this channel could pass. This or *minimum_msat* must be specified, but not both." + ] + } + } + }, + "response": { + "required": [ + "constraint" + ], + "properties": { + "constraint": { + "type": "object", + "required": [ + "short_channel_id", + "direction", + "timestamp" + ], + "properties": { + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The *short_channel_id* specified." + ] + }, + "direction": { + "type": "u32", + "description": [ + "The *direction* specified." + ] + }, + "timestamp": { + "type": "u64", + "description": [ + "The UNIX time (seconds since 1970) this was created." + ] + }, + "maximum_msat": { + "type": "msat", + "description": [ + "The *minimum_msat* (if specified)" + ] + }, + "minimum_msat": { + "type": "msat", + "description": [ + "The *maximum_msat* (if specified)" + ] + } + } + } + } + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-listlayers(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] +} diff --git a/doc/schemas/lightning-askrene-listlayers.json b/doc/schemas/lightning-askrene-listlayers.json new file mode 100644 index 000000000000..a0a5cba70511 --- /dev/null +++ b/doc/schemas/lightning-askrene-listlayers.json @@ -0,0 +1,182 @@ +{ + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-listlayers", + "title": "Command to display information about layers (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-listlayers** RPC command reports any modifications each layer (or, the layer specified) would make to the topology, if it were used for *getroutes*." + ], + "request": { + "required": [], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer to report on." + ] + } + } + }, + "response": { + "required": [ + "layers" + ], + "properties": { + "layers": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "layer", + "disabled_nodes", + "created_channels", + "constraints" + ], + "properties": { + "layer": { + "type": "string", + "description": [ + "The name of the layer." + ] + }, + "disabled_nodes": { + "type": "array", + "items": { + "type": "pubkey", + "description": [ + "The id of the disabled node." + ] + } + }, + "created_channels": { + "type": "array", + "items": { + "type": "object", + "required": [ + "source", + "destination", + "short_channel_id", + "capacity_msat", + "htlc_minimum_msat", + "htlc_maximum_msat", + "fee_base_msat", + "fee_proportional_millionths", + "delay" + ], + "properties": { + "source": { + "type": "pubkey", + "description": [ + "The source node id for the channel." + ] + }, + "destination": { + "type": "pubkey", + "description": [ + "The destination node id for the channel." + ] + }, + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The short channel id for the channel." + ] + }, + "capacity_msat": { + "type": "msat", + "description": [ + "The capacity (onchain size) of the channel." + ] + }, + "htlc_minimum_msat": { + "type": "msat", + "description": [ + "The minimum value allowed in this direction." + ] + }, + "htlc_maximum_msat": { + "type": "msat", + "description": [ + "The maximum value allowed in this direction." + ] + }, + "fee_base_msat": { + "type": "msat", + "description": [ + "The base fee to apply to use the channel in this direction." + ] + }, + "fee_proportional_millionths": { + "type": "u32", + "description": [ + "The proportional fee (in parts per million) to apply to use the channel in this direction." + ] + }, + "delay": { + "type": "u16", + "description": [ + "The CLTV delay required for this direction." + ] + } + } + } + }, + "constraints": { + "type": "array", + "items": { + "type": "object", + "required": [ + "short_channel_id", + "direction" + ], + "properties": { + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The short channel id." + ] + }, + "direction": { + "type": "u32", + "description": [ + "The direction." + ] + }, + "maximum_msat": { + "type": "msat", + "description": [ + "The maximum value which this channel could pass. This or *minimum_msat* will be present, but not both." + ] + }, + "minimum_msat": { + "type": "msat", + "description": [ + "The minimum value which this channel could pass. This or *minimum_msat* will be present, but not both." + ] + } + } + } + } + } + } + } + } + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] +} diff --git a/doc/schemas/lightning-askrene-reserve.json b/doc/schemas/lightning-askrene-reserve.json new file mode 100644 index 000000000000..7b91e3800998 --- /dev/null +++ b/doc/schemas/lightning-askrene-reserve.json @@ -0,0 +1,72 @@ +{ + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-reserve", + "title": "Command for informing askrene that you are trying a path (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-reserve** RPC command tells askrene that a path is being attempted. This allows it to take that into account when other *getroutes* calls are made. You should call **askrene-unreserve** after the attempt has completed.", + "", + "Note that additional properties inside the *path* elements are ignored, which is useful when used with the result of *getroutes*." + ], + "request": { + "required": [ + "path" + ], + "properties": { + "path": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true, + "required": [ + "short_channel_id", + "direction", + "amount_msat" + ], + "properties": { + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The channel joining these nodes." + ] + }, + "direction": { + "type": "u32", + "description": [ + "0 if this channel is traversed from lesser to greater **id**, otherwise 1." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount to send into this hop." + ] + } + } + } + } + } + }, + "response": { + "required": [], + "properties": {} + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-unreserve(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-listlayers(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] +} diff --git a/doc/schemas/lightning-askrene-unreserve.json b/doc/schemas/lightning-askrene-unreserve.json new file mode 100644 index 000000000000..377595a5caa5 --- /dev/null +++ b/doc/schemas/lightning-askrene-unreserve.json @@ -0,0 +1,72 @@ +{ + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "askrene-unreserve", + "title": "Command for informing askrene that you are no longer trying a path (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **askrene-unreserve** RPC command tells askrene that a path attempt has finished: it should only be called after a successful **askrene-reserve** call.", + "", + "Note that additional properties inside the *path* elements are ignored, which is useful when used with the result of *getroutes*." + ], + "request": { + "required": [ + "path" + ], + "properties": { + "path": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true, + "required": [ + "short_channel_id", + "direction", + "amount_msat" + ], + "properties": { + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The channel joining these nodes." + ] + }, + "direction": { + "type": "u32", + "description": [ + "0 if this channel is traversed from lesser to greater **id**, otherwise 1." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount to send into this hop." + ] + } + } + } + } + } + }, + "response": { + "required": [], + "properties": {} + }, + "see_also": [ + "lightning-getroutes(7)", + "lightning-askrene-reserve(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-listlayers(7)", + "lightning-askrene-age(7)" + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "resources": [ + "Main web site: " + ] +} diff --git a/doc/schemas/lightning-autoclean-once.json b/doc/schemas/lightning-autoclean-once.json index 0b2a9ab36590..bdd0d082e3e1 100644 --- a/doc/schemas/lightning-autoclean-once.json +++ b/doc/schemas/lightning-autoclean-once.json @@ -209,8 +209,8 @@ "response": { "autoclean": { "failedpays": { - "cleaned": 1, - "uncleaned": 1 + "cleaned": 0, + "uncleaned": 7 } } } @@ -227,7 +227,7 @@ "response": { "autoclean": { "succeededpays": { - "cleaned": 1, + "cleaned": 7, "uncleaned": 0 } } diff --git a/doc/schemas/lightning-autoclean-status.json b/doc/schemas/lightning-autoclean-status.json index 946c3bfa30c9..37de74551a82 100644 --- a/doc/schemas/lightning-autoclean-status.json +++ b/doc/schemas/lightning-autoclean-status.json @@ -438,7 +438,8 @@ "response": { "autoclean": { "expiredinvoices": { - "enabled": false, + "enabled": true, + "age": 300, "cleaned": 0 } } @@ -462,7 +463,7 @@ }, "succeededpays": { "enabled": false, - "cleaned": 0 + "cleaned": 7 }, "failedpays": { "enabled": false, @@ -474,7 +475,7 @@ }, "expiredinvoices": { "enabled": true, - "age": 2, + "age": 300, "cleaned": 0 } } diff --git a/doc/schemas/lightning-bkpr-channelsapy.json b/doc/schemas/lightning-bkpr-channelsapy.json index 6e1a608b3f49..9a8f90888823 100644 --- a/doc/schemas/lightning-bkpr-channelsapy.json +++ b/doc/schemas/lightning-bkpr-channelsapy.json @@ -214,8 +214,28 @@ "response": { "channels_apy": [ { - "account": "e41b2ec83e9139a9fd8f1d89b01e5d7df73099494e6b91504c39445e37485b0d", - "routed_out_msat": 1431440, + "account": "252d1b0a1e57895e84137f28cf19ab2c35847e284c112fefdecc7afeaa5c1de7", + "routed_out_msat": 1000000, + "routed_in_msat": 510081208, + "lease_fee_paid_msat": 0, + "lease_fee_earned_msat": 0, + "pushed_out_msat": 0, + "pushed_in_msat": 0, + "our_start_balance_msat": 0, + "channel_start_balance_msat": 1000000000, + "fees_out_msat": 0, + "fees_in_msat": 106, + "utilization_out": "0.1000%", + "utilization_in": "51.0081%", + "utilization_in_initial": "51.0081%", + "apy_out": "0.0000%", + "apy_in": "0.0252%", + "apy_in_initial": "0.0252%", + "apy_total": "0.0252%" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "routed_out_msat": 510181102, "routed_in_msat": 0, "lease_fee_paid_msat": 0, "lease_fee_earned_msat": 0, @@ -223,20 +243,20 @@ "pushed_in_msat": 0, "our_start_balance_msat": 1000000000, "channel_start_balance_msat": 1000000000, - "fees_out_msat": 0, + "fees_out_msat": 106, "fees_in_msat": 0, - "utilization_out": "0.1431%", - "utilization_out_initial": "0.1431%", + "utilization_out": "51.0181%", + "utilization_out_initial": "51.0181%", "utilization_in": "0.0000%", - "apy_out": "0.0000%", - "apy_out_initial": "0.0000%", + "apy_out": "0.0505%", + "apy_out_initial": "0.0505%", "apy_in": "0.0000%", - "apy_total": "0.0000%", - "apy_total_initial": "0.0000%" + "apy_total": "0.0505%", + "apy_total_initial": "0.0505%" }, { - "account": "net", - "routed_out_msat": 1431440, + "account": "f8fc83a432cbfb2fffe222cc06727fdd977b5dd10ebd6707158e799e6f522d9f", + "routed_out_msat": 500000000, "routed_in_msat": 0, "lease_fee_paid_msat": 0, "lease_fee_earned_msat": 0, @@ -246,14 +266,37 @@ "channel_start_balance_msat": 1000000000, "fees_out_msat": 0, "fees_in_msat": 0, - "utilization_out": "0.1431%", - "utilization_out_initial": "0.1431%", + "utilization_out": "50.0000%", + "utilization_out_initial": "50.0000%", "utilization_in": "0.0000%", "apy_out": "0.0000%", "apy_out_initial": "0.0000%", "apy_in": "0.0000%", "apy_total": "0.0000%", "apy_total_initial": "0.0000%" + }, + { + "account": "net", + "routed_out_msat": 1011181102, + "routed_in_msat": 510081208, + "lease_fee_paid_msat": 0, + "lease_fee_earned_msat": 0, + "pushed_out_msat": 0, + "pushed_in_msat": 0, + "our_start_balance_msat": 2000000000, + "channel_start_balance_msat": 3000000000, + "fees_out_msat": 106, + "fees_in_msat": 106, + "utilization_out": "33.7060%", + "utilization_out_initial": "50.5591%", + "utilization_in": "17.0027%", + "utilization_in_initial": "51.0081%", + "apy_out": "0.0084%", + "apy_out_initial": "0.0126%", + "apy_in": "0.0084%", + "apy_in_initial": "0.0252%", + "apy_total": "0.0168%", + "apy_total_initial": "0.0168%" } ] } diff --git a/doc/schemas/lightning-bkpr-inspect.json b/doc/schemas/lightning-bkpr-inspect.json index 5f1f117366f7..9ad2510b264e 100644 --- a/doc/schemas/lightning-bkpr-inspect.json +++ b/doc/schemas/lightning-bkpr-inspect.json @@ -211,23 +211,51 @@ "request": { "id": "example:bkpr-inspect#1", "method": "bkpr-inspect", - "params": [ - "f30a7bab1ec077622d8fe877634bc6dd38bb08122ad49606199c565e0383b2ab" - ] + "params": { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2" + } }, "response": { "txs": [ { - "txid": "abb283035e569c190696d42a1208bb38ddc64b6377e88f2d6277c01eab7b0af3", - "fees_paid_msat": 0, + "txid": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483", + "blockheight": 111, + "fees_paid_msat": 4927000, "outputs": [ { - "account": "f30a7bab1ec077622d8fe877634bc6dd38bb08122ad49606199c565e0383b2ab", + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "outnum": 0, - "output_tag": "channel_proposed", - "output_value_msat": 996363000, - "credit_msat": 996363000, + "output_tag": "channel_open", + "output_value_msat": 1000000000, + "credit_msat": 1000000000, + "currency": "bcrt", + "spend_tag": "channel_close", + "spending_txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305", + "debit_msat": 489818898 + } + ] + }, + { + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305", + "blockheight": 121, + "fees_paid_msat": 2895898, + "outputs": [ + { + "account": "wallet", + "outnum": 0, + "output_tag": "deposit", + "output_value_msat": 486923000, + "credit_msat": 486923000, "currency": "bcrt" + }, + { + "account": "external", + "outnum": 1, + "output_tag": "to_them", + "output_value_msat": 510181000, + "credit_msat": 510181000, + "currency": "bcrt", + "originating_account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2" } ] } diff --git a/doc/schemas/lightning-bkpr-listaccountevents.json b/doc/schemas/lightning-bkpr-listaccountevents.json index 9e112390a590..d60d1c17533f 100644 --- a/doc/schemas/lightning-bkpr-listaccountevents.json +++ b/doc/schemas/lightning-bkpr-listaccountevents.json @@ -266,13 +266,25 @@ "events": [ { "account": "wallet", - "type": "channel", - "tag": "journal_entry", + "type": "chain", + "tag": "deposit", + "credit_msat": 200000000000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "386ad532212a5cffd753a39c2d7260793e0c885fc28bc1235362c2b133a4f6a4:0", + "timestamp": 1722303635, + "blockheight": 105 + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "chain", + "tag": "channel_open", "credit_msat": 0, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706152911, - "is_rebalance": false + "outpoint": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483:0", + "timestamp": 1722303653, + "blockheight": 111 }, { "account": "wallet", @@ -281,9 +293,9 @@ "credit_msat": 2000000000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "7e202b3b1016e8eb6f4e936215ed6b5bdc63c17e6ebb5e6bce2f98e6757ba44c:0", - "timestamp": 1706152914, - "blockheight": 102 + "outpoint": "b19a249c64f2c952b4b9a400bdec159b56af2af63939c9ecb8fd937f344a7056:0", + "timestamp": 1722303656, + "blockheight": 112 }, { "account": "wallet", @@ -292,10 +304,10 @@ "credit_msat": 0, "debit_msat": 2000000000, "currency": "bcrt", - "outpoint": "7e202b3b1016e8eb6f4e936215ed6b5bdc63c17e6ebb5e6bce2f98e6757ba44c:0", - "txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b", - "timestamp": 1706152921, - "blockheight": 103 + "outpoint": "b19a249c64f2c952b4b9a400bdec159b56af2af63939c9ecb8fd937f344a7056:0", + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2", + "timestamp": 1722303659, + "blockheight": 113 }, { "account": "wallet", @@ -304,9 +316,20 @@ "credit_msat": 995073000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b:1", - "timestamp": 1706152921, - "blockheight": 103 + "outpoint": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2:0", + "timestamp": 1722303659, + "blockheight": 113 + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "chain", + "tag": "channel_open", + "credit_msat": 1000000000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2:1", + "timestamp": 1722303659, + "blockheight": 113 }, { "account": "wallet", @@ -315,8 +338,8 @@ "credit_msat": 1004927000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706152921, - "txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b" + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" }, { "account": "wallet", @@ -325,122 +348,328 @@ "credit_msat": 0, "debit_msat": 1004927000, "currency": "bcrt", - "timestamp": 1706152921, - "txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b" + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", - "type": "chain", - "tag": "channel_open", - "credit_msat": 1000000000, + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "onchain_fee", + "tag": "onchain_fee", + "credit_msat": 4927000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b:0", - "timestamp": 1706152922, - "blockheight": 103 + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", - "type": "onchain_fee", - "tag": "onchain_fee", - "credit_msat": 4927000, + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 500000000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "7f74f064ff4528b7ec7c578df662617657cae9af4a74f5f24f68cb8465b18670", + "part_id": 0, + "timestamp": 1722303673, + "description": "description send some sats l2 to l3", + "is_rebalance": false + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "channel", + "tag": "invoice", + "credit_msat": 0, + "debit_msat": 500000000, + "currency": "bcrt", + "payment_id": "365522e0e6c2fe84987153324cc9fac02986855d849bbd650426ba6064463166", + "part_id": 0, + "timestamp": 1722303675, + "description": "description send some sats l3 to l4", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", + "part_id": 0, + "timestamp": 1722303677, + "description": "Invoice description l31", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", + "part_id": 0, + "timestamp": 1722303679, + "description": "keysend", + "is_rebalance": false + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "channel", + "tag": "routed", + "credit_msat": 0, + "debit_msat": 10000000, + "fees_msat": 101, + "currency": "bcrt", + "payment_id": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "part_id": 0, + "timestamp": 1722303682, + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "routed", + "credit_msat": 10000101, "debit_msat": 0, + "fees_msat": 101, "currency": "bcrt", - "timestamp": 1706152922, - "txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b" + "payment_id": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "part_id": 0, + "timestamp": 1722303682, + "is_rebalance": false }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "type": "channel", "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "part_id": 0, + "timestamp": 1722303686, + "description": "keysend", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 50000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "part_id": 0, + "timestamp": 1722303688, + "description": "l32 description", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 100000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68", + "part_id": 0, + "timestamp": 1722303689, + "description": "l33 description", + "is_rebalance": false + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "type": "channel", + "tag": "routed", "credit_msat": 0, - "debit_msat": 11000000, + "debit_msat": 1000, + "fees_msat": 1, "currency": "bcrt", - "payment_id": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", + "payment_id": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", "part_id": 0, - "timestamp": 1706152934, - "description": [ - "XEoCR94SIz6UIRUEkxum." - ], + "timestamp": 1722303692, "is_rebalance": false }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "routed", + "credit_msat": 1001, + "debit_msat": 0, + "fees_msat": 1, + "currency": "bcrt", + "payment_id": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "part_id": 0, + "timestamp": 1722303692, + "is_rebalance": false + }, + { + "account": "wallet", + "type": "chain", + "tag": "deposit", + "credit_msat": 510181000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305:1", + "timestamp": 1722303693, + "blockheight": 121 + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", "type": "chain", "tag": "channel_close", "credit_msat": 0, - "debit_msat": 989000000, + "debit_msat": 489999000, "currency": "bcrt", - "outpoint": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b:0", - "txid": "7178638c13a0573f440d9516a23901874b6138338d378b3291cb306c90b3f998", - "timestamp": 1706152938, - "blockheight": 104 + "outpoint": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2:1", + "txid": "2849a5c5cd182ebec02d18ba6348bb01e70a544d0ce9aa8b5533fb09d24c969e", + "timestamp": 1722303693, + "blockheight": 121 }, { "account": "external", - "origin": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "origin": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", "type": "chain", "tag": "to_them", - "credit_msat": 10899000, + "credit_msat": 510001000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "7178638c13a0573f440d9516a23901874b6138338d378b3291cb306c90b3f998:0", - "timestamp": 1706152938, - "blockheight": 104 + "outpoint": "2849a5c5cd182ebec02d18ba6348bb01e70a544d0ce9aa8b5533fb09d24c969e:1", + "timestamp": 1722303693, + "blockheight": 121 + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "chain", + "tag": "channel_close", + "credit_msat": 0, + "debit_msat": 510181102, + "currency": "bcrt", + "outpoint": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483:0", + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305", + "timestamp": 1722303693, + "blockheight": 121 }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "external", + "origin": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "chain", + "tag": "to_them", + "credit_msat": 486923000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305:0", + "timestamp": 1722303693, + "blockheight": 121 + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "type": "onchain_fee", "tag": "onchain_fee", - "credit_msat": 7967000, + "credit_msat": 102, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706152938, - "txid": "7178638c13a0573f440d9516a23901874b6138338d378b3291cb306c90b3f998" + "timestamp": 1722303693, + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305" + }, + { + "account": "ecabe6d86abdd57565b3fb7e7c5d724e60ca1a07633951769b5dbfa48dc884b3", + "type": "chain", + "tag": "channel_open", + "credit_msat": 0, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "f2f4e67dbf2791a3b57dd986418156b116b452c5fc27b077da7c529db82f06f5:1", + "timestamp": 1722303702, + "blockheight": 123 }, { "account": "wallet", "type": "chain", "tag": "deposit", - "credit_msat": 980912000, + "credit_msat": 2000000000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "85477738281c1afd652c350025f1d28658fe541c83adc9a7d5276c30cf715a11:0", - "timestamp": 1706152941, - "blockheight": 109 + "outpoint": "4c4b46acfd0c9d4b8393a2c3fbc27cb70bfa9270bf47ade3348c4acd949b770b:0", + "timestamp": 1722303705, + "blockheight": 124 }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "wallet", "type": "chain", - "tag": "delayed_to_us", - "credit_msat": 981033000, + "tag": "withdrawal", + "credit_msat": 0, + "debit_msat": 510181000, + "currency": "bcrt", + "outpoint": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305:1", + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee", + "timestamp": 1722303708, + "blockheight": 125 + }, + { + "account": "wallet", + "type": "chain", + "tag": "withdrawal", + "credit_msat": 0, + "debit_msat": 2000000000, + "currency": "bcrt", + "outpoint": "4c4b46acfd0c9d4b8393a2c3fbc27cb70bfa9270bf47ade3348c4acd949b770b:0", + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee", + "timestamp": 1722303708, + "blockheight": 125 + }, + { + "account": "wallet", + "type": "chain", + "tag": "deposit", + "credit_msat": 1503221000, "debit_msat": 0, "currency": "bcrt", - "outpoint": "7178638c13a0573f440d9516a23901874b6138338d378b3291cb306c90b3f998:1", - "timestamp": 1706152941, - "blockheight": 104 + "outpoint": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee:0", + "timestamp": 1722303708, + "blockheight": 125 }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", "type": "chain", - "tag": "to_wallet", + "tag": "channel_open", + "credit_msat": 1000000000, + "debit_msat": 0, + "currency": "bcrt", + "outpoint": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee:1", + "timestamp": 1722303708, + "blockheight": 125 + }, + { + "account": "wallet", + "type": "onchain_fee", + "tag": "onchain_fee", + "credit_msat": 1006960000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" + }, + { + "account": "wallet", + "type": "onchain_fee", + "tag": "onchain_fee", "credit_msat": 0, - "debit_msat": 981033000, + "debit_msat": 1006960000, "currency": "bcrt", - "outpoint": "7178638c13a0573f440d9516a23901874b6138338d378b3291cb306c90b3f998:1", - "txid": "85477738281c1afd652c350025f1d28658fe541c83adc9a7d5276c30cf715a11", - "timestamp": 1706152941, - "blockheight": 109 + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" }, { - "account": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", + "account": "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", "type": "onchain_fee", "tag": "onchain_fee", - "credit_msat": 121000, + "credit_msat": 6960000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706152941, - "txid": "85477738281c1afd652c350025f1d28658fe541c83adc9a7d5276c30cf715a11" + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" } ] } @@ -450,31 +679,147 @@ "id": "example:bkpr-listaccountevents#2", "method": "bkpr-listaccountevents", "params": [ - "f30a7bab1ec077622d8fe877634bc6dd38bb08122ad49606199c565e0383b2ab" + "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2" ] }, "response": { "events": [ { - "account": "f30a7bab1ec077622d8fe877634bc6dd38bb08122ad49606199c565e0383b2ab", + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "type": "chain", - "tag": "channel_proposed", - "credit_msat": 996363000, + "tag": "channel_open", + "credit_msat": 0, "debit_msat": 0, "currency": "bcrt", - "outpoint": "abb283035e569c190696d42a1208bb38ddc64b6377e88f2d6277c01eab7b0af3:0", - "timestamp": 1706246949, - "blockheight": 0 + "outpoint": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483:0", + "timestamp": 1722303653, + "blockheight": 111 }, { - "account": "f30a7bab1ec077622d8fe877634bc6dd38bb08122ad49606199c565e0383b2ab", + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", "type": "channel", - "tag": "pushed", - "credit_msat": 0, - "debit_msat": 20000000, + "tag": "invoice", + "credit_msat": 500000000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "7f74f064ff4528b7ec7c578df662617657cae9af4a74f5f24f68cb8465b18670", + "part_id": 0, + "timestamp": 1722303673, + "description": "description send some sats l2 to l3", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706246949, + "payment_id": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", + "part_id": 0, + "timestamp": 1722303677, + "description": "Invoice description l31", "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", + "part_id": 0, + "timestamp": 1722303679, + "description": "keysend", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "routed", + "credit_msat": 10000101, + "debit_msat": 0, + "fees_msat": 101, + "currency": "bcrt", + "payment_id": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "part_id": 0, + "timestamp": 1722303682, + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "part_id": 0, + "timestamp": 1722303686, + "description": "keysend", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 50000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "part_id": 0, + "timestamp": 1722303688, + "description": "l32 description", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "invoice", + "credit_msat": 100000, + "debit_msat": 0, + "currency": "bcrt", + "payment_id": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68", + "part_id": 0, + "timestamp": 1722303689, + "description": "l33 description", + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "channel", + "tag": "routed", + "credit_msat": 1001, + "debit_msat": 0, + "fees_msat": 1, + "currency": "bcrt", + "payment_id": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "part_id": 0, + "timestamp": 1722303692, + "is_rebalance": false + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "chain", + "tag": "channel_close", + "credit_msat": 0, + "debit_msat": 510181102, + "currency": "bcrt", + "outpoint": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483:0", + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305", + "timestamp": 1722303693, + "blockheight": 121 + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "type": "onchain_fee", + "tag": "onchain_fee", + "credit_msat": 102, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303693, + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305" } ] } diff --git a/doc/schemas/lightning-bkpr-listbalances.json b/doc/schemas/lightning-bkpr-listbalances.json index 0fe1f9a84d7f..1f795ceffbcf 100644 --- a/doc/schemas/lightning-bkpr-listbalances.json +++ b/doc/schemas/lightning-bkpr-listbalances.json @@ -148,7 +148,60 @@ "account": "wallet", "balances": [ { - "balance_msat": 2222222000, + "balance_msat": 202498294000, + "coin_type": "bcrt" + } + ] + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "we_opened": false, + "account_closed": true, + "account_resolved": true, + "resolved_at_block": 121, + "balances": [ + { + "balance_msat": 0, + "coin_type": "bcrt" + } + ] + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "peer_id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "we_opened": true, + "account_closed": true, + "account_resolved": false, + "balances": [ + { + "balance_msat": 0, + "coin_type": "bcrt" + } + ] + }, + { + "account": "ecabe6d86abdd57565b3fb7e7c5d724e60ca1a07633951769b5dbfa48dc884b3", + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "we_opened": false, + "account_closed": false, + "account_resolved": false, + "balances": [ + { + "balance_msat": 0, + "coin_type": "bcrt" + } + ] + }, + { + "account": "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", + "peer_id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "we_opened": true, + "account_closed": false, + "account_resolved": false, + "balances": [ + { + "balance_msat": 1000000000, "coin_type": "bcrt" } ] diff --git a/doc/schemas/lightning-bkpr-listincome.json b/doc/schemas/lightning-bkpr-listincome.json index 58c151a94cd5..4ccd146b82ea 100644 --- a/doc/schemas/lightning-bkpr-listincome.json +++ b/doc/schemas/lightning-bkpr-listincome.json @@ -141,20 +141,144 @@ { "account": "wallet", "tag": "deposit", - "credit_msat": 1111111000, + "credit_msat": 200000000000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706153060, - "outpoint": "6d813d2e99ae7181b61e59ff224c43de698bd08b8ca5b8034ccc13aa7b6428ef:0" + "timestamp": 1722303635, + "outpoint": "386ad532212a5cffd753a39c2d7260793e0c885fc28bc1235362c2b133a4f6a4:0" }, { "account": "wallet", "tag": "deposit", - "credit_msat": 1111111000, + "credit_msat": 2000000000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1706153060, - "outpoint": "0bbbe965f76525af3876ae6f1520d91047d4be04cb4e46b7229120a60c5dc9c5:0" + "timestamp": 1722303656, + "outpoint": "b19a249c64f2c952b4b9a400bdec159b56af2af63939c9ecb8fd937f344a7056:0" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 500000000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303673, + "description": "description send some sats l2 to l3", + "payment_id": "7f74f064ff4528b7ec7c578df662617657cae9af4a74f5f24f68cb8465b18670" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "invoice", + "credit_msat": 0, + "debit_msat": 500000000, + "currency": "bcrt", + "timestamp": 1722303675, + "description": "description send some sats l3 to l4", + "payment_id": "365522e0e6c2fe84987153324cc9fac02986855d849bbd650426ba6064463166" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303677, + "description": "Invoice description l31", + "payment_id": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303679, + "description": "keysend", + "payment_id": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "routed", + "credit_msat": 101, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303682, + "payment_id": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303686, + "description": "keysend", + "payment_id": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 50000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303688, + "description": "l32 description", + "payment_id": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 100000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303689, + "description": "l33 description", + "payment_id": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "routed", + "credit_msat": 1, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303692, + "payment_id": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 102, + "currency": "bcrt", + "timestamp": 1722303693, + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 4927000, + "currency": "bcrt", + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" + }, + { + "account": "wallet", + "tag": "deposit", + "credit_msat": 2000000000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303705, + "outpoint": "4c4b46acfd0c9d4b8393a2c3fbc27cb70bfa9270bf47ade3348c4acd949b770b:0" + }, + { + "account": "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 6960000, + "currency": "bcrt", + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" } ] } @@ -172,38 +296,180 @@ { "account": "wallet", "tag": "deposit", - "credit_msat": 1111111000, + "credit_msat": 200000000000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303635, + "outpoint": "386ad532212a5cffd753a39c2d7260793e0c885fc28bc1235362c2b133a4f6a4:0" + }, + { + "account": "wallet", + "tag": "deposit", + "credit_msat": 2000000000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1708624181, - "outpoint": "895b5eaad4544d24c99628883b4d84b2c6024d6a2da4c1de54098d985f280943:1" + "timestamp": 1722303656, + "outpoint": "b19a249c64f2c952b4b9a400bdec159b56af2af63939c9ecb8fd937f344a7056:0" }, { "account": "wallet", - "tag": "withdrawal", + "tag": "onchain_fee", "credit_msat": 0, - "debit_msat": 555555000, + "debit_msat": 1004927000, "currency": "bcrt", - "timestamp": 1708624182, - "outpoint": "d28a2cba55da10700ddd7f1f23618160dafb3134650055654551d9b0382dcd71:0" + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" }, { "account": "wallet", "tag": "onchain_fee", + "credit_msat": 1004927000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 4927000, + "currency": "bcrt", + "timestamp": 1722303659, + "txid": "5aab7d37b6ed1d78de32f4f91122ab9bbf0924b21732206b63ce06639ecc3fe2" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 500000000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303673, + "description": "description send some sats l2 to l3", + "payment_id": "7f74f064ff4528b7ec7c578df662617657cae9af4a74f5f24f68cb8465b18670" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "invoice", "credit_msat": 0, - "debit_msat": 555556000, + "debit_msat": 500000000, + "currency": "bcrt", + "timestamp": 1722303675, + "description": "description send some sats l3 to l4", + "payment_id": "365522e0e6c2fe84987153324cc9fac02986855d849bbd650426ba6064463166" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303677, + "description": "Invoice description l31", + "payment_id": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303679, + "description": "keysend", + "payment_id": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "routed", + "credit_msat": 101, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303682, + "payment_id": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 10000, + "debit_msat": 0, "currency": "bcrt", - "timestamp": 1708624183, - "txid": "d28a2cba55da10700ddd7f1f23618160dafb3134650055654551d9b0382dcd71" + "timestamp": 1722303686, + "description": "keysend", + "payment_id": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 50000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303688, + "description": "l32 description", + "payment_id": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "invoice", + "credit_msat": 100000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303689, + "description": "l33 description", + "payment_id": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68" + }, + { + "account": "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "tag": "routed", + "credit_msat": 1, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303692, + "payment_id": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13" + }, + { + "account": "a397dd9b3e44afcb67f3f3ce1d649b74a8ade63e35505985e4cc1828634f69a2", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 102, + "currency": "bcrt", + "timestamp": 1722303693, + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305" + }, + { + "account": "wallet", + "tag": "deposit", + "credit_msat": 2000000000, + "debit_msat": 0, + "currency": "bcrt", + "timestamp": 1722303705, + "outpoint": "4c4b46acfd0c9d4b8393a2c3fbc27cb70bfa9270bf47ade3348c4acd949b770b:0" }, { "account": "wallet", "tag": "onchain_fee", - "credit_msat": 554947000, + "credit_msat": 0, + "debit_msat": 1006960000, + "currency": "bcrt", + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" + }, + { + "account": "wallet", + "tag": "onchain_fee", + "credit_msat": 1006960000, "debit_msat": 0, "currency": "bcrt", - "timestamp": 1708624183, - "txid": "d28a2cba55da10700ddd7f1f23618160dafb3134650055654551d9b0382dcd71" + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" + }, + { + "account": "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", + "tag": "onchain_fee", + "credit_msat": 0, + "debit_msat": 6960000, + "currency": "bcrt", + "timestamp": 1722303708, + "txid": "416618f92bc774497a510c55f8aee76e80135bc0abe1933ebe473eeb07b41dee" } ] } diff --git a/doc/schemas/lightning-blacklistrune.json b/doc/schemas/lightning-blacklistrune.json index 9d0c0ff20928..6f2e0fb2855c 100644 --- a/doc/schemas/lightning-blacklistrune.json +++ b/doc/schemas/lightning-blacklistrune.json @@ -85,14 +85,14 @@ "id": "example:blacklistrune#1", "method": "blacklistrune", "params": { - "start": 2 + "start": 1 } }, "response": { "blacklist": [ { - "start": 2, - "end": 2 + "start": 1, + "end": 3 } ] } @@ -102,19 +102,15 @@ "id": "example:blacklistrune#2", "method": "blacklistrune", "params": { - "start": 5, - "end": 7 + "start": 0, + "end": 2 } }, "response": { "blacklist": [ { - "start": 2, - "end": 2 - }, - { - "start": 5, - "end": 7 + "start": 0, + "end": 3 } ] } @@ -131,8 +127,8 @@ "response": { "blacklist": [ { - "start": 2, - "end": 7 + "start": 0, + "end": 4 } ] } diff --git a/doc/schemas/lightning-check.json b/doc/schemas/lightning-check.json index 6a47b5d70edf..09ea287c7587 100644 --- a/doc/schemas/lightning-check.json +++ b/doc/schemas/lightning-check.json @@ -53,15 +53,15 @@ "route": [ { "amount_msat": 1011, - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "delay": 20, - "channel": "1x1x1" + "channel": "111x1x0" }, { "amount_msat": 1000, - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", "delay": 10, - "channel": "2x2x2" + "channel": "113x1x1" } ], "payment_hash": "0000000000000000000000000000000000000000000000000000000000000000" diff --git a/doc/schemas/lightning-checkrune.json b/doc/schemas/lightning-checkrune.json index c1922567c9cb..53bbf56e2bf0 100644 --- a/doc/schemas/lightning-checkrune.json +++ b/doc/schemas/lightning-checkrune.json @@ -89,29 +89,8 @@ "id": "example:checkrune#1", "method": "checkrune", "params": { - "nodeid": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "617Obfct0oRBj_uqGFQxDk3XZ1sDFiC2Q5ltm5z1i_k9NSZtZXRob2Q9aW52b2ljZSZwbmFtZWRlc2NyaXB0aW9uPUB0aXBqYXJcfGpiNTVAc2VuZHNhdHMubG9s", - "method": "invoice", - "params": { - "amount_msat": "any", - "label": "lbl", - "description": [ - "@tipjar|jb55@sendsats.lol." - ] - } - } - }, - "response": { - "valid": true - } - }, - { - "request": { - "id": "example:checkrune#2", - "method": "checkrune", - "params": { - "nodeid": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", + "nodeid": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "rune": "_RWaZZRI7wAYU2hqlFBmYgC_dFczcpAdI_9O87YbDpg9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", "method": "listpeers", "params": {} } @@ -122,16 +101,14 @@ }, { "request": { - "id": "example:checkrune#3", + "id": "example:checkrune#2", "method": "checkrune", "params": { - "nodeid": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "617Obfct0oRBj_uqGFQxDk3XZ1sDFiC2Q5ltm5z1i_k9NSZtZXRob2Q9aW52b2ljZSZwbmFtZWRlc2NyaXB0aW9uPUB0aXBqYXJcfGpiNTVAc2VuZHNhdHMubG9s", - "method": "invoice", + "nodeid": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "rune": "QUJEYMLGgiaJvMDv_MhR2hiMKIBTbq-PrL-KxcIlirQ9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "method": "pay", "params": { - "amount_msat": "any", - "label": "lbl", - "description": "@tipjar|jb55@sendsats.lol" + "amount_msat": 9999 } } }, diff --git a/doc/schemas/lightning-close.json b/doc/schemas/lightning-close.json index a4661b3c78e2..5b79881e9567 100644 --- a/doc/schemas/lightning-close.json +++ b/doc/schemas/lightning-close.json @@ -160,14 +160,14 @@ "id": "example:close#1", "method": "close", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "unilateraltimeout": 1 } }, "response": { - "tx": "020000000001018d388ffcd216c92d25163a62096ce47d5c9bbd6270ced51c5a1484f89df33e5700000000009db0e28002a00f00000000000016001445503fa4b65ade3ffdb1a92057688456c9ffae1380130f0000000000220020be82765fdb17fd5568f2dd31c6cf1aabc620ef338995ec5d9a2f3e42f43ae4870400473044022058dcde893655f40fc8162a79596440ef3e304273f8d530401fc17bc92c58159b0220428900ca6537538ba237d569a4a09003d663a991aeb331a9f18dfe807ee78806014730440220111270eeed8b4b1a231d3ce6e0e0daad718623ad159a0fd3781fb18118a8fec70220539826ee7c76cad4116d1d8852329f80314b3434cf21c765d8004186451a4cd50147522102324266de8403b3ab157a09f1f784d587af61831c998c151bcc21bb74c2b2314b2102e3bd38009866c9da8ec4aa99cc4ea9c6c0dd46df15c61ef0ce1f271291714e5752ae9c3ed620", - "txid": "5d8d917dd7d39fe5a12f121457fc6d712b5e393ed4f16bc8f5976fc08cbbfecd", - "type": "unilateral" + "tx": "020000000001018304b0bbf2ea662c053e0377df4652059bb107eb5312989471c2ef7e51f023cd0000000000ffffffff020b6e07000000000022512085d72025e78fd08bb61119f0987ab0041f50561ada6e130c645343db8c44c2afe5c8070000000000225120a7583f0c421663b8ca76fa579018b40682ef8553d73fd061cd8f216ecdced6a304004730440220369e36994b74172c67b738891a22a8f7cf3ad3d6051a1c08b641277c2b129134022060b96175b5046a0e8814c03076da885e4546f11e72188582473f0ca901001a0b0147304402206733aaa116b30474dfcdcc2ce48fbc6f222ed0eae7ac6e4c95da6a6f2a2105a502200ab85229e9981e0364ab1bef38e9a581067a9c7d9fe30487e34fd8e13eff56320147522102d595ae92b3544c3250fb772f214ad8d4c51425033740a5bcc357190add6d7e7a2102d6063d022691b2490ab454dee73a57c6ff5d308352b461ece69f3c284f2c241252ae00000000", + "txid": "70e0466dc2e74f25afe38df6a85d5e8857079873a6d5eda4732806a7ac427305", + "type": "mutual" } }, { @@ -175,29 +175,13 @@ "id": "example:close#2", "method": "close", "params": { - "id": "103x1x0", - "destination": "bcrt1qeyyk6sl5pr49ycpqyckvmttus5ttj25pd0zpvg" + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "destination": "bcrt1qwvp8fktkxp07v0fp9jyqe7yl6rcgyu585a7pzr" } }, "response": { - "tx": "0200000000010132cbce7d5f96b4003c3b5c0eab2a29fef90bb6abb833ff312fa122f31e8301810000000000ffffffff02a0860100000000002251205779a060f200d40e8f871a40eb91614cc5bfa6d0a5f852e053400a7feff8615005b10d0000000000160014c9096d43f408ea526020262ccdad7c8516b92a81040047304402207e171d056e81cf8ad2d5a613ecbaa212d5dcbd0bf713145d18911d2cbe9d858802206222911660a26d7ffddc2563ae6d41d6ffad9fbd2fc26cf40eab501a31153b9e0147304402204ae7cdc68dc7966eab73f16a1978643336333d54ae0b6f87bc11a2c19174a9710220601e5276aee0825466cc272c4eb7d353b393ef0dd230d303f46772790dee19190147522102324266de8403b3ab157a09f1f784d587af61831c998c151bcc21bb74c2b2314b2102e3bd38009866c9da8ec4aa99cc4ea9c6c0dd46df15c61ef0ce1f271291714e5752ae00000000", - "txid": "4a08e0508e2e39ea033fab5f77b318337f345550421799f6e0eb1b15a892eda4", - "type": "mutual" - } - }, - { - "request": { - "id": "example:close#3", - "method": "close", - "params": [ - "107x1x0", - null, - "bcrt1qeyyk6sl5pr49ycpqyckvmttus5ttj25pd0zpvg" - ] - }, - "response": { - "tx": "02000000000101233b513665836d240423f45ffcd1fe19aeb08d62303fa5382ad3285f770683a60000000000ffffffff02a086010000000000225120b47216ab60a0fad97de0ba9b8b370d281dfe55f552d82034e2a8d054c2246e4405b10d0000000000160014c9096d43f408ea526020262ccdad7c8516b92a81040047304402207a9e3ca258861b33827d91514690a757e76730ba8c15dd222340bb13d993a1a502204d0ae329273b69abe62df1ffccce808d5f1a29101a8ee95dae99888376dbaef801473044022033c03f406db9f1c9d924cfd8f6ea42d0962f0ab02e3217aef518aea517ca5ba40220076e2af9d40c676316a2765a86f9efd481de3fc4465ceba33b0782c505ae3452014752210212284c004a3d24146e54b2a24db48f650370a08e1fe9abe8ff41f92b09cd50542102a3032ef980cc735579aa5295d927b9a1bdbafc459f2da14163dc9bd530e0a21152ae00000000", - "txid": "d44a1374a30c1a936d2d4fdbe73c0ffff42fec8c27c6cbaec2758b3042f61d08", + "tx": "02000000000101e23fcc9e6306ce636b203217b22409bf9bab2211f9f432de781dedb6377dab5a0100000000ffffffff02746f070000000000160014730274d976305fe63d212c880cf89fd0f082728731c80700000000002251202bdd81f95d64ed2cc37d2eae725de428c91bff072d7503d87446970eedc63030040047304402205834de4c5c994a50f3ba5406534254b68e35836f98b4d5371b78225a79d087dd02201f54e1ae045e9a33dd3dd5a2b589903f305af5ead515a8e55feb2447b090415c0147304402202dd2efc52e5b4a78cbc1cf5664a0a3e3a5e67e16b0de37fc6818dbb838b6be17022062a071e81ecaec4808a44b049e091fa60b5fcf9e7f7bbdf85bc564a0a467e13601475221021c29746e4136ddff456483df3980c2d0d5f31c93ef5ded564f7294a10d7414aa2103c47b1b2afcfd68c7b86c0976adb9a4f0835bc78242fced745d78433497a867d652ae00000000", + "txid": "2849a5c5cd182ebec02d18ba6348bb01e70a544d0ce9aa8b5533fb09d24c969e", "type": "mutual" } } diff --git a/doc/schemas/lightning-commando-blacklist.json b/doc/schemas/lightning-commando-blacklist.json index 07453d5ed4b6..8bcb887ed3e6 100644 --- a/doc/schemas/lightning-commando-blacklist.json +++ b/doc/schemas/lightning-commando-blacklist.json @@ -86,14 +86,14 @@ "id": "example:commando-blacklist#1", "method": "commando-blacklist", "params": { - "start": 2 + "start": 1 } }, "response": { "blacklist": [ { - "start": 2, - "end": 2 + "start": 1, + "end": 1 } ] } @@ -103,37 +103,15 @@ "id": "example:commando-blacklist#2", "method": "commando-blacklist", "params": { - "start": 5, - "end": 7 + "start": 2, + "end": 3 } }, "response": { "blacklist": [ { - "start": 2, - "end": 2 - }, - { - "start": 5, - "end": 7 - } - ] - } - }, - { - "request": { - "id": "example:commando-blacklist#3", - "method": "commando-blacklist", - "params": { - "start": 3, - "end": 4 - } - }, - "response": { - "blacklist": [ - { - "start": 2, - "end": 7 + "start": 1, + "end": 3 } ] } diff --git a/doc/schemas/lightning-commando-listrunes.json b/doc/schemas/lightning-commando-listrunes.json index a4cd121a2ae5..9aa4913ea625 100644 --- a/doc/schemas/lightning-commando-listrunes.json +++ b/doc/schemas/lightning-commando-listrunes.json @@ -175,23 +175,40 @@ "request": { "id": "example:commando-listrunes#1", "method": "commando-listrunes", - "params": {} + "params": { + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz" + } }, "response": { "runes": [ { - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", - "unique_id": "0", - "restrictions": [], - "restrictions_as_english": "" - }, - { - "rune": "Am3W_wI0PRn4qVNEsJ2iInHyFPQK8wfdqEXztm8-icQ9MA==", - "stored": false, - "our_rune": false, + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", "unique_id": "1", - "restrictions": [], - "restrictions_as_english": "" + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "id", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "id starts with 0266e4598d1d3c415f57" + } + ], + "english": "id starts with 0266e4598d1d3c415f57" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + } + ], + "restrictions_as_english": "id starts with 0266e4598d1d3c415f57 AND method equal to listpeers" } ] } @@ -200,48 +217,88 @@ "request": { "id": "example:commando-listrunes#2", "method": "commando-listrunes", - "params": { - "rune": "Am3W_wI0PRn4qVNEsJ2iInHyFPQK8wfdqEXztm8-icQ9MA==" - } + "params": {} }, "response": { "runes": [ { - "rune": "Am3W_wI0PRn4qVNEsJ2iInHyFPQK8wfdqEXztm8-icQ9MA==", - "stored": false, - "our_rune": false, - "unique_id": "1", + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", + "unique_id": "0", "restrictions": [], "restrictions_as_english": "" - } - ] - } - }, - { - "request": { - "id": "example:commando-listrunes#3", - "method": "commando-listrunes", - "params": { - "rune": "m_tyR0qqHUuLEbFJW6AhmBg-9npxVX2yKocQBFi9cvY9MyZpZF4wMjJkMjIzNjIwYTM1OWE0N2ZmNyZtZXRob2Q9bGlzdHBlZXJzJnBuYW1lbGV2ZWwhfHBuYW1lbGV2ZWwvaW8mcGFycjEhfHBhcnIxL2lv" - } - }, - "response": { - "runes": [ + }, { - "rune": "m_tyR0qqHUuLEbFJW6AhmBg-9npxVX2yKocQBFi9cvY9MyZpZF4wMjJkMjIzNjIwYTM1OWE0N2ZmNyZtZXRob2Q9bGlzdHBlZXJzJnBuYW1lbGV2ZWwhfHBuYW1lbGV2ZWwvaW8mcGFycjEhfHBhcnIxL2lv", - "stored": false, - "unique_id": "3", + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", + "unique_id": "1", "restrictions": [ { "alternatives": [ { "fieldname": "id", - "value": "022d223620a359a47ff7", + "value": "0266e4598d1d3c415f57", "condition": "^", - "english": "id starts with 022d223620a359a47ff7" + "english": "id starts with 0266e4598d1d3c415f57" + } + ], + "english": "id starts with 0266e4598d1d3c415f57" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + } + ], + "restrictions_as_english": "id starts with 0266e4598d1d3c415f57 AND method equal to listpeers" + }, + { + "rune": "QUJEYMLGgiaJvMDv_MhR2hiMKIBTbq-PrL-KxcIlirQ9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "unique_id": "2", + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "method", + "value": "pay", + "condition": "=", + "english": "method equal to pay" + } + ], + "english": "method equal to pay" + }, + { + "alternatives": [ + { + "fieldname": "pnameamountmsat", + "value": "10000", + "condition": "<", + "english": "pnameamountmsat < 10000" + } + ], + "english": "pnameamountmsat < 10000" + } + ], + "restrictions_as_english": "method equal to pay AND pnameamountmsat < 10000" + }, + { + "rune": "jEx3l0c7NMZPSDYT7xnXXvNA83z5PDNBHRQTIk1BwNw9MyZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTh8cGFycjA9MDI2NmU0NTk4ZDFkM2M0MTVmNTcyYTg0ODg4MzBiNjBmN2U3NDRlZDkyMzVlYjBiMWJhOTMyODNiMzE1YzAzNTE4", + "unique_id": "3", + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "id", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" } ], - "english": "id starts with 022d223620a359a47ff7" + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" }, { "alternatives": [ @@ -257,39 +314,90 @@ { "alternatives": [ { - "fieldname": "pnamelevel", - "value": "", - "condition": "!", - "english": "pnamelevel is missing" + "fieldname": "pnum", + "value": "1", + "condition": "=", + "english": "pnum equal to 1" + } + ], + "english": "pnum equal to 1" + }, + { + "alternatives": [ + { + "fieldname": "pnameid", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" }, { - "fieldname": "pnamelevel", - "value": "io", - "condition": "/", - "english": "pnamelevel unequal to io" + "fieldname": "parr0", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" } ], - "english": "pnamelevel is missing OR pnamelevel unequal to io" + "english": "pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 OR parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "restrictions_as_english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 AND method equal to listpeers AND pnum equal to 1 AND pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 OR parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, + { + "rune": "8_CRIJ4arWAz72A4ILOZ46MESSJtQQQ9iQZjU28qulA9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + "unique_id": "4", + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "id", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" }, { "alternatives": [ { - "fieldname": "parr1", - "value": "", - "condition": "!", - "english": "parr1 is missing" + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + }, + { + "alternatives": [ + { + "fieldname": "pnum", + "value": "1", + "condition": "=", + "english": "pnum equal to 1" + } + ], + "english": "pnum equal to 1" + }, + { + "alternatives": [ + { + "fieldname": "pnameid", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "pnameid starts with 0266e4598d1d3c415f57" }, { - "fieldname": "parr1", - "value": "io", - "condition": "/", - "english": "parr1 unequal to io" + "fieldname": "parr0", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "parr0 starts with 0266e4598d1d3c415f57" } ], - "english": "parr1 is missing OR parr1 unequal to io" + "english": "pnameid starts with 0266e4598d1d3c415f57 OR parr0 starts with 0266e4598d1d3c415f57" } ], - "restrictions_as_english": "id starts with 022d223620a359a47ff7 AND method equal to listpeers AND pnamelevel is missing OR pnamelevel unequal to io AND parr1 is missing OR parr1 unequal to io" + "restrictions_as_english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 AND method equal to listpeers AND pnum equal to 1 AND pnameid starts with 0266e4598d1d3c415f57 OR parr0 starts with 0266e4598d1d3c415f57" } ] } diff --git a/doc/schemas/lightning-commando-rune.json b/doc/schemas/lightning-commando-rune.json index 3e153f848762..3929a992b694 100644 --- a/doc/schemas/lightning-commando-rune.json +++ b/doc/schemas/lightning-commando-rune.json @@ -195,9 +195,9 @@ "", "The `readonly` restriction is a short-cut for two restrictions:", "", - "1: `[\"method^list\", \"method^get\", \"method=summary\"]`: You may call list, get or summary.", + "1: `['method^list', 'method^get', 'method=summary']`: You may call list, get or summary.", "", - "2: `[\"method/listdatastore\"]`: But not listdatastore: that contains sensitive stuff!" + "2: `['method/listdatastore']`: But not listdatastore: that contains sensitive stuff!" ], "request": { "id": "example:commando-rune#2", @@ -208,8 +208,8 @@ } }, "response": { - "rune": "zm0x_eLgHexaTvZn3Cz7gb_YlvrlYGDo_w4BYlR9SS09MSZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", - "unique_id": "1" + "rune": "oVkzoiQ67VCU1h_aRjPqCeWktGX54ARDsqqQgDL-uMs9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", + "unique_id": "0" } }, { @@ -235,12 +235,12 @@ }, "response": { "rune": "oVkzoiQ67VCU1h_aRjPqCeWktGX54ARDsqqQgDL-uMs9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", - "unique_id": "2" + "unique_id": "0" } }, { "description": [ - "Let's create a rune which lets a specific peer (024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605) run listpeers on themselves:" + "This will allow the rune to be used for id starting with 0266e4598d1d3c415f57, and for the method listpeers:" ], "request": { "id": "example:commando-rune#4", @@ -248,29 +248,22 @@ "params": { "restrictions": [ [ - "id=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" + "id^0266e4598d1d3c415f57" ], [ "method=listpeers" - ], - [ - "pnum=1" - ], - [ - "pnameid=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605", - "parr0=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" ] ] } }, "response": { - "rune": "FE8GHiGVvxcFqCQcClVRRiNE_XEeLYQzyG2jmqto4jM9MiZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDV8cGFycjA9MDI0YjlhMWZhOGUwMDZmMWUzOTM3ZjY1ZjY2YzQwOGU2ZGE4ZTFjYTcyOGVhNDMyMjJhNzM4MWRmMWNjNDQ5NjA1", - "unique_id": "3" + "rune": "AzR2J3ym3qYCQpnTCuA7EXd90jhK9qzfRVTiMXhOpzk9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", + "unique_id": "1" } }, { "description": [ - "This allows `listpeers` with 1 argument (`pnum=1`), which is either by name (`pnameid`), or position (`parr0`). We could shorten this in several ways: either allowing only positional or named parameters, or by testing the start of the parameters only. Here's an example which only checks the first 9 bytes of the `listpeers` parameter:" + "This will allow the rune to be used for the method pay, and for the parameter amount\\_msat to be less than 10000:" ], "request": { "id": "example:commando-rune#5", @@ -278,51 +271,52 @@ "params": { "restrictions": [ [ - "id=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" - ], - [ - "method=listpeers" - ], - [ - "pnum=1" + "method=pay" ], [ - "pnameid^024b9a1fa8e006f1e393", - "parr0^024b9a1fa8e006f1e393" + "pnameamountmsat<10000" ] ] } }, "response": { - "rune": "fTQnfL05coEbiBO8SS0cvQwCcPLxE9c02pZCC6HRVEY9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5Mw==", - "unique_id": "4" + "rune": "4Ab5jUyjTVuYBxGTz3KtnR7kT__KDIjYBCvza5e4EVU9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "unique_id": "2" } }, { "description": [ - "Before we give this to our peer, let's add two more restrictions: that it only be usable for 24 hours from now (`time<`), and that it can only be used twice a minute (`rate=2`). `date +%s` can give us the current time in seconds:" + "Let's create a rune which lets a specific peer run listpeers on themselves:" ], "request": { "id": "example:commando-rune#6", "method": "commando-rune", "params": { - "rune": "fTQnfL05coEbiBO8SS0cvQwCcPLxE9c02pZCC6HRVEY9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5Mw==", "restrictions": [ [ - "time<'$(($(date +%s) + 24*60*60))'", - "rate=2" + "id=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + ], + [ + "method=listpeers" + ], + [ + "pnum=1" + ], + [ + "pnameid=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "parr0=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ] ] } }, "response": { - "rune": "tU-RLjMiDpY2U0o3W1oFowar36RFGpWloPbW9-RuZdo9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5MyZ0aW1lPDE2NTY5MjA1MzgmcmF0ZT0y", - "unique_id": "5" + "rune": "M8_ecN6cRSI0k14vMKNkkSbI6HIzrS49txY_WFe30y09MyZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTh8cGFycjA9MDI2NmU0NTk4ZDFkM2M0MTVmNTcyYTg0ODg4MzBiNjBmN2U3NDRlZDkyMzVlYjBiMWJhOTMyODNiMzE1YzAzNTE4", + "unique_id": "3" } }, { "description": [ - "This will allow the rune to be used for id starting with 022d223620a359a47ff7, and for the method listpeers:" + "This allows `listpeers` with 1 argument (`pnum=1`), which is either by name (`pnameid`), or position (`parr0`). We could shorten this in several ways: either allowing only positional or named parameters, or by testing the start of the parameters only. Here's an example which only checks the first 10 bytes of the `listpeers` parameter:" ], "request": { "id": "example:commando-rune#7", @@ -330,40 +324,46 @@ "params": { "restrictions": [ [ - "id^022d223620a359a47ff7" + "id=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ], [ "method=listpeers" + ], + [ + "pnum=1" + ], + [ + "pnameid^0266e4598d1d3c415f57", + "parr0^0266e4598d1d3c415f57" ] ] } }, "response": { - "rune": "YPojv9qgHPa3im0eiqRb-g8aRq76OasyfltGGqdFUOU9MyZpZF4wMjJkMjIzNjIwYTM1OWE0N2ZmNyZtZXRob2Q9bGlzdHBlZXJz", - "unique_id": "6" + "rune": "lCryeRwU6TfdsWTzmtv72TBUBAjgyWPwZ0r4GQm8vUs9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + "unique_id": "4" } }, { "description": [ - "This will allow the rune to be used for the method pay, and for the parameter amount\\_msat to be less than 10000:" + "Before we give this to our peer, let's add two more restrictions: that it only be usable for 24 hours from now (`time<`), and that it can only be used twice a minute (`rate=2`). `date +%s` can give us the current time in seconds:" ], "request": { "id": "example:commando-rune#8", "method": "commando-rune", - "params": { - "restrictions": [ - [ - "method=pay" - ], + "params": [ + "lCryeRwU6TfdsWTzmtv72TBUBAjgyWPwZ0r4GQm8vUs9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + [ [ - "pnameamountmsat<10000" + "time<\"$(($(date +%s) + 24*60*60))\"", + "rate=2" ] ] - } + ] }, "response": { - "rune": "b3hXuEM7Pqzk-C7HUw83xzvHOV7fmuGaWjdo-wHdfg89MCZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", - "unique_id": "7" + "rune": "7nvN7uG2CyTOXe3dYQL38YVdGsnD6d5VNNyeHVl6inc9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZ0aW1lPCIkKCgkKGRhdGUgKyVzKSArIDI0KjYwKjYwKSkifHJhdGU9Mg==", + "unique_id": "4" } } ] diff --git a/doc/schemas/lightning-commando.json b/doc/schemas/lightning-commando.json index 2b3e2e6997bc..3db442e701b1 100644 --- a/doc/schemas/lightning-commando.json +++ b/doc/schemas/lightning-commando.json @@ -89,36 +89,36 @@ "id": "example:commando#1", "method": "commando", "params": { - "peer_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "zm0x_eLgHexaTvZn3Cz7gb_YlvrlYGDo_w4BYlR9SS09MSZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "rune": "_RWaZZRI7wAYU2hqlFBmYgC_dFczcpAdI_9O87YbDpg9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", "method": "getinfo", "params": {} } }, "response": { - "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "alias": "JUNIORBEAM-v23.11-415-gd120eba", - "color": "0266e4", - "num_peers": 1, + "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "alias": "SILENTARTIST-190-g5fd2f9c-modded", + "color": "022d22", + "num_peers": 3, "num_pending_channels": 0, - "num_active_channels": 0, - "num_inactive_channels": 0, + "num_active_channels": 3, + "num_inactive_channels": 1, "address": [], "binding": [ { "type": "ipv4", "address": "127.0.0.1", - "port": 42513 + "port": 41219 } ], - "version": "v23.11-415-gd120eba", - "blockheight": 101, + "version": "v24.05-190-g5fd2f9c-modded", + "blockheight": 130, "network": "regtest", - "fees_collected_msat": 0, - "lightning-dir": "/tmp/ltests-7u_8_rtu/test_commando_rune_1/lightning-1/regtest", + "fees_collected_msat": 106, + "lightning-dir": "/tmp/.lightning/regtest", "our_features": { - "init": "08a0000a8a5961", - "node": "88a0000a8a5961", + "init": "08a0802a8a59a1", + "node": "88a0802a8a59a1", "channel": "", "invoice": "02000002024100" } @@ -129,31 +129,24 @@ "id": "example:commando#2", "method": "commando", "params": { - "peer_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "m_tyR0qqHUuLEbFJW6AhmBg-9npxVX2yKocQBFi9cvY9MyZpZF4wMjJkMjIzNjIwYTM1OWE0N2ZmNyZtZXRob2Q9bGlzdHBlZXJzJnBuYW1lbGV2ZWwhfHBuYW1lbGV2ZWwvaW8mcGFycjEhfHBhcnIxL2lv", + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", "method": "listpeers", "params": [ - "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "broken" + "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d" ] } }, "response": { "peers": [ { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "connected": true, - "num_channels": 0, + "num_channels": 2, "netaddr": [ - "127.0.0.1:40119" + "127.0.0.1:34785" ], - "features": "08a0000a8a5961", - "log": [ - { - "type": "SKIPPED", - "num_skipped": 30 - } - ] + "features": "08a0802a8a59a1" } ] } @@ -163,23 +156,23 @@ "id": "example:commando#3", "method": "commando", "params": { - "peer_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "rune": "b3hXuEM7Pqzk-C7HUw83xzvHOV7fmuGaWjdo-wHdfg89MCZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "rune": "QUJEYMLGgiaJvMDv_MhR2hiMKIBTbq-PrL-KxcIlirQ9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", "method": "pay", "params": { - "bolt11": "lnbcrt1pja05v6sp5n6gnm380ckkrnhzvytz0hvym0vcf0mlrk586nlp72cq7e2hhhffspp5cwhuvl4jhlqep3st2703z89jp7j6wucm8ytlj7rk9ckk0mv7whysdq5v3jhxcmjd9c8g6t0dceqxqyjw5qcqp99qxpqysgq40udwjtktkry0yyq9408q5vtmj534h88j5nn562lamam0rtfqfu3093t2dhhc63qnqe5maa5jc9ad5pm08q2k2udvp6skw9f6ez9c9qptatlau", - "amount_msat": 9999 + "bolt11": "lnbcrt1pn2s38zsp5lv49w44a8tvkwtkxfxwts8rnr864u59srp7sxuua3haahdhlhtrqpp5p928w8rmsg2hjeymedcn54vxhsz372qhcedgf003nmsknhx9594sdqcdserxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqt5h8te9lkn0jpdkhkmlkzs80aw7mt5kdm6jxmvddkavt3vj0vakkmfcs0hsde8y8g8za46sch2lp4jxy56u8ve25sgpgcsya0vp92sgphzw570", + "amount_msat": 9900 } } }, "response": { "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "payment_hash": "c3afc67eb2bfc190c60b579f111cb20fa5a7731b3917f978762e2d67ed9e75c9", - "created_at": 1708642714.8110592, + "payment_hash": "0954771c7b821579649bcb713a5586bc051f2817c65a84bdf19ee169dcc5a16b", + "created_at": 1722303715.008808, "parts": 1, - "amount_msat": 9999, - "amount_sent_msat": 9999, - "payment_preimage": "17632717785b1a833a296ba1831cb968602872e68881c2f324e06e87979296dc", + "amount_msat": 9900, + "amount_sent_msat": 9900, + "payment_preimage": "f3a3b40d63e62785f537aad60f93980914c5639872c7746299a6a1228abbc303", "status": "complete" } } diff --git a/doc/schemas/lightning-connect.json b/doc/schemas/lightning-connect.json index d8425fff2e36..41a36c231b5e 100644 --- a/doc/schemas/lightning-connect.json +++ b/doc/schemas/lightning-connect.json @@ -191,17 +191,17 @@ "params": { "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", "host": "localhost", - "port": 44619 + "port": 41219 } }, "response": { "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "features": "08a0000a0a69a2", + "features": "08a0802a8a59a1", "direction": "out", "address": { "type": "ipv4", "address": "127.0.0.1", - "port": 44619 + "port": 41219 } } }, @@ -210,19 +210,19 @@ "id": "example:connect#2", "method": "connect", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "host": "127.0.0.1", - "port": 42839 + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "host": "localhost", + "port": 34785 } }, "response": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "features": "08a0000a8a5961", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "features": "08a0802a8a59a1", "direction": "out", "address": { "type": "ipv4", "address": "127.0.0.1", - "port": 42839 + "port": 34785 } } } diff --git a/doc/schemas/lightning-createinvoice.json b/doc/schemas/lightning-createinvoice.json index 7d0086013f08..28dbfc9cf31c 100644 --- a/doc/schemas/lightning-createinvoice.json +++ b/doc/schemas/lightning-createinvoice.json @@ -203,5 +203,28 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:createinvoice#1", + "method": "createinvoice", + "params": { + "invstring": "lnbcrt1u1pn2s38zsp5j9w8t9p2y6an5se63n3vkpp8c20vdsthtn78sv5t2lmt57l742wqpp5wtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7fsdqcdscnxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgq4sjk5smmjpgu6v8k7xc7q5evf370kdvt8s8t6x9he6jh9sgagxyqw8l7ctdldf8vgyz3pdfwr4hn9r6u5xvd48w2f2atu752zwqsulspwpxne4", + "label": "lbl_l13", + "preimage": "0101010101010101010101010101010101010101010101010101010101010101" + } + }, + "response": { + "label": "lbl_l13", + "bolt11": "lnbcrt1u1pn2s38zsp5j9w8t9p2y6an5se63n3vkpp8c20vdsthtn78sv5t2lmt57l742wqpp5wtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7fsdqcdscnxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqcjq9fq26ph2skcsm65xjwnw3crgygpampszjcvqs8aw2zf3jzcxqg4dh58fm8mxul29vh5urpyjkll9m4dq3807xcmq2q9yvgd5qt7qp695qvu", + "payment_hash": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "amount_msat": 100000, + "status": "unpaid", + "description": "l13 description", + "expires_at": 1722908514, + "created_index": 7 + } + } ] } diff --git a/doc/schemas/lightning-createonion.json b/doc/schemas/lightning-createonion.json index 5ed930ff6e4b..bcf1faa7fff4 100644 --- a/doc/schemas/lightning-createonion.json +++ b/doc/schemas/lightning-createonion.json @@ -101,46 +101,6 @@ ], "examples": [ { - "description": [ - "The *hops* parameter is very similar to the result from `getroute` however it needs to be modified slightly.", - "", - "The following is the `getroute` response from which the above *hops* parameter was generated:", - "", - "```json", - "[", - " {", - " \"id\": \"022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59\",", - " \"channel\": \"103x2x1\",", - " \"direction\": 1,", - " \"msatoshi\": 1002,", - " \"amount_msat\": \"1002msat\",", - " \"delay\": 21,", - " }, {", - " \"id\": \"035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d\",", - " \"channel\": \"103x1x1\",", - " \"direction\": 0,", - " \"msatoshi\": 1001,", - " \"amount_msat\": \"1001msat\",", - " \"delay\": 15,", - " }, {", - " \"id\": \"0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199\",", - " \"channel\": \"103x3x1\",", - " \"direction\": 0,", - " \"msatoshi\": 1000,", - " \"amount_msat\": \"1000msat\",", - " \"delay\": 9,", - " }", - "]", - "```", - "", - " - Notice that the payload in the *hops* parameter is the hex-encoded TLV of the parameters in the `getroute` response, with length prepended as a `bigsize_t`.", - " - Except for the pubkey, the values are shifted left by one, i.e., the 1st payload in `createonion` corresponds to the 2nd set of values from `getroute`.", - " - The final payload is a copy of the last payload sans `channel`", - "", - "These rules are directly derived from the onion construction. Please refer BOLT 04 for details and rationale.", - "", - "The `onion` corresponds to 1366 hex-encoded bytes. Each shared secret consists of 32 hex-encoded bytes. Both arguments can be passed on to **sendonion**." - ], "request": { "id": "example:createonion#1", "method": "createonion", @@ -148,25 +108,26 @@ "hops": [ { "pubkey": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "payload": "11020203e904017b06080000670000010001" + "payload": "11020203e9040187060800006f0000010000" }, { "pubkey": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "payload": "11020203e804017506080000670000030001" + "payload": "11020203e804018106080000710000010001" }, { "pubkey": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", - "payload": "07020203e8040175" + "payload": "2b020203e80401810822810248b37c63b882804cf746c5b1d7595d26713d89a443ec5808a18ed2327a1903e8" } - ] + ], + "assocdata": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13" } }, "response": { - "onion": "0003f3f80d2142b953319336d2fe4097[...]6af33fcf4fb113bce01f56dd62248a9e5fcbbfba35c", + "onion": "0003ccc1f8876af4810e23bd4cccd8f2f38ee5dc117f527c783fefa4e632f857c98d588d2e3150d16b78f9458777502e4829b490e8a2d560841eb0c2368311bf9bb4e8ded0356badafd915839409ad60866c24dd7580b468c14097575565ca95425b9f44211d9ad0305ddba2391a70892ac8c9fd7c3b67d0fe22faf5a0b6905ee2e22278fe224e89ea72c3fcc598b35afaa255123e61ae7a697703e3bb8aec4d36ea487df6ec27942aadff0527d178c897e75f1ee284995196b5ead963ee9d0df798c8265c00c5c73daac917d298cc17e5d813189321d914c45ef30170c4d617dae12bb3a760d1665705e61bb6c52789e15623cefc68d96b86a6f17159c4a86bb196c9f5e40a0744d08d6da0cfd587717b6d0d074d42ac0893fa6ae1497c84824f1d27670d4e201af5e9e5a3493b603cfc209bb0ee41b573ca647c5b9882272c972cd18f19fd895e8995097d86882a473f4d26118a7ed656c5ea04c2a183b05cc0191d07fab5e78edab4ab8ec58e05e03f32d150449c0c8e3505e46ae58e77c87616144873f72f4571b00ccf8e71bcdf33a7d32345aecb660970fa73c4844ab157aa322f140f5d47b66a0590273728ddb5b8a7f3577cff5a268935b93fe598d6df4413c67c45efa9461abaf3294070a484418aa28c03ac20d08856eb0c74dfca851e8ed110bdcacb2a2fb90954b04e99986fde0678846a709120b5d1eeab9cde8d9f27d77448f4591e00bf30d7580703e6c189c658746cf7a7cc1430ce41f84244612b438c3d895333848e5f55e99b2a9d28860863c11aaa8e3ef01ead7ba1545156c356424c33aeeaa2f1e2c290d1d8dd52cd7b8116159025aba26db6fb81ad7f9cc4554c6f9f13d16defe38918b32d62a0516521934a0009a8d37c9a84689bfd8fc1f0beceb92701dca11175e0099d7541698956ba5d93efff996f538ee47717ae6c5cda98111bc28c822e99cf8957b707de270f447b6e52d30bcf9b8a9befd8663bc54612b543d0e167da67e2f295207b70857d0a7cae8932d905db2f48c873dec20aeafa07e15fa98a088e529424c8b404f03ba0ee78a6639fde5cd37dee42877ff6489ce1de5a8992cae25dd20a6521955c19129fdcc0ea157913373bf47a8018a1dd825a2f8e26194d5008161360ae9b25fc701b2accbe88eb47eee6a50b7ee6d6e169e3905e03ca72e00eb6a51b7ed3d27501715428368662b822e2262749d3e7d3243c4fd3d825b3e72bebdeebf6e035f1ad6634523ab5dc0335611c19c9936d006f2e4cd8818eb4f8b4857c8f35d18a4891e35ff91e3b54b384398574d673fcc8da50b22b8f485a41223c97e3b8ee5b8e5ff9c00a2cbfe7360509d3fee9248b5eaa81bb83da3be45dfa8cbbbf5c52ba8749c9d6261d4239feea1e7ce85ad40ad0c66bbeb1c6898626ae4e710a66f9c39a5ee94581353b46e070cfcff9a14e3f9a6108d55bb92852eb3a50e89b1e45d31b760f2a4e263a6a876ad638b123ffee7a2b0b48e16175e3eb92bfaad4dbe0af8b2bc1c15fec5a9d92d3970c2ffab2ab8fa2c9de0bd276680a4284707cd8543a97bca2394e9514236129f1c50a932f7e9bfb98c2aaa6ffc9a4a30641061246de6edf0f711a8d25d59af42ee4445b22ce2f832f3ece52c18ca62d90c590729e04c47accaec95b556ee2541c84843c54a116f5cc45bc251a8023b695f0bf79c43a97bece8a761d387a466821984fb5ec438af20d14cebb7f0026988c81b5a1b895ef94df61aa509e53083b4306c42132b5ce302fd5a2fbb1cee30a7078ccaa3bdccf781b8c9d6ae016a5f8e5cb13f7ac1f3fd0d74a182c9abea67d346f0dfcfc211aaa7ff47196465398fce3e6e0f3b73a944a7f57a90cc6a8f1bfcd385f8312e23af6f508f4f8a976d750660ac3d63630555a3a2e7fe158a982aaf0278d9f8819e5cb", "shared_secrets": [ - "88ce98c73e4d9293ab1797b0a913fe9bca0213a566252047d01b8af6da871f3e", - "4474d296810e57bd460ef8b83d2e7d288321f8a99ff7686f87384699747bcfc4", - "2a862e4123e01799a732be487fbce297f7dc7cc1467e410f18369cfee476adc2" + "7d856ece68ddf5a89b909f888bc0c37207800a6cdba89db12a7cf7e7c26e5209", + "d1dfacfabba80f07461b890fc660440a105460b687c21bf78f7e6050c2889a98", + "46ff1895fde58206d5b437d39bb149995456ede6b9af75c0135210efbff23333" ] } }, @@ -174,62 +135,31 @@ "request": { "id": "example:createonion#2", "method": "createonion", - "params": { - "hops": [ - { - "pubkey": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "payload": "e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - }, - { - "pubkey": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c", - "payload": "e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - }, + "params": [ + [ { - "pubkey": "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007", - "payload": "e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "pubkey": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "payload": "11020203e9040187060800006f0000010000" }, { - "pubkey": "032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991", - "payload": "e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "pubkey": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "payload": "11020203e804018106080000710000010001" }, { - "pubkey": "02edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145", - "payload": "e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "pubkey": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "payload": "2b020203e80401810822810248b37c63b882804cf746c5b1d7595d26713d89a443ec5808a18ed2327a1903e8" } ], - "assocdata": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", - "onion_size": 1301 - } - }, - "response": { - "onion": "00034c3f9e11d92555260db3ee4ba0378a645d01c2556451f4289a1d9b43c7afa9a4f9ecc7010dafb26787bb583c514c3b3990d40c8168b1046659d7bc2512d2f1ee0afd2b87c42de2b70102b649634d211b38049593dbb6ed8ee8f93f0b9ff23cd9654c1341137711ce67751d40867cc90c290a9446be2b8a5a43641d4549505b13e807b4240b5b82ffaf22cb534cff01be46db3985ac83b7db465fbd86d4c8d472f60678946c71eca97dd5db732fe5a6d3765e5a5afad72f035207173e7eaaa0da4f0a4540472c7dd269a030428ae586a61b2a70a428055c3848427d2a2e8bd521aadbaf79d56ea39df63c059772e026d57f0b6844c1ab99e936beadf42aaa78193b05f7380e242258deeaa90db316a943d311ef4f2a08f422422c9da454f9666742ad61c6ae003bce83cf6243adf64a728ea50bdaf129ab2ac70e1988a117609cbefc01c884f86b2494349d1067f5cf17760cdab6ae076631693147e8712412d4f0b17cf288b394fd9e29419156ee629966553c2e7598631cbf7493820388eef1ae9f4d2f9da88872e8afbbedb3b46cd7c461cbe4c5491dc6f4a68bc244584bc79b1bb227c869fae16dab4b16412523c984d3ed2b872f63b95a62f66563d2b03c3d1b5fff0290411b293569ce8435b96b447be776b49395a8d94f48cb2f7699a38e8de58d6fff04075d226dcac07668512b6d2c20d4c49d03ad300a52769e4ebbacf97378633126958df1817effc12fd679723123df244fd9b5421f8a2aedb9a8b6fb4049e3a7cae3985059081239bea38351f0c90ed5a0ff45cc492e6ab353e4c13d22ff48912d6ecfda711edfb88dc0767ecfc5dddf8fb0e112a538aeee55c0f73b3b8afc4f40ef3588eabde5b95344a4525adf67841dd67b1db10da180fb346e0bd2958f095d011827063c42361964f8ac2c356d2ec1868a9498dcd6b5915a4df4601c58fcbeb688e14de61300f13183c154b3320cc8e80042a46f22d796f56ff1fdd7e28440c05f14b960c1d0a7c627b09295112bcb635b0e2447a9374fafc4a23ceaf9de4d10b29b2f6cabd7f0c7706cf0404452681d7372d559b644627b2695960deb3b4ae57028e0164b29d5ef9e701d3122b6a5715c502e1dca5252e8c215ed754b01a193041ad9751ed2fff1b55991e256edd6099a38004a367ad097c7caf953da302201263715517f6d32cff57969be994df42fd6cadb649e3c738be798f779aaf4c07cada6bf1e4115b74e2670baf4b1592c70b10a6c043b6606b428b3f79545dc8e9783c876e5402909858f9c604963c37fbc477137c8908e6cfa11ece18c8784a6f25428a5ee1e91d0095fe310d6a91139a7c5c6624bbfcaa15ee847a25b06f57332917f68526a6317f575792e9bcba8576a96bc5859b1f2a00fd8ab08a5ac4ab71833b0b711d1f120cbdb374bcedcdcbeba3806644f5082ec737a945221f5d99562fcbb02a43beeafb16ceecd4e35f06a04c9ff9f4f33725ab62cf22c36650280e4cfb9e150a2c4ebee7785108522e8ecb4682d2d751168e7597299346c3a5e885e36eda66b9a1112997111135767972d771b02c1a36c1d1fb1ce539ecfb98e9e1d8f8fdbf89aec28ad34ff5c00c1a4a8c59848dc8b64c0e65f6f10122e60b4adc1cfc602f49d6cfbdd54be6b0951d3f9cafe8cdd0428f9ce6994844e92d8b72d44edda623bad428b398f88643c3904bda16dd15e886ca4ef6ea7f1450744ac38ffce902569d2e9026bcedd6d0ee54aceabda22bf2de72cba89e6c274064619e32a1192cf2d78b56cf497f7785a6d599de9f8383d1f66f47fc385dc569ee1f08ddbbc7f1aeb0a0126fc4020d948dda10255f11e776db7a037059a40fde38a2ee0c0ce49c7f3df175881bf12371fa72fec3fba657107892a97efe41dcc18aeecd99f3e46c33cf42c2a0ba8b75cf000", - "shared_secrets": [ - "ccf2512684e2508cb4a842393757e6040b7d25e29d3a2031f29d00a000af6128", - "d4cec39fe6287d41165bf5c608b0c720a411208a83c64c805a012c86662a2e5a", - "91bc712ebd4a900e05830394ca8b1f1168777ecdd6996029d96ec8838b9903b9", - "93c373dcb14dc36ababa3e0c5c55869a667ca175e09913a98c3be67e6af97e16", - "b2642a5770a6b61ade071fdf69d3ea365cf48434fc2a2c399512778821a33e5c" + "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "4141414141414141414141414141414141414141414141414141414141414141" ] - } - }, - { - "request": { - "id": "example:createonion#3", - "method": "createonion", - "params": { - "hops": [ - { - "pubkey": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "payload": "0cfdb000084869207468657265" - } - ], - "assocdata": "36bf44cc8d80498b95eb05e36ae5811206d3a1d8b5c8d59bbcad035d386a4de8" - } }, "response": { - "onion": "0002cdce4bfaa9faa2c060afafe001b80bde07fc670e882c063a80b4738d5f78c9351825c6461cdfcd4fe4144d3b51f63da6351b28dd49c7bfdb0b4f7d8bda4ad0d99699eda39e551084c0a095746c358d1dc6d2eec8082f2aa2f69ae8f61b1f1437ae0ed673078fec6c0510a34058167ad1a34e819a3813d4cf27b2c4917a8c6ca3d70c3381a2a41b4c1b4540adf0e922e25f57d1cfc3064f29cfec4c17244160121975cab59b44c83b4a4905bf7ebfbd308de376334bf86d8aa92c674f7bcfec85680d73e9fee72642c98c603128e358c86e0bc88a60aaebc2637441a57261c61c6be145f00f2fc56164a6495f4b52d3172cb0ef52e91fa0d32a9ae2502d17433bda58d93fbc24a70ec6b5e740952a61404c7370eafe52599c7ee52e77b1cda87c46da98d2ff0d02fe09db5adcb2d2e9bcd083ef58392907b8a21681fa4ea1e4806b4676656457fea000fa504f9b4d159fe8b241266ac91dcc0351053c6dcc1493a6b02bed652cc8b92a8470c98924ebfde6ddc5cf7fd75f6e83a7350642053b70d4834179c30eb56d8c86656cda784daf3b6cd125779bec51099301e3f79f78d85d0454aef8bf5f9058491881b73e99b662b64080cd3eb16fd7f9d9640c18738736cfc15f391232b7df92f46ceb5abf08732ff833e9409ee541d7c926f7a0fe3e233d3eee4a63b65ab23b7c835b7cdd809ddfac8abb1df471fa66a54092815aa41e6fc1a026b86c5675d39c4e8c5c4b4acd48534165239f5634b9e828a7f9df94efcd2a39045efdee4d2f006a63ae828e6e90e3610c522085da6e0198141d6e501d83aba32057f4e59f9b7dfb0bf949c5ef91917cb54561d45a9e7ead049c57deb62d14ba6e18f5d7b0fb9f15e97bf5bd9f909f99c86c787357946654b87c489d34245d07fbb72119166e338b608a4178b452695235dd96bf7fd338e29a9f054ec1a63a442e12602d2329834297f6a197d8a377d608f402f0bcc936f45f33c8d2f9d40e5aef41816dd883add81ca20f1e0631457fe00aa2bd75c9165ffcd96c100c1db83a53aeee23d59f2a542ee3ba39ba62298ddfbd9ecfafd6b5d2121eb003ee23a2ebb8c6b6b687f42492c962510c5acf5231ff96635eba37354559ba39b042d9b6883cac662f418d7c62f9908b2a67964af5e5471804f7684e0d582b8bfec99816bb3442cca1d1fe4efd75d573ebf09fa9cad811063864fb14be4a7768ec2ddb118a77969e986c6584c4b20f8622941ca73d73562857d36e17a46a68d6e10147aaefff1ffb9809f0652a5f760148ed33550661b63c8176d5679e701c221d8a49d4062eb04010ea74cc1132fbeb8934c6e582ba2a16162b7e9171f95bce4ec3e339e70c781f95aaca406cd718b74397658fdefdd093486664be7ed13efa437012f1f57f9f1f4fb4eef7501ccf0e0ac4edc01fde138038c4dd65cb5c3291ad02a6728d6761b1afa35d49bd6ef117012bdd9bd6ee8a175620feb2249aa18d6175351b4bfc2b2b4fd57ff52f5969b109aa9b6cb2cde8f350917c0da2da1bc3d52eb0c7e6080b8f69c5783f2ed26feceb05ba4e7ed66676041d03d0acd3dd6343a85ac0b9c36f9640ddd0db884822f98dc42ea7911a6938dc14ba19d3d25a2b2f82794a2b5dd751dc856d7a9ccdb2d351a0b84e7030fa925ac949a37594f3aa2ba28ae5155b0aaac9c6820b8888d0b8a9db148513b9e3dbde68333ac30a0720289b6a0145d88629d49e76a6d3538330c5aececc9d54127b0a5a0e92d5a5a73beb71132c208b589cab61d53ed357c907929198c559426ae729b374a803dd3321a45ccca39efd39eddaba6e79a2f8911bdf74e18733dc7efc51132b5608d97fd2d0f22fa8961de04cdf6d0dbfbab21e362e7abaef3976f993088aa97ed3f1f4bcf3fffb012f583558bd2f15face9cba20b3e6754b70", + "onion": "0002eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f2836866191c78fd992bdb6323814526c8ea3ab57e22cd7739942f3a3f117d1191ed07d90599edc15c1d83a85b3f00350f4ec0f4b78894d38499e802a15843122723857ebddb629cf308d485de6bdbef80209059e3409ee47154e1b7e8f20d7ce02826c734601240c31ea9fa2c0caea8677b0db9e98835e762cb32e42da32f60bd000fe44350e8e87b69d83363c41d8d22f1639e8701901d74b64bf51f1c21cdc785b54dc5a6ba39fc75f956b60a372f6421a84f6001b294487baf1bb049b7bd901c5854c0999a82095874b02da90021a685f7c77f4b724a3d27489c091807b32bcdfb2c68f69b50c0b43c78288c333dbb007874f36fcf224fbc2ed89690f64a62b5ecfe6275750eb1a5575f689ca6d59c9a570689372db120cf6a29177caaace5ac671a3607d37a3048af18d1d736ac8a4dde8efc4884f8eab23cdc8cb15170471ee7b416b5cf089dee8ab8ac3eea6700a6040839c1e86f6d2b5acf9c7bac856cae96e9d1b7142f91ac4818cf0007a23100ae621470ac2552116f30948f21602237d12d29f58ca73f10f05b38f7b4b728fcfd8aafc1a82502aae3081c4bc8a77771aef16247bcf26d8569140441c405a3c21a649a8439797f45e7c37a2025318f4c88e3eba454fd4cc37e9978b59fa7b1e41af450523713fdad8070c7abdeea299474c99b2bde737e8c8ad79cb9fdd70a935ad29504d185bf100a339d203cd929030454a6450132255fea11ba0c6a520fa7cc3b8638f8032a61c492f7f9d1ec591a851f25df9238945ae467126b64019f21a71a2d3ef46cdd7b61773ad632dc77e0bda7d06b493efe940d9b975ebb85c423a83d24966f5e2ae2ec9c3b2257cc21a4989dd016d688865ba5245667c302e408dc56ffdf4282ad834f0c5af1ce49b3997fe397faf6874cac24ae346b4e72e468506c0e724efe6f805e0fd115de39b6fa29d05e11bbe2ec27548517f93ebd7b977b13237ab9c40ff5766f7263ea1f2eabba460600cd7da082fcf8d0a7bd37054abfd6040f886dde48cf600612b5b73a44026e79d46336de73f2ea5fbfc9603ccd89f6954e5093b6bfe556e6f67deb0878128049186f7ac6ef461a56c2bb4f24a9679fb386e06052c3da2f367f14bc41ec191f5b0b7b3ccad1f2cc58c863c49055c889b8b04b6b6cbaec50d0d103d4ea0da75952a730b07cea0da43914b5ab3f30b5104d9a75eb003da0b5b97bf9eb9081194cc5b50362041a972841bdafde31909929237ed5b94c88dd05126cdb3fd25add0c777c2ad021e1a0e7140d6c4c2005cb353a7a6a747ee75467c052f55faa485cbcf3758eafba7a8ef00d1481cc0f05af539116f443cb02a7b30a3de899dc66cb0781ccccf5c8d93b34be0665d11cbca55cd7a424b958124edf1289c7f4fc19c1be8fc7a861ce47c43a641bafdb195e1c74a1fbf69dbd518013f3dbf2860818b5a3e6f1dd36a5546bfd416e9714dec29818ecd1aeeb29c319b407c497621248d232680417486698a3e1262f03a8bc6441d1de40ae351dae4527a8efe25fc68a3f1571aa556edd6bfb9db7caba4d2c02bab003c43055f5d3ebf961735c3b1f4cd3e0a96038697a95cceac08c0aff084450cf571f81c95d468826aa4292997ccfeba32db77c4c22a9d3caa0a37a8a961ac2f2c8a6965687143bc93c620503839fd7bd7fc2e6d9c966586b713f824b8e9d3de55cb1b81f9204b92dfaa066920c0910e62e59650e904e05b94bde3e467d45719d6a3b85a71c8ff1dcca5a5f497928db5f64c55aad93513e87f4f0c93a6fa5a9afe929cf8223ea509f584913844044aa23a4afa4bc0ad975f4904aab5d77b5e51511460a3b7a982d3b0adcf3fd2ffc2494d16add2825a929fc7c4f0c97159e6fa6aba8569433", "shared_secrets": [ - "3f53c03f98eb83db88ff97c2c4004051ce23265ed2414a7aebf7a3e7078839ab" + "2d7581974cde41b42da1d0a3147704aae5a71e8987fa30dc920c8cdf784b661d", + "bb599b824ce9e123c8cb27cd50a996e5035b8ae903356dcbff224496aab3a891", + "7bc4f97c2d18d5372ef572334e31590ec36b33220d7a71fa4e0fe841174eaccb" ] } } diff --git a/doc/schemas/lightning-createrune.json b/doc/schemas/lightning-createrune.json index c5898adb593c..878c3555eda8 100644 --- a/doc/schemas/lightning-createrune.json +++ b/doc/schemas/lightning-createrune.json @@ -187,7 +187,7 @@ "params": {} }, "response": { - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", "unique_id": "0", "warning_unrestricted_rune": "WARNING: This rune has no restrictions! Anyone who has access to this rune could drain funds from your node. Be careful when giving this to apps that you don't trust. Consider using the restrictions parameter to only allow access to specific rpc methods." } @@ -198,21 +198,21 @@ "", "The `readonly` restriction is a short-cut for two restrictions:", "", - "1: `[\"method^list\", \"method^get\", \"method=summary\"]`: You may call list, get or summary.", + "1: `['method^list', 'method^get', 'method=summary']`: You may call list, get or summary.", "", - "2: `[\"method/listdatastore\"]`: But not listdatastore: that contains sensitive stuff!" + "2: `['method/listdatastore']`: But not listdatastore: that contains sensitive stuff!" ], "request": { "id": "example:createrune#2", "method": "createrune", "params": { - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", "restrictions": "readonly" } }, "response": { - "rune": "zm0x_eLgHexaTvZn3Cz7gb_YlvrlYGDo_w4BYlR9SS09MSZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", - "unique_id": "1" + "rune": "_RWaZZRI7wAYU2hqlFBmYgC_dFczcpAdI_9O87YbDpg9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", + "unique_id": "0" } }, { @@ -223,7 +223,7 @@ "id": "example:createrune#3", "method": "createrune", "params": { - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", "restrictions": [ [ "method^list", @@ -237,13 +237,13 @@ } }, "response": { - "rune": "oVkzoiQ67VCU1h_aRjPqCeWktGX54ARDsqqQgDL-uMs9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", - "unique_id": "2" + "rune": "_RWaZZRI7wAYU2hqlFBmYgC_dFczcpAdI_9O87YbDpg9MCZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl", + "unique_id": "0" } }, { "description": [ - "Let's create a rune which lets a specific peer (024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605) run listpeers on themselves:" + "This will allow the rune to be used for id starting with 0266e4598d1d3c415f57, and for the method listpeers:" ], "request": { "id": "example:createrune#4", @@ -251,29 +251,22 @@ "params": { "restrictions": [ [ - "id=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" + "id^0266e4598d1d3c415f57" ], [ "method=listpeers" - ], - [ - "pnum=1" - ], - [ - "pnameid=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605", - "parr0=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" ] ] } }, "response": { - "rune": "FE8GHiGVvxcFqCQcClVRRiNE_XEeLYQzyG2jmqto4jM9MiZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDV8cGFycjA9MDI0YjlhMWZhOGUwMDZmMWUzOTM3ZjY1ZjY2YzQwOGU2ZGE4ZTFjYTcyOGVhNDMyMjJhNzM4MWRmMWNjNDQ5NjA1", - "unique_id": "3" + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", + "unique_id": "1" } }, { "description": [ - "This allows `listpeers` with 1 argument (`pnum=1`), which is either by name (`pnameid`), or position (`parr0`). We could shorten this in several ways: either allowing only positional or named parameters, or by testing the start of the parameters only. Here's an example which only checks the first 9 bytes of the `listpeers` parameter:" + "This will allow the rune to be used for the method pay, and for the parameter amount\\_msat to be less than 10000:" ], "request": { "id": "example:createrune#5", @@ -281,51 +274,52 @@ "params": { "restrictions": [ [ - "id=024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605" - ], - [ - "method=listpeers" - ], - [ - "pnum=1" + "method=pay" ], [ - "pnameid^024b9a1fa8e006f1e393", - "parr0^024b9a1fa8e006f1e393" + "pnameamountmsat<10000" ] ] } }, "response": { - "rune": "fTQnfL05coEbiBO8SS0cvQwCcPLxE9c02pZCC6HRVEY9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5Mw==", - "unique_id": "4" + "rune": "QUJEYMLGgiaJvMDv_MhR2hiMKIBTbq-PrL-KxcIlirQ9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "unique_id": "2" } }, { "description": [ - "Before we give this to our peer, let's add two more restrictions: that it only be usable for 24 hours from now (`time<`), and that it can only be used twice a minute (`rate=2`). `date +%s` can give us the current time in seconds:" + "Let's create a rune which lets a specific peer run listpeers on themselves:" ], "request": { "id": "example:createrune#6", "method": "createrune", "params": { - "rune": "fTQnfL05coEbiBO8SS0cvQwCcPLxE9c02pZCC6HRVEY9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5Mw==", "restrictions": [ [ - "time<'$(($(date +%s) + 24*60*60))'", - "rate=2" + "id=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + ], + [ + "method=listpeers" + ], + [ + "pnum=1" + ], + [ + "pnameid=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "parr0=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ] ] } }, "response": { - "rune": "tU-RLjMiDpY2U0o3W1oFowar36RFGpWloPbW9-RuZdo9MyZpZD0wMjRiOWExZmE4ZTAwNmYxZTM5MzdmNjVmNjZjNDA4ZTZkYThlMWNhNzI4ZWE0MzIyMmE3MzgxZGYxY2M0NDk2MDUmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjRiOWExZmE4ZTAwNmYxZTM5M3xwYXJyMF4wMjRiOWExZmE4ZTAwNmYxZTM5MyZ0aW1lPDE2NTY5MjA1MzgmcmF0ZT0y", - "unique_id": "5" + "rune": "jEx3l0c7NMZPSDYT7xnXXvNA83z5PDNBHRQTIk1BwNw9MyZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTh8cGFycjA9MDI2NmU0NTk4ZDFkM2M0MTVmNTcyYTg0ODg4MzBiNjBmN2U3NDRlZDkyMzVlYjBiMWJhOTMyODNiMzE1YzAzNTE4", + "unique_id": "3" } }, { "description": [ - "This will allow the rune to be used for id starting with 022d223620a359a47ff7, and for the method listpeers:" + "This allows `listpeers` with 1 argument (`pnum=1`), which is either by name (`pnameid`), or position (`parr0`). We could shorten this in several ways: either allowing only positional or named parameters, or by testing the start of the parameters only. Here's an example which only checks the first 10 bytes of the `listpeers` parameter:" ], "request": { "id": "example:createrune#7", @@ -333,40 +327,46 @@ "params": { "restrictions": [ [ - "id^022d223620a359a47ff7" + "id=0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ], [ "method=listpeers" + ], + [ + "pnum=1" + ], + [ + "pnameid^0266e4598d1d3c415f57", + "parr0^0266e4598d1d3c415f57" ] ] } }, "response": { - "rune": "YPojv9qgHPa3im0eiqRb-g8aRq76OasyfltGGqdFUOU9MyZpZF4wMjJkMjIzNjIwYTM1OWE0N2ZmNyZtZXRob2Q9bGlzdHBlZXJz", - "unique_id": "6" + "rune": "8_CRIJ4arWAz72A4ILOZ46MESSJtQQQ9iQZjU28qulA9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + "unique_id": "4" } }, { "description": [ - "This will allow the rune to be used for the method pay, and for the parameter amount\\_msat to be less than 10000:" + "Before we give this to our peer, let's add two more restrictions: that it only be usable for 24 hours from now (`time<`), and that it can only be used twice a minute (`rate=2`). `date +%s` can give us the current time in seconds:" ], "request": { "id": "example:createrune#8", "method": "createrune", - "params": { - "restrictions": [ - [ - "method=pay" - ], + "params": [ + "8_CRIJ4arWAz72A4ILOZ46MESSJtQQQ9iQZjU28qulA9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + [ [ - "pnameamountmsat<10000" + "time<\"$(($(date +%s) + 24*60*60))\"", + "rate=2" ] ] - } + ] }, "response": { - "rune": "b3hXuEM7Pqzk-C7HUw83xzvHOV7fmuGaWjdo-wHdfg89MCZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", - "unique_id": "7" + "rune": "GJb2PC-4jYslzIVz6-425bOtpkz_A_zaEhekPlrXdj09NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZ0aW1lPCIkKCgkKGRhdGUgKyVzKSArIDI0KjYwKjYwKSkifHJhdGU9Mg==", + "unique_id": "4" } } ] diff --git a/doc/schemas/lightning-datastore.json b/doc/schemas/lightning-datastore.json index b5227210ad21..2e33fc4fe8db 100644 --- a/doc/schemas/lightning-datastore.json +++ b/doc/schemas/lightning-datastore.json @@ -130,70 +130,81 @@ "request": { "id": "example:datastore#1", "method": "datastore", + "params": { + "key": "somekey", + "hex": "61", + "mode": "create-or-append" + } + }, + "response": { + "key": [ + "somekey" + ], + "generation": 0, + "hex": "61", + "string": "a" + } + }, + { + "request": { + "id": "example:datastore#2", + "method": "datastore", "params": { "key": [ - "test_libplugin", + "test", "name" ], - "string": "foobar", - "mode": "must-replace" + "string": "saving data to the store", + "mode": "must-create" } }, "response": { "key": [ - "test_libplugin", + "test", "name" ], - "generation": 1, - "hex": "666f6f626172", - "string": "foobar" + "generation": 0, + "hex": "736176696e67206461746120746f207468652073746f7265", + "string": "saving data to the store" } }, { "request": { - "id": "example:datastore#2", + "id": "example:datastore#3", "method": "datastore", "params": { - "key": "somekey", - "hex": "61", - "mode": "create-or-append" + "key": "otherkey", + "string": "foo", + "mode": "must-create" } }, "response": { "key": [ - "somekey" + "otherkey" ], - "generation": 3, - "hex": "736f6d6564617461", - "string": "somedata" + "generation": 0, + "hex": "666f6f", + "string": "foo" } }, { "request": { - "id": "example:datastore#3", + "id": "example:datastore#4", "method": "datastore", "params": { - "key": [ - "a", - "d", - "e", - "f", - "g" - ], - "string": "somedatatostoreinthedatastore" + "key": "otherkey", + "string": "bar", + "mode": "must-append", + "generation": 0 } }, "response": { "key": [ - "a", - "d", - "e", - "f", - "g" + "otherkey" ], - "generation": 0, - "hex": "736f6d6564617461746f73746f7265696e7468656461746173746f7265", - "string": "somedatatostoreinthedatastore" + "generation": 1, + "hex": "666f6f626172", + "string": "foobar" } } ] diff --git a/doc/schemas/lightning-datastoreusage.json b/doc/schemas/lightning-datastoreusage.json index f16554c62665..f700a4917a1f 100644 --- a/doc/schemas/lightning-datastoreusage.json +++ b/doc/schemas/lightning-datastoreusage.json @@ -83,7 +83,7 @@ "response": { "datastoreusage": { "key": "[]", - "total_bytes": 0 + "total_bytes": 55 } } }, @@ -92,13 +92,16 @@ "id": "example:datastoreusage#2", "method": "datastoreusage", "params": { - "key": "a" + "key": [ + "test", + "name" + ] } }, "response": { "datastoreusage": { - "key": "[a]", - "total_bytes": 32 + "key": "[test,name]", + "total_bytes": 33 } } }, @@ -107,16 +110,13 @@ "id": "example:datastoreusage#3", "method": "datastoreusage", "params": { - "key": [ - "a", - "thisissomelongkeythattriestostore46bytesofdata" - ] + "key": "otherkey" } }, "response": { "datastoreusage": { - "key": "[a,thisissomelongkeythattriestostore46bytesofdata]", - "total_bytes": 77 + "key": "[otherkey]", + "total_bytes": 14 } } } diff --git a/doc/schemas/lightning-decode.json b/doc/schemas/lightning-decode.json index aa0dba2decc1..0523f2def593 100644 --- a/doc/schemas/lightning-decode.json +++ b/doc/schemas/lightning-decode.json @@ -71,9 +71,7 @@ }, "then": { "required": [ - "offer_id", - "offer_node_id", - "offer_description" + "offer_id" ], "additionalProperties": false, "properties": { @@ -237,10 +235,28 @@ } } }, + "warning_empty_blinded_path": { + "added": "v24.08", + "type": "string", + "description": [ + "The blinded path has 0 hops." + ] + }, "offer_node_id": { "type": "pubkey", + "deprecated": [ + "v24.08", + "v24.11" + ], "description": [ - "Public key of the offering node." + "Obsolete name for offer_issuer_id." + ] + }, + "offer_issuer_id": { + "type": "pubkey", + "added": "v24.08", + "description": [ + "The pubkey associated with the offer (can be a node id)." ] }, "offer_recurrence": { @@ -408,10 +424,21 @@ "recurrence": {}, "warning_missing_offer_node_id": { "type": "string", + "deprecated": [ + "v24.08", + "v24.11" + ], "description": [ "`offer_node_id` is not present." ] }, + "warning_missing_offer_issuer_id": { + "type": "string", + "added": "v24.08", + "description": [ + "`offer_issuer_id` is not present and there are no offer_paths" + ] + }, "warning_invalid_offer_description": { "type": "string", "description": [ @@ -458,8 +485,6 @@ }, "then": { "required": [ - "offer_node_id", - "offer_description", "invreq_metadata", "invreq_payer_id", "signature" @@ -630,10 +655,21 @@ }, "offer_node_id": { "type": "pubkey", + "deprecated": [ + "v24.08", + "v24.11" + ], "description": [ "Public key of the offering node." ] }, + "offer_issuer_id": { + "type": "pubkey", + "added": "v24.08", + "description": [ + "Public key of the offering node (can be a node id)." + ] + }, "offer_recurrence": { "type": "object", "description": [ @@ -762,6 +798,82 @@ "A note attached by the payer." ] }, + "invreq_paths": { + "type": "array", + "added": "v24.08", + "description": [ + "Paths to the destination." + ], + "items": { + "type": "object", + "required": [ + "blinding", + "path" + ], + "additionalProperties": false, + "properties": { + "first_node_id": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "The (presumably well-known) public key of the start of the path." + ] + }, + "first_scid": { + "added": "v24.08", + "type": "short_channel_id", + "description": [ + "the short channel id of the start of the path (alternative to first_node_id)" + ] + }, + "first_scid_dir": { + "added": "v24.08", + "type": "u32", + "description": [ + "which end of the first_scid is the start of the path" + ] + }, + "blinding": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "Blinding factor for this path." + ] + }, + "path": { + "type": "array", + "added": "v24.08", + "description": [ + "An individual path." + ], + "items": { + "type": "object", + "required": [ + "blinded_node_id", + "encrypted_recipient_data" + ], + "additionalProperties": false, + "properties": { + "blinded_node_id": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "Node_id of the hop." + ] + }, + "encrypted_recipient_data": { + "added": "v24.08", + "type": "hex", + "description": [ + "Encrypted TLV entry for this hop." + ] + } + } + } + } + } + } + }, "invreq_recurrence_counter": { "type": "u32", "description": [ @@ -856,6 +968,7 @@ "offer_quantity_max": {}, "offer_paths": {}, "offer_node_id": {}, + "offer_issuer_id": {}, "offer_recurrence": {}, "invreq_metadata": {}, "invreq_payer_id": {}, @@ -864,6 +977,7 @@ "invreq_features": {}, "invreq_quantity": {}, "invreq_payer_note": {}, + "invreq_paths": {}, "invreq_recurrence_counter": {}, "invreq_recurrence_start": {}, "warning_invalid_offer_description": { @@ -942,8 +1056,6 @@ }, "then": { "required": [ - "offer_node_id", - "offer_description", "invreq_metadata", "invreq_payer_id", "invoice_paths", @@ -1118,10 +1230,21 @@ }, "offer_node_id": { "type": "pubkey", + "deprecated": [ + "v24.08", + "v24.11" + ], "description": [ "Public key of the offering node." ] }, + "offer_issuer_id": { + "type": "pubkey", + "added": "v24.08", + "description": [ + "Public key of the offering node (can be a node id)." + ] + }, "offer_recurrence": { "type": "object", "description": [ @@ -1250,6 +1373,82 @@ "A note attached by the payer." ] }, + "invreq_paths": { + "type": "array", + "added": "v24.08", + "description": [ + "Paths to the destination." + ], + "items": { + "type": "object", + "required": [ + "blinding", + "path" + ], + "additionalProperties": false, + "properties": { + "first_node_id": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "The (presumably well-known) public key of the start of the path." + ] + }, + "first_scid": { + "added": "v24.08", + "type": "short_channel_id", + "description": [ + "the short channel id of the start of the path (alternative to first_node_id)" + ] + }, + "first_scid_dir": { + "added": "v24.08", + "type": "u32", + "description": [ + "which end of the first_scid is the start of the path" + ] + }, + "blinding": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "Blinding factor for this path." + ] + }, + "path": { + "type": "array", + "added": "v24.08", + "description": [ + "An individual path." + ], + "items": { + "type": "object", + "required": [ + "blinded_node_id", + "encrypted_recipient_data" + ], + "additionalProperties": false, + "properties": { + "blinded_node_id": { + "added": "v24.08", + "type": "pubkey", + "description": [ + "Node_id of the hop." + ] + }, + "encrypted_recipient_data": { + "added": "v24.08", + "type": "hex", + "description": [ + "Encrypted TLV entry for this hop." + ] + } + } + } + } + } + } + }, "invreq_recurrence_counter": { "type": "u32", "description": [ @@ -1438,7 +1637,7 @@ "invoice_node_id": { "type": "pubkey", "description": [ - "The id to pay (usually the same as offer_node_id)." + "The id to pay (usually the same as offer_issuer_id)." ] }, "invoice_recurrence_basetime": { @@ -1450,7 +1649,7 @@ "signature": { "type": "bip340sig", "description": [ - "BIP-340 signature of the `offer_node_id` on this invoice." + "BIP-340 signature of the `offer_issuer_id` on this invoice." ] }, "unknown_invoice_tlvs": { @@ -1529,6 +1728,7 @@ "offer_quantity_max": {}, "offer_paths": {}, "offer_node_id": {}, + "offer_issuer_id": {}, "offer_recurrence": {}, "invreq_metadata": {}, "invreq_payer_id": {}, @@ -1537,6 +1737,7 @@ "invreq_features": {}, "invreq_quantity": {}, "invreq_payer_note": {}, + "invreq_paths": {}, "invreq_node_id": {}, "invreq_recurrence_counter": {}, "invreq_recurrence_start": {}, @@ -2085,29 +2286,14 @@ "id": "example:decode#1", "method": "decode", "params": [ - "zm0x_eLgHexaTvZn3Cz7gb_YlvrlYGDo_w4BYlR9SS09MSZtZXRob2RebGlzdHxtZXRob2ReZ2V0fG1ldGhvZD1zdW1tYXJ5Jm1ldGhvZC9saXN0ZGF0YXN0b3Jl" + "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==" ] }, "response": { "type": "rune", - "unique_id": "1", - "string": "ce6d31fde2e01dec5a4ef667dc2cfb81bfd896fae56060e8ff0e0162547d492d:=1&method^list|method^get|method=summary&method/listdatastore", - "restrictions": [ - { - "alternatives": [ - "method^list", - "method^get", - "method=summary" - ], - "summary": "method (of command) starts with 'list' OR method (of command) starts with 'get' OR method (of command) equal to 'summary'" - }, - { - "alternatives": [ - "method/listdatastore" - ], - "summary": "method (of command) unequal to 'listdatastore'" - } - ], + "unique_id": "0", + "string": "cc531dd5f8e1ac063151e140e784e396866a3adf09ac0fe2fe76302205e46a0e:=0", + "restrictions": [], "valid": true } }, @@ -2116,33 +2302,33 @@ "id": "example:decode#2", "method": "decode", "params": [ - "lnbcrt1m1pja0f2hsp5xyssdvdsu24dmmesrt6x84wfrm4mscsnzq7hl2suzeu90wy6g53qpp5zyyu3anwfsfl64pewe0tg7j28map2wwnhvaam5nt70rlwxa0cegqdqjv3jhxcmjd9c8g6t0dcxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqvuqqqqgqqqqqqqlgqqqq86qqqc9qxpqysgq7u4f99u4kepagme27t5c3gdl7czlnjaw7kxryxgm87w2j02j3g94r2vrukhpgedhcdkcdec27m7jrl2lvcr6uh3rdv9lgpz0vc0zcfcqnugjdw" + "lnbcrt2u1pn2s3xxsp5cpcdj2cy5wpd2nphp2evrp9kqymxf9434zftkmdd6dlgmy8cu78qpp58yq5qf3h0694xwymzjs5e8eejce83vjmxv6cpwqv8cs9e05dxe4qdqcdserygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq9wlpxf8ur0q798646w94tduf6wfkaw7m0ecmxepgatd4utvsyvcy0pku9t8m39rlsjzhe8x53mup5jkn0f84clfj3ctc6qj09t35wxspycpup2" ] }, "response": { "type": "bolt11 invoice", "currency": "bcrt", - "created_at": 1708631383, + "created_at": 1722303686, "expiry": 604800, - "payee": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "amount_msat": 100000000, - "description": "description", + "payee": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "amount_msat": 200000, + "description": "l22 description", "min_final_cltv_expiry": 5, - "payment_secret": "312106b1b0e2aaddef301af463d5c91eebb86213103d7faa1c167857b89a4522", + "payment_secret": "c070d92b04a382d54c370ab2c184b601366496b1a892bb6dadd37e8d90f8e78e", "features": "02024100", "routes": [ [ { - "pubkey": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "short_channel_id": "103x1x0", - "fee_base_msat": 1000, - "fee_proportional_millionths": 1000, + "pubkey": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "111x1x0", + "fee_base_msat": 1, + "fee_proportional_millionths": 10, "cltv_expiry_delta": 6 } ] ], - "payment_hash": "1109c8f66e4c13fd5439765eb47a4a3efa1539d3bb3bddd26bf3c7f71bafc650", - "signature": "3045022100f72a929795b643d46f2af2e988a1bff605f9cbaef58c32191b3f9ca93d528a0b022051a983e5ae1465b7c36d86e70af6fd21fd5f6607ae5e236b0bf4044f661e2c27", + "payment_hash": "39014026377e8b53389b14a14c9f39963278b25b333580b80c3e205cbe8d366a", + "signature": "304402202bbe1324fc1bc1e29f55d38b55b789d3936ebbdb7e71b36428eadb5e2d90233002204786dc2acfb8947f84857c9cd48ef81a4ad37a4f5c7d328e178d024f2ae3471a", "valid": true } } diff --git a/doc/schemas/lightning-decodepay.json b/doc/schemas/lightning-decodepay.json index ac83cf602482..5a31a934b5c9 100644 --- a/doc/schemas/lightning-decodepay.json +++ b/doc/schemas/lightning-decodepay.json @@ -266,23 +266,32 @@ "id": "example:decodepay#1", "method": "decodepay", "params": { - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk" + "bolt11": "lnbcrt100n1pn2s3xxsp5s4wvy67lduz0tpxzmw0x0m8z5krfn6ppeu3a9t559tcdxquqwjfqpp5r0zx30ded4lpxp7vrdxqenmwr9rqftn93dcymvmuaxpu8y5zxunqdqcdscnzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqyk0lnqhsl07405jsqzyyaheu3dhxdv6s498ex97yvacs04gf6carplepnh5drlse8spy8nluz4uwj78h47ez6hak9md2s8mtg6yy5tcqt8yfsj" } }, "response": { "currency": "bcrt", - "created_at": 1706152930, + "created_at": 1722303686, "expiry": 604800, - "payee": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 11000000, - "description": [ - "XEoCR94SIz6UIRUEkxum." - ], + "payee": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "amount_msat": 10000, + "description": "l11 description", "min_final_cltv_expiry": 5, - "payment_secret": "82644944d3f70d42aad1d5f7b5d7a629e7afa30b529cc952a4c59fc0e3790ea2", + "payment_secret": "855cc26bdf6f04f584c2db9e67ece2a58699e821cf23d2ae942af0d303807492", "features": "02024100", - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", - "signature": "3045022100e3b7d8886eae1a7c9e55e1797aa0dcb77b8c5a19d56c657cad030e360c90682802203a35713acb098245e53a37faeac98754a29a7078db5ed6f2166f917e55b94484" + "routes": [ + [ + { + "pubkey": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "short_channel_id": "109x1x1", + "fee_base_msat": 1, + "fee_proportional_millionths": 10, + "cltv_expiry_delta": 6 + } + ] + ], + "payment_hash": "1bc468bdb96d7e1307cc1b4c0ccf6e194604ae658b704db37ce983c392823726", + "signature": "30440220259ff982f0fbfd57d25000884edf3c8b6e66b350a94f9317c4677107d509d63a022030ff219de8d1fe193c0243cffc1578e978f7afb22d5fb62edaa81f6b46884a2f" } } ] diff --git a/doc/schemas/lightning-deldatastore.json b/doc/schemas/lightning-deldatastore.json index 9fd0210dddf3..1b15c3766069 100644 --- a/doc/schemas/lightning-deldatastore.json +++ b/doc/schemas/lightning-deldatastore.json @@ -96,17 +96,20 @@ "id": "example:deldatastore#1", "method": "deldatastore", "params": { - "key": "otherkey", - "generation": 1 + "key": [ + "test", + "name" + ] } }, "response": { "key": [ - "otherkey" + "test", + "name" ], - "generation": 1, - "hex": "6f746865726461746161", - "string": "otherdataa" + "generation": 0, + "hex": "736176696e67206461746120746f207468652073746f7265", + "string": "saving data to the store" } }, { @@ -114,18 +117,17 @@ "id": "example:deldatastore#2", "method": "deldatastore", "params": { - "key": [ - "a" - ] + "key": "otherkey", + "generation": 1 } }, "response": { "key": [ - "a" + "otherkey" ], - "generation": 0, - "hex": "6176616c", - "string": "aval" + "generation": 1, + "hex": "666f6f626172", + "string": "foobar" } } ] diff --git a/doc/schemas/lightning-delforward.json b/doc/schemas/lightning-delforward.json index 5e1e0c7c0f31..671795446a4d 100644 --- a/doc/schemas/lightning-delforward.json +++ b/doc/schemas/lightning-delforward.json @@ -65,8 +65,8 @@ "id": "example:delforward#1", "method": "delforward", "params": { - "in_channel": "103x1x0", - "in_htlc_id": 2, + "in_channel": "109x1x1", + "in_htlc_id": 4, "status": "local_failed" } }, @@ -77,8 +77,8 @@ "id": "example:delforward#2", "method": "delforward", "params": [ - "103x1x0", - 1, + "109x1x1", + 19, "failed" ] }, diff --git a/doc/schemas/lightning-delinvoice.json b/doc/schemas/lightning-delinvoice.json index 6ab880079aa9..66e492503ef5 100644 --- a/doc/schemas/lightning-delinvoice.json +++ b/doc/schemas/lightning-delinvoice.json @@ -295,19 +295,19 @@ "id": "example:delinvoice#1", "method": "delinvoice", "params": { - "label": "invlabel2", - "status": "unpaid", - "desconly": true + "label": "lbl_l36", + "status": "unpaid" } }, "response": { - "label": "invlabel2", - "bolt11": "lnbcrt420p1pja0tefsp5vvzg40t4g24l0eqk0jch7mc6jm3ec52ts8w8gwzpwtx9c8nv05rspp533e9csxurt7j9sn2cx7hsn6m00475qgrau8sux5r7djpdedwy2fshp5xqsmrtgfcwsnhxcxmf3tuc65kl6fxvqhvujfmxw2kpeh95yy2x8sxqyjw5qcqp99qxpqysgqgfjrz4q5zcq2lluxxg9h475mq2d3w0tpdstm5274zmhadjl8cqapylfskzk96apka5599a2flm90rmavsk7q8mhh87yle3sgh5vrlycq72fern", - "payment_hash": "8c725c40dc1afd22c26ac1bd784f5b7bebea0103ef0f0e1a83f36416e5ae2293", - "amount_msat": 42, + "label": "lbl_l36", + "bolt11": "lnbcrt500u1pn2s3fwsp5e6nltgzk3yqn5033r6z2q32pzduys3zs5dtzc5cjs60ppcgytrsqpp5ykhhcxzcqeng2gfggmsdja3x8h0qmkl35lw9z7n99pfkg8w0s8asdqcdsenvgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqwn7uwmy3x8u9c4ea0ka0yp3qvs0w9m7459g65kalm553vusctq8kseaph7tav4ryjfghnhu0ggjhhkrqmafarqkdsrzsk8stcvdmpmcqwfsajc", + "payment_hash": "25af7c1858066685212846e0d976263dde0ddbf1a7dc517a652853641dcf81fb", + "amount_msat": 50000000, "status": "unpaid", - "expires_at": 1709238697, - "created_index": 3 + "description": "l36 description", + "expires_at": 1722908590, + "created_index": 9 } }, { @@ -315,23 +315,24 @@ "id": "example:delinvoice#2", "method": "delinvoice", "params": { - "label": "keysend-1708640419.666098582", - "status": "paid" + "label": "lbl_l37", + "status": "paid", + "desconly": true } }, "response": { - "label": "keysend-1708640419.666098582", - "bolt11": "lnbcrt1pja0j9rsp5tg3zvj846gcdzw394njazq40s946sq2ur3hkl4xu4xudtjdtckxspp5fuunrfzsnyz2uxjmg2n95mqhghv4fpvv2kud3kvq4fkys3vmzu5sdqvddjhjum9dejqxqyjw5qcqp99qxpqysgqwt7r0gjlgt7zrfldc3um9myfc36acpqnsdn77c2m42facjtps30yufc5nsmwzhgexlj59f6xa5hess6e3tqrxynt9fejzj3rrshddtcqnappmj", - "payment_hash": "4f3931a4509904ae1a5b42a65a6c1745d954858c55b8d8d980aa6c48459b1729", + "label": "lbl_l37", + "bolt11": "lnbcrt500u1pn2s3fwsp5g96a3t3kn2we3ulrepd8eg4nw900wc324r06zlpr8py7p4zyftrspp5ggs9vzev5gcgthdysjrk0pcjgl3r5fwy4zgw6m48kk9nwx4h9slqdqcdsenwgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqwkmgxwugmtjvf9cu324h87x5ux3cwa6glefyfxvergy3mw8gwtnzg05mrf69yz0dafk4n7u7asaxh2nx5jsylwvqttzxmr9krpc9rlsquhqkt4", + "payment_hash": "4220560b2ca23085dda4848767871247e23a25c4a890ed6ea7b58b371ab72c3e", + "amount_msat": 50000000, "status": "paid", - "pay_index": 1, - "amount_received_msat": 10000000, - "paid_at": 1708640419, - "payment_preimage": "b760af47f456a217e8dfda21a282f1f78c903487c1b21b3b318135f75aa3bf11", - "description": "keysend", - "expires_at": 1709245219, - "created_index": 1, - "updated_index": 1 + "pay_index": 9, + "amount_received_msat": 50000000, + "paid_at": 1722303802, + "payment_preimage": "e876ca5ae4ed9897178b2b3a17997256ad669335eb9201e05e3c97ffb83c634b", + "expires_at": 1722908590, + "created_index": 10, + "updated_index": 9 } } ] diff --git a/doc/schemas/lightning-delpay.json b/doc/schemas/lightning-delpay.json index 777f7110fa07..4d900f71e981 100644 --- a/doc/schemas/lightning-delpay.json +++ b/doc/schemas/lightning-delpay.json @@ -212,24 +212,26 @@ "id": "example:delpay#1", "method": "delpay", "params": { - "payment_hash": "4fa2f1b001067ec06d7f95b8695b8acd9ef04c1b4d1110e3b94e1fa0687bb1e0", + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", "status": "complete" } }, "response": { "payments": [ { + "created_index": 1, "id": 1, - "payment_hash": "8dfd6538eeb33811c9114a75f792a143728d7f05643f38c3d574d3097e8910c0", - "destination": "0219f8900ee78a89f050c24d8b69492954f9fdbabed753710845eb75d3a75a5880", - "msatoshi": 1000, - "amount_msat": "1000msat", - "msatoshi_sent": 1000, - "amount_sent_msat": "1000msat", - "created_at": 1596224858, + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", + "groupid": 1, + "updated_index": 1, + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "amount_msat": 500000000, + "amount_sent_msat": 500000000, + "created_at": 1722303670, + "completed_at": 1722303671, "status": "complete", - "payment_preimage": "35bd4e2b481a1a84a22215b5372672cf81460a671816960ddb206464359e1822", - "bolt11": "lntb10n1p0jga20pp53h7k2w8wkvuprjg3ff6l0y4pgdeg6lc9vsln3s74wnfsjl5fzrqqdqdw3jhxazldahx2xqyjw5qcqp2sp5wut5jnhr6n7jd5747ky2g5flmw7hgx9yjnqzu60ps2jf6f7tc0us9qy9qsqu2a0k37nckl62005p69xavlkydkvhnypk4dphffy4x09zltwh9437ad7xkl83tefdarzhu5t30ju5s56wlrg97qkx404pq3srfc425cq3ke9af" + "payment_preimage": "bed4140e1db302720d7f9547dc9127d45b115080447cce7e23cfd00b60991831", + "bolt11": "lnbcrt5m1pn2s39ksp53sknyy2mxxurt4y0wqgp730z0cnm0vz3zmzth8p79xsrtmg5llxspp5dp94v59nm6c99jf7lc07zmnhqw6kyujx3mkdav7643dczgtdedfqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcvfqw3hjqmpjxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqdz9cftkxe6kcqfddyrvr7j57ulsfxxxkgkjyhr3k77n8v59mzs5rmuexz9lxusyhhehlemd9ujclgahln8e0n8y86stc7u8uys6mjqgqerm6q4" } ] } @@ -239,25 +241,25 @@ "id": "example:delpay#2", "method": "delpay", "params": [ - "c9d4547473d0d646f1fdd8ca7f01803e4d31ceab01df33c79456f9c24b04034e", + "25af7c1858066685212846e0d976263dde0ddbf1a7dc517a652853641dcf81fb", "failed" ] }, "response": { "payments": [ { - "created_index": 2, - "id": 2, - "payment_hash": "c9d4547473d0d646f1fdd8ca7f01803e4d31ceab01df33c79456f9c24b04034e", + "created_index": 20, + "id": 20, + "payment_hash": "25af7c1858066685212846e0d976263dde0ddbf1a7dc517a652853641dcf81fb", "groupid": 1, - "updated_index": 2, + "updated_index": 19, "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "amount_msat": 100000, - "amount_sent_msat": 100002, - "created_at": 1706316468, - "completed_at": 1706316471, + "amount_msat": 50000000, + "amount_sent_msat": 50000501, + "created_at": 1722303803, + "completed_at": 1722303806, "status": "failed", - "bolt11": "lnbcrt1u1pjmg54nsp5ke626txv6wwwmqmpuy63t3jnu9hqxwj880zsfkkj7jjqagdaz2sqpp5e829garn6rtydu0amr987qvq8exnrn4tq80n83u52muuyjcyqd8qdq8v3jhxccxqyjw5qcqp99qxpqysgqalktfwy9svsamvvvrzzzzpdaa4rh7n6s5p7t9lx7qv0raz4vnm9knkh5ury3u5cmnhx2gms98nxkclm3833uhjrlnzmftc685vz2f0gpfnjy4y" + "bolt11": "lnbcrt500u1pn2s3fwsp5e6nltgzk3yqn5033r6z2q32pzduys3zs5dtzc5cjs60ppcgytrsqpp5ykhhcxzcqeng2gfggmsdja3x8h0qmkl35lw9z7n99pfkg8w0s8asdqcdsenvgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqwn7uwmy3x8u9c4ea0ka0yp3qvs0w9m7459g65kalm553vusctq8kseaph7tav4ryjfghnhu0ggjhhkrqmafarqkdsrzsk8stcvdmpmcqwfsajc" } ] } @@ -267,28 +269,27 @@ "id": "example:delpay#3", "method": "delpay", "params": { - "payment_hash": "bbc35e0a46d1483292a4ff8d4daaceaab8c3c084dd835be4128785b52e469c64", - "status": "complete", + "payment_hash": "647252f7e45fce7bb964523206874f40f58fbb7b208bc08967caa0e2404990c9", + "status": "failed", "groupid": 1, - "partid": 1 + "partid": 2 } }, "response": { "payments": [ { - "created_index": 3, - "id": 3, - "payment_hash": "bbc35e0a46d1483292a4ff8d4daaceaab8c3c084dd835be4128785b52e469c64", + "created_index": 17, + "id": 17, + "payment_hash": "647252f7e45fce7bb964523206874f40f58fbb7b208bc08967caa0e2404990c9", "groupid": 1, - "updated_index": 3, - "partid": 1, - "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "amount_msat": 100000, - "amount_sent_msat": 102100, - "created_at": 1708641193, - "completed_at": 1708641194, - "status": "complete", - "payment_preimage": "a6ebb1cfbf69e76200f196f1eafd28a3d850633499c223a7eb7a7dba3b995286" + "updated_index": 16, + "partid": 2, + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "amount_msat": 1000000, + "amount_sent_msat": 1000000, + "created_at": 1722303798, + "completed_at": 1722303799, + "status": "failed" } ] } diff --git a/doc/schemas/lightning-deprecations.json b/doc/schemas/lightning-deprecations.json index 5a4a777cd259..dc769df4c185 100644 --- a/doc/schemas/lightning-deprecations.json +++ b/doc/schemas/lightning-deprecations.json @@ -44,6 +44,16 @@ "request": { "id": "example:deprecations#1", "method": "deprecations", + "params": { + "enable": true + } + }, + "response": {} + }, + { + "request": { + "id": "example:deprecations#2", + "method": "deprecations", "params": { "enable": false } diff --git a/doc/schemas/lightning-dev-forget-channel.json b/doc/schemas/lightning-dev-forget-channel.json index e6ed557e8bd1..d25477d3dbf0 100644 --- a/doc/schemas/lightning-dev-forget-channel.json +++ b/doc/schemas/lightning-dev-forget-channel.json @@ -92,39 +92,38 @@ "examples": [ { "description": [ - "Forget a channel by peer pubkey when only one channel exists with the peer." + "Forget a channel by peer pubkey when only one channel exists with the peer:" ], "request": { "id": "example:dev-forget-channel#1", "method": "dev-forget-channel", "params": { - "id": "023d28435ce4b49f068c964aacbcb6dd114317a70f03e5a731ea72d25df1cff35b" - }, - "test": "test" + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e" + } }, "response": { "forced": false, - "funding_unspent": true, - "funding_txid": "g6efdfb11bee25aa8b2249055a4162e4bd5fa9134bc865c3f054ca666d7ab744" + "funding_unspent": false, + "funding_txid": "c40c9d52aaac47f76c67163a2efc005df189b36b855b0ad209da7d0d066358b1" } }, { "description": [ - "Forget a channel by short channel id when peer has multiple channels." + "Forget a channel by short channel id when peer has multiple channels:" ], "request": { "id": "example:dev-forget-channel#2", "method": "dev-forget-channel", "params": { - "id": "0348e58210bbc128b1cc3cc1a520a654aaa01e5fe65c65341e21b61a1f09da94d5", - "short_channel_id": "337x1x0", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "111x1x0", "force": true } }, "response": { "forced": true, - "funding_unspent": true, - "funding_txid": "b254f30a58adde9326b7e8a701f9d5b3c4db2160b58c5378afbe04448018ec8a" + "funding_unspent": false, + "funding_txid": "cd23f0517eefc27194981253eb07b19b055246df77033e052c66eaf2bbb00483" } } ] diff --git a/doc/schemas/lightning-disableinvoicerequest.json b/doc/schemas/lightning-disableinvoicerequest.json index cc971a05cb8a..e0cf5f50b1bb 100644 --- a/doc/schemas/lightning-disableinvoicerequest.json +++ b/doc/schemas/lightning-disableinvoicerequest.json @@ -86,5 +86,23 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:disableinvoicerequest#1", + "method": "disableinvoicerequest", + "params": { + "invreq_id": "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9" + } + }, + "response": { + "invreq_id": "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9", + "active": false, + "single_use": true, + "bolt12": "lnr1qqgx5t5hcw5ru9fgkhgxj4thjq4ugzsk2fjhzat9wd6xjmn8ypnx7u3qd9h8vmmfvdj3yyrrd35kw6r5de5kueeqwd6x7un92qsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzr6jqwvfdqzcyypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgpvamrunx5t6vdaeu7nmmlh5u6f0dnscasy2alyxq79f5wnc043gxrzyqt640dmuj7c94644j5ae6wfse7tsejwqnmc575ly9t38h4hf", + "used": false + } + } ] } diff --git a/doc/schemas/lightning-disableoffer.json b/doc/schemas/lightning-disableoffer.json index 7c269bbeaebb..cf918670d471 100644 --- a/doc/schemas/lightning-disableoffer.json +++ b/doc/schemas/lightning-disableoffer.json @@ -80,6 +80,7 @@ "Rusty Russell <> is mainly responsible." ], "see_also": [ + "lightning-enableoffer(7)", "lightning-offer(7)", "lightning-listoffers(7)" ], @@ -92,14 +93,14 @@ "id": "example:disableoffer#1", "method": "disableoffer", "params": { - "offer_id": "713a16ccd4eb10438bdcfbc2c8276be301020dd9d489c530773ba64f3b33307d" + "offer_id": "b791f88cebf775853112c30828e116487f4d6c252d669372532b468bc7de8a24" } }, "response": { - "offer_id": "053a5c566fbea2681a5ff9c05a913da23e45b95d09ef5bd25d7d408f23da7084", + "offer_id": "b791f88cebf775853112c30828e116487f4d6c252d669372532b468bc7de8a24", "active": false, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqvqcdgq2z9pk7enxv4jjqen0wgs8yatnw3ujz83qkc6rvp4j28rt3dtrn32zkvdy7efhnlrpr5rp5geqxs783wtlj550qs8czzku4nk3pqp6m593qxgunzuqcwkmgqkmp6ty0wyvjcqdguv3pnpukedwn6cr87m89t74h3auyaeg89xkvgzpac70z3m9rn5xzu28c", + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqv0gfqq2zp8kven9wgs8gmeqg35hxctzd3j3vggz953rvg9rtxj8lalh43z8epwydjfrmffn3y3p5qz5cywpu09rr4vs", "used": false } } diff --git a/doc/schemas/lightning-disconnect.json b/doc/schemas/lightning-disconnect.json index b38f79f461ef..92a2b384b901 100644 --- a/doc/schemas/lightning-disconnect.json +++ b/doc/schemas/lightning-disconnect.json @@ -51,7 +51,7 @@ "id": "example:disconnect#1", "method": "disconnect", "params": { - "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", "force": false } }, @@ -62,7 +62,7 @@ "id": "example:disconnect#2", "method": "disconnect", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", "force": true } }, diff --git a/doc/schemas/lightning-emergencyrecover.json b/doc/schemas/lightning-emergencyrecover.json index b0710ffabfe2..4fe17dde586b 100644 --- a/doc/schemas/lightning-emergencyrecover.json +++ b/doc/schemas/lightning-emergencyrecover.json @@ -57,7 +57,9 @@ }, "response": { "stubs": [ - "c00734472f344fdadd0bf787de182e5cf144ccda5d731b0f7c75befd1f1eff52" + "e13472d6512413eb1bf03b9a0bb391d0e4152fd337fa6d1014e3de5e131918d9", + "f8fc83a432cbfb2fffe222cc06727fdd977b5dd10ebd6707158e799e6f522d9f", + "1267da6521b372d7c6407a74066f7a3a5bc3489bbda5eb9f0e990e1e913e2eb9" ] } } diff --git a/doc/schemas/lightning-enableoffer.json b/doc/schemas/lightning-enableoffer.json new file mode 100644 index 000000000000..1970df3c335c --- /dev/null +++ b/doc/schemas/lightning-enableoffer.json @@ -0,0 +1,112 @@ +{ + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "disableoffer", + "title": "Command for re-enabling an offer", + "warning": "experimental-offers only", + "description": [ + "The **enableoffer** RPC command enables an offer, after it has been disabled." + ], + "request": { + "required": [ + "offer_id" + ], + "properties": { + "offer_id": { + "type": "hash", + "description": [ + "The id we use to identify this offer." + ] + } + } + }, + "response": { + "required": [ + "offer_id", + "active", + "single_use", + "bolt12", + "used" + ], + "properties": { + "offer_id": { + "type": "hash", + "description": [ + "The merkle hash of the offer." + ] + }, + "active": { + "type": "boolean", + "enum": [ + true + ], + "description": [ + "Whether the offer can produce invoices/payments." + ] + }, + "single_use": { + "type": "boolean", + "description": [ + "Whether the offer is disabled after first successful use." + ] + }, + "bolt12": { + "type": "string", + "description": [ + "The bolt12 string representing this offer." + ] + }, + "used": { + "type": "boolean", + "description": [ + "Whether the offer has had an invoice paid / payment made." + ] + }, + "label": { + "type": "string", + "description": [ + "The label provided when offer was created." + ] + } + }, + "pre_return_value_notes": [ + "Note: the returned object is the same format as **listoffers**." + ] + }, + "errors": [ + "On failure, one of the following error codes may be returned:", + "", + "- -32602: Error in given parameters.", + "- 1006: offer already enabled." + ], + "author": [ + "Rusty Russell <> is mainly responsible." + ], + "see_also": [ + "lightning-offer(7)", + "lightning-disableoffer(7)", + "lightning-listoffers(7)" + ], + "resources": [ + "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:enableoffer#1", + "method": "enableoffer", + "params": { + "offer_id": "713a16ccd4eb10438bdcfbc2c8276be301020dd9d489c530773ba64f3b33307d" + } + }, + "response": { + "offer_id": "053a5c566fbea2681a5ff9c05a913da23e45b95d09ef5bd25d7d408f23da7084", + "active": true, + "single_use": false, + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqvqcdgq2z9pk7enxv4jjqen0wgs8yatnw3ujz83qkc6rvp4j28rt3dtrn32zkvdy7efhnlrpr5rp5geqxs783wtlj550qs8czzku4nk3pqp6m593qxgunzuqcwkmgqkmp6ty0wyvjcqdguv3pnpukedwn6cr87m89t74h3auyaeg89xkvgzpac70z3m9rn5xzu28c", + "used": false + } + } + ] +} diff --git a/doc/schemas/lightning-feerates.json b/doc/schemas/lightning-feerates.json index a6fe23457ff2..fe20ebc2a63d 100644 --- a/doc/schemas/lightning-feerates.json +++ b/doc/schemas/lightning-feerates.json @@ -393,44 +393,44 @@ }, "response": { "perkw": { - "opening": 1000000, - "mutual_close": 26362, - "unilateral_close": 26362, - "unilateral_anchor_close": 1000000, - "penalty": 26362, - "min_acceptable": 3750, - "max_acceptable": 10000000, + "opening": 7500, + "mutual_close": 3750, + "unilateral_close": 11000, + "unilateral_anchor_close": 3750, + "penalty": 7500, + "min_acceptable": 1875, + "max_acceptable": 150000, "floor": 253, "estimates": [ { "blockcount": 2, - "feerate": 1000000, - "smoothed_feerate": 26362 + "feerate": 15000, + "smoothed_feerate": 15000 }, { "blockcount": 6, - "feerate": 1000000, - "smoothed_feerate": 26362 + "feerate": 11000, + "smoothed_feerate": 11000 }, { "blockcount": 12, - "feerate": 1000000, - "smoothed_feerate": 26362 + "feerate": 7500, + "smoothed_feerate": 7500 }, { "blockcount": 100, - "feerate": 1000000, - "smoothed_feerate": 26362 + "feerate": 3750, + "smoothed_feerate": 3750 } ] }, "onchain_fee_estimates": { - "opening_channel_satoshis": 702000, - "mutual_close_satoshis": 17741, - "unilateral_close_satoshis": 1112000, - "unilateral_close_nonanchor_satoshis": 15764, - "htlc_timeout_satoshis": 17478, - "htlc_success_satoshis": 18532 + "opening_channel_satoshis": 5265, + "mutual_close_satoshis": 2523, + "unilateral_close_satoshis": 4170, + "unilateral_close_nonanchor_satoshis": 6578, + "htlc_timeout_satoshis": 7293, + "htlc_success_satoshis": 7733 } } }, @@ -444,12 +444,12 @@ }, "response": { "perkb": { - "opening": 25000, - "mutual_close": 25000, + "opening": 30000, + "mutual_close": 15000, "unilateral_close": 44000, - "unilateral_anchor_close": 25000, - "penalty": 25000, - "min_acceptable": 12500, + "unilateral_anchor_close": 15000, + "penalty": 30000, + "min_acceptable": 7500, "max_acceptable": 600000, "floor": 1012, "estimates": [ @@ -465,15 +465,20 @@ }, { "blockcount": 12, - "feerate": 25000, - "smoothed_feerate": 25000 + "feerate": 30000, + "smoothed_feerate": 30000 + }, + { + "blockcount": 100, + "feerate": 15000, + "smoothed_feerate": 15000 } ] }, "onchain_fee_estimates": { - "opening_channel_satoshis": 4387, - "mutual_close_satoshis": 4206, - "unilateral_close_satoshis": 6578, + "opening_channel_satoshis": 5265, + "mutual_close_satoshis": 2523, + "unilateral_close_satoshis": 4170, "unilateral_close_nonanchor_satoshis": 6578, "htlc_timeout_satoshis": 7293, "htlc_success_satoshis": 7733 diff --git a/doc/schemas/lightning-fetchinvoice.json b/doc/schemas/lightning-fetchinvoice.json index a3442d156441..078a8de402d9 100644 --- a/doc/schemas/lightning-fetchinvoice.json +++ b/doc/schemas/lightning-fetchinvoice.json @@ -190,12 +190,12 @@ "id": "example:fetchinvoice#1", "method": "fetchinvoice", "params": { - "offer": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqypq5zmnd9khqmr9yp6x2um5zcssxhftzxfdlwsnfcgw2sy8t5mxa0ytcdfat2nkdwqvpy9nnsa9mzza", + "offer": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqgn3qzs2ge5hx6pqwdskcefpzcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", "payer_note": "Thanks for the fish!" } }, "response": { - "invoice": "lni1qqgvcm9h7yakcmw4mzazspu8vfgpwq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqgzpg9hx6tdwpkx2gr5v4ehg93pqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky965pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84sggren772kj8mau5jp86nc6fszx48rv7ep0quszyyls8rlld3sshjr94j9z5dpsku6mnypnx7u3qw35x2grxd9eksgdqnqp462c3jt0m5y6wzrj5pp6axehtez7r20265antsrqfpvuu8fwcshgr0tsv8e6829e8xmv7laz0kwhtlx6vtk8q3d6rtthdhtwvnn6j585szquc2t7us8kguxypzasg8ewkakgx2ny5ugks0f32x67sm9e5fms4asqrylajc2dqh8ag55mv5p5ghy3e2z8zwmllle8uu7jsxv5ke8d6rr5h7kthmz7ya0hxp4nt7elvw7vghcl6fgsuqqqqqqqqqqqqqqq9qqqqqqqqqqqqq8fykt06c5sqqqqqpfqyvhtunn4gyzy0lphn4wn6ctzlsajy46wscjcglf3hxcnvlaxqs3ydkhgaklsc42spq2czzq6a9vge9ha6zd8ppe2qsawnvm4u30p484d2we4cpsyskwwr5hvgthcyqyuen02ejwpa9cjjrttvp223yxsqkrwnlaszkhas84w0ape300ued4p75xu3cqtcg0cslsx9fvh7dhdqx565t6wa0alf6u2hug90j2hs", + "invoice": "lni1qqg9g04gczk9ntk4gsjg3aptwykk2q3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssq38zq9q53nfwd5zqumpd3jjz93pqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4j5pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84sggztuesttnr6atmya7afycpsvcg0wnzprn58n54lfhf2ragp0jq0e04j9z5dpsku6mnypnx7u3qw35x2grxd9eksgdqnqpz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336kgr6euj6p39a209zw5kpkftk7h9te69vlmjg0arceagpaajague0zsszqk96htpgqn2wsznaas0zfdtf8v97ryz29jrn7rwgs5687ghgq5jusqr99dtx4jdj9nqpep5zxmynegrg6e7rm2l53ur8043h2yqzldyl5vh08h8ssaeq5jrvw9y24kztlwvc4nwagsuqqqqqqqqqqqqqqq9qqqqqqqqqqqqq8fykt06c5sqqqqqpfqyv65yfedgyqrp2s7qpxpjse8q8796qcrr5xwgfkqjue3urd6rs2rt2f68tk0vl2szyugtqggz953rvg9rtxj8lalh43z8epwydjfrmffn3y3p5qz5cywpu09rr4vlqsy2n7vmpn67ltzrj70znp70sk4m530j5vceq6jhk97h7ttzn09sh8m9gecarrt27v2tux8z6rr06sj9h60r05p4vhkhzsp0xf9ea4jgg", "changes": {} } }, @@ -204,26 +204,13 @@ "id": "example:fetchinvoice#2", "method": "fetchinvoice", "params": { - "offer": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqypq5zmnd9khqmr9yp6x2um5zcssxhftzxfdlwsnfcgw2sy8t5mxa0ytcdfat2nkdwqvpy9nnsa9mzza", - "amount_msat": 3 - } - }, - "response": { - "invoice": "lni1qqg0mfchkz0gkmn8zzu5zaxd0qvlzq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqgzpg9hx6tdwpkx2gr5v4ehg93pqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky965pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84yqgrtqss8d4vgzd3286u9rk0zg9qr7a6z2xm6mjnz9pydztcn0j74tjvch0f5zvqxhftzxfdlwsnfcgw2sy8t5mxa0ytcdfat2nkdwqvpy9nnsa9mzzaqth4fzjqxxmsaxvc4v2urs6hsh6k0e564x00g68vuyp5w7yjedzxvqgr8ltzmj0n7ltxr0tz9rafn9zcy9jldjqfuf20w6gjmr7nj04d360sqvkdwprxn22dlp3xay9yq4nhrw2jm0c8t6r7japhdad6leawxyqzkg92tx8gqxp9f2d8j5k2axta0gr7yr9zrsqqqqqqqqqqqqqqq5qqqqqqqqqqqqqayjedltzjqqqqqq9yq3ja0jwj4qswt3kgs9mxq7gck66x60m5rndykpw3a7hf4ntlp9qe2vgwzzrvcwd2qypmqggrt543ryklhgf5uy89gzr46dnwhj9ux5744fmxhqxqjzeecwja3pwlqsxyjcdwur4hl4qf7nsjgg8euvy45lznufh5kydkwz6llsucuhvwp9ezeggaj3k057ge6ftvaffjkwn6j3y7faeuysrx3m2xccphu65sx", - "changes": {} - } - }, - { - "request": { - "id": "example:fetchinvoice#3", - "method": "fetchinvoice", - "params": { - "offer": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqypq5zmnd9khqmr9yp6x2um5zsqs593pqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4j", + "offer": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqv85ysq2qepk7enxv4j3gqg2zcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", + "amount_msat": 2000000, "quantity": 2 } }, "response": { - "invoice": "lni1qqgd508mv9rpjg2ec8dr8qcslf2cjq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqgzpg9hx6tdwpkx2gr5v4ehg9qppgtzzq3dygmzpg6e53ll0aavg37gt3rvjg762vufygdqq4xprs0regcat9gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02cqsykppqfkyy6q8ry9pchxtuajh456hhcf7dxx733cx76etuv5ftfmfa2ymhgycqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jq6uhkeymz26zx7zgw4gdmw2vj9xqn4hu2sqxhp0pcgt87pf9chyfvqsywtejxjh603kx7am3zaf6d6xuumw30p8zmcdz7r95nn4lr92exk3qqe2x6xqwpdzh2zwq3vnyra8nfc6d7y6hegpkvc7p2nulj7hvhwl5hjfr23wn60mjftqspn7d4ejhrpsr5m2y8qqqqqqqqqqqqqqqpgqqqqqqqqqqqqp6f9jm7k9yqqqqqq2gpr96l9mt2pqxuyr0gqw92h0xz2y2uy5uxss4ujcac5jehj9ay2sxkapr80t5ha65qgykqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e7pqxhl4u29cjluw5s8fwa9wtvh0qytr7vqk0vtndsz07mrrtmjw629m8mnqkjaf43kt889qeq2f7deu6t853lngpzclapt8nj0g528v9ay", + "invoice": "lni1qqg86u6jfl660zfuk22sexem37r7xq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqc0gfqq5pjrdanxvet9zsqs593pqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4j5pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84yqc7sjq9vqgztqssxq2dwgnpqyhz3j68zx5cts28t6aqfgq937wsgvsmfncau3uhz8t05zvqytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82eq2rdjuqaychg3jndvsjrlu6y08aeuh4ytw6f6ak5n24p5n8zmsz2sqgrg3rg89hqfh6n7dfr0fugvq20ehecd3ezc438l6uh4r8epaakn4lsqv4qgr3ks4yxngyflq339lza456xt8uly085umq3gwql3qyfge0ec03dezeg8xulz33ntlj8yd7dcra9564zrsqqqqqqqqqqqqqqq5qqqqqqqqqqqqqayjedltzjqqqqqq9yq3n2s3894qsfwwvj3szk4yplg4fkw68nwzlwyc23457qx6v7xe38znuha72km6a2qv0gfq9syypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgz2rxjcsxs6s3lnngq9xeqn9pzy53n50p4ulcdvkx8dye7h8xgxpvjyg928m2txk2knl0zzfl7j82c6lq7xqlx83ey7z4aux9pjp4sp7", "changes": {} } } diff --git a/doc/schemas/lightning-fundchannel.json b/doc/schemas/lightning-fundchannel.json index 58363bfc8129..a952ebd2c446 100644 --- a/doc/schemas/lightning-fundchannel.json +++ b/doc/schemas/lightning-fundchannel.json @@ -242,33 +242,15 @@ "id": "example:fundchannel#1", "method": "fundchannel", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", "amount": 1000000, "announce": true } }, "response": { - "tx": "020000000001014ca47b75e6982fce6b5ebb6e7ec163dc5b6bed1562934e6febe816103b2b207e0000000000fdffffff0240420f00000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd012f0f000000000022512063ffee4ea7d51e6cadf9086e286a2527922aaa25b8c53aebf32fa32a0a627f5a02473044022058fc4d51c8254d37b266d3db3f8fda7420882b6ec9226d66b8c0139f2707c09602205798d8ce23d4c692a7384362a2e0afd9703f062239a786d7a1840a28d3a1152e012103d745445c9362665f22e0d96e9e766f273f3260dea39c8a76bfa05dd2684ddccf66000000", - "txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b", - "channel_id": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", - "outnum": 0 - } - }, - { - "request": { - "id": "example:fundchannel#2", - "method": "fundchannel", - "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount": 10000000, - "announce": true, - "push_msat": 1000000000 - } - }, - "response": { - "tx": "0200000000010141cfa0e9957c7c6d0bb5069d92937f9545e6e6ee9b4650f47f509d5ea65df4690100000000fdffffff0280969800000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd4118530b0000000022512063ffee4ea7d51e6cadf9086e286a2527922aaa25b8c53aebf32fa32a0a627f5a0247304402206488c7dfbc4180781ed0d5ca7ff2c8ce134480c349d03978765053a393229d9a022066c75dee1f19b410ea1c7756d0cb2c097e52b13f4d9bbd033efa4ed95d817e14012103d745445c9362665f22e0d96e9e766f273f3260dea39c8a76bfa05dd2684ddccf66000000", - "txid": "6aa1231b6356777468a55aea1f49dad6415592aef6c1e652f8a64357c7235301", - "channel_id": "015323c75743a6f852e6c1f6ae925541d6da491fea5aa568747756631b23a16a", + "tx": "02000000000101a4f6a433b1c2625323c18bc25f880c3e7960722d9ca353d7ff5c2a2132d56a380000000000fdffffff0240420f0000000000220020b41521751a8eb257315f73a531763071cc39b7cece470f630fd5149fe7b7057a816cdc0b00000000225120a5410daebf4fc3cba618a840af497fbec4c3a084534f2b7b6a7d30bf35f8f566024730440220700ee63053ba1fea998685e721016c15cf7809fd77698560230457e122566f220220181aaa01f472ec575edc532bc612c749e7a3829f5616fc3289fd4dc7d96e98d8012102c8a8f25ed135cd671c88bd4e407bb3746678cfacbcf65ce89f8efc2aa0abe53596000000", + "txid": "8326851788c6da23bc883c960affc6126f766348c131eda53d73bc06f0bd90ff", + "channel_id": "1267da6521b372d7c6407a74066f7a3a5bc3489bbda5eb9f0e990e1e913e2eb9", "channel_type": { "bits": [ 12, @@ -284,25 +266,25 @@ }, { "description": [ - "This example shows how to to open new channel with peer 034...4d5 from one whole utxo 961...aeb:1 (you can use **listfunds** command to get txid and vout):" + "This example shows how to to open new channel with peer 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 from one whole utxo c8afe317789f3ecbd52893d2ac08be7499486df5a03c95ad063e395e931eb50a:1 (you can use **listfunds** command to get txid and vout):" ], "request": { - "id": "example:fundchannel#3", + "id": "example:fundchannel#2", "method": "fundchannel", "params": { - "id": "0348e58210bbc128b1cc3cc1a520a654aaa01e5fe65c65341e21b61a1f09da94d5", + "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", "amount": "all", "feerate": "normal", - "push_msat": 1000000000, + "push_msat": 100000, "utxos": [ - "9619a4ccc08512f9520363c7163c95c54723ee8d40802e763a1598fec7bdaaeb:1" + "c8afe317789f3ecbd52893d2ac08be7499486df5a03c95ad063e395e931eb50a:1" ] } }, "response": { - "tx": "02000000000101ebaabdc7fe98153a762e80408dee2347c5953c16c7630352f91285c0cca419960100000000fdffffff02a861000000000000225120b348ab8875cbcfad71e5f3f96e8b3cb25b3495701fb1e06e7f01c70c6e3d7776ec00510200000000220020b71d4d6b2224c9a6b234fde9ca8922ca83be1bc440c08da2156fc3b154c476ff014035ccc897ca0097be7088e397bab0215c967257a25d3efb2d96259d5a7051078b1caaddacc702fced9289d556be70c55bf10fae0bb761526f3d165ff106da140c2f030000", - "txid": "dbeeb2320ddf3ae0bb7887df8226ecdbcec3583ea027a2c1d86bfb167b0f93ea", - "channel_id": "c4e607b4743fa4ee516fd247dbdaf4cb17b8462b2468bd84f15d6f78ac82bf1a", + "tx": "020000000001010ab51e935e393e06ad953ca0f56d489974be08acd29328d5cb3e9f7817e3afc80100000000fdffffff01cbb3eb0b00000000220020752dd5af63b98ff64fedf94683b0306c43f6eec74fbfe917639735b305e1b6d9024730440220431a00efd961f417160bd7180970a61b57c01b7c1e082d41429bb0c4e220d4180220542d0c9a1a59048751364b0ede571117fd8abdbf63d83d67a181c17ea3d3ef9e0121024740cce0e548f4ffe80c9914e43444d8e66ee8991dc9d93ec56dff4c56b933159a000000", + "txid": "20bbe695f309285479e6b63b8ab4346ce66b2db7018485e09d59175cec6156b1", + "channel_id": "222d999f537e32e9458c5db17a63e012dcced61340de06fda5bc30566270b0aa", "channel_type": { "bits": [ 12, @@ -313,7 +295,7 @@ "anchors/even" ] }, - "outnum": 1 + "outnum": 0 } } ] diff --git a/doc/schemas/lightning-fundchannel_cancel.json b/doc/schemas/lightning-fundchannel_cancel.json index 03bf095147d1..6906172c6f27 100644 --- a/doc/schemas/lightning-fundchannel_cancel.json +++ b/doc/schemas/lightning-fundchannel_cancel.json @@ -67,9 +67,9 @@ "request": { "id": "example:fundchannel_cancel#1", "method": "fundchannel_cancel", - "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" - } + "params": [ + "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc" + ] }, "response": { "cancelled": "Channel open canceled by RPC" @@ -80,11 +80,11 @@ "id": "example:fundchannel_cancel#2", "method": "fundchannel_cancel", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" + "id": "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc" } }, "response": { - "cancelled": "Channel open canceled by RPC(after fundchannel_complete)" + "cancelled": "Channel open canceled by RPC" } } ] diff --git a/doc/schemas/lightning-fundchannel_complete.json b/doc/schemas/lightning-fundchannel_complete.json index 9eec11873649..7d57d9c8f2dd 100644 --- a/doc/schemas/lightning-fundchannel_complete.json +++ b/doc/schemas/lightning-fundchannel_complete.json @@ -84,13 +84,27 @@ "request": { "id": "example:fundchannel_complete#1", "method": "fundchannel_complete", + "params": [ + "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc", + "cHNidP8BAgQCAAAAAQMElQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAFpz79e9wou5mbmtaiB+6WfRTf8SpZxmrd6n+rIFcWewQAAAAAA/f///wLS79/eAAAAABYAFE35CMxYA4yQx9XLuFj0/q5uNmligJaYAQAAAAAWABT/hTPq8LE5vAc9KiJjjmygoIN81UsAAAABAR+AlpgBAAAAABYAFP+FM+rwsTm8Bz0qImOObKCgg3zVAQ4gl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywBDwQBAAAAARAE/f///wABAwgAAAABAAAAAAEEIgAgrcWu1QvOE7IcR/Pw6wFIFh6/TLwoeKjo5eUoi7suzsEAAQMIQYOYAAAAAAABBCJRIIHaDT4wURNaieL52F4urfZh+Vm/sF5nEJeFRnLP0Kx9AA==" + ] + }, + "response": { + "channel_id": "4ef7fbec78160e41ac53e32bb7d4d491222070cf719bd236a03a27109a306ced", + "commitments_secured": true + } + }, + { + "request": { + "id": "example:fundchannel_complete#2", + "method": "fundchannel_complete", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "psbt": "cHNidP8BAIkCAAAAASYd4TeOHEIzrUbbELM2DK0IX09WaXqWsJFlLD455MPPAAAAAAD9////Av///wAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM1c8QUpAQAAACJRIH8AZYBKMKON4/oVmJVsVt6zy/+PkBPzziE+LtkuFvWXAAAAAAABAIMCAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wJRAP////8CAPIFKgEAAAAWABQ5FIjuMd8ar9WFRV9eGNLF+3RMcAAAAAAAAAAAJmokqiGp7eL2HD9x0d79P6mZ36NpU3VcaQaJeZlitIvr2DaXToz5AAAAAAEBHwDyBSoBAAAAFgAUORSI7jHfGq/VhUVfXhjSxft0THAiBgMegIxEPDa2OseVTaV6ANtSwQuoj/j2an7X/Is2EekvWBhhFDNgVAAAgAEAAIAAAACAAAAAAAAAAAAAAAEFIEm9AFgqUlJwbPFtyt3a9dzvb+nAGZiQ3CT1CImhjBFpIQdJvQBYKlJScGzxbcrd2vXc72/pwBmYkNwk9QiJoYwRaRkAYRQzYFYAAIABAACAAAAAgAEAAAAAAAAAAA==" + "id": "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc", + "psbt": "cHNidP8BAgQCAAAAAQMETgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAEAAAAA/f///wIAAAABAAAAACIAIK3FrtULzhOyHEfz8OsBSBYev0y8KHio6OXlKIu7Ls7BQYOYAAAAAAAiUSCB2g0+MFETWoni+dheLq32YflZv7BeZxCXhUZyz9CsfZUAAAABAStBg5gAAAAAACJRIIHaDT4wURNaieL52F4urfZh+Vm/sF5nEJeFRnLP0Kx9AQ4gTvf77HgWDkGsU+Mrt9TUkSIgcM9xm9I2oDonEJowbO0BDwQBAAAAARAE/f///wABAwhAQg8AAAAAAAEEIgAgyeosZcqM3Ce8Ew/hH15S4XVHXg4xtkWx3MODLcT3540AAQMIwi2JAAAAAAABBCJRIHdLHCqbSwqdzkO0Y5WUDaIAERXUAPo2Z5CeyGpdNlGLAA==" } }, "response": { - "channel_id": "049217e5035a4a60449c6382c445b5c105bd63588d66137ad0511c57a16db6d9", + "channel_id": "589340033fb4e1ace8a5f6239a9bcc88e2d65191f68e4ad3f2ad37818718a2e9", "commitments_secured": true } } diff --git a/doc/schemas/lightning-fundchannel_start.json b/doc/schemas/lightning-fundchannel_start.json index 0440dbde397f..d6a2dac4fe08 100644 --- a/doc/schemas/lightning-fundchannel_start.json +++ b/doc/schemas/lightning-fundchannel_start.json @@ -210,15 +210,24 @@ "request": { "id": "example:fundchannel_start#1", "method": "fundchannel_start", - "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount": 16777216, - "announce": true - } + "params": [ + "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc", + 16777216 + ] }, "response": { - "funding_address": "bcrt1qtwxd8wg5eanumk86vfeujvp48hfkgannf77evggzct048wggsrxsum2pmm", - "scriptpubkey": "00205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd", + "funding_address": "bcrt1q5ptrvwlgcldm2ygf3nzsl09zfpp7dmtduqlczer97xvc4x5z5zwsc2ulv4", + "scriptpubkey": "0020a056363be8c7dbb511098cc50fbca24843e6ed6de03f816465f1998a9a82a09d", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, "warning_usage": "The funding transaction MUST NOT be broadcast until after channel establishment has been successfully completed by running `fundchannel_complete`" } }, @@ -227,14 +236,13 @@ "id": "example:fundchannel_start#2", "method": "fundchannel_start", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount": "100000sat", - "announce": true + "id": "027ba5906fad81fcdbb774b4c806eb572b7fac3bee4720b12c44e7f70931d4b7cc", + "amount": 16777216 } }, "response": { - "funding_address": "bcrt1qtwxd8wg5eanumk86vfeujvp48hfkgannf77evggzct048wggsrxsum2pmm", - "scriptpubkey": "00205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd", + "funding_address": "bcrt1q4hz6a4gtecfmy8z870cwkq2gzc0t7n9u9pu23689u55ghwewemqsv4v2zs", + "scriptpubkey": "0020adc5aed50bce13b21c47f3f0eb0148161ebf4cbc2878a8e8e5e5288bbb2ecec1", "channel_type": { "bits": [ 12, diff --git a/doc/schemas/lightning-funderupdate.json b/doc/schemas/lightning-funderupdate.json index a4790d0990ef..63ffe05378e4 100644 --- a/doc/schemas/lightning-funderupdate.json +++ b/doc/schemas/lightning-funderupdate.json @@ -285,9 +285,9 @@ "params": {} }, "response": { - "summary": "match (100%)", - "policy": "match", - "policy_mod": 100, + "summary": "fixed (0sat)", + "policy": "fixed", + "policy_mod": 0, "leases_only": true, "min_their_funding_msat": 10000000, "max_their_funding_msat": 4294967295000, @@ -295,13 +295,7 @@ "per_channel_max_msat": 4294967295000, "reserve_tank_msat": 0, "fuzz_percent": 0, - "fund_probability": 100, - "lease_fee_base_msat": 100000, - "lease_fee_basis": 100, - "funding_weight": 666, - "channel_fee_max_base_msat": 5000000, - "channel_fee_max_proportional_thousandths": 100, - "compact_lease": "029a00640064000000644c4b40" + "fund_probability": 100 } }, { diff --git a/doc/schemas/lightning-fundpsbt.json b/doc/schemas/lightning-fundpsbt.json index 5e770c159a2a..02691a13ee40 100644 --- a/doc/schemas/lightning-fundpsbt.json +++ b/doc/schemas/lightning-fundpsbt.json @@ -212,18 +212,18 @@ "id": "example:fundpsbt#1", "method": "fundpsbt", "params": { - "satoshi": 16777216, + "satoshi": 1000000, "feerate": "253perkw", "startweight": 250, - "reserve": 0, - "excess_as_change": false + "reserve": 0 } }, "response": { - "psbt": "cHNidP8BADMCAAAAAWzmSFzhTtXBnQewytc32WaMwJSunScwsYndBNdU80JqAAAAAAD9////AGYAAAAAAQDeAgAAAAABAU1MpIJeOOzqAYVkZaytJCmzUadBVltKar8kWtzKSVeYAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFD8W5uBNZAxN6n1jqU62dxWQbyGAAkcwRAIgUK+vMOeWiDPiJM8fpgKCjjwXog4yfWPvtKES1ZZPaM8CIB3cgouGpV6Gc7nEvAu28Mg9tkAWt/Xl5FDOseEyeZqHASECTwjR0I3gLHdSW7jRmnVXdm0+MgJ1hihnqEfXYeFWA/NlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQA=", + "psbt": "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AahhAAAAAAAAIlEg+3d9jpNmK0getyg5W+Mp31CPIRDKcJg/mZs/uaVrQ+GZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA", "feerate_per_kw": 253, - "estimated_final_weight": 521, - "excess_msat": 9999869000 + "estimated_final_weight": 693, + "excess_msat": 196962507000, + "change_outnum": 0 } }, { @@ -231,55 +231,20 @@ "id": "example:fundpsbt#2", "method": "fundpsbt", "params": { - "satoshi": "all", - "feerate": "1000perkw", - "startweight": 1000, - "excess_as_change": false - } - }, - "response": { - "psbt": "cHNidP8BAF4CAAAAAfwbEpvpi6D14YV4VLnuVB47Y0uF41kXEyJRL4IusySSAQAAAAD9////ASICAAAAAAAAIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL5nAAAAAAEA9gIAAAAAAQFEkxvLatohY6mw5gr5qG1aiArSrziFPR2YoqD21Hv+RAAAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNrz8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIEu1nfVRt9i+rFM219mwhMqdwJsqygWSWTFUS+cemdh6AiBG3Qo8g9J/aAMO2RHDsIBScscj6pTTIwZp7Gw8G3EOKAEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPZgAAAAEBK68/DwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oAAA==", - "feerate_per_kw": 1000, - "estimated_final_weight": 1443, - "excess_msat": 997354000, - "change_outnum": 0, - "reservations": [ - { - "txid": "9224b32e822f5122131759e3854b633b1e54eeb9547885e1f5a08be99b121bfc", - "vout": 1, - "was_reserved": false, - "reserved": true, - "reserved_to_block": 175 - } - ] - } - }, - { - "request": { - "id": "example:fundpsbt#3", - "method": "fundpsbt", - "params": { - "satoshi": "109000sat", - "feerate": "slow", + "satoshi": 500000, + "feerate": "urgent", "startweight": 166, - "excess_as_change": true + "reserve": 0, + "excess_as_change": true, + "min_witness_weight": 110 } }, "response": { - "psbt": "cHNidP8BAF4CAAAAAbEf44mT/BPDxLkUjKy1byWksyLyuM6hbe8shzEbbXhGAQAAAAD9////AU58DQAAAAAAIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL5sAAAAAAEA9gIAAAAAAQEV9Sj1wfHqO/ECZeHp/u7cFL5eRaa1Vu4hXWbwH72pxgEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIGILT3DrcNn6/WKOhsxxKq7lDWq47dV0IjRhj0bYHs4yAiApzODtmrz7ifK32G81A2XbBxWboFk2vN4T3ng/hYmb1wEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPZgAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oAAA==", - "feerate_per_kw": 3750, - "estimated_final_weight": 609, + "psbt": "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AfZRxQsAAAAAIlEg21kTTo7K2doCG6F2JqgaDjc1kRCrH7AL08oPVVJhuE+ZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA", + "feerate_per_kw": 11000, + "estimated_final_weight": 612, "excess_msat": 0, - "change_outnum": 0, - "reservations": [ - { - "txid": "46786d1b31872cef6da1ceb8f222b3a4256fb5ac8c14b9c4c313fc9389e31fb1", - "vout": 1, - "was_reserved": false, - "reserved": true, - "reserved_to_block": 180 - } - ] + "change_outnum": 0 } } ] diff --git a/doc/schemas/lightning-getinfo.json b/doc/schemas/lightning-getinfo.json index ae674be6d89d..39529d13e551 100644 --- a/doc/schemas/lightning-getinfo.json +++ b/doc/schemas/lightning-getinfo.json @@ -7,6 +7,9 @@ "description": [ "The **getinfo** gives a summary of the current running node." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": {} @@ -394,18 +397,7 @@ "num_pending_channels": 0, "num_active_channels": 0, "num_inactive_channels": 0, - "address": [ - { - "type": "torv3", - "address": "fp463inc4w3lamhhduytrwdwq6q6uzugtaeapylqfc43agrdnnqsheyd.onion", - "port": 9736 - }, - { - "type": "torv3", - "address": "ifnntp5ak4homxrti2fp6ckyllaqcike447ilqfrgdw64ayrmkyashid.onion", - "port": 9736 - } - ], + "address": [], "binding": [ { "type": "ipv4", @@ -420,10 +412,10 @@ "fees_collected_msat": "0msat", "lightning-dir": "/media/vincent/Maxtor/C-lightning/node/bitcoin", "our_features": { - "init": "8828226aa2", - "node": "80008828226aa2", + "init": "08a0802a8a59a1", + "node": "88a0802a8a59a1", "channel": "", - "invoice": "20024200" + "invoice": "02000002024100" } } } diff --git a/doc/schemas/lightning-getlog.json b/doc/schemas/lightning-getlog.json index bd08e7ba97a9..10585dab9791 100644 --- a/doc/schemas/lightning-getlog.json +++ b/doc/schemas/lightning-getlog.json @@ -7,6 +7,9 @@ "description": [ "The **getlog** the RPC command to show logs, with optional log *level*." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -233,23 +236,59 @@ "id": "example:getlog#1", "method": "getlog", "params": { - "level": "debug" + "level": "unusual" } }, "response": { - "created_at": "1598192543.820753463", - "bytes_used": 89285843, - "bytes_max": 104857600, + "created_at": "1722303623.956237697", + "bytes_used": 1723719, + "bytes_max": 10485760, "log": [ { "type": "SKIPPED", - "num_skipped": 45 + "num_skipped": 2927 + }, + { + "type": "UNUSUAL", + "time": "59.598510878", + "node_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "source": "chan#1", + "log": "No peer channel with scid=6250403x3681116x19863" + }, + { + "type": "SKIPPED", + "num_skipped": 1183 + }, + { + "type": "UNUSUAL", + "time": "71.923794351", + "node_id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "source": "chan#2", + "log": "Peer permanent failure in CLOSINGD_COMPLETE: Funding transaction spent (reason=unknown)" }, { - "type": "INFO", - "time": "0.453627568", - "source": "plugin-autopilot.py", - "log": "RPCmethod'autopilot-run-once'doesnothaveadocstring." + "type": "SKIPPED", + "num_skipped": 557 + }, + { + "type": "BROKEN", + "time": "89.108598990", + "source": "plugin-topology", + "log": "DEPRECATED API USED: listchannels.include_private by \\\"-c:listchannels#114/cln:listchannels#175\\\"" + }, + { + "type": "SKIPPED", + "num_skipped": 1246 + }, + { + "type": "UNUSUAL", + "time": "95.217065000", + "source": "plugin-cln-renepay", + "log": "Failed to update hint channel 111x1x0: Failed to update scid=111x1x0 in the local_gossmods." + }, + { + "type": "SKIPPED", + "num_skipped": 1696 } ] } diff --git a/doc/schemas/lightning-getroute.json b/doc/schemas/lightning-getroute.json index 0d7d40532c58..eba3009d85b4 100644 --- a/doc/schemas/lightning-getroute.json +++ b/doc/schemas/lightning-getroute.json @@ -9,6 +9,9 @@ "", "There are two considerations for how good a route is: how low the fees are, and how long your payment will get stuck in a delayed output if a node goes down during the process. ." ], + "categories": [ + "readonly" + ], "request": { "required": [ "id", @@ -368,35 +371,26 @@ "id": "example:getroute#1", "method": "getroute", "params": { - "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "amount_msat": 50000000, - "riskfactor": 1, - "cltv": 9 + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "riskfactor": 1 } }, "response": { "route": [ - { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "channel": "103x3x0", - "direction": 1, - "amount_msat": 50001002, - "delay": 21, - "style": "tlv" - }, { "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "channel": "103x1x0", + "channel": "109x1x1", "direction": 1, - "amount_msat": 50000501, + "amount_msat": 10001, "delay": 15, "style": "tlv" }, { - "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "channel": "103x2x0", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "channel": "111x1x0", "direction": 0, - "amount_msat": 50000000, + "amount_msat": 10000, "delay": 9, "style": "tlv" } @@ -408,26 +402,27 @@ "id": "example:getroute#2", "method": "getroute", "params": { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "amount_msat": "50000sat", - "riskfactor": 10 + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "amount_msat": 500000, + "riskfactor": 10, + "cltv": 9 } }, "response": { "route": [ { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "channel": "103x2x0", - "direction": 1, - "amount_msat": 50051000, + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "channel": "111x1x0", + "direction": 0, + "amount_msat": 500006, "delay": 15, "style": "tlv" }, { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "channel": "103x1x0", + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "channel": "113x1x1", "direction": 0, - "amount_msat": 50000000, + "amount_msat": 500000, "delay": 9, "style": "tlv" } diff --git a/doc/schemas/lightning-getroutes.json b/doc/schemas/lightning-getroutes.json new file mode 100644 index 000000000000..303ec958777d --- /dev/null +++ b/doc/schemas/lightning-getroutes.json @@ -0,0 +1,174 @@ +{ + "$schema": "../rpc-schema-draft.json", + "type": "object", + "additionalProperties": false, + "rpc": "getroutes", + "title": "Command for routing a payment (EXPERIMENTAL)", + "description": [ + "WARNING: experimental, so API may change.", + "", + "The **getroutes** RPC command attempts to find the best set of paths for the payment from *source* to *destination* of *amount_msat*, using the given *layers* on top of the gossip information. The result is constrained by *maxfee*, and will arrive at the destiation with *finalcltv*.", + "", + "Layers are generally maintained by plugins, either to contain persistent information about capacities which have been discovered, or to contain transient information for this particular payment (such as blinded paths or routehints).", + "", + "There are two automatic layers: *auto.localchans* contains information on local channels from this node (including non-public ones), and their exact current spendable capacities, and *auto.sourcefree* overrides all channels leading out of the *source* to be zero fee and zero delay. These are both useful in the case where the source is the current node." + ], + "categories": [ + "readonly" + ], + "request": { + "required": [ + "source", + "destination", + "amount_msat", + "layers", + "maxfee_msat", + "finalcltv" + ], + "properties": { + "source": { + "type": "pubkey", + "description": [ + "Node pubkey to start the paths" + ] + }, + "destination": { + "type": "pubkey", + "description": [ + "Node pubkey to end the paths" + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "Amount to send. It can be a whole number, or a whole number ending in *msat* or *sat*, or a number with three decimal places ending in *sat*, or a number with 1 to 11 decimal places ending in *btc*." + ] + }, + "layers": { + "type": "array", + "items": { + "type": "string", + "description": [ + "Layer to apply to the gossip map before attempting to find routes." + ] + } + }, + "maxfee_msat": { + "type": "msat", + "description": [ + "Maximum fee to spend: we will never return a set of routes more expensive than this. It can be a whole number, or a whole number ending in *msat* or *sat*, or a number with three decimal places ending in *sat*, or a number with 1 to 11 decimal places ending in *btc*." + ] + }, + "finalcltv": { + "type": "u32", + "description": [ + "Number of blocks for the final node. We need to know this because no HTLC is allowed to have a CLTV delay more than 2016 blocks." + ] + } + } + }, + "response": { + "required": [ + "probability_ppm", + "routes" + ], + "properties": { + "probability_ppm": { + "type": "u64", + "description": [ + "The estimated probability of success using these routes, in millionths." + ] + }, + "routes": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "probability_ppm", + "amount_msat", + "path" + ], + "properties": { + "probability_ppm": { + "type": "u64", + "description": [ + "The estimated probability of success using this route, in millionths." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount delivered to the *destination* by this path." + ] + }, + "path": { + "type": "array", + "description": [ + "The hops to get from *source* to *destination*." + ], + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "short_channel_id", + "direction", + "next_node_id", + "amount_msat", + "delay" + ], + "properties": { + "short_channel_id": { + "type": "short_channel_id", + "description": [ + "The channel joining these nodes." + ] + }, + "direction": { + "type": "u32", + "description": [ + "0 if this channel is traversed from lesser to greater **id**, otherwise 1." + ] + }, + "amount_msat": { + "type": "msat", + "description": [ + "The amount to send into this hop." + ] + }, + "next_node_id": { + "type": "pubkey", + "description": [ + "The peer id at the end of this hop." + ] + }, + "delay": { + "type": "u32", + "description": [ + "The total CLTV expected by the node at the start of this hop." + ] + } + } + } + } + } + } + } + } + }, + "author": [ + "<> wrote the minimum-cost-flow solver, Rusty Russell <> wrote the API and this documentation." + ], + "see_also": [ + "lightning-askrene-reserve(7)", + "lightning-askrene-unreserve(7)", + "lightning-askrene-disable-node(7)", + "lightning-askrene-create-channel(7)", + "lightning-askrene-inform-channel(7)", + "lightning-askrene-report(7)", + "lightning-askrene-age(7)" + ], + "resources": [ + "Main web site: " + ] +} diff --git a/doc/schemas/lightning-help.json b/doc/schemas/lightning-help.json index 67f9d8f0f73b..3a8a54b135e7 100644 --- a/doc/schemas/lightning-help.json +++ b/doc/schemas/lightning-help.json @@ -31,10 +31,7 @@ "type": "object", "additionalProperties": true, "required": [ - "command", - "category", - "description", - "verbose" + "command" ], "properties": { "command": { @@ -42,24 +39,6 @@ "description": [ "The command." ] - }, - "category": { - "type": "string", - "description": [ - "The category for this command (useful for grouping)." - ] - }, - "description": { - "type": "string", - "description": [ - "A one-line description of the purpose of this command." - ] - }, - "verbose": { - "type": "string", - "description": [ - "A full description of this command (including whether it's deprecated)." - ] } } } @@ -99,10 +78,7 @@ "response": { "help": [ { - "command": "pay bolt11 [amount_msat] [label] [riskfactor] [maxfeepercent] [retry_for] [maxdelay] [exemptfee] [localinvreqid] [exclude] [maxfee] [description] [dev_use_shadow]", - "category": "plugin", - "description": "Send payment specified by {bolt11}", - "verbose": "Attempt to pay the {bolt11} invoice." + "command": "pay bolt11 [amount_msat] [label] [riskfactor] [maxfeepercent] [retry_for] [maxdelay] [exemptfee] [localinvreqid] [exclude] [maxfee] [description] [partial_msat] [dev_use_shadow]" } ], "format-hint": "simple" @@ -119,10 +95,7 @@ "response": { "help": [ { - "command": "dev subcommand=crash|rhash|slowcmd", - "category": "developer", - "description": "Developer command test multiplexer", - "verbose": "dev rhash {secret}\n\tShow SHA256 of {secret}\ndev crash\n\tCrash lightningd by calling fatal()\ndev slowcmd {msec}\n\tTorture test for slow commands, optional {msec}\n" + "command": "dev subcommand=crash|rhash|slowcmd" } ], "format-hint": "simple" diff --git a/doc/schemas/lightning-invoice.json b/doc/schemas/lightning-invoice.json index cb69de03f9ab..aa8289178fc8 100644 --- a/doc/schemas/lightning-invoice.json +++ b/doc/schemas/lightning-invoice.json @@ -205,20 +205,17 @@ "id": "example:invoice#1", "method": "invoice", "params": { - "amount_msat": 11000000, - "label": "xEoCR94SIz6UIRUEkxum", - "description": [ - "XEoCR94SIz6UIRUEkxum." - ] + "amount_msat": 10000, + "label": "lbl_l31", + "description": "Invoice description l31" } }, "response": { - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", - "expires_at": 1706757730, - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk", - "payment_secret": "82644944d3f70d42aad1d5f7b5d7a629e7afa30b529cc952a4c59fc0e3790ea2", - "created_index": 1, - "warning_deadends": "Insufficient incoming capacity, once dead-end peers were excluded" + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", + "expires_at": 1722908474, + "bolt11": "lnbcrt100n1pn2s396sp5v3en0qa3rrljw4m0wtz88sx99q20rarufhjpfysefhwhs42gvqjqpp56kvvl33d594nsxu0hzhesvazgqzlwv89fnpjcvtlanz3rl7x623qdp9f9h8vmmfvdjjqer9wd3hy6tsw35k7m3qdsenzxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq7za6z8kx2k5nul45zwttfz2njx3836v69mxqsl4ty9228pyjrkfnkymysy8ygsrrje9qf6j4tpalt5qkqusfp2esrsqc5ak7t4yzajgpezef54", + "payment_secret": "64733783b118ff27576f72c473c0c52814f1f47c4de41492194ddd7855486024", + "created_index": 2 } }, { @@ -226,18 +223,17 @@ "id": "example:invoice#2", "method": "invoice", "params": { - "amount_msat": 100, - "label": "8", - "description": "inv" + "amount_msat": "50000msat", + "label": "lbl_l32", + "description": "l32 description" } }, "response": { - "payment_hash": "f59ae0204dfe8e913207ea36646255b9d2c7c8229e8693d30547fc622eddb6b4", - "expires_at": 1709229182, - "bolt11": "lnbcrt1n1pja0z07sp5n8fk890nrq7zlcue0lgu7cduaaz765u5rg0kcud4amphuppu8wxspp57kdwqgzdl68fzvs8agmxgcj4h8fv0jpzn6rf85c9gl7xytkak66qdq9d9h8vxqyjw5qcqp99qxpqysgqrneaxh0plvjft457yv3q92rak57a6xw33m6phr0mrsy69sudzgez3adkzdsgwzy32z5usjpxm4rjgcg70h047wf0pgc4l9gyaj2h9ssqcrtv32", - "payment_secret": "99d36395f3183c2fe3997fd1cf61bcef45ed53941a1f6c71b5eec37e043c3b8d", - "created_index": 9, - "warning_capacity": "Insufficient incoming channel capacity to pay invoice" + "payment_hash": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "expires_at": 1722908474, + "bolt11": "lnbcrt500n1pn2s396sp5h5tz6fpm3dxvrlwcnwmfq85v45wfj43mdmplpce6ku2vmfdhrx5qpp50z9w5u57meydx9dpn889mmtkz6tqrfsa65hfwd88ql4hc5hyu70qdqcdsenygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqt5m8qx0t25a0gygya7u4sxulyyp2dec87pwsxuuwtg0u66c07703g9j6vlwgmlhqk7qgn95qw7allhnuj2m9hf0xkcr2zkaxltv3t6gqjcdpll", + "payment_secret": "bd162d243b8b4cc1fdd89bb6901e8cad1c99563b6ec3f0e33ab714cda5b719a8", + "created_index": 3 } } ] diff --git a/doc/schemas/lightning-invoicerequest.json b/doc/schemas/lightning-invoicerequest.json index a6cfad2fcb08..6bf56281e937 100644 --- a/doc/schemas/lightning-invoicerequest.json +++ b/doc/schemas/lightning-invoicerequest.json @@ -127,17 +127,34 @@ "request": { "id": "example:invoicerequest#1", "method": "invoicerequest", + "params": { + "amount": 1000000, + "description": "Simple test" + } + }, + "response": { + "invreq_id": "93f193cd2432d292f8b64af08942989d71c0a0366fb52d57ddb688c8fb066399", + "active": true, + "single_use": true, + "bolt12": "lnr1qqgypua5g7rp293k00s66ayvnv26czst2d5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gps7sjqtqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e7pq947t0ks7a4yejz8w79x4zj25s3pu6zrnw2e0v2ugdescpcqsq307z4p2dlxe92fv7xd43qut0pjkg4y094hupqyhsj8dlhvmmfng6sv", + "used": false + } + }, + { + "request": { + "id": "example:invoicerequest#2", + "method": "invoicerequest", "params": { "amount": "10000sat", - "description": "simple test", - "issuer": "clightning test suite" + "description": "Requesting for invoice", + "issuer": "clightning store" } }, "response": { - "invreq_id": "715484ead84bcdae5b33e3015c686fa1bdd4ae9ade3c4729b58257a98cfcd9b5", + "invreq_id": "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9", "active": true, "single_use": true, - "bolt12": "lnr1qqgteyhfyp40c79a5y3gfe33nxfs6zstwd5k6urvv5s8getnwsfp2cmvd9nksarwd9hxwgr5v4ehggrnw45hge2syqrzymjxzydqkkw24ufxqslttwlj3s608f0rx2slc7etw0833zgs75srnztgqkppqfnwgkvdr57yzh6h92zg3qctvrm7w38djg67kzcm4yeg8vc4cq633uzq99smfawuu6pz0zh9jl6dl8v25u3kzes975x2j9tr0qp0ux0tlzcxjrgehxh9luz5vwjpk92tys9f9zlm038krcz4uqfxgelwf43tgfc", + "bolt12": "lnr1qqgx5t5hcw5ru9fgkhgxj4thjq4ugzsk2fjhzat9wd6xjmn8ypnx7u3qd9h8vmmfvdj3yyrrd35kw6r5de5kueeqwd6x7un92qsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzr6jqwvfdqzcyypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgpvamrunx5t6vdaeu7nmmlh5u6f0dnscasy2alyxq79f5wnc043gxrzyqt640dmuj7c94644j5ae6wfse7tsejwqnmc575ly9t38h4hf", "used": false } } diff --git a/doc/schemas/lightning-keysend.json b/doc/schemas/lightning-keysend.json index dbc77c18a2ab..a53ea0fa0da9 100644 --- a/doc/schemas/lightning-keysend.json +++ b/doc/schemas/lightning-keysend.json @@ -235,12 +235,12 @@ }, "response": { "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "payment_hash": "b6f88603008a9f7dd84b1b94c7b972c8efbaf0b86c8d3c04512955992da9028e", - "created_at": 1706315742.6861734, + "payment_hash": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", + "created_at": 1722303677.1300898, "parts": 1, "amount_msat": 10000, "amount_sent_msat": 10001, - "payment_preimage": "7178cf708e34dce816fc35aa692a65e1f85b92ae03bbc8ae6543302511823174", + "payment_preimage": "0d802c9c611bae611d51afa8ddf396df8ba4e0580a2eccfd1120da97e70482a0", "status": "complete" } }, @@ -249,7 +249,7 @@ "id": "example:keysend#2", "method": "keysend", "params": { - "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", "amount_msat": 10000000, "extratlvs": { "133773310": "68656c6c6f776f726c64", @@ -258,13 +258,13 @@ } }, "response": { - "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "payment_hash": "e8474eea8d5673e8407ef5f4924e58479b51a68afd136384683d5d6a97c9520d", - "created_at": 1708640424.1810749, + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "payment_hash": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "created_at": 1722303679.3164163, "parts": 1, "amount_msat": 10000000, - "amount_sent_msat": 10000000, - "payment_preimage": "40e47272ea7da20c57a2381d81a5513ec03bd8ead9d51fbd2a91ec76d3f4bcbf", + "amount_sent_msat": 10000202, + "payment_preimage": "f76d6b7ef362f33e25eb5571e616f6e539a2c77caf0afa4227d1351546823664", "status": "complete" } }, @@ -278,33 +278,24 @@ "routehints": [ [ { - "scid": "4615051x2233541x57738", + "scid": "6250403x3681116x19863", "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "feebase": 1, + "feebase": "1msat", "feeprop": 10, "expirydelta": 9 } - ], - [ - { - "scid": "1x2x3", - "id": "020202020202020202020202020202020202020202020202020202020202020202", - "feebase": 1, - "feeprop": 1, - "expirydelta": 9 - } ] ] } }, "response": { "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "payment_hash": "56e12e6f45120bef7385c9bf307319eaa6a1b9160cdb3e62a3f492abf5bfa4bc", - "created_at": 1708640437.2895157, - "parts": 1, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "created_at": 1722303682.5805738, + "parts": 2, "amount_msat": 10000, "amount_sent_msat": 10001, - "payment_preimage": "682870b8f96e2aed1c86694dbb2c3e64cd396b9bba9fafd824d90eb0bd371b85", + "payment_preimage": "4dad6dcf625f650a35a8199fbda18ea4f6717cdfadb40e6bed2bf5f96a4742b0", "status": "complete" } } diff --git a/doc/schemas/lightning-listchannels.json b/doc/schemas/lightning-listchannels.json index a1f88c654c5b..f53ba5a473a8 100644 --- a/doc/schemas/lightning-listchannels.json +++ b/doc/schemas/lightning-listchannels.json @@ -9,6 +9,9 @@ "", "Only one of *short_channel_id*, *source* or *destination* can be supplied. If nothing is supplied, data on all lightning channels known to this node, are returned. These can be local channels or public channels broadcast on the gossip network." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -187,11 +190,48 @@ "id": "example:listchannels#1", "method": "listchannels", "params": { - "short_channel_id": "103x1x0" + "short_channel_id": "109x1x1" } }, "response": { - "channels": [] + "channels": [ + { + "source": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "short_channel_id": "109x1x1", + "direction": 0, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 0, + "active": true, + "last_update": 1722303662, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "short_channel_id": "109x1x1", + "direction": 1, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 1, + "active": true, + "last_update": 1722303662, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + } + ] } }, { @@ -205,14 +245,14 @@ { "source": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "direction": 0, "public": true, "amount_msat": 1000000000, "message_flags": 1, "channel_flags": 0, "active": true, - "last_update": 1706153393, + "last_update": 1722303662, "base_fee_millisatoshi": 1, "fee_per_millionth": 10, "delay": 6, @@ -223,14 +263,158 @@ { "source": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", + "direction": 1, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 1, + "active": true, + "last_update": 1722303662, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "111x1x0", + "direction": 0, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 2, + "active": false, + "last_update": 1722303692, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "short_channel_id": "111x1x0", + "direction": 1, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 1, + "active": true, + "last_update": 1722303669, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "short_channel_id": "113x1x1", + "direction": 0, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 0, + "active": true, + "last_update": 1722303669, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "113x1x1", + "direction": 1, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 1, + "active": true, + "last_update": 1722303669, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "123x1x1", + "direction": 0, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 0, + "active": true, + "last_update": 1722303711, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "short_channel_id": "123x1x1", + "direction": 1, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 1, + "active": true, + "last_update": 1722303711, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "short_channel_id": "125x1x1", + "direction": 0, + "public": true, + "amount_msat": 1000000000, + "message_flags": 1, + "channel_flags": 0, + "active": true, + "last_update": 1722303714, + "base_fee_millisatoshi": 1, + "fee_per_millionth": 10, + "delay": 6, + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "features": "" + }, + { + "source": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "short_channel_id": "125x1x1", "direction": 1, "public": true, "amount_msat": 1000000000, "message_flags": 1, "channel_flags": 1, "active": true, - "last_update": 1706153393, + "last_update": 1722303714, "base_fee_millisatoshi": 1, "fee_per_millionth": 10, "delay": 6, diff --git a/doc/schemas/lightning-listclosedchannels.json b/doc/schemas/lightning-listclosedchannels.json index b03a29b0b5f1..5e8365dc94d5 100644 --- a/doc/schemas/lightning-listclosedchannels.json +++ b/doc/schemas/lightning-listclosedchannels.json @@ -8,6 +8,9 @@ "description": [ "The **listclosedchannels** RPC command returns data on channels which are otherwise forgotten (more than 100 blocks after they're completely resolved onchain)." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -282,5 +285,17 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:listclosedchannels#1", + "method": "listclosedchannels", + "params": {} + }, + "response": { + "closedchannels": [] + } + } ] } diff --git a/doc/schemas/lightning-listconfigs.json b/doc/schemas/lightning-listconfigs.json index 9bff82a626cb..a299a4556871 100644 --- a/doc/schemas/lightning-listconfigs.json +++ b/doc/schemas/lightning-listconfigs.json @@ -7,6 +7,9 @@ "description": [ "The **listconfigs** RPC command to list all configuration options, or with *config* only one." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -2473,102 +2476,191 @@ } }, "response": { - "#version": "v0.9.0-1", - "lightning-dir": "/media/vincent/Maxtor/sanboxTestWrapperRPC/lightning_dir_dev", - "network": "testnet", - "allow-deprecated-apis": true, + "network": "regtest", + "configs": { + "network": { + "value_str": "regtest", + "source": "cmdline" + } + } + } + }, + { + "request": { + "id": "example:listconfigs#2", + "method": "listconfigs", + "params": { + "config": "experimental-dual-fund" + } + }, + "response": { + "experimental-dual-fund": true, + "configs": { + "experimental-dual-fund": { + "set": true, + "source": "cmdline" + } + } + } + }, + { + "request": { + "id": "example:listconfigs#3", + "method": "listconfigs", + "params": {} + }, + "response": { + "# version": "v24.05-190-g5fd2f9c-modded", + "developer": true, + "lightning-dir": "/tmp/.lightning/", + "network": "regtest", "rpc-file": "lightning-rpc", + "allow-deprecated-apis": true, "plugins": [ { - "path": "/home/vincent/Github/plugins/sauron/sauron.py", - "name": "sauron.py", - "options": { - "sauron-api-endpoint": "http://blockstream.info/testnet/api/", - "sauron-tor-proxy": "" - } - }, - { - "path": "/home/vincent/Github/reckless/reckless.py", - "name": "reckless.py" + "path": "/root/lightning/plugins/cln-renepay", + "name": "cln-renepay", + "options": {} } ], "important-plugins": [ { - "path": "/home/vincent/Github/lightning/lightningd/../plugins/autoclean", + "path": "/root/lightning/plugins/autoclean", "name": "autoclean", "options": { - "autocleaninvoice-cycle": null, - "autocleaninvoice-expired-by": null + "autoclean-cycle": 3600, + "dev-autoclean-max-batch": 10000 } }, { - "path": "/home/vincent/Github/lightning/lightningd/../plugins/fundchannel", - "name": "fundchannel" + "path": "/root/lightning/plugins/chanbackup", + "name": "chanbackup" }, { - "path": "/home/vincent/Github/lightning/lightningd/../plugins/keysend", - "name": "keysend" + "path": "/root/lightning/plugins/bcli", + "name": "bcli", + "options": { + "bitcoin-datadir": "/tmp/.lightning/", + "bitcoin-rpcuser": "rpcuser", + "bitcoin-rpcpassword": "rpcpass", + "bitcoin-rpcport": 51251, + "bitcoin-rpcclienttimeout": 60, + "bitcoin-retry-timeout": 60 + } }, { - "path": "/home/vincent/Github/lightning/lightningd/../plugins/pay", - "name": "pay", + "path": "/root/lightning/plugins/commando", + "name": "commando" + }, + { + "path": "/root/lightning/plugins/funder", + "name": "funder", "options": { - "disable-mpp": false + "funder-policy": "fixed", + "funder-policy-mod": "0", + "funder-min-their-funding": "10000sat", + "funder-max-their-funding": "4294967295sat", + "funder-per-channel-min": "10000sat", + "funder-per-channel-max": "4294967295sat", + "funder-reserve-tank": "0sat", + "funder-fuzz-percent": 0, + "funder-fund-probability": 100, + "funder-lease-requests-only": true } + }, + { + "path": "/root/lightning/plugins/topology", + "name": "topology" + }, + { + "path": "/root/lightning/plugins/keysend", + "name": "keysend" + }, + { + "path": "/root/lightning/plugins/offers", + "name": "offers", + "options": {} + }, + { + "path": "/root/lightning/plugins/pay", + "name": "pay", + "options": {} + }, + { + "path": "/root/lightning/plugins/recover", + "name": "recover" + }, + { + "path": "/root/lightning/plugins/txprepare", + "name": "txprepare" + }, + { + "path": "/root/lightning/plugins/spenderp", + "name": "spenderp" + }, + { + "path": "/root/lightning/plugins/sql", + "name": "sql", + "options": {} + }, + { + "path": "/root/lightning/plugins/bookkeeper", + "name": "bookkeeper", + "options": {} } ], - "important-plugin": "/home/vincent/Github/lightning/lightningd/../plugins/pay", - "plugin": "/home/vincent/Github/reckless/reckless.py", - "disable-plugin": [ - "bcli" - ], + "disable-plugin": [], "always-use-proxy": false, - "daemon": "false", - "wallet": "sqlite3:///media/vincent/Maxtor/sanboxTestWrapperRPC/lightning_dir_dev/testnet/lightningd.sqlite3", - "wumbo": true, - "rgb": "03ad98", - "alias": "BRUCEWAYN-TES-DEV", - "pid-file": "/media/vincent/Maxtor/sanboxTestWrapperRPC/lightning_dir_dev/lightningd-testne...", - "ignore-fee-limits": true, - "watchtime-blocks": 6, + "daemon": false, + "wallet": "sqlite3:///tmp/.lightning/regtest/lightningd.sqlite3", + "experimental-dual-fund": true, + "experimental-splicing": false, + "experimental-offers": true, + "experimental-shutdown-wrong-funding": false, + "experimental-peer-storage": false, + "experimental-quiesce": false, + "rgb": "022d22", + "alias": "SILENTARTIST-190-g5fd2f9c-modded", + "pid-file": "/tmp/.lightning/lightningd-regtest.pid", + "ignore-fee-limits": false, + "watchtime-blocks": 5, "funding-confirms": 1, - "commit-fee-min": 0, - "commit-fee-max": 0, + "require-confirmed-inputs": false, "cltv-delta": 6, - "cltv-final": 10, + "cltv-final": 5, "commit-time": 10, "fee-base": 1, - "rescan": 30, + "rescan": 1, "fee-per-satoshi": 10, + "htlc-minimum-msat": 0, + "htlc-maximum-msat": 18446744073709552000, "max-concurrent-htlcs": 483, + "max-dust-htlc-exposure-msat": 50000000, "min-capacity-sat": 10000, - "addr": "autotor:127.0.0.1:9051", - "bind-addr": "127.0.0.1:9735", - "announce-addr": "fp463inc4w3lamhhduytrwdwq6q6uzugtaeapylqfc43agrdnnqsheyd.onion:9735", - "offline": "false", - "autolisten": true, - "proxy": "127.0.0.1:9050", - "disable-dns": "false", + "addr": "127.0.0.1:41219", + "announce-addr-discovered": "auto", + "announce-addr-discovered-port": 19846, + "offline": false, + "autolisten": false, + "disable-dns": true, "encrypted-hsm": false, "rpc-file-mode": "0600", - "log-level": "DEBUG", - "log-prefix": "lightningd" - } - }, - { - "request": { - "id": "example:listconfigs#2", - "method": "listconfigs", - "params": {} - }, - "response": { + "commit-fee": 100, + "commit-feerate-offset": 5, + "min-emergency-msat": 25000000, + "experimental-upgrade-protocol": false, + "invoices-onchain-fallback": false, + "log-level": "debug", + "log-timestamps": true, + "log-prefix": "lightningd-2 ", + "log-file": "/tmp/.lightning/log", "configs": { "developer": { "set": true, "source": "cmdline" }, "lightning-dir": { - "value_str": "/tmp/ltests-giwf5tc7/test_plugin_start_1/lightning-1/", + "value_str": "/tmp/.lightning/", "source": "cmdline" }, "network": { @@ -2596,16 +2688,12 @@ "source": "default" }, "allow-deprecated-apis": { - "value_bool": false, + "value_bool": true, "source": "cmdline" }, "plugin": { - "values_str": [ - "~/lightning/target/debug/examples/cln-plugin-startup" - ], - "sources": [ - "cmdline" - ] + "values_str": [], + "sources": [] }, "plugin-dir": { "values_str": [], @@ -2632,20 +2720,16 @@ "source": "default" }, "experimental-dual-fund": { - "set": false, - "source": "default" + "set": true, + "source": "cmdline" }, "experimental-splicing": { "set": false, "source": "default" }, - "experimental-onion-messages": { - "set": false, - "source": "default" - }, "experimental-offers": { - "set": false, - "source": "default" + "set": true, + "source": "cmdline" }, "experimental-shutdown-wrong-funding": { "set": false, @@ -2659,20 +2743,16 @@ "set": false, "source": "default" }, - "experimental-anchors": { - "set": false, - "source": "default" - }, "rgb": { - "value_str": "0266e4", + "value_str": "022d22", "source": "default" }, "alias": { - "value_str": "JUNIORBEAM-1-102-g7549e10-modded", + "value_str": "SILENTARTIST-190-g5fd2f9c-modded", "source": "default" }, "pid-file": { - "value_str": "/tmp/ltests-giwf5tc7/test_plugin_start_1/lightning-1/lightningd-regtest.pid", + "value_str": "/tmp/.lightning/lightningd-regtest.pid", "source": "default" }, "ignore-fee-limits": { @@ -2683,10 +2763,6 @@ "value_int": 5, "source": "cmdline" }, - "max-locktime-blocks": { - "value_int": 2016, - "source": "default" - }, "funding-confirms": { "value_int": 1, "source": "default" @@ -2742,7 +2818,7 @@ }, "addr": { "values_str": [ - "127.0.0.1:33157" + "127.0.0.1:41219" ], "sources": [ "cmdline" @@ -2812,6 +2888,10 @@ "set": false, "source": "default" }, + "i-promise-to-fix-broken-api-user": { + "values_str": [], + "sources": [] + }, "log-level": { "value_str": "debug", "source": "cmdline" @@ -2821,95 +2901,151 @@ "source": "default" }, "log-prefix": { - "value_str": "lightningd-1 ", + "value_str": "lightningd-2 ", "source": "cmdline" }, "log-file": { "values_str": [ "-", - "/tmp/ltests-giwf5tc7/test_plugin_start_1/lightning-1/log" + "/tmp/.lightning/log" ], "sources": [ "cmdline", "cmdline" ] }, - "dev-no-plugin-checksum": { - "set": true, - "source": "cmdline" - }, - "dev-no-reconnect": { - "set": true, - "source": "cmdline" - }, "dev-fail-on-subdaemon-fail": { "set": true, "source": "cmdline" }, "dev-bitcoind-poll": { - "value_int": 1, + "value_int": 3, "source": "cmdline" }, "dev-fast-gossip": { "set": true, "source": "cmdline" }, - "renepay-debug-mcf": { - "set": false, - "source": "default", - "plugin": "~/lightning/plugins/cln-renepay" + "dev-hsmd-no-preapprove-check": { + "set": true, + "source": "cmdline" }, - "renepay-debug-payflow": { - "set": false, + "autoclean-cycle": { + "value_int": 3600, "source": "default", - "plugin": "~/lightning/plugins/cln-renepay" + "plugin": "/root/lightning/plugins/autoclean", + "dynamic": true }, - "test-option": { - "value_int": 31337, - "source": "cmdline", - "plugin": "~/lightning/target/debug/examples/cln-plugin-startup" + "dev-autoclean-max-batch": { + "value_int": 10000, + "source": "default", + "plugin": "/root/lightning/plugins/autoclean", + "dynamic": true }, "bitcoin-datadir": { - "value_str": "/tmp/ltests-giwf5tc7/test_plugin_start_1/lightning-1/", + "value_str": "/tmp/.lightning/", "source": "cmdline", - "plugin": "~/lightning/plugins/bcli" + "plugin": "/root/lightning/plugins/bcli" }, "bitcoin-rpcuser": { "value_str": "rpcuser", "source": "cmdline", - "plugin": "~/lightning/plugins/bcli" + "plugin": "/root/lightning/plugins/bcli" }, "bitcoin-rpcpassword": { "value_str": "rpcpass", "source": "cmdline", - "plugin": "~/lightning/plugins/bcli" + "plugin": "/root/lightning/plugins/bcli" }, "bitcoin-rpcport": { - "value_int": 51309, + "value_int": 51251, "source": "cmdline", - "plugin": "~/lightning/plugins/bcli" + "plugin": "/root/lightning/plugins/bcli" + }, + "bitcoin-rpcclienttimeout": { + "value_int": 60, + "source": "default", + "plugin": "/root/lightning/plugins/bcli" + }, + "bitcoin-retry-timeout": { + "value_int": 60, + "source": "default", + "plugin": "/root/lightning/plugins/bcli" + }, + "funder-policy": { + "value_str": "fixed", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-policy-mod": { + "value_str": "0", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-min-their-funding": { + "value_str": "10000sat", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-max-their-funding": { + "value_str": "4294967295sat", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-per-channel-min": { + "value_str": "10000sat", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-per-channel-max": { + "value_str": "4294967295sat", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-reserve-tank": { + "value_str": "0sat", + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-fuzz-percent": { + "value_int": 0, + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-fund-probability": { + "value_int": 100, + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "funder-lease-requests-only": { + "value_bool": true, + "source": "default", + "plugin": "/root/lightning/plugins/funder" + }, + "fetchinvoice-noconnect": { + "set": false, + "source": "default", + "plugin": "/root/lightning/plugins/offers" + }, + "dev-invoice-bpath-scid": { + "set": false, + "source": "default", + "plugin": "/root/lightning/plugins/offers" }, "disable-mpp": { "set": false, "source": "default", - "plugin": "~/lightning/plugins/pay" - } - } - } - }, - { - "request": { - "id": "example:listconfigs#3", - "method": "listconfigs", - "params": { - "config": "experimental-dual-fund" - } - }, - "response": { - "configs": { - "experimental-dual-fund": { + "plugin": "/root/lightning/plugins/pay" + }, + "renepay-debug-mcf": { "set": false, - "source": "default" + "source": "default", + "plugin": "/root/lightning/plugins/cln-renepay" + }, + "renepay-debug-payflow": { + "set": false, + "source": "default", + "plugin": "/root/lightning/plugins/cln-renepay" } } } diff --git a/doc/schemas/lightning-listdatastore.json b/doc/schemas/lightning-listdatastore.json index d312a26b024b..b3db1fb48cca 100644 --- a/doc/schemas/lightning-listdatastore.json +++ b/doc/schemas/lightning-listdatastore.json @@ -99,12 +99,22 @@ "method": "listdatastore", "params": { "key": [ - "commando" + "test" ] } }, "response": { - "datastore": [] + "datastore": [ + { + "key": [ + "test", + "name" + ], + "generation": 0, + "hex": "736176696e67206461746120746f207468652073746f7265", + "string": "saving data to the store" + } + ] } }, { @@ -121,9 +131,9 @@ "key": [ "otherkey" ], - "generation": 0, - "hex": "6f7468657264617461", - "string": "otherdata" + "generation": 1, + "hex": "666f6f626172", + "string": "foobar" } ] } diff --git a/doc/schemas/lightning-listforwards.json b/doc/schemas/lightning-listforwards.json index a8c0a46bd937..f1e0115c3afd 100644 --- a/doc/schemas/lightning-listforwards.json +++ b/doc/schemas/lightning-listforwards.json @@ -7,6 +7,9 @@ "description": [ "The **listforwards** RPC command displays all htlcs that have been attempted to be forwarded by the Core Lightning node." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -377,55 +380,103 @@ "request": { "id": "example:listforwards#1", "method": "listforwards", - "params": {} + "params": { + "in_channel": "109x1x1", + "out_channel": "111x1x0", + "status": "settled" + } }, "response": { "forwards": [ { "created_index": 1, "updated_index": 1, - "in_channel": "103x1x0", - "in_htlc_id": 0, - "out_channel": "104x1x0", - "out_htlc_id": 0, - "in_msat": 100001001, - "out_msat": 100000000, - "fee_msat": 1001, + "in_channel": "109x1x1", + "in_htlc_id": 1, + "out_channel": "111x1x0", + "out_htlc_id": 1, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, "status": "settled", "style": "tlv", - "received_time": 1706229285.5934534, - "resolved_time": 1706229288.830004 + "received_time": 1722303675.3853297, + "resolved_time": 1722303676.8396847 }, { "created_index": 2, "updated_index": 2, - "in_channel": "103x1x0", - "in_htlc_id": 1, - "out_channel": "105x1x0", - "out_htlc_id": 0, - "in_msat": 100001001, - "out_msat": 100000000, - "fee_msat": 1001, - "status": "failed", + "in_channel": "109x1x1", + "in_htlc_id": 2, + "out_channel": "111x1x0", + "out_htlc_id": 2, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, + "status": "settled", "style": "tlv", - "received_time": 1706229290.0289993, - "resolved_time": 1706229292.9487684 + "received_time": 1722303677.6214294, + "resolved_time": 1722303679.0363395 }, { "created_index": 3, "updated_index": 3, - "in_channel": "103x1x0", - "in_htlc_id": 2, - "out_channel": "106x1x0", - "out_htlc_id": 0, - "in_msat": 100001000, - "out_msat": 99999999, - "fee_msat": 1001, - "status": "local_failed", - "failcode": 16392, - "failreason": "WIRE_PERMANENT_CHANNEL_FAILURE", + "in_channel": "109x1x1", + "in_htlc_id": 3, + "out_channel": "111x1x0", + "out_htlc_id": 3, + "in_msat": 10000202, + "out_msat": 10000101, + "fee_msat": 101, + "status": "settled", "style": "tlv", - "received_time": 1706229295.3175724 + "received_time": 1722303679.8093705, + "resolved_time": 1722303682.2599013 + }, + { + "created_index": 5, + "updated_index": 4, + "in_channel": "109x1x1", + "in_htlc_id": 5, + "out_channel": "111x1x0", + "out_htlc_id": 4, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303684.4914763, + "resolved_time": 1722303685.8940926 + }, + { + "created_index": 6, + "updated_index": 5, + "in_channel": "109x1x1", + "in_htlc_id": 6, + "out_channel": "111x1x0", + "out_htlc_id": 5, + "in_msat": 50001, + "out_msat": 50000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303686.7160892, + "resolved_time": 1722303688.1316907 + }, + { + "created_index": 7, + "updated_index": 6, + "in_channel": "109x1x1", + "in_htlc_id": 7, + "out_channel": "111x1x0", + "out_htlc_id": 7, + "in_msat": 1002, + "out_msat": 1001, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303689.9082303, + "resolved_time": 1722303692.3156552 } ] } @@ -434,14 +485,125 @@ "request": { "id": "example:listforwards#2", "method": "listforwards", - "params": { - "in_channel": "0x1x2", - "out_channel": "0x2x3", - "status": "settled" - } + "params": {} }, "response": { - "forwards": [] + "forwards": [ + { + "created_index": 1, + "updated_index": 1, + "in_channel": "109x1x1", + "in_htlc_id": 1, + "out_channel": "111x1x0", + "out_htlc_id": 1, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303675.3853297, + "resolved_time": 1722303676.8396847 + }, + { + "created_index": 2, + "updated_index": 2, + "in_channel": "109x1x1", + "in_htlc_id": 2, + "out_channel": "111x1x0", + "out_htlc_id": 2, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303677.6214294, + "resolved_time": 1722303679.0363395 + }, + { + "created_index": 3, + "updated_index": 3, + "in_channel": "109x1x1", + "in_htlc_id": 3, + "out_channel": "111x1x0", + "out_htlc_id": 3, + "in_msat": 10000202, + "out_msat": 10000101, + "fee_msat": 101, + "status": "settled", + "style": "tlv", + "received_time": 1722303679.8093705, + "resolved_time": 1722303682.2599013 + }, + { + "created_index": 4, + "in_channel": "109x1x1", + "in_htlc_id": 4, + "out_channel": "6250403x3681116x19863", + "in_msat": 10001, + "status": "local_failed", + "failcode": 16394, + "failreason": "WIRE_UNKNOWN_NEXT_PEER", + "style": "tlv", + "received_time": 1722303683.0972922 + }, + { + "created_index": 5, + "updated_index": 4, + "in_channel": "109x1x1", + "in_htlc_id": 5, + "out_channel": "111x1x0", + "out_htlc_id": 4, + "in_msat": 10001, + "out_msat": 10000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303684.4914763, + "resolved_time": 1722303685.8940926 + }, + { + "created_index": 6, + "updated_index": 5, + "in_channel": "109x1x1", + "in_htlc_id": 6, + "out_channel": "111x1x0", + "out_htlc_id": 5, + "in_msat": 50001, + "out_msat": 50000, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303686.7160892, + "resolved_time": 1722303688.1316907 + }, + { + "created_index": 7, + "updated_index": 6, + "in_channel": "109x1x1", + "in_htlc_id": 7, + "out_channel": "111x1x0", + "out_htlc_id": 7, + "in_msat": 1002, + "out_msat": 1001, + "fee_msat": 1, + "status": "settled", + "style": "tlv", + "received_time": 1722303689.9082303, + "resolved_time": 1722303692.3156552 + }, + { + "created_index": 8, + "in_channel": "109x1x1", + "in_htlc_id": 8, + "out_channel": "111x1x0", + "in_msat": 10001, + "status": "local_failed", + "failcode": 16394, + "failreason": "WIRE_UNKNOWN_NEXT_PEER", + "style": "tlv", + "received_time": 1722303697.0961268 + } + ] } } ] diff --git a/doc/schemas/lightning-listfunds.json b/doc/schemas/lightning-listfunds.json index 6ca1e9937a65..64ffea6a86e4 100644 --- a/doc/schemas/lightning-listfunds.json +++ b/doc/schemas/lightning-listfunds.json @@ -7,6 +7,9 @@ "description": [ "The **listfunds** RPC command displays all funds available, either in unspent outputs (UTXOs) in the internal wallet or funds locked in currently open channels." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -351,27 +354,49 @@ "response": { "outputs": [ { - "txid": "0f184b101569bf777af3449fa266948a9d55768f97867e48416a2c92858dd1bc", - "output": 1, - "amount_msat": 1111111000, - "scriptpubkey": "001401fad90abcd66697e2592164722de4a95ebee165", - "address": "bcrt1qq8adjz4u6enf0cjey9j8yt0y490tact93fzgsf", + "txid": "9454852bb62e304ee8933662284e10bd22a7f3710c262da4c94bdcc8b05ae407", + "output": 0, + "amount_msat": 19993653000, + "scriptpubkey": "51206c27e1956acfa61e68292c80908880e813450f754132e8a2ac471a86bf1326b5", + "address": "bcrt1pdsn7r9t2e7npu6pf9jqfpzyqaqf52rm4gyew3g4vgudgd0cny66srft45s", "status": "confirmed", - "blockheight": 102, + "blockheight": 103, "reserved": false }, { - "txid": "4bee7dc3a28f2434e9bb3e9aaab418dd276485a8705b0f787bf741d3f979ec3b", - "output": 1, - "amount_msat": 1111111000, - "scriptpubkey": "001401fad90abcd66697e2592164722de4a95ebee165", - "address": "bcrt1qq8adjz4u6enf0cjey9j8yt0y490tact93fzgsf", + "txid": "7547ffc11396c62852104f7100d5ca27a2b9c0d5d43d08122147b2b03eb157a5", + "output": 0, + "amount_msat": 2000000000, + "scriptpubkey": "00149fb67bfcefee6cb7db4c7e55d9c6bfd749e31d1e", + "address": "bcrt1qn7m8hl80aekt0k6v0e2an34l6ay7x8g703x07y", "status": "confirmed", - "blockheight": 102, + "blockheight": 108, + "reserved": false + }, + { + "txid": "737d6835ddafd515ba9e9def733bb4e4211f6053a32b1422bf1c8cc240850f96", + "output": 0, + "amount_msat": 198995073000, + "scriptpubkey": "512035f1184f6b470c9df347da62c4b28e7ec9ee10b220bac3accd22209def0036ea", + "address": "bcrt1pxhc3snmtguxfmu68mf3vfv5w0my7uy9jyzav8txdygsfmmcqxm4q0mms62", + "status": "confirmed", + "blockheight": 109, "reserved": false } ], - "channels": [] + "channels": [ + { + "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "connected": true, + "state": "CHANNELD_NORMAL", + "channel_id": "252d1b0a1e57895e84137f28cf19ab2c35847e284c112fefdecc7afeaa5c1de7", + "short_channel_id": "109x1x1", + "our_amount_msat": 490518792, + "amount_msat": 1000000000, + "funding_txid": "737d6835ddafd515ba9e9def733bb4e4211f6053a32b1422bf1c8cc240850f96", + "funding_output": 1 + } + ] } } ] diff --git a/doc/schemas/lightning-listhtlcs.json b/doc/schemas/lightning-listhtlcs.json index ed9aca0fd5a2..67d0c8727bfb 100644 --- a/doc/schemas/lightning-listhtlcs.json +++ b/doc/schemas/lightning-listhtlcs.json @@ -7,6 +7,9 @@ "description": [ "The **listhtlcs** RPC command gets all HTLCs (which, generally, we remember for as long as a channel is open, even if they've completed long ago)." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -125,45 +128,110 @@ "request": { "id": "example:listhtlcs#1", "method": "listhtlcs", - "params": {} + "params": [ + "109x1x1" + ] }, "response": { "htlcs": [ { - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "id": 0, - "expiry": 117, + "expiry": 126, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "d2668e77c5a2220496e813de36f1fc09ba804b16af4c6bb38299d8a6eb8a5f10", + "amount_msat": 500000000, + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "id": 1, - "expiry": 117, + "expiry": 136, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "286e08ac8f575f10508d751fcfc93871b4344271967c7b9e5eacb3f3573b8307", + "amount_msat": 10001, + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "id": 2, - "expiry": 135, + "expiry": 149, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "3e4baa750ee3dfb934578f041ccb40b87432bf37ec65c9d7bce5ff28fecbd95f", + "amount_msat": 10001, + "payment_hash": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "id": 3, - "expiry": 135, + "expiry": 155, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "4c3ce32565dc10ef2bd230c32802ce2fe8b007208c0a90757aa289f75c994d49", - "state": "SENT_REMOVE_REVOCATION" + "amount_msat": 10000202, + "payment_hash": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 4, + "expiry": 152, + "direction": "out", + "amount_msat": 10001, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 5, + "expiry": 149, + "direction": "out", + "amount_msat": 10001, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 6, + "expiry": 132, + "direction": "out", + "amount_msat": 50001, + "payment_hash": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 7, + "expiry": 142, + "direction": "out", + "amount_msat": 1002, + "payment_hash": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 8, + "expiry": 137, + "direction": "out", + "amount_msat": 10001, + "payment_hash": "968c136c07c39b17d1925358dd36f5dd86f8691c666ec27f24de5a84d590dc49", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 0, + "expiry": 136, + "direction": "in", + "amount_msat": 1000000, + "payment_hash": "a003badd6ad30f05f56e3607fd538456b05b9aad6135a494dad5320010af5844", + "state": "SENT_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 9, + "expiry": 136, + "direction": "out", + "amount_msat": 400000, + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "state": "RCVD_REMOVE_ACK_REVOCATION" } ] } @@ -172,86 +240,107 @@ "request": { "id": "example:listhtlcs#2", "method": "listhtlcs", - "params": [ - "103x2x0" - ] + "params": {} }, "response": { "htlcs": [ { - "short_channel_id": "103x2x0", + "short_channel_id": "109x1x1", "id": 0, - "expiry": 117, + "expiry": 126, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "12bb14b1d119e1ae0759e5ff6f1f6653e3fd8f71ea59411500d2871404a47a98", + "amount_msat": 500000000, + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x2x0", + "short_channel_id": "109x1x1", "id": 1, - "expiry": 117, + "expiry": 136, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "57d950209cc0b4fcc5e3027569232f96cf83ef85314c6b139a5713848d811a66", + "amount_msat": 10001, + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x2x0", + "short_channel_id": "109x1x1", "id": 2, - "expiry": 135, + "expiry": 149, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "45ad4654715411a07a0ad6ec3f4bfaa918c90e3d1934b10b1c1c5846523ddd7f", + "amount_msat": 10001, + "payment_hash": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x2x0", + "short_channel_id": "109x1x1", "id": 3, - "expiry": 135, + "expiry": 155, "direction": "out", - "amount_msat": 100001001, - "payment_hash": "cc0dcd214aa71c62bfba711a0746da821f2cdba1770b11c225920bdde12c931e", + "amount_msat": 10000202, + "payment_hash": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", "state": "RCVD_REMOVE_ACK_REVOCATION" - } - ] - } - }, - { - "request": { - "id": "example:listhtlcs#3", - "method": "listhtlcs", - "params": [ - "436c2658eb4f4689b42ff11b8b05f31ba09860d0df7168085e0796cdf40f85e0" - ] - }, - "response": { - "htlcs": [ + }, { - "short_channel_id": "103x1x0", - "id": 0, - "expiry": 124, + "short_channel_id": "109x1x1", + "id": 4, + "expiry": 152, "direction": "out", - "amount_msat": 1001, - "payment_hash": "2ab653668c8017ff2f36ac36678a8da04e11380bd9580a2926b170523b0c6e3b", + "amount_msat": 10001, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x1x0", - "id": 1, - "expiry": 124, + "short_channel_id": "109x1x1", + "id": 5, + "expiry": 149, "direction": "out", - "amount_msat": 2001, - "payment_hash": "92f889cb2e48aa28e1e577228b907cdbcc371a2c018e9c8f60fa7036e232cf1d", + "amount_msat": 10001, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", "state": "RCVD_REMOVE_ACK_REVOCATION" }, { - "short_channel_id": "103x1x0", - "id": 2, - "expiry": 128, + "short_channel_id": "109x1x1", + "id": 6, + "expiry": 132, + "direction": "out", + "amount_msat": 50001, + "payment_hash": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 7, + "expiry": 142, + "direction": "out", + "amount_msat": 1002, + "payment_hash": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 8, + "expiry": 137, + "direction": "out", + "amount_msat": 10001, + "payment_hash": "968c136c07c39b17d1925358dd36f5dd86f8691c666ec27f24de5a84d590dc49", + "state": "RCVD_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 0, + "expiry": 136, + "direction": "in", + "amount_msat": 1000000, + "payment_hash": "a003badd6ad30f05f56e3607fd538456b05b9aad6135a494dad5320010af5844", + "state": "SENT_REMOVE_ACK_REVOCATION" + }, + { + "short_channel_id": "109x1x1", + "id": 9, + "expiry": 136, "direction": "out", - "amount_msat": 4001, - "payment_hash": "14ef01c9fb12d7dcac288f48ce87b19a7d5c3d5779aaed1e4adcb5c5d0e9fa45", + "amount_msat": 400000, + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", "state": "RCVD_REMOVE_ACK_REVOCATION" } ] diff --git a/doc/schemas/lightning-listinvoicerequests.json b/doc/schemas/lightning-listinvoicerequests.json index ec12de2bc8e5..e75be7c86b46 100644 --- a/doc/schemas/lightning-listinvoicerequests.json +++ b/doc/schemas/lightning-listinvoicerequests.json @@ -8,6 +8,9 @@ "description": [ "The **listinvoicerequests** RPC command gets the status of a specific `invoice_request`, if it exists, or the status of all `invoice_requests` if given no argument." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -101,16 +104,41 @@ "id": "example:listinvoicerequests#1", "method": "listinvoicerequests", "params": [ - "cf0b41d4eb248d975909deb9accf9722b1c86839de80ee8815ce907bbb700a1d" + "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9" ] }, "response": { "invoicerequests": [ { - "invreq_id": "cf0b41d4eb248d975909deb9accf9722b1c86839de80ee8815ce907bbb700a1d", - "active": true, + "invreq_id": "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9", + "active": false, + "single_use": true, + "bolt12": "lnr1qqgx5t5hcw5ru9fgkhgxj4thjq4ugzsk2fjhzat9wd6xjmn8ypnx7u3qd9h8vmmfvdj3yyrrd35kw6r5de5kueeqwd6x7un92qsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzr6jqwvfdqzcyypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgpvamrunx5t6vdaeu7nmmlh5u6f0dnscasy2alyxq79f5wnc043gxrzyqt640dmuj7c94644j5ae6wfse7tsejwqnmc575ly9t38h4hf", + "used": false + } + ] + } + }, + { + "request": { + "id": "example:listinvoicerequests#2", + "method": "listinvoicerequests", + "params": {} + }, + "response": { + "invoicerequests": [ + { + "invreq_id": "93f193cd2432d292f8b64af08942989d71c0a0366fb52d57ddb688c8fb066399", + "active": false, + "single_use": true, + "bolt12": "lnr1qqgypua5g7rp293k00s66ayvnv26czst2d5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gps7sjqtqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e7pq947t0ks7a4yejz8w79x4zj25s3pu6zrnw2e0v2ugdescpcqsq307z4p2dlxe92fv7xd43qut0pjkg4y094hupqyhsj8dlhvmmfng6sv", + "used": true + }, + { + "invreq_id": "a621a0e8e8ea9aa97fd47ab9b140e413be7f4ea45377617e693eb7afe5a3dbf9", + "active": false, "single_use": true, - "bolt12": "lnr1qqgx9ag7nmtns87htndlgcfndlq0wzstwd5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gzqta0pqpvzzqnxu3vc68fug904w25y3zpskc8huazwmy34av93h2fjswe3tsp4rrcyps5sf5jwnn2tr3ghn32mdta8jvax62pwzhna8sktmaezl3f4s3zy35gx6dfay7r8zn299uwr7ugpze74zft4m8q3fnk2sr0ljqpve3jq", + "bolt12": "lnr1qqgx5t5hcw5ru9fgkhgxj4thjq4ugzsk2fjhzat9wd6xjmn8ypnx7u3qd9h8vmmfvdj3yyrrd35kw6r5de5kueeqwd6x7un92qsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzr6jqwvfdqzcyypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgpvamrunx5t6vdaeu7nmmlh5u6f0dnscasy2alyxq79f5wnc043gxrzyqt640dmuj7c94644j5ae6wfse7tsejwqnmc575ly9t38h4hf", "used": false } ] diff --git a/doc/schemas/lightning-listinvoices.json b/doc/schemas/lightning-listinvoices.json index 12019a1701b3..775fe023f3ab 100644 --- a/doc/schemas/lightning-listinvoices.json +++ b/doc/schemas/lightning-listinvoices.json @@ -9,6 +9,9 @@ "", "Only one of the query parameters can be used from *label*, *invstring*, *payment_hash*, or *offer_id*." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -304,22 +307,151 @@ "id": "example:listinvoices#1", "method": "listinvoices", "params": { - "label": "xEoCR94SIz6UIRUEkxum" + "label": "lbl_l21" } }, "response": { "invoices": [ { - "label": "xEoCR94SIz6UIRUEkxum", - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk", - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", - "amount_msat": 11000000, + "label": "lbl_l21", + "bolt11": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7", + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "status": "paid", + "pay_index": 3, + "amount_received_msat": 400000, + "paid_at": 1722303718, + "payment_preimage": "af67b48518e78e157db404d13cb42987c31e034634203d10b224302b05fc6c90", + "description": "l21 description", + "expires_at": 1722908486, + "created_index": 2, + "updated_index": 3 + } + ] + } + }, + { + "request": { + "id": "example:listinvoices#2", + "method": "listinvoices", + "params": {} + }, + "response": { + "invoices": [ + { + "label": "lbl balance l1 to l2", + "bolt11": "lnbcrt5m1pn2s39ksp53sknyy2mxxurt4y0wqgp730z0cnm0vz3zmzth8p79xsrtmg5llxspp5dp94v59nm6c99jf7lc07zmnhqw6kyujx3mkdav7643dczgtdedfqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcvfqw3hjqmpjxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqdz9cftkxe6kcqfddyrvr7j57ulsfxxxkgkjyhr3k77n8v59mzs5rmuexz9lxusyhhehlemd9ujclgahln8e0n8y86stc7u8uys6mjqgqerm6q4", + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", + "amount_msat": 500000000, + "status": "paid", + "pay_index": 1, + "amount_received_msat": 500000000, + "paid_at": 1722303671, + "payment_preimage": "bed4140e1db302720d7f9547dc9127d45b115080447cce7e23cfd00b60991831", + "description": "description send some sats l1 to l2", + "expires_at": 1722908470, + "created_index": 1, + "updated_index": 1 + }, + { + "label": "lbl_l21", + "bolt11": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7", + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "status": "paid", + "pay_index": 3, + "amount_received_msat": 400000, + "paid_at": 1722303718, + "payment_preimage": "af67b48518e78e157db404d13cb42987c31e034634203d10b224302b05fc6c90", + "description": "l21 description", + "expires_at": 1722908486, + "created_index": 2, + "updated_index": 3 + }, + { + "label": "lbl_l22", + "bolt11": "lnbcrt2u1pn2s3xxsp5cpcdj2cy5wpd2nphp2evrp9kqymxf9434zftkmdd6dlgmy8cu78qpp58yq5qf3h0694xwymzjs5e8eejce83vjmxv6cpwqv8cs9e05dxe4qdqcdserygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq9wlpxf8ur0q798646w94tduf6wfkaw7m0ecmxepgatd4utvsyvcy0pku9t8m39rlsjzhe8x53mup5jkn0f84clfj3ctc6qj09t35wxspycpup2", + "payment_hash": "39014026377e8b53389b14a14c9f39963278b25b333580b80c3e205cbe8d366a", + "amount_msat": 200000, + "status": "unpaid", + "description": "l22 description", + "expires_at": 1722908486, + "created_index": 3 + }, + { + "label": "label inv_l24", + "bolt11": "lnbcrt1230n1pn2s38psp5jf2zk7py4wmutyq4pdr6783egft24nkyhfrxegrzzqnef2matw2qpp5rf5zgqyexdt7q5ean83cvcjuc3jafn8etm3c0za6xldwcyllvffqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydqcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgq8nn5qkcp9xl5u7dlqamdys6e6yc0ngyqe676cqajnwax6657verj7at5gvdqu6nk3l0wcagq4muyhqqms4t0t9sfvyazpga5eywj6uqpyc409e", + "payment_hash": "1a682400993357e0533d99e386625cc465d4ccf95ee3878bba37daec13ff6252", + "amount_msat": 123000, + "status": "unpaid", + "description": "description inv_l24", + "expires_at": 1722307313, + "created_index": 4 + }, + { + "label": "label inv_l25", + "bolt11": "lnbcrt1240n1pn2s38psp5ufjqj6kuxlvl65xue9p06ulyvwf9sm0utxlch59d0ynl05778vwspp5qlacxkrdmc2p50yl8lsl75pwmlhve2ret2yd2f34z7jfs7yffwvqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydgcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqkml60qaytvnd08p57w7enuna95s7cqej8cfuvsgjzpeq9u83s0hqh60667nrp40qkqxkdu36z8wqtmac5z3208rwyn0q2pv56sgz5dcp9mn5hc", + "payment_hash": "07fb83586dde141a3c9f3fe1ff502edfeecca8795a88d5263517a49878894b98", + "amount_msat": 124000, + "status": "unpaid", + "description": "description inv_l25", + "expires_at": 1722307313, + "created_index": 5 + }, + { + "label": "label inv_l26", + "bolt11": "lnbcrt1250n1pn2s38psp5u22hlvy5mk7keq57m4fatz7aqnmh4whcuk45npdexrw4m5athcvqpp5ps4h5lt8waz5pprvad3skzssnksl2wxng985rcsuedp8teh29rkqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydscqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqyljtru0gcvqh7k5l9u8ulcuxw8fwa9qycyd32hl7wwdpjtlefgrpyjch6aprcdah2pthx3pku3y7c6dzluzjjy9c32cs3m5hqq6ww3sp0j4tr8", + "payment_hash": "0c2b7a7d67774540846ceb630b0a109da1f538d3414f41e21ccb4275e6ea28ec", + "amount_msat": 125000, + "status": "unpaid", + "description": "description inv_l26", + "expires_at": 1722307313, + "created_index": 6 + }, + { + "label": "lbl_l13", + "bolt11": "lnbcrt1u1pn2s38zsp5j9w8t9p2y6an5se63n3vkpp8c20vdsthtn78sv5t2lmt57l742wqpp5wtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7fsdqcdscnxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqcjq9fq26ph2skcsm65xjwnw3crgygpampszjcvqs8aw2zf3jzcxqg4dh58fm8mxul29vh5urpyjkll9m4dq3807xcmq2q9yvgd5qt7qp695qvu", + "payment_hash": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "amount_msat": 100000, + "status": "unpaid", + "description": "l13 description", + "expires_at": 1722908514, + "created_index": 7 + }, + { + "label": "lbl_l23", + "bolt11": "lnbcrt1pn2s38zsp5lv49w44a8tvkwtkxfxwts8rnr864u59srp7sxuua3haahdhlhtrqpp5p928w8rmsg2hjeymedcn54vxhsz372qhcedgf003nmsknhx9594sdqcdserxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqt5h8te9lkn0jpdkhkmlkzs80aw7mt5kdm6jxmvddkavt3vj0vakkmfcs0hsde8y8g8za46sch2lp4jxy56u8ve25sgpgcsya0vp92sgphzw570", + "payment_hash": "0954771c7b821579649bcb713a5586bc051f2817c65a84bdf19ee169dcc5a16b", + "status": "paid", + "pay_index": 2, + "amount_received_msat": 9900, + "paid_at": 1722303715, + "payment_preimage": "f3a3b40d63e62785f537aad60f93980914c5639872c7746299a6a1228abbc303", + "description": "l23 description", + "expires_at": 1722908514, + "created_index": 8, + "updated_index": 2 + }, + { + "label": "dca9774ba2925b48c42eb12e599c09389d9d80d44445c4d0c944556c7228746e-025f3305ae63d757b277dd49301833087ba6208e743ce95fa6e950fa80be407e5f-0", + "bolt12": "lni1qqg9g04gczk9ntk4gsjg3aptwykk2q3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssq38zq9q53nfwd5zqumpd3jjz93pqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4j5pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84sggztuesttnr6atmya7afycpsvcg0wnzprn58n54lfhf2ragp0jq0e04j9z5dpsku6mnypnx7u3qw35x2grxd9eksgdqnqpz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336kgr6euj6p39a209zw5kpkftk7h9te69vlmjg0arceagpaajague0zsszqk96htpgqn2wsznaas0zfdtf8v97ryz29jrn7rwgs5687ghgq5jusqr99dtx4jdj9nqpep5zxmynegrg6e7rm2l53ur8043h2yqzldyl5vh08h8ssaeq5jrvw9y24kztlwvc4nwagsuqqqqqqqqqqqqqqq9qqqqqqqqqqqqq8fykt06c5sqqqqqpfqyv65yfedgyqrp2s7qpxpjse8q8796qcrr5xwgfkqjue3urd6rs2rt2f68tk0vl2szyugtqggz953rvg9rtxj8lalh43z8epwydjfrmffn3y3p5qz5cywpu09rr4vlqsy2n7vmpn67ltzrj70znp70sk4m530j5vceq6jhk97h7ttzn09sh8m9gecarrt27v2tux8z6rr06sj9h60r05p4vhkhzsp0xf9ea4jgg", + "payment_hash": "061543c009832864e03f8ba06063a19c84d812e663c1b7438286b527475d9ecf", + "amount_msat": 10000, + "status": "unpaid", + "description": "Fish sale!", + "expires_at": 1722310917, + "local_offer_id": "dca9774ba2925b48c42eb12e599c09389d9d80d44445c4d0c944556c7228746e", + "invreq_payer_note": "Thanks for the fish!", + "created_index": 9 + }, + { + "label": "f901018768e13ea2da95f437749e24d22d47b2a6ea3030ef66ae0281df49d94b-03014d72261012e28cb4711a985c1475eba04a0058f9d04321b4cf1de479711d6f-0", + "bolt12": "lni1qqg86u6jfl660zfuk22sexem37r7xq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqc0gfqq5pjrdanxvet9zsqs593pqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4j5pqqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy84yqc7sjq9vqgztqssxq2dwgnpqyhz3j68zx5cts28t6aqfgq937wsgvsmfncau3uhz8t05zvqytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82eq2rdjuqaychg3jndvsjrlu6y08aeuh4ytw6f6ak5n24p5n8zmsz2sqgrg3rg89hqfh6n7dfr0fugvq20ehecd3ezc438l6uh4r8epaakn4lsqv4qgr3ks4yxngyflq339lza456xt8uly085umq3gwql3qyfge0ec03dezeg8xulz33ntlj8yd7dcra9564zrsqqqqqqqqqqqqqqq5qqqqqqqqqqqqqayjedltzjqqqqqq9yq3n2s3894qsfwwvj3szk4yplg4fkw68nwzlwyc23457qx6v7xe38znuha72km6a2qv0gfq9syypz6g3kyz34nfrl7lm6c3rushzxey3a55ecjgs6qp2vz8q78j336k0sgz2rxjcsxs6s3lnngq9xeqn9pzy53n50p4ulcdvkx8dye7h8xgxpvjyg928m2txk2knl0zzfl7j82c6lq7xqlx83ey7z4aux9pjp4sp7", + "payment_hash": "9739928c056a903f45536768f370bee26151ad3c03699e3662714f97ef956deb", + "amount_msat": 2000000, "status": "unpaid", - "description": [ - "XEoCR94SIz6UIRUEkxum." - ], - "expires_at": 1706757730, - "created_index": 1 + "description": "Coffee", + "expires_at": 1722310917, + "local_offer_id": "f901018768e13ea2da95f437749e24d22d47b2a6ea3030ef66ae0281df49d94b", + "created_index": 10 } ] } diff --git a/doc/schemas/lightning-listnodes.json b/doc/schemas/lightning-listnodes.json index 8365734669d0..d4859e721064 100644 --- a/doc/schemas/lightning-listnodes.json +++ b/doc/schemas/lightning-listnodes.json @@ -7,6 +7,9 @@ "description": [ "The **listnodes** command returns nodes the node has learned about via gossip messages, or a single one if the node *id* was specified." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -265,24 +268,18 @@ "id": "example:listnodes#1", "method": "listnodes", "params": { - "id": "02e29856dab8ddd9044c18486e4cab79ec717b490447af2d4831e290e48d57638a" + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d" } }, "response": { "nodes": [ { - "nodeid": "02e29856dab8ddd9044c14586e4cab79ec717b490447af2d4831e290e48d58638a", - "alias": "some_alias", - "color": "68f442", - "last_timestamp": 1597213741, - "features": "02a2a1", - "addresses": [ - { - "type": "ipv4", - "address": "zzz.yy.xx.xx", - "port": 9735 - } - ] + "nodeid": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "alias": "HOPPINGFIRE--190-g5fd2f9c-modded", + "color": "035d2b", + "last_timestamp": 1722303669, + "features": "88a0802a8a59a1", + "addresses": [] } ] } @@ -297,34 +294,34 @@ "nodes": [ { "nodeid": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "alias": "SILENTARTIST-v23.11-415-gd120eba", + "alias": "SILENTARTIST-190-g5fd2f9c-modded", "color": "022d22", - "last_timestamp": 1708624765, - "features": "88a0000a8a5961", + "last_timestamp": 1722303662, + "features": "88a0802a8a59a1", "addresses": [] }, { "nodeid": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "alias": "JUNIORBEAM-v23.11-415-gd120eba", + "alias": "JUNIORBEAM-5-190-g5fd2f9c-modded", "color": "0266e4", - "last_timestamp": 1708624765, - "features": "88a0000a8a5961", + "last_timestamp": 1722303662, + "features": "88a0802a8a59a1", "addresses": [] }, { "nodeid": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "alias": "HOPPINGFIRE-v23.11-415-gd120eba", + "alias": "HOPPINGFIRE--190-g5fd2f9c-modded", "color": "035d2b", - "last_timestamp": 1708624765, - "features": "88a0000a8a5961", + "last_timestamp": 1722303669, + "features": "88a0802a8a59a1", "addresses": [] }, { "nodeid": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", - "alias": "JUNIORFELONY-v23.11-415-gd120eba", + "alias": "JUNIORFELONY-190-g5fd2f9c-modded", "color": "0382ce", - "last_timestamp": 1708624766, - "features": "88a0000a8a5961", + "last_timestamp": 1722303669, + "features": "88a0802a8a59a1", "addresses": [] } ] diff --git a/doc/schemas/lightning-listoffers.json b/doc/schemas/lightning-listoffers.json index b5a972f7b0f4..dedca944c129 100644 --- a/doc/schemas/lightning-listoffers.json +++ b/doc/schemas/lightning-listoffers.json @@ -8,6 +8,9 @@ "description": [ "The **listoffers** RPC command list all offers, or with `offer_id`, only the offer with that offer_id (if it exists)." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -106,18 +109,18 @@ "response": { "offers": [ { - "offer_id": "053a5c566fbea2681a5ff9c05a913da23e45b95d09ef5bd25d7d408f23da7084", + "offer_id": "dca9774ba2925b48c42eb12e599c09389d9d80d44445c4d0c944556c7228746e", "active": true, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqvqcdgq2z9pk7enxv4jjqen0wgs8yatnw3ujz83qkc6rvp4j28rt3dtrn32zkvdy7efhnlrpr5rp5geqxs783wtlj550qs8czzku4nk3pqp6m593qxgunzuqcwkmgqkmp6ty0wyvjcqdguv3pnpukedwn6cr87m89t74h3auyaeg89xkvgzpac70z3m9rn5xzu28c", + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqgn3qzs2ge5hx6pqwdskcefpzcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", "used": false }, { - "offer_id": "3247d3597fec19e362ca683416a48a0f76a44c1600725a7ee1936548feadacca", + "offer_id": "f901018768e13ea2da95f437749e24d22d47b2a6ea3030ef66ae0281df49d94b", "active": true, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcxqd24x3qgqgqlgzs3gdhkven9v5sxvmmjype82um50ys3ug9kxsmqdvj3c6ut2cuu2s4nrf8k2dulccgaqcdzxgp583utjlu49rcyqt8hc3s797umxn3r9367rdqc577rma7key58fywkajxnuzyapge86hj2pg80rjrma40xdqrxnsnva5l3ce7hz4ua8wf755dees4y9vnq", - "used": true + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqv85ysq2qepk7enxv4j3gqg2zcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", + "used": false } ] } @@ -127,16 +130,16 @@ "id": "example:listoffers#2", "method": "listoffers", "params": [ - "f61cca153d1948dade19349792d9bcdc9cef687fd27db0b553a67979f55aae48" + "b791f88cebf775853112c30828e116487f4d6c252d669372532b468bc7de8a24" ] }, "response": { "offers": [ { - "offer_id": "f61cca153d1948dade19349792d9bcdc9cef687fd27db0b553a67979f55aae48", - "active": true, + "offer_id": "b791f88cebf775853112c30828e116487f4d6c252d669372532b468bc7de8a24", + "active": false, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqyqs5rn5v4ehggrxdaezqvtdwdshg93pqfnwgkvdr57yzh6h92zg3qctvrm7w38djg67kzcm4yeg8vc4cq63s", + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqv0gfqq2zp8kven9wgs8gmeqg35hxctzd3j3vggz953rvg9rtxj8lalh43z8epwydjfrmffn3y3p5qz5cywpu09rr4vs", "used": false } ] diff --git a/doc/schemas/lightning-listpays.json b/doc/schemas/lightning-listpays.json index a1aa1c66af27..a586bfc379c0 100644 --- a/doc/schemas/lightning-listpays.json +++ b/doc/schemas/lightning-listpays.json @@ -7,6 +7,9 @@ "description": [ "The **listpay** RPC command gets the status of all *pay* commands, or a single one if either *bolt11* or *payment_hash* was specified." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -226,42 +229,86 @@ "id": "example:listpays#1", "method": "listpays", "params": { - "bolt11": "lnbcrt123n1pjmxp7qsp5hxu7u28y0nx4v689u3hwzdzse2w9yaylhheavf9dxvwtdup7pvespp5ha66gxse68j4n6755v7299dnmq4w34gp0znxu0xzahdc43zrg40qdq5v3jhxcmjd9c8g6t0dc6sxqrp7scqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqvuqqqqsqqqqqqqqpqqqqqzsqqc9qxpqysgqk74dvqlvr92ayy5s7x0r0u9xywez6wu4h8pfta386cw6x7cdrvn8pz87kyg5c930aent423gm9ylpaw5p35k72f02hg0s9dulg4d8fqpgj7gpm" + "bolt11": "lnbcrt500n1pn2s396sp5h5tz6fpm3dxvrlwcnwmfq85v45wfj43mdmplpce6ku2vmfdhrx5qpp50z9w5u57meydx9dpn889mmtkz6tqrfsa65hfwd88ql4hc5hyu70qdqcdsenygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqt5m8qx0t25a0gygya7u4sxulyyp2dec87pwsxuuwtg0u66c07703g9j6vlwgmlhqk7qgn95qw7allhnuj2m9hf0xkcr2zkaxltv3t6gqjcdpll" } }, "response": { - "pays": [ - { - "bolt11": "lnbcrt123n1pjmxp7qsp5hxu7u28y0nx4v689u3hwzdzse2w9yaylhheavf9dxvwtdup7pvespp5ha66gxse68j4n6755v7299dnmq4w34gp0znxu0xzahdc43zrg40qdq5v3jhxcmjd9c8g6t0dc6sxqrp7scqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqvuqqqqsqqqqqqqqpqqqqqzsqqc9qxpqysgqk74dvqlvr92ayy5s7x0r0u9xywez6wu4h8pfta386cw6x7cdrvn8pz87kyg5c930aent423gm9ylpaw5p35k72f02hg0s9dulg4d8fqpgj7gpm", - "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "payment_hash": "bf75a41a19d1e559ebd4a33ca295b3d82ae8d50178a66e3cc2eddb8ac443455e", - "status": "failed", - "created_at": 1706231854, - "amount_sent_msat": 0 - } - ] + "pays": [] } }, { "request": { "id": "example:listpays#2", "method": "listpays", - "params": { - "bolt11": "lnbcrt123n1pjmxp7qsp5u84368dz7yhzcqm955h96wdqch7uarasun45cr0vs5d8t0cv5avqpp5r9p0dp92guaatrmhf302m0dyj4n79gk93qu2l5tagfxq3dedgfqsdq5v3jhxcmjd9c8g6t0dc6qxqrp7scqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqvuqqqqsqqqqqqqqpqqqqqzsqqc9qxpqysgq46wu0fznfx27rcnyzhcttf8yqx3lwqs482yxlead0fyt8mefrrrj5m379fa5qukgquf9tnwsuj3nnfmwkzkfg6pyhzq6w8gauuh6m5cqgur64n" - } + "params": {} }, "response": { "pays": [ { - "bolt11": "lnbcrt123n1pjmxp7qsp5u84368dz7yhzcqm955h96wdqch7uarasun45cr0vs5d8t0cv5avqpp5r9p0dp92guaatrmhf302m0dyj4n79gk93qu2l5tagfxq3dedgfqsdq5v3jhxcmjd9c8g6t0dc6qxqrp7scqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqvuqqqqsqqqqqqqqpqqqqqzsqqc9qxpqysgq46wu0fznfx27rcnyzhcttf8yqx3lwqs482yxlead0fyt8mefrrrj5m379fa5qukgquf9tnwsuj3nnfmwkzkfg6pyhzq6w8gauuh6m5cqgur64n", + "bolt11": "lnbcrt5m1pn2s39hsp50pekdm9axtcfm0ttsxzg2z0738ujk5uc3n0v5rul2y2ghkeh772qpp50a60qe8lg55t0mru27xlvcnpwetu46d0ff60tuj0dr9cged3secqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcv3qw3hjqmpnxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqcjj3uz0ux4qxt4ev4patfwz44e7ns57tmvxdwzfq2pj5drm5xhk5agm8j2wha32g664a0mw6casy44vfdf76jj38n3669fsjps4jkaqpaydvjr", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "payment_hash": "7f74f064ff4528b7ec7c578df662617657cae9af4a74f5f24f68cb8465b18670", + "status": "complete", + "created_at": 1722303671, + "completed_at": 1722303672, + "preimage": "d9893938f4464933d87f5123a8c09b4e98e106c9c34c1812340c9570d72d16a2", + "amount_msat": 500000000, + "amount_sent_msat": 500000000 + }, + { + "bolt11": "lnbcrt5m1pn2s39csp59778k5kecnjhyqu7amy99kt8nhu43ap74m8q3xryvqxrjnsrnxpqpp5s3fd8u9xnhgwtqpsq9jtcspzu4dmxvcatpvl2a3dje5055fmqrdqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcv3qw3hjqmp4xqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jx3rjwmh5d5rmgqqqqqpqqqqqzsqqc9qxpqysgqe4hfa6arms4pz6ajwhq07lhc57g60vrdqyfdsewu84q823m8zqdjtcsv7aun8zqxr86amyz0lclf8pfts0hqy60s9fcvvsjyxnnmpugpjcq9xk", + "destination": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", + "payment_hash": "8452d3f0a69dd0e580300164bc4022e55bb3331d5859f5762d9668fa513b00da", + "status": "complete", + "created_at": 1722303672, + "completed_at": 1722303673, + "preimage": "576f5426f339b3db80d1b3c3546d6832274171609f25795c64b6cc74aa158d8c", + "amount_msat": 500000000, + "amount_sent_msat": 500000000 + }, + { + "bolt11": "lnbcrt1u1pn2s3xxsp5xk8hs6zuv0yqhq7hhl0sps6mxuj78pzwryejaljh48vr4htykujqpp593ndc8wrukteld5j4nqnt6tedavh8ezv48dmrkqen3440ajnre5qdqcdsenxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq0asve9rdtfd9fe20u5vjujzmm0phpq538z8ndhn5ts62aflhktqn6338e45xcxkyf7askjjq25ksxt4eqarjjame8wfdmau7kq7m4csqs0n32n", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "payment_hash": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68", + "status": "complete", + "created_at": 1722303688, + "completed_at": 1722303689, + "preimage": "1ce8370d3a179cee3af25a5a6c7058e8e12033a842efd6d34abae53334bc94bf", + "amount_msat": 100000, + "amount_sent_msat": 100000 + }, + { + "bolt12": "lni1qqgypua5g7rp293k00s66ayvnv26czst2d5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gps7sjqtqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e5zvqyehytxx360zptatj4pygsv9kpal8gnkeyd0tpvd6jv5rkv2uqdgcq2s27mvxt0arlnulnmce53cuz00vzaqvgvhpphxgavl89r8zrdhaxqgzpvxkkmwsmxnuwflttmnpc8vtzwlgd3cfty3xwlnlc9r2gcjesguqqv4xey4m7l4wxem27vxyxfhwznlc62kffsd5xncx9w49m4g72u2y7lcl6a3x5cpu52j6gm8q5x0q8k7myxdzrsqqqqqqqqqqqqqqq5qqqqqqqqqqqqqayjedltzjqqqqqq9yq3n2s38p5cq442pq5qpm4ht26v8statwxcrl65uy26c9hx4dvy66f9x665eqqy90tpz25qc0gfqtqggzvmj9nrga83q474e2sjygxzmq7ln5fmvjxh4skxafx2pmx9wqx5v0qsqfkcrpht0d3nnt8txkcgf5wr6gzrlacls2gyrvj5hhwuu98shurrn6ayruunju7k9yu9clvaj354tr064ruuht88q5dj73kzru20uzj", + "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "payment_hash": "a003badd6ad30f05f56e3607fd538456b05b9aad6135a494dad5320010af5844", + "status": "complete", + "created_at": 1722303713, + "completed_at": 1722303714, + "preimage": "6f154ed7d108349cb6385eba5f160294ef83862c2c560ba6446b2a3da5c2b3b3", + "amount_msat": 1000000, + "amount_sent_msat": 1000000 + }, + { + "bolt11": "lnbcrt1pn2s38zsp5lv49w44a8tvkwtkxfxwts8rnr864u59srp7sxuua3haahdhlhtrqpp5p928w8rmsg2hjeymedcn54vxhsz372qhcedgf003nmsknhx9594sdqcdserxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqt5h8te9lkn0jpdkhkmlkzs80aw7mt5kdm6jxmvddkavt3vj0vakkmfcs0hsde8y8g8za46sch2lp4jxy56u8ve25sgpgcsya0vp92sgphzw570", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "payment_hash": "0954771c7b821579649bcb713a5586bc051f2817c65a84bdf19ee169dcc5a16b", + "status": "complete", + "created_at": 1722303715, + "completed_at": 1722303715, + "preimage": "f3a3b40d63e62785f537aad60f93980914c5639872c7746299a6a1228abbc303", + "amount_msat": 9900, + "amount_sent_msat": 9900 + }, + { + "bolt11": "lnbcrt40n1pn2s3xxsp5j329vez86jvxw6543zlcla2fusm7v6h74pf7ftmmyfv6zm9uedlspp5j6xpxmq8cwd305vj2dvd6dh4mkr0s6guvehvyleymedgf4vsm3ysdqaveskjmr9vssxgetnvdexjur5d9hkuxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqk6uwy8pkv42jzhdna3z4vxpwkapdzzpn2tcpjnqj738nlpkjc583l9v72vlskt8y33rr4z3jma32xx7ve0jfy7anvn6r98cr5flhcuqqhr4shx", "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "payment_hash": "1942f684aa473bd58f774c5eadbda49567e2a2c58838afd17d424c08b72d4241", + "payment_hash": "968c136c07c39b17d1925358dd36f5dd86f8691c666ec27f24de5a84d590dc49", "status": "complete", - "created_at": 1706231849, - "completed_at": 1706231854, - "preimage": "89ce412a2089cbcb72a73ce755337cf693859ea58f21ef0d1caf286a9b0f2a7c", - "amount_msat": 12300, - "amount_sent_msat": 12301 + "created_at": 1722303719, + "completed_at": 1722303720, + "preimage": "8815ee921dba644c076f9f879abb520d8539a6913856a439752eaaadff1e21ac", + "amount_msat": 4000, + "amount_sent_msat": 4000 } ] } diff --git a/doc/schemas/lightning-listpeerchannels.json b/doc/schemas/lightning-listpeerchannels.json index abc88bd14817..9cd38c546809 100644 --- a/doc/schemas/lightning-listpeerchannels.json +++ b/doc/schemas/lightning-listpeerchannels.json @@ -10,6 +10,9 @@ "", "If no *id* is supplied, then channel data on all lightning nodes that are connected, or not connected but have open channels with this node, are returned." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -1414,12 +1417,15 @@ { "peer_id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", "peer_connected": true, + "reestablished": true, "channel_type": { "bits": [ - 12 + 12, + 22 ], "names": [ - "static_remotekey/even" + "static_remotekey/even", + "anchors/even" ] }, "updates": { @@ -1429,37 +1435,50 @@ "cltv_expiry_delta": 6, "fee_base_msat": 1, "fee_proportional_millionths": 10 + }, + "remote": { + "htlc_minimum_msat": 0, + "htlc_maximum_msat": 990000000, + "cltv_expiry_delta": 6, + "fee_base_msat": 1, + "fee_proportional_millionths": 10 } }, - "state": "CHANNELD_AWAITING_LOCKIN", - "scratch_txid": "4e9c2866b9ae1f765b89ea7ec37428c900ea97f717f85f00e3db852cb6aea3a8", - "last_tx_fee_msat": 5430000, + "last_stable_connection": 1722303707, + "state": "CHANNELD_NORMAL", + "scratch_txid": "80aa008578b3b6924f2362146907e46ad83351d5b9b056bd8537befc3f1d7d65", + "last_tx_fee_msat": 4221000, + "lost_state": false, "feerate": { - "perkw": 7500, - "perkb": 30000 + "perkw": 3755, + "perkb": 15020 }, "owner": "channeld", + "short_channel_id": "109x1x1", "direction": 1, - "channel_id": "7b0bd48371c473ea25b9ab95613c51a936463c41858c8bbdf356f5328f3d0a6c", - "funding_txid": "6c0a3d8f32f556f3bd8b8c85413c4636a9513c6195abb925ea73c47183d40b7b", - "funding_outnum": 0, - "close_to_addr": "bcrt1pamt5tqzd49uyessr7437l2vllf20muqmzdauje8x8scjgpc0l0nqhyqcyp", - "close_to": "5120eed745804da9784cc203f563efa99ffa54fdf01b137bc964e63c3124070ffbe6", + "channel_id": "252d1b0a1e57895e84137f28cf19ab2c35847e284c112fefdecc7afeaa5c1de7", + "funding_txid": "737d6835ddafd515ba9e9def733bb4e4211f6053a32b1422bf1c8cc240850f96", + "funding_outnum": 1, + "close_to_addr": "bcrt1p8c0ku4mpxq3443rss8e6rjwamztvv8yxvmxtetal5d0n6v39rlwqvfqy6n", + "close_to": "51203e1f6e576130235ac47081f3a1c9ddd896c61c8666ccbcafbfa35f3d32251fdc", "private": false, "opener": "local", "alias": { - "local": "5589251x14022525x17398" + "local": "2240075x4300189x56636", + "remote": "3321841x5311416x1695" }, "features": [ - "option_static_remotekey" + "option_static_remotekey", + "option_anchors_zero_fee_htlc_tx", + "option_anchors" ], "funding": { "local_funds_msat": 1000000000, "remote_funds_msat": 0, "pushed_msat": 0 }, - "to_us_msat": 1000000000, - "min_to_us_msat": 1000000000, + "to_us_msat": 490518792, + "min_to_us_msat": 489918792, "max_to_us_msat": 1000000000, "total_msat": 1000000000, "fee_base_msat": 1, @@ -1468,24 +1487,41 @@ "max_total_htlc_in_msat": 18446744073709552000, "their_reserve_msat": 10000000, "our_reserve_msat": 10000000, - "spendable_msat": 973980000, - "receivable_msat": 0, + "spendable_msat": 469223792, + "receivable_msat": 499481208, "minimum_htlc_in_msat": 0, "minimum_htlc_out_msat": 0, "maximum_htlc_out_msat": 990000000, "their_to_self_delay": 5, "our_to_self_delay": 5, "max_accepted_htlcs": 483, - "state_changes": [], - "status": [], - "in_payments_offered": 0, - "in_offered_msat": 0, - "in_payments_fulfilled": 0, - "in_fulfilled_msat": 0, - "out_payments_offered": 0, - "out_offered_msat": 0, - "out_payments_fulfilled": 0, - "out_fulfilled_msat": 0, + "state_changes": [ + { + "timestamp": "2024-07-30T01:40:45.942Z", + "old_state": "DUALOPEND_OPEN_COMMITTED", + "new_state": "DUALOPEND_AWAITING_LOCKIN", + "cause": "user", + "message": "Sigs exchanged, waiting for lock-in" + }, + { + "timestamp": "2024-07-30T01:40:47.619Z", + "old_state": "DUALOPEND_AWAITING_LOCKIN", + "new_state": "CHANNELD_NORMAL", + "cause": "user", + "message": "Lockin complete" + } + ], + "status": [ + "CHANNELD_NORMAL:Channel ready for use." + ], + "in_payments_offered": 1, + "in_offered_msat": 1000000, + "in_payments_fulfilled": 1, + "in_fulfilled_msat": 1000000, + "out_payments_offered": 10, + "out_offered_msat": 510501210, + "out_payments_fulfilled": 8, + "out_fulfilled_msat": 510481208, "htlcs": [] } ] @@ -1529,30 +1565,32 @@ "fee_proportional_millionths": 10 } }, + "last_stable_connection": 1722303707, "state": "CHANNELD_NORMAL", - "scratch_txid": "ece66657d6203a4ea77807f566fd5b98a78b659f0cd59ce9200aa3bd6875ee25", - "last_tx_fee_msat": 4545000, + "scratch_txid": "80aa008578b3b6924f2362146907e46ad83351d5b9b056bd8537befc3f1d7d65", + "last_tx_fee_msat": 4221000, "lost_state": false, "feerate": { - "perkw": 3750, - "perkb": 15000 + "perkw": 3755, + "perkb": 15020 }, "owner": "channeld", - "short_channel_id": "103x1x0", + "short_channel_id": "109x1x1", "direction": 1, - "channel_id": "def5ef03e0d36ed65de814c0a8d6599a502fe1afb8e956529320bb350e876b5f", - "funding_txid": "5f6b870e35bb20935256e9b8afe12f509a59d6a8c014e85dd66ed3e003eff5de", - "funding_outnum": 0, - "close_to_addr": "bcrt1pamt5tqzd49uyessr7437l2vllf20muqmzdauje8x8scjgpc0l0nqhyqcyp", - "close_to": "5120eed745804da9784cc203f563efa99ffa54fdf01b137bc964e63c3124070ffbe6", + "channel_id": "252d1b0a1e57895e84137f28cf19ab2c35847e284c112fefdecc7afeaa5c1de7", + "funding_txid": "737d6835ddafd515ba9e9def733bb4e4211f6053a32b1422bf1c8cc240850f96", + "funding_outnum": 1, + "close_to_addr": "bcrt1p8c0ku4mpxq3443rss8e6rjwamztvv8yxvmxtetal5d0n6v39rlwqvfqy6n", + "close_to": "51203e1f6e576130235ac47081f3a1c9ddd896c61c8666ccbcafbfa35f3d32251fdc", "private": false, "opener": "local", "alias": { - "local": "15447035x5589520x8959", - "remote": "6036590x13481428x5501" + "local": "2240075x4300189x56636", + "remote": "3321841x5311416x1695" }, "features": [ "option_static_remotekey", + "option_anchors_zero_fee_htlc_tx", "option_anchors" ], "funding": { @@ -1560,8 +1598,8 @@ "remote_funds_msat": 0, "pushed_msat": 0 }, - "to_us_msat": 1000000000, - "min_to_us_msat": 1000000000, + "to_us_msat": 490518792, + "min_to_us_msat": 489918792, "max_to_us_msat": 1000000000, "total_msat": 1000000000, "fee_base_msat": 1, @@ -1570,8 +1608,8 @@ "max_total_htlc_in_msat": 18446744073709552000, "their_reserve_msat": 10000000, "our_reserve_msat": 10000000, - "spendable_msat": 978330000, - "receivable_msat": 0, + "spendable_msat": 469223792, + "receivable_msat": 499481208, "minimum_htlc_in_msat": 0, "minimum_htlc_out_msat": 0, "maximum_htlc_out_msat": 990000000, @@ -1580,8 +1618,15 @@ "max_accepted_htlcs": 483, "state_changes": [ { - "timestamp": "2024-02-22T17:48:57.127Z", - "old_state": "CHANNELD_AWAITING_LOCKIN", + "timestamp": "2024-07-30T01:40:45.942Z", + "old_state": "DUALOPEND_OPEN_COMMITTED", + "new_state": "DUALOPEND_AWAITING_LOCKIN", + "cause": "user", + "message": "Sigs exchanged, waiting for lock-in" + }, + { + "timestamp": "2024-07-30T01:40:47.619Z", + "old_state": "DUALOPEND_AWAITING_LOCKIN", "new_state": "CHANNELD_NORMAL", "cause": "user", "message": "Lockin complete" @@ -1590,14 +1635,14 @@ "status": [ "CHANNELD_NORMAL:Channel ready for use." ], - "in_payments_offered": 0, - "in_offered_msat": 0, - "in_payments_fulfilled": 0, - "in_fulfilled_msat": 0, - "out_payments_offered": 0, - "out_offered_msat": 0, - "out_payments_fulfilled": 0, - "out_fulfilled_msat": 0, + "in_payments_offered": 1, + "in_offered_msat": 1000000, + "in_payments_fulfilled": 1, + "in_fulfilled_msat": 1000000, + "out_payments_offered": 10, + "out_offered_msat": 510501210, + "out_payments_fulfilled": 8, + "out_fulfilled_msat": 510481208, "htlcs": [] } ] diff --git a/doc/schemas/lightning-listpeers.json b/doc/schemas/lightning-listpeers.json index d5f531b29c4b..1aa5837e96f3 100644 --- a/doc/schemas/lightning-listpeers.json +++ b/doc/schemas/lightning-listpeers.json @@ -15,6 +15,9 @@ "", "The channel will remain open for a set blocktime, after which if the connection has not been re-established, the channel will close and the node will no longer appear in the command output." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -323,19 +326,19 @@ "id": "example:listpeers#1", "method": "listpeers", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d" } }, "response": { "peers": [ { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "connected": true, - "num_channels": 1, + "num_channels": 2, "netaddr": [ - "127.0.0.1:44619" + "127.0.0.1:34785" ], - "features": "08a0000a0a69a2" + "features": "08a0802a8a59a1" } ] } @@ -348,14 +351,32 @@ }, "response": { "peers": [ + { + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "connected": true, + "num_channels": 2, + "netaddr": [ + "127.0.0.1:34785" + ], + "features": "08a0802a8a59a1" + }, + { + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", + "connected": true, + "num_channels": 1, + "netaddr": [ + "127.0.0.1:38251" + ], + "features": "08a0802a8a59a1" + }, { "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", "connected": true, "num_channels": 1, "netaddr": [ - "127.0.0.1:48862" + "127.0.0.1:47032" ], - "features": "08a0000a0a69a2" + "features": "08a0802a8a59a1" } ] } diff --git a/doc/schemas/lightning-listsendpays.json b/doc/schemas/lightning-listsendpays.json index 4c1a916313f3..aa2db4fc0fd1 100644 --- a/doc/schemas/lightning-listsendpays.json +++ b/doc/schemas/lightning-listsendpays.json @@ -9,6 +9,9 @@ "", "Note that there may be more than one concurrent *sendpay* command per *pay*, so this command should be used with caution." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -338,33 +341,25 @@ "request": { "id": "example:listsendpays#1", "method": "listsendpays", - "params": {} + "params": { + "bolt11": "lnbcrt100n1pn2s396sp5v3en0qa3rrljw4m0wtz88sx99q20rarufhjpfysefhwhs42gvqjqpp56kvvl33d594nsxu0hzhesvazgqzlwv89fnpjcvtlanz3rl7x623qdp9f9h8vmmfvdjjqer9wd3hy6tsw35k7m3qdsenzxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq7za6z8kx2k5nul45zwttfz2njx3836v69mxqsl4ty9228pyjrkfnkymysy8ygsrrje9qf6j4tpalt5qkqusfp2esrsqc5ak7t4yzajgpezef54" + } }, "response": { "payments": [ - { - "created_index": 1, - "id": 1, - "payment_hash": "e3b43574acd074b0c4ba1b13b5155ff5f9c76742e643ed003e17301c5a2db149", - "groupid": 1, - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 20000, - "amount_sent_msat": 20000, - "created_at": 1706225269, - "status": "pending", - "bolt11": "lnbcrt200n1pjm9mn5sp5gq84lgga959m6gg4g0kj29ypwjaxxnm4cu5csymq8p6nqxv800mspp5uw6r2a9v6p6tp396rvfm292l7huuwe6zuep76qp7zucpck3dk9ysdpqf9grgmt62fmk5stswefh23n2tpykvcmzxqyjw5qcqp99qxpqysgqz8s496zmwed278jvp075zlhrnj0ncg45kcfw5s2lkhtxd3wc39f8wflp5gmd827dk470xpasfpx0azsfu0k8ttwae7620h8d050w28cqan776g" - }, { "created_index": 2, "id": 2, - "payment_hash": "f55d92cfe019b5a015f5e5956e9255053cda14786171d5002feb12ae5254e5a5", + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", "groupid": 1, - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 30000, - "amount_sent_msat": 30000, - "created_at": 1706225269, - "status": "pending", - "bolt11": "lnbcrt300n1pjm9mn5sp5zqfkr93rp92mdyj6m8lzpcu90rfefcaqff8fxdd2sc5mace23ujspp574we9nlqrx66q904uk2kayj4q57d59rcv9ca2qp0avf2u5j5ukjsdpq29j55nfcgfcnsvzw2er57knhwcmhzwt0xqyjw5qcqp99qxpqysgq76p2jpnegtzlxmn0aqt6d3f89q4p6y5v3v2qz7t2mm6xt90nt324cq400tl82k28562aux8jxs57d603g7s0q4g3dapu9a7vln94j7spsut799" + "updated_index": 2, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303675, + "completed_at": 1722303677, + "status": "complete", + "payment_preimage": "984a10782218478cd39e1f9a16795d756c337662067023a3b690bffdb1593f76" } ] } @@ -373,26 +368,150 @@ "request": { "id": "example:listsendpays#2", "method": "listsendpays", - "params": { - "bolt11": "lnbcrt1230n1pja03q9sp5xu9aypccf3n6vld2waxcysy47ct2wl5x5adtm7k8u30knqes22lspp5duw2v8csh0zh4xg9ql3amem98avlkc2ecre99tgmr2340amf9kmsdqjv3jhxcmjd9c8g6t0dcxqyjw5qcqp99qxpqysgqwh78s8wqg0kepspw0epcxmxteh5wu8n6ddlwdnyj758fqxpqk8ejf597x8ju3r32xqgae3yzjjz9e5s6l2vs5zxvkayhmemmx74wvyqqyqf8c9" - } + "params": {} }, "response": { "payments": [ { "created_index": 1, "id": 1, - "payment_hash": "6f1ca61f10bbc57a990507e3dde7653f59fb6159c0f252ad1b1aa357f7692db7", + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", "groupid": 1, "updated_index": 1, "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 123000, - "amount_sent_msat": 123000, - "created_at": 1708639237, - "completed_at": 1708639238, + "amount_msat": 500000000, + "amount_sent_msat": 500000000, + "created_at": 1722303670, + "completed_at": 1722303671, + "status": "complete", + "payment_preimage": "bed4140e1db302720d7f9547dc9127d45b115080447cce7e23cfd00b60991831", + "bolt11": "lnbcrt5m1pn2s39ksp53sknyy2mxxurt4y0wqgp730z0cnm0vz3zmzth8p79xsrtmg5llxspp5dp94v59nm6c99jf7lc07zmnhqw6kyujx3mkdav7643dczgtdedfqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcvfqw3hjqmpjxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqdz9cftkxe6kcqfddyrvr7j57ulsfxxxkgkjyhr3k77n8v59mzs5rmuexz9lxusyhhehlemd9ujclgahln8e0n8y86stc7u8uys6mjqgqerm6q4" + }, + { + "created_index": 2, + "id": 2, + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", + "groupid": 1, + "updated_index": 2, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303675, + "completed_at": 1722303677, + "status": "complete", + "payment_preimage": "984a10782218478cd39e1f9a16795d756c337662067023a3b690bffdb1593f76" + }, + { + "created_index": 3, + "id": 3, + "payment_hash": "80ff407792947a23f193f9a1968e9a437b071364ae3159f83631335c9a453c1b", + "groupid": 0, + "updated_index": 3, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303677, + "completed_at": 1722303679, + "status": "complete", + "payment_preimage": "0d802c9c611bae611d51afa8ddf396df8ba4e0580a2eccfd1120da97e70482a0" + }, + { + "created_index": 4, + "id": 4, + "payment_hash": "3b80a3028343b16f8ab7261343eae40ff73ba833b0b7d4dcbfd42a3078dc322b", + "groupid": 0, + "updated_index": 4, + "destination": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "amount_msat": 10000000, + "amount_sent_msat": 10000202, + "created_at": 1722303679, + "completed_at": 1722303682, + "status": "complete", + "payment_preimage": "f76d6b7ef362f33e25eb5571e616f6e539a2c77caf0afa4227d1351546823664" + }, + { + "created_index": 5, + "id": 5, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "groupid": 0, + "updated_index": 5, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303682, + "completed_at": 1722303684, + "status": "failed" + }, + { + "created_index": 6, + "id": 6, + "payment_hash": "0458c01fdd3aa0b9829002390301f92083e78dc27bb293bc3e7caee5d4ed7259", + "groupid": 0, + "updated_index": 6, + "partid": 1, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303684, + "completed_at": 1722303686, + "status": "complete", + "payment_preimage": "4dad6dcf625f650a35a8199fbda18ea4f6717cdfadb40e6bed2bf5f96a4742b0" + }, + { + "created_index": 7, + "id": 7, + "payment_hash": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "groupid": 1, + "updated_index": 7, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 50000, + "amount_sent_msat": 50001, + "created_at": 1722303686, + "completed_at": 1722303688, + "status": "complete", + "payment_preimage": "0e07efd883f66b6b22ec7f2e7116e203c3fecc22eb8596a73eaf06c4befb0641", + "bolt11": "lnbcrt500n1pn2s396sp5h5tz6fpm3dxvrlwcnwmfq85v45wfj43mdmplpce6ku2vmfdhrx5qpp50z9w5u57meydx9dpn889mmtkz6tqrfsa65hfwd88ql4hc5hyu70qdqcdsenygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqt5m8qx0t25a0gygya7u4sxulyyp2dec87pwsxuuwtg0u66c07703g9j6vlwgmlhqk7qgn95qw7allhnuj2m9hf0xkcr2zkaxltv3t6gqjcdpll" + }, + { + "created_index": 8, + "id": 8, + "payment_hash": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", + "groupid": 1, + "updated_index": 8, + "amount_sent_msat": 1002, + "created_at": 1722303689, + "completed_at": 1722303692, + "status": "complete", + "payment_preimage": "5e49b520e86aaec8d798bf8107892fb87053d4cb27342518e4588aa609cf35cf" + }, + { + "created_index": 9, + "id": 9, + "payment_hash": "968c136c07c39b17d1925358dd36f5dd86f8691c666ec27f24de5a84d590dc49", + "groupid": 1, + "updated_index": 9, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303696, + "completed_at": 1722303698, + "status": "failed" + }, + { + "created_index": 10, + "id": 10, + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "groupid": 1, + "updated_index": 10, + "partid": 1, + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "amount_msat": 400000, + "amount_sent_msat": 400000, + "created_at": 1722303718, + "completed_at": 1722303719, "status": "complete", - "payment_preimage": "91f8366681fdfd309c048082fcde81a79116f85a7b2dd09aef1e34f5f7c3397b", - "bolt11": "lnbcrt1230n1pja03q9sp5xu9aypccf3n6vld2waxcysy47ct2wl5x5adtm7k8u30knqes22lspp5duw2v8csh0zh4xg9ql3amem98avlkc2ecre99tgmr2340amf9kmsdqjv3jhxcmjd9c8g6t0dcxqyjw5qcqp99qxpqysgqwh78s8wqg0kepspw0epcxmxteh5wu8n6ddlwdnyj758fqxpqk8ejf597x8ju3r32xqgae3yzjjz9e5s6l2vs5zxvkayhmemmx74wvyqqyqf8c9" + "payment_preimage": "af67b48518e78e157db404d13cb42987c31e034634203d10b224302b05fc6c90", + "bolt11": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7" } ] } diff --git a/doc/schemas/lightning-listsqlschemas.json b/doc/schemas/lightning-listsqlschemas.json index 3b8b5095a625..72f30c6c9f98 100644 --- a/doc/schemas/lightning-listsqlschemas.json +++ b/doc/schemas/lightning-listsqlschemas.json @@ -10,6 +10,9 @@ "", "If *table* is given, only that table is in the resulting list, otherwise all tables are listed." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": { @@ -119,6 +122,10 @@ { "tablename": "offers", "columns": [ + { + "name": "rowid", + "type": "INTEGER" + }, { "name": "offer_id", "type": "BLOB" @@ -135,10 +142,6 @@ "name": "bolt12", "type": "TEXT" }, - { - "name": "bolt12_unsigned", - "type": "TEXT" - }, { "name": "used", "type": "INTEGER" @@ -269,6 +272,10 @@ { "name": "close_cause", "type": "TEXT" + }, + { + "name": "last_stable_connection", + "type": "INTEGER" } ] } diff --git a/doc/schemas/lightning-listtransactions.json b/doc/schemas/lightning-listtransactions.json index 989f5f36bed4..0f8d69f9c76e 100644 --- a/doc/schemas/lightning-listtransactions.json +++ b/doc/schemas/lightning-listtransactions.json @@ -7,6 +7,9 @@ "description": [ "The **listtransactions** command returns transactions tracked in the wallet. This includes deposits, withdrawals and transactions related to channels. A transaction may have multiple types, e.g., a transaction may both be a close and a deposit if it closes the channel and returns funds to the wallet." ], + "categories": [ + "readonly" + ], "request": { "required": [], "properties": {} @@ -169,29 +172,132 @@ "response": { "transactions": [ { - "hash": "05985072bbe20747325e69a159fe08176cc1bbc96d25e8848edad2dddc1165d0", - "rawtx": "02000000027032912651fc25a3e0893acd5f9640598707e2dfef92143bb5a4020e335442800100000017160014a5f48b9aa3cb8ca6cc1040c11e386745bb4dc932ffffffffd229a4b4f78638ebcac10a68b0561585a5d6e4d3b769ad0a909e9b9afaeae24e00000000171600145c83da9b685f9142016c6f5eb5f98a45cfa6f686ffffffff01915a01000000000017a9143a4dfd59e781f9c3018e7d0a9b7a26d58f8d22bf8700000000", - "blockheight": 0, - "txindex": 0, - "locktime": 0, + "hash": "1712c8af55f6853be3179bf20398689bb9204695fe3d6171c3248783218814e3", + "rawtx": "02000000000101096b01ae63d631e321f039d49df4c5b055ce3afa655a3d5c22c2a8594f41f5cd0000000000fdffffff02002d31010000000017a914655728f36cfe36d01aa50d3236704469f84a55408771c4d4280100000017a9147cdfb08e6e44fc1152c4f423225d2b7148248a9d870247304402202ff40c938d644198c10d60fe660c1380bd601b6dc4533b64c64d3809290edf4a022028206e39cc36423524816a34806a721061814478b297c2bfb2bc3c417548c466012102129f00a7502a031999fe81aa35afed6f09617a9748e5fdde0f7a0191d364f59b65000000", + "blockheight": 102, + "txindex": 1, + "locktime": 101, "version": 2, "inputs": [ { - "txid": "804254330e02a4b53b1492efdfe207875940965fcd3a89e0a325fc5126913270", + "txid": "cdf5414f59a8c2225c3d5a65fa3ace55b0c5f49dd439f021e331d663ae016b09", + "index": 0, + "sequence": 4294967293 + } + ], + "outputs": [ + { + "index": 0, + "amount_msat": 20000000000, + "scriptPubKey": "a914655728f36cfe36d01aa50d3236704469f84a554087" + }, + { + "index": 1, + "amount_msat": 4979999857000, + "scriptPubKey": "a9147cdfb08e6e44fc1152c4f423225d2b7148248a9d87" + } + ] + }, + { + "hash": "9454852bb62e304ee8933662284e10bd22a7f3710c262da4c94bdcc8b05ae407", + "rawtx": "02000000000101e3148821838724c371613dfe954620b99b689803f29b17e33b85f655afc812170000000017160014d6b969d36dffdad9869193f663ee480dfdc73488fdffffff0135143101000000002251206c27e1956acfa61e68292c80908880e813450f754132e8a2ac471a86bf1326b50247304402201b09adb26aa7674b2e4954bef85e5d4cb5baee1e20c91e6d26db624407588b4e022044bae97372215531507b464b7978e6f9dc25f986aed5ab62dbc011c1e80a544f012102b9c0c6844e12a531c968e55c55078ec16d9bf76be9290fd87d1cca72b4839a1766000000", + "blockheight": 103, + "txindex": 1, + "locktime": 102, + "version": 2, + "inputs": [ + { + "txid": "1712c8af55f6853be3179bf20398689bb9204695fe3d6171c3248783218814e3", + "index": 0, + "sequence": 4294967293 + } + ], + "outputs": [ + { + "index": 0, + "amount_msat": 19993653000, + "scriptPubKey": "51206c27e1956acfa61e68292c80908880e813450f754132e8a2ac471a86bf1326b5" + } + ] + }, + { + "hash": "706e569239dfe88a33ae6d276ae68d6c787a2403ecf0ac97ed14eec28aa6039d", + "rawtx": "02000000000101e3148821838724c371613dfe954620b99b689803f29b17e33b85f655afc8121701000000171600142577677b3b18e431cfe9ac900e842b4d0567d251fdffffff0200c2eb0b00000000160014661c23b790dd3491373af0b1d8bed0877d5cde22cd01e91c010000001600140527f5b39d5b246fc5ed823c59ccdc5cc50e70580247304402205d01bd83c715b11e29040b0e8a193629194f638b7369270d668df172616d872302205bbad12ce8fc7a4694195dc3871302e808547b24e7098ffd089d0e340ccf3b950121034bcbb11214c52ca895d87add0c0de5a1dfb429966aa50f59afe33669319ea99266000000", + "blockheight": 103, + "txindex": 2, + "locktime": 102, + "version": 2, + "inputs": [ + { + "txid": "1712c8af55f6853be3179bf20398689bb9204695fe3d6171c3248783218814e3", + "index": 1, + "sequence": 4294967293 + } + ], + "outputs": [ + { + "index": 0, + "amount_msat": 200000000000, + "scriptPubKey": "0014661c23b790dd3491373af0b1d8bed0877d5cde22" + }, + { "index": 1, - "sequence": 4294967295 + "amount_msat": 4779999693000, + "scriptPubKey": "00140527f5b39d5b246fc5ed823c59ccdc5cc50e7058" + } + ] + }, + { + "hash": "7547ffc11396c62852104f7100d5ca27a2b9c0d5d43d08122147b2b03eb157a5", + "rawtx": "02000000000101e4f55092d059070e27bc6d3a8cce1ba7137244e997c499ce47ca9828d82319fc0000000000fdffffff0280841e00000000001600149fb67bfcefee6cb7db4c7e55d9c6bfd749e31d1e8c721bed0000000016001442e74d56791e0c6447ebb87c612d324a8fd1e9f90247304402201843081a5417aec6d9e77e894ca159622d76360a16b9ee66e7d363a38ccd2a6102206b2dfb4bd0b0e8c25ed798842288c0ef3a0e328fa4f42d6fb5c479715ab2f0710121023770a6280695342030684ebaf25094a197f97acbb988e1ec8459b6228e20f8596b000000", + "blockheight": 108, + "txindex": 1, + "locktime": 107, + "version": 2, + "inputs": [ + { + "txid": "fc1923d82898ca47ce99c497e9447213a71bce8c3a6dbc270e0759d09250f5e4", + "index": 0, + "sequence": 4294967293 + } + ], + "outputs": [ + { + "index": 0, + "amount_msat": 2000000000, + "scriptPubKey": "00149fb67bfcefee6cb7db4c7e55d9c6bfd749e31d1e" }, { - "txid": "4ee2eafa9a9b9e900aad69b7d3e4d6a5851556b0680ac1caeb3886f7b4a429d2", + "index": 1, + "amount_msat": 3977998988000, + "scriptPubKey": "001442e74d56791e0c6447ebb87c612d324a8fd1e9f9" + } + ] + }, + { + "hash": "737d6835ddafd515ba9e9def733bb4e4211f6053a32b1422bf1c8cc240850f96", + "rawtx": "020000000001019d03a68ac2ee14ed97acf0ec03247a786c8de66a276dae338ae8df3992566e700000000000fdffffff02816cdc0b0000000022512035f1184f6b470c9df347da62c4b28e7ec9ee10b220bac3accd22209def0036ea40420f00000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd0247304402207336a772e8643be4dc672957feaa3c9d97dde0aa5d8014a35ebc4772d8dacf91022074cd9cf97077fbf2f5d380b3917565f05232cc07db22aef12f327d6603861d6f012103fa9c95085e42b1e5003cd1f418178c30c96e4ae77954ca0fc48c58826ff4eb0e6c000000", + "blockheight": 109, + "txindex": 1, + "locktime": 108, + "version": 2, + "inputs": [ + { + "txid": "706e569239dfe88a33ae6d276ae68d6c787a2403ecf0ac97ed14eec28aa6039d", "index": 0, - "sequence": 4294967295 + "sequence": 4294967293 } ], "outputs": [ { "index": 0, - "satoshis": "88721000msat", - "scriptPubKey": "a9143a4dfd59e781f9c3018e7d0a9b7a26d58f8d22bf87" + "amount_msat": 198995073000, + "scriptPubKey": "512035f1184f6b470c9df347da62c4b28e7ec9ee10b220bac3accd22209def0036ea" + }, + { + "index": 1, + "amount_msat": 1000000000, + "scriptPubKey": "00205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd" } ] } diff --git a/doc/schemas/lightning-makesecret.json b/doc/schemas/lightning-makesecret.json index 406c328e5f8b..3976a2f7a967 100644 --- a/doc/schemas/lightning-makesecret.json +++ b/doc/schemas/lightning-makesecret.json @@ -58,20 +58,19 @@ ] }, "response": { - "secret": "a9a2e742405c28f059349132923a99337ae7f71168b7485496e3365f5bc664ed" + "secret": "82d3e65651ac89124448cb88b5f4cd009f6c321f58ada0fca6e9e3f2d1c5889e" } }, { "request": { "id": "example:makesecret#2", "method": "makesecret", - "params": [ - null, - "scb secret" - ] + "params": { + "string": "scb secret" + } }, "response": { - "secret": "a9a2e742405c28f059349132923a99337ae7f71168b7485496e3365f5bc664ed" + "secret": "82d3e65651ac89124448cb88b5f4cd009f6c321f58ada0fca6e9e3f2d1c5889e" } } ] diff --git a/doc/schemas/lightning-multifundchannel.json b/doc/schemas/lightning-multifundchannel.json index 4f7ea474e708..f2ad0fcb60a8 100644 --- a/doc/schemas/lightning-multifundchannel.json +++ b/doc/schemas/lightning-multifundchannel.json @@ -333,7 +333,7 @@ "examples": [ { "description": [ - "This example opens three channels at once, with amounts 200,000 sats, 3,000,000 sats", + "This example opens three channels at once, with amounts 20,000 sats, 30,000 sats", "and the final channel using all remaining funds (actually, capped at 16,777,215 sats", "because large-channels is not enabled):" ], @@ -343,71 +343,67 @@ "params": { "destinations": [ { - "id": "0201f42e167959c74d396ac57652fcea63c63940f78e8239cce5720df4d85ef857@127.0.0.1:7272", - "amount": "200000sat" + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d@127.0.0.1:34785", + "amount": "20000sat" }, { - "id": "0304a2468065535f9459567686e0f02b40f06e341d3eb2a62ec6763bcf2ccfd207@127.0.0.1:7373", - "amount": "0.03btc" + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199@127.0.0.1:46213", + "amount": "0.0003btc" }, { - "id": "0391f4c475050bb15871da5a72b1f3a1798de3d2e5fb4ffa262899b8d8e1f0b764@127.0.0.1:7474", + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e@127.0.0.1:38251", "amount": "all" } - ] + ], + "feerate": "10000perkw", + "commitment_feerate": "2000perkw" } }, "response": { - "tx": "02000000000101fbe3c68db87b72f82c3f5447b0bc032469c78e71f229ac99c230807ff378a9d80000000000fdffffff04400d0300000000002200202e9897ed5f9b237aa27fd5d02d24157cd452b0d3f0a5bb03d38ff73f9f8f384bffffff0000000000220020439d797ada249e1e12f8d27cabb7330de3c8de0456fb54892deb7b9c72b0ff7c1dc9b50400000000225120046e3966a2d5e43c1f1e0676161905782e1e7c00811485c618f5144f328f4e2bc0c62d0000000000220020e36fd5c03c3586c3763d8b4c9d8650f396ff1c8a460137fb09b60ee82536a3b20140ea4d564e91c919b50a2d32886f1d414de773491119beb1364b92f15d6d03e1810e5ddea89c265e42f2e96bb028dfb3aa0b5b30072ddcc78daad727503c53e37fa9010000", - "txid": "90dc53922b70628fc9e7804ad0b8cd0fb41f050d94ffa2db3b16e918c96c022a", + "tx": "02000000000107feed56fc07fe7a3094f5f7c104f4ac8f3c96f6bf7c44df90619307d6f75c06850200000000fdffffff72819eb0ce9892c1025fd83e5e1a39fd30f79f843b489a32c20f45e67f37c5f30100000000fdffffff187f8d1b7292d57a46e23ae746c530741b8493dff74a7f62ca7e200204f6ec800000000000fdfffffffeed56fc07fe7a3094f5f7c104f4ac8f3c96f6bf7c44df90619307d6f75c06850100000000fdffffff07e45ab0c8dc4bc9a42d260c71f3a722bd104e28623693e84e302eb62b8554940000000000fdffffff187f8d1b7292d57a46e23ae746c530741b8493dff74a7f62ca7e200204f6ec800700000000fdffffff187f8d1b7292d57a46e23ae746c530741b8493dff74a7f62ca7e200204f6ec800400000000fdffffff040a8b250700000000220020f7bbe8f915381b4b9b1ca14cccbfd156eea19888550d01a5014f977e98c7fc8c204e000000000000220020369444aad3ac8c5452be625479f761587c42fbf66fecf644447daabc73c498223075000000000000220020d90c23ede7b77f89f4cae93da9326ba176d158a0b65faeaede5684c3c0f7c839a86100000000000022512018ece00b736f9ed77ed3a87426643c242223e3d6116a4cd6d90946f73de2ce71024730440220296f0d677ae2151a2fceb00c717483488f46aff309e28f36934ec3bcf914443f02204a7a20186d9b936e029c6b55df302386ad306f6738176945cf5d8607c18d16c7012102272a9a25f1ffed52fab04a2cc88aeab135b53723856a8f1481c26417f88a922e02473044022063c77ad73bd1993abc48b04b2f7b66ab7aa34f56f55c69b1c3e1868a4580554c0220466333d7e6e9163ec6ad6ef755be6e61a79a6a50ac8ad32d071b2819f2a113a60121029da47016812598be384212ce15793496c0ec2176a87e81c6432dae964f87c9870247304402205dfb4fcf67b12cf0fc3a1f3527bc37964c1604fb7ac11df2fd80b2bde605689d02203bbd1bcf5f92a6cd31c9459c9252d84fcd102fdfc8e367360e71ef047c704015012103d034f788f410c2ec2d89d161df3c3715f965248aa53eace463d10eca443eb1f20247304402203b12894f094c85c94bf7a898ddfe8d82359486aedb56b0891e5db83fee628dff0220478b954fd0514de5ff0d3273ed93d54f87e7d90e63f2d4b478a9a7669af2e1110121028a599168d3c97debc71bc66e6270ecf054f300d888309ba05471a482175dd9300140508f9706e9d6353d0a19a9128353fc8090948de09ee79afc35ae10c17ab0f894ec04eabf9187082bd31d3b63e9e52d99cbaef4c1f79dd6121024a7d3b4d994ec014054bdc1bab81661fd3ad8c0a65402abf2c2228da8f2150b6ce0cb8fddafd4c25a0318cc16cdbf72c5142dd6bbccb606cc7c2c39f91a218309dc5dadb7a74fe56b024730440220203ba0cc960cb70555e2096ecba5a5992b6b35ff621f736625360f836d208ce202207fa53d5ac33847fc166e03d888ef27c709dc65bfb79ece85d9d93bdda62c0ca501210267f4468ffafe6f919ae871f57f09690467f494e83e0358dc64d10472f9072f4c9b000000", + "txid": "9c3d4a6491eaa04c378101a7a7836f07409d04db8295b14930f89f7562744e18", "channel_ids": [ { - "id": "0201f42e167959c74d396ac57652fcea63c63940f78e8239cce5720df4d85ef857", - "channel_id": "25c8253e66a860d17916cc0c21386e310eba9900030a68ec6ff6f59a8401a872", - "outnum": "0" + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "channel_id": "a9c39915cfa357205e3597ec62d92c541a2be7f44b9c6292e126aeddb11bf97e", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, + "outnum": 1 }, { - "id": "0304a2468065535f9459567686e0f02b40f06e341d3eb2a62ec6763bcf2ccfd207", - "channel_id": "51749d724892a406896f6bf2e2f8c0b03399d0436691f294839897fa167e6521", - "outnum": "3" + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "channel_id": "a4a379248e49d207cc984646e632e1a31105a85708b9d6d961a5018fdd489f5a", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, + "outnum": 2 }, { - "id": "0391f4c475050bb15871da5a72b1f3a1798de3d2e5fb4ffa262899b8d8e1f0b764", - "channel_id": "7e1414e72c081f0754fa18c1657cedabe696aa9ffeaf0b936bfbe3a28f2829d1", - "outnum": "1" - } - ], - "failed": [] - } - }, - { - "request": { - "id": "example:multifundchannel#2", - "method": "multifundchannel", - "params": { - "destinations": [ - { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59@localhost:41939", - "amount": 50000 - } - ], - "feerate": "10000perkw", - "commitment_feerate": "2000perkw" - } - }, - "response": { - "tx": "0200000000010100a8ceb6f76c49c8c0c809ca359461540708a9a5ac56e56e6a7aaafb35f4d3850000000000fdffffff0250c30000000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd0623ff030000000022512063ffee4ea7d51e6cadf9086e286a2527922aaa25b8c53aebf32fa32a0a627f5a02473044022064763837f2cc84507eb1fc28c9e95d51174e1da4b8755da8e67fe21e37d0a8b402206295d0f19625f014819361a20572b936d81f6c5ba419e56997e882f3a7be094a012103d745445c9362665f22e0d96e9e766f273f3260dea39c8a76bfa05dd2684ddccf66000000", - "txid": "ecba36e93bcf40542d43a05ef550bb0e4be51d766aa2ec8c5640a0d431ab0d06", - "channel_ids": [ - { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "channel_id": "060dab31d4a040568ceca26a761de54b0ebb50f55ea0432d5440cf3be936baec", + "id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", + "channel_id": "e13472d6512413eb1bf03b9a0bb391d0e4152fd337fa6d1014e3de5e131918d9", "channel_type": { "bits": [ - 12 + 12, + 22 ], "names": [ - "static_remotekey/even" + "static_remotekey/even", + "anchors/even" ] }, "outnum": 0 @@ -418,20 +414,20 @@ }, { "request": { - "id": "example:multifundchannel#3", + "id": "example:multifundchannel#2", "method": "multifundchannel", "params": { "destinations": [ { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59@localhost:44663", + "id": "03a389b3a2f7aa6f9f4ccc19f2bd7a2eba83596699e86b715caaaa147fc37f3144@127.0.0.1:34785", "amount": 50000 }, { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d@localhost:34631", + "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199@127.0.0.1:46213", "amount": 50000 }, { - "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199@localhost:34617", + "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518@127.0.0.1:39877", "amount": 50000 } ], @@ -439,12 +435,12 @@ } }, "response": { - "tx": "020000000001023041611dac05004825ab64781b4a33bf622380bf90196fae689196b1850a1f8f0000000000fdffffff5646519c565466c9588a88400ec71a39a2c0b6988beadb32491a13d9b89f85360100000000fdffffff0250c3000000000000220020181492c29a989f099fd2cf412c74b192dd095e81f4e4f6bec45bd1fbfdd2cfd983720000000000002251203e8a03f678bb7ca048baecc39788530560ea049816d604f72925e425288446c80140caa3b93c6667e4fe0026417cc87ae9dfd16d80018e7c6dcd6dfcee4d6cab7c7e84181baeb95ba25934ad1aa6b57f83c8287bf1b727123350b35549a3abe15b060140b3c6626b9b57081cc7eb5e4f518669764d265fb84316d8fb610e19ede13c5a370c1072861b909ec923acec980adb4a3e488ee3c6f9c49164bd4596945b52f62678000000", - "txid": "1fcc6d46200443ad21e3a1a1628b862bafd0d75c0b4454f5494957097bc7930d", + "tx": "0200000000010289da71f14f2e28c351f3f2cea6c9008fbf316cd353f6a084a17851afd37e5be70000000000fdffffffdcb684b96d9a2a37ef441c5eca75d15ef35ca8e16a6df21dca5fb6558400ca840000000000fdffffff022610250700000000225120def24e878a66b695c4d5b414b42b7ce94471dac985bb0afb0367e8bbb92c5a5250c30000000000002200209bd3269fda069b7ee0584622d458bb437635b3a179265dee3843ef18f42f35c601404a5e8638f6961d1c42609a5497346af9ba4cffb7f44cc8869c7e158627a8bb35884652fe1927d0b1917e9c22328339c33adedf93a7c86d90edba49eef4d949f301400373733215aeb64ca95e21b16be5772d3ad2ba7fa92faf842eeffab2c5741a66076cd1fb8af1c6c65456eeaf05f9ac80ce5502ae3ff88c40b632d8785bcd63799c000000", + "txid": "313dc9366eeab30a094fb85297673187cfb93aec0ec8610215f75d129d7c06e9", "channel_ids": [ { "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", - "channel_id": "0d93c77b09574949f554440b5cd7d0af2b868b62a1a1e321ad430420466dcc1f", + "channel_id": "09eb55872cd9039ecd08281af756e23b15aad4129fd6a9bcd71b472114ebf43a", "channel_type": { "bits": [ 12, @@ -455,24 +451,24 @@ "anchors/even" ] }, - "outnum": 0 + "outnum": 1 } ], "failed": [ { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "03a389b3a2f7aa6f9f4ccc19f2bd7a2eba83596699e86b715caaaa147fc37f3144", "method": "connect", "error": { "code": 401, - "message": "All addresses failed: 127.0.0.1:44663: Connection establishment: Connection refused. " + "message": "All addresses failed: 127.0.0.1:34785: Cryptographic handshake: peer closed connection (wrong key?). " } }, { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", "method": "connect", "error": { - "code": 401, - "message": "All addresses failed: 127.0.0.1:34631: Connection establishment: Connection refused. " + "code": 402, + "message": "disconnected during connection" } } ] diff --git a/doc/schemas/lightning-multiwithdraw.json b/doc/schemas/lightning-multiwithdraw.json index 3e524fa62e16..1bc7a1ffb27a 100644 --- a/doc/schemas/lightning-multiwithdraw.json +++ b/doc/schemas/lightning-multiwithdraw.json @@ -94,17 +94,17 @@ "params": { "outputs": [ { - "bcrt1qyusnugshkn6kh5vmdjpe8hylvxlxjy3ns0hmrs": "2222000msat" + "bcrt1q84payf4ucfcpnt0994arm3f20tqmu29cna738w": "2222000msat" }, { - "bcrt1q6r4vvt7uack33qf9n05umfxy8h5s2rdcmq7ra3": "3333000msat" + "bcrt1q64wyjwvrmdj3uyz8w32mr4qgcv08a833zepjm3": "3333000msat" } ] } }, "response": { - "tx": "02000000000101b75863b811587b4c15bb94d9285c31d6369b8ff609e44de399936f8acb268f600000000000fdffffff03050d000000000000160014d0eac62fdcee2d1881259be9cda4c43de9050db8ae0800000000000016001427213e2217b4f56bd19b6c8393dc9f61be691233d4b5f5050000000022512063ffee4ea7d51e6cadf9086e286a2527922aaa25b8c53aebf32fa32a0a627f5a0247304402203a001463da125de5615ff1c18f9cd4a1d2a138c91d40189d350821ac8fb3ae4f02207a507eec27e15fe43476233cd9fe8b690ebd265073a58ed18ff79a1416886f18012103d745445c9362665f22e0d96e9e766f273f3260dea39c8a76bfa05dd2684ddccf66000000", - "txid": "94e803b98257855569d35b675d65fb4fa0061a8b5f828992e2104a2882bb18bf" + "tx": "02000000000101057342aca7062873a4edd5a673980757885e5da8f68de3af254fe7c26d46e0700000000000fdffffff03df420700000000002251202b5dd0613b6e534f572dbcf4311b66e6cc8bb07e285928ddb6fa5791e4737874ae080000000000001600143d43d226bcc27019ade52d7a3dc52a7ac1be28b8050d000000000000160014d55c493983db651e10477455b1d408c31e7e9e310140beb27b31860b45464367b0f08334a0c90f3409ad176b9e21a35079495d6ce3dee0bbed786225ae56f59294466c9a14daf983375486dccaad7df3a7bc56b03faa87000000", + "txid": "85065cf7d607936190df447cbff6963c8facf404c1f7f594307afe07fc56edfe" } }, { @@ -114,35 +114,32 @@ "params": { "outputs": [ { - "BCRT1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KYGT080": 1000 + "bcrt1p97zrhgxgm6wscsdx8gjafj4jyqetunat7fynrk4cyg2rz6lzrr9q6dlrp2": 1000 }, { - "bcrt1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qzf4jry": 1000 + "bcrt1qm7k64cvd2ljw758ptwrrm8ny30u67ea3cfkxpn": 1000 }, { - "bcrt1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k0ylj56": 1000 + "bcrt1qswadp7rqx7m0zx2tffhzmqfansdrpfesr2la7k": 1000 }, { - "BCRT1SW50QT2UWHA": 1000 + "bcrt1q68wfpfam8tu3a457jv7u8r64tdvqltgfs0kj84": 1000 }, { - "bcrt1zw508d6qejxtdg4y5r3zarvaryv2wuatf": 1000 + "bcrt1qq7g9ccvfcxhg4lcj2e4s8u6l75tdzl5y7krmtl": 1000 }, { - "bcrt1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvseswlauz7": 1000 + "bcrt1pp9uw53lnrtt9v8vkemhpf6z3jfex2dkyu8je6z0jzlem2a3tqccqvseg2y": 1000 }, { - "bcrt1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesyga46z": 1000 - }, - { - "bcrt1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqc8gma6": 1000 + "bcrt1q5sacyx5hjrugpcgn5w2mw9aq7d2tnkwxmmjp06": 1000 } ] } }, "response": { - "tx": "02000000000101dc5a50dfbafc30697b930b44e763ff7a255475d17d975fa0e2003431312098cf0100000000fdffffff09e803000000000000225120000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433e803000000000000046002751ee8030000000000002a5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6e80300000000000022512079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817983b939700000000002251200518e92cd94e0f62c06f126dff98b9abe79b7ed845a156d5245678e26554475de803000000000000160014751e76e8199196d454941c45d1b3a323f1433bd6e8030000000000002200201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262e803000000000000125210751e76e8199196d454941c45d1b3a323e803000000000000220020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e8643301407f0d9bc098c5439ff611507b6a7d403047ed4e0b883f293db19d4e109d350a24f790acb55547384ff2a23fcfde0eba9af7cebc321c19cfc4817ecd47d50c2cd854000000", - "txid": "062383a7c9a19a2768939087a5c89826a4ea3531080f20cc06aa1cbf431be505" + "tx": "02000000000101b621d886a10f33d5ad58c163a35cddf03bd435e3ed100f14af3fcdac1a7dff510100000000fdffffff08e803000000000000160014dfadaae18d57e4ef50e15b863d9e648bf9af67b1e8030000000000002251200978ea47f31ad6561d96ceee14e85192726536c4e1e59d09f217f3b5762b0630b53e1e000000000022512000dea9b3b059044ed411fe24d7bff4d1b3bbdd09a16034a096a4b175f7f5ac0fe80300000000000016001407905c6189c1ae8aff12566b03f35ff516d17e84e803000000000000160014a43b821a9790f880e113a395b717a0f354b9d9c6e80300000000000016001483bad0f86037b6f1194b4a6e2d813d9c1a30a730e803000000000000160014d1dc90a7bb3af91ed69e933dc38f555b580fad09e8030000000000002251202f843ba0c8de9d0c41a63a25d4cab22032be4fabf24931dab82214316be218ca0247304402203c885a48d44614905673678d31e1c6a42af612ca6cd20d65a2e81670cd11bf8a0220738dc66ca4c1c1d466d6195ddaaf7b0c98a60769b782c282ad1f9db30bb9784201210330a75acaed258be6bc02da9fab058abbe0e770caceb7c6496eaaea7014c3d39b87000000", + "txid": "80ecf60402207eca627f4af7df93841b7430c546e73ae2467ad592721b8d7f18" } } ] diff --git a/doc/schemas/lightning-newaddr.json b/doc/schemas/lightning-newaddr.json index cc0a490af6d8..5402625d9e53 100644 --- a/doc/schemas/lightning-newaddr.json +++ b/doc/schemas/lightning-newaddr.json @@ -69,7 +69,7 @@ "params": {} }, "response": { - "bech32": "bcrt1qq8adjz4u6enf0cjey9j8yt0y490tact93fzgsf" + "bech32": "bcrt1qcqqvkswps3e6ck3jmqf86f9tcaeke5z04d3tv4" } }, { @@ -77,11 +77,11 @@ "id": "example:newaddr#2", "method": "newaddr", "params": { - "addresstype": "bech32" + "addresstype": "p2tr" } }, "response": { - "bech32": "bcrt1qq8adjz4u6enf0cjey9j8yt0y490tact93fzgsf" + "p2tr": "bcrt1phtprcvhz842sxe8qw0yryvc0g6n6dw2puweklcpnfye273kjpfhs0d6d2e" } } ] diff --git a/doc/schemas/lightning-offer.json b/doc/schemas/lightning-offer.json index 222a97f1a840..3d2a8a731332 100644 --- a/doc/schemas/lightning-offer.json +++ b/doc/schemas/lightning-offer.json @@ -182,15 +182,15 @@ "id": "example:offer#1", "method": "offer", "params": { - "amount": "1msat", - "description": "test for 1msat" + "amount": "10000msat", + "description": "Fish sale!" } }, "response": { - "offer_id": "f61cca153d1948dade19349792d9bcdc9cef687fd27db0b553a67979f55aae48", + "offer_id": "dca9774ba2925b48c42eb12e599c09389d9d80d44445c4d0c944556c7228746e", "active": true, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqyqs5rn5v4ehggrxdaezqvtdwdshg93pqfnwgkvdr57yzh6h92zg3qctvrm7w38djg67kzcm4yeg8vc4cq63s", + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqgn3qzs2ge5hx6pqwdskcefpzcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", "used": false, "created": true } @@ -200,16 +200,16 @@ "id": "example:offer#2", "method": "offer", "params": { - "amount": "100000sat", - "description": "quantity_max test", - "recurrence": "1week" + "amount": "1000sat", + "description": "Coffee", + "quantity_max": 10 } }, "response": { - "offer_id": "f7a501e51e2a90d032150b9100b1977c625f05cfda22469bdc81d8a20b1e303f", + "offer_id": "f901018768e13ea2da95f437749e24d22d47b2a6ea3030ef66ae0281df49d94b", "active": true, "single_use": false, - "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqszltcgqpgghzatpde6xjaretakkz7pqw3jhxaqkyypxdeze35wncs2l2u4gfzyrpds00e6yakfrt6ctrw5n9qanzhqr2xq6qgqsw", + "bolt12": "lno1qgsqvgnwgcg35z6ee2h3yczraddm72xrfua9uve2rlrm9deu7xyfzrcgqv85ysq2qepk7enxv4j3gqg2zcssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e", "used": false, "created": true } diff --git a/doc/schemas/lightning-openchannel_abort.json b/doc/schemas/lightning-openchannel_abort.json index 7e7e26d00394..56497c824fc5 100644 --- a/doc/schemas/lightning-openchannel_abort.json +++ b/doc/schemas/lightning-openchannel_abort.json @@ -80,12 +80,12 @@ "id": "example:openchannel_abort#1", "method": "openchannel_abort", "params": { - "channel_id": "aec3dfd0c7643a23b679cd2e493c053f8fdf621ff2624949f9582c4118b818c6" + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5" } }, "response": { - "channel_id": "aec3dfd0c7643a23b679cd2e493c053f8fdf621ff2624949f9582c4118b818c6", - "channel_canceled": true, + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "channel_canceled": false, "reason": "Abort requested" } } diff --git a/doc/schemas/lightning-openchannel_bump.json b/doc/schemas/lightning-openchannel_bump.json index cfdfe9072480..02ed873e79f5 100644 --- a/doc/schemas/lightning-openchannel_bump.json +++ b/doc/schemas/lightning-openchannel_bump.json @@ -169,5 +169,94 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:openchannel_bump#1", + "method": "openchannel_bump", + "params": [ + "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + 1000000, + "cHNidP8BAF4CAAAAAbMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQAAAAD9////AUFZ3AsAAAAAIlEgO+E35aPNS3YQRaiMByjTJDUYNvBO1Z39o3m42EZGUreYAAAAAAEAcQIAAAABl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywAAAAAAP3///8Ceh/00gAAAAAWABSauB3UBW2CVXly9l1sU6aMmVAq+ADC6wsAAAAAFgAUA8/shxXh9ASjbsAR5COPhjKfkJyXAAAAAQEfAMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnAAA", + "15000perkw" + ] + }, + "response": { + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEITP+kZdFBsOIAAQMIQEIPAAAAAAABBCIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfDPwJbGlnaHRuaW5nAQg8VGAuu93kPAABAwhBWdwLAAAAAAEEIlEgO+E35aPNS3YQRaiMByjTJDUYNvBO1Z39o3m42EZGUrcM/AlsaWdodG5pbmcBCJhXLSQQ2IEcAA==", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, + "commitments_secured": false, + "funding_serial": 4347205294156014600, + "requires_confirmed_inputs": false + } + }, + { + "request": { + "id": "example:openchannel_bump#2", + "method": "openchannel_bump", + "params": { + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "amount": 1000000, + "initialpsbt": "cHNidP8BAF4CAAAAAbMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQAAAAD9////AUFZ3AsAAAAAIlEgO+E35aPNS3YQRaiMByjTJDUYNvBO1Z39o3m42EZGUreYAAAAAAEAcQIAAAABl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywAAAAAAP3///8Ceh/00gAAAAAWABSauB3UBW2CVXly9l1sU6aMmVAq+ADC6wsAAAAAFgAUA8/shxXh9ASjbsAR5COPhjKfkJyXAAAAAQEfAMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnAAA", + "funding_feerate": "15000perkw" + } + }, + "response": { + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIQCsNB0i02NIAAQMIQVncCwAAAAABBCJRIDvhN+WjzUt2EEWojAco0yQ1GDbwTtWd/aN5uNhGRlK3DPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, + "commitments_secured": false, + "funding_serial": 10324133783552127000, + "requires_confirmed_inputs": false + } + }, + { + "request": { + "id": "example:openchannel_bump#3", + "method": "openchannel_bump", + "params": [ + "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + 2000000, + "cHNidP8BAF4CAAAAAbMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQAAAAD9////AWINzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAAEAcQIAAAABl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywAAAAAAP3///8Ceh/00gAAAAAWABSauB3UBW2CVXly9l1sU6aMmVAq+ADC6wsAAAAAFgAUA8/shxXh9ASjbsAR5COPhjKfkJyXAAAAAQEfAMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnAAA", + "18750perkw" + ] + }, + "response": { + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIwRR1uu1r8GoAAQMIgIQeAAAAAAABBCIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfDPwJbGlnaHRuaW5nAQjdRD+FoUsRIAABAwhiDc0LAAAAAAEEIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2gM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==", + "channel_type": { + "bits": [ + 12, + 22 + ], + "names": [ + "static_remotekey/even", + "anchors/even" + ] + }, + "commitments_secured": false, + "funding_serial": 15943938423967650000, + "requires_confirmed_inputs": false + } + } ] } diff --git a/doc/schemas/lightning-openchannel_init.json b/doc/schemas/lightning-openchannel_init.json index 032dd2df3743..2fcc4caf31cc 100644 --- a/doc/schemas/lightning-openchannel_init.json +++ b/doc/schemas/lightning-openchannel_init.json @@ -218,18 +218,14 @@ "id": "example:openchannel_init#1", "method": "openchannel_init", "params": { - "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "amount": 999000, - "initialpsbt": "cHNidP8BADMCAAAAAYbThUhSzYr7ph6Z434bdcW7eoirYOFMmUt2GXZ79sF/AQAAAAD9////AGYAAAAAAQDeAgAAAAABARVD4QKlmwy8SNcNypf1o9TzbIFZjj4dqVzHAL0SLDoTAAAAAAD9////AjOv9ikBAAAAFgAUXJGglH7At5HOVY4ZHp0+19kv655AQg8AAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFlAkcwRAIgVIxRXqIykOOxm/6YPaFFx2Qh1618qlXPUhDiliVQ2KUCIHQcHniUTcm1XT8SyRE8ev52jm0uiIYum15XcR/tPh+NASEC3Pby7xL4+Ig/Z8TchQ0QT1upLGet3da8qjSjgHO9LOJlAAAAAQEfQEIPAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQA=", - "channel_type": [ - 12, - 22 - ] + "id": "03a00f49374e4bb876e766e9305e5fefa86e53dbc89a4f27d794b02f59ca316426", + "amount": 1000000, + "initialpsbt": "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AahhAAAAAAAAIlEg+3d9jpNmK0getyg5W+Mp31CPIRDKcJg/mZs/uaVrQ+GZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA" } }, "response": { - "channel_id": "53fa2b1ca0d8f21abeaaac0495ab9925cdfaf2ca8b04dbe4aeb061823e1ff2c8", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABARVD4QKlmwy8SNcNypf1o9TzbIFZjj4dqVzHAL0SLDoTAAAAAAD9////AjOv9ikBAAAAFgAUXJGglH7At5HOVY4ZHp0+19kv655AQg8AAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFlAkcwRAIgVIxRXqIykOOxm/6YPaFFx2Qh1618qlXPUhDiliVQ2KUCIHQcHniUTcm1XT8SyRE8ev52jm0uiIYum15XcR/tPh+NASEC3Pby7xL4+Ig/Z8TchQ0QT1upLGet3da8qjSjgHO9LOJlAAAAAQEfQEIPAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIIbThUhSzYr7ph6Z434bdcW7eoirYOFMmUt2GXZ79sF/AQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCMCDK/6LyRi8AAEDCFg+DwAAAAAAAQQiACDYM+8ZRsbTj0OCG/yzqLt2buFQn9LuMPDZqFFcgmCmfAz8CWxpZ2h0bmluZwEIchtFHfZ5FBgA", + "channel_id": "a5be438539f73c018a98a4b9dd557d62430881c56552025b5579d180cc3887ed", + "psbt": "cHNidP8BAgQCAAAAAQMEmQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAGzBTzTCENk6ggdL+V/LHCYeHlRIcHBtyNYdon39dT7vwEAAAAA/f///wKAhB4AAAAAACIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aJgAAAABAStiDc0LAAAAACJRIMkYPt6RIfPG/RSYgixHp2AnMidmnJCVCIQ7rFu9gT9oAQ4gmJB/+YSzg1wUV8PgrzFq46BKlvP/F562hdVYA8IjSHoBDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEI/+im2BTLcnwAAQMIqGEAAAAAAAABBCJRIPt3fY6TZitIHrcoOVvjKd9QjyEQynCYP5mbP7mla0PhDPwJbGlnaHRuaW5nAQhfx1o3nKFaVgABAwhAQg8AAAAAAAEEIgAgBkixRgS2irzkjzD4bs/Wm7V/PQFNNgUvPR5aBVpSJHoM/AlsaWdodG5pbmcBCHHI3g73GwAQAA==", "channel_type": { "bits": [ 12, @@ -241,7 +237,7 @@ ] }, "commitments_secured": false, - "funding_serial": 8222241539686471000, + "funding_serial": 8199047277484638000, "requires_confirmed_inputs": false } }, @@ -249,15 +245,15 @@ "request": { "id": "example:openchannel_init#2", "method": "openchannel_init", - "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount": 16777216, - "initialpsbt": "cHNidP8BADMCAAAAAQVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAAAAAAD9////AGYAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQA=" - } + "params": [ + "03a00f49374e4bb876e766e9305e5fefa86e53dbc89a4f27d794b02f59ca316426", + 500000, + "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AfZRxQsAAAAAIlEg21kTTo7K2doCG6F2JqgaDjc1kRCrH7AL08oPVVJhuE+ZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA" + ] }, "response": { - "channel_id": "252d1b0a1e57895e84137f28cf19ab2c35847e284c112fefdecc7afeaa5c1de7", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIAVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAQ8EAAAAAAEQBP3///8M/AlsaWdodG5pbmcBCLR8RjOq9lmcAAEDCAAAAAEAAAAAAQQiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQz8CWxpZ2h0bmluZwEIZZtc7LD4y9YA", + "channel_id": "b3b2e46371876858784cd1b87ecf406e32d8f98b7a44b7f436d1dca317ce0f1b", + "psbt": "cHNidP8BAgQCAAAAAQMEmQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAGzBTzTCENk6ggdL+V/LHCYeHlRIcHBtyNYdon39dT7vwEAAAAA/f///wKAhB4AAAAAACIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aJgAAAABAStiDc0LAAAAACJRIMkYPt6RIfPG/RSYgixHp2AnMidmnJCVCIQ7rFu9gT9oAQ4gmJB/+YSzg1wUV8PgrzFq46BKlvP/F562hdVYA8IjSHoBDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEILfzCFE4M1pQAAQMIIKEHAAAAAAABBCIAIMG0H4vceOuMkzqvG9svQmglTygLSd9kn0qrQFRmpEvIDPwJbGlnaHRuaW5nAQhU+Hu3eGH5tgABAwj2UcULAAAAAAEEIlEg21kTTo7K2doCG6F2JqgaDjc1kRCrH7AL08oPVVJhuE8M/AlsaWdodG5pbmcBCG0sGEoFgVYuAA==", "channel_type": { "bits": [ 12, @@ -269,7 +265,7 @@ ] }, "commitments_secured": false, - "funding_serial": 7321547790872006000, + "funding_serial": 6122779721339107000, "requires_confirmed_inputs": false } } diff --git a/doc/schemas/lightning-openchannel_signed.json b/doc/schemas/lightning-openchannel_signed.json index 86666340ce3b..fe11cc585b1b 100644 --- a/doc/schemas/lightning-openchannel_signed.json +++ b/doc/schemas/lightning-openchannel_signed.json @@ -86,5 +86,37 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:openchannel_signed#1", + "method": "openchannel_signed", + "params": { + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "signed_psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcIgICRz15z0oQ57qDTAJqrEPqGLCn+3Xs2lGEv6+oxGYV9rdHMEQCIHlCL2oKhnYn6hhaUG8+V+8D6GHFlI61OM507VB6aBwoAiACA2d5TnCdlJ1j2rF/EIHkxl3W0hBp3QqweO7hEul9aQEiBgJHPXnPShDnuoNMAmqsQ+oYsKf7dezaUYS/r6jEZhX2twgDz+yHAAAAAAEOILMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCEArDQdItNjSAAEDCEFZ3AsAAAAAAQQiUSA74Tflo81LdhBFqIwHKNMkNRg28E7Vnf2jebjYRkZStyEHE0cioCqqq2UZ2npxQi9Q6DXNZheODM6F4GjHHS3XScEJAG/ctUwEAAAADPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==" + } + }, + "response": { + "tx": "02000000000101b3053cd3084364ea081d2fe57f2c709878795121c1c1b723587689f7f5d4fbbf0100000000fdffffff024159dc0b000000002251203be137e5a3cd4b761045a88c0728d324351836f04ed59dfda379b8d8464652b740420f0000000000220020c9bc5c063caefbf7a6c7814407b5627b4f81a8b56ecbe932c682f9cbac0d19df02473044022079422f6a0a867627ea185a506f3e57ef03e861c5948eb538ce74ed507a681c280220020367794e709d949d63dab17f1081e4c65dd6d21069dd0ab078eee112e97d69012102473d79cf4a10e7ba834c026aac43ea18b0a7fb75ecda5184bfafa8c46615f6b798000000", + "txid": "ed994900569f2fddca6d86675f2e2247000197ee69aa53348e63e16fbaf39409", + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5" + } + }, + { + "request": { + "id": "example:openchannel_signed#2", + "method": "openchannel_signed", + "params": [ + "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcIgICRz15z0oQ57qDTAJqrEPqGLCn+3Xs2lGEv6+oxGYV9rdHMEQCIA8+zCzZ59t2OEFHWefZeTypY89RRQ8dMQCjtGWw6gskAiArELH1MvjW6j1G1CKnLZdV+/oabLDU48ingGSPFDOYxwEiBgJHPXnPShDnuoNMAmqsQ+oYsKf7dezaUYS/r6jEZhX2twgDz+yHAAAAAAEOILMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCMEUdbrta/BqAAEDCICEHgAAAAAAAQQiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z3wz8CWxpZ2h0bmluZwEI3UQ/haFLESAAAQMIYg3NCwAAAAABBCJRIMkYPt6RIfPG/RSYgixHp2AnMidmnJCVCIQ7rFu9gT9oIQeffk+gJsmVIxDZ8UKPKgJB9CLvaUr9xqOEogpzJx1hbAkAEioNzwUAAAAM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==" + ] + }, + "response": { + "tx": "02000000000101b3053cd3084364ea081d2fe57f2c709878795121c1c1b723587689f7f5d4fbbf0100000000fdffffff0280841e0000000000220020c9bc5c063caefbf7a6c7814407b5627b4f81a8b56ecbe932c682f9cbac0d19df620dcd0b00000000225120c9183ede9121f3c6fd1498822c47a760273227669c909508843bac5bbd813f680247304402200f3ecc2cd9e7db7638414759e7d9793ca963cf51450f1d3100a3b465b0ea0b2402202b10b1f532f8d6ea3d46d422a72d9755fbfa1a6cb0d4e3c8a780648f143398c7012102473d79cf4a10e7ba834c026aac43ea18b0a7fb75ecda5184bfafa8c46615f6b798000000", + "txid": "7a4823c20358d585b69e17fff3964aa0e36a31afe0c357145c83b384f97f9098", + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5" + } + } ] } diff --git a/doc/schemas/lightning-openchannel_update.json b/doc/schemas/lightning-openchannel_update.json index 8c08e7124ba0..0ca4e10e4c05 100644 --- a/doc/schemas/lightning-openchannel_update.json +++ b/doc/schemas/lightning-openchannel_update.json @@ -209,13 +209,13 @@ "id": "example:openchannel_update#1", "method": "openchannel_update", "params": { - "channel_id": "c3a282c1136f44dc2e499c116a9d9e6ea64649c3eabdd396cb96fb30a86fad8e", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIAVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAQ8EAAAAAAEQBP3///8M/AlsaWdodG5pbmcBCH932EuFXyxeAAEDCEBCDwAAAAAAAQQiACA/FzDCfUe+WFEBa+aPSY4TZTYt6liPHz5OHo04w2gQ3wz8CWxpZ2h0bmluZwEI42voJCAYLKQA" + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIQCsNB0i02NIAAQMIQVncCwAAAAABBCJRIDvhN+WjzUt2EEWojAco0yQ1GDbwTtWd/aN5uNhGRlK3DPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==" } }, "response": { - "channel_id": "c3a282c1136f44dc2e499c116a9d9e6ea64649c3eabdd396cb96fb30a86fad8e", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIAVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAQ8EAAAAAAEQBP3///8M/AlsaWdodG5pbmcBCH932EuFXyxeAAEDCEBCDwAAAAAAAQQiACA/FzDCfUe+WFEBa+aPSY4TZTYt6liPHz5OHo04w2gQ3wz8CWxpZ2h0bmluZwEI42voJCAYLKQA", + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIQCsNB0i02NIAAQMIQVncCwAAAAABBCJRIDvhN+WjzUt2EEWojAco0yQ1GDbwTtWd/aN5uNhGRlK3DPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==", "channel_type": { "bits": [ 12, @@ -227,21 +227,22 @@ ] }, "commitments_secured": true, - "funding_outnum": 0 + "funding_outnum": 1, + "close_to": "51202321a432c9022a560c7dae78bdb72c605c373961edd29c42aa98c183782d052a" } }, { "request": { "id": "example:openchannel_update#2", "method": "openchannel_update", - "params": { - "channel_id": "c3a282c1136f44dc2e499c116a9d9e6ea64649c3eabdd396cb96fb30a86fad8e", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIAVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAQ8EAAAAAAEQBP3///8M/AlsaWdodG5pbmcBCH932EuFXyxeAAEDCEBCDwAAAAAAAQQiACA/FzDCfUe+WFEBa+aPSY4TZTYt6liPHz5OHo04w2gQ3wz8CWxpZ2h0bmluZwEI42voJCAYLKQA" - } + "params": [ + "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIwRR1uu1r8GoAAQMIgIQeAAAAAAABBCIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfDPwJbGlnaHRuaW5nAQjdRD+FoUsRIAABAwhiDc0LAAAAAAEEIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2gM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==" + ] }, "response": { - "channel_id": "c3a282c1136f44dc2e499c116a9d9e6ea64649c3eabdd396cb96fb30a86fad8e", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDeAgAAAAABAdWZZguGlQJ1eA+d7WAT500jdCzHJWT9J/TGQIkbS1KfAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFE8Xxp4GJggW2lJcsHg0VLolc/Z/AkcwRAIgEQLtA2JvAk7S1R9QD5o4SVNXCjMwTUIyHtu65taC/d4CIEnpq2PdrqKqitdmZj09U8cFuwV+Ba9kmZSUsctSWx8CASECUKP6EBufpaBXT910uYhCcKdw9z8iqHgyKa3uuX2QgmVlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIAVmgyf8sA3N9J6XaH5z7W+GUPDFOM/2L/PuD7iE0RaqAQ8EAAAAAAEQBP3///8M/AlsaWdodG5pbmcBCH932EuFXyxeAAEDCEBCDwAAAAAAAQQiACA/FzDCfUe+WFEBa+aPSY4TZTYt6liPHz5OHo04w2gQ3wz8CWxpZ2h0bmluZwEI42voJCAYLKQA", + "channel_id": "b020c1c6818daf024954c9ee578caad058cbcae7dd75b2c4d38b8f6f81901ff5", + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIwRR1uu1r8GoAAQMIgIQeAAAAAAABBCIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfDPwJbGlnaHRuaW5nAQjdRD+FoUsRIAABAwhiDc0LAAAAAAEEIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2gM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==", "channel_type": { "bits": [ 12, @@ -254,7 +255,7 @@ }, "commitments_secured": true, "funding_outnum": 0, - "close_to": "5120eed745804da9784cc203f563efa99ffa54fdf01b137bc964e63c3124070ffbe6" + "close_to": "51202321a432c9022a560c7dae78bdb72c605c373961edd29c42aa98c183782d052a" } } ] diff --git a/doc/schemas/lightning-pay.json b/doc/schemas/lightning-pay.json index 9d381f36b9c1..c8e1de1aa9ee 100644 --- a/doc/schemas/lightning-pay.json +++ b/doc/schemas/lightning-pay.json @@ -242,18 +242,37 @@ "request": { "id": "example:pay#1", "method": "pay", + "params": [ + "lnbcrt500n1pn2s396sp5h5tz6fpm3dxvrlwcnwmfq85v45wfj43mdmplpce6ku2vmfdhrx5qpp50z9w5u57meydx9dpn889mmtkz6tqrfsa65hfwd88ql4hc5hyu70qdqcdsenygryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqt5m8qx0t25a0gygya7u4sxulyyp2dec87pwsxuuwtg0u66c07703g9j6vlwgmlhqk7qgn95qw7allhnuj2m9hf0xkcr2zkaxltv3t6gqjcdpll" + ] + }, + "response": { + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "payment_hash": "788aea729ede48d315a199ce5ded76169601a61dd52e9734e707eb7c52e4e79e", + "created_at": 1722303686.2193663, + "parts": 1, + "amount_msat": 50000, + "amount_sent_msat": 50001, + "payment_preimage": "0e07efd883f66b6b22ec7f2e7116e203c3fecc22eb8596a73eaf06c4befb0641", + "status": "complete" + } + }, + { + "request": { + "id": "example:pay#2", + "method": "pay", "params": { - "bolt11": "lni1qqgxr7gha7gusyg83lsr8qcqg4axgq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqtypg3hgetnwsszycn0d36rzv3zypjx2umrwf5hqarfdahzcg8sn7jmpuyl423pvggzvmj9nrga83q474e2sjygxzmq7ln5fmvjxh4skxafx2pmx9wqx5v9qgqxyfhyvyg6pdvu4tcjvpp7kkal9rp57wj7xv4pl3ajku70rzy3pavzzqjz06c8s2vvmrpjlkcse0txx0gmc6jalqqxmeyjm75qcnfnqxwyt2sfsqnxu3vc68fug904w25y3zpskc8huazwmy34av93h2fjswe3tsp4rqpe8qlx9xssexfc0aguke3q6u0jgw2qmn008mzu04mkmqmjmhes3gcpqdqdnzl270s48vsp635rd4jm04snvgkcp65qlkgp8qztu2mdp7c5uqpj2rll3pzu56st537rct3v62gfqeamzthjuwkr0pkvsdnnffpn4sq9sz0lryaufktx0nfxlffum3yesqev5gwqqqqqqqqqqqqqqqzsqqqqqqqqqqqqr5jt9hav2gqqqqqq5szxtvwkyz5zq2000hlwvadejz366lqjt9sd2j4rf5tfd9rgmmyegt4dqd34cf6v4gqkfvppqfnwgkvdr57yzh6h92zg3qctvrm7w38djg67kzcm4yeg8vc4cq633uzqn3n74ccym4wcvq20vsx7lmk450kprpvlrh4cukk8xy9ptjcef4rnhytnkyn4vnxxtd57yeaksze2s30y26cs6u3rjd9322eg9puk24q" + "bolt11": "lnbcrt1u1pn2s3xxsp5xk8hs6zuv0yqhq7hhl0sps6mxuj78pzwryejaljh48vr4htykujqpp593ndc8wrukteld5j4nqnt6tedavh8ezv48dmrkqen3440ajnre5qdqcdsenxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq0asve9rdtfd9fe20u5vjujzmm0phpq538z8ndhn5ts62aflhktqn6338e45xcxkyf7askjjq25ksxt4eqarjjame8wfdmau7kq7m4csqs0n32n" } }, "response": { - "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "payment_hash": "29ef7dfee675b990a3ad7c125960d54aa34d16969468dec9942ead03635c274c", - "created_at": 1706153504.76628, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "payment_hash": "2c66dc1dc3e5979fb692acc135e9796f5973e44ca9dbb1d8199c6b57f6531e68", + "created_at": 1722303688.41859, "parts": 1, - "amount_msat": 100, - "amount_sent_msat": 100, - "payment_preimage": "6634c1b549c6615d234832f377e06d5a5ab088c40cebdc5cfb8c1262030abcad", + "amount_msat": 100000, + "amount_sent_msat": 100000, + "payment_preimage": "1ce8370d3a179cee3af25a5a6c7058e8e12033a842efd6d34abae53334bc94bf", "status": "complete" } } diff --git a/doc/schemas/lightning-ping.json b/doc/schemas/lightning-ping.json index 6b3b770b73c7..9c28e7578f24 100644 --- a/doc/schemas/lightning-ping.json +++ b/doc/schemas/lightning-ping.json @@ -68,6 +68,7 @@ "id": "example:ping#1", "method": "ping", "params": { + "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", "len": 128, "pongbytes": 128 } @@ -81,7 +82,7 @@ "id": "example:ping#2", "method": "ping", "params": { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "len": 1000, "pongbytes": 65535 } diff --git a/doc/schemas/lightning-plugin.json b/doc/schemas/lightning-plugin.json index dc2b7fabbbd3..9861f8390d57 100644 --- a/doc/schemas/lightning-plugin.json +++ b/doc/schemas/lightning-plugin.json @@ -190,87 +190,93 @@ "request": { "id": "example:plugin#1", "method": "plugin", - "params": [ - "list" - ] + "params": { + "subcommand": "start", + "plugin": "/root/lightning/tests/plugins/allow_even_msgs.py" + } }, "response": { - "command": "list", + "command": "start", "plugins": [ { - "name": "~/lightning/plugins/autoclean", + "name": "/root/lightning/plugins/autoclean", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/chanbackup", + "name": "/root/lightning/plugins/chanbackup", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/bcli", + "name": "/root/lightning/plugins/bcli", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/commando", + "name": "/root/lightning/plugins/commando", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/funder", + "name": "/root/lightning/plugins/funder", "active": true, "dynamic": true }, { - "name": "~/lightning/plugins/topology", + "name": "/root/lightning/plugins/topology", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/keysend", + "name": "/root/lightning/plugins/keysend", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/offers", + "name": "/root/lightning/plugins/offers", "active": true, "dynamic": true }, { - "name": "~/lightning/plugins/pay", + "name": "/root/lightning/plugins/pay", "active": true, "dynamic": true }, { - "name": "~/lightning/plugins/txprepare", + "name": "/root/lightning/plugins/recover", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/txprepare", "active": true, "dynamic": true }, { - "name": "~/lightning/plugins/cln-renepay", + "name": "/root/lightning/plugins/cln-renepay", "active": true, "dynamic": true }, { - "name": "~/lightning/plugins/spenderp", + "name": "/root/lightning/plugins/spenderp", "active": true, "dynamic": false }, { - "name": "~/lightning/plugins/sql", + "name": "/root/lightning/plugins/sql", "active": true, "dynamic": true }, { - "name": "~/lightning/plugins/bookkeeper", + "name": "/root/lightning/plugins/bookkeeper", "active": true, "dynamic": false }, { - "name": "~/lightning/target/debug/examples/cln-plugin-startup", + "name": "/root/lightning/tests/plugins/allow_even_msgs.py", "active": true, - "dynamic": false + "dynamic": true } ] } @@ -281,12 +287,101 @@ "method": "plugin", "params": { "subcommand": "stop", - "plugin": "fail_htlcs.py" + "plugin": "/root/lightning/tests/plugins/allow_even_msgs.py" } }, "response": { "command": "stop", - "result": "Successfully stopped fail_htlcs.py." + "result": "Successfully stopped allow_even_msgs.py." + } + }, + { + "request": { + "id": "example:plugin#3", + "method": "plugin", + "params": [ + "list" + ] + }, + "response": { + "command": "list", + "plugins": [ + { + "name": "/root/lightning/plugins/autoclean", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/chanbackup", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/bcli", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/commando", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/funder", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/topology", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/keysend", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/offers", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/pay", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/recover", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/txprepare", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/cln-renepay", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/spenderp", + "active": true, + "dynamic": false + }, + { + "name": "/root/lightning/plugins/sql", + "active": true, + "dynamic": true + }, + { + "name": "/root/lightning/plugins/bookkeeper", + "active": true, + "dynamic": false + } + ] } } ] diff --git a/doc/schemas/lightning-preapproveinvoice.json b/doc/schemas/lightning-preapproveinvoice.json index f5d410981a2e..fda80038ddfc 100644 --- a/doc/schemas/lightning-preapproveinvoice.json +++ b/doc/schemas/lightning-preapproveinvoice.json @@ -41,5 +41,27 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:preapproveinvoice#1", + "method": "preapproveinvoice", + "params": { + "bolt11": "lnbcrt1230n1pn2s38psp5jf2zk7py4wmutyq4pdr6783egft24nkyhfrxegrzzqnef2matw2qpp5rf5zgqyexdt7q5ean83cvcjuc3jafn8etm3c0za6xldwcyllvffqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydqcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgq8nn5qkcp9xl5u7dlqamdys6e6yc0ngyqe676cqajnwax6657verj7at5gvdqu6nk3l0wcagq4muyhqqms4t0t9sfvyazpga5eywj6uqpyc409e" + } + }, + "response": {} + }, + { + "request": { + "id": "example:preapproveinvoice#2", + "method": "preapproveinvoice", + "params": [ + "lnbcrt1240n1pn2s38psp5ufjqj6kuxlvl65xue9p06ulyvwf9sm0utxlch59d0ynl05778vwspp5qlacxkrdmc2p50yl8lsl75pwmlhve2ret2yd2f34z7jfs7yffwvqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydgcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqkml60qaytvnd08p57w7enuna95s7cqej8cfuvsgjzpeq9u83s0hqh60667nrp40qkqxkdu36z8wqtmac5z3208rwyn0q2pv56sgz5dcp9mn5hc" + ] + }, + "response": {} + } ] } diff --git a/doc/schemas/lightning-preapprovekeysend.json b/doc/schemas/lightning-preapprovekeysend.json index 611a10d4d5d3..165ba2b800ec 100644 --- a/doc/schemas/lightning-preapprovekeysend.json +++ b/doc/schemas/lightning-preapprovekeysend.json @@ -59,5 +59,31 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:preapprovekeysend#1", + "method": "preapprovekeysend", + "params": { + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "payment_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "amount_msat": 1000 + } + }, + "response": {} + }, + { + "request": { + "id": "example:preapprovekeysend#2", + "method": "preapprovekeysend", + "params": [ + "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", + "0101010101010101010101010101010101010101010101010101010101010101", + 2000 + ] + }, + "response": {} + } ] } diff --git a/doc/schemas/lightning-recover.json b/doc/schemas/lightning-recover.json index 412ad827208b..62a111a62099 100644 --- a/doc/schemas/lightning-recover.json +++ b/doc/schemas/lightning-recover.json @@ -53,17 +53,19 @@ "id": "example:recover#1", "method": "recover", "params": { - "hsmsecret": "cl10leetsd35kw6r5de5kueedxgqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdeuq7xuh94k9g" + "hsmsecret": "6c696768746e696e672d36000000000000000000000000000000000000000000" } }, - "response": {} + "response": { + "result": "Recovery restart in progress" + } }, { "request": { "id": "example:recover#2", "method": "recover", "params": { - "hsmsecret": "6c696768746e696e672d31000000000000000000000000000000000000000000" + "hsmsecret": "cl10leetsd35kw6r5de5kueedxyesqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqluplcg0lxenqd" } }, "response": { diff --git a/doc/schemas/lightning-recoverchannel.json b/doc/schemas/lightning-recoverchannel.json index f39a5be8cfec..6ab6cf3272ac 100644 --- a/doc/schemas/lightning-recoverchannel.json +++ b/doc/schemas/lightning-recoverchannel.json @@ -57,13 +57,23 @@ "method": "recoverchannel", "params": [ [ - "0000000000000001c3a7b9d74a174497122bc52d74d6d69836acadc77e0429c6d8b68b48d5c9139a022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d5904017f0000019f0bc3a7b9d74a174497122bc52d74d6d69836acadc77e0429c6d8b68b48d5c9139a0000000000000000000186a000021000" + "0000000000000006f4e1de801de57374d5737da622611e3a1ad9f16d5df9c30fceecc11ce732eeeb022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d5900017f0000019b987577c455da982b1753df79c56f9d8d2b75d1401e60a5af322ab27b13b20d75970000000100000000000f42400003401000", + "000000000000000121bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d00017f000001e610e23fcc9e6306ce636b203217b22409bf9bab2211f9f432de781dedb6377dab5a0000000100000000000f42400003401000", + "00000000000000027512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d00017f000001e610ee1db407eb3e47be3e93e1abc05b13806ee7aef8550c517a4974c72bf91866410000000100000000000f42400003401000", + "0000000000000003222d999f537e32e9458c5db17a63e012dcced61340de06fda5bc30566270b0aa0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f0000019bc5b15661ec5c17599de0858401b72d6be66c34b48a3bb6e679542809f395e6bb2000000000000000000bebb3cb0003401000", + "0000000000000004a4a379248e49d207cc984646e632e1a31105a85708b9d6d961a5018fdd489f5a0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f000001c1ac184e7462759ff83049b19582db049d40076f83a7a70181374ca0ea91644a3d9c0000000200000000000075300003401000", + "000000000000000509eb55872cd9039ecd08281af756e23b15aad4129fd6a9bcd71b472114ebf43a0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f000001c1ace9067c9d125df7150261c80eec3ab9cf8731679752b84f090ab3ea6e36c93d3100000001000000000000c3500003401000" ] ] }, "response": { "stubs": [ - "c3a7b9d74a174497122bc52d74d6d69836acadc77e0429c6d8b68b48d5c9139a" + "f4e1de801de57374d5737da622611e3a1ad9f16d5df9c30fceecc11ce732eeeb", + "21bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357", + "7512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2", + "222d999f537e32e9458c5db17a63e012dcced61340de06fda5bc30566270b0aa", + "a4a379248e49d207cc984646e632e1a31105a85708b9d6d961a5018fdd489f5a", + "09eb55872cd9039ecd08281af756e23b15aad4129fd6a9bcd71b472114ebf43a" ] } } diff --git a/doc/schemas/lightning-renepay.json b/doc/schemas/lightning-renepay.json index 4d13c9441f92..e1bbd6a4ce01 100644 --- a/doc/schemas/lightning-renepay.json +++ b/doc/schemas/lightning-renepay.json @@ -180,18 +180,21 @@ "id": "example:renepay#1", "method": "renepay", "params": { - "invstring": "lnbcrt1230n1pjmxj9jsp5suc4cag0lv3wemllkvms56e6ll0w867cczqfttuu8cpfl089f9kspp56wvxtdh8fxg5r5y3kg3klxceakqaydskwzatga25v95da8nzkmwqdqjv3jhxcmjd9c8g6t0dcxqyjw5qcqp99qxpqysgqkmyhymt0j7hy38vzqxx465s4ys0fg78flnjqfx4clvdq9mrmgglpcnjrrnhtk7maa87pfvjez88hke8w97zvuecwswaf9gzyqlsthegpza67eu" + "invstring": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7", + "amount_msat": 400000 } }, "response": { - "payment_preimage": "0a3fd704b34f47d6e306dbac78141753be83848d3a19725c972abfc367dcc591", - "payment_hash": "d39865b6e7499141d091b2236f9b19ed81d2361670bab475546168de9e62b6dc", - "created_at": 1706248370.6267352, - "parts": 1, - "amount_msat": 123000, - "amount_sent_msat": 123000, + "bolt11": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7", + "amount_msat": 400000, + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "created_at": 1722303718.0730329, + "groupid": 1, + "parts": 2, "status": "complete", - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" + "payment_preimage": "af67b48518e78e157db404d13cb42987c31e034634203d10b224302b05fc6c90", + "amount_sent_msat": 400000 } }, { @@ -199,19 +202,20 @@ "id": "example:renepay#2", "method": "renepay", "params": { - "invstring": "lnbcrt1pja0f9asp50kzadmeyy78eymjvhnlk5dznl3g5k5x8agh52ewjtg0jclas4ylspp5crsutd9hg05lxyhzphdcuyng6z3knrsdae83mxwawa842gz3vj3sdqjv3jhxcmjd9c8g6t0dcxqyjw5qcqp99qxpqysgqr5yzhxmup4muyaz6x8u2dy4qyu9t5qzuf5k9xayvj5kg7tve60gjk4jrv2l76exnj2xkuzhtwky23pkkxedzy6p9yrsgyqdwj7dv5gsp4zcw6v", - "amount_msat": 548925 + "invstring": "lnbcrt40n1pn2s3xxsp5j329vez86jvxw6543zlcla2fusm7v6h74pf7ftmmyfv6zm9uedlspp5j6xpxmq8cwd305vj2dvd6dh4mkr0s6guvehvyleymedgf4vsm3ysdqaveskjmr9vssxgetnvdexjur5d9hkuxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqk6uwy8pkv42jzhdna3z4vxpwkapdzzpn2tcpjnqj738nlpkjc583l9v72vlskt8y33rr4z3jma32xx7ve0jfy7anvn6r98cr5flhcuqqhr4shx" } }, "response": { - "payment_preimage": "a635e92d024beebfc58519e6544888aa560ba3bcaba7e74924e4b8432eaa56f5", - "payment_hash": "c0e1c5b4b743e9f312e20ddb8e1268d0a3698e0dee4f1d99dd774f55205164a3", - "created_at": 1708631229.7841823, - "parts": 1, - "amount_msat": 548925, - "amount_sent_msat": 548925, + "bolt11": "lnbcrt40n1pn2s3xxsp5j329vez86jvxw6543zlcla2fusm7v6h74pf7ftmmyfv6zm9uedlspp5j6xpxmq8cwd305vj2dvd6dh4mkr0s6guvehvyleymedgf4vsm3ysdqaveskjmr9vssxgetnvdexjur5d9hkuxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqk6uwy8pkv42jzhdna3z4vxpwkapdzzpn2tcpjnqj738nlpkjc583l9v72vlskt8y33rr4z3jma32xx7ve0jfy7anvn6r98cr5flhcuqqhr4shx", + "amount_msat": 4000, + "payment_hash": "968c136c07c39b17d1925358dd36f5dd86f8691c666ec27f24de5a84d590dc49", + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "created_at": 1722303719.1643083, + "groupid": 1, + "parts": 2, "status": "complete", - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" + "payment_preimage": "8815ee921dba644c076f9f879abb520d8539a6913856a439752eaaadff1e21ac", + "amount_sent_msat": 4000 } } ] diff --git a/doc/schemas/lightning-renepaystatus.json b/doc/schemas/lightning-renepaystatus.json index 8f3de493fd86..e723134829ec 100644 --- a/doc/schemas/lightning-renepaystatus.json +++ b/doc/schemas/lightning-renepaystatus.json @@ -40,8 +40,7 @@ "created_at", "groupid", "amount_msat", - "status", - "notes" + "status" ], "properties": { "bolt11": { @@ -135,5 +134,32 @@ ], "resources": [ "Main web site: " + ], + "examples": [ + { + "request": { + "id": "example:renepaystatus#1", + "method": "renepaystatus", + "params": { + "invstring": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7" + } + }, + "response": { + "paystatus": [ + { + "bolt11": "lnbcrt1pn2s3xxsp5xvccgadvepzypat5v8u8tstwdvn9ez4908h7ntl4s0ggx76ug4cqpp50qwurth9swdlzphjvjc2qm8sws8jcu0u28y4vt5s7nhr3js0c3vsdqcdserzgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqw4qfxj30wqn2m2qmcfz2gs6ttszdhkc0kjqk0mgg59tj2cy90wcke4tjzmzakrkvcgqgf3367j47q5g2ruuw67cxaqxm2t4m42yecsqp92jzs7", + "amount_msat": 400000, + "payment_hash": "781dc1aee5839bf106f264b0a06cf0740f2c71fc51c9562e90f4ee38ca0fc459", + "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "created_at": 1722303718.0730329, + "groupid": 1, + "parts": 2, + "status": "complete", + "payment_preimage": "af67b48518e78e157db404d13cb42987c31e034634203d10b224302b05fc6c90", + "amount_sent_msat": 400000 + } + ] + } + } ] } diff --git a/doc/schemas/lightning-reserveinputs.json b/doc/schemas/lightning-reserveinputs.json index 63496651e7aa..c7402f9fb4a1 100644 --- a/doc/schemas/lightning-reserveinputs.json +++ b/doc/schemas/lightning-reserveinputs.json @@ -112,17 +112,17 @@ "id": "example:reserveinputs#1", "method": "reserveinputs", "params": { - "psbt": "cHNidP8BAFwCAAAAAkwJVUqB0xXTO7JZ3PnPdGnxoYfQxhU+xqXGFYXsyX0RAAAAAAD9////TAlVSoHTFdM7slnc+c90afGhh9DGFT7GpcYVhezJfREBAAAAAP3///8AAAAAAAAAAA==" + "psbt": "cHNidP8BADMCAAAAAfcJ+tPRXly5UFuX2jOOOBUcBBjfDGAC8vLWfrkJf/O2AQAAAAD9////AAAAAAAAAA==" } }, "response": { "reservations": [ { - "txid": "117dc9ec8515c6a5c63e15c6d087a1f16974cff9dc59b23bd315d3814a55094c", + "txid": "b6f37f09b97ed6f2f202600cdf18041c15388e33da975b50b95c5ed1d3fa09f7", "vout": 1, "was_reserved": false, "reserved": true, - "reserved_to_block": 175 + "reserved_to_block": 226 } ] } @@ -132,95 +132,17 @@ "id": "example:reserveinputs#2", "method": "reserveinputs", "params": { - "psbt": "cHNidP8BAP32AQIAAAAMgnW099dbh1uD153ih5eU5WhluynLxekXjAOjkEdNBg8BAAAAAP3///9FWKQt8C+1y4741+beFSqWAaj9DuvzHNpxvpxS+GB8lwEAAAAA/f///6E5TAGqktI29Oso6b9kZZoAFFGGvpJQUM8VO+3LMTlmAAAAAAD9////nSDT7hrkuoQtAV1yNnbpkJsB5ifKoM2zP+CcLPfis1gBAAAAAP3///+P1rW90UXfD0gIk58h3sXxxy3ZfJJLP0H1I4Jpzy/87QEAAAAA/f///w0UKZ/s9DnPpV+FJ8h2BEI7tl+qVxSGRFRv9FYw4girAQAAAAD9////EPNsUFrEOZyfjbqbh8rfHQ4C9RQECw12n3c1yhFqkzoAAAAAAP3///8QW9LEsSmuvSnvVzy+FDktM7ewQmZnIJI/TJMahLmSzwEAAAAA/f///+4edbWRHDdRJcMeHHElgSmb+nENPsz/g/0AmAEU6hXeAAAAAAD9////T15YLGmk7HBsrL+awdcxi3db3esp8AcCTS9XGrEnfoAAAAAAAP3///8q7xInvEk7J0Ir9cpKXqU2lArUskkYLrimIE0+Yb6a2QEAAAAA/f///8hBLKyMa2zRJqwNOk7DmsDIfG7IvJtQiJ+QnkkHl6atAAAAAAD9////AAAAAAAAAAAAAAAAAAAAAAAA", - "exclusive": false + "psbt": "cHNidP8BADMCAAAAAQmU87pv4WOONFOqae6XAQBHIi5fZ4Ztyt0vn1YASZntAAAAAAD9////AAAAAAAAAA==" } }, "response": { "reservations": [ { - "txid": "0f064d4790a3038c17e9c5cb29bb6568e5949787e29dd7835b875bd7f7b47582", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "977c60f8529cbe71da1cf3eb0efda801962a15dee6d7f88ecbb52ff02da45845", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "663931cbed3b15cf505092be865114009a6564bfe928ebf436d292aa014c39a1", - "vout": 0, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "58b3e2f72c9ce03fb3cda0ca27e6019b90e97636725d012d84bae41aeed3209d", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "edfc2fcf698223f5413f4b927cd92dc7f1c5de219f9308480fdf45d1bdb5d68f", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "ab08e23056f46f5444861457aa5fb63b420476c827855fa5cf39f4ec9f29140d", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "3a936a11ca35779f760d0b0414f5020e1ddfca879bba8d9f9c39c45a506cf310", + "txid": "ed994900569f2fddca6d86675f2e2247000197ee69aa53348e63e16fbaf39409", "vout": 0, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "cf92b9841a934c3f9220676642b0b7332d3914be3c57ef29bdae29b1c4d25b10", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "de15ea14019800fd83ffcc3e0d71fa9b298125711c1ec32551371c91b5751eee", - "vout": 0, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "807e27b11a572f4d0207f029ebdd5b778b31d7c19abfac6c70eca4692c585e4f", - "vout": 0, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "d99abe613e4d20a6b82e1849b2d40a9436a55e4acaf52b42273b49bc2712ef2a", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "ada69707499e909f88509bbcc86e7cc8c09ac34e3a0dac26d16c6b8cac2c41c8", - "vout": 0, - "was_reserved": true, + "was_reserved": false, "reserved": true, - "reserved_to_block": 246 + "reserved_to_block": 226 } ] } diff --git a/doc/schemas/lightning-sendcustommsg.json b/doc/schemas/lightning-sendcustommsg.json index c02d5330cdb4..b498cdbd30d6 100644 --- a/doc/schemas/lightning-sendcustommsg.json +++ b/doc/schemas/lightning-sendcustommsg.json @@ -61,10 +61,10 @@ "examples": [ { "request": { - "id": "example:sendcustommsg#5", + "id": "example:sendcustommsg#1", "method": "sendcustommsg", "params": { - "node_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "node_id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", "msg": "77770012" } }, diff --git a/doc/schemas/lightning-sendinvoice.json b/doc/schemas/lightning-sendinvoice.json index ceb064e72dc8..1183aad6bc9a 100644 --- a/doc/schemas/lightning-sendinvoice.json +++ b/doc/schemas/lightning-sendinvoice.json @@ -206,23 +206,23 @@ "id": "example:sendinvoice#1", "method": "sendinvoice", "params": { - "invreq": "lnr1qqg804wzdsyn8g4mf2yc22k8xvjpjzstwd5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gqsykppqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4nuzqw5w7y7xqm2rushk5a5n3mcuvqel954raykd5nqa830nq9hpd4s4fcnxw266vp9d5c8f3m3w40hmm6gm8akxx3rsnr7d4usunv0x3q8q", - "label": "payme for real!" + "invreq": "lnr1qqgypua5g7rp293k00s66ayvnv26czst2d5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gps7sjqtqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e7pq947t0ks7a4yejz8w79x4zj25s3pu6zrnw2e0v2ugdescpcqsq307z4p2dlxe92fv7xd43qut0pjkg4y094hupqyhsj8dlhvmmfng6sv", + "label": "test sendinvoice" } }, "response": { - "label": "payme for real!", - "bolt12": "lni1qqg804wzdsyn8g4mf2yc22k8xvjpjzstwd5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gqsykppqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4ngycqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qmcmtl30xtt7jdakfyhzm8f0gny6f4d2ukx5gurem04z8lfd2wza5qs9pz6wp9vu7cm6n4wmmrz77y4w6z5xv4q93yudkdtkl5zmzdzuawzqqex7gd5v0x0r83pqj82udd542fl4krh50s0dkx47d0hd5wh77g52xxl75ccpkt35mc8n282wslju9ufyys2y8qqqqqqqqqqqqqqqpgqqqqqqqqqqqqp6f9jm7k9yqqqqqq2gpr96l99lfspt25zqnyfgu7hznmt2tzkjdt92d2wc3dsq7keph7w8gudjs46spfzqrlu4gqs9vppqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky9muzqpze8kk43g0wh4h8qlac5lswwesrvsaxcza2f5j90c2h3ts8yzmn9g4mxqe89fngrqny8nf52xxuxep6548etda8lp876jr0nnxgdkdq", - "payment_hash": "4c89473d714f6b52c56935655354ec45b007ad90dfce3a38d942ba8052200ffc", - "amount_msat": 2, + "label": "test sendinvoice", + "bolt12": "lni1qqgypua5g7rp293k00s66ayvnv26czst2d5k6urvv5s8getnw3gzqp3zderpzxstt8927ynqg044h0egcd8n5h3n9g0u0v4h8ncc3yg02gps7sjqtqssytfzxcs2xkdy0lml0tzy0jzugmyj8kjn8zfzrgq9fsgurc72x82e5zvqyehytxx360zptatj4pygsv9kpal8gnkeyd0tpvd6jv5rkv2uqdgcq2s27mvxt0arlnulnmce53cuz00vzaqvgvhpphxgavl89r8zrdhaxqgzpvxkkmwsmxnuwflttmnpc8vtzwlgd3cfty3xwlnlc9r2gcjesguqqv4xey4m7l4wxem27vxyxfhwznlc62kffsd5xncx9w49m4g72u2y7lcl6a3x5cpu52j6gm8q5x0q8k7myxdzrsqqqqqqqqqqqqqqq5qqqqqqqqqqqqqayjedltzjqqqqqq9yq3n2s38p5cq442pq5qpm4ht26v8statwxcrl65uy26c9hx4dvy66f9x665eqqy90tpz25qc0gfqtqggzvmj9nrga83q474e2sjygxzmq7ln5fmvjxh4skxafx2pmx9wqx5v0qsqfkcrpht0d3nnt8txkcgf5wr6gzrlacls2gyrvj5hhwuu98shurrn6ayruunju7k9yu9clvaj354tr064ruuht88q5dj73kzru20uzj", + "payment_hash": "a003badd6ad30f05f56e3607fd538456b05b9aad6135a494dad5320010af5844", + "amount_msat": 1000000, "status": "paid", "pay_index": 1, - "amount_received_msat": 2, - "paid_at": 1708640865, - "payment_preimage": "305951ab02cb2ea5eb884dbfd8fb110b4e088ecb8338b3e84e8f9c70919c19bf", - "description": "simple test", - "expires_at": 1708640953, - "created_index": 2, + "amount_received_msat": 1000000, + "paid_at": 1722303714, + "payment_preimage": "6f154ed7d108349cb6385eba5f160294ef83862c2c560ba6446b2a3da5c2b3b3", + "description": "Simple test", + "expires_at": 1722303803, + "created_index": 3, "updated_index": 1 } } diff --git a/doc/schemas/lightning-sendonion.json b/doc/schemas/lightning-sendonion.json index 28c9aacead9d..6f8d7893e19a 100644 --- a/doc/schemas/lightning-sendonion.json +++ b/doc/schemas/lightning-sendonion.json @@ -331,26 +331,26 @@ "id": "example:sendonion#1", "method": "sendonion", "params": { - "onion": "00034928294556b10308f9aeac7a240223d4d5f72097db1ef36a36b10cab937f2f205ed7218b47d4600eaf7fd390940bf9a6cdac99aafdb4783c468150eeeab9b57e56a06778d023ffb3bb84c7d8c2ad8868b61c28b566634af52c288ed6569583db66f5bd0edfb801c252f078020e1df6359af5969296b4698a71d17c5ca6e5ee4b64b7cce3ad0a1aa31e6be4d5fe3a31fa7a25259c640716020a9a248ca3ebb68eb823f8884b5df3710969f4c2ffb153779a923bab946ed43c1f6658d7f8e7e25303bb78ef4862fb550b8b1c79d522b035eedfda9ab70a61322522acf7233bb8ea2423958448fc8ac3d000835fda04bf661f1bf2ad2d091f506840bb2f10f82c0812149d99267a47824defe90877ed70db526b2200e18dccb92b17516de3778c055645728eadf4c74375aa0aae80a7773a536a908ca1e25c0fdca90e50ce0be05eeb973ec5e83ce3ab6b35818e021780428af81320a694483c1c15f64e685ba1fd3b1e1b926e6b4ec9eeeac8aca60c60e0f0f583e35e7f081dc6f4c64157e100c79c4c25101bed77cd9f93416f9a67d9f1916a782c498c38365af4a5fabb1b745fa840a054a06564c3f4b376aeb72cdd059d3794c82bbbf12a1f62234016a6912b384e7e4cebbd39ee4395aeff43c461e226d1e0151cce508a181a9c61275bf4b89e4556cf24df13b993dec96541555f8b9a699be9488568a11ac7f25849da62765472511ad74a6660c10e37f5fa13d4e4665ef7825ae1f2da4a86d5581912262de89b4b11a722fd127b31aa0d7fab8c679b07bf95e65cb80b2dacb5b90794399fb8f23823f68058431aa1c399b5baceccaf8521d004f45dba6ec1fddc54473343e9e67cd50cc3f2f3d8a5dab8a7ab9ae553dc3cd34e74b858da75975265f7c673a25e8d01a5130ab40eaba712b80c608cd0431b4b45ea0d81af595e21f24976608429127bf586f7507666500bc7245cf9266fa0bd0e58404c496e190c873cd143ace9048e9d5021c23967a24e09f2e54166e54b4ee8888dc1af535624e7ee8b426c1628175017a9e8a73eb1d0d49028a4f4d77897f3c08f1cd7bdee2b00f9bb9eadc49a69bf4f6c0cb2c95a16f03d7958f1b8f83cb40ae87ddf75f26050e2c2ed9f8f8523b3d389a50b217bda651dc21f095fe7d2d3851a0a6cf01051f3f3c6f1ad59ed46d44928d15a0e6e1bd4df4c99bdb82a05b0e781b69a73bc30fe579c8ac9fe8aeb6beb1c0f44def2775b7341af37e6ef58ceb34958b29d3e36112b78644612228761b8badc802f0b2b8fcaeb1db8f3a8db4afa2d7b4540a7c331db6f5141fa3909a513df875ff8a63f5b542d662781ca96a69e3b2925d6a63555b2c5825ffb2ad848d71122f54110e0d203000f3e9cc23b793c3540dfb8d881caedd25055a8f495e9e7a0391dbf9cbd9344f7df659ee8d3ce5ec16217ab83e1394ba991eb8ffd9a869f8ebb2e2428845e779979c57b5f8875f502728229a55ce87b3eba85c75264d30eaf7b373f6b09ba3086d9e98348d87b049468c2c30a6501cb2a3862f1703bbf29895e8b4262353eae720ed8ae678750011e2eb51f4800d3f4725fa873d7deec1c46f77a5f61c73dc938239e77f432bcc245c7b935413c51c0bc92bdaae144452aa95910909e46e500557961203f4e1483b9c09c124464907825e1ff74c87c58d6e2e91970baac9b89a554beca6df9acee16d77dd929d0caa7797e06f2c384c03fdedc89c697b9c34787a50cf399a8d7f195e79b347efc8267c474a477ce210f11049d432b280eaf3fccd451f6218d35c64cbd1006bcc54eeea8b856855c9aa92bc3adc6900a7c7a0eee09834c5a1f2da3d8ea9a478aea90c954952ad2a72d3856350ac3132d17e1e8116fa774066a22c857a827699c98285111a405e74685a3ae579ae78c545774f45491e4935bf4", + "onion": "0003ccc1f8876af4810e23bd4cccd8f2f38ee5dc117f527c783fefa4e632f857c98d588d2e3150d16b78f9458777502e4829b490e8a2d560841eb0c2368311bf9bb4e8ded0356badafd915839409ad60866c24dd7580b468c14097575565ca95425b9f44211d9ad0305ddba2391a70892ac8c9fd7c3b67d0fe22faf5a0b6905ee2e22278fe224e89ea72c3fcc598b35afaa255123e61ae7a697703e3bb8aec4d36ea487df6ec27942aadff0527d178c897e75f1ee284995196b5ead963ee9d0df798c8265c00c5c73daac917d298cc17e5d813189321d914c45ef30170c4d617dae12bb3a760d1665705e61bb6c52789e15623cefc68d96b86a6f17159c4a86bb196c9f5e40a0744d08d6da0cfd587717b6d0d074d42ac0893fa6ae1497c84824f1d27670d4e201af5e9e5a3493b603cfc209bb0ee41b573ca647c5b9882272c972cd18f19fd895e8995097d86882a473f4d26118a7ed656c5ea04c2a183b05cc0191d07fab5e78edab4ab8ec58e05e03f32d150449c0c8e3505e46ae58e77c87616144873f72f4571b00ccf8e71bcdf33a7d32345aecb660970fa73c4844ab157aa322f140f5d47b66a0590273728ddb5b8a7f3577cff5a268935b93fe598d6df4413c67c45efa9461abaf3294070a484418aa28c03ac20d08856eb0c74dfca851e8ed110bdcacb2a2fb90954b04e99986fde0678846a709120b5d1eeab9cde8d9f27d77448f4591e00bf30d7580703e6c189c658746cf7a7cc1430ce41f84244612b438c3d895333848e5f55e99b2a9d28860863c11aaa8e3ef01ead7ba1545156c356424c33aeeaa2f1e2c290d1d8dd52cd7b8116159025aba26db6fb81ad7f9cc4554c6f9f13d16defe38918b32d62a0516521934a0009a8d37c9a84689bfd8fc1f0beceb92701dca11175e0099d7541698956ba5d93efff996f538ee47717ae6c5cda98111bc28c822e99cf8957b707de270f447b6e52d30bcf9b8a9befd8663bc54612b543d0e167da67e2f295207b70857d0a7cae8932d905db2f48c873dec20aeafa07e15fa98a088e529424c8b404f03ba0ee78a6639fde5cd37dee42877ff6489ce1de5a8992cae25dd20a6521955c19129fdcc0ea157913373bf47a8018a1dd825a2f8e26194d5008161360ae9b25fc701b2accbe88eb47eee6a50b7ee6d6e169e3905e03ca72e00eb6a51b7ed3d27501715428368662b822e2262749d3e7d3243c4fd3d825b3e72bebdeebf6e035f1ad6634523ab5dc0335611c19c9936d006f2e4cd8818eb4f8b4857c8f35d18a4891e35ff91e3b54b384398574d673fcc8da50b22b8f485a41223c97e3b8ee5b8e5ff9c00a2cbfe7360509d3fee9248b5eaa81bb83da3be45dfa8cbbbf5c52ba8749c9d6261d4239feea1e7ce85ad40ad0c66bbeb1c6898626ae4e710a66f9c39a5ee94581353b46e070cfcff9a14e3f9a6108d55bb92852eb3a50e89b1e45d31b760f2a4e263a6a876ad638b123ffee7a2b0b48e16175e3eb92bfaad4dbe0af8b2bc1c15fec5a9d92d3970c2ffab2ab8fa2c9de0bd276680a4284707cd8543a97bca2394e9514236129f1c50a932f7e9bfb98c2aaa6ffc9a4a30641061246de6edf0f711a8d25d59af42ee4445b22ce2f832f3ece52c18ca62d90c590729e04c47accaec95b556ee2541c84843c54a116f5cc45bc251a8023b695f0bf79c43a97bece8a761d387a466821984fb5ec438af20d14cebb7f0026988c81b5a1b895ef94df61aa509e53083b4306c42132b5ce302fd5a2fbb1cee30a7078ccaa3bdccf781b8c9d6ae016a5f8e5cb13f7ac1f3fd0d74a182c9abea67d346f0dfcfc211aaa7ff47196465398fce3e6e0f3b73a944a7f57a90cc6a8f1bfcd385f8312e23af6f508f4f8a976d750660ac3d63630555a3a2e7fe158a982aaf0278d9f8819e5cb", "first_hop": { "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "channel": "103x3x0", + "channel": "109x1x1", "direction": 1, "amount_msat": 1002, "delay": 21, "style": "tlv" }, - "payment_hash": "f584c14bb23506acdd94cf3cea377f3cc5805f3cba5430bc3756ef83ede1a0dc" + "payment_hash": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13" } }, "response": { "message": "Monitor status with listpays or waitsendpay", - "created_index": 1, - "id": 1, - "payment_hash": "f584c14bb23506acdd94cf3cea377f3cc5805f3cba5430bc3756ef83ede1a0dc", + "created_index": 8, + "id": 8, + "payment_hash": "e445ebcf339db3cba6184330ccc6e4a41e0bb38d237b93c1d2f71958d5a74e13", "groupid": 1, "amount_sent_msat": 1002, - "created_at": 1706315098, + "created_at": 1722303689, "status": "pending" } } diff --git a/doc/schemas/lightning-sendpay.json b/doc/schemas/lightning-sendpay.json index 2eac27c48031..5ae13007e99c 100644 --- a/doc/schemas/lightning-sendpay.json +++ b/doc/schemas/lightning-sendpay.json @@ -358,76 +358,36 @@ "params": { "route": [ { - "amount_msat": 11000000, "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "delay": 5, - "channel": "103x1x0" - } - ], - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk", - "payment_secret": "82644944d3f70d42aad1d5f7b5d7a629e7afa30b529cc952a4c59fc0e3790ea2" - } - }, - "response": { - "message": "Monitor status with listpays or waitsendpay", - "created_index": 1, - "id": 1, - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", - "groupid": 1, - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 11000000, - "amount_sent_msat": 11000000, - "created_at": 1706152930, - "status": "pending", - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk" - } - }, - { - "request": { - "id": "example:sendpay#2", - "method": "sendpay", - "params": { - "route": [ - { - "id": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "channel": "103x1x0", + "channel": "109x1x1", "direction": 1, - "amount_msat": 4211, - "style": "tlv", - "delay": 24 + "amount_msat": 10001, + "delay": 15, + "style": "tlv" }, { "id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", - "channel": "105x1x0", + "channel": "111x1x0", "direction": 0, - "amount_msat": 3710, - "style": "tlv", - "delay": 16 - }, - { - "id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "channel": "107x1x0", - "direction": 1, - "amount_msat": 3210, - "style": "tlv", - "delay": 8 + "amount_msat": 10000, + "delay": 9, + "style": "tlv" } ], - "payment_hash": "bc747053329402620a26bdc187cd134cdb699130d85be499ecd24160aff04c5c", - "payment_secret": "c36a2fe9aced78c06960e2f21b369ed03f0492c97e53ba3b662163bcdaf1d7fa" + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", + "payment_secret": "64733783b118ff27576f72c473c0c52814f1f47c4de41492194ddd7855486024" } }, "response": { "message": "Monitor status with listpays or waitsendpay", "created_index": 2, "id": 2, - "payment_hash": "bc747053329402620a26bdc187cd134cdb699130d85be499ecd24160aff04c5c", + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", "groupid": 1, - "destination": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "amount_msat": 3210, - "amount_sent_msat": 4211, - "created_at": 1708624260, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303675, "status": "pending" } } diff --git a/doc/schemas/lightning-sendpsbt.json b/doc/schemas/lightning-sendpsbt.json index b079dcf22f12..e5fea02ba611 100644 --- a/doc/schemas/lightning-sendpsbt.json +++ b/doc/schemas/lightning-sendpsbt.json @@ -70,25 +70,12 @@ "id": "example:sendpsbt#1", "method": "sendpsbt", "params": { - "psbt": "some_psbt" + "psbt": "cHNidP8BAHsCAAAAApYPhUDCjBy/IhQro1NgHyHktDtz752euhXVr901aH1zAAAAAAD9////pVexPrCyRyESCD3U1cC5oifK1QBxTxBSKMaWE8H/R3UAAAAAAP3///8Buuz6CwAAAAAWABTJCW1D9AjqUmAgJizNrXyFFrkqgQAAAAAAAQCJAgAAAAGdA6aKwu4U7Zes8OwDJHp4bI3maidtrjOK6N85klZucAAAAAAA/f///wKBbNwLAAAAACJRIDXxGE9rRwyd80faYsSyjn7J7hCyILrDrM0iIJ3vADbqQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzWwAAAABASuBbNwLAAAAACJRIDXxGE9rRwyd80faYsSyjn7J7hCyILrDrM0iIJ3vADbqARNAslo/GrzGxD6jx0S7hhxvKR8Eus+sP130lZLzFdEP0jIHUZnjDgbwVW/xgkL6M6xdWTIft2LwO6Jg/VxrnLUVniEWn8HNAfLSdwuCgeK6vBpMJF7dN7ty0S4gcjpp309fAfYJAMEg7UIAAAAAAAEAcQIAAAAB5PVQktBZBw4nvG06jM4bpxNyROmXxJnOR8qYKNgjGfwAAAAAAP3///8CgIQeAAAAAAAWABSftnv87+5st9tMflXZxr/XSeMdHoxyG+0AAAAAFgAUQudNVnkeDGRH67h8YS0ySo/R6flrAAAAAQEfgIQeAAAAAAAWABSftnv87+5st9tMflXZxr/XSeMdHiICAyjMj8l44gnxaV+ltWVQYdsaqyMRtSQXaUW/EBXvLUuJRzBEAiA9G0zR8z6JjbBAeg4wDezU0rLQB462lpdGQJwqrUxQFwIgL70Z0p7ASr4w+lDjPk0+m6WY5PafSiEiEO4tFuoHsHMBIgYDKMyPyXjiCfFpX6W1ZVBh2xqrIxG1JBdpRb8QFe8tS4kIn7Z7/AAAAAAAAA==" } }, "response": { - "txid": "05985072bbe20747325e69a159fe08176cc1bbc96d25e8848edad2dddc1165d0", - "tx": "02000000027032912651fc25a3e0893acd5f9640598707e2dfef92143bb5a4020e335442800100000017160014a5f48b9aa3cb8ca6cc1040c11e386745bb4dc932ffffffffd229a4b4f78638ebcac10a68b0561585a5d6e4d3b769ad0a909e9b9afaeae24e00000000171600145c83da9b685f9142016c6f5eb5f98a45cfa6f686ffffffff01915a01000000000017a9143a4dfd59e781f9c3018e7d0a9b7a26d58f8d22bf8700000000" - } - }, - { - "request": { - "id": "example:sendpsbt#2", - "method": "sendpsbt", - "params": { - "psbt": "cHNidP8BAM0CAAAABEV+dnFRINmyeHxi4Id0OrcuzI5au5/BlPtTfu7E2m3EAAAAAAD9////cv8oioDx+0NCEnjBSYtnwF0H4VR13j+bkyb5gOOQLUUBAAAAAP3///8ehOrKm7JEq6zflkp9+zmSwE1iPe1yh3KTXvk+om/legEAAAAA/f///2s31wNrI1UavMgjC1GyrOHNbxOm68KYa13WX/mGfmjcAQAAAAD9////AcEAPQAAAAAAFgAUyQltQ/QI6lJgICYsza18hRa5KoEAAAAAAAEAcQIAAAABTzfqjIqV1wPpqc/3/Cb+tMX5EDrLmnhb5BMNx3aB/hYAAAAAAP3///8CQEIPAAAAAAAWABR9CNmX36nN45+GhjqvD4LjLMMMg/+juSkBAAAAFgAUJB0adsMdjkacZWrLwyteqfOaTrRlAAAAAQEfQEIPAAAAAAAWABR9CNmX36nN45+GhjqvD4LjLMMMgyICA1p5u7tAbUvCjfBfpqhzKM+wKn4TdDvs3NHfz+BxwuAQRzBEAiBwFb9rA0nUVlIPGd2aaiRbJ+KH4MLM3Bu+f0JuXB/hwAIgT2rrIUG9gXBZoH9fcPjCnbbM1SR4GiLYGLeALB8yENoBIgYDWnm7u0BtS8KN8F+mqHMoz7AqfhN0O+zc0d/P4HHC4BAIfQjZlwAAAAAAAQBxAgAAAAGANpEFI+CgfALTim/MWsAa62g+EmFWrFrzBDBCmCB3MgAAAAAA/f///wKZKdgpAQAAABYAFB+xhfU1pgl9WIvDKzAHZp8UeNkzQEIPAAAAAAAWABQHHEnK0vQg88gF+fa5ilcmnLFBUGUAAAABAR9AQg8AAAAAABYAFAccScrS9CDzyAX59rmKVyacsUFQIgICXTcoCCnxhsuZXNzL8jirRWQBOTlzUTljJKNldd803f9HMEQCIDtx/kEoc4PHDDm4eX5SEOmuRGu7ShpEG7xKBbuD/NjiAiBYkIKod39dcBarCT7Dbchkuwx70tJhOxQSJi2EMioGrwEiBgJdNygIKfGGy5lc3MvyOKtFZAE5OXNROWMko2V13zTd/wgHHEnKAAAAAAABAHECAAAAAVHU7RCZylzRMdlMBJ2ba4XKxv0l7LdWVnPYS6mhkf60AAAAAAD9////Av5VbSkBAAAAFgAU0BhRKzRbIC6H+s6j86d6cMpTNNhAQg8AAAAAABYAFD1D0ia8wnAZreUtej3FKnrBvii4ZQAAAAEBH0BCDwAAAAAAFgAUPUPSJrzCcBmt5S16PcUqesG+KLgiAgKKWZFo08l968cbxm5icOzwVPMA2Igwm6BUcaSCF13ZMEcwRAIgNAeIVGvUj9MWM18am0dx3JtEf79iQMX7Rqz1tttes3ICIAtNCglUlvpSidAxc/xoiy9cA13bgimJx25G+eZXfYJeASIGAopZkWjTyX3rxxvGbmJw7PBU8wDYiDCboFRxpIIXXdkwCD1D0iYAAAAAAAEAcQIAAAABRX52cVEg2bJ4fGLgh3Q6ty7Mjlq7n8GU+1N+7sTabcQBAAAAAP3///8CMmGqKQEAAAAWABSxLq0p9YAKl+hX7pFc0K/X+PIWmUBCDwAAAAAAFgAUZhwjt5DdNJE3OvCx2L7Qh31c3iJlAAAAAQEfQEIPAAAAAAAWABRmHCO3kN00kTc68LHYvtCHfVzeIiICA/qclQheQrHlADzR9BgXjDDJbkrneVTKD8SMWIJv9OsORzBEAiBKABqNV7cF5DKhtd+m+ZEmWF21vBt2uBKnzeDuUFqvDwIgJc6+/6GQqIfz869kJpUFTAMYTeL2qWR6d28EQEOJgkMBIgYD+pyVCF5CseUAPNH0GBeMMMluSud5VMoPxIxYgm/06w4IZhwjtwAAAAAAAA==" - } - }, - "response": { - "tx": "02000000000104457e76715120d9b2787c62e087743ab72ecc8e5abb9fc194fb537eeec4da6dc40000000000fdffffff72ff288a80f1fb43421278c1498b67c05d07e15475de3f9b9326f980e3902d450100000000fdffffff1e84eaca9bb244abacdf964a7dfb3992c04d623ded728772935ef93ea26fe57a0100000000fdffffff6b37d7036b23551abcc8230b51b2ace1cd6f13a6ebc2986b5dd65ff9867e68dc0100000000fdffffff01c1003d0000000000160014c9096d43f408ea526020262ccdad7c8516b92a810247304402207015bf6b0349d456520f19dd9a6a245b27e287e0c2ccdc1bbe7f426e5c1fe1c002204f6aeb2141bd817059a07f5f70f8c29db6ccd524781a22d818b7802c1f3210da0121035a79bbbb406d4bc28df05fa6a87328cfb02a7e13743becdcd1dfcfe071c2e0100247304402203b71fe41287383c70c39b8797e5210e9ae446bbb4a1a441bbc4a05bb83fcd8e20220589082a8777f5d7016ab093ec36dc864bb0c7bd2d2613b1412262d84322a06af0121025d37280829f186cb995cdccbf238ab45640139397351396324a36575df34ddff024730440220340788546bd48fd316335f1a9b4771dc9b447fbf6240c5fb46acf5b6db5eb37202200b4d0a095496fa5289d03173fc688b2f5c035ddb822989c76e46f9e6577d825e0121028a599168d3c97debc71bc66e6270ecf054f300d888309ba05471a482175dd9300247304402204a001a8d57b705e432a1b5dfa6f99126585db5bc1b76b812a7cde0ee505aaf0f022025cebeffa190a887f3f3af642695054c03184de2f6a9647a776f044043898243012103fa9c95085e42b1e5003cd1f418178c30c96e4ae77954ca0fc48c58826ff4eb0e00000000", - "txid": "43bb1c1bce6763ffe4d5df6b49f152f907f36f7849e55bb56075e2b256d17502" + "tx": "02000000000102960f8540c28c1cbf22142ba353601f21e4b43b73ef9d9eba15d5afdd35687d730000000000fdffffffa557b13eb0b2472112083dd4d5c0b9a227cad500714f105228c69613c1ff47750000000000fdffffff01baecfa0b00000000160014c9096d43f408ea526020262ccdad7c8516b92a810140b25a3f1abcc6c43ea3c744bb861c6f291f04bacfac3f5df49592f315d10fd232075199e30e06f0556ff18242fa33ac5d59321fb762f03ba260fd5c6b9cb5159e0247304402203d1b4cd1f33e898db0407a0e300decd4d2b2d0078eb6969746409c2aad4c501702202fbd19d29ec04abe30fa50e33e4d3e9ba598e4f69f4a212210ee2d16ea07b07301210328cc8fc978e209f1695fa5b5655061db1aab2311b524176945bf1015ef2d4b8900000000", + "txid": "8861058bff4b5310d587d7a8b6936886a290b0bdaf2485b53c79972a32daa758" } } ] diff --git a/doc/schemas/lightning-setchannel.json b/doc/schemas/lightning-setchannel.json index a50925c218aa..8f0f9948901e 100644 --- a/doc/schemas/lightning-setchannel.json +++ b/doc/schemas/lightning-setchannel.json @@ -175,16 +175,16 @@ "id": "example:setchannel#1", "method": "setchannel", "params": { - "id": "103x1x0", + "id": "123x1x1", "ignorefeelimits": true } }, "response": { "channels": [ { - "peer_id": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", - "channel_id": "90210d39d12a65d239ece267c5f48e0a82e7cb95724e658f6d99f370064faad1", - "short_channel_id": "103x1x0", + "peer_id": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "channel_id": "ecabe6d86abdd57565b3fb7e7c5d724e60ca1a07633951769b5dbfa48dc884b3", + "short_channel_id": "123x1x1", "fee_base_msat": 1, "fee_proportional_millionths": 10, "minimum_htlc_out_msat": 0, @@ -199,7 +199,7 @@ "id": "example:setchannel#2", "method": "setchannel", "params": { - "id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + "id": "115x1x0", "feebase": 4000, "feeppm": 300, "enforcedelay": 0 @@ -208,9 +208,9 @@ "response": { "channels": [ { - "peer_id": "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", - "channel_id": "9c54c71bbbe59591cc3162e14fc4ff58c146f085c07d0f206ea679a8231d03ab", - "short_channel_id": "103x3x0", + "peer_id": "032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e", + "channel_id": "f8fc83a432cbfb2fffe222cc06727fdd977b5dd10ebd6707158e799e6f522d9f", + "short_channel_id": "115x1x0", "fee_base_msat": 4000, "fee_proportional_millionths": 300, "minimum_htlc_out_msat": 0, diff --git a/doc/schemas/lightning-setconfig.json b/doc/schemas/lightning-setconfig.json index 4e767bd33a07..5955f235c074 100644 --- a/doc/schemas/lightning-setconfig.json +++ b/doc/schemas/lightning-setconfig.json @@ -140,16 +140,16 @@ "id": "example:setconfig#1", "method": "setconfig", "params": [ - "autoclean-paidinvoices-age", - 1 + "autoclean-expiredinvoices-age", + 300 ] }, "response": { "config": { - "config": "autoclean-paidinvoices-age", - "value_int": 1, - "source": "/tmp/ltests-7u_8_rtu/test_autoclean_1/lightning-3/regtest/config:6", - "plugin": "~/lightning/plugins/autoclean", + "config": "autoclean-expiredinvoices-age", + "value_int": 300, + "source": "/tmp/.lightning/regtest/config:2", + "plugin": "/root/lightning/plugins/autoclean", "dynamic": true } } @@ -158,25 +158,6 @@ "request": { "id": "example:setconfig#2", "method": "setconfig", - "params": [ - "test-dynamic-config", - "changed" - ] - }, - "response": { - "config": { - "config": "test-dynamic-config", - "value_str": "changed", - "source": "/tmp/ltests-7u_8_rtu/test_dynamic_option_python_plugin_1/lightning-1/regtest/config:2", - "plugin": "~/lightning/tests/plugins/dynamic_option.py", - "dynamic": true - } - } - }, - { - "request": { - "id": "example:setconfig#3", - "method": "setconfig", "params": { "config": "min-capacity-sat", "val": 500000 @@ -186,7 +167,7 @@ "config": { "config": "min-capacity-sat", "value_int": 500000, - "source": "/tmp/ltests-nvfdbou2/test_setconfig_1/lightning-2/regtest/config:2", + "source": "/tmp/.lightning/regtest/config:4", "dynamic": true } } diff --git a/doc/schemas/lightning-setpsbtversion.json b/doc/schemas/lightning-setpsbtversion.json index 6d3cb8683d76..870fa0c1f7a0 100644 --- a/doc/schemas/lightning-setpsbtversion.json +++ b/doc/schemas/lightning-setpsbtversion.json @@ -62,12 +62,12 @@ "id": "example:setpsbtversion#1", "method": "setpsbtversion", "params": { - "psbt": "cHNidP8BAAoCAAAAAAAAAAAAAA==", - "version": "2" + "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAA==", + "version": 0 } }, "response": { - "psbt": "cHNidP8BAgQCAAAAAQQBAAEFAQABBgEDAfsEAgAAAAA=" + "psbt": "cHNidP8BADUCAAAAAAFAQg8AAAAAACJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbbwAAAAAA" } }, { @@ -75,12 +75,12 @@ "id": "example:setpsbtversion#2", "method": "setpsbtversion", "params": [ - "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIJd6ICNAQALFOMhoUHuSVSuzcaUdkDKlk4K+A+DR9+4uAA==", - 0 + "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEDAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQABAwjV3DIAAAAAAAEEIlEgoqAceWUonu5Wtc/N25hWxw+kdsJk0h9xHGppr3dq5AMA", + 2 ] }, "response": { - "psbt": "cHNidP8BADUCAAAAAAFAQg8AAAAAACJRIJd6ICNAQALFOMhoUHuSVSuzcaUdkDKlk4K+A+DR9+4ubwAAAAAA" + "psbt": "cHNidP8BAgQCAAAAAQMEbwAAAAEEAQABBQEDAQYBAwH7BAIAAAAAAQMIQEIPAAAAAAABBCJRIO7yw3zIUblRUcdhCLSjdFxJsYHu2s0Y29bT0bGAGdcbAAEDCNXcMgAAAAAAAQQiUSA2cYCeVGcxdSZII2urHpalr5osmF2lPbYRaw1nKyPcmQABAwjV3DIAAAAAAAEEIlEgoqAceWUonu5Wtc/N25hWxw+kdsJk0h9xHGppr3dq5AMA" } } ] diff --git a/doc/schemas/lightning-showrunes.json b/doc/schemas/lightning-showrunes.json index ae7e8803140e..e20bdef77085 100644 --- a/doc/schemas/lightning-showrunes.json +++ b/doc/schemas/lightning-showrunes.json @@ -169,70 +169,210 @@ "request": { "id": "example:showrunes#1", "method": "showrunes", + "params": { + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==" + } + }, + "response": { + "runes": [ + { + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", + "last_used": 1722303715.068215, + "unique_id": "0", + "restrictions": [], + "restrictions_as_english": "" + } + ] + } + }, + { + "request": { + "id": "example:showrunes#2", + "method": "showrunes", "params": {} }, "response": { "runes": [ { - "rune": "OSqc7ixY6F-gjcigBfxtzKUI54uzgFSA6YfBQoWGDV89MA==", + "rune": "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA==", + "last_used": 1722303715.068215, "unique_id": "0", "restrictions": [], "restrictions_as_english": "" }, { - "rune": "geZmO6U7yqpHn-moaX93FVMVWrDRfSNY4AXx9ypLcqg9MQ==", + "rune": "RXgu0DD_i0wSPEZkIDyZIWL0bSAGdhvJ_GHOQdTg04A9MSZpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1NyZtZXRob2Q9bGlzdHBlZXJz", + "last_used": 1722303714.9302285, "unique_id": "1", - "restrictions": [], - "restrictions_as_english": "" + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "id", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "id starts with 0266e4598d1d3c415f57" + } + ], + "english": "id starts with 0266e4598d1d3c415f57" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + } + ], + "restrictions_as_english": "id starts with 0266e4598d1d3c415f57 AND method equal to listpeers" }, { - "rune": "Bl0V_vkVkGr4h356JbCMCcoDyyKE8djkoQ2156iPB509MCZwZXI9MTAwMDAwMDAwMG5zZWM=", + "rune": "QUJEYMLGgiaJvMDv_MhR2hiMKIBTbq-PrL-KxcIlirQ9MiZtZXRob2Q9cGF5JnBuYW1lYW1vdW50bXNhdDwxMDAwMA==", + "last_used": 1722303715.1267006, "unique_id": "2", "restrictions": [ { "alternatives": [ { - "fieldname": "per", - "value": "1000000000nsec", + "fieldname": "method", + "value": "pay", "condition": "=", - "english": "per equal to 1000000000nsec" + "english": "method equal to pay" } ], - "english": "per equal to 1000000000nsec" + "english": "method equal to pay" + }, + { + "alternatives": [ + { + "fieldname": "pnameamountmsat", + "value": "10000", + "condition": "<", + "english": "pnameamountmsat < 10000" + } + ], + "english": "pnameamountmsat < 10000" } ], - "restrictions_as_english": "per equal to 1000000000nsec" - } - ] - } - }, - { - "request": { - "id": "example:showrunes#2", - "method": "showrunes", - "params": { - "rune": "Bl0V_vkVkGr4h356JbCMCcoDyyKE8djkoQ2156iPB509MCZwZXI9MTAwMDAwMDAwMG5zZWM=" - } - }, - "response": { - "runes": [ + "restrictions_as_english": "method equal to pay AND pnameamountmsat < 10000" + }, { - "rune": "Bl0V_vkVkGr4h356JbCMCcoDyyKE8djkoQ2156iPB509MCZwZXI9MTAwMDAwMDAwMG5zZWM=", - "unique_id": "2", + "rune": "jEx3l0c7NMZPSDYT7xnXXvNA83z5PDNBHRQTIk1BwNw9MyZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTh8cGFycjA9MDI2NmU0NTk4ZDFkM2M0MTVmNTcyYTg0ODg4MzBiNjBmN2U3NDRlZDkyMzVlYjBiMWJhOTMyODNiMzE1YzAzNTE4", + "unique_id": "3", + "restrictions": [ + { + "alternatives": [ + { + "fieldname": "id", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", + "condition": "=", + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + }, + { + "alternatives": [ + { + "fieldname": "pnum", + "value": "1", + "condition": "=", + "english": "pnum equal to 1" + } + ], + "english": "pnum equal to 1" + }, + { + "alternatives": [ + { + "fieldname": "pnameid", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, + { + "fieldname": "parr0", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "english": "pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 OR parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "restrictions_as_english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 AND method equal to listpeers AND pnum equal to 1 AND pnameid equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 OR parr0 equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, + { + "rune": "8_CRIJ4arWAz72A4ILOZ46MESSJtQQQ9iQZjU28qulA9NCZpZD0wMjY2ZTQ1OThkMWQzYzQxNWY1NzJhODQ4ODgzMGI2MGY3ZTc0NGVkOTIzNWViMGIxYmE5MzI4M2IzMTVjMDM1MTgmbWV0aG9kPWxpc3RwZWVycyZwbnVtPTEmcG5hbWVpZF4wMjY2ZTQ1OThkMWQzYzQxNWY1N3xwYXJyMF4wMjY2ZTQ1OThkMWQzYzQxNWY1Nw==", + "unique_id": "4", "restrictions": [ { "alternatives": [ { - "fieldname": "per", - "value": "1000000000nsec", + "fieldname": "id", + "value": "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + "condition": "=", + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + } + ], + "english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" + }, + { + "alternatives": [ + { + "fieldname": "method", + "value": "listpeers", "condition": "=", - "english": "per equal to 1000000000nsec" + "english": "method equal to listpeers" + } + ], + "english": "method equal to listpeers" + }, + { + "alternatives": [ + { + "fieldname": "pnum", + "value": "1", + "condition": "=", + "english": "pnum equal to 1" + } + ], + "english": "pnum equal to 1" + }, + { + "alternatives": [ + { + "fieldname": "pnameid", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "pnameid starts with 0266e4598d1d3c415f57" + }, + { + "fieldname": "parr0", + "value": "0266e4598d1d3c415f57", + "condition": "^", + "english": "parr0 starts with 0266e4598d1d3c415f57" } ], - "english": "per equal to 1000000000nsec" + "english": "pnameid starts with 0266e4598d1d3c415f57 OR parr0 starts with 0266e4598d1d3c415f57" } ], - "restrictions_as_english": "per equal to 1000000000nsec" + "restrictions_as_english": "id equal to 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 AND method equal to listpeers AND pnum equal to 1 AND pnameid starts with 0266e4598d1d3c415f57 OR parr0 starts with 0266e4598d1d3c415f57" } ] } diff --git a/doc/schemas/lightning-signinvoice.json b/doc/schemas/lightning-signinvoice.json index 6c43834a3f91..437a20715aa6 100644 --- a/doc/schemas/lightning-signinvoice.json +++ b/doc/schemas/lightning-signinvoice.json @@ -59,12 +59,24 @@ "request": { "id": "example:signinvoice#1", "method": "signinvoice", + "params": { + "invstring": "lnbcrt10n1pn2s38psp5qnpucxgdnkrqur47x6vtxdk7xpzy3lf47kjqehm6wnuadj9rt86qpp5qg2ltzlhu2yn08f99t9zz6fjzhfmajg8h4eum43zg3gr0gdeamcsdqlv3jhxcmjd9c8g6t0dcsxjmnktakrzvsxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqg2kj0ma6weclle29pwpsdvnwa4r4yhw38wvly80mtysjf463r5y428k23dkp8ty0fugtzyjpcjsy0w7hhfmyzkwrlve93cr8jnm5sdgqzv7m0x" + } + }, + "response": { + "bolt11": "lnbcrt10n1pn2s38psp5qnpucxgdnkrqur47x6vtxdk7xpzy3lf47kjqehm6wnuadj9rt86qpp5qg2ltzlhu2yn08f99t9zz6fjzhfmajg8h4eum43zg3gr0gdeamcsdqlv3jhxcmjd9c8g6t0dcsxjmnktakrzvsxqyjw5qcqp9rzjqgkjyd3q5dv6gllh77kygly9c3kfy0d9xwyjyxsq2nq3c83u5vw4jqqqd5qqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqq757xfxhd6hpctdfsq6vr2pltjvdv06t0z200hk0qslcydpf0pthmnzhu404w4qv89d25zv3smtsnyvqsaw6tf6tcl0lles6n29qh9gpyd3ml0" + } + }, + { + "request": { + "id": "example:signinvoice#2", + "method": "signinvoice", "params": [ - "lnbcrt10n1pjmxt3lsp5jumuz2sv3ca68kzd92hp3wdtpx8ghnxur65fs6maw6dyxsleqd0spp5nadvvh7uzk2qzh8d9d7tsxr08l9uaz2vjeuuahqtufjv52d0eassdq8d9h8vvgxqyjw5qcqp99qxpqysgq4rrn702eum6c9ld9khlz39vdyd8zcwrav5ygqvu6w54aep6yarkyfrnk990yf5prpasgzmj52stektf6mzwdl5hc6qlsglt2a0pwp0spwww44w" + "lnbcrt1250n1pn2s38psp5u22hlvy5mk7keq57m4fatz7aqnmh4whcuk45npdexrw4m5athcvqpp5ps4h5lt8waz5pprvad3skzssnksl2wxng985rcsuedp8teh29rkqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydscqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqyljtru0gcvqh7k5l9u8ulcuxw8fwa9qycyd32hl7wwdpjtlefgrpyjch6aprcdah2pthx3pku3y7c6dzluzjjy9c32cs3m5hqq6ww3sp0j4tr8" ] }, "response": { - "bolt11": "lnbcrt10n1pjmxt3lsp5jumuz2sv3ca68kzd92hp3wdtpx8ghnxur65fs6maw6dyxsleqd0spp5nadvvh7uzk2qzh8d9d7tsxr08l9uaz2vjeuuahqtufjv52d0eassdq8d9h8vvgxqyjw5qcqp99qxpqysgq3nhrd72qe7wmc2hvwhaqnx05y6dzxh2tal02kw055er7uutkkrcreccm37ce6wv7ee8q70ktlr9fy3fd635hc2k98a4svd9c8v4cpjsppm2eee" + "bolt11": "lnbcrt1250n1pn2s38psp5u22hlvy5mk7keq57m4fatz7aqnmh4whcuk45npdexrw4m5athcvqpp5ps4h5lt8waz5pprvad3skzssnksl2wxng985rcsuedp8teh29rkqdqlv3jhxcmjd9c8g6t0dcsxjmnktakrydscqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgq303kchnu5dvmrjam0m2yapk4d8vyx2uud3z0cpwsxern0d6f5sxqcg4rf05qczp5ncrpq4e6fsth28fxegv5gx9y7kt9f6tfhgw9dfqqckwpfv" } } ] diff --git a/doc/schemas/lightning-signmessage.json b/doc/schemas/lightning-signmessage.json index 80a1ae84abaa..f08af9ddc717 100644 --- a/doc/schemas/lightning-signmessage.json +++ b/doc/schemas/lightning-signmessage.json @@ -72,9 +72,9 @@ } }, "response": { - "signature": "a2ec227012795f9d6b80a3f5ea98374c6d2886917517c05336799923fcf37caf08344c0431275e1a8189da01b444ae978007fe70f0cc9009f38cabe074ade87d", + "signature": "9ea05929890e40489edbd5fe0552d22bcffe00bbd29da4fcf93ed5d8f1973e421509071a64935231a126637e3615225ddda86d2d0926ae537d9c3be149f9b21f", "recid": "00", - "zbase": "d6tqaeuonjhi98mmont9m4wag7gg4krg1f4txonug3h31e9h6p6k6nbwjondnj46dkyausobstnk7fhyy998bhgc1yr98dfmhb4k54d7" + "zbase": "d6xkysjjtr8ry1r65xk9hbk14eih99oyzxjj5j8h9r9pms8t1h9rrfejyhpgjr41ggo1ca56gak1rzq7ibs14njgi3jz58b5hfr9uco9" } }, { @@ -86,9 +86,9 @@ } }, "response": { - "signature": "85843b010bc517b32eaafe70232e2c44bb5a354c74d2202390af1b272e4c6ac23ac3f97ea663d8b49116ad6c2d080515b43bcdf1ea4f38cdb18af0edf8209cd8", + "signature": "8149401781108c1c2fda12d91969bfe2306afe06c387394d47a83a85a14702a16b6fcd0060693da436ff1c2b25cc470d7db68fe45d833733d8dca660a3f4d67d", "recid": "00", - "zbase": "d6naeqabbxntxc3qim98ye3qftnmsstijt4prebd1nztsj3qjticrqsd9f9kca6as1etpmmcfwrykfpw8xg9d41x8dg5dnzo7zhnb8ga" + "zbase": "d6yw1oyzoreea8bx5ejp1gmjz9tdy4z6y5baqqkpe6wdibpbehbkn45x3wygy4j7wo5x68bmrzgrqdm7s486ezcdgh37tzfgcnt9jiu7" } } ] diff --git a/doc/schemas/lightning-signpsbt.json b/doc/schemas/lightning-signpsbt.json index 280cf75fad65..3caf71967c35 100644 --- a/doc/schemas/lightning-signpsbt.json +++ b/doc/schemas/lightning-signpsbt.json @@ -68,26 +68,23 @@ "id": "example:signpsbt#1", "method": "signpsbt", "params": { - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAAAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCCvyYqqdIt0mAAEA9gIAAAAAAQGLpTM0gWEqICjgcZNyoPhzdB5fNZBrEFbsNpsKHrTd9wEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIBZa5i8jVPdfV4pbIzSebMb5RN+l5lJkQKAw9+ivAWfnAiBNhehz79143DbFOoTjmPYVErlY0FLlVqojX9wat0aKXgEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPGAAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oBDiBWd3IcNaQkoj1tzHyQkDblBa5oZQ4J1ZcztLfnMAOk3AEPBAEAAAABEAT9////DPwJbGlnaHRuaW5nAQg5j4QWOQoUFAABAwhOfA0AAAAAAAEEIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4M/AlsaWdodG5pbmcBCMbeD+3qn9/kAAEDCODIEAAAAAAAAQQiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQz8CWxpZ2h0bmluZwEI4upB+mjl6AIA" + "psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIQCsNB0i02NIAAQMIQVncCwAAAAABBCJRIDvhN+WjzUt2EEWojAco0yQ1GDbwTtWd/aN5uNhGRlK3DPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==" } }, "response": { - "signed_psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAAAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCCvyYqqdIt0mAAEA9gIAAAAAAQGLpTM0gWEqICjgcZNyoPhzdB5fNZBrEFbsNpsKHrTd9wEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIBZa5i8jVPdfV4pbIzSebMb5RN+l5lJkQKAw9+ivAWfnAiBNhehz79143DbFOoTjmPYVErlY0FLlVqojX9wat0aKXgEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPGAAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oBDiBWd3IcNaQkoj1tzHyQkDblBa5oZQ4J1ZcztLfnMAOk3AEPBAEAAAABEAT9////ARNACI9TcWG+6uC9ElBFN3qhND7amsor/dtBhJ5ujEQAT/80548avrt7d7IJiOAaCNzzYLSXITdL2xjx6mhbBi9hTiEWkUUygSpECk12bHHNORk2lKNArhHgEuW6Gtnvum52ylMJAMLMqxcAAAAADPwJbGlnaHRuaW5nAQg5j4QWOQoUFAABAwhOfA0AAAAAAAEEIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4hB7nAxoROEqUxyWjlXFUHjsFtm/dr6SkP2H0cynK0g5oXCQDWuWnTBAAAAAz8CWxpZ2h0bmluZwEIxt4P7eqf3+QAAQMI4MgQAAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNDPwJbGlnaHRuaW5nAQji6kH6aOXoAgA=" + "signed_psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcIgICRz15z0oQ57qDTAJqrEPqGLCn+3Xs2lGEv6+oxGYV9rdHMEQCIHlCL2oKhnYn6hhaUG8+V+8D6GHFlI61OM507VB6aBwoAiACA2d5TnCdlJ1j2rF/EIHkxl3W0hBp3QqweO7hEul9aQEiBgJHPXnPShDnuoNMAmqsQ+oYsKf7dezaUYS/r6jEZhX2twgDz+yHAAAAAAEOILMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCEArDQdItNjSAAEDCEFZ3AsAAAAAAQQiUSA74Tflo81LdhBFqIwHKNMkNRg28E7Vnf2jebjYRkZStyEHE0cioCqqq2UZ2npxQi9Q6DXNZheODM6F4GjHHS3XScEJAG/ctUwEAAAADPwJbGlnaHRuaW5nAQgwkgFDAVpmeAABAwhAQg8AAAAAAAEEIgAgybxcBjyu+/emx4FEB7Vie0+BqLVuy+kyxoL5y6wNGd8M/AlsaWdodG5pbmcBCI9GsPn+O/M0AA==" } }, { "request": { "id": "example:signpsbt#2", "method": "signpsbt", - "params": { - "psbt": "cHNidP8BAP1xAQIAAAAIFTef27H2GAJBzP4UZMeDePsDVkglO47/q4jqK18ibCYAAAAAAP3///+axwap6WKnEHvLjIJZX0ZeJ87cs7PKkXBfwvbGVmjpTQEAAAAA/f///wQ1cVzb9NR7nXadyRuhQBv+2iqhZkhvUA+sPo5z/SsSAQAAAAD9////lXQ788meUtSxhBX13mx2XhyM3Ddo30QtmNW0YuE2TDABAAAAAP3///8Kr4BwElAScx3bA5ZdavrHwh4Zh+rFNvkE/+7gu1WbngEAAAAA/f///3Uei7j3k/b5tnjFGvNZhe2iWz8O6FQjTEpM5XIoduNsAQAAAAD9////fm5Om4MojcnfZiTmrwb4b5Byw9emrjITi/nkEqTK9MsBAAAAAP3///8lwdpZqt3ILPRwhINY4PGvkg2CSw7agcMPSuFoHDDkIQAAAAAA/f///wGCAXoAAAAAABYAFMkJbUP0COpSYCAmLM2tfIUWuSqBAAAAAAABAHECAAAAAZVxzFxyEg7tiQTgRHwGleR8Srxw6taAGOoEpJK/Xj5sAAAAAAD9////AkBCDwAAAAAAFgAUKvGgVL/ThjWE/P1oORVXh/ObucYzr/YpAQAAABYAFKmkod5S53U4m5tKFApyeC35UbnbZwAAAAEBH0BCDwAAAAAAFgAUKvGgVL/ThjWE/P1oORVXh/ObucYAAQBxAgAAAAEVN5/bsfYYAkHM/hRkx4N4+wNWSCU7jv+riOorXyJsJgEAAAAA/f///wJmbOcpAQAAABYAFCCSJBD9wY/VwxnBcnFiu1tA6CGTQEIPAAAAAAAWABSjI8KCqaGX/BGOwJza8hyiuxuIcmcAAAABAR9AQg8AAAAAABYAFKMjwoKpoZf8EY7AnNryHKK7G4hyAAEAcQIAAAAB98EwKZMOHiyRYWyToae6Kce3gCwqUvnVXXHlB/ps9ocBAAAAAP3///8CmNuLKQEAAAAWABQ4roxw+phYHelaRr71DYB3FEy/30BCDwAAAAAAFgAUwSDtQiY7PVvBc7ww56Y72YIQdjllAAAAAQEfQEIPAAAAAAAWABTBIO1CJjs9W8FzvDDnpjvZghB2OQABAHECAAAAAZH/SvCXvDW7b8qb55CDC4M+jgZ61H/e8rZnAGaXp+Z+AAAAAAD9////Apkp2CkBAAAAFgAUc/Y+sIq3oYyEe40GkKJsXawkzwFAQg8AAAAAABYAFLdt1h5Bte8FKvIc2jJgiIwHC7mvZwAAAAEBH0BCDwAAAAAAFgAUt23WHkG17wUq8hzaMmCIjAcLua8AAQBxAgAAAAETC3wMCv9qK3lvVkVJu9b/v2VgMepZtnfngMp2xMXRnwAAAAAA/f///wJk0E4pAQAAABYAFEIsc4cBl+BTN33Kn80+YYfkMt+cQEIPAAAAAAAWABT2/7RIxKohhGbacpBz0BZNYcnfsGUAAAABAR9AQg8AAAAAABYAFPb/tEjEqiGEZtpykHPQFk1hyd+wAAEAcQIAAAABA8J/OnC+cuH79Z6wZmzwdAjhBDaPHavh3yvhr4odDXQBAAAAAP3///8CykowKQEAAAAWABTVHuO8cKOOX/JlmMU66on6Uc54mkBCDwAAAAAAFgAUunZMZryWMqCTiMuVWNF/cleg6dVnAAAAAQEfQEIPAAAAAAAWABS6dkxmvJYyoJOIy5VY0X9yV6Dp1QABAHECAAAAAfRxBaZZ3FfDGwxhZQLYCurN+7kJj0x6nzChg434dnjRAAAAAAD9////AszmyCkBAAAAFgAULSqRp54barF/7R9XOmsLDCVWdAFAQg8AAAAAABYAFNa5adNt/9rZhpGT9mPuSA39xzSIZQAAAAEBH0BCDwAAAAAAFgAU1rlp023/2tmGkZP2Y+5IDf3HNIgAAQBxAgAAAAEgk1JYyP4oIoPoYYcTPPDvZynVfXWINJnBEFBsLv0MtAAAAAAA/f///wJAQg8AAAAAABYAFGYcI7eQ3TSRNzrwsdi+0Id9XN4iMmGqKQEAAAAWABT5XKNwVIFsUKh26sqHFSlOLq5TFGUAAAABAR9AQg8AAAAAABYAFGYcI7eQ3TSRNzrwsdi+0Id9XN4iAAA=", - "signonly": [ - 7 - ] - } + "params": [ + "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcAQ4gswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEIwRR1uu1r8GoAAQMIgIQeAAAAAAABBCIAIMm8XAY8rvv3pseBRAe1YntPgai1bsvpMsaC+cusDRnfDPwJbGlnaHRuaW5nAQjdRD+FoUsRIAABAwhiDc0LAAAAAAEEIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2gM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==" + ] }, "response": { - "signed_psbt": "cHNidP8BAP1xAQIAAAAIFTef27H2GAJBzP4UZMeDePsDVkglO47/q4jqK18ibCYAAAAAAP3///+axwap6WKnEHvLjIJZX0ZeJ87cs7PKkXBfwvbGVmjpTQEAAAAA/f///wQ1cVzb9NR7nXadyRuhQBv+2iqhZkhvUA+sPo5z/SsSAQAAAAD9////lXQ788meUtSxhBX13mx2XhyM3Ddo30QtmNW0YuE2TDABAAAAAP3///8Kr4BwElAScx3bA5ZdavrHwh4Zh+rFNvkE/+7gu1WbngEAAAAA/f///3Uei7j3k/b5tnjFGvNZhe2iWz8O6FQjTEpM5XIoduNsAQAAAAD9////fm5Om4MojcnfZiTmrwb4b5Byw9emrjITi/nkEqTK9MsBAAAAAP3///8lwdpZqt3ILPRwhINY4PGvkg2CSw7agcMPSuFoHDDkIQAAAAAA/f///wGCAXoAAAAAABYAFMkJbUP0COpSYCAmLM2tfIUWuSqBAAAAAAABAHECAAAAAZVxzFxyEg7tiQTgRHwGleR8Srxw6taAGOoEpJK/Xj5sAAAAAAD9////AkBCDwAAAAAAFgAUKvGgVL/ThjWE/P1oORVXh/ObucYzr/YpAQAAABYAFKmkod5S53U4m5tKFApyeC35UbnbZwAAAAEBH0BCDwAAAAAAFgAUKvGgVL/ThjWE/P1oORVXh/ObucYAAQBxAgAAAAEVN5/bsfYYAkHM/hRkx4N4+wNWSCU7jv+riOorXyJsJgEAAAAA/f///wJmbOcpAQAAABYAFCCSJBD9wY/VwxnBcnFiu1tA6CGTQEIPAAAAAAAWABSjI8KCqaGX/BGOwJza8hyiuxuIcmcAAAABAR9AQg8AAAAAABYAFKMjwoKpoZf8EY7AnNryHKK7G4hyAAEAcQIAAAAB98EwKZMOHiyRYWyToae6Kce3gCwqUvnVXXHlB/ps9ocBAAAAAP3///8CmNuLKQEAAAAWABQ4roxw+phYHelaRr71DYB3FEy/30BCDwAAAAAAFgAUwSDtQiY7PVvBc7ww56Y72YIQdjllAAAAAQEfQEIPAAAAAAAWABTBIO1CJjs9W8FzvDDnpjvZghB2OQABAHECAAAAAZH/SvCXvDW7b8qb55CDC4M+jgZ61H/e8rZnAGaXp+Z+AAAAAAD9////Apkp2CkBAAAAFgAUc/Y+sIq3oYyEe40GkKJsXawkzwFAQg8AAAAAABYAFLdt1h5Bte8FKvIc2jJgiIwHC7mvZwAAAAEBH0BCDwAAAAAAFgAUt23WHkG17wUq8hzaMmCIjAcLua8AAQBxAgAAAAETC3wMCv9qK3lvVkVJu9b/v2VgMepZtnfngMp2xMXRnwAAAAAA/f///wJk0E4pAQAAABYAFEIsc4cBl+BTN33Kn80+YYfkMt+cQEIPAAAAAAAWABT2/7RIxKohhGbacpBz0BZNYcnfsGUAAAABAR9AQg8AAAAAABYAFPb/tEjEqiGEZtpykHPQFk1hyd+wAAEAcQIAAAABA8J/OnC+cuH79Z6wZmzwdAjhBDaPHavh3yvhr4odDXQBAAAAAP3///8CykowKQEAAAAWABTVHuO8cKOOX/JlmMU66on6Uc54mkBCDwAAAAAAFgAUunZMZryWMqCTiMuVWNF/cleg6dVnAAAAAQEfQEIPAAAAAAAWABS6dkxmvJYyoJOIy5VY0X9yV6Dp1QABAHECAAAAAfRxBaZZ3FfDGwxhZQLYCurN+7kJj0x6nzChg434dnjRAAAAAAD9////AszmyCkBAAAAFgAULSqRp54barF/7R9XOmsLDCVWdAFAQg8AAAAAABYAFNa5adNt/9rZhpGT9mPuSA39xzSIZQAAAAEBH0BCDwAAAAAAFgAU1rlp023/2tmGkZP2Y+5IDf3HNIgAAQBxAgAAAAEgk1JYyP4oIoPoYYcTPPDvZynVfXWINJnBEFBsLv0MtAAAAAAA/f///wJAQg8AAAAAABYAFGYcI7eQ3TSRNzrwsdi+0Id9XN4iMmGqKQEAAAAWABT5XKNwVIFsUKh26sqHFSlOLq5TFGUAAAABAR9AQg8AAAAAABYAFGYcI7eQ3TSRNzrwsdi+0Id9XN4iIgID+pyVCF5CseUAPNH0GBeMMMluSud5VMoPxIxYgm/06w5HMEQCIG90DSr+fGNoWhCrgLbJG3Wt8PJNMWYqaa5MLWRwA0oTAiA9rsLEqqVhjV6wENfzzpudaE949uLlVqWgDjE/FSgKNAEiBgP6nJUIXkKx5QA80fQYF4wwyW5K53lUyg/EjFiCb/TrDghmHCO3AAAAAAAA" + "signed_psbt": "cHNidP8BAgQCAAAAAQMEmAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAAAAAAA/f///wJ6H/TSAAAAABYAFJq4HdQFbYJVeXL2XWxTpoyZUCr4AMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnJcAAAABAR8AwusLAAAAABYAFAPP7IcV4fQEo27AEeQjj4Yyn5CcIgICRz15z0oQ57qDTAJqrEPqGLCn+3Xs2lGEv6+oxGYV9rdHMEQCIA8+zCzZ59t2OEFHWefZeTypY89RRQ8dMQCjtGWw6gskAiArELH1MvjW6j1G1CKnLZdV+/oabLDU48ingGSPFDOYxwEiBgJHPXnPShDnuoNMAmqsQ+oYsKf7dezaUYS/r6jEZhX2twgDz+yHAAAAAAEOILMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCMEUdbrta/BqAAEDCICEHgAAAAAAAQQiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z3wz8CWxpZ2h0bmluZwEI3UQ/haFLESAAAQMIYg3NCwAAAAABBCJRIMkYPt6RIfPG/RSYgixHp2AnMidmnJCVCIQ7rFu9gT9oIQeffk+gJsmVIxDZ8UKPKgJB9CLvaUr9xqOEogpzJx1hbAkAEioNzwUAAAAM/AlsaWdodG5pbmcBCPN/JmOnjFW4AA==" } } ] diff --git a/doc/schemas/lightning-splice_init.json b/doc/schemas/lightning-splice_init.json index a9419e991417..a26ab85423f9 100644 --- a/doc/schemas/lightning-splice_init.json +++ b/doc/schemas/lightning-splice_init.json @@ -112,27 +112,27 @@ "id": "example:splice_init#1", "method": "splice_init", "params": { - "channel_id": "5677721c35a424a23d6dcc7c909036e505ae68650e09d59733b4b7e73003a4dc", + "channel_id": "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", "relative_amount": 100000, - "initialpsbt": "cHNidP8BAF4CAAAAAVZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQAAAAD9////AU58DQAAAAAAIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL5sAAAAAAEA9gIAAAAAAQGLpTM0gWEqICjgcZNyoPhzdB5fNZBrEFbsNpsKHrTd9wEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIBZa5i8jVPdfV4pbIzSebMb5RN+l5lJkQKAw9+ivAWfnAiBNhehz79143DbFOoTjmPYVErlY0FLlVqojX9wat0aKXgEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPGAAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oAAA==" + "initialpsbt": "cHNidP8BAF4CAAAAAfYhJqy04agRPrPOQO2A40pJ1JsDXLnTZBexwTMyJxEsAQAAAAD9////Ac652gsAAAAAIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGCSAAAAAAEAiQIAAAAB+fmfTbLExUIRcwBZD0qxCoNAHIDe7sEfYHguS6nfkn4AAAAAAP3///8CQEIPAAAAAAAiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJloFs3AsAAAAAIlEgW7Q7f9oXFdDdAUFoJaGFIqLX7LFkdbiHgOj6/Bxz74mNAAAAAQErgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviQAA" } }, "response": { - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEFR1IhAjJCZt6EA7OrFXoJ8feE1YevYYMcmYwVG8whu3TCsjFLIQLjvTgAmGbJ2o7EqpnMTqnGwN1G3xXGHvDOHycSkXFOV1KuAQ4gVndyHDWkJKI9bcx8kJA25QWuaGUOCdWXM7S35zADpNwBDwQAAAAAARAEAAAAAAz8CWxpZ2h0bmluZwEIK/Jiqp0i3SYAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCDmPhBY5ChQUAAEDCE58DQAAAAAAAQQiUSB4NjVf3IqC3EywCncsVVQVHQY4Sk3WXo0/aKwIVmuEvgz8CWxpZ2h0bmluZwEIxt4P7eqf3+QAAQMIAAAAAAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNDPwJbGlnaHRuaW5nAQji6kH6aOXoAgA=" + "psbt": "cHNidP8BAgQCAAAAAQMEkgAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABASuBbNwLAAAAACJRIFu0O3/aFxXQ3QFBaCWhhSKi1+yxZHW4h4Do+vwcc++JAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEImfI55kWjFBwAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABAStAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWAQVHUiECVw7AtutUVmMwIYOmLqx10I/e62TzE1IZIGXWAcjKUh0hAmaGfDQrglCra07axtuuL95TeCtpzRcTmUn71PIISH/yUq4BDiD2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEPBAAAAAABEAQAAAAADPwJbGlnaHRuaW5nAQijTD4R+uEvhAABAwjOudoLAAAAAAEEIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGAM/AlsaWdodG5pbmcBCI/PBFM/C09aAAEDCAAAAAAAAAAAAQQiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJlgz8CWxpZ2h0bmluZwEIreWkThWNrsoA" } }, { "request": { "id": "example:splice_init#2", "method": "splice_init", - "params": { - "channel_id": "a40bb442dab0231b51d8f842d95aad548aa35e1d13c4cfcf2997344f805453a1", - "relative_amount": -105000, - "initialpsbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIoIYBAAAAAAABBCJRIHg2NV/cioLcTLAKdyxVVBUdBjhKTdZejT9orAhWa4S+AA==" - } + "params": [ + "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", + -105000, + "cHNidP8BAgQCAAAAAQMElAAAAAEEAQABBQEBAQYBAwH7BAIAAAAAAQMIoIYBAAAAAAABBCJRIMTSgkFfmoHRjgi2GaGdEWuGVssb9JPl9UC797egWEzaAA==" + ] }, "response": { - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABARzi7RBt64yrfqRL2p+KiUw8cYtiKICRFHmp/4eCSemSAQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgTCjR9L+TfzP7pLJVVto5egTRbRNj/RaBhyrA3UW0aEcCIAJO5FZjXvdpRcGR949C4DnfHs3soklTjn/1upkia+TgASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M9mAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEFR1IhAjJCZt6EA7OrFXoJ8feE1YevYYMcmYwVG8whu3TCsjFLIQLjvTgAmGbJ2o7EqpnMTqnGwN1G3xXGHvDOHycSkXFOV1KuAQ4gpAu0QtqwIxtR2PhC2VqtVIqjXh0TxM/PKZc0T4BUU6EBDwQAAAAAARAEAAAAAAz8CWxpZ2h0bmluZwEIn2Ac8fyFEJwAAQMIAAAAAAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNDPwJbGlnaHRuaW5nAQgu7JK9IpBWOAABAwighgEAAAAAAAEEIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4M/AlsaWdodG5pbmcBCOZ1GpRwbKfuAA==" + "psbt": "cHNidP8BAgQCAAAAAQMElAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCyAgAAAAL2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEAAAAA/f////YhJqy04agRPrPOQO2A40pJ1JsDXLnTZBexwTMyJxEsAAAAAAAAAAAAAs652gsAAAAAIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGDgyBAAAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWkgAAAAEBK+DIEAAAAAAAIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYBBUdSIQJXDsC261RWYzAhg6YurHXQj97rZPMTUhkgZdYByMpSHSECZoZ8NCuCUKtrTtrG264v3lN4K2nNFxOZSfvU8ghIf/JSrgEOIJW7FYF67zRaxARLQco1KmOXtFQY8yFwpGexdGngFEX4AQ8EAQAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCF4tdoSn7LwCAAEDCAAAAAAAAAAAAQQiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJlgz8CWxpZ2h0bmluZwEIGQ1Quuj5CvAAAQMIoIYBAAAAAAABBCJRIMTSgkFfmoHRjgi2GaGdEWuGVssb9JPl9UC797egWEzaDPwJbGlnaHRuaW5nAQi4FyJ2dePgEAA=" } } ] diff --git a/doc/schemas/lightning-splice_signed.json b/doc/schemas/lightning-splice_signed.json index 3aae72d4c608..1c800142043a 100644 --- a/doc/schemas/lightning-splice_signed.json +++ b/doc/schemas/lightning-splice_signed.json @@ -129,13 +129,29 @@ "id": "example:splice_signed#1", "method": "splice_signed", "params": { - "channel_id": "5677721c35a424a23d6dcc7c909036e505ae68650e09d59733b4b7e73003a4dc", - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAAAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCCvyYqqdIt0mAAEA9gIAAAAAAQGLpTM0gWEqICjgcZNyoPhzdB5fNZBrEFbsNpsKHrTd9wEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIBZa5i8jVPdfV4pbIzSebMb5RN+l5lJkQKAw9+ivAWfnAiBNhehz79143DbFOoTjmPYVErlY0FLlVqojX9wat0aKXgEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPGAAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oBDiBWd3IcNaQkoj1tzHyQkDblBa5oZQ4J1ZcztLfnMAOk3AEPBAEAAAABEAT9////ARNACI9TcWG+6uC9ElBFN3qhND7amsor/dtBhJ5ujEQAT/80548avrt7d7IJiOAaCNzzYLSXITdL2xjx6mhbBi9hTiEWkUUygSpECk12bHHNORk2lKNArhHgEuW6Gtnvum52ylMJAMLMqxcAAAAADPwJbGlnaHRuaW5nAQg5j4QWOQoUFAABAwhOfA0AAAAAAAEEIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4hB7nAxoROEqUxyWjlXFUHjsFtm/dr6SkP2H0cynK0g5oXCQDWuWnTBAAAAAz8CWxpZ2h0bmluZwEIxt4P7eqf3+QAAQMI4MgQAAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNDPwJbGlnaHRuaW5nAQji6kH6aOXoAgA=" + "channel_id": "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", + "psbt": "cHNidP8BAgQCAAAAAQMEkgAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABASuBbNwLAAAAACJRIFu0O3/aFxXQ3QFBaCWhhSKi1+yxZHW4h4Do+vwcc++JAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQBAAAAARAE/f///wETQKcuGy6h+BqXM6UBaTWpiX1wgQdVDWQdu3poUITFMK4JR7Jjaqy0IsnjfOXmaFZAUIS01Heqa7RbgzHF+5qDI/AhFvTEPeeTGXjlJSGiyNDqLm+lpUC+f31Q3j7YhyeyShxZCQD2T+TUAAAAAAz8CWxpZ2h0bmluZwEImfI55kWjFBwAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABAStAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQAAAAAARAEAAAAAAz8CWxpZ2h0bmluZwEIo0w+EfrhL4QAAQMIzrnaCwAAAAABBCJRII+O1EYnVX28zEKuAYqcVHSpkShXksTKiRwfWcVmXTRgIQf4l/XsahrhZhlxJbtZN6e213tQQFKbPCTiBwSf3CvcvAkA9Hbq9AUAAAAM/AlsaWdodG5pbmcBCI/PBFM/C09aAAEDCODIEAAAAAAAAQQiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJlgz8CWxpZ2h0bmluZwEIreWkThWNrsoA" } }, "response": { - "tx": "020000000001025677721c35a424a23d6dcc7c909036e505ae68650e09d59733b4b7e73003a4dc0000000000000000005677721c35a424a23d6dcc7c909036e505ae68650e09d59733b4b7e73003a4dc0100000000fdffffff024e7c0d00000000002251207836355fdc8a82dc4cb00a772c5554151d06384a4dd65e8d3f68ac08566b84bee0c81000000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd0400473044022053269f3951a1fc942174ac0dde8462405a86c89b31b444890664ee9735872cff02204cd822c4456c15e90ad342b23e9bb252d383d4e17a8a04818c4919e4fd61efd80147304402205ac0787c79e74ebfa0eaf18964625c53eb672cc4bed2c65303bd9cc192dad6f902206c6c0cded47201dae0020f50a8998555e654d3420c64e801fc668238e3c1cdfa0147522102324266de8403b3ab157a09f1f784d587af61831c998c151bcc21bb74c2b2314b2102e3bd38009866c9da8ec4aa99cc4ea9c6c0dd46df15c61ef0ce1f271291714e5752ae0140088f537161beeae0bd125045377aa1343eda9aca2bfddb41849e6e8c44004fff34e78f1abebb7b77b20988e01a08dcf360b49721374bdb18f1ea685b062f614e6c000000", - "txid": "f00d5e230b401274c88d3e6205e2c6117028cb9878b7d2bc52b1441f0b589427" + "tx": "02000000000102f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c0100000000fdfffffff62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c00000000000000000002ceb9da0b000000002251208f8ed44627557dbccc42ae018a9c5474a991285792c4ca891c1f59c5665d3460e0c810000000000022002093dedd0c265bca868576d3ee2e59eebbb20ebc296e58f7edca93d5eeaec089960140a72e1b2ea1f81a9733a5016935a9897d708107550d641dbb7a685084c530ae0947b2636aacb422c9e37ce5e66856405084b4d477aa6bb45b8331c5fb9a8323f00400473044022024af89f1987cfee986aacf511ed101aa083a8300d4ae4d6b87cd68fef4f722c60220263fd2a4750c7fbb08c433cc0d14e500c714820175454d18b5bef74e01cdc2f9014730440220306e4f6a09653e44f9306c6c47afb58d756d7ba2803f61184db3730ab208a8a302207c40845740e1e791d05957c75eb1b3e62db18fb5ec75039768972dc5efb881710147522102570ec0b6eb545663302183a62eac75d08fdeeb64f31352192065d601c8ca521d210266867c342b8250ab6b4edac6dbae2fde53782b69cd17139949fbd4f208487ff252ae92000000", + "txid": "f84514e06974b167a47021f31854b497632a35ca414b04c45a34ef7a8115bb95", + "outnum": 1 + } + }, + { + "request": { + "id": "example:splice_signed#2", + "method": "splice_signed", + "params": [ + "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", + "cHNidP8BAgQCAAAAAQMElAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCyAgAAAAL2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEAAAAA/f////YhJqy04agRPrPOQO2A40pJ1JsDXLnTZBexwTMyJxEsAAAAAAAAAAAAAs652gsAAAAAIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGDgyBAAAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWkgAAAAEBK+DIEAAAAAAAIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYBDiCVuxWBeu80WsQES0HKNSpjl7RUGPMhcKRnsXRp4BRF+AEPBAEAAAABEAQAAAAADPwJbGlnaHRuaW5nAQheLXaEp+y8AgABAwi4Lg8AAAAAAAEEIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYM/AlsaWdodG5pbmcBCBkNULro+QrwAAEDCKCGAQAAAAAAAQQiUSDE0oJBX5qB0Y4IthmhnRFrhlbLG/ST5fVAu/e3oFhM2gz8CWxpZ2h0bmluZwEIuBcidnXj4BAA" + ] + }, + "response": { + "tx": "0200000000010195bb15817aef345ac4044b41ca352a6397b45418f32170a467b17469e01445f801000000000000000002b82e0f000000000022002093dedd0c265bca868576d3ee2e59eebbb20ebc296e58f7edca93d5eeaec08996a086010000000000225120c4d282415f9a81d18e08b619a19d116b8656cb1bf493e5f540bbf7b7a0584cda04004730440220259ff7ffc38775f34aed9be01a57b3002b2cba938e8bdf37ee0d529401ca0ae102206f77ba80e128ed5096679a304078efbff423394f2ffeb286e307fc71af06773d0147304402206e715aa27e9f192a787949dd322dd8c41d69dbf0b134099b942f40f3727ecaa80220154ab1a180d2103884ac73307f6f5faa0e384d7d40dcda44a26c17fdd83a89910147522102570ec0b6eb545663302183a62eac75d08fdeeb64f31352192065d601c8ca521d210266867c342b8250ab6b4edac6dbae2fde53782b69cd17139949fbd4f208487ff252ae94000000", + "txid": "b81ed02d0235b63cb73d1ee840345a696bc7224ba28be590165aa340bc9e37de", + "outnum": 0 } } ] diff --git a/doc/schemas/lightning-splice_update.json b/doc/schemas/lightning-splice_update.json index 8f815a463783..05e104e01905 100644 --- a/doc/schemas/lightning-splice_update.json +++ b/doc/schemas/lightning-splice_update.json @@ -128,12 +128,26 @@ "id": "example:splice_update#1", "method": "splice_update", "params": { - "channel_id": "5677721c35a424a23d6dcc7c909036e505ae68650e09d59733b4b7e73003a4dc", - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEFR1IhAjJCZt6EA7OrFXoJ8feE1YevYYMcmYwVG8whu3TCsjFLIQLjvTgAmGbJ2o7EqpnMTqnGwN1G3xXGHvDOHycSkXFOV1KuAQ4gVndyHDWkJKI9bcx8kJA25QWuaGUOCdWXM7S35zADpNwBDwQAAAAAARAEAAAAAAz8CWxpZ2h0bmluZwEIK/Jiqp0i3SYAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAQAAAAEQBP3///8M/AlsaWdodG5pbmcBCDmPhBY5ChQUAAEDCE58DQAAAAAAAQQiUSB4NjVf3IqC3EywCncsVVQVHQY4Sk3WXo0/aKwIVmuEvgz8CWxpZ2h0bmluZwEIxt4P7eqf3+QAAQMIAAAAAAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNDPwJbGlnaHRuaW5nAQji6kH6aOXoAgA=" + "channel_id": "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", + "psbt": "cHNidP8BAgQCAAAAAQMEkgAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABASuBbNwLAAAAACJRIFu0O3/aFxXQ3QFBaCWhhSKi1+yxZHW4h4Do+vwcc++JAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEImfI55kWjFBwAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABAStAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWAQVHUiECVw7AtutUVmMwIYOmLqx10I/e62TzE1IZIGXWAcjKUh0hAmaGfDQrglCra07axtuuL95TeCtpzRcTmUn71PIISH/yUq4BDiD2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEPBAAAAAABEAQAAAAADPwJbGlnaHRuaW5nAQijTD4R+uEvhAABAwjOudoLAAAAAAEEIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGAM/AlsaWdodG5pbmcBCI/PBFM/C09aAAEDCAAAAAAAAAAAAQQiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJlgz8CWxpZ2h0bmluZwEIreWkThWNrsoA" } }, "response": { - "psbt": "cHNidP8BAgQCAAAAAQMEbAAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQD2AgAAAAABAYulMzSBYSogKOBxk3Kg+HN0Hl81kGsQVuw2mwoetN33AQAAAAD9////AkBCDwAAAAAAIgAgW4zTuRTPZ83Y+mJzyTA1PdNkdnNPvZYhAsLfU7kIgM0BLw8AAAAAACJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aAkcwRAIgFlrmLyNU919XilsjNJ5sxvlE36XmUmRAoDD36K8BZ+cCIE2F6HPv3XjcNsU6hOOY9hUSuVjQUuVWqiNf3Bq3RopeASED10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8YAAAAAQErQEIPAAAAAAAiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQEOIFZ3chw1pCSiPW3MfJCQNuUFrmhlDgnVlzO0t+cwA6TcAQ8EAAAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCCvyYqqdIt0mAAEA9gIAAAAAAQGLpTM0gWEqICjgcZNyoPhzdB5fNZBrEFbsNpsKHrTd9wEAAAAA/f///wJAQg8AAAAAACIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAS8PAAAAAAAiUSBj/+5Op9UebK35CG4oaiUnkiqqJbjFOuvzL6MqCmJ/WgJHMEQCIBZa5i8jVPdfV4pbIzSebMb5RN+l5lJkQKAw9+ivAWfnAiBNhehz79143DbFOoTjmPYVErlY0FLlVqojX9wat0aKXgEhA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPGAAAAAEBKwEvDwAAAAAAIlEgY//uTqfVHmyt+QhuKGolJ5IqqiW4xTrr8y+jKgpif1oBDiBWd3IcNaQkoj1tzHyQkDblBa5oZQ4J1ZcztLfnMAOk3AEPBAEAAAABEAT9////DPwJbGlnaHRuaW5nAQg5j4QWOQoUFAABAwhOfA0AAAAAAAEEIlEgeDY1X9yKgtxMsAp3LFVUFR0GOEpN1l6NP2isCFZrhL4M/AlsaWdodG5pbmcBCMbeD+3qn9/kAAEDCODIEAAAAAAAAQQiACBbjNO5FM9nzdj6YnPJMDU902R2c0+9liECwt9TuQiAzQz8CWxpZ2h0bmluZwEI4upB+mjl6AIA", + "psbt": "cHNidP8BAgQCAAAAAQMEkgAAAAEEAQIBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABASuBbNwLAAAAACJRIFu0O3/aFxXQ3QFBaCWhhSKi1+yxZHW4h4Do+vwcc++JAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQBAAAAARAE/f///wz8CWxpZ2h0bmluZwEImfI55kWjFBwAAQCJAgAAAAH5+Z9NssTFQhFzAFkPSrEKg0AcgN7uwR9geC5Lqd+SfgAAAAAA/f///wJAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWgWzcCwAAAAAiUSBbtDt/2hcV0N0BQWgloYUiotfssWR1uIeA6Pr8HHPviY0AAAABAStAQg8AAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWAQ4g9iEmrLThqBE+s85A7YDjSknUmwNcudNkF7HBMzInESwBDwQAAAAAARAEAAAAAAz8CWxpZ2h0bmluZwEIo0w+EfrhL4QAAQMIzrnaCwAAAAABBCJRII+O1EYnVX28zEKuAYqcVHSpkShXksTKiRwfWcVmXTRgDPwJbGlnaHRuaW5nAQiPzwRTPwtPWgABAwjgyBAAAAAAAAEEIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYM/AlsaWdodG5pbmcBCK3lpE4Vja7KAA==", + "commitments_secured": true + } + }, + { + "request": { + "id": "example:splice_update#2", + "method": "splice_update", + "params": [ + "f62126acb4e1a8113eb3ce40ed80e34a49d49b035cb9d36417b1c1333227112c", + "cHNidP8BAgQCAAAAAQMElAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCyAgAAAAL2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEAAAAA/f////YhJqy04agRPrPOQO2A40pJ1JsDXLnTZBexwTMyJxEsAAAAAAAAAAAAAs652gsAAAAAIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGDgyBAAAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWkgAAAAEBK+DIEAAAAAAAIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYBBUdSIQJXDsC261RWYzAhg6YurHXQj97rZPMTUhkgZdYByMpSHSECZoZ8NCuCUKtrTtrG264v3lN4K2nNFxOZSfvU8ghIf/JSrgEOIJW7FYF67zRaxARLQco1KmOXtFQY8yFwpGexdGngFEX4AQ8EAQAAAAEQBAAAAAAM/AlsaWdodG5pbmcBCF4tdoSn7LwCAAEDCAAAAAAAAAAAAQQiACCT3t0MJlvKhoV20+4uWe67sg68KW5Y9+3Kk9XursCJlgz8CWxpZ2h0bmluZwEIGQ1Quuj5CvAAAQMIoIYBAAAAAAABBCJRIMTSgkFfmoHRjgi2GaGdEWuGVssb9JPl9UC797egWEzaDPwJbGlnaHRuaW5nAQi4FyJ2dePgEAA=" + ] + }, + "response": { + "psbt": "cHNidP8BAgQCAAAAAQMElAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCyAgAAAAL2ISastOGoET6zzkDtgONKSdSbA1y502QXscEzMicRLAEAAAAA/f////YhJqy04agRPrPOQO2A40pJ1JsDXLnTZBexwTMyJxEsAAAAAAAAAAAAAs652gsAAAAAIlEgj47URidVfbzMQq4BipxUdKmRKFeSxMqJHB9ZxWZdNGDgyBAAAAAAACIAIJPe3QwmW8qGhXbT7i5Z7ruyDrwpblj37cqT1e6uwImWkgAAAAEBK+DIEAAAAAAAIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYBDiCVuxWBeu80WsQES0HKNSpjl7RUGPMhcKRnsXRp4BRF+AEPBAEAAAABEAQAAAAADPwJbGlnaHRuaW5nAQheLXaEp+y8AgABAwi4Lg8AAAAAAAEEIgAgk97dDCZbyoaFdtPuLlnuu7IOvCluWPftypPV7q7AiZYM/AlsaWdodG5pbmcBCBkNULro+QrwAAEDCKCGAQAAAAAAAQQiUSDE0oJBX5qB0Y4IthmhnRFrhlbLG/ST5fVAu/e3oFhM2gz8CWxpZ2h0bmluZwEIuBcidnXj4BAA", "commitments_secured": true } } diff --git a/doc/schemas/lightning-sql-template.json b/doc/schemas/lightning-sql-template.json index 135f895e5e38..517b2f7ee52d 100644 --- a/doc/schemas/lightning-sql-template.json +++ b/doc/schemas/lightning-sql-template.json @@ -131,38 +131,51 @@ "examples": [ { "description": [ - "A simple peer selection query:" + "A simple peers selection query:" ], "request": { "id": "example:sql#1", "method": "sql", - "params": [ - "SELECT id FROM peers" - ] + "params": { + "query": "SELECT id FROM peers" + } }, "response": { "rows": [ [ - "02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da00" + "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" ] ] } }, { "description": [ - "A statement containing using `=` needs `-o`:" + "A statement containing `=` needs `-o` in shell:" ], "request": { "id": "example:sql#2", "method": "sql", "params": [ - " -o 'SELECT node_id,last_timestamp FROM nodes WHERE last_timestamp>=1669578892'" + "SELECT nodeid,last_timestamp FROM nodes WHERE last_timestamp>=1669578892" ] }, "response": { "rows": [ [ - "02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da001669601603" + "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + 1722303662 + ], + [ + "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518", + 1722303662 + ], + [ + "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + 1722303669 + ], + [ + "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199", + 1722303669 ] ] } @@ -175,16 +188,19 @@ "id": "example:sql#3", "method": "sql", "params": [ - " -o 'SELECT nodeid FROM nodes WHERE nodeid != x'03c9d25b6c0ce4bde5ad97d7ab83f00ae8bd3800a98ccbee36f3c3205315147de1''" + "SELECT nodeid FROM nodes WHERE nodeid != x'035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d'" ] }, "response": { "rows": [ [ - "0214739d625944f8fdc0da9d2ef44dbd7af58443685e494117b51410c5c3ff973a" + "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59" + ], + [ + "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ], [ - "02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da00" + "0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199" ] ] } @@ -197,16 +213,16 @@ "id": "example:sql#4", "method": "sql", "params": [ - " -o 'SELECT nodeid FROM nodes WHERE nodeid IN (x'03c9d25b6c0ce4bde5ad97d7ab83f00ae8bd3800a98ccbee36f3c3205315147de1', x'02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da00')'" + "SELECT nodeid FROM nodes WHERE nodeid IN (x'0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518', x'035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d')" ] }, "response": { "rows": [ [ - "02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da00" + "0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518" ], [ - "03c9d25b6c0ce4bde5ad97d7ab83f00ae8bd3800a98ccbee36f3c3205315147de1" + "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d" ] ] } @@ -219,24 +235,17 @@ "id": "example:sql#5", "method": "sql", "params": [ - " -o 'SELECT nodeid, alias, nodes_addresses.type, nodes_addresses.port, nodes_addresses.address FROM nodes INNER JOIN nodes_addresses ON nodes_addresses.row = nodes.rowid'" + "SELECT peer_id, short_channel_id, to_us_msat, total_msat, peerchannels_status.status FROM peerchannels INNER JOIN peerchannels_status ON peerchannels_status.row = peerchannels.rowid" ] }, "response": { "rows": [ [ - "02ba9965e3db660385bd1dd2c09dd032e0f2179a94fc5db8917b60adf0b363da00", - "YELLOWWATCH-22.11rc2-31-gcd7593b", - "dns", - "7272", - "localhost" - ], - [ - "0214739d625944f8fdc0da9d2ef44dbd7af58443685e494117b51410c5c3ff973a", - "HOPPINGSQUIRREL-1rc2-31-gcd7593b", - "dns", - "7171", - "localhost" + "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", + "109x1x1", + 490503792, + 1000000000, + "CHANNELD_NORMAL:Channel ready for use." ] ] } @@ -249,13 +258,13 @@ "id": "example:sql#6", "method": "sql", "params": [ - "SELECT COUNT(*) FROM nodes" + "SELECT COUNT(*) FROM forwards" ] }, "response": { "rows": [ [ - "3" + 8 ] ] } @@ -264,18 +273,6 @@ "request": { "id": "example:sql#7", "method": "sql", - "params": [ - "SELECT * FROM forwards;" - ] - }, - "response": { - "rows": [] - } - }, - { - "request": { - "id": "example:sql#8", - "method": "sql", "params": [ "SELECT * from peerchannels_features" ] @@ -283,27 +280,21 @@ "response": { "rows": [ [ - 6, - 1, + 23, + 18, 0, "option_static_remotekey" ], [ - 7, + 24, + 18, 1, - 1, - "option_anchors" + "option_anchors_zero_fee_htlc_tx" ], [ - 16, - 11, - 0, - "option_static_remotekey" - ], - [ - 17, - 11, - 1, + 25, + 18, + 2, "option_anchors" ] ] diff --git a/doc/schemas/lightning-staticbackup.json b/doc/schemas/lightning-staticbackup.json index d391e284cbe8..c929a0099a4e 100644 --- a/doc/schemas/lightning-staticbackup.json +++ b/doc/schemas/lightning-staticbackup.json @@ -45,7 +45,12 @@ }, "response": { "scb": [ - "0000000000000001c707da9b230e1655b0a6c082b8daf4fa44d9d1f68163ed4d531d45cf453dc651022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d5900017f000001b2e3c707da9b230e1655b0a6c082b8daf4fa44d9d1f68163ed4d531d45cf453dc6510000000000000000000186a000021000" + "0000000000000006f4e1de801de57374d5737da622611e3a1ad9f16d5df9c30fceecc11ce732eeeb022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d5900017f0000019b987577c455da982b1753df79c56f9d8d2b75d1401e60a5af322ab27b13b20d75970000000100000000000f42400003401000", + "000000000000000121bd30cac60f477f2c4267220b1702a6ec5780db34f9934fa94b8c0508bf3357035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d00017f000001e610e23fcc9e6306ce636b203217b22409bf9bab2211f9f432de781dedb6377dab5a0000000100000000000f42400003401000", + "00000000000000027512083907c74ed3a045e9bf772b3d72948eb93daf84a1cee57108800451aaf2035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d00017f000001e610ee1db407eb3e47be3e93e1abc05b13806ee7aef8550c517a4974c72bf91866410000000100000000000f42400003401000", + "0000000000000003222d999f537e32e9458c5db17a63e012dcced61340de06fda5bc30566270b0aa0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f0000019bc5b15661ec5c17599de0858401b72d6be66c34b48a3bb6e679542809f395e6bb2000000000000000000bebb3cb0003401000", + "0000000000000004a4a379248e49d207cc984646e632e1a31105a85708b9d6d961a5018fdd489f5a0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f000001c1ac184e7462759ff83049b19582db049d40076f83a7a70181374ca0ea91644a3d9c0000000200000000000075300003401000", + "000000000000000509eb55872cd9039ecd08281af756e23b15aad4129fd6a9bcd71b472114ebf43a0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800017f000001c1ace9067c9d125df7150261c80eec3ab9cf8731679752b84f090ab3ea6e36c93d3100000001000000000000c3500003401000" ] } } diff --git a/doc/schemas/lightning-txdiscard.json b/doc/schemas/lightning-txdiscard.json index a6ca34069915..3def4f741e74 100644 --- a/doc/schemas/lightning-txdiscard.json +++ b/doc/schemas/lightning-txdiscard.json @@ -63,13 +63,26 @@ "request": { "id": "example:txdiscard#1", "method": "txdiscard", + "params": [ + "cafef1e6936d05584c8406e9ec5e9631b03513fe8b2a0444c5824e1a1f3d7c67" + ] + }, + "response": { + "unsigned_tx": "0200000001974bc23173b7bca9b060dac12abd1bb158e8ed69a3e74d4f6af5919b15f5772c0100000000fdffffff020000000100000000220020a056363be8c7dbb511098cc50fbca24843e6ed6de03f816465f1998a9a82a09d4183980000000000225120f1393467c717cd50de2760167d4311141a8f750c89f54fd2c900601a7da8434c95000000", + "txid": "cafef1e6936d05584c8406e9ec5e9631b03513fe8b2a0444c5824e1a1f3d7c67" + } + }, + { + "request": { + "id": "example:txdiscard#2", + "method": "txdiscard", "params": { - "txid": "6e680cb76077f11c838cc7aee0c0aa360f9857f00856bb1614025a1af53739fc" + "txid": "91a189eb69a436e49735ae1e8619fd96a342a4e5c63fa2baa7e9f69ecdc7434c" } }, "response": { - "unsigned_tx": "020000000142dc00d81359c3a551e170e3bf5262fa9cacc2eb2e283a10e579491cd86dce4b0000000000fdffffff02ffffff00000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd42839800000000002251207836355fdc8a82dc4cb00a772c5554151d06384a4dd65e8d3f68ac08566b84be66000000", - "txid": "6e680cb76077f11c838cc7aee0c0aa360f9857f00856bb1614025a1af53739fc" + "unsigned_tx": "02000000010cbdd42439292d7a59620493020f2a204488bfa4d640eedb84af5d3bd6479aea0000000000fdffffff0240420f00000000002200200fefd5034808bec0c94b857b7a3ddeeece7cae1b2101b2f23f1c114b14073f31b7a1f000000000002251205c54c6ff7b25c08e66a91d4256a5ca2c374ab1faf56377e8d65466cf997614ce97000000", + "txid": "91a189eb69a436e49735ae1e8619fd96a342a4e5c63fa2baa7e9f69ecdc7434c" } } ] diff --git a/doc/schemas/lightning-txprepare.json b/doc/schemas/lightning-txprepare.json index 67dc94b276d2..09233e343148 100644 --- a/doc/schemas/lightning-txprepare.json +++ b/doc/schemas/lightning-txprepare.json @@ -99,18 +99,18 @@ "request": { "id": "example:txprepare#1", "method": "txprepare", - "params": { - "outputs": [ + "params": [ + [ { - "bcrt1qtwxd8wg5eanumk86vfeujvp48hfkgannf77evggzct048wggsrxsum2pmm": 16777215 + "bcrt1q5ptrvwlgcldm2ygf3nzsl09zfpp7dmtduqlczer97xvc4x5z5zwsc2ulv4": 16777216 } ] - } + ] }, "response": { - "unsigned_tx": "020000000142dc00d81359c3a551e170e3bf5262fa9cacc2eb2e283a10e579491cd86dce4b0000000000fdffffff02ffffff00000000002200205b8cd3b914cf67cdd8fa6273c930353dd36476734fbd962102c2df53b90880cd42839800000000002251207836355fdc8a82dc4cb00a772c5554151d06384a4dd65e8d3f68ac08566b84be66000000", - "txid": "6e680cb76077f11c838cc7aee0c0aa360f9857f00856bb1614025a1af53739fc", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQDeAgAAAAABATRHoQ9tEMHRHpf06v5uTEdjdMk1rccIaA6MNGMipNQWAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFLnqitWTi465LGxeucwoSAj16NGbAkcwRAIgVtOsUaQaPgH86aW6e6qmJa1xVb8KWvc+HALGosqVVmQCIFi4JU8Gy+vl2a2/frY+71hitYIBB/tjsRP7fpgb8b9TASECHUIV5q1r2ownjOlAFPQASTlZxxNgBvi5O3hCRvajwdJlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIELcANgTWcOlUeFw479SYvqcrMLrLig6EOV5SRzYbc5LAQ8EAAAAAAEQBP3///8AAQMI////AAAAAAABBCIAIFuM07kUz2fN2Ppic8kwNT3TZHZzT72WIQLC31O5CIDNAAEDCEKDmAAAAAAAAQQiUSB4NjVf3IqC3EywCncsVVQVHQY4Sk3WXo0/aKwIVmuEvgA=" + "unsigned_tx": "0200000001974bc23173b7bca9b060dac12abd1bb158e8ed69a3e74d4f6af5919b15f5772c0100000000fdffffff020000000100000000220020a056363be8c7dbb511098cc50fbca24843e6ed6de03f816465f1998a9a82a09d4183980000000000225120f1393467c717cd50de2760167d4311141a8f750c89f54fd2c900601a7da8434c95000000", + "txid": "cafef1e6936d05584c8406e9ec5e9631b03513fe8b2a0444c5824e1a1f3d7c67", + "psbt": "cHNidP8BAgQCAAAAAQMElQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAFpz79e9wou5mbmtaiB+6WfRTf8SpZxmrd6n+rIFcWewQAAAAAA/f///wLS79/eAAAAABYAFE35CMxYA4yQx9XLuFj0/q5uNmligJaYAQAAAAAWABT/hTPq8LE5vAc9KiJjjmygoIN81UsAAAABAR+AlpgBAAAAABYAFP+FM+rwsTm8Bz0qImOObKCgg3zVAQ4gl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywBDwQBAAAAARAE/f///wABAwgAAAABAAAAAAEEIgAgoFY2O+jH27URCYzFD7yiSEPm7W3gP4FkZfGZipqCoJ0AAQMIQYOYAAAAAAABBCJRIPE5NGfHF81Q3idgFn1DERQaj3UMifVP0skAYBp9qENMAA==" } }, { @@ -120,15 +120,15 @@ "params": { "outputs": [ { - "bcrt1qyhu7rxj3rrlcj84jtzp2mk9d89xm9v2rx4d4h8au830axugx6mmqsuplng": "100000sat" + "bcrt1q4hz6a4gtecfmy8z870cwkq2gzc0t7n9u9pu23689u55ghwewemqsv4v2zs": 16777216 } ] } }, "response": { - "unsigned_tx": "0200000001a91077a134fb9fe4a8d13a482b718368bfd9ce3eff61ff7d96549480a1f97dca0100000000fdffffff02a08601000000000022002025f9e19a5118ff891eb25882add8ad394db2b143355b5b9fbc3c5fd37106d6f66173010000000000225120a2a01c7965289eee56b5cfcddb9856c70fa476c264d21f711c6a69af776ae40366000000", - "txid": "f11d436054607603e903fc69c4bd9b39ce97421341c7cf814ad025cb5bf59c1c", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQDeAgAAAAABAYZ4QwAgPq6Os8kk073f5Yx4T9LXYfbOjAdkzMXfuBQdAAAAAAD9////AjPkAioBAAAAFgAUeOeqzyifepeJAMCl4vnnJ/TRptRADQMAAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFlAkcwRAIgYBFwmqWCrVkxxZ0/tte3z4lIem0L7MkhXzGAOvBWa6YCIFx7H4zOzxjixlZMi0DYYbIEflDjYHJXLfN1wVcXYuekASEDgztw/3Rks6vKGYMXJ83VEvQcNIjg3rJW6KdxEh26uwplAAAAAQEfQA0DAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQEOIKkQd6E0+5/kqNE6SCtxg2i/2c4+/2H/fZZUlICh+X3KAQ8EAQAAAAEQBP3///8AAQMIoIYBAAAAAAABBCIAICX54ZpRGP+JHrJYgq3YrTlNsrFDNVtbn7w8X9NxBtb2AAEDCGFzAQAAAAAAAQQiUSCioBx5ZSie7la1z83bmFbHD6R2wmTSH3Ecammvd2rkAwA=" + "unsigned_tx": "0200000001974bc23173b7bca9b060dac12abd1bb158e8ed69a3e74d4f6af5919b15f5772c0100000000fdffffff020000000100000000220020adc5aed50bce13b21c47f3f0eb0148161ebf4cbc2878a8e8e5e5288bbb2ecec1418398000000000022512081da0d3e3051135a89e2f9d85e2eadf661f959bfb05e671097854672cfd0ac7d95000000", + "txid": "ed6c309a10273aa036d29b71cf70202291d4d4b72be353ac410e1678ecfbf74e", + "psbt": "cHNidP8BAgQCAAAAAQMElQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAFpz79e9wou5mbmtaiB+6WfRTf8SpZxmrd6n+rIFcWewQAAAAAA/f///wLS79/eAAAAABYAFE35CMxYA4yQx9XLuFj0/q5uNmligJaYAQAAAAAWABT/hTPq8LE5vAc9KiJjjmygoIN81UsAAAABAR+AlpgBAAAAABYAFP+FM+rwsTm8Bz0qImOObKCgg3zVAQ4gl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywBDwQBAAAAARAE/f///wABAwgAAAABAAAAAAEEIgAgrcWu1QvOE7IcR/Pw6wFIFh6/TLwoeKjo5eUoi7suzsEAAQMIQYOYAAAAAAABBCJRIIHaDT4wURNaieL52F4urfZh+Vm/sF5nEJeFRnLP0Kx9AA==" } } ] diff --git a/doc/schemas/lightning-txsend.json b/doc/schemas/lightning-txsend.json index 1b7070d8ebc1..9aa113f01dc7 100644 --- a/doc/schemas/lightning-txsend.json +++ b/doc/schemas/lightning-txsend.json @@ -67,14 +67,28 @@ "request": { "id": "example:txsend#1", "method": "txsend", + "params": [ + "ed6c309a10273aa036d29b71cf70202291d4d4b72be353ac410e1678ecfbf74e" + ] + }, + "response": { + "tx": "0200000001974bc23173b7bca9b060dac12abd1bb158e8ed69a3e74d4f6af5919b15f5772c0100000000fdffffff020000000100000000220020adc5aed50bce13b21c47f3f0eb0148161ebf4cbc2878a8e8e5e5288bbb2ecec1418398000000000022512081da0d3e3051135a89e2f9d85e2eadf661f959bfb05e671097854672cfd0ac7d95000000", + "txid": "ed6c309a10273aa036d29b71cf70202291d4d4b72be353ac410e1678ecfbf74e", + "psbt": "cHNidP8BAgQCAAAAAQMElQAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAFpz79e9wou5mbmtaiB+6WfRTf8SpZxmrd6n+rIFcWewQAAAAAA/f///wLS79/eAAAAABYAFE35CMxYA4yQx9XLuFj0/q5uNmligJaYAQAAAAAWABT/hTPq8LE5vAc9KiJjjmygoIN81UsAAAABAR+AlpgBAAAAABYAFP+FM+rwsTm8Bz0qImOObKCgg3zVIgICrdS+fDe+nFDye7Mp6i6PaAV6YeEglyQM1Lypkk6qiU5HMEQCID5oPTp8udytiNikLxBRfm+iAL2LeYa9bJBKih0OcN2CAiApOyjSHogrEppHHuTPuUqEeLq/psjaa8cEKHXw6Hz7cQEiBgKt1L58N76cUPJ7synqLo9oBXph4SCXJAzUvKmSTqqJTgj/hTPqAAAAAAEOIJdLwjFzt7ypsGDawSq9G7FY6O1po+dNT2r1kZsV9XcsAQ8EAQAAAAEQBP3///8AAQMIAAAAAQAAAAABBCIAIK3FrtULzhOyHEfz8OsBSBYev0y8KHio6OXlKIu7Ls7BAAEDCEGDmAAAAAAAAQQiUSCB2g0+MFETWoni+dheLq32YflZv7BeZxCXhUZyz9CsfSEHPXxCgubxwYgC9mDabmKYMY13V5d4yQepeZJ7VCvUFqIJAEDR+iMDAAAAAA==" + } + }, + { + "request": { + "id": "example:txsend#2", + "method": "txsend", "params": { - "txid": "c9f59ba6bda8e095bb43ecabfa37de8d5194e5c839b6b63be4e29bceaae483ce" + "txid": "e9a218878137adf2d34a8ef69151d6e288cc9b9a23f6a5e8ace1b43f03409358" } }, "response": { - "tx": "020000000142dc00d81359c3a551e170e3bf5262fa9cacc2eb2e283a10e579491cd86dce4b0000000000fdffffff020000000100000000220020b636f07026ea64952ece5b7620a9337d9ac2321c796a499260994d1b373667504183980000000000225120754a77b503fcba0fd80f0a1a8226ed6764ff9a9d9bb61b485d40d4c9f4be245966000000", - "txid": "c9f59ba6bda8e095bb43ecabfa37de8d5194e5c839b6b63be4e29bceaae483ce", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQDeAgAAAAABATRHoQ9tEMHRHpf06v5uTEdjdMk1rccIaA6MNGMipNQWAAAAAAD9////AoCWmAEAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WXzWm0oAQAAABYAFLnqitWTi465LGxeucwoSAj16NGbAkcwRAIgVtOsUaQaPgH86aW6e6qmJa1xVb8KWvc+HALGosqVVmQCIFi4JU8Gy+vl2a2/frY+71hitYIBB/tjsRP7fpgb8b9TASECHUIV5q1r2ownjOlAFPQASTlZxxNgBvi5O3hCRvajwdJlAAAAAQEfgJaYAQAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZSICA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPRzBEAiBp/HPhg1ObOXqTr5rIjUYLMspGLz+sk1pjD9pjRFzf3wIgWycOB/dQPzwZAK3OXYs269h8o85ucDpdVhH4AyX69a0BIgYD10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8IAfrZCgAAAAABDiBC3ADYE1nDpVHhcOO/UmL6nKzC6y4oOhDleUkc2G3OSwEPBAAAAAABEAT9////AAEDCAAAAAEAAAAAAQQiACC2NvBwJupklS7OW3YgqTN9msIyHHlqSZJgmU0bNzZnUAABAwhBg5gAAAAAAAEEIlEgdUp3tQP8ug/YDwoagibtZ2T/mp2bthtIXUDUyfS+JFkhBycqmiXx/+1S+rBKLMiK6rE1tTcjhWqPFIHCZBf4ipIuCQDVXEk5CwAAAAA=" + "tx": "02000000014ef7fbec78160e41ac53e32bb7d4d491222070cf719bd236a03a27109a306ced0100000000fdffffff0240420f0000000000220020c9ea2c65ca8cdc27bc130fe11f5e52e175475e0e31b645b1dcc3832dc4f7e78dc22d890000000000225120774b1c2a9b4b0a9dce43b46395940da2001115d400fa3667909ec86a5d36518b4e000000", + "txid": "e9a218878137adf2d34a8ef69151d6e288cc9b9a23f6a5e8ace1b43f03409358", + "psbt": "cHNidP8BAgQCAAAAAQMETgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQCJAgAAAAGXS8Ixc7e8qbBg2sEqvRuxWOjtaaPnTU9q9ZGbFfV3LAEAAAAA/f///wIAAAABAAAAACIAIK3FrtULzhOyHEfz8OsBSBYev0y8KHio6OXlKIu7Ls7BQYOYAAAAAAAiUSCB2g0+MFETWoni+dheLq32YflZv7BeZxCXhUZyz9CsfZUAAAABAStBg5gAAAAAACJRIIHaDT4wURNaieL52F4urfZh+Vm/sF5nEJeFRnLP0Kx9AQ4gTvf77HgWDkGsU+Mrt9TUkSIgcM9xm9I2oDonEJowbO0BDwQBAAAAARAE/f///wETQIRl9k9MarVBCdz+jTkHVLk/f0KpyiwelXb3+0KqyEUNKPpgLxiJskis5PEsQfEjatvrDCm8cl1CnutfbKUUTGchFj18QoLm8cGIAvZg2m5imDGNd1eXeMkHqXmSe1Qr1BaiCQBA0fojAAAAAAABAwhAQg8AAAAAAAEEIgAgyeosZcqM3Ce8Ew/hH15S4XVHXg4xtkWx3MODLcT3540AAQMIwi2JAAAAAAABBCJRIHdLHCqbSwqdzkO0Y5WUDaIAERXUAPo2Z5CeyGpdNlGLIQeEMcD3iRgEiqSnJRphfipArfPS8md+1DjVMvR3UrU8wwkA1WaCQwYAAAAA" } } ] diff --git a/doc/schemas/lightning-unreserveinputs.json b/doc/schemas/lightning-unreserveinputs.json index 9ced63445e58..4aedcce8f43f 100644 --- a/doc/schemas/lightning-unreserveinputs.json +++ b/doc/schemas/lightning-unreserveinputs.json @@ -126,28 +126,21 @@ "id": "example:unreserveinputs#1", "method": "unreserveinputs", "params": { - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQDeAgAAAAABAXyy20ynmOFyRbegGyApk50yNIAb4C+RKV5c2n5VKL3lAAAAAAD9////Akf0EAAAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WUs/fQpAQAAABYAFN9HebR4q6498ytdeRKjC64CkCOMAkcwRAIgSTJCpWVH1FLZYPdwFe7gZckxCtk+AxPp20KUVKqPIdUCIA3hkoUco68vffiwt6TrE3KgX09JE9m7PDUUgrHQANMRASEDBOBlCza/8qXE5q8uJ+OWsKscDERWfdA+LLCa/lwMH0BlAAAAAQEfR/QQAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZSICA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPRzBEAiBKjSasyN29ODqXSemEQCZfRIvbJP8thKRBrd4e+NLEMQIgMGNz3+DWDnLmjnIDCaVcC7BKxuycwvtJq1qlKFtTaXcBIgYD10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8IAfrZCgAAAAABDiAoXS6QUlCcOApG/j+hr4OhNt0tT4GvCzI6z16Hepi7OwEPBAAAAAABEAT9////AAEDCCN6CAAAAAAAAQQWABQfJ4Qjje0sa2yGBz++6jkM2hGRmAz8CWxpZ2h0bmluZwQCAAEAAQMIinkIAAAAAAABBCJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aIQeRRTKBKkQKTXZscc05GTaUo0CuEeAS5boa2e+6bnbKUwkAwsyrFwIAAAAA", + "psbt": "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AahhAAAAAAAAIlEg+3d9jpNmK0getyg5W+Mp31CPIRDKcJg/mZs/uaVrQ+GZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA", "reserve": 200 } }, "response": { - "reservations": [ - { - "txid": "3bbb987a875ecf3a320baf814f2ddd36a183afa13ffe460a389c5052902e5d28", - "vout": 0, - "was_reserved": true, - "reserved": false - } - ] + "reservations": [] } }, { "request": { "id": "example:unreserveinputs#2", "method": "unreserveinputs", - "params": { - "psbt": "cHNidP8BAF4CAAAAAVa79WPJoiYrzo/RgzIAn5HanoBFZo0vZvEjxPAVwLv4AAAAAAD9////AXzpHAAAAAAAIlEgBRjpLNlOD2LAbxJt/5i5q+ebfthFoVbVJFZ44mVUR11mAAAAAAEA3gIAAAAAAQENwcSElLyC0jcwUHiODBhtapHyzIdiwytOGiu/Raf4BwAAAAAA/f///wKAhB4AAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFl82znKQEAAAAWABQyIWyAI6LDf6dJ58BDPdkh+PWUZwJHMEQCIGiJFhVi/d/Hz19Cz48uHTjhgBJ6WAlgl/bLVS7A6VtxAiAwlb7xYzIM4uopFvMnpOmGIOp3+upOPPF2F8VaB8U/HQEhA6BAjey7RADP4ifoh2VXhX7QXkh+sZqozv1EPuU5TxZmZQAAAAEBH4CEHgAAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WUAAA==" - } + "params": [ + "cHNidP8BAF4CAAAAAZiQf/mEs4NcFFfD4K8xauOgSpbz/xeetoXVWAPCI0h6AQAAAAD9////AfZRxQsAAAAAIlEg21kTTo7K2doCG6F2JqgaDjc1kRCrH7AL08oPVVJhuE+ZAAAAAAEAiQIAAAABswU80whDZOoIHS/lfyxwmHh5USHBwbcjWHaJ9/XU+78BAAAAAP3///8CgIQeAAAAAAAiACDJvFwGPK7796bHgUQHtWJ7T4GotW7L6TLGgvnLrA0Z32INzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAQErYg3NCwAAAAAiUSDJGD7ekSHzxv0UmIIsR6dgJzInZpyQlQiEO6xbvYE/aAAA" + ] }, "response": { "reservations": [] diff --git a/doc/schemas/lightning-upgradewallet.json b/doc/schemas/lightning-upgradewallet.json index 15e2d87785c6..a7c5e1befffa 100644 --- a/doc/schemas/lightning-upgradewallet.json +++ b/doc/schemas/lightning-upgradewallet.json @@ -99,9 +99,9 @@ } }, "response": { - "tx": "0200000001c08ce0a9ea1e00179ea603cb8619ec2a2df990ef931e1ccd87fa7a0e271ed8370100000000fdffffff013514310100000000225120888ab14b6e1655d1d00039b836d70b66e3351543ab6cd2f94166255f3d5e6cb5cf000000", - "txid": "de5f1d6f0b2f95cfe5cfbf8cc33bd3f279a8f800ee0efc27bbfafb2b6ead9560", - "psbt": "cHNidP8BAgQCAAAAAQMEzwAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQDgAgAAAAABAZRZ0m0kaJA+ubJw1eYurGROu1BYc0i7l9xbyG06R6uZAQAAAAD9////AmQtPCgBAAAAF6kUnoGu9IUv0FGnzol3Lb/BNBNkOViHAC0xAQAAAAAXqRRlVyjzbP420BqlDTI2cERp+EpVQIcCRzBEAiBliJpjBsipwFgsLZMlzbESZ6hMTh+pgKQlXUIL0nLb3wIga/xwr/IJgEc7Ie6ApS4aVDr9xr1TZ3wj+8bRvI6WqScBIQPgYuc48PzUufScX6A6YOsdmJwn+bAQjLZ/g9jhQYduHM4AAAABASAALTEBAAAAABepFGVXKPNs/jbQGqUNMjZwRGn4SlVAhyICArnAxoROEqUxyWjlXFUHjsFtm/dr6SkP2H0cynK0g5oXRzBEAiBlTUNYfS5n5rGRVmoNb0z3AMGJjHijwpXROGIVxfoBnQIgeTx32KY3CcfYTYzXUIRQAMUQB7rlPWRptWMDD3UttkcBAQQWABTWuWnTbf/a2YaRk/Zj7kgN/cc0iCIGArnAxoROEqUxyWjlXFUHjsFtm/dr6SkP2H0cynK0g5oXCNa5adMAAAAAAQ4gwIzgqeoeABeepgPLhhnsKi35kO+THhzNh/p6Dice2DcBDwQBAAAAARAE/f///wABAwg1FDEBAAAAAAEEIlEgiIqxS24WVdHQADm4NtcLZuM1FUOrbNL5QWYlXz1ebLUhByjMj8l44gnxaV+ltWVQYdsaqyMRtSQXaUW/EBXvLUuJCQCftnv8BwAAAAA=", + "tx": "0200000001e3148821838724c371613dfe954620b99b689803f29b17e33b85f655afc812170000000000fdffffff0135143101000000002251206c27e1956acfa61e68292c80908880e813450f754132e8a2ac471a86bf1326b566000000", + "txid": "52b8957df7b017c4c187641491b80ca209c52b286eba60afac7292a868fdf9d0", + "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQBzAgAAAAEJawGuY9Yx4yHwOdSd9MWwVc46+mVaPVwiwqhZT0H1zQAAAAAA/f///wIALTEBAAAAABepFGVXKPNs/jbQGqUNMjZwRGn4SlVAh3HE1CgBAAAAF6kUfN+wjm5E/BFSxPQjIl0rcUgkip2HZQAAAAEBIAAtMQEAAAAAF6kUZVco82z+NtAapQ0yNnBEafhKVUCHIgICucDGhE4SpTHJaOVcVQeOwW2b92vpKQ/YfRzKcrSDmhdHMEQCIBsJrbJqp2dLLklUvvheXUy1uu4eIMkebSbbYkQHWItOAiBEuulzciFVMVB7Rkt5eOb53CX5hq7Vq2LbwBHB6ApUTwEBBBYAFNa5adNt/9rZhpGT9mPuSA39xzSIIgYCucDGhE4SpTHJaOVcVQeOwW2b92vpKQ/YfRzKcrSDmhcI1rlp0wAAAAABDiDjFIghg4ckw3FhPf6VRiC5m2iYA/KbF+M7hfZVr8gSFwEPBAAAAAABEAT9////AAEDCDUUMQEAAAAAAQQiUSBsJ+GVas+mHmgpLICQiIDoE0UPdUEy6KKsRxqGvxMmtSEHWnm7u0BtS8KN8F+mqHMoz7AqfhN0O+zc0d/P4HHC4BAJAH0I2ZcFAAAAAA==", "upgraded_outs": 1 } } diff --git a/doc/schemas/lightning-utxopsbt.json b/doc/schemas/lightning-utxopsbt.json index d6d8881459e7..2fca19e57fe4 100644 --- a/doc/schemas/lightning-utxopsbt.json +++ b/doc/schemas/lightning-utxopsbt.json @@ -206,23 +206,35 @@ "request": { "id": "example:utxopsbt#1", "method": "utxopsbt", - "params": { - "satoshi": 0, - "feerate": "253perkw", - "startweight": 0, - "utxos": [ - "d82a99192fb333106ea8d08f5231ed45f2ed5b1ef9eb81b0fef8f9ea354d2637:1" + "params": [ + 1000000, + "15000perkw", + 214, + [ + "bffbd4f5f789765823b7c1c12151797898702c7fe52f1d08ea644308d33c05b3:1" ], - "reserve": 0, - "reservedok": true, - "excess_as_change": false - } + null, + true, + null, + null, + true + ] }, "response": { - "psbt": "cHNidP8BADMCAAAAATcmTTXq+fj+sIHr+R5b7fJF7TFSj9CobhAzsy8ZmSrYAQAAAAD9////AGYAAAAAAQDeAgAAAAABAWQACJva49ga8OCYXvPRWQRhoXndrJykwjgXbwT251dEAAAAAAD9////AiOI9ikBAAAAFgAU3gClv/YpAKRpfDuiFu6mIL2E4+5QaQ8AAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFlAkcwRAIgUXIQFs7oRkorVThUn3sLj7WI7g8c8RHai4ChoCvIkWsCICp1CqHl4BlMJCKFHRWHXhhekaj0r1EFSNrh8UnvysQPASEDqHIAEdaH3H6pb3VJzbJNDG4lL8PTfsheL+h2p6baK3JlAAAAAQEfUGkPAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZQA=", - "feerate_per_kw": 253, - "estimated_final_weight": 271, - "excess_msat": 1009932000 + "psbt": "cHNidP8BAF4CAAAAAbMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQAAAAD9////AUFZ3AsAAAAAIlEgO+E35aPNS3YQRaiMByjTJDUYNvBO1Z39o3m42EZGUreYAAAAAAEAcQIAAAABl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywAAAAAAP3///8Ceh/00gAAAAAWABSauB3UBW2CVXly9l1sU6aMmVAq+ADC6wsAAAAAFgAUA8/shxXh9ASjbsAR5COPhjKfkJyXAAAAAQEfAMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnAAA", + "feerate_per_kw": 15000, + "estimated_final_weight": 657, + "excess_msat": 0, + "change_outnum": 0, + "reservations": [ + { + "txid": "bffbd4f5f789765823b7c1c12151797898702c7fe52f1d08ea644308d33c05b3", + "vout": 1, + "was_reserved": true, + "reserved": true, + "reserved_to_block": 2240 + } + ] } }, { @@ -230,36 +242,29 @@ "id": "example:utxopsbt#2", "method": "utxopsbt", "params": { - "satoshi": 1000000, - "feerate": "7500perkw", - "startweight": 0, + "satoshi": 2000000, + "feerate": "18750perkw", + "startweight": 214, "utxos": [ - "2fc3b9f8d4aed120f6d9a6f206f07c35ef4d518ec0305d1d974873d256e38ca7:1", - "2f669f6a605ee5c7ddd2abb753bc64b1a90bd1b7448264f5d78a7ca823c00a1b:1" + "bffbd4f5f789765823b7c1c12151797898702c7fe52f1d08ea644308d33c05b3:1" ], "reservedok": true, - "excess_as_change": false + "excess_as_change": true } }, "response": { - "psbt": "cHNidP8BAFwCAAAAAqeM41bSc0iXHV0wwI5RTe81fPAG8qbZ9iDRrtT4ucMvAQAAAAD9////GwrAI6h8itf1ZIJEt9ELqbFkvFO3q9Ldx+VeYGqfZi8BAAAAAP3///8AZgAAAAABAN4CAAAAAAEBEaK0TQ97IsrzuO1gLt+vYbvLBG90NrCOZp7SCgrRknYAAAAAAP3///8CM6/2KQEAAAAWABQ1B/KkIVbg7yFRcCEN/VOptfOX/EBCDwAAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WUCRzBEAiA1oI1us81XEa/DRlvcP2qnbWLsV5pZcRfvj9MLyT202gIgb7noMqHYWMmm7H7VNEfWa29jjtuV9yrrSc9ui11ECQ0BIQKhZOHR4gFKMu2EKKgZ/7qnhzq9PvhtnAW2sxPZ4c9RIWUAAAABAR9AQg8AAAAAABYAFAH62Qq81maX4lkhZHIt5KlevuFlAAEA3gIAAAAAAQGnjONW0nNIlx1dMMCOUU3vNXzwBvKm2fYg0a7U+LnDLwAAAAAA/f///wJmbOcpAQAAABYAFOwPo5eUrDF7UgZBFQLRHOeX6PiGQEIPAAAAAAAWABTCzKsXHCpb6dq1LsQbglhjAkxUZgJHMEQCICgjGlauGj2eiMS4MWUK6zAWqMe1OuidQR+Hy9ZgSTuzAiA8JTb9OrLqS3hiWtT+TQ/NBsKJ2hhHLDaKUUNdgi4OkAEhA9g3oH5ejmGIqUY2ZWxc8YWF2+T+XpE/6oC40Cx3+e97ZQAAAAEBH0BCDwAAAAAAFgAUwsyrFxwqW+natS7EG4JYYwJMVGYA", - "feerate_per_kw": 7500, - "estimated_final_weight": 542, - "excess_msat": 995935000, + "psbt": "cHNidP8BAF4CAAAAAbMFPNMIQ2TqCB0v5X8scJh4eVEhwcG3I1h2iff11Pu/AQAAAAD9////AWINzQsAAAAAIlEgyRg+3pEh88b9FJiCLEenYCcyJ2ackJUIhDusW72BP2iYAAAAAAEAcQIAAAABl0vCMXO3vKmwYNrBKr0bsVjo7Wmj501PavWRmxX1dywAAAAAAP3///8Ceh/00gAAAAAWABSauB3UBW2CVXly9l1sU6aMmVAq+ADC6wsAAAAAFgAUA8/shxXh9ASjbsAR5COPhjKfkJyXAAAAAQEfAMLrCwAAAAAWABQDz+yHFeH0BKNuwBHkI4+GMp+QnAAA", + "feerate_per_kw": 18750, + "estimated_final_weight": 657, + "excess_msat": 0, + "change_outnum": 0, "reservations": [ { - "txid": "2fc3b9f8d4aed120f6d9a6f206f07c35ef4d518ec0305d1d974873d256e38ca7", - "vout": 1, - "was_reserved": true, - "reserved": true, - "reserved_to_block": 246 - }, - { - "txid": "2f669f6a605ee5c7ddd2abb753bc64b1a90bd1b7448264f5d78a7ca823c00a1b", + "txid": "bffbd4f5f789765823b7c1c12151797898702c7fe52f1d08ea644308d33c05b3", "vout": 1, "was_reserved": true, "reserved": true, - "reserved_to_block": 246 + "reserved_to_block": 2312 } ] } diff --git a/doc/schemas/lightning-wait.json b/doc/schemas/lightning-wait.json index 3e9c1d2f457c..adca69fbb4bf 100644 --- a/doc/schemas/lightning-wait.json +++ b/doc/schemas/lightning-wait.json @@ -317,17 +317,12 @@ "params": { "subsystem": "invoices", "indexname": "created", - "nextvalue": 1 + "nextvalue": 0 } }, "response": { "subsystem": "invoices", - "created": 1, - "details": { - "status": "unpaid", - "label": "invlabel", - "bolt11": "lnbcrt420p1pjmxtevsp5d8c6gnaj8lyjy2qly783vklda9dfaqeyzyc37agxxp8h3uguv8pqpp5w6lhwxhqnuew4hle5h7qwjm27zz784mvsrzhmayhscy5t2hy5c4qdqvd9h8ver9wd3sxqyjw5qcqp99qxpqysgq09gxhjhwu9u3z6dlt5ln5f4g8zl78wz4pgh0am3kz54m9lllhqckf4gmhmt2ftrclq5x62zkqmggc7y0ju0ghdfwjz8hyd8l5cqvemgpyyhm6w" - } + "created": 15 } }, { @@ -335,16 +330,19 @@ "id": "example:wait#2", "method": "wait", "params": { - "subsystem": "invoices", - "indexname": "updated", - "nextvalue": 2 + "subsystem": "sendpays", + "indexname": "created", + "nextvalue": 15 } }, "response": { - "subsystem": "invoices", - "updated": 2, + "subsystem": "sendpays", + "created": 15, "details": { - "status": "expired" + "status": "pending", + "partid": 0, + "groupid": 1, + "payment_hash": "4c6f04eaf19dd956b616f1ba8718df40e387c4a56be36cf4e881a009cbf66899" } } }, @@ -352,20 +350,20 @@ "request": { "id": "example:wait#3", "method": "wait", - "params": { - "subsystem": "sendpays", - "indexname": "updated", - "nextvalue": 2 - } + "params": [ + "sendpays", + "updated", + 15 + ] }, "response": { "subsystem": "sendpays", - "updated": 2, + "updated": 15, "details": { "status": "complete", "partid": 0, "groupid": 1, - "payment_hash": "220dcfcf43e1fab3ce30f70eb943c3ce962393f5a65ced52d749e324b443d19e" + "payment_hash": "4c6f04eaf19dd956b616f1ba8718df40e387c4a56be36cf4e881a009cbf66899" } } } diff --git a/doc/schemas/lightning-waitanyinvoice.json b/doc/schemas/lightning-waitanyinvoice.json index f8444b0b6871..cedc2e4ee25b 100644 --- a/doc/schemas/lightning-waitanyinvoice.json +++ b/doc/schemas/lightning-waitanyinvoice.json @@ -233,19 +233,17 @@ "params": {} }, "response": { - "label": "inv1", - "bolt11": "lnbcrt10n1pjmxtsxsp56sn02x8lccjfsvunnhz5858zuyxztug9luy226w4qsmfm4r8pkcspp5gw5r0dw99yf3zqxrg24l8g9m9hun9cu06ldg4rga8s9t9kv8z45sdq8d9h8vvgxqyjw5qcqp99qxpqysgqv537uh2sx8ch640mf4t43t8qjtpg3z7gukgm07tlyq986m7nvsnxkapg37z4vsxtl4thfqzc64anqr83geygkc2xaftxgr97dltqfjqpe3mhja", - "payment_hash": "43a837b5c529131100c342abf3a0bb2df932e38fd7da8a8d1d3c0ab2d9871569", - "amount_msat": 1000, + "label": "lbl balance l1 to l2", + "bolt11": "lnbcrt5m1pn2s39ksp53sknyy2mxxurt4y0wqgp730z0cnm0vz3zmzth8p79xsrtmg5llxspp5dp94v59nm6c99jf7lc07zmnhqw6kyujx3mkdav7643dczgtdedfqdpcv3jhxcmjd9c8g6t0dcs8xetwvss8xmmdv5s8xct5wvsxcvfqw3hjqmpjxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqqduqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgqdz9cftkxe6kcqfddyrvr7j57ulsfxxxkgkjyhr3k77n8v59mzs5rmuexz9lxusyhhehlemd9ujclgahln8e0n8y86stc7u8uys6mjqgqerm6q4", + "payment_hash": "684b5650b3deb052c93efe1fe16e7703b56272468eecdeb3daac5b81216dcb52", + "amount_msat": 500000000, "status": "paid", "pay_index": 1, - "amount_received_msat": 1000, - "paid_at": 1706241546, - "payment_preimage": "a0c668998de14b975f33e1060b3efd7efc0bde784ac266ab667a1b2fddab3cd1", - "description": [ - "Inv1." - ], - "expires_at": 1706846342, + "amount_received_msat": 500000000, + "paid_at": 1722303671, + "payment_preimage": "bed4140e1db302720d7f9547dc9127d45b115080447cce7e23cfd00b60991831", + "description": "description send some sats l1 to l2", + "expires_at": 1722908470, "created_index": 1, "updated_index": 1 } @@ -255,24 +253,23 @@ "id": "example:waitanyinvoice#2", "method": "waitanyinvoice", "params": { - "lastpay_index": 3, + "lastpay_index": 1, "timeout": 0 } }, "response": { - "label": "inv4", - "bolt11": "lnbcrt10n1pja0tkmsp57j4z9zwvdsyh57unh3da7aac5z20clfnrwy5nqm6wujaelduw23qpp580mdrwakz9xewc2vhvpucset9gjkgdvyhw7h9frcy2d6p2lwdw2qdq8d9h8vdqxqyjw5qcqp99qxpqysgqtgyzhtxs3p2dyk8wk9q028033303702d2hml4frmu38qe79mrkgzgxvyjmq2q4nhjgcuz3uhmlda3jnhf9w6mj8mj97pkgnda9l5kdcqsdgewf", - "payment_hash": "3bf6d1bbb6114d97614cbb03cc432b2a25643584bbbd72a478229ba0abee6b94", - "amount_msat": 1000, + "label": "lbl_l23", + "bolt11": "lnbcrt1pn2s38zsp5lv49w44a8tvkwtkxfxwts8rnr864u59srp7sxuua3haahdhlhtrqpp5p928w8rmsg2hjeymedcn54vxhsz372qhcedgf003nmsknhx9594sdqcdserxgryv4ekxunfwp6xjmmwxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqt5h8te9lkn0jpdkhkmlkzs80aw7mt5kdm6jxmvddkavt3vj0vakkmfcs0hsde8y8g8za46sch2lp4jxy56u8ve25sgpgcsya0vp92sgphzw570", + "payment_hash": "0954771c7b821579649bcb713a5586bc051f2817c65a84bdf19ee169dcc5a16b", "status": "paid", - "pay_index": 4, - "amount_received_msat": 1000, - "paid_at": 1708633825, - "payment_preimage": "77336a342dde76050c7ee7fc18599e407dfc1edad3c784ba68e9603004365b94", - "description": "inv4", - "expires_at": 1709238619, - "created_index": 4, - "updated_index": 4 + "pay_index": 2, + "amount_received_msat": 9900, + "paid_at": 1722303715, + "payment_preimage": "f3a3b40d63e62785f537aad60f93980914c5639872c7746299a6a1228abbc303", + "description": "l23 description", + "expires_at": 1722908514, + "created_index": 8, + "updated_index": 2 } } ] diff --git a/doc/schemas/lightning-waitblockheight.json b/doc/schemas/lightning-waitblockheight.json index 67c17257a86d..c86e13a44720 100644 --- a/doc/schemas/lightning-waitblockheight.json +++ b/doc/schemas/lightning-waitblockheight.json @@ -60,11 +60,12 @@ "id": "example:waitblockheight#1", "method": "waitblockheight", "params": { - "blockheight": 99 + "blockheight": 129, + "timeout": 600 } }, "response": { - "blockheight": 99 + "blockheight": 130 } }, { @@ -72,12 +73,11 @@ "id": "example:waitblockheight#2", "method": "waitblockheight", "params": { - "blockheight": 103, - "timeout": 600 + "blockheight": 131 } }, "response": { - "blockheight": 103 + "blockheight": 131 } } ] diff --git a/doc/schemas/lightning-waitinvoice.json b/doc/schemas/lightning-waitinvoice.json index 272c8b2903dc..5441593f9804 100644 --- a/doc/schemas/lightning-waitinvoice.json +++ b/doc/schemas/lightning-waitinvoice.json @@ -239,20 +239,42 @@ }, "response": { "label": "inv2", - "bolt11": "lnbcrt10n1pjmxtwjsp5mzvdu6v8hqsf2tlj0nlyks23afqp7ejs444syjxf74p60ztmld8qpp5q4ayz5pys3t0yj0dmkmh7ctarkv9z434paz4u9rdwnj4f43thhaqdq8d9h8vvsxqyjw5qcqp99qxpqysgqn0055ttns6pafsxh6xuqce6e4vz8gtxlzqx0l9d9f5crmqx4jymh4zy9jdaszm0dj89sq39fvhpwcs626dt0n3gw8kassfdehp5sy3sq7fzy3w", - "payment_hash": "057a4150248456f249edddb77f617d1d985156350f455e146d74e554d62bbdfa", - "amount_msat": 1000, + "bolt11": "lnbcrt20n1pn2s38fsp55xnux6tuzuutlqhekzytnexpqj6w3q00h6e7wu08ex43rdr4xqdqpp5znq67nu5secgcf79ncjtqfdpjfqh7acaxvngcqwqsvvxwnkyl35qdq8d9h8vvsxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgq9ptnru6v58v8qd58xdqypr86utn6fhssx8rwegsspfp9d975h0t47xn0hea6qrmy2ucxt4l02nkxu7va7d5lqgy8nrqmhxqpm5qauegqjjqr02", + "payment_hash": "14c1af4f9486708c27c59e24b025a192417f771d33268c01c08318674ec4fc68", + "amount_msat": 2000, "status": "paid", - "pay_index": 1, - "amount_received_msat": 1000, - "paid_at": 1706241494, - "payment_preimage": "34ccd37cc85e067cb376f9ea8c70d70469f58bf296f2566ed9ad4dfb70971a26", - "description": [ - "Inv2." - ], - "expires_at": 1706846290, - "created_index": 2, - "updated_index": 1 + "pay_index": 4, + "amount_received_msat": 2000, + "paid_at": 1722303723, + "payment_preimage": "1bda6e78384905bc476c6f50b447cf7fbba13a2644d49d85d797a826e8b9a6a0", + "description": "inv2", + "expires_at": 1722908521, + "created_index": 12, + "updated_index": 4 + } + }, + { + "request": { + "id": "example:waitinvoice#2", + "method": "waitinvoice", + "params": [ + "inv3" + ] + }, + "response": { + "label": "inv3", + "bolt11": "lnbcrt30n1pn2s38fsp5syqds2z0hgqgf3dcxt9kp5m2rtywxm4u4hr4xe90r885rr609vgqpp52y0xdhlzrua5clpuyw4wcfk9duxwwauzcjxrs9nj00258njmdjnsdq8d9h8vvcxqyjw5qcqp9rzjqdwjkyvjm7apxnssu4qgwhfkd67ghs6n6k48v6uqczgt88p6tky96qqq0vqqqqgqqyqqqqqpqqqqqzsqqc9qxpqysgqkkeex45p62vc7nfjywwfle8yhk9wemyktw2m7924cfmlthk37q6ptjd8vxyaevtejfj44yp55xllqlljxv5vz6wc3gc9jlfkwrkngscqtl0xs8", + "payment_hash": "511e66dfe21f3b4c7c3c23aaec26c56f0ce77782c48c3816727bd543ce5b6ca7", + "amount_msat": 3000, + "status": "paid", + "pay_index": 5, + "amount_received_msat": 3000, + "paid_at": 1722303725, + "payment_preimage": "86e637cb70631a0db88cc8f6ef9a21457b1b85be30236efb769a611b356225cd", + "description": "inv3", + "expires_at": 1722908521, + "created_index": 13, + "updated_index": 5 } } ] diff --git a/doc/schemas/lightning-waitsendpay.json b/doc/schemas/lightning-waitsendpay.json index 06201a5f49bb..05c91892e8bc 100644 --- a/doc/schemas/lightning-waitsendpay.json +++ b/doc/schemas/lightning-waitsendpay.json @@ -234,23 +234,22 @@ "id": "example:waitsendpay#1", "method": "waitsendpay", "params": { - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a" + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2" } }, "response": { - "created_index": 1, - "id": 1, - "payment_hash": "072b1d20f4a7c757a56d5fb10eaed40b58b68849da41fe396cdbd2d81692875a", + "created_index": 2, + "id": 2, + "payment_hash": "d598cfc62da16b381b8fb8af9833a24005f730e54cc32c317fecc511ffc6d2a2", "groupid": 1, - "updated_index": 1, - "destination": "022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59", - "amount_msat": 11000000, - "amount_sent_msat": 11000000, - "created_at": 1706152930, - "completed_at": 1706152933, + "updated_index": 2, + "destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d", + "amount_msat": 10000, + "amount_sent_msat": 10001, + "created_at": 1722303675, + "completed_at": 1722303677, "status": "complete", - "payment_preimage": "af7ba559629f719c04c43a82767fe3622790a539164d6270db07f765203e574b", - "bolt11": "lnbcrt110u1pjmr5lzsp5sfjyj3xn7ux592k36hmmt4ax98n6lgct22wvj54yck0upcmep63qpp5qu436g855lr40ftdt7csatk5pdvtdzzfmfqluwtvm0fds95jsadqdpq0pzk7s6j8y69xjt6xe25j5j4g44hsatdxqyjw5qcqp99qxpqysgquwma3zrw4cd8e8j4u9uh4gxukaacckse64kx2l9dqv8rvrysdq5r5dt38t9snqj9u5ar07h2exr4fg56wpudkhkk7gtxlyt72ku5fpqqd4fnlk" + "payment_preimage": "984a10782218478cd39e1f9a16795d756c337662067023a3b690bffdb1593f76" } } ] diff --git a/doc/schemas/lightning-withdraw.json b/doc/schemas/lightning-withdraw.json index 50a88e1940f7..ea23f4fd9946 100644 --- a/doc/schemas/lightning-withdraw.json +++ b/doc/schemas/lightning-withdraw.json @@ -104,14 +104,14 @@ "id": "example:withdraw#1", "method": "withdraw", "params": { - "destination": "bcrt1qjc7j2l5es4haw35c9jzm8dfm763ng5djp8f0s0", + "destination": "bcrt1qcqqvkswps3e6ck3jmqf86f9tcaeke5z04d3tv4", "satoshi": 555555 } }, "response": { - "tx": "0200000001ef28647baa13cc4c03b8a58c8bd08b69de434c22ff591eb68171ae992e3d816d0000000000fdffffff02237a080000000000160014963d257e99856fd746982c85b3b53bf6a33451b24d6808000000000022512063ffee4ea7d51e6cadf9086e286a2527922aaa25b8c53aebf32fa32a0a627f5a66000000", - "txid": "ccb97d7dc695cabb78b217c0b27d7d00d2941966199480e6443e0680d24d69eb", - "psbt": "cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQDeAgAAAAABAWPCRda9hy4QKqUEmtb7gK7SAqzh1xBP8nZ7PCj+7+JDAAAAAAD9////Akf0EAAAAAAAFgAUAfrZCrzWZpfiWSFkci3kqV6+4WUs/fQpAQAAABYAFOIj6yaI/g85utJBtkPPdK1X59cfAkcwRAIgH7J57HuUTpnCbDrDqE8W7ryuCXk+i/TszQ/NF55lWncCIDeN4y+EzIDP3l2XO5/wjk98krYqnzvEhrStk+0+fTowASEC6Ng5r5KTNIXBRRvjivsd8SKnHF59r/ViDj2+CLJVb75lAAAAAQEfR/QQAAAAAAAWABQB+tkKvNZml+JZIWRyLeSpXr7hZSICA9dFRFyTYmZfIuDZbp52byc/MmDeo5yKdr+gXdJoTdzPRzBEAiBY0urYSHLnnXaAJH7yaGfvGmm+VuNCNIBhQaJU6iDNEgIgA7EASW+V00Su+lRQAE3Qbe4wavLq7l6Jn2vR+6Snyd0BIgYD10VEXJNiZl8i4NlunnZvJz8yYN6jnIp2v6Bd0mhN3M8IAfrZCgAAAAABDiDvKGR7qhPMTAO4pYyL0Itp3kNMIv9ZHraBca6ZLj2BbQEPBAAAAAABEAT9////AAEDCCN6CAAAAAAAAQQWABSWPSV+mYVv10aYLIWztTv2ozRRsgz8CWxpZ2h0bmluZwQCAAEAAQMITWgIAAAAAAABBCJRIGP/7k6n1R5srfkIbihqJSeSKqoluMU66/MvoyoKYn9aIQeRRTKBKkQKTXZscc05GTaUo0CuEeAS5boa2e+6bnbKUwkAwsyrFwIAAAAA" + "tx": "0200000001187e8867dc9462f0acbf9b7ecad69c786bdb04bdc89eb0bea45db35f8cf7dd860000000000fdffffff02237a080000000000160014c000cb41c18473ac5a32d8127d24abc7736cd04f0636e30b0000000022512052021c61da23b2eda3d5000c6d812d0c9b088c237ed2a510abd94d8c3f7c421d20000000", + "txid": "faf2ac1e15fe8df73c411d404224cb481f01cabdde58df83c56d5d6050ec53a9", + "psbt": "cHNidP8BAgQCAAAAAQMEIAAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAGdA6aKwu4U7Zes8OwDJHp4bI3maidtrjOK6N85klZucAEAAAAA/f///wIAwusLAAAAABYAFCchPiIXtPVr0Ztsg5Pcn2G+aRIzQD/9EAEAAAAWABRz0UYcTRX0fJpAf766DfDa2wbGUGcAAAABAR8AwusLAAAAABYAFCchPiIXtPVr0Ztsg5Pcn2G+aRIzIgICB+wrNVNHEthq4DDdm/rsCOLd6h7Bzs/7lyXtessSq2ZHMEQCIEW+oeZvFbmuQidamye9/iuDhJ41SARdgZV8yWWjfq8vAiAS3no++NDmJjip3G/y4VTfQ/jiJv2jv9lQKqBUK9hQ0wEiBgIH7Cs1U0cS2GrgMN2b+uwI4t3qHsHOz/uXJe16yxKrZggnIT4iAAAAAAEOIBh+iGfclGLwrL+bfsrWnHhr2wS9yJ6wvqRds1+M992GAQ8EAAAAAAEQBP3///8AIgICLKJZZMteDpQ8BfcEOrSAECukrPM9dXeamXREWCtGR1AIwADLQQwAAAABAwgjeggAAAAAAAEEFgAUwADLQcGEc6xaMtgSfSSrx3Ns0E8M/AlsaWdodG5pbmcEAgABAAEDCAY24wsAAAAAAQQiUSBSAhxh2iOy7aPVAAxtgS0MmwiMI37SpRCr2U2MP3xCHSEHxKQ1JAGJOzVxgiryRaI4NGaYWWe35WSg4OUGHU+NcXEJAIvHqlwOAAAAAA==" } }, { @@ -119,19 +119,19 @@ "id": "example:withdraw#2", "method": "withdraw", "params": { - "destination": "bcrt1q66ukn5mdllddnp53j0mx8mjgph7uwdygn0uy45", + "destination": "bcrt1phtprcvhz842sxe8qw0yryvc0g6n6dw2puweklcpnfye273kjpfhs0d6d2e", "satoshi": "all", "feerate": "20000perkb", "minconf": 0, "utxos": [ - "218390859cf94d869e33f69161f4187a98f691afe868c20811528f589e90a61f:1" + "f2f4e67dbf2791a3b57dd986418156b116b452c5fc27b077da7c529db82f06f5:0" ] } }, "response": { - "tx": "02000000011fa6909e588f521108c268e8af91f6987a18f46191f6339e864df99c859083210100000000fdffffff0158070f0000000000160014d6b969d36dffdad9869193f663ee480dfdc7348867000000", - "txid": "ad9a712a201214c68c39ca5be68c9d153d1cac91e540d88aa3207b241e23acf8", - "psbt": "cHNidP8BAgQCAAAAAQMEZwAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQD9ZQECAAAAAAEBVa+m1d1amChv4Dwq1rVoS4KSm0BUUnVa3fUYcB3dH9oAAAAAAP////8CECcAAAAAAAAiUSBXeaBg8gDUDo+HGkDrkWFMxb+m0KX4UuBTQAp/7/hhUOEPDwAAAAAAIlEg7tdFgE2peEzCA/Vj76mf+lT98BsTe8lk5jwxJAcP++YEAEcwRAIgPsWO/4IxeW6OclDdXVnwL99X7B18sRlxgFqyvUAzN7gCIGOQOq0wZ6bV+wdYQP+9sH8IkfmqWZbQRRDkZEgfcprMAUcwRAIgb5/dI4+uVhluQjSA2q/3oAGxZd4vYzQWexfmcRQML7ECIFfgRwCaHYdyu5/H5moOPlfQlLc2gPgB6bgtfNSfRA6jAUdSIQIyQmbehAOzqxV6CfH3hNWHr2GDHJmMFRvMIbt0wrIxSyEC4704AJhmydqOxKqZzE6pxsDdRt8Vxh7wzh8nEpFxTldSrgAAAAABASvhDw8AAAAAACJRIO7XRYBNqXhMwgP1Y++pn/pU/fAbE3vJZOY8MSQHD/vmAQ4gH6aQnliPUhEIwmjor5H2mHoY9GGR9jOehk35nIWQgyEBDwQBAAAAARAE/f///wETQL0MqyYsx9Z9q14BhByMgWLW4oJHOqED5qcZ3wyJ4eDuLYfNGq6Ck30dAqFzJL4VhZLSuv87zN/1AEDNMl2DmTohFl03KAgp8YbLmVzcy/I4q0VkATk5c1E5YySjZXXfNN3/CQAHHEnKAAAAAAAiAgK5wMaEThKlMclo5VxVB47BbZv3a+kpD9h9HMpytIOaFwjWuWnTBAAAAAEDCFgHDwAAAAAAAQQWABTWuWnTbf/a2YaRk/Zj7kgN/cc0iAz8CWxpZ2h0bmluZwQCAAEA" + "tx": "0200000001f5062fb89d527cda77b027fcc552b416b156814186d97db5a39127bf7de6f4f20000000000fdffffff0119f70e0000000000225120bac23c32e23d550364e073c832330f46a7a6b941e3b36fe0334932af46d20a6f87000000", + "txid": "41dd478136c95acc82b7669fa4c70843da2ecd04baa7c53cbe8c73d0dd98e5c1", + "psbt": "cHNidP8BAgQCAAAAAQMEhwAAAAEEAQEBBQEBAQYBAwH7BAIAAAAAAQCJAgAAAAGxWGMGDX3aCdIKW4Vrs4nxXQD8LjoWZ2z3R6yqUp0MxAEAAAAA/f///wKSAA8AAAAAACJRIP2rfAH65wwI4LH5rKzKEQpTEh513FSiXnVCQW80Kur3QEIPAAAAAAAiACCWVeKnMwzYbcafjtGEWvVYDdBrFaeUA0yVceU9Vjmzl3oAAAABASuSAA8AAAAAACJRIP2rfAH65wwI4LH5rKzKEQpTEh513FSiXnVCQW80Kur3AQ4g9QYvuJ1SfNp3sCf8xVK0FrFWgUGG2X21o5Env33m9PIBDwQAAAAAARAE/f///wETQFj1/T/JtePk1+LfX9fAK4QBBwl1Xt1YmoE2cQOo/0hAvCLgwb5zSZCrDGAhxdSujHXyVo3a19wl+ayqa0/nckAhFr2SP8yeYDMCCkVocL4aDjUqc7hPoTIp/uS7zAf7okk6CQDK3xgoAAAAAAABAwgZ9w4AAAAAAAEEIlEgusI8MuI9VQNk4HPIMjMPRqemuUHjs2/gM0kyr0bSCm8hB6Jvzf+c2c5Qrvvj78smeIzuWAjjEtHW01YDo2je0daMCQBxtd2rDQAAAAz8CWxpZ2h0bmluZwQCAAEA" } } ] diff --git a/external/libwally-core b/external/libwally-core index ec348c884e93..11e1bf6d60a1 160000 --- a/external/libwally-core +++ b/external/libwally-core @@ -1 +1 @@ -Subproject commit ec348c884e93a2f993dff492794b30d903c5398c +Subproject commit 11e1bf6d60a13e82e1eeda307a776b3defa0a1d3 diff --git a/gossipd/seeker.c b/gossipd/seeker.c index 5fbd4073d685..cee9dda5cf58 100644 --- a/gossipd/seeker.c +++ b/gossipd/seeker.c @@ -209,23 +209,27 @@ static void disable_gossip_stream(struct seeker *seeker, struct peer *peer) queue_peer_msg(peer->daemon, &peer->id, take(msg)); } -static void enable_gossip_stream(struct seeker *seeker, struct peer *peer) +static void enable_gossip_stream(struct seeker *seeker, struct peer *peer, + bool ask_for_all) { u32 start; u8 *msg; + /* If we have no gossip, always ask for everything */ + if (!peer->daemon->gossip_store_populated) + ask_for_all = true; + /* Modern timestamp_filter is a trinary: 0 = all, FFFFFFFF = none, * other = from now on */ - if (seeker->daemon->gossip_store_populated) { + if (ask_for_all) { + start = 0; + } else { /* Just in case they care */ start = time_now().ts.tv_sec - GOSSIP_SEEKER_INTERVAL(seeker) * 10; - } else { - start = 0; } status_peer_debug(&peer->id, "seeker: starting gossip (%s)", - seeker->daemon->gossip_store_populated - ? "streaming" : "EVERTHING"); + ask_for_all ? "EVERYTHING" : "streaming"); /* This is allowed even if they don't understand it (odd) */ msg = towire_gossip_timestamp_filter(NULL, @@ -235,7 +239,7 @@ static void enable_gossip_stream(struct seeker *seeker, struct peer *peer) queue_peer_msg(peer->daemon, &peer->id, take(msg)); } -static void normal_gossip_start(struct seeker *seeker, struct peer *peer) +static void normal_gossip_start(struct seeker *seeker, struct peer *peer, bool ask_for_all) { bool enable_stream = false; @@ -259,7 +263,7 @@ static void normal_gossip_start(struct seeker *seeker, struct peer *peer) } if (enable_stream) - enable_gossip_stream(seeker, peer); + enable_gossip_stream(seeker, peer, ask_for_all); else disable_gossip_stream(seeker, peer); } @@ -286,11 +290,12 @@ static struct short_channel_id *unknown_scids_remove(const tal_t *ctx, } /* We have selected this peer to stream us startup gossip */ -static void peer_gossip_startup(struct seeker *seeker, struct peer *peer) +static void peer_gossip_startup(struct seeker *seeker, struct peer *peer, + bool ask_for_all) { status_peer_debug(&peer->id, "seeker: chosen as startup peer"); selected_peer(seeker, peer); - normal_gossip_start(seeker, peer); + normal_gossip_start(seeker, peer, ask_for_all); } static bool peer_has_gossip_queries(const struct peer *peer) @@ -804,7 +809,7 @@ static void check_firstpeer(struct seeker *seeker) return; } - peer_gossip_startup(seeker, peer); + peer_gossip_startup(seeker, peer, false); return; } @@ -823,7 +828,7 @@ static void check_firstpeer(struct seeker *seeker) if (p == peer) continue; - normal_gossip_start(seeker, p); + normal_gossip_start(seeker, p, false); } /* Ask a random peer for all channels, in case we're missing */ @@ -906,7 +911,7 @@ static void maybe_rotate_gossipers(struct seeker *seeker) disable_gossip_stream(seeker, seeker->gossiper[i]); set_gossiper: seeker->gossiper[i] = peer; - enable_gossip_stream(seeker, peer); + enable_gossip_stream(seeker, peer, false); } static bool seek_any_unknown_nodes(struct seeker *seeker) @@ -968,7 +973,7 @@ void seeker_setup_peer_gossip(struct seeker *seeker, struct peer *peer) switch (seeker->state) { case STARTING_UP: if (seeker->random_peer == NULL) - peer_gossip_startup(seeker, peer); + peer_gossip_startup(seeker, peer, true); /* Waiting for seeker_check to release us */ return; @@ -978,7 +983,7 @@ void seeker_setup_peer_gossip(struct seeker *seeker, struct peer *peer) case NORMAL: case ASKING_FOR_UNKNOWN_SCIDS: case ASKING_FOR_STALE_SCIDS: - normal_gossip_start(seeker, peer); + normal_gossip_start(seeker, peer, false); return; } abort(); diff --git a/hsmd/Makefile b/hsmd/Makefile index e7f6260382a7..8a788cef5715 100644 --- a/hsmd/Makefile +++ b/hsmd/Makefile @@ -26,6 +26,7 @@ HSMD_COMMON_OBJS := \ common/base32.o \ common/bigsize.o \ common/bip32.o \ + common/bolt12_id.o \ common/bolt12_merkle.o \ common/channel_id.o \ common/daemon.o \ diff --git a/hsmd/hsmd.c b/hsmd/hsmd.c index c41a0854696c..16bf1e09ac37 100644 --- a/hsmd/hsmd.c +++ b/hsmd/hsmd.c @@ -691,6 +691,7 @@ static struct io_plan *handle_client(struct io_conn *conn, struct client *c) case WIRE_HSMD_SIGN_MESSAGE: case WIRE_HSMD_SIGN_OPTION_WILL_FUND_OFFER: case WIRE_HSMD_SIGN_BOLT12: + case WIRE_HSMD_SIGN_BOLT12_2: case WIRE_HSMD_PREAPPROVE_INVOICE: case WIRE_HSMD_PREAPPROVE_KEYSEND: case WIRE_HSMD_PREAPPROVE_INVOICE_CHECK: @@ -746,6 +747,7 @@ static struct io_plan *handle_client(struct io_conn *conn, struct client *c) case WIRE_HSMD_SIGN_MESSAGE_REPLY: case WIRE_HSMD_GET_OUTPUT_SCRIPTPUBKEY_REPLY: case WIRE_HSMD_SIGN_BOLT12_REPLY: + case WIRE_HSMD_SIGN_BOLT12_2_REPLY: case WIRE_HSMD_PREAPPROVE_INVOICE_REPLY: case WIRE_HSMD_PREAPPROVE_KEYSEND_REPLY: case WIRE_HSMD_PREAPPROVE_INVOICE_CHECK_REPLY: diff --git a/hsmd/hsmd_wire.csv b/hsmd/hsmd_wire.csv index 24173fbec228..98faee7d4775 100644 --- a/hsmd/hsmd_wire.csv +++ b/hsmd/hsmd_wire.csv @@ -378,6 +378,21 @@ msgdata,hsmd_sign_bolt12,publictweak,u8,publictweaklen msgtype,hsmd_sign_bolt12_reply,125 msgdata,hsmd_sign_bolt12_reply,sig,bip340sig, +# Sign a bolt12-style merkle hash (modern) +msgtype,hsmd_sign_bolt12_2,41 +msgdata,hsmd_sign_bolt12_2,messagename,wirestring, +msgdata,hsmd_sign_bolt12_2,fieldname,wirestring, +msgdata,hsmd_sign_bolt12_2,merkleroot,sha256, +# This is for signing with an alias (temporary key), used if *publictweak* not empty. +# derive_secret with info, then tweak privkey with SHA256(derived_secret || publictweak). +msgdata,hsmd_sign_bolt12_2,infolen,u16, +msgdata,hsmd_sign_bolt12_2,info,u8,infolen +msgdata,hsmd_sign_bolt12_2,publictweaklen,u16, +msgdata,hsmd_sign_bolt12_2,publictweak,u8,publictweaklen + +msgtype,hsmd_sign_bolt12_2_reply,141 +msgdata,hsmd_sign_bolt12_2_reply,sig,bip340sig, + # Sign an option_will_fund offer hash msgtype,hsmd_sign_option_will_fund_offer,26 msgdata,hsmd_sign_option_will_fund_offer,funding_pubkey,pubkey, diff --git a/hsmd/libhsmd.c b/hsmd/libhsmd.c index 43c231e76761..d5ed6969a8ac 100644 --- a/hsmd/libhsmd.c +++ b/hsmd/libhsmd.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -136,6 +137,7 @@ bool hsmd_check_client_capabilities(struct hsmd_client *client, case WIRE_HSMD_SIGN_MESSAGE: case WIRE_HSMD_GET_OUTPUT_SCRIPTPUBKEY: case WIRE_HSMD_SIGN_BOLT12: + case WIRE_HSMD_SIGN_BOLT12_2: case WIRE_HSMD_PREAPPROVE_INVOICE: case WIRE_HSMD_PREAPPROVE_KEYSEND: case WIRE_HSMD_PREAPPROVE_INVOICE_CHECK: @@ -181,6 +183,7 @@ bool hsmd_check_client_capabilities(struct hsmd_client *client, case WIRE_HSMD_SIGN_MESSAGE_REPLY: case WIRE_HSMD_GET_OUTPUT_SCRIPTPUBKEY_REPLY: case WIRE_HSMD_SIGN_BOLT12_REPLY: + case WIRE_HSMD_SIGN_BOLT12_2_REPLY: case WIRE_HSMD_PREAPPROVE_INVOICE_REPLY: case WIRE_HSMD_PREAPPROVE_KEYSEND_REPLY: case WIRE_HSMD_PREAPPROVE_INVOICE_CHECK_REPLY: @@ -727,6 +730,21 @@ static u8 *handle_sign_option_will_fund_offer(struct hsmd_client *c, return towire_hsmd_sign_option_will_fund_offer_reply(NULL, &sig); } +static void payer_key_tweak(const struct pubkey *bolt12, + const u8 *publictweak, size_t publictweaklen, + struct sha256 *tweak) +{ + u8 rawkey[PUBKEY_CMPR_LEN]; + struct sha256_ctx sha; + + pubkey_to_der(rawkey, bolt12); + + sha256_init(&sha); + sha256_update(&sha, rawkey, sizeof(rawkey)); + sha256_update(&sha, publictweak, publictweaklen); + sha256_done(&sha, tweak); +} + /*~ lightningd asks us to sign a bolt12 (e.g. offer). */ static u8 *handle_sign_bolt12(struct hsmd_client *c, const u8 *msg_in) { @@ -783,6 +801,64 @@ static u8 *handle_sign_bolt12(struct hsmd_client *c, const u8 *msg_in) return towire_hsmd_sign_bolt12_reply(NULL, &sig); } +/*~ lightningd asks us to sign a bolt12 (e.g. offer): modern version */ +static u8 *handle_sign_bolt12_2(struct hsmd_client *c, const u8 *msg_in) +{ + char *messagename, *fieldname; + struct sha256 merkle, sha; + struct bip340sig sig; + secp256k1_keypair kp; + u8 *info; + u8 *tweakmessage; + + if (!fromwire_hsmd_sign_bolt12_2(tmpctx, msg_in, + &messagename, &fieldname, &merkle, + &info, &tweakmessage)) + return hsmd_status_malformed_request(c, msg_in); + + sighash_from_merkle(messagename, fieldname, &merkle, &sha); + + if (tweakmessage) { + struct secret base_secret; + struct sha256 tweak; + struct privkey tweakedkey; + + /* See handle_derive_secret: this gives a base secret. */ + hkdf_sha256(&base_secret, sizeof(base_secret), NULL, 0, + &secretstuff.derived_secret, + sizeof(secretstuff.derived_secret), + info, tal_bytelen(info)); + + /* This is simply SHA256(secret || tweakmessage) */ + bolt12_alias_tweak(&base_secret, + tweakmessage, tal_bytelen(tweakmessage), + &tweak); + + node_key(&tweakedkey, NULL); + if (secp256k1_ec_seckey_tweak_add(secp256k1_ctx, + tweakedkey.secret.data, + tweak.u.u8) != 1) + hsmd_status_failed(STATUS_FAIL_INTERNAL_ERROR, + "Couldn't tweak key."); + if (secp256k1_keypair_create(secp256k1_ctx, &kp, + tweakedkey.secret.data) != 1) + hsmd_status_failed(STATUS_FAIL_INTERNAL_ERROR, + "Failed to derive tweaked keypair"); + } else { + node_schnorrkey(&kp); + } + + if (!secp256k1_schnorrsig_sign32(secp256k1_ctx, sig.u8, + sha.u.u8, + &kp, + NULL)) { + return hsmd_status_bad_request_fmt(c, msg_in, + "Failed to sign bolt12"); + } + + return towire_hsmd_sign_bolt12_2_reply(NULL, &sig); +} + /*~ lightningd asks us to approve an invoice. This stub implementation * is overriden by fully validating signers that need to track invoice * payments. */ @@ -2075,6 +2151,8 @@ u8 *hsmd_handle_client_message(const tal_t *ctx, struct hsmd_client *client, return handle_sign_option_will_fund_offer(client, msg); case WIRE_HSMD_SIGN_BOLT12: return handle_sign_bolt12(client, msg); + case WIRE_HSMD_SIGN_BOLT12_2: + return handle_sign_bolt12_2(client, msg); case WIRE_HSMD_PREAPPROVE_INVOICE: case WIRE_HSMD_PREAPPROVE_INVOICE_CHECK: return handle_preapprove_invoice(client, msg); @@ -2167,6 +2245,7 @@ u8 *hsmd_handle_client_message(const tal_t *ctx, struct hsmd_client *client, case WIRE_HSMD_SIGN_MESSAGE_REPLY: case WIRE_HSMD_GET_OUTPUT_SCRIPTPUBKEY_REPLY: case WIRE_HSMD_SIGN_BOLT12_REPLY: + case WIRE_HSMD_SIGN_BOLT12_2_REPLY: case WIRE_HSMD_PREAPPROVE_INVOICE_REPLY: case WIRE_HSMD_PREAPPROVE_KEYSEND_REPLY: case WIRE_HSMD_PREAPPROVE_INVOICE_CHECK_REPLY: @@ -2197,6 +2276,7 @@ u8 *hsmd_init(struct secret hsm_secret, const u64 hsmd_version, WIRE_HSMD_CHECK_OUTPOINT, WIRE_HSMD_FORGET_CHANNEL, WIRE_HSMD_REVOKE_COMMITMENT_TX, + WIRE_HSMD_SIGN_BOLT12_2, WIRE_HSMD_PREAPPROVE_INVOICE_CHECK, WIRE_HSMD_PREAPPROVE_KEYSEND_CHECK, }; diff --git a/lightningd/Makefile b/lightningd/Makefile index 77f86286d4bc..b58ceaaaf018 100644 --- a/lightningd/Makefile +++ b/lightningd/Makefile @@ -89,6 +89,7 @@ LIGHTNINGD_COMMON_OBJS := \ common/bolt11.o \ common/bolt11_json.o \ common/bolt12.o \ + common/bolt12_id.o \ common/bolt12_merkle.o \ common/codex32.o \ common/channel_config.o \ @@ -115,7 +116,6 @@ LIGHTNINGD_COMMON_OBJS := \ common/htlc_trim.o \ common/htlc_tx.o \ common/htlc_wire.o \ - common/invoice_path_id.o \ common/key_derive.o \ common/keyset.o \ common/json_channel_type.o \ diff --git a/lightningd/chaintopology.c b/lightningd/chaintopology.c index 2066a1cead55..11bb3d3a07df 100644 --- a/lightningd/chaintopology.c +++ b/lightningd/chaintopology.c @@ -755,9 +755,7 @@ static struct command_result *json_feerates(struct command *cmd, static const struct json_command feerates_command = { "feerates", - "bitcoin", json_feerates, - "Return feerate estimates, either satoshi-per-kw ({style} perkw) or satoshi-per-kb ({style} perkb)." }; AUTODATA(json_command, &feerates_command); @@ -782,9 +780,7 @@ static struct command_result *json_parse_feerate(struct command *cmd, static const struct json_command parse_feerate_command = { "parsefeerate", - "bitcoin", json_parse_feerate, - "Return current feerate in perkw + perkb for given feerate string." }; AUTODATA(json_command, &parse_feerate_command); diff --git a/lightningd/channel.c b/lightningd/channel.c index a835db6554d9..2ef8209c315b 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -902,13 +902,19 @@ void channel_fail_permanent(struct channel *channel, struct lightningd *ld = channel->peer->ld; va_list ap; char *why; + /* Do we want to rebroadcast close transactions? If we're + * witnessing the close on-chain there is no point in doing + * this. */ + bool rebroadcast; va_start(ap, fmt); why = tal_vfmt(tmpctx, fmt, ap); va_end(ap); - log_unusual(channel->log, "Peer permanent failure in %s: %s", - channel_state_name(channel), why); + log_unusual(channel->log, + "Peer permanent failure in %s: %s (reason=%s)", + channel_state_name(channel), why, + channel_change_state_reason_str(reason)); /* We can have multiple errors, eg. onchaind failures. */ if (!channel->error) @@ -916,8 +922,15 @@ void channel_fail_permanent(struct channel *channel, &channel->cid, "%s", why); channel_set_owner(channel, NULL); - /* Drop non-cooperatively (unilateral) to chain. */ - drop_to_chain(ld, channel, false); + + /* Drop non-cooperatively (unilateral) to chain. If we detect + * the close from the blockchain (i.e., reason is + * REASON_ONCHAIN, or FUNDING_SPEND_SEEN) then we can observe + * passively, and not broadcast our own unilateral close, as + * it doesn't stand a chance anyway. */ + rebroadcast = !(channel->state == ONCHAIN || + channel->state == FUNDING_SPEND_SEEN); + drop_to_chain(ld, channel, false, rebroadcast); if (channel_state_wants_onchain_fail(channel->state)) channel_set_state(channel, diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index 55fc0296e09e..67f29ef3aedd 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -912,6 +912,27 @@ static void handle_update_inflight(struct lightningd *ld, wallet_inflight_save(ld->wallet, inflight); } +static void channel_record_splice(struct channel *channel, + struct amount_msat orig_our_msats, + struct amount_sat orig_funding_sats, + struct bitcoin_outpoint *funding, + u32 blockheight, struct bitcoin_txid *txid, const struct channel_inflight *inflight) +{ + struct chain_coin_mvt *mvt; + u32 output_count; + + output_count = inflight->funding_psbt->num_outputs; + mvt = new_coin_channel_close(tmpctx, &channel->cid, + txid, + funding, + blockheight, + orig_our_msats, + orig_funding_sats, + output_count, + /* is_splice = */true); + notify_chain_mvt(channel->peer->ld, mvt); +} + void channel_record_open(struct channel *channel, u32 blockheight, bool record_push) { struct chain_coin_mvt *mvt; @@ -1039,7 +1060,9 @@ bool channel_on_channel_ready(struct channel *channel, static void handle_peer_splice_locked(struct channel *channel, const u8 *msg) { - struct amount_sat funding_sats; + struct amount_sat funding_sats, prev_funding_sats; + struct amount_msat prev_our_msats; + struct bitcoin_outpoint prev_funding_out; s64 splice_amnt; struct channel_inflight *inflight; struct bitcoin_txid locked_txid; @@ -1054,16 +1077,22 @@ static void handle_peer_splice_locked(struct channel *channel, const u8 *msg) return; } - channel->our_msat.millisatoshis += splice_amnt * 1000; /* Raw: splicing */ - channel->msat_to_us_min.millisatoshis += splice_amnt * 1000; /* Raw: splicing */ - channel->msat_to_us_max.millisatoshis += splice_amnt * 1000; /* Raw: splicing */ - inflight = channel_inflight_find(channel, &locked_txid); if(!inflight) channel_internal_error(channel, "Unable to load inflight for" " locked_txid %s", fmt_bitcoin_txid(tmpctx, &locked_txid)); + /* Stash prev funding data so we can log it after scid is updated + * (to get the blockheight) */ + prev_our_msats = channel->our_msat; + prev_funding_sats = channel->funding_sats; + prev_funding_out = channel->funding; + + channel->our_msat.millisatoshis += splice_amnt * 1000; /* Raw: splicing */ + channel->msat_to_us_min.millisatoshis += splice_amnt * 1000; /* Raw: splicing */ + channel->msat_to_us_max.millisatoshis += splice_amnt * 1000; /* Raw: splicing */ + wallet_htlcsigs_confirm_inflight(channel->peer->ld->wallet, channel, &inflight->funding->outpoint); @@ -1085,6 +1114,16 @@ static void handle_peer_splice_locked(struct channel *channel, const u8 *msg) /* That freed watchers in inflights: now watch funding tx */ channel_watch_funding(channel->peer->ld, channel); + /* Log that funding output has been spent */ + channel_record_splice(channel, + prev_our_msats, + prev_funding_sats, + &prev_funding_out, + channel->scid ? + short_channel_id_blocknum(*channel->scid) : 0, + &locked_txid, + inflight); + /* 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. @@ -2198,31 +2237,19 @@ static struct command_result *json_splice_signed(struct command *cmd, static const struct json_command splice_init_command = { "splice_init", - "channels", json_splice_init, - "Init a channel splice to {channel_id} for {relative_amount} satoshis with {initialpsbt}. " - "Returns updated {psbt} with (partial) contributions from peer" }; AUTODATA(json_command, &splice_init_command); static const struct json_command splice_update_command = { "splice_update", - "channels", json_splice_update, - "Update {channel_id} currently active negotiated splice with {psbt}. " - "" - "Returns updated {psbt} with (partial) contributions from peer. " - "If {commitments_secured} is true, next call may be to splicechannel_finalize, " - "otherwise keep calling splice_update passing back in the returned PSBT until " - "{commitments_secured} is true." }; AUTODATA(json_command, &splice_update_command); static const struct json_command splice_signed_command = { "splice_signed", - "channels", json_splice_signed, - "Send our {signed_psbt}'s tx sigs for {channel_id}." }; AUTODATA(json_command, &splice_signed_command); @@ -2274,9 +2301,7 @@ static struct command_result *json_dev_feerate(struct command *cmd, static const struct json_command dev_feerate_command = { "dev-feerate", - "developer", json_dev_feerate, - "Set feerate for {id} to {feerate}", .dev_only = true, }; AUTODATA(json_command, &dev_feerate_command); @@ -2331,9 +2356,7 @@ static struct command_result *json_dev_quiesce(struct command *cmd, static const struct json_command dev_quiesce_command = { "dev-quiesce", - "developer", json_dev_quiesce, - "Initiate quiscence protocol with peer", .dev_only = true, }; AUTODATA(json_command, &dev_quiesce_command); diff --git a/lightningd/channel_gossip.c b/lightningd/channel_gossip.c index 4648d1ef3de9..696494032e39 100644 --- a/lightningd/channel_gossip.c +++ b/lightningd/channel_gossip.c @@ -1,4 +1,5 @@ #include "config.h" +#include #include #include #include @@ -135,6 +136,66 @@ static void check_channel_gossip(const struct channel *channel) fatal("Bad channel_gossip_state %u", cg->state); } +static void msg_to_peer(const struct peer *peer, const u8 *msg TAKES) +{ + struct lightningd *ld = peer->ld; + + /* Shutting down, or peer not connected? */ + if (ld->connectd && peer->connected == PEER_CONNECTED) { + subd_send_msg(ld->connectd, + take(towire_connectd_peer_send_msg(NULL, + &peer->id, + peer->connectd_counter, + msg))); + } + + if (taken(msg)) + tal_free(msg); +} + +static void addgossip_reply(struct subd *gossipd, + const u8 *reply, + const int *fds UNUSED, + char *desc) +{ + char *err; + + if (!fromwire_gossipd_addgossip_reply(reply, reply, &err)) + fatal("Reading gossipd_addgossip_reply for %s: %s", + desc, tal_hex(tmpctx, reply)); + + if (strlen(err)) + log_broken(gossipd->log, "gossipd rejected our %s: %s", desc, err); +} + +static void broadcast_new_gossip(struct lightningd *ld, + const u8 *msg TAKES, + struct amount_sat *known_channel, + const char *desc) +{ + struct peer *peer; + struct peer_node_id_map_iter it; + + if (taken(msg)) + tal_steal(tmpctx, msg); + + /* Tell gossipd about it */ + subd_req(ld->gossip, ld->gossip, + take(towire_gossipd_addgossip(NULL, msg, known_channel)), + -1, 0, addgossip_reply, cast_const(char *, desc)); + + /* Don't tell them if we're supposed to be suppressing gossip for tests */ + if (ld->dev_suppress_gossip) + return; + + /* Tell all our peers about it, too! */ + for (peer = peer_node_id_map_first(ld->peers, &it); + peer; + peer = peer_node_id_map_next(ld->peers, &it)) { + msg_to_peer(peer, msg); + } +} + /* Recursion */ static void cupdate_timer_refresh(struct channel *channel); @@ -182,24 +243,6 @@ static void set_public_cupdate(struct channel *channel, channel); } -static void msg_to_peer(const struct channel *channel, const u8 *msg TAKES) -{ - struct peer *peer = channel->peer; - struct lightningd *ld = peer->ld; - - /* Shutting down, or peer not connected? */ - if (ld->connectd && peer->connected == PEER_CONNECTED) { - subd_send_msg(ld->connectd, - take(towire_connectd_peer_send_msg(NULL, - &peer->id, - peer->connectd_counter, - msg))); - } - - if (taken(msg)) - tal_free(msg); -} - static enum channel_gossip_state init_public_state(struct channel *channel, const struct remote_announce_sigs *remote_sigs) { @@ -280,22 +323,7 @@ static void send_private_cupdate(struct channel *channel, bool even_if_redundant } cg->cupdate = sign_update(cg, channel->peer->ld, cupdate); - msg_to_peer(channel, cg->cupdate); -} - -static void broadcast_public_cupdate_addgossip_reply(struct subd *gossip UNUSED, - const u8 *reply, - const int *fds UNUSED, - struct channel *channel) -{ - char *err; - - if (!fromwire_gossipd_addgossip_reply(reply, reply, &err)) - fatal("Reading broadcast_public_cupdate_addgossip_reply: %s", - tal_hex(tmpctx, reply)); - - if (strlen(err)) - log_broken(channel->log, "gossipd rejected our channel update: %s", err); + msg_to_peer(channel->peer, cg->cupdate); } /* Send gossipd a channel_update, if not redundant. */ @@ -340,10 +368,7 @@ static void broadcast_public_cupdate(struct channel *channel, set_public_cupdate(channel, take(sign_update(NULL, channel->peer->ld, cupdate)), true); - - subd_req(ld->gossip, ld->gossip, - take(towire_gossipd_addgossip(NULL, cg->cupdate, NULL)), - -1, 0, broadcast_public_cupdate_addgossip_reply, channel); + broadcast_new_gossip(ld, cg->cupdate, NULL, "channel update"); } static void cupdate_timer_refresh(struct channel *channel) @@ -420,7 +445,6 @@ static void send_channel_announce_sigs(struct channel *channel) struct lightningd *ld = channel->peer->ld; struct sha256_double hash; secp256k1_ecdsa_signature local_node_sig, local_bitcoin_sig; - struct pubkey mykey; const u8 *ca, *msg; /* If it's already closing, don't bother. */ @@ -446,10 +470,7 @@ static void send_channel_announce_sigs(struct channel *channel) /* Double-check that HSM gave valid signatures. */ sha256_double(&hash, ca + offset, tal_count(ca) - offset); - if (!pubkey_from_node_id(&mykey, &ld->id)) - fatal("Could not convert own public key"); - - if (!check_signed_hash(&hash, &local_node_sig, &mykey)) { + if (!check_signed_hash(&hash, &local_node_sig, &ld->our_pubkey)) { channel_internal_error(channel, "HSM returned an invalid node signature"); return; @@ -464,22 +485,7 @@ static void send_channel_announce_sigs(struct channel *channel) msg = towire_announcement_signatures(NULL, &channel->cid, *channel->scid, &local_node_sig, &local_bitcoin_sig); - msg_to_peer(channel, take(msg)); -} - -static void send_channel_announce_addgossip_reply(struct subd *gossip UNUSED, - const u8 *reply, - const int *fds UNUSED, - struct channel *channel) -{ - char *err; - - if (!fromwire_gossipd_addgossip_reply(reply, reply, &err)) - fatal("Reading send_channel_announce_addgossip_reply: %s", - tal_hex(tmpctx, reply)); - - if (strlen(err)) - log_broken(channel->log, "gossipd rejected our channel announcement: %s", err); + msg_to_peer(channel->peer, take(msg)); } static void send_channel_announcement(struct channel *channel) @@ -513,9 +519,8 @@ static void send_channel_announcement(struct channel *channel) &cg->remote_sigs->node_sig, &cg->remote_sigs->bitcoin_sig); - subd_req(ld->gossip, ld->gossip, - take(towire_gossipd_addgossip(NULL, ca, &channel->funding_sats)), - -1, 0, send_channel_announce_addgossip_reply, channel); + /* Send everyone our new channel announcement */ + broadcast_new_gossip(ld, ca, &channel->funding_sats, "channel announcement"); /* We can also send our first public channel_update now */ broadcast_public_cupdate(channel, true); /* And maybe our first node_announcement */ @@ -655,7 +660,7 @@ void channel_gossip_got_announcement_sigs(struct channel *channel, u8 *warning = towire_warningfmt(NULL, &channel->cid, "You sent announcement_signatures for private channel"); - msg_to_peer(channel, take(warning)); + msg_to_peer(channel->peer, take(warning)); return; case CGOSSIP_NOT_USABLE: case CGOSSIP_NOT_DEEP_ENOUGH: @@ -1063,22 +1068,6 @@ static bool has_announced_channels(struct lightningd *ld) return false; } -static void node_announce_addgossip_reply(struct subd *gossipd, - const u8 *reply, - const int *fds UNUSED, - void *unused) -{ - char *err; - - if (!fromwire_gossipd_addgossip_reply(reply, reply, &err)) - fatal("Reading node_announce_addgossip_reply: %s", - tal_hex(tmpctx, reply)); - - if (strlen(err)) - log_broken(gossipd->ld->log, - "gossipd rejected our node announcement: %s", err); -} - void channel_gossip_node_announce(struct lightningd *ld) { u8 *nannounce; @@ -1116,8 +1105,6 @@ void channel_gossip_node_announce(struct lightningd *ld) tal_free(ld->node_announcement); ld->node_announcement = tal_steal(ld, nannounce); - /* Tell gossipd. */ - subd_req(ld->gossip, ld->gossip, - take(towire_gossipd_addgossip(NULL, nannounce, NULL)), - -1, 0, node_announce_addgossip_reply, NULL); + /* Tell gossipd and peers. */ + broadcast_new_gossip(ld, nannounce, NULL, "node announcement"); } diff --git a/lightningd/closed_channel.c b/lightningd/closed_channel.c index 0c1df3870761..8495ab8da430 100644 --- a/lightningd/closed_channel.c +++ b/lightningd/closed_channel.c @@ -117,8 +117,6 @@ static struct command_result *json_listclosedchannels(struct command *cmd, static const struct json_command listclosedchannels_command = { "listclosedchannels", - "network", json_listclosedchannels, - "Show historical (dead) channels." }; AUTODATA(json_command, &listclosedchannels_command); diff --git a/lightningd/closing_control.c b/lightningd/closing_control.c index b6d9a44d2698..de01d1737434 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) return; /* Channel gets dropped to chain cooperatively. */ - drop_to_chain(channel->peer->ld, channel, true); + drop_to_chain(channel->peer->ld, channel, true, true /* rebroadcast */); channel_set_state(channel, CLOSINGD_SIGEXCHANGE, CLOSINGD_COMPLETE, @@ -896,11 +896,6 @@ discard_unopened: { static const struct json_command close_command = { "close", - "channels", json_close, - "Close the channel with {id} " - "(either peer ID, channel ID, or short channel ID). " - "Force a unilateral close after {unilateraltimeout} seconds (default 48h). " - "If {destination} address is provided, will be used as output address." }; AUTODATA(json_command, &close_command); diff --git a/lightningd/coin_mvts.c b/lightningd/coin_mvts.c index 68bdde72ac59..74f940384fa5 100644 --- a/lightningd/coin_mvts.c +++ b/lightningd/coin_mvts.c @@ -13,7 +13,7 @@ void notify_channel_mvt(struct lightningd *ld, const struct channel_coin_mvt *mv timestamp = time_now().ts.tv_sec; cm = finalize_channel_mvt(mvt, mvt, chainparams->lightning_hrp, - timestamp, &ld->id); + timestamp, &ld->our_nodeid); notify_coin_mvt(ld, cm); } @@ -25,7 +25,7 @@ void notify_chain_mvt(struct lightningd *ld, const struct chain_coin_mvt *mvt) timestamp = time_now().ts.tv_sec; cm = finalize_chain_mvt(mvt, mvt, chainparams->lightning_hrp, - timestamp, &ld->id); + timestamp, &ld->our_nodeid); notify_coin_mvt(ld, cm); } @@ -114,7 +114,7 @@ void send_account_balance_snapshot(struct lightningd *ld, u32 blockheight) snap->blockheight = blockheight; snap->timestamp = time_now().ts.tv_sec; - snap->node_id = &ld->id; + snap->node_id = &ld->our_nodeid; /* Add the 'wallet' account balance */ snap->accts = tal_arr(snap, struct account_balance *, 1); diff --git a/lightningd/configs.c b/lightningd/configs.c index 015128c95f1c..4191e57ca6f8 100644 --- a/lightningd/configs.c +++ b/lightningd/configs.c @@ -327,13 +327,7 @@ static struct command_result *json_listconfigs(struct command *cmd, static const struct json_command listconfigs_command = { "listconfigs", - "utility", json_listconfigs, - "List all configuration options, or with [config], just that one.", - .verbose = "listconfigs [config]\n" - "Outputs an object, with each field a config options\n" - "(Option names which start with # are comments)\n" - "With [config], object only has that field" }; AUTODATA(json_command, &listconfigs_command); @@ -639,8 +633,6 @@ static struct command_result *json_setconfig(struct command *cmd, static const struct json_command setconfig_command = { "setconfig", - "utility", json_setconfig, - "Set a dynamically-adjustable config." }; AUTODATA(json_command, &setconfig_command); diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index 2073bddd327e..f470d74cf607 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -253,10 +253,7 @@ static struct command_result *json_connect(struct command *cmd, static const struct json_command connect_command = { "connect", - "network", json_connect, - "Connect to {id} at {host} (which can end in ':port' if not default). " - "{id} can also be of the form id@host" }; AUTODATA(json_command, &connect_command); @@ -756,7 +753,7 @@ int connectd_init(struct lightningd *ld) msg = towire_connectd_init(tmpctx, chainparams, ld->our_features, - &ld->id, + &ld->our_nodeid, wireaddrs, listen_announce, ld->proxyaddr, @@ -915,10 +912,7 @@ static struct command_result *json_sendcustommsg(struct command *cmd, static const struct json_command sendcustommsg_command = { "sendcustommsg", - "utility", json_sendcustommsg, - "Send a custom message to the peer with the given {node_id}", - .verbose = "sendcustommsg node_id hexcustommsg", }; AUTODATA(json_command, &sendcustommsg_command); @@ -933,15 +927,14 @@ static struct command_result *json_dev_suppress_gossip(struct command *cmd, subd_send_msg(cmd->ld->connectd, take(towire_connectd_dev_suppress_gossip(NULL))); + cmd->ld->dev_suppress_gossip = true; return command_success(cmd, json_stream_success(cmd)); } static const struct json_command dev_suppress_gossip = { "dev-suppress-gossip", - "developer", json_dev_suppress_gossip, - "Stop this node from sending any more gossip.", .dev_only = true, }; AUTODATA(json_command, &dev_suppress_gossip); @@ -962,9 +955,7 @@ static struct command_result *json_dev_report_fds(struct command *cmd, static const struct json_command dev_report_fds = { "dev-report-fds", - "developer", json_dev_report_fds, - "Ask connectd to report status of all its open files.", .dev_only = true, }; AUTODATA(json_command, &dev_report_fds); @@ -985,9 +976,7 @@ static struct command_result *json_dev_connectd_exhaust_fds(struct command *cmd, static const struct json_command dev_connectd_exhaust_fds = { "dev-connectd-exhaust-fds", - "developer", json_dev_connectd_exhaust_fds, - "Make connectd run out of file descriptors", .dev_only = true, }; AUTODATA(json_command, &dev_connectd_exhaust_fds); diff --git a/lightningd/datastore.c b/lightningd/datastore.c index b669e8ff6373..a08ad0e08c2f 100644 --- a/lightningd/datastore.c +++ b/lightningd/datastore.c @@ -345,32 +345,24 @@ static struct command_result *json_datastoreusage(struct command *cmd, static const struct json_command datastore_command = { "datastore", - "utility", json_datastore, - "Add a {key} and {hex}/{string} data to the data store", }; AUTODATA(json_command, &datastore_command); static const struct json_command deldatastore_command = { "deldatastore", - "utility", json_deldatastore, - "Remove a {key} from the data store", }; AUTODATA(json_command, &deldatastore_command); static const struct json_command listdatastore_command = { "listdatastore", - "utility", json_listdatastore, - "List the datastore, optionally only {key}", }; AUTODATA(json_command, &listdatastore_command); static const struct json_command datastoreusage_command = { "datastoreusage", - "utility", json_datastoreusage, - "List the datastore usage, starting from an optional {key}", }; AUTODATA(json_command, &datastoreusage_command); diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 6df9fd62fdf6..3b40c13f739a 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -3892,10 +3892,7 @@ static struct command_result *json_queryrates(struct command *cmd, static const struct json_command queryrates_command = { "dev-queryrates", - "channels", json_queryrates, - "Ask a peer what their contribution and liquidity rates are" - " for the given {amount} and {requested_amt}", .dev_only = true, }; @@ -3903,40 +3900,27 @@ AUTODATA(json_command, &queryrates_command); static const struct json_command openchannel_init_command = { "openchannel_init", - "channels", json_openchannel_init, - "Init an open channel to {id} with {initialpsbt} for {amount} satoshis. " - "Returns updated {psbt} with (partial) contributions from peer" }; static const struct json_command openchannel_update_command = { "openchannel_update", - "channels", json_openchannel_update, - "Update {channel_id} with {psbt}. " - "Returns updated {psbt} with (partial) contributions from peer. " - "If {commitments_secured} is true, next call should be to openchannel_signed" }; static const struct json_command openchannel_signed_command = { "openchannel_signed", - "channels", json_openchannel_signed, - "Send our {signed_psbt}'s tx sigs for {channel_id}." }; static const struct json_command openchannel_bump_command = { "openchannel_bump", - "channels", json_openchannel_bump, - "Attempt to bump the fee on {channel_id}'s funding transaction." }; static const struct json_command openchannel_abort_command = { "openchannel_abort", - "channels", json_openchannel_abort, - "Abort {channel_id}'s open. Usable while `commitment_signed=false`." }; AUTODATA(json_command, &openchannel_init_command); diff --git a/lightningd/forwards.c b/lightningd/forwards.c index 38a7a1419aab..1f314e4e5a3d 100644 --- a/lightningd/forwards.c +++ b/lightningd/forwards.c @@ -236,9 +236,7 @@ static struct command_result *json_listforwards(struct command *cmd, static const struct json_command listforwards_command = { "listforwards", - "channels", json_listforwards, - "List all forwarded payments and their information optionally filtering by [status], [in_channel] and [out_channel]" }; AUTODATA(json_command, &listforwards_command); @@ -301,8 +299,6 @@ static struct command_result *json_delforward(struct command *cmd, static const struct json_command delforward_command = { "delforward", - "channels", json_delforward, - "Delete a forwarded payment by [in_channel], [in_htlc_id] and [status]" }; AUTODATA(json_command, &delforward_command); diff --git a/lightningd/gossip_control.c b/lightningd/gossip_control.c index dd0ca83f54f5..13ec4e5ed44c 100644 --- a/lightningd/gossip_control.c +++ b/lightningd/gossip_control.c @@ -280,7 +280,7 @@ void gossip_init(struct lightningd *ld, int connectd_fd) NULL, chainparams, ld->our_features, - &ld->id, + &ld->our_nodeid, ld->dev_gossip_time ? &ld->dev_gossip_time: NULL, ld->dev_fast_gossip, ld->dev_fast_gossip_prune); @@ -370,11 +370,7 @@ static struct command_result *json_setleaserates(struct command *cmd, static const struct json_command setleaserates_command = { "setleaserates", - "channels", json_setleaserates, - "Called by plugin to set the node's present channel lease rates." - " Not to be set without having a plugin which can handle" - " `openchannel2` hooks.", }; AUTODATA(json_command, &setleaserates_command); @@ -422,9 +418,7 @@ static struct command_result *json_addgossip(struct command *cmd, static const struct json_command addgossip_command = { "addgossip", - "utility", json_addgossip, - "Inject gossip {message} into gossipd" }; AUTODATA(json_command, &addgossip_command); @@ -451,9 +445,7 @@ json_dev_set_max_scids_encode_size(struct command *cmd, static const struct json_command dev_set_max_scids_encode_size = { "dev-set-max-scids-encode-size", - "developer", json_dev_set_max_scids_encode_size, - "Set {max} bytes of short_channel_ids per reply_channel_range", .dev_only = true, }; AUTODATA(json_command, &dev_set_max_scids_encode_size); @@ -479,9 +471,7 @@ static struct command_result *json_dev_gossip_set_time(struct command *cmd, static const struct json_command dev_gossip_set_time = { "dev-gossip-set-time", - "developer", json_dev_gossip_set_time, - "Ask gossipd to update the current time.", .dev_only = true, }; AUTODATA(json_command, &dev_gossip_set_time); diff --git a/lightningd/gossip_generation.c b/lightningd/gossip_generation.c index f16b220f6e17..22877c9c0596 100644 --- a/lightningd/gossip_generation.c +++ b/lightningd/gossip_generation.c @@ -70,7 +70,7 @@ u8 *create_channel_announcement(const tal_t *ctx, copysig_or_zero(&bitcoin_signature[REMOTE], remote_bitcoin_signature); copysig_or_zero(&node_signature[LOCAL], local_node_signature); copysig_or_zero(&node_signature[REMOTE], remote_node_signature); - node_id[LOCAL] = channel->peer->ld->id; + node_id[LOCAL] = channel->peer->ld->our_nodeid; node_id[REMOTE] = channel->peer->id; funding_pubkey[LOCAL] = channel->local_funding_pubkey; funding_pubkey[REMOTE] = channel->channel_info.remote_fundingkey; @@ -104,7 +104,7 @@ u8 *unsigned_channel_update(const tal_t *ctx, * | 0 | `direction` | Direction this update refers to. | * | 1 | `disable` | Disable the channel. | */ - channel_flags = node_id_idx(&channel->peer->ld->id, + channel_flags = node_id_idx(&channel->peer->ld->our_nodeid, &channel->peer->id); if (!enabled) channel_flags |= ROUTING_FLAGS_DISABLED; @@ -372,7 +372,7 @@ static u8 *create_nannounce(const tal_t *ctx, towire_node_announcement(ctx, sig, ld->our_features->bits[NODE_ANNOUNCE_FEATURE], timestamp, - &ld->id, ld->rgb, ld->alias, + &ld->our_nodeid, ld->rgb, ld->alias, addresses, na_tlv); return announcement; diff --git a/lightningd/hsm_control.c b/lightningd/hsm_control.c index 93884a90fd2e..98ab7a316d0d 100644 --- a/lightningd/hsm_control.c +++ b/lightningd/hsm_control.c @@ -1,12 +1,12 @@ #include "config.h" #include #include +#include #include #include #include #include #include -#include #include #include #include @@ -48,7 +48,7 @@ int hsm_get_client_fd(struct lightningd *ld, int hsm_get_global_fd(struct lightningd *ld, u64 permissions) { - int fd = hsm_get_fd(ld, &ld->id, 0, permissions); + int fd = hsm_get_fd(ld, &ld->our_nodeid, 0, permissions); if (fd < 0) fatal("Could not read fd from HSM: %s", strerror(errno)); @@ -87,6 +87,7 @@ struct ext_key *hsm_init(struct lightningd *ld) int fds[2]; struct ext_key *bip32_base; u32 hsm_version; + struct pubkey unused; /* We actually send requests synchronously: only status is async. */ if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds) != 0) @@ -141,8 +142,8 @@ struct ext_key *hsm_init(struct lightningd *ld) if (fromwire_hsmd_init_reply_v4(ld, msg, &hsm_version, &ld->hsm_capabilities, - &ld->id, bip32_base, - &ld->bolt12_base)) { + &ld->our_nodeid, bip32_base, + &unused)) { /* nothing to do. */ } else { if (ld->config.keypass) @@ -150,6 +151,10 @@ struct ext_key *hsm_init(struct lightningd *ld) errx(EXITCODE_HSM_GENERIC_ERROR, "HSM did not give init reply"); } + if (!pubkey_from_node_id(&ld->our_pubkey, &ld->our_nodeid)) + errx(EXITCODE_HSM_GENERIC_ERROR, "HSM gave invalid node id %s", + fmt_node_id(tmpctx, &ld->our_nodeid)); + if (hsm_version < HSM_MIN_VERSION) errx(EXITCODE_HSM_GENERIC_ERROR, "HSM version %u below minimum %u", @@ -179,8 +184,8 @@ struct ext_key *hsm_init(struct lightningd *ld) /* This is equivalent to makesecret("bolt12-invoice-base") */ msg = towire_hsmd_derive_secret(NULL, tal_dup_arr(tmpctx, u8, - (const u8 *)INVOICE_PATH_BASE_STRING, - strlen(INVOICE_PATH_BASE_STRING), 0)); + (const u8 *)BOLT12_ID_BASE_STRING, + strlen(BOLT12_ID_BASE_STRING), 0)); if (!wire_sync_write(ld->hsm_fd, take(msg))) err(EXITCODE_HSM_GENERIC_ERROR, "Writing derive_secret msg to hsm"); @@ -188,6 +193,17 @@ struct ext_key *hsm_init(struct lightningd *ld) if (!fromwire_hsmd_derive_secret_reply(msg, &ld->invoicesecret_base)) err(EXITCODE_HSM_GENERIC_ERROR, "Bad derive_secret_reply"); + /* This is equivalent to makesecret("node-alias-base") */ + msg = towire_hsmd_derive_secret(NULL, tal_dup_arr(tmpctx, u8, + (const u8 *)NODE_ALIAS_BASE_STRING, + strlen(NODE_ALIAS_BASE_STRING), 0)); + if (!wire_sync_write(ld->hsm_fd, take(msg))) + err(EXITCODE_HSM_GENERIC_ERROR, "Writing derive_secret msg to hsm"); + + msg = wire_sync_read(tmpctx, ld->hsm_fd); + if (!fromwire_hsmd_derive_secret_reply(msg, &ld->nodealias_base)) + err(EXITCODE_HSM_GENERIC_ERROR, "Bad derive_secret_reply"); + return bip32_base; } @@ -283,8 +299,6 @@ static struct command_result *json_makesecret(struct command *cmd, static const struct json_command makesecret_command = { "makesecret", - "utility", &json_makesecret, - "Get a pseudorandom secret key, using some {hex} data." }; AUTODATA(json_command, &makesecret_command); diff --git a/lightningd/invoice.c b/lightningd/invoice.c index a33c975b9c28..a30d30145343 100644 --- a/lightningd/invoice.c +++ b/lightningd/invoice.c @@ -8,9 +8,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -153,22 +153,7 @@ static void invoice_secret(const struct preimage *payment_preimage, sha256(&secret, modified.r, ARRAY_SIZE(modified.r) * sizeof(*modified.r)); - BUILD_ASSERT(sizeof(secret.u.u8) == sizeof(payment_secret->data)); - memcpy(payment_secret->data, secret.u.u8, sizeof(secret.u.u8)); -} - -/* FIXME: The spec should require a *real* secret: a signature of the - * payment_hash using the payer_id key. This just means they've - * *seen* the invoice! */ -static void invoice_secret_bolt12(struct lightningd *ld, - const struct sha256 *payment_hash, - struct secret *payment_secret) -{ - const void *path_id = invoice_path_id(tmpctx, - &ld->invoicesecret_base, - payment_hash); - assert(tal_bytelen(path_id) == sizeof(*payment_secret)); - memcpy(payment_secret, path_id, sizeof(*payment_secret)); + CROSS_TYPE_ASSIGNMENT(&payment_secret->data, &secret.u.u8); } struct invoice_payment_hook_payload { @@ -401,9 +386,14 @@ invoice_check_payment(const tal_t *ctx, if (payment_secret) { struct secret expected; - if (bolt12_payment) - invoice_secret_bolt12(ld, payment_hash, &expected); - else + /* FIXME: BOLT 12 should require a *real* secret: a signature of the + * request using the payer_id key. This just means they've + * *seen* the invoice! */ + if (bolt12_payment) { + bolt12_path_secret(&ld->invoicesecret_base, + payment_hash, + &expected); + } else invoice_secret(&details->r, &expected); if (!secret_eq_consttime(payment_secret, &expected)) { *err = tal_fmt(ctx, "Attempt to pay %s with wrong %ssecret", @@ -1201,7 +1191,7 @@ static struct command_result *json_invoice(struct command *cmd, info->b11->chain = chainparams; info->b11->timestamp = time_now().ts.tv_sec; info->b11->payment_hash = rhash; - info->b11->receiver_id = cmd->ld->id; + info->b11->receiver_id = cmd->ld->our_nodeid; info->b11->min_final_cltv_expiry = *cltv; info->b11->expiry = *expiry; info->b11->description = tal_steal(info->b11, desc_val); @@ -1247,13 +1237,8 @@ static struct command_result *json_invoice(struct command *cmd, static const struct json_command invoice_command = { "invoice", - "payment", json_invoice, - "Create an invoice for {msatoshi} with {label} " - "and {description} with optional {expiry} seconds " - "(default 1 week), optional {fallbacks} address list" - "(default empty list) and optional {preimage} " - "(default autogenerated)"}; +}; AUTODATA(json_command, &invoice_command); static void json_add_invoices(struct json_stream *response, @@ -1380,10 +1365,7 @@ static struct command_result *json_listinvoices(struct command *cmd, static const struct json_command listinvoices_command = { "listinvoices", - "payment", json_listinvoices, - "Show invoice matching {label}, {invstring}, {payment_hash} or {offerid} (or all, if " - "no query parameter specified)" }; AUTODATA(json_command, &listinvoices_command); @@ -1468,9 +1450,7 @@ static struct command_result *json_delinvoice(struct command *cmd, static const struct json_command delinvoice_command = { "delinvoice", - "payment", json_delinvoice, - "Delete unpaid invoice {label} with {status}", }; AUTODATA(json_command, &delinvoice_command); @@ -1517,10 +1497,7 @@ static struct command_result *json_waitanyinvoice(struct command *cmd, static const struct json_command waitanyinvoice_command = { "waitanyinvoice", - "payment", json_waitanyinvoice, - "Wait for the next invoice to be paid, after {lastpay_index} (if supplied). " - "If {timeout} seconds is reached while waiting, fail with an error." }; AUTODATA(json_command, &waitanyinvoice_command); @@ -1567,9 +1544,7 @@ static struct command_result *json_waitinvoice(struct command *cmd, static const struct json_command waitinvoice_command = { "waitinvoice", - "payment", json_waitinvoice, - "Wait for an incoming payment matching the invoice with {label}, or if the invoice expires" }; AUTODATA(json_command, &waitinvoice_command); @@ -1606,9 +1581,7 @@ static struct command_result *json_decodepay(struct command *cmd, static const struct json_command decodepay_command = { "decodepay", - "payment", json_decodepay, - "Decode {bolt11}, using {description} if necessary" }; AUTODATA(json_command, &decodepay_command); @@ -1642,12 +1615,9 @@ static void add_stub_blindedpath(const tal_t *ctx, struct blinded_path *path; struct privkey blinding; struct tlv_encrypted_data_tlv *tlv; - struct pubkey me; path = tal(NULL, struct blinded_path); - if (!pubkey_from_node_id(&me, &ld->id)) - abort(); - sciddir_or_pubkey_from_pubkey(&path->first_node_id, &me); + sciddir_or_pubkey_from_pubkey(&path->first_node_id, &ld->our_pubkey); randombytes_buf(&blinding, sizeof(blinding)); if (!pubkey_from_privkey(&blinding, &path->blinding)) abort(); @@ -1657,9 +1627,9 @@ static void add_stub_blindedpath(const tal_t *ctx, /* A message in a bottle to ourselves: match it with * the invoice: we assume the payment_hash is unique! */ tlv = tlv_encrypted_data_tlv_new(tmpctx); - tlv->path_id = invoice_path_id(inv, - &ld->invoicesecret_base, - inv->invoice_payment_hash); + tlv->path_id = bolt12_path_id(inv, + &ld->invoicesecret_base, + inv->invoice_payment_hash); path->path[0]->encrypted_recipient_data = encrypt_tlv_encrypted_data(path->path[0], @@ -1688,8 +1658,7 @@ static void add_stub_blindedpath(const tal_t *ctx, inv->invoice_blindedpay[0]->features = NULL; /* Recalc ->fields */ - tal_free(inv->fields); - inv->fields = tlv_make_fields(inv, tlv_invoice); + tlv_update_fields(inv, tlv_invoice, &inv->fields); } static struct command_result *json_createinvoice(struct command *cmd, @@ -1789,7 +1758,7 @@ static struct command_result *json_createinvoice(struct command *cmd, hsm_sign_b12_invoice(cmd->ld, inv); b12enc = invoice_encode(cmd, inv); - if (inv->offer_node_id) { + if (inv->offer_issuer_id || inv->offer_paths) { invoice_offer_id(inv, &offer_id); if (wallet_offer_find(tmpctx, cmd->ld->wallet, &offer_id, NULL, &status)) { @@ -1862,9 +1831,7 @@ static struct command_result *json_createinvoice(struct command *cmd, static const struct json_command createinvoice_command = { "createinvoice", - "payment", json_createinvoice, - "Lowlevel command to sign and create invoice {invstring}, resolved with {preimage}, using unique {label}." }; AUTODATA(json_command, &createinvoice_command); @@ -1921,9 +1888,7 @@ static struct command_result *json_preapproveinvoice(struct command *cmd, static const struct json_command preapproveinvoice_command = { "preapproveinvoice", - "payment", json_preapproveinvoice, - "Ask the HSM to preapprove an invoice." }; AUTODATA(json_command, &preapproveinvoice_command); @@ -1981,9 +1946,7 @@ static struct command_result *json_preapprovekeysend(struct command *cmd, static const struct json_command preapprovekeysend_command = { "preapprovekeysend", - "payment", json_preapprovekeysend, - "Ask the HSM to preapprove a keysend payment." }; AUTODATA(json_command, &preapprovekeysend_command); @@ -2037,9 +2000,7 @@ static struct command_result *json_signinvoice(struct command *cmd, static const struct json_command signinvoice_command = { "signinvoice", - "payment", json_signinvoice, - "Lowlevel command to sign invoice {invstring}." }; AUTODATA(json_command, &signinvoice_command); diff --git a/lightningd/jsonrpc.c b/lightningd/jsonrpc.c index 804d106807ab..d3c2e4eca23b 100644 --- a/lightningd/jsonrpc.c +++ b/lightningd/jsonrpc.c @@ -186,15 +186,7 @@ static struct command_result *json_help(struct command *cmd, static const struct json_command help_command = { "help", - "utility", json_help, - "List available commands, or give verbose help on one {command}.", - .verbose = "help [command]\n" - "Without [command]:\n" - " Outputs an array of objects with 'command' and 'description'\n" - "With [command]:\n" - " Give a single object containing 'verbose', which completely describes\n" - " the command inputs and outputs." }; AUTODATA(json_command, &help_command); @@ -254,9 +246,7 @@ static struct command_result *json_stop(struct command *cmd, static const struct json_command stop_command = { "stop", - "utility", json_stop, - "Shut down the lightningd process" }; AUTODATA(json_command, &stop_command); @@ -361,9 +351,7 @@ static struct command_result *json_recover(struct command *cmd, static const struct json_command recover_command = { "recover", - "utility", json_recover, - "Restart an unused lightning node with --recover" }; AUTODATA(json_command, &recover_command); @@ -438,15 +426,7 @@ static struct command_result *json_dev(struct command *cmd UNUSED, static const struct json_command dev_command = { "dev", - "developer", json_dev, - "Developer command test multiplexer", - .verbose = "dev rhash {secret}\n" - " Show SHA256 of {secret}\n" - "dev crash\n" - " Crash lightningd by calling fatal()\n" - "dev slowcmd {msec}\n" - " Torture test for slow commands, optional {msec}\n", .dev_only = true, }; AUTODATA(json_command, &dev_command); @@ -481,25 +461,8 @@ static void json_add_help_command(struct command *cmd, strmap_get(&cmd->ld->jsonrpc->usagemap, json_command->name)); json_object_start(response, NULL); - json_add_string(response, "command", usage); - json_add_string(response, "category", json_command->category); - json_add_string(response, "description", json_command->description); - - if (!json_command->verbose) { - json_add_string(response, "verbose", - "HELP! Please contribute" - " a description for this" - " json_command!"); - } else { - struct json_escape *esc; - - esc = json_escape(NULL, json_command->verbose); - json_add_escaped_string(response, "verbose", take(esc)); - } - json_object_end(response); - } static const struct json_command *find_command(struct json_command **commands, @@ -1724,10 +1687,7 @@ static struct command_result *json_check(struct command *cmd, static const struct json_command check_command = { "check", - "utility", json_check, - "Don't run {command_to_check}, just verify parameters.", - .verbose = "check command_to_check [parameters...]\n" }; AUTODATA(json_command, &check_command); @@ -1751,9 +1711,7 @@ static struct command_result *json_notifications(struct command *cmd, static const struct json_command notifications_command = { "notifications", - "utility", json_notifications, - "{enable} notifications", }; AUTODATA(json_command, ¬ifications_command); @@ -1777,9 +1735,7 @@ static struct command_result *json_batching(struct command *cmd, static const struct json_command batching_command = { "batching", - "utility", json_batching, - "Database transaction batching {enable}", }; AUTODATA(json_command, &batching_command); @@ -1803,8 +1759,6 @@ static struct command_result *json_deprecations(struct command *cmd, static const struct json_command deprecations_command = { "deprecations", - "utility", json_deprecations, - "Set/unset deprecated APIs on this JSON connection (for developer testing)", }; AUTODATA(json_command, &deprecations_command); diff --git a/lightningd/jsonrpc.h b/lightningd/jsonrpc.h index 336ab12393b1..e547a5863209 100644 --- a/lightningd/jsonrpc.h +++ b/lightningd/jsonrpc.h @@ -55,13 +55,10 @@ struct command_result; struct json_command { const char *name; - const char *category; struct command_result *(*dispatch)(struct command *, const char *buffer, const jsmntok_t *obj, const jsmntok_t *params); - const char *description; - const char *verbose; bool dev_only; const char *depr_start, *depr_end; /* Special hook if we want raw access for check command */ diff --git a/lightningd/lightningd.c b/lightningd/lightningd.c index 984bbed770ce..06525772de4a 100644 --- a/lightningd/lightningd.c +++ b/lightningd/lightningd.c @@ -133,6 +133,7 @@ static struct lightningd *new_lightningd(const tal_t *ctx) ld->dev_fast_gossip = false; ld->dev_fast_gossip_prune = false; ld->dev_throttle_gossip = false; + ld->dev_suppress_gossip = false; ld->dev_fast_reconnect = false; ld->dev_force_privkey = NULL; ld->dev_force_bip32_seed = NULL; @@ -417,10 +418,10 @@ const char *subdaemon_path(const tal_t *ctx, const struct lightningd *ld, const const char *alt = strmap_get(&ld->alt_subdaemons, short_name); if (alt) { /* path_join will honor absolute paths as well. */ - dpath = path_join(ctx, ld->daemon_dir, alt); + dpath = path_join(ctx, ld->subdaemon_dir, alt); } else { /* This subdaemon is found in the standard place. */ - dpath = path_join(ctx, ld->daemon_dir, name); + dpath = path_join(ctx, ld->subdaemon_dir, name); } return dpath; } @@ -529,42 +530,12 @@ static const char *find_my_directory(const tal_t *ctx, const char *argv0) return path_dirname(ctx, take(me)); } -/*~ This returns the PKGLIBEXEC path which is where binaries get installed. - * Note the `TAKES` annotation which indicates that the `my_path` parameter - * can be take(); in which case, this function will handle freeing it. - * - * TAKES is only a convention unfortunately, and ignored by the compiler. - */ -static const char *find_my_pkglibexec_path(struct lightningd *ld, - const char *my_path TAKES) -{ - const char *pkglibexecdir; - - /*~`path_join` is declared in ccan/path/path.h as: - * - * char *path_join(const tal_t *ctx, - * const char *base TAKES, const char *a TAKES); - * - * So, as we promised with 'TAKES' in our own declaration, if the - * caller has called `take()` the `my_path` parameter, path_join() - * will free it. */ - pkglibexecdir = path_join(NULL, my_path, BINTOPKGLIBEXECDIR); - - /*~ The plugin dir is in ../libexec/c-lightning/plugins, which (unlike - * those given on the command line) does not need to exist. */ - plugins_set_builtin_plugins_dir(ld->plugins, - path_join(tmpctx, - pkglibexecdir, "plugins")); - - /*~ Sometimes take() can be more efficient, since the routine can - * manipulate the string in place. This is the case here. */ - return path_simplify(ld, take(pkglibexecdir)); -} - /* Determine the correct daemon dir. */ -static const char *find_daemon_dir(struct lightningd *ld, const char *argv0) +static void find_subdaemons_and_plugins(struct lightningd *ld, const char *argv0) { - const char *my_path = find_my_directory(ld, argv0); + const char *my_path = find_my_directory(NULL, argv0); + const char *prefix; + /* If we're running in-tree, all the subdaemons are with lightningd. */ if (has_all_subdaemons(my_path)) { /* In this case, look for built-in plugins in ../plugins */ @@ -572,11 +543,18 @@ static const char *find_daemon_dir(struct lightningd *ld, const char *argv0) path_join(tmpctx, my_path, "../plugins")); - return my_path; + ld->subdaemon_dir = tal_steal(ld, my_path); + return; } - /* Otherwise we assume they're in the installed dir. */ - return find_my_pkglibexec_path(ld, take(my_path)); + /* Assume we're running the installed version. Override + * for "make installccheck" though. */ + prefix = getenv("DEV_LIGHTNINGD_DESTDIR_PREFIX"); + if (!prefix) + prefix = ""; + ld->subdaemon_dir = tal_fmt(ld, "%s%s", prefix, PKGLIBEXECDIR); + plugins_set_builtin_plugins_dir(ld->plugins, + tal_fmt(ld->plugins, "%s%s", prefix, PLUGINDIR)); } /*~ We like to free everything on exit, so valgrind doesn't complain (valgrind @@ -1214,10 +1192,8 @@ int main(int argc, char *argv[]) orig_argv[0] = path_join(orig_argv, take(path_cwd(NULL)), argv[0]); orig_argv[argc] = NULL; - /* Figure out where our daemons are first. */ - ld->daemon_dir = find_daemon_dir(ld, argv[0]); - if (!ld->daemon_dir) - errx(EXITCODE_SUBDAEMON_FAIL, "Could not find daemons"); + /* Figure out where our subdaemons are first. */ + find_subdaemons_and_plugins(ld, argv[0]); /* Set up the feature bits for what we support */ ld->our_features = default_features(ld); @@ -1416,7 +1392,7 @@ int main(int argc, char *argv[]) * tal_bytelen() to get the length. */ log_info(ld->log, "--------------------------------------------------"); log_info(ld->log, "Server started with public key %s, alias %s (color #%s) and lightningd %s", - fmt_node_id(tmpctx, &ld->id), + fmt_node_id(tmpctx, &ld->our_nodeid), json_escape(tmpctx, (const char *)ld->alias)->s, tal_hex(tmpctx, ld->rgb), version()); ld->state = LD_STATE_RUNNING; diff --git a/lightningd/lightningd.h b/lightningd/lightningd.h index e9594c1093b9..d13d509b7a58 100644 --- a/lightningd/lightningd.h +++ b/lightningd/lightningd.h @@ -108,7 +108,7 @@ enum lightningd_state { struct lightningd { /* The directory to find all the subdaemons. */ - const char *daemon_dir; + const char *subdaemon_dir; /* Are deprecated APIs enabled? */ bool deprecated_ok; @@ -147,15 +147,16 @@ struct lightningd { struct logger *log; const char **logfiles; - /* This is us. */ - struct node_id id; + /* This is us, in both node_id and pubkey form */ + struct node_id our_nodeid; + struct pubkey our_pubkey; - /* The public base for our payer_id keys */ - struct pubkey bolt12_base; - - /* Secret base for our invoices */ + /* Secret base for our invoices. */ struct secret invoicesecret_base; + /* Secret base for node aliases */ + struct secret nodealias_base; + /* Feature set we offer. */ struct feature_set *our_features; @@ -312,6 +313,7 @@ struct lightningd { bool dev_fast_gossip; bool dev_fast_gossip_prune; bool dev_throttle_gossip; + bool dev_suppress_gossip; /* Speedup reconnect delay, for testing. */ bool dev_fast_reconnect; diff --git a/lightningd/log.c b/lightningd/log.c index 60d4316ab112..3a9b115d6141 100644 --- a/lightningd/log.c +++ b/lightningd/log.c @@ -915,9 +915,8 @@ void opt_register_logging(struct lightningd *ld) opt_set_bool_arg, opt_show_bool, &ld->log_book->print_timestamps, "prefix log messages with timestamp"); - opt_register_early_arg("--log-prefix", arg_log_prefix, show_log_prefix, - ld->log_book, - "log prefix"); + clnopt_witharg("--log-prefix", OPT_EARLY|OPT_KEEP_WHITESPACE, + arg_log_prefix, show_log_prefix, ld->log_book, "log prefix"); clnopt_witharg("--log-file=", OPT_EARLY|OPT_MULTI, arg_log_to_file, NULL, ld, @@ -1172,8 +1171,6 @@ static struct command_result *json_getlog(struct command *cmd, static const struct json_command getlog_command = { "getlog", - "utility", json_getlog, - "Show logs, with optional log {level} (info|unusual|debug|io)" }; AUTODATA(json_command, &getlog_command); diff --git a/lightningd/memdump.c b/lightningd/memdump.c index e206513318eb..38e67b88e66d 100644 --- a/lightningd/memdump.c +++ b/lightningd/memdump.c @@ -81,9 +81,7 @@ static struct command_result *json_memdump(struct command *cmd, static const struct json_command dev_memdump_command = { "dev-memdump", - "developer", json_memdump, - "Show memory objects currently in use", .dev_only = true, }; AUTODATA(json_command, &dev_memdump_command); @@ -98,9 +96,6 @@ static void memleak_log(struct logger *log, const char *fmt, ...) static void finish_report(const struct leak_detect *leaks) { - struct htable *memtable; - struct command *cmd; - struct lightningd *ld; struct json_stream *response; /* If it timed out, we free ourselved and exit! */ @@ -109,34 +104,7 @@ static void finish_report(const struct leak_detect *leaks) return; } - /* Convenience variables */ - cmd = leaks->cmd; - ld = cmd->ld; - - /* Enter everything, except this cmd and its jcon */ - memtable = memleak_start(cmd); - - /* This command is not a leak! */ - memleak_ptr(memtable, cmd); - memleak_ignore_children(memtable, cmd); - - /* First delete known false positives. */ - memleak_scan_htable(memtable, &ld->topology->txwatches->raw); - memleak_scan_htable(memtable, &ld->topology->txowatches->raw); - memleak_scan_htable(memtable, &ld->topology->outgoing_txs->raw); - memleak_scan_htable(memtable, &ld->htlcs_in->raw); - memleak_scan_htable(memtable, &ld->htlcs_out->raw); - memleak_scan_htable(memtable, &ld->htlc_sets->raw); - memleak_scan_htable(memtable, &ld->peers->raw); - memleak_scan_htable(memtable, &ld->peers_by_dbid->raw); - - /* Now delete ld and those which it has pointers to. */ - memleak_scan_obj(memtable, ld); - - if (dump_memleak(memtable, memleak_log, ld->log)) - tal_arr_expand(&leaks->leakers, "lightningd"); - - response = json_stream_success(cmd); + response = json_stream_success(leaks->cmd); json_array_start(response, "leaks"); for (size_t num_leakers = 0; num_leakers < tal_count(leaks->leakers); @@ -148,7 +116,7 @@ static void finish_report(const struct leak_detect *leaks) json_array_end(response); /* Command is now done. */ - was_pending(command_success(cmd, response)); + was_pending(command_success(leaks->cmd, response)); } static void leak_detect_timeout(struct leak_detect *leak_detect) @@ -212,6 +180,34 @@ static void connect_dev_memleak_done(struct subd *connectd, report_subd_memleak(leaks, connectd); } +static bool lightningd_check_leaks(struct command *cmd) +{ + struct lightningd *ld = cmd->ld; + struct htable *memtable; + + /* Enter everything, except this cmd and its jcon */ + memtable = memleak_start(cmd); + + /* This command is not a leak! */ + memleak_ptr(memtable, cmd); + memleak_ignore_children(memtable, cmd); + + /* First delete known false positives. */ + memleak_scan_htable(memtable, &ld->topology->txwatches->raw); + memleak_scan_htable(memtable, &ld->topology->txowatches->raw); + memleak_scan_htable(memtable, &ld->topology->outgoing_txs->raw); + memleak_scan_htable(memtable, &ld->htlcs_in->raw); + memleak_scan_htable(memtable, &ld->htlcs_out->raw); + memleak_scan_htable(memtable, &ld->htlc_sets->raw); + memleak_scan_htable(memtable, &ld->peers->raw); + memleak_scan_htable(memtable, &ld->peers_by_dbid->raw); + + /* Now delete ld and those which it has pointers to. */ + memleak_scan_obj(memtable, ld); + + return dump_memleak(memtable, memleak_log, ld->log); +} + static struct command_result *json_memleak(struct command *cmd, const char *buffer, const jsmntok_t *obj UNNEEDED, @@ -238,6 +234,10 @@ static struct command_result *json_memleak(struct command *cmd, leaks->num_outstanding_requests = 0; leaks->leakers = tal_arr(leaks, const char *, 0); + /* Check for our own leaks. */ + if (lightningd_check_leaks(cmd)) + tal_arr_expand(&leaks->leakers, "lightningd"); + /* hsmd is sync, so do that first. */ msg = hsm_sync_req(tmpctx, cmd->ld, take(towire_hsmd_dev_memleak(NULL))); if (!fromwire_hsmd_dev_memleak_reply(msg, &found_leak)) @@ -267,9 +267,7 @@ static struct command_result *json_memleak(struct command *cmd, static const struct json_command dev_memleak_command = { "dev-memleak", - "developer", json_memleak, - "Show unreferenced memory objects", .dev_only = true, }; AUTODATA(json_command, &dev_memleak_command); diff --git a/lightningd/offer.c b/lightningd/offer.c index a62ad418a957..e5a88e9872d9 100644 --- a/lightningd/offer.c +++ b/lightningd/offer.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -9,11 +10,11 @@ #include #include #include +#include #include #include #include #include -#include static void json_populate_offer(struct json_stream *response, const struct sha256 *offer_id, @@ -55,17 +56,21 @@ static void hsm_sign_b12(struct lightningd *ld, { const u8 *msg; struct sha256 sighash; + /* Needs to be a (non-nul-terminated) tal_arr */ + const u8 *info = tal_dup_arr(tmpctx, u8, + (const u8 *)NODE_ALIAS_BASE_STRING, + strlen(NODE_ALIAS_BASE_STRING), 0); - msg = towire_hsmd_sign_bolt12(NULL, messagename, fieldname, merkle, - publictweak); + msg = towire_hsmd_sign_bolt12_2(NULL, messagename, fieldname, merkle, + info, publictweak); msg = hsm_sync_req(tmpctx, ld, take(msg)); - if (!fromwire_hsmd_sign_bolt12_reply(msg, sig)) - fatal("HSM gave bad sign_offer_reply %s", + if (!fromwire_hsmd_sign_bolt12_2_reply(msg, sig)) + fatal("HSM gave bad sign_bolt12_2 %s", tal_hex(msg, msg)); /* Now we sanity-check! */ sighash_from_merkle(messagename, fieldname, merkle, &sighash); - if (!check_schnorr_sig(&sighash, &key->pubkey, sig)) + if (!check_schnorr_sig(&sighash, &key->pubkey, sig)) fatal("HSM gave bad signature %s for pubkey %s", fmt_bip340sig(tmpctx, sig), fmt_pubkey(tmpctx, key)); @@ -122,9 +127,7 @@ static struct command_result *json_createoffer(struct command *cmd, static const struct json_command createoffer_command = { "createoffer", - "payment", json_createoffer, - "Create and sign an offer {bolt12} with and optional {label}." }; AUTODATA(json_command, &createoffer_command); @@ -183,10 +186,7 @@ static struct command_result *json_listoffers(struct command *cmd, static const struct json_command listoffers_command = { "listoffers", - "payment", json_listoffers, - "If {offer_id} is set, show that." - " Otherwise, if {showdisabled} is true, list all, otherwise just non-disabled ones." }; AUTODATA(json_command, &listoffers_command); @@ -227,24 +227,64 @@ static struct command_result *json_disableoffer(struct command *cmd, static const struct json_command disableoffer_command = { "disableoffer", - "payment", json_disableoffer, - "Disable offer {offer_id}", }; AUTODATA(json_command, &disableoffer_command); +static struct command_result *json_enableoffer(struct command *cmd, + const char *buffer, + const jsmntok_t *obj UNNEEDED, + const jsmntok_t *params) +{ + struct json_stream *response; + struct sha256 *offer_id; + struct wallet *wallet = cmd->ld->wallet; + const char *b12; + const struct json_escape *label; + enum offer_status status; + + if (!param_check(cmd, buffer, params, + p_req("offer_id", param_sha256, &offer_id), + NULL)) + return command_param_failed(); + + b12 = wallet_offer_find(tmpctx, wallet, offer_id, &label, &status); + if (!b12) + return command_fail(cmd, LIGHTNINGD, "Unknown offer"); + + if (offer_status_active(status)) + return command_fail(cmd, OFFER_ALREADY_ENABLED, + "offer already active"); + + if (command_check_only(cmd)) + return command_check_done(cmd); + + status = wallet_offer_enable(wallet, offer_id, status); + + response = json_stream_success(cmd); + json_populate_offer(response, offer_id, b12, label, status); + return command_success(cmd, response); +} + +static const struct json_command enableoffer_command = { + "enableoffer", + json_enableoffer, +}; +AUTODATA(json_command, &enableoffer_command); + + /* We do some sanity checks now, since we're looking up prev payment anyway, - * but our main purpose is to fill in invreq->invreq_metadata tweak. */ + * but our main purpose is to fill in prev_basetime tweak. */ static struct command_result *prev_payment(struct command *cmd, const struct json_escape *label, - struct tlv_invoice_request *invreq, + const struct tlv_invoice_request *invreq, u64 **prev_basetime) { - bool prev_paid = false; struct sha256 invreq_oid; + u64 last_recurrence = UINT64_MAX; + bool prev_unpaid = false; invreq_offer_id(invreq, &invreq_oid); - assert(!invreq->invreq_metadata); for (struct db_stmt *stmt = payments_by_label(cmd->ld->wallet, label); stmt; @@ -300,34 +340,40 @@ static struct command_result *prev_payment(struct command *cmd, " recurrence_start"); } - if (*inv->invreq_recurrence_counter == *invreq->invreq_recurrence_counter-1) { - if (payment->status == PAYMENT_COMPLETE) - prev_paid = true; - } + /* They should all have the same basetime */ + if (!*prev_basetime) + *prev_basetime = tal_dup(cmd, u64, inv->invoice_recurrence_basetime); - if (inv->invreq_metadata) { - invreq->invreq_metadata - = tal_dup_talarr(invreq, u8, inv->invreq_metadata); - *prev_basetime = tal_dup(cmd, u64, - inv->invoice_recurrence_basetime); + /* Track highest one for better diagnostics */ + if (last_recurrence == UINT64_MAX + || last_recurrence < *inv->invreq_recurrence_counter) { + last_recurrence = *inv->invreq_recurrence_counter; } - if (prev_paid && inv->invreq_metadata) { - tal_free(stmt); - break; + if (*inv->invreq_recurrence_counter == *invreq->invreq_recurrence_counter-1) { + /* Got it! */ + if (payment->status == PAYMENT_COMPLETE) { + tal_free(stmt); + return NULL; + } else + prev_unpaid = true; } } - if (!invreq->invreq_metadata) + /* We found one, but it didn't succeed */ + if (prev_unpaid) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "No previous payment attempted for this" - " label and offer"); + "previous invoice payment did not succeed"); - if (!prev_paid) + /* We found one, but it was not the previus one */ + if (last_recurrence != UINT64_MAX) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "previous invoice has not been paid"); + "previous invoice has not been paid (last was %"PRIu64")", + last_recurrence); - return NULL; + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "No previous payment attempted for this" + " label and offer"); } static struct command_result *param_b12_invreq(struct command *cmd, @@ -344,14 +390,13 @@ static struct command_result *param_b12_invreq(struct command *cmd, if (!*invreq) return command_fail_badparam(cmd, name, buffer, tok, fail); - /* We use this for testing with known payer_info */ - if ((*invreq)->invreq_metadata && !cmd->ld->developer) + if (!(*invreq)->invreq_metadata) return command_fail_badparam(cmd, name, buffer, tok, - "must not have invreq_metadata"); + "must have invreq_metadata"); - if ((*invreq)->invreq_payer_id) + if (!(*invreq)->invreq_payer_id) return command_fail_badparam(cmd, name, buffer, tok, - "must not have invreq_payer_id"); + "must have invreq_payer_id"); return NULL; } @@ -361,10 +406,11 @@ static bool payer_key(struct lightningd *ld, { struct sha256 tweakhash; - payer_key_tweak(&ld->bolt12_base, public_tweak, public_tweak_len, - &tweakhash); + *key = ld->our_pubkey; + bolt12_alias_tweak(&ld->nodealias_base, + public_tweak, public_tweak_len, + &tweakhash); - *key = ld->bolt12_base; return secp256k1_ec_pubkey_tweak_add(secp256k1_ctx, &key->pubkey, tweakhash.u.u8) == 1; @@ -395,15 +441,15 @@ static struct command_result *json_createinvoicerequest(struct command *cmd, struct json_stream *response; u64 *prev_basetime = NULL; struct sha256 merkle; - bool *save, *single_use, *exposeid; + bool *save, *single_use; enum offer_status status; struct sha256 invreq_id; const char *b12str; + const u8 *tweak; if (!param_check(cmd, buffer, params, p_req("bolt12", param_b12_invreq, &invreq), p_req("savetodb", param_bool, &save), - p_opt_def("exposeid", param_bool, &exposeid, false), p_opt("recurrence_label", param_label, &label), p_opt_def("single_use", param_bool, &single_use, true), NULL)) @@ -414,8 +460,7 @@ static struct command_result *json_createinvoicerequest(struct command *cmd, else status = OFFER_MULTIPLE_USE_UNUSED; - /* If it's a recurring payment, we look for previous to copy - * invreq_metadata, basetime */ + /* If it's a recurring payment, we look for previous to copy basetime */ if (invreq->invreq_recurrence_counter) { if (!label) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, @@ -430,35 +475,25 @@ static struct command_result *json_createinvoicerequest(struct command *cmd, } } - if (!invreq->invreq_metadata) { - /* BOLT-offers #12: - * - * `invreq_metadata` might typically contain information about - * the derivation of the `invreq_payer_id`. This should not - * leak any information (such as using a simple BIP-32 - * derivation path); a valid system might be for a node to - * maintain a base payer key and encode a 128-bit tweak here. - * The payer_id would be derived by tweaking the base key with - * SHA256(payer_base_pubkey || tweak). It's also the first - * entry (if present), ensuring an unpredictable nonce for - * hashing. - */ - invreq->invreq_metadata = tal_arr(invreq, u8, 16); - randombytes_buf(invreq->invreq_metadata, - tal_bytelen(invreq->invreq_metadata)); - } - - invreq->invreq_payer_id = tal(invreq, struct pubkey); - if (*exposeid) { - if (!pubkey_from_node_id(invreq->invreq_payer_id, - &cmd->ld->id)) - fatal("Our ID is invalid?"); - } else if (!payer_key(cmd->ld, - invreq->invreq_metadata, - tal_bytelen(invreq->invreq_metadata), - invreq->invreq_payer_id)) { - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "Invalid tweak"); + /* If the payer_id is not our node id, we sanity check that it + * correctly maps from invreq_metadata */ + if (!pubkey_eq(invreq->invreq_payer_id, &cmd->ld->our_pubkey)) { + struct pubkey expected; + if (!payer_key(cmd->ld, + invreq->invreq_metadata, + tal_bytelen(invreq->invreq_metadata), + &expected)) { + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Invalid tweak"); + } + if (!pubkey_eq(invreq->invreq_payer_id, &expected)) { + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "payer_id did not match invreq_metadata derivation %s", + fmt_pubkey(tmpctx, &expected)); + } + tweak = invreq->invreq_metadata; + } else { + tweak = NULL; } if (command_check_only(cmd)) @@ -469,11 +504,11 @@ static struct command_result *json_createinvoicerequest(struct command *cmd, * [Signature Calculation](#signature-calculation) using the `invreq_payer_id`. */ /* This populates the ->fields from our entries */ - invreq->fields = tlv_make_fields(invreq, tlv_invoice_request); + tlv_update_fields(invreq, tlv_invoice_request, &invreq->fields); merkle_tlv(invreq->fields, &merkle); invreq->signature = tal(invreq, struct bip340sig); hsm_sign_b12(cmd->ld, "invoice_request", "signature", - &merkle, *exposeid ? NULL : invreq->invreq_metadata, + &merkle, tweak, invreq->invreq_payer_id, invreq->signature); b12str = invrequest_encode(cmd, invreq); @@ -497,9 +532,7 @@ static struct command_result *json_createinvoicerequest(struct command *cmd, static const struct json_command createinvreq_command = { "createinvoicerequest", - "payment", json_createinvoicerequest, - "Create and sign an invoice_request {bolt12}, with {recurrence_label} if recurring, filling in payer_info and payer_key." }; AUTODATA(json_command, &createinvreq_command); @@ -534,9 +567,7 @@ static struct command_result *json_payersign(struct command *cmd, static const struct json_command payersign_command = { "payersign", - "payment", json_payersign, - "Sign {messagename} {fieldname} {merkle} (a 32-byte hex string) using public {tweak}", }; AUTODATA(json_command, &payersign_command); @@ -596,10 +627,7 @@ static struct command_result *json_listinvoicerequests(struct command *cmd, static const struct json_command listinvoicerequests_command = { "listinvoicerequests", - "payment", json_listinvoicerequests, - "If {invreq_id} is set, show that." - " Otherwise, if {showdisabled} is true, list all, otherwise just non-disabled ones." }; AUTODATA(json_command, &listinvoicerequests_command); @@ -641,9 +669,7 @@ static struct command_result *json_disableinvoicerequest(struct command *cmd, static const struct json_command disableinvoicerequest_command = { "disableinvoicerequest", - "payment", json_disableinvoicerequest, - "Disable invoice_request {invreq_id}", }; AUTODATA(json_command, &disableinvoicerequest_command); diff --git a/lightningd/onchain_control.c b/lightningd/onchain_control.c index 662b3bc55491..41d52f558bef 100644 --- a/lightningd/onchain_control.c +++ b/lightningd/onchain_control.c @@ -518,6 +518,51 @@ static u32 infinite_block_deadline(const struct chain_topology *topo) return get_block_height(topo) + 300; } +/** + * slow_sweep_dealine -- A smart(-ish) way of estimating sweep fees. + * + * We use the `close_blockheight` as the basis for the target. We then + * target to have the funds back at most 2 weeks after the close, + * linearly increasing the confirmation target until we get + * close. However, we also don't want to panic and set a target that + * is too close, in order not to waste too many funds on the sweep + * fees. + */ +static u32 slow_sweep_deadline(const struct chain_topology *topo, + const struct channel *c) +{ + u32 closeheight, deadline, height = get_block_height(topo); + + if (c->close_blockheight) { + closeheight = *c->close_blockheight; + } else { + log_unusual(c->log, + "Missing close_blockheight? Using current height " + "+ 300 = %d", + height + 300); + return height + 300; + } + + /* A two week deadline seems like a not too bad default. We + * should likely tweak this to hit the desired cost vs. idle + * time tradeoff. */ + deadline = closeheight + 2016; + + /* If we missed the deadline, don't panic, let's continue with + * a somewhat reasonable target, and hope for the best. No + * need to ramp up to confirmation target 1, we're supposed to + * be slow. */ + if (deadline < height + 12) + return height + 12; + + /* At the same time don't be too lenient, we want this to + * confirm and not just idle around forever. */ + if (deadline > height + 300) + return height + 300; + + return deadline; +} + static struct onchain_signing_info *new_signing_info(const tal_t *ctx, struct channel *channel, enum onchaind_wire msgtype) @@ -1104,7 +1149,8 @@ static void handle_onchaind_spend_to_us(struct channel *channel, } /* No real deadline on this, it's just returning to our wallet. */ - info->deadline_block = infinite_block_deadline(channel->peer->ld->topology); + info->deadline_block = + slow_sweep_deadline(channel->peer->ld->topology, channel); create_onchain_tx(channel, &out, out_sats, channel->channel_info.their_config.to_self_delay, 0, sign_tx_to_us, info, @@ -1504,7 +1550,6 @@ enum watch_result onchaind_funding_spent(struct channel *channel, u8 *msg; struct bitcoin_txid our_last_txid; struct lightningd *ld = channel->peer->ld; - struct pubkey final_key; int hsmfd; enum state_change reason; @@ -1564,8 +1609,6 @@ enum watch_result onchaind_funding_spent(struct channel *channel, return KEEP_WATCHING; } - bip32_pubkey(ld, &final_key, channel->final_key_idx); - struct ext_key final_wallet_ext_key; if (bip32_key_from_parent( ld->bip32_base, @@ -1611,8 +1654,6 @@ enum watch_result onchaind_funding_spent(struct channel *channel, channel->shutdown_scriptpubkey[LOCAL], channel->shutdown_scriptpubkey[REMOTE], channel->final_key_idx, - &final_wallet_ext_key, - &final_key, channel->opener, &channel->local_basepoints, &channel->channel_info.theirbase, diff --git a/lightningd/onion_message.c b/lightningd/onion_message.c index 3645a06e21ba..495541266071 100644 --- a/lightningd/onion_message.c +++ b/lightningd/onion_message.c @@ -257,9 +257,7 @@ static struct command_result *json_injectonionmessage(struct command *cmd, static const struct json_command injectonionmessage_command = { "injectonionmessage", - "utility", json_injectonionmessage, - "Unwrap using {blinding}, encoded over {hops} (id, tlv)" }; AUTODATA(json_command, &injectonionmessage_command); @@ -314,8 +312,6 @@ static struct command_result *json_decryptencrypteddata(struct command *cmd, static const struct json_command decryptencrypteddata_command = { "decryptencrypteddata", - "utility", json_decryptencrypteddata, - "Decrypt {encrypted_data} using {blinding}, return decryption and next blinding" }; AUTODATA(json_command, &decryptencrypteddata_command); diff --git a/lightningd/opening_control.c b/lightningd/opening_control.c index a7a96f668ebe..885994a308de 100644 --- a/lightningd/opening_control.c +++ b/lightningd/opening_control.c @@ -1473,7 +1473,10 @@ static struct channel *stub_chan(struct command *cmd, log_debug(cmd->ld->log, "channel %s already exists!", fmt_channel_id(tmpctx, &cid)); return NULL; - } else { + } + + peer = peer_by_id(cmd->ld, &nodeid); + if (!peer) { struct wireaddr_internal wint; wint.itype = ADDR_INTERNAL_WIREADDR; @@ -1664,36 +1667,24 @@ static struct command_result *json_recoverchannel(struct command *cmd, static const struct json_command fundchannel_start_command = { "fundchannel_start", - "channels", json_fundchannel_start, - "Start fund channel with {id} using {amount} satoshis. " - "Returns a bech32 address to use as an output for a funding transaction." }; AUTODATA(json_command, &fundchannel_start_command); static const struct json_command fundchannel_cancel_command = { "fundchannel_cancel", - "channels", json_fundchannel_cancel, - "Cancel inflight channel establishment with peer {id}." }; AUTODATA(json_command, &fundchannel_cancel_command); static const struct json_command fundchannel_complete_command = { "fundchannel_complete", - "channels", json_fundchannel_complete, - "Complete channel establishment with peer {id} for funding transaction" - "with {psbt}. Returns true on success, false otherwise." }; AUTODATA(json_command, &fundchannel_complete_command); static const struct json_command json_commitchan_command = { "recoverchannel", - "channels", json_recoverchannel, - "Populate the DB with a channel and peer" - "Used for recovering the channel using DLP." - "This needs param in the form of an array [scb1,scb2,...]" }; AUTODATA(json_command, &json_commitchan_command); diff --git a/lightningd/options.c b/lightningd/options.c index 184d424a9d38..8c62e23e9c16 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -1525,9 +1525,8 @@ static void register_opts(struct lightningd *ld) opt_lightningd_usage, ld, "Print this message."); opt_register_arg("--rgb", opt_set_rgb, opt_show_rgb, ld, "RRGGBB hex color for node"); - opt_register_arg("--alias", opt_set_alias, opt_show_alias, ld, - "Up to 32-byte alias for node"); - + clnopt_witharg("--alias", OPT_KEEP_WHITESPACE, opt_set_alias, + opt_show_alias, ld, "Up to 32-byte alias for node"); opt_register_arg("--pid-file=", opt_set_talstr, opt_show_charp, &ld->pidfile, "Specify pid file"); @@ -1768,14 +1767,14 @@ void setup_color_and_alias(struct lightningd *ld) { if (!ld->rgb) /* You can't get much red by default */ - ld->rgb = tal_dup_arr(ld, u8, ld->id.k, 3, 0); + ld->rgb = tal_dup_arr(ld, u8, ld->our_nodeid.k, 3, 0); if (!ld->alias) { u64 adjective, noun; char *name; - memcpy(&adjective, ld->id.k+3, sizeof(adjective)); - memcpy(&noun, ld->id.k+3+sizeof(adjective), sizeof(noun)); + memcpy(&adjective, ld->our_nodeid.k+3, sizeof(adjective)); + memcpy(&noun, ld->our_nodeid.k+3+sizeof(adjective), sizeof(noun)); noun %= ARRAY_SIZE(codename_noun); adjective %= ARRAY_SIZE(codename_adjective); @@ -1888,9 +1887,9 @@ void handle_early_opts(struct lightningd *ld, int argc, char *argv[]) } /* Free *str, set *str to copy with `cln` prepended */ -static void prefix_cln(const char **str STEALS) +static void prefix_cln(char **str STEALS) { - const char *newstr = tal_fmt(tal_parent(*str), "cln%s", *str); + char *newstr = tal_fmt(tal_parent(*str), "cln%s", *str); tal_free(*str); *str = newstr; } @@ -1911,7 +1910,7 @@ static void fixup_clnrest_options(struct lightningd *ld) && !strstarts(cv->configline, "rest-certs=")) continue; /* Did some (plugin) claim it? */ - if (opt_find_long(cv->configline, &cv->optarg)) + if (opt_find_long(cv->configline, cast_const2(const char **, &cv->optarg))) continue; if (!opt_deprecated_ok(ld, tal_strndup(tmpctx, cv->configline, diff --git a/lightningd/pay.c b/lightningd/pay.c index f871399c6477..7c4659896c4e 100644 --- a/lightningd/pay.c +++ b/lightningd/pay.c @@ -353,10 +353,10 @@ immediate_routing_failure(const tal_t *ctx, routing_failure->erring_index = 0; routing_failure->failcode = failcode; routing_failure->erring_node = - tal_dup(routing_failure, struct node_id, &ld->id); + tal_dup(routing_failure, struct node_id, &ld->our_nodeid); routing_failure->erring_channel = tal_dup(routing_failure, struct short_channel_id, &channel0); - routing_failure->channel_dir = node_id_idx(&ld->id, dstid); + routing_failure->channel_dir = node_id_idx(&ld->our_nodeid, dstid); routing_failure->msg = NULL; return routing_failure; @@ -378,14 +378,14 @@ local_routing_failure(const tal_t *ctx, routing_failure->failcode = failcode; routing_failure->erring_node = - tal_dup(routing_failure, struct node_id, &ld->id); + tal_dup(routing_failure, struct node_id, &ld->our_nodeid); if (payment->route_nodes != NULL && payment->route_channels != NULL) { routing_failure->erring_channel = tal_dup(routing_failure, struct short_channel_id, &payment->route_channels[0]); routing_failure->channel_dir = - node_id_idx(&ld->id, &payment->route_nodes[0]); + node_id_idx(&ld->our_nodeid, &payment->route_nodes[0]); } else { routing_failure->erring_channel = NULL; } @@ -444,7 +444,7 @@ remote_routing_failure(const tal_t *ctx, erring_channel = &route_channels[origin_index]; /* Single hop? */ if (origin_index == 0) - dir = node_id_idx(&ld->id, + dir = node_id_idx(&ld->our_nodeid, &route_nodes[origin_index]); else dir = node_id_idx(&route_nodes[origin_index - 1], @@ -1067,8 +1067,8 @@ send_payment_core(struct lightningd *ld, "peer found"); json_add_routefail_info(data, 0, WIRE_UNKNOWN_NEXT_PEER, - &ld->id, NULL, - node_id_idx(&ld->id, + &ld->our_nodeid, NULL, + node_id_idx(&ld->our_nodeid, &first_hop->node_id), NULL); json_object_end(data); @@ -1341,9 +1341,7 @@ static struct command_result *json_sendonion(struct command *cmd, static const struct json_command sendonion_command = { "sendonion", - "payment", json_sendonion, - "Send a payment with a pre-computed onion." }; AUTODATA(json_command, &sendonion_command); @@ -1434,7 +1432,7 @@ static struct command_result *self_payment(struct lightningd *ld, partid, groupid, PAYMENT_PENDING, - &ld->id, + &ld->our_nodeid, msat, msat, msat, @@ -1458,7 +1456,7 @@ static struct command_result *self_payment(struct lightningd *ld, /* tell_waiters_failed expects one of these! */ fail = tal(payment, struct routing_failure); fail->failcode = WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS; - fail->erring_node = &ld->id; + fail->erring_node = &ld->our_nodeid; fail->erring_index = 0; fail->erring_channel = NULL; fail->msg = NULL; @@ -1598,9 +1596,7 @@ static struct command_result *json_sendpay(struct command *cmd, static const struct json_command sendpay_command = { "sendpay", - "payment", json_sendpay, - "Send along {route} in return for preimage of {payment_hash}" }; AUTODATA(json_command, &sendpay_command); @@ -1644,10 +1640,7 @@ static struct command_result *json_waitsendpay(struct command *cmd, static const struct json_command waitsendpay_command = { "waitsendpay", - "payment", json_waitsendpay, - "Wait for payment attempt on {payment_hash} to succeed or fail, " - "but only up to {timeout} seconds." }; AUTODATA(json_command, &waitsendpay_command); @@ -1807,9 +1800,7 @@ static struct command_result *json_listsendpays(struct command *cmd, static const struct json_command listsendpays_command = { "listsendpays", - "payment", json_listsendpays, - "Show sendpay, old and current, optionally limiting to {bolt11} or {payment_hash}." }; AUTODATA(json_command, &listsendpays_command); @@ -1911,9 +1902,7 @@ static struct command_result *json_delpay(struct command *cmd, static const struct json_command delpay_command = { "delpay", - "payment", json_delpay, - "Delete payment with {payment_hash} and {status}", }; AUTODATA(json_command, &delpay_command); @@ -1978,8 +1967,6 @@ static struct command_result *json_createonion(struct command *cmd, static const struct json_command createonion_command = { "createonion", - "payment", json_createonion, - "Create an onion going through the provided nodes, each with its own payload" }; AUTODATA(json_command, &createonion_command); diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 5f56e4c17334..aaf7897754e3 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -105,7 +105,7 @@ struct peer *new_peer(struct lightningd *ld, u64 dbid, peer->connected_incoming = connected_incoming; peer->remote_addr = NULL; list_head_init(&peer->channels); - peer->direction = node_id_idx(&peer->ld->id, &peer->id); + peer->direction = node_id_idx(&peer->ld->our_nodeid, &peer->id); peer->connected = PEER_DISCONNECTED; peer->last_connect_attempt.ts.tv_sec = peer->last_connect_attempt.ts.tv_nsec = 0; @@ -348,7 +348,7 @@ static enum watch_result closed_inflight_depth_cb(struct lightningd *ld, } void drop_to_chain(struct lightningd *ld, struct channel *channel, - bool cooperative) + bool cooperative, bool rebroadcast) { struct channel_inflight *inflight; const char *cmd_id; @@ -387,6 +387,10 @@ void drop_to_chain(struct lightningd *ld, struct channel *channel, log_broken(channel->log, "Cannot broadcast our commitment tx:" " it's invalid! (ancient channel?)"); + } else if (!rebroadcast && !cooperative) { + log_unusual(channel->log, + "Not dropping our unilateral close onchain since " + "we already saw theirs confirm."); } else { struct bitcoin_tx *tx COMPILER_WANTS_INIT("gcc 12.3.0"); @@ -448,10 +452,10 @@ void resend_closing_transactions(struct lightningd *ld) case CLOSED: continue; case CLOSINGD_COMPLETE: - drop_to_chain(ld, channel, true); + drop_to_chain(ld, channel, true, true); continue; case AWAITING_UNILATERAL: - drop_to_chain(ld, channel, false); + drop_to_chain(ld, channel, false, true); continue; } abort(); @@ -901,7 +905,7 @@ static void NON_NULL_ARGS(1, 2, 4, 5) json_add_channel(struct command *cmd, * why bother if we can't use it? */ if (channel->scid || channel->alias[LOCAL] || channel->alias[REMOTE]) json_add_num(response, "direction", - node_id_idx(&ld->id, &channel->peer->id)); + node_id_idx(&ld->our_nodeid, &channel->peer->id)); json_add_string(response, "channel_id", fmt_channel_id(tmpctx, &channel->cid)); @@ -2300,9 +2304,7 @@ static struct command_result *json_listpeers(struct command *cmd, static const struct json_command listpeers_command = { "listpeers", - "network", json_listpeers, - "Show current peers, if {level} is set, include logs for {id}" }; /* Comment added to satisfice AUTODATA */ AUTODATA(json_command, &listpeers_command); @@ -2354,9 +2356,7 @@ static struct command_result *json_staticbackup(struct command *cmd, static const struct json_command staticbackup_command = { "staticbackup", - "backup", json_staticbackup, - "Returns SCB of all the channels currently present in the DB" }; /* Comment added to satisfice AUTODATA */ AUTODATA(json_command, &staticbackup_command); @@ -2415,9 +2415,7 @@ static struct command_result *json_listpeerchannels(struct command *cmd, static const struct json_command listpeerchannels_command = { "listpeerchannels", - "network", json_listpeerchannels, - "Show channels with direct peers." }; AUTODATA(json_command, &listpeerchannels_command); @@ -2656,9 +2654,7 @@ static struct command_result *json_disconnect(struct command *cmd, static const struct json_command disconnect_command = { "disconnect", - "network", json_disconnect, - "Disconnect from {id} that has previously been connected to using connect; with {force} set, even if it has a current channel" }; AUTODATA(json_command, &disconnect_command); @@ -2679,7 +2675,7 @@ static struct command_result *json_getinfo(struct command *cmd, return command_param_failed(); response = json_stream_success(cmd); - json_add_node_id(response, "id", &cmd->ld->id); + json_add_node_id(response, "id", &cmd->ld->our_nodeid); json_add_string(response, "alias", (const char *)cmd->ld->alias); json_add_hex_talarr(response, "color", cmd->ld->rgb); @@ -2795,9 +2791,7 @@ static struct command_result *json_getinfo(struct command *cmd, static const struct json_command getinfo_command = { "getinfo", - "utility", json_getinfo, - "Show information about this node" }; AUTODATA(json_command, &getinfo_command); @@ -2900,10 +2894,7 @@ static struct command_result *json_waitblockheight(struct command *cmd, static const struct json_command waitblockheight_command = { "waitblockheight", - "utility", &json_waitblockheight, - "Wait for the blockchain to reach {blockheight}, up to " - "{timeout} seconds." }; AUTODATA(json_command, &waitblockheight_command); @@ -3168,13 +3159,7 @@ static struct command_result *json_setchannel(struct command *cmd, static const struct json_command setchannel_command = { "setchannel", - "channels", json_setchannel, - "Sets fees and/or htlc_max for channel with {id} " - "(either peer ID, channel ID, short channel ID or 'all'). " - "If {feebase}, {feeppm} or {htlcmax} is missing, it is unchanged." - "{base} can also be defined in other units, for example '1sat'. " - "If {id} is 'all', the fees will be applied for all channels. " }; AUTODATA(json_command, &setchannel_command); @@ -3248,9 +3233,7 @@ static struct command_result *json_sign_last_tx(struct command *cmd, static const struct json_command dev_sign_last_tx = { "dev-sign-last-tx", - "developer", json_sign_last_tx, - "Sign and show the last commitment transaction with peer {id}", .dev_only = true, }; AUTODATA(json_command, &dev_sign_last_tx); @@ -3275,9 +3258,7 @@ static struct command_result *json_dev_fail(struct command *cmd, static const struct json_command dev_fail_command = { "dev-fail", - "developer", json_dev_fail, - "Fail with peer {id}", .dev_only = true, }; AUTODATA(json_command, &dev_fail_command); @@ -3324,9 +3305,7 @@ static struct command_result *json_dev_reenable_commit(struct command *cmd, static const struct json_command dev_reenable_commit = { "dev-reenable-commit", - "developer", json_dev_reenable_commit, - "Re-enable the commit timer on peer {id}", .dev_only = true, }; AUTODATA(json_command, &dev_reenable_commit); @@ -3439,10 +3418,7 @@ static struct command_result *json_dev_forget_channel(struct command *cmd, static const struct json_command dev_forget_channel_command = { "dev-forget-channel", - "developer", json_dev_forget_channel, - "Forget the channel with peer {id}, ignore UTXO check with {force}='true'.", - .verbose = "Forget the channel with peer {id}. Checks if the channel is still active by checking its funding transaction. Check can be ignored by setting {force} to 'true'", .dev_only = true, }; AUTODATA(json_command, &dev_forget_channel_command); diff --git a/lightningd/peer_control.h b/lightningd/peer_control.h index a693e0d87e08..face71198575 100644 --- a/lightningd/peer_control.h +++ b/lightningd/peer_control.h @@ -109,7 +109,16 @@ void peer_set_dbid(struct peer *peer, u64 dbid); /* At startup, re-send any transactions we want bitcoind to have */ void resend_closing_transactions(struct lightningd *ld); -void drop_to_chain(struct lightningd *ld, struct channel *channel, bool cooperative); +/** + * Initiate the close of a channel. + * + * @param rebroadcast: Whether we should be broadcasting our + * commitment transaction in order to close the channel, or not. + */ +void drop_to_chain(struct lightningd *ld, + struct channel *channel, + bool cooperative, + bool rebroadcast); void update_channel_from_inflight(struct lightningd *ld, struct channel *channel, diff --git a/lightningd/peer_htlcs.c b/lightningd/peer_htlcs.c index 19539036291c..f8f4202c93cd 100644 --- a/lightningd/peer_htlcs.c +++ b/lightningd/peer_htlcs.c @@ -2923,9 +2923,7 @@ static struct command_result *json_dev_ignore_htlcs(struct command *cmd, static const struct json_command dev_ignore_htlcs = { "dev-ignore-htlcs", - "developer", json_dev_ignore_htlcs, - "Set ignoring incoming HTLCs for peer {id} to {ignore}", .dev_only = true, }; @@ -3005,8 +3003,6 @@ static struct command_result *json_listhtlcs(struct command *cmd, static const struct json_command listhtlcs_command = { "listhtlcs", - "channels", json_listhtlcs, - "List all known HTLCS (optionally, just for [id] (scid or channel id))" }; AUTODATA(json_command, &listhtlcs_command); diff --git a/lightningd/ping.c b/lightningd/ping.c index 7b1767f762bc..58c9c3edd8cd 100644 --- a/lightningd/ping.c +++ b/lightningd/ping.c @@ -91,8 +91,6 @@ static struct command_result *json_ping(struct command *cmd, static const struct json_command ping_command = { "ping", - "network", json_ping, - "Send peer {id} a ping of length {len} (default 128) asking for {pongbytes} (default 128)" }; AUTODATA(json_command, &ping_command); diff --git a/lightningd/plugin.c b/lightningd/plugin.c index 21a394983041..1292b8914268 100644 --- a/lightningd/plugin.c +++ b/lightningd/plugin.c @@ -1389,15 +1389,11 @@ static const char *plugin_rpcmethod_add(struct plugin *plugin, const char *buffer, const jsmntok_t *meth) { - const jsmntok_t *nametok, *categorytok, *desctok, *longdesctok, - *usagetok, *deprtok; + const jsmntok_t *nametok, *usagetok, *deprtok; struct json_command *cmd; const char *usage, *err; nametok = json_get_member(buffer, meth, "name"); - categorytok = json_get_member(buffer, meth, "category"); - desctok = json_get_member(buffer, meth, "description"); - longdesctok = json_get_member(buffer, meth, "long_description"); usagetok = json_get_member(buffer, meth, "usage"); deprtok = json_get_member(buffer, meth, "deprecated"); @@ -1407,19 +1403,6 @@ static const char *plugin_rpcmethod_add(struct plugin *plugin, meth->end - meth->start, buffer + meth->start); } - if (!desctok || desctok->type != JSMN_STRING) { - return tal_fmt(plugin, - "rpcmethod does not have a string " - "\"description\": %.*s", - meth->end - meth->start, buffer + meth->start); - } - - if (longdesctok && longdesctok->type != JSMN_STRING) { - return tal_fmt(plugin, - "\"long_description\" is not a string: %.*s", - meth->end - meth->start, buffer + meth->start); - } - if (usagetok && usagetok->type != JSMN_STRING) { return tal_fmt(plugin, "\"usage\" is not a string: %.*s", @@ -1428,15 +1411,6 @@ static const char *plugin_rpcmethod_add(struct plugin *plugin, cmd = notleak(tal(plugin, struct json_command)); cmd->name = json_strdup(cmd, buffer, nametok); - if (categorytok) - cmd->category = json_strdup(cmd, buffer, categorytok); - else - cmd->category = "plugin"; - cmd->description = json_strdup(cmd, buffer, desctok); - if (longdesctok) - cmd->verbose = json_strdup(cmd, buffer, longdesctok); - else - cmd->verbose = cmd->description; if (usagetok) usage = json_strdup(tmpctx, buffer, usagetok); else diff --git a/lightningd/plugin_control.c b/lightningd/plugin_control.c index b26f804e1dcc..b4f6ec1a0539 100644 --- a/lightningd/plugin_control.c +++ b/lightningd/plugin_control.c @@ -307,21 +307,7 @@ static struct command_result *json_plugin_control(struct command *cmd, } static const struct json_command plugin_control_command = { - "plugin", "plugin", json_plugin_control, - "Control plugins (start, stop, startdir, rescan, list)", - .verbose = "Usage :\n" - "plugin start /path/to/a/plugin\n" - " adds a new plugin to Core Lightning\n" - "plugin stop plugin_name\n" - " stops an already registered plugin\n" - "plugin startdir /path/to/a/plugin_dir/\n" - " adds a new plugin directory\n" - "plugin rescan\n" - " loads not-already-loaded plugins from the default plugins dir\n" - "plugin list\n" - " lists all active plugins\n" - "\n" }; AUTODATA(json_command, &plugin_control_command); diff --git a/lightningd/runes.c b/lightningd/runes.c index d83ac3ea5870..d78d5fd34394 100644 --- a/lightningd/runes.c +++ b/lightningd/runes.c @@ -407,9 +407,7 @@ static struct command_result *json_showrunes(struct command *cmd, static const struct json_command showrunes_command = { "showrunes", - "utility", json_showrunes, - "Show the list of runes or decode an optional {rune}." }; AUTODATA(json_command, &showrunes_command); @@ -587,17 +585,13 @@ static struct command_result *json_createrune(struct command *cmd, static const struct json_command creatrune_command = { "createrune", - "utility", json_createrune, - "Create or restrict an optional {rune} with optional {restrictions} and returns {rune}" }; AUTODATA(json_command, &creatrune_command); static const struct json_command invokerune_command = { "invokerune", - "utility", json_createrune, - "Invoke or restrict an optional {rune} with optional {restrictions} and returns {rune}" }; AUTODATA(json_command, &invokerune_command); @@ -700,17 +694,13 @@ static struct command_result *json_blacklistrune(struct command *cmd, static const struct json_command blacklistrune_command = { "blacklistrune", - "utility", json_blacklistrune, - "Blacklist a rune or range of runes by taking an optional {start} and an optional {end} and returns {blacklist} array containing {start}, {end}" }; AUTODATA(json_command, &blacklistrune_command); static const struct json_command destroyrune_command = { "destroyrune", - "utility", json_blacklistrune, - "Destroy a rune or range of runes by taking an optional {start} and an optional {end} and returns {blacklist} array containing {start}, {end}" }; AUTODATA(json_command, &destroyrune_command); @@ -775,9 +765,9 @@ static const char *check_bolt12_condition(const tal_t *ctx, return rune_alt_single_missing(ctx, alt); return rune_alt_single_int(ctx, alt, *b12->invoice_amount); case INV_FIELD_NODE_ID: { - if (!b12->offer_node_id) + if (!b12->offer_issuer_id) return rune_alt_single_missing(ctx, alt); - const char *id = fmt_pubkey(tmpctx, b12->offer_node_id); + const char *id = fmt_pubkey(tmpctx, b12->offer_issuer_id); return rune_alt_single_str(ctx, alt, id, strlen(id)); } case INV_FIELD_DESCRIPTION: @@ -998,8 +988,6 @@ static struct command_result *json_checkrune(struct command *cmd, static const struct json_command checkrune_command = { "checkrune", - "utility", json_checkrune, - "Checks rune for validity with required {rune} and optional {nodeid}, {method}, {params} and returns {valid: true} or error message" }; AUTODATA(json_command, &checkrune_command); diff --git a/lightningd/signmessage.c b/lightningd/signmessage.c index 991da79e8190..07f5bb97780d 100644 --- a/lightningd/signmessage.c +++ b/lightningd/signmessage.c @@ -111,9 +111,7 @@ static struct command_result *json_signmessage(struct command *cmd, static const struct json_command json_signmessage_cmd = { "signmessage", - "utility", json_signmessage, - "Create a digital signature of {message}", }; AUTODATA(json_command, &json_signmessage_cmd); @@ -242,8 +240,6 @@ static struct command_result *json_checkmessage(struct command *cmd, static const struct json_command json_checkmessage_cmd = { "checkmessage", - "utility", json_checkmessage, - "Verify a digital signature {zbase} of {message} signed with {pubkey}", }; AUTODATA(json_command, &json_checkmessage_cmd); diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 1b3dec608cf7..ccd82f41bf64 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -51,6 +51,16 @@ char *bolt11_encode_(const tal_t *ctx UNNEEDED, void *arg) UNNEEDED, void *arg UNNEEDED) { fprintf(stderr, "bolt11_encode_ called!\n"); abort(); } +/* Generated stub for bolt12_path_id */ +u8 *bolt12_path_id(const tal_t *ctx UNNEEDED, + const struct secret *base_secret UNNEEDED, + const struct sha256 *payment_hash UNNEEDED) +{ fprintf(stderr, "bolt12_path_id called!\n"); abort(); } +/* Generated stub for bolt12_path_secret */ +void bolt12_path_secret(const struct secret *base_secret UNNEEDED, + const struct sha256 *payment_hash UNNEEDED, + struct secret *path_secret UNNEEDED) +{ fprintf(stderr, "bolt12_path_secret called!\n"); abort(); } /* Generated stub for broadcast_tx_ */ void broadcast_tx_(const tal_t *ctx UNNEEDED, struct chain_topology *topo UNNEEDED, @@ -391,11 +401,6 @@ char *invoice_encode(const tal_t *ctx UNNEEDED, const struct tlv_invoice *bolt12 /* Generated stub for invoice_offer_id */ void invoice_offer_id(const struct tlv_invoice *invoice UNNEEDED, struct sha256 *id UNNEEDED) { fprintf(stderr, "invoice_offer_id called!\n"); abort(); } -/* Generated stub for invoice_path_id */ -u8 *invoice_path_id(const tal_t *ctx UNNEEDED, - const struct secret *base_secret UNNEEDED, - const struct sha256 *payment_hash UNNEEDED) -{ fprintf(stderr, "invoice_path_id called!\n"); abort(); } /* Generated stub for invoices_create */ bool invoices_create(struct invoices *invoices UNNEEDED, u64 *inv_dbid UNNEEDED, diff --git a/lightningd/wait.c b/lightningd/wait.c index 24bcf3907c7d..4d045ac216f6 100644 --- a/lightningd/wait.c +++ b/lightningd/wait.c @@ -213,8 +213,6 @@ static struct command_result *json_wait(struct command *cmd, static const struct json_command wait_command = { "wait", - "utility", json_wait, - "Wait for {subsystem} {indexname} to reach or exceed {value})" }; AUTODATA(json_command, &wait_command); diff --git a/onchaind/onchaind.c b/onchaind/onchaind.c index 537ff976b068..d721e61f0a8e 100644 --- a/onchaind/onchaind.c +++ b/onchaind/onchaind.c @@ -48,8 +48,6 @@ static u32 to_self_delay[NUM_SIDES]; /* Where we send money to (our wallet) */ static u32 our_wallet_index; -static struct ext_key our_wallet_ext_key; -static struct pubkey our_wallet_pubkey; /* Their revocation secret (only if they cheated). */ static const struct secret *remote_per_commitment_secret; @@ -3432,8 +3430,6 @@ int main(int argc, char *argv[]) &scriptpubkey[LOCAL], &scriptpubkey[REMOTE], &our_wallet_index, - &our_wallet_ext_key, - &our_wallet_pubkey, &opener, &basepoints[LOCAL], &basepoints[REMOTE], @@ -3467,14 +3463,15 @@ int main(int argc, char *argv[]) FUNDING_OUTPUT, NULL, NULL, NULL); /* Record funding output spent */ - send_coin_mvt(take(new_coin_channel_close(NULL, &tx->txid, + send_coin_mvt(take(new_coin_channel_close(NULL, NULL, &tx->txid, &funding, tx_blockheight, our_msat, funding_sats, is_elements(chainparams) ? /* Minus 1, fee output */ tal_count(tx->outputs) - 1 : - tal_count(tx->outputs)))); + tal_count(tx->outputs), + /* is_splice? */ false))); status_debug("Remote per-commit point: %s", fmt_pubkey(tmpctx, &remote_per_commit_point)); diff --git a/onchaind/onchaind_wire.csv b/onchaind/onchaind_wire.csv index 32d5d37d2c96..d75b3ab65e86 100644 --- a/onchaind/onchaind_wire.csv +++ b/onchaind/onchaind_wire.csv @@ -28,8 +28,6 @@ msgdata,onchaind_init,local_scriptpubkey,u8,local_scriptpubkey_len msgdata,onchaind_init,remote_scriptpubkey_len,u16, msgdata,onchaind_init,remote_scriptpubkey,u8,remote_scriptpubkey_len msgdata,onchaind_init,ourwallet_index,u32, -msgdata,onchaind_init,ourwallet_ext_key,ext_key, -msgdata,onchaind_init,ourwallet_pubkey,pubkey, # We need these two for commit number obscurer msgdata,onchaind_init,opener,enum side, msgdata,onchaind_init,local_basepoints,basepoints, diff --git a/onchaind/test/run-grind_feerate-bug.c b/onchaind/test/run-grind_feerate-bug.c index 227210b0128b..30a31b0b89f4 100644 --- a/onchaind/test/run-grind_feerate-bug.c +++ b/onchaind/test/run-grind_feerate-bug.c @@ -42,9 +42,6 @@ void fromwire_basepoints(const u8 **ptr UNNEEDED, size_t *max UNNEEDED, /* Generated stub for fromwire_chain_coin_mvt */ void fromwire_chain_coin_mvt(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct chain_coin_mvt *mvt UNNEEDED) { fprintf(stderr, "fromwire_chain_coin_mvt called!\n"); abort(); } -/* Generated stub for fromwire_ext_key */ -void fromwire_ext_key(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct ext_key *bip32 UNNEEDED) -{ fprintf(stderr, "fromwire_ext_key called!\n"); abort(); } /* Generated stub for fromwire_hsmd_get_per_commitment_point_reply */ bool fromwire_hsmd_get_per_commitment_point_reply(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, struct pubkey *per_commitment_point UNNEEDED, struct secret **old_commitment_secret UNNEEDED) { fprintf(stderr, "fromwire_hsmd_get_per_commitment_point_reply called!\n"); abort(); } @@ -106,12 +103,14 @@ void memleak_status_broken(void *unused UNNEEDED, const char *fmt UNNEEDED, ...) { fprintf(stderr, "memleak_status_broken called!\n"); abort(); } /* Generated stub for new_coin_channel_close */ struct chain_coin_mvt *new_coin_channel_close(const tal_t *ctx UNNEEDED, + const struct channel_id *chan_id UNNEEDED, const struct bitcoin_txid *txid UNNEEDED, const struct bitcoin_outpoint *out UNNEEDED, u32 blockheight UNNEEDED, const struct amount_msat amount UNNEEDED, const struct amount_sat output_val UNNEEDED, - u32 output_count) + u32 output_count UNNEEDED, + bool is_splice) { fprintf(stderr, "new_coin_channel_close called!\n"); abort(); } /* Generated stub for new_coin_external_deposit */ @@ -225,9 +224,6 @@ void towire_basepoints(u8 **pptr UNNEEDED, const struct basepoints *b UNNEEDED) /* Generated stub for towire_chain_coin_mvt */ void towire_chain_coin_mvt(u8 **pptr UNNEEDED, const struct chain_coin_mvt *mvt UNNEEDED) { fprintf(stderr, "towire_chain_coin_mvt called!\n"); abort(); } -/* Generated stub for towire_ext_key */ -void towire_ext_key(u8 **pptr UNNEEDED, const struct ext_key *bip32 UNNEEDED) -{ fprintf(stderr, "towire_ext_key called!\n"); abort(); } /* Generated stub for towire_hsmd_get_per_commitment_point */ u8 *towire_hsmd_get_per_commitment_point(const tal_t *ctx UNNEEDED, u64 n UNNEEDED) { fprintf(stderr, "towire_hsmd_get_per_commitment_point called!\n"); abort(); } diff --git a/onchaind/test/run-grind_feerate.c b/onchaind/test/run-grind_feerate.c index 06485657dc12..bc10c960ad44 100644 --- a/onchaind/test/run-grind_feerate.c +++ b/onchaind/test/run-grind_feerate.c @@ -56,7 +56,7 @@ bool fromwire_onchaind_dev_memleak(const void *p UNNEEDED) bool fromwire_onchaind_htlcs(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, struct htlc_stub **htlc UNNEEDED, bool **tell_if_missing UNNEEDED, bool **tell_immediately UNNEEDED) { fprintf(stderr, "fromwire_onchaind_htlcs called!\n"); abort(); } /* Generated stub for fromwire_onchaind_init */ -bool fromwire_onchaind_init(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, struct shachain *shachain UNNEEDED, const struct chainparams **chainparams UNNEEDED, struct amount_sat *funding_amount_satoshi UNNEEDED, struct amount_msat *our_msat UNNEEDED, struct pubkey *old_remote_per_commitment_point UNNEEDED, struct pubkey *remote_per_commitment_point UNNEEDED, u32 *local_to_self_delay UNNEEDED, u32 *remote_to_self_delay UNNEEDED, struct amount_sat *local_dust_limit_satoshi UNNEEDED, struct bitcoin_txid *our_broadcast_txid UNNEEDED, u8 **local_scriptpubkey UNNEEDED, u8 **remote_scriptpubkey UNNEEDED, u32 *ourwallet_index UNNEEDED, struct ext_key *ourwallet_ext_key UNNEEDED, struct pubkey *ourwallet_pubkey UNNEEDED, enum side *opener UNNEEDED, struct basepoints *local_basepoints UNNEEDED, struct basepoints *remote_basepoints UNNEEDED, struct tx_parts **tx_parts UNNEEDED, u32 *locktime UNNEEDED, u32 *tx_blockheight UNNEEDED, u32 *reasonable_depth UNNEEDED, struct bitcoin_signature **htlc_signature UNNEEDED, u32 *min_possible_feerate UNNEEDED, u32 *max_possible_feerate UNNEEDED, struct pubkey *local_funding_pubkey UNNEEDED, struct pubkey *remote_funding_pubkey UNNEEDED, u64 *local_static_remotekey_start UNNEEDED, u64 *remote_static_remotekey_start UNNEEDED, bool *option_anchor_outputs UNNEEDED, bool *option_anchors_zero_fee_htlc_tx UNNEEDED, u32 *min_relay_feerate UNNEEDED) +bool fromwire_onchaind_init(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, struct shachain *shachain UNNEEDED, const struct chainparams **chainparams UNNEEDED, struct amount_sat *funding_amount_satoshi UNNEEDED, struct amount_msat *our_msat UNNEEDED, struct pubkey *old_remote_per_commitment_point UNNEEDED, struct pubkey *remote_per_commitment_point UNNEEDED, u32 *local_to_self_delay UNNEEDED, u32 *remote_to_self_delay UNNEEDED, struct amount_sat *local_dust_limit_satoshi UNNEEDED, struct bitcoin_txid *our_broadcast_txid UNNEEDED, u8 **local_scriptpubkey UNNEEDED, u8 **remote_scriptpubkey UNNEEDED, u32 *ourwallet_index UNNEEDED, enum side *opener UNNEEDED, struct basepoints *local_basepoints UNNEEDED, struct basepoints *remote_basepoints UNNEEDED, struct tx_parts **tx_parts UNNEEDED, u32 *locktime UNNEEDED, u32 *tx_blockheight UNNEEDED, u32 *reasonable_depth UNNEEDED, struct bitcoin_signature **htlc_signature UNNEEDED, u32 *min_possible_feerate UNNEEDED, u32 *max_possible_feerate UNNEEDED, struct pubkey *local_funding_pubkey UNNEEDED, struct pubkey *remote_funding_pubkey UNNEEDED, u64 *local_static_remotekey_start UNNEEDED, u64 *remote_static_remotekey_start UNNEEDED, bool *option_anchor_outputs UNNEEDED, bool *option_anchors_zero_fee_htlc_tx UNNEEDED, u32 *min_relay_feerate UNNEEDED) { fprintf(stderr, "fromwire_onchaind_init called!\n"); abort(); } /* Generated stub for fromwire_onchaind_known_preimage */ bool fromwire_onchaind_known_preimage(const void *p UNNEEDED, struct preimage *preimage UNNEEDED) @@ -153,12 +153,14 @@ void memleak_status_broken(void *unused UNNEEDED, const char *fmt UNNEEDED, ...) { fprintf(stderr, "memleak_status_broken called!\n"); abort(); } /* Generated stub for new_coin_channel_close */ struct chain_coin_mvt *new_coin_channel_close(const tal_t *ctx UNNEEDED, + const struct channel_id *chan_id UNNEEDED, const struct bitcoin_txid *txid UNNEEDED, const struct bitcoin_outpoint *out UNNEEDED, u32 blockheight UNNEEDED, const struct amount_msat amount UNNEEDED, const struct amount_sat output_val UNNEEDED, - u32 output_count) + u32 output_count UNNEEDED, + bool is_splice) { fprintf(stderr, "new_coin_channel_close called!\n"); abort(); } /* Generated stub for new_coin_external_deposit */ diff --git a/plugins/Makefile b/plugins/Makefile index 10f8e3a7d44c..398226f99ba3 100644 --- a/plugins/Makefile +++ b/plugins/Makefile @@ -100,7 +100,8 @@ C_PLUGINS := \ plugins/recover \ plugins/txprepare \ plugins/cln-renepay \ - plugins/spenderp + plugins/spenderp \ + plugins/cln-askrene PY_PLUGINS := \ plugins/clnrest/clnrest \ @@ -176,6 +177,7 @@ PLUGIN_COMMON_OBJS := \ wire/tlvstream.o \ wire/towire.o +include plugins/askrene/Makefile include plugins/bkpr/Makefile include plugins/renepay/Makefile @@ -208,7 +210,7 @@ $(PLUGIN_KEYSEND_OBJS): $(PLUGIN_PAY_LIB_HEADER) plugins/spenderp: bitcoin/block.o bitcoin/preimage.o bitcoin/psbt.o common/psbt_open.o common/json_channel_type.o common/channel_type.o common/features.o wire/peer_wiregen.o $(PLUGIN_SPENDER_OBJS) $(PLUGIN_LIB_OBJS) $(PLUGIN_COMMON_OBJS) $(JSMN_OBJS) -plugins/offers: $(PLUGIN_OFFERS_OBJS) $(PLUGIN_LIB_OBJS) $(PLUGIN_COMMON_OBJS) common/addr.o common/bolt12.o common/bolt12_merkle.o common/bolt11_json.o common/iso4217.o $(WIRE_OBJS) $(WIRE_BOLT12_OBJS) bitcoin/block.o common/channel_id.o bitcoin/preimage.o common/blindedpath.o common/invoice_path_id.o common/blinding.o common/hmac.o common/json_blinded_path.o common/gossmap.o common/fp16.o $(JSMN_OBJS) common/dijkstra.o common/route.o common/gossmods_listpeerchannels.o common/onion_message.o +plugins/offers: $(PLUGIN_OFFERS_OBJS) $(PLUGIN_LIB_OBJS) $(PLUGIN_COMMON_OBJS) common/addr.o common/bolt12.o common/bolt12_merkle.o common/bolt11_json.o common/iso4217.o $(WIRE_OBJS) $(WIRE_BOLT12_OBJS) bitcoin/block.o common/channel_id.o bitcoin/preimage.o common/blindedpath.o common/bolt12_id.o common/blinding.o common/hmac.o common/json_blinded_path.o common/gossmap.o common/fp16.o $(JSMN_OBJS) common/dijkstra.o common/route.o common/gossmods_listpeerchannels.o common/onion_message.o plugins/funder: bitcoin/psbt.o common/psbt_open.o $(PLUGIN_FUNDER_OBJS) $(PLUGIN_LIB_OBJS) $(PLUGIN_COMMON_OBJS) $(JSMN_OBJS) diff --git a/plugins/askrene/Makefile b/plugins/askrene/Makefile new file mode 100644 index 000000000000..3deece30db6c --- /dev/null +++ b/plugins/askrene/Makefile @@ -0,0 +1,10 @@ +PLUGIN_ASKRENE_SRC := plugins/askrene/askrene.c plugins/askrene/layer.c plugins/askrene/reserve.c plugins/askrene/mcf.c plugins/askrene/dijkstra.c plugins/askrene/flow.c +PLUGIN_ASKRENE_HEADER := plugins/askrene/askrene.h plugins/askrene/layer.h plugins/askrene/reserve.h plugins/askrene/mcf.h plugins/askrene/dijkstra.h plugins/askrene/flow.h +PLUGIN_ASKRENE_OBJS := $(PLUGIN_ASKRENE_SRC:.c=.o) + +$(PLUGIN_ASKRENE_OBJS): $(PLUGIN_ASKRENE_HEADER) + +ALL_C_SOURCES += $(PLUGIN_ASKRENE_SRC) +ALL_C_HEADERS += $(PLUGIN_ASKRENE_HEADER) + +plugins/cln-askrene: $(PLUGIN_ASKRENE_OBJS) $(PLUGIN_LIB_OBJS) $(PLUGIN_COMMON_OBJS) $(JSMN_OBJS) $(CCAN_OBJS) bitcoin/chainparams.o common/gossmap.o common/sciddir_or_pubkey.o common/gossmods_listpeerchannels.o common/fp16.o common/dijkstra.o common/bolt12.o common/bolt12_merkle.o wire/bolt12_wiregen.o wire/onion_wiregen.o diff --git a/plugins/askrene/askrene.c b/plugins/askrene/askrene.c new file mode 100644 index 000000000000..075457c946a5 --- /dev/null +++ b/plugins/askrene/askrene.c @@ -0,0 +1,915 @@ +/* All your payment questions answered! + * + * This powerful oracle combines data from the network, and then + * determines optimal routes. + * + * When you feed it information, these are remembered as "layers", so you + * can ask questions with (or without) certain layers. + */ +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct askrene *get_askrene(struct plugin *plugin) +{ + return plugin_get_data(plugin, struct askrene); +} + +static bool have_layer(const char **layers, const char *name) +{ + for (size_t i = 0; i < tal_count(layers); i++) { + if (streq(layers[i], name)) + return true; + } + return false; +} + +/* JSON helpers */ +static struct command_result *param_string_array(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + const char ***arr) +{ + size_t i; + const jsmntok_t *t; + + if (tok->type != JSMN_ARRAY) + return command_fail_badparam(cmd, name, buffer, tok, "should be an array"); + + *arr = tal_arr(cmd, const char *, tok->size); + json_for_each_arr(i, t, tok) { + if (t->type != JSMN_STRING) + return command_fail_badparam(cmd, name, buffer, t, "should be a string"); + (*arr)[i] = json_strdup(*arr, buffer, t); + } + return NULL; +} + +static struct command_result *param_known_layer(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + struct layer **layer) +{ + const char *layername; + struct command_result *ret = param_string(cmd, name, buffer, tok, &layername); + if (ret) + return ret; + + *layer = find_layer(get_askrene(cmd->plugin), layername); + tal_free(layername); + if (!*layer) + return command_fail_badparam(cmd, name, buffer, tok, "Unknown layer"); + return NULL; +} + +static bool json_to_zero_or_one(const char *buffer, const jsmntok_t *tok, int *num) +{ + u32 v32; + if (!json_to_u32(buffer, tok, &v32)) + return false; + if (v32 != 0 && v32 != 1) + return false; + *num = v32; + return true; +} + +static struct command_result *param_zero_or_one(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + int **num) +{ + *num = tal(cmd, int); + if (json_to_zero_or_one(buffer, tok, *num)) + return NULL; + + return command_fail_badparam(cmd, name, buffer, tok, + "should be 0 or 1"); +} + +struct reserve_path { + struct short_channel_id_dir *scidds; + struct amount_msat *amounts; +}; + +static struct command_result *parse_reserve_path(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + struct short_channel_id_dir *scidd, + struct amount_msat *amount) +{ + const char *err; + + err = json_scan(tmpctx, buffer, tok, "{short_channel_id:%,direction:%,amount_msat:%s}", + JSON_SCAN(json_to_short_channel_id, &scidd->scid), + JSON_SCAN(json_to_zero_or_one, &scidd->dir), + JSON_SCAN(json_to_msat, amount)); + if (err) + return command_fail_badparam(cmd, name, buffer, tok, err); + return NULL; +} + +static struct command_result *param_reserve_path(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + struct reserve_path **path) +{ + size_t i; + const jsmntok_t *t; + + if (tok->type != JSMN_ARRAY) + return command_fail_badparam(cmd, name, buffer, tok, "should be an array"); + + *path = tal(cmd, struct reserve_path); + (*path)->scidds = tal_arr(cmd, struct short_channel_id_dir, tok->size); + (*path)->amounts = tal_arr(cmd, struct amount_msat, tok->size); + json_for_each_arr(i, t, tok) { + struct command_result *ret; + + ret = parse_reserve_path(cmd, name, buffer, t, + &(*path)->scidds[i], + &(*path)->amounts[i]); + if (ret) + return ret; + } + return NULL; +} + +static fp16_t *get_capacities(const tal_t *ctx, + struct plugin *plugin, struct gossmap *gossmap) +{ + fp16_t *caps; + struct gossmap_chan *c; + + caps = tal_arrz(ctx, fp16_t, gossmap_max_chan_idx(gossmap)); + + for (c = gossmap_first_chan(gossmap); + c; + c = gossmap_next_chan(gossmap, c)) { + struct amount_sat cap; + + if (!gossmap_chan_get_capacity(gossmap, c, &cap)) { + plugin_log(plugin, LOG_BROKEN, + "get_capacity failed for channel?"); + cap = AMOUNT_SAT(0); + } + caps[gossmap_chan_idx(gossmap, c)] + = u64_to_fp16(cap.satoshis, true); /* Raw: fp16 */ + } + return caps; +} + +/* If we're the payer, we don't add delay or fee to our own outgoing + * channels. This wouldn't be right if we looped back through ourselves, + * but we won't. */ +/* FIXME: We could cache this until gossmap changes... */ +static void add_free_source(struct plugin *plugin, + struct gossmap *gossmap, + struct gossmap_localmods *localmods, + const struct node_id *source) +{ + const struct gossmap_node *srcnode; + + /* If we're not in map, we complain later (unless we're purely + * using local channels) */ + srcnode = gossmap_find_node(gossmap, source); + if (!srcnode) + return; + + for (size_t i = 0; i < srcnode->num_chans; i++) { + struct gossmap_chan *c; + int dir; + struct short_channel_id scid; + + c = gossmap_nth_chan(gossmap, srcnode, i, &dir); + scid = gossmap_chan_scid(gossmap, c); + if (!gossmap_local_updatechan(localmods, + scid, + /* Keep min and max */ + gossmap_chan_htlc_min(c, dir), + gossmap_chan_htlc_max(c, dir), + 0, 0, 0, + /* Keep enabled flag */ + c->half[dir].enabled, + dir)) + plugin_err(plugin, "Could not zero fee on local %s", + fmt_short_channel_id(tmpctx, scid)); + } +} + +/* Returns an error message, or sets *routes */ +static const char *get_routes(const tal_t *ctx, + struct plugin *plugin, + const struct node_id *source, + const struct node_id *dest, + struct amount_msat amount, + struct amount_msat maxfee, + u32 finalcltv, + const char **layers, + struct gossmap_localmods *localmods, + const struct layer *local_layer, + struct route ***routes, + struct amount_msat **amounts, + double *probability) +{ + struct askrene *askrene = get_askrene(plugin); + struct route_query *rq = tal(ctx, struct route_query); + struct flow **flows; + const struct gossmap_node *srcnode, *dstnode; + double delay_feefactor; + double base_fee_penalty; + u32 prob_cost_factor, mu; + const char *ret; + bool zero_cost; + + if (gossmap_refresh(askrene->gossmap, NULL)) { + /* FIXME: gossmap_refresh callbacks to we can update in place */ + tal_free(askrene->capacities); + askrene->capacities = get_capacities(askrene, askrene->plugin, askrene->gossmap); + } + + rq->plugin = plugin; + rq->gossmap = askrene->gossmap; + rq->reserved = askrene->reserved; + rq->layers = tal_arr(rq, const struct layer *, 0); + rq->capacities = tal_dup_talarr(rq, fp16_t, askrene->capacities); + + /* If we're told to zerocost local channels, then make sure that's done + * in local mods as well. */ + zero_cost = have_layer(layers, "auto.sourcefree") + && node_id_eq(source, &askrene->my_id); + + /* Layers don't have to exist: they might be empty! */ + for (size_t i = 0; i < tal_count(layers); i++) { + const struct layer *l = find_layer(askrene, layers[i]); + if (!l) { + if (local_layer && streq(layers[i], "auto.localchans")) { + plugin_log(plugin, LOG_DBG, "Adding auto.localchans"); + l = local_layer; + } else + continue; + } + + tal_arr_expand(&rq->layers, l); + /* FIXME: Implement localmods_merge, and cache this in layer? */ + layer_add_localmods(l, rq->gossmap, zero_cost, localmods); + + /* Clear any entries in capacities array if we + * override them (incl local channels) */ + layer_clear_overridden_capacities(l, askrene->gossmap, rq->capacities); + } + + /* This does not see local mods! If you add local channel in a layer, it won't + * have costs zeroed out here. */ + if (have_layer(layers, "auto.sourcefree")) + add_free_source(plugin, askrene->gossmap, localmods, source); + + /* Clear scids with reservations, too, so we don't have to look up + * all the time! */ + reserves_clear_capacities(askrene->reserved, askrene->gossmap, rq->capacities); + + gossmap_apply_localmods(askrene->gossmap, localmods); + + srcnode = gossmap_find_node(askrene->gossmap, source); + if (!srcnode) { + ret = tal_fmt(ctx, "Unknown source node %s", fmt_node_id(tmpctx, source)); + goto out; + } + + dstnode = gossmap_find_node(askrene->gossmap, dest); + if (!dstnode) { + ret = tal_fmt(ctx, "Unknown destination node %s", fmt_node_id(tmpctx, dest)); + goto out; + } + + delay_feefactor = 1.0/1000000; + base_fee_penalty = 10.0; + + /* From mcf.c: The input parameter `prob_cost_factor` in the function + * `minflow` is defined as the PPM from the delivery amount `T` we are + * *willing to pay* to increase the prob. of success by 0.1% */ + + /* This value is somewhat implied by our fee budget: say we would pay + * the entire budget for 100% probability, that means prob_cost_factor + * is (fee / amount) / 1000, or in PPM: (fee / amount) * 1000 */ + if (amount_msat_zero(amount)) + prob_cost_factor = 0; + else + prob_cost_factor = amount_msat_ratio(maxfee, amount) * 1000; + + /* First up, don't care about fees. */ + mu = 0; + flows = minflow(rq, rq, srcnode, dstnode, amount, + mu, delay_feefactor, base_fee_penalty, prob_cost_factor); + if (!flows) { + /* FIXME: disjktra here to see if there is any route, and + * diagnose problem (offline peers? Not enough capacity at + * our end? Not enough at theirs?) */ + ret = tal_fmt(ctx, "Could not find route"); + goto out; + } + + /* Too much delay? */ + /* BOLT #4: + * ## `max_htlc_cltv` Selection + * + * This ... value is defined as 2016 blocks, based on historical value + * deployed by Lightning implementations. + */ + /* FIXME: Typo in spec for CLTV in descripton! But it breaks our spelling check, so we omit it above */ + while (finalcltv + flows_worst_delay(flows) > 2016) { + delay_feefactor *= 2; + flows = minflow(rq, rq, srcnode, dstnode, amount, + mu, delay_feefactor, base_fee_penalty, prob_cost_factor); + if (!flows || delay_feefactor > 10) { + ret = tal_fmt(ctx, "Could not find route without excessive delays"); + goto out; + } + } + + /* Too expensive? */ + while (amount_msat_greater(flowset_fee(plugin, flows), maxfee)) { + mu += 10; + flows = minflow(rq, rq, srcnode, dstnode, amount, + mu, delay_feefactor, base_fee_penalty, prob_cost_factor); + if (!flows || mu == 100) { + ret = tal_fmt(ctx, "Could not find route without excessive cost"); + goto out; + } + } + + if (finalcltv + flows_worst_delay(flows) > 2016) { + ret = tal_fmt(ctx, "Could not find route without excessive cost or delays"); + goto out; + } + + /* Convert back into routes, with delay and other information fixed */ + *routes = tal_arr(ctx, struct route *, tal_count(flows)); + *amounts = tal_arr(ctx, struct amount_msat, tal_count(flows)); + for (size_t i = 0; i < tal_count(flows); i++) { + struct route *r; + struct amount_msat msat; + u32 delay; + + (*routes)[i] = r = tal(*routes, struct route); + /* FIXME: flow_probability doesn't take into account other flows! */ + r->success_prob = flows[i]->success_prob; + r->hops = tal_arr(r, struct route_hop, tal_count(flows[i]->path)); + + /* Fill in backwards to calc amount and delay */ + msat = flows[i]->amount; + delay = finalcltv; + + for (int j = tal_count(flows[i]->path) - 1; j >= 0; j--) { + struct route_hop *rh = &r->hops[j]; + struct gossmap_node *far_end; + const struct half_chan *h = flow_edge(flows[i], j); + + if (!amount_msat_add_fee(&msat, h->base_fee, h->proportional_fee)) + plugin_err(plugin, "Adding fee to amount"); + delay += h->delay; + + rh->scid = gossmap_chan_scid(rq->gossmap, flows[i]->path[j]); + rh->direction = flows[i]->dirs[j]; + far_end = gossmap_nth_node(rq->gossmap, flows[i]->path[j], !flows[i]->dirs[j]); + gossmap_node_get_id(rq->gossmap, far_end, &rh->node_id); + rh->amount = msat; + rh->delay = delay; + } + (*amounts)[i] = flow_delivers(flows[i]); + } + + *probability = flowset_probability(flows, rq); + ret = NULL; + +out: + gossmap_remove_localmods(askrene->gossmap, localmods); + return ret; +} + +void get_constraints(const struct route_query *rq, + const struct gossmap_chan *chan, + int dir, + struct amount_msat *min, + struct amount_msat *max) +{ + struct short_channel_id_dir scidd; + const struct reserve *reserve; + size_t idx = gossmap_chan_idx(rq->gossmap, chan); + + *min = AMOUNT_MSAT(0); + + /* Fast path: no information known, no reserve. */ + if (idx < tal_count(rq->capacities) && rq->capacities[idx] != 0) { + *max = amount_msat(fp16_to_u64(rq->capacities[idx]) * 1000); + return; + } + + /* Naive implementation! */ + scidd.scid = gossmap_chan_scid(rq->gossmap, chan); + scidd.dir = dir; + *max = AMOUNT_MSAT(-1ULL); + + /* Look through layers for any constraints */ + for (size_t i = 0; i < tal_count(rq->layers); i++) { + const struct constraint *cmin, *cmax; + cmin = layer_find_constraint(rq->layers[i], &scidd, CONSTRAINT_MIN); + if (cmin && amount_msat_greater(cmin->limit, *min)) + *min = cmin->limit; + cmax = layer_find_constraint(rq->layers[i], &scidd, CONSTRAINT_MAX); + if (cmax && amount_msat_less(cmax->limit, *max)) + *max = cmax->limit; + } + + /* Might be here because it's reserved, but capacity is normal. */ + if (amount_msat_eq(*max, AMOUNT_MSAT(-1ULL))) { + struct amount_sat cap; + if (gossmap_chan_get_capacity(rq->gossmap, chan, &cap)) { + /* Shouldn't happen! */ + if (!amount_sat_to_msat(max, cap)) { + plugin_log(rq->plugin, LOG_BROKEN, + "Local channel %s with capacity %s?", + fmt_short_channel_id(tmpctx, scidd.scid), + fmt_amount_sat(tmpctx, cap)); + } + } else { + /* Shouldn't happen: local channels have explicit constraints */ + plugin_log(rq->plugin, LOG_BROKEN, + "Channel %s without capacity?", + fmt_short_channel_id(tmpctx, scidd.scid)); + } + } + + /* Finally, if any is in use, subtract that! */ + reserve = find_reserve(rq->reserved, &scidd); + if (reserve) { + /* They can definitely *try* to push too much through a channel! */ + if (!amount_msat_sub(min, *min, reserve->amount)) + *min = AMOUNT_MSAT(0); + if (!amount_msat_sub(max, *max, reserve->amount)) + *max = AMOUNT_MSAT(0); + } +} + +struct getroutes_info { + struct node_id *source, *dest; + struct amount_msat *amount, *maxfee; + u32 *finalcltv; + const char **layers; +}; + +static struct command_result *do_getroutes(struct command *cmd, + struct gossmap_localmods *localmods, + const struct layer *local_layer, + const struct getroutes_info *info) +{ + const char *err; + double probability; + struct amount_msat *amounts; + struct route **routes; + struct json_stream *response; + + err = get_routes(cmd, cmd->plugin, + info->source, info->dest, + *info->amount, *info->maxfee, *info->finalcltv, + info->layers, localmods, local_layer, + &routes, &amounts, &probability); + if (err) + return command_fail(cmd, PAY_ROUTE_NOT_FOUND, "%s", err); + + response = jsonrpc_stream_success(cmd); + json_add_u64(response, "probability_ppm", (u64)(probability * 1000000)); + json_array_start(response, "routes"); + for (size_t i = 0; i < tal_count(routes); i++) { + json_object_start(response, NULL); + json_add_u64(response, "probability_ppm", (u64)(routes[i]->success_prob * 1000000)); + json_add_amount_msat(response, "amount_msat", amounts[i]); + json_array_start(response, "path"); + for (size_t j = 0; j < tal_count(routes[i]->hops); j++) { + const struct route_hop *r = &routes[i]->hops[j]; + json_object_start(response, NULL); + json_add_short_channel_id(response, "short_channel_id", r->scid); + json_add_u32(response, "direction", r->direction); + json_add_node_id(response, "next_node_id", &r->node_id); + json_add_amount_msat(response, "amount_msat", r->amount); + json_add_u32(response, "delay", r->delay); + json_object_end(response); + } + json_array_end(response); + json_object_end(response); + } + json_array_end(response); + return command_finished(cmd, response); +} + +static void add_localchan(struct gossmap_localmods *mods, + const struct node_id *self, + const struct node_id *peer, + const struct short_channel_id_dir *scidd, + struct amount_msat htlcmin, + struct amount_msat htlcmax, + struct amount_msat spendable, + struct amount_msat fee_base, + u32 fee_proportional, + u32 cltv_delta, + bool enabled, + const char *buf UNUSED, + const jsmntok_t *chantok UNUSED, + struct layer *local_layer) +{ + gossmod_add_localchan(mods, self, peer, scidd, htlcmin, htlcmax, + spendable, fee_base, fee_proportional, cltv_delta, enabled, + buf, chantok, local_layer); + + /* Known capacity on local channels (ts = max) */ + layer_update_constraint(local_layer, scidd, CONSTRAINT_MIN, UINT64_MAX, spendable); + layer_update_constraint(local_layer, scidd, CONSTRAINT_MAX, UINT64_MAX, spendable); +} + +static struct command_result * +listpeerchannels_done(struct command *cmd, + const char *buffer, + const jsmntok_t *toks, + struct getroutes_info *info) +{ + struct layer *local_layer = new_temp_layer(info, "auto.localchans"); + struct gossmap_localmods *localmods; + bool zero_cost; + + /* If we're told to zerocost local channels, then make sure that's done + * in local mods as well. */ + zero_cost = have_layer(info->layers, "auto.sourcefree") + && node_id_eq(info->source, &get_askrene(cmd->plugin)->my_id); + + localmods = gossmods_from_listpeerchannels(cmd, + &get_askrene(cmd->plugin)->my_id, + buffer, toks, + zero_cost, + add_localchan, + local_layer); + + return do_getroutes(cmd, localmods, local_layer, info); +} + +static struct command_result *json_getroutes(struct command *cmd, + const char *buffer, + const jsmntok_t *params) +{ + struct getroutes_info *info = tal(cmd, struct getroutes_info); + + if (!param(cmd, buffer, params, + p_req("source", param_node_id, &info->source), + p_req("destination", param_node_id, &info->dest), + p_req("amount_msat", param_msat, &info->amount), + p_req("layers", param_string_array, &info->layers), + p_req("maxfee_msat", param_msat, &info->maxfee), + p_req("finalcltv", param_u32, &info->finalcltv), + NULL)) + return command_param_failed(); + + if (have_layer(info->layers, "auto.localchans")) { + struct out_req *req; + + req = jsonrpc_request_start(cmd->plugin, cmd, + "listpeerchannels", + listpeerchannels_done, + forward_error, info); + return send_outreq(cmd->plugin, req); + } + + return do_getroutes(cmd, gossmap_localmods_new(cmd), NULL, info); +} + +static struct command_result *json_askrene_reserve(struct command *cmd, + const char *buffer, + const jsmntok_t *params) +{ + struct reserve_path *path; + struct json_stream *response; + size_t num; + struct askrene *askrene = get_askrene(cmd->plugin); + + if (!param(cmd, buffer, params, + p_req("path", param_reserve_path, &path), + NULL)) + return command_param_failed(); + + num = reserves_add(askrene->reserved, path->scidds, path->amounts, + tal_count(path->scidds)); + if (num != tal_count(path->scidds)) { + const struct reserve *r = find_reserve(askrene->reserved, &path->scidds[num]); + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Overflow reserving %zu: %s amount %s (%s reserved already)", + num, + fmt_short_channel_id_dir(tmpctx, &path->scidds[num]), + fmt_amount_msat(tmpctx, path->amounts[num]), + r ? fmt_amount_msat(tmpctx, r->amount) : "none"); + } + + response = jsonrpc_stream_success(cmd); + return command_finished(cmd, response); +} + +static struct command_result *json_askrene_unreserve(struct command *cmd, + const char *buffer, + const jsmntok_t *params) +{ + struct reserve_path *path; + struct json_stream *response; + size_t num; + struct askrene *askrene = get_askrene(cmd->plugin); + + if (!param(cmd, buffer, params, + p_req("path", param_reserve_path, &path), + NULL)) + return command_param_failed(); + + num = reserves_remove(askrene->reserved, path->scidds, path->amounts, + tal_count(path->scidds)); + if (num != tal_count(path->scidds)) { + const struct reserve *r = find_reserve(askrene->reserved, &path->scidds[num]); + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Underflow unreserving %zu: %s amount %s (%zu reserved, amount %s)", + num, + fmt_short_channel_id_dir(tmpctx, &path->scidds[num]), + fmt_amount_msat(tmpctx, path->amounts[num]), + r ? r->num_htlcs : 0, + r ? fmt_amount_msat(tmpctx, r->amount) : "none"); + } + + response = jsonrpc_stream_success(cmd); + return command_finished(cmd, response); +} + +static struct command_result *param_layername(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + const char **str) +{ + *str = tal_strndup(cmd, buffer + tok->start, + tok->end - tok->start); + if (strstarts(*str, "auto.")) + return command_fail_badparam(cmd, name, buffer, tok, + "New layers cannot start with auto."); + return NULL; +} + +static struct command_result *json_askrene_create_channel(struct command *cmd, + const char *buffer, + const jsmntok_t *params) +{ + const char *layername; + struct layer *layer; + const struct local_channel *lc; + struct node_id *src, *dst; + struct short_channel_id *scid; + struct amount_msat *capacity; + struct json_stream *response; + struct amount_msat *htlc_min, *htlc_max, *base_fee; + u32 *proportional_fee; + u16 *delay; + struct askrene *askrene = get_askrene(cmd->plugin); + + if (!param_check(cmd, buffer, params, + p_req("layer", param_layername, &layername), + p_req("source", param_node_id, &src), + p_req("destination", param_node_id, &dst), + p_req("short_channel_id", param_short_channel_id, &scid), + p_req("capacity_msat", param_msat, &capacity), + p_req("htlc_minimum_msat", param_msat, &htlc_min), + p_req("htlc_maximum_msat", param_msat, &htlc_max), + p_req("fee_base_msat", param_msat, &base_fee), + p_req("fee_proportional_millionths", param_u32, &proportional_fee), + p_req("delay", param_u16, &delay), + NULL)) + return command_param_failed(); + + /* If it exists, it must match */ + layer = find_layer(askrene, layername); + if (layer) { + lc = layer_find_local_channel(layer, *scid); + if (lc && !layer_check_local_channel(lc, src, dst, *capacity)) { + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "channel already exists with different values!"); + } + } else + lc = NULL; + + if (command_check_only(cmd)) + return command_check_done(cmd); + + if (!layer) + layer = new_layer(askrene, layername); + + layer_update_local_channel(layer, src, dst, *scid, *capacity, + *base_fee, *proportional_fee, *delay, + *htlc_min, *htlc_max); + + response = jsonrpc_stream_success(cmd); + return command_finished(cmd, response); +} + +static struct command_result *json_askrene_inform_channel(struct command *cmd, + const char *buffer, + const jsmntok_t *params) +{ + struct layer *layer; + const char *layername; + struct short_channel_id *scid; + int *direction; + struct json_stream *response; + struct amount_msat *max, *min; + const struct constraint *c; + struct short_channel_id_dir scidd; + struct askrene *askrene = get_askrene(cmd->plugin); + + if (!param_check(cmd, buffer, params, + p_req("layer", param_layername, &layername), + p_req("short_channel_id", param_short_channel_id, &scid), + p_req("direction", param_zero_or_one, &direction), + p_opt("minimum_msat", param_msat, &min), + p_opt("maximum_msat", param_msat, &max), + NULL)) + return command_param_failed(); + + if ((!min && !max) || (min && max)) { + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Must specify exactly one of maximum_msat/minimum_msat"); + } + + if (command_check_only(cmd)) + return command_check_done(cmd); + + layer = find_layer(askrene, layername); + if (!layer) + layer = new_layer(askrene, layername); + + /* Calls expect a convenient short_channel_id_dir struct */ + scidd.scid = *scid; + scidd.dir = *direction; + + if (min) { + c = layer_update_constraint(layer, &scidd, CONSTRAINT_MIN, + time_now().ts.tv_sec, *min); + } else { + c = layer_update_constraint(layer, &scidd, CONSTRAINT_MAX, + time_now().ts.tv_sec, *max); + } + response = jsonrpc_stream_success(cmd); + json_add_constraint(response, "constraint", c, layer); + return command_finished(cmd, response); +} + +static struct command_result *json_askrene_disable_node(struct command *cmd, + const char *buffer, + const jsmntok_t *params) +{ + struct node_id *node; + const char *layername; + struct layer *layer; + struct json_stream *response; + struct askrene *askrene = get_askrene(cmd->plugin); + + if (!param(cmd, buffer, params, + p_req("layer", param_layername, &layername), + p_req("node", param_node_id, &node), + NULL)) + return command_param_failed(); + + layer = find_layer(askrene, layername); + if (!layer) + layer = new_layer(askrene, layername); + + /* We save this in the layer, because they want us to disable all the channels + * to the node at *use* time (a new channel might be gossiped!). */ + layer_add_disabled_node(layer, node); + + response = jsonrpc_stream_success(cmd); + return command_finished(cmd, response); +} + +static struct command_result *json_askrene_listlayers(struct command *cmd, + const char *buffer, + const jsmntok_t *params) +{ + struct askrene *askrene = get_askrene(cmd->plugin); + const char *layername; + struct json_stream *response; + + if (!param(cmd, buffer, params, + p_opt("layer", param_string, &layername), + NULL)) + return command_param_failed(); + + response = jsonrpc_stream_success(cmd); + json_add_layers(response, askrene, "layers", layername); + return command_finished(cmd, response); +} + +static struct command_result *json_askrene_age(struct command *cmd, + const char *buffer, + const jsmntok_t *params) +{ + struct layer *layer; + struct json_stream *response; + u64 *cutoff; + size_t num_removed; + + if (!param(cmd, buffer, params, + p_req("layer", param_known_layer, &layer), + p_req("cutoff", param_u64, &cutoff), + NULL)) + return command_param_failed(); + + num_removed = layer_trim_constraints(layer, *cutoff); + + response = jsonrpc_stream_success(cmd); + json_add_string(response, "layer", layer_name(layer)); + json_add_u64(response, "num_removed", num_removed); + return command_finished(cmd, response); +} + +static const struct plugin_command commands[] = { + { + "getroutes", + json_getroutes, + }, + { + "askrene-reserve", + json_askrene_reserve, + }, + { + "askrene-unreserve", + json_askrene_unreserve, + }, + { + "askrene-disable-node", + json_askrene_disable_node, + }, + { + "askrene-create-channel", + json_askrene_create_channel, + }, + { + "askrene-inform-channel", + json_askrene_inform_channel, + }, + { + "askrene-listlayers", + json_askrene_listlayers, + }, + { + "askrene-age", + json_askrene_age, + }, +}; + +static void askrene_markmem(struct plugin *plugin, struct htable *memtable) +{ + layer_memleak_mark(get_askrene(plugin), memtable); +} + +static const char *init(struct plugin *plugin, + const char *buf UNUSED, const jsmntok_t *config UNUSED) +{ + struct askrene *askrene = tal(plugin, struct askrene); + askrene->plugin = plugin; + list_head_init(&askrene->layers); + askrene->reserved = new_reserve_hash(askrene); + askrene->gossmap = gossmap_load(askrene, GOSSIP_STORE_FILENAME, NULL); + + if (!askrene->gossmap) + plugin_err(plugin, "Could not load gossmap %s: %s", + GOSSIP_STORE_FILENAME, strerror(errno)); + askrene->capacities = get_capacities(askrene, askrene->plugin, askrene->gossmap); + rpc_scan(plugin, "getinfo", take(json_out_obj(NULL, NULL, NULL)), + "{id:%}", JSON_SCAN(json_to_node_id, &askrene->my_id)); + + plugin_set_data(plugin, askrene); + plugin_set_memleak_handler(plugin, askrene_markmem); + return NULL; +} + +int main(int argc, char *argv[]) +{ + setup_locale(); + plugin_main(argv, init, NULL, PLUGIN_RESTARTABLE, true, NULL, commands, ARRAY_SIZE(commands), + NULL, 0, NULL, 0, NULL, 0, NULL); +} diff --git a/plugins/askrene/askrene.h b/plugins/askrene/askrene.h new file mode 100644 index 000000000000..76abd2eae081 --- /dev/null +++ b/plugins/askrene/askrene.h @@ -0,0 +1,59 @@ +#ifndef LIGHTNING_PLUGINS_ASKRENE_ASKRENE_H +#define LIGHTNING_PLUGINS_ASKRENE_ASKRENE_H +#include "config.h" +#include +#include +#include +#include +#include + +struct gossmap_chan; + +/* A single route. */ +struct route { + /* Actual path to take */ + struct route_hop *hops; + /* Probability estimate (0-1) */ + double success_prob; +}; + +/* Grab-bag of "globals" for this plugin */ +struct askrene { + struct plugin *plugin; + struct gossmap *gossmap; + /* List of layers */ + struct list_head layers; + /* In-flight payment attempts */ + struct reserve_hash *reserved; + /* Compact cache of gossmap capacities */ + fp16_t *capacities; + /* My own id */ + struct node_id my_id; +}; + +/* Information for a single route query. */ +struct route_query { + /* Plugin pointer, for logging mainly */ + struct plugin *plugin; + + /* This is *not* updated during a query! Has all layers applied. */ + const struct gossmap *gossmap; + + /* We need to take in-flight payments into account */ + const struct reserve_hash *reserved; + + /* Array of layers we're applying */ + const struct layer **layers; + + /* Cache of channel capacities for non-reserved, unknown channels. */ + fp16_t *capacities; +}; + +/* Given a gossmap channel, get the current known min/max */ +void get_constraints(const struct route_query *rq, + const struct gossmap_chan *chan, + int dir, + struct amount_msat *min, + struct amount_msat *max); + +#endif /* LIGHTNING_PLUGINS_ASKRENE_ASKRENE_H */ diff --git a/plugins/askrene/dijkstra.c b/plugins/askrene/dijkstra.c new file mode 100644 index 000000000000..b3f9d39deb7b --- /dev/null +++ b/plugins/askrene/dijkstra.c @@ -0,0 +1,186 @@ +#define NDEBUG 1 +#include "config.h" +#include + +/* In the heap we keep node idx, but in this structure we keep the distance + * value associated to every node, and their position in the heap as a pointer + * so that we can update the nodes inside the heap when the distance label is + * changed. + * + * Therefore this is no longer a multipurpose heap, the node_idx must be an + * index between 0 and less than max_num_nodes. */ +struct dijkstra { + // + s64 *distance; + u32 *base; + u32 **heapptr; + size_t heapsize; + struct gheap_ctx gheap_ctx; +}; + +static const s64 INFINITE = INT64_MAX; + +/* Required a global dijkstra for gheap. */ +static struct dijkstra *global_dijkstra; + +/* The heap comparer for Dijkstra search. Since the top element must be the one + * with the smallest distance, we use the operator >, rather than <. */ +static int dijkstra_less_comparer( + const void *const ctx UNUSED, + const void *const a, + const void *const b) +{ + return global_dijkstra->distance[*(u32*)a] + > global_dijkstra->distance[*(u32*)b]; +} + +/* The heap move operator for Dijkstra search. */ +static void dijkstra_item_mover(void *const dst, const void *const src) +{ + u32 src_idx = *(u32*)src; + *(u32*)dst = src_idx; + + // we keep track of the pointer position of each element in the heap, + // for easy update. + global_dijkstra->heapptr[src_idx] = dst; +} + +/* Allocation of resources for the heap. */ +struct dijkstra *dijkstra_new(const tal_t *ctx, size_t max_num_nodes) +{ + struct dijkstra *dijkstra = tal(ctx, struct dijkstra); + + dijkstra->distance = tal_arr(dijkstra,s64,max_num_nodes); + dijkstra->base = tal_arr(dijkstra,u32,max_num_nodes); + dijkstra->heapptr = tal_arrz(dijkstra,u32*,max_num_nodes); + + dijkstra->heapsize=0; + + dijkstra->gheap_ctx.fanout=2; + dijkstra->gheap_ctx.page_chunks=1024; + dijkstra->gheap_ctx.item_size=sizeof(dijkstra->base[0]); + dijkstra->gheap_ctx.less_comparer=dijkstra_less_comparer; + dijkstra->gheap_ctx.less_comparer_ctx=NULL; + dijkstra->gheap_ctx.item_mover=dijkstra_item_mover; + + return dijkstra; +} + + +void dijkstra_init(struct dijkstra *dijkstra) +{ + const size_t max_num_nodes = tal_count(dijkstra->distance); + dijkstra->heapsize=0; + for(size_t i=0;idistance[i]=INFINITE; + dijkstra->heapptr[i] = NULL; + } +} +size_t dijkstra_size(const struct dijkstra *dijkstra) +{ + return dijkstra->heapsize; +} + +size_t dijkstra_maxsize(const struct dijkstra *dijkstra) +{ + return tal_count(dijkstra->distance); +} + +static void dijkstra_append(struct dijkstra *dijkstra, u32 node_idx, s64 distance) +{ + assert(dijkstra_size(dijkstra) < dijkstra_maxsize(dijkstra)); + assert(node_idx < dijkstra_maxsize(dijkstra)); + + const size_t pos = dijkstra->heapsize; + + dijkstra->base[pos]=node_idx; + dijkstra->distance[node_idx]=distance; + dijkstra->heapptr[node_idx] = &(dijkstra->base[pos]); + dijkstra->heapsize++; +} + +void dijkstra_update(struct dijkstra *dijkstra, u32 node_idx, s64 distance) +{ + assert(node_idx < dijkstra_maxsize(dijkstra)); + + if(!dijkstra->heapptr[node_idx]) + { + // not in the heap + dijkstra_append(dijkstra, node_idx,distance); + global_dijkstra = dijkstra; + gheap_restore_heap_after_item_increase( + &dijkstra->gheap_ctx, + dijkstra->base, + dijkstra->heapsize, + dijkstra->heapptr[node_idx] + - dijkstra->base); + global_dijkstra = NULL; + return; + } + + if(dijkstra->distance[node_idx] > distance) + { + // distance decrease + dijkstra->distance[node_idx] = distance; + + global_dijkstra = dijkstra; + gheap_restore_heap_after_item_increase( + &dijkstra->gheap_ctx, + dijkstra->base, + dijkstra->heapsize, + dijkstra->heapptr[node_idx] + - dijkstra->base); + global_dijkstra = NULL; + }else + { + // distance increase + dijkstra->distance[node_idx] = distance; + + global_dijkstra = dijkstra; + gheap_restore_heap_after_item_decrease( + &dijkstra->gheap_ctx, + dijkstra->base, + dijkstra->heapsize, + dijkstra->heapptr[node_idx] + - dijkstra->base); + global_dijkstra = NULL; + + } + // assert(gheap_is_heap(&dijkstra->gheap_ctx, + // dijkstra->base, + // dijkstra_size())); +} + +u32 dijkstra_top(const struct dijkstra *dijkstra) +{ + return dijkstra->base[0]; +} + +bool dijkstra_empty(const struct dijkstra *dijkstra) +{ + return dijkstra->heapsize==0; +} + +void dijkstra_pop(struct dijkstra *dijkstra) +{ + if(dijkstra->heapsize==0) + return; + + const u32 top = dijkstra_top(dijkstra); + assert(dijkstra->heapptr[top]==dijkstra->base); + + global_dijkstra = dijkstra; + gheap_pop_heap( + &dijkstra->gheap_ctx, + dijkstra->base, + dijkstra->heapsize--); + global_dijkstra = NULL; + + dijkstra->heapptr[top]=NULL; +} + +const s64* dijkstra_distance_data(const struct dijkstra *dijkstra) +{ + return dijkstra->distance; +} diff --git a/plugins/askrene/dijkstra.h b/plugins/askrene/dijkstra.h new file mode 100644 index 000000000000..f8ff62a8ad7f --- /dev/null +++ b/plugins/askrene/dijkstra.h @@ -0,0 +1,30 @@ +#ifndef LIGHTNING_PLUGINS_ASKRENE_DIJKSTRA_H +#define LIGHTNING_PLUGINS_ASKRENE_DIJKSTRA_H +#include "config.h" +#include +#include +#include + +/* Allocation of resources for the heap. */ +struct dijkstra *dijkstra_new(const tal_t *ctx, size_t max_num_nodes); + +/* Initialization of the heap for a new Dijkstra search. */ +void dijkstra_init(struct dijkstra *dijkstra); + +/* Inserts a new element in the heap. If node_idx was already in the heap then + * its distance value is updated. */ +void dijkstra_update(struct dijkstra *dijkstra, u32 node_idx, s64 distance); + +u32 dijkstra_top(const struct dijkstra *dijkstra); +bool dijkstra_empty(const struct dijkstra *dijkstra); +void dijkstra_pop(struct dijkstra *dijkstra); + +const s64* dijkstra_distance_data(const struct dijkstra *dijkstra); + +/* Number of elements on the heap. */ +size_t dijkstra_size(const struct dijkstra *dijkstra); + +/* Maximum number of elements the heap can host */ +size_t dijkstra_maxsize(const struct dijkstra *dijkstra); + +#endif /* LIGHTNING_PLUGINS_ASKRENE_DIJKSTRA_H */ diff --git a/plugins/askrene/flow.c b/plugins/askrene/flow.c new file mode 100644 index 000000000000..6d4a3b86d271 --- /dev/null +++ b/plugins/askrene/flow.c @@ -0,0 +1,471 @@ +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef SUPERVERBOSE +#define SUPERVERBOSE(...) +#else +#define SUPERVERBOSE_ENABLED 1 +#endif + +/* Checks BOLT 7 HTLC fee condition: + * recv >= base_fee + (send*proportional_fee)/1000000 */ +static bool check_fee_inequality(struct amount_msat recv, struct amount_msat send, + u64 base_fee, u64 proportional_fee) +{ + // nothing to forward, any incoming amount is good + if (amount_msat_zero(send)) + return true; + // FIXME If this addition fails we return false. The caller will not be + // able to know that there was an addition overflow, he will just assume + // that the fee inequality was not satisfied. + if (!amount_msat_add_fee(&send, base_fee, proportional_fee)) + return false; + return amount_msat_greater_eq(recv, send); +} + +/* Let `recv` be the maximum amount this channel can receive, this function + * computes the maximum amount this channel can forward `send`. + * From BOLT7 specification wee need to satisfy the following inequality: + * + * recv-send >= base_fee + floor(send*proportional_fee/1000000) + * + * That is equivalent to have + * + * send <= Bound(recv,send) + * + * where + * + * Bound(recv, send) = ((recv - base_fee)*1000000 + (send*proportional_fee) + *% 1000000)/(proportional_fee+1000000) + * + * However the quantity we want to determine, `send`, appears on both sides of + * the equation. However the term `send*proportional_fee) % 1000000` only + * contributes by increasing the bound by at most one so that we can neglect + * the extra term and use instead + * + * Bound_simple(recv) = ((recv - + *base_fee)*1000000)/(proportional_fee+1000000) + * + * as the upper bound for `send`. Formally one can check that + * + * Bound_simple(recv) <= Bound(recv, send) < Bound_simple(recv) + 2 + * + * So that if one wishes to find the very highest value of `send` that + * satisfies + * + * send <= Bound(recv, send) + * + * it is enough to compute + * + * send = Bound_simple(recv) + * + * which already satisfies the fee equation and then try to go higher + * with send+1, send+2, etc. But we know that it is enough to try up to + * send+1 because Bound(recv, send) < Bound_simple(recv) + 2. + * */ +static struct amount_msat channel_maximum_forward(const struct gossmap_chan *chan, + const int dir, + struct amount_msat recv) +{ + const u64 b = chan->half[dir].base_fee, + p = chan->half[dir].proportional_fee; + + const u64 one_million = 1000000; + u64 x_msat = + recv.millisatoshis; /* Raw: need to invert the fee equation */ + + // special case, when recv - base_fee <= 0, we cannot forward anything + if (x_msat <= b) + return AMOUNT_MSAT(0); + + x_msat -= b; + + /* recv must be a real number of msat... */ + assert(!mul_overflows_u64(one_million, x_msat)); + + struct amount_msat best_send = + AMOUNT_MSAT_INIT((one_million * x_msat) / (one_million + p)); + + /* Try to increase the value we send (up tp the last millisat) until we + * fail to fulfill the fee inequality. It takes only one iteration + * though. */ + for (size_t i = 0; i < 10; ++i) { + struct amount_msat next_send; + if (!amount_msat_add(&next_send, best_send, amount_msat(1))) + abort(); + + if (check_fee_inequality(recv, next_send, b, p)) + best_send = next_send; + else + break; + } + return best_send; +} + +static struct amount_msat *flow_amounts(const tal_t *ctx, + struct plugin *plugin, + const struct flow *flow) +{ + const size_t pathlen = tal_count(flow->path); + struct amount_msat *amounts = tal_arr(ctx, struct amount_msat, pathlen); + amounts[pathlen - 1] = flow->amount; + + for (int i = (int)pathlen - 2; i >= 0; i--) { + const struct half_chan *h = flow_edge(flow, i + 1); + amounts[i] = amounts[i + 1]; + if (!amount_msat_add_fee(&amounts[i], h->base_fee, + h->proportional_fee)) { + plugin_err(plugin, "Could not add fee %u/%u to amount %s in %i/%zu", + h->base_fee, h->proportional_fee, + fmt_amount_msat(tmpctx, amounts[i+1]), + i, pathlen); + } + } + + return amounts; +} + +const char *fmt_flows(const tal_t *ctx, const struct route_query *rq, + struct flow **flows) +{ + double tot_prob = flowset_probability(flows, rq); + assert(tot_prob >= 0); + char *buff = tal_fmt(ctx, "%zu subflows, prob %2lf\n", tal_count(flows), + tot_prob); + for (size_t i = 0; i < tal_count(flows); i++) { + struct amount_msat fee, delivered; + tal_append_fmt(&buff, " "); + for (size_t j = 0; j < tal_count(flows[i]->path); j++) { + struct short_channel_id scid = + gossmap_chan_scid(rq->gossmap, flows[i]->path[j]); + tal_append_fmt(&buff, "%s%s", j ? "->" : "", + fmt_short_channel_id(tmpctx, scid)); + } + delivered = flows[i]->amount; + fee = flow_fee(rq->plugin, flows[i]); + tal_append_fmt(&buff, " prob %.2f, %s delivered with fee %s\n", + flows[i]->success_prob, + fmt_amount_msat(tmpctx, delivered), + fmt_amount_msat(tmpctx, fee)); + } + + return buff; +} + +/* Returns the greatest amount we can deliver to the destination using this + * route. It takes into account the current knowledge, pending HTLC, + * htlc_max and fees. + * + * It fails if the maximum that we can + * deliver at node i is smaller than the minimum required to forward the least + * amount greater than zero to the next node. */ +const struct gossmap_chan * +flow_maximum_deliverable(struct amount_msat *max_deliverable, + const struct flow *flow, + const struct route_query *rq) +{ + struct amount_msat maxcap; + + assert(tal_count(flow->path) > 0); + assert(tal_count(flow->dirs) > 0); + assert(tal_count(flow->path) == tal_count(flow->dirs)); + + get_constraints(rq, flow->path[0], flow->dirs[0], NULL, &maxcap); + maxcap = amount_msat_min(maxcap, gossmap_chan_htlc_max(flow->path[0], flow->dirs[0])); + + if (amount_msat_zero(maxcap)) + return flow->path[0]; + + for (size_t i = 1; i < tal_count(flow->path); ++i) { + // ith node can forward up to 'liquidity_cap' because of the ith + // channel liquidity bound + struct amount_msat liquidity_cap; + + get_constraints(rq, flow->path[i], flow->dirs[i], NULL, &liquidity_cap); + + /* ith node can receive up to 'x', therefore he will not forward + * more than 'forward_cap' that we compute below inverting the + * fee equation. */ + struct amount_msat forward_cap; + forward_cap = channel_maximum_forward(flow->path[i], flow->dirs[i], + maxcap); + struct amount_msat new_max = amount_msat_min(forward_cap, liquidity_cap); + new_max = amount_msat_min(new_max, + gossmap_chan_htlc_max(flow->path[i], flow->dirs[i])); + + /* safety check: amounts decrease along the route */ + assert(amount_msat_less_eq(new_max, maxcap)); + + if (amount_msat_zero(new_max)) + return flow->path[i]; + + /* safety check: the max liquidity in the next hop + fees cannot + be greater than the max liquidity in the current hop, IF the + next hop is non-zero. */ + struct amount_msat check = new_max; + assert( + amount_msat_add_fee(&check, flow_edge(flow, i)->base_fee, + flow_edge(flow, i)->proportional_fee)); + assert(amount_msat_less_eq(check, maxcap)); + + maxcap = new_max; + } + assert(!amount_msat_zero(maxcap)); + *max_deliverable = maxcap; + return NULL; +} + +/* Returns the smallest amount we can send so that the destination can get one + * HTLC of any size. It takes into account htlc_min and fees. + * */ +// static enum askrene_errorcode +// flow_minimum_sendable(struct amount_msat *min_sendable UNUSED, +// const struct flow *flow UNUSED, +// const struct gossmap *gossmap UNUSED, +// struct chan_extra_map *chan_extra_map UNUSED) +// { +// // TODO +// return ASKRENE_NOERROR; +// } + +/* How much do we deliver to destination using this set of routes */ +struct amount_msat flowset_delivers(struct plugin *plugin, + struct flow **flows) +{ + struct amount_msat final = AMOUNT_MSAT(0); + for (size_t i = 0; i < tal_count(flows); i++) { + if (!amount_msat_add(&final, flows[i]->amount, final)) { + plugin_err(plugin, "Could not add flowsat %s to %s (%zu/%zu)", + fmt_amount_msat(tmpctx, flows[i]->amount), + fmt_amount_msat(tmpctx, final), + i, tal_count(flows)); + } + } + return final; +} + +static double edge_probability(struct amount_msat sent, + struct amount_msat mincap, + struct amount_msat maxcap, + struct amount_msat used) +{ + struct amount_msat numerator, denominator; + + if (!amount_msat_sub(&mincap, mincap, used)) + mincap = AMOUNT_MSAT(0); + if (!amount_msat_sub(&maxcap, maxcap, used)) + maxcap = AMOUNT_MSAT(0); + + if (amount_msat_less_eq(sent, mincap)) + return 1.0; + else if (amount_msat_greater(sent, maxcap)) + return 0.0; + + /* Linear probability: 1 - (spend - min) / (max - min) */ + + /* spend > mincap, from above. */ + if (!amount_msat_sub(&numerator, sent, mincap)) + abort(); + /* This can only fail is maxcap was < mincap, + * so we would be captured above */ + if (!amount_msat_sub(&denominator, maxcap, mincap)) + abort(); + return 1.0 - amount_msat_ratio(numerator, denominator); +} + +/* Compute the prob. of success of a set of concurrent set of flows. + * + * IMPORTANT: this is not simply the multiplication of the prob. of success of + * all of them, because they're not independent events. A flow that passes + * through a channel c changes that channel's liquidity and then if another flow + * passes through that same channel the previous liquidity change must be taken + * into account. + * + * P(A and B) != P(A) * P(B), + * + * but + * + * P(A and B) = P(A) * P(B | A) + * + * also due to the linear form of P() we have + * + * P(A and B) = P(A + B) + * */ +struct chan_inflight_flow +{ + struct amount_msat half[2]; +}; + +double flowset_probability(struct flow **flows, + const struct route_query *rq) +{ + double prob = 1.0; + + // TODO(eduardo): should it be better to use a map instead of an array + // here? + const size_t max_num_chans = gossmap_max_chan_idx(rq->gossmap); + struct chan_inflight_flow *in_flight = + tal_arrz(tmpctx, struct chan_inflight_flow, max_num_chans); + + for (size_t i = 0; i < tal_count(flows); ++i) { + const struct flow *f = flows[i]; + const size_t pathlen = tal_count(f->path); + struct amount_msat *amounts = flow_amounts(tmpctx, rq->plugin, f); + + for (size_t j = 0; j < pathlen; ++j) { + struct amount_msat mincap, maxcap; + const int c_dir = f->dirs[j]; + const u32 c_idx = gossmap_chan_idx(rq->gossmap, f->path[j]); + const struct amount_msat deliver = amounts[j]; + + get_constraints(rq, f->path[j], c_dir, &mincap, &maxcap); + + prob *= edge_probability(deliver, mincap, maxcap, + in_flight[c_idx].half[c_dir]); + + if (!amount_msat_add(&in_flight[c_idx].half[c_dir], + in_flight[c_idx].half[c_dir], + deliver)) { + plugin_err(rq->plugin, "Could not add %s to inflight %s", + fmt_amount_msat(tmpctx, deliver), + fmt_amount_msat(tmpctx, in_flight[c_idx].half[c_dir])); + } + } + } + return prob; +} + +struct amount_msat flow_spend(struct plugin *plugin, const struct flow *flow) +{ + const size_t pathlen = tal_count(flow->path); + struct amount_msat spend = flow->amount; + + for (int i = (int)pathlen - 1; i >= 0; i--) { + const struct half_chan *h = flow_edge(flow, i); + if (!amount_msat_add_fee(&spend, h->base_fee, + h->proportional_fee)) { + plugin_err(plugin, "Could not add fee %u/%u to amount %s in %i/%zu", + h->base_fee, h->proportional_fee, + fmt_amount_msat(tmpctx, spend), + i, pathlen); + } + } + + return spend; +} + +struct amount_msat flow_fee(struct plugin *plugin, const struct flow *flow) +{ + struct amount_msat spend = flow_spend(plugin, flow); + struct amount_msat fee; + if (!amount_msat_sub(&fee, spend, flow->amount)) { + plugin_err(plugin, "Could not subtract %s from %s for fee", + fmt_amount_msat(tmpctx, flow->amount), + fmt_amount_msat(tmpctx, spend)); + } + + return fee; +} + +struct amount_msat flowset_fee(struct plugin *plugin, struct flow **flows) +{ + struct amount_msat fee = AMOUNT_MSAT(0); + for (size_t i = 0; i < tal_count(flows); i++) { + struct amount_msat this_fee = flow_fee(plugin, flows[i]); + if (!amount_msat_add(&fee, this_fee, fee)) { + plugin_err(plugin, "Could not add %s to %s for flowset fee", + fmt_amount_msat(tmpctx, this_fee), + fmt_amount_msat(tmpctx, fee)); + } + } + return fee; +} + +/* Helper to access the half chan at flow index idx */ +const struct half_chan *flow_edge(const struct flow *flow, size_t idx) +{ + assert(flow); + assert(idx < tal_count(flow->path)); + return &flow->path[idx]->half[flow->dirs[idx]]; +} + +/* Assign the delivered amount to the flow if it fits + the path maximum capacity. */ +const struct gossmap_chan * +flow_assign_delivery(struct flow *flow, + const struct route_query *rq, + struct amount_msat requested_amount) +{ + struct amount_msat max_deliverable; + const struct gossmap_chan *badchan; + + badchan = flow_maximum_deliverable(&max_deliverable, flow, rq); + if (badchan) + return badchan; + assert(!amount_msat_zero(max_deliverable)); + flow->amount = amount_msat_min(requested_amount, max_deliverable); + return NULL; +} + +/* Helper function to find the success_prob for a single flow + * + * IMPORTANT: flow->success_prob is misleading, because that's the prob. of + * success provided that there are no other flows in the current MPP flow set. + * */ +double flow_probability(const struct flow *flow, + const struct route_query *rq) +{ + const size_t pathlen = tal_count(flow->path); + struct amount_msat spend = flow->amount; + double prob = 1.0; + + for (int i = (int)pathlen - 1; i >= 0; i--) { + const struct half_chan *h = flow_edge(flow, i); + struct amount_msat mincap, maxcap; + + get_constraints(rq, flow->path[i], flow->dirs[i], &mincap, &maxcap); + prob *= edge_probability(spend, mincap, maxcap, AMOUNT_MSAT(0)); + + if (!amount_msat_add_fee(&spend, h->base_fee, + h->proportional_fee)) { + plugin_err(rq->plugin, "Could not add fee %u/%u to amount %s in %i/%zu", + h->base_fee, h->proportional_fee, + fmt_amount_msat(tmpctx, spend), + i, pathlen); + } + } + + return prob; +} + +u64 flow_delay(const struct flow *flow) +{ + u64 delay = 0; + for (size_t i = 0; i < tal_count(flow->path); i++) + delay += flow_edge(flow, i)->delay; + return delay; +} + +u64 flows_worst_delay(struct flow **flows) +{ + u64 maxdelay = 0; + for (size_t i = 0; i < tal_count(flows); i++) { + u64 delay = flow_delay(flows[i]); + if (delay > maxdelay) + maxdelay = delay; + } + return maxdelay; +} + +#ifndef SUPERVERBOSE_ENABLED +#undef SUPERVERBOSE +#endif diff --git a/plugins/askrene/flow.h b/plugins/askrene/flow.h new file mode 100644 index 000000000000..f85592739654 --- /dev/null +++ b/plugins/askrene/flow.h @@ -0,0 +1,94 @@ +#ifndef LIGHTNING_PLUGINS_ASKRENE_FLOW_H +#define LIGHTNING_PLUGINS_ASKRENE_FLOW_H +#include "config.h" +#include +#include +#include + +struct plugin; +struct route_query; + +/* An actual partial flow. */ +struct flow { + const struct gossmap_chan **path; + /* The directions to traverse. */ + int *dirs; + /* Amounts for this flow (fees mean this shrinks across path). */ + double success_prob; + struct amount_msat amount; +}; + +const char *fmt_flows(const tal_t *ctx, + const struct route_query *rq, + struct flow **flows); + +/* Helper to access the half chan at flow index idx */ +const struct half_chan *flow_edge(const struct flow *flow, size_t idx); + +/* A big number, meaning "don't bother" (not infinite, since you may add) */ +#define FLOW_INF_COST 100000000.0 + +/* Cost function to send @f msat through @c in direction @dir, + * given we already have a flow of prev_flow. */ +double flow_edge_cost(const struct gossmap *gossmap, + const struct gossmap_chan *c, int dir, + const struct amount_msat known_min, + const struct amount_msat known_max, + struct amount_msat prev_flow, + struct amount_msat f, + double mu, + double basefee_penalty, + double delay_riskfactor); + +/* Compute the prob. of success of a set of concurrent set of flows. */ +double flowset_probability(struct flow **flows, + const struct route_query *rq); + +/* How much do we need to send to make this flow arrive. */ +struct amount_msat flow_spend(struct plugin *plugin, const struct flow *flow); + +/* How much do we pay in fees to make this flow arrive. */ +struct amount_msat flow_fee(struct plugin *plugin, const struct flow *flow); + +struct amount_msat flowset_fee(struct plugin *plugin, struct flow **flows); + +struct amount_msat flowset_delivers(struct plugin *plugin, + struct flow **flows); + +static inline struct amount_msat flow_delivers(const struct flow *flow) +{ + return flow->amount; +} + +/* FIXME: remove */ +enum askrene_errorcode { + ASKRENE_NOERROR = 0, + + ASKRENE_AMOUNT_OVERFLOW, + ASKRENE_CHANNEL_NOT_FOUND, + ASKRENE_BAD_CHANNEL, + ASKRENE_BAD_ALLOCATION, + ASKRENE_PRECONDITION_ERROR, + ASKRENE_UNEXPECTED, +}; + +/* Returns problematic channel, OR sets max_deliverable to non-zero amount */ +const struct gossmap_chan * +flow_maximum_deliverable(struct amount_msat *max_deliverable, + const struct flow *flow, + const struct route_query *rq); + +/* Assign the delivered amount to the flow if it fits + the path maximum capacity. Returns bad channel if max would be zero. */ +const struct gossmap_chan * +flow_assign_delivery(struct flow *flow, + const struct route_query *rq, + struct amount_msat requested_amount); + +double flow_probability(const struct flow *flow, + const struct route_query *rq); + +u64 flow_delay(const struct flow *flow); +u64 flows_worst_delay(struct flow **flows); + +#endif /* LIGHTNING_PLUGINS_ASKRENE_FLOW_H */ diff --git a/plugins/askrene/layer.c b/plugins/askrene/layer.c new file mode 100644 index 000000000000..3991716dc988 --- /dev/null +++ b/plugins/askrene/layer.c @@ -0,0 +1,475 @@ +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include + +/* A channels which doesn't (necessarily) exist in the gossmap. */ +struct local_channel { + /* Canonical order, n1 < n2 */ + struct node_id n1, n2; + struct short_channel_id scid; + struct amount_msat capacity; + + struct added_channel_half { + /* Other fields only valid if this is true */ + bool enabled; + u16 delay; + u32 proportional_fee; + struct amount_msat base_fee; + struct amount_msat htlc_min, htlc_max; + } half[2]; +}; + +static const struct constraint_key * +constraint_key(const struct constraint *c) +{ + return &c->key; +} + +static size_t hash_constraint_key(const struct constraint_key *key) +{ + /* scids cost money to generate, so simple hash works here */ + return (key->scidd.scid.u64 >> 32) ^ (key->scidd.scid.u64) + ^ (key->scidd.dir << 1) ^ (key->type); +} + +static inline bool constraint_eq_key(const struct constraint *c, + const struct constraint_key *key) +{ + return short_channel_id_dir_eq(&key->scidd, &c->key.scidd) && key->type == c->key.type; +} + +HTABLE_DEFINE_TYPE(struct constraint, constraint_key, hash_constraint_key, + constraint_eq_key, constraint_hash); + +static struct short_channel_id +local_channel_scid(const struct local_channel *lc) +{ + return lc->scid; +} + +static size_t hash_scid(const struct short_channel_id scid) +{ + /* scids cost money to generate, so simple hash works here */ + return (scid.u64 >> 32) ^ (scid.u64 >> 16) ^ scid.u64; +} + +static inline bool local_channel_eq_scid(const struct local_channel *lc, + const struct short_channel_id scid) +{ + return short_channel_id_eq(scid, lc->scid); +} + +HTABLE_DEFINE_TYPE(struct local_channel, local_channel_scid, hash_scid, + local_channel_eq_scid, local_channel_hash); + +struct layer { + /* Inside global list of layers */ + struct list_node list; + + /* Unique identifiers */ + const char *name; + + /* Completely made up local additions, indexed by scid */ + struct local_channel_hash *local_channels; + + /* Additional info, indexed by scid+dir */ + struct constraint_hash *constraints; + + /* Nodes to completely disable (tal_arr) */ + struct node_id *disabled_nodes; +}; + +struct layer *new_temp_layer(const tal_t *ctx, const char *name) +{ + struct layer *l = tal(ctx, struct layer); + + l->name = tal_strdup(l, name); + l->local_channels = tal(l, struct local_channel_hash); + local_channel_hash_init(l->local_channels); + l->constraints = tal(l, struct constraint_hash); + constraint_hash_init(l->constraints); + l->disabled_nodes = tal_arr(l, struct node_id, 0); + + return l; +} + +struct layer *new_layer(struct askrene *askrene, const char *name) +{ + struct layer *l = new_temp_layer(askrene, name); + list_add(&askrene->layers, &l->list); + return l; +} + +/* Swap if necessary to make into BOLT-7 order. Return direction. */ +static int canonicalize_node_order(const struct node_id **n1, + const struct node_id **n2) +{ + const struct node_id *tmp; + + if (node_id_cmp(*n1, *n2) < 0) + return 0; + tmp = *n2; + *n2 = *n1; + *n1 = tmp; + return 1; +} + +struct layer *find_layer(struct askrene *askrene, const char *name) +{ + struct layer *l; + list_for_each(&askrene->layers, l, list) { + if (streq(l->name, name)) + return l; + } + return NULL; +} + +const char *layer_name(const struct layer *layer) +{ + return layer->name; +} + +static struct local_channel *new_local_channel(struct layer *layer, + const struct node_id *n1, + const struct node_id *n2, + struct short_channel_id scid, + struct amount_msat capacity) +{ + struct local_channel *lc = tal(layer, struct local_channel); + lc->n1 = *n1; + lc->n2 = *n2; + lc->scid = scid; + lc->capacity = capacity; + + for (size_t i = 0; i < ARRAY_SIZE(lc->half); i++) + lc->half[i].enabled = false; + + local_channel_hash_add(layer->local_channels, lc); + return lc; +} + +bool layer_check_local_channel(const struct local_channel *lc, + const struct node_id *n1, + const struct node_id *n2, + struct amount_msat capacity) +{ + canonicalize_node_order(&n1, &n2); + return node_id_eq(&lc->n1, n1) + && node_id_eq(&lc->n2, n2) + && amount_msat_eq(lc->capacity, capacity); +} + +/* Update a local channel to a layer: fails if you try to change capacity or nodes! */ +void layer_update_local_channel(struct layer *layer, + const struct node_id *src, + const struct node_id *dst, + struct short_channel_id scid, + struct amount_msat capacity, + struct amount_msat base_fee, + u32 proportional_fee, + u16 delay, + struct amount_msat htlc_min, + struct amount_msat htlc_max) +{ + struct local_channel *lc = local_channel_hash_get(layer->local_channels, scid); + int dir = canonicalize_node_order(&src, &dst); + struct short_channel_id_dir scidd; + + if (lc) { + assert(layer_check_local_channel(lc, src, dst, capacity)); + } else { + lc = new_local_channel(layer, src, dst, scid, capacity); + } + + lc->half[dir].enabled = true; + lc->half[dir].htlc_min = htlc_min; + lc->half[dir].htlc_max = htlc_max; + lc->half[dir].base_fee = base_fee; + lc->half[dir].proportional_fee = proportional_fee; + lc->half[dir].delay = delay; + + /* We always add an explicit constraint for local channels, to simplify + * lookups. You can tell it's a fake one by the timestamp. */ + scidd.scid = scid; + scidd.dir = dir; + layer_update_constraint(layer, &scidd, CONSTRAINT_MAX, UINT64_MAX, capacity); +} + +struct amount_msat local_channel_capacity(const struct local_channel *lc) +{ + return lc->capacity; +} + +const struct local_channel *layer_find_local_channel(const struct layer *layer, + struct short_channel_id scid) +{ + return local_channel_hash_get(layer->local_channels, scid); +} + +static struct constraint *layer_find_constraint_nonconst(const struct layer *layer, + const struct short_channel_id_dir *scidd, + enum constraint_type type) +{ + struct constraint_key k = { *scidd, type }; + return constraint_hash_get(layer->constraints, &k); +} + +/* Public one returns const */ +const struct constraint *layer_find_constraint(const struct layer *layer, + const struct short_channel_id_dir *scidd, + enum constraint_type type) +{ + return layer_find_constraint_nonconst(layer, scidd, type); +} + +const struct constraint *layer_update_constraint(struct layer *layer, + const struct short_channel_id_dir *scidd, + enum constraint_type type, + u64 timestamp, + struct amount_msat limit) +{ + struct constraint *c = layer_find_constraint_nonconst(layer, scidd, type); + if (!c) { + c = tal(layer, struct constraint); + c->key.scidd = *scidd; + c->key.type = type; + c->limit = limit; + constraint_hash_add(layer->constraints, c); + } else { + switch (type) { + case CONSTRAINT_MIN: + /* Increase minimum? */ + if (amount_msat_greater(limit, c->limit)) + c->limit = limit; + break; + case CONSTRAINT_MAX: + /* Decrease maximum? */ + if (amount_msat_less(limit, c->limit)) + c->limit = limit; + break; + } + } + c->timestamp = timestamp; + return c; +} + +void layer_clear_overridden_capacities(const struct layer *layer, + const struct gossmap *gossmap, + fp16_t *capacities) +{ + struct constraint_hash_iter conit; + struct constraint *con; + + for (con = constraint_hash_first(layer->constraints, &conit); + con; + con = constraint_hash_next(layer->constraints, &conit)) { + struct gossmap_chan *c = gossmap_find_chan(gossmap, &con->key.scidd.scid); + size_t idx; + if (!c) + continue; + idx = gossmap_chan_idx(gossmap, c); + if (idx < tal_count(capacities)) + capacities[idx] = 0; + } +} + +size_t layer_trim_constraints(struct layer *layer, u64 cutoff) +{ + size_t num_removed = 0; + struct constraint_hash_iter conit; + struct constraint *con; + + for (con = constraint_hash_first(layer->constraints, &conit); + con; + con = constraint_hash_next(layer->constraints, &conit)) { + if (con->timestamp < cutoff) { + constraint_hash_delval(layer->constraints, &conit); + tal_free(con); + num_removed++; + } + } + return num_removed; +} + +void layer_add_disabled_node(struct layer *layer, const struct node_id *node) +{ + tal_arr_expand(&layer->disabled_nodes, *node); +} + +void layer_add_localmods(const struct layer *layer, + const struct gossmap *gossmap, + bool zero_cost, + struct gossmap_localmods *localmods) +{ + const struct local_channel *lc; + struct local_channel_hash_iter lcit; + + /* First, disable all channels into blocked nodes (local updates + * can add new ones)! */ + for (size_t i = 0; i < tal_count(layer->disabled_nodes); i++) { + const struct gossmap_node *node; + + node = gossmap_find_node(gossmap, &layer->disabled_nodes[i]); + if (!node) + continue; + for (size_t n = 0; n < node->num_chans; n++) { + struct short_channel_id scid; + struct gossmap_chan *c; + int dir; + c = gossmap_nth_chan(gossmap, node, n, &dir); + scid = gossmap_chan_scid(gossmap, c); + + /* Disabled zero-capacity on incoming */ + gossmap_local_updatechan(localmods, + scid, + AMOUNT_MSAT(0), + AMOUNT_MSAT(0), + 0, + 0, + 0, + false, + !dir); + } + } + + for (lc = local_channel_hash_first(layer->local_channels, &lcit); + lc; + lc = local_channel_hash_next(layer->local_channels, &lcit)) { + gossmap_local_addchan(localmods, + &lc->n1, &lc->n2, lc->scid, NULL); + for (size_t i = 0; i < ARRAY_SIZE(lc->half); i++) { + u64 base, propfee, delay; + if (!lc->half[i].enabled) + continue; + if (zero_cost) { + base = propfee = delay = 0; + } else { + base = lc->half[i].base_fee.millisatoshis; /* Raw: gossmap */ + propfee = lc->half[i].proportional_fee; + delay = lc->half[i].delay; + } + gossmap_local_updatechan(localmods, lc->scid, + lc->half[i].htlc_min, + lc->half[i].htlc_max, + base, propfee, delay, + true, + i); + } + } +} + +static void json_add_local_channel(struct json_stream *response, + const char *fieldname, + const struct local_channel *lc, + int dir) +{ + json_object_start(response, fieldname); + + if (dir == 0) { + json_add_node_id(response, "source", &lc->n1); + json_add_node_id(response, "destination", &lc->n2); + } else { + json_add_node_id(response, "source", &lc->n2); + json_add_node_id(response, "destination", &lc->n1); + } + json_add_short_channel_id(response, "short_channel_id", lc->scid); + json_add_amount_msat(response, "capacity_msat", lc->capacity); + json_add_amount_msat(response, "htlc_minimum_msat", lc->half[dir].htlc_min); + json_add_amount_msat(response, "htlc_maximum_msat", lc->half[dir].htlc_max); + json_add_amount_msat(response, "fee_base_msat", lc->half[dir].base_fee); + json_add_u32(response, "fee_proportional_millionths", lc->half[dir].proportional_fee); + json_add_u32(response, "delay", lc->half[dir].delay); + + json_object_end(response); +} + +void json_add_constraint(struct json_stream *js, + const char *fieldname, + const struct constraint *c, + const struct layer *layer) +{ + json_object_start(js, fieldname); + if (layer) + json_add_string(js, "layer", layer->name); + json_add_short_channel_id(js, "short_channel_id", c->key.scidd.scid); + json_add_u32(js, "direction", c->key.scidd.dir); + json_add_u64(js, "timestamp", c->timestamp); + switch (c->key.type) { + case CONSTRAINT_MIN: + json_add_amount_msat(js, "minimum_msat", c->limit); + break; + case CONSTRAINT_MAX: + json_add_amount_msat(js, "maximum_msat", c->limit); + break; + } + json_object_end(js); +} + +static void json_add_layer(struct json_stream *js, + const char *fieldname, + const struct layer *layer) +{ + struct local_channel_hash_iter lcit; + const struct local_channel *lc; + struct constraint_hash_iter conit; + const struct constraint *c; + + json_object_start(js, fieldname); + json_add_string(js, "layer", layer->name); + json_array_start(js, "disabled_nodes"); + for (size_t i = 0; i < tal_count(layer->disabled_nodes); i++) + json_add_node_id(js, NULL, &layer->disabled_nodes[i]); + json_array_end(js); + json_array_start(js, "created_channels"); + for (lc = local_channel_hash_first(layer->local_channels, &lcit); + lc; + lc = local_channel_hash_next(layer->local_channels, &lcit)) { + for (size_t i = 0; i < ARRAY_SIZE(lc->half); i++) { + if (lc->half[i].enabled) + json_add_local_channel(js, NULL, lc, i); + } + } + json_array_end(js); + json_array_start(js, "constraints"); + for (c = constraint_hash_first(layer->constraints, &conit); + c; + c = constraint_hash_next(layer->constraints, &conit)) { + /* Don't show ones we generated internally */ + if (c->timestamp == UINT64_MAX) + continue; + json_add_constraint(js, NULL, c, NULL); + } + json_array_end(js); + json_object_end(js); +} + +void json_add_layers(struct json_stream *js, + struct askrene *askrene, + const char *fieldname, + const char *layername) +{ + struct layer *l; + + json_array_start(js, fieldname); + list_for_each(&askrene->layers, l, list) { + if (layername && !streq(l->name, layername)) + continue; + json_add_layer(js, NULL, l); + } + json_array_end(js); +} + +void layer_memleak_mark(struct askrene *askrene, struct htable *memtable) +{ + struct layer *l; + list_for_each(&askrene->layers, l, list) { + memleak_scan_htable(memtable, &l->constraints->raw); + memleak_scan_htable(memtable, &l->local_channels->raw); + } +} diff --git a/plugins/askrene/layer.h b/plugins/askrene/layer.h new file mode 100644 index 000000000000..7acea220c072 --- /dev/null +++ b/plugins/askrene/layer.h @@ -0,0 +1,119 @@ +#ifndef LIGHTNING_PLUGINS_ASKRENE_LAYER_H +#define LIGHTNING_PLUGINS_ASKRENE_LAYER_H +/* A layer is the group of information maintained by askrene. The caller + * specifies which layers to use when asking for a route, and tell askrene + * what layer to add new information to. + * + * Layers can be used to shape local decisions (for this payment, add these + * connections, or disable all connections to this node). You can also, + * in theory, export a layer, or import a layer from another source, to see + * what the results are when that layer is included. */ +#include "config.h" +#include +#include +#include + +struct askrene; +struct layer; +struct json_stream; + +enum constraint_type { + CONSTRAINT_MIN, + CONSTRAINT_MAX, +}; + +struct constraint_key { + struct short_channel_id_dir scidd; + enum constraint_type type; +}; + +/* A constraint reflects something we learned about a channel */ +struct constraint { + struct constraint_key key; + /* Time this constraint was last updated */ + u64 timestamp; + struct amount_msat limit; +}; + +/* Look up a layer by name. */ +struct layer *find_layer(struct askrene *askrene, const char *name); + +/* Create new layer by name. */ +struct layer *new_layer(struct askrene *askrene, const char *name); + +/* New temporary layer (not in askrene's hash table) */ +struct layer *new_temp_layer(const tal_t *ctx, const char *name); + +/* Get the name of the layer */ +const char *layer_name(const struct layer *layer); + +/* Find a local channel in a layer */ +const struct local_channel *layer_find_local_channel(const struct layer *layer, + struct short_channel_id scid); + +/* Get capacity of that channel. */ +struct amount_msat local_channel_capacity(const struct local_channel *lc); + +/* Check local channel matches these */ +bool layer_check_local_channel(const struct local_channel *lc, + const struct node_id *n1, + const struct node_id *n2, + struct amount_msat capacity); + +/* Update a local channel to a layer: fails if you try to change capacity or nodes! */ +void layer_update_local_channel(struct layer *layer, + const struct node_id *src, + const struct node_id *dst, + struct short_channel_id scid, + struct amount_msat capacity, + struct amount_msat base_fee, + u32 proportional_fee, + u16 delay, + struct amount_msat htlc_min, + struct amount_msat htlc_max); + +/* If any capacities of channels are limited, unset the corresponding element in + * the capacities[] array */ +void layer_clear_overridden_capacities(const struct layer *layer, + const struct gossmap *gossmap, + fp16_t *capacities); + +/* Find a constraint in a layer. */ +const struct constraint *layer_find_constraint(const struct layer *layer, + const struct short_channel_id_dir *scidd, + enum constraint_type type); + +/* Add/update a constraint on a layer. */ +const struct constraint *layer_update_constraint(struct layer *layer, + const struct short_channel_id_dir *scidd, + enum constraint_type type, + u64 timestamp, + struct amount_msat limit); + +/* Add local channels from this layer. zero_cost means set fees and delay to 0. */ +void layer_add_localmods(const struct layer *layer, + const struct gossmap *gossmap, + bool zero_cost, + struct gossmap_localmods *localmods); + +/* Remove constraints older then cutoff: returns num removed. */ +size_t layer_trim_constraints(struct layer *layer, u64 cutoff); + +/* Add a disabled node to a layer. */ +void layer_add_disabled_node(struct layer *layer, const struct node_id *node); + +/* Print out a json object per layer, or all if layer is NULL */ +void json_add_layers(struct json_stream *js, + struct askrene *askrene, + const char *fieldname, + const char *layername); + +/* Print a single constraint */ +void json_add_constraint(struct json_stream *js, + const char *fieldname, + const struct constraint *c, + const struct layer *layer); + +/* Scan for memleaks */ +void layer_memleak_mark(struct askrene *askrene, struct htable *memtable); +#endif /* LIGHTNING_PLUGINS_ASKRENE_LAYER_H */ diff --git a/plugins/askrene/mcf.c b/plugins/askrene/mcf.c new file mode 100644 index 000000000000..b098fa52c24b --- /dev/null +++ b/plugins/askrene/mcf.c @@ -0,0 +1,1383 @@ +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* # Optimal payments + * + * In this module we reduce the routing optimization problem to a linear + * cost optimization problem and find a solution using MCF algorithms. + * The optimization of the routing itself doesn't need a precise numerical + * solution, since we can be happy near optimal results; e.g. paying 100 msat or + * 101 msat for fees doesn't make any difference if we wish to deliver 1M sats. + * On the other hand, we are now also considering Pickhard's + * [1] model to improve payment reliability, + * hence our optimization moves to a 2D space: either we like to maximize the + * probability of success of a payment or minimize the routing fees, or + * alternatively we construct a function of the two that gives a good compromise. + * + * Therefore from now own, the definition of optimal is a matter of choice. + * To simplify the API of this module, we think the best way to state the + * problem is: + * + * Find a routing solution that pays the least of fees while keeping + * the probability of success above a certain value `min_probability`. + * + * + * # Fee Cost + * + * Routing fees is non-linear function of the payment flow x, that's true even + * without the base fee: + * + * fee_msat = base_msat + floor(millionths*x_msat / 10^6) + * + * We approximate this fee into a linear function by computing a slope `c_fee` such + * that: + * + * fee_microsat = c_fee * x_sat + * + * Function `linear_fee_cost` computes `c_fee` based on the base and + * proportional fees of a channel. + * The final product if microsat because if only + * the proportional fee was considered we can have c_fee = millionths. + * Moving to costs based in msats means we have to either truncate payments + * below 1ksats or estimate as 0 cost for channels with less than 1000ppm. + * + * TODO(eduardo): shall we build a linear cost function in msats? + * + * # Probability cost + * + * The probability of success P of the payment is the product of the prob. of + * success of forwarding parts of the payment over all routing channels. This + * problem is separable if we log it, and since we would like to increase P, + * then we can seek to minimize -log(P), and that's our prob. cost function [1]. + * + * - log P = sum_{i} - log P_i + * + * The probability of success `P_i` of sending some flow `x` on a channel with + * liquidity l in the range a<=l a + * = 1. ; for x <= a + * + * Notice that unlike the similar formula in [1], the one we propose does not + * contain the quantization shot noise for counting states. The formula remains + * valid independently of the liquidity units (sats or msats). + * + * The cost associated to probability P is then -k log P, where k is some + * constant. For k=1 we get the following table: + * + * prob | cost + * ----------- + * 0.01 | 4.6 + * 0.02 | 3.9 + * 0.05 | 3.0 + * 0.10 | 2.3 + * 0.20 | 1.6 + * 0.50 | 0.69 + * 0.80 | 0.22 + * 0.90 | 0.10 + * 0.95 | 0.05 + * 0.98 | 0.02 + * 0.99 | 0.01 + * + * Clearly -log P(x) is non-linear; we try to linearize it piecewise: + * split the channel into 4 arcs representing 4 liquidity regions: + * + * arc_0 -> [0, a) + * arc_1 -> [a, a+(b-a)*f1) + * arc_2 -> [a+(b-a)*f1, a+(b-a)*f2) + * arc_3 -> [a+(b-a)*f2, a+(b-a)*f3) + * + * where f1 = 0.5, f2 = 0.8, f3 = 0.95; + * We fill arc_0's capacity with complete certainty P=1, then if more flow is + * needed we start filling the capacity in arc_1 until the total probability + * of success reaches P=0.5, then arc_2 until P=1-0.8=0.2, and finally arc_3 until + * P=1-0.95=0.05. We don't go further than 5% prob. of success per channel. + + * TODO(eduardo): this channel linearization is hard coded into + * `CHANNEL_PIVOTS`, maybe we can parametrize this to take values from the config file. + * + * With this choice, the slope of the linear cost function becomes: + * + * m_0 = 0 + * m_1 = 1.38 k /(b-a) + * m_2 = 3.05 k /(b-a) + * m_3 = 9.24 k /(b-a) + * + * Notice that one of the assumptions in [2] for the MCF problem is that flows + * and the slope of the costs functions are integer numbers. The only way we + * have at hand to make it so, is to choose a universal value of `k` that scales + * up the slopes so that floor(m_i) is not zero for every arc. + * + * # Combine fee and prob. costs + * + * We attempt to solve the original problem of finding the solution that + * pays the least fees while keeping the prob. of success above a certain value, + * by constructing a cost function which is a linear combination of fee and + * prob. costs. + * TODO(eduardo): investigate how this procedure is justified, + * possibly with the use of Lagrange optimization theory. + * + * At first, prob. and fee costs live in different dimensions, they cannot be + * summed, it's like comparing apples and oranges. + * However we propose to scale the prob. cost by a global factor k that + * translates into the monetization of prob. cost. + * + * k/1000, for instance, becomes the equivalent monetary cost + * of increasing the probability of success by 0.1% for P~100%. + * + * The input parameter `prob_cost_factor` in the function `minflow` is defined + * as the PPM from the delivery amount `T` we are *willing to pay* to increase the + * prob. of success by 0.1%: + * + * k_microsat = floor(1000*prob_cost_factor * T_sat) + * + * Is this enough to make integer prob. cost per unit flow? + * For `prob_cost_factor=10`; i.e. we pay 10ppm for increasing the prob. by + * 0.1%, we get that + * + * -> any arc with (b-a) > 10000 T, will have zero prob. cost, which is + * reasonable because even if all the flow passes through that arc, we get + * a 1.3 T/(b-a) ~ 0.01% prob. of failure at most. + * + * -> if (b-a) ~ 10000 T, then the arc will have unit cost, or just that we + * pay 1 microsat for every sat we send through this arc. + * + * -> it would be desirable to have a high proportional fee when (b-a)~T, + * because prob. of failure start to become very high. + * In this case we get to pay 10000 microsats for every sat. + * + * Once `k` is fixed then we can combine the linear prob. and fee costs, both + * are in monetary units. + * + * Note: with costs in microsats, because slopes represent ppm and flows are in + * sats, then our integer bounds with 64 bits are such that we can move as many + * as 10'000 BTC without overflow: + * + * 10^6 (max ppm) * 10^8 (sats per BTC) * 10^4 = 10^18 + * + * # References + * + * [1] Pickhardt and Richter, https://arxiv.org/abs/2107.05322 + * [2] R.K. Ahuja, T.L. Magnanti, and J.B. Orlin. Network Flows: + * Theory, Algorithms, and Applications. Prentice Hall, 1993. + * + * + * TODO(eduardo) it would be interesting to see: + * how much do we pay for reliability? + * Cost_fee(most reliable solution) - Cost_fee(cheapest solution) + * + * TODO(eduardo): it would be interesting to see: + * how likely is the most reliable path with respect to the cheapest? + * Prob(reliable)/Prob(cheapest) = Exp(Cost_prob(cheapest)-Cost_prob(reliable)) + * + * */ + +#define PARTS_BITS 2 +#define CHANNEL_PARTS (1 << PARTS_BITS) + +// These are the probability intervals we use to decompose a channel into linear +// cost function arcs. +static const double CHANNEL_PIVOTS[]={0,0.5,0.8,0.95}; + +static const s64 INFINITE = INT64_MAX; +static const u64 INFINITE_MSAT = UINT64_MAX; +static const u32 INVALID_INDEX = 0xffffffff; +static const s64 MU_MAX = 101; + +/* Let's try this encoding of arcs: + * Each channel `c` has two possible directions identified by a bit + * `half` or `!half`, and each one of them has to be + * decomposed into 4 liquidity parts in order to + * linearize the cost function, but also to solve MCF + * problem we need to keep track of flows in the + * residual network hence we need for each directed arc + * in the network there must be another arc in the + * opposite direction refered to as it's dual. In total + * 1+2+1 additional bits of information: + * + * (chan_idx)(half)(part)(dual) + * + * That means, for each channel we need to store the + * information of 16 arcs. If we implement a convex-cost + * solver then we can reduce that number to size(half)size(dual)=4. + * + * In the adjacency of a `node` we are going to store + * the outgoing arcs. If we ever need to loop over the + * incoming arcs then we will define a reverse adjacency + * API. + * Then for each outgoing channel `(c,half)` there will + * be 4 parts for the actual residual capacity, hence + * with the dual bit set to 0: + * + * (c,half,0,0) + * (c,half,1,0) + * (c,half,2,0) + * (c,half,3,0) + * + * and also we need to consider the dual arcs + * corresponding to the channel direction `(c,!half)` + * (the dual has reverse direction): + * + * (c,!half,0,1) + * (c,!half,1,1) + * (c,!half,2,1) + * (c,!half,3,1) + * + * These are the 8 outgoing arcs relative to `node` and + * associated with channel `c`. The incoming arcs will + * be: + * + * (c,!half,0,0) + * (c,!half,1,0) + * (c,!half,2,0) + * (c,!half,3,0) + * + * (c,half,0,1) + * (c,half,1,1) + * (c,half,2,1) + * (c,half,3,1) + * + * but they will be stored as outgoing arcs on the peer + * node `next`. + * + * I hope this will clarify my future self when I forget. + * + * */ + +/* + * We want to use the whole number here for convenience, but + * we can't us a union, since bit order is implementation-defined and + * we want chanidx on the highest bits: + * + * [ 0 1 2 3 4 5 6 ... 31 ] + * dual part chandir chanidx + */ +struct arc { + u32 idx; +}; + +#define ARC_DUAL_BITOFF (0) +#define ARC_PART_BITOFF (1) +#define ARC_CHANDIR_BITOFF (1 + PARTS_BITS) +#define ARC_CHANIDX_BITOFF (1 + PARTS_BITS + 1) +#define ARC_CHANIDX_BITS (32 - ARC_CHANIDX_BITOFF) + +/* How many arcs can we have for a single channel? + * linearization parts, both directions, and dual */ +#define ARCS_PER_CHANNEL ((size_t)1 << (PARTS_BITS + 1 + 1)) + +static inline void arc_to_parts(struct arc arc, + u32 *chanidx, + int *chandir, + u32 *part, + bool *dual) +{ + if (chanidx) + *chanidx = (arc.idx >> ARC_CHANIDX_BITOFF); + if (chandir) + *chandir = (arc.idx >> ARC_CHANDIR_BITOFF) & 1; + if (part) + *part = (arc.idx >> ARC_PART_BITOFF) & ((1 << PARTS_BITS)-1); + if (dual) + *dual = (arc.idx >> ARC_DUAL_BITOFF) & 1; +} + +static inline struct arc arc_from_parts(u32 chanidx, int chandir, u32 part, bool dual) +{ + struct arc arc; + + assert(part < CHANNEL_PARTS); + assert(chandir == 0 || chandir == 1); + assert(chanidx < (1U << ARC_CHANIDX_BITS)); + arc.idx = ((u32)dual << ARC_DUAL_BITOFF) + | (part << ARC_PART_BITOFF) + | ((u32)chandir << ARC_CHANDIR_BITOFF) + | (chanidx << ARC_CHANIDX_BITOFF); + return arc; +} + +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) + +struct pay_parameters { + const struct route_query *rq; + const struct gossmap_node *source; + const struct gossmap_node *target; + + // how much we pay + struct amount_msat amount; + + // channel linearization parameters + double cap_fraction[CHANNEL_PARTS], + cost_fraction[CHANNEL_PARTS]; + + double delay_feefactor; + double base_fee_penalty; + u32 prob_cost_factor; +}; + +/* Representation of the linear MCF network. + * This contains the topology of the extended network (after linearization and + * addition of arc duality). + * This contains also the arc probability and linear fee cost, as well as + * capacity; these quantities remain constant during MCF execution. */ +struct linear_network +{ + u32 *arc_tail_node; + // notice that a tail node is not needed, + // because the tail of arc is the head of dual(arc) + + struct arc *node_adjacency_next_arc; + struct arc *node_adjacency_first_arc; + + // probability and fee cost associated to an arc + s64 *arc_prob_cost, *arc_fee_cost; + s64 *capacity; + + size_t max_num_arcs,max_num_nodes; +}; + +/* This is the structure that keeps track of the network properties while we + * seek for a solution. */ +struct residual_network { + /* residual capacity on arcs */ + s64 *cap; + + /* some combination of prob. cost and fee cost on arcs */ + s64 *cost; + + /* potential function on nodes */ + s64 *potential; +}; + +/* Helper function. + * Given an arc idx, return the dual's idx in the residual network. */ +static struct arc arc_dual(struct arc arc) +{ + arc.idx ^= (1U << ARC_DUAL_BITOFF); + return arc; +} +/* Helper function. */ +static bool arc_is_dual(struct arc arc) +{ + bool dual; + arc_to_parts(arc, NULL, NULL, NULL, &dual); + return dual; +} + +/* Helper function. + * Given an arc of the network (not residual) give me the flow. */ +static s64 get_arc_flow( + const struct residual_network *network, + const struct arc arc) +{ + assert(!arc_is_dual(arc)); + assert(arc_dual(arc).idx < tal_count(network->cap)); + return network->cap[ arc_dual(arc).idx ]; +} + +/* Helper function. + * Given an arc idx, return the node from which this arc emanates in the residual network. */ +static u32 arc_tail(const struct linear_network *linear_network, + const struct arc arc) +{ + assert(arc.idx < tal_count(linear_network->arc_tail_node)); + return linear_network->arc_tail_node[ arc.idx ]; +} +/* Helper function. + * Given an arc idx, return the node that this arc is pointing to in the residual network. */ +static u32 arc_head(const struct linear_network *linear_network, + const struct arc arc) +{ + const struct arc dual = arc_dual(arc); + assert(dual.idx < tal_count(linear_network->arc_tail_node)); + return linear_network->arc_tail_node[dual.idx]; +} + +/* Helper function. + * Given node idx `node`, return the idx of the first arc whose tail is `node`. + * */ +static struct arc node_adjacency_begin( + const struct linear_network * linear_network, + const u32 node) +{ + assert(node < tal_count(linear_network->node_adjacency_first_arc)); + return linear_network->node_adjacency_first_arc[node]; +} + +/* Helper function. + * Is this the end of the adjacency list. */ +static bool node_adjacency_end(const struct arc arc) +{ + return arc.idx == INVALID_INDEX; +} + +/* Helper function. + * Given node idx `node` and `arc`, returns the idx of the next arc whose tail is `node`. */ +static struct arc node_adjacency_next( + const struct linear_network *linear_network, + const struct arc arc) +{ + assert(arc.idx < tal_count(linear_network->node_adjacency_next_arc)); + return linear_network->node_adjacency_next_arc[arc.idx]; +} + +// TODO(eduardo): unit test this +/* Split a directed channel into parts with linear cost function. */ +static void linearize_channel(const struct pay_parameters *params, + const struct gossmap_chan *c, const int dir, + s64 *capacity, s64 *cost) +{ + struct amount_msat mincap, maxcap; + + /* This takes into account any payments in progress. */ + get_constraints(params->rq, c, dir, &mincap, &maxcap); + /* Assume if min > max, max is wrong */ + if (amount_msat_greater(mincap, maxcap)) + maxcap = mincap; + + u64 a = mincap.millisatoshis/1000, /* Raw: linearize_channel */ + b = 1 + maxcap.millisatoshis/1000; /* Raw: linearize_channel */ + + /* An extra bound on capacity, here we use it to reduce the flow such + * that it does not exceed htlcmax. */ + u64 cap_on_capacity = fp16_to_u64(c->half[dir].htlc_max) / 1000; + + capacity[0]=a; + cost[0]=0; + for(size_t i=1;icap_fraction[i]*(b-a), cap_on_capacity); + assert(cap_on_capacity >= capacity[i]); + cap_on_capacity -= capacity[i]; + + cost[i] = params->cost_fraction[i] + *params->amount.millisatoshis /* Raw: linearize_channel */ + *params->prob_cost_factor*1.0/(b-a); + } +} + +static struct residual_network * +alloc_residual_network(const tal_t *ctx, const size_t max_num_nodes, + const size_t max_num_arcs) +{ + struct residual_network *residual_network = + tal(ctx, struct residual_network); + + residual_network->cap = tal_arrz(residual_network, s64, max_num_arcs); + residual_network->cost = tal_arrz(residual_network, s64, max_num_arcs); + residual_network->potential = + tal_arrz(residual_network, s64, max_num_nodes); + + return residual_network; +} + +static void init_residual_network( + const struct linear_network * linear_network, + struct residual_network* residual_network) +{ + const size_t max_num_arcs = linear_network->max_num_arcs; + const size_t max_num_nodes = linear_network->max_num_nodes; + + for(struct arc arc = {0};arc.idx < max_num_arcs; ++arc.idx) + { + if(arc_is_dual(arc)) + continue; + + struct arc dual = arc_dual(arc); + residual_network->cap[arc.idx]=linear_network->capacity[arc.idx]; + residual_network->cap[dual.idx]=0; + + residual_network->cost[arc.idx]=residual_network->cost[dual.idx]=0; + } + for(u32 i=0;ipotential[i]=0; + } +} + +static void combine_cost_function( + const struct linear_network* linear_network, + struct residual_network *residual_network, + s64 mu) +{ + for(struct arc arc = {0};arc.idx < linear_network->max_num_arcs; ++arc.idx) + { + if(arc_tail(linear_network,arc)==INVALID_INDEX) + continue; + + const s64 pcost = linear_network->arc_prob_cost[arc.idx], + fcost = linear_network->arc_fee_cost[arc.idx]; + + const s64 combined = pcost==INFINITE || fcost==INFINITE ? INFINITE : + mu*fcost + (MU_MAX-1-mu)*pcost; + + residual_network->cost[arc.idx] + = mu==0 ? pcost : + (mu==(MU_MAX-1) ? fcost : combined); + } +} + +static void linear_network_add_adjacenct_arc( + struct linear_network *linear_network, + const u32 node_idx, + const struct arc arc) +{ + assert(arc.idx < tal_count(linear_network->arc_tail_node)); + linear_network->arc_tail_node[arc.idx] = node_idx; + + assert(node_idx < tal_count(linear_network->node_adjacency_first_arc)); + const struct arc first_arc = linear_network->node_adjacency_first_arc[node_idx]; + + assert(arc.idx < tal_count(linear_network->node_adjacency_next_arc)); + linear_network->node_adjacency_next_arc[arc.idx]=first_arc; + + assert(node_idx < tal_count(linear_network->node_adjacency_first_arc)); + linear_network->node_adjacency_first_arc[node_idx]=arc; +} + +/* Get the fee cost associated to this directed channel. + * Cost is expressed as PPM of the payment. + * + * Choose and integer `c_fee` to linearize the following fee function + * + * fee_msat = base_msat + floor(millionths*x_msat / 10^6) + * + * into + * + * fee_microsat = c_fee * x_sat + * + * use `base_fee_penalty` to weight the base fee and `delay_feefactor` to + * weight the CLTV delay. + * */ +static s64 linear_fee_cost( + const struct gossmap_chan *c, + const int dir, + double base_fee_penalty, + double delay_feefactor) +{ + assert(c); + assert(dir==0 || dir==1); + s64 pfee = c->half[dir].proportional_fee, + bfee = c->half[dir].base_fee, + delay = c->half[dir].delay; + + return pfee + bfee* base_fee_penalty+ delay*delay_feefactor; +} + +static struct linear_network * +init_linear_network(const tal_t *ctx, const struct pay_parameters *params) +{ + struct linear_network * linear_network = tal(ctx, struct linear_network); + const struct gossmap *gossmap = params->rq->gossmap; + + const size_t max_num_chans = gossmap_max_chan_idx(gossmap); + const size_t max_num_arcs = max_num_chans * ARCS_PER_CHANNEL; + const size_t max_num_nodes = gossmap_max_node_idx(gossmap); + + linear_network->max_num_arcs = max_num_arcs; + linear_network->max_num_nodes = max_num_nodes; + + linear_network->arc_tail_node = tal_arr(linear_network,u32,max_num_arcs); + for(size_t i=0;iarc_tail_node);++i) + linear_network->arc_tail_node[i]=INVALID_INDEX; + + linear_network->node_adjacency_next_arc = tal_arr(linear_network,struct arc,max_num_arcs); + for(size_t i=0;inode_adjacency_next_arc);++i) + linear_network->node_adjacency_next_arc[i].idx=INVALID_INDEX; + + linear_network->node_adjacency_first_arc = tal_arr(linear_network,struct arc,max_num_nodes); + for(size_t i=0;inode_adjacency_first_arc);++i) + linear_network->node_adjacency_first_arc[i].idx=INVALID_INDEX; + + linear_network->arc_prob_cost = tal_arr(linear_network,s64,max_num_arcs); + for(size_t i=0;iarc_prob_cost);++i) + linear_network->arc_prob_cost[i]=INFINITE; + + linear_network->arc_fee_cost = tal_arr(linear_network,s64,max_num_arcs); + for(size_t i=0;iarc_fee_cost);++i) + linear_network->arc_fee_cost[i]=INFINITE; + + linear_network->capacity = tal_arrz(linear_network,s64,max_num_arcs); + + for(struct gossmap_node *node = gossmap_first_node(gossmap); + node; + node=gossmap_next_node(gossmap,node)) + { + const u32 node_id = gossmap_node_idx(gossmap,node); + + for(size_t j=0;jnum_chans;++j) + { + int half; + const struct gossmap_chan *c = gossmap_nth_chan(gossmap, + node, j, &half); + + if (!gossmap_chan_set(c, half)) + continue; + + const u32 chan_id = gossmap_chan_idx(gossmap, c); + + const struct gossmap_node *next = gossmap_nth_node(gossmap, + c,!half); + + const u32 next_id = gossmap_node_idx(gossmap,next); + + if(node_id==next_id) + continue; + + // `cost` is the word normally used to denote cost per + // unit of flow in the context of MCF. + s64 prob_cost[CHANNEL_PARTS], capacity[CHANNEL_PARTS]; + + // split this channel direction to obtain the arcs + // that are outgoing to `node` + linearize_channel(params, c, half, capacity, prob_cost); + + const s64 fee_cost = linear_fee_cost(c,half, + params->base_fee_penalty, + params->delay_feefactor); + + // let's subscribe the 4 parts of the channel direction + // (c,half), the dual of these guys will be subscribed + // when the `i` hits the `next` node. + for(size_t k=0;kcapacity[arc.idx] = capacity[k]; + linear_network->arc_prob_cost[arc.idx] = prob_cost[k]; + + linear_network->arc_fee_cost[arc.idx] = fee_cost; + + // + the respective dual + struct arc dual = arc_dual(arc); + + linear_network_add_adjacenct_arc(linear_network,next_id,dual); + + linear_network->capacity[dual.idx] = 0; + linear_network->arc_prob_cost[dual.idx] = -prob_cost[k]; + + linear_network->arc_fee_cost[dual.idx] = -fee_cost; + } + } + } + + return linear_network; +} + +/* Simple queue to traverse the network. */ +struct queue_data +{ + u32 idx; + struct lqueue_link ql; +}; + +// TODO(eduardo): unit test this +/* Finds an admissible path from source to target, traversing arcs in the + * residual network with capacity greater than 0. + * The path is encoded into prev, which contains the idx of the arcs that are + * traversed. */ +static bool +find_admissible_path(const struct linear_network *linear_network, + const struct residual_network *residual_network, + const u32 source, const u32 target, struct arc *prev) +{ + bool target_found = false; + + for(size_t i=0;iidx = source; + lqueue_enqueue(&myqueue,qdata); + + while(!lqueue_empty(&myqueue)) + { + qdata = lqueue_dequeue(&myqueue); + u32 cur = qdata->idx; + + tal_free(qdata); + + if(cur==target) + { + target_found = true; + break; + } + + for(struct arc arc = node_adjacency_begin(linear_network,cur); + !node_adjacency_end(arc); + arc = node_adjacency_next(linear_network,arc)) + { + // check if this arc is traversable + if(residual_network->cap[arc.idx] <= 0) + continue; + + u32 next = arc_head(linear_network,arc); + + assert(next < tal_count(prev)); + + // if that node has been seen previously + if(prev[next].idx!=INVALID_INDEX) + continue; + + prev[next] = arc; + + qdata = tal(tmpctx, struct queue_data); + qdata->idx = next; + lqueue_enqueue(&myqueue,qdata); + } + } + return target_found; +} + +/* Get the max amount of flow one can send from source to target along the path + * encoded in `prev`. */ +static s64 get_augmenting_flow( + const struct linear_network* linear_network, + const struct residual_network *residual_network, + const u32 source, + const u32 target, + const struct arc *prev) +{ + s64 flow = INFINITE; + + u32 cur = target; + while(cur!=source) + { + assert(curcap[arc.idx]); + + // we are traversing in the opposite direction to the flow, + // hence the next node is at the tail of the arc. + cur = arc_tail(linear_network,arc); + } + + assert(flow0); + return flow; +} + +/* Augment a `flow` amount along the path defined by `prev`.*/ +static void augment_flow( + const struct linear_network *linear_network, + struct residual_network *residual_network, + const u32 source, + const u32 target, + const struct arc *prev, + s64 flow) +{ + u32 cur = target; + + while(cur!=source) + { + assert(cur < tal_count(prev)); + const struct arc arc = prev[cur]; + const struct arc dual = arc_dual(arc); + + assert(arc.idx < tal_count(residual_network->cap)); + assert(dual.idx < tal_count(residual_network->cap)); + + residual_network->cap[arc.idx] -= flow; + residual_network->cap[dual.idx] += flow; + + assert(residual_network->cap[arc.idx] >=0 ); + + // we are traversing in the opposite direction to the flow, + // hence the next node is at the tail of the arc. + cur = arc_tail(linear_network,arc); + } +} + + +// TODO(eduardo): unit test this +/* Finds any flow that satisfy the capacity and balance constraints of the + * uncertainty network. For the balance function condition we have: + * balance(source) = - balance(target) = amount + * balance(node) = 0 , for every other node + * Returns an error code if no feasible flow is found. + * + * 13/04/2023 This implementation uses a simple augmenting path approach. + * */ +static bool find_feasible_flow(const struct linear_network *linear_network, + struct residual_network *residual_network, + const u32 source, const u32 target, s64 amount) +{ + assert(amount>=0); + + /* path information + * prev: is the id of the arc that lead to the node. */ + struct arc *prev = tal_arr(tmpctx,struct arc,linear_network->max_num_nodes); + + while(amount>0) + { + // find a path from source to target + if (!find_admissible_path(linear_network, + residual_network, source, target, + prev)) { + return false; + } + + // traverse the path and see how much flow we can send + s64 delta = get_augmenting_flow(linear_network, + residual_network, + source,target,prev); + + // commit that flow to the path + delta = MIN(amount,delta); + assert(delta>0 && delta<=amount); + + augment_flow(linear_network,residual_network,source,target,prev,delta); + amount -= delta; + } + + return true; +} + +// TODO(eduardo): unit test this +/* Similar to `find_admissible_path` but use Dijkstra to optimize the distance + * label. Stops when the target is hit. */ +static bool find_optimal_path(struct dijkstra *dijkstra, + const struct linear_network *linear_network, + const struct residual_network *residual_network, + const u32 source, const u32 target, + struct arc *prev) +{ + bool target_found = false; + + bitmap *visited = tal_arrz(tmpctx, bitmap, + BITMAP_NWORDS(linear_network->max_num_nodes)); + for(size_t i=0;icap[arc.idx] <= 0) + continue; + + u32 next = arc_head(linear_network,arc); + + s64 cij = residual_network->cost[arc.idx] + - residual_network->potential[cur] + + residual_network->potential[next]; + + // Dijkstra only works with non-negative weights + assert(cij>=0); + + if(distance[next]<=distance[cur]+cij) + continue; + + dijkstra_update(dijkstra,next,distance[cur]+cij); + prev[next]=arc; + } + } + + return target_found; +} + +/* Set zero flow in the residual network. */ +static void zero_flow( + const struct linear_network *linear_network, + struct residual_network *residual_network) +{ + for(u32 node=0;nodemax_num_nodes;++node) + { + residual_network->potential[node]=0; + for(struct arc arc=node_adjacency_begin(linear_network,node); + !node_adjacency_end(arc); + arc = node_adjacency_next(linear_network,arc)) + { + if(arc_is_dual(arc))continue; + + struct arc dual = arc_dual(arc); + + residual_network->cap[arc.idx] = linear_network->capacity[arc.idx]; + residual_network->cap[dual.idx] = 0; + } + } +} + +// TODO(eduardo): unit test this +/* Starting from a feasible flow (satisfies the balance and capacity + * constraints), find a solution that minimizes the network->cost function. + * + * TODO(eduardo) The MCF must be called several times until we get a good + * compromise between fees and probabilities. Instead of re-computing the MCF at + * each step, we might use the previous flow result, which is not optimal in the + * current iteration but I might be not too far from the truth. + * It comes to mind to use cycle cancelling. */ +static bool optimize_mcf(struct dijkstra *dijkstra, + const struct linear_network *linear_network, + struct residual_network *residual_network, + const u32 source, const u32 target, const s64 amount) +{ + assert(amount>=0); + + zero_flow(linear_network,residual_network); + struct arc *prev = tal_arr(tmpctx,struct arc,linear_network->max_num_nodes); + + const s64 *const distance = dijkstra_distance_data(dijkstra); + + s64 remaining_amount = amount; + + while(remaining_amount>0) + { + if (!find_optimal_path(dijkstra, linear_network, + residual_network, source, target, prev)) { + return false; + } + + // traverse the path and see how much flow we can send + s64 delta = get_augmenting_flow(linear_network,residual_network,source,target,prev); + + // commit that flow to the path + delta = MIN(remaining_amount,delta); + assert(delta>0 && delta<=remaining_amount); + + augment_flow(linear_network,residual_network,source,target,prev,delta); + remaining_amount -= delta; + + // update potentials + for(u32 n=0;nmax_num_nodes;++n) + { + // see page 323 of Ahuja-Magnanti-Orlin + residual_network->potential[n] -= MIN(distance[target],distance[n]); + + /* Notice: + * if node i is permanently labeled we have + * d_i<=d_t + * which implies + * MIN(d_i,d_t) = d_i + * if node i is temporarily labeled we have + * d_i>=d_t + * which implies + * MIN(d_i,d_t) = d_t + * */ + } + } + return true; +} + +// flow on directed channels +struct chan_flow +{ + s64 half[2]; +}; + +/* Search in the network a path of positive flow until we reach a node with + * positive balance. */ +static u32 find_positive_balance( + const struct gossmap *gossmap, + const struct chan_flow *chan_flow, + const u32 start_idx, + const s64 *balance, + + const struct gossmap_chan **prev_chan, + int *prev_dir, + u32 *prev_idx) +{ + u32 final_idx = start_idx; + + /* TODO(eduardo) + * This is guaranteed to halt if there are no directed flow cycles. + * There souldn't be any. In fact if cost is strickly + * positive, then flow cycles do not exist at all in the + * MCF solution. But if cost is allowed to be zero for + * some arcs, then we might have flow cyles in the final + * solution. We must somehow ensure that the MCF + * algorithm does not come up with spurious flow cycles. */ + while(balance[final_idx]<=0) + { + // printf("%s: node = %d\n",__PRETTY_FUNCTION__,final_idx); + u32 updated_idx=INVALID_INDEX; + struct gossmap_node *cur + = gossmap_node_byidx(gossmap,final_idx); + + for(size_t i=0;inum_chans;++i) + { + int dir; + const struct gossmap_chan *c + = gossmap_nth_chan(gossmap, + cur,i,&dir); + + if (!gossmap_chan_set(c, dir)) + continue; + + const u32 c_idx = gossmap_chan_idx(gossmap,c); + + // follow the flow + if(chan_flow[c_idx].half[dir]>0) + { + const struct gossmap_node *next + = gossmap_nth_node(gossmap,c,!dir); + u32 next_idx = gossmap_node_idx(gossmap,next); + + + prev_dir[next_idx] = dir; + prev_chan[next_idx] = c; + prev_idx[next_idx] = final_idx; + + updated_idx = next_idx; + break; + } + } + + assert(updated_idx!=INVALID_INDEX); + assert(updated_idx!=final_idx); + + final_idx = updated_idx; + } + return final_idx; +} + +struct list_data +{ + struct list_node list; + struct flow *flow_path; +}; + +static inline uint64_t pseudorand_interval(uint64_t a, uint64_t b) +{ + if (a == b) + return b; + assert(b > a); + return a + pseudorand(b - a); +} + +/* Given a flow in the residual network, build a set of payment flows in the + * gossmap that corresponds to this flow. */ +static struct flow ** +get_flow_paths(const tal_t *ctx, + const struct route_query *rq, + const struct linear_network *linear_network, + const struct residual_network *residual_network, + + // how many msats in excess we paid for not having msat accuracy + // in the MCF solver + struct amount_msat excess) +{ + struct flow **flows = tal_arr(ctx,struct flow*,0); + + assert(amount_msat_less(excess, AMOUNT_MSAT(1000))); + + const size_t max_num_chans = gossmap_max_chan_idx(rq->gossmap); + struct chan_flow *chan_flow = tal_arrz(tmpctx,struct chan_flow,max_num_chans); + + const size_t max_num_nodes = gossmap_max_node_idx(rq->gossmap); + s64 *balance = tal_arrz(tmpctx,s64,max_num_nodes); + + const struct gossmap_chan **prev_chan + = tal_arr(tmpctx,const struct gossmap_chan *,max_num_nodes); + + + int *prev_dir = tal_arr(tmpctx,int,max_num_nodes); + u32 *prev_idx = tal_arr(tmpctx,u32,max_num_nodes); + + // Convert the arc based residual network flow into a flow in the + // directed channel network. + // Compute balance on the nodes. + for(u32 n = 0;ngossmap, chan_flow, node_idx, balance, + prev_chan, prev_dir, prev_idx); + + /* For each route we will compute the highest htlc_min + * and the smallest htlc_max and use those to constraint + * the flow we will allocate. */ + struct amount_msat sup_htlc_min = AMOUNT_MSAT_INIT(0), + inf_htlc_max = + AMOUNT_MSAT_INIT(INFINITE_MSAT); + + s64 delta=-balance[node_idx]; + int length = 0; + delta = MIN(delta,balance[final_idx]); + + // walk backwards, get me the length and the max flow we + // can send. + for(u32 cur_idx = final_idx; + cur_idx!=node_idx; + cur_idx=prev_idx[cur_idx]) + { + assert(cur_idx!=INVALID_INDEX); + + const int dir = prev_dir[cur_idx]; + const struct gossmap_chan *const c = prev_chan[cur_idx]; + const u32 c_idx = gossmap_chan_idx(rq->gossmap,c); + + delta=MIN(delta,chan_flow[c_idx].half[dir]); + length++; + + /* obtain the supremum htlc_min along the route + */ + sup_htlc_min = amount_msat_max( + sup_htlc_min, gossmap_chan_htlc_min(c, dir)); + + /* obtain the infimum htlc_max along the route + */ + inf_htlc_max = amount_msat_min( + inf_htlc_max, gossmap_chan_htlc_max(c, dir)); + } + + s64 htlc_max=inf_htlc_max.millisatoshis/1000;/* Raw: need htlc_max in sats to do arithmetic operations.*/ + s64 htlc_min=(sup_htlc_min.millisatoshis+999)/1000;/* Raw: need htlc_min in sats to do arithmetic operations.*/ + + if (htlc_min > htlc_max) { + /* htlc_min is too big or htlc_max is too small, + * we cannot send `delta` along this route. + * + * FIXME: We try anyways because failing + * channels will be blacklisted downstream. */ + htlc_min = 0; + } + + /* If we divide this route into different flows make it + * random to avoid routing nodes making correlations. */ + if (delta > htlc_max) { + // FIXME: choosing a number in the range + // [htlc_min, htlc_max] or + // [0.5 htlc_max, htlc_max] + // The choice of the fraction was completely + // arbitrary. + delta = pseudorand_interval( + MAX(htlc_min, (htlc_max * 50) / 100), + htlc_max); + } + + struct flow *fp = tal(tmpctx,struct flow); + fp->path = tal_arr(fp,const struct gossmap_chan *,length); + fp->dirs = tal_arr(fp,int,length); + + balance[node_idx] += delta; + balance[final_idx]-= delta; + + // walk backwards, substract flow + for(u32 cur_idx = final_idx; + cur_idx!=node_idx; + cur_idx=prev_idx[cur_idx]) + { + assert(cur_idx!=INVALID_INDEX); + + const int dir = prev_dir[cur_idx]; + const struct gossmap_chan *const c = prev_chan[cur_idx]; + const u32 c_idx = gossmap_chan_idx(rq->gossmap,c); + + length--; + fp->path[length]=c; + fp->dirs[length]=dir; + // notice: fp->path and fp->dirs have the path + // in the correct order. + + chan_flow[c_idx].half[prev_dir[cur_idx]]-=delta; + } + + assert(delta>0); + + // substract the excess of msats for not having msat + // accuracy + struct amount_msat delivered = amount_msat(delta*1000); + if (!amount_msat_sub(&delivered, delivered, excess)) { + plugin_err(rq->plugin, "Unable to subtract excess %s from %s", + fmt_amount_msat(tmpctx, excess), + fmt_amount_msat(tmpctx, delivered)); + } + excess = amount_msat(0); + fp->amount = delivered; + + fp->success_prob = flow_probability(fp, rq); + + // add fp to flows + tal_arr_expand(&flows, fp); + } + } + + /* Establish ownership. */ + for(size_t i=0;irq = rq; + params->source = source; + params->target = target; + params->amount = amount; + + // template the channel partition into linear arcs + params->cap_fraction[0]=0; + params->cost_fraction[0]=0; + for(size_t i =1;icap_fraction[i]=CHANNEL_PIVOTS[i]-CHANNEL_PIVOTS[i-1]; + params->cost_fraction[i]= + log((1-CHANNEL_PIVOTS[i-1])/(1-CHANNEL_PIVOTS[i])) + /params->cap_fraction[i]; + + // printf("channel part: %ld, fraction: %lf, cost_fraction: %lf\n", + // i,params->cap_fraction[i],params->cost_fraction[i]); + } + + params->delay_feefactor = delay_feefactor; + params->base_fee_penalty = base_fee_penalty; + params->prob_cost_factor = prob_cost_factor; + + // build the uncertainty network with linearization and residual arcs + struct linear_network *linear_network= init_linear_network(tmpctx, params); + struct residual_network *residual_network = + alloc_residual_network(tmpctx, linear_network->max_num_nodes, + linear_network->max_num_arcs); + dijkstra = dijkstra_new(tmpctx, gossmap_max_node_idx(rq->gossmap)); + + const u32 target_idx = gossmap_node_idx(rq->gossmap,target); + const u32 source_idx = gossmap_node_idx(rq->gossmap,source); + + init_residual_network(linear_network,residual_network); + + /* TODO(eduardo): + * Some MCF algorithms' performance depend on the size of maxflow. If we + * were to work in units of msats we 1. risking overflow when computing + * costs and 2. we risk a performance overhead for no good reason. + * + * Working in units of sats was my first choice, but maybe working in + * units of 10, or 100 sats could be even better. + * + * IDEA: define the size of our precision as some parameter got at + * runtime that depends on the size of the payment and adjust the MCF + * accordingly. + * For example if we are trying to pay 1M sats our precision could be + * set to 1000sat, then channels that had capacity for 3M sats become 3k + * flow units. */ + const u64 pay_amount_msats = params->amount.millisatoshis % 1000; /* Raw: minflow */ + const u64 pay_amount_sats = params->amount.millisatoshis/1000 /* Raw: minflow */ + + (pay_amount_msats ? 1 : 0); + const struct amount_msat excess + = amount_msat(pay_amount_msats ? 1000 - pay_amount_msats : 0); + + if (!find_feasible_flow(linear_network, residual_network, + source_idx, target_idx, pay_amount_sats)) { + return NULL; + } + combine_cost_function(linear_network, residual_network, mu); + + /* We solve a linear MCF problem. */ + if(!optimize_mcf(dijkstra,linear_network,residual_network, + source_idx,target_idx,pay_amount_sats)) + { + return NULL; + } + + /* We dissect the solution of the MCF into payment routes. + * Actual amounts considering fees are computed for every + * channel in the routes. */ + flow_paths = get_flow_paths(tmpctx, rq, + linear_network, residual_network, excess); + return flow_paths; +} + diff --git a/plugins/askrene/mcf.h b/plugins/askrene/mcf.h new file mode 100644 index 000000000000..eae5bd506ab0 --- /dev/null +++ b/plugins/askrene/mcf.h @@ -0,0 +1,63 @@ +#ifndef LIGHTNING_PLUGINS_ASKRENE_MCF_H +#define LIGHTNING_PLUGINS_ASKRENE_MCF_H +/* Eduardo Quintela's (lagrang3@protonmail.com) Min Cost Flow implementation + * from renepay, as modified to fit askrene */ +#include "config.h" +#include +#include + +struct route_query; + +enum { + RENEPAY_ERR_OK, + // No feasible flow found, either there is not enough known liquidity (or capacity) + // in the channels to complete the payment + RENEPAY_ERR_NOFEASIBLEFLOW, + // There is at least one feasible flow, but the the cheapest solution that we + // found is too expensive, we return the result anyways. + RENEPAY_ERR_NOCHEAPFLOW +}; + + + +/** + * optimal_payment_flow - API for min cost flow function(s). + * @ctx: context to allocate returned flows from + * @gossmap: the gossip map + * @source: the source to start from + * @target: the target to pay + * @amount: the amount we want to reach @target + * @mu: 0 = corresponds to only probabilities, 100 corresponds to only fee. + * + * @delay_feefactor converts 1 block delay into msat, as if it were an additional + * fee. So if a CLTV delay on a node is 5 blocks, that's treated as if it + * were a fee of 5 * @delay_feefactor. + * + * @base_fee_penalty: factor to compute additional proportional cost from each + * unit of base fee. So #base_fee_penalty will be added to the effective + * proportional fee for each msat of base fee. + * + * effective_ppm = proportional_fee + base_fee_msat * base_fee_penalty + * + * @prob_cost_factor: factor used to monetize the probability cost. It is + * defined as the number of ppm (parts per million of the total payment) we + * are willing to pay to improve the probability of success by 0.1%. + * + * k_microsat = floor(1000*prob_cost_factor * payment_sat) + * + * this k is used to compute a prob. cost in units of microsats + * + * cost(payment) = - k_microsat * log Prob(payment) + * + * Return a series of subflows which deliver amount to target, or NULL. + */ +struct flow **minflow(const tal_t *ctx, + const struct route_query *rq, + const struct gossmap_node *source, + const struct gossmap_node *target, + struct amount_msat amount, + u32 mu, + double delay_feefactor, + double base_fee_penalty, + u32 prob_cost_factor); +#endif /* LIGHTNING_PLUGINS_ASKRENE_MCF_H */ diff --git a/plugins/askrene/reserve.c b/plugins/askrene/reserve.c new file mode 100644 index 000000000000..9d1807e8c124 --- /dev/null +++ b/plugins/askrene/reserve.c @@ -0,0 +1,140 @@ +#include "config.h" +#include +#include +#include +#include + +/* Hash table for reservations */ +static const struct short_channel_id_dir * +reserve_scidd(const struct reserve *r) +{ + return &r->scidd; +} + +static size_t hash_scidd(const struct short_channel_id_dir *scidd) +{ + /* scids cost money to generate, so simple hash works here */ + return (scidd->scid.u64 >> 32) ^ (scidd->scid.u64 >> 16) ^ (scidd->scid.u64 << 1) ^ scidd->dir; +} + +static bool reserve_eq_scidd(const struct reserve *r, + const struct short_channel_id_dir *scidd) +{ + return short_channel_id_dir_eq(scidd, &r->scidd); +} + +HTABLE_DEFINE_TYPE(struct reserve, reserve_scidd, hash_scidd, + reserve_eq_scidd, reserve_hash); + +struct reserve_hash *new_reserve_hash(const tal_t *ctx) +{ + struct reserve_hash *reserved = tal(ctx, struct reserve_hash); + reserve_hash_init(reserved); + return reserved; +} + +/* Find a reservation for this scidd (if any!) */ +const struct reserve *find_reserve(const struct reserve_hash *reserved, + const struct short_channel_id_dir *scidd) +{ + return reserve_hash_get(reserved, scidd); +} + +/* Create a new (empty) reservation */ +static struct reserve *new_reserve(struct reserve_hash *reserved, + const struct short_channel_id_dir *scidd) +{ + struct reserve *r = tal(reserved, struct reserve); + + r->num_htlcs = 0; + r->amount = AMOUNT_MSAT(0); + r->scidd = *scidd; + + reserve_hash_add(reserved, r); + return r; +} + +static void del_reserve(struct reserve_hash *reserved, struct reserve *r) +{ + assert(r->num_htlcs == 0); + + reserve_hash_del(reserved, r); + tal_free(r); +} + +/* Add to existing reservation (false if would overflow). */ +static bool add(struct reserve *r, struct amount_msat amount) +{ + if (!amount_msat_add(&r->amount, r->amount, amount)) + return false; + r->num_htlcs++; + return true; +} + +static bool remove(struct reserve *r, struct amount_msat amount) +{ + if (r->num_htlcs == 0) + return false; + if (!amount_msat_sub(&r->amount, r->amount, amount)) + return false; + r->num_htlcs--; + return true; +} + +/* Atomically add to reserves, or fail. + * Returns offset of failure, or num on success */ +size_t reserves_add(struct reserve_hash *reserved, + const struct short_channel_id_dir *scidds, + const struct amount_msat *amounts, + size_t num) +{ + for (size_t i = 0; i < num; i++) { + struct reserve *r = reserve_hash_get(reserved, &scidds[i]); + if (!r) + r = new_reserve(reserved, &scidds[i]); + if (!add(r, amounts[i])) { + reserves_remove(reserved, scidds, amounts, i); + return i; + } + } + return num; +} + +/* Atomically remove from reserves, to fail. + * Returns offset of failure or tal_count(scidds) */ +size_t reserves_remove(struct reserve_hash *reserved, + const struct short_channel_id_dir *scidds, + const struct amount_msat *amounts, + size_t num) +{ + for (size_t i = 0; i < num; i++) { + struct reserve *r = reserve_hash_get(reserved, &scidds[i]); + if (!r || !remove(r, amounts[i])) { + reserves_add(reserved, scidds, amounts, i); + return i; + } + if (r->num_htlcs == 0) + del_reserve(reserved, r); + } + return num; +} + +void reserves_clear_capacities(struct reserve_hash *reserved, + const struct gossmap *gossmap, + fp16_t *capacities) +{ + struct reserve *r; + struct reserve_hash_iter rit; + + for (r = reserve_hash_first(reserved, &rit); + r; + r = reserve_hash_next(reserved, &rit)) { + struct gossmap_chan *c = gossmap_find_chan(gossmap, &r->scidd.scid); + size_t idx; + if (!c) + continue; + idx = gossmap_chan_idx(gossmap, c); + if (idx < tal_count(capacities)) + capacities[idx] = 0; + } +} diff --git a/plugins/askrene/reserve.h b/plugins/askrene/reserve.h new file mode 100644 index 000000000000..93ceace26606 --- /dev/null +++ b/plugins/askrene/reserve.h @@ -0,0 +1,43 @@ +#ifndef LIGHTNING_PLUGINS_ASKRENE_RESERVE_H +#define LIGHTNING_PLUGINS_ASKRENE_RESERVE_H +/* We have to know what payments are in progress, so we can take into + * account the reduced capacity of channels. We do this by telling + * everyone to reserve / unreserve paths as they use them. */ +#include "config.h" +#include +#include +#include + +/* We reserve a path being used. This records how many and how much */ +struct reserve { + size_t num_htlcs; + struct short_channel_id_dir scidd; + struct amount_msat amount; +}; + +/* Initialize hash table for reservations */ +struct reserve_hash *new_reserve_hash(const tal_t *ctx); + +/* Find a reservation for this scidd (if any!) */ +const struct reserve *find_reserve(const struct reserve_hash *reserved, + const struct short_channel_id_dir *scidd); + +/* Atomically add to reserves, or fail. + * Returns offset of failure, or num on success */ +size_t reserves_add(struct reserve_hash *reserved, + const struct short_channel_id_dir *scidds, + const struct amount_msat *amounts, + size_t num); + +/* Atomically remove from reserves, to fail. + * Returns offset of failure or tal_count(scidds) */ +size_t reserves_remove(struct reserve_hash *reserved, + const struct short_channel_id_dir *scidds, + const struct amount_msat *amounts, + size_t num); + +/* Clear capacities array where we have reserves */ +void reserves_clear_capacities(struct reserve_hash *reserved, + const struct gossmap *gossmap, + fp16_t *capacities); +#endif /* LIGHTNING_PLUGINS_ASKRENE_RESERVE_H */ diff --git a/plugins/autoclean.c b/plugins/autoclean.c index c3febc05a50a..f1e2e5198170 100644 --- a/plugins/autoclean.c +++ b/plugins/autoclean.c @@ -256,7 +256,7 @@ static struct command_result *clean_finished(struct clean_info *cinfo) if (!num_cleaned) continue; - plugin_log(plugin, LOG_DBG, "cleaned %"PRIu64" from %s", + plugin_log(plugin, LOG_DBG, "cleaned %zu from %s", num_cleaned, subsystem_to_str(&sv)); *total_cleaned(&sv) += num_cleaned; jsonrpc_set_datastore_string(plugin, cinfo->cmd, @@ -793,15 +793,9 @@ static bool u64_jsonfmt_unless_zero(struct plugin *plugin, static const struct plugin_command commands[] = { { "autoclean-status", - "utility", - "Show status of autocleaning", - "Takes optional {subsystem}", json_autoclean_status, }, { "autoclean-once", - "utility", - "Perform a single run of autocleaning on one subsystem", - "Requires {subsystem} and {age}", json_autoclean_once, }, }; @@ -811,7 +805,8 @@ int main(int argc, char *argv[]) setup_locale(); timer_cinfo = new_clean_info(NULL, NULL); - plugin_main(argv, init, PLUGIN_STATIC, true, NULL, commands, ARRAY_SIZE(commands), + plugin_main(argv, init, NULL, PLUGIN_STATIC, true, NULL, + commands, ARRAY_SIZE(commands), NULL, 0, NULL, 0, NULL, 0, plugin_option_dynamic("autoclean-cycle", "int", diff --git a/plugins/bcli.c b/plugins/bcli.c index bc929f4356c6..b169a74df754 100644 --- a/plugins/bcli.c +++ b/plugins/bcli.c @@ -1119,39 +1119,22 @@ static const char *init(struct plugin *p, const char *buffer UNUSED, static const struct plugin_command commands[] = { { "getrawblockbyheight", - "bitcoin", - "Get the bitcoin block at a given height", - "", getrawblockbyheight }, { "getchaininfo", - "bitcoin", - "Get the chain id, the header count, the block count," - " and whether this is IBD.", - "", getchaininfo }, { "estimatefees", - "bitcoin", - "Get the urgent, normal and slow Bitcoin feerates as" - " sat/kVB.", - "", estimatefees }, { "sendrawtransaction", - "bitcoin", - "Send a raw transaction to the Bitcoin network.", - "", sendrawtransaction }, { "getutxout", - "bitcoin", - "Get information about an output, identified by a {txid} an a {vout}", - "", getutxout }, }; @@ -1188,7 +1171,7 @@ int main(int argc, char *argv[]) /* Initialize our global context object here to handle startup options. */ bitcoind = new_bitcoind(NULL); - plugin_main(argv, init, PLUGIN_STATIC, false /* Do not init RPC on startup*/, + plugin_main(argv, init, NULL, PLUGIN_STATIC, false /* Do not init RPC on startup*/, NULL, commands, ARRAY_SIZE(commands), NULL, 0, NULL, 0, NULL, 0, plugin_option("bitcoin-datadir", diff --git a/plugins/bkpr/README.md b/plugins/bkpr/README.md new file mode 100644 index 000000000000..658d09f0182a --- /dev/null +++ b/plugins/bkpr/README.md @@ -0,0 +1,77 @@ +The bookkeeper keeps track of coins moving through your Lightning node. + +See the doc/PLUGINS.md#coin_movement section on the message that CLN emits for us to process. + +// FIXME: add more detailed documenation for how bookkeeper works. + + +## 3rd Party Coin Movements +Bookeeper ingests 3rd party plugin notifications about on-chain movements that it should watch. + +This allows for us to account for non-internal on-chain wallets in the single place, making `bookkeeper` your single source of truth for bitcoin for an organization or node-operator. + +As a plugin writer, if you want to emit onchain events that the bookkeeper should track, you should emit an event with the following format: + +``` +{ + "utxo_deposit": { + "account": "nifty's secret stash", + "transfer_from: null, + "outpoint": xxxx:x, + "amount_msat": "10000sat", + "coin_type": "bc", + "timestamp": xxxx, + "blockheight": xxx, + } +} +``` + +``` +{ + "utxo_spend": { + "account": "nifty's secret stash", + "outpoint": xxxx:x, + "spending_txid": xxxx, + "amount_msat": "10000sat", + "coin_type": "bc", + "timestamp": xxxx, + "blockheight": xxx, + } +} +``` + + +## Withdrawing money (sending to a external account) + +Sending money to an external account is a bit unintuitive in in the UTXO model that we're using to track coin moves; technically a send to an external account is a "deposit" to 3rd party's UTXO. + +To account for these, `bookkeeper` expects to receive a `utxo_deposit` event for the creation of an output to a 3rd party. It's assumed that you'll issue these at transaction creation time, and that they won't be final until we receive notice of spend of the inputs in the tx that created them. + +To notify that money is being sent to a 3rd party output, here's the event we'd expect. + +The two keys here are the following: + +- The `account` is `external`. This is a special account in `bookkeeper` and used for tracking external deposits (aka sends) +- The `transfer_from` field is set to the name of the account that is sending out the money. + + +``` +{ + "utxo_deposit": { + "account": "external", + "transfer_from": "nifty's secret stash", + "outpoint": xxxx:x, + "amount_msat": "10000sat", + "coin_type": "bc", + "timestamp": xxxx, + "blockheight": xxx, + } +} +``` + + +## List of todos + +List of things to check/work on, as a todo list. + +- Transfers btw a 3rd party wallet and the internal CLN wallet? These should be registered as internal transfers and not show up in `listincome` diff --git a/plugins/bkpr/bookkeeper.c b/plugins/bkpr/bookkeeper.c index 2151032a5685..13c030795f59 100644 --- a/plugins/bkpr/bookkeeper.c +++ b/plugins/bkpr/bookkeeper.c @@ -671,6 +671,7 @@ static bool new_missed_channel_account(struct command *cmd, chain_ev->payment_id = NULL; chain_ev->ignored = false; chain_ev->stealable = false; + chain_ev->splice_close = false; chain_ev->desc = NULL; /* Update the account info too */ @@ -1458,9 +1459,11 @@ parse_and_log_chain_move(struct command *cmd, e->ignored = false; e->stealable = false; + e->splice_close = false; for (size_t i = 0; i < tal_count(tags); i++) { e->ignored |= tags[i] == IGNORED; e->stealable |= tags[i] == STEALABLE; + e->splice_close |= tags[i] == SPLICE; } db_begin_transaction(db); @@ -1516,7 +1519,8 @@ parse_and_log_chain_move(struct command *cmd, /* Go see if there's any deposits to an external * that are now confirmed */ /* FIXME: might need updating when we can splice? */ - maybe_closeout_external_deposits(db, e); + maybe_closeout_external_deposits(db, e->spending_txid, + e->blockheight); db_commit_transaction(db); } @@ -1671,6 +1675,176 @@ static char *parse_tags(const tal_t *ctx, return NULL; } +static struct command_result *json_utxo_deposit(struct command *cmd, const char *buf, const jsmntok_t *params) +{ + const char *move_tag ="utxo_deposit"; + struct chain_event *ev = tal(cmd, struct chain_event); + struct account *acct; + const char *err; + + err = json_scan(tmpctx, buf, params, + "{payload:{utxo_deposit:{" + "account:%" + ",transfer_from:%" + ",outpoint:%" + ",amount_msat:%" + ",coin_type:%" + ",timestamp:%" + ",blockheight:%" + "}}}", + JSON_SCAN_TAL(tmpctx, json_strdup, &ev->acct_name), + JSON_SCAN_TAL(tmpctx, json_strdup, &ev->origin_acct), + JSON_SCAN(json_to_outpoint, &ev->outpoint), + JSON_SCAN(json_to_msat, &ev->credit), + JSON_SCAN_TAL(tmpctx, json_strdup, &ev->currency), + JSON_SCAN(json_to_u64, &ev->timestamp), + JSON_SCAN(json_to_u32, &ev->blockheight)); + + if (err) + plugin_err(cmd->plugin, + "`%s` payload did not scan %s: %.*s", + move_tag, err, json_tok_full_len(params), + json_tok_full(buf, params)); + + /* Log the thing */ + db_begin_transaction(db); + acct = find_account(tmpctx, db, ev->acct_name); + + if (!acct) { + acct = new_account(tmpctx, ev->acct_name, NULL); + account_add(db, acct); + } + + ev->tag = "deposit"; + ev->ignored = false; + ev->stealable = false; + ev->rebalance = false; + ev->splice_close = false; + ev->debit = AMOUNT_MSAT(0); + ev->output_value = ev->credit; + ev->spending_txid = NULL; + ev->payment_id = NULL; + ev->desc = NULL; + ev->splice_close = false; + + plugin_log(cmd->plugin, LOG_DBG, "%s (%s|%s) %s -%s %"PRIu64" %d %s", + move_tag, ev->tag, ev->acct_name, + fmt_amount_msat(tmpctx, ev->credit), + fmt_amount_msat(tmpctx, ev->debit), + ev->timestamp, ev->blockheight, + fmt_bitcoin_outpoint(tmpctx, &ev->outpoint)); + + if (!log_chain_event(db, acct, ev)) { + db_commit_transaction(db); + /* This is not a new event, do nothing */ + return notification_handled(cmd); + } + + /* Can we calculate any onchain fees now? */ + err = maybe_update_onchain_fees(cmd, db, &ev->outpoint.txid); + db_commit_transaction(db); + if (err) + plugin_err(cmd->plugin, + "Unable to update onchain fees %s", + err); + + /* FIXME: do account close checks, when allow onchain close to externals? */ + return notification_handled(cmd);; +} + +static struct command_result *json_utxo_spend(struct command *cmd, const char *buf, const jsmntok_t *params) +{ + const char *move_tag ="utxo_spend"; + struct account *acct; + struct chain_event *ev = tal(cmd, struct chain_event); + const char *err, *acct_name; + + ev->spending_txid = tal(ev, struct bitcoin_txid); + err = json_scan(tmpctx, buf, params, + "{payload:{utxo_spend:{" + "account:%" + ",outpoint:%" + ",spending_txid:%" + ",amount_msat:%" + ",coin_type:%" + ",timestamp:%" + ",blockheight:%" + "}}}", + JSON_SCAN_TAL(tmpctx, json_strdup, &acct_name), + JSON_SCAN(json_to_outpoint, &ev->outpoint), + JSON_SCAN(json_to_txid, ev->spending_txid), + JSON_SCAN(json_to_msat, &ev->debit), + JSON_SCAN_TAL(tmpctx, json_strdup, &ev->currency), + JSON_SCAN(json_to_u64, &ev->timestamp), + JSON_SCAN(json_to_u32, &ev->blockheight)); + + if (err) + plugin_err(cmd->plugin, + "`%s` payload did not scan %s: %.*s", + move_tag, err, json_tok_full_len(params), + json_tok_full(buf, params)); + + /* Log the thing */ + db_begin_transaction(db); + acct = find_account(tmpctx, db, acct_name); + + if (!acct) { + acct = new_account(tmpctx, acct_name, NULL); + account_add(db, acct); + } + + ev->origin_acct = NULL; + ev->tag = "withdrawal"; + ev->ignored = false; + ev->stealable = false; + ev->rebalance = false; + ev->splice_close = false; + ev->credit = AMOUNT_MSAT(0); + ev->output_value = ev->debit; + ev->payment_id = NULL; + ev->desc = NULL; + + plugin_log(cmd->plugin, LOG_DBG, "%s (%s|%s) %s -%s %"PRIu64" %d %s %s", + move_tag, ev->tag, acct_name, + fmt_amount_msat(tmpctx, ev->credit), + fmt_amount_msat(tmpctx, ev->debit), + ev->timestamp, ev->blockheight, + fmt_bitcoin_outpoint(tmpctx, &ev->outpoint), + fmt_bitcoin_txid(tmpctx, ev->spending_txid)); + + if (!log_chain_event(db, acct, ev)) { + db_commit_transaction(db); + /* This is not a new event, do nothing */ + return notification_handled(cmd); + } + + err = maybe_update_onchain_fees(cmd, db, ev->spending_txid); + if (err) { + db_commit_transaction(db); + plugin_err(cmd->plugin, + "Unable to update onchain fees %s", + err); + } + + err = maybe_update_onchain_fees(cmd, db, &ev->outpoint.txid); + if (err) { + db_commit_transaction(db); + plugin_err(cmd->plugin, + "Unable to update onchain fees %s", + err); + } + + /* Go see if there's any deposits to an external + * that are now confirmed */ + /* FIXME: might need updating when we can splice? */ + maybe_closeout_external_deposits(db, ev->spending_txid, + ev->blockheight); + db_commit_transaction(db); + + /* FIXME: do account close checks, when allow onchain close to externals? */ + return notification_handled(cmd);; +} + static struct command_result *json_coin_moved(struct command *cmd, const char *buf, const jsmntok_t *params) @@ -1746,54 +1920,40 @@ const struct plugin_notification notifs[] = { { "balance_snapshot", json_balance_snapshot, - } + }, + { + "utxo_deposit", + json_utxo_deposit, + }, + { + "utxo_spend", + json_utxo_spend, + }, }; static const struct plugin_command commands[] = { { "bkpr-listbalances", - "bookkeeping", - "List current account balances", - "List of current accounts and their balances", json_list_balances }, { "bkpr-listaccountevents", - "bookkeeping", - "List all events for an {account}", - "List all events for an {account} (or all accounts, if" - " no account specified) in {format}. Sorted by timestamp", json_list_account_events }, { "bkpr-inspect", - "utilities", - "See the current on-chain graph of an {account}", - "Prints out the on-chain footprint of a given {account}.", json_inspect }, { "bkpr-listincome", - "bookkeeping", - "List all income impacting events", - "List all events for this node that impacted income", json_list_income }, { "bkpr-dumpincomecsv", - "bookkeeping", - "Print out all the income events to a csv file in " - " {csv_format", - "Dump income statment data to {csv_file} in {csv_format}." - " Optionally, {consolidate_fee}s into single entries" - " (default: true)", json_dump_income }, { "bkpr-channelsapy", - "bookkeeping", - "Stats on channel fund usage", - "Print out stats on chanenl fund usage", json_channel_apy }, }; @@ -1831,7 +1991,7 @@ int main(int argc, char *argv[]) datadir = NULL; db_dsn = NULL; - plugin_main(argv, init, PLUGIN_STATIC, true, NULL, + plugin_main(argv, init, NULL, PLUGIN_STATIC, true, NULL, commands, ARRAY_SIZE(commands), notifs, ARRAY_SIZE(notifs), NULL, 0, diff --git a/plugins/bkpr/chain_event.h b/plugins/bkpr/chain_event.h index a9c5f3a6a71c..4d9785d02a26 100644 --- a/plugins/bkpr/chain_event.h +++ b/plugins/bkpr/chain_event.h @@ -34,6 +34,10 @@ struct chain_event { * we'll need to watch it for longer */ bool stealable; + /* Is this chain event because of a splice + * confirmation? */ + bool splice_close; + /* Is this a rebalance event? */ bool rebalance; diff --git a/plugins/bkpr/db.c b/plugins/bkpr/db.c index b8f3fc32ddb7..06943af912ec 100644 --- a/plugins/bkpr/db.c +++ b/plugins/bkpr/db.c @@ -99,6 +99,7 @@ static struct migration db_migrations[] = { {SQL("ALTER TABLE chain_events ADD ev_desc TEXT DEFAULT NULL;"), NULL}, {SQL("ALTER TABLE channel_events ADD ev_desc TEXT DEFAULT NULL;"), NULL}, {SQL("ALTER TABLE channel_events ADD rebalance_id BIGINT DEFAULT NULL;"), NULL}, + {SQL("ALTER TABLE chain_events ADD spliced INTEGER DEFAULT 0;"), NULL}, {NULL, migration_remove_dupe_lease_fees} }; diff --git a/plugins/bkpr/recorder.c b/plugins/bkpr/recorder.c index 00f388fd81cc..2f1ade4b6ade 100644 --- a/plugins/bkpr/recorder.c +++ b/plugins/bkpr/recorder.c @@ -62,6 +62,8 @@ static struct chain_event *stmt2chain_event(const tal_t *ctx, struct db_stmt *st else e->desc = NULL; + e->splice_close = db_col_int(stmt, "e.spliced") == 1; + return e; } @@ -162,6 +164,7 @@ struct chain_event **list_chain_events_timebox(const tal_t *ctx, ", e.ignored" ", e.stealable" ", e.ev_desc" + ", e.spliced" " FROM chain_events e" " LEFT OUTER JOIN accounts a" " ON e.account_id = a.id" @@ -204,6 +207,7 @@ struct chain_event **account_get_chain_events(const tal_t *ctx, ", e.ignored" ", e.stealable" ", e.ev_desc" + ", e.spliced" " FROM chain_events e" " LEFT OUTER JOIN accounts a" " ON e.account_id = a.id" @@ -239,6 +243,7 @@ static struct chain_event **find_txos_for_tx(const tal_t *ctx, ", e.ignored" ", e.stealable" ", e.ev_desc" + ", e.spliced" " FROM chain_events e" " LEFT OUTER JOIN accounts a" " ON e.account_id = a.id" @@ -548,7 +553,9 @@ struct account *find_close_account(const tal_t *ctx, " ON e.account_id = a.id" " WHERE " " e.tag = ?" - " AND e.spending_txid = ?")); + " AND e.spending_txid = ?" + /* ignore splicing 'close' events */ + " AND e.spliced = 0 ")); db_bind_text(stmt, mvt_tag_str(CHANNEL_CLOSE)); db_bind_txid(stmt, txid); @@ -678,6 +685,7 @@ struct chain_event *find_chain_event_by_id(const tal_t *ctx, ", e.ignored" ", e.stealable" ", e.ev_desc" + ", e.spliced" " FROM chain_events e" " LEFT OUTER JOIN accounts a" " ON e.account_id = a.id" @@ -726,6 +734,7 @@ static struct chain_event *find_chain_event(const tal_t *ctx, ", e.ignored" ", e.stealable" ", e.ev_desc" + ", e.spliced" " FROM chain_events e" " LEFT OUTER JOIN accounts a" " ON e.account_id = a.id" @@ -755,6 +764,7 @@ static struct chain_event *find_chain_event(const tal_t *ctx, ", e.ignored" ", e.stealable" ", e.ev_desc" + ", e.spliced" " FROM chain_events e" " LEFT OUTER JOIN accounts a" " ON e.account_id = a.id" @@ -1263,6 +1273,9 @@ void maybe_update_account(struct db *db, *acct->open_event_db_id = e->db_id; break; case CHANNEL_CLOSE: + /* Splices dont count as closes */ + if (e->splice_close) + break; updated = true; acct->closed_event_db_id = tal(acct, u64); *acct->closed_event_db_id = e->db_id; @@ -1294,6 +1307,7 @@ void maybe_update_account(struct db *db, case TO_MINER: case LEASE_FEE: case STEALABLE: + case SPLICE: /* Ignored */ break; } @@ -1304,7 +1318,7 @@ void maybe_update_account(struct db *db, acct->peer_id = tal_dup(acct, struct node_id, peer_id); } - if (closed_count > 0) { + if (!e->splice_close && closed_count > 0) { updated = true; acct->closed_count = closed_count; } @@ -1423,6 +1437,7 @@ static struct chain_event **find_chain_events_bytxid(const tal_t *ctx, struct db ", e.ignored" ", e.stealable" ", e.ev_desc" + ", e.spliced" " FROM chain_events e" " LEFT OUTER JOIN accounts a" " ON a.id = e.account_id" @@ -1935,11 +1950,12 @@ char *maybe_update_onchain_fees(const tal_t *ctx, struct db *db, } void maybe_closeout_external_deposits(struct db *db, - struct chain_event *ev) + const struct bitcoin_txid *txid, + u32 blockheight) { struct db_stmt *stmt; - assert(ev->spending_txid); + assert(txid); stmt = db_prepare_v2(db, SQL("SELECT " " e.id" " FROM chain_events e" @@ -1951,7 +1967,7 @@ void maybe_closeout_external_deposits(struct db *db, /* Blockheight for unconfirmeds is zero */ db_bind_int(stmt, 0); - db_bind_txid(stmt, ev->spending_txid); + db_bind_txid(stmt, txid); db_bind_text(stmt, EXTERNAL_ACCT); db_query_prepared(stmt); @@ -1964,7 +1980,7 @@ void maybe_closeout_external_deposits(struct db *db, " blockheight = ?" " WHERE id = ?")); - db_bind_int(update_stmt, ev->blockheight); + db_bind_int(update_stmt, blockheight); db_bind_u64(update_stmt, id); db_exec_prepared_v2(take(update_stmt)); } @@ -1979,7 +1995,7 @@ bool log_chain_event(struct db *db, struct db_stmt *stmt; /* We're responsible for de-duping chain events! */ - if (find_chain_event(e, db, acct, + if (find_chain_event(tmpctx, db, acct, &e->outpoint, e->spending_txid, e->tag)) return false; @@ -2002,9 +2018,10 @@ bool log_chain_event(struct db *db, ", ignored" ", stealable" ", ev_desc" + ", spliced" ")" " VALUES " - "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")); + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")); db_bind_u64(stmt, acct->db_id); if (e->origin_acct) @@ -2037,6 +2054,7 @@ bool log_chain_event(struct db *db, db_bind_text(stmt, e->desc); else db_bind_null(stmt); + db_bind_int(stmt, e->splice_close ? 1 : 0); db_exec_prepared_v2(stmt); e->db_id = db_last_insert_id_v2(stmt); e->acct_db_id = acct->db_id; diff --git a/plugins/bkpr/recorder.h b/plugins/bkpr/recorder.h index 1e3278281257..402e0dfa6952 100644 --- a/plugins/bkpr/recorder.h +++ b/plugins/bkpr/recorder.h @@ -208,7 +208,9 @@ void add_payment_hash_desc(struct db *db, * * This method updates the blockheight on these events to the * height an input was spent into */ -void maybe_closeout_external_deposits(struct db *db, struct chain_event *ev); +void maybe_closeout_external_deposits(struct db *db, + const struct bitcoin_txid *txid, + u32 blockheight); /* Keep track of rebalancing payments (payments paid to/from ourselves. * Returns true if was rebalance */ @@ -224,9 +226,10 @@ void log_channel_event(struct db *db, struct channel_event *e); /* Log a chain event. - * Returns true if inserted, false if already exists */ + * Returns true if inserted, false if already exists; + * ctx is for allocating objects onto chain_event `e` */ bool log_chain_event(struct db *db, - const struct account *acct, - struct chain_event *e); + const struct account *acct, + struct chain_event *e); #endif /* LIGHTNING_PLUGINS_BKPR_RECORDER_H */ diff --git a/plugins/bkpr/test/run-recorder.c b/plugins/bkpr/test/run-recorder.c index 5ebac38ab05e..8f805d413873 100644 --- a/plugins/bkpr/test/run-recorder.c +++ b/plugins/bkpr/test/run-recorder.c @@ -355,6 +355,8 @@ static bool chain_events_eq(struct chain_event *e1, struct chain_event *e2) if (e1->desc) CHECK(streq(e1->desc, e2->desc)); + CHECK(e1->splice_close == e2->splice_close); + return true; } @@ -406,6 +408,7 @@ static struct chain_event *make_chain_event(const tal_t *ctx, ev->blockheight = blockheight; ev->ignored = false; ev->stealable = false; + ev->splice_close = false; ev->desc = tal_fmt(ev, "hello hello"); memset(&ev->outpoint.txid, outpoint_char, sizeof(struct bitcoin_txid)); ev->outpoint.n = outnum; @@ -1084,6 +1087,7 @@ static bool test_chain_event_crud(const tal_t *ctx, struct plugin *p) ev1->blockheight = 1919191; ev1->ignored = false; ev1->stealable = false; + ev1->splice_close = false; memset(&ev1->outpoint.txid, 'D', sizeof(struct bitcoin_txid)); ev1->outpoint.n = 1; ev1->spending_txid = tal(ctx, struct bitcoin_txid); @@ -1105,6 +1109,7 @@ static bool test_chain_event_crud(const tal_t *ctx, struct plugin *p) ev2->blockheight = 1919191; ev2->ignored = false; ev2->stealable = false; + ev2->splice_close = false; memset(&ev2->outpoint.txid, 'D', sizeof(struct bitcoin_txid)); ev2->outpoint.n = 1; ev2->spending_txid = NULL; @@ -1124,6 +1129,7 @@ static bool test_chain_event_crud(const tal_t *ctx, struct plugin *p) ev3->blockheight = 3939393; ev3->ignored = false; ev3->stealable = false; + ev3->splice_close = false; memset(&ev3->outpoint.txid, 'E', sizeof(struct bitcoin_txid)); ev3->outpoint.n = 1; ev3->spending_txid = tal(ctx, struct bitcoin_txid); @@ -1351,6 +1357,7 @@ static bool test_account_crud(const tal_t *ctx, struct plugin *p) ev1->blockheight = 1919191; ev1->ignored = false; ev1->stealable = false; + ev1->splice_close = false; memset(&ev1->outpoint.txid, 'D', sizeof(struct bitcoin_txid)); ev1->outpoint.n = 1; ev1->spending_txid = tal(ctx, struct bitcoin_txid); diff --git a/plugins/chanbackup.c b/plugins/chanbackup.c index d7b2db10d73f..ca8365495294 100644 --- a/plugins/chanbackup.c +++ b/plugins/chanbackup.c @@ -815,18 +815,10 @@ static const struct plugin_hook hooks[] = { static const struct plugin_command commands[] = { { "emergencyrecover", - "recovery", - "Populates the DB with stub channels", - "returns stub channel-id's on completion", json_emergencyrecover, }, { "restorefrompeer", - "recovery", - "Checks if i have got a backup from a peer, and if so, will stub " - "those channels in the database and if is successful, will return " - "list of channels that have been successfully stubbed", - "return channel-id's on completion", json_restorefrompeer, }, }; @@ -835,7 +827,7 @@ int main(int argc, char *argv[]) { setup_locale(); - plugin_main(argv, init, PLUGIN_STATIC, true, NULL, + plugin_main(argv, init, NULL, PLUGIN_STATIC, true, NULL, commands, ARRAY_SIZE(commands), notifs, ARRAY_SIZE(notifs), hooks, ARRAY_SIZE(hooks), NULL, 0, /* Notification topics we publish */ diff --git a/plugins/clnrest/utilities/shared.py b/plugins/clnrest/utilities/shared.py index 90be694811a6..b45827de4f57 100644 --- a/plugins/clnrest/utilities/shared.py +++ b/plugins/clnrest/utilities/shared.py @@ -104,12 +104,8 @@ def verify_rune(plugin, rune, rpc_method, rpc_params): def process_help_response(help_response): # Use json5.loads due to single quotes in response processed_res = json5.loads(str(help_response))["help"] - line = "\n---------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n" - processed_html_res = "" + line = "\n\n---------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n" + processed_html_res = "\n" for row in processed_res: - processed_html_res += f"Command: {row['command']}\n" - processed_html_res += f"Category: {row['category']}\n" - processed_html_res += f"Description: {row['description']}\n" - processed_html_res += f"Verbose: {row['verbose']}\n" - processed_html_res += line + processed_html_res += row['command'] + line return processed_html_res diff --git a/plugins/commando.c b/plugins/commando.c index 37ef7965bf1f..aede4c35b634 100644 --- a/plugins/commando.c +++ b/plugins/commando.c @@ -801,33 +801,21 @@ static const char *init(struct plugin *p, static const struct plugin_command commands[] = { { "commando", - "utility", - "Send a commando message to a direct peer, wait for response", - "Sends {peer_id} {method} with optional {params} and {rune}", json_commando, }, { "commando-rune", - "utility", - "Create or restrict a rune", - "Takes an optional {rune} with optional {restrictions} and returns {rune}", json_commando_rune, "v23.08", "v25.02", }, { "commando-listrunes", - "utility", - "List runes we have created earlier", - "Takes an optional {rune} and returns list of {rune}", json_commando_listrunes, "v23.08", "v25.02", }, { "commando-blacklist", - "utility", - "Blacklist a rune or range of runes by unique id", - "Takes an optional {start} and an optional {end} and returns {blacklist} array containing {start}, {end}", json_commando_blacklist, "v23.08", "v25.02", @@ -837,7 +825,7 @@ static const struct plugin_command commands[] = { { int main(int argc, char *argv[]) { setup_locale(); - plugin_main(argv, init, PLUGIN_STATIC, true, NULL, + plugin_main(argv, init, NULL, PLUGIN_STATIC, true, NULL, commands, ARRAY_SIZE(commands), NULL, 0, hooks, ARRAY_SIZE(hooks), diff --git a/plugins/fetchinvoice.c b/plugins/fetchinvoice.c index c85a3feba984..fa15ec703faf 100644 --- a/plugins/fetchinvoice.c +++ b/plugins/fetchinvoice.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -41,6 +42,9 @@ struct sent { struct blinded_path **their_paths; /* Direct destination (used iff no their_paths) */ struct pubkey *direct_dest; + /* Key we expect to sign the invoice: the offer_issuer_id if + * present, otherwise the end blinded path we sent to. */ + struct pubkey *issuer_key; /* When creating blinded return path, use scid not pubkey for intro node. */ struct short_channel_id_dir *dev_path_use_scidd; @@ -136,23 +140,28 @@ static struct command_result *handle_error(struct command *cmd, /* BOLT-offers #12: * - if the invoice is a response to an `invoice_request`: - * - MUST reject the invoice if all fields less than type 160 do not - * exactly match the `invoice_request`. + * - MUST reject the invoice if all fields in ranges 0 to 159 and 1000000000 to 2999999999 (inclusive) do not exactly match the `invoice_request`. */ static bool invoice_matches_request(struct command *cmd, const u8 *invbin, const struct tlv_invoice_request *invreq) { - size_t len1, len2; + size_t ir_len1, ir_len2, ir_start1, ir_start2; + size_t inv_len1, inv_len2, inv_start1, inv_start2; u8 *wire; /* We linearize then strip signature. This is dumb! */ wire = tal_arr(tmpctx, u8, 0); towire_tlv_invoice_request(&wire, invreq); - len1 = tlv_span(wire, 0, 159, NULL); - - len2 = tlv_span(invbin, 0, 159, NULL); - return memeq(wire, len1, invbin, len2); + ir_len1 = tlv_span(wire, 0, 159, &ir_start1); + ir_len2 = tlv_span(wire, 1000000000, 2999999999, &ir_start2); + + inv_len1 = tlv_span(invbin, 0, 159, &inv_start1); + inv_len2 = tlv_span(invbin, 1000000000, 2999999999, &inv_start2); + return memeq(wire + ir_start1, ir_len1, + invbin + inv_start1, inv_len1) + && memeq(wire + ir_start2, ir_len2, + invbin + inv_start2, inv_len2); } static struct command_result *handle_invreq_response(struct command *cmd, @@ -202,8 +211,9 @@ static struct command_result *handle_invreq_response(struct command *cmd, /* BOLT-offers #12: * - if the invoice is a response to an `invoice_request`: - * - MUST reject the invoice if all fields less than type 160 do not - * exactly match the `invoice_request`. + * - MUST reject the invoice if all fields in ranges 0 to 159 and + * 1000000000 to 2999999999 (inclusive) do not exactly match the + * `invoice_request`. */ if (!invoice_matches_request(cmd, invbin, sent->invreq)) { badfield = "invoice_request match"; @@ -211,10 +221,37 @@ static struct command_result *handle_invreq_response(struct command *cmd, } /* BOLT-offers #12: - * - if `offer_node_id` is present (invoice_request for an offer): - * - MUST reject the invoice if `invoice_node_id` is not equal to `offer_node_id`. + * A reader of an invoice: + * - MUST reject the invoice if `invoice_amount` is not present. + * - MUST reject the invoice if `invoice_created_at` is not present. + * - MUST reject the invoice if `invoice_payment_hash` is not present. + * - MUST reject the invoice if `invoice_node_id` is not present. */ - if (!inv->invoice_node_id || !pubkey_eq(inv->offer_node_id, inv->invoice_node_id)) { + if (!inv->invoice_amount) { + badfield = "invoice_amount"; + goto badinv; + } + if (!inv->invoice_created_at) { + badfield = "invoice_amount"; + goto badinv; + } + if (!inv->invoice_payment_hash) { + badfield = "invoice_payment_hash"; + goto badinv; + } + if (!inv->invoice_node_id) { + badfield = "invoice_node_id"; + goto badinv; + } + /* BOLT-offers #12: + * - if `offer_issuer_id` is present (invoice_request for an offer): + * - MUST reject the invoice if `invoice_node_id` is not equal to `offer_issuer_id` + * - otherwise, if `offer_paths` is present (invoice_request for an offer without id): + * - MUST reject the invoice if `invoice_node_id` is not equal to the final + * `blinded_node_id` it sent the `invoice_request` to. + */ + /* Either way, we save the expected id in issuer_key */ + if (!pubkey_eq(inv->invoice_node_id, sent->issuer_key)) { badfield = "invoice_node_id"; goto badinv; } @@ -232,15 +269,6 @@ static struct command_result *handle_invreq_response(struct command *cmd, goto badinv; } - /* BOLT-offers #12: - * A reader of an invoice: - * - MUST reject the invoice if `invoice_amount` is not present. - */ - if (!inv->invoice_amount) { - badfield = "invoice_amount"; - goto badinv; - } - /* Get the amount we expected: firstly, if that's what we sent, * secondly, if specified in the invoice. */ if (inv->invreq_amount) { @@ -384,9 +412,6 @@ static struct command_result *sendonionmsg_done(struct command *cmd, tal_steal(cmd, plugin_timer(cmd->plugin, time_from_sec(sent->wait_timeout), timeout_sent_invreq, sent)); - sent->cmd = cmd; - list_add_tail(&sent_list, &sent->list); - tal_add_destructor(sent, destroy_sent); return command_still_pending(cmd); } @@ -473,7 +498,7 @@ struct establishing_paths { static const struct blinded_path *current_their_path(const struct establishing_paths *epaths) { - if (tal_count(epaths->sent->their_paths) == 0) + if (epaths->sent->direct_dest) return NULL; assert(epaths->which_blinded_path < tal_count(epaths->sent->their_paths)); return epaths->sent->their_paths[epaths->which_blinded_path]; @@ -500,6 +525,14 @@ static struct command_result *establish_path_done(struct command *cmd, sciddir_or_pubkey_from_scidd(&final_tlv->reply_path->first_node_id, sent->dev_path_use_scidd); + /* Put in list so we recognize reply onion message. Note: because + * onion message notification comes from a different fd than the one + * we send this command to, it can actually be processed *before* we + * call done() */ + sent->cmd = cmd; + list_add_tail(&sent_list, &sent->list); + tal_add_destructor(sent, destroy_sent); + omsg = outgoing_onion_message(tmpctx, path, NULL, current_their_path(epaths), final_tlv); return inject_onionmessage(cmd, omsg, epaths->done, forward_error, sent); } @@ -515,7 +548,7 @@ static struct command_result *establish_path_fail(struct command *cmd, const struct blinded_path *bpath = current_their_path(epaths); /* No blinded paths? We fail to establish connection directly */ - if (!bpath) { + if (epaths->sent->direct_dest) { return command_fail(cmd, OFFER_ROUTE_NOT_FOUND, "Failed: could not route or connect directly to %s: %s", fmt_pubkey(tmpctx, epaths->sent->direct_dest), why); @@ -539,15 +572,23 @@ static struct command_result *try_establish(struct command *cmd, struct establishing_paths *epaths) { struct pubkey target; - const struct blinded_path *bpath = current_their_path(epaths); - if (!bpath) { + if (epaths->sent->direct_dest) { target = *epaths->sent->direct_dest; } else { + const struct blinded_path *bpath = current_their_path(epaths); struct sciddir_or_pubkey first = bpath->first_node_id; if (!gossmap_scidd_pubkey(get_gossmap(cmd->plugin), &first)) return establish_path_fail(cmd, "Cannot resolve scidd", epaths); target = first.pubkey; + /* BOLT-offers #12: + * - if `offer_issuer_id` is present (invoice_request for an offer): + * - MUST reject the invoice if `invoice_node_id` is not equal to `offer_issuer_id` + * - otherwise, if `offer_paths` is present (invoice_request for an offer without id): + * - MUST reject the invoice if `invoice_node_id` is not equal to the final `blinded_node_id` it sent the `invoice_request` to. + */ + if (epaths->sent->offer && !epaths->sent->offer->offer_issuer_id) + epaths->sent->issuer_key = &bpath->path[tal_count(bpath->path)-1]->blinded_node_id; } return establish_onion_path(cmd, get_gossmap(cmd->plugin), &id, &target, @@ -748,6 +789,20 @@ static struct command_result *param_dev_reply_path(struct command *cmd, const ch return NULL; } +static bool payer_key(const u8 *public_tweak, size_t public_tweak_len, + struct pubkey *key) +{ + struct sha256 tweakhash; + + bolt12_alias_tweak(&nodealias_base, public_tweak, public_tweak_len, + &tweakhash); + + *key = id; + return secp256k1_ec_pubkey_tweak_add(secp256k1_ctx, + &key->pubkey, + tweakhash.u.u8) == 1; +} + /* Fetches an invoice for this offer, and makes sure it corresponds. */ struct command_result *json_fetchinvoice(struct command *cmd, const char *buffer, @@ -782,7 +837,12 @@ struct command_result *json_fetchinvoice(struct command *cmd, sent->wait_timeout = *timeout; sent->their_paths = sent->offer->offer_paths; - sent->direct_dest = sent->offer->offer_node_id; + if (sent->their_paths) + sent->direct_dest = NULL; + else + sent->direct_dest = sent->offer->offer_issuer_id; + /* This is NULL if offer_issuer_id is missing, and set by try_establish */ + sent->issuer_key = sent->offer->offer_issuer_id; /* BOLT-offers #12: * - SHOULD not respond to an offer if the current time is after @@ -855,6 +915,9 @@ struct command_result *json_fetchinvoice(struct command *cmd, * - if the offer contained `recurrence`: */ if (invreq->offer_recurrence) { + struct sha256 offer_id, tweak; + u8 *tweak_input; + /* BOLT-offers-recurrence #12: * - for the initial request: *... @@ -894,6 +957,29 @@ struct command_result *json_fetchinvoice(struct command *cmd, if (!rec_label) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "needs recurrence_label"); + + /* BOLT-offers #12: + * - MUST set `invreq_metadata` to an unpredictable series of + * bytes. + */ + /* Derive metadata (and thus temp key) from offer data and label + * as payer_id must be same for all recurring payments. */ + + /* Use "offer_id || label" as tweak input */ + invreq_offer_id(invreq, &offer_id); + tweak_input = tal_arr(tmpctx, u8, + sizeof(offer_id) + strlen(rec_label)); + memcpy(tweak_input, &offer_id, sizeof(offer_id)); + memcpy(tweak_input + sizeof(offer_id), + rec_label, + strlen(rec_label)); + + bolt12_alias_tweak(&nodealias_base, + tweak_input, + tal_bytelen(tweak_input), + &tweak); + invreq->invreq_metadata + = (u8 *)tal_dup(invreq, struct sha256, &tweak); } else { /* BOLT-offers-recurrence #12: * - otherwise: @@ -906,6 +992,24 @@ struct command_result *json_fetchinvoice(struct command *cmd, if (invreq->invreq_recurrence_start) return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "unnecessary recurrence_start"); + + /* BOLT-offers #12: + * - MUST set `invreq_metadata` to an unpredictable series of + * bytes. + */ + invreq->invreq_metadata = tal_arr(invreq, u8, 16); + randombytes_buf(invreq->invreq_metadata, + tal_bytelen(invreq->invreq_metadata)); + } + + /* We derive transient payer_id from invreq_metadata */ + invreq->invreq_payer_id = tal(invreq, struct pubkey); + if (!payer_key(invreq->invreq_metadata, + tal_bytelen(invreq->invreq_metadata), + invreq->invreq_payer_id)) { + /* Doesn't happen! */ + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Invalid tweak for payer_id"); } /* BOLT-offers #12: @@ -1026,11 +1130,14 @@ static struct command_result *createinvoice_done(struct command *cmd, /* BOLT-offers #12: * - if it sends an invoice in response: - * - MUST use `offer_paths` if present, otherwise MUST use + * - MUST use `invreq_paths` if present, otherwise MUST use * `invreq_payer_id` as the node id to send to. */ - sent->their_paths = sent->invreq->offer_paths; - sent->direct_dest = sent->invreq->invreq_payer_id; + sent->their_paths = sent->invreq->invreq_paths; + if (sent->their_paths) + sent->direct_dest = NULL; + else + sent->direct_dest = sent->invreq->invreq_payer_id; payload = tlv_onionmsg_tlv_new(sent); @@ -1064,7 +1171,6 @@ static struct command_result *param_invreq(struct command *cmd, { char *fail; int badf; - u8 *wire; struct sha256 merkle, sighash; /* BOLT-offers #12: @@ -1088,8 +1194,7 @@ static struct command_result *param_invreq(struct command *cmd, * The reader: * - MUST fail the request if `invreq_payer_id` or `invreq_metadata` * are not present. - * - MUST fail the request if any non-signature TLV fields greater or - * equal to 160. + * - MUST fail the request if any non-signature TLV fields are outside the inclusive ranges: 0 to 159 and 1000000000 to 2999999999 * - if `invreq_features` contains unknown _odd_ bits that are * non-zero: * - MUST ignore the bit. @@ -1105,10 +1210,9 @@ static struct command_result *param_invreq(struct command *cmd, return command_fail_badparam(cmd, name, buffer, tok, "Missing invreq_metadata"); - wire = tal_arr(tmpctx, u8, 0); - towire_tlv_invoice_request(&wire, *invreq); - if (tlv_span(wire, 160, 239, NULL) != 0 - || tlv_span(wire, 1001, UINT64_MAX, NULL) != 0) { + if (any_field_outside_range((*invreq)->fields, true, + 0, 159, + 1000000000, 2999999999)) { return command_fail_badparam(cmd, name, buffer, tok, "Invalid high-numbered fields"); } @@ -1141,13 +1245,13 @@ static struct command_result *param_invreq(struct command *cmd, /* Plugin handles these automatically, you shouldn't send one * manually. */ - if ((*invreq)->offer_node_id) { + if ((*invreq)->offer_issuer_id || (*invreq)->offer_paths) { return command_fail_badparam(cmd, name, buffer, tok, "This is based on an offer?"); } /* BOLT-offers #12: - * - otherwise (no `offer_node_id`, not a response to our offer): + * - otherwise (no `offer_issuer_id` or `offer_paths`, not a response to our offer): * - MUST fail the request if any of the following are present: * - `offer_chains`, `offer_features` or `offer_quantity_max`. * - MUST fail the request if `invreq_amount` is not present. @@ -1166,7 +1270,7 @@ static struct command_result *param_invreq(struct command *cmd, "Missing invreq_amount"); /* BOLT-offers #12: - * - otherwise (no `offer_node_id`, not a response to our offer): + * - otherwise (no `offer_issuer_id` or `offer_paths`, not a response to our offer): *... * - MAY use `offer_amount` (or `offer_currency`) for informational display to user. */ @@ -1256,8 +1360,10 @@ struct command_result *json_sendinvoice(struct command *cmd, &sent->inv_preimage, sizeof(sent->inv_preimage)); /* BOLT-offers #12: - * - if `offer_node_id` is present: - * - MUST set `invoice_node_id` to `offer_node_id`. + * - if `offer_issuer_id` is present: + * - MUST set `invoice_node_id` to the `offer_issuer_id` + * - otherwise, if `offer_paths` is present: + * - MUST set `invoice_node_id` to the final `blinded_node_id` on the path it received the `invoice_request` * - otherwise: * - MUST set `invoice_node_id` to a valid public key. */ @@ -1332,6 +1438,7 @@ struct command_result *json_dev_rawrequest(struct command *cmd, sent->dev_reply_path = NULL; sent->their_paths = NULL; sent->direct_dest = node_id; + sent->issuer_key = node_id; payload = tlv_onionmsg_tlv_new(sent); payload->invoice_request = tal_arr(payload, u8, 0); diff --git a/plugins/funder.c b/plugins/funder.c index 077b3aa9aa8b..66063b363f65 100644 --- a/plugins/funder.c +++ b/plugins/funder.c @@ -1432,11 +1432,6 @@ json_funderupdate(struct command *cmd, static const struct plugin_command commands[] = { { "funderupdate", - "liquidity", - "Configuration for dual-funding settings.", - "Update current settings. Modifies how node reacts to" - " incoming channel open requests. Responds with list" - " of current configs.", json_funderupdate }, }; @@ -1700,7 +1695,7 @@ int main(int argc, char **argv) /* Our default funding policy is fixed (0msat) */ current_policy = default_funder_policy(NULL, FIXED, 0); - plugin_main(argv, init, PLUGIN_RESTARTABLE, true, + plugin_main(argv, init, NULL, PLUGIN_RESTARTABLE, true, NULL, commands, ARRAY_SIZE(commands), notifs, ARRAY_SIZE(notifs), diff --git a/plugins/grpc-plugin/Cargo.toml b/plugins/grpc-plugin/Cargo.toml index 445f6dfff9de..32085e44c29a 100644 --- a/plugins/grpc-plugin/Cargo.toml +++ b/plugins/grpc-plugin/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" anyhow = "1.0" log = "0.4" prost = "0.11" -rcgen = { version = "0.10", features = ["pem", "x509-parser"] } +rcgen = { version = "0.13.1", features = ["pem", "x509-parser"] } cln-grpc = { version = "0.1", features = ["server"], path = "../../cln-grpc"} cln-plugin = { version = "0.1", path = "../../plugins" } cln-rpc = { version = "0.1", path = "../../cln-rpc" } diff --git a/plugins/grpc-plugin/src/main.rs b/plugins/grpc-plugin/src/main.rs index ecc74c90d633..3156b0ee7d15 100644 --- a/plugins/grpc-plugin/src/main.rs +++ b/plugins/grpc-plugin/src/main.rs @@ -14,20 +14,20 @@ struct PluginState { rpc_path: PathBuf, identity: tls::Identity, ca_cert: Vec, - events : broadcast::Sender, + events: broadcast::Sender, } -const OPTION_GRPC_PORT : options::DefaultIntegerConfigOption = options::ConfigOption::new_i64_with_default( +const OPTION_GRPC_PORT: options::DefaultIntegerConfigOption = options::ConfigOption::new_i64_with_default( "grpc-port", 9736, - "Which port should the grpc plugin listen for incoming connections?"); + "Which port should the grpc plugin listen for incoming connections?" +); const OPTION_GRPC_MSG_BUFFER_SIZE : options::DefaultIntegerConfigOption = options::ConfigOption::new_i64_with_default( "grpc-msg-buffer-size", 1024, "Number of notifications which can be stored in the grpc message buffer. Notifications can be skipped if this buffer is full"); - #[tokio::main(flavor = "current_thread")] async fn main() -> Result<()> { debug!("Starting grpc plugin"); @@ -54,15 +54,15 @@ async fn main() -> Result<()> { None => return Ok(()), }; - let bind_port : i64 = plugin.option(&OPTION_GRPC_PORT).unwrap(); - let buffer_size : i64 = plugin.option(&OPTION_GRPC_MSG_BUFFER_SIZE).unwrap(); + let bind_port: i64 = plugin.option(&OPTION_GRPC_PORT).unwrap(); + let buffer_size: i64 = plugin.option(&OPTION_GRPC_MSG_BUFFER_SIZE).unwrap(); let buffer_size = match usize::try_from(buffer_size) { Ok(b) => b, Err(_) => { plugin .disable("'grpc-msg-buffer-size' should be strictly positive") .await?; - return Ok(()) + return Ok(()); } }; @@ -74,7 +74,7 @@ async fn main() -> Result<()> { rpc_path: PathBuf::from(plugin.configuration().rpc_file.as_str()), identity, ca_cert, - events : sender + events: sender, }; let plugin = plugin.start(state.clone()).await?; @@ -83,9 +83,9 @@ async fn main() -> Result<()> { tokio::select! { _ = plugin.join() => { - // This will likely never be shown, if we got here our - // parent process is exiting and not processing out log - // messages anymore. + // This will likely never be shown, if we got here our + // parent process is exiting and not processing out log + // messages anymore. debug!("Plugin loop terminated") } e = run_interface(bind_addr, state) => { @@ -103,15 +103,13 @@ async fn run_interface(bind_addr: SocketAddr, state: PluginState) -> Result<()> .identity(identity) .client_ca_root(ca_cert); - let server = tonic::transport::Server::builder() .tls_config(tls) .context("configuring tls")? - .add_service( - NodeServer::new( - cln_grpc::Server::new(&state.rpc_path, state.events.clone()) - .await - .context("creating NodeServer instance")?, + .add_service(NodeServer::new( + cln_grpc::Server::new(&state.rpc_path, state.events.clone()) + .await + .context("creating NodeServer instance")?, )) .serve(bind_addr); @@ -125,16 +123,15 @@ async fn run_interface(bind_addr: SocketAddr, state: PluginState) -> Result<()> Ok(()) } -async fn handle_notification(plugin : Plugin, value : serde_json::Value) -> Result<()> { - let notification : Result = serde_json::from_value(value); +async fn handle_notification(plugin: Plugin, value: serde_json::Value) -> Result<()> { + let notification: Result = serde_json::from_value(value); match notification { Err(err) => { log::debug!("Failed to parse notification from lightningd {:?}", err); - }, + } Ok(notification) => { - match plugin.state().events.send(notification) { - Err(err) => log::warn!("Failed to broadcast notification {:?}", err), - Ok(_) => {}, + if let Err(err) = plugin.state().events.send(notification) { + log::warn!("Failed to broadcast notification {:?}", err) } } }; diff --git a/plugins/grpc-plugin/src/tls.rs b/plugins/grpc-plugin/src/tls.rs index 8bd19848178e..545c447b4b59 100644 --- a/plugins/grpc-plugin/src/tls.rs +++ b/plugins/grpc-plugin/src/tls.rs @@ -12,12 +12,16 @@ pub(crate) struct Identity { } impl Identity { - fn to_certificate(&self) -> Result { + fn to_key(&self) -> Result { let keystr = String::from_utf8_lossy(&self.key); let key = KeyPair::from_pem(&keystr)?; + Ok(key) + } + + fn to_certificate(&self) -> Result { let certstr = String::from_utf8_lossy(&self.certificate); - let params = rcgen::CertificateParams::from_ca_cert_pem(&certstr, key)?; - let cert = Certificate::from_params(params)?; + let params = rcgen::CertificateParams::from_ca_cert_pem(&certstr)?; + let cert = params.self_signed(&self.to_key()?)?; Ok(cert) } @@ -41,7 +45,7 @@ impl Identity { /// The `grpc-plugin` will use the `server.pem` certificate, while a /// client is supposed to use the `client.pem` and associated /// keys. Notice that this isn't strictly necessary since the server -/// will accept any client that is signed by the CA. In future we +/// will accept any client that is signed by the CA. In the future, we /// might add runes, making the distinction more important. /// /// Returns the server identity and the root CA certificate. @@ -71,16 +75,16 @@ fn generate_or_load_identity( "Generating a new keypair in {:?}, it didn't exist", &key_path ); - let keypair = KeyPair::generate(&rcgen::PKCS_ECDSA_P256_SHA256)?; + let keypair = KeyPair::generate_for(&rcgen::PKCS_ECDSA_P256_SHA256)?; - // Create the file, but make it user-readable only: + // Create the file but make it user-readable only: let mut file = std::fs::File::create(&key_path)?; let mut perms = std::fs::metadata(&key_path)?.permissions(); perms.set_mode(0o600); std::fs::set_permissions(&key_path, perms)?; - // Only after changing the permissions we can write the - // private key + // Only after changing the permissions we can write the + // private key file.write_all(keypair.serialize_pem().as_bytes())?; drop(file); @@ -91,27 +95,23 @@ fn generate_or_load_identity( // Configure the certificate we want. let subject_alt_names = vec!["cln".to_string(), "localhost".to_string()]; - let mut params = rcgen::CertificateParams::new(subject_alt_names); - params.key_pair = Some(keypair); - params.alg = &rcgen::PKCS_ECDSA_P256_SHA256; - if parent.is_none() { - params.is_ca = rcgen::IsCa::Ca(rcgen::BasicConstraints::Unconstrained); + let mut params = rcgen::CertificateParams::new(subject_alt_names)?; + params.is_ca = if parent.is_none() { + rcgen::IsCa::Ca(rcgen::BasicConstraints::Unconstrained) } else { - params.is_ca = rcgen::IsCa::NoCa; - } + rcgen::IsCa::NoCa + }; params .distinguished_name .push(rcgen::DnType::CommonName, name); - let cert = Certificate::from_params(params)?; - std::fs::write( - &cert_path, - match parent { - None => cert.serialize_pem()?, - Some(ca) => cert.serialize_pem_with_signer(&ca.to_certificate()?)?, - }, - ) - .context("writing certificate to file")?; + let cert = match parent { + None => params.self_signed(&keypair), + Some(parent) => { + params.signed_by(&keypair, &parent.to_certificate()?, &parent.to_key()?) + } + }?; + std::fs::write(&cert_path, cert.pem().as_bytes()).context("writing certificate to file")?; } let key = std::fs::read(&key_path)?; diff --git a/plugins/keysend.c b/plugins/keysend.c index ba3dee8628f3..99d46c1bb8ac 100644 --- a/plugins/keysend.c +++ b/plugins/keysend.c @@ -78,6 +78,7 @@ static void keysend_cb(struct keysend_data *d, struct payment *p) { p->result->failcode == WIRE_INVALID_ONION_PAYLOAD) { return payment_abort( p, + PAY_DESTINATION_PERM_FAIL, "Recipient %s reported an invalid payload, this " "usually means they don't support keysend.", fmt_node_id(tmpctx, p->route_destination)); @@ -307,10 +308,7 @@ static struct command_result *json_keysend(struct command *cmd, const char *buf, static const struct plugin_command commands[] = { { "keysend", - "payment", - "Send a payment without an invoice to a node", - "Send an unsolicited payment of {amount} to {destination}, by providing the recipient the necessary information to claim the payment", - json_keysend + json_keysend }, }; @@ -597,7 +595,7 @@ int main(int argc, char *argv[]) features->bits[i] = tal_arr(features, u8, 0); set_feature_bit(&features->bits[NODE_ANNOUNCE_FEATURE], KEYSEND_FEATUREBIT); - plugin_main(argv, init, PLUGIN_STATIC, true, features, commands, + plugin_main(argv, init, NULL, PLUGIN_STATIC, true, features, commands, ARRAY_SIZE(commands), NULL, 0, hooks, ARRAY_SIZE(hooks), notification_topics, ARRAY_SIZE(notification_topics), NULL); } diff --git a/plugins/libplugin-pay.c b/plugins/libplugin-pay.c index c7db43a50e97..9d1f7eda8bb8 100644 --- a/plugins/libplugin-pay.c +++ b/plugins/libplugin-pay.c @@ -97,6 +97,7 @@ struct payment *payment_new(tal_t *ctx, struct command *cmd, p->aborterror = NULL; p->on_payment_success = NULL; p->on_payment_failure = NULL; + p->errorcode = 0; /* Copy over the relevant pieces of information. */ if (parent != NULL) { @@ -187,7 +188,7 @@ paymod_log_header(struct payment *p, const char **type, u64 *id) } } -static void +void paymod_log(struct payment *p, enum log_level l, const char *fmt, ...) { const char *type; @@ -386,6 +387,58 @@ void payment_start(struct payment *p) payment_start_at_blockheight(p, INVALID_BLOCKHEIGHT); } +static void channel_hint_to_json(const char *name, const struct channel_hint *hint, struct json_stream *dest) +{ + json_object_start(dest, name); + json_add_u32(dest, "timestamp", hint->timestamp); + json_add_short_channel_id_dir(dest, "scid", hint->scid); + json_add_amount_msat(dest, "capacity_msat", hint->estimated_capacity); + json_add_bool(dest, "enabled", hint->enabled); + json_object_end(dest); +} + +/** + * Load a channel_hint from its JSON representation. + * + * @return The initialized `channel_hint` or `NULL` if we encountered a parsing + * error. + */ +/* +static struct channel_hint *channel_hint_from_json(const tal_t *ctx, + const char *buffer, + const jsmntok_t *toks) +{ + const char *ret; + struct channel_hint *hint = tal(ctx, struct channel_hint); + ret = json_scan(ctx, buffer, toks, + "{timestamp:%,scid:%,capacity_msat:%,enabled:%}", + JSON_SCAN(json_to_u32, &hint->timestamp), + JSON_SCAN(json_to_short_channel_id_dir, &hint->scid), + JSON_SCAN(json_to_msat, &hint->estimated_capacity), + JSON_SCAN(json_to_bool, &hint->enabled)); + + if (ret != NULL) + hint = tal_free(hint); + return hint; +} +*/ + /** + * Notify subscribers of the `channel_hint` topic about a changed hint + * + * We share the channel_hints across payments, and across plugins, in order + * to maximize the context they have when performing payments. + */ +static void channel_hint_notify(struct plugin *plugin, + const struct channel_hint *hint) +{ + struct json_stream *js = + plugin_notification_start(plugin, "channel_hint_update"); + + /* The timestamp used to decay the observation over time. */ + channel_hint_to_json("channel_hint", hint, js); + plugin_notification_end(plugin, js); +} + static void channel_hints_update(struct payment *p, const struct short_channel_id scid, int direction, bool enabled, bool local, @@ -394,6 +447,7 @@ static void channel_hints_update(struct payment *p, { struct payment *root = payment_root(p); struct channel_hint newhint; + u32 timestamp = time_now().ts.tv_sec; /* If the channel is marked as enabled it must have an estimate. */ assert(!enabled || estimated_capacity != NULL); @@ -423,7 +477,8 @@ static void channel_hints_update(struct payment *p, modified = true; } - if (modified) + if (modified) { + hint->timestamp = timestamp; paymod_log(p, LOG_DBG, "Updated a channel hint for %s: " "enabled %s, " @@ -433,12 +488,15 @@ static void channel_hints_update(struct payment *p, hint->enabled ? "true" : "false", fmt_amount_msat(tmpctx, hint->estimated_capacity)); + channel_hint_notify(p->plugin, hint); + } return; } } /* No hint found, create one. */ newhint.enabled = enabled; + newhint.timestamp = timestamp; newhint.scid.scid = scid; newhint.scid.dir = direction; if (local) { @@ -458,6 +516,7 @@ static void channel_hints_update(struct payment *p, fmt_short_channel_id_dir(tmpctx, &newhint.scid), newhint.enabled ? "true" : "false", fmt_amount_msat(tmpctx, newhint.estimated_capacity)); + channel_hint_notify(p->plugin, &newhint); } static void payment_exclude_most_expensive(struct payment *p) @@ -1001,16 +1060,105 @@ static struct command_result *payment_getroute(struct payment *p) return command_still_pending(p->cmd); } +/** + * Compute the total sum of balances. Limits the maximum size we can + * pay as a preflight test. Returns `false` on errors, otherwise + * `sum` contains the sum of all channel balances.*/ +static bool payment_listpeerchannels_balance_sum(struct payment *p, + const char *buf, + const jsmntok_t *toks, + struct amount_msat *sum) +{ + *sum = AMOUNT_MSAT(0); + const jsmntok_t *channels, *channel; + struct amount_msat spendable; + bool connected; + size_t i; + const char *err; + + channels = json_get_member(buf, toks, "channels"); + + json_for_each_arr(i, channel, channels) + { + err = json_scan(tmpctx, buf, channel, + "{spendable_msat?:%,peer_connected:%}", + JSON_SCAN(json_to_msat, &spendable), + JSON_SCAN(json_to_bool, &connected)); + if (err) { + paymod_log(p, LOG_UNUSUAL, + "Bad listpeerchannels.channels %zu: %s", i, + err); + return false; + } + + if (!amount_msat_add(sum, *sum, spendable)) { + paymod_log( + p, LOG_BROKEN, + "Integer sum overflow summing spendable amounts."); + return false; + } + } + return true; +} + static struct command_result * -payment_listpeerchannels_success(struct command *cmd, - const char *buffer, - const jsmntok_t *toks, - struct payment *p) +payment_listpeerchannels_success(struct command *cmd, const char *buffer, + const jsmntok_t *toks, struct payment *p) { - p->mods = gossmods_from_listpeerchannels(p, p->local_id, - buffer, toks, true, - gossmod_add_localchan, - NULL); + /* The maximum amount we may end up trying to send. This + * includes the value and the full fee budget. If the + * available funds are below this, we emit a warning. */ + struct amount_msat maxrequired, spendable; + + if (!amount_msat_add(&maxrequired, p->getroute->amount, + p->constraints.fee_budget)) { + paymod_log(p, LOG_BROKEN, + "amount_msat overflow computing the fee budget"); + return payment_getroute(p); + } + + p->mods = gossmods_from_listpeerchannels( + p, p->local_id, buffer, toks, true, gossmod_add_localchan, NULL); + if (!payment_listpeerchannels_balance_sum(p, buffer, toks, + &spendable)) { + paymod_log(p, LOG_UNUSUAL, + "Unable to get total spendable amount from " + "listpeerchannels. Skipping affordability check."); + + /* Keep your fingers crossed, we may still succeed. */ + return payment_getroute(p); + } + + /* Pre-flight check: can we even afford the full amount of the + * payment? And if yes, can we afford the full amount with the + * full fee budget? If the former fails, we fail immediately, + * for the latter we log a warning, so we can root-cause this + * a bit better if we then run into routing issues. */ + if (amount_msat_greater(p->getroute->amount, spendable)) { + paymod_log(p, LOG_UNUSUAL, + "Insufficient funds to perform the payment: " + "spendable=%s < payment=%s", + fmt_amount_msat(tmpctx, spendable), + fmt_amount_msat(tmpctx, p->getroute->amount)); + payment_abort(p, PAY_INSUFFICIENT_FUNDS, + "Insufficient funds to perform the payment: " + "spendable=%s < payment=%s", + fmt_amount_msat(tmpctx, spendable), + fmt_amount_msat(tmpctx, p->getroute->amount)); + return command_still_pending(p->cmd); + } else if (amount_msat_greater(maxrequired, spendable)) { + char *msg = tal_fmt( + tmpctx, + "We do not have sufficient funds to pay for the specified " + "fee budget: spendable=%s < payment=%s + budget=%s. This " + "may cause a failed payment, but we'll try anyway.", + fmt_amount_msat(tmpctx, spendable), + fmt_amount_msat(tmpctx, p->getroute->amount), + fmt_amount_msat(tmpctx, p->constraints.fee_budget)); + + plugin_notify_message(p->cmd, LOG_INFORM, "%s", msg); + } + return payment_getroute(p); } @@ -2158,7 +2306,7 @@ static void payment_finished(struct payment *p) } else if (p->aborterror != NULL) { /* We set an explicit toplevel error message, * so let's report that. */ - ret = jsonrpc_stream_fail(cmd, PAY_STOPPED_RETRYING, + ret = jsonrpc_stream_fail(cmd, p->errorcode, p->aborterror); payment_json_add_attempts(ret, "attempts", p); @@ -2198,8 +2346,9 @@ static void payment_finished(struct payment *p) json_add_u64(ret, "id", failure->id); json_add_u32(ret, "failcode", failure->failcode); - json_add_string(ret, "failcodename", - failure->failcodename); + if (failure->failcodename) + json_add_string(ret, "failcodename", + failure->failcodename); if (p->invstring) json_add_invstring(ret, p->invstring); @@ -2318,7 +2467,7 @@ void payment_continue(struct payment *p) abort(); } -void payment_abort(struct payment *p, const char *fmt, ...) { +void payment_abort(struct payment *p, enum jsonrpc_errcode code, const char *fmt, ...) { va_list ap; struct payment *root = payment_root(p); payment_set_step(p, PAYMENT_STEP_FAILED); @@ -2608,6 +2757,8 @@ static struct route_info **filter_routehints(struct gossmap *map, char *mods = tal_strdup(tmpctx, ""); struct gossmap_node *src = gossmap_find_node(map, p->local_id); + paymod_log(p, LOG_INFORM, "Filtering out %zu routehints", tal_count(hints)); + if (src == NULL) { tal_append_fmt(&mods, "Could not locate ourselves in the gossip map, " @@ -2654,12 +2805,10 @@ static struct route_info **filter_routehints(struct gossmap *map, i, fmt_node_id(tmpctx, &hints[i][0].pubkey)); - plugin_log(p->plugin, LOG_DBG, + paymod_log(p, LOG_DBG, "Removed routehint %zu because " "entrypoint %s is unknown. ", - i, - fmt_node_id(tmpctx, - &hints[i][0].pubkey)); + i, fmt_node_id(tmpctx, &hints[i][0].pubkey)); tal_arr_remove(&hints, i); i--; continue; @@ -2678,12 +2827,10 @@ static struct route_info **filter_routehints(struct gossmap *map, i, fmt_node_id(tmpctx, &hints[i][0].pubkey)); - plugin_log(p->plugin, LOG_DBG, - "Removed routehint %zu because " - "entrypoint %s is unreachable. ", - i, - fmt_node_id(tmpctx, - &hints[i][0].pubkey)); + paymod_log(p, LOG_DBG, + "Removed routehint %zu because " + "entrypoint %s is unreachable. ", + i, fmt_node_id(tmpctx, &hints[i][0].pubkey)); tal_arr_remove(&hints, i); i--; } @@ -2945,6 +3092,7 @@ static void routehint_check_reachable(struct payment *p) payment_abort( p, + PAY_UNREACHABLE, "Destination %s is not reachable directly and " "all routehints were unusable.", fmt_node_id(tmpctx, p->route_destination)); @@ -3812,10 +3960,10 @@ static void route_exclusions_step_cb(struct route_exclusions_data *d, false, false, NULL, NULL); } else { if (node_id_eq(&e->u.node_id, p->route_destination)) { - payment_abort(p, "Payee is manually excluded"); + payment_abort(p, PAY_USER_ERROR, "Payee is manually excluded"); return; } else if (node_id_eq(&e->u.node_id, p->local_id)) { - payment_abort(p, "Payer is manually excluded"); + payment_abort(p, PAY_USER_ERROR, "Payer is manually excluded"); return; } diff --git a/plugins/libplugin-pay.h b/plugins/libplugin-pay.h index c2f91839906e..283c312fa5fe 100644 --- a/plugins/libplugin-pay.h +++ b/plugins/libplugin-pay.h @@ -68,6 +68,13 @@ struct local_hint { * get remove on failure. Success keeps the capacities, since the capacities * changed due to the successful HTLCs. */ struct channel_hint { + /* The timestamp this observation was made. Used to let the + * constraint expressed by this hint decay over time, until it + * is fully relaxed, at which point we can forget about it + * (the structural information is the best we can do in that + * case). + */ + u32 timestamp; /* The short_channel_id we're going to use when referring to * this channel. This can either be the real scid, or the * local alias. The `pay` algorithm doesn't really care which @@ -327,6 +334,10 @@ struct payment { /* A human readable error message that is used as a top-level * explanation if a payment is aborted. */ char *aborterror; + /* A numeric error code to return to JSON-RPC callers. Allows + * programmatically differentiate various errors, without + * having to parse the `p->aborterror` string. */ + u32 errorcode; /* How many blocks are we lagging behind the rest of the network? This needs to be taken into consideration when @@ -489,7 +500,7 @@ void payment_fail(struct payment *p, const char *fmt, ...) PRINTF_FMT(2,3); * they can, and sets the root failreason so we have a sensible error * message. The failreason is overwritten if it is already set, since * we probably know better what happened in the modifier.. */ -void payment_abort(struct payment *p, const char *fmt, ...) PRINTF_FMT(2,3); +void payment_abort(struct payment *p, enum jsonrpc_errcode code, const char *fmt, ...) PRINTF_FMT(3,4); struct payment *payment_root(struct payment *p); struct payment_tree_result payment_collect_result(struct payment *p); @@ -506,4 +517,7 @@ void json_add_payment_success(struct json_stream *js, /* Overriding io_poll for extra checks. */ int libplugin_pay_poll(struct pollfd *fds, nfds_t nfds, int timeout); +void +paymod_log(struct payment *p, enum log_level l, const char *fmt, ...); + #endif /* LIGHTNING_PLUGINS_LIBPLUGIN_PAY_H */ diff --git a/plugins/libplugin.c b/plugins/libplugin.c index 4f83dfc2d85c..3ba3b85ab688 100644 --- a/plugins/libplugin.c +++ b/plugins/libplugin.c @@ -79,6 +79,9 @@ struct plugin { /* to append to all our command ids */ const char *id; + /* Data for the plugin user */ + void *data; + /* options to i-promise-to-fix-broken-api-user */ const char **beglist; @@ -1088,10 +1091,6 @@ handle_getmanifest(struct command *getmanifest_cmd, json_add_string(params, "name", p->commands[i].name); json_add_string(params, "usage", strmap_get(&p->usagemap, p->commands[i].name)); - json_add_string(params, "description", p->commands[i].description); - if (p->commands[i].long_description) - json_add_string(params, "long_description", - p->commands[i].long_description); json_add_deprecated(params, "deprecated", p->commands[i].depr_start, p->commands[i].depr_end); json_object_end(params); @@ -2183,6 +2182,7 @@ static struct plugin *new_plugin(const tal_t *ctx, void plugin_main(char *argv[], const char *(*init)(struct plugin *p, const char *buf, const jsmntok_t *), + void *data, const enum plugin_restartability restartability, bool init_rpc, struct feature_set *features STEALS, @@ -2212,6 +2212,7 @@ void plugin_main(char *argv[], init, restartability, init_rpc, features, commands, num_commands, notif_subs, num_notif_subs, hook_subs, num_hook_subs, notif_topics, num_notif_topics, ap); + plugin_set_data(plugin, data); va_end(ap); setup_command_usage(plugin); @@ -2418,3 +2419,15 @@ bool plugin_developer_mode(const struct plugin *plugin) { return plugin->developer; } + +void plugin_set_data(struct plugin *plugin, void *data TAKES) +{ + if (taken(data)) + tal_steal(plugin, data); + plugin->data = data; +} + +void *plugin_get_data_(struct plugin *plugin) +{ + return plugin->data; +} diff --git a/plugins/libplugin.h b/plugins/libplugin.h index 9b2a5c748a62..6a3be12c0394 100644 --- a/plugins/libplugin.h +++ b/plugins/libplugin.h @@ -62,9 +62,6 @@ struct command { /* Create an array of these, one for each command you support. */ struct plugin_command { const char *name; - const char *category; - const char *description; - const char *long_description; struct command_result *(*handle)(struct command *cmd, const char *buf, const jsmntok_t *params); @@ -443,6 +440,11 @@ static inline void *plugin_option_jsonfmt_check(bool (*jsonfmt)(struct plugin *, /* Is --developer enabled? */ bool plugin_developer_mode(const struct plugin *plugin); +/* Store a single pointer for our state in the plugin */ +void plugin_set_data(struct plugin *plugin, void *data TAKES); +void *plugin_get_data_(struct plugin *plugin); +#define plugin_get_data(plugin, type) ((type *)(plugin_get_data_(plugin))) + /* Macro to define arguments */ #define plugin_option_(name, type, description, set, jsonfmt, arg, dev_only, depr_start, depr_end, dynamic) \ (name), \ @@ -507,6 +509,7 @@ void NORETURN LAST_ARG_NULL plugin_main(char *argv[], const char *(*init)(struct plugin *p, const char *buf, const jsmntok_t *), + void *data TAKES, const enum plugin_restartability restartability, bool init_rpc, struct feature_set *features STEALS, diff --git a/plugins/offers.c b/plugins/offers.c index f1a36f3c36da..ef75d6c46218 100644 --- a/plugins/offers.c +++ b/plugins/offers.c @@ -9,9 +9,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -39,6 +39,7 @@ bool dev_invoice_bpath_scid; struct short_channel_id *dev_invoice_internal_scid; struct secret invoicesecret_base; struct secret offerblinding_base; +struct secret nodealias_base; static struct gossmap *global_gossmap; static void init_gossmap(struct plugin *plugin) @@ -564,6 +565,19 @@ static bool json_add_blinded_paths(struct json_stream *js, return false; } + /* BOLT-offers #12: + * - if `num_hops` is 0 in any `blinded_path` in `offer_paths`: + * - MUST NOT respond to the offer. + */ + for (size_t i = 0; i < tal_count(paths); i++) { + if (tal_count(paths[i]->path) == 0) { + json_add_str_fmt(js, "warning_empty_blinded_path", + "blinded path %zu has 0 hops", + i); + return false; + } + } + return true; } @@ -609,7 +623,7 @@ static bool json_add_offer_fields(struct json_stream *js, struct blinded_path **offer_paths, const char *offer_issuer, const u64 *offer_quantity_max, - const struct pubkey *offer_node_id, + const struct pubkey *offer_issuer_id, const struct recurrence *offer_recurrence, const struct recurrence_paywindow *offer_recurrence_paywindow, const u32 *offer_recurrence_limit, @@ -638,7 +652,7 @@ static bool json_add_offer_fields(struct json_stream *js, amount_msat(*offer_amount)); /* BOLT-offers #12: * - * - if offer_amount is set and offer_description is not set: + * - if `offer_amount` is set and `offer_description` is not set: * - MUST NOT respond to the offer. */ if (offer_description) @@ -646,7 +660,7 @@ static bool json_add_offer_fields(struct json_stream *js, offer_description); else if (!offer_description && offer_amount) { json_add_string(js, "warning_missing_offer_description", - "description is required for the user to know what it was they paid for"); + "description is required if offer_amount is set (for the user to know what it was they paid for)"); valid = false; } @@ -693,9 +707,8 @@ static bool json_add_offer_fields(struct json_stream *js, json_object_end(js); } - /* Required for offers, *not* for others! */ - if (offer_node_id) - json_add_pubkey(js, "offer_node_id", offer_node_id); + if (offer_issuer_id) + json_add_pubkey(js, "offer_issuer_id", offer_issuer_id); return valid; } @@ -718,6 +731,7 @@ static void json_add_extra_fields(struct json_stream *js, json_add_u64(js, "length", fields[i].length); json_add_hex(js, "value", fields[i].value, fields[i].length); + json_object_end(js); } if (have_extra) json_array_end(js); @@ -742,18 +756,18 @@ static void json_add_offer(struct json_stream *js, const struct tlv_offer *offer offer->offer_paths, offer->offer_issuer, offer->offer_quantity_max, - offer->offer_node_id, + offer->offer_issuer_id, offer->offer_recurrence, offer->offer_recurrence_paywindow, offer->offer_recurrence_limit, offer->offer_recurrence_base); /* BOLT-offers #12: - * - if `offer_node_id` is not set: + * - if neither `offer_issuer_id` nor `offer_paths` are set: * - MUST NOT respond to the offer. */ - if (!offer->offer_node_id) { - json_add_string(js, "warning_missing_offer_node_id", - "offers without a node_id are invalid"); + if (!offer->offer_issuer_id && !offer->offer_paths) { + json_add_string(js, "warning_missing_offer_issuer_id", + "offers without an issuer_id or paths are invalid"); valid = false; } json_add_extra_fields(js, "unknown_offer_tlvs", offer->fields); @@ -768,6 +782,7 @@ static bool json_add_invreq_fields(struct json_stream *js, const u64 *invreq_quantity, const struct pubkey *invreq_payer_id, const utf8 *invreq_payer_note, + struct blinded_path **invreq_paths, const u32 *invreq_recurrence_counter, const u32 *invreq_recurrence_start) { @@ -801,6 +816,9 @@ static bool json_add_invreq_fields(struct json_stream *js, json_add_u64(js, "invreq_quantity", *invreq_quantity); if (invreq_payer_note) valid &= json_add_utf8(js, "invreq_payer_note", invreq_payer_note); + if (invreq_paths) + valid &= json_add_blinded_paths(js, "invreq_paths", + invreq_paths, NULL); if (invreq_recurrence_counter) { json_add_u32(js, "invreq_recurrence_counter", *invreq_recurrence_counter); @@ -889,8 +907,8 @@ static void json_add_invoice_request(struct json_stream *js, { bool valid = true; - /* If there's an offer_node_id, then there's an offer. */ - if (invreq->offer_node_id) { + /* If there's an offer_issuer_id or offer_paths, then there's an offer. */ + if (invreq->offer_issuer_id || invreq->offer_paths) { struct sha256 offer_id; invreq_offer_id(invreq, &offer_id); @@ -908,7 +926,7 @@ static void json_add_invoice_request(struct json_stream *js, invreq->offer_paths, invreq->offer_issuer, invreq->offer_quantity_max, - invreq->offer_node_id, + invreq->offer_issuer_id, invreq->offer_recurrence, invreq->offer_recurrence_paywindow, invreq->offer_recurrence_limit, @@ -921,6 +939,7 @@ static void json_add_invoice_request(struct json_stream *js, invreq->invreq_quantity, invreq->invreq_payer_id, invreq->invreq_payer_note, + invreq->invreq_paths, invreq->invreq_recurrence_counter, invreq->invreq_recurrence_start); @@ -966,8 +985,8 @@ static void json_add_b12_invoice(struct json_stream *js, { bool valid = true; - /* If there's an offer_node_id, then there's an offer. */ - if (invoice->offer_node_id) { + /* If there's an offer_issuer_id or offer_paths, then there's an offer. */ + if (invoice->offer_issuer_id || invoice->offer_paths) { struct sha256 offer_id; invoice_offer_id(invoice, &offer_id); @@ -985,7 +1004,7 @@ static void json_add_b12_invoice(struct json_stream *js, invoice->offer_paths, invoice->offer_issuer, invoice->offer_quantity_max, - invoice->offer_node_id, + invoice->offer_issuer_id, invoice->offer_recurrence, invoice->offer_recurrence_paywindow, invoice->offer_recurrence_limit, @@ -998,12 +1017,14 @@ static void json_add_b12_invoice(struct json_stream *js, invoice->invreq_quantity, invoice->invreq_payer_id, invoice->invreq_payer_note, + invoice->invreq_paths, invoice->invreq_recurrence_counter, invoice->invreq_recurrence_start); /* BOLT-offers #12: * - MUST reject the invoice if `invoice_paths` is not present * or is empty. + * - MUST reject the invoice if `num_hops` is 0 in any `blinded_path` in `invoice_paths`. * - MUST reject the invoice if `invoice_blindedpay` is not present. * - MUST reject the invoice if `invoice_blindedpay` does not contain * exactly one `blinded_payinfo` per `invoice_paths`.`blinded_path`. @@ -1380,7 +1401,7 @@ static const char *init(struct plugin *p, JSON_SCAN(json_to_bool, &offers_enabled)); rpc_scan(p, "makesecret", - take(json_out_obj(NULL, "string", INVOICE_PATH_BASE_STRING)), + take(json_out_obj(NULL, "string", BOLT12_ID_BASE_STRING)), "{secret:%}", JSON_SCAN(json_to_secret, &invoicesecret_base)); @@ -1389,50 +1410,37 @@ static const char *init(struct plugin *p, "{secret:%}", JSON_SCAN(json_to_secret, &offerblinding_base)); + rpc_scan(p, "makesecret", + take(json_out_obj(NULL, "string", NODE_ALIAS_BASE_STRING)), + "{secret:%}", + JSON_SCAN(json_to_secret, &nodealias_base)); + return NULL; } static const struct plugin_command commands[] = { { "offer", - "payment", - "Create an offer to accept money", - "Create an offer for invoices of {amount} with {description}, optional {issuer}, internal {label}, {quantity_min}, {quantity_max}, {absolute_expiry}, {recurrence}, {recurrence_base}, {recurrence_paywindow}, {recurrence_limit} and {single_use}", - json_offer + json_offer }, { "invoicerequest", - "payment", - "Create an invoice_request to send money", - "Create an invoice_request to pay invoices of {amount} with {description}, optional {issuer}, internal {label}, and {absolute_expiry}", - json_invoicerequest + json_invoicerequest }, { "decode", - "utility", - "Decode {string} message, returning {type} and information.", - NULL, json_decode, }, { "fetchinvoice", - "payment", - "Request remote node for an invoice for this {offer}, with {amount}, {quanitity}, {recurrence_counter}, {recurrence_start} and {recurrence_label} iff required.", - NULL, json_fetchinvoice, }, { "sendinvoice", - "payment", - "Request remote node for to pay this {invreq}, with {label}, optional {amount_msat}, and {timeout} (default 90 seconds).", - NULL, json_sendinvoice, }, { "dev-rawrequest", - "util", - "Send {invreq} to {nodeid}, wait {timeout} (60 seconds by default)", - NULL, json_dev_rawrequest, .dev_only = true, }, @@ -1465,7 +1473,7 @@ int main(int argc, char *argv[]) /* We deal in UTC; mktime() uses local time */ setenv("TZ", "", 1); - plugin_main(argv, init, PLUGIN_RESTARTABLE, true, NULL, + plugin_main(argv, init, NULL, PLUGIN_RESTARTABLE, true, NULL, commands, ARRAY_SIZE(commands), notifications, ARRAY_SIZE(notifications), hooks, ARRAY_SIZE(hooks), diff --git a/plugins/offers.h b/plugins/offers.h index 7f7825c542fe..038be35a837f 100644 --- a/plugins/offers.h +++ b/plugins/offers.h @@ -21,6 +21,8 @@ extern u32 blockheight; extern struct secret invoicesecret_base; /* Base for offers path_secrets */ extern struct secret offerblinding_base; +/* Base for node aliases for invoice requests */ +extern struct secret nodealias_base; /* --dev-invoice-bpath-scid */ extern bool dev_invoice_bpath_scid; /* --dev-invoice-internal-scid */ diff --git a/plugins/offers_inv_hook.c b/plugins/offers_inv_hook.c index 09aab00fa8e6..42f9295ca787 100644 --- a/plugins/offers_inv_hook.c +++ b/plugins/offers_inv_hook.c @@ -1,6 +1,7 @@ #include "config.h" #include #include +#include #include #include #include @@ -133,16 +134,16 @@ static struct command_result *listinvreqs_done(struct command *cmd, * A reader of an invoice: *... * - if the invoice is a response to an `invoice_request`: - * - MUST reject the invoice if all fields less than type 160 do not exactly match the `invoice_request`. - * - if `offer_node_id` is present (invoice_request for an offer): - * - MUST reject the invoice if `invoice_node_id` is not equal to `offer_node_id`. + * - MUST reject the invoice if all fields in ranges 0 to 159 and 1000000000 to 2999999999 (inclusive) do not exactly match the `invoice_request`. + * - if `offer_issuer_id` is present (invoice_request for an offer): + * - MUST reject the invoice if `invoice_node_id` is not equal to `offer_issuer_id` + * - otherwise, if `offer_paths` is present (invoice_request for an offer without id): + * - MUST reject the invoice if `invoice_node_id` is not equal to the final `blinded_node_id` it sent the `invoice_request` to. * - otherwise (invoice_request without an offer): * - MAY reject the invoice if it cannot confirm that `invoice_node_id` is correct, out-of-band. - * - * - otherwise: (a invoice presented without being requested, eg. scanned by user): */ - /* Since the invreq_id hashes all fields < 160, we know it matches */ + /* Since the invreq_id hashes all fields in those ranges, we know it matches */ if (arr->size == 0) return fail_inv(cmd, inv, "Unknown invoice_request %s", fmt_sha256(tmpctx, &inv->invreq_id)); @@ -159,7 +160,7 @@ static struct command_result *listinvreqs_done(struct command *cmd, return fail_inv(cmd, inv, "invoice_request no longer available"); /* We only save ones without offers to the db! */ - assert(!inv->inv->offer_node_id); + assert(!inv->inv->offer_issuer_id && !inv->inv->offer_paths); /* BOLT-offers #12: * - MUST reject the invoice if `signature` is not a valid signature @@ -226,18 +227,42 @@ struct command_result *handle_invoice(struct command *cmd, "Invalid invoice %s", tal_hex(tmpctx, invbin)); } - invoice_invreq_id(inv->inv, &inv->invreq_id); - /* We never publish invoice_requests with a reply path, so replies via - * a path are invalid */ if (secret) { - if (command_dev_apis(cmd)) - return fail_inv(cmd, inv, "Unexpected blinded path"); - /* Normally, "I don't know what you're talking about!" */ - return fail_inv(cmd, inv, "Unknown invoice_request %s", - fmt_sha256(tmpctx, &inv->invreq_id)); + const u8 *path_secret; + struct blinded_path **invreq_paths = inv->inv->invreq_paths; + struct sha256 invreq_id_nopath; + + /* Necessarily, path_id is taken without the invreq_paths. */ + inv->inv->invreq_paths = NULL; + invoice_invreq_id(inv->inv, &invreq_id_nopath); + inv->inv->invreq_paths = invreq_paths; + + path_secret = bolt12_path_id(tmpctx, &offerblinding_base, &invreq_id_nopath); + if (!memeq(path_secret, tal_count(path_secret), + secret, sizeof(*secret))) { + if (command_dev_apis(cmd)) + return fail_inv(cmd, inv, "Wrong blinded path (invreq_id_nopath = %s, path_secret = %s, secret = %s)", + fmt_sha256(tmpctx, &invreq_id_nopath), + tal_hex(tmpctx, path_secret), + fmt_secret(tmpctx, secret)); + /* Normally, "I don't know what you're talking about!" */ + return fail_inv(cmd, inv, "Unknown invoice_request %s", + fmt_sha256(tmpctx, &inv->invreq_id)); + } + } else { + /* Didn't use path. Was it supposed to? */ + if (inv->inv->invreq_paths) { + if (command_dev_apis(cmd)) + return fail_inv(cmd, inv, "Expected to use invreq_path!"); + /* Normally, "I don't know what you're talking about!" */ + return fail_inv(cmd, inv, "Unknown invoice_request %s", + fmt_sha256(tmpctx, &inv->invreq_id)); + } } + invoice_invreq_id(inv->inv, &inv->invreq_id); + /* BOLT-offers #12: * A reader of an invoice: * - MUST reject the invoice if `invoice_amount` is not present. @@ -290,11 +315,16 @@ struct command_result *handle_invoice(struct command *cmd, * A reader of an invoice: *... * - MUST reject the invoice if `invoice_paths` is not present or is empty. + * - MUST reject the invoice if `num_hops` is 0 in any `blinded_path` in `invoice_paths`. * - MUST reject the invoice if `invoice_blindedpay` is not present. * - MUST reject the invoice if `invoice_blindedpay` does not contain exactly one `blinded_payinfo` per `invoice_paths`.`blinded_path`. */ if (!inv->inv->invoice_paths) return fail_inv(cmd, inv, "Missing invoice_paths"); + for (size_t i = 0; i < tal_count(inv->inv->invoice_paths); i++) { + if (tal_count(inv->inv->invoice_paths[i]->path) == 0) + return fail_inv(cmd, inv, "Empty path in invoice_paths"); + } if (!inv->inv->invoice_blindedpay) return fail_inv(cmd, inv, "Missing invoice_blindedpay"); if (tal_count(inv->inv->invoice_blindedpay) diff --git a/plugins/offers_invreq_hook.c b/plugins/offers_invreq_hook.c index d065961f6d10..eced33fc6800 100644 --- a/plugins/offers_invreq_hook.c +++ b/plugins/offers_invreq_hook.c @@ -6,9 +6,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -301,9 +301,9 @@ static struct command_result *found_best_peer(struct command *cmd, etlvs[0]->payment_constraints->htlc_minimum_msat = best->htlc_min.millisatoshis; /* Raw: tlv */ /* So we recognize this payment */ - etlvs[1]->path_id = invoice_path_id(etlvs[1], - &invoicesecret_base, - ir->inv->invoice_payment_hash); + etlvs[1]->path_id = bolt12_path_id(etlvs[1], + &invoicesecret_base, + ir->inv->invoice_payment_hash); ir->inv->invoice_paths = tal_arr(ir->inv, struct blinded_path *, 1); ir->inv->invoice_paths[0] @@ -791,7 +791,7 @@ static struct command_result *listoffers_done(struct command *cmd, offertok = arr + 1; if (ir->secret) { struct sha256 offer_id; - const u8 *blinding_path_secret; + struct secret blinding_path_secret; struct blinded_path **offer_paths; if (!ir->invreq->offer_paths) { @@ -805,10 +805,9 @@ static struct command_result *listoffers_done(struct command *cmd, ir->invreq->offer_paths = NULL; invreq_offer_id(ir->invreq, &offer_id); ir->invreq->offer_paths = offer_paths; - blinding_path_secret = invoice_path_id(tmpctx, - &offerblinding_base, &offer_id); - if (!memeq(ir->secret, tal_bytelen(ir->secret), - blinding_path_secret, tal_bytelen(blinding_path_secret))) { + bolt12_path_secret(&offerblinding_base, &offer_id, + &blinding_path_secret); + if (!secret_eq_consttime(ir->secret, &blinding_path_secret)) { /* You used the wrong blinded path for invreq */ if (command_dev_apis(cmd)) return fail_invreq(cmd, ir, "Wrong blinded path"); @@ -930,11 +929,11 @@ static struct command_result *listoffers_done(struct command *cmd, assert(ir->inv->invreq_payer_id); /* BOLT-offers #12: - * - if `offer_node_id` is present: - * - MUST set `invoice_node_id` to `offer_node_id`. + * - if `offer_issuer_id` is present: + * - MUST set `invoice_node_id` to the `offer_issuer_id` */ - /* We always provide an offer_node_id! */ - ir->inv->invoice_node_id = ir->inv->offer_node_id; + /* FIXME: We always provide an offer_issuer_id! */ + ir->inv->invoice_node_id = ir->inv->offer_issuer_id; /* BOLT-offers #12: * - MUST set `invoice_created_at` to the number of seconds since @@ -984,22 +983,23 @@ struct command_result *handle_invoice_request(struct command *cmd, ir->secret = tal_dup_or_null(ir, struct secret, secret); ir->invreq = fromwire_tlv_invoice_request(cmd, &cursor, &len); + if (!ir->invreq) { + return fail_invreq(cmd, ir, "Invalid invreq"); + } + /* BOLT-offers #12: * The reader: * ... - * - MUST fail the request if any non-signature TLV fields greater or - * equal to 160. + * - MUST fail the request if any non-signature TLV fields are outside the inclusive ranges: 0 to 159 and 1000000000 to 2999999999 */ /* BOLT-offers #12: * Each form is signed using one or more *signature TLV elements*: * TLV types 240 through 1000 (inclusive) */ - if (tlv_span(invreqbin, 0, 159, NULL) - + tlv_span(invreqbin, 240, 1000, NULL) != tal_bytelen(invreqbin)) - return fail_invreq(cmd, ir, "Fields beyond 160"); - - if (!ir->invreq) { - return fail_invreq(cmd, ir, "Invalid invreq"); + if (any_field_outside_range(ir->invreq->fields, true, + 0, 159, + 1000000000, 2999999999)) { + return fail_invreq(cmd, ir, "Invalid high fields"); } /* BOLT-offers #12: @@ -1047,16 +1047,16 @@ struct command_result *handle_invoice_request(struct command *cmd, /* BOLT-offers #12: * - * - otherwise (no `offer_node_id`, not a response to our offer): + * - otherwise (no `offer_issuer_id` or `offer_paths`, not a response to our offer): */ /* FIXME-OFFERS: handle this! */ - if (!ir->invreq->offer_node_id) { + if (!ir->invreq->offer_issuer_id && !ir->invreq->offer_paths) { return fail_invreq(cmd, ir, "Not based on an offer"); } /* BOLT-offers #12: * - * - if `offer_node_id` is present (response to an offer): + * - if `offer_issuer_id` or `offer_paths` are present (response to an offer): * - MUST fail the request if the offer fields do not exactly match a * valid, unexpired offer. */ diff --git a/plugins/offers_offer.c b/plugins/offers_offer.c index e355361bc1fc..d8d75f93e284 100644 --- a/plugins/offers_offer.c +++ b/plugins/offers_offer.c @@ -3,8 +3,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -292,7 +292,6 @@ static struct command_result *found_best_peer(struct command *cmd, "No incoming channel to public peer, so no blinded path"); } else { struct pubkey *ids; - const u8 *path_secret; struct secret blinding_path_secret; struct sha256 offer_id; @@ -306,9 +305,8 @@ static struct command_result *found_best_peer(struct command *cmd, /* So we recognize this */ /* We can check this when they try to take up offer. */ - path_secret = invoice_path_id(tmpctx, &offerblinding_base, &offer_id); - assert(tal_count(path_secret) == sizeof(blinding_path_secret)); - memcpy(&blinding_path_secret, path_secret, sizeof(blinding_path_secret)); + bolt12_path_secret(&offerblinding_base, &offer_id, + &blinding_path_secret); offinfo->offer->offer_paths = tal_arr(offinfo->offer, struct blinded_path *, 1); offinfo->offer->offer_paths[0] @@ -352,25 +350,6 @@ static struct command_result *currency_done(struct command *cmd, return maybe_add_path(cmd, offinfo); } -static bool json_to_short_channel_id_dir(const char *buffer, const jsmntok_t *tok, - struct short_channel_id_dir *scidd) -{ - jsmntok_t scidtok, numtok; - u32 dir; - - if (!split_tok(buffer, tok, '/', &scidtok, &numtok)) - return false; - - if (!json_to_short_channel_id(buffer, &scidtok, &scidd->scid)) - return false; - - if (!json_to_u32(buffer, &numtok, &dir) || (dir > 1)) - return false; - - scidd->dir = dir; - return true; -} - static bool json_to_sciddir_or_pubkey(const char *buffer, const jsmntok_t *tok, struct sciddir_or_pubkey *sciddir_or_pubkey) { @@ -531,7 +510,7 @@ struct command_result *json_offer(struct command *cmd, /* BOLT-offers #12: * - * - if offer_amount is set and offer_description is not set: + * - if `offer_amount` is set and `offer_description` is not set: * - MUST NOT respond to the offer. */ if (!offer->offer_description && offer->offer_amount) @@ -551,23 +530,24 @@ struct command_result *json_offer(struct command *cmd, } /* BOLT-offers #12: - * - MUST set `offer_node_id` to the node's public key to request the - * invoice from. + * - if it includes `offer_paths`: + *... + * - otherwise: + * - MUST set `offer_issuer_id` to the node's public key to request the + * invoice from. */ - offer->offer_node_id = tal_dup(offer, struct pubkey, &id); + offer->offer_issuer_id = tal_dup(offer, struct pubkey, &id); /* Now rest of offer will not change: we use pathless offer to create secret. */ if (paths) { - const u8 *path_secret; struct secret blinding_path_secret; struct sha256 offer_id; /* Note: "id" of offer minus paths */ offer_offer_id(offer, &offer_id); /* We can check this when they try to take up offer. */ - path_secret = invoice_path_id(tmpctx, &offerblinding_base, &offer_id); - assert(tal_count(path_secret) == sizeof(blinding_path_secret)); - memcpy(&blinding_path_secret, path_secret, sizeof(blinding_path_secret)); + bolt12_path_secret(&offerblinding_base, &offer_id, + &blinding_path_secret); offer->offer_paths = tal_arr(offer, struct blinded_path *, tal_count(paths)); for (size_t i = 0; i < tal_count(paths); i++) { @@ -600,15 +580,90 @@ struct command_result *json_offer(struct command *cmd, return maybe_add_path(cmd, offinfo); } +static struct command_result *call_createinvoicerequest(struct command *cmd, + struct tlv_invoice_request *invreq, + bool single_use, + const char *label) +{ + struct out_req *req; + + req = jsonrpc_request_start(cmd->plugin, cmd, "createinvoicerequest", + check_result, forward_error, + invreq); + json_add_string(req->js, "bolt12", invrequest_encode(tmpctx, invreq)); + json_add_bool(req->js, "savetodb", true); + json_add_bool(req->js, "single_use", single_use); + if (label) + json_add_string(req->js, "recurrence_label", label); + return send_outreq(cmd->plugin, req); +} + +struct invrequest_data { + struct tlv_invoice_request *invreq; + bool single_use; + const char *label; +}; + +static struct command_result *found_best_peer_invrequest(struct command *cmd, + const struct chaninfo *best, + struct invrequest_data *irdata) +{ + if (!best) { + /* FIXME: Make this a warning in the result! */ + plugin_log(cmd->plugin, LOG_UNUSUAL, + "No incoming channel to public peer, so no blinded path for invoice request"); + } else { + struct pubkey *ids; + struct secret blinding_path_secret; + struct sha256 invreq_id; + + /* BOLT-offers #12: + * - MUST set `invreq_paths` as it would set (or not set) `offer_paths` for an offer. + */ + /* BOLT-offers #12: + * + * - if it is connected only by private channels: + * - MUST include `offer_paths` containing one or more paths to the node from + * publicly reachable nodes. + */ + /* Note: "id" of invreq minus paths (which we haven't added yet!) */ + invreq_invreq_id(irdata->invreq, &invreq_id); + + /* Make a small 1-hop path to us */ + ids = tal_arr(tmpctx, struct pubkey, 2); + ids[0] = best->id; + ids[1] = id; + + /* So we recognize this */ + /* We can check this when they try to take up invoice_request. */ + bolt12_path_secret(&offerblinding_base, &invreq_id, + &blinding_path_secret); + + plugin_log(cmd->plugin, LOG_DBG, + "Setting blinided path (invreq_id = %s, path_secret = %s)", + fmt_sha256(tmpctx, &invreq_id), + fmt_secret(tmpctx, &blinding_path_secret)); + irdata->invreq->invreq_paths = tal_arr(irdata->invreq, struct blinded_path *, 1); + irdata->invreq->invreq_paths[0] + = incoming_message_blinded_path(irdata->invreq->invreq_paths, + ids, + NULL, + &blinding_path_secret); + } + + return call_createinvoicerequest(cmd, + irdata->invreq, irdata->single_use, irdata->label); +} + struct command_result *json_invoicerequest(struct command *cmd, const char *buffer, const jsmntok_t *params) { const char *desc, *issuer, *label; struct tlv_invoice_request *invreq; - struct out_req *req; struct amount_msat *msat; bool *single_use; + struct node_id local_nodeid; invreq = tlv_invoice_request_new(cmd); @@ -629,14 +684,14 @@ struct command_result *json_invoicerequest(struct command *cmd, /* BOLT-offers #12: * - otherwise (not responding to an offer): - * - MUST set offer_description to a complete description of the purpose of the payment. - * - MUST set (or not set) offer_absolute_expiry and offer_issuer as it would for an offer. - * - MUST set invreq_payer_id (as it would set offer_node_id for an offer). - * - MUST set invreq_paths as it would set (or not set) offer_paths for an offer. - * - MUST NOT include signature, offer_metadata, offer_chains, offer_amount, offer_currency, offer_features, offer_quantity_max, offer_paths or offer_node_id + * - MUST set `offer_description` to a complete description of the purpose of the payment. + * - MUST set (or not set) `offer_absolute_expiry` and `offer_issuer` as it would for an offer. + * - MUST set `invreq_payer_id` (as it would set `offer_issuer_id` for an offer). + * - MUST set `invreq_paths` as it would set (or not set) `offer_paths` for an offer. + * - MUST NOT include `signature`, `offer_metadata`, `offer_chains`, `offer_amount`, `offer_currency`, `offer_features`, `offer_quantity_max`, `offer_paths` or `offer_issuer_id` * - if the chain for the invoice is not solely bitcoin: - * - MUST pecify invreq_chain the offer is valid for. - * - MUST set invreq_amount. + * - MUST specify `invreq_chain` the offer is valid for. + * - MUST set `invreq_amount`. */ if (desc) invreq->offer_description = tal_dup_arr(invreq, char, desc, strlen(desc), 0); @@ -661,32 +716,38 @@ struct command_result *json_invoicerequest(struct command *cmd, invreq->invreq_amount = tal_dup(invreq, u64, &msat->millisatoshis); /* Raw: wire */ - /* FIXME: enable blinded paths! */ - /* BOLT-offers #12: * - MUST set `invreq_metadata` to an unpredictable series of bytes. */ + invreq->invreq_metadata = tal_arr(invreq, u8, 16); + randombytes_buf(invreq->invreq_metadata, + tal_bytelen(invreq->invreq_metadata)); + /* BOLT-offers #12: * - otherwise (not responding to an offer): *... - * - MUST set `invreq_payer_id` as it would set `offer_node_id` for an offer. + * - MUST set `invreq_payer_id` (as it would set `offer_issuer_id` for an offer). */ - /* createinvoicerequest sets these! */ + /* FIXME: Allow invoicerequests using aliases! */ + invreq->invreq_payer_id = tal_dup(invreq, struct pubkey, &id); /* BOLT-offers #12: * - if it supports bolt12 invoice request features: * - MUST set `invreq_features`.`features` to the bitmap of features. */ - req = jsonrpc_request_start(cmd->plugin, cmd, "createinvoicerequest", - check_result, forward_error, - invreq); - json_add_string(req->js, "bolt12", invrequest_encode(tmpctx, invreq)); - json_add_bool(req->js, "savetodb", true); - /* FIXME: Allow invoicerequests using aliases! */ - json_add_bool(req->js, "exposeid", true); - json_add_bool(req->js, "single_use", *single_use); - if (label) - json_add_string(req->js, "recurrence_label", label); - return send_outreq(cmd->plugin, req); + + /* FIXME: We only set blinded path if private, we should allow + * setting otherwise! */ + node_id_from_pubkey(&local_nodeid, &id); + if (!gossmap_find_node(get_gossmap(cmd->plugin), &local_nodeid)) { + struct invrequest_data *idata = tal(cmd, struct invrequest_data); + idata->invreq = invreq; + idata->single_use = *single_use; + idata->label = label; + return find_best_peer(cmd, OPT_ONION_MESSAGES, + found_best_peer_invrequest, idata); + } + + return call_createinvoicerequest(cmd, invreq, *single_use, label); } diff --git a/plugins/pay.c b/plugins/pay.c index 9959d729070e..c859b5d13684 100644 --- a/plugins/pay.c +++ b/plugins/pay.c @@ -315,9 +315,8 @@ static size_t pay_mpp_hash(const struct pay_sort_key *key) static bool pay_mpp_eq(const struct pay_mpp *pm, const struct pay_sort_key *key) { - return memcmp(pm->sortkey.payment_hash, key->payment_hash, - sizeof(struct sha256)) == 0 && - pm->sortkey.groupid == key->groupid; + return sha256_eq(pm->sortkey.payment_hash, key->payment_hash) + && pm->sortkey.groupid == key->groupid; } HTABLE_DEFINE_TYPE(struct pay_mpp, pay_mpp_key, pay_mpp_hash, pay_mpp_eq, @@ -1262,6 +1261,8 @@ static struct command_result *json_pay(struct command *cmd, p->blindedpath = NULL; p->blindedpay = NULL; + paymod_log(p, LOG_INFORM, "Paying invoice bolt11=%s", b11str); + if (!bolt12_has_prefix(b11str)) { b11 = bolt11_decode(tmpctx, b11str, plugin_feature_set(cmd->plugin), @@ -1509,22 +1510,13 @@ static struct command_result *json_pay(struct command *cmd, static const struct plugin_command commands[] = { { "paystatus", - "payment", - "Detail status of attempts to pay {bolt11}, or all", - "Covers both old payments and current ones.", json_paystatus }, { "listpays", - "payment", - "List result of payment {bolt11} or {payment_hash}, or all", - "Covers old payments (failed and succeeded) and current ones.", json_listpays }, { "pay", - "payment", - "Send payment specified by {bolt11}", - "Attempt to pay the {bolt11} invoice.", json_pay }, }; @@ -1532,12 +1524,13 @@ static const struct plugin_command commands[] = { static const char *notification_topics[] = { "pay_success", "pay_failure", + "channel_hint_update", }; int main(int argc, char *argv[]) { setup_locale(); - plugin_main(argv, init, PLUGIN_RESTARTABLE, true, NULL, commands, + plugin_main(argv, init, NULL, PLUGIN_RESTARTABLE, true, NULL, commands, ARRAY_SIZE(commands), NULL, 0, NULL, 0, notification_topics, ARRAY_SIZE(notification_topics), plugin_option("disable-mpp", "flag", diff --git a/plugins/recover.c b/plugins/recover.c index 07149f773c63..b46d55dc74ea 100644 --- a/plugins/recover.c +++ b/plugins/recover.c @@ -288,7 +288,7 @@ int main(int argc, char *argv[]) { setup_locale(); - plugin_main(argv, init, PLUGIN_STATIC, true, NULL, + plugin_main(argv, init, NULL, PLUGIN_STATIC, true, NULL, NULL, 0, NULL, 0, NULL, 0, NULL, 0, /* Notification topics we publish */ diff --git a/plugins/renepay/chan_extra.h b/plugins/renepay/chan_extra.h index 7a3982358885..ba8227716f63 100644 --- a/plugins/renepay/chan_extra.h +++ b/plugins/renepay/chan_extra.h @@ -115,19 +115,6 @@ struct chan_extra *new_chan_extra(struct chan_extra_map *chan_extra_map, const struct short_channel_id scid, struct amount_msat capacity); -/* Helper to find the min of two amounts */ -static inline struct amount_msat amount_msat_min(struct amount_msat a, - struct amount_msat b) -{ - return amount_msat_less(a, b) ? a : b; -} -/* Helper to find the max of two amounts */ -static inline struct amount_msat amount_msat_max(struct amount_msat a, - struct amount_msat b) -{ - return amount_msat_greater(a, b) ? a : b; -} - /* Update the knowledge that this (channel,direction) can send x msat.*/ enum renepay_errorcode chan_extra_can_send(struct chan_extra_map *chan_extra_map, @@ -190,18 +177,6 @@ enum renepay_errorcode channel_liquidity(struct amount_msat *liquidity, const struct gossmap_chan *chan, const int dir); -/* Helpers to get the htlc_max and htlc_min of a channel. */ -static inline struct amount_msat -channel_htlc_max(const struct gossmap_chan *chan, const int dir) -{ - return amount_msat(fp16_to_u64(chan->half[dir].htlc_max)); -} -static inline struct amount_msat -channel_htlc_min(const struct gossmap_chan *chan, const int dir) -{ - return amount_msat(fp16_to_u64(chan->half[dir].htlc_min)); -} - /* inputs * @chan: a channel * @recv: how much can we send to this channels diff --git a/plugins/renepay/flow.c b/plugins/renepay/flow.c index 39b9864b10f8..fe40eb5f0692 100644 --- a/plugins/renepay/flow.c +++ b/plugins/renepay/flow.c @@ -93,7 +93,7 @@ flow_maximum_deliverable(struct amount_msat *max_deliverable, if(bad_channel)*bad_channel = flow->path[0]; return err; } - x = amount_msat_min(x, channel_htlc_max(flow->path[0], flow->dirs[0])); + x = amount_msat_min(x, gossmap_chan_htlc_max(flow->path[0], flow->dirs[0])); if(amount_msat_zero(x)) { @@ -127,7 +127,7 @@ flow_maximum_deliverable(struct amount_msat *max_deliverable, struct amount_msat x_new = amount_msat_min(forward_cap, liquidity_cap); x_new = amount_msat_min( - x_new, channel_htlc_max(flow->path[i], flow->dirs[i])); + x_new, gossmap_chan_htlc_max(flow->path[i], flow->dirs[i])); /* safety check: amounts decrease along the route */ assert(amount_msat_less_eq(x_new, x)); diff --git a/plugins/renepay/main.c b/plugins/renepay/main.c index a571695d150f..5ee7de946ca1 100644 --- a/plugins/renepay/main.c +++ b/plugins/renepay/main.c @@ -382,16 +382,10 @@ static struct command_result *json_pay(struct command *cmd, const char *buf, static const struct plugin_command commands[] = { { "renepaystatus", - "payment", - "Detail status of attempts to pay {bolt11}, or all", - "Covers both old payments and current ones.", json_paystatus }, { "renepay", - "payment", - "Send payment specified by {invstring}", - "Attempt to pay an invoice.", json_pay }, }; @@ -417,7 +411,7 @@ int main(int argc, char *argv[]) plugin_main( argv, - init, + init, NULL, PLUGIN_RESTARTABLE, /* init_rpc */ true, /* features */ NULL, diff --git a/plugins/renepay/mcf.c b/plugins/renepay/mcf.c index 8c3a7d349da9..f615446a259f 100644 --- a/plugins/renepay/mcf.c +++ b/plugins/renepay/mcf.c @@ -497,7 +497,7 @@ static bool linearize_channel(const struct pay_parameters *params, /* An extra bound on capacity, here we use it to reduce the flow such * that it does not exceed htlcmax. */ s64 cap_on_capacity = - channel_htlc_max(c, dir).millisatoshis/1000; /* Raw: linearize_channel */ + gossmap_chan_htlc_max(c, dir).millisatoshis/1000; /* Raw: linearize_channel */ capacity[0]=a; cost[0]=0; @@ -1363,12 +1363,12 @@ get_flow_paths(const tal_t *ctx, const struct gossmap *gossmap, /* obtain the supremum htlc_min along the route */ sup_htlc_min = amount_msat_max( - sup_htlc_min, channel_htlc_min(c, dir)); + sup_htlc_min, gossmap_chan_htlc_min(c, dir)); /* obtain the infimum htlc_max along the route */ inf_htlc_max = amount_msat_min( - inf_htlc_max, channel_htlc_max(c, dir)); + inf_htlc_max, gossmap_chan_htlc_max(c, dir)); } s64 htlc_max=inf_htlc_max.millisatoshis/1000;/* Raw: need htlc_max in sats to do arithmetic operations.*/ diff --git a/plugins/renepay/mods.c b/plugins/renepay/mods.c index fd3554ac7fdf..c4dc128e9a76 100644 --- a/plugins/renepay/mods.c +++ b/plugins/renepay/mods.c @@ -253,6 +253,18 @@ static struct command_result *previous_sendpays_done(struct command *cmd, // max_partid for the pending_group_id payment->next_partid = max_pending_partid + 1; + for (size_t j = 0; j < tal_count(pending_routes); j++) { + route_pending_register(payment->routetracker, + pending_routes[j]); + } + if (!routetracker_get_amount(payment->routetracker, + &payment->total_delivering, + &payment->total_sent)) + plugin_err(pay_plugin->plugin, + "(%s:%d) routetracker_get_amount failed " + "probably due to an amount_msat overflow.", + __PRETTY_FUNCTION__, __LINE__); + plugin_log(pay_plugin->plugin, LOG_DBG, "There are pending sendpays to this invoice. " "groupid = %" PRIu32 " " @@ -271,12 +283,6 @@ static struct command_result *previous_sendpays_done(struct command *cmd, "Payment is pending with full amount " "already commited"); } - - for (size_t j = 0; j < tal_count(pending_routes); j++) { - route_pending_register(payment->routetracker, - pending_routes[j]); - } - } else { /* There are no pending nor completed sendpays, get me the last * sendpay group. */ diff --git a/plugins/renepay/payplugin.h b/plugins/renepay/payplugin.h index e79585fda07f..d9dd3589906d 100644 --- a/plugins/renepay/payplugin.h +++ b/plugins/renepay/payplugin.h @@ -89,9 +89,4 @@ struct pay_plugin { /* Set in init */ extern struct pay_plugin *pay_plugin; -/* Returns NULL if OK, otherwise an error msg and sets *ecode */ -const char *try_paying(const tal_t *ctx, - struct payment *payment, - enum jsonrpc_errcode *ecode); - #endif /* LIGHTNING_PLUGINS_RENEPAY_PAYPLUGIN_H */ diff --git a/plugins/renepay/routebuilder.c b/plugins/renepay/routebuilder.c index 188ebcde5c6a..43d97e400f5f 100644 --- a/plugins/renepay/routebuilder.c +++ b/plugins/renepay/routebuilder.c @@ -86,9 +86,9 @@ route_check_constraints(struct route *route, struct gossmap *gossmap, // check that we stay within the htlc max and min limits if (amount_msat_greater(hop->amount, - channel_htlc_max(chan, dir)) || + gossmap_chan_htlc_max(chan, dir)) || amount_msat_less(hop->amount, - channel_htlc_min(chan, dir))) { + gossmap_chan_htlc_min(chan, dir))) { bitmap_set_bit(disabled_bitmap, gossmap_chan_idx(gossmap, chan)); return RENEPAY_BAD_CHANNEL; diff --git a/plugins/renepay/routetracker.c b/plugins/renepay/routetracker.c index 416ae2032164..b1bb1fdddd26 100644 --- a/plugins/renepay/routetracker.c +++ b/plugins/renepay/routetracker.c @@ -134,6 +134,28 @@ void route_pending_register(struct routetracker *routetracker, } } +bool routetracker_get_amount(struct routetracker *routetracker, + struct amount_msat *amount, + struct amount_msat *amount_sent) +{ + assert(routetracker); + assert(amount); + assert(amount_sent); + + *amount = AMOUNT_MSAT(0); + *amount_sent = AMOUNT_MSAT(0); + + struct route_map *rmap = routetracker->pending_routes; + struct route_map_iter it; + for (struct route *r = route_map_first(rmap, &it); r; + r = route_map_next(rmap, &it)) { + if (!amount_msat_add(amount, *amount, route_delivers(r)) || + !amount_msat_add(amount_sent, *amount_sent, route_sends(r))) + return false; + } + return true; +} + static void route_result_collected(struct routetracker *routetracker, struct route *route TAKES) { diff --git a/plugins/renepay/routetracker.h b/plugins/renepay/routetracker.h index 57bde5214a54..16613140bbc5 100644 --- a/plugins/renepay/routetracker.h +++ b/plugins/renepay/routetracker.h @@ -50,6 +50,11 @@ struct command_result *notification_sendpay_success(struct command *cmd, void route_failure_register(struct routetracker *routetracker, struct route *route); +/* How much is the amount being tracked. */ +bool routetracker_get_amount(struct routetracker *routetracker, + struct amount_msat *amount, + struct amount_msat *amount_sent); + // FIXME: double-check that we actually get one notification for each sendpay, // ie. that after some time we don't have yet pending sendpays for old failed or // successful payments that we havent processed because we haven't received the diff --git a/plugins/spender/fundchannel.c b/plugins/spender/fundchannel.c index bc8542c786ac..e797492b61f5 100644 --- a/plugins/spender/fundchannel.c +++ b/plugins/spender/fundchannel.c @@ -11,12 +11,6 @@ json_fundchannel(struct command *cmd, const struct plugin_command fundchannel_commands[] = { { "fundchannel", - "channels", - "Fund channel with {id} using {amount} (or 'all'), at optional {feerate}. " - "Only use outputs that have {minconf} confirmations.", - "Initiaties a channel open with node 'id'. Must " - "be connected to the node and have enough funds available at the requested minimum confirmation " - "depth (minconf)", json_fundchannel } }; diff --git a/plugins/spender/main.c b/plugins/spender/main.c index 23698567aed4..ce0e84d100cb 100644 --- a/plugins/spender/main.c +++ b/plugins/spender/main.c @@ -32,7 +32,7 @@ int main(int argc, char **argv) notifs = tal_arr(NULL, struct plugin_notification, 0); tal_expand(¬ifs, openchannel_notifs, num_openchannel_notifs); - plugin_main(argv, &spender_init, PLUGIN_STATIC, true, + plugin_main(argv, &spender_init, NULL, PLUGIN_STATIC, true, NULL, take(commands), tal_count(commands), take(notifs), tal_count(notifs), diff --git a/plugins/spender/multifundchannel.c b/plugins/spender/multifundchannel.c index 52f6ddb3dc31..145d74240ed7 100644 --- a/plugins/spender/multifundchannel.c +++ b/plugins/spender/multifundchannel.c @@ -2018,15 +2018,6 @@ json_multifundchannel(struct command *cmd, const struct plugin_command multifundchannel_commands[] = { { "multifundchannel", - "channels", - "Fund channels to {destinations}, which is an array of " - "objects containing peer {id}, {amount}, and optional " - "{announce} and {push_msat}. " - "A single transaction will be used to fund all the " - "channels. " - "Use {feerate} for the transaction, select outputs that are " - "buried {minconf} blocks deep, or specify a set of {utxos}.", - "Fund multiple channels at once.", json_multifundchannel } }; diff --git a/plugins/spender/multiwithdraw.c b/plugins/spender/multiwithdraw.c index 9142ef36f123..04d35383f43d 100644 --- a/plugins/spender/multiwithdraw.c +++ b/plugins/spender/multiwithdraw.c @@ -24,10 +24,6 @@ json_multiwithdraw(struct command *cmd, const struct plugin_command multiwithdraw_commands[] = { { "multiwithdraw", - "bitcoin", - "Send to multiple {outputs} via a single Bitcoin transaction.", - "Send to multiple {outputs} at optiona {feerate}, spending " - "coins at least {minconf} depth, or the specified {utxos}.", &json_multiwithdraw, false } diff --git a/plugins/sql.c b/plugins/sql.c index b4f55dfc51a9..1490b5063955 100644 --- a/plugins/sql.c +++ b/plugins/sql.c @@ -1545,17 +1545,11 @@ static const char *init(struct plugin *plugin, } static const struct plugin_command commands[] = { { - "sql", - "misc", - "Run {query} and return result", - "This is the greatest plugin command ever!", - json_sql, + "sql", + json_sql, }, { "listsqlschemas", - "misc", - "Display schemas for internal sql tables, or just {table}", - "This is the greatest plugin command ever!", json_listsqlschemas, }, }; @@ -1656,7 +1650,7 @@ int main(int argc, char *argv[]) common_shutdown(); return 0; } - plugin_main(argv, init, PLUGIN_RESTARTABLE, true, NULL, commands, ARRAY_SIZE(commands), + plugin_main(argv, init, NULL, PLUGIN_RESTARTABLE, true, NULL, commands, ARRAY_SIZE(commands), NULL, 0, NULL, 0, NULL, 0, plugin_option_dev("dev-sqlfilename", "string", diff --git a/plugins/test/run-route-calc.c b/plugins/test/run-route-calc.c index ee4a1ab74e60..da73c25a9a8b 100644 --- a/plugins/test/run-route-calc.c +++ b/plugins/test/run-route-calc.c @@ -81,6 +81,10 @@ void json_add_amount_msat(struct json_stream *result UNNEEDED, struct amount_msat msat) { fprintf(stderr, "json_add_amount_msat called!\n"); abort(); } +/* Generated stub for json_add_bool */ +void json_add_bool(struct json_stream *result UNNEEDED, const char *fieldname UNNEEDED, + bool value UNNEEDED) +{ fprintf(stderr, "json_add_bool called!\n"); abort(); } /* Generated stub for json_add_hex_talarr */ void json_add_hex_talarr(struct json_stream *result UNNEEDED, const char *fieldname UNNEEDED, @@ -116,6 +120,11 @@ void json_add_short_channel_id(struct json_stream *response UNNEEDED, const char *fieldname UNNEEDED, struct short_channel_id id UNNEEDED) { fprintf(stderr, "json_add_short_channel_id called!\n"); abort(); } +/* Generated stub for json_add_short_channel_id_dir */ +void json_add_short_channel_id_dir(struct json_stream *response UNNEEDED, + const char *fieldname UNNEEDED, + struct short_channel_id_dir idd UNNEEDED) +{ fprintf(stderr, "json_add_short_channel_id_dir called!\n"); abort(); } /* Generated stub for json_add_string */ void json_add_string(struct json_stream *js UNNEEDED, const char *fieldname UNNEEDED, @@ -165,6 +174,9 @@ const char *json_scan(const tal_t *ctx UNNEEDED, /* Generated stub for json_strdup */ char *json_strdup(const tal_t *ctx UNNEEDED, const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED) { fprintf(stderr, "json_strdup called!\n"); abort(); } +/* Generated stub for json_to_bool */ +bool json_to_bool(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, bool *b UNNEEDED) +{ fprintf(stderr, "json_to_bool called!\n"); abort(); } /* Generated stub for json_to_createonion_response */ struct createonion_response *json_to_createonion_response(const tal_t *ctx UNNEEDED, const char *buffer UNNEEDED, @@ -264,6 +276,12 @@ void plugin_notification_end(struct plugin *plugin UNNEEDED, struct json_stream *plugin_notification_start(struct plugin *plugins UNNEEDED, const char *method UNNEEDED) { fprintf(stderr, "plugin_notification_start called!\n"); abort(); } +/* Generated stub for plugin_notify_message */ +void plugin_notify_message(struct command *cmd UNNEEDED, + enum log_level level UNNEEDED, + const char *fmt UNNEEDED, ...) + +{ fprintf(stderr, "plugin_notify_message called!\n"); abort(); } /* Generated stub for random_select */ bool random_select(double weight UNNEEDED, double *tot_weight UNNEEDED) { fprintf(stderr, "random_select called!\n"); abort(); } diff --git a/plugins/test/run-route-overlong.c b/plugins/test/run-route-overlong.c index 8f9ce9bdee86..4a7d94b3f7d2 100644 --- a/plugins/test/run-route-overlong.c +++ b/plugins/test/run-route-overlong.c @@ -78,6 +78,10 @@ void json_add_amount_msat(struct json_stream *result UNNEEDED, struct amount_msat msat) { fprintf(stderr, "json_add_amount_msat called!\n"); abort(); } +/* Generated stub for json_add_bool */ +void json_add_bool(struct json_stream *result UNNEEDED, const char *fieldname UNNEEDED, + bool value UNNEEDED) +{ fprintf(stderr, "json_add_bool called!\n"); abort(); } /* Generated stub for json_add_hex_talarr */ void json_add_hex_talarr(struct json_stream *result UNNEEDED, const char *fieldname UNNEEDED, @@ -113,6 +117,11 @@ void json_add_short_channel_id(struct json_stream *response UNNEEDED, const char *fieldname UNNEEDED, struct short_channel_id id UNNEEDED) { fprintf(stderr, "json_add_short_channel_id called!\n"); abort(); } +/* Generated stub for json_add_short_channel_id_dir */ +void json_add_short_channel_id_dir(struct json_stream *response UNNEEDED, + const char *fieldname UNNEEDED, + struct short_channel_id_dir idd UNNEEDED) +{ fprintf(stderr, "json_add_short_channel_id_dir called!\n"); abort(); } /* Generated stub for json_add_string */ void json_add_string(struct json_stream *js UNNEEDED, const char *fieldname UNNEEDED, @@ -162,6 +171,9 @@ const char *json_scan(const tal_t *ctx UNNEEDED, /* Generated stub for json_strdup */ char *json_strdup(const tal_t *ctx UNNEEDED, const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED) { fprintf(stderr, "json_strdup called!\n"); abort(); } +/* Generated stub for json_to_bool */ +bool json_to_bool(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, bool *b UNNEEDED) +{ fprintf(stderr, "json_to_bool called!\n"); abort(); } /* Generated stub for json_to_createonion_response */ struct createonion_response *json_to_createonion_response(const tal_t *ctx UNNEEDED, const char *buffer UNNEEDED, @@ -261,6 +273,12 @@ void plugin_notification_end(struct plugin *plugin UNNEEDED, struct json_stream *plugin_notification_start(struct plugin *plugins UNNEEDED, const char *method UNNEEDED) { fprintf(stderr, "plugin_notification_start called!\n"); abort(); } +/* Generated stub for plugin_notify_message */ +void plugin_notify_message(struct command *cmd UNNEEDED, + enum log_level level UNNEEDED, + const char *fmt UNNEEDED, ...) + +{ fprintf(stderr, "plugin_notify_message called!\n"); abort(); } /* Generated stub for random_select */ bool random_select(double weight UNNEEDED, double *tot_weight UNNEEDED) { fprintf(stderr, "random_select called!\n"); abort(); } diff --git a/plugins/topology.c b/plugins/topology.c index ecd97443e9ea..8b9ad3d0a711 100644 --- a/plugins/topology.c +++ b/plugins/topology.c @@ -728,36 +728,18 @@ static const char *init(struct plugin *p, static const struct plugin_command commands[] = { { "getroute", - "channels", - "Primitive route command", - "Show route to {id} for {msatoshi}, using {riskfactor} and optional {cltv} (default 9). " - "If specified search from {fromid} otherwise use this node as source. " - "Randomize the route with up to {fuzzpercent} (ignored)). " - "{exclude} an array of short-channel-id/direction (e.g. [ '564334x877x1/0', '564195x1292x0/1' ]) " - "or node-id from consideration. " - "Set the {maxhops} the route can take (default 20).", json_getroute, }, { "listchannels", - "channels", - "List all known channels in the network", - "Show channels for {short_channel_id}, {source} or {destination} " - "(or all known channels, if not specified)", json_listchannels, }, { "listnodes", - "network", - "List all known nodes in the network", - "Show node {id} (or all known nods, if not specified)", json_listnodes, }, { "listincoming", - "network", - "List the channels incoming from our direct peers", - "Used by invoice code to select peers for routehints", json_listincoming, }, }; @@ -765,6 +747,6 @@ static const struct plugin_command commands[] = { int main(int argc, char *argv[]) { setup_locale(); - plugin_main(argv, init, PLUGIN_STATIC, true, NULL, commands, ARRAY_SIZE(commands), + plugin_main(argv, init, NULL, PLUGIN_STATIC, true, NULL, commands, ARRAY_SIZE(commands), NULL, 0, NULL, 0, NULL, 0, NULL); } diff --git a/plugins/txprepare.c b/plugins/txprepare.c index d3728d4357f6..3024f305b2fa 100644 --- a/plugins/txprepare.c +++ b/plugins/txprepare.c @@ -633,37 +633,22 @@ static struct command_result *json_upgradewallet(struct command *cmd, static const struct plugin_command commands[] = { { "txprepare", - "bitcoin", - "Create a transaction, with option to spend in future (either txsend and txdiscard)", - "Create an unsigned transaction paying {outputs} with optional {feerate}, {minconf} and {utxos}", json_txprepare }, { "txdiscard", - "bitcoin", - "Discard a transaction created by txprepare", - "Discard a transcation by {txid}", json_txdiscard }, { "txsend", - "bitcoin", - "Send a transaction created by txprepare", - "Send a transacation by {txid}", json_txsend }, { "withdraw", - "bitcoin", - "Send funds to {destination} address", - "Send to {destination} {satoshi} (or 'all') at optional {feerate} using utxos from {minconf} or {utxos}.", json_withdraw }, { "upgradewallet", - "bitcoin", - "Spend p2sh wrapped outputs into a native segwit output", - "Send all p2sh-wrapped outputs to a bech32 native segwit address", json_upgradewallet }, }; @@ -683,6 +668,6 @@ static const char *init(struct plugin *p, int main(int argc, char *argv[]) { setup_locale(); - plugin_main(argv, init, PLUGIN_RESTARTABLE, true, NULL, commands, + plugin_main(argv, init, NULL, PLUGIN_RESTARTABLE, true, NULL, commands, ARRAY_SIZE(commands), NULL, 0, NULL, 0, NULL, 0, NULL); } diff --git a/poetry.lock b/poetry.lock index 653042712d94..91111048bbe5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -637,47 +637,56 @@ files = [ [[package]] name = "cryptography" -version = "41.0.7" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, - {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, - {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, - {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, - {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, - {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, - {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [package.dependencies] -cffi = ">=1.12" +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] -pep8test = ["black", "check-sdist", "mypy", "ruff"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -1726,7 +1735,7 @@ develop = true base58 = "^2.1.1" bitstring = "^4.1.0" coincurve = "^20" -cryptography = "^41" +cryptography = "^42" PySocks = "^1" [package.source] @@ -2384,4 +2393,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "81b82db3ba9c112833eb1482277d4c8f81c3f92aed6440b3024c07c02255f271" +content-hash = "07f181d07f4d2b6898e8c6255c2087d3f7e313b0b69efc6f23596891b4af4faa" diff --git a/pyproject.toml b/pyproject.toml index 51033de7bd30..a46a57f7ff88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ grpcio-tools = "^1" grpcio = "^1" # We want a specific version of protobuf to match CI's .github/scripts/setup.sh protobuf = "4.21.12" -cryptography = "^41.0.2" +cryptography = "^42" [tool.poetry.group.dev.dependencies] # Test dependencies and inherited dependencies belong here diff --git a/tests/autogenerate-rpc-examples.py b/tests/autogenerate-rpc-examples.py new file mode 100644 index 000000000000..47f28373ff9b --- /dev/null +++ b/tests/autogenerate-rpc-examples.py @@ -0,0 +1,1204 @@ +# This script is used to re-generate all RPC examples for methods listed in doc/schemas/lightning-*.json schema files. +# It uses the pre existing test setup to start nodes, fund channels and execute other RPC calls to generate these examples. +# This test will only run with GENERATE_EXAMPLES=True setup to avoid accidental overwriting of examples with other test executions. +# Set the test TIMEOUT to more than 3 seconds to avoid failures while waiting for the bitcoind response. The `dev-bitcoind-poll` is set to 3 seconds, so a shorter timeout may lead to test failures. +# Note: Different nodes are used to record examples depending upon the availability, quality and volume of the data. For example: Node l1 has been used to listsendpays and l2 for listforwards. + +from fixtures import * # noqa: F401,F403 +from fixtures import TEST_NETWORK +from io import BytesIO +from pyln.client import RpcError, Millisatoshi +from pyln.proto.onion import TlvPayload +from utils import only_one, mine_funding_to_announce, sync_blockheight, wait_for, first_scid +import os +import re +import time +import pytest +import unittest +import json +import logging +import ast +import struct +import subprocess + +CWD = os.getcwd() +REGENERATING_RPCS = [] +ALL_METHOD_NAMES = [] +RPCS_STATUS = [] +ALL_RPC_EXAMPLES = {} +GENERATE_EXAMPLES = True + +FUND_WALLET_AMOUNT_SAT = 200000000 +FUND_CHANNEL_AMOUNT_SAT = 10**6 +LOG_FILE = 'autogenerate-examples-status.log' + +if os.path.exists(LOG_FILE): + open(LOG_FILE, 'w').close() + +logging.basicConfig(level=logging.INFO, + format='%(levelname)s - %(message)s', + handlers=[ + # logging.FileHandler(LOG_FILE), + logging.StreamHandler() + ]) + +logger = logging.getLogger(__name__) + + +class TaskFinished(Exception): + def __init__(self, message): + self.message = message + super().__init__(self.message) + + +def update_example(node, method, params, res=None, description=None, execute=True, filename=None): + """Update examples in JSON files with rpc calls and responses""" + try: + def replace_local_paths(data, replacements): + """Replace local paths in JSON objects""" + try: + # For dictionary or list, recursively replace paths + if isinstance(data, dict): + return {k: replace_local_paths(v, replacements) for k, v in data.items()} + elif isinstance(data, list): + return [replace_local_paths(v, replacements) for v in data] + # Replace when it is string + elif isinstance(data, str): + for old_path, new_path in replacements: + data = re.sub(old_path, new_path, data) + return data + # For other data types, return as is + else: + return data + except Exception as e: + logger.error(f'Error in replacing local paths: {e}') + + def replace_with_example_values(schema, res, idx): + """Replace the response values with the 'example_values' from the schema""" + def update_value(schema, res, idx): + if isinstance(res, dict): + for key, value in res.items(): + if key in schema.get('properties', {}): + prop_schema = schema['properties'][key] + if 'example_values' in prop_schema: + if prop_schema['example_values'][idx]: + res[key] = prop_schema['example_values'][idx] + else: + update_value(prop_schema, value, idx) + elif isinstance(res, list): + for index, item in enumerate(res): + if 'items' in schema: + update_value(schema['items'], item, idx) + + update_value(schema['response'], res, idx) + return res + + def format_json_with_jq(json_data): + """Formats the JSON data with jq to avoid check-fmt-schemas errors. + It is because check-fmt-schemas uses jq to format the JSON data and compare the difference. + For example, jq will convert 18446744073709551685 to 18446744073709552000 before comparing. + JQ behaves this way because it uses C doubles to represent numbers, and on pretty much all + modern systems that's an IEEE 754 double, which can only represent integers without loss + between -2^53..2^53. 125276004817190914 is about 14 times larger than the largest integer + that jq can represent losslessly, therefore jq can only approximate it. + Reference: https://github.com/jqlang/jq/issues/369 + """ + jq_command = 'jq .' + if not isinstance(json_data, str): + json_data = json.dumps(json_data) + + # Run the jq command and capture the output + result = subprocess.run( + jq_command, + input=json_data, + text=True, + capture_output=True, + shell=True + ) + if result.returncode != 0: + logger.error(f"Error running jq: {result.stderr}") + return json.loads(result.stdout) + + global CWD, ALL_RPC_EXAMPLES, REGENERATING_RPCS, RPCS_STATUS + # Usually file name is same as method name, but `sql` is an exception; + # For sql, the `sql-template` file should be updated with examples then this template with finally generate the sql file with tables + # See doc/Makefile `doc/schemas/lightning-sql.json` for more details + file_path = os.path.join(CWD, 'doc', 'schemas', f'lightning-{method}.json') if filename is None else os.path.join(CWD, 'doc', 'schemas', f'lightning-{filename}.json') + with open(file_path, 'r+', encoding='utf-8') as file: + schema = json.load(file) + method_id = len(schema['examples']) + 1 if 'examples' in schema else 1 + req = { + 'id': f'example:{method}#{method_id}', + 'method': method, + 'params': params + } + logger.info(f'Method \'{method}\', Params {params}') + # Execute the RPC call and get the response + if execute: + res = node.rpc.call(method, params) + logger.info(f'{method} response: {res}') + # Return response without updating the file because user doesn't want to update the example + # Executing the method and returing the response is useful for further example updates + if method not in REGENERATING_RPCS: + return res + else: + # Replace local path in the request with default path + if method == 'plugin' and 'plugin' in req['params']: + req['params']['plugin'] = req['params']['plugin'].replace(CWD, '/root/lightning') + methods_to_replace_path = ['commando', 'listconfigs', 'plugin'] + # Replace local paths in responses to ensure the example's consistency for different users + if method in methods_to_replace_path: + replacements = [ + (CWD, '/root/lightning'), + (r'/tmp/ltests-[^/]+/test_generate_examples_[^/]+/lightning-[^/]+', '/tmp/.lightning') + ] + res = replace_local_paths(res, replacements) + # Format the JSON data with jq to avoid check-fmt-schemas errors + res = format_json_with_jq(res) + res = replace_with_example_values(schema, res, method_id - 1) + # Create the example key with description, request & response + schema.setdefault('examples', []).append({'request': req, 'response': res} if description is None else {'description': description, 'request': req, 'response': res}) + # Update the file with the new example + file.seek(0) + json.dump(schema, file, indent=2, ensure_ascii=False) + file.write('\n') + file.truncate() + logger.info(f'Updated {method}#{method_id}') + for rpc in ALL_RPC_EXAMPLES: + if rpc['method'] == method: + rpc['executed'] += 1 + if rpc['executed'] == rpc['num_examples']: + RPCS_STATUS[REGENERATING_RPCS.index(method)] = True + break + # Exit if listed commands have been executed + if all(RPCS_STATUS): + raise TaskFinished('All Done!!!') + return res + except FileNotFoundError as fnf_error: + logger.error(f'File not found error {fnf_error} at: {file_path}') + + +def setup_test_nodes(node_factory, bitcoind): + """Sets up six test nodes for various transaction scenarios: + l1, l2, l3 for transactions and forwards + l4 for complex transactions (sendpayment, keysend, renepay) + l5 for keysend with routehints and channel backup & recovery + l5, l6 for backup and recovery + l7, l8 for splicing (added later) + l9, l10 for low level fundchannel examples (added later) + l11, l12 for low level openchannel examples (added later) + l13 for recover (added later) + l1->l2, l2->l3, l3->l4, l2->l5 (unannounced), l9->l10, l11->l12 + l1.info['id']: 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 + l2.info['id']: 022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59 + l3.info['id']: 035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d + l4.info['id']: 0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199 + l5.info['id']: 032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e + l6.info['id']: 0265b6ab5ec860cd257865d61ef0bbf5b3339c36cbda8b26b74e7f1dca490b6518 + """ + try: + global FUND_WALLET_AMOUNT_SAT, FUND_CHANNEL_AMOUNT_SAT + options = [ + { + 'experimental-dual-fund': None, + 'experimental-offers': None, + 'may_reconnect': True, + 'dev-hsmd-no-preapprove-check': None, + 'allow-deprecated-apis': True, + 'allow_bad_gossip': True, + 'broken_log': '.*', # plugin-topology: DEPRECATED API USED: *, lightningd-3: had memleak messages, lightningd: MEMLEAK:, lightningd: init_cupdate for unknown scid etc. + 'dev-bitcoind-poll': 3, # Default 1; increased to avoid rpc failures + }.copy() + for i in range(6) + ] + l1, l2, l3, l4, l5, l6 = node_factory.get_nodes(6, opts=options) + # Upgrade wallet + # Write the data/p2sh_wallet_hsm_secret to the hsm_path, so node can spend funds at p2sh_wrapped_addr + p2sh_wrapped_addr = '2N2V4ee2vMkiXe5FSkRqFjQhiS9hKqNytv3' + update_example(node=l1, method='upgradewallet', params={}) + txid = bitcoind.rpc.sendtoaddress(p2sh_wrapped_addr, 20000000 / 10 ** 8) + bitcoind.generate_block(1) + l1.daemon.wait_for_log('Owning output .* txid {} CONFIRMED'.format(txid)) + # Doing it with 'reserved ok' should have 1. We use a big feerate so we can get over the RBF hump + update_example(node=l1, method='upgradewallet', params={'feerate': 'urgent', 'reservedok': True}) + + # Fund node wallets for further transactions + fund_nodes = [l1, l2, l3, l4, l5] + for node in fund_nodes: + node.fundwallet(FUND_WALLET_AMOUNT_SAT) + # Connect nodes and fund channels + update_example(node=l2, method='getinfo', params={}) + update_example(node=l1, method='connect', params={'id': l2.info['id'], 'host': 'localhost', 'port': l2.daemon.port}) + update_example(node=l2, method='connect', params={'id': l3.info['id'], 'host': 'localhost', 'port': l3.daemon.port}) + l3.rpc.connect(l4.info['id'], 'localhost', l4.port) + l2.rpc.connect(l5.info['id'], 'localhost', l5.port) + c12, _ = l1.fundchannel(l2, FUND_CHANNEL_AMOUNT_SAT) + c23, c23res = l2.fundchannel(l3, FUND_CHANNEL_AMOUNT_SAT) + c34, _ = l3.fundchannel(l4, FUND_CHANNEL_AMOUNT_SAT) + c25, _ = l2.fundchannel(l5, announce_channel=False) + mine_funding_to_announce(bitcoind, [l1, l2, l3, l4]) + l1.wait_channel_active(c12) + l1.wait_channel_active(c23) + l1.wait_channel_active(c34) + # Balance these newly opened channels + l1.rpc.pay(l2.rpc.invoice('500000sat', 'lbl balance l1 to l2', 'description send some sats l1 to l2')['bolt11']) + l2.rpc.pay(l3.rpc.invoice('500000sat', 'lbl balance l2 to l3', 'description send some sats l2 to l3')['bolt11']) + l2.rpc.pay(l5.rpc.invoice('500000sat', 'lbl balance l2 to l5', 'description send some sats l2 to l5')['bolt11']) + l3.rpc.pay(l4.rpc.invoice('500000sat', 'lbl balance l3 to l4', 'description send some sats l3 to l4')['bolt11']) + return l1, l2, l3, l4, l5, l6, c12, c23, c25, c34, c23res + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in setting up nodes: {e}') + + +def generate_transactions_examples(l1, l2, l3, l4, l5, c25, bitcoind): + """Generate examples for various transactions and forwards""" + try: + logger.info('Simple Transactions Start...') + global FUND_CHANNEL_AMOUNT_SAT + # Simple Transactions by creating invoices, paying invoices, keysends + inv_l31 = update_example(node=l3, method='invoice', params={'amount_msat': 10**4, 'label': 'lbl_l31', 'description': 'Invoice description l31'}) + route_l1_l3 = update_example(node=l1, method='getroute', params={'id': l3.info['id'], 'amount_msat': 10**4, 'riskfactor': 1})['route'] + inv_l32 = update_example(node=l3, method='invoice', params={'amount_msat': '50000msat', 'label': 'lbl_l32', 'description': 'l32 description'}) + update_example(node=l2, method='getroute', params={'id': l4.info['id'], 'amount_msat': 500000, 'riskfactor': 10, 'cltv': 9}) + update_example(node=l1, method='sendpay', params={'route': route_l1_l3, 'payment_hash': inv_l31['payment_hash'], 'payment_secret': inv_l31['payment_secret']}) + update_example(node=l1, method='waitsendpay', params={'payment_hash': inv_l31['payment_hash']}) + update_example(node=l1, method='keysend', params={'destination': l3.info['id'], 'amount_msat': 10000}) + update_example(node=l1, method='keysend', params={'destination': l4.info['id'], 'amount_msat': 10000000, 'extratlvs': {'133773310': '68656c6c6f776f726c64', '133773312': '66696c7465726d65'}}) + routehints = [[{ + 'scid': only_one([channel for channel in l2.rpc.listpeerchannels()['channels'] if channel['peer_id'] == l3.info['id']])['alias']['remote'], + 'id': l2.info['id'], + 'feebase': '1msat', + 'feeprop': 10, + 'expirydelta': 9, + }]] + update_example(node=l1, method='keysend', params={'destination': l3.info['id'], 'amount_msat': 10000, 'routehints': routehints}) + inv_l11 = l1.rpc.invoice('10000msat', 'lbl_l11', 'l11 description') + inv_l21 = l2.rpc.invoice('any', 'lbl_l21', 'l21 description') + inv_l22 = l2.rpc.invoice('200000msat', 'lbl_l22', 'l22 description') + inv_l33 = l3.rpc.invoice('100000msat', 'lbl_l33', 'l33 description') + inv_l34 = l3.rpc.invoice(4000, 'failed', 'failed description') + update_example(node=l1, method='pay', params=[inv_l32['bolt11']]) + update_example(node=l2, method='pay', params={'bolt11': inv_l33['bolt11']}) + + # Hops, create and send onion for onion routing + def truncate_encode(i: int): + """Encode a tu64 (or tu32 etc) value""" + try: + ret = struct.pack("!Q", i) + while ret.startswith(b'\0'): + ret = ret[1:] + return ret + except Exception as e: + logger.error(f'Error in encoding: {e}') + + def serialize_payload_tlv(n, blockheight: int = 0): + """Serialize payload according to BOLT #4: Onion Routing Protocol""" + try: + block, tx, out = n['channel'].split('x') + payload = TlvPayload() + b = BytesIO() + b.write(truncate_encode(int(n['amount_msat']))) + payload.add_field(2, b.getvalue()) + b = BytesIO() + b.write(truncate_encode(blockheight + n['delay'])) + payload.add_field(4, b.getvalue()) + b = BytesIO() + b.write(struct.pack("!Q", int(block) << 40 | int(tx) << 16 | int(out))) + payload.add_field(6, b.getvalue()) + return payload.to_bytes().hex() + except Exception as e: + logger.error(f'Error in serializing payload: {e}') + + def serialize_payload_final_tlv(n, payment_secret: str, blockheight: int = 0): + """Serialize the last payload according to BOLT #4: Onion Routing Protocol""" + try: + payload = TlvPayload() + b = BytesIO() + b.write(truncate_encode(int(n['amount_msat']))) + payload.add_field(2, b.getvalue()) + b = BytesIO() + b.write(truncate_encode(blockheight + n['delay'])) + payload.add_field(4, b.getvalue()) + b = BytesIO() + b.write(bytes.fromhex(payment_secret)) + b.write(truncate_encode(int(n['amount_msat']))) + payload.add_field(8, b.getvalue()) + return payload.to_bytes().hex() + except Exception as e: + logger.error(f'Error in serializing final payload: {e}') + + blockheight = l1.rpc.getinfo()['blockheight'] + amt = 10**3 + route = l1.rpc.getroute(l4.info['id'], amt, 10)['route'] + inv = l4.rpc.invoice(amt, "lbl l4", "desc l4") + first_hop = route[0] + hops = [] + for h, n in zip(route[:-1], route[1:]): + hops.append({'pubkey': h['id'], 'payload': serialize_payload_tlv(n, blockheight)}) + hops.append({'pubkey': route[-1]['id'], 'payload': serialize_payload_final_tlv(route[-1], inv['payment_secret'], blockheight)}) + onion = update_example(node=l1, method='createonion', params={'hops': hops, 'assocdata': inv['payment_hash']}) + update_example(node=l1, method='createonion', params=[hops, inv['payment_hash'], '41' * 32]) + update_example(node=l1, method='sendonion', params={'onion': onion['onion'], 'first_hop': first_hop, 'payment_hash': inv['payment_hash']}) + l1.rpc.waitsendpay(payment_hash=inv['payment_hash']) + + # Close channels examples + update_example(node=l2, method='close', params={'id': l3.info['id'], 'unilateraltimeout': 1}) + update_example(node=l3, method='close', params={'id': l4.info['id'], 'destination': l4.rpc.newaddr()['bech32']}) + bitcoind.generate_block(1) + sync_blockheight(bitcoind, [l1, l2, l3, l4]) + + # Channel 2 to 3 is closed, l1->l3 payment will fail where `failed` forward will be saved on l2 + l1.rpc.sendpay(route_l1_l3, inv_l34['payment_hash'], payment_secret=inv_l34['payment_secret']) + with pytest.raises(RpcError): + l1.rpc.waitsendpay(inv_l34['payment_hash']) + + # Reopen channels for further examples + c23, _ = l2.fundchannel(l3, FUND_CHANNEL_AMOUNT_SAT) + l3.fundchannel(l4, FUND_CHANNEL_AMOUNT_SAT) + mine_funding_to_announce(bitcoind, [l3, l4]) + l2.wait_channel_active(c23) + update_example(node=l2, method='setchannel', params={'id': c23, 'ignorefeelimits': True}) + update_example(node=l2, method='setchannel', params={'id': c25, 'feebase': 4000, 'feeppm': 300, 'enforcedelay': 0}) + + # Some more invoices for signing and preapproving + inv_l12 = l1.rpc.invoice(1000, 'label inv_l12', 'description inv_l12')['bolt11'] + inv_l24 = l2.rpc.invoice(123000, 'label inv_l24', 'description inv_l24', 3600)['bolt11'] + inv_l25 = l2.rpc.invoice(124000, 'label inv_l25', 'description inv_l25', 3600)['bolt11'] + inv_l26 = l2.rpc.invoice(125000, 'label inv_l26', 'description inv_l26', 3600)['bolt11'] + update_example(node=l2, method='signinvoice', params={'invstring': inv_l12}) + update_example(node=l3, method='signinvoice', params=[inv_l26]) + update_example(node=l1, method='preapprovekeysend', params={'destination': l2.info['id'], 'payment_hash': '00' * 32, 'amount_msat': 1000}) + update_example(node=l5, method='preapprovekeysend', params=[l5.info['id'], '01' * 32, 2000]) + update_example(node=l1, method='preapproveinvoice', params={'bolt11': inv_l24}) + update_example(node=l1, method='preapproveinvoice', params=[inv_l25]) + inv_req = update_example(node=l2, method='invoicerequest', params={'amount': 1000000, 'description': 'Simple test'}) + update_example(node=l1, method='sendinvoice', params={'invreq': inv_req['bolt12'], 'label': 'test sendinvoice'}) + inv_l13 = l1.rpc.invoice(amount_msat=100000, label='lbl_l13', description='l13 description', preimage='01' * 32) + update_example(node=l2, method='createinvoice', params={'invstring': inv_l13['bolt11'], 'label': 'lbl_l13', 'preimage': '01' * 32}) + logger.info('Simple Transactions Done!') + return inv_l11, inv_l21, inv_l22, inv_l31, inv_l32, inv_l34 + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating transactions examples: {e}') + + +def generate_runes_examples(l1, l2, l3): + """Covers all runes related examples""" + try: + logger.info('Runes Start...') + # Runes + trimmed_id = l1.info['id'][:20] + rune_l21 = update_example(node=l2, method='createrune', params={}, description=['This creates a fresh rune which can do anything:']) + rune_l22 = update_example(node=l2, method='createrune', params={'rune': rune_l21['rune'], 'restrictions': 'readonly'}, + description=['We can add restrictions to that rune, like so:', + '', + 'The `readonly` restriction is a short-cut for two restrictions:', + '', + '1: `[\'method^list\', \'method^get\', \'method=summary\']`: You may call list, get or summary.', + '', + '2: `[\'method/listdatastore\']`: But not listdatastore: that contains sensitive stuff!' + ]) + update_example(node=l2, method='createrune', params={'rune': rune_l21['rune'], 'restrictions': [['method^list', 'method^get', 'method=summary'], ['method/listdatastore']]}, description=['We can do the same manually (readonly), like so:']) + rune_l23 = update_example(node=l2, method='createrune', params={'restrictions': [[f'id^{trimmed_id}'], ['method=listpeers']]}, description=[f'This will allow the rune to be used for id starting with {trimmed_id}, and for the method listpeers:']) + rune_l24 = update_example(node=l2, method='createrune', params={'restrictions': [['method=pay'], ['pnameamountmsat<10000']]}, description=['This will allow the rune to be used for the method pay, and for the parameter amount\\_msat to be less than 10000:']) + update_example(node=l2, method='createrune', params={'restrictions': [[f'id={l1.info["id"]}'], ['method=listpeers'], ['pnum=1'], [f'pnameid={l1.info["id"]}', f'parr0={l1.info["id"]}']]}, description=["Let's create a rune which lets a specific peer run listpeers on themselves:"]) + rune_l25 = update_example(node=l2, method='createrune', params={'restrictions': [[f'id={l1.info["id"]}'], ['method=listpeers'], ['pnum=1'], [f'pnameid^{trimmed_id}', f'parr0^{trimmed_id}']]}, description=["This allows `listpeers` with 1 argument (`pnum=1`), which is either by name (`pnameid`), or position (`parr0`). We could shorten this in several ways: either allowing only positional or named parameters, or by testing the start of the parameters only. Here's an example which only checks the first 10 bytes of the `listpeers` parameter:"]) + update_example(node=l2, method='createrune', params=[rune_l25['rune'], [['time<"$(($(date +%s) + 24*60*60))"', 'rate=2']]], description=["Before we give this to our peer, let's add two more restrictions: that it only be usable for 24 hours from now (`time<`), and that it can only be used twice a minute (`rate=2`). `date +%s` can give us the current time in seconds:"]) + update_example(node=l2, method='commando-listrunes', params={'rune': rune_l23['rune']}) + update_example(node=l2, method='commando-listrunes', params={}) + update_example(node=l1, method='commando', params={'peer_id': l2.info['id'], 'rune': rune_l22['rune'], 'method': 'getinfo', 'params': {}}) + update_example(node=l1, method='commando', params={'peer_id': l2.info['id'], 'rune': rune_l23['rune'], 'method': 'listpeers', 'params': [l3.info['id']]}) + inv_l23 = l2.rpc.invoice('any', 'lbl_l23', 'l23 description') + update_example(node=l1, method='commando', params={'peer_id': l2.info['id'], 'rune': rune_l24['rune'], 'method': 'pay', 'params': {'bolt11': inv_l23['bolt11'], 'amount_msat': 9900}}) + update_example(node=l2, method='checkrune', params={'nodeid': l2.info['id'], 'rune': rune_l22['rune'], 'method': 'listpeers', 'params': {}}) + update_example(node=l2, method='checkrune', params={'nodeid': l2.info['id'], 'rune': rune_l24['rune'], 'method': 'pay', 'params': {'amount_msat': 9999}}) + update_example(node=l2, method='showrunes', params={'rune': rune_l21['rune']}) + update_example(node=l2, method='showrunes', params={}) + update_example(node=l2, method='commando-blacklist', params={'start': 1}) + update_example(node=l2, method='commando-blacklist', params={'start': 2, 'end': 3}) + update_example(node=l2, method='blacklistrune', params={'start': 1}) + update_example(node=l2, method='blacklistrune', params={'start': 0, 'end': 2}) + update_example(node=l2, method='blacklistrune', params={'start': 3, 'end': 4}) + + # Commando runes + rune_l11 = update_example(node=l1, method='commando-rune', params={}, description=['This creates a fresh rune which can do anything:']) + update_example(node=l1, method='commando-rune', params={'rune': rune_l11['rune'], 'restrictions': 'readonly'}, + description=['We can add restrictions to that rune, like so:', + '', + 'The `readonly` restriction is a short-cut for two restrictions:', + '', + '1: `[\'method^list\', \'method^get\', \'method=summary\']`: You may call list, get or summary.', + '', + '2: `[\'method/listdatastore\']`: But not listdatastore: that contains sensitive stuff!' + ]) + update_example(node=l1, method='commando-rune', params={'rune': rune_l11['rune'], 'restrictions': [['method^list', 'method^get', 'method=summary'], ['method/listdatastore']]}, description=['We can do the same manually (readonly), like so:']) + update_example(node=l1, method='commando-rune', params={'restrictions': [[f'id^{trimmed_id}'], ['method=listpeers']]}, description=[f'This will allow the rune to be used for id starting with {trimmed_id}, and for the method listpeers:']) + update_example(node=l1, method='commando-rune', params={'restrictions': [['method=pay'], ['pnameamountmsat<10000']]}, description=['This will allow the rune to be used for the method pay, and for the parameter amount\\_msat to be less than 10000:']) + update_example(node=l1, method='commando-rune', params={'restrictions': [[f'id={l1.info["id"]}'], ['method=listpeers'], ['pnum=1'], [f'pnameid={l1.info["id"]}', f'parr0={l1.info["id"]}']]}, description=["Let's create a rune which lets a specific peer run listpeers on themselves:"]) + rune_l15 = update_example(node=l1, method='commando-rune', params={'restrictions': [[f'id={l1.info["id"]}'], ['method=listpeers'], ['pnum=1'], [f'pnameid^{trimmed_id}', f'parr0^{trimmed_id}']]}, description=["This allows `listpeers` with 1 argument (`pnum=1`), which is either by name (`pnameid`), or position (`parr0`). We could shorten this in several ways: either allowing only positional or named parameters, or by testing the start of the parameters only. Here's an example which only checks the first 10 bytes of the `listpeers` parameter:"]) + update_example(node=l1, method='commando-rune', params=[rune_l15['rune'], [['time<"$(($(date +%s) + 24*60*60))"', 'rate=2']]], description=["Before we give this to our peer, let's add two more restrictions: that it only be usable for 24 hours from now (`time<`), and that it can only be used twice a minute (`rate=2`). `date +%s` can give us the current time in seconds:"]) + logger.info('Runes Done!') + return rune_l21 + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating runes examples: {e}') + + +def generate_datastore_examples(l2): + """Covers all datastore related examples""" + try: + logger.info('Datastore Start...') + update_example(node=l2, method='datastore', params={'key': 'somekey', 'hex': '61', 'mode': 'create-or-append'}) + update_example(node=l2, method='datastore', params={'key': ['test', 'name'], 'string': 'saving data to the store', 'mode': 'must-create'}) + update_example(node=l2, method='datastore', params={'key': 'otherkey', 'string': 'foo', 'mode': 'must-create'}) + update_example(node=l2, method='datastore', params={'key': 'otherkey', 'string': 'bar', 'mode': 'must-append', 'generation': 0}) + update_example(node=l2, method='datastoreusage', params={}) + update_example(node=l2, method='datastoreusage', params={'key': ['test', 'name']}) + update_example(node=l2, method='datastoreusage', params={'key': 'otherkey'}) + update_example(node=l2, method='listdatastore', params={'key': ['test']}) + update_example(node=l2, method='listdatastore', params={'key': 'otherkey'}) + update_example(node=l2, method='deldatastore', params={'key': ['test', 'name']}) + update_example(node=l2, method='deldatastore', params={'key': 'otherkey', 'generation': 1}) + logger.info('Datastore Done!') + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating datastore examples: {e}') + + +def generate_bookkeeper_examples(l2, l3, c23_chan_id): + """Generates all bookkeeper rpc examples""" + try: + logger.info('Bookkeeper Start...') + update_example(node=l2, method='funderupdate', params={}) + update_example(node=l2, method='funderupdate', params={'policy': 'fixed', 'policy_mod': '50000sat', 'min_their_funding_msat': 1000, 'per_channel_min_msat': '1000sat', 'per_channel_max_msat': '500000sat', 'fund_probability': 100, 'fuzz_percent': 0, 'leases_only': False}) + update_example(node=l2, method='bkpr-inspect', params={'account': c23_chan_id}) + update_example(node=l2, method='bkpr-dumpincomecsv', params=['koinly', 'koinly.csv']) + update_example(node=l2, method='bkpr-channelsapy', params={}) + update_example(node=l3, method='bkpr-listbalances', params={}) + update_example(node=l3, method='bkpr-listaccountevents', params={}) + update_example(node=l3, method='bkpr-listaccountevents', params=[c23_chan_id]) + update_example(node=l3, method='bkpr-listincome', params={}) + update_example(node=l3, method='bkpr-listincome', params={'consolidate_fees': False}) + logger.info('Bookkeeper Done!') + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating bookkeeper examples: {e}') + + +def generate_offers_renepay_examples(l1, l2, inv_l21, inv_l34): + """Covers all offers and renepay related examples""" + try: + logger.info('Offers and Renepay Start...') + + # Offers & Offers Lists + offer_l21 = update_example(node=l2, method='offer', params={'amount': '10000msat', 'description': 'Fish sale!'}) + offer_l22 = update_example(node=l2, method='offer', params={'amount': '1000sat', 'description': 'Coffee', 'quantity_max': 10}) + offer_l23 = l2.rpc.offer('2000sat', 'Offer to Disable') + update_example(node=l1, method='fetchinvoice', params={'offer': offer_l21['bolt12'], 'payer_note': 'Thanks for the fish!'}) + update_example(node=l1, method='fetchinvoice', params={'offer': offer_l22['bolt12'], 'amount_msat': 2000000, 'quantity': 2}) + update_example(node=l2, method='disableoffer', params={'offer_id': offer_l23['offer_id']}) + update_example(node=l2, method='listoffers', params={'active_only': True}) + update_example(node=l2, method='listoffers', params=[offer_l23['offer_id']]) + + # Invoice Requests + inv_req_l1_l22 = update_example(node=l2, method='invoicerequest', params={'amount': '10000sat', 'description': 'Requesting for invoice', 'issuer': 'clightning store'}) + update_example(node=l2, method='disableinvoicerequest', params={'invreq_id': inv_req_l1_l22['invreq_id']}) + update_example(node=l2, method='listinvoicerequests', params=[inv_req_l1_l22['invreq_id']]) + update_example(node=l2, method='listinvoicerequests', params={}) + + # Renepay + update_example(node=l1, method='renepay', params={'invstring': inv_l21['bolt11'], 'amount_msat': 400000}) + update_example(node=l2, method='renepay', params={'invstring': inv_l34['bolt11']}) + update_example(node=l1, method='renepaystatus', params={'invstring': inv_l21['bolt11']}) + logger.info('Offers and Renepay Done!') + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating offers or renepay examples: {e}') + + +def generate_list_examples(l1, l2, l3, c12, c23, inv_l31, inv_l32): + """Generates lists rpc examples""" + try: + logger.info('Lists Start...') + + # Transactions Lists + update_example(node=l1, method='listfunds', params={}) + update_example(node=l2, method='listforwards', params={'in_channel': c12, 'out_channel': c23, 'status': 'settled'}) + update_example(node=l2, method='listforwards', params={}) + update_example(node=l2, method='listinvoices', params={'label': 'lbl_l21'}) + update_example(node=l2, method='listinvoices', params={}) + update_example(node=l1, method='listhtlcs', params=[c12]) + update_example(node=l1, method='listhtlcs', params={}) + update_example(node=l1, method='listsendpays', params={'bolt11': inv_l31['bolt11']}) + update_example(node=l1, method='listsendpays', params={}) + update_example(node=l1, method='listtransactions', params={}) + update_example(node=l2, method='listpays', params={'bolt11': inv_l32['bolt11']}) + update_example(node=l2, method='listpays', params={}) + update_example(node=l3, method='listclosedchannels', params={}) + + # Network & Nodes Lists + update_example(node=l2, method='listconfigs', params={'config': 'network'}) + update_example(node=l2, method='listconfigs', params={'config': 'experimental-dual-fund'}) + # Schema checker error: listconfigs.json: Additional properties are not allowed ('plugin' was unexpected) + l2.rpc.jsonschemas = {} + update_example(node=l2, method='listconfigs', params={}) + update_example(node=l2, method='listsqlschemas', params={'table': 'offers'}) + update_example(node=l2, method='listsqlschemas', params=['closedchannels']) + update_example(node=l1, method='listpeerchannels', params={'id': l2.info['id']}) + update_example(node=l1, method='listpeerchannels', params={}) + update_example(node=l1, method='listchannels', params={'short_channel_id': c12}) + update_example(node=l1, method='listchannels', params={}) + update_example(node=l2, method='listnodes', params={'id': l3.info['id']}) + update_example(node=l2, method='listnodes', params={}) + update_example(node=l2, method='listpeers', params={'id': l3.info['id']}) + update_example(node=l2, method='listpeers', params={}) + logger.info('Lists Done!') + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating lists examples: {e}') + + +def generate_wait_examples(l1, l2, bitcoind, executor): + """Generates wait examples""" + try: + logger.info('Wait Start...') + inv1 = l2.rpc.invoice(1000, 'inv1', 'inv1') + inv2 = l2.rpc.invoice(2000, 'inv2', 'inv2') + inv3 = l2.rpc.invoice(3000, 'inv3', 'inv3') + inv4 = l2.rpc.invoice(4000, 'inv4', 'inv4') + inv5 = l2.rpc.invoice(5000, 'inv5', 'inv5') + + # Wait invoice + wi3 = executor.submit(l2.rpc.waitinvoice, 'inv3') + time.sleep(1) + l1.rpc.pay(inv2['bolt11']) + time.sleep(1) + wi2res = executor.submit(l2.rpc.waitinvoice, 'inv2').result(timeout=5) + update_example(node=l2, method='waitinvoice', params={'label': 'inv2'}, res=wi2res, execute=False) + + l1.rpc.pay(inv3['bolt11']) + wi3res = wi3.result(timeout=5) + update_example(node=l2, method='waitinvoice', params=['inv3'], res=wi3res, execute=False) + + # Wait any invoice + wai = executor.submit(l2.rpc.waitanyinvoice) + time.sleep(1) + l1.rpc.pay(inv5['bolt11']) + l1.rpc.pay(inv4['bolt11']) + waires = wai.result(timeout=5) + update_example(node=l2, method='waitanyinvoice', params={}, res=waires, execute=False) + pay_index = waires['pay_index'] + wai_pay_index_res = executor.submit(l2.rpc.waitanyinvoice, pay_index, 0).result(timeout=5) + update_example(node=l2, method='waitanyinvoice', params={'lastpay_index': pay_index, 'timeout': 0}, res=wai_pay_index_res, execute=False) + + # Wait with subsystem examples + update_example(node=l2, method='wait', params={'subsystem': 'invoices', 'indexname': 'created', 'nextvalue': 0}) + + wspres_l1 = l1.rpc.wait(subsystem='sendpays', indexname='created', nextvalue=0) + nextvalue = int(wspres_l1['created']) + 1 + wsp_created_l1 = executor.submit(l1.rpc.call, 'wait', {'subsystem': 'sendpays', 'indexname': 'created', 'nextvalue': nextvalue}) + wsp_updated_l1 = executor.submit(l1.rpc.call, 'wait', {'subsystem': 'sendpays', 'indexname': 'updated', 'nextvalue': nextvalue}) + time.sleep(1) + routestep = { + 'amount_msat': 1000, + 'id': l2.info['id'], + 'delay': 5, + 'channel': first_scid(l1, l2) + } + l1.rpc.sendpay([routestep], inv1['payment_hash'], payment_secret=inv1['payment_secret']) + wspc_res = wsp_created_l1.result(5) + wspu_res = wsp_updated_l1.result(5) + update_example(node=l1, method='wait', params={'subsystem': 'sendpays', 'indexname': 'created', 'nextvalue': nextvalue}, res=wspc_res, execute=False) + update_example(node=l1, method='wait', params=['sendpays', 'updated', nextvalue], res=wspu_res, execute=False) + + # Wait blockheight + curr_blockheight = l2.rpc.getinfo()['blockheight'] + update_example(node=l2, method='waitblockheight', params={'blockheight': curr_blockheight - 1, 'timeout': 600}) + wait_time = 60 + wbh = executor.submit(l2.rpc.waitblockheight, curr_blockheight + 1, wait_time) + bitcoind.generate_block(1) + sync_blockheight(bitcoind, [l2]) + wbhres = wbh.result(5) + update_example(node=l2, method='waitblockheight', params={'blockheight': curr_blockheight + 1}, res=wbhres, execute=False) + logger.info('Wait Done!') + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating wait examples: {e}') + + +def generate_utils_examples(l1, l2, l3, l4, l5, l6, c23, c34, inv_l11, inv_l22, rune_l21, bitcoind): + """Generates other utilities examples""" + try: + logger.info('General Utils Start...') + global CWD, FUND_CHANNEL_AMOUNT_SAT + update_example(node=l2, method='batching', params={'enable': True}) + update_example(node=l2, method='ping', params={'id': l1.info['id'], 'len': 128, 'pongbytes': 128}) + update_example(node=l2, method='ping', params={'id': l3.info['id'], 'len': 1000, 'pongbytes': 65535}) + update_example(node=l2, method='help', params={'command': 'pay'}) + update_example(node=l2, method='help', params={'command': 'dev'}) + update_example(node=l2, method='setconfig', params=['autoclean-expiredinvoices-age', 300]) + update_example(node=l2, method='setconfig', params={'config': 'min-capacity-sat', 'val': 500000}) + update_example(node=l2, method='addgossip', params={'message': '010078c3314666731e339c0b8434f7824797a084ed7ca3655991a672da068e2c44cb53b57b53a296c133bc879109a8931dc31e6913a4bda3d58559b99b95663e6d52775579447ef5526300e1bb89bc6af8557aa1c3810a91814eafad6d103f43182e17b16644cb38c1d58a8edd094303959a9f1f9d42ff6c32a21f9c118531f512c8679cabaccc6e39dbd95a4dac90e75a258893c3aa3f733d1b8890174d5ddea8003cadffe557773c54d2c07ca1d535c4bf85885f879ae466c16a516e8ffcfec1740e3f5c98ca9ce13f452e867befef5517f306ed6aa5119b79059bcc6f68f329986b665d16de7bc7df64e3537504c91eeabe0e59d3a2b68e4216ead2b0f6e3ef7c000006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f0000670000010000022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d590266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351802e3bd38009866c9da8ec4aa99cc4ea9c6c0dd46df15c61ef0ce1f271291714e5702324266de8403b3ab157a09f1f784d587af61831c998c151bcc21bb74c2b2314b'}) + update_example(node=l2, method='addgossip', params={'message': '0102420526c8eb62ec6999bbee5f1de4841cab734374ec642b7deeb0259e76220bf82e97a241c907d5ff52019655f7f9a614c285bb35690f3a1a2b928d7b2349a79e06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f000067000001000065b32a0e010100060000000000000000000000010000000a000000003b023380'}) + update_example(node=l2, method='deprecations', params={'enable': True}) + update_example(node=l2, method='deprecations', params={'enable': False}) + update_example(node=l2, method='getlog', params={'level': 'unusual'}) + update_example(node=l2, method='notifications', params={'enable': True}) + update_example(node=l2, method='notifications', params={'enable': False}) + update_example(node=l2, method='check', params={'command_to_check': 'sendpay', 'route': [{'amount_msat': 1011, 'id': l3.info['id'], 'delay': 20, 'channel': c23}, {'amount_msat': 1000, 'id': l4.info['id'], 'delay': 10, 'channel': c34}], 'payment_hash': '0000000000000000000000000000000000000000000000000000000000000000'}) + update_example(node=l2, method='check', params={'command_to_check': 'dev', 'subcommand': 'slowcmd', 'msec': 1000}) + update_example(node=l6, method='check', params={'command_to_check': 'recover', 'hsmsecret': '6c696768746e696e672d31000000000000000000000000000000000000000000'}) + update_example(node=l2, method='plugin', params={'subcommand': 'start', 'plugin': os.path.join(CWD, 'tests/plugins/allow_even_msgs.py')}) + update_example(node=l2, method='plugin', params={'subcommand': 'stop', 'plugin': os.path.join(CWD, 'tests/plugins/allow_even_msgs.py')}) + update_example(node=l2, method='plugin', params=['list']) + update_example(node=l2, method='sendcustommsg', params={'node_id': l3.info['id'], 'msg': '77770012'}) + + # Wallet Utils + address_l21 = update_example(node=l2, method='newaddr', params={}) + address_l22 = update_example(node=l2, method='newaddr', params={'addresstype': 'p2tr'}) + withdraw_l21 = update_example(node=l2, method='withdraw', params={'destination': address_l21['bech32'], 'satoshi': 555555}) + + bitcoind.generate_block(4, wait_for_mempool=[withdraw_l21['txid']]) + sync_blockheight(bitcoind, [l2]) + + funds_l2 = l2.rpc.listfunds() + withdraw_l22 = update_example(node=l2, method='withdraw', params={'destination': address_l22['p2tr'], 'satoshi': 'all', 'feerate': '20000perkb', 'minconf': 0, 'utxos': [f"{funds_l2['outputs'][2]['txid']}:{funds_l2['outputs'][2]['output']}"]}) + bitcoind.generate_block(4, wait_for_mempool=[withdraw_l22['txid']]) + update_example(node=l2, method='multiwithdraw', params={'outputs': [{l1.rpc.newaddr()['bech32']: '2222000msat'}, {l1.rpc.newaddr()['bech32']: '3333000msat'}]}) + update_example(node=l2, method='multiwithdraw', params={'outputs': [{l1.rpc.newaddr('p2tr')['p2tr']: 1000}, {l1.rpc.newaddr()['bech32']: 1000}, {l2.rpc.newaddr()['bech32']: 1000}, {l3.rpc.newaddr()['bech32']: 1000}, {l3.rpc.newaddr()['bech32']: 1000}, {l4.rpc.newaddr('p2tr')['p2tr']: 1000}, {l1.rpc.newaddr()['bech32']: 1000}]}) + l2.rpc.connect(l4.info['id'], 'localhost', l4.port) + l2.rpc.connect(l5.info['id'], 'localhost', l5.port) + update_example(node=l2, method='disconnect', params={'id': l4.info['id'], 'force': False}) + update_example(node=l2, method='disconnect', params={'id': l5.info['id'], 'force': True}) + update_example(node=l2, method='parsefeerate', params=['unilateral_close']) + update_example(node=l2, method='parsefeerate', params=['9999perkw']) + update_example(node=l2, method='parsefeerate', params=[10000]) + update_example(node=l2, method='parsefeerate', params=['urgent']) + update_example(node=l2, method='feerates', params={'style': 'perkw'}) + update_example(node=l2, method='feerates', params={'style': 'perkb'}) + update_example(node=l2, method='signmessage', params={'message': 'this is a test!'}) + update_example(node=l2, method='signmessage', params={'message': 'message for you'}) + update_example(node=l2, method='checkmessage', params={'message': 'testcase to check new rpc error', 'zbase': 'd66bqz3qsku5fxtqsi37j11pci47ydxa95iusphutggz9ezaxt56neh77kxe5hyr41kwgkncgiu94p9ecxiexgpgsz8daoq4tw8kj8yx', 'pubkey': '03be3b0e9992153b1d5a6e1623670b6c3663f72ce6cf2e0dd39c0a373a7de5a3b7'}) + update_example(node=l2, method='checkmessage', params={'message': 'this is a test!', 'zbase': 'd6tqaeuonjhi98mmont9m4wag7gg4krg1f4txonug3h31e9h6p6k6nbwjondnj46dkyausobstnk7fhyy998bhgc1yr98dfmhb4k54d7'}) + update_example(node=l2, method='decodepay', params={'bolt11': inv_l11['bolt11']}) + update_example(node=l2, method='decode', params=[rune_l21['rune']]) + update_example(node=l2, method='decode', params=[inv_l22['bolt11']]) + + # PSBT + amount1 = 1000000 + amount2 = 3333333 + result = update_example(node=l1, method='addpsbtoutput', params={'satoshi': amount1, 'locktime': 111}, description=[f'Here is a command to make a PSBT with a {amount1:,} sat output that leads to the on-chain wallet:']) + update_example(node=l1, method='setpsbtversion', params={'psbt': result['psbt'], 'version': 0}) + result = l1.rpc.addpsbtoutput(amount2, result['psbt']) + update_example(node=l1, method='addpsbtoutput', params=[amount2, result['psbt']], res=result, execute=False) + dest = l1.rpc.newaddr('p2tr')['p2tr'] + result = update_example(node=l1, method='addpsbtoutput', params={'satoshi': amount2, 'initialpsbt': result['psbt'], 'destination': dest}) + l1.rpc.addpsbtoutput(amount2, result['psbt'], None, dest) + update_example(node=l1, method='setpsbtversion', params=[result['psbt'], 2]) + + out_total = Millisatoshi(3000000 * 1000) + funding = l1.rpc.fundpsbt(satoshi=out_total, feerate=7500, startweight=42) + psbt = bitcoind.rpc.decodepsbt(funding['psbt']) + saved_input = psbt['tx']['vin'][0] + l1.rpc.unreserveinputs(funding['psbt']) + psbt = bitcoind.rpc.createpsbt([{'txid': saved_input['txid'], + 'vout': saved_input['vout']}], []) + out_1_ms = Millisatoshi(funding['excess_msat']) + output_psbt = bitcoind.rpc.createpsbt([], [{'bcrt1qeyyk6sl5pr49ycpqyckvmttus5ttj25pd0zpvg': float((out_total + out_1_ms).to_btc())}]) + fullpsbt = bitcoind.rpc.joinpsbts([funding['psbt'], output_psbt]) + l1.rpc.reserveinputs(fullpsbt) + signed_psbt = l1.rpc.signpsbt(fullpsbt)['signed_psbt'] + update_example(node=l1, method='sendpsbt', params={'psbt': signed_psbt}) + + # SQL + update_example(node=l1, filename='sql-template', method='sql', params={'query': 'SELECT id FROM peers'}, description=['A simple peers selection query:']) + update_example(node=l1, filename='sql-template', method='sql', params=[f'SELECT nodeid,last_timestamp FROM nodes WHERE last_timestamp>=1669578892'], description=["A statement containing `=` needs `-o` in shell:"]) + update_example(node=l1, filename='sql-template', method='sql', params=[f"SELECT nodeid FROM nodes WHERE nodeid != x'{l3.info['id']}'"], description=['If you want to get specific nodeid values from the nodes table:']) + update_example(node=l1, filename='sql-template', method='sql', params=[f"SELECT nodeid FROM nodes WHERE nodeid IN (x'{l1.info['id']}', x'{l3.info['id']}')"], description=["If you want to compare a BLOB column, `x'hex'` or `X'hex'` are needed:"]) + update_example(node=l1, filename='sql-template', method='sql', params=['SELECT peer_id, short_channel_id, to_us_msat, total_msat, peerchannels_status.status FROM peerchannels INNER JOIN peerchannels_status ON peerchannels_status.row = peerchannels.rowid'], description=['Related tables are usually referenced by JOIN:']) + update_example(node=l2, filename='sql-template', method='sql', params=['SELECT COUNT(*) FROM forwards'], description=["Simple function usage, in this case COUNT. Strings inside arrays need \", and ' to protect them from the shell:"]) + update_example(node=l1, filename='sql-template', method='sql', params=['SELECT * from peerchannels_features']) + logger.info('General Utils Done!') + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating utils examples: {e}') + + +def generate_splice_examples(node_factory, bitcoind): + """Generates splice related examples""" + try: + logger.info('Splice Start...') + global FUND_WALLET_AMOUNT_SAT, FUND_CHANNEL_AMOUNT_SAT + # Basic setup for l7->l8 + options = [ + { + 'experimental-splicing': None, + 'allow-deprecated-apis': True, + 'allow_bad_gossip': True, + 'broken_log': '.*', + 'dev-bitcoind-poll': 3, + }.copy() + for i in range(2) + ] + l7, l8 = node_factory.get_nodes(2, opts=options) + l7.fundwallet(FUND_WALLET_AMOUNT_SAT) + l7.rpc.connect(l8.info['id'], 'localhost', l8.port) + c1112, _ = l7.fundchannel(l8, FUND_CHANNEL_AMOUNT_SAT) + mine_funding_to_announce(bitcoind, [l7, l8]) + l7.wait_channel_active(c1112) + chan_id = l7.get_channel_id(l8) + + # Splice + funds_result = l7.rpc.fundpsbt('109000sat', 'slow', 166, excess_as_change=True) + result = update_example(node=l7, method='splice_init', params={'channel_id': chan_id, 'relative_amount': 100000, 'initialpsbt': funds_result['psbt']}) + result = update_example(node=l7, method='splice_update', params={'channel_id': chan_id, 'psbt': result['psbt']}) + result = l7.rpc.signpsbt(result['psbt']) + result = update_example(node=l7, method='splice_signed', params={'channel_id': chan_id, 'psbt': result['signed_psbt']}) + + bitcoind.generate_block(1) + sync_blockheight(bitcoind, [l7]) + l7.daemon.wait_for_log(' to CHANNELD_NORMAL') + time.sleep(1) + + # Splice out + funds_result = l7.rpc.addpsbtoutput(100000) + + # Pay with fee by subtracting 5000 from channel balance + result = update_example(node=l7, method='splice_init', params=[chan_id, -105000, funds_result['psbt']]) + result = update_example(node=l7, method='splice_update', params=[chan_id, result['psbt']]) + result = update_example(node=l7, method='splice_signed', params=[chan_id, result['psbt']]) + update_example(node=l7, method='stop', params={}) + logger.info('Splice Done!') + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating splicing examples: {e}') + + +def generate_channels_examples(node_factory, bitcoind, l1, l3, l4, l5): + """Generates fundchannel and openchannel related examples""" + try: + logger.info('Channels Start...') + global FUND_WALLET_AMOUNT_SAT, FUND_CHANNEL_AMOUNT_SAT + # Basic setup for l9->l10 for fundchannel examples + options = [ + { + 'may_reconnect': True, + 'dev-no-reconnect': None, + 'allow-deprecated-apis': True, + 'allow_bad_gossip': True, + 'broken_log': '.*', + 'dev-bitcoind-poll': 3, + }.copy() + for i in range(2) + ] + l9, l10 = node_factory.get_nodes(2, opts=options) + amount = 2 ** 24 + l9.fundwallet(amount + 10000000) + bitcoind.generate_block(1) + wait_for(lambda: len(l9.rpc.listfunds()["outputs"]) != 0) + l9.rpc.connect(l10.info['id'], 'localhost', l10.port) + + fund_start = update_example(node=l9, method='fundchannel_start', params=[l10.info['id'], amount]) + tx_prep = update_example(node=l9, method='txprepare', params=[[{fund_start['funding_address']: amount}]]) + update_example(node=l9, method='fundchannel_cancel', params=[l10.info['id']]) + update_example(node=l9, method='txdiscard', params=[tx_prep['txid']]) + fund_start = update_example(node=l9, method='fundchannel_start', params={'id': l10.info['id'], 'amount': amount}) + tx_prep = update_example(node=l9, method='txprepare', params={'outputs': [{fund_start['funding_address']: amount}]}) + update_example(node=l9, method='fundchannel_complete', params=[l10.info['id'], tx_prep['psbt']]) + update_example(node=l9, method='txsend', params=[tx_prep['txid']]) + l9.rpc.close(l10.info['id']) + + bitcoind.generate_block(1) + sync_blockheight(bitcoind, [l9]) + + amount = 1000000 + fund_start = l9.rpc.fundchannel_start(l10.info['id'], amount) + tx_prep = l9.rpc.txprepare([{fund_start['funding_address']: amount}]) + update_example(node=l9, method='fundchannel_cancel', params={'id': l10.info['id']}) + update_example(node=l9, method='txdiscard', params={'txid': tx_prep['txid']}) + funding_addr = l9.rpc.fundchannel_start(l10.info['id'], amount)['funding_address'] + tx_prep = l9.rpc.txprepare([{funding_addr: amount}]) + update_example(node=l9, method='fundchannel_complete', params={'id': l10.info['id'], 'psbt': tx_prep['psbt']}) + update_example(node=l9, method='txsend', params={'txid': tx_prep['txid']}) + l9.rpc.close(l10.info['id']) + + # Basic setup for l11->l12 for openchannel examples + options = [ + { + 'experimental-dual-fund': None, + 'may_reconnect': True, + 'dev-no-reconnect': None, + 'allow_warning': True, + 'allow-deprecated-apis': True, + 'allow_bad_gossip': True, + 'broken_log': '.*', + 'dev-bitcoind-poll': 3, + }.copy() + for i in range(2) + ] + l11, l12 = node_factory.get_nodes(2, opts=options) + l11.fundwallet(FUND_WALLET_AMOUNT_SAT) + l11.rpc.connect(l12.info['id'], 'localhost', l12.port) + c78res = l11.rpc.fundchannel(l12.info['id'], FUND_CHANNEL_AMOUNT_SAT) + chan_id = c78res['channel_id'] + vins = bitcoind.rpc.decoderawtransaction(c78res['tx'])['vin'] + assert(only_one(vins)) + prev_utxos = ["{}:{}".format(vins[0]['txid'], vins[0]['vout'])] + + l11.daemon.wait_for_log(' to DUALOPEND_AWAITING_LOCKIN') + chan = only_one(l11.rpc.listpeerchannels(l12.info['id'])['channels']) + rate = int(chan['feerate']['perkw']) + next_feerate = '{}perkw'.format(rate * 4) + + # Initiate an RBF + startweight = 42 + 172 + initpsbt = update_example(node=l11, method='utxopsbt', params=[FUND_CHANNEL_AMOUNT_SAT, next_feerate, startweight, prev_utxos, None, True, None, None, True]) + bump = update_example(node=l11, method='openchannel_bump', params=[chan_id, FUND_CHANNEL_AMOUNT_SAT, initpsbt['psbt'], next_feerate]) + + update_example(node=l11, method='openchannel_abort', params={'channel_id': chan_id}) + bump = update_example(node=l11, method='openchannel_bump', params={'channel_id': chan_id, 'amount': FUND_CHANNEL_AMOUNT_SAT, 'initialpsbt': initpsbt['psbt'], 'funding_feerate': next_feerate}) + update = update_example(node=l11, method='openchannel_update', params={'channel_id': chan_id, 'psbt': bump['psbt']}) + signed = update_example(node=l11, method='signpsbt', params={'psbt': update['psbt']}) + update_example(node=l11, method='openchannel_signed', params={'channel_id': chan_id, 'signed_psbt': signed['signed_psbt']}) + + # 5x the feerate to beat the min-relay fee + chan = only_one(l11.rpc.listpeerchannels(l12.info['id'])['channels']) + rate = int(chan['feerate']['perkw']) + next_feerate = '{}perkw'.format(rate * 5) + + # Another RBF with double the channel amount + startweight = 42 + 172 + initpsbt = update_example(node=l11, method='utxopsbt', params={'satoshi': FUND_CHANNEL_AMOUNT_SAT * 2, 'feerate': next_feerate, 'startweight': startweight, 'utxos': prev_utxos, 'reservedok': True, 'excess_as_change': True}) + bump = update_example(node=l11, method='openchannel_bump', params=[chan_id, FUND_CHANNEL_AMOUNT_SAT * 2, initpsbt['psbt'], next_feerate]) + update = update_example(node=l11, method='openchannel_update', params=[chan_id, bump['psbt']]) + signed_psbt = update_example(node=l11, method='signpsbt', params=[update['psbt']])['signed_psbt'] + update_example(node=l11, method='openchannel_signed', params=[chan_id, signed_psbt]) + + bitcoind.generate_block(1) + sync_blockheight(bitcoind, [l11]) + l11.daemon.wait_for_log(' to CHANNELD_NORMAL') + + # Fundpsbt, channelopen init, abort, unreserve + psbt_init = update_example(node=l11, method='fundpsbt', params={'satoshi': FUND_CHANNEL_AMOUNT_SAT, 'feerate': '253perkw', 'startweight': 250, 'reserve': 0}) + start = update_example(node=l11, method='openchannel_init', params={'id': l12.info['id'], 'amount': FUND_CHANNEL_AMOUNT_SAT, 'initialpsbt': psbt_init['psbt']}) + l11.rpc.openchannel_abort(start['channel_id']) + update_example(node=l11, method='unreserveinputs', params={'psbt': psbt_init['psbt'], 'reserve': 200}) + + psbt_init = update_example(node=l11, method='fundpsbt', params={'satoshi': FUND_CHANNEL_AMOUNT_SAT // 2, 'feerate': 'urgent', 'startweight': 166, 'reserve': 0, 'excess_as_change': True, 'min_witness_weight': 110}) + start = update_example(node=l11, method='openchannel_init', params=[l12.info['id'], FUND_CHANNEL_AMOUNT_SAT // 2, psbt_init['psbt']]) + l11.rpc.openchannel_abort(start['channel_id']) + update_example(node=l11, method='unreserveinputs', params=[psbt_init['psbt']]) + + # Reserveinputs + bitcoind.generate_block(1) + sync_blockheight(bitcoind, [l11]) + outputs = l11.rpc.listfunds()['outputs'] + psbt_1 = bitcoind.rpc.createpsbt([{'txid': outputs[0]['txid'], 'vout': outputs[0]['output']}], []) + update_example(node=l11, method='reserveinputs', params={'psbt': psbt_1}) + l11.rpc.unreserveinputs(psbt_1) + psbt_2 = bitcoind.rpc.createpsbt([{'txid': outputs[1]['txid'], 'vout': outputs[1]['output']}], []) + update_example(node=l11, method='reserveinputs', params={'psbt': psbt_2}) + l11.rpc.unreserveinputs(psbt_2) + + # Multifundchannel 1 + l3.rpc.connect(l5.info['id'], 'localhost', l5.port) + l4.rpc.connect(l1.info['id'], 'localhost', l1.port) + c35res = update_example(node=l3, method='fundchannel', params={'id': l5.info['id'], 'amount': FUND_CHANNEL_AMOUNT_SAT, 'announce': True}) + outputs = l4.rpc.listfunds()['outputs'] + utxo = f"{outputs[0]['txid']}:{outputs[0]['output']}" + c41res = update_example(node=l4, method='fundchannel', + params={'id': l1.info['id'], 'amount': 'all', 'feerate': 'normal', 'push_msat': 100000, 'utxos': [utxo]}, + description=[f'This example shows how to to open new channel with peer {l1.info["id"]} from one whole utxo {utxo} (you can use **listfunds** command to get txid and vout):']) + # Close newly funded channels to bring the setup back to initial state + l3.rpc.close(c35res['channel_id']) + print(f'c41res: {c41res}') + l4.rpc.close(c41res['channel_id']) + l3.rpc.disconnect(l5.info['id'], True) + l4.rpc.disconnect(l1.info['id'], True) + + # Multifundchannel 2 + l1.fundwallet(10**8) + l1.rpc.connect(l3.info['id'], 'localhost', l3.port) + l1.rpc.connect(l4.info['id'], 'localhost', l4.port) + l1.rpc.connect(l5.info['id'], 'localhost', l5.port) + multifund_res1 = update_example(node=l1, method='multifundchannel', params={ + 'destinations': + [ + { + 'id': f'{l3.info["id"]}@127.0.0.1:{l3.port}', + 'amount': '20000sat' + }, + { + 'id': f'{l4.info["id"]}@127.0.0.1:{l4.port}', + 'amount': '0.0003btc' + }, + { + 'id': f'{l5.info["id"]}@127.0.0.1:{l5.port}', + 'amount': 'all' + } + ], + 'feerate': '10000perkw', + 'commitment_feerate': '2000perkw' + }, description=[ + 'This example opens three channels at once, with amounts 20,000 sats, 30,000 sats', + 'and the final channel using all remaining funds (actually, capped at 16,777,215 sats', + 'because large-channels is not enabled):' + ]) + for channel in multifund_res1['channel_ids']: + l1.rpc.close(channel['channel_id']) + l1.fundwallet(10**8) + multifund_res2 = update_example(node=l1, method='multifundchannel', params={ + 'destinations': + [ + { + 'id': f'03a389b3a2f7aa6f9f4ccc19f2bd7a2eba83596699e86b715caaaa147fc37f3144@127.0.0.1:{l3.port}', + 'amount': 50000 + }, + { + 'id': f'{l4.info["id"]}@127.0.0.1:{l4.port}', + 'amount': 50000 + }, + { + 'id': f'{l1.info["id"]}@127.0.0.1:{l1.port}', + 'amount': 50000 + } + ], 'minchannels': 1 + }) + # Close newly funded channels to bring the setup back to initial state + for channel in multifund_res2['channel_ids']: + l1.rpc.close(channel['channel_id']) + l1.rpc.disconnect(l3.info['id'], True) + l1.rpc.disconnect(l4.info['id'], True) + l1.rpc.disconnect(l5.info['id'], True) + bitcoind.generate_block(1) + sync_blockheight(bitcoind, [l1, l3, l4, l5]) + logger.info('Channels Done!') + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating fundchannel and openchannel examples: {e}') + + +def generate_autoclean_delete_examples(l1, l2, l3, l4, l5, c12, c23): + """Records autoclean and delete examples""" + try: + logger.info('Auto-clean and Delete Start...') + global FUND_CHANNEL_AMOUNT_SAT + l2.rpc.close(l5.info['id']) + update_example(node=l2, method='dev-forget-channel', params={'id': l5.info['id']}, description=[f'Forget a channel by peer pubkey when only one channel exists with the peer:']) + + # Create invoices for delpay and delinvoice examples + inv_l35 = l3.rpc.invoice('50000sat', 'lbl_l35', 'l35 description') + inv_l36 = l3.rpc.invoice('50000sat', 'lbl_l36', 'l36 description') + inv_l37 = l3.rpc.invoice('50000sat', 'lbl_l37', 'l37 description') + + # For MPP payment from l1 to l4; will use for delpay groupdid and partid example + inv_l41 = l4.rpc.invoice('5000sat', 'lbl_l41', 'l41 description') + l2.rpc.connect(l4.info['id'], 'localhost', l4.port) + c24, _ = l2.fundchannel(l4, FUND_CHANNEL_AMOUNT_SAT) + l2.rpc.pay(l4.rpc.invoice(500000000, 'lbl balance l2 to l4', 'description send some sats l2 to l4')['bolt11']) + # Create two routes; l1->l2->l3->l4 and l1->l2->l4 + route_l1_l4 = l1.rpc.getroute(l4.info['id'], '4000sat', 1)['route'] + route_l1_l2_l4 = [{'amount_msat': '1000sat', 'id': l2.info['id'], 'delay': 5, 'channel': c12}, + {'amount_msat': '1000sat', 'id': l4.info['id'], 'delay': 5, 'channel': c24}] + l1.rpc.sendpay(route_l1_l4, inv_l41['payment_hash'], amount_msat='5000sat', groupid=1, partid=1, payment_secret=inv_l41['payment_secret']) + l1.rpc.sendpay(route_l1_l2_l4, inv_l41['payment_hash'], amount_msat='5000sat', groupid=1, partid=2, payment_secret=inv_l41['payment_secret']) + # Close l2->l4 for initial state + l2.rpc.close(l4.info['id']) + l2.rpc.disconnect(l4.info['id'], True) + + # Delinvoice + l1.rpc.pay(inv_l35['bolt11']) + l1.rpc.pay(inv_l37['bolt11']) + update_example(node=l3, method='delinvoice', params={'label': 'lbl_l36', 'status': 'unpaid'}) + + # invoice already deleted, pay will fail; used for delpay failed example + with pytest.raises(RpcError): + l1.rpc.pay(inv_l36['bolt11']) + + listsendpays_l1 = l1.rpc.listsendpays()['payments'] + sendpay_g1_p1 = next((x for x in listsendpays_l1 if 'groupid' in x and x['groupid'] == 1 and 'partid' in x and x['partid'] == 2), None) + update_example(node=l1, method='delpay', params={'payment_hash': listsendpays_l1[0]['payment_hash'], 'status': 'complete'}) + update_example(node=l1, method='delpay', params=[listsendpays_l1[-1]['payment_hash'], listsendpays_l1[-1]['status']]) + update_example(node=l1, method='delpay', params={'payment_hash': sendpay_g1_p1['payment_hash'], 'status': sendpay_g1_p1['status'], 'groupid': 1, 'partid': 2}) + update_example(node=l3, method='delinvoice', params={'label': 'lbl_l37', 'status': 'paid', 'desconly': True}) + + # Delforward + failed_forwards = l2.rpc.listforwards('failed')['forwards'] + local_failed_forwards = l2.rpc.listforwards('local_failed')['forwards'] + if len(local_failed_forwards) > 0 and 'in_htlc_id' in local_failed_forwards[0]: + update_example(node=l2, method='delforward', params={'in_channel': c12, 'in_htlc_id': local_failed_forwards[0]['in_htlc_id'], 'status': 'local_failed'}) + if len(failed_forwards) > 0 and 'in_htlc_id' in failed_forwards[0]: + update_example(node=l2, method='delforward', params=[c12, failed_forwards[0]['in_htlc_id'], 'failed']) + update_example(node=l2, method='dev-forget-channel', params={'id': l3.info['id'], 'short_channel_id': c23, 'force': True}, description=[f'Forget a channel by short channel id when peer has multiple channels:']) + + # Autoclean + update_example(node=l2, method='autoclean-once', params=['failedpays', 1]) + update_example(node=l2, method='autoclean-once', params=['succeededpays', 1]) + update_example(node=l2, method='autoclean-status', params={'subsystem': 'expiredinvoices'}) + update_example(node=l2, method='autoclean-status', params={}) + logger.info('Auto-clean and Delete Done!') + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating autoclean and delete examples: {e}') + + +def generate_backup_recovery_examples(node_factory, l4, l5, l6): + """Node backup and recovery examples""" + try: + logger.info('Backup and Recovery Start...') + + # New node l13 used for recover example + l13 = node_factory.get_node() + + update_example(node=l5, method='makesecret', params=['73636220736563726574']) + update_example(node=l5, method='makesecret', params={'string': 'scb secret'}) + update_example(node=l4, method='emergencyrecover', params={}) + backup_l4 = update_example(node=l4, method='staticbackup', params={}) + + # Recover channels + l4.stop() + os.unlink(os.path.join(l4.daemon.lightning_dir, TEST_NETWORK, 'lightningd.sqlite3')) + l4.start() + time.sleep(1) + update_example(node=l4, method='recoverchannel', params=[backup_l4['scb']]) + + # Emergency recover + l5.stop() + os.unlink(os.path.join(l5.daemon.lightning_dir, TEST_NETWORK, 'lightningd.sqlite3')) + l5.start() + time.sleep(1) + update_example(node=l5, method='emergencyrecover', params={}) + + # Recover + def get_hsm_secret(n): + """Returns codex32 and hex""" + try: + hsmfile = os.path.join(n.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") + codex32 = subprocess.check_output(["tools/hsmtool", "getcodexsecret", hsmfile, "leet"]).decode('utf-8').strip() + with open(hsmfile, "rb") as f: + hexhsm = f.read().hex() + return codex32, hexhsm + except Exception as e: + logger.error(f'Error in getting hsm secret: {e}') + + _, l6hex = get_hsm_secret(l6) + l13codex32, _ = get_hsm_secret(l13) + update_example(node=l6, method='recover', params={'hsmsecret': l6hex}) + update_example(node=l13, method='recover', params={'hsmsecret': l13codex32}) + logger.info('Backup and Recovery Done!') + except TaskFinished: + raise + except Exception as e: + logger.error(f'Error in generating backup and recovery examples: {e}') + + +@unittest.skipIf(GENERATE_EXAMPLES is not True, 'Generates examples for doc/schema/lightning-*.json files.') +def test_generate_examples(node_factory, bitcoind, executor): + """Re-generates examples for doc/schema/lightning-*.json files""" + try: + global ALL_METHOD_NAMES, ALL_RPC_EXAMPLES, REGENERATING_RPCS, RPCS_STATUS + + def list_all_examples(): + """list all methods used in 'update_example' calls to ensure that all methods are covered""" + try: + global REGENERATING_RPCS + methods = {} + file_path = os.path.abspath(__file__) + + # Parse and traverse this file's content to list all methods & file names + with open(file_path, "r") as file: + file_content = file.read() + tree = ast.parse(file_content) + for node in ast.walk(tree): + if isinstance(node, ast.Call) and isinstance(node.func, ast.Name) and node.func.id == 'update_example': + for keyword in node.keywords: + if (keyword.arg == 'method' and isinstance(keyword.value, ast.Str)) or (keyword.arg == 'filename' and isinstance(keyword.value, ast.Str)): + method_name = keyword.value.s + if method_name not in methods: + methods[method_name] = {'method': method_name, 'num_examples': 1, 'executed': 0} + else: + methods[method_name]['num_examples'] += 1 + return list(methods.values()) + except Exception as e: + logger.error(f'Error in listing all examples: {e}') + + def list_missing_examples(): + """Checks for missing example file or example & log an error if missing.""" + try: + global ALL_METHOD_NAMES + for file_name in os.listdir('doc/schemas'): + if not file_name.endswith('.json'): + continue + file_name_str = str(file_name).replace('lightning-', '').replace('.json', '') + # Log an error if the method is not in the list + if file_name_str not in ALL_METHOD_NAMES: + logger.error(f'Missing File or Example {file_name_str}.') + except Exception as e: + logger.error(f'Error in listing missing examples: {e}') + + def clear_existing_examples(): + """Clear existing examples in JSON files to regenrate them later""" + global REGENERATING_RPCS + for rpc in REGENERATING_RPCS: + try: + global CWD + file_path = os.path.join(CWD, 'doc', 'schemas', f'lightning-{rpc}.json') + with open(file_path, 'r+', encoding='utf-8') as file: + data = json.load(file) + # Deletes the 'examples' key corresponding to the method's file + if 'examples' in data: + del data['examples'] + file.seek(0) + json.dump(data, file, indent=2, ensure_ascii=False) + file.write('\n') + file.truncate() + except FileNotFoundError as fnf_error: + logger.error(f'File not found error {fnf_error} for {file_path}') + except Exception as e: + logger.error(f'Error saving example in file {file_path}: {e}') + logger.info(f'Cleared Examples: {REGENERATING_RPCS}') + return None + + ALL_RPC_EXAMPLES = list_all_examples() + ALL_METHOD_NAMES = [example['method'] for example in ALL_RPC_EXAMPLES] + logger.info(f'This test can reproduce examples for {len(ALL_RPC_EXAMPLES)} methods: {ALL_METHOD_NAMES}') + REGENERATING_RPCS = [rpc.strip() for rpc in os.getenv("REGENERATE").split(',')] if os.getenv("REGENERATE") else ALL_METHOD_NAMES + logger.info(f'Regenerating examples for: {REGENERATING_RPCS}') + RPCS_STATUS = [False] * len(REGENERATING_RPCS) + list_missing_examples() + clear_existing_examples() + l1, l2, l3, l4, l5, l6, c12, c23, c25, c34, c23res = setup_test_nodes(node_factory, bitcoind) + inv_l11, inv_l21, inv_l22, inv_l31, inv_l32, inv_l34 = generate_transactions_examples(l1, l2, l3, l4, l5, c25, bitcoind) + rune_l21 = generate_runes_examples(l1, l2, l3) + generate_datastore_examples(l2) + generate_bookkeeper_examples(l2, l3, c23res['channel_id']) + generate_offers_renepay_examples(l1, l2, inv_l21, inv_l34) + generate_list_examples(l1, l2, l3, c12, c23, inv_l31, inv_l32) + generate_wait_examples(l1, l2, bitcoind, executor) + generate_utils_examples(l1, l2, l3, l4, l5, l6, c23, c34, inv_l11, inv_l22, rune_l21, bitcoind) + generate_splice_examples(node_factory, bitcoind) + generate_channels_examples(node_factory, bitcoind, l1, l3, l4, l5) + generate_autoclean_delete_examples(l1, l2, l3, l4, l5, c12, c23) + generate_backup_recovery_examples(node_factory, l4, l5, l6) + logger.info('All examples generated successfully!') + except TaskFinished as m: + logger.info(m) + except Exception as e: + # FIXME: The test passes but with flaky errors: + # 1: plugin-bcliBROKEN: bitcoin-cli -regtest -datadir=/tmp/ltests-65999628/test_generate_examples_1/lightning-6/ -rpcclienttimeout=60 -rpcport=57425 -rpcuser=... -stdinrpcpass getblockhash 159 exited 1 (after 60 other errors) + # 'Error: Specified data directory \"/tmp/ltests-65999628/test_generate_examples_1/lightning-6/\" does not exist.\n'; we have been retrying command for --bitcoin-retry-timeout=60 seconds; bitcoind setup or our --bitcoin-* configs broken? + # 2: Node /tmp/ltests-joqzs3fy/test_generate_examples_1/lightning-3/ has memory leaks: [{"subdaemon": "lightningd"}] + logger.error(e) diff --git a/tests/plugins/bookkeeper_custom_coins.py b/tests/plugins/bookkeeper_custom_coins.py new file mode 100755 index 000000000000..9c8f3181cec7 --- /dev/null +++ b/tests/plugins/bookkeeper_custom_coins.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +from pyln.client import Plugin + + +plugin = Plugin() + + +UTXO_DEPOSIT_TAG = "utxo_deposit" +UTXO_SPEND_TAG = "utxo_spend" + + +@plugin.method("sendspend") +def emit_spend(plugin, acct, outpoint, txid, amount, **kwargs): + """Emit a 'utxo_spend' movement + """ + utxo_spend = { + "account": acct, + "outpoint": outpoint, + "spending_txid": txid, + "amount_msat": amount, + "coin_type": "bcrt", + "timestamp": 1679955976, + "blockheight": 111, + } + plugin.notify(UTXO_SPEND_TAG, {UTXO_SPEND_TAG: utxo_spend}) + + +@plugin.method("senddeposit") +def emit_deposit(plugin, acct, is_withdraw, outpoint, amount, **kwargs): + """Emit a 'utxo_deposit' movement + """ + transfer_from = None + + if is_withdraw: + acct = "external" + transfer_from = acct + + utxo_deposit = { + "account": acct, + "transfer_from": transfer_from, + "outpoint": outpoint, + "amount_msat": amount, + "coin_type": "bcrt", + "timestamp": 1679955976, + "blockheight": 111, + } + plugin.notify(UTXO_DEPOSIT_TAG, {UTXO_DEPOSIT_TAG: utxo_deposit}) + + +plugin.add_notification_topic(UTXO_DEPOSIT_TAG) +plugin.add_notification_topic(UTXO_SPEND_TAG) +plugin.run() diff --git a/tests/plugins/test_libplugin.c b/tests/plugins/test_libplugin.c index d95f43a5e8fb..71a306b512b2 100644 --- a/tests/plugins/test_libplugin.c +++ b/tests/plugins/test_libplugin.c @@ -6,10 +6,18 @@ #include #include -static char *somearg; -static bool self_disable = false; -static bool dont_shutdown = false; -static u32 dynamic_opt = 7; +/* Stash this in plugin's data */ +struct test_libplugin { + char *somearg; + bool self_disable; + bool dont_shutdown; + u32 dynamic_opt; +}; + +static struct test_libplugin *get_test_libplugin(struct plugin *plugin) +{ + return plugin_get_data(plugin, struct test_libplugin); +} static struct command_result *get_ds_done(struct command *cmd, const char *val, @@ -94,9 +102,10 @@ static struct command_result *json_shutdown(struct command *cmd, const char *buf, const jsmntok_t *params) { + struct test_libplugin *tlp = get_test_libplugin(cmd->plugin); plugin_log(cmd->plugin, LOG_DBG, "shutdown called"); - if (dont_shutdown) + if (tlp->dont_shutdown) return notification_handled(cmd); plugin_exit(cmd->plugin, 0); @@ -202,13 +211,14 @@ static const char *init(struct plugin *p, { const char *name, *err_str, *err_hex; const u8 *binname; + struct test_libplugin *tlp = get_test_libplugin(p); plugin_log(p, LOG_DBG, "test_libplugin initialised!"); - if (somearg) - plugin_log(p, LOG_DBG, "somearg = %s", somearg); - somearg = tal_free(somearg); + if (tlp->somearg) + plugin_log(p, LOG_DBG, "somearg = %s", tlp->somearg); + tlp->somearg = tal_free(tlp->somearg); - if (self_disable) + if (tlp->self_disable) return "Disabled via selfdisable option"; /* Test rpc_scan_datastore funcs */ @@ -233,34 +243,20 @@ static const char *init(struct plugin *p, static const struct plugin_command commands[] = { { "helloworld", - "utils", - "Say hello to the world.", - "Returns 'hello world' by default, 'hello {name}' if the name" - " option was set, and 'hello {name}' if the name parameter " - "was passed (takes over the option)", json_helloworld, }, { "testrpc", - "utils", - "Makes a simple getinfo call, to test rpc socket.", - "", json_testrpc, }, { "testrpc-deprecated", - "utils", - "Makes a simple getinfo call, to test rpc socket.", - "", json_testrpc, "v0.9.1", CLN_NEXT_VERSION, }, { "checkthis", - "utils", - "Passes arg to listdatastore", - "", json_checkthis, }, }; @@ -291,30 +287,43 @@ static const struct plugin_notification notifs[] = { { int main(int argc, char *argv[]) { setup_locale(); - plugin_main(argv, init, PLUGIN_RESTARTABLE, true, NULL, + /* We allocate now, so we can hand pointers for plugin options, + * but by specifying take() to plugin_main, it reparents it to + * the plugin */ + struct test_libplugin *tlp = tal(NULL, struct test_libplugin); + tlp->somearg = NULL; + tlp->self_disable = false; + tlp->dont_shutdown = false; + tlp->dynamic_opt = 7; + + plugin_main(argv, init, take(tlp), PLUGIN_RESTARTABLE, true, NULL, commands, ARRAY_SIZE(commands), notifs, ARRAY_SIZE(notifs), hooks, ARRAY_SIZE(hooks), NULL, 0, /* Notification topics we publish */ plugin_option("somearg", "string", "Argument to print at init.", - charp_option, charp_jsonfmt, &somearg), + charp_option, charp_jsonfmt, &tlp->somearg), plugin_option_deprecated("somearg-deprecated", "string", "Deprecated arg for init.", CLN_NEXT_VERSION, NULL, - charp_option, charp_jsonfmt, &somearg), + charp_option, charp_jsonfmt, + &tlp->somearg), plugin_option("selfdisable", "flag", "Whether to disable.", - flag_option, flag_jsonfmt, &self_disable), + flag_option, flag_jsonfmt, + &tlp->self_disable), plugin_option("dont_shutdown", "flag", "Whether to timeout when asked to shutdown.", - flag_option, flag_jsonfmt, &dont_shutdown), + flag_option, flag_jsonfmt, + &tlp->dont_shutdown), plugin_option_dynamic("dynamicopt", "int", "Set me!", - set_dynamic, u32_jsonfmt, &dynamic_opt), + set_dynamic, u32_jsonfmt, + &tlp->dynamic_opt), NULL); } diff --git a/tests/test_askrene.py b/tests/test_askrene.py new file mode 100644 index 000000000000..a0e4f33038b0 --- /dev/null +++ b/tests/test_askrene.py @@ -0,0 +1,412 @@ +from fixtures import * # noqa: F401,F403 +from pyln.client import RpcError +from utils import ( + only_one, first_scid, GenChannel, generate_gossip_store, + TEST_NETWORK +) +import os +import pytest +import time +import shutil + + +def test_layers(node_factory): + """Test manipulating information in layers""" + l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True) + + assert l2.rpc.askrene_listlayers() == {'layers': []} + assert l2.rpc.askrene_listlayers('test_layers') == {'layers': []} + + expect = {'layer': 'test_layers', + 'disabled_nodes': [], + 'created_channels': [], + 'constraints': []} + l2.rpc.askrene_disable_node('test_layers', l1.info['id']) + expect['disabled_nodes'].append(l1.info['id']) + assert l2.rpc.askrene_listlayers('test_layers') == {'layers': [expect]} + assert l2.rpc.askrene_listlayers() == {'layers': [expect]} + assert l2.rpc.askrene_listlayers('test_layers2') == {'layers': []} + + # Tell it l3 connects to l1! + l2.rpc.askrene_create_channel('test_layers', + l3.info['id'], + l1.info['id'], + '0x0x1', + '1000000sat', + 100, '900000sat', + 1, 2, 18) + expect['created_channels'].append({'source': l3.info['id'], + 'destination': l1.info['id'], + 'short_channel_id': '0x0x1', + 'capacity_msat': 1000000000, + 'htlc_minimum_msat': 100, + 'htlc_maximum_msat': 900000000, + 'fee_base_msat': 1, + 'fee_proportional_millionths': 2, + 'delay': 18}) + assert l2.rpc.askrene_listlayers('test_layers') == {'layers': [expect]} + + # We can tell it about made up channels... + first_timestamp = int(time.time()) + l2.rpc.askrene_inform_channel('test_layers', + '0x0x1', + 1, + 100000) + last_timestamp = int(time.time()) + 1 + expect['constraints'].append({'short_channel_id': '0x0x1', + 'direction': 1, + 'minimum_msat': 100000}) + # Check timestamp first. + listlayers = l2.rpc.askrene_listlayers('test_layers') + ts1 = only_one(only_one(listlayers['layers'])['constraints'])['timestamp'] + assert first_timestamp <= ts1 <= last_timestamp + expect['constraints'][0]['timestamp'] = ts1 + assert listlayers == {'layers': [expect]} + + # Make sure timestamps differ! + time.sleep(2) + + # We can tell it about existing channels... + scid12 = first_scid(l1, l2) + first_timestamp = int(time.time()) + l2.rpc.askrene_inform_channel(layer='test_layers', + short_channel_id=scid12, + # This is l2 -> l1 + direction=0, + maximum_msat=12341234) + last_timestamp = int(time.time()) + 1 + expect['constraints'].append({'short_channel_id': scid12, + 'direction': 0, + 'timestamp': first_timestamp, + 'maximum_msat': 12341234}) + # Check timestamp first. + listlayers = l2.rpc.askrene_listlayers('test_layers') + ts2 = only_one([c['timestamp'] for c in only_one(listlayers['layers'])['constraints'] if c['short_channel_id'] == scid12]) + assert first_timestamp <= ts2 <= last_timestamp + expect['constraints'][1]['timestamp'] = ts2 + + # Could be either order! + actual = expect.copy() + if only_one(listlayers['layers'])['constraints'][0]['short_channel_id'] == scid12: + actual['constraints'] = [expect['constraints'][1], expect['constraints'][0]] + assert listlayers == {'layers': [actual]} + + # Now test aging: ts1 does nothing. + assert l2.rpc.askrene_age('test_layers', ts1) == {'layer': 'test_layers', 'num_removed': 0} + listlayers = l2.rpc.askrene_listlayers('test_layers') + assert listlayers == {'layers': [actual]} + + # ts1+1 removes first inform + assert l2.rpc.askrene_age('test_layers', ts1 + 1) == {'layer': 'test_layers', 'num_removed': 1} + del expect['constraints'][0] + listlayers = l2.rpc.askrene_listlayers('test_layers') + assert listlayers == {'layers': [expect]} + + # ts2+1 removes other. + assert l2.rpc.askrene_age('test_layers', ts2 + 1) == {'layer': 'test_layers', 'num_removed': 1} + del expect['constraints'][0] + listlayers = l2.rpc.askrene_listlayers('test_layers') + assert listlayers == {'layers': [expect]} + + +def check_getroute_paths(node, + source, + destination, + amount_msat, + paths, + layers=[], + maxfee_msat=1000, + finalcltv=99): + """Check that routes are as expected in result""" + getroutes = node.rpc.getroutes(source=source, + destination=destination, + amount_msat=amount_msat, + layers=layers, + maxfee_msat=maxfee_msat, + finalcltv=finalcltv) + + assert getroutes['probability_ppm'] <= 1000000 + # Total delivered should be amount we told it to send. + assert amount_msat == sum([r['amount_msat'] for r in getroutes['routes']]) + + def dict_subset_eq(a, b): + """Is every key in B is the same in A?""" + return all(a.get(key) == b[key] for key in b) + + for expected_path in paths: + found = False + for i in range(len(getroutes['routes'])): + route = getroutes['routes'][i] + if len(route['path']) != len(expected_path): + continue + if all(dict_subset_eq(route['path'][i], expected_path[i]) for i in range(len(expected_path))): + del getroutes['routes'][i] + found = True + break + if not found: + raise ValueError("Could not find expected_path {} in paths {}".format(expected_path, getroutes['routes'])) + + if getroutes['routes'] != []: + raise ValueError("Did not expect paths {}".format(getroutes['routes'])) + + +def test_getroutes(node_factory): + """Test getroutes call""" + l1 = node_factory.get_node(start=False) + gsfile, nodemap = generate_gossip_store([GenChannel(0, 1, forward=GenChannel.Half(propfee=10000)), + GenChannel(0, 2, capacity_sats=9000), + GenChannel(1, 3, forward=GenChannel.Half(propfee=20000)), + GenChannel(0, 2, capacity_sats=10000), + GenChannel(2, 4, forward=GenChannel.Half(delay=2000))]) + + # Set up l1 with this as the gossip_store + shutil.copy(gsfile.name, os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, 'gossip_store')) + l1.start() + + # Start easy + assert l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[1], + amount_msat=1000, + layers=[], + maxfee_msat=1000, + finalcltv=99) == {'probability_ppm': 999999, + 'routes': [{'probability_ppm': 999999, + 'amount_msat': 1000, + 'path': [{'short_channel_id': '0x1x0', + 'direction': 1, + 'next_node_id': nodemap[1], + 'amount_msat': 1010, + 'delay': 99 + 6}]}]} + # Two hop, still easy. + assert l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[3], + amount_msat=100000, + layers=[], + maxfee_msat=5000, + finalcltv=99) == {'probability_ppm': 999798, + 'routes': [{'probability_ppm': 999798, + 'amount_msat': 100000, + 'path': [{'short_channel_id': '0x1x0', + 'direction': 1, + 'next_node_id': nodemap[1], + 'amount_msat': 103020, + 'delay': 99 + 6 + 6}, + {'short_channel_id': '1x3x2', + 'direction': 1, + 'next_node_id': nodemap[3], + 'amount_msat': 102000, + 'delay': 99 + 6} + ]}]} + + # Too expensive + with pytest.raises(RpcError, match="Could not find route without excessive cost"): + l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[3], + amount_msat=100000, + layers=[], + maxfee_msat=100, + finalcltv=99) + + # Too much delay (if final delay too great!) + l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[4], + amount_msat=100000, + layers=[], + maxfee_msat=100, + finalcltv=6) + with pytest.raises(RpcError, match="Could not find route without excessive delays"): + l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[4], + amount_msat=100000, + layers=[], + maxfee_msat=100, + finalcltv=99) + + # Two choices, but for <= 1000 sats we choose the larger. + assert l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[2], + amount_msat=1000000, + layers=[], + maxfee_msat=5000, + finalcltv=99) == {'probability_ppm': 900000, + 'routes': [{'probability_ppm': 900000, + 'amount_msat': 1000000, + 'path': [{'short_channel_id': '0x2x3', + 'direction': 1, + 'next_node_id': nodemap[2], + 'amount_msat': 1000001, + 'delay': 99 + 6}]}]} + + # For 10000 sats, we will split. + check_getroute_paths(l1, + nodemap[0], + nodemap[2], + 10000000, + [[{'short_channel_id': '0x2x1', + 'next_node_id': nodemap[2], + 'amount_msat': 500000, + 'delay': 99 + 6}], + [{'short_channel_id': '0x2x3', + 'next_node_id': nodemap[2], + 'amount_msat': 9500009, + 'delay': 99 + 6}]]) + + +def test_getroutes_fee_fallback(node_factory): + """Test getroutes call takes into account fees, if excessive""" + + l1 = node_factory.get_node(start=False) + # 0 -> 1 -> 3: high capacity, high fee (1%) + # 0 -> 2 -> 3: low capacity, low fee. + gsfile, nodemap = generate_gossip_store([GenChannel(0, 1, + capacity_sats=20000, + forward=GenChannel.Half(propfee=10000)), + GenChannel(0, 2, + capacity_sats=10000), + GenChannel(1, 3, + capacity_sats=20000, + forward=GenChannel.Half(propfee=10000)), + GenChannel(2, 3, + capacity_sats=10000)]) + # Set up l1 with this as the gossip_store + shutil.copy(gsfile.name, os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, 'gossip_store')) + l1.start() + + # Don't hit maxfee? Go easy path. + check_getroute_paths(l1, + nodemap[0], + nodemap[3], + 10000, + maxfee_msat=201, + paths=[[{'short_channel_id': '0x1x0'}, + {'short_channel_id': '1x3x2'}]]) + + # maxfee exceeded? lower prob path. + check_getroute_paths(l1, + nodemap[0], + nodemap[3], + 10000, + maxfee_msat=200, + paths=[[{'short_channel_id': '0x2x1'}, + {'short_channel_id': '2x3x3'}]]) + + +def test_getroutes_auto_sourcefree(node_factory): + """Test getroutes call with auto.sourcefree layer""" + l1 = node_factory.get_node(start=False) + gsfile, nodemap = generate_gossip_store([GenChannel(0, 1, forward=GenChannel.Half(propfee=10000)), + GenChannel(0, 2, capacity_sats=9000), + GenChannel(1, 3, forward=GenChannel.Half(propfee=20000)), + GenChannel(0, 2, capacity_sats=10000), + GenChannel(2, 4, forward=GenChannel.Half(delay=2000))]) + + # Set up l1 with this as the gossip_store + shutil.copy(gsfile.name, os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, 'gossip_store')) + l1.start() + + # Start easy + assert l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[1], + amount_msat=1000, + layers=['auto.sourcefree'], + maxfee_msat=1000, + finalcltv=99) == {'probability_ppm': 999999, + 'routes': [{'probability_ppm': 999999, + 'amount_msat': 1000, + 'path': [{'short_channel_id': '0x1x0', + 'direction': 1, + 'next_node_id': nodemap[1], + 'amount_msat': 1000, + 'delay': 99}]}]} + # Two hop, still easy. + assert l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[3], + amount_msat=100000, + layers=['auto.sourcefree'], + maxfee_msat=5000, + finalcltv=99) == {'probability_ppm': 999798, + 'routes': [{'probability_ppm': 999798, + 'amount_msat': 100000, + 'path': [{'short_channel_id': '0x1x0', + 'direction': 1, + 'next_node_id': nodemap[1], + 'amount_msat': 102000, + 'delay': 99 + 6}, + {'short_channel_id': '1x3x2', + 'direction': 1, + 'next_node_id': nodemap[3], + 'amount_msat': 102000, + 'delay': 99 + 6} + ]}]} + + # Too expensive + with pytest.raises(RpcError, match="Could not find route without excessive cost"): + l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[3], + amount_msat=100000, + layers=[], + maxfee_msat=100, + finalcltv=99) + + # Too much delay (if final delay too great!) + l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[4], + amount_msat=100000, + layers=[], + maxfee_msat=100, + finalcltv=6) + with pytest.raises(RpcError, match="Could not find route without excessive delays"): + l1.rpc.getroutes(source=nodemap[0], + destination=nodemap[4], + amount_msat=100000, + layers=[], + maxfee_msat=100, + finalcltv=99) + + +def test_getroutes_auto_localchans(node_factory): + """Test getroutes call with auto.localchans layer""" + # We get bad signature warnings, since our gossip is made up! + l1, l2 = node_factory.get_nodes(2, opts={'allow_warning': True}) + gsfile, nodemap = generate_gossip_store([GenChannel(0, 1, forward=GenChannel.Half(propfee=10000)), + GenChannel(1, 2, forward=GenChannel.Half(propfee=10000))], + nodeids=[l2.info['id']]) + + # Set up l1 with this as the gossip_store + l1.stop() + shutil.copy(gsfile.name, os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, 'gossip_store')) + l1.start() + + # Now l1 beleives l2 has an entire network behind it. + scid12, _ = l1.fundchannel(l2, 10**6, announce_channel=False) + + # Cannot find a route unless we use local hints. + with pytest.raises(RpcError, match="Unknown source node {}".format(l1.info['id'])): + l1.rpc.getroutes(source=l1.info['id'], + destination=nodemap[2], + amount_msat=100000, + layers=[], + maxfee_msat=100000, + finalcltv=99) + + # This should work + check_getroute_paths(l1, + l1.info['id'], + nodemap[2], + 100000, + maxfee_msat=100000, + layers=['auto.localchans'], + paths=[[{'short_channel_id': scid12, 'amount_msat': 102012, 'delay': 99 + 6 + 6 + 6}, + {'short_channel_id': '0x1x0', 'amount_msat': 102010, 'delay': 99 + 6 + 6}, + {'short_channel_id': '1x2x1', 'amount_msat': 101000, 'delay': 99 + 6}]]) + + # This should get self-discount correct + check_getroute_paths(l1, + l1.info['id'], + nodemap[2], + 100000, + maxfee_msat=100000, + layers=['auto.localchans', 'auto.sourcefree'], + paths=[[{'short_channel_id': scid12, 'amount_msat': 102010, 'delay': 99 + 6 + 6}, + {'short_channel_id': '0x1x0', 'amount_msat': 102010, 'delay': 99 + 6 + 6}, + {'short_channel_id': '1x2x1', 'amount_msat': 101000, 'delay': 99 + 6}]]) diff --git a/tests/test_bookkeeper.py b/tests/test_bookkeeper.py index 0852dd154cd2..c897839764da 100644 --- a/tests/test_bookkeeper.py +++ b/tests/test_bookkeeper.py @@ -892,3 +892,58 @@ def test_bookkeeper_lease_fee_dupe_migration(node_factory): accts_db = Sqlite3Db(accts_db_path) assert accts_db.query('SELECT tag from channel_events where tag = \'lease_fee\';') == [{'tag': 'lease_fee'}] + + +def test_bookkeeper_custom_notifs(node_factory): + # FIXME: what happens if we send internal funds to 'external' wallet? + plugin = os.path.join( + os.path.dirname(__file__), "plugins", "bookkeeper_custom_coins.py" + ) + l1, l2 = node_factory.line_graph(2, opts=[{'plugin': plugin}, {}]) + + outpoint_in = 'aa' * 32 + ':0' + spend_txid = 'bb' * 32 + amount = 180000000 + withdraw_amt = 55555000 + fee = 2000 + + change_deposit = 'bb' * 32 + ':0' + external_deposit = 'bb' * 32 + ':1' + acct = "nifty's secret stash" + + l1.rpc.senddeposit(acct, False, outpoint_in, amount) + l1.rpc.sendspend(acct, outpoint_in, spend_txid, amount) + l1.daemon.wait_for_log(r"utxo_deposit \(deposit|nifty's secret stash\) .* -0msat 1679955976 111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:0") + l1.daemon.wait_for_log(r"utxo_spend \(withdrawal|nifty's secret stash\) 0msat -12345678000msat 1679955976 111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:0 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") + + # balance should be zero + bals = l1.rpc.bkpr_listbalances()['accounts'] + for bal in bals: + if bal['account'] == acct: + # FIXME: how to account for withdraw to external + assert only_one(bal['balances'])['balance_msat'] == Millisatoshi(0) + + l1.rpc.senddeposit(acct, False, change_deposit, amount - withdraw_amt - fee) + l1.daemon.wait_for_log(r"utxo_deposit \(deposit|nifty's secret stash\) .* -0msat 1679955976 111 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:0") + + # balance should be equal to amount + events = l1.rpc.bkpr_listaccountevents(acct)['events'] + for bal in l1.rpc.bkpr_listbalances()['accounts']: + if bal['account'] == acct: + assert only_one(bal['balances'])['balance_msat'] == Millisatoshi(amount - fee - withdraw_amt) + + onchain_fee_one = only_one([x['credit_msat'] for x in events if x['type'] == 'onchain_fee']) + assert onchain_fee_one == fee + withdraw_amt + + l1.rpc.senddeposit(acct, True, external_deposit, withdraw_amt) + l1.daemon.wait_for_log(r"utxo_deposit \(deposit|external\) .* -0msat 1679955976 111 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:1") + events = l1.rpc.bkpr_listaccountevents(acct)['events'] + onchain_fees = [x for x in events if x['type'] == 'onchain_fee'] + assert len(onchain_fees) == 2 + assert onchain_fees[0]['credit_msat'] == onchain_fee_one + assert onchain_fees[1]['debit_msat'] == withdraw_amt + + # This should not blow up + incomes = l1.rpc.bkpr_listincome()['income_events'] + acct_fee = only_one([inc['debit_msat'] for inc in incomes if inc['account'] == acct and inc['tag'] == 'onchain_fee']) + assert acct_fee == Millisatoshi(fee) diff --git a/tests/test_cln_rs.py b/tests/test_cln_rs.py index 664b4e11f9c5..cc382b1e108d 100644 --- a/tests/test_cln_rs.py +++ b/tests/test_cln_rs.py @@ -48,10 +48,7 @@ def test_plugin_start(node_factory): assert l1.rpc.help("testmethod") == { 'help': [ { - 'command': 'testmethod ', - 'category': 'plugin', - 'description': 'This is a test', - 'verbose': 'This is a test' + 'command': 'testmethod ' } ], 'format-hint': 'simple' diff --git a/tests/test_clnrest.py b/tests/test_clnrest.py index 6a1c6a73fb9d..6683e636c0d3 100644 --- a/tests/test_clnrest.py +++ b/tests/test_clnrest.py @@ -149,7 +149,7 @@ def test_clnrest_list_methods(node_factory): http_session = http_session_with_retry() response = http_session.get(base_url + '/v1/list-methods', verify=ca_cert) assert response.status_code == 200 - assert response.text.find('Command: getinfo') > 0 + assert response.text.find('getinfo') > 0 def test_clnrest_unknown_method(node_factory): diff --git a/tests/test_gossip.py b/tests/test_gossip.py index ae578939166a..b9eabeb3784c 100644 --- a/tests/test_gossip.py +++ b/tests/test_gossip.py @@ -6,7 +6,7 @@ wait_for, TIMEOUT, only_one, sync_blockheight, expected_node_features, mine_funding_to_announce, default_ln_port, CHANNEL_SIZE, - first_scid, + first_scid, generate_gossip_store, GenChannel ) import json @@ -18,6 +18,7 @@ import subprocess import time import unittest +import shutil import socket @@ -38,7 +39,9 @@ def test_gossip_pruning(node_factory, bitcoind): scid2, _ = l2.fundchannel(l3, 10**6) mine_funding_to_announce(bitcoind, [l1, l2, l3]) + l1_initial_cupdate_timestamp = only_one(l1.rpc.listchannels(source=l1.info['id'])['channels'])['last_update'] + # Get timestamps of initial updates, so we can ensure they change. # Channels should be activated locally wait_for(lambda: [c['active'] for c in l1.rpc.listchannels()['channels']] == [True] * 4) wait_for(lambda: [c['active'] for c in l2.rpc.listchannels()['channels']] == [True] * 4) @@ -56,6 +59,10 @@ def test_gossip_pruning(node_factory, bitcoind): 'Sending keepalive channel_update for {}'.format(scid2), ]) + # Everyone should see l1's update change. + for n in (l1, l2, l3): + wait_for(lambda: only_one(n.rpc.listchannels(source=l1.info['id'])['channels'])['last_update'] != l1_initial_cupdate_timestamp) + # Now kill l2, so that l1 and l3 will prune from their view after 60 seconds l2.stop() @@ -2137,3 +2144,187 @@ def test_gossip_throttle(node_factory, bitcoind, chainparams): assert time_slow > 3 out4 = [m for m in out4 if not m.startswith(b'0109')] assert set(out2) == set(out4) + + +def test_generate_gossip_store(node_factory): + l1 = node_factory.get_node(start=False) + chans = [GenChannel(0, 1), + GenChannel(0, 2, capacity_sats=5000), + GenChannel(0, 3, + forward=GenChannel.Half(enabled=False, + htlc_min=10, + htlc_max=5000000 - 10, + basefee=10, + propfee=10), + reverse=GenChannel.Half(htlc_min=11, + htlc_max=5000000 - 11, + basefee=11, + propfee=11)), + GenChannel(0, 4)] + gsfile, nodemap = generate_gossip_store(chans) + + # Set up l1 with this as the gossip_store + shutil.copy(gsfile.name, os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, 'gossip_store')) + l1.start() + + nodes = [nodemap[i] for i in range(0, 5)] + expected = [] + chancount = 0 + for c in chans: + for d in (0, 1): + # listchannels direction 0 always lesser -> greater. + if nodes[c.node1] < nodes[c.node2]: + expected_dir = d + else: + expected_dir = d ^ 1 + channel_flags = expected_dir + if not c.half[d].enabled: + active = False + channel_flags |= 2 + else: + active = True + if d == 0: + n1 = nodes[c.node1] + n2 = nodes[c.node2] + else: + n1 = nodes[c.node2] + n2 = nodes[c.node1] + + expected.append({'source': n1, + 'destination': n2, + 'short_channel_id': '{}x{}x{}'.format(c.node1, c.node2, chancount), + 'direction': expected_dir, + 'public': True, + 'amount_msat': c.capacity_sats * 1000, + 'message_flags': 1, + 'channel_flags': channel_flags, + 'active': active, + 'last_update': 0, + 'base_fee_millisatoshi': c.half[d].basefee, + 'fee_per_millionth': c.half[d].propfee, + 'delay': c.half[d].delay, + 'htlc_minimum_msat': c.half[d].htlc_min, + 'htlc_maximum_msat': c.half[d].htlc_max, + 'features': ''}) + chancount += 1 + + # Order is not well-defined, and sets don't like dicts :( + lchans = sorted(l1.rpc.listchannels()['channels'], key=lambda x: x['source'] + x['destination']) + expected = sorted(expected, key=lambda x: x['source'] + x['destination']) + + assert lchans == expected + + +def test_seeker_first_peer(node_factory, bitcoind): + l1, l2, l3, l4, l5 = node_factory.get_nodes(5) + + node_factory.join_nodes([l4, l5], wait_for_announce=True) + + # We always ask peer for everything if we have no gossip. + l1.rpc.connect(l2.info['id'], 'localhost', l2.port) + l1.daemon.wait_for_log(rf"{l2.info['id']}-gossipd: seeker: starting gossip \(EVERYTHING\)") + + # Still no gossip, so we ask second peer too. + l1.rpc.connect(l3.info['id'], 'localhost', l3.port) + l1.daemon.wait_for_log(rf"{l3.info['id']}-gossipd: seeker: starting gossip \(EVERYTHING\)") + + # We can actually get gossip *before* we kick seeker, so it may stream here! + l1.rpc.connect(l4.info['id'], 'localhost', l4.port) + wait_for(lambda: len(l1.rpc.listchannels()['channels']) == 2) + + l1.rpc.connect(l5.info['id'], 'localhost', l5.port) + l1.daemon.wait_for_log(rf"{l5.info['id']}-gossipd: seeker: starting gossip \(streaming\)") + + # Now we restart, and we'll ask the first peer, even though we have gossip. + l1.restart() + + l1.rpc.connect(l2.info['id'], 'localhost', l2.port) + l1.daemon.wait_for_log(rf"{l2.info['id']}-gossipd: seeker: starting gossip \(EVERYTHING\)") + l1.rpc.connect(l3.info['id'], 'localhost', l3.port) + # This can take more than 10 seconds, so we add to timeout here! + l1.daemon.wait_for_log(rf"{l3.info['id']}-gossipd: seeker: starting gossip \(streaming\)", + timeout=TIMEOUT + 10) + + +def test_gossip_force_broadcast_channel_msgs(node_factory, bitcoind): + """ Send our own channel_update, node_announcement or channel_announcement to existing peers, even if they say they're not interested. + """ + l1, l2 = node_factory.get_nodes(2) + + # One block away from being announced. + node_factory.join_nodes([l1, l2], wait_for_announce=False) + bitcoind.generate_block(4) + + # It will send timestamp_filter. It should also send a channel_announcement, a + # channel_update, and a node_announcement, even though we said no gossip. + # It may or may not send: + # query_short_channel_ids, query_channel_range, a ping. + process = subprocess.Popen(['devtools/gossipwith', + '--no-gossip', + '--hex', + '--network={}'.format(TEST_NETWORK), + '--max-messages={}'.format(7), + '--timeout-after=30', + '{}@localhost:{}'.format(l1.info['id'], l1.port)], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # Now do the final announcement + bitcoind.generate_block(1) + + stdout, stderr = process.communicate(timeout=30 + TIMEOUT) + assert process.returncode == 0, f"Exit failed: output = {stderr}" + + lines = stdout.decode('utf-8').splitlines() + types = {'0100': 'channel_announce', + '0102': 'channel_update', + '0101': 'node_announce', + '0105': 'query_short_channel_ids', + '0107': 'query_channel_range', + '0109': 'gossip_filter', + '0012': 'ping'} + tally = {key: 0 for key in types.values()} + for l in lines: + tally[types[l[0:4]]] += 1 + + # Make sure the noise is within reasonable bounds + assert tally['query_short_channel_ids'] <= 1 + assert tally['query_channel_range'] <= 1 + assert tally['ping'] <= 1 + del tally['query_short_channel_ids'] + del tally['query_channel_range'] + del tally['ping'] + assert tally == {'channel_announce': 1, + 'channel_update': 1, + 'node_announce': 1, + 'gossip_filter': 1} + + # Make sure l1 sees l2's channel update + wait_for(lambda: len(l1.rpc.listchannels()['channels']) == 2) + + # Now, let's test fast gossip. + l1.stop() + l1.daemon.opts['dev-fast-gossip-prune'] = None + l1.start() + + # If we reconnect, we will get the four immediate messages, then + # a cupdate refresh (due to fast gossip). + lines = subprocess.run(['devtools/gossipwith', + '--no-gossip', + '--hex', + '--network={}'.format(TEST_NETWORK), + '--max-messages={}'.format(7), + '--timeout-after={}'.format(30), + '{}@localhost:{}'.format(l1.info['id'], l1.port)], + check=True, + timeout=30 + TIMEOUT, stdout=subprocess.PIPE).stdout.decode('utf-8').split() + + tally = {key: 0 for key in types.values()} + for l in lines: + tally[types[l[0:4]]] += 1 + + del tally['query_short_channel_ids'] + del tally['query_channel_range'] + del tally['ping'] + assert tally == {'channel_announce': 1, + 'channel_update': 3, + 'node_announce': 1, + 'gossip_filter': 1} diff --git a/tests/test_misc.py b/tests/test_misc.py index 8b21b6fcb3ee..f59c8c814981 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -974,7 +974,7 @@ def test_cli(node_factory): .format(l1.daemon.lightning_dir), 'help']).decode('utf-8') # Test some known output. - assert 'help [command]\n List available commands, or give verbose help on one {command}' in out + assert 'addgossip message\n\naddpsbtoutput' in out # Check JSON id is as expected l1.daemon.wait_for_log(r'jsonrpc#[0-9]*: "cli:help#[0-9]*"\[IN\]') @@ -988,7 +988,6 @@ def test_cli(node_factory): 'help']).decode('utf-8') j, _ = json.JSONDecoder().raw_decode(out) assert j['help'][0]['command'] is not None - assert j['help'][0]['description'] is not None # Test keyword input (autodetect) out = subprocess.check_output(['cli/lightning-cli', @@ -998,7 +997,7 @@ def test_cli(node_factory): '-J', 'help', 'command=help']).decode('utf-8') j, _ = json.JSONDecoder().raw_decode(out) - assert 'help [command]' in j['help'][0]['verbose'] + assert 'help [command]' in j['help'][0]['command'] # Test keyword input (forced) out = subprocess.check_output(['cli/lightning-cli', @@ -1008,7 +1007,7 @@ def test_cli(node_factory): '-J', '-k', 'help', 'command=help']).decode('utf-8') j, _ = json.JSONDecoder().raw_decode(out) - assert 'help [command]' in j['help'][0]['verbose'] + assert 'help [command]' in j['help'][0]['command'] # Test ordered input (autodetect) out = subprocess.check_output(['cli/lightning-cli', @@ -1018,7 +1017,7 @@ def test_cli(node_factory): '-J', 'help', 'help']).decode('utf-8') j, _ = json.JSONDecoder().raw_decode(out) - assert 'help [command]' in j['help'][0]['verbose'] + assert 'help [command]' in j['help'][0]['command'] # Test ordered input (forced) out = subprocess.check_output(['cli/lightning-cli', @@ -1028,7 +1027,7 @@ def test_cli(node_factory): '-J', '-o', 'help', 'help']).decode('utf-8') j, _ = json.JSONDecoder().raw_decode(out) - assert 'help [command]' in j['help'][0]['verbose'] + assert 'help [command]' in j['help'][0]['command'] # Test filtering out = subprocess.check_output(['cli/lightning-cli', @@ -1179,7 +1178,7 @@ def test_cli_commando(node_factory): .format(l1.daemon.lightning_dir), 'help']).decode('utf-8') # Test some known output. - assert 'help [command]\n List available commands, or give verbose help on one {command}' in out + assert 'addgossip message\n\naddpsbtoutput' in out # Check JSON id is as expected l1.daemon.wait_for_log(r'jsonrpc#[0-9]*: "cli:help#[0-9]*"\[IN\]') @@ -1196,7 +1195,7 @@ def test_cli_commando(node_factory): '-J', '-k', 'help', 'command=help']).decode('utf-8') j, _ = json.JSONDecoder().raw_decode(out) - assert 'help [command]' in j['help'][0]['verbose'] + assert 'help [command]' in j['help'][0]['command'] # Test ordered input (forced) out = subprocess.check_output(['cli/lightning-cli', @@ -1207,7 +1206,7 @@ def test_cli_commando(node_factory): '-J', '-o', 'help', 'help']).decode('utf-8') j, _ = json.JSONDecoder().raw_decode(out) - assert 'help [command]' in j['help'][0]['verbose'] + assert 'help [command]' in j['help'][0]['command'] # Test filtering out = subprocess.check_output(['cli/lightning-cli', @@ -1286,7 +1285,7 @@ def test_daemon_option(node_factory): '--lightning-dir={}' .format(l1.daemon.lightning_dir), 'help']).decode('utf-8') - assert 'help [command]\n List available commands, or give verbose help on one {command}' in out + assert 'addgossip message\n\naddpsbtoutput' in out subprocess.run(['cli/lightning-cli', '--network={}'.format(TEST_NETWORK), @@ -3868,6 +3867,43 @@ def test_fast_shutdown(node_factory): break +def test_config_whitespace(node_factory): + """ Test the configuration parsing with extra + whitespace in the configuration file. """ + l1 = node_factory.get_node() + + configfile = os.path.join(l1.daemon.opts.get("lightning-dir"), TEST_NETWORK, 'config') + + # Stop the node to modify the configuration file safely + l1.stop() + + # Ensure the log-prefix option is not set in the command line arguments + if 'log-prefix' in l1.daemon.opts: + del l1.daemon.opts['log-prefix'] + + # Write configuration parameters with extra whitespace + with open(configfile, "a") as f: + f.write("\n\n# Test whitespace\n") + f.write("funder-policy-mod=100 \n") + f.write("funder-min-their-funding=10000\n") + f.write("allow-deprecated-apis=false \n") + f.write("alias=MyLightningNode \n") + f.write("log-prefix=MyNode \n") + + l1.start() + + configs = l1.rpc.listconfigs() + + # Verify that the trimmed configuration values are correctly set + assert configs['configs']['funder-policy-mod']['value_str'] == '100', "funder-policy-mod should be '100'" + assert configs['configs']['funder-min-their-funding']['value_str'] == '10000', "funder-min-their-funding should be '10000'" + assert configs['configs']['allow-deprecated-apis']['value_bool'] is False, "allow-deprecated-apis should be False" + + # We want to keep the whitespaces at the parameter 'alias' & 'log-prefix' + assert configs['configs']['alias']['value_str'] == 'MyLightningNode ', "alias should be 'MyLightningNode '" + assert configs['configs']['log-prefix']['value_str'] == 'MyNode ', "log-prefix should be 'MyNode '" + + def test_setconfig(node_factory, bitcoind): l1, l2 = node_factory.line_graph(2, fundchannel=False) configfile = os.path.join(l2.daemon.opts.get("lightning-dir"), TEST_NETWORK, 'config') diff --git a/tests/test_pay.py b/tests/test_pay.py index dd09c6885c68..296750e69316 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -4909,6 +4909,26 @@ def test_sendinvoice(node_factory, bitcoind): assert out['amount_received_msat'] == Millisatoshi(10000000) +def test_sendinvoice_blindedpath(node_factory, bitcoind): + l1, l2 = node_factory.line_graph(2, wait_for_announce=True, + opts=[{}, + {'experimental-offers': None}]) + # We join l3->l1->l2 so l3 can pay invoice sent by l2. + l3 = node_factory.get_node(options={'experimental-offers': None}) + node_factory.join_nodes([l3, l1], announce_channels=False) + + # Make sure l3 knows l1, l2 is public, so it will create blinded path to it. + wait_for(lambda: ['alias' in n for n in l3.rpc.listnodes()['nodes']] == [True, True]) + + invreq1 = l3.rpc.invoicerequest(amount='100000sat', + description='test_sendinvoice_blindedpath') + decode = l1.rpc.decode(invreq1['bolt12']) + assert len(decode['invreq_paths']) == 1 + assert decode['invreq_paths'][0]['first_node_id'] == l1.info['id'] + + l2.rpc.sendinvoice(invreq=invreq1['bolt12'], label='test_sendinvoice_blindedpath 1') + + def test_self_pay(node_factory): """Repro test for issue 4345: pay ourselves via the pay plugin. @@ -5246,17 +5266,29 @@ def test_payerkey(node_factory): """payerkey calculation should not change across releases!""" nodes = node_factory.get_nodes(7) - expected_keys = ["02294ec1cd3f100947fe859d71a42cb87932e36e7771abf2d50b02a7a92be8e4d5", - "026a4a3b6b0c694da6f14629ca5140713fc703591a6d8aae5c79ba9b5556fc5723", - "03defd2b1f3004b0145351f469f34512c6fa4d02fe891a977bafdb34fe7b73ea48", - "03eccb00c0a3c760465bb69a6297d7cfa5bcbd989d5a88e435bd8d6e4c723013cd", - "021b4bfa652f0df7498d734b0ca888b4e3b07f59e1a974ec7d4a9d6046e8e5ab92", - "03fc91d60b061e517f9182e3e40ea14c27df520c51db204f1409ff50e5cf9a5e4d", - "03a3bbda0137722ba62207b9d3e5e6cc2a11e58480f801892093e01383aacb7fb2"] + expected_keys = ["035e43e4ec029ee6cc0e320ebefdf863bc0f284ec0208275f780837d17e21bba32", + "02411811b24f4940de49ad460ee14ecb96810e29ca49cdd3600a985da2eda06b87", + "036a19f00424ff244af1841715e89f3716c08f1f62a8e5d9bd0f69a21aa96a7b8d", + "026d8b82fe6039fe16f8ef376174b630247e821331b90620315a1e9c3db8384056", + "0393fb950e04916c063a585aa644df3d72642c16de4eb44ccf5dbede194836140f", + "030b68257230f7057e694222bbd54d9d108decced6b647a90da6f578360af53f7d", + "02f402bd7374a1304b07c7236d9c683b83f81072517195ddede8ab328026d53157"] + bolt12tool = os.path.join(os.path.dirname(__file__), "..", "devtools", "bolt12-cli") + + # Returns "lnr " on first line + hexprefix = subprocess.check_output([bolt12tool, 'decodehex', + 'lnr1qqgz2d7u2smys9dc5q2447e8thjlgq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqvepgz5zsjrg3z3vggzvkm2khkgvrxj27r96c00pwl4kveecdktm29jdd6w0uwu5jgtv5v9qgqxyfhyvyg6pdvu4tcjvpp7kkal9rp57wj7xv4pl3ajku70rzy3pu']).decode('UTF-8').split('\n')[0].split() + + # Now we are supposed to put invreq_payer_id inside invreq, and lightningd + # checks the derivation as a courtesy. Fortunately, invreq_payer_id is last for n, k in zip(nodes, expected_keys): - b12 = n.rpc.createinvoicerequest('lnr1qqgz2d7u2smys9dc5q2447e8thjlgq3qqc3xu3s3rg94nj40zfsy866mhu5vxne6tcej5878k2mneuvgjy8ssqvepgz5zsjrg3z3vggzvkm2khkgvrxj27r96c00pwl4kveecdktm29jdd6w0uwu5jgtv5v9qgqxyfhyvyg6pdvu4tcjvpp7kkal9rp57wj7xv4pl3ajku70rzy3pu', False)['bolt12'] - assert n.rpc.decode(b12)['invreq_payer_id'] == k + # BOLT-offers #12: + # 1. type: 88 (`invreq_payer_id`) + # 2. data: + # * [`point`:`key`] + encoded = subprocess.check_output([bolt12tool, 'encodehex'] + hexprefix + ['5821', k]).decode('UTF-8').strip() + n.rpc.createinvoicerequest(encoded, False)['bolt12'] def test_pay_multichannel_use_zeroconf(bitcoind, node_factory): @@ -5883,6 +5915,27 @@ def test_decryptencrypteddata(node_factory): assert dec['decrypted'].startswith('0421' + l3.info['id']) +def test_offer_experimental_fields(node_factory): + l1, l2 = node_factory.line_graph(2, opts={'experimental-offers': None}) + + # Append experimental type 1000000001, length 1 + offer = l1.rpc.offer(amount='2msat', description='test_offer_path_self')['bolt12'] + bolt12tool = os.path.join(os.path.dirname(__file__), "..", "devtools", "bolt12-cli") + # Returns HRP and hex + as_hex = subprocess.check_output([bolt12tool, 'decodehex', offer]).decode('UTF-8').split() + mangled = subprocess.check_output([bolt12tool, 'encodehex', as_hex[0], as_hex[1] + 'FE3B9ACA01' '01' '00']).decode('UTF-8').strip() + + assert l1.rpc.decode(mangled)['unknown_offer_tlvs'] == [{'type': 1000000001, 'length': 1, 'value': '00'}] + + # This will fail (offer has added field!) + with pytest.raises(RpcError, match="Unknown offer"): + l2.rpc.fetchinvoice(mangled) + + # invice request contains the unknown field + m = re.search(r'invoice_request: \\"([a-z0-9]*)\\"', l2.daemon.is_in_log('invoice_request:')) + assert l1.rpc.decode(m.group(1))['unknown_invoice_request_tlvs'] == [{'type': 1000000001, 'length': 1, 'value': '00'}] + + def test_fetch_no_description_offer(node_factory): """Reproducing the issue: https://github.com/ElementsProject/lightning/issues/7405""" l1, l2 = node_factory.line_graph(2, opts={'experimental-offers': None, @@ -5913,3 +5966,33 @@ def test_fetch_no_description_with_amount(node_factory): err = r'description is required for the user to know what it was they paid for' with pytest.raises(RpcError, match=err) as err: _ = l2.rpc.call('offer', {'amount': '2msat'}) + + +def test_enableoffer(node_factory): + l1, l2 = node_factory.line_graph(2, opts={'experimental-offers': None}) + + # Normal offer, works as expected + offer1 = l2.rpc.call('offer', {'amount': '2msat', + 'description': 'test_disableoffer_reenable'}) + assert offer1['created'] is True + l1.rpc.fetchinvoice(offer=offer1['bolt12']) + + l2.rpc.disableoffer(offer_id=offer1['offer_id']) + + with pytest.raises(RpcError, match="Offer no longer available"): + l1.rpc.fetchinvoice(offer=offer1['bolt12']) + + with pytest.raises(RpcError, match="1000.*Already exists, but isn't active"): + l2.rpc.call('offer', {'amount': '2msat', + 'description': 'test_disableoffer_reenable'}) + + l2.rpc.enableoffer(offer_id=offer1['offer_id']) + l1.rpc.fetchinvoice(offer=offer1['bolt12']) + + # Can't enable twice. + with pytest.raises(RpcError, match="1006.*offer already active"): + l2.rpc.enableoffer(offer_id=offer1['offer_id']) + + # Can't enable unknown. + with pytest.raises(RpcError, match="Unknown offer"): + l1.rpc.enableoffer(offer_id=offer1['offer_id']) diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 00b1ce454397..8a69a763d20c 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -2059,11 +2059,8 @@ def mock_sendrawtransaction(tx): # Restart l2, and it should continue where the watchtower left off: l2.start() - # l2 will still try to broadcast its latest commitment tx, but it'll fail - # since l1 has cheated. All commitments share the same prefix, so look for - # that. - penalty_prefix = tx[:(4 + 1 + 36) * 2] # version, txin_count, first txin in hex - l2.daemon.wait_for_log(r'Expected error broadcasting tx {}'.format(penalty_prefix)) + # l2 notices that there has been a unilateral close from l1. + l2.daemon.wait_for_log(r'Peer permanent failure in') # Now make sure the penalty output ends up in our wallet fund_txids = [o['txid'] for o in l2.rpc.listfunds()['outputs']] diff --git a/tests/test_reckless.py b/tests/test_reckless.py index bca922e013f7..8f32447b014b 100644 --- a/tests/test_reckless.py +++ b/tests/test_reckless.py @@ -111,7 +111,8 @@ def get_reckless_node(node_factory): def check_stderr(stderr): def output_okay(out): for warning in ['[notice]', 'WARNING:', 'npm WARN', - 'npm notice', 'DEPRECATION:', 'Creating virtualenv']: + 'npm notice', 'DEPRECATION:', 'Creating virtualenv', + 'config file not found:', 'press [Y]']: if out.startswith(warning): return True return False diff --git a/tests/test_wallet.py b/tests/test_wallet.py index 20916639cfb0..77ba5f38a983 100644 --- a/tests/test_wallet.py +++ b/tests/test_wallet.py @@ -3,7 +3,6 @@ from fixtures import * # noqa: F401,F403 from fixtures import TEST_NETWORK from pyln.client import RpcError, Millisatoshi -from shutil import copyfile from utils import ( only_one, wait_for, sync_blockheight, VALGRIND, check_coin_moves, TailableProc, scriptpubkey_addr, @@ -1625,17 +1624,11 @@ def test_p2tr_deposit_withdrawal(node_factory, bitcoind): def test_upgradewallet(node_factory, bitcoind): # Make sure bitcoind doesn't think it's going backwards bitcoind.generate_block(104) - l1 = node_factory.get_node(start=False) + l1 = node_factory.get_node() # Write the data/p2sh_wallet_hsm_secret to the hsm_path, # so node can spend funds at p2sh_wrapped_addr p2sh_wrapped_addr = '2N2V4ee2vMkiXe5FSkRqFjQhiS9hKqNytv3' - hsm_path_dest = os.path.join(l1.daemon.lightning_dir, TEST_NETWORK, "hsm_secret") - hsm_path_origin = os.path.join('tests/data', 'p2sh_wallet_hsm_secret') - copyfile(hsm_path_origin, hsm_path_dest) - - l1.start() - assert l1.daemon.is_in_log('Server started with public key 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518') # No funds in wallet, upgrading does nothing upgrade = l1.rpc.upgradewallet() diff --git a/tests/utils.py b/tests/utils.py index 2598380c2e03..62da00290011 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -3,6 +3,8 @@ import bitstring from pyln.client import Millisatoshi from pyln.testing.utils import EXPERIMENTAL_DUAL_FUND, EXPERIMENTAL_SPLICING +import subprocess +import tempfile import time COMPAT = env("COMPAT", "1") == "1" @@ -430,3 +432,133 @@ def scriptpubkey_addr(scriptpubkey): # Modern bitcoin (at least, git master) return scriptpubkey['address'] return None + + +class GenChannel(object): + class Half(object): + def __init__(self, enabled=True, htlc_min=0, htlc_max=None, basefee=0, propfee=1, delay=6): + self.enabled = enabled + self.htlc_min = htlc_min + self.htlc_max = htlc_max + self.basefee = basefee + self.propfee = propfee + self.delay = delay + + def __init__(self, node1, node2, capacity_sats=1000000, forward=None, reverse=None): + """We fill in htlc_max on half to == capacity, if not set""" + self.node1 = node1 + self.node2 = node2 + if forward is None: + forward = GenChannel.Half() + if reverse is None: + reverse = GenChannel.Half() + if forward.htlc_max is None: + forward.htlc_max = capacity_sats * 1000 + if reverse.htlc_max is None: + reverse.htlc_max = capacity_sats * 1000 + self.capacity_sats = capacity_sats + self.half = [forward, reverse] + + +def generate_gossip_store(channels, nodeids=[]): + """Returns a gossip store file with the given channels in it, and a map of node labels -> ids + """ + nodes = [] + + def write_bignum(outf, val): + if val < 253: + outf.write(val.to_bytes(1, byteorder='big')) + elif val <= 0xFFFF: + outf.write(b'\xFD') + outf.write(val.to_bytes(2, byteorder='big')) + elif val <= 0xFFFFFFFF: + outf.write(b'\xFE') + outf.write(val.to_bytes(4, byteorder='big')) + else: + outf.write(b'\xFF') + outf.write(val.to_bytes(8, byteorder='big')) + + def write_dumb_template(outf, channels, propname, illegalvals=[]): + """We don't bother uniquifing, just one entry per chan dir""" + # Template is simply all the values + write_bignum(outf, len(channels) * 2) + for c in channels: + for d in (0, 1): + v = getattr(c.half[d], propname) + assert v not in illegalvals + write_bignum(outf, v) + + # Now each entry for each channel half points into the values. + for i in range(0, len(channels) * 2): + write_bignum(outf, i) + + # First create nodes + for c in channels: + if c.node1 not in nodes: + nodes.append(c.node1) + if c.node2 not in nodes: + nodes.append(c.node2) + + cfile = tempfile.NamedTemporaryFile(prefix='gs-compressed-') + #
:= "GOSSMAP_COMPRESSv1\0" + cfile.write(b'GOSSMAP_COMPRESSv1\x00') + # := {channel_count} {start_nodeidx}*{channel_count} {end_nodeidx}*{channel_count} + write_bignum(cfile, len(channels)) + for c in channels: + write_bignum(cfile, nodes.index(c.node1)) + for c in channels: + write_bignum(cfile, nodes.index(c.node2)) + + # := * {channel_count*2} + # := {chanidx}*2+{direction} + for i, c in enumerate(channels): + for d in (0, 1): + if not c.half[d].enabled: + write_bignum(cfile, i * 2 + d) + write_bignum(cfile, len(channels) * 2) + + # := {channel_count}*{capacity_idx} + # := {capacity_count} {channel_count}*{capacity} + max_htlc_defaults = [] + write_bignum(cfile, len(channels)) + for c in channels: + write_bignum(cfile, c.capacity_sats) + max_htlc_defaults.append(c.capacity_sats) + max_htlc_defaults.append(c.capacity_sats) + + for i, _ in enumerate(channels): + write_bignum(cfile, i) + + # := {channel_ count*2}*{htlc_min_idx} + # := {htlc_min_count} {htlc_min_count}*{htlc_min} + write_dumb_template(cfile, channels, 'htlc_min') + # := {channel_count*2}*{htlc_max_idx} + # := {htlc_max_count} {htlc_max_count}*{htlc_max} + # 0 and 1 have special meanings, don't use them! + write_dumb_template(cfile, channels, 'htlc_max', [0, 1]) + # := {channel_count*2}*{basefee_idx} + # := {basefee_count} {basefee_count}*{basefee} + write_dumb_template(cfile, channels, 'basefee') + # := {channel_count*2}*{propfee_idx} + # := {propfee_count} {propfee_count}*{propfee} + write_dumb_template(cfile, channels, 'propfee') + # := {channel_count*2}*{delay_idx} + # := {delay_count} {delay_count}*{delay} + write_dumb_template(cfile, channels, 'delay') + + cfile.flush() + + outfile = tempfile.NamedTemporaryFile(prefix='gossip-store-') + nodeids = subprocess.check_output(['devtools/gossmap-compress', + '--nodes={}'.format(','.join(nodeids)), + 'decompress', + cfile.name, + outfile.name]).decode('utf-8').splitlines() + cfile.close() + + # Create map of their node names to the ids. + nodemap = {} + for i, n in enumerate(nodeids): + nodemap[nodes[i]] = n + + return outfile, nodemap diff --git a/tools/fromschema.py b/tools/fromschema.py index 9c5d9abf28ea..9ee132413d8b 100755 --- a/tools/fromschema.py +++ b/tools/fromschema.py @@ -297,7 +297,12 @@ def create_shell_command(rpc, example): shell_command = f'lightning-cli {rpc} ' if 'params' in example['request']: if isinstance(example['request']['params'], list): - shell_command += ' '.join(f'"{item}"' for item in example['request']['params']) + if rpc == 'sql' and example['request']['params'] and '=' in example['request']['params'][0]: + # For SQL queries in shell, prepend '-o' flag to the query + query = example['request']['params'][0] + shell_command += f"-o '{query}'" if "'" not in query else f'-o "{query}"' + else: + shell_command += ' '.join(f'"{item}"' for item in example['request']['params']) elif example['request']['params'].items(): shell_command += '-k ' for k, v in example['request']['params'].items(): diff --git a/tools/reckless b/tools/reckless index ac6247673b96..f029daafd53b 100755 --- a/tools/reckless +++ b/tools/reckless @@ -21,16 +21,89 @@ from urllib.error import HTTPError import venv +__VERSION__ = '24.08' + logging.basicConfig( - level=logging.DEBUG, + level=logging.INFO, format='[%(asctime)s] %(levelname)s: %(message)s', handlers=[logging.StreamHandler(stream=sys.stdout)], ) +LAST_FOUND = None + + +class Logger: + """Redirect logging output to a json object or stdout as appropriate.""" + def __init__(self, capture: bool = False): + self.json_output = {"result": [], + "log": []} + self.capture = capture + + def str_esc(self, raw_string: str) -> str: + assert isinstance(raw_string, str) + return json.dumps(raw_string)[1:-1] + + def debug(self, to_log: str): + assert isinstance(to_log, str) or hasattr(to_log, "__repr__") + if logging.root.level > logging.DEBUG: + return + if self.capture: + self.json_output['log'].append(self.str_esc(f"DEBUG: {to_log}")) + else: + logging.debug(to_log) + + def info(self, to_log: str): + assert isinstance(to_log, str) or hasattr(to_log, "__repr__") + if logging.root.level > logging.INFO: + return + if self.capture: + self.json_output['log'].append(self.str_esc(f"INFO: {to_log}")) + else: + print(to_log) + + def warning(self, to_log: str): + assert isinstance(to_log, str) or hasattr(to_log, "__repr__") + if logging.root.level > logging.WARNING: + return + if self.capture: + self.json_output['log'].append(self.str_esc(f"WARNING: {to_log}")) + else: + logging.warning(to_log) + + def error(self, to_log: str): + assert isinstance(to_log, str) or hasattr(to_log, "__repr__") + if logging.root.level > logging.ERROR: + return + if self.capture: + self.json_output['log'].append(self.str_esc(f"ERROR: {to_log}")) + else: + logging.error(to_log) + + def add_result(self, result: Union[str, None]): + assert json.dumps(result), "result must be json serializable" + self.json_output["result"].append(result) + + def reply_json(self): + """json output to stdout with accumulated result.""" + if len(log.json_output["result"]) == 1 and \ + isinstance(log.json_output["result"][0], list): + # unpack sources output + log.json_output["result"] = log.json_output["result"][0] + print(json.dumps(log.json_output, indent=3)) + + +log = Logger() repos = ['https://github.com/lightningd/plugins'] +def reckless_abort(err: str): + log.error(err) + log.add_result(None) + log.reply_json() + sys.exit(1) + + def py_entry_guesses(name) -> list: return [name, f'{name}.py', '__init__.py'] @@ -52,13 +125,12 @@ class Installer: The identification of a plugin language, compiler or interpreter availability, and the install procedures. ''' - def __init__(self, name: str, mimetype: str, + def __init__(self, name: str, exe: Union[str, None] = None, compiler: Union[str, None] = None, manager: Union[str, None] = None, entry: Union[str, None] = None): self.name = name - self.mimetype = mimetype self.entries = [] if entry: self.entries.append(entry) @@ -69,7 +141,7 @@ class Installer: self.dependency_call = None def __repr__(self): - return (f'') def executable(self) -> bool: @@ -123,12 +195,12 @@ class InstInfo: def __init__(self, name: str, location: str, git_url: str): self.name = name self.source_loc = str(location) # Used for 'git clone' - self.git_url = git_url # API access for github repos - self.srctype = Source.get_type(location) - self.entry = None # relative to source_loc or subdir - self.deps = None - self.subdir = None - self.commit = None + self.git_url: str = git_url # API access for github repos + self.srctype: Source = Source.get_type(location) + self.entry: SourceFile = None # relative to source_loc or subdir + self.deps: str = None + self.subdir: str = None + self.commit: str = None def __repr__(self): return (f'InstInfo({self.name}, {self.source_loc}, {self.git_url}, ' @@ -185,7 +257,7 @@ class InstInfo: self.entry = found_entry.name self.deps = found_dep.name return sub - logging.debug(f"missing dependency for {self}") + log.debug(f"missing dependency for {self}") found_entry = None for file in sub.contents: if isinstance(file, SourceDir): @@ -206,9 +278,9 @@ class InstInfo: # clone source to reckless dir target = copy_remote_git_source(self) if not target: - logging.warning(f"could not clone github source {self}") + log.warning(f"could not clone github source {self}") return False - logging.debug(f"falling back to cloning remote repo {self}") + log.debug(f"falling back to cloning remote repo {self}") # Update to reflect use of a local clone self.source_loc = target.location self.srctype = target.srctype @@ -246,9 +318,10 @@ def remove_dir(directory: str) -> bool: shutil.rmtree(directory) return True except NotADirectoryError: - print(f"Tried to remove directory {directory} that does not exist.") + log.warning(f"Tried to remove directory {directory} that " + "does not exist.") except PermissionError: - print(f"Permission denied removing dir: {directory}") + log.warning(f"Permission denied removing dir: {directory}") return False @@ -309,7 +382,6 @@ class SourceDir(): return if not self.srctype: self.srctype = Source.get_type(self.location) - # logging.debug(f"populating {self.srctype} {self.location}") if self.srctype == Source.DIRECTORY: self.contents = populate_local_dir(self.location) elif self.srctype in [Source.LOCAL_REPO, Source.GIT_LOCAL_CLONE]: @@ -394,7 +466,7 @@ def populate_local_repo(path: str, parent=None) -> list: This populates all intermediate directories and the file.""" parentdir = parent if mypath == '.': - logging.debug(' asked to populate root dir') + log.debug(' asked to populate root dir') return # reverse the parents pdirs = mypath @@ -431,7 +503,7 @@ def populate_local_repo(path: str, parent=None) -> list: proc = run(['git', '-C', path, 'submodule', 'status'], stdout=PIPE, stderr=PIPE, text=True, timeout=5) if proc.returncode != 0: - logging.debug(f"'git submodule status' of repo {path} failed") + log.debug(f"'git submodule status' of repo {path} failed") return None submodules = [] for sub in proc.stdout.splitlines(): @@ -443,7 +515,7 @@ def populate_local_repo(path: str, parent=None) -> list: '--name-only', ver] proc = run(git_call, stdout=PIPE, stderr=PIPE, text=True, timeout=5) if proc.returncode != 0: - logging.debug(f'ls-tree of repo {path} failed') + log.debug(f'ls-tree of repo {path} failed') return None for filepath in proc.stdout.splitlines(): @@ -482,7 +554,7 @@ def source_element_from_repo_api(member: dict): # git_url with /tree/ presents results a little differently elif 'type' in member and 'path' in member and 'url' in member: if member['type'] not in ['tree', 'blob']: - logging.debug(f' skipping {member["path"]} type={member["type"]}') + log.debug(f' skipping {member["path"]} type={member["type"]}') if member['type'] == 'tree': return SourceDir(member['url'], srctype=Source.GITHUB_REPO, name=member['path']) @@ -531,7 +603,7 @@ def populate_github_repo(url: str) -> list: git_url = api_url if "api.github.com" in git_url: # This lets us redirect to handle blackbox testing - logging.debug(f'fetching from gh API: {git_url}') + log.debug(f'fetching from gh API: {git_url}') git_url = (API_GITHUB_COM + git_url.split("api.github.com")[-1]) # Ratelimiting occurs for non-authenticated GH API calls at 60 in 1 hour. r = urlopen(git_url, timeout=5) @@ -552,14 +624,14 @@ def copy_remote_git_source(github_source: InstInfo): """clone or fetch & checkout a local copy of a remote git repo""" user, repo = Source.get_github_user_repo(github_source.source_loc) if not user or not repo: - logging.warning('could not extract github user and repo ' - f'name for {github_source.source_loc}') + log.warning('could not extract github user and repo ' + f'name for {github_source.source_loc}') return None local_path = RECKLESS_DIR / '.remote_sources' / user create_dir(RECKLESS_DIR / '.remote_sources') if not create_dir(local_path): - logging.warning(f'could not provision dir {local_path} to ' - f'clone remote source {github_source.source_loc}') + log.warning(f'could not provision dir {local_path} to ' + f'clone remote source {github_source.source_loc}') return None local_path = local_path / repo if local_path.exists(): @@ -586,13 +658,17 @@ class Config(): with open(config_path, 'r+') as f: config_content = f.readlines() return config_content + # redirecting the prompts to stderr is kinder for json consumers + tmp = sys.stdout + sys.stdout = sys.stderr print(f'config file not found: {config_path}') if warn: confirm = input('press [Y] to create one now.\n').upper() == 'Y' else: confirm = True + sys.stdout = tmp if not confirm: - sys.exit(1) + reckless_abort(f"config file required: {config_path}") parent_path = Path(config_path).parent # Create up to one parent in the directory tree. if create_dir(parent_path): @@ -601,8 +677,8 @@ class Config(): # FIXME: Handle write failure return default_text else: - logging.debug('could not create the parent directory ' + - parent_path) + log.warning('could not create the parent directory ' + + parent_path) raise FileNotFoundError('invalid parent directory') def editConfigFile(self, addline: Union[str, None], @@ -699,6 +775,10 @@ class LightningBitcoinConfig(Config): default_text=default_text, warn=warn) +class NotFoundError(Exception): + """Raised by InferInstall when a source/entrypoint cannot be located.""" + + class InferInstall(): """Once a plugin is installed, we may need its directory and entrypoint""" def __init__(self, name: str): @@ -727,7 +807,8 @@ class InferInstall(): actual_name = reck_contents_lower[name.lower()] self.dir = Path(RECKLESS_CONFIG.reckless_dir).joinpath(actual_name) else: - raise Exception(f"Could not find a reckless directory for {name}") + raise NotFoundError("Could not find a reckless directory " + f"for {name}") plug_dir = Path(RECKLESS_CONFIG.reckless_dir).joinpath(actual_name) for guess in entry_guesses(actual_name): for content in plug_dir.iterdir(): @@ -735,7 +816,7 @@ class InferInstall(): self.entry = str(content) self.name = actual_name return - raise Exception(f'plugin entrypoint not found in {self.dir}') + raise NotFoundError(f'plugin entrypoint not found in {self.dir}') class InstallationFailure(Exception): @@ -746,16 +827,12 @@ def create_python3_venv(staged_plugin: InstInfo) -> InstInfo: "Create a virtual environment, install dependencies and test plugin." env_path = Path('.venv') env_path_full = Path(staged_plugin.source_loc) / env_path - plugin_path = Path(staged_plugin.source_loc) / 'source' - - # subdir should always be None at this point - if staged_plugin.subdir: - logging.warning("cloned plugin contains subdirectory") - plugin_path = plugin_path / staged_plugin.subdir + assert staged_plugin.subdir # relative dir of original source + plugin_path = Path(staged_plugin.source_loc) / staged_plugin.subdir if shutil.which('poetry') and staged_plugin.deps == 'pyproject.toml': - logging.debug('configuring a python virtual environment (poetry) in ' - f'{env_path_full}') + log.debug('configuring a python virtual environment (poetry) in ' + f'{env_path_full}') # The virtual environment should be located with the plugin. # This installs it to .venv instead of in the global location. mod_poetry_env = os.environ @@ -774,7 +851,8 @@ def create_python3_venv(staged_plugin: InstInfo) -> InstInfo: # Avoid redirecting stdout in order to stream progress. # Timeout excluded as armv7 grpcio build/install can take 1hr. pip = run(['poetry', 'install', '--no-root'], check=False, - cwd=staged_plugin.source_loc, env=mod_poetry_env) + cwd=staged_plugin.source_loc, env=mod_poetry_env, + stdout=stdout_redirect, stderr=stderr_redirect) (Path(staged_plugin.source_loc) / 'pyproject.toml').unlink() (Path(staged_plugin.source_loc) / 'poetry.lock').unlink() @@ -782,25 +860,25 @@ def create_python3_venv(staged_plugin: InstInfo) -> InstInfo: else: builder = venv.EnvBuilder(with_pip=True) builder.create(env_path_full) - logging.debug('configuring a python virtual environment (pip) in ' - f'{env_path_full}') - logging.debug(f'virtual environment created in {env_path_full}.') + log.debug('configuring a python virtual environment (pip) in ' + f'{env_path_full}') + log.debug(f'virtual environment created in {env_path_full}.') if staged_plugin.deps == 'pyproject.toml': pip = run(['bin/pip', 'install', str(plugin_path)], check=False, cwd=plugin_path) elif staged_plugin.deps == 'requirements.txt': pip = run([str(env_path_full / 'bin/pip'), 'install', '-r', str(plugin_path / 'requirements.txt')], - check=False, cwd=plugin_path) + check=False, cwd=plugin_path, + stdout=stdout_redirect, stderr=stderr_redirect) else: - logging.debug("no python dependency file") + log.debug("no python dependency file") if pip and pip.returncode != 0: - logging.debug("install to virtual environment failed") - print('error encountered installing dependencies') + log.error('error encountered installing dependencies') raise InstallationFailure staged_plugin.venv = env_path - print('dependencies installed successfully') + log.info('dependencies installed successfully') return staged_plugin @@ -813,8 +891,10 @@ def create_wrapper(plugin: InstInfo): wrapper.write((f"#!{venv_full_path}/bin/python\n" "import sys\n" "import runpy\n\n" - f"if '{plugin.source_loc}/source' not in sys.path:\n" - f" sys.path.append('{plugin.source_loc}/source')\n" + f"if '{plugin.source_loc}/{plugin.subdir}' not in " + "sys.path:\n" + f" sys.path.append('{plugin.source_loc}/" + f"{plugin.subdir}')\n" f"if '{plugin.source_loc}' in sys.path:\n" f" sys.path.remove('{plugin.source_loc}')\n" f"runpy.run_module(\"{plugin.name}\", " @@ -827,34 +907,67 @@ def install_to_python_virtual_environment(cloned_plugin: InstInfo): '''Called during install in place of a subprocess.run list''' # Delete symlink so that a venv wrapper can take it's place (Path(cloned_plugin.source_loc) / cloned_plugin.entry).unlink() - # The original entrypoint is imported as a python module - ensure - # it has a .py extension. The wrapper can keep the original naming. - entry = Path(cloned_plugin.source_loc) / 'source' / cloned_plugin.entry - entry.rename(entry.with_suffix('.py')) create_python3_venv(cloned_plugin) if not hasattr(cloned_plugin, 'venv'): raise InstallationFailure - logging.debug('virtual environment for cloned plugin: ' - f'{cloned_plugin.venv}') + log.debug('virtual environment for cloned plugin: ' + f'{cloned_plugin.venv}') create_wrapper(cloned_plugin) return cloned_plugin -python3venv = Installer('python3venv', 'text/x-python', exe='python3', +def cargo_installation(cloned_plugin: InstInfo): + call = ['cargo', 'build', '--release', '-vv'] + # FIXME: the symlinked Cargo.toml allows the installer to identify a valid + # plugin directory, but is unneeded, and actually confuses cargo if not + # removed prior to installing. + cargo_toml_path = Path(cloned_plugin.source_loc) / 'Cargo.toml' + if cargo_toml_path.exists(): + cargo_toml_path.unlink() + + # source_loc now contains a symlink to the entrypoint and 'source/plugin/' + source = Path(cloned_plugin.source_loc) / 'source' / cloned_plugin.name + log.debug(f'cargo installing from {source}') + if logging.root.level < logging.INFO and not log.capture: + cargo = run(call, cwd=str(source), text=True) + else: + cargo = run(call, cwd=str(source), stdout=PIPE, + stderr=PIPE, text=True) + + if cargo.returncode == 0: + log.debug('rust project compiled successfully') + else: + log.error(cargo.stderr if cargo.stderr else + 'error encountered during build, cargo exited with return ' + f'code {cargo.returncode}') + + log.debug(f'removing {cloned_plugin.source_loc}') + remove_dir(cloned_plugin.source_loc) + raise InstallationFailure + + # We do need to symlink to the executable binary though. + (Path(cloned_plugin.source_loc) / cloned_plugin.name).\ + symlink_to(source / f'target/release/{cloned_plugin.name}') + cloned_plugin.entry = cloned_plugin.name + + return cloned_plugin + + +python3venv = Installer('python3venv', exe='python3', manager='pip', entry='{name}.py') python3venv.add_entrypoint('{name}') python3venv.add_entrypoint('__init__.py') python3venv.add_dependency_file('requirements.txt') python3venv.dependency_call = install_to_python_virtual_environment -poetryvenv = Installer('poetryvenv', 'text/x-python', exe='python3', +poetryvenv = Installer('poetryvenv', exe='python3', manager='poetry', entry='{name}.py') poetryvenv.add_entrypoint('{name}') poetryvenv.add_entrypoint('__init__.py') poetryvenv.add_dependency_file('pyproject.toml') poetryvenv.dependency_call = install_to_python_virtual_environment -pyprojectViaPip = Installer('pyprojectViaPip', 'text/x-python', exe='python3', +pyprojectViaPip = Installer('pyprojectViaPip', exe='python3', manager='pip', entry='{name}.py') pyprojectViaPip.add_entrypoint('{name}') pyprojectViaPip.add_entrypoint('__init__.py') @@ -863,20 +976,25 @@ pyprojectViaPip.dependency_call = install_to_python_virtual_environment # Nodejs plugin installer -nodejs = Installer('nodejs', 'application/javascript', exe='node', +nodejs = Installer('nodejs', exe='node', manager='npm', entry='{name}.js') nodejs.add_entrypoint('{name}') nodejs.add_dependency_call(['npm', 'install', '--omit=dev']) nodejs.add_dependency_file('package.json') -INSTALLERS = [python3venv, poetryvenv, pyprojectViaPip, nodejs] +# This entrypoint is used to identify a candidate directory, don't call it. +rust_cargo = Installer('rust', manager='cargo', entry='Cargo.toml') +rust_cargo.add_dependency_file('Cargo.toml') +rust_cargo.dependency_call = cargo_installation + +INSTALLERS = [python3venv, poetryvenv, pyprojectViaPip, nodejs, rust_cargo] def help_alias(targets: list): if len(targets) == 0: parser.print_help(sys.stdout) else: - print('try "reckless {} -h"'.format(' '.join(targets))) + log.info('try "reckless {} -h"'.format(' '.join(targets))) sys.exit(1) @@ -897,8 +1015,8 @@ def _source_search(name: str, src: str) -> Union[InstInfo, None]: if local_clone_location.exists(): # Make sure it's the correct remote source and fetch any updates. if _git_update(source, local_clone_location): - logging.debug(f"Using local clone of {src}: " - f"{local_clone_location}") + log.debug(f"Using local clone of {src}: " + f"{local_clone_location}") source.source_loc = local_clone_location source.srctype = Source.GIT_LOCAL_CLONE @@ -908,7 +1026,7 @@ def _source_search(name: str, src: str) -> Union[InstInfo, None]: def _git_clone(src: InstInfo, dest: Union[PosixPath, str]) -> bool: - print(f'cloning {src.srctype} {src}') + log.info(f'cloning {src.srctype} {src}') if src.srctype == Source.GITHUB_REPO: assert 'github.com' in src.source_loc source = f"{GITHUB_COM}" + src.source_loc.split("github.com")[-1] @@ -918,13 +1036,13 @@ def _git_clone(src: InstInfo, dest: Union[PosixPath, str]) -> bool: else: return False git = run(['git', 'clone', '--recurse-submodules', source, str(dest)], - stdout=PIPE, stderr=PIPE, text=True, check=False, timeout=60) + stdout=PIPE, stderr=PIPE, text=True, check=False, timeout=180) if git.returncode != 0: for line in git.stderr.splitlines(): - logging.debug(line) + log.debug(line) if Path(dest).exists(): remove_dir(str(dest)) - print('Error: Failed to clone repo') + log.error('Failed to clone repo') return False return True @@ -955,8 +1073,8 @@ def _git_update(github_source: InstInfo, local_copy: PosixPath): return False default_branch = git.stdout.splitlines()[0] if default_branch != 'origin/master': - logging.debug(f'UNUSUAL: fetched default branch {default_branch} for ' - f'{github_source.source_loc}') + log.debug(f'UNUSUAL: fetched default branch {default_branch} for ' + f'{github_source.source_loc}') # Checkout default branch git = run(['git', 'checkout', default_branch], @@ -1002,31 +1120,31 @@ def _checkout_commit(orig_src: InstInfo, if orig_src.srctype in [Source.LOCAL_REPO, Source.GITHUB_REPO, Source.OTHER_URL, Source.GIT_LOCAL_CLONE]: if orig_src.commit: - logging.debug(f"Checking out {orig_src.commit}") + log.debug(f"Checking out {orig_src.commit}") checkout = Popen(['git', 'checkout', orig_src.commit], cwd=str(cloned_path), stdout=PIPE, stderr=PIPE) checkout.wait() if checkout.returncode != 0: - print('failed to checkout referenced ' - f'commit {orig_src.commit}') + log.warning('failed to checkout referenced ' + f'commit {orig_src.commit}') return None else: - logging.debug("using latest commit of default branch") + log.debug("using latest commit of default branch") # Log the commit we actually used (for installation metadata) git = run(['git', 'rev-parse', 'HEAD'], cwd=str(cloned_path), stdout=PIPE, stderr=PIPE, text=True, check=False, timeout=60) if git.returncode == 0: head_commit = git.stdout.splitlines()[0] - logging.debug(f'checked out HEAD: {head_commit}') + log.debug(f'checked out HEAD: {head_commit}') cloned_src.commit = head_commit else: - logging.debug(f'unable to collect commit: {git.stderr}') + log.debug(f'unable to collect commit: {git.stderr}') else: if orig_src.commit: - logging.warning("unable to checkout commit/tag on non-repository " - "source") + log.warning("unable to checkout commit/tag on non-repository " + "source") return cloned_path if cloned_src.subdir is not None: @@ -1036,29 +1154,29 @@ def _checkout_commit(orig_src: InstInfo, def _install_plugin(src: InstInfo) -> Union[InstInfo, None]: """make sure the repo exists and clone it.""" - logging.debug(f'Install requested from {src}.') + log.debug(f'Install requested from {src}.') if RECKLESS_CONFIG is None: - print('error: reckless install directory unavailable') - sys.exit(2) + log.error('reckless install directory unavailable') + return None # Use a unique directory for each cloned repo. tmp_path = get_temp_reckless_dir() if not create_dir(tmp_path): - logging.debug(f'failed to create {tmp_path}') + log.debug(f'failed to create {tmp_path}') return None clone_path = tmp_path / 'clone' if not create_dir(tmp_path): - logging.debug(f'failed to create {clone_path}') + log.debug(f'failed to create {clone_path}') return None # we rename the original repo here. plugin_path = clone_path / src.name inst_path = Path(RECKLESS_CONFIG.reckless_dir) / src.name if Path(clone_path).exists(): - logging.debug(f'{clone_path} already exists - deleting') + log.debug(f'{clone_path} already exists - deleting') shutil.rmtree(clone_path) if src.srctype == Source.DIRECTORY: - logging.debug(("copying local directory contents from" - f" {src.source_loc}")) + log.debug(("copying local directory contents from" + f" {src.source_loc}")) create_dir(clone_path) shutil.copytree(src.source_loc, plugin_path) elif src.srctype in [Source.LOCAL_REPO, Source.GITHUB_REPO, @@ -1070,9 +1188,9 @@ def _install_plugin(src: InstInfo) -> Union[InstInfo, None]: # Depending on how we accessed the original source, there may be install # details missing. Searching the cloned repo makes sure we have it. cloned_src = _source_search(src.name, str(clone_path)) - logging.debug(f'cloned_src: {cloned_src}') + log.debug(f'cloned_src: {cloned_src}') if not cloned_src: - logging.debug('failed to find plugin after cloning repo.') + log.warning('failed to find plugin after cloning repo.') return None # If a specific commit or tag was requested, check it out now. @@ -1088,11 +1206,12 @@ def _install_plugin(src: InstInfo) -> Union[InstInfo, None]: if inst_method.dependency_file is not None: if inst_method.dependency_file not in os.listdir(plugin_path): continue - logging.debug(f"using installer {inst_method.name}") + log.debug(f"using installer {inst_method.name}") INSTALLER = inst_method break if not INSTALLER: - logging.debug('Could not find a suitable installer method.') + log.warning('Could not find a suitable installer method for ' + f'{src.name}') return None if not cloned_src.entry: # The plugin entrypoint may not be discernable prior to cloning. @@ -1100,17 +1219,28 @@ def _install_plugin(src: InstInfo) -> Union[InstInfo, None]: cloned_src.source_loc = plugin_path # Relocate plugin to a staging directory prior to testing - staging_path = inst_path / 'source' + if not Path(inst_path).exists(): + log.debug(f'creating {inst_path}') + create_dir(inst_path) + if not Path(inst_path / 'source').exists(): + log.debug(f'creating {inst_path / "source"}') + create_dir(inst_path / 'source') + staging_path = inst_path / 'source' / src.name + log.debug(f'copying {plugin_path} tree to {staging_path}') shutil.copytree(str(plugin_path), staging_path) staged_src = cloned_src # Because the source files are copied to a 'source' directory, the # get_inst_details function no longer works. (dir must match plugin name) # Set these manually instead. - staged_src.source_loc = str(staging_path.parent) + staged_src.source_loc = str(inst_path) staged_src.srctype = Source.DIRECTORY - staged_src.subdir = None + # Use subdir to redirect the symlink to the actual executable location + staged_src.subdir = f'source/{src.name}' # Create symlink in staging tree to redirect to the plugins entrypoint - Path(staging_path.parent / cloned_src.entry).\ + log.debug(f"linking source {staging_path / cloned_src.entry} to " + f"{Path(staged_src.source_loc) / cloned_src.entry}") + log.debug(staged_src) + (Path(staged_src.source_loc) / cloned_src.entry).\ symlink_to(staging_path / cloned_src.entry) # try it out @@ -1122,8 +1252,8 @@ def _install_plugin(src: InstInfo) -> Union[InstInfo, None]: return None else: for call in INSTALLER.dependency_call: - logging.debug(f"Install: invoking '{' '.join(call)}'") - if logging.root.level < logging.WARNING: + log.debug(f"Install: invoking '{' '.join(call)}'") + if logging.root.level < logging.INFO: pip = Popen(call, cwd=staging_path, text=True) else: pip = Popen(call, cwd=staging_path, stdout=PIPE, @@ -1132,14 +1262,15 @@ def _install_plugin(src: InstInfo) -> Union[InstInfo, None]: # FIXME: handle output of multiple calls if pip.returncode == 0: - print('dependencies installed successfully') + log.info('dependencies installed successfully') else: - print('error encountered installing dependencies') + log.error('error encountered installing dependencies') if pip.stdout: - logging.debug(pip.stdout.read()) + log.debug(pip.stdout.read()) remove_dir(clone_path) remove_dir(inst_path) return None + staged_src.subdir = None test_log = [] try: test = run([Path(staged_src.source_loc).joinpath(staged_src.entry)], @@ -1152,39 +1283,47 @@ def _install_plugin(src: InstInfo) -> Union[InstInfo, None]: # If the plugin is still running, it's assumed to be okay. returncode = 0 if returncode != 0: - logging.debug("plugin testing error:") + log.debug("plugin testing error:") for line in test_log: - logging.debug(f' {line}') - print('plugin testing failed') + log.debug(f' {line}') + log.error('plugin testing failed') remove_dir(clone_path) remove_dir(inst_path) return None add_installation_metadata(staged_src, src) - print(f'plugin installed: {inst_path}') + log.info(f'plugin installed: {inst_path}') remove_dir(clone_path) return staged_src -def install(plugin_name: str): - """downloads plugin from source repos, installs and activates plugin""" +def install(plugin_name: str) -> Union[str, None]: + """Downloads plugin from source repos, installs and activates plugin. + Returns the location of the installed plugin or "None" in the case of + failure.""" assert isinstance(plugin_name, str) # Specify a tag or commit to checkout by adding @ to plugin name if '@' in plugin_name: - logging.debug("testing for a commit/tag in plugin name") + log.debug("testing for a commit/tag in plugin name") name, commit = plugin_name.split('@', 1) else: name = plugin_name commit = None - logging.debug(f"Searching for {name}") - src = search(name) - if src: + log.debug(f"Searching for {name}") + if search(name): + global LAST_FOUND + src = LAST_FOUND src.commit = commit - logging.debug(f'Retrieving {src.name} from {src.source_loc}') - installed = _install_plugin(src) + log.debug(f'Retrieving {src.name} from {src.source_loc}') + try: + installed = _install_plugin(src) + except FileExistsError as err: + log.error(f'File exists: {err.filename}') + return None + LAST_FOUND = None if not installed: - print('installation aborted') - sys.exit(1) + log.warning(f'{plugin_name}: installation aborted') + return None # Match case of the containing directory for dirname in os.listdir(RECKLESS_CONFIG.reckless_dir): @@ -1193,24 +1332,34 @@ def install(plugin_name: str): inst_path = inst_path / dirname / installed.entry RECKLESS_CONFIG.enable_plugin(inst_path) enable(installed.name) - return - print(('dynamic activation failed: ' - f'{installed.name} not found in reckless directory')) - sys.exit(1) + return f"{installed.source_loc}" + log.error(('dynamic activation failed: ' + f'{installed.name} not found in reckless directory')) + return None + return None -def uninstall(plugin_name: str): - """disables plugin and deletes the plugin's reckless dir""" +def uninstall(plugin_name: str) -> str: + """dDisables plugin and deletes the plugin's reckless dir. Returns the + status of the uninstall attempt.""" assert isinstance(plugin_name, str) - logging.debug(f'Uninstalling plugin {plugin_name}') + log.debug(f'Uninstalling plugin {plugin_name}') disable(plugin_name) - inst = InferInstall(plugin_name) + try: + inst = InferInstall(plugin_name) + except NotFoundError as err: + log.error(err) + return "uninstall failed" if not Path(inst.entry).exists(): - print(f'cannot find installed plugin at expected path {inst.entry}') - sys.exit(1) - logging.debug(f'looking for {str(Path(inst.entry).parent)}') + log.error("cannot find installed plugin at expected path" + f"{inst.entry}") + return "uninstall failed" + log.debug(f'looking for {str(Path(inst.entry).parent)}') if remove_dir(str(Path(inst.entry).parent)): - print(f"{inst.name} uninstalled successfully.") + log.info(f"{inst.name} uninstalled successfully.") + else: + return "uninstall failed" + return "uninstalled" def search(plugin_name: str) -> Union[InstInfo, None]: @@ -1231,19 +1380,22 @@ def search(plugin_name: str) -> Union[InstInfo, None]: for source in ordered_sources: srctype = Source.get_type(source) if srctype == Source.UNKNOWN: - logging.debug(f'cannot search {srctype} {source}') + log.debug(f'cannot search {srctype} {source}') continue if srctype in [Source.DIRECTORY, Source.LOCAL_REPO, Source.GITHUB_REPO, Source.OTHER_URL]: found = _source_search(plugin_name, source) if not found: continue - print(f"found {found.name} in source: {found.source_loc}") - logging.debug(f"entry: {found.entry}") + log.info(f"found {found.name} in source: {found.source_loc}") + log.debug(f"entry: {found.entry}") if found.subdir: - logging.debug(f'sub-directory: {found.subdir}') - return found - logging.debug("Search exhausted all sources") + log.debug(f'sub-directory: {found.subdir}') + global LAST_FOUND + # Stashing the search result saves install() a call to _source_search. + LAST_FOUND = found + return str(found.source_loc) + log.info("Search exhausted all sources") return None @@ -1293,50 +1445,63 @@ def lightning_cli(*cli_args, timeout: int = 15) -> dict: def enable(plugin_name: str): """dynamically activates plugin and adds to config (persistent)""" assert isinstance(plugin_name, str) - inst = InferInstall(plugin_name) + try: + inst = InferInstall(plugin_name) + except NotFoundError as err: + log.error(err) + return None path = inst.entry if not Path(path).exists(): - print(f'cannot find installed plugin at expected path {path}') - sys.exit(1) - logging.debug(f'activating {plugin_name}') + log.error(f'cannot find installed plugin at expected path {path}') + return None + log.debug(f'activating {plugin_name}') try: lightning_cli('plugin', 'start', path) except CLIError as err: if 'already registered' in err.message: - logging.debug(f'{inst.name} is already running') + log.debug(f'{inst.name} is already running') + return None else: - print(f'reckless: {inst.name} failed to start!') - raise err + log.error(f'reckless: {inst.name} failed to start!') + log.error(err) + return None except RPCError: - logging.debug(('lightningd rpc unavailable. ' - 'Skipping dynamic activation.')) + log.debug(('lightningd rpc unavailable. ' + 'Skipping dynamic activation.')) RECKLESS_CONFIG.enable_plugin(path) - print(f'{inst.name} enabled') + log.info(f'{inst.name} enabled') + return 'enabled' def disable(plugin_name: str): """reckless disable deactivates an installed plugin""" assert isinstance(plugin_name, str) - inst = InferInstall(plugin_name) + try: + inst = InferInstall(plugin_name) + except NotFoundError as err: + log.warning(f'failed to disable: {err}') + return None path = inst.entry if not Path(path).exists(): sys.stderr.write(f'Could not find plugin at {path}\n') - sys.exit(1) - logging.debug(f'deactivating {plugin_name}') + return None + log.debug(f'deactivating {plugin_name}') try: lightning_cli('plugin', 'stop', path) except CLIError as err: if err.code == -32602: - logging.debug('plugin not currently running') + log.debug('plugin not currently running') else: - print('lightning-cli plugin stop failed') - raise err + log.error('lightning-cli plugin stop failed') + logging.error(err) + return None except RPCError: - logging.debug(('lightningd rpc unavailable. ' - 'Skipping dynamic deactivation.')) + log.debug(('lightningd rpc unavailable. ' + 'Skipping dynamic deactivation.')) RECKLESS_CONFIG.disable_plugin(path) - print(f'{inst.name} disabled') + log.info(f'{inst.name} disabled') + return 'disabled' def load_config(reckless_dir: Union[str, None] = None, @@ -1363,10 +1528,9 @@ def load_config(reckless_dir: Union[str, None] = None, reck_conf_path = Path(reckless_dir) / f'{network}-reckless.conf' if net_conf: if str(network_path) != net_conf.conf_fp: - print('error: reckless configuration does not match lightningd:\n' - f'reckless network config path: {network_path}\n' - f'lightningd active config: {net_conf.conf_fp}') - sys.exit(1) + reckless_abort('reckless configuration does not match lightningd:\n' + f'reckless network config path: {network_path}\n' + f'lightningd active config: {net_conf.conf_fp}') else: # The network-specific config file (bitcoin by default) net_conf = LightningBitcoinConfig(path=network_path) @@ -1374,13 +1538,11 @@ def load_config(reckless_dir: Union[str, None] = None, try: reckless_conf = RecklessConfig(path=reck_conf_path) except FileNotFoundError: - print('Error: reckless config file could not be written: ', - str(reck_conf_path)) - sys.exit(1) + reckless_abort('reckless config file could not be written: ' + + str(reck_conf_path)) if not net_conf: - print('Error: could not load or create the network specific lightningd' - ' config (default .lightning/bitcoin)') - sys.exit(1) + reckless_abort('Error: could not load or create the network specific lightningd' + ' config (default .lightning/bitcoin)') net_conf.editConfigFile(f'include {reckless_conf.conf_fp}', None) return reckless_conf @@ -1404,7 +1566,7 @@ def load_sources() -> list: sources_file = get_sources_file() # This would have been created if possible if not Path(sources_file).exists(): - logging.debug('Warning: Reckless requires write access') + log.debug('Warning: Reckless requires write access') Config(path=str(sources_file), default_text='https://github.com/lightningd/plugins') return ['https://github.com/lightningd/plugins'] @@ -1416,18 +1578,17 @@ def add_source(src: str): assert isinstance(src, str) # Is it a file? maybe_path = os.path.realpath(src) + sources = Config(path=str(get_sources_file()), + default_text='https://github.com/lightningd/plugins') if Path(maybe_path).exists(): if os.path.isdir(maybe_path): - default_repo = 'https://github.com/lightningd/plugins' - my_file = Config(path=str(get_sources_file()), - default_text=default_repo) - my_file.editConfigFile(src, None) + sources.editConfigFile(src, None) elif 'github.com' in src or 'http://' in src or 'https://' in src: - my_file = Config(path=str(get_sources_file()), - default_text='https://github.com/lightningd/plugins') - my_file.editConfigFile(src, None) + sources.editConfigFile(src, None) else: - print(f'failed to add source {src}') + log.warning(f'failed to add source {src}') + return None + return sources_from_file() def remove_source(src: str): @@ -1437,40 +1598,76 @@ def remove_source(src: str): my_file = Config(path=get_sources_file(), default_text='https://github.com/lightningd/plugins') my_file.editConfigFile(None, src) - print('plugin source removed') + log.info('plugin source removed') else: - print(f'source not found: {src}') + log.warning(f'source not found: {src}') + return sources_from_file() def list_source(): """Provide the user with all stored source repositories.""" for src in sources_from_file(): - print(src) + log.info(src) + return sources_from_file() + + +def report_version() -> str: + """return reckless version""" + log.info(__VERSION__) + log.add_result(__VERSION__) + + +def unpack_json_arg(json_target: str) -> list: + """validate json for any command line targets passes as a json array""" + try: + targets = json.loads(json_target) + except json.decoder.JSONDecodeError: + return None + if isinstance(targets, list): + return targets + log.warning(f'input {target_list} is not a json array') + return None + + +class StoreIdempotent(argparse.Action): + """Make the option idempotent. This adds a secondary argument that doesn't + get reinitialized. The downside is it""" + def __init__(self, option_strings, dest, nargs=None, **kwargs): + super().__init__(option_strings, dest, **kwargs) + + def __call__(self, parser, namespace, values, option_string=None): + if option_string: + setattr(namespace, self.dest, values) + setattr(namespace, f'{self.dest}_idempotent', values) + + +class StoreTrueIdempotent(argparse._StoreConstAction): + """Make the option idempotent""" + def __init__(self, option_strings, dest, default=False, + required=False, nargs=None, const=None, help=None): + super().__init__(option_strings=option_strings, dest=dest, + const=const, help=help) + + def __call__(self, parser, namespace, values, option_string=None): + if option_string: + setattr(namespace, self.dest, True) + setattr(namespace, f'{self.dest}_idempotent', True) + + +def process_idempotent_args(args): + """Swap idempotently set arguments back in for the default arg names.""" + original_args = dict(vars(args)) + for arg, value in original_args.items(): + if f"{arg}_idempotent" in vars(args): + setattr(args, f"{arg}", vars(args)[f"{arg}_idempotent"]) + delattr(args, f"{arg}_idempotent") + return args if __name__ == '__main__': parser = argparse.ArgumentParser() - # This default depends on the .lightning directory - parser.add_argument('-d', '--reckless-dir', - help='specify a data directory for reckless to use', - type=str, default=None) - parser.add_argument('-l', '--lightning', - help='lightning data directory (default:~/.lightning)', - type=str, - default=Path.home().joinpath('.lightning')) - parser.add_argument('-c', '--conf', - help=' config file used by lightningd', - type=str, - default=None) - parser.add_argument('-r', '--regtest', action='store_true') - parser.add_argument('--network', - help="specify a network to use (default: bitcoin)", - type=str) - parser.add_argument('-v', '--verbose', action="store_const", - dest="loglevel", const=logging.DEBUG, - default=logging.WARNING) cmd1 = parser.add_subparsers(dest='cmd1', help='command', - required=True) + required=False) install_cmd = cmd1.add_parser('install', help='search for and install a ' 'plugin, then test and activate') @@ -1514,17 +1711,63 @@ if __name__ == '__main__': '"reckless -h"') help_cmd.add_argument('targets', type=str, nargs='*') help_cmd.set_defaults(func=help_alias) + parser.add_argument('-V', '--version', + action=StoreTrueIdempotent, const=None, + help='print version and exit') + + all_parsers = [parser, install_cmd, uninstall_cmd, search_cmd, enable_cmd, + disable_cmd, list_parse, source_add, source_rem, help_cmd] + for p in all_parsers: + # This default depends on the .lightning directory + p.add_argument('-d', '--reckless-dir', action=StoreIdempotent, + help='specify a data directory for reckless to use', + type=str, default=None) + p.add_argument('-l', '--lightning', type=str, action=StoreIdempotent, + help='lightning data directory ' + '(default:~/.lightning)', + default=Path.home().joinpath('.lightning')) + p.add_argument('-c', '--conf', action=StoreIdempotent, + help=' config file used by lightningd', + type=str, + default=None) + p.add_argument('-r', '--regtest', action=StoreTrueIdempotent) + p.add_argument('--network', action=StoreIdempotent, + help="specify a network to use (default: bitcoin)", + type=str) + p.add_argument('-v', '--verbose', action=StoreTrueIdempotent, + const=None) + p.add_argument('-j', '--json', action=StoreTrueIdempotent, + help='output in json format') args = parser.parse_args() + args = process_idempotent_args(args) + + if args.json: + log.capture = True + stdout_redirect = PIPE + stderr_redirect = PIPE + else: + stdout_redirect = None + stderr_redirect = None + + if args.verbose: + logging.root.setLevel(logging.DEBUG) + else: + logging.root.setLevel(logging.INFO) NETWORK = 'regtest' if args.regtest else 'bitcoin' SUPPORTED_NETWORKS = ['bitcoin', 'regtest', 'liquid', 'liquid-regtest', 'litecoin', 'signet', 'testnet'] + if args.version: + report_version() + elif args.cmd1 is None: + parser.print_help(sys.stdout) + sys.exit(1) if args.network: if args.network in SUPPORTED_NETWORKS: NETWORK = args.network else: - print(f"Error: {args.network} network not supported") + log.error(f"{args.network} network not supported") LIGHTNING_DIR = Path(args.lightning) # This env variable is set under CI testing LIGHTNING_CLI_CALL = [os.environ.get('LIGHTNING_CLI')] @@ -1549,7 +1792,6 @@ if __name__ == '__main__': API_GITHUB_COM = os.environ['REDIR_GITHUB_API'] if 'REDIR_GITHUB' in os.environ: GITHUB_COM = os.environ['REDIR_GITHUB'] - logging.root.setLevel(args.loglevel) GITHUB_API_FALLBACK = False if 'GITHUB_API_FALLBACK' in os.environ: @@ -1561,6 +1803,15 @@ if __name__ == '__main__': args.func(args.targets) sys.exit(0) for target in args.targets: - args.func(target) - else: - args.func() + # Accept single item arguments, or a json array + target_list = unpack_json_arg(target) + if target_list: + for tar in target_list: + log.add_result(args.func(tar)) + else: + log.add_result(args.func(target)) + elif 'func' in args: + log.add_result(args.func()) + + if log.capture: + log.reply_json() diff --git a/tools/rel.sh b/tools/rel.sh deleted file mode 100755 index 8d1fd4262509..000000000000 --- a/tools/rel.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -from=${1} -to=${2} -common=$(printf '%s\n%s' "${from}" "${to}" | sed 'N;s/\(.*\).*\n\1.*$/\1/' | sed 's@/[^/]*$@/@') -prefix=$(printf '%s\n' "${from#"$common"}" | sed 's@[^/][^/]*@..@g') -printf '%s\n' "$prefix/${to#"$common"}" diff --git a/wallet/reservation.c b/wallet/reservation.c index 36a2536d9bd8..dffc48ab2c69 100644 --- a/wallet/reservation.c +++ b/wallet/reservation.c @@ -136,9 +136,7 @@ static struct command_result *json_reserveinputs(struct command *cmd, static const struct json_command reserveinputs_command = { "reserveinputs", - "bitcoin", json_reserveinputs, - "Reserve utxos (or increase their reservation)", false }; AUTODATA(json_command, &reserveinputs_command); @@ -220,9 +218,7 @@ static struct command_result *json_unreserveinputs(struct command *cmd, static const struct json_command unreserveinputs_command = { "unreserveinputs", - "bitcoin", json_unreserveinputs, - "Unreserve utxos (or at least, reduce their reservation)", false }; AUTODATA(json_command, &unreserveinputs_command); @@ -642,9 +638,7 @@ static struct command_result *json_fundpsbt(struct command *cmd, static const struct json_command fundpsbt_command = { "fundpsbt", - "bitcoin", json_fundpsbt, - "Create PSBT using enough utxos to allow an output of {satoshi} at {feerate}", false }; AUTODATA(json_command, &fundpsbt_command); @@ -736,9 +730,7 @@ static struct command_result *json_addpsbtoutput(struct command *cmd, static const struct json_command addpsbtoutput_command = { "addpsbtoutput", - "bitcoin", json_addpsbtoutput, - "Create a PSBT (or modify existing {initialpsbt}) with an output receiving {satoshi} amount.", false }; AUTODATA(json_command, &addpsbtoutput_command); @@ -914,9 +906,7 @@ static struct command_result *json_utxopsbt(struct command *cmd, } static const struct json_command utxopsbt_command = { "utxopsbt", - "bitcoin", json_utxopsbt, - "Create PSBT using these utxos", false }; AUTODATA(json_command, &utxopsbt_command); diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index 4f27c95dc0e6..8d45c180e53f 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -1002,7 +1002,7 @@ void topology_add_sync_waiter_(const tal_t *ctx UNNEEDED, u8 *towire_announcement_signatures(const tal_t *ctx UNNEEDED, const struct channel_id *channel_id UNNEEDED, struct short_channel_id short_channel_id UNNEEDED, const secp256k1_ecdsa_signature *node_signature UNNEEDED, const secp256k1_ecdsa_signature *bitcoin_signature UNNEEDED) { fprintf(stderr, "towire_announcement_signatures called!\n"); abort(); } /* Generated stub for towire_channel_reestablish */ -u8 *towire_channel_reestablish(const tal_t *ctx UNNEEDED, const struct channel_id *channel_id UNNEEDED, u64 next_commitment_number UNNEEDED, u64 next_revocation_number UNNEEDED, const struct secret *your_last_per_commitment_secret UNNEEDED, const struct pubkey *my_current_per_commitment_point UNNEEDED, const struct tlv_channel_reestablish_tlvs *channel_reestablish UNNEEDED) +u8 *towire_channel_reestablish(const tal_t *ctx UNNEEDED, const struct channel_id *channel_id UNNEEDED, u64 next_commitment_number UNNEEDED, u64 next_revocation_number UNNEEDED, const struct secret *your_last_per_commitment_secret UNNEEDED, const struct pubkey *my_current_per_commitment_point UNNEEDED, const struct tlv_channel_reestablish_tlvs *tlvs UNNEEDED) { fprintf(stderr, "towire_channel_reestablish called!\n"); abort(); } /* Generated stub for towire_channeld_dev_memleak */ u8 *towire_channeld_dev_memleak(const tal_t *ctx UNNEEDED) @@ -2295,7 +2295,7 @@ int main(int argc, const char *argv[]) ld->peers_by_dbid = tal(ld, struct peer_dbid_map); peer_dbid_map_init(ld->peers_by_dbid); ld->rr_counter = 0; - node_id_from_hexstr("02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc", 66, &ld->id); + node_id_from_hexstr("02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc", 66, &ld->our_nodeid); /* Accessed in peer destructor sanity check */ ld->htlcs_in = tal(ld, struct htlc_in_map); htlc_in_map_init(ld->htlcs_in); diff --git a/wallet/wallet.c b/wallet/wallet.c index 93eb22fcbbf4..082b99c84ac8 100644 --- a/wallet/wallet.c +++ b/wallet/wallet.c @@ -1693,6 +1693,7 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm db_col_signature(stmt, "last_sig", &last_sig->s); last_sig->sighash_type = SIGHASH_ALL; } else { + db_col_ignore(stmt, "last_sig"); last_tx = NULL; last_sig = NULL; } @@ -2416,7 +2417,7 @@ void wallet_channel_save(struct wallet *w, struct channel *chan) db_bind_u64(stmt, chan->channel_info.their_config.id); /* Any pubkey works here: use our own node id */ if (chan->has_future_per_commitment_point) - db_bind_node_id(stmt, &chan->peer->ld->id); + db_bind_node_id(stmt, &chan->peer->ld->our_nodeid); else db_bind_null(stmt); db_bind_u64(stmt, chan->dbid); @@ -4237,14 +4238,14 @@ bool wallet_sanity_check(struct wallet *w) db_col_node_id(stmt, "blobval", &id); tal_free(stmt); - if (!node_id_eq(&id, &w->ld->id)) { + if (!node_id_eq(&id, &w->ld->our_nodeid)) { log_broken(w->log, "Wallet node_id does not " "match HSM: %s " "!= %s. " "Did your hsm_secret change?", fmt_node_id(tmpctx, &id), fmt_node_id(tmpctx, - &w->ld->id)); + &w->ld->our_nodeid)); return false; } } else { @@ -4252,7 +4253,7 @@ bool wallet_sanity_check(struct wallet *w) /* Still a pristine wallet, claim it for the node_id we are now */ stmt = db_prepare_v2(w->db, SQL("INSERT INTO vars (name, blobval) " "VALUES ('node_id', ?);")); - db_bind_node_id(stmt, &w->ld->id); + db_bind_node_id(stmt, &w->ld->our_nodeid); db_exec_prepared_v2(take(stmt)); } return true; @@ -5568,6 +5569,20 @@ enum offer_status wallet_offer_disable(struct wallet *w, return newstatus; } +enum offer_status wallet_offer_enable(struct wallet *w, + const struct sha256 *offer_id, + enum offer_status s) +{ + enum offer_status newstatus; + + assert(!offer_status_active(s)); + + newstatus = offer_status_in_db(s | OFFER_STATUS_ACTIVE_F); + offer_status_update(w->db, offer_id, s, newstatus); + + return newstatus; +} + void wallet_offer_mark_used(struct db *db, const struct sha256 *offer_id) { struct db_stmt *stmt; diff --git a/wallet/wallet.h b/wallet/wallet.h index 0ec63e23a53b..f404222cd8da 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -1466,6 +1466,18 @@ enum offer_status wallet_offer_disable(struct wallet *w, enum offer_status s) NO_NULL_ARGS; +/** + * Enable an offer in the database. + * @w: the wallet + * @offer_id: the merkle root, as used for signing (must be unique) + * @s: the current status (must be active). + * + * Must exist. Returns new status. */ +enum offer_status wallet_offer_enable(struct wallet *w, + const struct sha256 *offer_id, + enum offer_status s) + NO_NULL_ARGS; + /** * Mark an offer in the database used. * @w: the wallet diff --git a/wallet/walletrpc.c b/wallet/walletrpc.c index 647487161ce9..08bbff722ef4 100644 --- a/wallet/walletrpc.c +++ b/wallet/walletrpc.c @@ -173,10 +173,7 @@ static struct command_result *json_newaddr(struct command *cmd, static const struct json_command newaddr_command = { "newaddr", - "bitcoin", json_newaddr, - "Get a new {bech32} (or all) address to fund a channel", - .verbose = "Generates a new address that belongs to the internal wallet. Funds sent to these addresses will be managed by lightningd. Use `withdraw` to withdraw funds to an external wallet." }; AUTODATA(json_command, &newaddr_command); @@ -245,10 +242,7 @@ static struct command_result *json_listaddrs(struct command *cmd, static const struct json_command listaddrs_command = { "dev-listaddrs", - "developer", json_listaddrs, - "Show addresses list up to derivation {index} (default is the last bip32 index)", - .verbose = "Show addresses of your internal wallet. Use `newaddr` to generate a new address.", .dev_only = true, }; AUTODATA(json_command, &listaddrs_command); @@ -392,13 +386,7 @@ static struct command_result *json_listfunds(struct command *cmd, static const struct json_command listfunds_command = { "listfunds", - "utility", json_listfunds, - "Show available funds from the internal wallet", - .verbose = "Returns a list of funds (outputs) that can be used " - "by the internal wallet to open new channels " - "or can be withdrawn, using the `withdraw` command, to another wallet. " - "Includes spent outputs if {spent} is set to true." }; AUTODATA(json_command, &listfunds_command); @@ -470,10 +458,7 @@ static struct command_result *json_dev_rescan_outputs(struct command *cmd, static const struct json_command dev_rescan_output_command = { "dev-rescan-outputs", - "developer", json_dev_rescan_outputs, - "Synchronize the state of our funds with bitcoind", - .verbose = "For each output stored in the internal wallet ask `bitcoind` whether we are in sync with its state (spent vs. unspent)", .dev_only = true, }; AUTODATA(json_command, &dev_rescan_output_command); @@ -572,13 +557,7 @@ static struct command_result *json_listtransactions(struct command *cmd, static const struct json_command listtransactions_command = { "listtransactions", - "payment", json_listtransactions, - "List transactions that we stored in the wallet", - .verbose = "Returns transactions tracked in the wallet. This includes deposits, " - "withdrawals and transactions related to channels. A transaction may have " - "multiple types, e.g., a transaction may both be a close and a deposit if " - "it closes the channel and returns funds to the wallet." }; AUTODATA(json_command, &listtransactions_command); @@ -797,9 +776,7 @@ static struct command_result *json_signpsbt(struct command *cmd, static const struct json_command signpsbt_command = { "signpsbt", - "bitcoin", json_signpsbt, - "Sign this wallet's inputs on a provided PSBT.", false }; @@ -835,9 +812,7 @@ static struct command_result *json_setpsbtversion(struct command *cmd, static const struct json_command setpsbtversion_command = { "setpsbtversion", - "bitcoin", json_setpsbtversion, - "Convert a given PSBT to the {version} requested (v0 or v2)", false }; @@ -997,9 +972,7 @@ static struct command_result *json_sendpsbt(struct command *cmd, static const struct json_command sendpsbt_command = { "sendpsbt", - "bitcoin", json_sendpsbt, - "Finalize, extract and send a PSBT.", false }; diff --git a/wire/bolt12_exp_wire.csv b/wire/bolt12_exp_wire.csv deleted file mode 100644 index 10ba1faf0b1c..000000000000 --- a/wire/bolt12_exp_wire.csv +++ /dev/null @@ -1,178 +0,0 @@ -tlvtype,offer,offer_chains,2 -tlvdata,offer,offer_chains,chains,chain_hash,... -tlvtype,offer,offer_metadata,4 -tlvdata,offer,offer_metadata,data,byte,... -tlvtype,offer,offer_currency,6 -tlvdata,offer,offer_currency,iso4217,utf8,... -tlvtype,offer,offer_amount,8 -tlvdata,offer,offer_amount,amount,tu64, -tlvtype,offer,offer_description,10 -tlvdata,offer,offer_description,description,utf8,... -tlvtype,offer,offer_features,12 -tlvdata,offer,offer_features,features,byte,... -tlvtype,offer,offer_absolute_expiry,14 -tlvdata,offer,offer_absolute_expiry,seconds_from_epoch,tu64, -tlvtype,offer,offer_paths,16 -tlvdata,offer,offer_paths,paths,blinded_path,... -tlvtype,offer,offer_issuer,18 -tlvdata,offer,offer_issuer,issuer,utf8,... -tlvtype,offer,offer_quantity_max,20 -tlvdata,offer,offer_quantity_max,max,tu64, -tlvtype,offer,offer_node_id,22 -tlvdata,offer,offer_node_id,node_id,point, -tlvtype,offer,offer_recurrence,26 -tlvdata,offer,offer_recurrence,recurrence,recurrence, -tlvtype,offer,offer_recurrence_paywindow,28 -tlvdata,offer,offer_recurrence_paywindow,paywindow,recurrence_paywindow, -tlvtype,offer,offer_recurrence_limit,30 -tlvdata,offer,offer_recurrence_limit,max_period,tu32, -tlvtype,offer,offer_recurrence_base,32 -tlvdata,offer,offer_recurrence_base,base,recurrence_base, -tlvtype,invoice_request,invreq_metadata,0 -tlvdata,invoice_request,invreq_metadata,blob,byte,... -tlvtype,invoice_request,offer_chains,2 -tlvdata,invoice_request,offer_chains,chains,chain_hash,... -tlvtype,invoice_request,offer_metadata,4 -tlvdata,invoice_request,offer_metadata,data,byte,... -tlvtype,invoice_request,offer_currency,6 -tlvdata,invoice_request,offer_currency,iso4217,utf8,... -tlvtype,invoice_request,offer_amount,8 -tlvdata,invoice_request,offer_amount,amount,tu64, -tlvtype,invoice_request,offer_description,10 -tlvdata,invoice_request,offer_description,description,utf8,... -tlvtype,invoice_request,offer_features,12 -tlvdata,invoice_request,offer_features,features,byte,... -tlvtype,invoice_request,offer_absolute_expiry,14 -tlvdata,invoice_request,offer_absolute_expiry,seconds_from_epoch,tu64, -tlvtype,invoice_request,offer_paths,16 -tlvdata,invoice_request,offer_paths,paths,blinded_path,... -tlvtype,invoice_request,offer_issuer,18 -tlvdata,invoice_request,offer_issuer,issuer,utf8,... -tlvtype,invoice_request,offer_quantity_max,20 -tlvdata,invoice_request,offer_quantity_max,max,tu64, -tlvtype,invoice_request,offer_node_id,22 -tlvdata,invoice_request,offer_node_id,node_id,point, -tlvtype,invoice_request,offer_recurrence,26 -tlvdata,invoice_request,offer_recurrence,recurrence,recurrence, -tlvtype,invoice_request,offer_recurrence_paywindow,28 -tlvdata,invoice_request,offer_recurrence_paywindow,paywindow,recurrence_paywindow, -tlvtype,invoice_request,offer_recurrence_limit,30 -tlvdata,invoice_request,offer_recurrence_limit,max_period,tu32, -tlvtype,invoice_request,offer_recurrence_base,32 -tlvdata,invoice_request,offer_recurrence_base,base,recurrence_base, -tlvtype,invoice_request,invreq_chain,80 -tlvdata,invoice_request,invreq_chain,chain,chain_hash, -tlvtype,invoice_request,invreq_amount,82 -tlvdata,invoice_request,invreq_amount,msat,tu64, -tlvtype,invoice_request,invreq_features,84 -tlvdata,invoice_request,invreq_features,features,byte,... -tlvtype,invoice_request,invreq_quantity,86 -tlvdata,invoice_request,invreq_quantity,quantity,tu64, -tlvtype,invoice_request,invreq_payer_id,88 -tlvdata,invoice_request,invreq_payer_id,key,point, -tlvtype,invoice_request,invreq_payer_note,89 -tlvdata,invoice_request,invreq_payer_note,note,utf8,... -tlvtype,invoice_request,invreq_recurrence_counter,90 -tlvdata,invoice_request,invreq_recurrence_counter,counter,tu32, -tlvtype,invoice_request,invreq_recurrence_start,92 -tlvdata,invoice_request,invreq_recurrence_start,period_offset,tu32, -tlvtype,invoice_request,signature,240 -tlvdata,invoice_request,signature,sig,bip340sig, -tlvtype,invoice,invreq_metadata,0 -tlvdata,invoice,invreq_metadata,blob,byte,... -tlvtype,invoice,offer_chains,2 -tlvdata,invoice,offer_chains,chains,chain_hash,... -tlvtype,invoice,offer_metadata,4 -tlvdata,invoice,offer_metadata,data,byte,... -tlvtype,invoice,offer_currency,6 -tlvdata,invoice,offer_currency,iso4217,utf8,... -tlvtype,invoice,offer_amount,8 -tlvdata,invoice,offer_amount,amount,tu64, -tlvtype,invoice,offer_description,10 -tlvdata,invoice,offer_description,description,utf8,... -tlvtype,invoice,offer_features,12 -tlvdata,invoice,offer_features,features,byte,... -tlvtype,invoice,offer_absolute_expiry,14 -tlvdata,invoice,offer_absolute_expiry,seconds_from_epoch,tu64, -tlvtype,invoice,offer_paths,16 -tlvdata,invoice,offer_paths,paths,blinded_path,... -tlvtype,invoice,offer_issuer,18 -tlvdata,invoice,offer_issuer,issuer,utf8,... -tlvtype,invoice,offer_quantity_max,20 -tlvdata,invoice,offer_quantity_max,max,tu64, -tlvtype,invoice,offer_node_id,22 -tlvdata,invoice,offer_node_id,node_id,point, -tlvtype,invoice,offer_recurrence,26 -tlvdata,invoice,offer_recurrence,recurrence,recurrence, -tlvtype,invoice,offer_recurrence_paywindow,28 -tlvdata,invoice,offer_recurrence_paywindow,paywindow,recurrence_paywindow, -tlvtype,invoice,offer_recurrence_limit,30 -tlvdata,invoice,offer_recurrence_limit,max_period,tu32, -tlvtype,invoice,offer_recurrence_base,32 -tlvdata,invoice,offer_recurrence_base,base,recurrence_base, -tlvtype,invoice,invreq_chain,80 -tlvdata,invoice,invreq_chain,chain,chain_hash, -tlvtype,invoice,invreq_amount,82 -tlvdata,invoice,invreq_amount,msat,tu64, -tlvtype,invoice,invreq_features,84 -tlvdata,invoice,invreq_features,features,byte,... -tlvtype,invoice,invreq_quantity,86 -tlvdata,invoice,invreq_quantity,quantity,tu64, -tlvtype,invoice,invreq_payer_id,88 -tlvdata,invoice,invreq_payer_id,key,point, -tlvtype,invoice,invreq_payer_note,89 -tlvdata,invoice,invreq_payer_note,note,utf8,... -tlvtype,invoice,invreq_recurrence_counter,90 -tlvdata,invoice,invreq_recurrence_counter,counter,tu32, -tlvtype,invoice,invreq_recurrence_start,92 -tlvdata,invoice,invreq_recurrence_start,period_offset,tu32, -tlvtype,invoice,invoice_paths,160 -tlvdata,invoice,invoice_paths,paths,blinded_path,... -tlvtype,invoice,invoice_blindedpay,162 -tlvdata,invoice,invoice_blindedpay,payinfo,blinded_payinfo,... -tlvtype,invoice,invoice_created_at,164 -tlvdata,invoice,invoice_created_at,timestamp,tu64, -tlvtype,invoice,invoice_relative_expiry,166 -tlvdata,invoice,invoice_relative_expiry,seconds_from_creation,tu32, -tlvtype,invoice,invoice_payment_hash,168 -tlvdata,invoice,invoice_payment_hash,payment_hash,sha256, -tlvtype,invoice,invoice_amount,170 -tlvdata,invoice,invoice_amount,msat,tu64, -tlvtype,invoice,invoice_fallbacks,172 -tlvdata,invoice,invoice_fallbacks,fallbacks,fallback_address,... -tlvtype,invoice,invoice_features,174 -tlvdata,invoice,invoice_features,features,byte,... -tlvtype,invoice,invoice_node_id,176 -tlvdata,invoice,invoice_node_id,node_id,point, -tlvtype,invoice,invoice_recurrence_basetime,178 -tlvdata,invoice,invoice_recurrence_basetime,basetime,tu64, -tlvtype,invoice,signature,240 -tlvdata,invoice,signature,sig,bip340sig, -subtype,recurrence -subtypedata,recurrence,time_unit,byte, -subtypedata,recurrence,period,tu32, -subtype,recurrence_paywindow -subtypedata,recurrence_paywindow,seconds_before,u32, -subtypedata,recurrence_paywindow,proportional_amount,byte, -subtypedata,recurrence_paywindow,seconds_after,tu32, -subtype,recurrence_base -subtypedata,recurrence_base,start_any_period,byte, -subtypedata,recurrence_base,basetime,tu64, -subtype,blinded_payinfo -subtypedata,blinded_payinfo,fee_base_msat,u32, -subtypedata,blinded_payinfo,fee_proportional_millionths,u32, -subtypedata,blinded_payinfo,cltv_expiry_delta,u16, -subtypedata,blinded_payinfo,htlc_minimum_msat,u64, -subtypedata,blinded_payinfo,htlc_maximum_msat,u64, -subtypedata,blinded_payinfo,flen,u16, -subtypedata,blinded_payinfo,features,byte,flen -subtype,fallback_address -subtypedata,fallback_address,version,byte, -subtypedata,fallback_address,len,u16, -subtypedata,fallback_address,address,byte,len -tlvtype,invoice_error,erroneous_field,1 -tlvdata,invoice_error,erroneous_field,tlv_fieldnum,tu64, -tlvtype,invoice_error,suggested_value,3 -tlvdata,invoice_error,suggested_value,value,byte,... -tlvtype,invoice_error,error,5 -tlvdata,invoice_error,error,msg,utf8,... diff --git a/wire/bolt12_wire.csv b/wire/bolt12_wire.csv index 10ba1faf0b1c..6e2e2c001790 100644 --- a/wire/bolt12_wire.csv +++ b/wire/bolt12_wire.csv @@ -18,15 +18,15 @@ tlvtype,offer,offer_issuer,18 tlvdata,offer,offer_issuer,issuer,utf8,... tlvtype,offer,offer_quantity_max,20 tlvdata,offer,offer_quantity_max,max,tu64, -tlvtype,offer,offer_node_id,22 -tlvdata,offer,offer_node_id,node_id,point, -tlvtype,offer,offer_recurrence,26 +tlvtype,offer,offer_issuer_id,22 +tlvdata,offer,offer_issuer_id,id,point, +tlvtype,offer,offer_recurrence,1212121212 tlvdata,offer,offer_recurrence,recurrence,recurrence, -tlvtype,offer,offer_recurrence_paywindow,28 +tlvtype,offer,offer_recurrence_paywindow,1212121214 tlvdata,offer,offer_recurrence_paywindow,paywindow,recurrence_paywindow, -tlvtype,offer,offer_recurrence_limit,30 +tlvtype,offer,offer_recurrence_limit,1212121216 tlvdata,offer,offer_recurrence_limit,max_period,tu32, -tlvtype,offer,offer_recurrence_base,32 +tlvtype,offer,offer_recurrence_base,1212121218 tlvdata,offer,offer_recurrence_base,base,recurrence_base, tlvtype,invoice_request,invreq_metadata,0 tlvdata,invoice_request,invreq_metadata,blob,byte,... @@ -50,15 +50,15 @@ tlvtype,invoice_request,offer_issuer,18 tlvdata,invoice_request,offer_issuer,issuer,utf8,... tlvtype,invoice_request,offer_quantity_max,20 tlvdata,invoice_request,offer_quantity_max,max,tu64, -tlvtype,invoice_request,offer_node_id,22 -tlvdata,invoice_request,offer_node_id,node_id,point, -tlvtype,invoice_request,offer_recurrence,26 +tlvtype,invoice_request,offer_issuer_id,22 +tlvdata,invoice_request,offer_issuer_id,id,point, +tlvtype,invoice_request,offer_recurrence,1212121212 tlvdata,invoice_request,offer_recurrence,recurrence,recurrence, -tlvtype,invoice_request,offer_recurrence_paywindow,28 +tlvtype,invoice_request,offer_recurrence_paywindow,1212121214 tlvdata,invoice_request,offer_recurrence_paywindow,paywindow,recurrence_paywindow, -tlvtype,invoice_request,offer_recurrence_limit,30 +tlvtype,invoice_request,offer_recurrence_limit,1212121216 tlvdata,invoice_request,offer_recurrence_limit,max_period,tu32, -tlvtype,invoice_request,offer_recurrence_base,32 +tlvtype,invoice_request,offer_recurrence_base,1212121218 tlvdata,invoice_request,offer_recurrence_base,base,recurrence_base, tlvtype,invoice_request,invreq_chain,80 tlvdata,invoice_request,invreq_chain,chain,chain_hash, @@ -72,9 +72,11 @@ tlvtype,invoice_request,invreq_payer_id,88 tlvdata,invoice_request,invreq_payer_id,key,point, tlvtype,invoice_request,invreq_payer_note,89 tlvdata,invoice_request,invreq_payer_note,note,utf8,... -tlvtype,invoice_request,invreq_recurrence_counter,90 +tlvtype,invoice_request,invreq_paths,90 +tlvdata,invoice_request,invreq_paths,paths,blinded_path,... +tlvtype,invoice_request,invreq_recurrence_counter,2212121212 tlvdata,invoice_request,invreq_recurrence_counter,counter,tu32, -tlvtype,invoice_request,invreq_recurrence_start,92 +tlvtype,invoice_request,invreq_recurrence_start,2212121214 tlvdata,invoice_request,invreq_recurrence_start,period_offset,tu32, tlvtype,invoice_request,signature,240 tlvdata,invoice_request,signature,sig,bip340sig, @@ -100,15 +102,15 @@ tlvtype,invoice,offer_issuer,18 tlvdata,invoice,offer_issuer,issuer,utf8,... tlvtype,invoice,offer_quantity_max,20 tlvdata,invoice,offer_quantity_max,max,tu64, -tlvtype,invoice,offer_node_id,22 -tlvdata,invoice,offer_node_id,node_id,point, -tlvtype,invoice,offer_recurrence,26 +tlvtype,invoice,offer_issuer_id,22 +tlvdata,invoice,offer_issuer_id,id,point, +tlvtype,invoice,offer_recurrence,1212121212 tlvdata,invoice,offer_recurrence,recurrence,recurrence, -tlvtype,invoice,offer_recurrence_paywindow,28 +tlvtype,invoice,offer_recurrence_paywindow,1212121214 tlvdata,invoice,offer_recurrence_paywindow,paywindow,recurrence_paywindow, -tlvtype,invoice,offer_recurrence_limit,30 +tlvtype,invoice,offer_recurrence_limit,1212121216 tlvdata,invoice,offer_recurrence_limit,max_period,tu32, -tlvtype,invoice,offer_recurrence_base,32 +tlvtype,invoice,offer_recurrence_base,1212121218 tlvdata,invoice,offer_recurrence_base,base,recurrence_base, tlvtype,invoice,invreq_chain,80 tlvdata,invoice,invreq_chain,chain,chain_hash, @@ -122,9 +124,11 @@ tlvtype,invoice,invreq_payer_id,88 tlvdata,invoice,invreq_payer_id,key,point, tlvtype,invoice,invreq_payer_note,89 tlvdata,invoice,invreq_payer_note,note,utf8,... -tlvtype,invoice,invreq_recurrence_counter,90 +tlvtype,invoice,invreq_paths,90 +tlvdata,invoice,invreq_paths,paths,blinded_path,... +tlvtype,invoice,invreq_recurrence_counter,2212121212 tlvdata,invoice,invreq_recurrence_counter,counter,tu32, -tlvtype,invoice,invreq_recurrence_start,92 +tlvtype,invoice,invreq_recurrence_start,2212121214 tlvdata,invoice,invreq_recurrence_start,period_offset,tu32, tlvtype,invoice,invoice_paths,160 tlvdata,invoice,invoice_paths,paths,blinded_path,... @@ -144,7 +148,7 @@ tlvtype,invoice,invoice_features,174 tlvdata,invoice,invoice_features,features,byte,... tlvtype,invoice,invoice_node_id,176 tlvdata,invoice,invoice_node_id,node_id,point, -tlvtype,invoice,invoice_recurrence_basetime,178 +tlvtype,invoice,invoice_recurrence_basetime,3212121212 tlvdata,invoice,invoice_recurrence_basetime,basetime,tu64, tlvtype,invoice,signature,240 tlvdata,invoice,signature,sig,bip340sig, diff --git a/wire/extracted_bolt12_01_recurrence.patch b/wire/extracted_bolt12_01_recurrence.patch index bde21b180591..3454e1a26eb1 100644 --- a/wire/extracted_bolt12_01_recurrence.patch +++ b/wire/extracted_bolt12_01_recurrence.patch @@ -2,66 +2,66 @@ +++ wire/bolt12_wire.csv 2022-10-04 13:25:59.617242667 +1030 @@ -22,6 +22,14 @@ tlvdata,offer,offer_quantity_max,max,tu64, - tlvtype,offer,offer_node_id,24 - tlvdata,offer,offer_node_id,node_id,point, -+tlvtype,offer,offer_recurrence,26 + tlvtype,offer,offer_issuer_id,22 + tlvdata,offer,offer_issuer_id,id,point, ++tlvtype,offer,offer_recurrence,1212121212 +tlvdata,offer,offer_recurrence,recurrence,recurrence, -+tlvtype,offer,offer_recurrence_paywindow,28 ++tlvtype,offer,offer_recurrence_paywindow,1212121214 +tlvdata,offer,offer_recurrence_paywindow,paywindow,recurrence_paywindow, -+tlvtype,offer,offer_recurrence_limit,30 ++tlvtype,offer,offer_recurrence_limit,1212121216 +tlvdata,offer,offer_recurrence_limit,max_period,tu32, -+tlvtype,offer,offer_recurrence_base,32 ++tlvtype,offer,offer_recurrence_base,1212121218 +tlvdata,offer,offer_recurrence_base,base,recurrence_base, tlvtype,invoice_request,invreq_metadata,0 tlvdata,invoice_request,invreq_metadata,blob,byte,... tlvtype,invoice_request,offer_chains,2 @@ -48,6 +60,14 @@ tlvdata,invoice_request,offer_quantity_max,max,tu64, - tlvtype,invoice_request,offer_node_id,24 - tlvdata,invoice_request,offer_node_id,node_id,point, -+tlvtype,invoice_request,offer_recurrence,26 + tlvtype,invoice_request,offer_issuer_id,22 + tlvdata,invoice_request,offer_issuer_id,id,point, ++tlvtype,invoice_request,offer_recurrence,1212121212 +tlvdata,invoice_request,offer_recurrence,recurrence,recurrence, -+tlvtype,invoice_request,offer_recurrence_paywindow,28 ++tlvtype,invoice_request,offer_recurrence_paywindow,1212121214 +tlvdata,invoice_request,offer_recurrence_paywindow,paywindow,recurrence_paywindow, -+tlvtype,invoice_request,offer_recurrence_limit,30 ++tlvtype,invoice_request,offer_recurrence_limit,1212121216 +tlvdata,invoice_request,offer_recurrence_limit,max_period,tu32, -+tlvtype,invoice_request,offer_recurrence_base,32 ++tlvtype,invoice_request,offer_recurrence_base,1212121218 +tlvdata,invoice_request,offer_recurrence_base,base,recurrence_base, tlvtype,invoice_request,invreq_chain,80 tlvdata,invoice_request,invreq_chain,chain,chain_hash, tlvtype,invoice_request,invreq_amount,82 @@ -60,6 +84,10 @@ - tlvdata,invoice_request,invreq_payer_id,key,point, - tlvtype,invoice_request,invreq_payer_note,89 tlvdata,invoice_request,invreq_payer_note,note,utf8,... -+tlvtype,invoice_request,invreq_recurrence_counter,90 + tlvtype,invoice_request,invreq_paths,90 + tlvdata,invoice_request,invreq_paths,paths,blinded_path,... ++tlvtype,invoice_request,invreq_recurrence_counter,2212121212 +tlvdata,invoice_request,invreq_recurrence_counter,counter,tu32, -+tlvtype,invoice_request,invreq_recurrence_start,92 ++tlvtype,invoice_request,invreq_recurrence_start,2212121214 +tlvdata,invoice_request,invreq_recurrence_start,period_offset,tu32, tlvtype,invoice_request,signature,240 tlvdata,invoice_request,signature,sig,bip340sig, tlvtype,invoice,invreq_metadata,0 @@ -89,5 +117,13 @@ - tlvtype,invoice,offer_node_id,24 - tlvdata,invoice,offer_node_id,node_id,point, -+tlvtype,invoice,offer_recurrence,26 + tlvtype,invoice,offer_issuer_id,22 + tlvdata,invoice,offer_issuer_id,id,point, ++tlvtype,invoice,offer_recurrence,1212121212 +tlvdata,invoice,offer_recurrence,recurrence,recurrence, -+tlvtype,invoice,offer_recurrence_paywindow,28 ++tlvtype,invoice,offer_recurrence_paywindow,1212121214 +tlvdata,invoice,offer_recurrence_paywindow,paywindow,recurrence_paywindow, -+tlvtype,invoice,offer_recurrence_limit,30 ++tlvtype,invoice,offer_recurrence_limit,1212121216 +tlvdata,invoice,offer_recurrence_limit,max_period,tu32, -+tlvtype,invoice,offer_recurrence_base,32 ++tlvtype,invoice,offer_recurrence_base,1212121218 +tlvdata,invoice,offer_recurrence_base,base,recurrence_base, tlvtype,invoice,invreq_chain,80 tlvdata,invoice,invreq_chain,chain,chain_hash, tlvtype,invoice,invreq_amount,82 @@ -101,6 +141,10 @@ - tlvdata,invoice,invreq_payer_id,key,point, - tlvtype,invoice,invreq_payer_note,89 tlvdata,invoice,invreq_payer_note,note,utf8,... -+tlvtype,invoice,invreq_recurrence_counter,90 + tlvtype,invoice,invreq_paths,90 + tlvdata,invoice,invreq_paths,paths,blinded_path,... ++tlvtype,invoice,invreq_recurrence_counter,2212121212 +tlvdata,invoice,invreq_recurrence_counter,counter,tu32, -+tlvtype,invoice,invreq_recurrence_start,92 ++tlvtype,invoice,invreq_recurrence_start,2212121214 +tlvdata,invoice,invreq_recurrence_start,period_offset,tu32, tlvtype,invoice,invoice_paths,160 tlvdata,invoice,invoice_paths,paths,blinded_path,... @@ -70,7 +70,7 @@ tlvdata,invoice,invoice_features,features,byte,... tlvtype,invoice,invoice_node_id,176 tlvdata,invoice,invoice_node_id,node_id,point, -+tlvtype,invoice,invoice_recurrence_basetime,178 ++tlvtype,invoice,invoice_recurrence_basetime,3212121212 +tlvdata,invoice,invoice_recurrence_basetime,basetime,tu64, tlvtype,invoice,signature,240 tlvdata,invoice,signature,sig,bip340sig, diff --git a/wire/fromwire.c b/wire/fromwire.c index 23810ad3ac90..8e81c81571f4 100644 --- a/wire/fromwire.c +++ b/wire/fromwire.c @@ -142,8 +142,7 @@ static u64 fromwire_tlv_uint(const u8 **cursor, size_t *max, size_t maxlen) fromwire_fail(cursor, max); return 0; } - BUILD_ASSERT(sizeof(val) == sizeof(bytes)); - memcpy(&val, bytes, sizeof(bytes)); + CROSS_TYPE_ASSIGNMENT(&val, &bytes); return be64_to_cpu(val); } diff --git a/wire/tlvstream.c b/wire/tlvstream.c index 215d30a8baa9..9e1c774261bb 100644 --- a/wire/tlvstream.c +++ b/wire/tlvstream.c @@ -291,17 +291,54 @@ bool fromwire_tlv(const u8 **cursor, size_t *max, return false; } +static const struct tlv_field *unknown_field(const struct tlv_field *field, + const struct tlv_field *end) +{ + while (field < end) { + if (!field->meta) + return field; + field++; + } + return NULL; +} + +static const struct tlv_field *next_unknown_field(const struct tlv_field *field, + const struct tlv_field *end) +{ + return unknown_field(field + 1, end); +} + +static const struct tlv_field *first_unknown_field(const struct tlv_field *fields, + const struct tlv_field **end) +{ + *end = fields + tal_count(fields); + return unknown_field(fields, *end); +} + void towire_tlv(u8 **pptr, const struct tlv_record_type *types, size_t num_types, const void *record) { + const struct tlv_field *field, *end; if (!record) return; + /* First field is always "struct tlv_field *fields;" */ + field = first_unknown_field(*(struct tlv_field **)record, &end); + for (size_t i = 0; i < num_types; i++) { u8 *val; if (i != 0) assert(types[i].type > types[i-1].type); + + /* Do any unknown fields first */ + while (field && field->numtype < types[i].type) { + towire_bigsize(pptr, field->numtype); + towire_bigsize(pptr, field->length); + towire(pptr, field->value, field->length); + field = next_unknown_field(field, end); + } + val = types[i].towire(NULL, record); if (!val) continue; @@ -317,19 +354,41 @@ void towire_tlv(u8 **pptr, towire(pptr, val, tal_bytelen(val)); tal_free(val); } + + /* Add any trailing unknown fields */ + while (field) { + towire_bigsize(pptr, field->numtype); + towire_bigsize(pptr, field->length); + towire(pptr, field->value, field->length); + field = next_unknown_field(field, end); + } + } -struct tlv_field *tlv_make_fields_(const struct tlv_record_type *types, - size_t num_types, - const void *record) +void tlv_update_fields_(const struct tlv_record_type *types, + size_t num_types, + const void *record, + struct tlv_field **tlv_fields) { + /* We merge unknown fields from record */ + const struct tlv_field *field, *end; struct tlv_field *fields = tal_arr(record, struct tlv_field, 0); + field = first_unknown_field(*tlv_fields, &end); + for (size_t i = 0; i < num_types; i++) { struct tlv_field f; u8 *val; if (i != 0) assert(types[i].type > types[i-1].type); + + /* Add any unknowns which precede this. */ + while (field && field->numtype < types[i].type) { + tal_steal(fields, field->value); + tal_arr_expand(&fields, *field); + field = next_unknown_field(field, end); + } + val = types[i].towire(NULL, record); if (!val) continue; @@ -340,5 +399,14 @@ struct tlv_field *tlv_make_fields_(const struct tlv_record_type *types, f.value = tal_steal(fields, val); tal_arr_expand(&fields, f); } - return fields; + + /* Add any unknowns at the end. */ + while (field) { + tal_steal(fields, field->value); + tal_arr_expand(&fields, *field); + field = next_unknown_field(field, end); + } + + tal_free(*tlv_fields); + *tlv_fields = fields; } diff --git a/wire/tlvstream.h b/wire/tlvstream.h index 0b3f71735dba..090ba4e21433 100644 --- a/wire/tlvstream.h +++ b/wire/tlvstream.h @@ -30,13 +30,14 @@ struct tlv_field { /* Given any tlvstream serialize the raw fields (untyped ones). */ void towire_tlvstream_raw(u8 **pptr, struct tlv_field *fields); -/* Given a tlv record with manually-set fields, populate ->fields */ -#define tlv_make_fields(tlv, type) \ - tlv_make_fields_(tlvs_##type, TLVS_ARRAY_SIZE_##type, (tlv)) +/* Given a tlv record with manually-set fields, repopulate ->fields (maintaining any unknowns)*/ +#define tlv_update_fields(tlv, type, tlv_fields) \ + tlv_update_fields_(tlvs_##type, TLVS_ARRAY_SIZE_##type, (tlv), (tlv_fields)) -struct tlv_field *tlv_make_fields_(const struct tlv_record_type *types, - size_t num_types, - const void *record); +void tlv_update_fields_(const struct tlv_record_type *types, + size_t num_types, + const void *record, + struct tlv_field **tlv_fields); /** * fromwire_tlv: generic TLV decode engine diff --git a/wire/towire.c b/wire/towire.c index 3a123ed85a55..f275367e4c03 100644 --- a/wire/towire.c +++ b/wire/towire.c @@ -67,8 +67,7 @@ static void towire_tlv_uint(u8 **pptr, u64 v) be64 val; val = cpu_to_be64(v); - BUILD_ASSERT(sizeof(val) == sizeof(bytes)); - memcpy(bytes, &val, sizeof(bytes)); + CROSS_TYPE_ASSIGNMENT(&bytes, &val); for (num_zeroes = 0; num_zeroes < sizeof(bytes); num_zeroes++) if (bytes[num_zeroes] != 0)