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