Coverage Report

Created: 2026-09-14 20:36

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