Coverage Report

Created: 2026-07-23 20:35

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