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
608 // Can't merge < 2 items
609 if (txs.size() < 2) {
610 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Missing transactions. At least two transactions required.");
611 }
612
613 std::vector<CMutableTransaction> txVariants(txs.size());
614
615 for (unsigned int idx = 0; idx < txs.size(); idx++) {
616 if (!DecodeHexTx(txVariants[idx], txs[idx].get_str())) {
617 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed for tx %d. Make sure the tx has at least one input.", idx));
618 }
619 }
620
621 { // Test Tx relation for mergeability. Strip scriptSigs and scriptWitnesses to facilitate txId comparison
622 std::vector<CMutableTransaction> tx_variants_copy(txVariants);
623 Txid first_txid{};
624 for (unsigned int k{0}; k < tx_variants_copy.size(); ++k) {
625 // Remove all scriptSigs and scriptWitnesses from inputs
626 for (CTxIn& input : tx_variants_copy[k].vin) {
627 input.scriptSig.clear();
628 input.scriptWitness.SetNull();
629 }
630 if (k == 0) {
631 first_txid = tx_variants_copy[k].GetHash();
632 } else if (first_txid != tx_variants_copy[k].GetHash()) {
633 throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Transaction number %d not compatible with first transaction", k+1));
634 }
635 }
636 }
637
638 // mergedTx will end up with all the signatures; it
639 // starts as a clone of the rawtx:
640 CMutableTransaction mergedTx(txVariants[0]);
641
642 // Fetch previous transactions (inputs):
644 {
645 NodeContext& node = EnsureAnyNodeContext(request.context);
646 const CTxMemPool& mempool = EnsureMemPool(node);
648 LOCK2(cs_main, mempool.cs);
649 CCoinsViewCache &viewChain = chainman.ActiveChainstate().CoinsTip();
650 CCoinsViewMemPool viewMempool(&viewChain, mempool);
651 view.SetBackend(viewMempool); // temporarily switch cache backend to db+mempool view
652
653 for (const CTxIn& txin : mergedTx.vin) {
654 view.AccessCoin(txin.prevout); // Load entries from viewChain into view; can fail.
655 }
656
657 view.SetBackend(CoinsViewEmpty::Get()); // switch back to avoid locking mempool for too long
658 }
659
660 // Use CTransaction for the constant parts of the
661 // transaction to avoid rehashing.
662 const CTransaction txConst(mergedTx);
663 // Sign what we can:
664 for (unsigned int i = 0; i < mergedTx.vin.size(); i++) {
665 CTxIn& txin = mergedTx.vin[i];
666 const Coin& coin = view.AccessCoin(txin.prevout);
667 if (coin.IsSpent()) {
668 throw JSONRPCError(RPC_VERIFY_ERROR, "Input not found or already spent");
669 }
670 SignatureData sigdata;
671
672 // ... and merge in other signatures:
673 for (const CMutableTransaction& txv : txVariants) {
674 if (txv.vin.size() > i) {
675 sigdata.MergeSignatureData(DataFromTransaction(txv, i, coin.out));
676 }
677 }
678 ProduceSignature(DUMMY_SIGNING_PROVIDER, MutableTransactionSignatureCreator(mergedTx, i, coin.out.nValue, {.sighash_type = SIGHASH_ALL}), coin.out.scriptPubKey, sigdata);
679
680 UpdateInput(txin, sigdata);
681 }
682
683 return EncodeHexTx(CTransaction(mergedTx));
684},
685 };
686}
687
689{
690 return RPCMethod{
691 "signrawtransactionwithkey",
692 "Sign inputs for raw transaction (serialized, hex-encoded).\n"
693 "The second argument is an array of base58-encoded private\n"
694 "keys that will be the only keys used to sign the transaction.\n"
695 "The third optional argument (may be null) is an array of previous transaction outputs that\n"
696 "this transaction depends on but may not yet be in the block chain.\n",
697 {
698 {"hexstring", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction hex string"},
699 {"privkeys", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base58-encoded private keys for signing",
700 {
701 {"privatekey", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "private key in base58-encoding"},
702 },
703 },
704 {"prevtxs", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "The previous dependent transaction outputs",
705 {
707 {
708 {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
709 {"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"},
710 {"scriptPubKey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "output script"},
711 {"redeemScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2SH) redeem script"},
712 {"witnessScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2WSH or P2SH-P2WSH) witness script"},
713 {"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "(required for Segwit inputs) the amount spent"},
714 },
715 },
716 },
717 },
718 {"sighashtype", RPCArg::Type::STR, RPCArg::Default{"DEFAULT for Taproot, ALL otherwise"}, "The signature hash type. Must be one of:\n"
719 " \"DEFAULT\"\n"
720 " \"ALL\"\n"
721 " \"NONE\"\n"
722 " \"SINGLE\"\n"
723 " \"ALL|ANYONECANPAY\"\n"
724 " \"NONE|ANYONECANPAY\"\n"
725 " \"SINGLE|ANYONECANPAY\"\n"
726 },
727 },
728 RPCResult{
729 RPCResult::Type::OBJ, "", "",
730 {
731 {RPCResult::Type::STR_HEX, "hex", "The hex-encoded raw transaction with signature(s)"},
732 {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
733 {RPCResult::Type::ARR, "errors", /*optional=*/true, "Script verification errors (if there are any)",
734 {
735 {RPCResult::Type::OBJ, "", "",
736 {
737 {RPCResult::Type::STR_HEX, "txid", "The hash of the referenced, previous transaction"},
738 {RPCResult::Type::NUM, "vout", "The index of the output to spent and used as input"},
739 {RPCResult::Type::ARR, "witness", "",
740 {
741 {RPCResult::Type::STR_HEX, "witness", ""},
742 }},
743 {RPCResult::Type::STR_HEX, "scriptSig", "The hex-encoded signature script"},
744 {RPCResult::Type::NUM, "sequence", "Script sequence number"},
745 {RPCResult::Type::STR, "error", "Verification or signing error related to the input"},
746 }},
747 }},
748 }
749 },
751 HelpExampleCli("signrawtransactionwithkey", "\"myhex\" \"[\\\"key1\\\",\\\"key2\\\"]\"")
752 + HelpExampleRpc("signrawtransactionwithkey", "\"myhex\", \"[\\\"key1\\\",\\\"key2\\\"]\"")
753 },
754 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
755{
757 if (!DecodeHexTx(mtx, request.params[0].get_str())) {
758 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed. Make sure the tx has at least one input.");
759 }
760
761 FlatSigningProvider keystore;
762 const UniValue& keys = request.params[1].get_array();
763 for (unsigned int idx = 0; idx < keys.size(); ++idx) {
764 UniValue k = keys[idx];
765 CKey key = DecodeSecret(k.get_str());
766 if (!key.IsValid()) {
767 throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
768 }
769
770 CPubKey pubkey = key.GetPubKey();
771 CKeyID key_id = pubkey.GetID();
772 keystore.pubkeys.emplace(key_id, pubkey);
773 keystore.keys.emplace(key_id, key);
774 }
775
776 // Fetch previous transactions (inputs):
777 std::map<COutPoint, Coin> coins;
778 for (const CTxIn& txin : mtx.vin) {
779 coins[txin.prevout]; // Create empty map entry keyed by prevout.
780 }
781 NodeContext& node = EnsureAnyNodeContext(request.context);
782 FindCoins(node, coins);
783
784 // Parse the prevtxs array
785 ParsePrevouts(request.params[2], &keystore, coins);
786
787 UniValue result(UniValue::VOBJ);
788 SignTransaction(mtx, &keystore, coins, request.params[3], result);
789 return result;
790},
791 };
792}
793
795{
796 static const RPCResult decodepsbt_inputs{
797 RPCResult::Type::ARR, "inputs", "",
798 {
799 {RPCResult::Type::OBJ, "", "",
800 {
801 {RPCResult::Type::OBJ, "non_witness_utxo", /*optional=*/true, "Decoded network transaction for non-witness UTXOs",
802 TxDoc({.elision_description="The layout is the same as the output of decoderawtransaction."})
803 },
804 {RPCResult::Type::OBJ, "witness_utxo", /*optional=*/true, "Transaction output for witness UTXOs",
805 {
806 {RPCResult::Type::NUM, "amount", "The value in " + CURRENCY_UNIT},
807 {RPCResult::Type::OBJ, "scriptPubKey", "",
808 {
809 {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
810 {RPCResult::Type::STR, "desc", "Inferred descriptor for the output"},
811 {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
812 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
813 {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
814 }},
815 }},
816 {RPCResult::Type::OBJ_DYN, "partial_signatures", /*optional=*/true, "",
817 {
818 {RPCResult::Type::STR, "pubkey", "The public key and signature that corresponds to it."},
819 }},
820 {RPCResult::Type::STR, "sighash", /*optional=*/true, "The sighash type to be used"},
821 {RPCResult::Type::OBJ, "redeem_script", /*optional=*/true, "",
822 {
823 {RPCResult::Type::STR, "asm", "Disassembly of the redeem script"},
824 {RPCResult::Type::STR_HEX, "hex", "The raw redeem script bytes, hex-encoded"},
825 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
826 }},
827 {RPCResult::Type::OBJ, "witness_script", /*optional=*/true, "",
828 {
829 {RPCResult::Type::STR, "asm", "Disassembly of the witness script"},
830 {RPCResult::Type::STR_HEX, "hex", "The raw witness script bytes, hex-encoded"},
831 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
832 }},
833 {RPCResult::Type::ARR, "bip32_derivs", /*optional=*/true, "",
834 {
835 {RPCResult::Type::OBJ, "", "",
836 {
837 {RPCResult::Type::STR, "pubkey", "The public key with the derivation path as the value."},
838 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
839 {RPCResult::Type::STR, "path", "The path"},
840 }},
841 }},
842 {RPCResult::Type::OBJ, "final_scriptSig", /*optional=*/true, "",
843 {
844 {RPCResult::Type::STR, "asm", "Disassembly of the final signature script"},
845 {RPCResult::Type::STR_HEX, "hex", "The raw final signature script bytes, hex-encoded"},
846 }},
847 {RPCResult::Type::ARR, "final_scriptwitness", /*optional=*/true, "",
848 {
849 {RPCResult::Type::STR_HEX, "", "hex-encoded witness data (if any)"},
850 }},
851 {RPCResult::Type::OBJ_DYN, "ripemd160_preimages", /*optional=*/ true, "",
852 {
853 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
854 }},
855 {RPCResult::Type::OBJ_DYN, "sha256_preimages", /*optional=*/ true, "",
856 {
857 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
858 }},
859 {RPCResult::Type::OBJ_DYN, "hash160_preimages", /*optional=*/ true, "",
860 {
861 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
862 }},
863 {RPCResult::Type::OBJ_DYN, "hash256_preimages", /*optional=*/ true, "",
864 {
865 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
866 }},
867 {RPCResult::Type::STR_HEX, "previous_txid", /*optional=*/true, "TXID of the transaction containing the output being spent by this input"},
868 {RPCResult::Type::NUM, "previous_vout", /*optional=*/true, "Index of the output being spent"},
869 {RPCResult::Type::NUM, "sequence", /*optional=*/true, "Sequence number for this input"},
870 {RPCResult::Type::NUM, "time_locktime", /*optional=*/true, "Time-based locktime required for this input"},
871 {RPCResult::Type::NUM, "height_locktime", /*optional=*/true, "Height-based locktime required for this input"},
872 {RPCResult::Type::STR_HEX, "taproot_key_path_sig", /*optional=*/ true, "hex-encoded signature for the Taproot key path spend"},
873 {RPCResult::Type::ARR, "taproot_script_path_sigs", /*optional=*/ true, "",
874 {
875 {RPCResult::Type::OBJ, "signature", /*optional=*/ true, "The signature for the pubkey and leaf hash combination",
876 {
877 {RPCResult::Type::STR, "pubkey", "The x-only pubkey for this signature"},
878 {RPCResult::Type::STR, "leaf_hash", "The leaf hash for this signature"},
879 {RPCResult::Type::STR, "sig", "The signature itself"},
880 }},
881 }},
882 {RPCResult::Type::ARR, "taproot_scripts", /*optional=*/ true, "",
883 {
884 {RPCResult::Type::OBJ, "", "",
885 {
886 {RPCResult::Type::STR_HEX, "script", "A leaf script"},
887 {RPCResult::Type::NUM, "leaf_ver", "The version number for the leaf script"},
888 {RPCResult::Type::ARR, "control_blocks", "The control blocks for this script",
889 {
890 {RPCResult::Type::STR_HEX, "control_block", "A hex-encoded control block for this script"},
891 }},
892 }},
893 }},
894 {RPCResult::Type::ARR, "taproot_bip32_derivs", /*optional=*/ true, "",
895 {
896 {RPCResult::Type::OBJ, "", "",
897 {
898 {RPCResult::Type::STR, "pubkey", "The x-only public key this path corresponds to"},
899 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
900 {RPCResult::Type::STR, "path", "The path"},
901 {RPCResult::Type::ARR, "leaf_hashes", "The hashes of the leaves this pubkey appears in",
902 {
903 {RPCResult::Type::STR_HEX, "hash", "The hash of a leaf this pubkey appears in"},
904 }},
905 }},
906 }},
907 {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"},
908 {RPCResult::Type::STR_HEX, "taproot_merkle_root", /*optional=*/ true, "The hex-encoded Taproot merkle root"},
909 {RPCResult::Type::ARR, "musig2_participant_pubkeys", /*optional=*/true, "",
910 {
911 {RPCResult::Type::OBJ, "", "",
912 {
913 {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which the participants create."},
914 {RPCResult::Type::ARR, "participant_pubkeys", "",
915 {
916 {RPCResult::Type::STR_HEX, "pubkey", "The compressed public keys that are aggregated for aggregate_pubkey."},
917 }},
918 }},
919 }},
920 {RPCResult::Type::ARR, "musig2_pubnonces", /*optional=*/true, "",
921 {
922 {RPCResult::Type::OBJ, "", "",
923 {
924 {RPCResult::Type::STR_HEX, "participant_pubkey", "The compressed public key of the participant that created this pubnonce."},
925 {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which this pubnonce is for."},
926 {RPCResult::Type::STR_HEX, "leaf_hash", /*optional=*/true, "The hash of the leaf script that contains the aggregate pubkey being signed for. Omitted when signing for the internal key."},
927 {RPCResult::Type::STR_HEX, "pubnonce", "The public nonce itself."},
928 }},
929 }},
930 {RPCResult::Type::ARR, "musig2_partial_sigs", /*optional=*/true, "",
931 {
932 {RPCResult::Type::OBJ, "", "",
933 {
934 {RPCResult::Type::STR_HEX, "participant_pubkey", "The compressed public key of the participant that created this partial signature."},
935 {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which this partial signature is for."},
936 {RPCResult::Type::STR_HEX, "leaf_hash", /*optional=*/true, "The hash of the leaf script that contains the aggregate pubkey being signed for. Omitted when signing for the internal key."},
937 {RPCResult::Type::STR_HEX, "partial_sig", "The partial signature itself."},
938 }},
939 }},
940 {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/ true, "The unknown input fields",
941 {
942 {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
943 }},
944 {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The input proprietary map",
945 {
946 {RPCResult::Type::OBJ, "", "",
947 {
948 {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
949 {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
950 {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
951 {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
952 }},
953 }},
954 }},
955 }
956 };
957 return decodepsbt_inputs;
958}
959
961{
962 static const RPCResult decodepsbt_outputs{
963 RPCResult::Type::ARR, "outputs", "",
964 {
965 {RPCResult::Type::OBJ, "", "",
966 {
967 {RPCResult::Type::OBJ, "redeem_script", /*optional=*/true, "",
968 {
969 {RPCResult::Type::STR, "asm", "Disassembly of the redeem script"},
970 {RPCResult::Type::STR_HEX, "hex", "The raw redeem script bytes, hex-encoded"},
971 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
972 }},
973 {RPCResult::Type::OBJ, "witness_script", /*optional=*/true, "",
974 {
975 {RPCResult::Type::STR, "asm", "Disassembly of the witness script"},
976 {RPCResult::Type::STR_HEX, "hex", "The raw witness script bytes, hex-encoded"},
977 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
978 }},
979 {RPCResult::Type::ARR, "bip32_derivs", /*optional=*/true, "",
980 {
981 {RPCResult::Type::OBJ, "", "",
982 {
983 {RPCResult::Type::STR, "pubkey", "The public key this path corresponds to"},
984 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
985 {RPCResult::Type::STR, "path", "The path"},
986 }},
987 }},
988 {RPCResult::Type::NUM, "amount", /* optional=*/ true, "The amount (nValue) for this output"},
989 {RPCResult::Type::OBJ, "script", /* optional=*/ true, "The output script (scriptPubKey) for this output",
990 {{RPCResult::Type::ELISION, "", "The layout is the same as the output of scriptPubKeys in decoderawtransaction."}},
991 },
992 {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"},
993 {RPCResult::Type::ARR, "taproot_tree", /*optional=*/ true, "The tuples that make up the Taproot tree, in depth first search order",
994 {
995 {RPCResult::Type::OBJ, "tuple", /*optional=*/ true, "A single leaf script in the taproot tree",
996 {
997 {RPCResult::Type::NUM, "depth", "The depth of this element in the tree"},
998 {RPCResult::Type::NUM, "leaf_ver", "The version of this leaf"},
999 {RPCResult::Type::STR, "script", "The hex-encoded script itself"},
1000 }},
1001 }},
1002 {RPCResult::Type::ARR, "taproot_bip32_derivs", /*optional=*/ true, "",
1003 {
1004 {RPCResult::Type::OBJ, "", "",
1005 {
1006 {RPCResult::Type::STR, "pubkey", "The x-only public key this path corresponds to"},
1007 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
1008 {RPCResult::Type::STR, "path", "The path"},
1009 {RPCResult::Type::ARR, "leaf_hashes", "The hashes of the leaves this pubkey appears in",
1010 {
1011 {RPCResult::Type::STR_HEX, "hash", "The hash of a leaf this pubkey appears in"},
1012 }},
1013 }},
1014 }},
1015 {RPCResult::Type::ARR, "musig2_participant_pubkeys", /*optional=*/true, "",
1016 {
1017 {RPCResult::Type::OBJ, "", "",
1018 {
1019 {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which the participants create."},
1020 {RPCResult::Type::ARR, "participant_pubkeys", "",
1021 {
1022 {RPCResult::Type::STR_HEX, "pubkey", "The compressed public keys that are aggregated for aggregate_pubkey."},
1023 }},
1024 }},
1025 }},
1026 {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/true, "The unknown output fields",
1027 {
1028 {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
1029 }},
1030 {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The output proprietary map",
1031 {
1032 {RPCResult::Type::OBJ, "", "",
1033 {
1034 {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
1035 {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
1036 {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
1037 {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
1038 }},
1039 }},
1040 }},
1041 }
1042 };
1043 return decodepsbt_outputs;
1044}
1045
1047{
1048 return RPCMethod{
1049 "decodepsbt",
1050 "Return a JSON object representing the serialized, base64-encoded partially signed Bitcoin transaction.",
1051 {
1052 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The PSBT base64 string"},
1053 },
1054 RPCResult{
1055 RPCResult::Type::OBJ, "", "",
1056 {
1057 {RPCResult::Type::OBJ, "tx", /*optional=*/true, "The decoded network-serialized unsigned transaction.",
1058 TxDoc({.elision_description="The layout is the same as the output of decoderawtransaction."})
1059 },
1060 {RPCResult::Type::ARR, "global_xpubs", "",
1061 {
1062 {RPCResult::Type::OBJ, "", "",
1063 {
1064 {RPCResult::Type::STR, "xpub", "The extended public key this path corresponds to"},
1065 {RPCResult::Type::STR_HEX, "master_fingerprint", "The fingerprint of the master key"},
1066 {RPCResult::Type::STR, "path", "The path"},
1067 }},
1068 }},
1069 {RPCResult::Type::NUM, "tx_version", /* optional */ true, "The version number of the unsigned transaction. Not to be confused with PSBT version"},
1070 {RPCResult::Type::NUM, "fallback_locktime", /* optional */ true, "The locktime to fallback to if no inputs specify a required locktime."},
1071 {RPCResult::Type::NUM, "input_count", /* optional */ true, "The number of inputs in this psbt"},
1072 {RPCResult::Type::NUM, "output_count", /* optional */ true, "The number of outputs in this psbt."},
1073 {RPCResult::Type::BOOL, "inputs_modifiable", /* optional */ true, "Whether inputs can be modified"},
1074 {RPCResult::Type::BOOL, "outputs_modifiable", /* optional */ true, "Whether outputs can be modified"},
1075 {RPCResult::Type::BOOL, "has_sighash_single", /* optional */ true, "Whether this PSBT has SIGHASH_SINGLE inputs"},
1076 {RPCResult::Type::NUM, "psbt_version", /* optional */ true, "The PSBT version number. Not to be confused with the unsigned transaction version"},
1077 {RPCResult::Type::ARR, "proprietary", "The global proprietary map",
1078 {
1079 {RPCResult::Type::OBJ, "", "",
1080 {
1081 {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
1082 {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
1083 {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
1084 {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
1085 }},
1086 }},
1087 {RPCResult::Type::OBJ_DYN, "unknown", "The unknown global fields",
1088 {
1089 {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
1090 }},
1093 {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid if all UTXOs slots in the PSBT have been filled."},
1094 }
1095 },
1097 HelpExampleCli("decodepsbt", "\"psbt\"")
1098 },
1099 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1100{
1101 // Unserialize the transactions
1102 util::Result<PartiallySignedTransaction> psbt_res = DecodeBase64PSBT(request.params[0].get_str());
1103 if (!psbt_res) {
1104 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
1105 }
1106 PartiallySignedTransaction psbtx = *psbt_res;
1107
1108 UniValue result(UniValue::VOBJ);
1109
1110 if (psbtx.GetVersion() < 2) {
1111 // Add the decoded tx
1112 UniValue tx_univ(UniValue::VOBJ);
1113 TxToUniv(CTransaction(*CHECK_NONFATAL(psbtx.GetUnsignedTx())), /*block_hash=*/uint256(), /*entry=*/tx_univ, /*include_hex=*/false);
1114 result.pushKV("tx", std::move(tx_univ));
1115 }
1116
1117 // Add the global xpubs
1118 UniValue global_xpubs(UniValue::VARR);
1119 for (std::pair<KeyOriginInfo, std::set<CExtPubKey>> xpub_pair : psbtx.m_xpubs) {
1120 for (auto& xpub : xpub_pair.second) {
1121 std::vector<unsigned char> ser_xpub;
1122 ser_xpub.assign(BIP32_EXTKEY_WITH_VERSION_SIZE, 0);
1123 xpub.EncodeWithVersion(ser_xpub.data());
1124
1125 UniValue keypath(UniValue::VOBJ);
1126 keypath.pushKV("xpub", EncodeBase58Check(ser_xpub));
1127 keypath.pushKV("master_fingerprint", HexStr(std::span<unsigned char>(xpub_pair.first.fingerprint, xpub_pair.first.fingerprint + 4)));
1128 keypath.pushKV("path", WriteHDKeypath(xpub_pair.first.path));
1129 global_xpubs.push_back(std::move(keypath));
1130 }
1131 }
1132 result.pushKV("global_xpubs", std::move(global_xpubs));
1133
1134 // Add PSBTv2 stuff
1135 if (psbtx.GetVersion() >= 2) {
1136 result.pushKV("tx_version", psbtx.tx_version);
1137 if (psbtx.fallback_locktime.has_value()) {
1138 result.pushKV("fallback_locktime", static_cast<uint64_t>(*psbtx.fallback_locktime));
1139 }
1140 result.pushKV("input_count", (uint64_t)psbtx.inputs.size());
1141 result.pushKV("output_count", (uint64_t)psbtx.outputs.size());
1142 if (psbtx.m_tx_modifiable.has_value()) {
1143 result.pushKV("inputs_modifiable", psbtx.m_tx_modifiable->test(0));
1144 result.pushKV("outputs_modifiable", psbtx.m_tx_modifiable->test(1));
1145 result.pushKV("has_sighash_single", psbtx.m_tx_modifiable->test(2));
1146 }
1147 }
1148
1149 // PSBT version
1150 result.pushKV("psbt_version", psbtx.GetVersion());
1151
1152 // Proprietary
1153 UniValue proprietary(UniValue::VARR);
1154 for (const auto& entry : psbtx.m_proprietary) {
1155 UniValue this_prop(UniValue::VOBJ);
1156 this_prop.pushKV("identifier", HexStr(entry.identifier));
1157 this_prop.pushKV("subtype", entry.subtype);
1158 this_prop.pushKV("key", HexStr(entry.key));
1159 this_prop.pushKV("value", HexStr(entry.value));
1160 proprietary.push_back(std::move(this_prop));
1161 }
1162 result.pushKV("proprietary", std::move(proprietary));
1163
1164 // Unknown data
1165 UniValue unknowns(UniValue::VOBJ);
1166 for (auto entry : psbtx.unknown) {
1167 unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1168 }
1169 result.pushKV("unknown", std::move(unknowns));
1170
1171 // inputs
1172 CAmount total_in = 0;
1173 bool have_all_utxos = true;
1174 UniValue inputs(UniValue::VARR);
1175 for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
1176 const PSBTInput& input = psbtx.inputs[i];
1178 // UTXOs
1179 bool have_a_utxo = false;
1180 CTxOut txout;
1181 if (!input.witness_utxo.IsNull()) {
1182 txout = input.witness_utxo;
1183
1185 ScriptToUniv(txout.scriptPubKey, /*out=*/o, /*include_hex=*/true, /*include_address=*/true);
1186
1188 out.pushKV("amount", ValueFromAmount(txout.nValue));
1189 out.pushKV("scriptPubKey", std::move(o));
1190
1191 in.pushKV("witness_utxo", std::move(out));
1192
1193 have_a_utxo = true;
1194 }
1195 if (input.non_witness_utxo) {
1196 txout = input.non_witness_utxo->vout[input.prev_out];
1197
1198 UniValue non_wit(UniValue::VOBJ);
1199 TxToUniv(*input.non_witness_utxo, /*block_hash=*/uint256(), /*entry=*/non_wit, /*include_hex=*/false);
1200 in.pushKV("non_witness_utxo", std::move(non_wit));
1201
1202 have_a_utxo = true;
1203 }
1204 if (have_a_utxo) {
1205 if (MoneyRange(txout.nValue) && MoneyRange(total_in + txout.nValue)) {
1206 total_in += txout.nValue;
1207 } else {
1208 // Hack to just not show fee later
1209 have_all_utxos = false;
1210 }
1211 } else {
1212 have_all_utxos = false;
1213 }
1214
1215 // Partial sigs
1216 if (!input.partial_sigs.empty()) {
1217 UniValue partial_sigs(UniValue::VOBJ);
1218 for (const auto& sig : input.partial_sigs) {
1219 partial_sigs.pushKV(HexStr(sig.second.first), HexStr(sig.second.second));
1220 }
1221 in.pushKV("partial_signatures", std::move(partial_sigs));
1222 }
1223
1224 // Sighash
1225 if (input.sighash_type != std::nullopt) {
1226 in.pushKV("sighash", SighashToStr((unsigned char)*input.sighash_type));
1227 }
1228
1229 // Redeem script and witness script
1230 if (!input.redeem_script.empty()) {
1232 ScriptToUniv(input.redeem_script, /*out=*/r);
1233 in.pushKV("redeem_script", std::move(r));
1234 }
1235 if (!input.witness_script.empty()) {
1237 ScriptToUniv(input.witness_script, /*out=*/r);
1238 in.pushKV("witness_script", std::move(r));
1239 }
1240
1241 // keypaths
1242 if (!input.hd_keypaths.empty()) {
1243 UniValue keypaths(UniValue::VARR);
1244 for (auto entry : input.hd_keypaths) {
1245 UniValue keypath(UniValue::VOBJ);
1246 keypath.pushKV("pubkey", HexStr(entry.first));
1247
1248 keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint)));
1249 keypath.pushKV("path", WriteHDKeypath(entry.second.path));
1250 keypaths.push_back(std::move(keypath));
1251 }
1252 in.pushKV("bip32_derivs", std::move(keypaths));
1253 }
1254
1255 // Final scriptSig and scriptwitness
1256 if (!input.final_script_sig.empty()) {
1257 UniValue scriptsig(UniValue::VOBJ);
1258 scriptsig.pushKV("asm", ScriptToAsmStr(input.final_script_sig, true));
1259 scriptsig.pushKV("hex", HexStr(input.final_script_sig));
1260 in.pushKV("final_scriptSig", std::move(scriptsig));
1261 }
1262 if (!input.final_script_witness.IsNull()) {
1263 UniValue txinwitness(UniValue::VARR);
1264 for (const auto& item : input.final_script_witness.stack) {
1265 txinwitness.push_back(HexStr(item));
1266 }
1267 in.pushKV("final_scriptwitness", std::move(txinwitness));
1268 }
1269
1270 // Ripemd160 hash preimages
1271 if (!input.ripemd160_preimages.empty()) {
1272 UniValue ripemd160_preimages(UniValue::VOBJ);
1273 for (const auto& [hash, preimage] : input.ripemd160_preimages) {
1274 ripemd160_preimages.pushKV(HexStr(hash), HexStr(preimage));
1275 }
1276 in.pushKV("ripemd160_preimages", std::move(ripemd160_preimages));
1277 }
1278
1279 // Sha256 hash preimages
1280 if (!input.sha256_preimages.empty()) {
1281 UniValue sha256_preimages(UniValue::VOBJ);
1282 for (const auto& [hash, preimage] : input.sha256_preimages) {
1283 sha256_preimages.pushKV(HexStr(hash), HexStr(preimage));
1284 }
1285 in.pushKV("sha256_preimages", std::move(sha256_preimages));
1286 }
1287
1288 // Hash160 hash preimages
1289 if (!input.hash160_preimages.empty()) {
1290 UniValue hash160_preimages(UniValue::VOBJ);
1291 for (const auto& [hash, preimage] : input.hash160_preimages) {
1292 hash160_preimages.pushKV(HexStr(hash), HexStr(preimage));
1293 }
1294 in.pushKV("hash160_preimages", std::move(hash160_preimages));
1295 }
1296
1297 // Hash256 hash preimages
1298 if (!input.hash256_preimages.empty()) {
1299 UniValue hash256_preimages(UniValue::VOBJ);
1300 for (const auto& [hash, preimage] : input.hash256_preimages) {
1301 hash256_preimages.pushKV(HexStr(hash), HexStr(preimage));
1302 }
1303 in.pushKV("hash256_preimages", std::move(hash256_preimages));
1304 }
1305
1306 // PSBTv2
1307 if (psbtx.GetVersion() >= 2) {
1308 in.pushKV("previous_txid", input.prev_txid.GetHex());
1309 in.pushKV("previous_vout", static_cast<uint64_t>(input.prev_out));
1310 if (input.sequence.has_value()) {
1311 in.pushKV("sequence", static_cast<uint64_t>(*input.sequence));
1312 }
1313 if (input.time_locktime.has_value()) {
1314 in.pushKV("time_locktime", static_cast<uint64_t>(*input.time_locktime));
1315 }
1316 if (input.height_locktime.has_value()) {
1317 in.pushKV("height_locktime", static_cast<uint64_t>(*input.height_locktime));
1318 }
1319 }
1320
1321 // Taproot key path signature
1322 if (!input.m_tap_key_sig.empty()) {
1323 in.pushKV("taproot_key_path_sig", HexStr(input.m_tap_key_sig));
1324 }
1325
1326 // Taproot script path signatures
1327 if (!input.m_tap_script_sigs.empty()) {
1328 UniValue script_sigs(UniValue::VARR);
1329 for (const auto& [pubkey_leaf, sig] : input.m_tap_script_sigs) {
1330 const auto& [xonly, leaf_hash] = pubkey_leaf;
1331 UniValue sigobj(UniValue::VOBJ);
1332 sigobj.pushKV("pubkey", HexStr(xonly));
1333 sigobj.pushKV("leaf_hash", HexStr(leaf_hash));
1334 sigobj.pushKV("sig", HexStr(sig));
1335 script_sigs.push_back(std::move(sigobj));
1336 }
1337 in.pushKV("taproot_script_path_sigs", std::move(script_sigs));
1338 }
1339
1340 // Taproot leaf scripts
1341 if (!input.m_tap_scripts.empty()) {
1342 UniValue tap_scripts(UniValue::VARR);
1343 for (const auto& [leaf, control_blocks] : input.m_tap_scripts) {
1344 const auto& [script, leaf_ver] = leaf;
1345 UniValue script_info(UniValue::VOBJ);
1346 script_info.pushKV("script", HexStr(script));
1347 script_info.pushKV("leaf_ver", leaf_ver);
1348 UniValue control_blocks_univ(UniValue::VARR);
1349 for (const auto& control_block : control_blocks) {
1350 control_blocks_univ.push_back(HexStr(control_block));
1351 }
1352 script_info.pushKV("control_blocks", std::move(control_blocks_univ));
1353 tap_scripts.push_back(std::move(script_info));
1354 }
1355 in.pushKV("taproot_scripts", std::move(tap_scripts));
1356 }
1357
1358 // Taproot bip32 keypaths
1359 if (!input.m_tap_bip32_paths.empty()) {
1360 UniValue keypaths(UniValue::VARR);
1361 for (const auto& [xonly, leaf_origin] : input.m_tap_bip32_paths) {
1362 const auto& [leaf_hashes, origin] = leaf_origin;
1363 UniValue path_obj(UniValue::VOBJ);
1364 path_obj.pushKV("pubkey", HexStr(xonly));
1365 path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint)));
1366 path_obj.pushKV("path", WriteHDKeypath(origin.path));
1367 UniValue leaf_hashes_arr(UniValue::VARR);
1368 for (const auto& leaf_hash : leaf_hashes) {
1369 leaf_hashes_arr.push_back(HexStr(leaf_hash));
1370 }
1371 path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));
1372 keypaths.push_back(std::move(path_obj));
1373 }
1374 in.pushKV("taproot_bip32_derivs", std::move(keypaths));
1375 }
1376
1377 // Taproot internal key
1378 if (!input.m_tap_internal_key.IsNull()) {
1379 in.pushKV("taproot_internal_key", HexStr(input.m_tap_internal_key));
1380 }
1381
1382 // Write taproot merkle root
1383 if (!input.m_tap_merkle_root.IsNull()) {
1384 in.pushKV("taproot_merkle_root", HexStr(input.m_tap_merkle_root));
1385 }
1386
1387 // Write MuSig2 fields
1388 if (!input.m_musig2_participants.empty()) {
1389 UniValue musig_pubkeys(UniValue::VARR);
1390 for (const auto& [agg, parts] : input.m_musig2_participants) {
1391 UniValue musig_part(UniValue::VOBJ);
1392 musig_part.pushKV("aggregate_pubkey", HexStr(agg));
1393 UniValue part_pubkeys(UniValue::VARR);
1394 for (const auto& pub : parts) {
1395 part_pubkeys.push_back(HexStr(pub));
1396 }
1397 musig_part.pushKV("participant_pubkeys", part_pubkeys);
1398 musig_pubkeys.push_back(musig_part);
1399 }
1400 in.pushKV("musig2_participant_pubkeys", musig_pubkeys);
1401 }
1402 if (!input.m_musig2_pubnonces.empty()) {
1403 UniValue musig_pubnonces(UniValue::VARR);
1404 for (const auto& [agg_lh, part_pubnonce] : input.m_musig2_pubnonces) {
1405 const auto& [agg, lh] = agg_lh;
1406 for (const auto& [part, pubnonce] : part_pubnonce) {
1408 info.pushKV("participant_pubkey", HexStr(part));
1409 info.pushKV("aggregate_pubkey", HexStr(agg));
1410 if (!lh.IsNull()) info.pushKV("leaf_hash", HexStr(lh));
1411 info.pushKV("pubnonce", HexStr(pubnonce));
1412 musig_pubnonces.push_back(info);
1413 }
1414 }
1415 in.pushKV("musig2_pubnonces", musig_pubnonces);
1416 }
1417 if (!input.m_musig2_partial_sigs.empty()) {
1418 UniValue musig_partial_sigs(UniValue::VARR);
1419 for (const auto& [agg_lh, part_psig] : input.m_musig2_partial_sigs) {
1420 const auto& [agg, lh] = agg_lh;
1421 for (const auto& [part, psig] : part_psig) {
1423 info.pushKV("participant_pubkey", HexStr(part));
1424 info.pushKV("aggregate_pubkey", HexStr(agg));
1425 if (!lh.IsNull()) info.pushKV("leaf_hash", HexStr(lh));
1426 info.pushKV("partial_sig", HexStr(psig));
1427 musig_partial_sigs.push_back(info);
1428 }
1429 }
1430 in.pushKV("musig2_partial_sigs", musig_partial_sigs);
1431 }
1432
1433 // Proprietary
1434 if (!input.m_proprietary.empty()) {
1435 UniValue proprietary(UniValue::VARR);
1436 for (const auto& entry : input.m_proprietary) {
1437 UniValue this_prop(UniValue::VOBJ);
1438 this_prop.pushKV("identifier", HexStr(entry.identifier));
1439 this_prop.pushKV("subtype", entry.subtype);
1440 this_prop.pushKV("key", HexStr(entry.key));
1441 this_prop.pushKV("value", HexStr(entry.value));
1442 proprietary.push_back(std::move(this_prop));
1443 }
1444 in.pushKV("proprietary", std::move(proprietary));
1445 }
1446
1447 // Unknown data
1448 if (input.unknown.size() > 0) {
1449 UniValue unknowns(UniValue::VOBJ);
1450 for (auto entry : input.unknown) {
1451 unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1452 }
1453 in.pushKV("unknown", std::move(unknowns));
1454 }
1455
1456 inputs.push_back(std::move(in));
1457 }
1458 result.pushKV("inputs", std::move(inputs));
1459
1460 // outputs
1461 CAmount output_value = 0;
1462 UniValue outputs(UniValue::VARR);
1463 for (unsigned int i = 0; i < psbtx.outputs.size(); ++i) {
1464 const PSBTOutput& output = psbtx.outputs[i];
1466 // Redeem script and witness script
1467 if (!output.redeem_script.empty()) {
1469 ScriptToUniv(output.redeem_script, /*out=*/r);
1470 out.pushKV("redeem_script", std::move(r));
1471 }
1472 if (!output.witness_script.empty()) {
1474 ScriptToUniv(output.witness_script, /*out=*/r);
1475 out.pushKV("witness_script", std::move(r));
1476 }
1477
1478 // keypaths
1479 if (!output.hd_keypaths.empty()) {
1480 UniValue keypaths(UniValue::VARR);
1481 for (auto entry : output.hd_keypaths) {
1482 UniValue keypath(UniValue::VOBJ);
1483 keypath.pushKV("pubkey", HexStr(entry.first));
1484 keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint)));
1485 keypath.pushKV("path", WriteHDKeypath(entry.second.path));
1486 keypaths.push_back(std::move(keypath));
1487 }
1488 out.pushKV("bip32_derivs", std::move(keypaths));
1489 }
1490
1491 // PSBTv2 stuff
1492 if (psbtx.GetVersion() >= 2) {
1493 out.pushKV("amount", ValueFromAmount(output.amount));
1495 ScriptToUniv(output.script, spk, /*include_hex=*/true, /*include_address=*/true);
1496 out.pushKV("script", spk);
1497 }
1498
1499 // Taproot internal key
1500 if (!output.m_tap_internal_key.IsNull()) {
1501 out.pushKV("taproot_internal_key", HexStr(output.m_tap_internal_key));
1502 }
1503
1504 // Taproot tree
1505 if (!output.m_tap_tree.empty()) {
1507 for (const auto& [depth, leaf_ver, script] : output.m_tap_tree) {
1509 elem.pushKV("depth", depth);
1510 elem.pushKV("leaf_ver", leaf_ver);
1511 elem.pushKV("script", HexStr(script));
1512 tree.push_back(std::move(elem));
1513 }
1514 out.pushKV("taproot_tree", std::move(tree));
1515 }
1516
1517 // Taproot bip32 keypaths
1518 if (!output.m_tap_bip32_paths.empty()) {
1519 UniValue keypaths(UniValue::VARR);
1520 for (const auto& [xonly, leaf_origin] : output.m_tap_bip32_paths) {
1521 const auto& [leaf_hashes, origin] = leaf_origin;
1522 UniValue path_obj(UniValue::VOBJ);
1523 path_obj.pushKV("pubkey", HexStr(xonly));
1524 path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint)));
1525 path_obj.pushKV("path", WriteHDKeypath(origin.path));
1526 UniValue leaf_hashes_arr(UniValue::VARR);
1527 for (const auto& leaf_hash : leaf_hashes) {
1528 leaf_hashes_arr.push_back(HexStr(leaf_hash));
1529 }
1530 path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));
1531 keypaths.push_back(std::move(path_obj));
1532 }
1533 out.pushKV("taproot_bip32_derivs", std::move(keypaths));
1534 }
1535
1536 // Write MuSig2 fields
1537 if (!output.m_musig2_participants.empty()) {
1538 UniValue musig_pubkeys(UniValue::VARR);
1539 for (const auto& [agg, parts] : output.m_musig2_participants) {
1540 UniValue musig_part(UniValue::VOBJ);
1541 musig_part.pushKV("aggregate_pubkey", HexStr(agg));
1542 UniValue part_pubkeys(UniValue::VARR);
1543 for (const auto& pub : parts) {
1544 part_pubkeys.push_back(HexStr(pub));
1545 }
1546 musig_part.pushKV("participant_pubkeys", part_pubkeys);
1547 musig_pubkeys.push_back(musig_part);
1548 }
1549 out.pushKV("musig2_participant_pubkeys", musig_pubkeys);
1550 }
1551
1552 // Proprietary
1553 if (!output.m_proprietary.empty()) {
1554 UniValue proprietary(UniValue::VARR);
1555 for (const auto& entry : output.m_proprietary) {
1556 UniValue this_prop(UniValue::VOBJ);
1557 this_prop.pushKV("identifier", HexStr(entry.identifier));
1558 this_prop.pushKV("subtype", entry.subtype);
1559 this_prop.pushKV("key", HexStr(entry.key));
1560 this_prop.pushKV("value", HexStr(entry.value));
1561 proprietary.push_back(std::move(this_prop));
1562 }
1563 out.pushKV("proprietary", std::move(proprietary));
1564 }
1565
1566 // Unknown data
1567 if (output.unknown.size() > 0) {
1568 UniValue unknowns(UniValue::VOBJ);
1569 for (auto entry : output.unknown) {
1570 unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1571 }
1572 out.pushKV("unknown", std::move(unknowns));
1573 }
1574
1575 outputs.push_back(std::move(out));
1576
1577 // Fee calculation
1578 if (MoneyRange(output.amount) && MoneyRange(output_value + output.amount)) {
1579 output_value += output.amount;
1580 } else {
1581 // Hack to just not show fee later
1582 have_all_utxos = false;
1583 }
1584 }
1585 result.pushKV("outputs", std::move(outputs));
1586 if (have_all_utxos) {
1587 result.pushKV("fee", ValueFromAmount(total_in - output_value));
1588 }
1589
1590 return result;
1591},
1592 };
1593}
1594
1596{
1597 return RPCMethod{
1598 "combinepsbt",
1599 "Combine multiple partially signed Bitcoin transactions into one transaction.\n"
1600 "Implements the Combiner role.\n",
1601 {
1602 {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base64 strings of partially signed transactions",
1603 {
1604 {"psbt", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "A base64 string of a PSBT"},
1605 },
1606 },
1607 },
1608 RPCResult{
1609 RPCResult::Type::STR, "", "The base64-encoded partially signed transaction"
1610 },
1612 HelpExampleCli("combinepsbt", R"('["mybase64_1", "mybase64_2", "mybase64_3"]')")
1613 },
1614 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1615{
1616 // Unserialize the transactions
1617 std::vector<PartiallySignedTransaction> psbtxs;
1618 UniValue txs = request.params[0].get_array();
1619 if (txs.empty()) {
1620 throw JSONRPCError(RPC_INVALID_PARAMETER, "Parameter 'txs' cannot be empty");
1621 }
1622 for (unsigned int i = 0; i < txs.size(); ++i) {
1624 if (!psbt_res) {
1625 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
1626 }
1627 psbtxs.push_back(*psbt_res);
1628 }
1629
1630 std::optional<PartiallySignedTransaction> merged_psbt = CombinePSBTs(psbtxs);
1631 if (!merged_psbt) {
1632 throw JSONRPCError(RPC_INVALID_PARAMETER, "PSBTs not compatible (different transactions)");
1633 }
1634
1635 DataStream ssTx{};
1636 ssTx << *merged_psbt;
1637 return EncodeBase64(ssTx);
1638},
1639 };
1640}
1641
1643{
1644 return RPCMethod{"finalizepsbt",
1645 "Finalize the inputs of a PSBT. If the transaction is fully signed, it will produce a\n"
1646 "network serialized transaction which can be broadcast with sendrawtransaction. Otherwise a PSBT will be\n"
1647 "created which has the final_scriptSig and final_scriptwitness fields filled for inputs that are complete.\n"
1648 "Implements the Finalizer and Extractor roles.\n",
1649 {
1650 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
1651 {"extract", RPCArg::Type::BOOL, RPCArg::Default{true}, "If true and the transaction is complete,\n"
1652 " extract and return the complete transaction in normal network serialization instead of the PSBT."},
1653 },
1654 RPCResult{
1655 RPCResult::Type::OBJ, "", "",
1656 {
1657 {RPCResult::Type::STR, "psbt", /*optional=*/true, "The base64-encoded partially signed transaction if not extracted"},
1658 {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The hex-encoded network transaction if extracted"},
1659 {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
1660 }
1661 },
1663 HelpExampleCli("finalizepsbt", "\"psbt\"")
1664 },
1665 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1666{
1667 // Unserialize the transactions
1668 util::Result<PartiallySignedTransaction> psbt_res = DecodeBase64PSBT(request.params[0].get_str());
1669 if (!psbt_res) {
1670 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
1671 }
1672 PartiallySignedTransaction psbtx = *psbt_res;
1673
1674 bool extract = request.params[1].isNull() || (!request.params[1].isNull() && request.params[1].get_bool());
1675
1677 bool complete = FinalizeAndExtractPSBT(psbtx, mtx);
1678
1679 UniValue result(UniValue::VOBJ);
1680 DataStream ssTx{};
1681 std::string result_str;
1682
1683 if (complete && extract) {
1684 ssTx << TX_WITH_WITNESS(mtx);
1685 result_str = HexStr(ssTx);
1686 result.pushKV("hex", result_str);
1687 } else {
1688 ssTx << psbtx;
1689 result_str = EncodeBase64(ssTx.str());
1690 result.pushKV("psbt", result_str);
1691 }
1692 result.pushKV("complete", complete);
1693
1694 return result;
1695},
1696 };
1697}
1698
1700{
1701 return RPCMethod{
1702 "createpsbt",
1703 "Creates a transaction in the Partially Signed Transaction format.\n"
1704 "Implements the Creator role.\n"
1705 "Note that the transaction's inputs are not signed, and\n"
1706 "it is not stored in the wallet or transmitted to the network.\n",
1707 Cat<std::vector<RPCArg>>(
1708 CreateTxDoc(),
1709 {
1710 {"psbt_version", RPCArg::Type::NUM, RPCArg::Default{2}, "The PSBT version number to use."},
1711 }
1712 ),
1713 RPCResult{
1714 RPCResult::Type::STR, "", "The resulting raw transaction (base64-encoded string)"
1715 },
1717 HelpExampleCli("createpsbt", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"address\\\":0.01}]\"")
1718 },
1719 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1720{
1721 std::optional<bool> rbf;
1722 if (!request.params[3].isNull()) {
1723 rbf = request.params[3].get_bool();
1724 }
1725 CMutableTransaction rawTx = ConstructTransaction(request.params[0], request.params[1], request.params[2], rbf, self.Arg<uint32_t>("version"));
1726
1727 // Make a blank psbt
1728 uint32_t psbt_version = 2;
1729 if (!request.params[5].isNull()) {
1730 psbt_version = request.params[5].getInt<uint32_t>();
1731 }
1732 if (psbt_version != 2 && psbt_version != 0) {
1733 throw JSONRPCError(RPC_INVALID_PARAMETER, "The PSBT version can only be 2 or 0");
1734 }
1735 PartiallySignedTransaction psbtx(rawTx, psbt_version);
1736
1737 // Serialize the PSBT
1738 DataStream ssTx{};
1739 ssTx << psbtx;
1740
1741 return EncodeBase64(ssTx);
1742},
1743 };
1744}
1745
1747{
1748 return RPCMethod{
1749 "converttopsbt",
1750 "Converts a network serialized transaction to a PSBT. This should be used only with createrawtransaction and fundrawtransaction\n"
1751 "createpsbt and walletcreatefundedpsbt should be used for new applications.\n",
1752 {
1753 {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of a raw transaction"},
1754 {"permitsigdata", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, any signatures in the input will be discarded and conversion\n"
1755 " will continue. If false, RPC will fail if any signatures are present."},
1756 {"iswitness", RPCArg::Type::BOOL, RPCArg::DefaultHint{"depends on heuristic tests"}, "Whether the transaction hex is a serialized witness transaction.\n"
1757 "If iswitness is not present, heuristic tests will be used in decoding.\n"
1758 "If true, only witness deserialization will be tried.\n"
1759 "If false, only non-witness deserialization will be tried.\n"
1760 "This boolean should reflect whether the transaction has inputs\n"
1761 "(e.g. fully valid, or on-chain transactions), if known by the caller."
1762 },
1763 {"psbt_version", RPCArg::Type::NUM, RPCArg::Default{2}, "The PSBT version number to use."},
1764 },
1765 RPCResult{
1766 RPCResult::Type::STR, "", "The resulting raw transaction (base64-encoded string)"
1767 },
1769 "\nCreate a transaction\n"
1770 + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"") +
1771 "\nConvert the transaction to a PSBT\n"
1772 + HelpExampleCli("converttopsbt", "\"rawtransaction\"")
1773 },
1774 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1775{
1776 // parse hex string from parameter
1778 bool permitsigdata = request.params[1].isNull() ? false : request.params[1].get_bool();
1779 bool witness_specified = !request.params[2].isNull();
1780 bool iswitness = witness_specified ? request.params[2].get_bool() : false;
1781 const bool try_witness = witness_specified ? iswitness : true;
1782 const bool try_no_witness = witness_specified ? !iswitness : true;
1783 if (!DecodeHexTx(tx, request.params[0].get_str(), try_no_witness, try_witness)) {
1784 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
1785 }
1786
1787 // Remove all scriptSigs and scriptWitnesses from inputs
1788 for (CTxIn& input : tx.vin) {
1789 if ((!input.scriptSig.empty() || !input.scriptWitness.IsNull()) && !permitsigdata) {
1790 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Inputs must not have scriptSigs and scriptWitnesses");
1791 }
1792 input.scriptSig.clear();
1793 input.scriptWitness.SetNull();
1794 }
1795
1796 // Make a blank psbt
1797 uint32_t psbt_version = 2;
1798 if (!request.params[3].isNull()) {
1799 psbt_version = request.params[3].getInt<uint32_t>();
1800 }
1801 if (psbt_version != 2 && psbt_version != 0) {
1802 throw JSONRPCError(RPC_INVALID_PARAMETER, "The PSBT version can only be 2 or 0");
1803 }
1804 PartiallySignedTransaction psbtx(tx, psbt_version);
1805
1806 // Serialize the PSBT
1807 DataStream ssTx{};
1808 ssTx << psbtx;
1809
1810 return EncodeBase64(ssTx);
1811},
1812 };
1813}
1814
1816{
1817 return RPCMethod{
1818 "utxoupdatepsbt",
1819 "Updates all segwit inputs and outputs in a PSBT with data from output descriptors, the UTXO set, txindex, or the mempool.\n",
1820 {
1821 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
1822 {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "An array of either strings or objects", {
1823 {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "An output descriptor"},
1824 {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with an output descriptor and extra information", {
1825 {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
1826 {"range", RPCArg::Type::RANGE, RPCArg::Default{1000}, "Up to what index HD chains should be explored (either end or [begin,end])"},
1827 }},
1828 }},
1829 },
1830 RPCResult {
1831 RPCResult::Type::STR, "", "The base64-encoded partially signed transaction with inputs updated"
1832 },
1833 RPCExamples {
1834 HelpExampleCli("utxoupdatepsbt", "\"psbt\"")
1835 },
1836 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1837{
1838 // Parse descriptors, if any.
1839 FlatSigningProvider provider;
1840 if (!request.params[1].isNull()) {
1841 auto descs = request.params[1].get_array();
1842 for (size_t i = 0; i < descs.size(); ++i) {
1843 EvalDescriptorStringOrObject(descs[i], provider);
1844 }
1845 }
1846
1847 // We don't actually need private keys further on; hide them as a precaution.
1849 request.params[0].get_str(),
1850 request.context,
1851 HidingSigningProvider(&provider, /*hide_secret=*/true, /*hide_origin=*/false),
1852 /*sighash_type=*/std::nullopt,
1853 /*finalize=*/false);
1854
1855 DataStream ssTx{};
1856 ssTx << psbtx;
1857 return EncodeBase64(ssTx);
1858},
1859 };
1860}
1861
1863{
1864 return RPCMethod{
1865 "joinpsbts",
1866 "Joins multiple distinct version 0 PSBTs with different inputs and outputs into one version 0 PSBT with inputs and outputs from all of the PSBTs\n"
1867 "No input in any of the PSBTs can be in more than one of the PSBTs.\n",
1868 {
1869 {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base64 strings of partially signed transactions",
1870 {
1871 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}
1872 }}
1873 },
1874 RPCResult {
1875 RPCResult::Type::STR, "", "The base64-encoded partially signed transaction"
1876 },
1877 RPCExamples {
1878 HelpExampleCli("joinpsbts", "\"psbt\"")
1879 },
1880 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1881{
1882 // Unserialize the transactions
1883 std::vector<PartiallySignedTransaction> psbtxs;
1884 UniValue txs = request.params[0].get_array();
1885
1886 if (txs.size() <= 1) {
1887 throw JSONRPCError(RPC_INVALID_PARAMETER, "At least two PSBTs are required to join PSBTs.");
1888 }
1889
1890 uint32_t best_version = 1;
1891 uint32_t best_locktime = 0xffffffff;
1892 for (unsigned int i = 0; i < txs.size(); ++i) {
1894 if (!psbt_res) {
1895 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
1896 }
1897 psbtxs.push_back(*psbt_res);
1898 const PartiallySignedTransaction& psbtx = psbtxs.back();
1899 if (psbtx.GetVersion() != 0) {
1900 throw JSONRPCError(RPC_INVALID_PARAMETER, "joinpsbts only operates on version 0 PSBTs");
1901 }
1902 // Choose the highest version number
1903 if (psbtx.tx_version > best_version) {
1904 best_version = psbtx.tx_version;
1905 }
1906 // Choose the lowest lock time
1907 uint32_t psbt_locktime = psbtx.fallback_locktime.value_or(0);
1908 if (psbt_locktime < best_locktime) {
1909 best_locktime = psbt_locktime;
1910 }
1911 }
1912
1913 // Create a blank psbt where everything will be added
1915 tx.version = best_version;
1916 tx.nLockTime = best_locktime;
1917 PartiallySignedTransaction merged_psbt(tx, psbtxs.at(0).GetVersion());
1918
1919 // Merge
1920 for (auto& psbt : psbtxs) {
1921 for (const PSBTInput& input : psbt.inputs) {
1922 if (!merged_psbt.AddInput(input)) {
1923 throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Input %s:%d exists in multiple PSBTs", input.prev_txid.ToString(), input.prev_out));
1924 }
1925 }
1926 for (const PSBTOutput& output : psbt.outputs) {
1927 merged_psbt.AddOutput(output);
1928 }
1929 for (auto& xpub_pair : psbt.m_xpubs) {
1930 if (!merged_psbt.m_xpubs.contains(xpub_pair.first)) {
1931 merged_psbt.m_xpubs[xpub_pair.first] = xpub_pair.second;
1932 } else {
1933 merged_psbt.m_xpubs[xpub_pair.first].insert(xpub_pair.second.begin(), xpub_pair.second.end());
1934 }
1935 }
1936 merged_psbt.unknown.insert(psbt.unknown.begin(), psbt.unknown.end());
1937 }
1938
1939 // Generate list of shuffled indices for shuffling inputs and outputs of the merged PSBT
1940 std::vector<int> input_indices(merged_psbt.inputs.size());
1941 std::iota(input_indices.begin(), input_indices.end(), 0);
1942 std::vector<int> output_indices(merged_psbt.outputs.size());
1943 std::iota(output_indices.begin(), output_indices.end(), 0);
1944
1945 // Shuffle input and output indices lists
1946 std::shuffle(input_indices.begin(), input_indices.end(), FastRandomContext());
1947 std::shuffle(output_indices.begin(), output_indices.end(), FastRandomContext());
1948
1949 PartiallySignedTransaction shuffled_psbt(tx, merged_psbt.GetVersion());
1950 for (int i : input_indices) {
1951 shuffled_psbt.AddInput(merged_psbt.inputs[i]);
1952 }
1953 for (int i : output_indices) {
1954 shuffled_psbt.AddOutput(merged_psbt.outputs[i]);
1955 }
1956 shuffled_psbt.unknown.insert(merged_psbt.unknown.begin(), merged_psbt.unknown.end());
1957
1958 DataStream ssTx{};
1959 ssTx << shuffled_psbt;
1960 return EncodeBase64(ssTx);
1961},
1962 };
1963}
1964
1966{
1967 return RPCMethod{
1968 "analyzepsbt",
1969 "Analyzes and provides information about the current status of a PSBT and its inputs\n",
1970 {
1971 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}
1972 },
1973 RPCResult {
1974 RPCResult::Type::OBJ, "", "",
1975 {
1976 {RPCResult::Type::ARR, "inputs", /*optional=*/true, "",
1977 {
1978 {RPCResult::Type::OBJ, "", "",
1979 {
1980 {RPCResult::Type::BOOL, "has_utxo", "Whether a UTXO is provided"},
1981 {RPCResult::Type::BOOL, "is_final", "Whether the input is finalized"},
1982 {RPCResult::Type::OBJ, "missing", /*optional=*/true, "Things that are missing that are required to complete this input",
1983 {
1984 {RPCResult::Type::ARR, "pubkeys", /*optional=*/true, "",
1985 {
1986 {RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose BIP 32 derivation path is missing"},
1987 }},
1988 {RPCResult::Type::ARR, "signatures", /*optional=*/true, "",
1989 {
1990 {RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose signature is missing"},
1991 }},
1992 {RPCResult::Type::STR_HEX, "redeemscript", /*optional=*/true, "Hash160 of the redeem script that is missing"},
1993 {RPCResult::Type::STR_HEX, "witnessscript", /*optional=*/true, "SHA256 of the witness script that is missing"},
1994 }},
1995 {RPCResult::Type::STR, "next", /*optional=*/true, "Role of the next person that this input needs to go to"},
1996 }},
1997 }},
1998 {RPCResult::Type::NUM, "estimated_vsize", /*optional=*/true, "Estimated vsize of the final signed transaction"},
1999 {RPCResult::Type::STR_AMOUNT, "estimated_feerate", /*optional=*/true, "Estimated feerate of the final signed transaction in " + CURRENCY_UNIT + "/kvB. Shown only if all UTXO slots in the PSBT have been filled"},
2000 {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid. Shown only if all UTXO slots in the PSBT have been filled"},
2001 {RPCResult::Type::STR, "next", "Role of the next person that this psbt needs to go to"},
2002 {RPCResult::Type::STR, "error", /*optional=*/true, "Error message (if there is one)"},
2003 }
2004 },
2005 RPCExamples {
2006 HelpExampleCli("analyzepsbt", "\"psbt\"")
2007 },
2008 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
2009{
2010 // Unserialize the transaction
2011 util::Result<PartiallySignedTransaction> psbt_res = DecodeBase64PSBT(request.params[0].get_str());
2012 if (!psbt_res) {
2013 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", util::ErrorString(psbt_res).original));
2014 }
2015 const PartiallySignedTransaction& psbtx = *psbt_res;
2016
2017 PSBTAnalysis psbta = AnalyzePSBT(psbtx);
2018
2019 UniValue result(UniValue::VOBJ);
2020 UniValue inputs_result(UniValue::VARR);
2021 for (const auto& input : psbta.inputs) {
2022 UniValue input_univ(UniValue::VOBJ);
2023 UniValue missing(UniValue::VOBJ);
2024
2025 input_univ.pushKV("has_utxo", input.has_utxo);
2026 input_univ.pushKV("is_final", input.is_final);
2027 input_univ.pushKV("next", PSBTRoleName(input.next));
2028
2029 if (!input.missing_pubkeys.empty()) {
2030 UniValue missing_pubkeys_univ(UniValue::VARR);
2031 for (const CKeyID& pubkey : input.missing_pubkeys) {
2032 missing_pubkeys_univ.push_back(HexStr(pubkey));
2033 }
2034 missing.pushKV("pubkeys", std::move(missing_pubkeys_univ));
2035 }
2036 if (!input.missing_redeem_script.IsNull()) {
2037 missing.pushKV("redeemscript", HexStr(input.missing_redeem_script));
2038 }
2039 if (!input.missing_witness_script.IsNull()) {
2040 missing.pushKV("witnessscript", HexStr(input.missing_witness_script));
2041 }
2042 if (!input.missing_sigs.empty()) {
2043 UniValue missing_sigs_univ(UniValue::VARR);
2044 for (const CKeyID& pubkey : input.missing_sigs) {
2045 missing_sigs_univ.push_back(HexStr(pubkey));
2046 }
2047 missing.pushKV("signatures", std::move(missing_sigs_univ));
2048 }
2049 if (!missing.getKeys().empty()) {
2050 input_univ.pushKV("missing", std::move(missing));
2051 }
2052 inputs_result.push_back(std::move(input_univ));
2053 }
2054 if (!inputs_result.empty()) result.pushKV("inputs", std::move(inputs_result));
2055
2056 if (psbta.estimated_vsize != std::nullopt) {
2057 result.pushKV("estimated_vsize", *psbta.estimated_vsize);
2058 }
2059 if (psbta.estimated_feerate != std::nullopt) {
2060 result.pushKV("estimated_feerate", ValueFromAmount(psbta.estimated_feerate->GetFeePerK()));
2061 }
2062 if (psbta.fee != std::nullopt) {
2063 result.pushKV("fee", ValueFromAmount(*psbta.fee));
2064 }
2065 result.pushKV("next", PSBTRoleName(psbta.next));
2066 if (!psbta.error.empty()) {
2067 result.pushKV("error", psbta.error);
2068 }
2069
2070 return result;
2071},
2072 };
2073}
2074
2076{
2077 return RPCMethod{
2078 "descriptorprocesspsbt",
2079 "Update all segwit inputs in a PSBT with information from output descriptors, the UTXO set or the mempool. \n"
2080 "Then, sign the inputs we are able to with information from the output descriptors. ",
2081 {
2082 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction base64 string"},
2083 {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::NO, "An array of either strings or objects", {
2084 {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "An output descriptor"},
2085 {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with an output descriptor and extra information", {
2086 {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
2087 {"range", RPCArg::Type::RANGE, RPCArg::Default{1000}, "Up to what index HD chains should be explored (either end or [begin,end])"},
2088 }},
2089 }},
2090 {"sighashtype", RPCArg::Type::STR, RPCArg::Default{"DEFAULT for Taproot, ALL otherwise"}, "The signature hash type to sign with if not specified by the PSBT. Must be one of\n"
2091 " \"DEFAULT\"\n"
2092 " \"ALL\"\n"
2093 " \"NONE\"\n"
2094 " \"SINGLE\"\n"
2095 " \"ALL|ANYONECANPAY\"\n"
2096 " \"NONE|ANYONECANPAY\"\n"
2097 " \"SINGLE|ANYONECANPAY\""},
2098 {"bip32derivs", RPCArg::Type::BOOL, RPCArg::Default{true}, "Include BIP 32 derivation paths for public keys if we know them"},
2099 {"finalize", RPCArg::Type::BOOL, RPCArg::Default{true}, "Also finalize inputs if possible"},
2100 },
2101 RPCResult{
2102 RPCResult::Type::OBJ, "", "",
2103 {
2104 {RPCResult::Type::STR, "psbt", "The base64-encoded partially signed transaction"},
2105 {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
2106 {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The hex-encoded network transaction if complete"},
2107 }
2108 },
2110 HelpExampleCli("descriptorprocesspsbt", "\"psbt\" \"[\\\"descriptor1\\\", \\\"descriptor2\\\"]\"") +
2111 HelpExampleCli("descriptorprocesspsbt", "\"psbt\" \"[{\\\"desc\\\":\\\"mydescriptor\\\", \\\"range\\\":21}]\"")
2112 },
2113 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
2114{
2115 // Add descriptor information to a signing provider
2116 FlatSigningProvider provider;
2117
2118 auto descs = request.params[1].get_array();
2119 for (size_t i = 0; i < descs.size(); ++i) {
2120 EvalDescriptorStringOrObject(descs[i], provider, /*expand_priv=*/true);
2121 }
2122
2123 std::optional<int> sighash_type = ParseSighashString(request.params[2]);
2124 bool bip32derivs = request.params[3].isNull() ? true : request.params[3].get_bool();
2125 bool finalize = request.params[4].isNull() ? true : request.params[4].get_bool();
2126
2128 request.params[0].get_str(),
2129 request.context,
2130 HidingSigningProvider(&provider, /*hide_secret=*/false, !bip32derivs),
2131 sighash_type,
2132 finalize);
2133
2134 // Check whether or not all of the inputs are now signed
2135 bool complete = true;
2136 for (const auto& input : psbtx.inputs) {
2137 complete &= PSBTInputSigned(input);
2138 }
2139
2140 DataStream ssTx{};
2141 ssTx << psbtx;
2142
2143 UniValue result(UniValue::VOBJ);
2144
2145 result.pushKV("psbt", EncodeBase64(ssTx));
2146 result.pushKV("complete", complete);
2147 if (complete) {
2149 PartiallySignedTransaction psbtx_copy = psbtx;
2150 CHECK_NONFATAL(FinalizeAndExtractPSBT(psbtx_copy, mtx));
2151 DataStream ssTx_final;
2152 ssTx_final << TX_WITH_WITNESS(mtx);
2153 result.pushKV("hex", HexStr(ssTx_final));
2154 }
2155 return result;
2156},
2157 };
2158}
2159
2161{
2162 static const CRPCCommand commands[]{
2163 {"rawtransactions", &getrawtransaction},
2164 {"rawtransactions", &createrawtransaction},
2165 {"rawtransactions", &decoderawtransaction},
2166 {"rawtransactions", &decodescript},
2167 {"rawtransactions", &combinerawtransaction},
2168 {"rawtransactions", &signrawtransactionwithkey},
2169 {"rawtransactions", &decodepsbt},
2170 {"rawtransactions", &combinepsbt},
2171 {"rawtransactions", &finalizepsbt},
2172 {"rawtransactions", &createpsbt},
2173 {"rawtransactions", &converttopsbt},
2174 {"rawtransactions", &utxoupdatepsbt},
2175 {"rawtransactions", &descriptorprocesspsbt},
2176 {"rawtransactions", &joinpsbts},
2177 {"rawtransactions", &analyzepsbt},
2178 };
2179 for (const auto& c : commands) {
2180 t.appendCommand(c.name, &c);
2181 }
2182}
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:37
bool IsValid() const
Check whether this private key is valid.
Definition: key.h:125
CPubKey GetPubKey() const
Compute the public key from a private key.
Definition: key.cpp:182
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h: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:287
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:887
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:122
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:246
std::optional< uint32_t > fallback_locktime
Definition: psbt.h:1254
bool AddInput(const PSBTInput &psbtin)
Definition: psbt.cpp:163
auto Arg(std::string_view key) const
Helper to get a required or default-valued request argument.
Definition: util.h: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:602
std::string PSBTRoleName(PSBTRole role)
Definition: psbt.cpp:853
util::Result< PartiallySignedTransaction > DecodeBase64PSBT(const std::string &base64_tx)
Decode a base64ed PSBT into a PartiallySignedTransaction.
Definition: psbt.cpp:864
std::optional< PartiallySignedTransaction > CombinePSBTs(const std::vector< PartiallySignedTransaction > &psbtxs)
Combines PSBTs with the same underlying transaction, resulting in a single PSBT with all partial sign...
Definition: psbt.cpp:840
void RemoveUnnecessaryTransactions(PartiallySignedTransaction &psbtx)
Reduces the size of the PSBT by dropping unnecessary non_witness_utxos (i.e.
Definition: psbt.cpp:763
std::optional< PrecomputedTransactionData > PrecomputePSBTData(const PartiallySignedTransaction &psbt)
Compute a PrecomputedTransactionData object from a psbt.
Definition: psbt.cpp:626
PSBTError SignPSBTInput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index, const PrecomputedTransactionData *txdata, const common::PSBTFillOptions &options, SignatureData *out_sigdata)
Signs a PSBTInput, verifying that all provided data matches what is being signed.
Definition: psbt.cpp:647
bool FinalizeAndExtractPSBT(PartiallySignedTransaction &psbtx, CMutableTransaction &result)
Finalizes a PSBT if possible, and extracts it to a CMutableTransaction if it could be finalized.
Definition: psbt.cpp:820
bool PSBTInputSigned(const PSBTInput &input)
Checks whether a PSBTInput is already signed by checking for non-null finalized fields.
Definition: psbt.cpp:552
const unsigned int BIP32_EXTKEY_WITH_VERSION_SIZE
Definition: pubkey.h:20
static RPCMethod decodescript()
static RPCMethod createrawtransaction()
static void TxToJSON(const CTransaction &tx, const uint256 hashBlock, UniValue &entry, Chainstate &active_chainstate, const CTxUndo *txundo=nullptr, TxVerbosity verbosity=TxVerbosity::SHOW_DETAILS)
static RPCMethod joinpsbts()
static RPCMethod getrawtransaction()
PartiallySignedTransaction ProcessPSBT(const std::string &psbt_string, const std::any &context, const HidingSigningProvider &provider, std::optional< int > sighash_type, bool finalize)
static RPCMethod createpsbt()
static RPCMethod combinerawtransaction()
static std::vector< RPCArg > CreateTxDoc()
const RPCResult & DecodePSBTOutputs()
RPCMethod descriptorprocesspsbt()
static RPCMethod decodepsbt()
static RPCMethod combinepsbt()
static RPCMethod utxoupdatepsbt()
static RPCMethod converttopsbt()
static constexpr decltype(CTransaction::version) DEFAULT_RAWTX_VERSION
static RPCMethod finalizepsbt()
const RPCResult & DecodePSBTInputs()
void RegisterRawTransactionRPCCommands(CRPCTable &t)
static RPCMethod signrawtransactionwithkey()
static RPCMethod decoderawtransaction()
static RPCMethod analyzepsbt()
void SignTransaction(CMutableTransaction &mtx, const SigningProvider *keystore, const std::map< COutPoint, Coin > &coins, const UniValue &hashType, UniValue &result)
Sign a transaction with the given keystore and previous transactions.
CMutableTransaction ConstructTransaction(const UniValue &inputs_in, const UniValue &outputs_in, const UniValue &locktime, std::optional< bool > rbf, const uint32_t version)
Create a transaction from univalue parameters.
void ParsePrevouts(const UniValue &prevTxsUnival, FlatSigningProvider *keystore, std::map< COutPoint, Coin > &coins)
Parse a prevtxs UniValue array and get the map of coins from it.
std::vector< RPCResult > TxDoc(const TxDocOptions &opts)
Explain the UniValue "decoded" transaction object, may include extra fields if processed by wallet.
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)