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