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