Coverage Report

Created: 2026-07-29 23:27

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