diff --git a/lightningd/onchain_control.c b/lightningd/onchain_control.c index f62a673a4..1e04cebd5 100644 --- a/lightningd/onchain_control.c +++ b/lightningd/onchain_control.c @@ -882,15 +882,29 @@ static struct bitcoin_tx *onchaind_tx_unsigned(const tal_t *ctx, struct lightningd *ld = channel->peer->ld; bool keypath_ok; - bip32_pubkey(ld, &final_key, channel->final_key_idx); - if (bip32_key_from_parent(ld->bip32_base, - channel->final_key_idx, - BIP32_FLAG_KEY_PUBLIC, - &final_wallet_ext_key) != WALLY_OK) { - channel_internal_error(channel, - "Could not derive final_wallet_ext_key %"PRIu64, - channel->final_key_idx); - return NULL; + /* Use BIP86 derivation for P2TR if available, otherwise BIP32 */ + if (ld->bip86_base) { + bip86_pubkey(ld, &final_key, channel->final_key_idx); + if (bip32_key_from_parent(ld->bip86_base, + channel->final_key_idx, + BIP32_FLAG_KEY_PUBLIC, + &final_wallet_ext_key) != WALLY_OK) { + channel_internal_error(channel, + "Could not derive final_wallet_ext_key (bip86) %"PRIu64, + channel->final_key_idx); + return NULL; + } + } else { + bip32_pubkey(ld, &final_key, channel->final_key_idx); + if (bip32_key_from_parent(ld->bip32_base, + channel->final_key_idx, + BIP32_FLAG_KEY_PUBLIC, + &final_wallet_ext_key) != WALLY_OK) { + channel_internal_error(channel, + "Could not derive final_wallet_ext_key %"PRIu64, + channel->final_key_idx); + return NULL; + } } tx = bitcoin_tx(ctx, chainparams, 1, 1, info->locktime);