diff --git a/src/musig.cpp b/src/musig.cpp index b3329543127..85074796cbf 100644 --- a/src/musig.cpp +++ b/src/musig.cpp @@ -51,3 +51,14 @@ std::optional MuSig2AggregatePubkeys(const std::vector& pubkey } return GetCPubKeyFromMuSig2KeyAggCache(keyagg_cache); } + +CExtPubKey CreateMuSig2SyntheticXpub(const CPubKey& pubkey) +{ + CExtPubKey extpub; + extpub.nDepth = 0; + std::memset(extpub.vchFingerprint, 0, 4); + extpub.nChild = 0; + extpub.chaincode = MUSIG_CHAINCODE; + extpub.pubkey = pubkey; + return extpub; +} diff --git a/src/musig.h b/src/musig.h index d46a67f65ec..0bc1f5ff6f1 100644 --- a/src/musig.h +++ b/src/musig.h @@ -23,4 +23,7 @@ std::optional GetCPubKeyFromMuSig2KeyAggCache(secp256k1_musig_keyagg_ca //! Compute the full aggregate pubkey from the given participant pubkeys in their current order std::optional MuSig2AggregatePubkeys(const std::vector& pubkeys); +//! Construct the BIP 328 synthetic xpub for a pubkey +CExtPubKey CreateMuSig2SyntheticXpub(const CPubKey& pubkey); + #endif // BITCOIN_MUSIG_H diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index 3a402702178..d0436702124 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -641,13 +641,7 @@ public: // Make our pubkey provider if (IsRangedDerivation() || !m_path.empty()) { // Make the synthetic xpub and construct the BIP32PubkeyProvider - CExtPubKey extpub; - extpub.nDepth = 0; - std::memset(extpub.vchFingerprint, 0, 4); - extpub.nChild = 0; - extpub.chaincode = MUSIG_CHAINCODE; - extpub.pubkey = m_aggregate_pubkey.value(); - + CExtPubKey extpub = CreateMuSig2SyntheticXpub(m_aggregate_pubkey.value()); m_aggregate_provider = std::make_unique(m_expr_index, extpub, m_path, m_derive, /*apostrophe=*/false); } else { m_aggregate_provider = std::make_unique(m_expr_index, m_aggregate_pubkey.value(), /*xonly=*/false);