Coverage Report

Created: 2026-05-30 09:47

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