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