From 7db541a940147dce1cebbd2090ef36ed3b0459ee Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 11:43:19 +1030 Subject: [PATCH] lightningd: add direct close outputs to listfunds (mutual close). We had a complaint that you can't CPFP a mutual close, which you should be able to do. Fixes: #6692 Changelog-Fixed: wallet: close change outputs show up immediately in `listfunds` so you can CPFP. Signed-off-by: Rusty Russell --- lightningd/peer_control.c | 1 + tests/test_closing.py | 1 - wallet/wallet.c | 8 +++++--- wallet/wallet.h | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index c7417e449e14..35f6ba0f6b6d 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -299,6 +299,7 @@ static struct bitcoin_tx *sign_and_send_last(const tal_t *ctx, tx = sign_last_tx(ctx, channel, last_tx, last_sig); bitcoin_txid(tx, &txid); wallet_transaction_add(ld->wallet, tx->wtx, 0, 0); + wallet_extract_owned_outputs(ld->wallet, tx->wtx, false, NULL, NULL); /* Remember anchor information for commit_tx_boost */ adet = create_anchor_details(NULL, channel, tx); diff --git a/tests/test_closing.py b/tests/test_closing.py index c74e0ce7cbcc..805510439eef 100644 --- a/tests/test_closing.py +++ b/tests/test_closing.py @@ -3874,7 +3874,6 @@ def test_closing_minfee(node_factory, bitcoind): bitcoind.generate_block(1, wait_for_mempool=txid) -@pytest.mark.xfail(strict=True) def test_closing_cpfp(node_factory, bitcoind): l1, l2 = node_factory.line_graph(2) diff --git a/wallet/wallet.c b/wallet/wallet.c index c4c91d397b67..34fac06fc630 100644 --- a/wallet/wallet.c +++ b/wallet/wallet.c @@ -140,7 +140,8 @@ struct wallet *wallet_new(struct lightningd *ld, struct timers *timers) * * This can fail if we've already seen UTXO. */ -static bool wallet_add_utxo(struct wallet *w, struct utxo *utxo, +static bool wallet_add_utxo(struct wallet *w, + const struct utxo *utxo, enum wallet_output_type type) { struct db_stmt *stmt; @@ -2573,7 +2574,8 @@ int wallet_extract_owned_outputs(struct wallet *w, const struct wally_tx *wtx, { int num_utxos = 0; - *total = AMOUNT_SAT(0); + if (total) + *total = AMOUNT_SAT(0); for (size_t output = 0; output < wtx->num_outputs; output++) { struct utxo *utxo; u32 index; @@ -2646,7 +2648,7 @@ int wallet_extract_owned_outputs(struct wallet *w, const struct wally_tx *wtx, outpointfilter_add(w->owned_outpoints, &utxo->outpoint); - if (!amount_sat_add(total, *total, utxo->amount)) + if (total && !amount_sat_add(total, *total, utxo->amount)) fatal("Cannot add utxo output %zu/%zu %s + %s", output, wtx->num_outputs, type_to_string(tmpctx, struct amount_sat, total), diff --git a/wallet/wallet.h b/wallet/wallet.h index a7512cad938d..ebcbeb8b8de0 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -569,6 +569,7 @@ bool wallet_has_funds(struct wallet *wallet, const struct utxo **excludes, u32 current_blockheight, struct amount_sat sats); + /** * wallet_add_onchaind_utxo - Add a UTXO with spending info from onchaind. *