Coverage Report

Created: 2026-05-06 07:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/psbt.cpp
Line
Count
Source
1
// Copyright (c) 2009-present The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#include <psbt.h>
6
7
#include <common/types.h>
8
#include <node/types.h>
9
#include <policy/policy.h>
10
#include <primitives/transaction.h>
11
#include <script/signingprovider.h>
12
#include <util/check.h>
13
#include <util/result.h>
14
#include <util/strencodings.h>
15
16
using common::PSBTError;
17
18
497
PartiallySignedTransaction::PartiallySignedTransaction(const CMutableTransaction& tx, uint32_t version) : m_version(version)
19
497
{
20
497
    assert(m_version == 0 || m_version == 2);
21
22
497
    tx_version = tx.version;
23
497
    fallback_locktime = tx.nLockTime;
24
497
    inputs.reserve(tx.vin.size());
25
1.73k
    for (const CTxIn& input : tx.vin) {
26
1.73k
        inputs.emplace_back(GetVersion(), input.prevout.hash, input.prevout.n, input.nSequence);
27
1.73k
    }
28
497
    outputs.reserve(tx.vout.size());
29
4.15k
    for (const CTxOut& output : tx.vout) {
30
4.15k
        outputs.emplace_back(GetVersion(), output.nValue, output.scriptPubKey);
31
4.15k
    }
32
497
}
33
34
bool PartiallySignedTransaction::IsNull() const
35
0
{
36
0
    return inputs.empty() && outputs.empty() && unknown.empty();
37
0
}
38
39
bool PartiallySignedTransaction::Merge(const PartiallySignedTransaction& psbt)
40
100
{
41
    // Prohibited to merge two PSBTs over different transactions
42
100
    std::optional<Txid> this_id = GetUniqueID();
43
100
    std::optional<Txid> psbt_id = psbt.GetUniqueID();
44
100
    if (!this_id || !psbt_id || this_id != psbt_id) {
45
1
        return false;
46
1
    }
47
99
    if (GetVersion() != psbt.GetVersion()) {
48
0
        return false;
49
0
    }
50
51
200
    for (unsigned int i = 0; i < inputs.size(); ++i) {
52
101
        if (!inputs[i].Merge(psbt.inputs[i])) {
53
0
            return false;
54
0
        }
55
101
    }
56
292
    for (unsigned int i = 0; i < outputs.size(); ++i) {
57
193
        if (!outputs[i].Merge(psbt.outputs[i])) {
58
0
            return false;
59
0
        }
60
193
    }
61
99
    for (auto& xpub_pair : psbt.m_xpubs) {
62
0
        if (!m_xpubs.contains(xpub_pair.first)) {
63
0
            m_xpubs[xpub_pair.first] = xpub_pair.second;
64
0
        } else {
65
0
            m_xpubs[xpub_pair.first].insert(xpub_pair.second.begin(), xpub_pair.second.end());
66
0
        }
67
0
    }
68
99
    if (fallback_locktime == std::nullopt && psbt.fallback_locktime != std::nullopt) fallback_locktime = psbt.fallback_locktime;
69
70
    // Set m_tx_modifiable only if either PSBT had it set
71
99
    if (m_tx_modifiable.has_value() || psbt.m_tx_modifiable.has_value()) {
72
        // In general, we AND the modifiable flags
73
0
        std::bitset<8> this_modifiable = m_tx_modifiable.value_or(0);
74
0
        std::bitset<8> psbt_modifiable = psbt.m_tx_modifiable.value_or(0);
75
0
        std::bitset<8> final_modifiable = this_modifiable & psbt_modifiable;
76
        // SIGHASH_SINGLE Modifiable (bit 2) needs to be bitwise OR'd
77
0
        final_modifiable.set(2, this_modifiable[2] || psbt_modifiable[2]);
78
79
0
        m_tx_modifiable = final_modifiable;
80
0
    }
81
82
99
    unknown.insert(psbt.unknown.begin(), psbt.unknown.end());
83
84
99
    return true;
85
99
}
86
87
std::optional<uint32_t> PartiallySignedTransaction::ComputeTimeLock() const
88
56.8k
{
89
56.8k
    if (GetVersion() >= 2) {
90
56.2k
        std::optional<uint32_t> time_lock{0};
91
56.2k
        std::optional<uint32_t> height_lock{0};
92
7.67M
        for (const PSBTInput& input : inputs) {
93
7.67M
            if (input.time_locktime.has_value() && !input.height_locktime.has_value()) {
94
10
                height_lock.reset(); // Transaction can no longer have a height locktime
95
10
                if (!time_lock.has_value()) {
96
2
                    return std::nullopt;
97
2
                }
98
7.67M
            } else if (!input.time_locktime.has_value() && input.height_locktime.has_value()) {
99
10
                time_lock.reset(); // Transaction can no longer have a time locktime
100
10
                if (!height_lock.has_value()) {
101
0
                    return std::nullopt;
102
0
                }
103
10
            }
104
7.67M
            if (input.time_locktime && time_lock.has_value()) {
105
19
                time_lock = std::max(time_lock, input.time_locktime);
106
19
            }
107
7.67M
            if (input.height_locktime && height_lock.has_value()) {
108
21
                height_lock = std::max(height_lock, input.height_locktime);
109
21
            }
110
7.67M
        }
111
56.2k
        if (height_lock.has_value() && *height_lock > 0) {
112
9
            return *height_lock;
113
9
        }
114
56.2k
        if (time_lock.has_value() && *time_lock > 0) {
115
8
            return *time_lock;
116
8
        }
117
56.2k
    }
118
56.8k
    return fallback_locktime.value_or(0);
119
56.8k
}
120
121
std::optional<CMutableTransaction> PartiallySignedTransaction::GetUnsignedTx() const
122
56.8k
{
123
56.8k
    CMutableTransaction mtx;
124
56.8k
    mtx.version = tx_version;
125
56.8k
    std::optional<uint32_t> locktime = ComputeTimeLock();
126
56.8k
    if (!locktime) {
127
1
        return std::nullopt;
128
1
    }
129
56.8k
    mtx.nLockTime = *locktime;
130
56.8k
    uint32_t max_sequence = CTxIn::SEQUENCE_FINAL;
131
7.67M
    for (const PSBTInput& input : inputs) {
132
7.67M
        CTxIn txin;
133
7.67M
        txin.prevout.hash = input.prev_txid;
134
7.67M
        txin.prevout.n = input.prev_out;
135
7.67M
        txin.nSequence = input.sequence.value_or(max_sequence);
136
7.67M
        mtx.vin.push_back(txin);
137
7.67M
    }
138
810k
    for (const PSBTOutput& output : outputs) {
139
810k
        CTxOut txout;
140
810k
        txout.nValue = output.amount;
141
810k
        txout.scriptPubKey = output.script;
142
810k
        mtx.vout.push_back(txout);
143
810k
    }
144
56.8k
    return mtx;
145
56.8k
}
146
147
std::optional<Txid> PartiallySignedTransaction::GetUniqueID() const
148
200
{
149
    // Get the unsigned transaction
150
200
    std::optional<CMutableTransaction> mtx = GetUnsignedTx();
151
200
    if (!mtx) {
152
0
        return std::nullopt;
153
0
    }
154
200
    if (GetVersion() >= 2) {
155
190
        for (CTxIn& txin : mtx->vin) {
156
190
            txin.nSequence = 0;
157
190
        }
158
188
    }
159
200
    return mtx->GetHash();
160
200
}
161
162
bool PartiallySignedTransaction::AddInput(const PSBTInput& psbtin)
163
33
{
164
    // The input being added must be for this PSBT's version
165
33
    if (psbtin.GetVersion() != GetVersion()) {
166
1
        return false;
167
1
    }
168
169
    // Prevent duplicate inputs
170
32
    if (std::find_if(inputs.begin(), inputs.end(),
171
72
        [psbtin](const PSBTInput& psbt) {
172
72
            return psbt.prev_txid == psbtin.prev_txid && psbt.prev_out == psbtin.prev_out;
173
72
        }
174
32
    ) != inputs.end()) {
175
7
        return false;
176
7
    }
177
178
25
    if (GetVersion() < 2) {
179
        // This is a v0 psbt, so do the v0 AddInput
180
17
        inputs.push_back(psbtin);
181
17
        inputs.back().partial_sigs.clear();
182
17
        inputs.back().final_script_sig.clear();
183
17
        inputs.back().final_script_witness.SetNull();
184
17
        return true;
185
17
    }
186
187
    // Check inputs modifiable flag
188
8
    if (!m_tx_modifiable.has_value() || !m_tx_modifiable->test(0)) {
189
1
        return false;
190
1
    }
191
192
    // Determine if we need to iterate the inputs.
193
    // For now, we only do this if the new input has a required time lock.
194
    // BIP 370 states that we should also do this if m_tx_modifiable's bit 2 is set
195
    // (Has SIGHASH_SINGLE flag) but since we are only adding inputs at the end of the vector,
196
    // we don't care about that.
197
7
    bool iterate_inputs = psbtin.time_locktime != std::nullopt || psbtin.height_locktime != std::nullopt;
198
7
    if (iterate_inputs) {
199
4
        std::optional<uint32_t> old_timelock = ComputeTimeLock();
200
4
        if (!old_timelock) {
201
0
            return false;
202
0
        }
203
204
4
        std::optional<uint32_t> time_lock = psbtin.time_locktime;
205
4
        std::optional<uint32_t> height_lock = psbtin.height_locktime;
206
4
        bool has_sigs = false;
207
14
        for (const PSBTInput& input : inputs) {
208
14
            if (input.time_locktime.has_value() && !input.height_locktime.has_value()) {
209
2
                height_lock.reset(); // Transaction can no longer have a height locktime
210
2
                if (time_lock == std::nullopt) {
211
1
                    return false;
212
1
                }
213
12
            } else if (!input.time_locktime.has_value() && input.height_locktime.has_value()) {
214
0
                time_lock.reset(); // Transaction can no longer have a time locktime
215
0
                if (height_lock == std::nullopt) {
216
0
                    return false;
217
0
                }
218
0
            }
219
13
            if (input.time_locktime && time_lock.has_value()) {
220
3
                time_lock = std::max(time_lock, input.time_locktime);
221
3
            }
222
13
            if (input.height_locktime && height_lock.has_value()) {
223
1
                height_lock = std::max(height_lock, input.height_locktime);
224
1
            }
225
13
            if (input.HasSignatures()) {
226
1
                has_sigs = true;
227
1
            }
228
13
        }
229
3
        uint32_t new_timelock = fallback_locktime.value_or(0);
230
3
        if (height_lock.has_value() && *height_lock > 0) {
231
1
            new_timelock = *height_lock;
232
2
        } else if (time_lock.has_value() && *time_lock > 0) {
233
2
            new_timelock = *time_lock;
234
2
        }
235
3
        if (has_sigs && *old_timelock != new_timelock) {
236
1
            return false;
237
1
        }
238
3
    }
239
240
    // Add the input to the end
241
5
    inputs.push_back(psbtin);
242
5
    return true;
243
7
}
244
245
bool PartiallySignedTransaction::AddOutput(const PSBTOutput& psbtout)
246
13
{
247
    // The output being added must be for this PSBT's version
248
13
    if (psbtout.GetVersion() != GetVersion()) {
249
1
        return false;
250
1
    }
251
252
12
    if (GetVersion() < 2) {
253
        // This is a v0 psbt, do the v0 AddOutput
254
9
        outputs.push_back(psbtout);
255
9
        return true;
256
9
    }
257
258
    // No global tx, must be PSBTv2
259
    // Check outputs are modifiable
260
3
    if (!m_tx_modifiable.has_value() || !m_tx_modifiable->test(1)) {
261
1
        return false;
262
1
    }
263
2
    outputs.push_back(psbtout);
264
265
2
    return true;
266
3
}
267
268
bool PSBTInput::GetUTXO(CTxOut& utxo) const
269
5.50k
{
270
5.50k
    if (non_witness_utxo) {
271
4.84k
        if (prev_out >= non_witness_utxo->vout.size()) {
272
1
            return false;
273
1
        }
274
4.84k
        if (non_witness_utxo->GetHash() != prev_txid) {
275
0
            return false;
276
0
        }
277
4.84k
        utxo = non_witness_utxo->vout[prev_out];
278
4.84k
    } else if (!witness_utxo.IsNull()) {
279
625
        utxo = witness_utxo;
280
625
    } else {
281
38
        return false;
282
38
    }
283
5.46k
    return true;
284
5.50k
}
285
286
COutPoint PSBTInput::GetOutPoint() const
287
49.0k
{
288
49.0k
    return COutPoint(prev_txid, prev_out);
289
49.0k
}
290
291
bool PSBTInput::IsNull() const
292
0
{
293
0
    return !non_witness_utxo && witness_utxo.IsNull() && partial_sigs.empty() && unknown.empty() && hd_keypaths.empty() && redeem_script.empty() && witness_script.empty();
294
0
}
295
296
void PSBTInput::FillSignatureData(SignatureData& sigdata) const
297
23.4k
{
298
23.4k
    if (!final_script_sig.empty()) {
299
0
        sigdata.scriptSig = final_script_sig;
300
0
        sigdata.complete = true;
301
0
    }
302
23.4k
    if (!final_script_witness.IsNull()) {
303
0
        sigdata.scriptWitness = final_script_witness;
304
0
        sigdata.complete = true;
305
0
    }
306
23.4k
    if (sigdata.complete) {
307
0
        return;
308
0
    }
309
310
23.4k
    sigdata.signatures.insert(partial_sigs.begin(), partial_sigs.end());
311
23.4k
    if (!redeem_script.empty()) {
312
4.37k
        sigdata.redeem_script = redeem_script;
313
4.37k
    }
314
23.4k
    if (!witness_script.empty()) {
315
349
        sigdata.witness_script = witness_script;
316
349
    }
317
23.4k
    for (const auto& key_pair : hd_keypaths) {
318
14.3k
        sigdata.misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
319
14.3k
    }
320
23.4k
    if (!m_tap_key_sig.empty()) {
321
194
        sigdata.taproot_key_path_sig = m_tap_key_sig;
322
194
    }
323
23.4k
    for (const auto& [pubkey_leaf, sig] : m_tap_script_sigs) {
324
569
        sigdata.taproot_script_sigs.emplace(pubkey_leaf, sig);
325
569
    }
326
23.4k
    if (!m_tap_internal_key.IsNull()) {
327
2.43k
        sigdata.tr_spenddata.internal_key = m_tap_internal_key;
328
2.43k
    }
329
23.4k
    if (!m_tap_merkle_root.IsNull()) {
330
1.87k
        sigdata.tr_spenddata.merkle_root = m_tap_merkle_root;
331
1.87k
    }
332
23.4k
    for (const auto& [leaf_script, control_block] : m_tap_scripts) {
333
2.86k
        sigdata.tr_spenddata.scripts.emplace(leaf_script, control_block);
334
2.86k
    }
335
23.4k
    for (const auto& [pubkey, leaf_origin] : m_tap_bip32_paths) {
336
11.2k
        sigdata.taproot_misc_pubkeys.emplace(pubkey, leaf_origin);
337
11.2k
        sigdata.tap_pubkeys.emplace(Hash160(pubkey), pubkey);
338
11.2k
    }
339
23.4k
    for (const auto& [hash, preimage] : ripemd160_preimages) {
340
0
        sigdata.ripemd160_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
341
0
    }
342
23.4k
    for (const auto& [hash, preimage] : sha256_preimages) {
343
12
        sigdata.sha256_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
344
12
    }
345
23.4k
    for (const auto& [hash, preimage] : hash160_preimages) {
346
0
        sigdata.hash160_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
347
0
    }
348
23.4k
    for (const auto& [hash, preimage] : hash256_preimages) {
349
0
        sigdata.hash256_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
350
0
    }
351
23.4k
    sigdata.musig2_pubkeys.insert(m_musig2_participants.begin(), m_musig2_participants.end());
352
23.4k
    for (const auto& [agg_key_lh, pubnonces] : m_musig2_pubnonces) {
353
1.91k
        sigdata.musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end());
354
1.91k
    }
355
23.4k
    for (const auto& [agg_key_lh, psigs] : m_musig2_partial_sigs) {
356
401
        sigdata.musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end());
357
401
    }
358
23.4k
}
359
360
void PSBTInput::FromSignatureData(const SignatureData& sigdata)
361
23.3k
{
362
23.3k
    if (sigdata.complete) {
363
1.68k
        partial_sigs.clear();
364
1.68k
        hd_keypaths.clear();
365
1.68k
        redeem_script.clear();
366
1.68k
        witness_script.clear();
367
368
1.68k
        if (!sigdata.scriptSig.empty()) {
369
749
            final_script_sig = sigdata.scriptSig;
370
749
        }
371
1.68k
        if (!sigdata.scriptWitness.IsNull()) {
372
1.44k
            final_script_witness = sigdata.scriptWitness;
373
1.44k
        }
374
1.68k
        return;
375
1.68k
    }
376
377
21.7k
    partial_sigs.insert(sigdata.signatures.begin(), sigdata.signatures.end());
378
21.7k
    if (redeem_script.empty() && !sigdata.redeem_script.empty()) {
379
541
        redeem_script = sigdata.redeem_script;
380
541
    }
381
21.7k
    if (witness_script.empty() && !sigdata.witness_script.empty()) {
382
33
        witness_script = sigdata.witness_script;
383
33
    }
384
21.7k
    for (const auto& entry : sigdata.misc_pubkeys) {
385
14.4k
        hd_keypaths.emplace(entry.second);
386
14.4k
    }
387
21.7k
    if (!sigdata.taproot_key_path_sig.empty()) {
388
219
        m_tap_key_sig = sigdata.taproot_key_path_sig;
389
219
    }
390
21.7k
    for (const auto& [pubkey_leaf, sig] : sigdata.taproot_script_sigs) {
391
628
        m_tap_script_sigs.emplace(pubkey_leaf, sig);
392
628
    }
393
21.7k
    if (!sigdata.tr_spenddata.internal_key.IsNull()) {
394
2.35k
        m_tap_internal_key = sigdata.tr_spenddata.internal_key;
395
2.35k
    }
396
21.7k
    if (!sigdata.tr_spenddata.merkle_root.IsNull()) {
397
1.81k
        m_tap_merkle_root = sigdata.tr_spenddata.merkle_root;
398
1.81k
    }
399
21.7k
    for (const auto& [leaf_script, control_block] : sigdata.tr_spenddata.scripts) {
400
2.76k
        m_tap_scripts.emplace(leaf_script, control_block);
401
2.76k
    }
402
21.7k
    for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) {
403
10.9k
        m_tap_bip32_paths.emplace(pubkey, leaf_origin);
404
10.9k
    }
405
21.7k
    m_musig2_participants.insert(sigdata.musig2_pubkeys.begin(), sigdata.musig2_pubkeys.end());
406
21.7k
    for (const auto& [agg_key_lh, pubnonces] : sigdata.musig2_pubnonces) {
407
1.98k
        m_musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end());
408
1.98k
    }
409
21.7k
    for (const auto& [agg_key_lh, psigs] : sigdata.musig2_partial_sigs) {
410
422
        m_musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end());
411
422
    }
412
21.7k
    for (const auto& [hash, preimage] : sigdata.ripemd160_preimages) {
413
0
        ripemd160_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
414
0
    }
415
21.7k
    for (const auto& [hash, preimage] : sigdata.sha256_preimages) {
416
11
        sha256_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
417
11
    }
418
21.7k
    for (const auto& [hash, preimage] : sigdata.hash160_preimages) {
419
0
        hash160_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
420
0
    }
421
21.7k
    for (const auto& [hash, preimage] : sigdata.hash256_preimages) {
422
0
        hash256_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
423
0
    }
424
21.7k
}
425
426
bool PSBTInput::Merge(const PSBTInput& input)
427
101
{
428
101
    if (!non_witness_utxo && input.non_witness_utxo) non_witness_utxo = input.non_witness_utxo;
429
101
    if (witness_utxo.IsNull() && !input.witness_utxo.IsNull()) {
430
1
        witness_utxo = input.witness_utxo;
431
1
    }
432
433
101
    partial_sigs.insert(input.partial_sigs.begin(), input.partial_sigs.end());
434
101
    ripemd160_preimages.insert(input.ripemd160_preimages.begin(), input.ripemd160_preimages.end());
435
101
    sha256_preimages.insert(input.sha256_preimages.begin(), input.sha256_preimages.end());
436
101
    hash160_preimages.insert(input.hash160_preimages.begin(), input.hash160_preimages.end());
437
101
    hash256_preimages.insert(input.hash256_preimages.begin(), input.hash256_preimages.end());
438
101
    hd_keypaths.insert(input.hd_keypaths.begin(), input.hd_keypaths.end());
439
101
    unknown.insert(input.unknown.begin(), input.unknown.end());
440
101
    m_tap_script_sigs.insert(input.m_tap_script_sigs.begin(), input.m_tap_script_sigs.end());
441
101
    m_tap_scripts.insert(input.m_tap_scripts.begin(), input.m_tap_scripts.end());
442
101
    m_tap_bip32_paths.insert(input.m_tap_bip32_paths.begin(), input.m_tap_bip32_paths.end());
443
444
101
    if (redeem_script.empty() && !input.redeem_script.empty()) redeem_script = input.redeem_script;
445
101
    if (witness_script.empty() && !input.witness_script.empty()) witness_script = input.witness_script;
446
101
    if (final_script_sig.empty() && !input.final_script_sig.empty()) final_script_sig = input.final_script_sig;
447
101
    if (final_script_witness.IsNull() && !input.final_script_witness.IsNull()) final_script_witness = input.final_script_witness;
448
101
    if (m_tap_key_sig.empty() && !input.m_tap_key_sig.empty()) m_tap_key_sig = input.m_tap_key_sig;
449
101
    if (m_tap_internal_key.IsNull() && !input.m_tap_internal_key.IsNull()) m_tap_internal_key = input.m_tap_internal_key;
450
101
    if (m_tap_merkle_root.IsNull() && !input.m_tap_merkle_root.IsNull()) m_tap_merkle_root = input.m_tap_merkle_root;
451
101
    m_musig2_participants.insert(input.m_musig2_participants.begin(), input.m_musig2_participants.end());
452
111
    for (const auto& [agg_key_lh, pubnonces] : input.m_musig2_pubnonces) {
453
111
        m_musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end());
454
111
    }
455
101
    for (const auto& [agg_key_lh, psigs] : input.m_musig2_partial_sigs) {
456
49
        m_musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end());
457
49
    }
458
101
    if (sequence == std::nullopt && input.sequence != std::nullopt) sequence = input.sequence;
459
101
    if (time_locktime == std::nullopt && input.time_locktime != std::nullopt) time_locktime = input.time_locktime;
460
101
    if (height_locktime == std::nullopt && input.height_locktime != std::nullopt) height_locktime = input.height_locktime;
461
462
101
    return true;
463
101
}
464
465
bool PSBTInput::HasSignatures() const
466
13
{
467
13
    return !final_script_sig.empty()
468
13
           || !final_script_witness.IsNull()
469
13
           || !partial_sigs.empty()
470
13
           || !m_tap_key_sig.empty()
471
13
           || !m_tap_script_sigs.empty()
472
13
           || !m_musig2_partial_sigs.empty();
473
13
}
474
475
void PSBTOutput::FillSignatureData(SignatureData& sigdata) const
476
983
{
477
983
    if (!redeem_script.empty()) {
478
5
        sigdata.redeem_script = redeem_script;
479
5
    }
480
983
    if (!witness_script.empty()) {
481
8
        sigdata.witness_script = witness_script;
482
8
    }
483
983
    for (const auto& key_pair : hd_keypaths) {
484
310
        sigdata.misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
485
310
    }
486
983
    if (!m_tap_tree.empty() && m_tap_internal_key.IsFullyValid()) {
487
123
        TaprootBuilder builder;
488
297
        for (const auto& [depth, leaf_ver, script] : m_tap_tree) {
489
297
            builder.Add((int)depth, script, (int)leaf_ver, /*track=*/true);
490
297
        }
491
123
        assert(builder.IsComplete());
492
123
        builder.Finalize(m_tap_internal_key);
493
123
        TaprootSpendData spenddata = builder.GetSpendData();
494
495
123
        sigdata.tr_spenddata.internal_key = m_tap_internal_key;
496
123
        sigdata.tr_spenddata.Merge(spenddata);
497
123
        sigdata.tr_builder = builder;
498
123
    }
499
983
    for (const auto& [pubkey, leaf_origin] : m_tap_bip32_paths) {
500
545
        sigdata.taproot_misc_pubkeys.emplace(pubkey, leaf_origin);
501
545
        sigdata.tap_pubkeys.emplace(Hash160(pubkey), pubkey);
502
545
    }
503
983
    sigdata.musig2_pubkeys.insert(m_musig2_participants.begin(), m_musig2_participants.end());
504
983
}
505
506
void PSBTOutput::FromSignatureData(const SignatureData& sigdata)
507
983
{
508
983
    if (redeem_script.empty() && !sigdata.redeem_script.empty()) {
509
21
        redeem_script = sigdata.redeem_script;
510
21
    }
511
983
    if (witness_script.empty() && !sigdata.witness_script.empty()) {
512
10
        witness_script = sigdata.witness_script;
513
10
    }
514
983
    for (const auto& entry : sigdata.misc_pubkeys) {
515
728
        hd_keypaths.emplace(entry.second);
516
728
    }
517
983
    if (!sigdata.tr_spenddata.internal_key.IsNull()) {
518
240
        m_tap_internal_key = sigdata.tr_spenddata.internal_key;
519
240
    }
520
983
    if (sigdata.tr_builder.has_value() && sigdata.tr_builder->HasScripts()) {
521
186
        m_tap_tree = sigdata.tr_builder->GetTreeTuples();
522
186
    }
523
983
    for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) {
524
820
        m_tap_bip32_paths.emplace(pubkey, leaf_origin);
525
820
    }
526
983
    m_musig2_participants.insert(sigdata.musig2_pubkeys.begin(), sigdata.musig2_pubkeys.end());
527
983
}
528
529
bool PSBTOutput::IsNull() const
530
0
{
531
0
    return redeem_script.empty() && witness_script.empty() && hd_keypaths.empty() && unknown.empty();
532
0
}
533
534
bool PSBTOutput::Merge(const PSBTOutput& output)
535
193
{
536
193
    hd_keypaths.insert(output.hd_keypaths.begin(), output.hd_keypaths.end());
537
193
    unknown.insert(output.unknown.begin(), output.unknown.end());
538
193
    m_tap_bip32_paths.insert(output.m_tap_bip32_paths.begin(), output.m_tap_bip32_paths.end());
539
540
193
    if (redeem_script.empty() && !output.redeem_script.empty()) redeem_script = output.redeem_script;
541
193
    if (witness_script.empty() && !output.witness_script.empty()) witness_script = output.witness_script;
542
193
    if (m_tap_internal_key.IsNull() && !output.m_tap_internal_key.IsNull()) m_tap_internal_key = output.m_tap_internal_key;
543
193
    if (m_tap_tree.empty() && !output.m_tap_tree.empty()) m_tap_tree = output.m_tap_tree;
544
193
    m_musig2_participants.insert(output.m_musig2_participants.begin(), output.m_musig2_participants.end());
545
546
193
    return true;
547
193
}
548
549
bool PSBTInputSigned(const PSBTInput& input)
550
57.4k
{
551
57.4k
    return !input.final_script_sig.empty() || !input.final_script_witness.IsNull();
552
57.4k
}
553
554
bool PSBTInputSignedAndVerified(const PartiallySignedTransaction& psbt, unsigned int input_index, const PrecomputedTransactionData* txdata)
555
28.5k
{
556
28.5k
    CTxOut utxo;
557
28.5k
    assert(input_index < psbt.inputs.size());
558
28.5k
    const PSBTInput& input = psbt.inputs[input_index];
559
560
28.5k
    if (input.non_witness_utxo) {
561
        // If we're taking our information from a non-witness UTXO, verify that it matches the prevout.
562
26.6k
        COutPoint prevout = input.GetOutPoint();
563
26.6k
        if (prevout.n >= input.non_witness_utxo->vout.size()) {
564
0
            return false;
565
0
        }
566
26.6k
        if (input.non_witness_utxo->GetHash() != prevout.hash) {
567
0
            return false;
568
0
        }
569
26.6k
        utxo = input.non_witness_utxo->vout[prevout.n];
570
26.6k
    } else if (!input.witness_utxo.IsNull()) {
571
1.82k
        utxo = input.witness_utxo;
572
1.82k
    } else {
573
38
        return false;
574
38
    }
575
576
28.5k
    std::optional<CMutableTransaction> unsigned_tx = psbt.GetUnsignedTx();
577
28.5k
    if (!unsigned_tx) {
578
0
        return false;
579
0
    }
580
28.5k
    const CMutableTransaction& tx = *unsigned_tx;
581
28.5k
    if (txdata) {
582
28.5k
        return VerifyScript(input.final_script_sig, utxo.scriptPubKey, &input.final_script_witness, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker{&tx, input_index, utxo.nValue, *txdata, MissingDataBehavior::FAIL});
583
28.5k
    } else {
584
3
        return VerifyScript(input.final_script_sig, utxo.scriptPubKey, &input.final_script_witness, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker{&tx, input_index, utxo.nValue, MissingDataBehavior::FAIL});
585
3
    }
586
28.5k
}
587
588
0
size_t CountPSBTUnsignedInputs(const PartiallySignedTransaction& psbt) {
589
0
    size_t count = 0;
590
0
    for (const auto& input : psbt.inputs) {
591
0
        if (!PSBTInputSigned(input)) {
592
0
            count++;
593
0
        }
594
0
    }
595
596
0
    return count;
597
0
}
598
599
void UpdatePSBTOutput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index)
600
983
{
601
983
    std::optional<CMutableTransaction> unsigned_tx = psbt.GetUnsignedTx();
602
983
    if (!unsigned_tx) {
603
0
        return;
604
0
    }
605
983
    CMutableTransaction& tx = *unsigned_tx;
606
983
    const CTxOut& out = tx.vout.at(index);
607
983
    PSBTOutput& psbt_out = psbt.outputs.at(index);
608
609
    // Fill a SignatureData with output info
610
983
    SignatureData sigdata;
611
983
    psbt_out.FillSignatureData(sigdata);
612
613
    // Construct a would-be spend of this output, to update sigdata with.
614
    // Note that ProduceSignature is used to fill in metadata (not actual signatures),
615
    // so provider does not need to provide any private keys (it can be a HidingSigningProvider).
616
983
    MutableTransactionSignatureCreator creator(tx, /*input_idx=*/0, out.nValue, {.sighash_type = SIGHASH_ALL});
617
983
    ProduceSignature(provider, creator, out.scriptPubKey, sigdata);
618
619
    // Put redeem_script, witness_script, key paths, into PSBTOutput.
620
983
    psbt_out.FromSignatureData(sigdata);
621
983
}
622
623
std::optional<PrecomputedTransactionData> PrecomputePSBTData(const PartiallySignedTransaction& psbt)
624
1.71k
{
625
1.71k
    std::optional<CMutableTransaction> unsigned_tx = psbt.GetUnsignedTx();
626
1.71k
    if (!unsigned_tx) {
627
0
        return std::nullopt;
628
0
    }
629
1.71k
    const CMutableTransaction& tx = *unsigned_tx;
630
1.71k
    bool have_all_spent_outputs = true;
631
1.71k
    std::vector<CTxOut> utxos;
632
5.49k
    for (const PSBTInput& input : psbt.inputs) {
633
5.49k
        if (!input.GetUTXO(utxos.emplace_back())) have_all_spent_outputs = false;
634
5.49k
    }
635
1.71k
    PrecomputedTransactionData txdata;
636
1.71k
    if (have_all_spent_outputs) {
637
1.68k
        txdata.Init(tx, std::move(utxos), true);
638
1.68k
    } else {
639
32
        txdata.Init(tx, {}, true);
640
32
    }
641
1.71k
    return txdata;
642
1.71k
}
643
644
PSBTError SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index, const PrecomputedTransactionData* txdata, const common::PSBTFillOptions& options,  SignatureData* out_sigdata)
645
24.8k
{
646
24.8k
    PSBTInput& input = psbt.inputs.at(index);
647
24.8k
    std::optional<CMutableTransaction> unsigned_tx = psbt.GetUnsignedTx();
648
24.8k
    if (!unsigned_tx) {
649
0
        return PSBTError::INVALID_TX;
650
0
    }
651
24.8k
    const CMutableTransaction& tx = *unsigned_tx;
652
653
24.8k
    if (PSBTInputSignedAndVerified(psbt, index, txdata)) {
654
1.41k
        return PSBTError::OK;
655
1.41k
    }
656
657
    // Fill SignatureData with input info
658
23.4k
    SignatureData sigdata;
659
23.4k
    input.FillSignatureData(sigdata);
660
661
    // Get UTXO
662
23.4k
    bool require_witness_sig = false;
663
23.4k
    CTxOut utxo;
664
665
23.4k
    if (input.non_witness_utxo) {
666
        // If we're taking our information from a non-witness UTXO, verify that it matches the prevout.
667
22.3k
        COutPoint prevout = input.GetOutPoint();
668
22.3k
        if (prevout.n >= input.non_witness_utxo->vout.size()) {
669
0
            return PSBTError::MISSING_INPUTS;
670
0
        }
671
22.3k
        if (input.non_witness_utxo->GetHash() != prevout.hash) {
672
0
            return PSBTError::MISSING_INPUTS;
673
0
        }
674
22.3k
        utxo = input.non_witness_utxo->vout[prevout.n];
675
22.3k
    } else if (!input.witness_utxo.IsNull()) {
676
1.08k
        utxo = input.witness_utxo;
677
        // When we're taking our information from a witness UTXO, we can't verify it is actually data from
678
        // the output being spent. This is safe in case a witness signature is produced (which includes this
679
        // information directly in the hash), but not for non-witness signatures. Remember that we require
680
        // a witness signature in this situation.
681
1.08k
        require_witness_sig = true;
682
1.08k
    } else {
683
10
        return PSBTError::MISSING_INPUTS;
684
10
    }
685
686
    // Get the sighash type
687
    // If both the field and the parameter are provided, they must match
688
    // If only the parameter is provided, use it and add it to the PSBT if it is other than SIGHASH_DEFAULT
689
    // for all input types, and not SIGHASH_ALL for non-taproot input types.
690
    // If neither are provided, use SIGHASH_DEFAULT if it is taproot, and SIGHASH_ALL for everything else.
691
23.4k
    int sighash{options.sighash_type.value_or(utxo.scriptPubKey.IsPayToTaproot() ? SIGHASH_DEFAULT : SIGHASH_ALL)};
692
693
    // For user safety, the desired sighash must be provided if the PSBT wants something other than the default set in the previous line.
694
23.4k
    if (input.sighash_type && input.sighash_type != sighash) {
695
14
        return PSBTError::SIGHASH_MISMATCH;
696
14
    }
697
    // Set the PSBT sighash field when sighash is not DEFAULT or ALL
698
    // DEFAULT is allowed for non-taproot inputs since DEFAULT may be passed for them (e.g. the psbt being signed also has taproot inputs)
699
    // Note that signing already aliases DEFAULT to ALL for non-taproot inputs.
700
23.4k
    if (utxo.scriptPubKey.IsPayToTaproot() ? sighash != SIGHASH_DEFAULT :
701
23.4k
                                            (sighash != SIGHASH_DEFAULT && sighash != SIGHASH_ALL)) {
702
95
        input.sighash_type = sighash;
703
95
    }
704
705
    // Check all existing signatures use the sighash type
706
23.4k
    if (sighash == SIGHASH_DEFAULT) {
707
3.26k
        if (!input.m_tap_key_sig.empty() && input.m_tap_key_sig.size() != 64) {
708
0
            return PSBTError::SIGHASH_MISMATCH;
709
0
        }
710
3.26k
        for (const auto& [_, sig] : input.m_tap_script_sigs) {
711
569
            if (sig.size() != 64) return PSBTError::SIGHASH_MISMATCH;
712
569
        }
713
20.1k
    } else {
714
20.1k
        if (!input.m_tap_key_sig.empty() && (input.m_tap_key_sig.size() != 65 || input.m_tap_key_sig.back() != sighash)) {
715
2
            return PSBTError::SIGHASH_MISMATCH;
716
2
        }
717
20.1k
        for (const auto& [_, sig] : input.m_tap_script_sigs) {
718
0
            if (sig.size() != 65 || sig.back() != sighash) return PSBTError::SIGHASH_MISMATCH;
719
0
        }
720
20.1k
        for (const auto& [_, sig] : input.partial_sigs) {
721
418
            if (sig.second.back() != sighash) return PSBTError::SIGHASH_MISMATCH;
722
418
        }
723
20.1k
    }
724
725
23.4k
    sigdata.witness = false;
726
23.4k
    bool sig_complete;
727
23.4k
    if (txdata == nullptr) {
728
1
        sig_complete = ProduceSignature(provider, DUMMY_SIGNATURE_CREATOR, utxo.scriptPubKey, sigdata);
729
23.4k
    } else {
730
23.4k
        MutableTransactionSignatureCreator creator(tx, index, utxo.nValue, txdata, {.sighash_type = sighash});
731
23.4k
        sig_complete = ProduceSignature(provider, creator, utxo.scriptPubKey, sigdata);
732
23.4k
    }
733
    // Verify that a witness signature was produced in case one was required.
734
23.4k
    if (require_witness_sig && !sigdata.witness) return PSBTError::INCOMPLETE;
735
736
    // If we are not finalizing, set sigdata.complete to false to not set the scriptWitness
737
23.3k
    if (!options.finalize && sigdata.complete) sigdata.complete = false;
738
739
23.3k
    input.FromSignatureData(sigdata);
740
741
    // If we have a witness signature, put a witness UTXO.
742
23.3k
    if (sigdata.witness) {
743
18.6k
        input.witness_utxo = utxo;
744
        // We can remove the non_witness_utxo if and only if there are no non-segwit or segwit v0
745
        // inputs in this transaction. Since this requires inspecting the entire transaction, this
746
        // is something for the caller to deal with (i.e. FillPSBT).
747
18.6k
    }
748
749
    // Fill in the missing info
750
23.3k
    if (out_sigdata) {
751
3
        out_sigdata->missing_pubkeys = sigdata.missing_pubkeys;
752
3
        out_sigdata->missing_sigs = sigdata.missing_sigs;
753
3
        out_sigdata->missing_redeem_script = sigdata.missing_redeem_script;
754
3
        out_sigdata->missing_witness_script = sigdata.missing_witness_script;
755
3
    }
756
757
23.3k
    return sig_complete ? PSBTError::OK : PSBTError::INCOMPLETE;
758
23.4k
}
759
760
void RemoveUnnecessaryTransactions(PartiallySignedTransaction& psbtx)
761
1.16k
{
762
    // Figure out if any non_witness_utxos should be dropped
763
1.16k
    std::vector<unsigned int> to_drop;
764
1.85k
    for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
765
1.35k
        const auto& input = psbtx.inputs.at(i);
766
1.35k
        int wit_ver;
767
1.35k
        std::vector<unsigned char> wit_prog;
768
1.35k
        if (input.witness_utxo.IsNull() || !input.witness_utxo.scriptPubKey.IsWitnessProgram(wit_ver, wit_prog)) {
769
            // There's a non-segwit input, so we cannot drop any non_witness_utxos
770
201
            to_drop.clear();
771
201
            break;
772
201
        }
773
1.14k
        if (wit_ver == 0) {
774
            // Segwit v0, so we cannot drop any non_witness_utxos
775
458
            to_drop.clear();
776
458
            break;
777
458
        }
778
        // non_witness_utxos cannot be dropped if the sighash type includes SIGHASH_ANYONECANPAY
779
        // Since callers should have called SignPSBTInput which updates the sighash type in the PSBT, we only
780
        // need to look at that field. If it is not present, then we can assume SIGHASH_DEFAULT or SIGHASH_ALL.
781
691
        if (input.sighash_type != std::nullopt && (*input.sighash_type & 0x80) == SIGHASH_ANYONECANPAY) {
782
6
            to_drop.clear();
783
6
            break;
784
6
        }
785
786
685
        if (input.non_witness_utxo) {
787
416
            to_drop.push_back(i);
788
416
        }
789
685
    }
790
791
    // Drop the non_witness_utxos that we can drop
792
1.16k
    for (unsigned int i : to_drop) {
793
416
        psbtx.inputs.at(i).non_witness_utxo = nullptr;
794
416
    }
795
1.16k
}
796
797
bool FinalizePSBT(PartiallySignedTransaction& psbtx)
798
522
{
799
    // Finalize input signatures -- in case we have partial signatures that add up to a complete
800
    //   signature, but have not combined them yet (e.g. because the combiner that created this
801
    //   PartiallySignedTransaction did not understand them), this will combine them into a final
802
    //   script.
803
522
    bool complete = true;
804
522
    std::optional<PrecomputedTransactionData> txdata_res = PrecomputePSBTData(psbtx);
805
522
    if (!txdata_res) {
806
0
        return false;
807
0
    }
808
522
    const PrecomputedTransactionData& txdata = *txdata_res;
809
2.29k
    for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
810
1.77k
        PSBTInput& input = psbtx.inputs.at(i);
811
1.77k
        complete &= (SignPSBTInput(DUMMY_SIGNING_PROVIDER, psbtx, i, &txdata, {.sighash_type = input.sighash_type, .finalize = true}, /*out_sigdata=*/nullptr) == PSBTError::OK);
812
1.77k
    }
813
814
522
    return complete;
815
522
}
816
817
bool FinalizeAndExtractPSBT(PartiallySignedTransaction& psbtx, CMutableTransaction& result)
818
519
{
819
    // It's not safe to extract a PSBT that isn't finalized, and there's no easy way to check
820
    //   whether a PSBT is finalized without finalizing it, so we just do this.
821
519
    if (!FinalizePSBT(psbtx)) {
822
37
        return false;
823
37
    }
824
825
482
    std::optional<CMutableTransaction> unsigned_tx = psbtx.GetUnsignedTx();
826
482
    if (!unsigned_tx) {
827
0
        return false;
828
0
    }
829
482
    result = *unsigned_tx;
830
2.17k
    for (unsigned int i = 0; i < result.vin.size(); ++i) {
831
1.68k
        result.vin[i].scriptSig = psbtx.inputs[i].final_script_sig;
832
1.68k
        result.vin[i].scriptWitness = psbtx.inputs[i].final_script_witness;
833
1.68k
    }
834
482
    return true;
835
482
}
836
837
std::optional<PartiallySignedTransaction> CombinePSBTs(const std::vector<PartiallySignedTransaction>& psbtxs)
838
55
{
839
55
    PartiallySignedTransaction out = psbtxs[0]; // Copy the first one
840
841
    // Merge
842
154
    for (auto it = std::next(psbtxs.begin()); it != psbtxs.end(); ++it) {
843
100
        if (!out.Merge(*it)) {
844
1
            return std::nullopt;
845
1
        }
846
100
    }
847
54
    return out;
848
55
}
849
850
14
std::string PSBTRoleName(PSBTRole role) {
851
14
    switch (role) {
852
3
    case PSBTRole::CREATOR: return "creator";
853
5
    case PSBTRole::UPDATER: return "updater";
854
2
    case PSBTRole::SIGNER: return "signer";
855
2
    case PSBTRole::FINALIZER: return "finalizer";
856
2
    case PSBTRole::EXTRACTOR: return "extractor";
857
14
    } // no default case, so the compiler can warn about missing cases
858
14
    assert(false);
859
0
}
860
861
util::Result<PartiallySignedTransaction> DecodeBase64PSBT(const std::string& base64_tx)
862
1.40k
{
863
1.40k
    auto tx_data = DecodeBase64(base64_tx);
864
1.40k
    if (!tx_data) {
865
4
        return util::Error{Untranslated("invalid base64")};
866
4
    }
867
1.39k
    return DecodeRawPSBT(MakeByteSpan(*tx_data));
868
1.40k
}
869
870
util::Result<PartiallySignedTransaction> DecodeRawPSBT(std::span<const std::byte> tx_data)
871
1.39k
{
872
1.39k
    SpanReader ss_data{tx_data};
873
1.39k
    try {
874
1.39k
        PartiallySignedTransaction psbt(deserialize, ss_data);
875
1.39k
        if (!ss_data.empty()) {
876
0
            return util::Error{Untranslated("extra data after PSBT")};
877
0
        }
878
1.39k
        return psbt;
879
1.39k
    } catch (const std::exception& e) {
880
87
        return util::Error{Untranslated(e.what())};
881
87
    }
882
1.39k
}
883
884
uint32_t PartiallySignedTransaction::GetVersion() const
885
69.6k
{
886
69.6k
    if (m_version != std::nullopt) {
887
68.5k
        return *m_version;
888
68.5k
    }
889
1.01k
    return 0;
890
69.6k
}