From 94f8aa3d693a9aa2af621c0d9c5016a255c269c8 Mon Sep 17 00:00:00 2001 From: Tony Giorgio Date: Fri, 8 Sep 2023 15:22:38 -0500 Subject: [PATCH] Exclude uneconomical UTXOs from fundchannel --- wallet/reservation.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/wallet/reservation.c b/wallet/reservation.c index 30b3d281a407..e749bc29374f 100644 --- a/wallet/reservation.c +++ b/wallet/reservation.c @@ -537,6 +537,9 @@ static struct command_result *json_fundpsbt(struct command *cmd, /* We keep adding until we meet their output requirements. */ utxos = tal_arr(cmd, struct utxo *, 0); + /* We seperate out UTXOs to exclude if they are uneconomical */ + struct utxo **uneconomical_utxos = tal_arr(cmd, struct utxo *, 0); + input = AMOUNT_SAT(0); while (!inputs_sufficient(input, *amount, *feerate_per_kw, *weight, &diff)) { @@ -544,21 +547,35 @@ static struct command_result *json_fundpsbt(struct command *cmd, struct amount_sat fee; u32 utxo_weight; + + /* Merge the two lists for exclusion */ + struct utxo **all_excluded = tal_arr(cmd, struct utxo *, 0); + for(size_t i = 0; i < tal_count(utxos); i++) { + tal_arr_expand(&all_excluded, utxos[i]); + } + for(size_t i = 0; i < tal_count(uneconomical_utxos); i++) { + tal_arr_expand(&all_excluded, uneconomical_utxos[i]); + } + utxo = wallet_find_utxo(utxos, cmd->ld->wallet, current_height, &diff, *feerate_per_kw, maxheight, *nonwrapped, - cast_const2(const struct utxo **, utxos)); + cast_const2(const struct utxo **, all_excluded)); + tal_free(all_excluded); + if (utxo) { utxo_weight = utxo_spend_weight(utxo, *min_witness_weight); fee = amount_tx_fee(*feerate_per_kw, utxo_weight); /* Uneconomic to add this utxo, skip it */ - if (!all && amount_sat_greater_eq(fee, utxo->amount)) + if (!all && amount_sat_greater_eq(fee, utxo->amount)){ + tal_arr_expand(&uneconomical_utxos, utxo); continue; + } tal_arr_expand(&utxos, utxo); @@ -596,6 +613,8 @@ static struct command_result *json_fundpsbt(struct command *cmd, &diff)); } + tal_free(uneconomical_utxos); + if (all) { /* We need to afford one non-dust output, at least. */ if (!inputs_sufficient(input, AMOUNT_SAT(0),