Coverage Report

Created: 2026-04-29 19:21

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