Coverage Report

Created: 2026-07-14 18:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/bitcoin/src/psbt.h
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
#ifndef BITCOIN_PSBT_H
6
#define BITCOIN_PSBT_H
7
8
#include <common/types.h>
9
#include <musig.h>
10
#include <node/transaction.h>
11
#include <policy/feerate.h>
12
#include <primitives/transaction.h>
13
#include <pubkey.h>
14
#include <script/keyorigin.h>
15
#include <script/sign.h>
16
#include <script/signingprovider.h>
17
#include <span.h>
18
#include <streams.h>
19
#include <uint256.h>
20
#include <util/result.h>
21
22
#include <optional>
23
#include <bitset>
24
25
namespace node {
26
enum class TransactionError;
27
} // namespace node
28
29
using common::PSBTError;
30
31
// Magic bytes
32
static constexpr uint8_t PSBT_MAGIC_BYTES[5] = {'p', 's', 'b', 't', 0xff};
33
34
// Global types
35
static constexpr uint8_t PSBT_GLOBAL_UNSIGNED_TX = 0x00;
36
static constexpr uint8_t PSBT_GLOBAL_XPUB = 0x01;
37
static constexpr uint8_t PSBT_GLOBAL_TX_VERSION = 0x02;
38
static constexpr uint8_t PSBT_GLOBAL_FALLBACK_LOCKTIME = 0x03;
39
static constexpr uint8_t PSBT_GLOBAL_INPUT_COUNT = 0x04;
40
static constexpr uint8_t PSBT_GLOBAL_OUTPUT_COUNT = 0x05;
41
static constexpr uint8_t PSBT_GLOBAL_TX_MODIFIABLE = 0x06;
42
static constexpr uint8_t PSBT_GLOBAL_VERSION = 0xFB;
43
static constexpr uint8_t PSBT_GLOBAL_PROPRIETARY = 0xFC;
44
45
// Input types
46
static constexpr uint8_t PSBT_IN_NON_WITNESS_UTXO = 0x00;
47
static constexpr uint8_t PSBT_IN_WITNESS_UTXO = 0x01;
48
static constexpr uint8_t PSBT_IN_PARTIAL_SIG = 0x02;
49
static constexpr uint8_t PSBT_IN_SIGHASH = 0x03;
50
static constexpr uint8_t PSBT_IN_REDEEMSCRIPT = 0x04;
51
static constexpr uint8_t PSBT_IN_WITNESSSCRIPT = 0x05;
52
static constexpr uint8_t PSBT_IN_BIP32_DERIVATION = 0x06;
53
static constexpr uint8_t PSBT_IN_SCRIPTSIG = 0x07;
54
static constexpr uint8_t PSBT_IN_SCRIPTWITNESS = 0x08;
55
static constexpr uint8_t PSBT_IN_RIPEMD160 = 0x0A;
56
static constexpr uint8_t PSBT_IN_SHA256 = 0x0B;
57
static constexpr uint8_t PSBT_IN_HASH160 = 0x0C;
58
static constexpr uint8_t PSBT_IN_HASH256 = 0x0D;
59
static constexpr uint8_t PSBT_IN_PREVIOUS_TXID = 0x0e;
60
static constexpr uint8_t PSBT_IN_OUTPUT_INDEX = 0x0f;
61
static constexpr uint8_t PSBT_IN_SEQUENCE = 0x10;
62
static constexpr uint8_t PSBT_IN_REQUIRED_TIME_LOCKTIME = 0x11;
63
static constexpr uint8_t PSBT_IN_REQUIRED_HEIGHT_LOCKTIME = 0x12;
64
static constexpr uint8_t PSBT_IN_TAP_KEY_SIG = 0x13;
65
static constexpr uint8_t PSBT_IN_TAP_SCRIPT_SIG = 0x14;
66
static constexpr uint8_t PSBT_IN_TAP_LEAF_SCRIPT = 0x15;
67
static constexpr uint8_t PSBT_IN_TAP_BIP32_DERIVATION = 0x16;
68
static constexpr uint8_t PSBT_IN_TAP_INTERNAL_KEY = 0x17;
69
static constexpr uint8_t PSBT_IN_TAP_MERKLE_ROOT = 0x18;
70
static constexpr uint8_t PSBT_IN_MUSIG2_PARTICIPANT_PUBKEYS = 0x1a;
71
static constexpr uint8_t PSBT_IN_MUSIG2_PUB_NONCE = 0x1b;
72
static constexpr uint8_t PSBT_IN_MUSIG2_PARTIAL_SIG = 0x1c;
73
static constexpr uint8_t PSBT_IN_PROPRIETARY = 0xFC;
74
75
// Output types
76
static constexpr uint8_t PSBT_OUT_REDEEMSCRIPT = 0x00;
77
static constexpr uint8_t PSBT_OUT_WITNESSSCRIPT = 0x01;
78
static constexpr uint8_t PSBT_OUT_BIP32_DERIVATION = 0x02;
79
static constexpr uint8_t PSBT_OUT_AMOUNT = 0x03;
80
static constexpr uint8_t PSBT_OUT_SCRIPT = 0x04;
81
static constexpr uint8_t PSBT_OUT_TAP_INTERNAL_KEY = 0x05;
82
static constexpr uint8_t PSBT_OUT_TAP_TREE = 0x06;
83
static constexpr uint8_t PSBT_OUT_TAP_BIP32_DERIVATION = 0x07;
84
static constexpr uint8_t PSBT_OUT_MUSIG2_PARTICIPANT_PUBKEYS = 0x08;
85
static constexpr uint8_t PSBT_OUT_PROPRIETARY = 0xFC;
86
87
// The separator is 0x00. Reading this in means that the unserializer can interpret it
88
// as a 0 length key which indicates that this is the separator. The separator has no value.
89
static constexpr uint8_t PSBT_SEPARATOR = 0x00;
90
91
// BIP 174 does not specify a maximum file size, but we set a limit anyway
92
// to prevent reading a stream indefinitely and running out of memory.
93
const std::streamsize MAX_FILE_SIZE_PSBT = 100000000; // 100 MB
94
95
// PSBT version number
96
static constexpr uint32_t PSBT_HIGHEST_VERSION = 2;
97
98
/** A structure for PSBT proprietary types */
99
struct PSBTProprietary
100
{
101
    uint64_t subtype;
102
    std::vector<unsigned char> identifier;
103
    std::vector<unsigned char> key;
104
    std::vector<unsigned char> value;
105
106
0
    bool operator<(const PSBTProprietary &b) const {
107
0
        return key < b.key;
108
0
    }
109
0
    bool operator==(const PSBTProprietary &b) const {
110
0
        return key == b.key;
111
0
    }
112
};
113
114
// Takes a stream and multiple arguments and serializes them as if first serialized into a vector and then into the stream
115
// The resulting output into the stream has the total serialized length of all of the objects followed by all objects concatenated with each other.
116
template<typename Stream, typename... X>
117
void SerializeToVector(Stream& s, const X&... args)
118
0
{
119
0
    SizeComputer sizecomp;
120
0
    SerializeMany(sizecomp, args...);
121
0
    WriteCompactSize(s, sizecomp.size());
122
0
    SerializeMany(s, args...);
123
0
}
Unexecuted instantiation: void SerializeToVector<DataStream, CompactSizeWriter>(DataStream&, CompactSizeWriter const&)
Unexecuted instantiation: void SerializeToVector<DataStream, ParamsWrapper<TransactionSerParams, CMutableTransaction> >(DataStream&, ParamsWrapper<TransactionSerParams, CMutableTransaction> const&)
Unexecuted instantiation: void SerializeToVector<DataStream, unsigned char, unsigned char [78]>(DataStream&, unsigned char const&, unsigned char const (&) [78])
Unexecuted instantiation: void SerializeToVector<DataStream, unsigned int>(DataStream&, unsigned int const&)
Unexecuted instantiation: void SerializeToVector<DataStream, unsigned char>(DataStream&, unsigned char const&)
Unexecuted instantiation: void SerializeToVector<DataStream, ParamsWrapper<TransactionSerParams, std::shared_ptr<CTransaction const> const> >(DataStream&, ParamsWrapper<TransactionSerParams, std::shared_ptr<CTransaction const> const> const&)
Unexecuted instantiation: void SerializeToVector<DataStream, CTxOut>(DataStream&, CTxOut const&)
Unexecuted instantiation: void SerializeToVector<DataStream, CompactSizeWriter, std::span<unsigned char const, 18446744073709551615ul> >(DataStream&, CompactSizeWriter const&, std::span<unsigned char const, 18446744073709551615ul> const&)
Unexecuted instantiation: void SerializeToVector<DataStream, int>(DataStream&, int const&)
Unexecuted instantiation: void SerializeToVector<DataStream, unsigned char, XOnlyPubKey, uint256>(DataStream&, unsigned char const&, XOnlyPubKey const&, uint256 const&)
Unexecuted instantiation: void SerializeToVector<DataStream, unsigned char, std::span<unsigned char const, 18446744073709551615ul> >(DataStream&, unsigned char const&, std::span<unsigned char const, 18446744073709551615ul> const&)
Unexecuted instantiation: void SerializeToVector<DataStream, unsigned char, XOnlyPubKey>(DataStream&, unsigned char const&, XOnlyPubKey const&)
Unexecuted instantiation: void SerializeToVector<DataStream, uint256>(DataStream&, uint256 const&)
Unexecuted instantiation: void SerializeToVector<DataStream, CompactSizeWriter, std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul> >(DataStream&, CompactSizeWriter const&, std::span<unsigned char const, 18446744073709551615ul> const&, std::span<unsigned char const, 18446744073709551615ul> const&)
Unexecuted instantiation: void SerializeToVector<DataStream, CompactSizeWriter, std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, uint256>(DataStream&, CompactSizeWriter const&, std::span<unsigned char const, 18446744073709551615ul> const&, std::span<unsigned char const, 18446744073709551615ul> const&, uint256 const&)
Unexecuted instantiation: void SerializeToVector<DataStream, std::vector<std::vector<unsigned char, std::allocator<unsigned char> >, std::allocator<std::vector<unsigned char, std::allocator<unsigned char> > > > >(DataStream&, std::vector<std::vector<unsigned char, std::allocator<unsigned char> >, std::allocator<std::vector<unsigned char, std::allocator<unsigned char> > > > const&)
Unexecuted instantiation: void SerializeToVector<DataStream, transaction_identifier<false> >(DataStream&, transaction_identifier<false> const&)
Unexecuted instantiation: void SerializeToVector<DataStream, long>(DataStream&, long const&)
124
125
// Takes a stream and multiple arguments and unserializes them first as a vector then each object individually in the order provided in the arguments
126
template<typename Stream, typename... X>
127
void UnserializeFromVector(Stream& s, X&&... args)
128
0
{
129
0
    size_t expected_size = ReadCompactSize(s);
130
0
    size_t remaining_before = s.size();
131
0
    UnserializeMany(s, args...);
132
0
    size_t remaining_after = s.size();
133
0
    if (remaining_after + expected_size != remaining_before) {
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
  Branch (133:9): [True: 0, False: 0]
134
0
        throw std::ios_base::failure("Size of value was not the stated size");
135
0
    }
136
0
}
Unexecuted instantiation: void UnserializeFromVector<SpanReader, ParamsWrapper<TransactionSerParams, CMutableTransaction> >(SpanReader&, ParamsWrapper<TransactionSerParams, CMutableTransaction>&&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, unsigned int&>(SpanReader&, unsigned int&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, CompactSizeReader&>(SpanReader&, CompactSizeReader&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, unsigned char&>(SpanReader&, unsigned char&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, ParamsWrapper<TransactionSerParams, std::shared_ptr<CTransaction const> > >(SpanReader&, ParamsWrapper<TransactionSerParams, std::shared_ptr<CTransaction const> >&&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, CTxOut&>(SpanReader&, CTxOut&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, int&>(SpanReader&, int&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, std::vector<std::vector<unsigned char, std::allocator<unsigned char> >, std::allocator<std::vector<unsigned char, std::allocator<unsigned char> > > >&>(SpanReader&, std::vector<std::vector<unsigned char, std::allocator<unsigned char> >, std::allocator<std::vector<unsigned char, std::allocator<unsigned char> > > >&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, transaction_identifier<false>&>(SpanReader&, transaction_identifier<false>&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, XOnlyPubKey&>(SpanReader&, XOnlyPubKey&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, uint256&>(SpanReader&, uint256&)
Unexecuted instantiation: void UnserializeFromVector<SpanReader, long&>(SpanReader&, long&)
137
138
// Deserialize bytes of given length from the stream as a KeyOriginInfo
139
template<typename Stream>
140
KeyOriginInfo DeserializeKeyOrigin(Stream& s, uint64_t length)
141
0
{
142
    // Read in key path
143
0
    if (length % 4 || length == 0) {
  Branch (143:9): [True: 0, False: 0]
  Branch (143:23): [True: 0, False: 0]
144
0
        throw std::ios_base::failure("Invalid length for HD key path");
145
0
    }
146
147
0
    KeyOriginInfo hd_keypath;
148
0
    s >> hd_keypath.fingerprint;
149
0
    for (unsigned int i = 4; i < length; i += sizeof(uint32_t)) {
  Branch (149:30): [True: 0, False: 0]
150
0
        uint32_t index;
151
0
        s >> index;
152
0
        hd_keypath.path.push_back(index);
153
0
    }
154
0
    return hd_keypath;
155
0
}
156
157
// Deserialize a length prefixed KeyOriginInfo from a stream
158
template<typename Stream>
159
void DeserializeHDKeypath(Stream& s, KeyOriginInfo& hd_keypath)
160
0
{
161
0
    hd_keypath = DeserializeKeyOrigin(s, ReadCompactSize(s));
162
0
}
163
164
// Deserialize HD keypaths into a map
165
template<typename Stream>
166
void DeserializeHDKeypaths(Stream& s, const std::vector<unsigned char>& key, std::map<CPubKey, KeyOriginInfo>& hd_keypaths)
167
0
{
168
    // Make sure that the key is the size of pubkey + 1
169
0
    if (key.size() != CPubKey::SIZE + 1 && key.size() != CPubKey::COMPRESSED_SIZE + 1) {
  Branch (169:9): [True: 0, False: 0]
  Branch (169:44): [True: 0, False: 0]
170
0
        throw std::ios_base::failure("Size of key was not the expected size for the type BIP32 keypath");
171
0
    }
172
    // Read in the pubkey from key
173
0
    CPubKey pubkey(key.begin() + 1, key.end());
174
0
    if (!pubkey.IsFullyValid()) {
  Branch (174:9): [True: 0, False: 0]
175
0
       throw std::ios_base::failure("Invalid pubkey");
176
0
    }
177
178
0
    KeyOriginInfo keypath;
179
0
    DeserializeHDKeypath(s, keypath);
180
181
    // Add to map
182
0
    hd_keypaths.emplace(pubkey, std::move(keypath));
183
0
}
184
185
// Serialize a KeyOriginInfo to a stream
186
template<typename Stream>
187
void SerializeKeyOrigin(Stream& s, KeyOriginInfo hd_keypath)
188
0
{
189
0
    s << hd_keypath.fingerprint;
190
0
    for (const auto& path : hd_keypath.path) {
  Branch (190:27): [True: 0, False: 0]
  Branch (190:27): [True: 0, False: 0]
191
0
        s << path;
192
0
    }
193
0
}
Unexecuted instantiation: void SerializeKeyOrigin<DataStream>(DataStream&, KeyOriginInfo)
Unexecuted instantiation: void SerializeKeyOrigin<VectorWriter>(VectorWriter&, KeyOriginInfo)
194
195
// Serialize a length prefixed KeyOriginInfo to a stream
196
template<typename Stream>
197
void SerializeHDKeypath(Stream& s, KeyOriginInfo hd_keypath)
198
0
{
199
0
    WriteCompactSize(s, (hd_keypath.path.size() + 1) * sizeof(uint32_t));
200
0
    SerializeKeyOrigin(s, hd_keypath);
201
0
}
202
203
// Serialize HD keypaths to a stream from a map
204
template<typename Stream>
205
void SerializeHDKeypaths(Stream& s, const std::map<CPubKey, KeyOriginInfo>& hd_keypaths, CompactSizeWriter type)
206
0
{
207
0
    for (const auto& keypath_pair : hd_keypaths) {
  Branch (207:35): [True: 0, False: 0]
208
0
        if (!keypath_pair.first.IsValid()) {
  Branch (208:13): [True: 0, False: 0]
209
0
            throw std::ios_base::failure("Invalid CPubKey being serialized");
210
0
        }
211
0
        SerializeToVector(s, type, std::span{keypath_pair.first});
212
0
        SerializeHDKeypath(s, keypath_pair.second);
213
0
    }
214
0
}
215
216
// Deserialize a PSBT_{IN/OUT}_MUSIG2_PARTICIPANT_PUBKEYS field
217
template<typename Stream>
218
void DeserializeMuSig2ParticipantPubkeys(Stream& s, SpanReader& skey, std::map<CPubKey, std::vector<CPubKey>>& out, std::string context)
219
0
{
220
0
    std::array<unsigned char, CPubKey::COMPRESSED_SIZE> agg_pubkey_bytes;
221
0
    skey >> std::as_writable_bytes(std::span{agg_pubkey_bytes});
222
0
    CPubKey agg_pubkey(agg_pubkey_bytes);
223
0
    if (!agg_pubkey.IsFullyValid()) {
  Branch (223:9): [True: 0, False: 0]
224
0
        throw std::ios_base::failure(context + " musig2 aggregate pubkey is invalid");
225
0
    }
226
227
0
    std::vector<CPubKey> participants;
228
0
    std::vector<unsigned char> val;
229
0
    s >> val;
230
0
    SpanReader s_val{val};
231
0
    while (s_val.size() >= CPubKey::COMPRESSED_SIZE) {
  Branch (231:12): [True: 0, False: 0]
232
0
        std::array<unsigned char, CPubKey::COMPRESSED_SIZE> part_pubkey_bytes;
233
0
        s_val >> std::as_writable_bytes(std::span{part_pubkey_bytes});
234
0
        CPubKey participant(part_pubkey_bytes);
235
0
        if (!participant.IsFullyValid()) {
  Branch (235:13): [True: 0, False: 0]
236
0
            throw std::ios_base::failure(context + " musig2 participant pubkey is invalid");
237
0
        }
238
0
        participants.push_back(participant);
239
0
    }
240
0
    if (!s_val.empty()) {
  Branch (240:9): [True: 0, False: 0]
241
0
        throw std::ios_base::failure(context + " musig2 participants pubkeys value size is not a multiple of 33");
242
0
    }
243
244
0
    out.emplace(agg_pubkey, participants);
245
0
}
246
247
// Deserialize the MuSig2 participant identifiers from PSBT_MUSIG2_{PUBNONCE/PARTIAL_SIG} fields
248
// Both fields contain the same data after the type byte - aggregate pubkey | participant pubkey | leaf script hash
249
template<typename Stream>
250
void DeserializeMuSig2ParticipantDataIdentifier(Stream& skey, CPubKey& agg_pub, CPubKey& part_pub, uint256& leaf_hash)
251
0
{
252
0
    leaf_hash.SetNull();
253
254
0
    std::array<unsigned char, CPubKey::COMPRESSED_SIZE> part_pubkey_bytes;
255
0
    std::array<unsigned char, CPubKey::COMPRESSED_SIZE> agg_pubkey_bytes;
256
257
0
    skey >> std::as_writable_bytes(std::span{part_pubkey_bytes}) >> std::as_writable_bytes(std::span{agg_pubkey_bytes});
258
0
    agg_pub.Set(agg_pubkey_bytes.begin(), agg_pubkey_bytes.end());
259
0
    if (!agg_pub.IsFullyValid()) {
  Branch (259:9): [True: 0, False: 0]
260
0
        throw std::ios_base::failure("musig2 aggregate pubkey is invalid");
261
0
    }
262
263
0
    part_pub.Set(part_pubkey_bytes.begin(), part_pubkey_bytes.end());
264
0
    if (!part_pub.IsFullyValid()) {
  Branch (264:9): [True: 0, False: 0]
265
0
        throw std::ios_base::failure("musig2 participant pubkey is invalid");
266
0
    }
267
268
0
    if (!skey.empty()) {
  Branch (268:9): [True: 0, False: 0]
269
0
        skey >> leaf_hash;
270
0
    }
271
0
}
272
273
0
static inline void ExpectedKeySize(const std::string& key_name, const std::vector<unsigned char>& key, uint64_t expected_size) {
274
0
    if (key.size() != expected_size) {
  Branch (274:9): [True: 0, False: 0]
275
0
        throw std::ios_base::failure(tfm::format("Size of key was not %d for the type %s", expected_size, key_name));
276
0
    }
277
0
}
Unexecuted instantiation: rawtransaction.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: psbt.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: init.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: interfaces.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: feebumper.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: fees.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: load.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: receive.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: wallet.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: spend.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: util.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: transactions.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: backup.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: export.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: encrypt.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: addresses.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: coins.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: signmessage.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: scriptpubkeyman.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: external_signer_scriptpubkeyman.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: walletdb.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
Unexecuted instantiation: external_signer.cpp:ExpectedKeySize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long)
278
279
/** A structure for PSBTs which contain per-input information */
280
class PSBTInput
281
{
282
private:
283
    uint32_t m_psbt_version;
284
285
public:
286
    CTransactionRef non_witness_utxo;
287
    CTxOut witness_utxo;
288
    CScript redeem_script;
289
    CScript witness_script;
290
    CScript final_script_sig;
291
    CScriptWitness final_script_witness;
292
    std::map<CPubKey, KeyOriginInfo> hd_keypaths;
293
    std::map<CKeyID, SigPair> partial_sigs;
294
    std::map<uint160, std::vector<unsigned char>> ripemd160_preimages;
295
    std::map<uint256, std::vector<unsigned char>> sha256_preimages;
296
    std::map<uint160, std::vector<unsigned char>> hash160_preimages;
297
    std::map<uint256, std::vector<unsigned char>> hash256_preimages;
298
299
    Txid prev_txid;
300
    uint32_t prev_out;
301
    std::optional<uint32_t> sequence;
302
    std::optional<uint32_t> time_locktime;
303
    std::optional<uint32_t> height_locktime;
304
305
    // Taproot fields
306
    std::vector<unsigned char> m_tap_key_sig;
307
    std::map<std::pair<XOnlyPubKey, uint256>, std::vector<unsigned char>> m_tap_script_sigs;
308
    std::map<std::pair<std::vector<unsigned char>, int>, std::set<std::vector<unsigned char>, ShortestVectorFirstComparator>> m_tap_scripts;
309
    std::map<XOnlyPubKey, std::pair<std::set<uint256>, KeyOriginInfo>> m_tap_bip32_paths;
310
    XOnlyPubKey m_tap_internal_key;
311
    uint256 m_tap_merkle_root;
312
313
    // MuSig2 fields
314
    std::map<CPubKey, std::vector<CPubKey>> m_musig2_participants;
315
    // Key is the aggregate pubkey and the script leaf hash, value is a map of participant pubkey to pubnonce
316
    std::map<std::pair<CPubKey, uint256>, std::map<CPubKey, std::vector<uint8_t>>> m_musig2_pubnonces;
317
    // Key is the aggregate pubkey and the script leaf hash, value is a map of participant pubkey to partial_sig
318
    std::map<std::pair<CPubKey, uint256>, std::map<CPubKey, uint256>> m_musig2_partial_sigs;
319
320
    std::map<std::vector<unsigned char>, std::vector<unsigned char>> unknown;
321
    std::set<PSBTProprietary> m_proprietary;
322
    std::optional<int> sighash_type;
323
324
    bool IsNull() const;
325
    void FillSignatureData(SignatureData& sigdata) const;
326
    void FromSignatureData(const SignatureData& sigdata);
327
    [[nodiscard]] bool Merge(const PSBTInput& input);
328
0
    uint32_t GetVersion() const { return m_psbt_version; }
329
    COutPoint GetOutPoint() const;
330
    /**
331
     * Retrieves the UTXO for this input
332
     *
333
     * @param[out] utxo The UTXO of this input
334
     * @return Whether the UTXO could be retrieved
335
     */
336
    bool GetUTXO(CTxOut& utxo) const;
337
    bool HasSignatures() const;
338
339
    explicit PSBTInput(uint32_t psbt_version, const Txid& prev_txid, uint32_t prev_out, std::optional<uint32_t> sequence = std::nullopt)
340
0
        : m_psbt_version(psbt_version),
341
0
        prev_txid(prev_txid),
342
0
        prev_out(prev_out),
343
0
        sequence(sequence)
344
0
    {
345
0
        assert(m_psbt_version == 0 || m_psbt_version == 2);
  Branch (345:9): [True: 0, False: 0]
  Branch (345:9): [True: 0, False: 0]
  Branch (345:9): [True: 0, False: 0]
346
0
    }
347
348
    // Construct a PSBTInput when the previous txid and output index are expected to be serialized
349
    template <typename Stream>
350
    explicit PSBTInput(deserialize_type, Stream& s, uint32_t psbt_version)
351
0
        : m_psbt_version(psbt_version)
352
0
    {
353
0
        assert(m_psbt_version == 2);
  Branch (353:9): [True: 0, False: 0]
354
0
        Unserialize(s);
355
0
    }
356
357
    bool operator==(const PSBTInput&) const = default;
358
359
    template <typename Stream>
360
0
    inline void Serialize(Stream& s) const {
361
        // Write the utxo
362
0
        if (non_witness_utxo) {
  Branch (362:13): [True: 0, False: 0]
363
0
            SerializeToVector(s, CompactSizeWriter(PSBT_IN_NON_WITNESS_UTXO));
364
0
            SerializeToVector(s, TX_NO_WITNESS(non_witness_utxo));
365
0
        }
366
0
        if (!witness_utxo.IsNull()) {
  Branch (366:13): [True: 0, False: 0]
367
0
            SerializeToVector(s, CompactSizeWriter(PSBT_IN_WITNESS_UTXO));
368
0
            SerializeToVector(s, witness_utxo);
369
0
        }
370
371
0
        if (final_script_sig.empty() && final_script_witness.IsNull()) {
  Branch (371:13): [True: 0, False: 0]
  Branch (371:41): [True: 0, False: 0]
372
            // Write any partial signatures
373
0
            for (const auto& sig_pair : partial_sigs) {
  Branch (373:39): [True: 0, False: 0]
374
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_PARTIAL_SIG), std::span{sig_pair.second.first});
375
0
                s << sig_pair.second.second;
376
0
            }
377
378
            // Write the sighash type
379
0
            if (sighash_type != std::nullopt) {
  Branch (379:17): [True: 0, False: 0]
380
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_SIGHASH));
381
0
                SerializeToVector(s, *sighash_type);
382
0
            }
383
384
            // Write the redeem script
385
0
            if (!redeem_script.empty()) {
  Branch (385:17): [True: 0, False: 0]
386
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_REDEEMSCRIPT));
387
0
                s << redeem_script;
388
0
            }
389
390
            // Write the witness script
391
0
            if (!witness_script.empty()) {
  Branch (391:17): [True: 0, False: 0]
392
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_WITNESSSCRIPT));
393
0
                s << witness_script;
394
0
            }
395
396
            // Write any hd keypaths
397
0
            SerializeHDKeypaths(s, hd_keypaths, CompactSizeWriter(PSBT_IN_BIP32_DERIVATION));
398
399
            // Write any ripemd160 preimage
400
0
            for (const auto& [hash, preimage] : ripemd160_preimages) {
  Branch (400:47): [True: 0, False: 0]
401
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_RIPEMD160), std::span{hash});
402
0
                s << preimage;
403
0
            }
404
405
            // Write any sha256 preimage
406
0
            for (const auto& [hash, preimage] : sha256_preimages) {
  Branch (406:47): [True: 0, False: 0]
407
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_SHA256), std::span{hash});
408
0
                s << preimage;
409
0
            }
410
411
            // Write any hash160 preimage
412
0
            for (const auto& [hash, preimage] : hash160_preimages) {
  Branch (412:47): [True: 0, False: 0]
413
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_HASH160), std::span{hash});
414
0
                s << preimage;
415
0
            }
416
417
            // Write any hash256 preimage
418
0
            for (const auto& [hash, preimage] : hash256_preimages) {
  Branch (418:47): [True: 0, False: 0]
419
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_HASH256), std::span{hash});
420
0
                s << preimage;
421
0
            }
422
423
            // Write taproot key sig
424
0
            if (!m_tap_key_sig.empty()) {
  Branch (424:17): [True: 0, False: 0]
425
0
                SerializeToVector(s, PSBT_IN_TAP_KEY_SIG);
426
0
                s << m_tap_key_sig;
427
0
            }
428
429
            // Write taproot script sigs
430
0
            for (const auto& [pubkey_leaf, sig] : m_tap_script_sigs) {
  Branch (430:49): [True: 0, False: 0]
431
0
                const auto& [xonly, leaf_hash] = pubkey_leaf;
432
0
                SerializeToVector(s, PSBT_IN_TAP_SCRIPT_SIG, xonly, leaf_hash);
433
0
                s << sig;
434
0
            }
435
436
            // Write taproot leaf scripts
437
0
            for (const auto& [leaf, control_blocks] : m_tap_scripts) {
  Branch (437:53): [True: 0, False: 0]
438
0
                const auto& [script, leaf_ver] = leaf;
439
0
                for (const auto& control_block : control_blocks) {
  Branch (439:48): [True: 0, False: 0]
440
0
                    SerializeToVector(s, PSBT_IN_TAP_LEAF_SCRIPT, std::span{control_block});
441
0
                    std::vector<unsigned char> value_v(script.begin(), script.end());
442
0
                    value_v.push_back((uint8_t)leaf_ver);
443
0
                    s << value_v;
444
0
                }
445
0
            }
446
447
            // Write taproot bip32 keypaths
448
0
            for (const auto& [xonly, leaf_origin] : m_tap_bip32_paths) {
  Branch (448:51): [True: 0, False: 0]
449
0
                const auto& [leaf_hashes, origin] = leaf_origin;
450
0
                SerializeToVector(s, PSBT_IN_TAP_BIP32_DERIVATION, xonly);
451
0
                std::vector<unsigned char> value;
452
0
                VectorWriter s_value{value, 0};
453
0
                s_value << leaf_hashes;
454
0
                SerializeKeyOrigin(s_value, origin);
455
0
                s << value;
456
0
            }
457
458
            // Write taproot internal key
459
0
            if (!m_tap_internal_key.IsNull()) {
  Branch (459:17): [True: 0, False: 0]
460
0
                SerializeToVector(s, PSBT_IN_TAP_INTERNAL_KEY);
461
0
                s << ToByteVector(m_tap_internal_key);
462
0
            }
463
464
            // Write taproot merkle root
465
0
            if (!m_tap_merkle_root.IsNull()) {
  Branch (465:17): [True: 0, False: 0]
466
0
                SerializeToVector(s, PSBT_IN_TAP_MERKLE_ROOT);
467
0
                SerializeToVector(s, m_tap_merkle_root);
468
0
            }
469
470
            // Write MuSig2 Participants
471
0
            for (const auto& [agg_pubkey, part_pubs] : m_musig2_participants) {
  Branch (471:54): [True: 0, False: 0]
472
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_MUSIG2_PARTICIPANT_PUBKEYS), std::span{agg_pubkey});
473
0
                std::vector<unsigned char> value;
474
0
                VectorWriter s_value{value, 0};
475
0
                for (auto& pk : part_pubs) {
  Branch (475:31): [True: 0, False: 0]
476
0
                    s_value << std::span{pk};
477
0
                }
478
0
                s << value;
479
0
            }
480
481
            // Write MuSig2 pubnonces
482
0
            for (const auto& [agg_pubkey_leaf_hash, pubnonces] : m_musig2_pubnonces) {
  Branch (482:64): [True: 0, False: 0]
483
0
                const auto& [agg_pubkey, leaf_hash] = agg_pubkey_leaf_hash;
484
0
                for (const auto& [part_pubkey, pubnonce] : pubnonces) {
  Branch (484:58): [True: 0, False: 0]
485
0
                    if (leaf_hash.IsNull()) {
  Branch (485:25): [True: 0, False: 0]
486
0
                        SerializeToVector(s, CompactSizeWriter(PSBT_IN_MUSIG2_PUB_NONCE), std::span{part_pubkey}, std::span{agg_pubkey});
487
0
                    } else {
488
0
                        SerializeToVector(s, CompactSizeWriter(PSBT_IN_MUSIG2_PUB_NONCE), std::span{part_pubkey}, std::span{agg_pubkey}, leaf_hash);
489
0
                    }
490
0
                    s << pubnonce;
491
0
                }
492
0
            }
493
494
            // Write MuSig2 partial signatures
495
0
            for (const auto& [agg_pubkey_leaf_hash, psigs] : m_musig2_partial_sigs) {
  Branch (495:60): [True: 0, False: 0]
496
0
                const auto& [agg_pubkey, leaf_hash] = agg_pubkey_leaf_hash;
497
0
                for (const auto& [pubkey, psig] : psigs) {
  Branch (497:49): [True: 0, False: 0]
498
0
                    if (leaf_hash.IsNull()) {
  Branch (498:25): [True: 0, False: 0]
499
0
                        SerializeToVector(s, CompactSizeWriter(PSBT_IN_MUSIG2_PARTIAL_SIG), std::span{pubkey}, std::span{agg_pubkey});
500
0
                    } else {
501
0
                        SerializeToVector(s, CompactSizeWriter(PSBT_IN_MUSIG2_PARTIAL_SIG), std::span{pubkey}, std::span{agg_pubkey}, leaf_hash);
502
0
                    }
503
0
                    SerializeToVector(s, psig);
504
0
                }
505
0
            }
506
0
        }
507
508
        // Write script sig
509
0
        if (!final_script_sig.empty()) {
  Branch (509:13): [True: 0, False: 0]
510
0
            SerializeToVector(s, CompactSizeWriter(PSBT_IN_SCRIPTSIG));
511
0
            s << final_script_sig;
512
0
        }
513
        // write script witness
514
0
        if (!final_script_witness.IsNull()) {
  Branch (514:13): [True: 0, False: 0]
515
0
            SerializeToVector(s, CompactSizeWriter(PSBT_IN_SCRIPTWITNESS));
516
0
            SerializeToVector(s, final_script_witness.stack);
517
0
        }
518
519
        // Write PSBTv2 fields
520
0
        if (m_psbt_version >= 2) {
  Branch (520:13): [True: 0, False: 0]
521
            // Write prev txid, vout, sequence, and lock times
522
0
            SerializeToVector(s, CompactSizeWriter(PSBT_IN_PREVIOUS_TXID));
523
0
            SerializeToVector(s, prev_txid);
524
525
0
            SerializeToVector(s, CompactSizeWriter(PSBT_IN_OUTPUT_INDEX));
526
0
            SerializeToVector(s, prev_out);
527
528
0
            if (sequence != std::nullopt) {
  Branch (528:17): [True: 0, False: 0]
529
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_SEQUENCE));
530
0
                SerializeToVector(s, *sequence);
531
0
            }
532
0
            if (time_locktime != std::nullopt) {
  Branch (532:17): [True: 0, False: 0]
533
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_REQUIRED_TIME_LOCKTIME));
534
0
                SerializeToVector(s, *time_locktime);
535
0
            }
536
0
            if (height_locktime != std::nullopt) {
  Branch (536:17): [True: 0, False: 0]
537
0
                SerializeToVector(s, CompactSizeWriter(PSBT_IN_REQUIRED_HEIGHT_LOCKTIME));
538
0
                SerializeToVector(s, *height_locktime);
539
0
            }
540
0
        }
541
542
        // Write proprietary things
543
0
        for (const auto& entry : m_proprietary) {
  Branch (543:32): [True: 0, False: 0]
544
0
            s << entry.key;
545
0
            s << entry.value;
546
0
        }
547
548
        // Write unknown things
549
0
        for (auto& entry : unknown) {
  Branch (549:26): [True: 0, False: 0]
550
0
            s << entry.first;
551
0
            s << entry.second;
552
0
        }
553
554
0
        s << PSBT_SEPARATOR;
555
0
    }
556
557
558
    template <typename Stream>
559
0
    inline void Unserialize(Stream& s) {
560
        // Used for duplicate key detection
561
0
        std::set<std::vector<unsigned char>> key_lookup;
562
        // Cache whether PSBTv2 required fields were seen
563
0
        bool found_prev_txid = false;
564
0
        bool found_prev_out = false;
565
566
        // Read loop
567
0
        bool found_sep = false;
568
0
        while(!s.empty()) {
  Branch (568:15): [True: 0, False: 0]
569
            // Read the key of format "<keylen><keytype><keydata>" after which
570
            // "key" will contain "<keytype><keydata>"
571
0
            std::vector<unsigned char> key;
572
0
            s >> key;
573
574
            // the key is empty if that was actually a separator byte
575
            // This is a special case for key lengths 0 as those are not allowed (except for separator)
576
0
            if (key.empty()) {
  Branch (576:17): [True: 0, False: 0]
577
0
                found_sep = true;
578
0
                break;
579
0
            }
580
581
            // Duplicate keys are not permitted
582
0
            if (!key_lookup.emplace(key).second) {
  Branch (582:17): [True: 0, False: 0]
583
0
                throw std::ios_base::failure(tfm::format("Duplicate Key, input key \"%s\" already provided", HexStr(key)));
584
0
            }
585
586
            // "skey" is used so that "key" is unchanged after reading keytype below
587
0
            SpanReader skey{key};
588
            // keytype is of the format compact size uint at the beginning of "key"
589
0
            uint64_t type = ReadCompactSize(skey);
590
591
            // Do stuff based on keytype "type", i.e., key checks, reading values of the
592
            // format "<valuelen><valuedata>" from the stream "s", and value checks
593
0
            switch(type) {
594
0
                case PSBT_IN_NON_WITNESS_UTXO:
  Branch (594:17): [True: 0, False: 0]
595
0
                {
596
0
                    ExpectedKeySize("Input Non-witness UTXO", key, 1);
597
                    // Set the stream to unserialize with witness since this is always a valid network transaction
598
0
                    UnserializeFromVector(s, TX_WITH_WITNESS(non_witness_utxo));
599
0
                    break;
600
0
                }
601
0
                case PSBT_IN_WITNESS_UTXO:
  Branch (601:17): [True: 0, False: 0]
602
0
                    ExpectedKeySize("Input Witness UTXO", key, 1);
603
0
                    UnserializeFromVector(s, witness_utxo);
604
0
                    break;
605
0
                case PSBT_IN_PARTIAL_SIG:
  Branch (605:17): [True: 0, False: 0]
606
0
                {
607
                    // Make sure that the key is the size of pubkey + 1
608
0
                    if (key.size() != CPubKey::SIZE + 1 && key.size() != CPubKey::COMPRESSED_SIZE + 1) {
  Branch (608:25): [True: 0, False: 0]
  Branch (608:60): [True: 0, False: 0]
609
0
                        throw std::ios_base::failure("Size of key was not the expected size for the type partial signature pubkey");
610
0
                    }
611
                    // Read in the pubkey from key
612
0
                    CPubKey pubkey(key.begin() + 1, key.end());
613
0
                    if (!pubkey.IsFullyValid()) {
  Branch (613:25): [True: 0, False: 0]
614
0
                       throw std::ios_base::failure("Invalid pubkey");
615
0
                    }
616
617
                    // Read in the signature from value
618
0
                    std::vector<unsigned char> sig;
619
0
                    s >> sig;
620
621
                    // Check that the signature is validly encoded
622
0
                    if (sig.empty() || !CheckSignatureEncoding(sig, SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_STRICTENC, nullptr)) {
  Branch (622:25): [True: 0, False: 0]
  Branch (622:40): [True: 0, False: 0]
623
0
                        throw std::ios_base::failure("Signature is not a valid encoding");
624
0
                    }
625
626
                    // Add to list
627
0
                    partial_sigs.emplace(pubkey.GetID(), SigPair(pubkey, std::move(sig)));
628
0
                    break;
629
0
                }
630
0
                case PSBT_IN_SIGHASH:
  Branch (630:17): [True: 0, False: 0]
631
0
                    ExpectedKeySize("Input Sighash Type", key, 1);
632
0
                    int sighash;
633
0
                    UnserializeFromVector(s, sighash);
634
0
                    sighash_type = sighash;
635
0
                    break;
636
0
                case PSBT_IN_REDEEMSCRIPT:
  Branch (636:17): [True: 0, False: 0]
637
0
                {
638
0
                    ExpectedKeySize("Input redeemScript", key, 1);
639
0
                    s >> redeem_script;
640
0
                    break;
641
0
                }
642
0
                case PSBT_IN_WITNESSSCRIPT:
  Branch (642:17): [True: 0, False: 0]
643
0
                {
644
0
                    ExpectedKeySize("Input witnessScript", key, 1);
645
0
                    s >> witness_script;
646
0
                    break;
647
0
                }
648
0
                case PSBT_IN_BIP32_DERIVATION:
  Branch (648:17): [True: 0, False: 0]
649
0
                {
650
0
                    DeserializeHDKeypaths(s, key, hd_keypaths);
651
0
                    break;
652
0
                }
653
0
                case PSBT_IN_SCRIPTSIG:
  Branch (653:17): [True: 0, False: 0]
654
0
                {
655
0
                    ExpectedKeySize("Input Final scriptSig", key, 1);
656
0
                    s >> final_script_sig;
657
0
                    break;
658
0
                }
659
0
                case PSBT_IN_SCRIPTWITNESS:
  Branch (659:17): [True: 0, False: 0]
660
0
                {
661
0
                    ExpectedKeySize("Input Final scriptWitness", key, 1);
662
0
                    UnserializeFromVector(s, final_script_witness.stack);
663
0
                    break;
664
0
                }
665
0
                case PSBT_IN_RIPEMD160:
  Branch (665:17): [True: 0, False: 0]
666
0
                {
667
0
                    ExpectedKeySize("Input RIPEMD160 Preimage", key, CRIPEMD160::OUTPUT_SIZE + 1);
668
                    // Read in the hash from key
669
0
                    std::vector<unsigned char> hash_vec(key.begin() + 1, key.end());
670
0
                    uint160 hash(hash_vec);
671
672
                    // Read in the preimage from value
673
0
                    std::vector<unsigned char> preimage;
674
0
                    s >> preimage;
675
676
                    // Add to preimages list
677
0
                    ripemd160_preimages.emplace(hash, std::move(preimage));
678
0
                    break;
679
0
                }
680
0
                case PSBT_IN_SHA256:
  Branch (680:17): [True: 0, False: 0]
681
0
                {
682
0
                    ExpectedKeySize("Input SHA256 Preimage", key, CSHA256::OUTPUT_SIZE + 1);
683
                    // Read in the hash from key
684
0
                    std::vector<unsigned char> hash_vec(key.begin() + 1, key.end());
685
0
                    uint256 hash(hash_vec);
686
687
                    // Read in the preimage from value
688
0
                    std::vector<unsigned char> preimage;
689
0
                    s >> preimage;
690
691
                    // Add to preimages list
692
0
                    sha256_preimages.emplace(hash, std::move(preimage));
693
0
                    break;
694
0
                }
695
0
                case PSBT_IN_HASH160:
  Branch (695:17): [True: 0, False: 0]
696
0
                {
697
0
                    ExpectedKeySize("Input Hash160 Preimage", key, CHash160::OUTPUT_SIZE + 1);
698
                    // Read in the hash from key
699
0
                    std::vector<unsigned char> hash_vec(key.begin() + 1, key.end());
700
0
                    uint160 hash(hash_vec);
701
702
                    // Read in the preimage from value
703
0
                    std::vector<unsigned char> preimage;
704
0
                    s >> preimage;
705
706
                    // Add to preimages list
707
0
                    hash160_preimages.emplace(hash, std::move(preimage));
708
0
                    break;
709
0
                }
710
0
                case PSBT_IN_HASH256:
  Branch (710:17): [True: 0, False: 0]
711
0
                {
712
0
                    ExpectedKeySize("Input Hash256 Preimage", key, CHash256::OUTPUT_SIZE + 1);
713
                    // Read in the hash from key
714
0
                    std::vector<unsigned char> hash_vec(key.begin() + 1, key.end());
715
0
                    uint256 hash(hash_vec);
716
717
                    // Read in the preimage from value
718
0
                    std::vector<unsigned char> preimage;
719
0
                    s >> preimage;
720
721
                    // Add to preimages list
722
0
                    hash256_preimages.emplace(hash, std::move(preimage));
723
0
                    break;
724
0
                }
725
0
                case PSBT_IN_PREVIOUS_TXID:
  Branch (725:17): [True: 0, False: 0]
726
0
                {
727
0
                    ExpectedKeySize("Input Previous TXID", key, 1);
728
0
                    if (m_psbt_version < 2) {
  Branch (728:25): [True: 0, False: 0]
729
0
                        throw std::ios_base::failure("Previous txid is not allowed in PSBTv0");
730
0
                    }
731
0
                    UnserializeFromVector(s, prev_txid);
732
0
                    found_prev_txid = true;
733
0
                    break;
734
0
                }
735
0
                case PSBT_IN_OUTPUT_INDEX:
  Branch (735:17): [True: 0, False: 0]
736
0
                {
737
0
                    ExpectedKeySize("Input Previous Output's Index", key, 1);
738
0
                    if (m_psbt_version < 2) {
  Branch (738:25): [True: 0, False: 0]
739
0
                        throw std::ios_base::failure("Previous output's index is not allowed in PSBTv0");
740
0
                    }
741
0
                    UnserializeFromVector(s, prev_out);
742
0
                    found_prev_out = true;
743
0
                    break;
744
0
                }
745
0
                case PSBT_IN_SEQUENCE:
  Branch (745:17): [True: 0, False: 0]
746
0
                {
747
0
                    ExpectedKeySize("Input Sequence", key, 1);
748
0
                    if (m_psbt_version < 2) {
  Branch (748:25): [True: 0, False: 0]
749
0
                        throw std::ios_base::failure("Sequence is not allowed in PSBTv0");
750
0
                    }
751
0
                    sequence.emplace();
752
0
                    UnserializeFromVector(s, *sequence);
753
0
                    break;
754
0
                }
755
0
                case PSBT_IN_REQUIRED_TIME_LOCKTIME:
  Branch (755:17): [True: 0, False: 0]
756
0
                {
757
0
                    ExpectedKeySize("Input Required Time Based Locktime", key, 1);
758
0
                    if (m_psbt_version < 2) {
  Branch (758:25): [True: 0, False: 0]
759
0
                        throw std::ios_base::failure("Required time based locktime is not allowed in PSBTv0");
760
0
                    }
761
0
                    time_locktime.emplace();
762
0
                    UnserializeFromVector(s, *time_locktime);
763
0
                    if (*time_locktime < LOCKTIME_THRESHOLD) {
  Branch (763:25): [True: 0, False: 0]
764
0
                        throw std::ios_base::failure("Required time based locktime is invalid (less than 500000000)");
765
0
                    }
766
0
                    break;
767
0
                }
768
0
                case PSBT_IN_REQUIRED_HEIGHT_LOCKTIME:
  Branch (768:17): [True: 0, False: 0]
769
0
                {
770
0
                    ExpectedKeySize("Input Required Height Based Locktime", key, 1);
771
0
                    if (m_psbt_version < 2) {
  Branch (771:25): [True: 0, False: 0]
772
0
                        throw std::ios_base::failure("Required height based locktime is not allowed in PSBTv0");
773
0
                    }
774
0
                    height_locktime.emplace();
775
0
                    UnserializeFromVector(s, *height_locktime);
776
0
                    if (*height_locktime >= LOCKTIME_THRESHOLD) {
  Branch (776:25): [True: 0, False: 0]
777
0
                        throw std::ios_base::failure("Required height based locktime is invalid (greater than or equal to 500000000)");
778
0
                    } else if (*height_locktime == 0) {
  Branch (778:32): [True: 0, False: 0]
779
0
                        throw std::ios_base::failure("Required height based locktime is invalid (0)");
780
0
                    }
781
0
                    break;
782
0
                }
783
0
                case PSBT_IN_TAP_KEY_SIG:
  Branch (783:17): [True: 0, False: 0]
784
0
                {
785
0
                    ExpectedKeySize("Input Taproot Key Path Signature", key, 1);
786
0
                    s >> m_tap_key_sig;
787
0
                    if (m_tap_key_sig.size() < 64) {
  Branch (787:25): [True: 0, False: 0]
788
0
                        throw std::ios_base::failure("Input Taproot key path signature is shorter than 64 bytes");
789
0
                    } else if (m_tap_key_sig.size() > 65) {
  Branch (789:32): [True: 0, False: 0]
790
0
                        throw std::ios_base::failure("Input Taproot key path signature is longer than 65 bytes");
791
0
                    }
792
0
                    break;
793
0
                }
794
0
                case PSBT_IN_TAP_SCRIPT_SIG:
  Branch (794:17): [True: 0, False: 0]
795
0
                {
796
0
                    ExpectedKeySize("Input Taproot Script Path Signature", key, 65);
797
0
                    SpanReader s_key{std::span{key}.subspan(1)};
798
0
                    XOnlyPubKey xonly;
799
0
                    uint256 hash;
800
0
                    s_key >> xonly;
801
0
                    s_key >> hash;
802
0
                    std::vector<unsigned char> sig;
803
0
                    s >> sig;
804
0
                    if (sig.size() < 64) {
  Branch (804:25): [True: 0, False: 0]
805
0
                        throw std::ios_base::failure("Input Taproot script path signature is shorter than 64 bytes");
806
0
                    } else if (sig.size() > 65) {
  Branch (806:32): [True: 0, False: 0]
807
0
                        throw std::ios_base::failure("Input Taproot script path signature is longer than 65 bytes");
808
0
                    }
809
0
                    m_tap_script_sigs.emplace(std::make_pair(xonly, hash), sig);
810
0
                    break;
811
0
                }
812
0
                case PSBT_IN_TAP_LEAF_SCRIPT:
  Branch (812:17): [True: 0, False: 0]
813
0
                {
814
0
                    if (key.size() < 34) {
  Branch (814:25): [True: 0, False: 0]
815
0
                        throw std::ios_base::failure("Input Taproot leaf script key is not at least 34 bytes");
816
0
                    } else if ((key.size() - 2) % 32 != 0) {
  Branch (816:32): [True: 0, False: 0]
817
0
                        throw std::ios_base::failure("Input Taproot leaf script key's control block size is not valid");
818
0
                    }
819
0
                    std::vector<unsigned char> script_v;
820
0
                    s >> script_v;
821
0
                    if (script_v.empty()) {
  Branch (821:25): [True: 0, False: 0]
822
0
                        throw std::ios_base::failure("Input Taproot leaf script must be at least 1 byte");
823
0
                    }
824
0
                    uint8_t leaf_ver = script_v.back();
825
0
                    script_v.pop_back();
826
0
                    const auto leaf_script = std::make_pair(script_v, (int)leaf_ver);
827
0
                    m_tap_scripts[leaf_script].insert(std::vector<unsigned char>(key.begin() + 1, key.end()));
828
0
                    break;
829
0
                }
830
0
                case PSBT_IN_TAP_BIP32_DERIVATION:
  Branch (830:17): [True: 0, False: 0]
831
0
                {
832
0
                    ExpectedKeySize("Input Taproot BIP32 Keypath", key, 33);
833
0
                    SpanReader s_key{std::span{key}.subspan(1)};
834
0
                    XOnlyPubKey xonly;
835
0
                    s_key >> xonly;
836
0
                    std::set<uint256> leaf_hashes;
837
0
                    uint64_t value_len = ReadCompactSize(s);
838
0
                    size_t before_hashes = s.size();
839
0
                    s >> leaf_hashes;
840
0
                    size_t after_hashes = s.size();
841
0
                    size_t hashes_len = before_hashes - after_hashes;
842
0
                    if (hashes_len > value_len) {
  Branch (842:25): [True: 0, False: 0]
843
0
                        throw std::ios_base::failure("Input Taproot BIP32 keypath has an invalid length");
844
0
                    }
845
0
                    size_t origin_len = value_len - hashes_len;
846
0
                    m_tap_bip32_paths.emplace(xonly, std::make_pair(leaf_hashes, DeserializeKeyOrigin(s, origin_len)));
847
0
                    break;
848
0
                }
849
0
                case PSBT_IN_TAP_INTERNAL_KEY:
  Branch (849:17): [True: 0, False: 0]
850
0
                {
851
0
                    ExpectedKeySize("Input Taproot Internal Key", key, 1);
852
0
                    UnserializeFromVector(s, m_tap_internal_key);
853
0
                    break;
854
0
                }
855
0
                case PSBT_IN_TAP_MERKLE_ROOT:
  Branch (855:17): [True: 0, False: 0]
856
0
                {
857
0
                    ExpectedKeySize("Input Taproot Merkle Root", key, 1);
858
0
                    UnserializeFromVector(s, m_tap_merkle_root);
859
0
                    break;
860
0
                }
861
0
                case PSBT_IN_MUSIG2_PARTICIPANT_PUBKEYS:
  Branch (861:17): [True: 0, False: 0]
862
0
                {
863
0
                    ExpectedKeySize("Input MuSig2 Participants Pubkeys", key, CPubKey::COMPRESSED_SIZE + 1);
864
0
                    DeserializeMuSig2ParticipantPubkeys(s, skey, m_musig2_participants, std::string{"Input"});
865
0
                    break;
866
0
                }
867
0
                case PSBT_IN_MUSIG2_PUB_NONCE:
  Branch (867:17): [True: 0, False: 0]
868
0
                {
869
0
                    if (key.size() != 2 * CPubKey::COMPRESSED_SIZE + 1 && key.size() != 2 * CPubKey::COMPRESSED_SIZE + CSHA256::OUTPUT_SIZE + 1) {
  Branch (869:25): [True: 0, False: 0]
  Branch (869:75): [True: 0, False: 0]
870
0
                        throw std::ios_base::failure("Input musig2 pubnonce key is not expected size of 67 or 99 bytes");
871
0
                    }
872
0
                    CPubKey agg_pub, part_pub;
873
0
                    uint256 leaf_hash;
874
0
                    DeserializeMuSig2ParticipantDataIdentifier(skey, agg_pub, part_pub, leaf_hash);
875
876
0
                    std::vector<uint8_t> pubnonce;
877
0
                    s >> pubnonce;
878
0
                    if (pubnonce.size() != MUSIG2_PUBNONCE_SIZE) {
  Branch (878:25): [True: 0, False: 0]
879
0
                        throw std::ios_base::failure("Input musig2 pubnonce value is not 66 bytes");
880
0
                    }
881
882
0
                    m_musig2_pubnonces[std::make_pair(agg_pub, leaf_hash)].emplace(part_pub, pubnonce);
883
0
                    break;
884
0
                }
885
0
                case PSBT_IN_MUSIG2_PARTIAL_SIG:
  Branch (885:17): [True: 0, False: 0]
886
0
                {
887
0
                    if (key.size() != 2 * CPubKey::COMPRESSED_SIZE + 1 && key.size() != 2 * CPubKey::COMPRESSED_SIZE + CSHA256::OUTPUT_SIZE + 1) {
  Branch (887:25): [True: 0, False: 0]
  Branch (887:75): [True: 0, False: 0]
888
0
                        throw std::ios_base::failure("Input musig2 partial sig key is not expected size of 67 or 99 bytes");
889
0
                    }
890
0
                    CPubKey agg_pub, part_pub;
891
0
                    uint256 leaf_hash;
892
0
                    DeserializeMuSig2ParticipantDataIdentifier(skey, agg_pub, part_pub, leaf_hash);
893
894
0
                    uint256 partial_sig;
895
0
                    UnserializeFromVector(s, partial_sig);
896
897
0
                    m_musig2_partial_sigs[std::make_pair(agg_pub, leaf_hash)].emplace(part_pub, partial_sig);
898
0
                    break;
899
0
                }
900
0
                case PSBT_IN_PROPRIETARY:
  Branch (900:17): [True: 0, False: 0]
901
0
                {
902
0
                    PSBTProprietary this_prop;
903
0
                    skey >> this_prop.identifier;
904
0
                    this_prop.subtype = ReadCompactSize(skey);
905
0
                    this_prop.key = key;
906
907
0
                    s >> this_prop.value;
908
0
                    m_proprietary.insert(this_prop);
909
0
                    break;
910
0
                }
911
                // Unknown stuff
912
0
                default:
  Branch (912:17): [True: 0, False: 0]
913
                    // Read in the value
914
0
                    std::vector<unsigned char> val_bytes;
915
0
                    s >> val_bytes;
916
0
                    unknown.emplace(std::move(key), std::move(val_bytes));
917
0
                    break;
918
0
            }
919
0
        }
920
921
0
        if (!found_sep) {
  Branch (921:13): [True: 0, False: 0]
922
0
            throw std::ios_base::failure("Separator is missing at the end of an input map");
923
0
        }
924
925
        // Make sure required PSBTv2 fields are present
926
0
        if (m_psbt_version >= 2) {
  Branch (926:13): [True: 0, False: 0]
927
0
            if (!found_prev_txid) {
  Branch (927:17): [True: 0, False: 0]
928
0
                throw std::ios_base::failure("Previous TXID is required in PSBTv2");
929
0
            }
930
0
            if (!found_prev_out) {
  Branch (930:17): [True: 0, False: 0]
931
0
                throw std::ios_base::failure("Previous output's index is required in PSBTv2");
932
0
            }
933
0
        }
934
0
    }
935
};
936
937
/** A structure for PSBTs which contains per output information */
938
class PSBTOutput
939
{
940
private:
941
    uint32_t m_psbt_version;
942
943
public:
944
    CScript redeem_script;
945
    CScript witness_script;
946
    std::map<CPubKey, KeyOriginInfo> hd_keypaths;
947
948
    XOnlyPubKey m_tap_internal_key;
949
    std::vector<std::tuple<uint8_t, uint8_t, std::vector<unsigned char>>> m_tap_tree;
950
    std::map<XOnlyPubKey, std::pair<std::set<uint256>, KeyOriginInfo>> m_tap_bip32_paths;
951
    std::map<CPubKey, std::vector<CPubKey>> m_musig2_participants;
952
953
    std::map<std::vector<unsigned char>, std::vector<unsigned char>> unknown;
954
    std::set<PSBTProprietary> m_proprietary;
955
956
    CAmount amount;
957
    CScript script;
958
959
    bool IsNull() const;
960
    void FillSignatureData(SignatureData& sigdata) const;
961
    void FromSignatureData(const SignatureData& sigdata);
962
    [[nodiscard]] bool Merge(const PSBTOutput& output);
963
0
    uint32_t GetVersion() const { return m_psbt_version; }
964
965
    explicit PSBTOutput(uint32_t psbt_version, CAmount amount, const CScript& script)
966
0
        : m_psbt_version(psbt_version),
967
0
        amount(amount),
968
0
        script(script)
969
0
    {
970
0
        assert(m_psbt_version == 0 || m_psbt_version == 2);
  Branch (970:9): [True: 0, False: 0]
  Branch (970:9): [True: 0, False: 0]
  Branch (970:9): [True: 0, False: 0]
971
0
    }
972
973
    // Construct a PSBTOutput when the amount and script are expected to be serialized
974
    template <typename Stream>
975
    explicit PSBTOutput(deserialize_type, Stream& s, uint32_t psbt_version)
976
0
        : m_psbt_version(psbt_version)
977
0
    {
978
0
        assert(m_psbt_version == 2);
  Branch (978:9): [True: 0, False: 0]
979
0
        Unserialize(s);
980
0
    }
981
982
    bool operator==(const PSBTOutput&) const = default;
983
984
    template <typename Stream>
985
0
    inline void Serialize(Stream& s) const {
986
        // Write the redeem script
987
0
        if (!redeem_script.empty()) {
  Branch (987:13): [True: 0, False: 0]
988
0
            SerializeToVector(s, CompactSizeWriter(PSBT_OUT_REDEEMSCRIPT));
989
0
            s << redeem_script;
990
0
        }
991
992
        // Write the witness script
993
0
        if (!witness_script.empty()) {
  Branch (993:13): [True: 0, False: 0]
994
0
            SerializeToVector(s, CompactSizeWriter(PSBT_OUT_WITNESSSCRIPT));
995
0
            s << witness_script;
996
0
        }
997
998
        // Write any hd keypaths
999
0
        SerializeHDKeypaths(s, hd_keypaths, CompactSizeWriter(PSBT_OUT_BIP32_DERIVATION));
1000
1001
0
        if (m_psbt_version >= 2) {
  Branch (1001:13): [True: 0, False: 0]
1002
            // Write amount and spk
1003
0
            SerializeToVector(s, CompactSizeWriter(PSBT_OUT_AMOUNT));
1004
0
            SerializeToVector(s, amount);
1005
1006
0
            SerializeToVector(s, CompactSizeWriter(PSBT_OUT_SCRIPT));
1007
0
            s << script;
1008
0
        }
1009
1010
        // Write proprietary things
1011
0
        for (const auto& entry : m_proprietary) {
  Branch (1011:32): [True: 0, False: 0]
1012
0
            s << entry.key;
1013
0
            s << entry.value;
1014
0
        }
1015
1016
        // Write taproot internal key
1017
0
        if (!m_tap_internal_key.IsNull()) {
  Branch (1017:13): [True: 0, False: 0]
1018
0
            SerializeToVector(s, PSBT_OUT_TAP_INTERNAL_KEY);
1019
0
            s << ToByteVector(m_tap_internal_key);
1020
0
        }
1021
1022
        // Write taproot tree
1023
0
        if (!m_tap_tree.empty()) {
  Branch (1023:13): [True: 0, False: 0]
1024
0
            SerializeToVector(s, PSBT_OUT_TAP_TREE);
1025
0
            std::vector<unsigned char> value;
1026
0
            VectorWriter s_value{value, 0};
1027
0
            for (const auto& [depth, leaf_ver, script] : m_tap_tree) {
  Branch (1027:56): [True: 0, False: 0]
1028
0
                s_value << depth;
1029
0
                s_value << leaf_ver;
1030
0
                s_value << script;
1031
0
            }
1032
0
            s << value;
1033
0
        }
1034
1035
        // Write taproot bip32 keypaths
1036
0
        for (const auto& [xonly, leaf] : m_tap_bip32_paths) {
  Branch (1036:40): [True: 0, False: 0]
1037
0
            const auto& [leaf_hashes, origin] = leaf;
1038
0
            SerializeToVector(s, PSBT_OUT_TAP_BIP32_DERIVATION, xonly);
1039
0
            std::vector<unsigned char> value;
1040
0
            VectorWriter s_value{value, 0};
1041
0
            s_value << leaf_hashes;
1042
0
            SerializeKeyOrigin(s_value, origin);
1043
0
            s << value;
1044
0
        }
1045
1046
        // Write MuSig2 Participants
1047
0
        for (const auto& [agg_pubkey, part_pubs] : m_musig2_participants) {
  Branch (1047:50): [True: 0, False: 0]
1048
0
            SerializeToVector(s, CompactSizeWriter(PSBT_OUT_MUSIG2_PARTICIPANT_PUBKEYS), std::span{agg_pubkey});
1049
0
            std::vector<unsigned char> value;
1050
0
            VectorWriter s_value{value, 0};
1051
0
            for (auto& pk : part_pubs) {
  Branch (1051:27): [True: 0, False: 0]
1052
0
                s_value << std::span{pk};
1053
0
            }
1054
0
            s << value;
1055
0
        }
1056
1057
        // Write unknown things
1058
0
        for (auto& entry : unknown) {
  Branch (1058:26): [True: 0, False: 0]
1059
0
            s << entry.first;
1060
0
            s << entry.second;
1061
0
        }
1062
1063
0
        s << PSBT_SEPARATOR;
1064
0
    }
1065
1066
1067
    template <typename Stream>
1068
0
    inline void Unserialize(Stream& s) {
1069
        // Used for duplicate key detection
1070
0
        std::set<std::vector<unsigned char>> key_lookup;
1071
        // Cache whether PSBTv2 required fields are found
1072
0
        bool found_amount = false;
1073
0
        bool found_script = false;
1074
1075
        // Read loop
1076
0
        bool found_sep = false;
1077
0
        while(!s.empty()) {
  Branch (1077:15): [True: 0, False: 0]
1078
            // Read the key of format "<keylen><keytype><keydata>" after which
1079
            // "key" will contain "<keytype><keydata>"
1080
0
            std::vector<unsigned char> key;
1081
0
            s >> key;
1082
1083
            // the key is empty if that was actually a separator byte
1084
            // This is a special case for key lengths 0 as those are not allowed (except for separator)
1085
0
            if (key.empty()) {
  Branch (1085:17): [True: 0, False: 0]
1086
0
                found_sep = true;
1087
0
                break;
1088
0
            }
1089
1090
            // Duplicate keys are not permitted
1091
0
            if (!key_lookup.emplace(key).second) {
  Branch (1091:17): [True: 0, False: 0]
1092
0
                throw std::ios_base::failure(tfm::format("Duplicate Key, output key \"%s\" already provided", HexStr(key)));
1093
0
            }
1094
1095
            // "skey" is used so that "key" is unchanged after reading keytype below
1096
0
            SpanReader skey{key};
1097
            // keytype is of the format compact size uint at the beginning of "key"
1098
0
            uint64_t type = ReadCompactSize(skey);
1099
1100
            // Do stuff based on keytype "type", i.e., key checks, reading values of the
1101
            // format "<valuelen><valuedata>" from the stream "s", and value checks
1102
0
            switch(type) {
1103
0
                case PSBT_OUT_REDEEMSCRIPT:
  Branch (1103:17): [True: 0, False: 0]
1104
0
                {
1105
0
                    ExpectedKeySize("Output redeemScript", key, 1);
1106
0
                    s >> redeem_script;
1107
0
                    break;
1108
0
                }
1109
0
                case PSBT_OUT_WITNESSSCRIPT:
  Branch (1109:17): [True: 0, False: 0]
1110
0
                {
1111
0
                    ExpectedKeySize("Output witnessScript", key, 1);
1112
0
                    s >> witness_script;
1113
0
                    break;
1114
0
                }
1115
0
                case PSBT_OUT_BIP32_DERIVATION:
  Branch (1115:17): [True: 0, False: 0]
1116
0
                {
1117
0
                    DeserializeHDKeypaths(s, key, hd_keypaths);
1118
0
                    break;
1119
0
                }
1120
0
                case PSBT_OUT_AMOUNT:
  Branch (1120:17): [True: 0, False: 0]
1121
0
                {
1122
0
                    ExpectedKeySize("Output Amount", key, 1);
1123
0
                    if (m_psbt_version < 2) {
  Branch (1123:25): [True: 0, False: 0]
1124
0
                        throw std::ios_base::failure("Output amount is not allowed in PSBTv0");
1125
0
                    }
1126
0
                    UnserializeFromVector(s, amount);
1127
0
                    found_amount = true;
1128
0
                    break;
1129
0
                }
1130
0
                case PSBT_OUT_SCRIPT:
  Branch (1130:17): [True: 0, False: 0]
1131
0
                {
1132
0
                    ExpectedKeySize("Output Script", key, 1);
1133
0
                    if (m_psbt_version < 2) {
  Branch (1133:25): [True: 0, False: 0]
1134
0
                        throw std::ios_base::failure("Output script is not allowed in PSBTv0");
1135
0
                    }
1136
0
                    s >> script;
1137
0
                    found_script = true;
1138
0
                    break;
1139
0
                }
1140
0
                case PSBT_OUT_TAP_INTERNAL_KEY:
  Branch (1140:17): [True: 0, False: 0]
1141
0
                {
1142
0
                    ExpectedKeySize("Output Taproot Internal Key", key, 1);
1143
0
                    UnserializeFromVector(s, m_tap_internal_key);
1144
0
                    break;
1145
0
                }
1146
0
                case PSBT_OUT_TAP_TREE:
  Branch (1146:17): [True: 0, False: 0]
1147
0
                {
1148
0
                    ExpectedKeySize("Output Taproot Tree Key", key, 1);
1149
0
                    std::vector<unsigned char> tree_v;
1150
0
                    s >> tree_v;
1151
0
                    SpanReader s_tree{tree_v};
1152
0
                    if (s_tree.empty()) {
  Branch (1152:25): [True: 0, False: 0]
1153
0
                        throw std::ios_base::failure("Output Taproot tree must not be empty");
1154
0
                    }
1155
0
                    TaprootBuilder builder;
1156
0
                    while (!s_tree.empty()) {
  Branch (1156:28): [True: 0, False: 0]
1157
0
                        uint8_t depth;
1158
0
                        uint8_t leaf_ver;
1159
0
                        std::vector<unsigned char> script;
1160
0
                        s_tree >> depth;
1161
0
                        s_tree >> leaf_ver;
1162
0
                        s_tree >> script;
1163
0
                        if (depth > TAPROOT_CONTROL_MAX_NODE_COUNT) {
  Branch (1163:29): [True: 0, False: 0]
1164
0
                            throw std::ios_base::failure("Output Taproot tree has as leaf greater than Taproot maximum depth");
1165
0
                        }
1166
0
                        if ((leaf_ver & ~TAPROOT_LEAF_MASK) != 0) {
  Branch (1166:29): [True: 0, False: 0]
1167
0
                            throw std::ios_base::failure("Output Taproot tree has a leaf with an invalid leaf version");
1168
0
                        }
1169
0
                        m_tap_tree.emplace_back(depth, leaf_ver, script);
1170
0
                        builder.Add((int)depth, script, (int)leaf_ver, /*track=*/true);
1171
0
                    }
1172
0
                    if (!builder.IsComplete()) {
  Branch (1172:25): [True: 0, False: 0]
1173
0
                        throw std::ios_base::failure("Output Taproot tree is malformed");
1174
0
                    }
1175
0
                    break;
1176
0
                }
1177
0
                case PSBT_OUT_TAP_BIP32_DERIVATION:
  Branch (1177:17): [True: 0, False: 0]
1178
0
                {
1179
0
                    ExpectedKeySize("Output Taproot BIP32 Keypath", key, 33);
1180
0
                    XOnlyPubKey xonly(uint256(std::span<uint8_t>(key).last(32)));
1181
0
                    std::set<uint256> leaf_hashes;
1182
0
                    uint64_t value_len = ReadCompactSize(s);
1183
0
                    size_t before_hashes = s.size();
1184
0
                    s >> leaf_hashes;
1185
0
                    size_t after_hashes = s.size();
1186
0
                    size_t hashes_len = before_hashes - after_hashes;
1187
0
                    if (hashes_len > value_len) {
  Branch (1187:25): [True: 0, False: 0]
1188
0
                        throw std::ios_base::failure("Output Taproot BIP32 keypath has an invalid length");
1189
0
                    }
1190
0
                    size_t origin_len = value_len - hashes_len;
1191
0
                    m_tap_bip32_paths.emplace(xonly, std::make_pair(leaf_hashes, DeserializeKeyOrigin(s, origin_len)));
1192
0
                    break;
1193
0
                }
1194
0
                case PSBT_OUT_MUSIG2_PARTICIPANT_PUBKEYS:
  Branch (1194:17): [True: 0, False: 0]
1195
0
                {
1196
0
                    ExpectedKeySize("Output MuSig2 Participants Pubkeys", key, CPubKey::COMPRESSED_SIZE + 1);
1197
0
                    DeserializeMuSig2ParticipantPubkeys(s, skey, m_musig2_participants, std::string{"Output"});
1198
0
                    break;
1199
0
                }
1200
0
                case PSBT_OUT_PROPRIETARY:
  Branch (1200:17): [True: 0, False: 0]
1201
0
                {
1202
0
                    PSBTProprietary this_prop;
1203
0
                    skey >> this_prop.identifier;
1204
0
                    this_prop.subtype = ReadCompactSize(skey);
1205
0
                    this_prop.key = key;
1206
1207
0
                    s >> this_prop.value;
1208
0
                    m_proprietary.insert(this_prop);
1209
0
                    break;
1210
0
                }
1211
                // Unknown stuff
1212
0
                default: {
  Branch (1212:17): [True: 0, False: 0]
1213
                    // Read in the value
1214
0
                    std::vector<unsigned char> val_bytes;
1215
0
                    s >> val_bytes;
1216
0
                    unknown.emplace(std::move(key), std::move(val_bytes));
1217
0
                    break;
1218
0
                }
1219
0
            }
1220
0
        }
1221
1222
0
        if (!found_sep) {
  Branch (1222:13): [True: 0, False: 0]
1223
0
            throw std::ios_base::failure("Separator is missing at the end of an output map");
1224
0
        }
1225
1226
        // Make sure required PSBTv2 fields are present
1227
0
        if (m_psbt_version >= 2) {
  Branch (1227:13): [True: 0, False: 0]
1228
0
            if (!found_amount) {
  Branch (1228:17): [True: 0, False: 0]
1229
0
                throw std::ios_base::failure("Output amount is required in PSBTv2");
1230
0
            }
1231
0
            if (!found_script) {
  Branch (1231:17): [True: 0, False: 0]
1232
0
                throw std::ios_base::failure("Output script is required in PSBTv2");
1233
0
            }
1234
0
        }
1235
0
    }
1236
};
1237
1238
/** A version of CTransaction with the PSBT format*/
1239
class PartiallySignedTransaction
1240
{
1241
private:
1242
    std::optional<uint32_t> m_version;
1243
1244
public:
1245
    // We use a vector of CExtPubKey in the event that there happens to be the same KeyOriginInfos for different CExtPubKeys
1246
    // Note that this map swaps the key and values from the serialization
1247
    std::map<KeyOriginInfo, std::set<CExtPubKey>> m_xpubs;
1248
    std::optional<std::bitset<8>> m_tx_modifiable;
1249
    std::vector<PSBTInput> inputs;
1250
    std::vector<PSBTOutput> outputs;
1251
    std::map<std::vector<unsigned char>, std::vector<unsigned char>> unknown;
1252
    std::set<PSBTProprietary> m_proprietary;
1253
1254
    uint32_t tx_version;
1255
    std::optional<uint32_t> fallback_locktime;
1256
1257
    bool IsNull() const;
1258
    uint32_t GetVersion() const;
1259
1260
    /** Merge psbt into this. The two psbts must have the same underlying CTransaction (i.e. the
1261
      * same actual Bitcoin transaction.) Returns true if the merge succeeded, false otherwise. */
1262
    [[nodiscard]] bool Merge(const PartiallySignedTransaction& psbt);
1263
    bool AddInput(const PSBTInput& psbtin);
1264
    bool AddOutput(const PSBTOutput& psbtout);
1265
    std::optional<uint32_t> ComputeTimeLock() const;
1266
    std::optional<CMutableTransaction> GetUnsignedTx() const;
1267
    std::optional<Txid> GetUniqueID() const;
1268
    explicit PartiallySignedTransaction(const CMutableTransaction& tx, uint32_t version = 2);
1269
1270
    template <typename Stream>
1271
0
    inline void Serialize(Stream& s) const {
1272
1273
        // magic bytes
1274
0
        s << PSBT_MAGIC_BYTES;
1275
1276
0
        if (GetVersion() < 2) {
  Branch (1276:13): [True: 0, False: 0]
1277
            // unsigned tx flag
1278
0
            SerializeToVector(s, CompactSizeWriter(PSBT_GLOBAL_UNSIGNED_TX));
1279
1280
            // Write serialized tx to a stream
1281
0
            SerializeToVector(s, TX_NO_WITNESS(*GetUnsignedTx()));
1282
0
        }
1283
1284
        // Write xpubs
1285
0
        for (const auto& xpub_pair : m_xpubs) {
  Branch (1285:36): [True: 0, False: 0]
1286
0
            for (const auto& xpub : xpub_pair.second) {
  Branch (1286:35): [True: 0, False: 0]
1287
0
                unsigned char ser_xpub[BIP32_EXTKEY_WITH_VERSION_SIZE];
1288
0
                xpub.EncodeWithVersion(ser_xpub);
1289
                // Note that the serialization swaps the key and value
1290
                // The xpub is the key (for uniqueness) while the path is the value
1291
0
                SerializeToVector(s, PSBT_GLOBAL_XPUB, ser_xpub);
1292
0
                SerializeHDKeypath(s, xpub_pair.first);
1293
0
            }
1294
0
        }
1295
1296
0
        if (GetVersion() >= 2) {
  Branch (1296:13): [True: 0, False: 0]
1297
            // Write PSBTv2 tx version, locktime, counts, etc.
1298
0
            SerializeToVector(s, CompactSizeWriter(PSBT_GLOBAL_TX_VERSION));
1299
0
            SerializeToVector(s, tx_version);
1300
0
            if (fallback_locktime != std::nullopt) {
  Branch (1300:17): [True: 0, False: 0]
1301
0
                SerializeToVector(s, CompactSizeWriter(PSBT_GLOBAL_FALLBACK_LOCKTIME));
1302
0
                SerializeToVector(s, *fallback_locktime);
1303
0
            }
1304
1305
0
            SerializeToVector(s, CompactSizeWriter(PSBT_GLOBAL_INPUT_COUNT));
1306
0
            SerializeToVector(s, CompactSizeWriter(inputs.size()));
1307
0
            SerializeToVector(s, CompactSizeWriter(PSBT_GLOBAL_OUTPUT_COUNT));
1308
0
            SerializeToVector(s, CompactSizeWriter(outputs.size()));
1309
1310
0
            if (m_tx_modifiable != std::nullopt) {
  Branch (1310:17): [True: 0, False: 0]
1311
0
                SerializeToVector(s, CompactSizeWriter(PSBT_GLOBAL_TX_MODIFIABLE));
1312
0
                SerializeToVector(s, static_cast<uint8_t>(m_tx_modifiable->to_ulong()));
1313
0
            }
1314
0
        }
1315
1316
        // PSBT version
1317
0
        if (GetVersion() > 0) {
  Branch (1317:13): [True: 0, False: 0]
1318
0
            SerializeToVector(s, CompactSizeWriter(PSBT_GLOBAL_VERSION));
1319
0
            SerializeToVector(s, *m_version);
1320
0
        }
1321
1322
        // Write proprietary things
1323
0
        for (const auto& entry : m_proprietary) {
  Branch (1323:32): [True: 0, False: 0]
1324
0
            s << entry.key;
1325
0
            s << entry.value;
1326
0
        }
1327
1328
        // Write the unknown things
1329
0
        for (auto& entry : unknown) {
  Branch (1329:26): [True: 0, False: 0]
1330
0
            s << entry.first;
1331
0
            s << entry.second;
1332
0
        }
1333
1334
        // Separator
1335
0
        s << PSBT_SEPARATOR;
1336
1337
        // Write inputs
1338
0
        for (const PSBTInput& input : inputs) {
  Branch (1338:37): [True: 0, False: 0]
1339
0
            s << input;
1340
0
        }
1341
        // Write outputs
1342
0
        for (const PSBTOutput& output : outputs) {
  Branch (1342:39): [True: 0, False: 0]
1343
0
            s << output;
1344
0
        }
1345
0
    }
1346
1347
1348
    template <typename Stream>
1349
0
    inline void Unserialize(Stream& s) {
1350
        // Read the magic bytes
1351
0
        uint8_t magic[5];
1352
0
        s >> magic;
1353
0
        if (!std::equal(magic, magic + 5, PSBT_MAGIC_BYTES)) {
  Branch (1353:13): [True: 0, False: 0]
1354
0
            throw std::ios_base::failure("Invalid PSBT magic bytes");
1355
0
        }
1356
1357
        // Used for duplicate key detection
1358
0
        std::set<std::vector<unsigned char>> key_lookup;
1359
1360
        // Track the global xpubs we have already seen. Just for sanity checking
1361
0
        std::set<CExtPubKey> global_xpubs;
1362
1363
        // Read global data
1364
0
        bool found_sep = false;
1365
0
        std::optional<CMutableTransaction> tx;
1366
0
        uint64_t input_count = 0;
1367
0
        uint64_t output_count = 0;
1368
0
        bool found_input_count = false;
1369
0
        bool found_output_count = false;
1370
0
        bool found_tx_version = false;
1371
0
        bool found_fallback_locktime = false;
1372
0
        while(!s.empty()) {
  Branch (1372:15): [True: 0, False: 0]
1373
            // Read the key of format "<keylen><keytype><keydata>" after which
1374
            // "key" will contain "<keytype><keydata>"
1375
0
            std::vector<unsigned char> key;
1376
0
            s >> key;
1377
1378
            // the key is empty if that was actually a separator byte
1379
            // This is a special case for key lengths 0 as those are not allowed (except for separator)
1380
0
            if (key.empty()) {
  Branch (1380:17): [True: 0, False: 0]
1381
0
                found_sep = true;
1382
0
                break;
1383
0
            }
1384
1385
            // Duplicate keys are not permitted
1386
0
            if (!key_lookup.emplace(key).second) {
  Branch (1386:17): [True: 0, False: 0]
1387
0
                throw std::ios_base::failure(tfm::format("Duplicate Key, global key \"%s\" already provided", HexStr(key)));
1388
0
            }
1389
1390
            // "skey" is used so that "key" is unchanged after reading keytype below
1391
0
            SpanReader skey{key};
1392
            // keytype is of the format compact size uint at the beginning of "key"
1393
0
            uint64_t type = ReadCompactSize(skey);
1394
1395
            // Do stuff based on keytype "type", i.e., key checks, reading values of the
1396
            // format "<valuelen><valuedata>" from the stream "s", and value checks
1397
0
            switch(type) {
1398
0
                case PSBT_GLOBAL_UNSIGNED_TX:
  Branch (1398:17): [True: 0, False: 0]
1399
0
                {
1400
0
                    ExpectedKeySize("Global Unsigned TX", key, 1);
1401
                    // Set the stream to serialize with non-witness since this should always be non-witness
1402
0
                    tx.emplace();
1403
0
                    UnserializeFromVector(s, TX_NO_WITNESS(*tx));
1404
                    // Make sure that all scriptSigs and scriptWitnesses are empty
1405
0
                    for (const CTxIn& txin : tx->vin) {
  Branch (1405:44): [True: 0, False: 0]
1406
0
                        if (!txin.scriptSig.empty() || !txin.scriptWitness.IsNull()) {
  Branch (1406:29): [True: 0, False: 0]
  Branch (1406:56): [True: 0, False: 0]
1407
0
                            throw std::ios_base::failure("Unsigned tx does not have empty scriptSigs and scriptWitnesses.");
1408
0
                        }
1409
0
                    }
1410
0
                    tx_version = tx->version;
1411
0
                    fallback_locktime = tx->nLockTime;
1412
                    // Set the input and output counts
1413
0
                    input_count = tx->vin.size();
1414
0
                    output_count = tx->vout.size();
1415
0
                    break;
1416
0
                }
1417
0
                case PSBT_GLOBAL_TX_VERSION:
  Branch (1417:17): [True: 0, False: 0]
1418
0
                {
1419
0
                    ExpectedKeySize("Global Transaction Version", key, 1);
1420
0
                    UnserializeFromVector(s, tx_version);
1421
0
                    found_tx_version = true;
1422
0
                    break;
1423
0
                }
1424
0
                case PSBT_GLOBAL_FALLBACK_LOCKTIME:
  Branch (1424:17): [True: 0, False: 0]
1425
0
                {
1426
0
                    ExpectedKeySize("Global Fallback Locktime", key, 1);
1427
0
                    fallback_locktime.emplace();
1428
0
                    UnserializeFromVector(s, *fallback_locktime);
1429
0
                    found_fallback_locktime = true;
1430
0
                    break;
1431
0
                }
1432
0
                case PSBT_GLOBAL_INPUT_COUNT:
  Branch (1432:17): [True: 0, False: 0]
1433
0
                {
1434
0
                    ExpectedKeySize("Global Input Count", key, 1);
1435
0
                    CompactSizeReader reader(input_count);
1436
0
                    UnserializeFromVector(s, reader);
1437
0
                    found_input_count = true;
1438
0
                    break;
1439
0
                }
1440
0
                case PSBT_GLOBAL_OUTPUT_COUNT:
  Branch (1440:17): [True: 0, False: 0]
1441
0
                {
1442
0
                    ExpectedKeySize("Global Output Count", key, 1);
1443
0
                    CompactSizeReader reader(output_count);
1444
0
                    UnserializeFromVector(s, reader);
1445
0
                    found_output_count = true;
1446
0
                    break;
1447
0
                }
1448
0
                case PSBT_GLOBAL_TX_MODIFIABLE:
  Branch (1448:17): [True: 0, False: 0]
1449
0
                {
1450
0
                    ExpectedKeySize("Global TX Modifiable Flags", key, 1);
1451
0
                    uint8_t tx_mod;
1452
0
                    UnserializeFromVector(s, tx_mod);
1453
0
                    m_tx_modifiable.emplace(tx_mod);
1454
0
                    break;
1455
0
                }
1456
0
                case PSBT_GLOBAL_XPUB:
  Branch (1456:17): [True: 0, False: 0]
1457
0
                {
1458
0
                    ExpectedKeySize("Global XPUB", key, BIP32_EXTKEY_WITH_VERSION_SIZE + 1);
1459
                    // Read in the xpub from key
1460
0
                    CExtPubKey xpub;
1461
0
                    xpub.DecodeWithVersion(&key.data()[1]);
1462
0
                    if (!xpub.pubkey.IsFullyValid()) {
  Branch (1462:25): [True: 0, False: 0]
1463
0
                       throw std::ios_base::failure("Invalid pubkey");
1464
0
                    }
1465
0
                    global_xpubs.insert(xpub);
1466
                    // Read in the keypath from stream
1467
0
                    KeyOriginInfo keypath;
1468
0
                    DeserializeHDKeypath(s, keypath);
1469
1470
                    // Note that we store these swapped to make searches faster.
1471
                    // Serialization uses xpub -> keypath to enqure key uniqueness
1472
0
                    if (!m_xpubs.contains(keypath)) {
  Branch (1472:25): [True: 0, False: 0]
1473
                        // Make a new set to put the xpub in
1474
0
                        m_xpubs[keypath] = {xpub};
1475
0
                    } else {
1476
                        // Insert xpub into existing set
1477
0
                        m_xpubs[keypath].insert(xpub);
1478
0
                    }
1479
0
                    break;
1480
0
                }
1481
0
                case PSBT_GLOBAL_VERSION:
  Branch (1481:17): [True: 0, False: 0]
1482
0
                {
1483
0
                    ExpectedKeySize("Global PSBT Version", key, 1);
1484
0
                    uint32_t v;
1485
0
                    UnserializeFromVector(s, v);
1486
0
                    m_version = v;
1487
0
                    if (*m_version > PSBT_HIGHEST_VERSION) {
  Branch (1487:25): [True: 0, False: 0]
1488
0
                        throw std::ios_base::failure("Unsupported version number");
1489
0
                    }
1490
0
                    break;
1491
0
                }
1492
0
                case PSBT_GLOBAL_PROPRIETARY:
  Branch (1492:17): [True: 0, False: 0]
1493
0
                {
1494
0
                    PSBTProprietary this_prop;
1495
0
                    skey >> this_prop.identifier;
1496
0
                    this_prop.subtype = ReadCompactSize(skey);
1497
0
                    this_prop.key = key;
1498
1499
0
                    s >> this_prop.value;
1500
0
                    m_proprietary.insert(this_prop);
1501
0
                    break;
1502
0
                }
1503
                // Unknown stuff
1504
0
                default: {
  Branch (1504:17): [True: 0, False: 0]
1505
                    // Read in the value
1506
0
                    std::vector<unsigned char> val_bytes;
1507
0
                    s >> val_bytes;
1508
0
                    unknown.emplace(std::move(key), std::move(val_bytes));
1509
0
                }
1510
0
            }
1511
0
        }
1512
1513
0
        if (!found_sep) {
  Branch (1513:13): [True: 0, False: 0]
1514
0
            throw std::ios_base::failure("Separator is missing at the end of the global map");
1515
0
        }
1516
1517
0
        const uint32_t psbt_ver = GetVersion();
1518
1519
        // Check PSBT version constraints
1520
0
        if (psbt_ver == 0) {
  Branch (1520:13): [True: 0, False: 0]
1521
            // Make sure that we got an unsigned tx for PSBTv0
1522
0
            if (!tx) {
  Branch (1522:17): [True: 0, False: 0]
1523
0
                throw std::ios_base::failure("No unsigned transaction was provided");
1524
0
            }
1525
            // Make sure no PSBTv2 fields are present
1526
0
            if (found_tx_version) {
  Branch (1526:17): [True: 0, False: 0]
1527
0
                throw std::ios_base::failure("PSBT_GLOBAL_TX_VERSION is not allowed in PSBTv0");
1528
0
            }
1529
0
            if (found_fallback_locktime) {
  Branch (1529:17): [True: 0, False: 0]
1530
0
                throw std::ios_base::failure("PSBT_GLOBAL_FALLBACK_LOCKTIME is not allowed in PSBTv0");
1531
0
            }
1532
0
            if (found_input_count) {
  Branch (1532:17): [True: 0, False: 0]
1533
0
                throw std::ios_base::failure("PSBT_GLOBAL_INPUT_COUNT is not allowed in PSBTv0");
1534
0
            }
1535
0
            if (found_output_count) {
  Branch (1535:17): [True: 0, False: 0]
1536
0
                throw std::ios_base::failure("PSBT_GLOBAL_OUTPUT_COUNT is not allowed in PSBTv0");
1537
0
            }
1538
0
            if (m_tx_modifiable != std::nullopt) {
  Branch (1538:17): [True: 0, False: 0]
1539
0
                throw std::ios_base::failure("PSBT_GLOBAL_TX_MODIFIABLE is not allowed in PSBTv0");
1540
0
            }
1541
0
        }
1542
        // Disallow v1
1543
0
        if (psbt_ver == 1) {
  Branch (1543:13): [True: 0, False: 0]
1544
0
            throw std::ios_base::failure("There is no PSBT version 1");
1545
0
        }
1546
0
        if (psbt_ver == 2) {
  Branch (1546:13): [True: 0, False: 0]
1547
            // Tx version, input, and output counts are required
1548
0
            if (!found_tx_version) {
  Branch (1548:17): [True: 0, False: 0]
1549
0
                throw std::ios_base::failure("PSBT_GLOBAL_TX_VERSION is required in PSBTv2");
1550
0
            }
1551
0
            if (!found_input_count) {
  Branch (1551:17): [True: 0, False: 0]
1552
0
                throw std::ios_base::failure("PSBT_GLOBAL_INPUT_COUNT is required in PSBTv2");
1553
0
            }
1554
0
            if (!found_output_count) {
  Branch (1554:17): [True: 0, False: 0]
1555
0
                throw std::ios_base::failure("PSBT_GLOBAL_OUTPUT_COUNT is required in PSBTv2");
1556
0
            }
1557
            // Unsigned tx is disallowed
1558
0
            if (tx) {
  Branch (1558:17): [True: 0, False: 0]
1559
0
                throw std::ios_base::failure("PSBT_GLOBAL_UNSIGNED_TX is not allowed in PSBTv2");
1560
0
            }
1561
0
        }
1562
0
        if (psbt_ver > 2) {
  Branch (1562:13): [True: 0, False: 0]
1563
0
            throw std::ios_base::failure("Unknown PSBT version");
1564
0
        }
1565
1566
        // Read input data
1567
0
        unsigned int i = 0;
1568
0
        while (!s.empty() && i < input_count) {
  Branch (1568:16): [True: 0, False: 0]
  Branch (1568:30): [True: 0, False: 0]
1569
0
            if (psbt_ver < 2) {
  Branch (1569:17): [True: 0, False: 0]
1570
0
                inputs.emplace_back(psbt_ver, tx->vin[i].prevout.hash, tx->vin[i].prevout.n, tx->vin[i].nSequence);
1571
0
                s >> inputs.back();
1572
0
            } else {
1573
0
                inputs.emplace_back(deserialize, s, psbt_ver);
1574
0
            }
1575
1576
            // Make sure the non-witness utxo matches the outpoint
1577
0
            const PSBTInput& input = inputs.back();
1578
0
            if (input.non_witness_utxo) {
  Branch (1578:17): [True: 0, False: 0]
1579
0
                if (psbt_ver < 2) {
  Branch (1579:21): [True: 0, False: 0]
1580
0
                    if (input.non_witness_utxo->GetHash() != tx->vin[i].prevout.hash) {
  Branch (1580:25): [True: 0, False: 0]
1581
0
                        throw std::ios_base::failure("Non-witness UTXO does not match outpoint hash");
1582
0
                    }
1583
0
                    if (tx->vin[i].prevout.n >= input.non_witness_utxo->vout.size()) {
  Branch (1583:25): [True: 0, False: 0]
1584
0
                        throw std::ios_base::failure("Input specifies output index that does not exist");
1585
0
                    }
1586
0
                } else {
1587
0
                    if (input.non_witness_utxo->GetHash() != input.prev_txid) {
  Branch (1587:25): [True: 0, False: 0]
1588
0
                        throw std::ios_base::failure("Non-witness UTXO does not match outpoint hash");
1589
0
                    }
1590
0
                    if (input.prev_out >= input.non_witness_utxo->vout.size()) {
  Branch (1590:25): [True: 0, False: 0]
1591
0
                        throw std::ios_base::failure("Input specifies output index that does not exist");
1592
0
                    }
1593
0
                }
1594
0
            }
1595
0
            ++i;
1596
0
        }
1597
        // Make sure that the number of inputs matches the number of inputs in the transaction
1598
0
        if (inputs.size() != input_count) {
  Branch (1598:13): [True: 0, False: 0]
1599
0
            throw std::ios_base::failure("Inputs provided does not match the number of inputs in transaction.");
1600
0
        }
1601
1602
        // Read output data
1603
0
        i = 0;
1604
0
        while (!s.empty() && i < output_count) {
  Branch (1604:16): [True: 0, False: 0]
  Branch (1604:30): [True: 0, False: 0]
1605
0
            if (psbt_ver < 2) {
  Branch (1605:17): [True: 0, False: 0]
1606
0
                outputs.emplace_back(psbt_ver, tx->vout[i].nValue, tx->vout[i].scriptPubKey);
1607
0
                s >> outputs.back();
1608
0
            } else {
1609
0
                outputs.emplace_back(deserialize, s, psbt_ver);
1610
0
            }
1611
0
            ++i;
1612
0
        }
1613
        // Make sure that the number of outputs matches the number of outputs in the transaction
1614
0
        if (outputs.size() != output_count) {
  Branch (1614:13): [True: 0, False: 0]
1615
0
            throw std::ios_base::failure("Outputs provided does not match the number of outputs in transaction.");
1616
0
        }
1617
0
    }
1618
1619
    template <typename Stream>
1620
0
    PartiallySignedTransaction(deserialize_type, Stream& s) {
1621
0
        Unserialize(s);
1622
0
    }
1623
};
1624
1625
enum class PSBTRole {
1626
    CREATOR,
1627
    UPDATER,
1628
    SIGNER,
1629
    FINALIZER,
1630
    EXTRACTOR
1631
};
1632
1633
std::string PSBTRoleName(PSBTRole role);
1634
1635
/** Compute a PrecomputedTransactionData object from a psbt. */
1636
std::optional<PrecomputedTransactionData> PrecomputePSBTData(const PartiallySignedTransaction& psbt);
1637
1638
/** Checks whether a PSBTInput is already signed by checking for non-null finalized fields. */
1639
bool PSBTInputSigned(const PSBTInput& input);
1640
1641
/** Checks whether a PSBTInput is already signed by doing script verification using final fields. */
1642
bool PSBTInputSignedAndVerified(const PartiallySignedTransaction& psbt, unsigned int input_index, const PrecomputedTransactionData* txdata);
1643
1644
/** Signs a PSBTInput, verifying that all provided data matches what is being signed.
1645
 *
1646
 * txdata should be the output of PrecomputePSBTData (which can be shared across
1647
 * multiple SignPSBTInput calls). If it is nullptr, a dummy signature will be created.
1648
 **/
1649
[[nodiscard]] PSBTError SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index, const PrecomputedTransactionData* txdata, const common::PSBTFillOptions& options, SignatureData* out_sigdata = nullptr);
1650
1651
/**  Reduces the size of the PSBT by dropping unnecessary `non_witness_utxos` (i.e. complete previous transactions) from a psbt when all inputs are segwit v1. */
1652
void RemoveUnnecessaryTransactions(PartiallySignedTransaction& psbtx);
1653
1654
/** Counts the unsigned inputs of a PSBT. */
1655
size_t CountPSBTUnsignedInputs(const PartiallySignedTransaction& psbt);
1656
1657
/** Updates a PSBTOutput with information from provider.
1658
 *
1659
 * This fills in the redeem_script, witness_script, and hd_keypaths where possible.
1660
 */
1661
void UpdatePSBTOutput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index);
1662
1663
/**
1664
 * Finalizes a PSBT if possible, combining partial signatures.
1665
 *
1666
 * @param[in,out] psbtx PartiallySignedTransaction to finalize
1667
 * return True if the PSBT is now complete, false otherwise
1668
 */
1669
bool FinalizePSBT(PartiallySignedTransaction& psbtx);
1670
1671
/**
1672
 * Finalizes a PSBT if possible, and extracts it to a CMutableTransaction if it could be finalized.
1673
 *
1674
 * @param[in]  psbtx PartiallySignedTransaction
1675
 * @param[out] result CMutableTransaction representing the complete transaction, if successful
1676
 * @return True if we successfully extracted the transaction, false otherwise
1677
 */
1678
bool FinalizeAndExtractPSBT(PartiallySignedTransaction& psbtx, CMutableTransaction& result);
1679
1680
/**
1681
 * Combines PSBTs with the same underlying transaction, resulting in a single PSBT with all partial signatures from each input.
1682
 *
1683
 * @param[in]  psbtxs the PSBTs to combine
1684
 * @return     The combined PSBT or std::nullopt if the PSBTs cannot be combined
1685
 */
1686
[[nodiscard]] std::optional<PartiallySignedTransaction> CombinePSBTs(const std::vector<PartiallySignedTransaction>& psbtxs);
1687
1688
//! Decode a base64ed PSBT into a PartiallySignedTransaction
1689
[[nodiscard]] util::Result<PartiallySignedTransaction> DecodeBase64PSBT(const std::string& base64_tx);
1690
//! Decode a raw (binary blob) PSBT into a PartiallySignedTransaction
1691
[[nodiscard]] util::Result<PartiallySignedTransaction> DecodeRawPSBT(std::span<const std::byte> tx_data);
1692
1693
#endif // BITCOIN_PSBT_H