diff --git a/lightningd/closing_control.c b/lightningd/closing_control.c index f6f7ff467..5d9bd74ae 100644 --- a/lightningd/closing_control.c +++ b/lightningd/closing_control.c @@ -461,12 +461,10 @@ void peer_start_closingd(struct channel *channel, struct peer_fd *peer_fd) struct ext_key *local_wallet_ext_key = NULL; u32 index_val; struct ext_key ext_key_val; - bool is_p2sh; if (wallet_can_spend( ld->wallet, channel->shutdown_scriptpubkey[LOCAL], - &index_val, - &is_p2sh)) { + &index_val)) { if (bip32_key_from_parent( ld->bip32_base, index_val, @@ -690,8 +688,6 @@ static struct command_result *json_close(struct command *cmd, assert(channel->final_key_idx <= UINT32_MAX); if (close_to_script) { - bool is_p2sh; - if (!tal_arr_eq(close_to_script, channel->shutdown_scriptpubkey[LOCAL]) && !cmd->ld->dev_allow_shutdown_destination_change) { const u8 *defp2tr, *defp2wpkh; @@ -727,7 +723,7 @@ static struct command_result *json_close(struct command *cmd, /* If they give a local address, adjust final_key_idx. */ if (!wallet_can_spend(cmd->ld->wallet, close_to_script, - &final_key_idx, &is_p2sh)) { + &final_key_idx)) { final_key_idx = channel->final_key_idx; } } else { diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 4e03a8612..bbf62303d 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -698,11 +698,9 @@ openchannel2_hook_cb(struct openchannel2_payload *payload STEALS) /* Determine the wallet index for our_shutdown_scriptpubkey, * NULL if not found. */ u32 found_wallet_index; - bool is_p2sh; if (wallet_can_spend(dualopend->ld->wallet, payload->our_shutdown_scriptpubkey, - &found_wallet_index, - &is_p2sh)) { + &found_wallet_index)) { our_shutdown_script_wallet_index = tal(tmpctx, u32); *our_shutdown_script_wallet_index = found_wallet_index; } else @@ -3176,11 +3174,9 @@ static struct command_result *json_openchannel_init(struct command *cmd, /* Determine the wallet index for our_upfront_shutdown_script, * NULL if not found. */ u32 found_wallet_index; - bool is_p2sh; if (wallet_can_spend(cmd->ld->wallet, oa->our_upfront_shutdown_script, - &found_wallet_index, - &is_p2sh)) { + &found_wallet_index)) { our_upfront_shutdown_script_wallet_index = tal(tmpctx, u32); *our_upfront_shutdown_script_wallet_index = found_wallet_index; } else @@ -3776,11 +3772,9 @@ static struct command_result *json_queryrates(struct command *cmd, /* Determine the wallet index for our_upfront_shutdown_script, * NULL if not found. */ u32 found_wallet_index; - bool is_p2sh; if (wallet_can_spend(cmd->ld->wallet, oa->our_upfront_shutdown_script, - &found_wallet_index, - &is_p2sh)) { + &found_wallet_index)) { our_upfront_shutdown_script_wallet_index = tal(tmpctx, u32); *our_upfront_shutdown_script_wallet_index = found_wallet_index; } else @@ -4126,11 +4120,9 @@ bool peer_restart_dualopend(struct peer *peer, /* Determine the wallet index for the LOCAL shutdown_scriptpubkey, * NULL if not found. */ u32 found_wallet_index; - bool is_p2sh; if (wallet_can_spend(peer->ld->wallet, channel->shutdown_scriptpubkey[LOCAL], - &found_wallet_index, - &is_p2sh)) { + &found_wallet_index)) { local_shutdown_script_wallet_index = tal(tmpctx, u32); *local_shutdown_script_wallet_index = found_wallet_index; } else diff --git a/lightningd/opening_control.c b/lightningd/opening_control.c index a75d3baed..b1f42610f 100644 --- a/lightningd/opening_control.c +++ b/lightningd/opening_control.c @@ -717,11 +717,9 @@ openchannel_hook_final(struct openchannel_hook_payload *payload STEALS) /* Determine the wallet index for our_upfront_shutdown_script, * NULL if not found. */ u32 found_wallet_index; - bool is_p2sh; if (wallet_can_spend(payload->openingd->ld->wallet, our_upfront_shutdown_script, - &found_wallet_index, - &is_p2sh)) { + &found_wallet_index)) { upfront_shutdown_script_wallet_index = tal(tmpctx, u32); *upfront_shutdown_script_wallet_index = found_wallet_index; } else @@ -1321,11 +1319,9 @@ static struct command_result *json_fundchannel_start(struct command *cmd, /* Determine the wallet index for our_upfront_shutdown_script, * NULL if not found. */ u32 found_wallet_index; - bool is_p2sh; if (wallet_can_spend(fc->cmd->ld->wallet, fc->our_upfront_shutdown_script, - &found_wallet_index, - &is_p2sh)) { + &found_wallet_index)) { upfront_shutdown_script_wallet_index = tal(tmpctx, u32); *upfront_shutdown_script_wallet_index = found_wallet_index; } else diff --git a/wallet/wallet.c b/wallet/wallet.c index 9c75d90ef..a25737810 100644 --- a/wallet/wallet.c +++ b/wallet/wallet.c @@ -795,20 +795,21 @@ bool wallet_add_onchaind_utxo(struct wallet *w, } bool wallet_can_spend(struct wallet *w, const u8 *script, - u32 *index, bool *output_is_p2sh) + u32 *index) { struct ext_key ext; u64 bip32_max_index; size_t script_len = tal_bytelen(script); u32 i; + bool output_is_p2sh; /* If not one of these, can't be for us. */ if (is_p2sh(script, script_len, NULL)) - *output_is_p2sh = true; + output_is_p2sh = true; else if (is_p2wpkh(script, script_len, NULL)) - *output_is_p2sh = false; + output_is_p2sh = false; else if (is_p2tr(script, script_len, NULL)) - *output_is_p2sh = false; + output_is_p2sh = false; else return false; @@ -822,7 +823,7 @@ bool wallet_can_spend(struct wallet *w, const u8 *script, abort(); } s = scriptpubkey_p2wpkh_derkey(w, ext.pub_key); - if (*output_is_p2sh) { + if (output_is_p2sh) { u8 *p2sh = scriptpubkey_p2sh(w, s); tal_free(s); s = p2sh; @@ -2739,45 +2740,37 @@ int wallet_extract_owned_outputs(struct wallet *w, const struct wally_tx *wtx, if (total) *total = AMOUNT_SAT(0); - for (size_t output = 0; output < wtx->num_outputs; output++) { + for (size_t i = 0; i < wtx->num_outputs; i++) { + const struct wally_tx_output *txout = &wtx->outputs[i]; struct utxo *utxo; u32 index; - bool is_p2sh; - const u8 *script; - struct amount_asset asset = - wally_tx_output_get_amount(&wtx->outputs[output]); + struct amount_asset asset = wally_tx_output_get_amount(txout); struct chain_coin_mvt *mvt; if (!amount_asset_is_main(&asset)) continue; - script = cln_wally_tx_output_get_script(tmpctx, - &wtx->outputs[output]); - if (!script) - continue; - - if (!wallet_can_spend(w, script, &index, &is_p2sh)) + if (!wallet_can_spend(w, txout->script, &index)) continue; utxo = tal(w, struct utxo); utxo->keyindex = index; - utxo->is_p2sh = is_p2sh; + utxo->is_p2sh = is_p2sh(txout->script, txout->script_len, NULL); utxo->amount = amount_asset_to_sat(&asset); utxo->status = OUTPUT_STATE_AVAILABLE; wally_txid(wtx, &utxo->outpoint.txid); - utxo->outpoint.n = output; + utxo->outpoint.n = i; utxo->close_info = NULL; utxo->is_in_coinbase = is_coinbase; utxo->blockheight = blockheight ? blockheight : NULL; utxo->spendheight = NULL; - utxo->scriptPubkey = tal_dup_talarr(utxo, u8, script); - + utxo->scriptPubkey = tal_dup_arr(utxo, u8, txout->script, txout->script_len, 0); log_debug(w->log, "Owning output %zu %s (%s) txid %s%s%s", - output, + i, type_to_string(tmpctx, struct amount_sat, &utxo->amount), - is_p2sh ? "P2SH" : "SEGWIT", + utxo->is_p2sh ? "P2SH" : "SEGWIT", type_to_string(tmpctx, struct bitcoin_txid, &utxo->outpoint.txid), blockheight ? " CONFIRMED" : "", @@ -2792,7 +2785,7 @@ int wallet_extract_owned_outputs(struct wallet *w, const struct wally_tx *wtx, notify_chain_mvt(w->ld, mvt); } - if (!wallet_add_utxo(w, utxo, is_p2sh ? p2sh_wpkh : our_change)) { + if (!wallet_add_utxo(w, utxo, utxo->is_p2sh ? p2sh_wpkh : our_change)) { /* In case we already know the output, make * sure we actually track its * blockheight. This can happen when we grab @@ -2806,14 +2799,14 @@ int wallet_extract_owned_outputs(struct wallet *w, const struct wally_tx *wtx, } /* This is an unconfirmed change output, we should track it */ - if (!is_p2sh && !blockheight) - txfilter_add_scriptpubkey(w->ld->owned_txfilter, script); + if (!utxo->is_p2sh && !blockheight) + txfilter_add_scriptpubkey(w->ld->owned_txfilter, txout->script); outpointfilter_add(w->owned_outpoints, &utxo->outpoint); if (total && !amount_sat_add(total, *total, utxo->amount)) fatal("Cannot add utxo output %zu/%zu %s + %s", - output, wtx->num_outputs, + i, wtx->num_outputs, type_to_string(tmpctx, struct amount_sat, total), type_to_string(tmpctx, struct amount_sat, &utxo->amount)); diff --git a/wallet/wallet.h b/wallet/wallet.h index 612e53f30..7b3cd34ca 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -567,10 +567,10 @@ struct utxo **wallet_utxo_boost(const tal_t *ctx, * @w: (in) wallet holding the pubkeys to check against (privkeys are on HSM) * @script: (in) the script to check * @index: (out) the bip32 derivation index that matched the script - * @output_is_p2sh: (out) whether the script is a p2sh, or p2wpkh */ -bool wallet_can_spend(struct wallet *w, const u8 *script, - u32 *index, bool *output_is_p2sh); +bool wallet_can_spend(struct wallet *w, + const u8 *script, + u32 *index); /** * wallet_get_newindex - get a new index from the wallet. diff --git a/wallet/walletrpc.c b/wallet/walletrpc.c index 95796f975..974f51ded 100644 --- a/wallet/walletrpc.c +++ b/wallet/walletrpc.c @@ -664,12 +664,8 @@ static void match_psbt_outputs_to_wallet(struct wally_psbt *psbt, const u8 *script = psbt->outputs[outndx].script; const size_t script_len = psbt->outputs[outndx].script_len; u32 index; - bool is_p2sh; - if (!script_len) - continue; - - if (!wallet_can_spend(w, script, &index, &is_p2sh)) + if (!wallet_can_spend(w, script, &index)) continue; if (bip32_key_from_parent( @@ -872,7 +868,6 @@ static void maybe_notify_new_external_send(struct lightningd *ld, struct bitcoin_outpoint outpoint; struct amount_sat amount; u32 index; - bool is_p2sh; const u8 *script; /* If it's not going to an external address, ignore */ @@ -881,8 +876,8 @@ static void maybe_notify_new_external_send(struct lightningd *ld, /* If it's going to our wallet, ignore */ script = wally_psbt_output_get_script(tmpctx, - &psbt->outputs[outnum]); - if (wallet_can_spend(ld->wallet, script, &index, &is_p2sh)) + &psbt->outputs[outnum]); + if (wallet_can_spend(ld->wallet, script, &index)) return; outpoint.txid = *txid;