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