Skip to content

Commit ac77475

Browse files
committed
Fill PSBT Taproot output data to/from SignatureData
1 parent 25b6ae4 commit ac77475

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

src/psbt.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,15 @@ void PSBTOutput::FillSignatureData(SignatureData& sigdata) const
213213
for (const auto& key_pair : hd_keypaths) {
214214
sigdata.misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
215215
}
216+
if (m_tap_tree.has_value() && m_tap_internal_key.IsFullyValid()) {
217+
TaprootSpendData spenddata = m_tap_tree->GetSpendData();
218+
219+
sigdata.tr_spenddata.internal_key = m_tap_internal_key;
220+
sigdata.tr_spenddata.Merge(spenddata);
221+
}
222+
for (const auto& [pubkey, leaf_origin] : m_tap_bip32_paths) {
223+
sigdata.taproot_misc_pubkeys.emplace(pubkey, leaf_origin);
224+
}
216225
}
217226

218227
void PSBTOutput::FromSignatureData(const SignatureData& sigdata)
@@ -226,6 +235,15 @@ void PSBTOutput::FromSignatureData(const SignatureData& sigdata)
226235
for (const auto& entry : sigdata.misc_pubkeys) {
227236
hd_keypaths.emplace(entry.second);
228237
}
238+
if (!sigdata.tr_spenddata.internal_key.IsNull()) {
239+
m_tap_internal_key = sigdata.tr_spenddata.internal_key;
240+
}
241+
if (sigdata.tr_builder.has_value()) {
242+
m_tap_tree = sigdata.tr_builder;
243+
}
244+
for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) {
245+
m_tap_bip32_paths.emplace(pubkey, leaf_origin);
246+
}
229247
}
230248

231249
bool PSBTOutput::IsNull() const

src/script/sign.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,11 +216,15 @@ static bool SignTaprootScript(const SigningProvider& provider, const BaseSignatu
216216
static bool SignTaproot(const SigningProvider& provider, const BaseSignatureCreator& creator, const WitnessV1Taproot& output, SignatureData& sigdata, std::vector<valtype>& result)
217217
{
218218
TaprootSpendData spenddata;
219+
TaprootBuilder builder;
219220

220221
// Gather information about this output.
221222
if (provider.GetTaprootSpendData(output, spenddata)) {
222223
sigdata.tr_spenddata.Merge(spenddata);
223224
}
225+
if (provider.GetTaprootBuilder(output, builder)) {
226+
sigdata.tr_builder = builder;
227+
}
224228

225229
// Try key path spending.
226230
{

src/script/sign.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ struct SignatureData {
7070
CScript witness_script; ///< The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
7171
CScriptWitness scriptWitness; ///< The scriptWitness of an input. Contains complete signatures or the traditional partial signatures format. scriptWitness is part of a transaction input per BIP 144.
7272
TaprootSpendData tr_spenddata; ///< Taproot spending data.
73+
std::optional<TaprootBuilder> tr_builder; ///< Taproot tree used to build tr_spenddata.
7374
std::map<CKeyID, SigPair> signatures; ///< BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a final scriptSig or scriptWitness.
7475
std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> misc_pubkeys;
7576
std::vector<unsigned char> taproot_key_path_sig; /// Schnorr signature for key path spending

0 commit comments

Comments
 (0)