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