Coverage Report

Created: 2026-05-06 07:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/rpc/rawtransaction.cpp
Line
Count
Source
1
// Copyright (c) 2010 Satoshi Nakamoto
2
// Copyright (c) 2009-present The Bitcoin Core developers
3
// Distributed under the MIT software license, see the accompanying
4
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6
#include <base58.h>
7
#include <chain.h>
8
#include <coins.h>
9
#include <consensus/amount.h>
10
#include <consensus/validation.h>
11
#include <core_io.h>
12
#include <index/txindex.h>
13
#include <key_io.h>
14
#include <node/blockstorage.h>
15
#include <node/coin.h>
16
#include <node/context.h>
17
#include <node/psbt.h>
18
#include <node/transaction.h>
19
#include <node/types.h>
20
#include <policy/packages.h>
21
#include <policy/policy.h>
22
#include <policy/rbf.h>
23
#include <primitives/transaction.h>
24
#include <psbt.h>
25
#include <random.h>
26
#include <rpc/blockchain.h>
27
#include <rpc/rawtransaction_util.h>
28
#include <rpc/server.h>
29
#include <rpc/server_util.h>
30
#include <rpc/util.h>
31
#include <script/script.h>
32
#include <script/sign.h>
33
#include <script/signingprovider.h>
34
#include <script/solver.h>
35
#include <uint256.h>
36
#include <undo.h>
37
#include <util/bip32.h>
38
#include <util/check.h>
39
#include <util/strencodings.h>
40
#include <util/string.h>
41
#include <util/vector.h>
42
#include <validation.h>
43
#include <validationinterface.h>
44
45
#include <cstdint>
46
#include <numeric>
47
48
#include <univalue.h>
49
50
using node::AnalyzePSBT;
51
using node::FindCoins;
52
using node::GetTransaction;
53
using node::NodeContext;
54
using node::PSBTAnalysis;
55
56
static constexpr decltype(CTransaction::version) DEFAULT_RAWTX_VERSION{CTransaction::CURRENT_VERSION};
57
58
static void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry,
59
                     Chainstate& active_chainstate, const CTxUndo* txundo = nullptr,
60
                     TxVerbosity verbosity = TxVerbosity::SHOW_DETAILS)
61
3.56k
{
62
3.56k
    CHECK_NONFATAL(verbosity >= TxVerbosity::SHOW_DETAILS);
63
    // Call into TxToUniv() in bitcoin-common to decode the transaction hex.
64
    //
65
    // Blockchain contextual information (confirmations and blocktime) is not
66
    // available to code in bitcoin-common, so we query them here and push the
67
    // data into the returned UniValue.
68
3.56k
    TxToUniv(tx, /*block_hash=*/uint256(), entry, /*include_hex=*/true, txundo, verbosity);
69
70
3.56k
    if (!hashBlock.IsNull()) {
71
52
        LOCK(cs_main);
72
73
52
        entry.pushKV("blockhash", hashBlock.GetHex());
74
52
        const CBlockIndex* pindex = active_chainstate.m_blockman.LookupBlockIndex(hashBlock);
75
52
        if (pindex) {
76
52
            if (active_chainstate.m_chain.Contains(*pindex)) {
77
49
                entry.pushKV("confirmations", 1 + active_chainstate.m_chain.Height() - pindex->nHeight);
78
49
                entry.pushKV("time", pindex->GetBlockTime());
79
49
                entry.pushKV("blocktime", pindex->GetBlockTime());
80
49
            }
81
3
            else
82
3
                entry.pushKV("confirmations", 0);
83
52
        }
84
52
    }
85
3.56k
}
86
87
static std::vector<RPCArg> CreateTxDoc()
88
5.15k
{
89
5.15k
    return {
90
5.15k
        {"inputs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The inputs",
91
5.15k
            {
92
5.15k
                {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "",
93
5.15k
                    {
94
5.15k
                        {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
95
5.15k
                        {"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"},
96
5.15k
                        {"sequence", RPCArg::Type::NUM, RPCArg::DefaultHint{"depends on the value of the 'replaceable' and 'locktime' arguments"}, "The sequence number"},
97
5.15k
                    },
98
5.15k
                },
99
5.15k
            },
100
5.15k
        },
101
5.15k
        {"outputs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The outputs specified as key-value pairs.\n"
102
5.15k
                "Each key may only appear once, i.e. there can only be one 'data' output, and no address may be duplicated.\n"
103
5.15k
                "At least one output of either type must be specified.\n"
104
5.15k
                "For compatibility reasons, a dictionary, which holds the key-value pairs directly, is also\n"
105
5.15k
                "                             accepted as second parameter.",
106
5.15k
            {
107
5.15k
                {"", RPCArg::Type::OBJ_USER_KEYS, RPCArg::Optional::OMITTED, "",
108
5.15k
                    {
109
5.15k
                        {"address", RPCArg::Type::AMOUNT, RPCArg::Optional::NO, "A key-value pair. The key (string) is the bitcoin address, the value (float or string) is the amount in " + CURRENCY_UNIT},
110
5.15k
                    },
111
5.15k
                },
112
5.15k
                {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "",
113
5.15k
                    {
114
5.15k
                        {"data", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "A key-value pair. The key must be \"data\", the value is hex-encoded data that becomes a part of an OP_RETURN output"},
115
5.15k
                    },
116
5.15k
                },
117
5.15k
            },
118
5.15k
         RPCArgOptions{.skip_type_check = true}},
119
5.15k
        {"locktime", RPCArg::Type::NUM, RPCArg::Default{0}, "Raw locktime. Non-0 value also locktime-activates inputs"},
120
5.15k
        {"replaceable", RPCArg::Type::BOOL, RPCArg::Default{true}, "Marks this transaction as BIP125-replaceable.\n"
121
5.15k
                "Allows this transaction to be replaced by a transaction with higher fees. If provided, it is an error if explicit sequence numbers are incompatible."},
122
5.15k
        {"version", RPCArg::Type::NUM, RPCArg::Default{DEFAULT_RAWTX_VERSION}, "Transaction version"},
123
5.15k
    };
124
5.15k
}
125
126
// Update PSBT with information from the mempool, the UTXO set, the txindex, and the provided descriptors.
127
// Optionally, sign the inputs that we can using information from the descriptors.
128
PartiallySignedTransaction ProcessPSBT(const std::string& psbt_string, const std::any& context, const HidingSigningProvider& provider, std::optional<int> sighash_type, bool finalize)
129
19
{
130
    // Unserialize the transactions
131
19
    util::Result<PartiallySignedTransaction> psbt_res = DecodeBase64PSBT(psbt_string);
132
19
    if (!psbt_res) {
133
0
        throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
134
0
    }
135
19
    PartiallySignedTransaction psbtx = *psbt_res;
136
137
19
    if (g_txindex) g_txindex->BlockUntilSyncedToCurrentChain();
138
19
    const NodeContext& node = EnsureAnyNodeContext(context);
139
140
    // If we can't find the corresponding full transaction for all of our inputs,
141
    // this will be used to find just the utxos for the segwit inputs for which
142
    // the full transaction isn't found
143
19
    std::map<COutPoint, Coin> coins;
144
145
    // Fetch previous transactions:
146
    // First, look in the txindex and the mempool
147
25
    for (PSBTInput& psbt_input : psbtx.inputs) {
148
        // The `non_witness_utxo` is the whole previous transaction
149
25
        if (psbt_input.non_witness_utxo) continue;
150
151
11
        CTransactionRef tx;
152
153
        // Look in the txindex
154
11
        if (g_txindex) {
155
0
            uint256 block_hash;
156
0
            g_txindex->FindTx(psbt_input.prev_txid, block_hash, tx);
157
0
        }
158
        // If we still don't have it look in the mempool
159
11
        if (!tx) {
160
11
            tx = node.mempool->get(psbt_input.prev_txid);
161
11
        }
162
11
        if (tx) {
163
9
            psbt_input.non_witness_utxo = tx;
164
9
        } else {
165
2
            coins[psbt_input.GetOutPoint()]; // Create empty map entry keyed by prevout
166
2
        }
167
11
    }
168
169
    // If we still haven't found all of the inputs, look for the missing ones in the utxo set
170
19
    if (!coins.empty()) {
171
1
        FindCoins(node, coins);
172
2
        for (PSBTInput& input : psbtx.inputs) {
173
            // If there are still missing utxos, add them if they were found in the utxo set
174
2
            if (!input.non_witness_utxo) {
175
2
                const Coin& coin = coins.at(input.GetOutPoint());
176
2
                if (!coin.out.IsNull() && IsSegWitOutput(provider, coin.out.scriptPubKey)) {
177
0
                    input.witness_utxo = coin.out;
178
0
                }
179
2
            }
180
2
        }
181
1
    }
182
183
19
    std::optional<PrecomputedTransactionData> txdata_res = PrecomputePSBTData(psbtx);
184
19
    if (!txdata_res) {
185
0
        throw JSONRPCPSBTError(common::PSBTError::INVALID_TX);
186
0
    }
187
19
    const PrecomputedTransactionData& txdata = *txdata_res;
188
189
37
    for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
190
25
        if (PSBTInputSigned(psbtx.inputs.at(i))) {
191
0
            continue;
192
0
        }
193
194
        // Update script/keypath information using descriptor data.
195
        // Note that SignPSBTInput does a lot more than just constructing ECDSA signatures.
196
        // We only actually care about those if our signing provider doesn't hide private
197
        // information, as is the case with `descriptorprocesspsbt`
198
        // Only error for mismatching sighash types as it is critical that the sighash to sign with matches the PSBT's
199
25
        if (SignPSBTInput(provider, psbtx, /*index=*/i, &txdata, {.sighash_type = sighash_type, .finalize = finalize}, /*out_sigdata=*/nullptr) == common::PSBTError::SIGHASH_MISMATCH) {
200
7
            throw JSONRPCPSBTError(common::PSBTError::SIGHASH_MISMATCH);
201
7
        }
202
25
    }
203
204
    // Update script/keypath information using descriptor data.
205
31
    for (unsigned int i = 0; i < psbtx.outputs.size(); ++i) {
206
19
        UpdatePSBTOutput(provider, psbtx, i);
207
19
    }
208
209
12
    RemoveUnnecessaryTransactions(psbtx);
210
211
12
    return psbtx;
212
19
}
213
214
static RPCMethod getrawtransaction()
215
5.95k
{
216
5.95k
    return RPCMethod{
217
5.95k
                "getrawtransaction",
218
219
5.95k
                "By default, this call only returns a transaction if it is in the mempool. If -txindex is enabled\n"
220
5.95k
                "and no blockhash argument is passed, it will return the transaction if it is in the mempool or any block.\n"
221
5.95k
                "If a blockhash argument is passed, it will return the transaction if\n"
222
5.95k
                "the specified block is available and the transaction is in that block.\n\n"
223
5.95k
                "Hint: Use gettransaction for wallet transactions.\n\n"
224
225
5.95k
                "If verbosity is 0 or omitted, returns the serialized transaction as a hex-encoded string.\n"
226
5.95k
                "If verbosity is 1, returns a JSON Object with information about the transaction.\n"
227
5.95k
                "If verbosity is 2, returns a JSON Object with information about the transaction, including fee and prevout information.",
228
5.95k
                {
229
5.95k
                    {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
230
5.95k
                    {"verbosity|verbose", RPCArg::Type::NUM, RPCArg::Default{0}, "0 for hex-encoded data, 1 for a JSON object, and 2 for JSON object with fee and prevout",
231
5.95k
                     RPCArgOptions{.skip_type_check = true}},
232
5.95k
                    {"blockhash", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The block in which to look for the transaction"},
233
5.95k
                },
234
5.95k
                {
235
5.95k
                    RPCResult{"if verbosity is not set or set to 0",
236
5.95k
                         RPCResult::Type::STR, "data", "The serialized transaction as a hex-encoded string for 'txid'"
237
5.95k
                     },
238
5.95k
                     RPCResult{"if verbosity is set to 1",
239
5.95k
                         RPCResult::Type::OBJ, "", "",
240
5.95k
                         Cat<std::vector<RPCResult>>(
241
5.95k
                         {
242
5.95k
                             {RPCResult::Type::BOOL, "in_active_chain", /*optional=*/true, "Whether specified block is in the active chain or not (only present with explicit \"blockhash\" argument)"},
243
5.95k
                             {RPCResult::Type::STR_HEX, "blockhash", /*optional=*/true, "the block hash"},
244
5.95k
                             {RPCResult::Type::NUM, "confirmations", /*optional=*/true, "The confirmations"},
245
5.95k
                             {RPCResult::Type::NUM_TIME, "blocktime", /*optional=*/true, "The block time expressed in " + UNIX_EPOCH_TIME},
246
5.95k
                             {RPCResult::Type::NUM, "time", /*optional=*/true, "Same as \"blocktime\""},
247
5.95k
                             {RPCResult::Type::STR_HEX, "hex", "The serialized, hex-encoded data for 'txid'"},
248
5.95k
                         },
249
5.95k
                         TxDoc({.txid_field_doc="The transaction id (same as provided)"})),
250
5.95k
                    },
251
5.95k
                    RPCResult{"for verbosity = 2",
252
5.95k
                        RPCResult::Type::OBJ, "", "",
253
5.95k
                        {
254
5.95k
                            {RPCResult::Type::ELISION, "", "Same output as verbosity = 1"},
255
5.95k
                            {RPCResult::Type::NUM, "fee", /*optional=*/true, "transaction fee in " + CURRENCY_UNIT + ", omitted if block undo data is not available"},
256
5.95k
                            {RPCResult::Type::ARR, "vin", "",
257
5.95k
                            {
258
5.95k
                                {RPCResult::Type::OBJ, "", "utxo being spent",
259
5.95k
                                {
260
5.95k
                                    {RPCResult::Type::ELISION, "", "Same output as verbosity = 1"},
261
5.95k
                                    {RPCResult::Type::OBJ, "prevout", /*optional=*/true, "The previous output, omitted if block undo data is not available",
262
5.95k
                                    {
263
5.95k
                                        {RPCResult::Type::BOOL, "generated", "Coinbase or not"},
264
5.95k
                                        {RPCResult::Type::NUM, "height", "The height of the prevout"},
265
5.95k
                                        {RPCResult::Type::STR_AMOUNT, "value", "The value in " + CURRENCY_UNIT},
266
5.95k
                                        {RPCResult::Type::OBJ, "scriptPubKey", "", ScriptPubKeyDoc()},
267
5.95k
                                    }},
268
5.95k
                                }},
269
5.95k
                            }},
270
5.95k
                        }},
271
5.95k
                },
272
5.95k
                RPCExamples{
273
5.95k
                    HelpExampleCli("getrawtransaction", "\"mytxid\"")
274
5.95k
            + HelpExampleCli("getrawtransaction", "\"mytxid\" 1")
275
5.95k
            + HelpExampleRpc("getrawtransaction", "\"mytxid\", 1")
276
5.95k
            + HelpExampleCli("getrawtransaction", "\"mytxid\" 0 \"myblockhash\"")
277
5.95k
            + HelpExampleCli("getrawtransaction", "\"mytxid\" 1 \"myblockhash\"")
278
5.95k
            + HelpExampleCli("getrawtransaction", "\"mytxid\" 2 \"myblockhash\"")
279
5.95k
                },
280
5.95k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
281
5.95k
{
282
3.64k
    const NodeContext& node = EnsureAnyNodeContext(request.context);
283
3.64k
    ChainstateManager& chainman = EnsureChainman(node);
284
285
3.64k
    auto txid{Txid::FromUint256(ParseHashV(request.params[0], "parameter 1"))};
286
3.64k
    const CBlockIndex* blockindex = nullptr;
287
288
3.64k
    if (txid.ToUint256() == chainman.GetParams().GenesisBlock().hashMerkleRoot) {
289
        // Special exception for the genesis block coinbase transaction
290
1
        throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "The genesis block coinbase is not considered an ordinary transaction and cannot be retrieved");
291
1
    }
292
293
3.63k
    int verbosity{ParseVerbosity(request.params[1], /*default_verbosity=*/0, /*allow_bool=*/true)};
294
295
3.63k
    if (!request.params[2].isNull()) {
296
41
        LOCK(cs_main);
297
298
41
        uint256 blockhash = ParseHashV(request.params[2], "parameter 3");
299
41
        blockindex = chainman.m_blockman.LookupBlockIndex(blockhash);
300
41
        if (!blockindex) {
301
2
            throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block hash not found");
302
2
        }
303
41
    }
304
305
3.63k
    bool f_txindex_ready = false;
306
3.63k
    if (g_txindex && !blockindex) {
307
33
        f_txindex_ready = g_txindex->BlockUntilSyncedToCurrentChain();
308
33
    }
309
310
3.63k
    uint256 hash_block;
311
3.63k
    const CTransactionRef tx = GetTransaction(blockindex, node.mempool.get(), txid, chainman.m_blockman, hash_block);
312
3.63k
    if (!tx) {
313
9
        std::string errmsg;
314
9
        if (blockindex) {
315
2
            const bool block_has_data = WITH_LOCK(::cs_main, return blockindex->nStatus & BLOCK_HAVE_DATA);
316
2
            if (!block_has_data) {
317
0
                throw JSONRPCError(RPC_MISC_ERROR, "Block not available");
318
0
            }
319
2
            errmsg = "No such transaction found in the provided block";
320
7
        } else if (!g_txindex) {
321
7
            errmsg = "No such mempool transaction. Use -txindex or provide a block hash to enable blockchain transaction queries";
322
7
        } else if (!f_txindex_ready) {
323
0
            errmsg = "No such mempool transaction. Blockchain transactions are still in the process of being indexed";
324
0
        } else {
325
0
            errmsg = "No such mempool or blockchain transaction";
326
0
        }
327
9
        throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, errmsg + ". Use gettransaction for wallet transactions.");
328
9
    }
329
330
3.62k
    if (verbosity <= 0) {
331
45
        return EncodeHexTx(*tx);
332
45
    }
333
334
3.58k
    UniValue result(UniValue::VOBJ);
335
3.58k
    if (blockindex) {
336
30
        LOCK(cs_main);
337
30
        result.pushKV("in_active_chain", chainman.ActiveChain().Contains(*blockindex));
338
30
    }
339
    // If request is verbosity >= 1 but no blockhash was given, then look up the blockindex
340
3.58k
    if (request.params[2].isNull()) {
341
3.53k
        LOCK(cs_main);
342
3.53k
        blockindex = chainman.m_blockman.LookupBlockIndex(hash_block); // May be nullptr for mempool transactions
343
3.53k
    }
344
3.58k
    if (verbosity == 1) {
345
3.55k
        TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate());
346
3.55k
        return result;
347
3.55k
    }
348
349
26
    CBlockUndo blockUndo;
350
26
    CBlock block;
351
352
26
    if (tx->IsCoinBase() || !blockindex || WITH_LOCK(::cs_main, return !(blockindex->nStatus & BLOCK_HAVE_MASK))) {
353
2
        TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate());
354
2
        return result;
355
2
    }
356
24
    if (!chainman.m_blockman.ReadBlockUndo(blockUndo, *blockindex)) {
357
0
        throw JSONRPCError(RPC_INTERNAL_ERROR, "Undo data expected but can't be read. This could be due to disk corruption or a conflict with a pruning event.");
358
0
    }
359
24
    if (!chainman.m_blockman.ReadBlock(block, *blockindex)) {
360
0
        throw JSONRPCError(RPC_INTERNAL_ERROR, "Block data expected but can't be read. This could be due to disk corruption or a conflict with a pruning event.");
361
0
    }
362
363
24
    CTxUndo* undoTX {nullptr};
364
24
    auto it = std::find_if(block.vtx.begin(), block.vtx.end(), [tx](CTransactionRef t){ return *t == *tx; });
365
24
    if (it != block.vtx.end()) {
366
        // -1 as blockundo does not have coinbase tx
367
5
        undoTX = &blockUndo.vtxundo.at(it - block.vtx.begin() - 1);
368
5
    }
369
24
    TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate(), undoTX, TxVerbosity::SHOW_DETAILS_AND_PREVOUT);
370
24
    return result;
371
24
},
372
5.95k
    };
373
5.95k
}
374
375
static RPCMethod createrawtransaction()
376
2.77k
{
377
2.77k
    return RPCMethod{
378
2.77k
        "createrawtransaction",
379
2.77k
        "Create a transaction spending the given inputs and creating new outputs.\n"
380
2.77k
                "Outputs can be addresses or data.\n"
381
2.77k
                "Returns hex-encoded raw transaction.\n"
382
2.77k
                "Note that the transaction's inputs are not signed, and\n"
383
2.77k
                "it is not stored in the wallet or transmitted to the network.\n",
384
2.77k
                CreateTxDoc(),
385
2.77k
                RPCResult{
386
2.77k
                    RPCResult::Type::STR_HEX, "transaction", "hex string of the transaction"
387
2.77k
                },
388
2.77k
                RPCExamples{
389
2.77k
                    HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"address\\\":0.01}]\"")
390
2.77k
            + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"")
391
2.77k
            + HelpExampleRpc("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"[{\\\"address\\\":0.01}]\"")
392
2.77k
            + HelpExampleRpc("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"[{\\\"data\\\":\\\"00010203\\\"}]\"")
393
2.77k
                },
394
2.77k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
395
2.77k
{
396
457
    std::optional<bool> rbf;
397
457
    if (!request.params[3].isNull()) {
398
12
        rbf = request.params[3].get_bool();
399
12
    }
400
457
    CMutableTransaction rawTx = ConstructTransaction(request.params[0], request.params[1], request.params[2], rbf, self.Arg<uint32_t>("version"));
401
402
457
    return EncodeHexTx(CTransaction(rawTx));
403
457
},
404
2.77k
    };
405
2.77k
}
406
407
static RPCMethod decoderawtransaction()
408
6.39k
{
409
6.39k
    return RPCMethod{"decoderawtransaction",
410
6.39k
                "Return a JSON object representing the serialized, hex-encoded transaction.",
411
6.39k
                {
412
6.39k
                    {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction hex string"},
413
6.39k
                    {"iswitness", RPCArg::Type::BOOL, RPCArg::DefaultHint{"depends on heuristic tests"}, "Whether the transaction hex is a serialized witness transaction.\n"
414
6.39k
                        "If iswitness is not present, heuristic tests will be used in decoding.\n"
415
6.39k
                        "If true, only witness deserialization will be tried.\n"
416
6.39k
                        "If false, only non-witness deserialization will be tried.\n"
417
6.39k
                        "This boolean should reflect whether the transaction has inputs\n"
418
6.39k
                        "(e.g. fully valid, or on-chain transactions), if known by the caller."
419
6.39k
                    },
420
6.39k
                },
421
6.39k
                RPCResult{
422
6.39k
                    RPCResult::Type::OBJ, "", "",
423
6.39k
                    TxDoc(),
424
6.39k
                },
425
6.39k
                RPCExamples{
426
6.39k
                    HelpExampleCli("decoderawtransaction", "\"hexstring\"")
427
6.39k
            + HelpExampleRpc("decoderawtransaction", "\"hexstring\"")
428
6.39k
                },
429
6.39k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
430
6.39k
{
431
4.08k
    CMutableTransaction mtx;
432
433
4.08k
    bool try_witness = request.params[1].isNull() ? true : request.params[1].get_bool();
434
4.08k
    bool try_no_witness = request.params[1].isNull() ? true : !request.params[1].get_bool();
435
436
4.08k
    if (!DecodeHexTx(mtx, request.params[0].get_str(), try_no_witness, try_witness)) {
437
7
        throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
438
7
    }
439
440
4.07k
    UniValue result(UniValue::VOBJ);
441
4.07k
    TxToUniv(CTransaction(std::move(mtx)), /*block_hash=*/uint256(), /*entry=*/result, /*include_hex=*/false);
442
443
4.07k
    return result;
444
4.08k
},
445
6.39k
    };
446
6.39k
}
447
448
static RPCMethod decodescript()
449
2.34k
{
450
2.34k
    return RPCMethod{
451
2.34k
        "decodescript",
452
2.34k
        "Decode a hex-encoded script.\n",
453
2.34k
        {
454
2.34k
            {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "the hex-encoded script"},
455
2.34k
        },
456
2.34k
        RPCResult{
457
2.34k
            RPCResult::Type::OBJ, "", "",
458
2.34k
            {
459
2.34k
                {RPCResult::Type::STR, "asm", "Disassembly of the script"},
460
2.34k
                {RPCResult::Type::STR, "desc", "Inferred descriptor for the script"},
461
2.34k
                {RPCResult::Type::STR, "type", "The output type (e.g. " + GetAllOutputTypes() + ")"},
462
2.34k
                {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
463
2.34k
                {RPCResult::Type::STR, "p2sh", /*optional=*/true,
464
2.34k
                 "address of P2SH script wrapping this redeem script (not returned for types that should not be wrapped)"},
465
2.34k
                {RPCResult::Type::OBJ, "segwit", /*optional=*/true,
466
2.34k
                 "Result of a witness output script wrapping this redeem script (not returned for types that should not be wrapped)",
467
2.34k
                 {
468
2.34k
                     {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
469
2.34k
                     {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
470
2.34k
                     {RPCResult::Type::STR, "type", "The type of the output script (e.g. witness_v0_keyhash or witness_v0_scripthash)"},
471
2.34k
                     {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
472
2.34k
                     {RPCResult::Type::STR, "desc", "Inferred descriptor for the script"},
473
2.34k
                     {RPCResult::Type::STR, "p2sh-segwit", "address of the P2SH script wrapping this witness redeem script"},
474
2.34k
                 }},
475
2.34k
            },
476
2.34k
        },
477
2.34k
        RPCExamples{
478
2.34k
            HelpExampleCli("decodescript", "\"hexstring\"")
479
2.34k
          + HelpExampleRpc("decodescript", "\"hexstring\"")
480
2.34k
        },
481
2.34k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
482
2.34k
{
483
31
    UniValue r(UniValue::VOBJ);
484
31
    CScript script;
485
31
    if (request.params[0].get_str().size() > 0){
486
31
        std::vector<unsigned char> scriptData(ParseHexV(request.params[0], "argument"));
487
31
        script = CScript(scriptData.begin(), scriptData.end());
488
31
    } else {
489
        // Empty scripts are valid
490
0
    }
491
31
    ScriptToUniv(script, /*out=*/r, /*include_hex=*/false, /*include_address=*/true);
492
493
31
    std::vector<std::vector<unsigned char>> solutions_data;
494
31
    const TxoutType which_type{Solver(script, solutions_data)};
495
496
31
    const bool can_wrap{[&] {
497
31
        switch (which_type) {
498
2
        case TxoutType::MULTISIG:
499
15
        case TxoutType::NONSTANDARD:
500
17
        case TxoutType::PUBKEY:
501
18
        case TxoutType::PUBKEYHASH:
502
19
        case TxoutType::WITNESS_V0_KEYHASH:
503
21
        case TxoutType::WITNESS_V0_SCRIPTHASH:
504
            // Can be wrapped if the checks below pass
505
21
            break;
506
2
        case TxoutType::NULL_DATA:
507
4
        case TxoutType::SCRIPTHASH:
508
5
        case TxoutType::WITNESS_UNKNOWN:
509
9
        case TxoutType::WITNESS_V1_TAPROOT:
510
10
        case TxoutType::ANCHOR:
511
            // Should not be wrapped
512
10
            return false;
513
31
        } // no default case, so the compiler can warn about missing cases
514
21
        if (!script.HasValidOps() || script.IsUnspendable()) {
515
3
            return false;
516
3
        }
517
112
        for (CScript::const_iterator it{script.begin()}; it != script.end();) {
518
95
            opcodetype op;
519
95
            CHECK_NONFATAL(script.GetOp(it, op));
520
95
            if (op == OP_CHECKSIGADD || IsOpSuccess(op)) {
521
1
                return false;
522
1
            }
523
95
        }
524
17
        return true;
525
18
    }()};
526
527
31
    if (can_wrap) {
528
17
        r.pushKV("p2sh", EncodeDestination(ScriptHash(script)));
529
        // P2SH and witness programs cannot be wrapped in P2WSH, if this script
530
        // is a witness program, don't return addresses for a segwit programs.
531
17
        const bool can_wrap_P2WSH{[&] {
532
17
            switch (which_type) {
533
2
            case TxoutType::MULTISIG:
534
4
            case TxoutType::PUBKEY:
535
            // Uncompressed pubkeys cannot be used with segwit checksigs.
536
            // If the script contains an uncompressed pubkey, skip encoding of a segwit program.
537
10
                for (const auto& solution : solutions_data) {
538
10
                    if ((solution.size() != 1) && !CPubKey(solution).IsCompressed()) {
539
2
                        return false;
540
2
                    }
541
10
                }
542
2
                return true;
543
9
            case TxoutType::NONSTANDARD:
544
10
            case TxoutType::PUBKEYHASH:
545
                // Can be P2WSH wrapped
546
10
                return true;
547
0
            case TxoutType::NULL_DATA:
548
0
            case TxoutType::SCRIPTHASH:
549
0
            case TxoutType::WITNESS_UNKNOWN:
550
1
            case TxoutType::WITNESS_V0_KEYHASH:
551
3
            case TxoutType::WITNESS_V0_SCRIPTHASH:
552
3
            case TxoutType::WITNESS_V1_TAPROOT:
553
3
            case TxoutType::ANCHOR:
554
                // Should not be wrapped
555
3
                return false;
556
17
            } // no default case, so the compiler can warn about missing cases
557
17
            NONFATAL_UNREACHABLE();
558
17
        }()};
559
17
        if (can_wrap_P2WSH) {
560
12
            UniValue sr(UniValue::VOBJ);
561
12
            CScript segwitScr;
562
12
            FlatSigningProvider provider;
563
12
            if (which_type == TxoutType::PUBKEY) {
564
1
                segwitScr = GetScriptForDestination(WitnessV0KeyHash(Hash160(solutions_data[0])));
565
11
            } else if (which_type == TxoutType::PUBKEYHASH) {
566
1
                segwitScr = GetScriptForDestination(WitnessV0KeyHash(uint160{solutions_data[0]}));
567
10
            } else {
568
                // Scripts that are not fit for P2WPKH are encoded as P2WSH.
569
10
                provider.scripts[CScriptID(script)] = script;
570
10
                segwitScr = GetScriptForDestination(WitnessV0ScriptHash(script));
571
10
            }
572
12
            ScriptToUniv(segwitScr, /*out=*/sr, /*include_hex=*/true, /*include_address=*/true, /*provider=*/&provider);
573
12
            sr.pushKV("p2sh-segwit", EncodeDestination(ScriptHash(segwitScr)));
574
12
            r.pushKV("segwit", std::move(sr));
575
12
        }
576
17
    }
577
578
31
    return r;
579
31
},
580
2.34k
    };
581
2.34k
}
582
583
static RPCMethod combinerawtransaction()
584
2.39k
{
585
2.39k
    return RPCMethod{
586
2.39k
        "combinerawtransaction",
587
2.39k
        "Combine multiple partially signed transactions into one transaction.\n"
588
2.39k
                "The combined transaction may be another partially signed transaction or a \n"
589
2.39k
                "fully signed transaction.",
590
2.39k
                {
591
2.39k
                    {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The hex strings of partially signed transactions",
592
2.39k
                        {
593
2.39k
                            {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "A hex-encoded raw transaction"},
594
2.39k
                        },
595
2.39k
                        },
596
2.39k
                },
597
2.39k
                RPCResult{
598
2.39k
                    RPCResult::Type::STR, "", "The hex-encoded raw transaction with signature(s)"
599
2.39k
                },
600
2.39k
                RPCExamples{
601
2.39k
                    HelpExampleCli("combinerawtransaction", R"('["myhex1", "myhex2", "myhex3"]')")
602
2.39k
                },
603
2.39k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
604
2.39k
{
605
606
80
    UniValue txs = request.params[0].get_array();
607
80
    std::vector<CMutableTransaction> txVariants(txs.size());
608
609
180
    for (unsigned int idx = 0; idx < txs.size(); idx++) {
610
120
        if (!DecodeHexTx(txVariants[idx], txs[idx].get_str())) {
611
20
            throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed for tx %d. Make sure the tx has at least one input.", idx));
612
20
        }
613
120
    }
614
615
60
    if (txVariants.empty()) {
616
20
        throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Missing transactions");
617
20
    }
618
619
    // mergedTx will end up with all the signatures; it
620
    // starts as a clone of the rawtx:
621
40
    CMutableTransaction mergedTx(txVariants[0]);
622
623
    // Fetch previous transactions (inputs):
624
40
    CCoinsViewCache view{&CoinsViewEmpty::Get()};
625
40
    {
626
40
        NodeContext& node = EnsureAnyNodeContext(request.context);
627
40
        const CTxMemPool& mempool = EnsureMemPool(node);
628
40
        ChainstateManager& chainman = EnsureChainman(node);
629
40
        LOCK2(cs_main, mempool.cs);
630
40
        CCoinsViewCache &viewChain = chainman.ActiveChainstate().CoinsTip();
631
40
        CCoinsViewMemPool viewMempool(&viewChain, mempool);
632
40
        view.SetBackend(viewMempool); // temporarily switch cache backend to db+mempool view
633
634
40
        for (const CTxIn& txin : mergedTx.vin) {
635
40
            view.AccessCoin(txin.prevout); // Load entries from viewChain into view; can fail.
636
40
        }
637
638
40
        view.SetBackend(CoinsViewEmpty::Get()); // switch back to avoid locking mempool for too long
639
40
    }
640
641
    // Use CTransaction for the constant parts of the
642
    // transaction to avoid rehashing.
643
40
    const CTransaction txConst(mergedTx);
644
    // Sign what we can:
645
60
    for (unsigned int i = 0; i < mergedTx.vin.size(); i++) {
646
40
        CTxIn& txin = mergedTx.vin[i];
647
40
        const Coin& coin = view.AccessCoin(txin.prevout);
648
40
        if (coin.IsSpent()) {
649
20
            throw JSONRPCError(RPC_VERIFY_ERROR, "Input not found or already spent");
650
20
        }
651
20
        SignatureData sigdata;
652
653
        // ... and merge in other signatures:
654
40
        for (const CMutableTransaction& txv : txVariants) {
655
40
            if (txv.vin.size() > i) {
656
40
                sigdata.MergeSignatureData(DataFromTransaction(txv, i, coin.out));
657
40
            }
658
40
        }
659
20
        ProduceSignature(DUMMY_SIGNING_PROVIDER, MutableTransactionSignatureCreator(mergedTx, i, coin.out.nValue, {.sighash_type = SIGHASH_ALL}), coin.out.scriptPubKey, sigdata);
660
661
20
        UpdateInput(txin, sigdata);
662
20
    }
663
664
20
    return EncodeHexTx(CTransaction(mergedTx));
665
40
},
666
2.39k
    };
667
2.39k
}
668
669
static RPCMethod signrawtransactionwithkey()
670
2.49k
{
671
2.49k
    return RPCMethod{
672
2.49k
        "signrawtransactionwithkey",
673
2.49k
        "Sign inputs for raw transaction (serialized, hex-encoded).\n"
674
2.49k
                "The second argument is an array of base58-encoded private\n"
675
2.49k
                "keys that will be the only keys used to sign the transaction.\n"
676
2.49k
                "The third optional argument (may be null) is an array of previous transaction outputs that\n"
677
2.49k
                "this transaction depends on but may not yet be in the block chain.\n",
678
2.49k
                {
679
2.49k
                    {"hexstring", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction hex string"},
680
2.49k
                    {"privkeys", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base58-encoded private keys for signing",
681
2.49k
                        {
682
2.49k
                            {"privatekey", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "private key in base58-encoding"},
683
2.49k
                        },
684
2.49k
                        },
685
2.49k
                    {"prevtxs", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "The previous dependent transaction outputs",
686
2.49k
                        {
687
2.49k
                            {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "",
688
2.49k
                                {
689
2.49k
                                    {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
690
2.49k
                                    {"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"},
691
2.49k
                                    {"scriptPubKey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "output script"},
692
2.49k
                                    {"redeemScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2SH) redeem script"},
693
2.49k
                                    {"witnessScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2WSH or P2SH-P2WSH) witness script"},
694
2.49k
                                    {"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "(required for Segwit inputs) the amount spent"},
695
2.49k
                                },
696
2.49k
                                },
697
2.49k
                        },
698
2.49k
                        },
699
2.49k
                    {"sighashtype", RPCArg::Type::STR, RPCArg::Default{"DEFAULT for Taproot, ALL otherwise"}, "The signature hash type. Must be one of:\n"
700
2.49k
            "       \"DEFAULT\"\n"
701
2.49k
            "       \"ALL\"\n"
702
2.49k
            "       \"NONE\"\n"
703
2.49k
            "       \"SINGLE\"\n"
704
2.49k
            "       \"ALL|ANYONECANPAY\"\n"
705
2.49k
            "       \"NONE|ANYONECANPAY\"\n"
706
2.49k
            "       \"SINGLE|ANYONECANPAY\"\n"
707
2.49k
                    },
708
2.49k
                },
709
2.49k
                RPCResult{
710
2.49k
                    RPCResult::Type::OBJ, "", "",
711
2.49k
                    {
712
2.49k
                        {RPCResult::Type::STR_HEX, "hex", "The hex-encoded raw transaction with signature(s)"},
713
2.49k
                        {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
714
2.49k
                        {RPCResult::Type::ARR, "errors", /*optional=*/true, "Script verification errors (if there are any)",
715
2.49k
                        {
716
2.49k
                            {RPCResult::Type::OBJ, "", "",
717
2.49k
                            {
718
2.49k
                                {RPCResult::Type::STR_HEX, "txid", "The hash of the referenced, previous transaction"},
719
2.49k
                                {RPCResult::Type::NUM, "vout", "The index of the output to spent and used as input"},
720
2.49k
                                {RPCResult::Type::ARR, "witness", "",
721
2.49k
                                {
722
2.49k
                                    {RPCResult::Type::STR_HEX, "witness", ""},
723
2.49k
                                }},
724
2.49k
                                {RPCResult::Type::STR_HEX, "scriptSig", "The hex-encoded signature script"},
725
2.49k
                                {RPCResult::Type::NUM, "sequence", "Script sequence number"},
726
2.49k
                                {RPCResult::Type::STR, "error", "Verification or signing error related to the input"},
727
2.49k
                            }},
728
2.49k
                        }},
729
2.49k
                    }
730
2.49k
                },
731
2.49k
                RPCExamples{
732
2.49k
                    HelpExampleCli("signrawtransactionwithkey", "\"myhex\" \"[\\\"key1\\\",\\\"key2\\\"]\"")
733
2.49k
            + HelpExampleRpc("signrawtransactionwithkey", "\"myhex\", \"[\\\"key1\\\",\\\"key2\\\"]\"")
734
2.49k
                },
735
2.49k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
736
2.49k
{
737
178
    CMutableTransaction mtx;
738
178
    if (!DecodeHexTx(mtx, request.params[0].get_str())) {
739
1
        throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed. Make sure the tx has at least one input.");
740
1
    }
741
742
177
    FlatSigningProvider keystore;
743
177
    const UniValue& keys = request.params[1].get_array();
744
1.03k
    for (unsigned int idx = 0; idx < keys.size(); ++idx) {
745
856
        UniValue k = keys[idx];
746
856
        CKey key = DecodeSecret(k.get_str());
747
856
        if (!key.IsValid()) {
748
1
            throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
749
1
        }
750
751
855
        CPubKey pubkey = key.GetPubKey();
752
855
        CKeyID key_id = pubkey.GetID();
753
855
        keystore.pubkeys.emplace(key_id, pubkey);
754
855
        keystore.keys.emplace(key_id, key);
755
855
    }
756
757
    // Fetch previous transactions (inputs):
758
176
    std::map<COutPoint, Coin> coins;
759
180
    for (const CTxIn& txin : mtx.vin) {
760
180
        coins[txin.prevout]; // Create empty map entry keyed by prevout.
761
180
    }
762
176
    NodeContext& node = EnsureAnyNodeContext(request.context);
763
176
    FindCoins(node, coins);
764
765
    // Parse the prevtxs array
766
176
    ParsePrevouts(request.params[2], &keystore, coins);
767
768
176
    UniValue result(UniValue::VOBJ);
769
176
    SignTransaction(mtx, &keystore, coins, request.params[3], result);
770
176
    return result;
771
177
},
772
2.49k
    };
773
2.49k
}
774
775
const RPCResult& DecodePSBTInputs()
776
2.78k
{
777
2.78k
    static const RPCResult decodepsbt_inputs{
778
2.78k
        RPCResult::Type::ARR, "inputs", "",
779
2.78k
        {
780
2.78k
            {RPCResult::Type::OBJ, "", "",
781
2.78k
            {
782
2.78k
                {RPCResult::Type::OBJ, "non_witness_utxo", /*optional=*/true, "Decoded network transaction for non-witness UTXOs",
783
2.78k
                    TxDoc({.elision_description="The layout is the same as the output of decoderawtransaction."})
784
2.78k
                },
785
2.78k
                {RPCResult::Type::OBJ, "witness_utxo", /*optional=*/true, "Transaction output for witness UTXOs",
786
2.78k
                {
787
2.78k
                    {RPCResult::Type::NUM, "amount", "The value in " + CURRENCY_UNIT},
788
2.78k
                    {RPCResult::Type::OBJ, "scriptPubKey", "",
789
2.78k
                    {
790
2.78k
                        {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
791
2.78k
                        {RPCResult::Type::STR, "desc", "Inferred descriptor for the output"},
792
2.78k
                        {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
793
2.78k
                        {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
794
2.78k
                        {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
795
2.78k
                    }},
796
2.78k
                }},
797
2.78k
                {RPCResult::Type::OBJ_DYN, "partial_signatures", /*optional=*/true, "",
798
2.78k
                {
799
2.78k
                    {RPCResult::Type::STR, "pubkey", "The public key and signature that corresponds to it."},
800
2.78k
                }},
801
2.78k
                {RPCResult::Type::STR, "sighash", /*optional=*/true, "The sighash type to be used"},
802
2.78k
                {RPCResult::Type::OBJ, "redeem_script", /*optional=*/true, "",
803
2.78k
                {
804
2.78k
                    {RPCResult::Type::STR, "asm", "Disassembly of the redeem script"},
805
2.78k
                    {RPCResult::Type::STR_HEX, "hex", "The raw redeem script bytes, hex-encoded"},
806
2.78k
                    {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
807
2.78k
                }},
808
2.78k
                {RPCResult::Type::OBJ, "witness_script", /*optional=*/true, "",
809
2.78k
                {
810
2.78k
                    {RPCResult::Type::STR, "asm", "Disassembly of the witness script"},
811
2.78k
                    {RPCResult::Type::STR_HEX, "hex", "The raw witness script bytes, hex-encoded"},
812
2.78k
                    {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
813
2.78k
                }},
814
2.78k
                {RPCResult::Type::ARR, "bip32_derivs", /*optional=*/true, "",
815
2.78k
                {
816
2.78k
                    {RPCResult::Type::OBJ, "", "",
817
2.78k
                    {
818
2.78k
                        {RPCResult::Type::STR, "pubkey", "The public key with the derivation path as the value."},
819
2.78k
                        {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
820
2.78k
                        {RPCResult::Type::STR, "path", "The path"},
821
2.78k
                    }},
822
2.78k
                }},
823
2.78k
                {RPCResult::Type::OBJ, "final_scriptSig", /*optional=*/true, "",
824
2.78k
                {
825
2.78k
                    {RPCResult::Type::STR, "asm", "Disassembly of the final signature script"},
826
2.78k
                    {RPCResult::Type::STR_HEX, "hex", "The raw final signature script bytes, hex-encoded"},
827
2.78k
                }},
828
2.78k
                {RPCResult::Type::ARR, "final_scriptwitness", /*optional=*/true, "",
829
2.78k
                {
830
2.78k
                    {RPCResult::Type::STR_HEX, "", "hex-encoded witness data (if any)"},
831
2.78k
                }},
832
2.78k
                {RPCResult::Type::OBJ_DYN, "ripemd160_preimages", /*optional=*/ true, "",
833
2.78k
                {
834
2.78k
                    {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
835
2.78k
                }},
836
2.78k
                {RPCResult::Type::OBJ_DYN, "sha256_preimages", /*optional=*/ true, "",
837
2.78k
                {
838
2.78k
                    {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
839
2.78k
                }},
840
2.78k
                {RPCResult::Type::OBJ_DYN, "hash160_preimages", /*optional=*/ true, "",
841
2.78k
                {
842
2.78k
                    {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
843
2.78k
                }},
844
2.78k
                {RPCResult::Type::OBJ_DYN, "hash256_preimages", /*optional=*/ true, "",
845
2.78k
                {
846
2.78k
                    {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
847
2.78k
                }},
848
2.78k
                {RPCResult::Type::STR_HEX, "previous_txid", /*optional=*/true, "TXID of the transaction containing the output being spent by this input"},
849
2.78k
                {RPCResult::Type::NUM, "previous_vout", /*optional=*/true, "Index of the output being spent"},
850
2.78k
                {RPCResult::Type::NUM, "sequence", /*optional=*/true, "Sequence number for this input"},
851
2.78k
                {RPCResult::Type::NUM, "time_locktime", /*optional=*/true, "Time-based locktime required for this input"},
852
2.78k
                {RPCResult::Type::NUM, "height_locktime", /*optional=*/true, "Height-based locktime required for this input"},
853
2.78k
                {RPCResult::Type::STR_HEX, "taproot_key_path_sig", /*optional=*/ true, "hex-encoded signature for the Taproot key path spend"},
854
2.78k
                {RPCResult::Type::ARR, "taproot_script_path_sigs", /*optional=*/ true, "",
855
2.78k
                {
856
2.78k
                    {RPCResult::Type::OBJ, "signature", /*optional=*/ true, "The signature for the pubkey and leaf hash combination",
857
2.78k
                    {
858
2.78k
                        {RPCResult::Type::STR, "pubkey", "The x-only pubkey for this signature"},
859
2.78k
                        {RPCResult::Type::STR, "leaf_hash", "The leaf hash for this signature"},
860
2.78k
                        {RPCResult::Type::STR, "sig", "The signature itself"},
861
2.78k
                    }},
862
2.78k
                }},
863
2.78k
                {RPCResult::Type::ARR, "taproot_scripts", /*optional=*/ true, "",
864
2.78k
                {
865
2.78k
                    {RPCResult::Type::OBJ, "", "",
866
2.78k
                    {
867
2.78k
                        {RPCResult::Type::STR_HEX, "script", "A leaf script"},
868
2.78k
                        {RPCResult::Type::NUM, "leaf_ver", "The version number for the leaf script"},
869
2.78k
                        {RPCResult::Type::ARR, "control_blocks", "The control blocks for this script",
870
2.78k
                        {
871
2.78k
                            {RPCResult::Type::STR_HEX, "control_block", "A hex-encoded control block for this script"},
872
2.78k
                        }},
873
2.78k
                    }},
874
2.78k
                }},
875
2.78k
                {RPCResult::Type::ARR, "taproot_bip32_derivs", /*optional=*/ true, "",
876
2.78k
                {
877
2.78k
                    {RPCResult::Type::OBJ, "", "",
878
2.78k
                    {
879
2.78k
                        {RPCResult::Type::STR, "pubkey", "The x-only public key this path corresponds to"},
880
2.78k
                        {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
881
2.78k
                        {RPCResult::Type::STR, "path", "The path"},
882
2.78k
                        {RPCResult::Type::ARR, "leaf_hashes", "The hashes of the leaves this pubkey appears in",
883
2.78k
                        {
884
2.78k
                            {RPCResult::Type::STR_HEX, "hash", "The hash of a leaf this pubkey appears in"},
885
2.78k
                        }},
886
2.78k
                    }},
887
2.78k
                }},
888
2.78k
                {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"},
889
2.78k
                {RPCResult::Type::STR_HEX, "taproot_merkle_root", /*optional=*/ true, "The hex-encoded Taproot merkle root"},
890
2.78k
                {RPCResult::Type::ARR, "musig2_participant_pubkeys", /*optional=*/true, "",
891
2.78k
                {
892
2.78k
                    {RPCResult::Type::OBJ, "", "",
893
2.78k
                    {
894
2.78k
                        {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which the participants create."},
895
2.78k
                        {RPCResult::Type::ARR, "participant_pubkeys", "",
896
2.78k
                        {
897
2.78k
                            {RPCResult::Type::STR_HEX, "pubkey", "The compressed public keys that are aggregated for aggregate_pubkey."},
898
2.78k
                        }},
899
2.78k
                    }},
900
2.78k
                }},
901
2.78k
                {RPCResult::Type::ARR, "musig2_pubnonces", /*optional=*/true, "",
902
2.78k
                {
903
2.78k
                    {RPCResult::Type::OBJ, "", "",
904
2.78k
                    {
905
2.78k
                        {RPCResult::Type::STR_HEX, "participant_pubkey", "The compressed public key of the participant that created this pubnonce."},
906
2.78k
                        {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which this pubnonce is for."},
907
2.78k
                        {RPCResult::Type::STR_HEX, "leaf_hash", /*optional=*/true, "The hash of the leaf script that contains the aggregate pubkey being signed for. Omitted when signing for the internal key."},
908
2.78k
                        {RPCResult::Type::STR_HEX, "pubnonce", "The public nonce itself."},
909
2.78k
                    }},
910
2.78k
                }},
911
2.78k
                {RPCResult::Type::ARR, "musig2_partial_sigs", /*optional=*/true, "",
912
2.78k
                {
913
2.78k
                    {RPCResult::Type::OBJ, "", "",
914
2.78k
                    {
915
2.78k
                        {RPCResult::Type::STR_HEX, "participant_pubkey", "The compressed public key of the participant that created this partial signature."},
916
2.78k
                        {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which this partial signature is for."},
917
2.78k
                        {RPCResult::Type::STR_HEX, "leaf_hash", /*optional=*/true, "The hash of the leaf script that contains the aggregate pubkey being signed for. Omitted when signing for the internal key."},
918
2.78k
                        {RPCResult::Type::STR_HEX, "partial_sig", "The partial signature itself."},
919
2.78k
                    }},
920
2.78k
                }},
921
2.78k
                {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/ true, "The unknown input fields",
922
2.78k
                {
923
2.78k
                    {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
924
2.78k
                }},
925
2.78k
                {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The input proprietary map",
926
2.78k
                {
927
2.78k
                    {RPCResult::Type::OBJ, "", "",
928
2.78k
                    {
929
2.78k
                        {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
930
2.78k
                        {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
931
2.78k
                        {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
932
2.78k
                        {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
933
2.78k
                    }},
934
2.78k
                }},
935
2.78k
            }},
936
2.78k
        }
937
2.78k
    };
938
2.78k
    return decodepsbt_inputs;
939
2.78k
}
940
941
const RPCResult& DecodePSBTOutputs()
942
2.78k
{
943
2.78k
    static const RPCResult decodepsbt_outputs{
944
2.78k
        RPCResult::Type::ARR, "outputs", "",
945
2.78k
        {
946
2.78k
            {RPCResult::Type::OBJ, "", "",
947
2.78k
            {
948
2.78k
                {RPCResult::Type::OBJ, "redeem_script", /*optional=*/true, "",
949
2.78k
                {
950
2.78k
                    {RPCResult::Type::STR, "asm", "Disassembly of the redeem script"},
951
2.78k
                    {RPCResult::Type::STR_HEX, "hex", "The raw redeem script bytes, hex-encoded"},
952
2.78k
                    {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
953
2.78k
                }},
954
2.78k
                {RPCResult::Type::OBJ, "witness_script", /*optional=*/true, "",
955
2.78k
                {
956
2.78k
                    {RPCResult::Type::STR, "asm", "Disassembly of the witness script"},
957
2.78k
                    {RPCResult::Type::STR_HEX, "hex", "The raw witness script bytes, hex-encoded"},
958
2.78k
                    {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
959
2.78k
                }},
960
2.78k
                {RPCResult::Type::ARR, "bip32_derivs", /*optional=*/true, "",
961
2.78k
                {
962
2.78k
                    {RPCResult::Type::OBJ, "", "",
963
2.78k
                    {
964
2.78k
                        {RPCResult::Type::STR, "pubkey", "The public key this path corresponds to"},
965
2.78k
                        {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
966
2.78k
                        {RPCResult::Type::STR, "path", "The path"},
967
2.78k
                    }},
968
2.78k
                }},
969
2.78k
                {RPCResult::Type::NUM, "amount", /* optional=*/ true, "The amount (nValue) for this output"},
970
2.78k
                {RPCResult::Type::OBJ, "script", /* optional=*/ true, "The output script (scriptPubKey) for this output",
971
2.78k
                    {{RPCResult::Type::ELISION, "", "The layout is the same as the output of scriptPubKeys in decoderawtransaction."}},
972
2.78k
                },
973
2.78k
                {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"},
974
2.78k
                {RPCResult::Type::ARR, "taproot_tree", /*optional=*/ true, "The tuples that make up the Taproot tree, in depth first search order",
975
2.78k
                {
976
2.78k
                    {RPCResult::Type::OBJ, "tuple", /*optional=*/ true, "A single leaf script in the taproot tree",
977
2.78k
                    {
978
2.78k
                        {RPCResult::Type::NUM, "depth", "The depth of this element in the tree"},
979
2.78k
                        {RPCResult::Type::NUM, "leaf_ver", "The version of this leaf"},
980
2.78k
                        {RPCResult::Type::STR, "script", "The hex-encoded script itself"},
981
2.78k
                    }},
982
2.78k
                }},
983
2.78k
                {RPCResult::Type::ARR, "taproot_bip32_derivs", /*optional=*/ true, "",
984
2.78k
                {
985
2.78k
                    {RPCResult::Type::OBJ, "", "",
986
2.78k
                    {
987
2.78k
                        {RPCResult::Type::STR, "pubkey", "The x-only public key this path corresponds to"},
988
2.78k
                        {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
989
2.78k
                        {RPCResult::Type::STR, "path", "The path"},
990
2.78k
                        {RPCResult::Type::ARR, "leaf_hashes", "The hashes of the leaves this pubkey appears in",
991
2.78k
                        {
992
2.78k
                            {RPCResult::Type::STR_HEX, "hash", "The hash of a leaf this pubkey appears in"},
993
2.78k
                        }},
994
2.78k
                    }},
995
2.78k
                }},
996
2.78k
                {RPCResult::Type::ARR, "musig2_participant_pubkeys", /*optional=*/true, "",
997
2.78k
                {
998
2.78k
                    {RPCResult::Type::OBJ, "", "",
999
2.78k
                    {
1000
2.78k
                        {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which the participants create."},
1001
2.78k
                        {RPCResult::Type::ARR, "participant_pubkeys", "",
1002
2.78k
                        {
1003
2.78k
                            {RPCResult::Type::STR_HEX, "pubkey", "The compressed public keys that are aggregated for aggregate_pubkey."},
1004
2.78k
                        }},
1005
2.78k
                    }},
1006
2.78k
                }},
1007
2.78k
                {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/true, "The unknown output fields",
1008
2.78k
                {
1009
2.78k
                    {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
1010
2.78k
                }},
1011
2.78k
                {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The output proprietary map",
1012
2.78k
                {
1013
2.78k
                    {RPCResult::Type::OBJ, "", "",
1014
2.78k
                    {
1015
2.78k
                        {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
1016
2.78k
                        {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
1017
2.78k
                        {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
1018
2.78k
                        {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
1019
2.78k
                    }},
1020
2.78k
                }},
1021
2.78k
            }},
1022
2.78k
        }
1023
2.78k
    };
1024
2.78k
    return decodepsbt_outputs;
1025
2.78k
}
1026
1027
static RPCMethod decodepsbt()
1028
2.78k
{
1029
2.78k
    return RPCMethod{
1030
2.78k
        "decodepsbt",
1031
2.78k
        "Return a JSON object representing the serialized, base64-encoded partially signed Bitcoin transaction.",
1032
2.78k
                {
1033
2.78k
                    {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The PSBT base64 string"},
1034
2.78k
                },
1035
2.78k
                RPCResult{
1036
2.78k
                    RPCResult::Type::OBJ, "", "",
1037
2.78k
                    {
1038
2.78k
                        {RPCResult::Type::OBJ, "tx", /*optional=*/true, "The decoded network-serialized unsigned transaction.",
1039
2.78k
                            TxDoc({.elision_description="The layout is the same as the output of decoderawtransaction."})
1040
2.78k
                        },
1041
2.78k
                        {RPCResult::Type::ARR, "global_xpubs", "",
1042
2.78k
                        {
1043
2.78k
                            {RPCResult::Type::OBJ, "", "",
1044
2.78k
                            {
1045
2.78k
                                {RPCResult::Type::STR, "xpub", "The extended public key this path corresponds to"},
1046
2.78k
                                {RPCResult::Type::STR_HEX, "master_fingerprint", "The fingerprint of the master key"},
1047
2.78k
                                {RPCResult::Type::STR, "path", "The path"},
1048
2.78k
                            }},
1049
2.78k
                        }},
1050
2.78k
                        {RPCResult::Type::NUM, "tx_version", /* optional */ true, "The version number of the unsigned transaction. Not to be confused with PSBT version"},
1051
2.78k
                        {RPCResult::Type::NUM, "fallback_locktime", /* optional */ true, "The locktime to fallback to if no inputs specify a required locktime."},
1052
2.78k
                        {RPCResult::Type::NUM, "input_count", /* optional */ true, "The number of inputs in this psbt"},
1053
2.78k
                        {RPCResult::Type::NUM, "output_count", /* optional */ true, "The number of outputs in this psbt."},
1054
2.78k
                        {RPCResult::Type::BOOL, "inputs_modifiable", /* optional */ true, "Whether inputs can be modified"},
1055
2.78k
                        {RPCResult::Type::BOOL, "outputs_modifiable", /* optional */ true, "Whether outputs can be modified"},
1056
2.78k
                        {RPCResult::Type::BOOL, "has_sighash_single", /* optional */ true, "Whether this PSBT has SIGHASH_SINGLE inputs"},
1057
2.78k
                        {RPCResult::Type::NUM, "psbt_version", /* optional */ true, "The PSBT version number. Not to be confused with the unsigned transaction version"},
1058
2.78k
                        {RPCResult::Type::ARR, "proprietary", "The global proprietary map",
1059
2.78k
                        {
1060
2.78k
                            {RPCResult::Type::OBJ, "", "",
1061
2.78k
                            {
1062
2.78k
                                {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
1063
2.78k
                                {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
1064
2.78k
                                {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
1065
2.78k
                                {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
1066
2.78k
                            }},
1067
2.78k
                        }},
1068
2.78k
                        {RPCResult::Type::OBJ_DYN, "unknown", "The unknown global fields",
1069
2.78k
                        {
1070
2.78k
                             {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
1071
2.78k
                        }},
1072
2.78k
                        DecodePSBTInputs(),
1073
2.78k
                        DecodePSBTOutputs(),
1074
2.78k
                        {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid if all UTXOs slots in the PSBT have been filled."},
1075
2.78k
                    }
1076
2.78k
                },
1077
2.78k
                RPCExamples{
1078
2.78k
                    HelpExampleCli("decodepsbt", "\"psbt\"")
1079
2.78k
                },
1080
2.78k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1081
2.78k
{
1082
    // Unserialize the transactions
1083
473
    util::Result<PartiallySignedTransaction> psbt_res = DecodeBase64PSBT(request.params[0].get_str());
1084
473
    if (!psbt_res) {
1085
87
        throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
1086
87
    }
1087
386
    PartiallySignedTransaction psbtx = *psbt_res;
1088
1089
386
    UniValue result(UniValue::VOBJ);
1090
1091
386
    if (psbtx.GetVersion() < 2) {
1092
        // Add the decoded tx
1093
44
        UniValue tx_univ(UniValue::VOBJ);
1094
44
        TxToUniv(CTransaction(*CHECK_NONFATAL(psbtx.GetUnsignedTx())), /*block_hash=*/uint256(), /*entry=*/tx_univ, /*include_hex=*/false);
1095
44
        result.pushKV("tx", std::move(tx_univ));
1096
44
    }
1097
1098
    // Add the global xpubs
1099
386
    UniValue global_xpubs(UniValue::VARR);
1100
386
    for (std::pair<KeyOriginInfo, std::set<CExtPubKey>> xpub_pair : psbtx.m_xpubs) {
1101
3
        for (auto& xpub : xpub_pair.second) {
1102
3
            std::vector<unsigned char> ser_xpub;
1103
3
            ser_xpub.assign(BIP32_EXTKEY_WITH_VERSION_SIZE, 0);
1104
3
            xpub.EncodeWithVersion(ser_xpub.data());
1105
1106
3
            UniValue keypath(UniValue::VOBJ);
1107
3
            keypath.pushKV("xpub", EncodeBase58Check(ser_xpub));
1108
3
            keypath.pushKV("master_fingerprint", HexStr(std::span<unsigned char>(xpub_pair.first.fingerprint, xpub_pair.first.fingerprint + 4)));
1109
3
            keypath.pushKV("path", WriteHDKeypath(xpub_pair.first.path));
1110
3
            global_xpubs.push_back(std::move(keypath));
1111
3
        }
1112
3
    }
1113
386
    result.pushKV("global_xpubs", std::move(global_xpubs));
1114
1115
    // Add PSBTv2 stuff
1116
386
    if (psbtx.GetVersion() >= 2) {
1117
342
        result.pushKV("tx_version", psbtx.tx_version);
1118
342
        if (psbtx.fallback_locktime.has_value()) {
1119
330
            result.pushKV("fallback_locktime", static_cast<uint64_t>(*psbtx.fallback_locktime));
1120
330
        }
1121
342
        result.pushKV("input_count", (uint64_t)psbtx.inputs.size());
1122
342
        result.pushKV("output_count", (uint64_t)psbtx.outputs.size());
1123
342
        if (psbtx.m_tx_modifiable.has_value()) {
1124
10
            result.pushKV("inputs_modifiable", psbtx.m_tx_modifiable->test(0));
1125
10
            result.pushKV("outputs_modifiable", psbtx.m_tx_modifiable->test(1));
1126
10
            result.pushKV("has_sighash_single", psbtx.m_tx_modifiable->test(2));
1127
10
        }
1128
342
    }
1129
1130
    // PSBT version
1131
386
    result.pushKV("psbt_version", psbtx.GetVersion());
1132
1133
    // Proprietary
1134
386
    UniValue proprietary(UniValue::VARR);
1135
386
    for (const auto& entry : psbtx.m_proprietary) {
1136
2
        UniValue this_prop(UniValue::VOBJ);
1137
2
        this_prop.pushKV("identifier", HexStr(entry.identifier));
1138
2
        this_prop.pushKV("subtype", entry.subtype);
1139
2
        this_prop.pushKV("key", HexStr(entry.key));
1140
2
        this_prop.pushKV("value", HexStr(entry.value));
1141
2
        proprietary.push_back(std::move(this_prop));
1142
2
    }
1143
386
    result.pushKV("proprietary", std::move(proprietary));
1144
1145
    // Unknown data
1146
386
    UniValue unknowns(UniValue::VOBJ);
1147
386
    for (auto entry : psbtx.unknown) {
1148
0
        unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1149
0
    }
1150
386
    result.pushKV("unknown", std::move(unknowns));
1151
1152
    // inputs
1153
386
    CAmount total_in = 0;
1154
386
    bool have_all_utxos = true;
1155
386
    UniValue inputs(UniValue::VARR);
1156
828
    for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
1157
442
        const PSBTInput& input = psbtx.inputs[i];
1158
442
        UniValue in(UniValue::VOBJ);
1159
        // UTXOs
1160
442
        bool have_a_utxo = false;
1161
442
        CTxOut txout;
1162
442
        if (!input.witness_utxo.IsNull()) {
1163
372
            txout = input.witness_utxo;
1164
1165
372
            UniValue o(UniValue::VOBJ);
1166
372
            ScriptToUniv(txout.scriptPubKey, /*out=*/o, /*include_hex=*/true, /*include_address=*/true);
1167
1168
372
            UniValue out(UniValue::VOBJ);
1169
372
            out.pushKV("amount", ValueFromAmount(txout.nValue));
1170
372
            out.pushKV("scriptPubKey", std::move(o));
1171
1172
372
            in.pushKV("witness_utxo", std::move(out));
1173
1174
372
            have_a_utxo = true;
1175
372
        }
1176
442
        if (input.non_witness_utxo) {
1177
161
            txout = input.non_witness_utxo->vout[input.prev_out];
1178
1179
161
            UniValue non_wit(UniValue::VOBJ);
1180
161
            TxToUniv(*input.non_witness_utxo, /*block_hash=*/uint256(), /*entry=*/non_wit, /*include_hex=*/false);
1181
161
            in.pushKV("non_witness_utxo", std::move(non_wit));
1182
1183
161
            have_a_utxo = true;
1184
161
        }
1185
442
        if (have_a_utxo) {
1186
412
            if (MoneyRange(txout.nValue) && MoneyRange(total_in + txout.nValue)) {
1187
412
                total_in += txout.nValue;
1188
412
            } else {
1189
                // Hack to just not show fee later
1190
0
                have_all_utxos = false;
1191
0
            }
1192
412
        } else {
1193
30
            have_all_utxos = false;
1194
30
        }
1195
1196
        // Partial sigs
1197
442
        if (!input.partial_sigs.empty()) {
1198
36
            UniValue partial_sigs(UniValue::VOBJ);
1199
53
            for (const auto& sig : input.partial_sigs) {
1200
53
                partial_sigs.pushKV(HexStr(sig.second.first), HexStr(sig.second.second));
1201
53
            }
1202
36
            in.pushKV("partial_signatures", std::move(partial_sigs));
1203
36
        }
1204
1205
        // Sighash
1206
442
        if (input.sighash_type != std::nullopt) {
1207
7
            in.pushKV("sighash", SighashToStr((unsigned char)*input.sighash_type));
1208
7
        }
1209
1210
        // Redeem script and witness script
1211
442
        if (!input.redeem_script.empty()) {
1212
19
            UniValue r(UniValue::VOBJ);
1213
19
            ScriptToUniv(input.redeem_script, /*out=*/r);
1214
19
            in.pushKV("redeem_script", std::move(r));
1215
19
        }
1216
442
        if (!input.witness_script.empty()) {
1217
27
            UniValue r(UniValue::VOBJ);
1218
27
            ScriptToUniv(input.witness_script, /*out=*/r);
1219
27
            in.pushKV("witness_script", std::move(r));
1220
27
        }
1221
1222
        // keypaths
1223
442
        if (!input.hd_keypaths.empty()) {
1224
104
            UniValue keypaths(UniValue::VARR);
1225
145
            for (auto entry : input.hd_keypaths) {
1226
145
                UniValue keypath(UniValue::VOBJ);
1227
145
                keypath.pushKV("pubkey", HexStr(entry.first));
1228
1229
145
                keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint)));
1230
145
                keypath.pushKV("path", WriteHDKeypath(entry.second.path));
1231
145
                keypaths.push_back(std::move(keypath));
1232
145
            }
1233
104
            in.pushKV("bip32_derivs", std::move(keypaths));
1234
104
        }
1235
1236
        // Final scriptSig and scriptwitness
1237
442
        if (!input.final_script_sig.empty()) {
1238
17
            UniValue scriptsig(UniValue::VOBJ);
1239
17
            scriptsig.pushKV("asm", ScriptToAsmStr(input.final_script_sig, true));
1240
17
            scriptsig.pushKV("hex", HexStr(input.final_script_sig));
1241
17
            in.pushKV("final_scriptSig", std::move(scriptsig));
1242
17
        }
1243
442
        if (!input.final_script_witness.IsNull()) {
1244
32
            UniValue txinwitness(UniValue::VARR);
1245
67
            for (const auto& item : input.final_script_witness.stack) {
1246
67
                txinwitness.push_back(HexStr(item));
1247
67
            }
1248
32
            in.pushKV("final_scriptwitness", std::move(txinwitness));
1249
32
        }
1250
1251
        // Ripemd160 hash preimages
1252
442
        if (!input.ripemd160_preimages.empty()) {
1253
2
            UniValue ripemd160_preimages(UniValue::VOBJ);
1254
3
            for (const auto& [hash, preimage] : input.ripemd160_preimages) {
1255
3
                ripemd160_preimages.pushKV(HexStr(hash), HexStr(preimage));
1256
3
            }
1257
2
            in.pushKV("ripemd160_preimages", std::move(ripemd160_preimages));
1258
2
        }
1259
1260
        // Sha256 hash preimages
1261
442
        if (!input.sha256_preimages.empty()) {
1262
3
            UniValue sha256_preimages(UniValue::VOBJ);
1263
4
            for (const auto& [hash, preimage] : input.sha256_preimages) {
1264
4
                sha256_preimages.pushKV(HexStr(hash), HexStr(preimage));
1265
4
            }
1266
3
            in.pushKV("sha256_preimages", std::move(sha256_preimages));
1267
3
        }
1268
1269
        // Hash160 hash preimages
1270
442
        if (!input.hash160_preimages.empty()) {
1271
2
            UniValue hash160_preimages(UniValue::VOBJ);
1272
3
            for (const auto& [hash, preimage] : input.hash160_preimages) {
1273
3
                hash160_preimages.pushKV(HexStr(hash), HexStr(preimage));
1274
3
            }
1275
2
            in.pushKV("hash160_preimages", std::move(hash160_preimages));
1276
2
        }
1277
1278
        // Hash256 hash preimages
1279
442
        if (!input.hash256_preimages.empty()) {
1280
2
            UniValue hash256_preimages(UniValue::VOBJ);
1281
3
            for (const auto& [hash, preimage] : input.hash256_preimages) {
1282
3
                hash256_preimages.pushKV(HexStr(hash), HexStr(preimage));
1283
3
            }
1284
2
            in.pushKV("hash256_preimages", std::move(hash256_preimages));
1285
2
        }
1286
1287
        // PSBTv2
1288
442
        if (psbtx.GetVersion() >= 2) {
1289
388
            in.pushKV("previous_txid", input.prev_txid.GetHex());
1290
388
            in.pushKV("previous_vout", static_cast<uint64_t>(input.prev_out));
1291
388
            if (input.sequence.has_value()) {
1292
377
                in.pushKV("sequence", static_cast<uint64_t>(*input.sequence));
1293
377
            }
1294
388
            if (input.time_locktime.has_value()) {
1295
2
                in.pushKV("time_locktime", static_cast<uint64_t>(*input.time_locktime));
1296
2
            }
1297
388
            if (input.height_locktime.has_value()) {
1298
2
                in.pushKV("height_locktime", static_cast<uint64_t>(*input.height_locktime));
1299
2
            }
1300
388
        }
1301
1302
        // Taproot key path signature
1303
442
        if (!input.m_tap_key_sig.empty()) {
1304
75
            in.pushKV("taproot_key_path_sig", HexStr(input.m_tap_key_sig));
1305
75
        }
1306
1307
        // Taproot script path signatures
1308
442
        if (!input.m_tap_script_sigs.empty()) {
1309
96
            UniValue script_sigs(UniValue::VARR);
1310
147
            for (const auto& [pubkey_leaf, sig] : input.m_tap_script_sigs) {
1311
147
                const auto& [xonly, leaf_hash] = pubkey_leaf;
1312
147
                UniValue sigobj(UniValue::VOBJ);
1313
147
                sigobj.pushKV("pubkey", HexStr(xonly));
1314
147
                sigobj.pushKV("leaf_hash", HexStr(leaf_hash));
1315
147
                sigobj.pushKV("sig", HexStr(sig));
1316
147
                script_sigs.push_back(std::move(sigobj));
1317
147
            }
1318
96
            in.pushKV("taproot_script_path_sigs", std::move(script_sigs));
1319
96
        }
1320
1321
        // Taproot leaf scripts
1322
442
        if (!input.m_tap_scripts.empty()) {
1323
166
            UniValue tap_scripts(UniValue::VARR);
1324
258
            for (const auto& [leaf, control_blocks] : input.m_tap_scripts) {
1325
258
                const auto& [script, leaf_ver] = leaf;
1326
258
                UniValue script_info(UniValue::VOBJ);
1327
258
                script_info.pushKV("script", HexStr(script));
1328
258
                script_info.pushKV("leaf_ver", leaf_ver);
1329
258
                UniValue control_blocks_univ(UniValue::VARR);
1330
324
                for (const auto& control_block : control_blocks) {
1331
324
                    control_blocks_univ.push_back(HexStr(control_block));
1332
324
                }
1333
258
                script_info.pushKV("control_blocks", std::move(control_blocks_univ));
1334
258
                tap_scripts.push_back(std::move(script_info));
1335
258
            }
1336
166
            in.pushKV("taproot_scripts", std::move(tap_scripts));
1337
166
        }
1338
1339
        // Taproot bip32 keypaths
1340
442
        if (!input.m_tap_bip32_paths.empty()) {
1341
232
            UniValue keypaths(UniValue::VARR);
1342
795
            for (const auto& [xonly, leaf_origin] : input.m_tap_bip32_paths) {
1343
795
                const auto& [leaf_hashes, origin] = leaf_origin;
1344
795
                UniValue path_obj(UniValue::VOBJ);
1345
795
                path_obj.pushKV("pubkey", HexStr(xonly));
1346
795
                path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint)));
1347
795
                path_obj.pushKV("path", WriteHDKeypath(origin.path));
1348
795
                UniValue leaf_hashes_arr(UniValue::VARR);
1349
795
                for (const auto& leaf_hash : leaf_hashes) {
1350
528
                    leaf_hashes_arr.push_back(HexStr(leaf_hash));
1351
528
                }
1352
795
                path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));
1353
795
                keypaths.push_back(std::move(path_obj));
1354
795
            }
1355
232
            in.pushKV("taproot_bip32_derivs", std::move(keypaths));
1356
232
        }
1357
1358
        // Taproot internal key
1359
442
        if (!input.m_tap_internal_key.IsNull()) {
1360
207
            in.pushKV("taproot_internal_key", HexStr(input.m_tap_internal_key));
1361
207
        }
1362
1363
        // Write taproot merkle root
1364
442
        if (!input.m_tap_merkle_root.IsNull()) {
1365
166
            in.pushKV("taproot_merkle_root", HexStr(input.m_tap_merkle_root));
1366
166
        }
1367
1368
        // Write MuSig2 fields
1369
442
        if (!input.m_musig2_participants.empty()) {
1370
77
            UniValue musig_pubkeys(UniValue::VARR);
1371
98
            for (const auto& [agg, parts] : input.m_musig2_participants) {
1372
98
                UniValue musig_part(UniValue::VOBJ);
1373
98
                musig_part.pushKV("aggregate_pubkey", HexStr(agg));
1374
98
                UniValue part_pubkeys(UniValue::VARR);
1375
271
                for (const auto& pub : parts) {
1376
271
                    part_pubkeys.push_back(HexStr(pub));
1377
271
                }
1378
98
                musig_part.pushKV("participant_pubkeys", part_pubkeys);
1379
98
                musig_pubkeys.push_back(musig_part);
1380
98
            }
1381
77
            in.pushKV("musig2_participant_pubkeys", musig_pubkeys);
1382
77
        }
1383
442
        if (!input.m_musig2_pubnonces.empty()) {
1384
53
            UniValue musig_pubnonces(UniValue::VARR);
1385
67
            for (const auto& [agg_lh, part_pubnonce] : input.m_musig2_pubnonces) {
1386
67
                const auto& [agg, lh] = agg_lh;
1387
178
                for (const auto& [part, pubnonce] : part_pubnonce) {
1388
178
                    UniValue info(UniValue::VOBJ);
1389
178
                    info.pushKV("participant_pubkey", HexStr(part));
1390
178
                    info.pushKV("aggregate_pubkey", HexStr(agg));
1391
178
                    if (!lh.IsNull()) info.pushKV("leaf_hash", HexStr(lh));
1392
178
                    info.pushKV("pubnonce", HexStr(pubnonce));
1393
178
                    musig_pubnonces.push_back(info);
1394
178
                }
1395
67
            }
1396
53
            in.pushKV("musig2_pubnonces", musig_pubnonces);
1397
53
        }
1398
442
        if (!input.m_musig2_partial_sigs.empty()) {
1399
26
            UniValue musig_partial_sigs(UniValue::VARR);
1400
31
            for (const auto& [agg_lh, part_psig] : input.m_musig2_partial_sigs) {
1401
31
                const auto& [agg, lh] = agg_lh;
1402
84
                for (const auto& [part, psig] : part_psig) {
1403
84
                    UniValue info(UniValue::VOBJ);
1404
84
                    info.pushKV("participant_pubkey", HexStr(part));
1405
84
                    info.pushKV("aggregate_pubkey", HexStr(agg));
1406
84
                    if (!lh.IsNull()) info.pushKV("leaf_hash", HexStr(lh));
1407
84
                    info.pushKV("partial_sig", HexStr(psig));
1408
84
                    musig_partial_sigs.push_back(info);
1409
84
                }
1410
31
            }
1411
26
            in.pushKV("musig2_partial_sigs", musig_partial_sigs);
1412
26
        }
1413
1414
        // Proprietary
1415
442
        if (!input.m_proprietary.empty()) {
1416
1
            UniValue proprietary(UniValue::VARR);
1417
1
            for (const auto& entry : input.m_proprietary) {
1418
1
                UniValue this_prop(UniValue::VOBJ);
1419
1
                this_prop.pushKV("identifier", HexStr(entry.identifier));
1420
1
                this_prop.pushKV("subtype", entry.subtype);
1421
1
                this_prop.pushKV("key", HexStr(entry.key));
1422
1
                this_prop.pushKV("value", HexStr(entry.value));
1423
1
                proprietary.push_back(std::move(this_prop));
1424
1
            }
1425
1
            in.pushKV("proprietary", std::move(proprietary));
1426
1
        }
1427
1428
        // Unknown data
1429
442
        if (input.unknown.size() > 0) {
1430
0
            UniValue unknowns(UniValue::VOBJ);
1431
0
            for (auto entry : input.unknown) {
1432
0
                unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1433
0
            }
1434
0
            in.pushKV("unknown", std::move(unknowns));
1435
0
        }
1436
1437
442
        inputs.push_back(std::move(in));
1438
442
    }
1439
386
    result.pushKV("inputs", std::move(inputs));
1440
1441
    // outputs
1442
386
    CAmount output_value = 0;
1443
386
    UniValue outputs(UniValue::VARR);
1444
1.06k
    for (unsigned int i = 0; i < psbtx.outputs.size(); ++i) {
1445
678
        const PSBTOutput& output = psbtx.outputs[i];
1446
678
        UniValue out(UniValue::VOBJ);
1447
        // Redeem script and witness script
1448
678
        if (!output.redeem_script.empty()) {
1449
16
            UniValue r(UniValue::VOBJ);
1450
16
            ScriptToUniv(output.redeem_script, /*out=*/r);
1451
16
            out.pushKV("redeem_script", std::move(r));
1452
16
        }
1453
678
        if (!output.witness_script.empty()) {
1454
12
            UniValue r(UniValue::VOBJ);
1455
12
            ScriptToUniv(output.witness_script, /*out=*/r);
1456
12
            out.pushKV("witness_script", std::move(r));
1457
12
        }
1458
1459
        // keypaths
1460
678
        if (!output.hd_keypaths.empty()) {
1461
129
            UniValue keypaths(UniValue::VARR);
1462
145
            for (auto entry : output.hd_keypaths) {
1463
145
                UniValue keypath(UniValue::VOBJ);
1464
145
                keypath.pushKV("pubkey", HexStr(entry.first));
1465
145
                keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint)));
1466
145
                keypath.pushKV("path", WriteHDKeypath(entry.second.path));
1467
145
                keypaths.push_back(std::move(keypath));
1468
145
            }
1469
129
            out.pushKV("bip32_derivs", std::move(keypaths));
1470
129
        }
1471
1472
        // PSBTv2 stuff
1473
678
        if (psbtx.GetVersion() >= 2) {
1474
616
            out.pushKV("amount", ValueFromAmount(output.amount));
1475
616
            UniValue spk(UniValue::VOBJ);
1476
616
            ScriptToUniv(output.script, spk, /*include_hex=*/true, /*include_address=*/true);
1477
616
            out.pushKV("script", spk);
1478
616
        }
1479
1480
        // Taproot internal key
1481
678
        if (!output.m_tap_internal_key.IsNull()) {
1482
185
            out.pushKV("taproot_internal_key", HexStr(output.m_tap_internal_key));
1483
185
        }
1484
1485
        // Taproot tree
1486
678
        if (!output.m_tap_tree.empty()) {
1487
146
            UniValue tree(UniValue::VARR);
1488
332
            for (const auto& [depth, leaf_ver, script] : output.m_tap_tree) {
1489
332
                UniValue elem(UniValue::VOBJ);
1490
332
                elem.pushKV("depth", depth);
1491
332
                elem.pushKV("leaf_ver", leaf_ver);
1492
332
                elem.pushKV("script", HexStr(script));
1493
332
                tree.push_back(std::move(elem));
1494
332
            }
1495
146
            out.pushKV("taproot_tree", std::move(tree));
1496
146
        }
1497
1498
        // Taproot bip32 keypaths
1499
678
        if (!output.m_tap_bip32_paths.empty()) {
1500
211
            UniValue keypaths(UniValue::VARR);
1501
712
            for (const auto& [xonly, leaf_origin] : output.m_tap_bip32_paths) {
1502
712
                const auto& [leaf_hashes, origin] = leaf_origin;
1503
712
                UniValue path_obj(UniValue::VOBJ);
1504
712
                path_obj.pushKV("pubkey", HexStr(xonly));
1505
712
                path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint)));
1506
712
                path_obj.pushKV("path", WriteHDKeypath(origin.path));
1507
712
                UniValue leaf_hashes_arr(UniValue::VARR);
1508
712
                for (const auto& leaf_hash : leaf_hashes) {
1509
484
                    leaf_hashes_arr.push_back(HexStr(leaf_hash));
1510
484
                }
1511
712
                path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));
1512
712
                keypaths.push_back(std::move(path_obj));
1513
712
            }
1514
211
            out.pushKV("taproot_bip32_derivs", std::move(keypaths));
1515
211
        }
1516
1517
        // Write MuSig2 fields
1518
678
        if (!output.m_musig2_participants.empty()) {
1519
75
            UniValue musig_pubkeys(UniValue::VARR);
1520
99
            for (const auto& [agg, parts] : output.m_musig2_participants) {
1521
99
                UniValue musig_part(UniValue::VOBJ);
1522
99
                musig_part.pushKV("aggregate_pubkey", HexStr(agg));
1523
99
                UniValue part_pubkeys(UniValue::VARR);
1524
275
                for (const auto& pub : parts) {
1525
275
                    part_pubkeys.push_back(HexStr(pub));
1526
275
                }
1527
99
                musig_part.pushKV("participant_pubkeys", part_pubkeys);
1528
99
                musig_pubkeys.push_back(musig_part);
1529
99
            }
1530
75
            out.pushKV("musig2_participant_pubkeys", musig_pubkeys);
1531
75
        }
1532
1533
        // Proprietary
1534
678
        if (!output.m_proprietary.empty()) {
1535
1
            UniValue proprietary(UniValue::VARR);
1536
1
            for (const auto& entry : output.m_proprietary) {
1537
1
                UniValue this_prop(UniValue::VOBJ);
1538
1
                this_prop.pushKV("identifier", HexStr(entry.identifier));
1539
1
                this_prop.pushKV("subtype", entry.subtype);
1540
1
                this_prop.pushKV("key", HexStr(entry.key));
1541
1
                this_prop.pushKV("value", HexStr(entry.value));
1542
1
                proprietary.push_back(std::move(this_prop));
1543
1
            }
1544
1
            out.pushKV("proprietary", std::move(proprietary));
1545
1
        }
1546
1547
        // Unknown data
1548
678
        if (output.unknown.size() > 0) {
1549
0
            UniValue unknowns(UniValue::VOBJ);
1550
0
            for (auto entry : output.unknown) {
1551
0
                unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1552
0
            }
1553
0
            out.pushKV("unknown", std::move(unknowns));
1554
0
        }
1555
1556
678
        outputs.push_back(std::move(out));
1557
1558
        // Fee calculation
1559
678
        if (MoneyRange(output.amount) && MoneyRange(output_value + output.amount)) {
1560
678
            output_value += output.amount;
1561
678
        } else {
1562
            // Hack to just not show fee later
1563
0
            have_all_utxos = false;
1564
0
        }
1565
678
    }
1566
386
    result.pushKV("outputs", std::move(outputs));
1567
386
    if (have_all_utxos) {
1568
367
        result.pushKV("fee", ValueFromAmount(total_in - output_value));
1569
367
    }
1570
1571
386
    return result;
1572
473
},
1573
2.78k
    };
1574
2.78k
}
1575
1576
static RPCMethod combinepsbt()
1577
2.36k
{
1578
2.36k
    return RPCMethod{
1579
2.36k
        "combinepsbt",
1580
2.36k
        "Combine multiple partially signed Bitcoin transactions into one transaction.\n"
1581
2.36k
                "Implements the Combiner role.\n",
1582
2.36k
                {
1583
2.36k
                    {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base64 strings of partially signed transactions",
1584
2.36k
                        {
1585
2.36k
                            {"psbt", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "A base64 string of a PSBT"},
1586
2.36k
                        },
1587
2.36k
                        },
1588
2.36k
                },
1589
2.36k
                RPCResult{
1590
2.36k
                    RPCResult::Type::STR, "", "The base64-encoded partially signed transaction"
1591
2.36k
                },
1592
2.36k
                RPCExamples{
1593
2.36k
                    HelpExampleCli("combinepsbt", R"('["mybase64_1", "mybase64_2", "mybase64_3"]')")
1594
2.36k
                },
1595
2.36k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1596
2.36k
{
1597
    // Unserialize the transactions
1598
56
    std::vector<PartiallySignedTransaction> psbtxs;
1599
56
    UniValue txs = request.params[0].get_array();
1600
56
    if (txs.empty()) {
1601
1
        throw JSONRPCError(RPC_INVALID_PARAMETER, "Parameter 'txs' cannot be empty");
1602
1
    }
1603
210
    for (unsigned int i = 0; i < txs.size(); ++i) {
1604
155
        util::Result<PartiallySignedTransaction> psbt_res = DecodeBase64PSBT(txs[i].get_str());
1605
155
        if (!psbt_res) {
1606
0
            throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
1607
0
        }
1608
155
        psbtxs.push_back(*psbt_res);
1609
155
    }
1610
1611
55
    std::optional<PartiallySignedTransaction> merged_psbt = CombinePSBTs(psbtxs);
1612
55
    if (!merged_psbt) {
1613
1
        throw JSONRPCError(RPC_INVALID_PARAMETER, "PSBTs not compatible (different transactions)");
1614
1
    }
1615
1616
54
    DataStream ssTx{};
1617
54
    ssTx << *merged_psbt;
1618
54
    return EncodeBase64(ssTx);
1619
55
},
1620
2.36k
    };
1621
2.36k
}
1622
1623
static RPCMethod finalizepsbt()
1624
2.54k
{
1625
2.54k
    return RPCMethod{"finalizepsbt",
1626
2.54k
                "Finalize the inputs of a PSBT. If the transaction is fully signed, it will produce a\n"
1627
2.54k
                "network serialized transaction which can be broadcast with sendrawtransaction. Otherwise a PSBT will be\n"
1628
2.54k
                "created which has the final_scriptSig and final_scriptwitness fields filled for inputs that are complete.\n"
1629
2.54k
                "Implements the Finalizer and Extractor roles.\n",
1630
2.54k
                {
1631
2.54k
                    {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
1632
2.54k
                    {"extract", RPCArg::Type::BOOL, RPCArg::Default{true}, "If true and the transaction is complete,\n"
1633
2.54k
            "                             extract and return the complete transaction in normal network serialization instead of the PSBT."},
1634
2.54k
                },
1635
2.54k
                RPCResult{
1636
2.54k
                    RPCResult::Type::OBJ, "", "",
1637
2.54k
                    {
1638
2.54k
                        {RPCResult::Type::STR, "psbt", /*optional=*/true, "The base64-encoded partially signed transaction if not extracted"},
1639
2.54k
                        {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The hex-encoded network transaction if extracted"},
1640
2.54k
                        {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
1641
2.54k
                    }
1642
2.54k
                },
1643
2.54k
                RPCExamples{
1644
2.54k
                    HelpExampleCli("finalizepsbt", "\"psbt\"")
1645
2.54k
                },
1646
2.54k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1647
2.54k
{
1648
    // Unserialize the transactions
1649
230
    util::Result<PartiallySignedTransaction> psbt_res = DecodeBase64PSBT(request.params[0].get_str());
1650
230
    if (!psbt_res) {
1651
1
        throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
1652
1
    }
1653
229
    PartiallySignedTransaction psbtx = *psbt_res;
1654
1655
229
    bool extract = request.params[1].isNull() || (!request.params[1].isNull() && request.params[1].get_bool());
1656
1657
229
    CMutableTransaction mtx;
1658
229
    bool complete = FinalizeAndExtractPSBT(psbtx, mtx);
1659
1660
229
    UniValue result(UniValue::VOBJ);
1661
229
    DataStream ssTx{};
1662
229
    std::string result_str;
1663
1664
229
    if (complete && extract) {
1665
197
        ssTx << TX_WITH_WITNESS(mtx);
1666
197
        result_str = HexStr(ssTx);
1667
197
        result.pushKV("hex", result_str);
1668
197
    } else {
1669
32
        ssTx << psbtx;
1670
32
        result_str = EncodeBase64(ssTx.str());
1671
32
        result.pushKV("psbt", result_str);
1672
32
    }
1673
229
    result.pushKV("complete", complete);
1674
1675
229
    return result;
1676
230
},
1677
2.54k
    };
1678
2.54k
}
1679
1680
static RPCMethod createpsbt()
1681
2.37k
{
1682
2.37k
    return RPCMethod{
1683
2.37k
        "createpsbt",
1684
2.37k
        "Creates a transaction in the Partially Signed Transaction format.\n"
1685
2.37k
                "Implements the Creator role.\n"
1686
2.37k
                "Note that the transaction's inputs are not signed, and\n"
1687
2.37k
                "it is not stored in the wallet or transmitted to the network.\n",
1688
2.37k
                Cat<std::vector<RPCArg>>(
1689
2.37k
                    CreateTxDoc(),
1690
2.37k
                    {
1691
2.37k
                        {"psbt_version", RPCArg::Type::NUM, RPCArg::Default{2}, "The PSBT version number to use."},
1692
2.37k
                    }
1693
2.37k
                ),
1694
2.37k
                RPCResult{
1695
2.37k
                    RPCResult::Type::STR, "", "The resulting raw transaction (base64-encoded string)"
1696
2.37k
                },
1697
2.37k
                RPCExamples{
1698
2.37k
                    HelpExampleCli("createpsbt", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"address\\\":0.01}]\"")
1699
2.37k
                },
1700
2.37k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1701
2.37k
{
1702
66
    std::optional<bool> rbf;
1703
66
    if (!request.params[3].isNull()) {
1704
1
        rbf = request.params[3].get_bool();
1705
1
    }
1706
66
    CMutableTransaction rawTx = ConstructTransaction(request.params[0], request.params[1], request.params[2], rbf, self.Arg<uint32_t>("version"));
1707
1708
    // Make a blank psbt
1709
66
    uint32_t psbt_version = 2;
1710
66
    if (!request.params[5].isNull()) {
1711
9
        psbt_version = request.params[5].getInt<uint32_t>();
1712
9
    }
1713
66
    if (psbt_version != 2 && psbt_version != 0) {
1714
1
        throw JSONRPCError(RPC_INVALID_PARAMETER, "The PSBT version can only be 2 or 0");
1715
1
    }
1716
65
    PartiallySignedTransaction psbtx(rawTx, psbt_version);
1717
1718
    // Serialize the PSBT
1719
65
    DataStream ssTx{};
1720
65
    ssTx << psbtx;
1721
1722
65
    return EncodeBase64(ssTx);
1723
66
},
1724
2.37k
    };
1725
2.37k
}
1726
1727
static RPCMethod converttopsbt()
1728
2.32k
{
1729
2.32k
    return RPCMethod{
1730
2.32k
        "converttopsbt",
1731
2.32k
        "Converts a network serialized transaction to a PSBT. This should be used only with createrawtransaction and fundrawtransaction\n"
1732
2.32k
                "createpsbt and walletcreatefundedpsbt should be used for new applications.\n",
1733
2.32k
                {
1734
2.32k
                    {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of a raw transaction"},
1735
2.32k
                    {"permitsigdata", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, any signatures in the input will be discarded and conversion\n"
1736
2.32k
                            "                              will continue. If false, RPC will fail if any signatures are present."},
1737
2.32k
                    {"iswitness", RPCArg::Type::BOOL, RPCArg::DefaultHint{"depends on heuristic tests"}, "Whether the transaction hex is a serialized witness transaction.\n"
1738
2.32k
                        "If iswitness is not present, heuristic tests will be used in decoding.\n"
1739
2.32k
                        "If true, only witness deserialization will be tried.\n"
1740
2.32k
                        "If false, only non-witness deserialization will be tried.\n"
1741
2.32k
                        "This boolean should reflect whether the transaction has inputs\n"
1742
2.32k
                        "(e.g. fully valid, or on-chain transactions), if known by the caller."
1743
2.32k
                    },
1744
2.32k
                    {"psbt_version", RPCArg::Type::NUM, RPCArg::Default{2}, "The PSBT version number to use."},
1745
2.32k
                },
1746
2.32k
                RPCResult{
1747
2.32k
                    RPCResult::Type::STR, "", "The resulting raw transaction (base64-encoded string)"
1748
2.32k
                },
1749
2.32k
                RPCExamples{
1750
2.32k
                            "\nCreate a transaction\n"
1751
2.32k
                            + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"") +
1752
2.32k
                            "\nConvert the transaction to a PSBT\n"
1753
2.32k
                            + HelpExampleCli("converttopsbt", "\"rawtransaction\"")
1754
2.32k
                },
1755
2.32k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1756
2.32k
{
1757
    // parse hex string from parameter
1758
9
    CMutableTransaction tx;
1759
9
    bool permitsigdata = request.params[1].isNull() ? false : request.params[1].get_bool();
1760
9
    bool witness_specified = !request.params[2].isNull();
1761
9
    bool iswitness = witness_specified ? request.params[2].get_bool() : false;
1762
9
    const bool try_witness = witness_specified ? iswitness : true;
1763
9
    const bool try_no_witness = witness_specified ? !iswitness : true;
1764
9
    if (!DecodeHexTx(tx, request.params[0].get_str(), try_no_witness, try_witness)) {
1765
0
        throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
1766
0
    }
1767
1768
    // Remove all scriptSigs and scriptWitnesses from inputs
1769
9
    for (CTxIn& input : tx.vin) {
1770
9
        if ((!input.scriptSig.empty() || !input.scriptWitness.IsNull()) && !permitsigdata) {
1771
3
            throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Inputs must not have scriptSigs and scriptWitnesses");
1772
3
        }
1773
6
        input.scriptSig.clear();
1774
6
        input.scriptWitness.SetNull();
1775
6
    }
1776
1777
    // Make a blank psbt
1778
6
    uint32_t psbt_version = 2;
1779
6
    if (!request.params[3].isNull()) {
1780
3
        psbt_version = request.params[3].getInt<uint32_t>();
1781
3
    }
1782
6
    if (psbt_version != 2 && psbt_version != 0) {
1783
1
        throw JSONRPCError(RPC_INVALID_PARAMETER, "The PSBT version can only be 2 or 0");
1784
1
    }
1785
5
    PartiallySignedTransaction psbtx(tx, psbt_version);
1786
1787
    // Serialize the PSBT
1788
5
    DataStream ssTx{};
1789
5
    ssTx << psbtx;
1790
1791
5
    return EncodeBase64(ssTx);
1792
6
},
1793
2.32k
    };
1794
2.32k
}
1795
1796
static RPCMethod utxoupdatepsbt()
1797
2.31k
{
1798
2.31k
    return RPCMethod{
1799
2.31k
        "utxoupdatepsbt",
1800
2.31k
        "Updates all segwit inputs and outputs in a PSBT with data from output descriptors, the UTXO set, txindex, or the mempool.\n",
1801
2.31k
            {
1802
2.31k
                {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
1803
2.31k
                {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "An array of either strings or objects", {
1804
2.31k
                    {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "An output descriptor"},
1805
2.31k
                    {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with an output descriptor and extra information", {
1806
2.31k
                         {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
1807
2.31k
                         {"range", RPCArg::Type::RANGE, RPCArg::Default{1000}, "Up to what index HD chains should be explored (either end or [begin,end])"},
1808
2.31k
                    }},
1809
2.31k
                }},
1810
2.31k
            },
1811
2.31k
            RPCResult {
1812
2.31k
                    RPCResult::Type::STR, "", "The base64-encoded partially signed transaction with inputs updated"
1813
2.31k
            },
1814
2.31k
            RPCExamples {
1815
2.31k
                HelpExampleCli("utxoupdatepsbt", "\"psbt\"")
1816
2.31k
            },
1817
2.31k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1818
2.31k
{
1819
    // Parse descriptors, if any.
1820
5
    FlatSigningProvider provider;
1821
5
    if (!request.params[1].isNull()) {
1822
1
        auto descs = request.params[1].get_array();
1823
4
        for (size_t i = 0; i < descs.size(); ++i) {
1824
3
            EvalDescriptorStringOrObject(descs[i], provider);
1825
3
        }
1826
1
    }
1827
1828
    // We don't actually need private keys further on; hide them as a precaution.
1829
5
    const PartiallySignedTransaction& psbtx = ProcessPSBT(
1830
5
        request.params[0].get_str(),
1831
5
        request.context,
1832
5
        HidingSigningProvider(&provider, /*hide_secret=*/true, /*hide_origin=*/false),
1833
5
        /*sighash_type=*/std::nullopt,
1834
5
        /*finalize=*/false);
1835
1836
5
    DataStream ssTx{};
1837
5
    ssTx << psbtx;
1838
5
    return EncodeBase64(ssTx);
1839
5
},
1840
2.31k
    };
1841
2.31k
}
1842
1843
static RPCMethod joinpsbts()
1844
2.31k
{
1845
2.31k
    return RPCMethod{
1846
2.31k
        "joinpsbts",
1847
2.31k
        "Joins multiple distinct version 0 PSBTs with different inputs and outputs into one version 0 PSBT with inputs and outputs from all of the PSBTs\n"
1848
2.31k
            "No input in any of the PSBTs can be in more than one of the PSBTs.\n",
1849
2.31k
            {
1850
2.31k
                {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base64 strings of partially signed transactions",
1851
2.31k
                    {
1852
2.31k
                        {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}
1853
2.31k
                    }}
1854
2.31k
            },
1855
2.31k
            RPCResult {
1856
2.31k
                    RPCResult::Type::STR, "", "The base64-encoded partially signed transaction"
1857
2.31k
            },
1858
2.31k
            RPCExamples {
1859
2.31k
                HelpExampleCli("joinpsbts", "\"psbt\"")
1860
2.31k
            },
1861
2.31k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1862
2.31k
{
1863
    // Unserialize the transactions
1864
4
    std::vector<PartiallySignedTransaction> psbtxs;
1865
4
    UniValue txs = request.params[0].get_array();
1866
1867
4
    if (txs.size() <= 1) {
1868
0
        throw JSONRPCError(RPC_INVALID_PARAMETER, "At least two PSBTs are required to join PSBTs.");
1869
0
    }
1870
1871
4
    uint32_t best_version = 1;
1872
4
    uint32_t best_locktime = 0xffffffff;
1873
11
    for (unsigned int i = 0; i < txs.size(); ++i) {
1874
8
        util::Result<PartiallySignedTransaction> psbt_res = DecodeBase64PSBT(txs[i].get_str());
1875
8
        if (!psbt_res) {
1876
0
            throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
1877
0
        }
1878
8
        psbtxs.push_back(*psbt_res);
1879
8
        const PartiallySignedTransaction& psbtx = psbtxs.back();
1880
8
        if (psbtx.GetVersion() != 0) {
1881
1
            throw JSONRPCError(RPC_INVALID_PARAMETER, "joinpsbts only operates on version 0 PSBTs");
1882
1
        }
1883
        // Choose the highest version number
1884
7
        if (psbtx.tx_version > best_version) {
1885
4
            best_version = psbtx.tx_version;
1886
4
        }
1887
        // Choose the lowest lock time
1888
7
        uint32_t psbt_locktime = psbtx.fallback_locktime.value_or(0);
1889
7
        if (psbt_locktime < best_locktime) {
1890
4
            best_locktime = psbt_locktime;
1891
4
        }
1892
7
    }
1893
1894
    // Create a blank psbt where everything will be added
1895
3
    CMutableTransaction tx;
1896
3
    tx.version = best_version;
1897
3
    tx.nLockTime = best_locktime;
1898
3
    PartiallySignedTransaction merged_psbt(tx, psbtxs.at(0).GetVersion());
1899
1900
    // Merge
1901
6
    for (auto& psbt : psbtxs) {
1902
10
        for (const PSBTInput& input : psbt.inputs) {
1903
10
            if (!merged_psbt.AddInput(input)) {
1904
1
                throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Input %s:%d exists in multiple PSBTs", input.prev_txid.ToString(), input.prev_out));
1905
1
            }
1906
10
        }
1907
5
        for (const PSBTOutput& output : psbt.outputs) {
1908
5
            merged_psbt.AddOutput(output);
1909
5
        }
1910
5
        for (auto& xpub_pair : psbt.m_xpubs) {
1911
0
            if (!merged_psbt.m_xpubs.contains(xpub_pair.first)) {
1912
0
                merged_psbt.m_xpubs[xpub_pair.first] = xpub_pair.second;
1913
0
            } else {
1914
0
                merged_psbt.m_xpubs[xpub_pair.first].insert(xpub_pair.second.begin(), xpub_pair.second.end());
1915
0
            }
1916
0
        }
1917
5
        merged_psbt.unknown.insert(psbt.unknown.begin(), psbt.unknown.end());
1918
5
    }
1919
1920
    // Generate list of shuffled indices for shuffling inputs and outputs of the merged PSBT
1921
2
    std::vector<int> input_indices(merged_psbt.inputs.size());
1922
2
    std::iota(input_indices.begin(), input_indices.end(), 0);
1923
2
    std::vector<int> output_indices(merged_psbt.outputs.size());
1924
2
    std::iota(output_indices.begin(), output_indices.end(), 0);
1925
1926
    // Shuffle input and output indices lists
1927
2
    std::shuffle(input_indices.begin(), input_indices.end(), FastRandomContext());
1928
2
    std::shuffle(output_indices.begin(), output_indices.end(), FastRandomContext());
1929
1930
2
    PartiallySignedTransaction shuffled_psbt(tx, merged_psbt.GetVersion());
1931
8
    for (int i : input_indices) {
1932
8
        shuffled_psbt.AddInput(merged_psbt.inputs[i]);
1933
8
    }
1934
4
    for (int i : output_indices) {
1935
4
        shuffled_psbt.AddOutput(merged_psbt.outputs[i]);
1936
4
    }
1937
2
    shuffled_psbt.unknown.insert(merged_psbt.unknown.begin(), merged_psbt.unknown.end());
1938
1939
2
    DataStream ssTx{};
1940
2
    ssTx << shuffled_psbt;
1941
2
    return EncodeBase64(ssTx);
1942
3
},
1943
2.31k
    };
1944
2.31k
}
1945
1946
static RPCMethod analyzepsbt()
1947
2.32k
{
1948
2.32k
    return RPCMethod{
1949
2.32k
        "analyzepsbt",
1950
2.32k
        "Analyzes and provides information about the current status of a PSBT and its inputs\n",
1951
2.32k
            {
1952
2.32k
                {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}
1953
2.32k
            },
1954
2.32k
            RPCResult {
1955
2.32k
                RPCResult::Type::OBJ, "", "",
1956
2.32k
                {
1957
2.32k
                    {RPCResult::Type::ARR, "inputs", /*optional=*/true, "",
1958
2.32k
                    {
1959
2.32k
                        {RPCResult::Type::OBJ, "", "",
1960
2.32k
                        {
1961
2.32k
                            {RPCResult::Type::BOOL, "has_utxo", "Whether a UTXO is provided"},
1962
2.32k
                            {RPCResult::Type::BOOL, "is_final", "Whether the input is finalized"},
1963
2.32k
                            {RPCResult::Type::OBJ, "missing", /*optional=*/true, "Things that are missing that are required to complete this input",
1964
2.32k
                            {
1965
2.32k
                                {RPCResult::Type::ARR, "pubkeys", /*optional=*/true, "",
1966
2.32k
                                {
1967
2.32k
                                    {RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose BIP 32 derivation path is missing"},
1968
2.32k
                                }},
1969
2.32k
                                {RPCResult::Type::ARR, "signatures", /*optional=*/true, "",
1970
2.32k
                                {
1971
2.32k
                                    {RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose signature is missing"},
1972
2.32k
                                }},
1973
2.32k
                                {RPCResult::Type::STR_HEX, "redeemscript", /*optional=*/true, "Hash160 of the redeem script that is missing"},
1974
2.32k
                                {RPCResult::Type::STR_HEX, "witnessscript", /*optional=*/true, "SHA256 of the witness script that is missing"},
1975
2.32k
                            }},
1976
2.32k
                            {RPCResult::Type::STR, "next", /*optional=*/true, "Role of the next person that this input needs to go to"},
1977
2.32k
                        }},
1978
2.32k
                    }},
1979
2.32k
                    {RPCResult::Type::NUM, "estimated_vsize", /*optional=*/true, "Estimated vsize of the final signed transaction"},
1980
2.32k
                    {RPCResult::Type::STR_AMOUNT, "estimated_feerate", /*optional=*/true, "Estimated feerate of the final signed transaction in " + CURRENCY_UNIT + "/kvB. Shown only if all UTXO slots in the PSBT have been filled"},
1981
2.32k
                    {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid. Shown only if all UTXO slots in the PSBT have been filled"},
1982
2.32k
                    {RPCResult::Type::STR, "next", "Role of the next person that this psbt needs to go to"},
1983
2.32k
                    {RPCResult::Type::STR, "error", /*optional=*/true, "Error message (if there is one)"},
1984
2.32k
                }
1985
2.32k
            },
1986
2.32k
            RPCExamples {
1987
2.32k
                HelpExampleCli("analyzepsbt", "\"psbt\"")
1988
2.32k
            },
1989
2.32k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1990
2.32k
{
1991
    // Unserialize the transaction
1992
9
    util::Result<PartiallySignedTransaction> psbt_res = DecodeBase64PSBT(request.params[0].get_str());
1993
9
    if (!psbt_res) {
1994
1
        throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
1995
1
    }
1996
8
    const PartiallySignedTransaction& psbtx = *psbt_res;
1997
1998
8
    PSBTAnalysis psbta = AnalyzePSBT(psbtx);
1999
2000
8
    UniValue result(UniValue::VOBJ);
2001
8
    UniValue inputs_result(UniValue::VARR);
2002
8
    for (const auto& input : psbta.inputs) {
2003
6
        UniValue input_univ(UniValue::VOBJ);
2004
6
        UniValue missing(UniValue::VOBJ);
2005
2006
6
        input_univ.pushKV("has_utxo", input.has_utxo);
2007
6
        input_univ.pushKV("is_final", input.is_final);
2008
6
        input_univ.pushKV("next", PSBTRoleName(input.next));
2009
2010
6
        if (!input.missing_pubkeys.empty()) {
2011
0
            UniValue missing_pubkeys_univ(UniValue::VARR);
2012
0
            for (const CKeyID& pubkey : input.missing_pubkeys) {
2013
0
                missing_pubkeys_univ.push_back(HexStr(pubkey));
2014
0
            }
2015
0
            missing.pushKV("pubkeys", std::move(missing_pubkeys_univ));
2016
0
        }
2017
6
        if (!input.missing_redeem_script.IsNull()) {
2018
0
            missing.pushKV("redeemscript", HexStr(input.missing_redeem_script));
2019
0
        }
2020
6
        if (!input.missing_witness_script.IsNull()) {
2021
0
            missing.pushKV("witnessscript", HexStr(input.missing_witness_script));
2022
0
        }
2023
6
        if (!input.missing_sigs.empty()) {
2024
1
            UniValue missing_sigs_univ(UniValue::VARR);
2025
1
            for (const CKeyID& pubkey : input.missing_sigs) {
2026
1
                missing_sigs_univ.push_back(HexStr(pubkey));
2027
1
            }
2028
1
            missing.pushKV("signatures", std::move(missing_sigs_univ));
2029
1
        }
2030
6
        if (!missing.getKeys().empty()) {
2031
1
            input_univ.pushKV("missing", std::move(missing));
2032
1
        }
2033
6
        inputs_result.push_back(std::move(input_univ));
2034
6
    }
2035
8
    if (!inputs_result.empty()) result.pushKV("inputs", std::move(inputs_result));
2036
2037
8
    if (psbta.estimated_vsize != std::nullopt) {
2038
3
        result.pushKV("estimated_vsize", *psbta.estimated_vsize);
2039
3
    }
2040
8
    if (psbta.estimated_feerate != std::nullopt) {
2041
3
        result.pushKV("estimated_feerate", ValueFromAmount(psbta.estimated_feerate->GetFeePerK()));
2042
3
    }
2043
8
    if (psbta.fee != std::nullopt) {
2044
3
        result.pushKV("fee", ValueFromAmount(*psbta.fee));
2045
3
    }
2046
8
    result.pushKV("next", PSBTRoleName(psbta.next));
2047
8
    if (!psbta.error.empty()) {
2048
3
        result.pushKV("error", psbta.error);
2049
3
    }
2050
2051
8
    return result;
2052
9
},
2053
2.32k
    };
2054
2.32k
}
2055
2056
RPCMethod descriptorprocesspsbt()
2057
2.32k
{
2058
2.32k
    return RPCMethod{
2059
2.32k
        "descriptorprocesspsbt",
2060
2.32k
        "Update all segwit inputs in a PSBT with information from output descriptors, the UTXO set or the mempool. \n"
2061
2.32k
                "Then, sign the inputs we are able to with information from the output descriptors. ",
2062
2.32k
                {
2063
2.32k
                    {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction base64 string"},
2064
2.32k
                    {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::NO, "An array of either strings or objects", {
2065
2.32k
                        {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "An output descriptor"},
2066
2.32k
                        {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with an output descriptor and extra information", {
2067
2.32k
                             {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
2068
2.32k
                             {"range", RPCArg::Type::RANGE, RPCArg::Default{1000}, "Up to what index HD chains should be explored (either end or [begin,end])"},
2069
2.32k
                        }},
2070
2.32k
                    }},
2071
2.32k
                    {"sighashtype", RPCArg::Type::STR, RPCArg::Default{"DEFAULT for Taproot, ALL otherwise"}, "The signature hash type to sign with if not specified by the PSBT. Must be one of\n"
2072
2.32k
            "       \"DEFAULT\"\n"
2073
2.32k
            "       \"ALL\"\n"
2074
2.32k
            "       \"NONE\"\n"
2075
2.32k
            "       \"SINGLE\"\n"
2076
2.32k
            "       \"ALL|ANYONECANPAY\"\n"
2077
2.32k
            "       \"NONE|ANYONECANPAY\"\n"
2078
2.32k
            "       \"SINGLE|ANYONECANPAY\""},
2079
2.32k
                    {"bip32derivs", RPCArg::Type::BOOL, RPCArg::Default{true}, "Include BIP 32 derivation paths for public keys if we know them"},
2080
2.32k
                    {"finalize", RPCArg::Type::BOOL, RPCArg::Default{true}, "Also finalize inputs if possible"},
2081
2.32k
                },
2082
2.32k
                RPCResult{
2083
2.32k
                    RPCResult::Type::OBJ, "", "",
2084
2.32k
                    {
2085
2.32k
                        {RPCResult::Type::STR, "psbt", "The base64-encoded partially signed transaction"},
2086
2.32k
                        {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
2087
2.32k
                        {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The hex-encoded network transaction if complete"},
2088
2.32k
                    }
2089
2.32k
                },
2090
2.32k
                RPCExamples{
2091
2.32k
                    HelpExampleCli("descriptorprocesspsbt", "\"psbt\" \"[\\\"descriptor1\\\", \\\"descriptor2\\\"]\"") +
2092
2.32k
                    HelpExampleCli("descriptorprocesspsbt", "\"psbt\" \"[{\\\"desc\\\":\\\"mydescriptor\\\", \\\"range\\\":21}]\"")
2093
2.32k
                },
2094
2.32k
        [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
2095
2.32k
{
2096
    // Add descriptor information to a signing provider
2097
15
    FlatSigningProvider provider;
2098
2099
15
    auto descs = request.params[1].get_array();
2100
91
    for (size_t i = 0; i < descs.size(); ++i) {
2101
76
        EvalDescriptorStringOrObject(descs[i], provider, /*expand_priv=*/true);
2102
76
    }
2103
2104
15
    std::optional<int> sighash_type = ParseSighashString(request.params[2]);
2105
15
    bool bip32derivs = request.params[3].isNull() ? true : request.params[3].get_bool();
2106
15
    bool finalize = request.params[4].isNull() ? true : request.params[4].get_bool();
2107
2108
15
    const PartiallySignedTransaction& psbtx = ProcessPSBT(
2109
15
        request.params[0].get_str(),
2110
15
        request.context,
2111
15
        HidingSigningProvider(&provider, /*hide_secret=*/false, !bip32derivs),
2112
15
        sighash_type,
2113
15
        finalize);
2114
2115
    // Check whether or not all of the inputs are now signed
2116
15
    bool complete = true;
2117
15
    for (const auto& input : psbtx.inputs) {
2118
8
        complete &= PSBTInputSigned(input);
2119
8
    }
2120
2121
15
    DataStream ssTx{};
2122
15
    ssTx << psbtx;
2123
2124
15
    UniValue result(UniValue::VOBJ);
2125
2126
15
    result.pushKV("psbt", EncodeBase64(ssTx));
2127
15
    result.pushKV("complete", complete);
2128
15
    if (complete) {
2129
2
        CMutableTransaction mtx;
2130
2
        PartiallySignedTransaction psbtx_copy = psbtx;
2131
2
        CHECK_NONFATAL(FinalizeAndExtractPSBT(psbtx_copy, mtx));
2132
2
        DataStream ssTx_final;
2133
2
        ssTx_final << TX_WITH_WITNESS(mtx);
2134
2
        result.pushKV("hex", HexStr(ssTx_final));
2135
2
    }
2136
15
    return result;
2137
15
},
2138
2.32k
    };
2139
2.32k
}
2140
2141
void RegisterRawTransactionRPCCommands(CRPCTable& t)
2142
1.26k
{
2143
1.26k
    static const CRPCCommand commands[]{
2144
1.26k
        {"rawtransactions", &getrawtransaction},
2145
1.26k
        {"rawtransactions", &createrawtransaction},
2146
1.26k
        {"rawtransactions", &decoderawtransaction},
2147
1.26k
        {"rawtransactions", &decodescript},
2148
1.26k
        {"rawtransactions", &combinerawtransaction},
2149
1.26k
        {"rawtransactions", &signrawtransactionwithkey},
2150
1.26k
        {"rawtransactions", &decodepsbt},
2151
1.26k
        {"rawtransactions", &combinepsbt},
2152
1.26k
        {"rawtransactions", &finalizepsbt},
2153
1.26k
        {"rawtransactions", &createpsbt},
2154
1.26k
        {"rawtransactions", &converttopsbt},
2155
1.26k
        {"rawtransactions", &utxoupdatepsbt},
2156
1.26k
        {"rawtransactions", &descriptorprocesspsbt},
2157
1.26k
        {"rawtransactions", &joinpsbts},
2158
1.26k
        {"rawtransactions", &analyzepsbt},
2159
1.26k
    };
2160
18.9k
    for (const auto& c : commands) {
2161
18.9k
        t.appendCommand(c.name, &c);
2162
18.9k
    }
2163
1.26k
}