82 entry.
pushKV(
"confirmations", 0);
102 "Each key may only appear once, i.e. there can only be one 'data' output, and no address may be duplicated.\n"
103 "At least one output of either type must be specified.\n"
104 "For compatibility reasons, a dictionary, which holds the key-value pairs directly, is also\n"
105 " accepted as second parameter.",
121 "Allows this transaction to be replaced by a transaction with higher fees. If provided, it is an error if explicit sequence numbers are incompatible."},
143 std::map<COutPoint, Coin> coins;
170 if (!coins.empty()) {
189 for (
unsigned int i = 0; i < psbtx.
inputs.size(); ++i) {
205 for (
unsigned int i = 0; i < psbtx.
outputs.size(); ++i) {
216 const std::vector<RPCResult> verbosity_1_block{
217 {
RPCResult::Type::BOOL,
"in_active_chain",
true,
"Whether specified block is in the active chain or not (only present with explicit \"blockhash\" argument)"},
219 {
RPCResult::Type::NUM,
"vsize_adjusted",
true,
"Sigop-adjusted virtual size in bytes, present for mempool transactions."},
225 const auto v2_extras = Cat<std::vector<RPCResult>>(
226 std::vector<RPCResult>{{
228 "transaction fee in " +
CURRENCY_UNIT +
", omitted if block undo data is not available"
232 .prevout_optional =
true,
233 .vin_inner_elision =
"Same vin fields as verbosity = 1"}));
237 "By default, this call only returns a transaction if it is in the mempool. If -txindex is enabled\n"
238 "and no blockhash argument is passed, it will return the transaction if it is in the mempool or any block.\n"
239 "If a blockhash argument is passed, it will return the transaction if\n"
240 "the specified block is available and the transaction is in that block.\n\n"
241 "Hint: Use gettransaction for wallet transactions.\n\n"
243 "If verbosity is 0 or omitted, returns the serialized transaction as a hex-encoded string.\n"
244 "If verbosity is 1, returns a JSON Object with information about the transaction.\n"
245 "If verbosity is 2, returns a JSON Object with information about the transaction, including fee and prevout information.",
253 RPCResult{
"if verbosity is not set or set to 0",
258 Cat<std::vector<RPCResult>>(
260 TxDoc({.txid_field_doc=
"The transaction id (same as provided)"})),
263 Cat(
ElideGroup(verbosity_1_block,
"Same output as verbosity = 1"), v2_extras)},
269 +
HelpExampleCli(
"getrawtransaction",
"\"mytxid\" 0 \"myblockhash\"")
270 +
HelpExampleCli(
"getrawtransaction",
"\"mytxid\" 1 \"myblockhash\"")
271 +
HelpExampleCli(
"getrawtransaction",
"\"mytxid\" 2 \"myblockhash\"")
288 if (!request.params[2].isNull()) {
298 bool f_txindex_ready =
false;
300 f_txindex_ready =
g_txindex->BlockUntilSyncedToCurrentChain();
309 if (!block_has_data) {
312 errmsg =
"No such transaction found in the provided block";
314 errmsg =
"No such mempool transaction. Use -txindex or provide a block hash to enable blockchain transaction queries";
315 }
else if (!f_txindex_ready) {
316 errmsg =
"No such mempool transaction. Blockchain transactions are still in the process of being indexed";
318 errmsg =
"No such mempool or blockchain transaction";
323 if (verbosity <= 0) {
333 if (request.params[2].isNull()) {
339 if (blockindex ==
nullptr && hash_block.
IsNull() &&
node.mempool) {
340 auto info =
node.mempool->info(tx->GetHash());
342 result.
pushKV(
"vsize_adjusted", info.vsize);
346 if (verbosity == 1) {
359 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.");
362 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.");
367 if (it != block.
vtx.end()) {
369 undoTX = &blockUndo.
vtxundo.at(it - block.
vtx.begin() - 1);
380 "createrawtransaction",
381 "Create a transaction spending the given inputs and creating new outputs.\n"
382 "Outputs can be addresses or data.\n"
383 "Returns hex-encoded raw transaction.\n"
384 "Note that the transaction's inputs are not signed, and\n"
385 "it is not stored in the wallet or transmitted to the network.\n",
391 HelpExampleCli(
"createrawtransaction",
"\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"address\\\":0.01}]\"")
392 +
HelpExampleCli(
"createrawtransaction",
"\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"")
393 +
HelpExampleRpc(
"createrawtransaction",
"\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"[{\\\"address\\\":0.01}]\"")
394 +
HelpExampleRpc(
"createrawtransaction",
"\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"[{\\\"data\\\":\\\"00010203\\\"}]\"")
398 std::optional<bool> rbf;
399 if (!request.params[3].isNull()) {
412 "Return a JSON object representing the serialized, hex-encoded transaction.",
416 "If iswitness is not present, heuristic tests will be used in decoding.\n"
417 "If true, only witness deserialization will be tried.\n"
418 "If false, only non-witness deserialization will be tried.\n"
419 "This boolean should reflect whether the transaction has inputs\n"
420 "(e.g. fully valid, or on-chain transactions), if known by the caller."
435 bool try_witness = request.params[1].isNull() ? true : request.params[1].get_bool();
436 bool try_no_witness = request.params[1].isNull() ? true : !request.params[1].get_bool();
438 if (!
DecodeHexTx(mtx, request.params[0].get_str(), try_no_witness, try_witness)) {
454 "Decode a hex-encoded script.\n",
464 {
RPCResult::Type::STR,
"address",
true,
"The Bitcoin address (only if a well-defined address exists)"},
466 "address of P2SH script wrapping this redeem script (not returned for types that should not be wrapped)"},
468 "Result of a witness output script wrapping this redeem script (not returned for types that should not be wrapped)",
472 {
RPCResult::Type::STR,
"type",
"The type of the output script (e.g. witness_v0_keyhash or witness_v0_scripthash)"},
473 {
RPCResult::Type::STR,
"address",
true,
"The Bitcoin address (only if a well-defined address exists)"},
475 {
RPCResult::Type::STR,
"p2sh-segwit",
"address of the P2SH script wrapping this witness redeem script"},
487 if (request.params[0].get_str().size() > 0){
488 std::vector<unsigned char> scriptData(
ParseHexV(request.params[0],
"argument"));
495 std::vector<std::vector<unsigned char>> solutions_data;
498 const bool can_wrap{[&] {
499 switch (which_type) {
533 const bool can_wrap_P2WSH{[&] {
534 switch (which_type) {
539 for (
const auto& solution : solutions_data) {
561 if (can_wrap_P2WSH) {
576 r.
pushKV(
"segwit", std::move(sr));
588 "combinerawtransaction",
589 "Combine multiple partially signed transactions into one transaction.\n"
590 "The combined transaction may be another partially signed transaction or a \n"
591 "fully signed transaction.",
603 HelpExampleCli(
"combinerawtransaction", R
"('["myhex1", "myhex2", "myhex3"]')")
611 if (txs.
size() < 2) {
615 std::vector<CMutableTransaction> txVariants(txs.
size());
617 for (
unsigned int idx = 0; idx < txs.
size(); idx++) {
618 if (!
DecodeHexTx(txVariants[idx], txs[idx].get_str())) {
624 std::vector<CMutableTransaction> tx_variants_copy(txVariants);
626 for (
unsigned int k{0};
k < tx_variants_copy.size(); ++
k) {
628 for (
CTxIn& input : tx_variants_copy[
k].vin) {
629 input.scriptSig.clear();
633 first_txid = tx_variants_copy[
k].GetHash();
634 }
else if (first_txid != tx_variants_copy[
k].GetHash()) {
653 view.SetBackend(viewMempool);
655 for (
const CTxIn& txin : mergedTx.
vin) {
666 for (
unsigned int i = 0; i < mergedTx.
vin.size(); i++) {
676 if (txv.vin.size() > i) {
693 "signrawtransactionwithkey",
694 "Sign inputs for raw transaction (serialized, hex-encoded).\n"
695 "The second argument is an array of base58-encoded private\n"
696 "keys that will be the only keys used to sign the transaction.\n"
697 "The third optional argument (may be null) is an array of previous transaction outputs that\n"
698 "this transaction depends on but may not yet be in the block chain.\n",
725 " \"ALL|ANYONECANPAY\"\n"
726 " \"NONE|ANYONECANPAY\"\n"
727 " \"SINGLE|ANYONECANPAY\"\n"
753 HelpExampleCli(
"signrawtransactionwithkey",
"\"myhex\" \"[\\\"key1\\\",\\\"key2\\\"]\"")
754 +
HelpExampleRpc(
"signrawtransactionwithkey",
"\"myhex\", \"[\\\"key1\\\",\\\"key2\\\"]\"")
759 if (!
DecodeHexTx(mtx, request.params[0].get_str())) {
765 for (
unsigned int idx = 0; idx <
keys.size(); ++idx) {
774 keystore.
pubkeys.emplace(key_id, pubkey);
775 keystore.
keys.emplace(key_id, key);
779 std::map<COutPoint, Coin> coins;
798 static const RPCResult decodepsbt_inputs{
803 {
RPCResult::Type::OBJ,
"non_witness_utxo",
true,
"Decoded network transaction for non-witness UTXOs",
815 {
RPCResult::Type::STR,
"address",
true,
"The Bitcoin address (only if a well-defined address exists)"},
869 {
RPCResult::Type::STR_HEX,
"previous_txid",
true,
"TXID of the transaction containing the output being spent by this input"},
873 {
RPCResult::Type::NUM,
"height_locktime",
true,
"Height-based locktime required for this input"},
877 {
RPCResult::Type::OBJ,
"signature",
true,
"The signature for the pubkey and leaf hash combination",
915 {
RPCResult::Type::STR_HEX,
"aggregate_pubkey",
"The compressed aggregate public key for which the participants create."},
926 {
RPCResult::Type::STR_HEX,
"participant_pubkey",
"The compressed public key of the participant that created this pubnonce."},
927 {
RPCResult::Type::STR_HEX,
"aggregate_pubkey",
"The compressed aggregate public key for which this pubnonce is for."},
928 {
RPCResult::Type::STR_HEX,
"leaf_hash",
true,
"The hash of the leaf script that contains the aggregate pubkey being signed for. Omitted when signing for the internal key."},
936 {
RPCResult::Type::STR_HEX,
"participant_pubkey",
"The compressed public key of the participant that created this partial signature."},
937 {
RPCResult::Type::STR_HEX,
"aggregate_pubkey",
"The compressed aggregate public key for which this partial signature is for."},
938 {
RPCResult::Type::STR_HEX,
"leaf_hash",
true,
"The hash of the leaf script that contains the aggregate pubkey being signed for. Omitted when signing for the internal key."},
959 return decodepsbt_inputs;
964 static const RPCResult decodepsbt_outputs{
995 {
RPCResult::Type::ARR,
"taproot_tree",
true,
"The tuples that make up the Taproot tree, in depth first search order",
1021 {
RPCResult::Type::STR_HEX,
"aggregate_pubkey",
"The compressed aggregate public key for which the participants create."},
1045 return decodepsbt_outputs;
1052 "Return a JSON object representing the serialized, base64-encoded partially signed Bitcoin transaction.",
1071 {
RPCResult::Type::NUM,
"tx_version",
true,
"The version number of the unsigned transaction. Not to be confused with PSBT version"},
1072 {
RPCResult::Type::NUM,
"fallback_locktime",
true,
"The locktime to fallback to if no inputs specify a required locktime."},
1078 {
RPCResult::Type::NUM,
"psbt_version",
true,
"The PSBT version number. Not to be confused with the unsigned transaction version"},
1116 result.
pushKV(
"tx", std::move(tx_univ));
1122 for (
auto& xpub : xpub_pair.second) {
1123 std::vector<unsigned char> ser_xpub;
1125 xpub.EncodeWithVersion(ser_xpub.data());
1129 keypath.
pushKV(
"master_fingerprint",
HexStr(xpub_pair.first.fingerprint));
1131 global_xpubs.
push_back(std::move(keypath));
1134 result.
pushKV(
"global_xpubs", std::move(global_xpubs));
1142 result.
pushKV(
"input_count", (uint64_t)psbtx.
inputs.size());
1143 result.
pushKV(
"output_count", (uint64_t)psbtx.
outputs.size());
1158 this_prop.
pushKV(
"identifier",
HexStr(entry.identifier));
1159 this_prop.
pushKV(
"subtype", entry.subtype);
1162 proprietary.
push_back(std::move(this_prop));
1164 result.
pushKV(
"proprietary", std::move(proprietary));
1168 for (
auto entry : psbtx.
unknown) {
1171 result.
pushKV(
"unknown", std::move(unknowns));
1175 bool have_all_utxos =
true;
1177 for (
unsigned int i = 0; i < psbtx.
inputs.size(); ++i) {
1181 bool have_a_utxo =
false;
1191 out.pushKV(
"scriptPubKey", std::move(o));
1193 in.
pushKV(
"witness_utxo", std::move(
out));
1202 in.
pushKV(
"non_witness_utxo", std::move(non_wit));
1208 total_in += txout.
nValue;
1211 have_all_utxos =
false;
1214 have_all_utxos =
false;
1223 in.
pushKV(
"partial_signatures", std::move(partial_sigs));
1235 in.
pushKV(
"redeem_script", std::move(r));
1240 in.
pushKV(
"witness_script", std::move(r));
1254 in.
pushKV(
"bip32_derivs", std::move(keypaths));
1262 in.
pushKV(
"final_scriptSig", std::move(scriptsig));
1269 in.
pushKV(
"final_scriptwitness", std::move(txinwitness));
1278 in.
pushKV(
"ripemd160_preimages", std::move(ripemd160_preimages));
1287 in.
pushKV(
"sha256_preimages", std::move(sha256_preimages));
1296 in.
pushKV(
"hash160_preimages", std::move(hash160_preimages));
1305 in.
pushKV(
"hash256_preimages", std::move(hash256_preimages));
1311 in.
pushKV(
"previous_vout",
static_cast<uint64_t
>(input.
prev_out));
1332 const auto& [xonly, leaf_hash] = pubkey_leaf;
1337 script_sigs.
push_back(std::move(sigobj));
1339 in.
pushKV(
"taproot_script_path_sigs", std::move(script_sigs));
1345 for (
const auto& [leaf, control_blocks] : input.
m_tap_scripts) {
1346 const auto& [
script, leaf_ver] = leaf;
1349 script_info.
pushKV(
"leaf_ver", leaf_ver);
1351 for (
const auto& control_block : control_blocks) {
1354 script_info.
pushKV(
"control_blocks", std::move(control_blocks_univ));
1355 tap_scripts.
push_back(std::move(script_info));
1357 in.
pushKV(
"taproot_scripts", std::move(tap_scripts));
1364 const auto& [leaf_hashes, origin] = leaf_origin;
1370 for (
const auto& leaf_hash : leaf_hashes) {
1373 path_obj.
pushKV(
"leaf_hashes", std::move(leaf_hashes_arr));
1374 keypaths.
push_back(std::move(path_obj));
1376 in.
pushKV(
"taproot_bip32_derivs", std::move(keypaths));
1396 for (
const auto& pub : parts) {
1399 musig_part.
pushKV(
"participant_pubkeys", part_pubkeys);
1402 in.
pushKV(
"musig2_participant_pubkeys", musig_pubkeys);
1407 const auto& [agg, lh] = agg_lh;
1408 for (
const auto& [part, pubnonce] : part_pubnonce) {
1412 if (!lh.IsNull()) info.
pushKV(
"leaf_hash",
HexStr(lh));
1417 in.
pushKV(
"musig2_pubnonces", musig_pubnonces);
1422 const auto& [agg, lh] = agg_lh;
1423 for (
const auto& [part, psig] : part_psig) {
1427 if (!lh.IsNull()) info.
pushKV(
"leaf_hash",
HexStr(lh));
1432 in.
pushKV(
"musig2_partial_sigs", musig_partial_sigs);
1440 this_prop.
pushKV(
"identifier",
HexStr(entry.identifier));
1441 this_prop.
pushKV(
"subtype", entry.subtype);
1444 proprietary.
push_back(std::move(this_prop));
1446 in.
pushKV(
"proprietary", std::move(proprietary));
1450 if (input.
unknown.size() > 0) {
1452 for (
auto entry : input.
unknown) {
1455 in.
pushKV(
"unknown", std::move(unknowns));
1460 result.
pushKV(
"inputs", std::move(inputs));
1465 for (
unsigned int i = 0; i < psbtx.
outputs.size(); ++i) {
1472 out.pushKV(
"redeem_script", std::move(r));
1477 out.pushKV(
"witness_script", std::move(r));
1490 out.pushKV(
"bip32_derivs", std::move(keypaths));
1498 out.pushKV(
"script", spk);
1511 elem.
pushKV(
"depth", depth);
1512 elem.
pushKV(
"leaf_ver", leaf_ver);
1516 out.pushKV(
"taproot_tree", std::move(tree));
1523 const auto& [leaf_hashes, origin] = leaf_origin;
1529 for (
const auto& leaf_hash : leaf_hashes) {
1532 path_obj.
pushKV(
"leaf_hashes", std::move(leaf_hashes_arr));
1533 keypaths.
push_back(std::move(path_obj));
1535 out.pushKV(
"taproot_bip32_derivs", std::move(keypaths));
1545 for (
const auto& pub : parts) {
1548 musig_part.
pushKV(
"participant_pubkeys", part_pubkeys);
1551 out.pushKV(
"musig2_participant_pubkeys", musig_pubkeys);
1559 this_prop.
pushKV(
"identifier",
HexStr(entry.identifier));
1560 this_prop.
pushKV(
"subtype", entry.subtype);
1563 proprietary.
push_back(std::move(this_prop));
1565 out.pushKV(
"proprietary", std::move(proprietary));
1569 if (output.
unknown.size() > 0) {
1571 for (
auto entry : output.
unknown) {
1574 out.pushKV(
"unknown", std::move(unknowns));
1581 output_value += output.
amount;
1584 have_all_utxos =
false;
1587 result.
pushKV(
"outputs", std::move(outputs));
1588 if (have_all_utxos) {
1601 "Combine multiple partially signed Bitcoin transactions into one transaction.\n"
1602 "Implements the Combiner role.\n",
1614 HelpExampleCli(
"combinepsbt", R
"('["mybase64_1", "mybase64_2", "mybase64_3"]')")
1619 std::vector<PartiallySignedTransaction> psbtxs;
1624 for (
unsigned int i = 0; i < txs.
size(); ++i) {
1629 psbtxs.push_back(*psbt_res);
1632 std::optional<PartiallySignedTransaction> merged_psbt =
CombinePSBTs(psbtxs);
1638 ssTx << *merged_psbt;
1647 "Finalize the inputs of a PSBT. If the transaction is fully signed, it will produce a\n"
1648 "network serialized transaction which can be broadcast with sendrawtransaction. Otherwise a PSBT will be\n"
1649 "created which has the final_scriptSig and final_scriptwitness fields filled for inputs that are complete.\n"
1650 "Implements the Finalizer and Extractor roles.\n",
1654 " extract and return the complete transaction in normal network serialization instead of the PSBT."},
1659 {
RPCResult::Type::STR,
"psbt",
true,
"The base64-encoded partially signed transaction if not extracted"},
1676 bool extract = request.params[1].isNull() || (!request.params[1].isNull() && request.params[1].get_bool());
1683 std::string result_str;
1687 result_str =
HexStr(ssTx);
1688 result.
pushKV(
"hex", result_str);
1692 result.
pushKV(
"psbt", result_str);
1694 result.
pushKV(
"complete", complete);
1705 "Creates a transaction in the Partially Signed Transaction format.\n"
1706 "Implements the Creator role.\n"
1707 "Note that the transaction's inputs are not signed, and\n"
1708 "it is not stored in the wallet or transmitted to the network.\n",
1709 Cat<std::vector<RPCArg>>(
1719 HelpExampleCli(
"createpsbt",
"\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"address\\\":0.01}]\"")
1723 std::optional<bool> rbf;
1724 if (!request.params[3].isNull()) {
1725 rbf = request.params[3].
get_bool();
1730 uint32_t psbt_version = 2;
1731 if (!request.params[5].isNull()) {
1732 psbt_version = request.params[5].getInt<uint32_t>();
1734 if (psbt_version != 2 && psbt_version != 0) {
1752 "Converts a network serialized transaction to a PSBT. This should be used only with createrawtransaction and fundrawtransaction\n"
1753 "createpsbt and walletcreatefundedpsbt should be used for new applications.\n",
1757 " will continue. If false, RPC will fail if any signatures are present."},
1759 "If iswitness is not present, heuristic tests will be used in decoding.\n"
1760 "If true, only witness deserialization will be tried.\n"
1761 "If false, only non-witness deserialization will be tried.\n"
1762 "This boolean should reflect whether the transaction has inputs\n"
1763 "(e.g. fully valid, or on-chain transactions), if known by the caller."
1771 "\nCreate a transaction\n"
1772 +
HelpExampleCli(
"createrawtransaction",
"\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"") +
1773 "\nConvert the transaction to a PSBT\n"
1780 bool permitsigdata = request.params[1].isNull() ? false : request.params[1].get_bool();
1781 bool witness_specified = !request.params[2].isNull();
1782 bool iswitness = witness_specified ? request.params[2].get_bool() :
false;
1783 const bool try_witness = witness_specified ? iswitness :
true;
1784 const bool try_no_witness = witness_specified ? !iswitness :
true;
1785 if (!
DecodeHexTx(tx, request.params[0].get_str(), try_no_witness, try_witness)) {
1799 uint32_t psbt_version = 2;
1800 if (!request.params[3].isNull()) {
1801 psbt_version = request.params[3].getInt<uint32_t>();
1803 if (psbt_version != 2 && psbt_version != 0) {
1821 "Updates all segwit inputs and outputs in a PSBT with data from output descriptors, the UTXO set, txindex, or the mempool.\n",
1833 RPCResult::Type::STR,
"",
"The base64-encoded partially signed transaction with inputs updated"
1842 if (!request.params[1].isNull()) {
1843 auto descs = request.params[1].get_array();
1844 for (
size_t i = 0; i < descs.size(); ++i) {
1851 request.params[0].get_str(),
1868 "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"
1869 "No input in any of the PSBTs can be in more than one of the PSBTs.\n",
1885 std::vector<PartiallySignedTransaction> psbtxs;
1888 if (txs.
size() <= 1) {
1892 uint32_t best_version = 1;
1893 uint32_t best_locktime = 0xffffffff;
1894 for (
unsigned int i = 0; i < txs.
size(); ++i) {
1899 psbtxs.push_back(*psbt_res);
1910 if (psbt_locktime < best_locktime) {
1911 best_locktime = psbt_locktime;
1922 for (
auto& psbt : psbtxs) {
1923 for (
const PSBTInput& input : psbt.inputs) {
1924 if (!merged_psbt.
AddInput(input)) {
1928 for (
const PSBTOutput& output : psbt.outputs) {
1931 for (
auto& xpub_pair : psbt.m_xpubs) {
1932 if (!merged_psbt.
m_xpubs.contains(xpub_pair.first)) {
1933 merged_psbt.
m_xpubs[xpub_pair.first] = xpub_pair.second;
1935 merged_psbt.
m_xpubs[xpub_pair.first].insert(xpub_pair.second.begin(), xpub_pair.second.end());
1938 merged_psbt.
unknown.insert(psbt.unknown.begin(), psbt.unknown.end());
1942 std::vector<int> input_indices(merged_psbt.
inputs.size());
1943 std::iota(input_indices.begin(), input_indices.end(), 0);
1944 std::vector<int> output_indices(merged_psbt.
outputs.size());
1945 std::iota(output_indices.begin(), output_indices.end(), 0);
1949 std::shuffle(output_indices.begin(), output_indices.end(),
FastRandomContext());
1952 for (
int i : input_indices) {
1955 for (
int i : output_indices) {
1961 ssTx << shuffled_psbt;
1971 "Analyzes and provides information about the current status of a PSBT and its inputs\n",
1984 {
RPCResult::Type::OBJ,
"missing",
true,
"Things that are missing that are required to complete this input",
1988 {
RPCResult::Type::STR_HEX,
"keyid",
"Public key ID, hash160 of the public key, of a public key whose BIP 32 derivation path is missing"},
1992 {
RPCResult::Type::STR_HEX,
"keyid",
"Public key ID, hash160 of the public key, of a public key whose signature is missing"},
1997 {
RPCResult::Type::STR,
"next",
true,
"Role of the next person that this input needs to go to"},
2000 {
RPCResult::Type::NUM,
"estimated_vsize",
true,
"Estimated vsize of the final signed transaction"},
2001 {
RPCResult::Type::STR_AMOUNT,
"estimated_feerate",
true,
"Estimated feerate of the final signed transaction in " +
CURRENCY_UNIT +
"/kvB. Shown only if all UTXO slots in the PSBT have been filled"},
2002 {
RPCResult::Type::STR_AMOUNT,
"fee",
true,
"The transaction fee paid. Shown only if all UTXO slots in the PSBT have been filled"},
2023 for (
const auto& input : psbta.
inputs) {
2027 input_univ.
pushKV(
"has_utxo", input.has_utxo);
2028 input_univ.
pushKV(
"is_final", input.is_final);
2031 if (!input.missing_pubkeys.empty()) {
2033 for (
const CKeyID& pubkey : input.missing_pubkeys) {
2036 missing.
pushKV(
"pubkeys", std::move(missing_pubkeys_univ));
2038 if (!input.missing_redeem_script.IsNull()) {
2039 missing.
pushKV(
"redeemscript",
HexStr(input.missing_redeem_script));
2041 if (!input.missing_witness_script.IsNull()) {
2042 missing.
pushKV(
"witnessscript",
HexStr(input.missing_witness_script));
2044 if (!input.missing_sigs.empty()) {
2046 for (
const CKeyID& pubkey : input.missing_sigs) {
2049 missing.
pushKV(
"signatures", std::move(missing_sigs_univ));
2051 if (!missing.
getKeys().empty()) {
2052 input_univ.
pushKV(
"missing", std::move(missing));
2054 inputs_result.
push_back(std::move(input_univ));
2056 if (!inputs_result.
empty()) result.
pushKV(
"inputs", std::move(inputs_result));
2064 if (psbta.
fee != std::nullopt) {
2068 if (!psbta.
error.empty()) {
2080 "descriptorprocesspsbt",
2081 "Update all segwit inputs in a PSBT with information from output descriptors, the UTXO set or the mempool. \n"
2082 "Then, sign the inputs we are able to with information from the output descriptors. ",
2092 {
"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"
2097 " \"ALL|ANYONECANPAY\"\n"
2098 " \"NONE|ANYONECANPAY\"\n"
2099 " \"SINGLE|ANYONECANPAY\""},
2112 HelpExampleCli(
"descriptorprocesspsbt",
"\"psbt\" \"[\\\"descriptor1\\\", \\\"descriptor2\\\"]\"") +
2113 HelpExampleCli(
"descriptorprocesspsbt",
"\"psbt\" \"[{\\\"desc\\\":\\\"mydescriptor\\\", \\\"range\\\":21}]\"")
2120 auto descs = request.params[1].get_array();
2121 for (
size_t i = 0; i < descs.size(); ++i) {
2126 bool bip32derivs = request.params[3].isNull() ? true : request.params[3].get_bool();
2127 bool finalize = request.params[4].isNull() ? true : request.params[4].get_bool();
2130 request.params[0].get_str(),
2137 bool complete =
true;
2138 const std::optional<PrecomputedTransactionData> txdata_opt{
PrecomputePSBTData(psbtx)};
2140 for (
unsigned int i = 0; i < psbtx.
inputs.size(); ++i) {
2150 result.
pushKV(
"complete", complete);
2183 for (
const auto& c : commands) {
2184 t.appendCommand(c.name, &c);
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
bool MoneyRange(const CAmount &nValue)
int64_t CAmount
Amount in satoshis (Can be negative)
std::string EncodeBase58Check(std::span< const unsigned char > input)
Encode a byte span into a base58-encoded string, including checksum.
std::string WriteHDKeypath(const std::vector< uint32_t > &keypath, bool apostrophe)
Write HD keypaths as strings.
@ BLOCK_HAVE_DATA
full block available in blk*.dat
#define CHECK_NONFATAL(condition)
Identity function.
#define NONFATAL_UNREACHABLE()
NONFATAL_UNREACHABLE() is a macro that is used to mark unreachable code.
std::vector< CTransactionRef > vtx
The block chain is a tree shaped structure starting with the genesis block at the root,...
int64_t GetBlockTime() const
int nHeight
height of the entry in the chain. The genesis block has height 0
Undo information for a CBlock.
std::vector< CTxUndo > vtxundo
bool Contains(const CBlockIndex &index) const
Efficiently check whether a block is present in this chain.
int Height() const
Return the maximal height in the chain.
const CBlock & GenesisBlock() const
CCoinsView that adds a memory cache for transactions to another CCoinsView.
CCoinsView that brings transactions from a mempool into view.
An encapsulated private key.
bool IsValid() const
Check whether this private key is valid.
CPubKey GetPubKey() const
Compute the public key from a private key.
A reference to a CKey: the Hash160 of its serialized public key.
An encapsulated public key.
bool IsCompressed() const
Check whether this is a compressed public key.
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Serialized script, used inside transaction inputs and outputs.
A reference to a CScript: the Hash160 of its serialization.
The basic transaction that is broadcasted on the network and contained in blocks.
static constexpr uint32_t CURRENT_VERSION
An input of a transaction.
CScriptWitness scriptWitness
Only serialized through CTransaction.
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
An output of a transaction.
Undo information for a CTransaction.
Chainstate stores and provides an API to update our local knowledge of the current best chain.
CChain m_chain
The current chain of blockheaders we consult and build on.
CCoinsViewCache & CoinsTip() EXCLUSIVE_LOCKS_REQUIRED(
node::BlockManager & m_blockman
Reference to a BlockManager instance which itself is shared across all Chainstate instances.
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
Chainstate & ActiveChainstate() const
Alternatives to CurrentChainstate() used by older code to query latest chainstate information without...
const CChainParams & GetParams() const
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
CTxOut out
unspent transaction output
bool IsSpent() const
Either this coin never existed (see e.g.
static CoinsViewEmpty & Get()
Double ended buffer combining vector and stream-like interfaces.
A signature creator for transactions.
A structure for PSBTs which contains per output information.
std::map< CPubKey, std::vector< CPubKey > > m_musig2_participants
XOnlyPubKey m_tap_internal_key
std::map< XOnlyPubKey, std::pair< std::set< uint256 >, KeyOriginInfo > > m_tap_bip32_paths
std::set< PSBTProprietary > m_proprietary
std::map< CPubKey, KeyOriginInfo > hd_keypaths
std::vector< std::tuple< uint8_t, uint8_t, std::vector< unsigned char > > > m_tap_tree
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
A version of CTransaction with the PSBT format.
std::optional< std::bitset< 8 > > m_tx_modifiable
uint32_t GetVersion() const
std::map< KeyOriginInfo, std::set< CExtPubKey > > m_xpubs
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
std::vector< PSBTInput > inputs
std::optional< CMutableTransaction > GetUnsignedTx() const
std::vector< PSBTOutput > outputs
std::set< PSBTProprietary > m_proprietary
bool AddOutput(const PSBTOutput &psbtout)
std::optional< uint32_t > fallback_locktime
bool AddInput(const PSBTInput &psbtin)
auto Arg(std::string_view key) const
Helper to get a required or default-valued request argument.
void push_back(UniValue val)
const std::vector< std::string > & getKeys() const
const UniValue & get_array() const
void pushKV(std::string key, UniValue val)
bool IsNull() const
Test whether this is the 0 key (the result of default construction).
constexpr bool IsNull() const
std::string GetHex() const
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.
std::string ToString() const
std::string GetHex() const
static transaction_identifier FromUint256(const uint256 &id)
std::string EncodeHexTx(const CTransaction &tx)
std::string SighashToStr(unsigned char sighash_type)
bool DecodeHexTx(CMutableTransaction &tx, const std::string &hex_tx, bool try_no_witness, bool try_witness)
void ScriptToUniv(const CScript &script, UniValue &out, bool include_hex, bool include_address, const SigningProvider *provider)
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)
std::string ScriptToAsmStr(const CScript &script, const bool fAttemptSighashDecode)
Create the assembly string representation of a CScript object.
UniValue ValueFromAmount(const CAmount amount)
TxVerbosity
Verbose level for block's transaction.
@ 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)
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
const std::string CURRENCY_UNIT
uint160 Hash160(const T1 &in1)
Compute the 160-bit hash an object.
std::string HexStr(const std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
std::string EncodeDestination(const CTxDestination &dest)
CKey DecodeSecret(const std::string &str)
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.
void FindCoins(const NodeContext &node, std::map< COutPoint, Coin > &coins)
Look up unspent output information.
bilingual_str ErrorString(const Result< T > &result)
is a home for public enum and struct type definitions that are used internally by node code,...
static constexpr TransactionSerParams TX_WITH_WITNESS
std::shared_ptr< const CTransaction > CTransactionRef
void UpdatePSBTOutput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index)
Updates a PSBTOutput with information from provider.
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.
std::string PSBTRoleName(PSBTRole role)
util::Result< PartiallySignedTransaction > DecodeBase64PSBT(const std::string &base64_tx)
Decode a base64ed PSBT into a PartiallySignedTransaction.
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...
void RemoveUnnecessaryTransactions(PartiallySignedTransaction &psbtx)
Reduces the size of the PSBT by dropping unnecessary non_witness_utxos (i.e.
std::optional< PrecomputedTransactionData > PrecomputePSBTData(const PartiallySignedTransaction &psbt)
Compute a PrecomputedTransactionData object from a psbt.
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.
bool FinalizeAndExtractPSBT(PartiallySignedTransaction &psbtx, CMutableTransaction &result)
Finalizes a PSBT if possible, and extracts it to a CMutableTransaction if it could be finalized.
bool PSBTInputSigned(const PSBTInput &input)
Checks whether a PSBTInput is already signed by checking for non-null finalized fields.
const unsigned int BIP32_EXTKEY_WITH_VERSION_SIZE
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)
@ RPC_MISC_ERROR
General application defined errors.
@ RPC_INVALID_PARAMETER
Invalid, missing or duplicate parameter.
@ RPC_VERIFY_ERROR
General error during transaction or block submission.
@ RPC_DESERIALIZATION_ERROR
Error parsing or validating structure in raw format.
@ RPC_INVALID_ADDRESS_OR_KEY
Invalid address or key.
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 ...
std::string HelpExampleCli(const std::string &methodname, const std::string &args)
std::vector< unsigned char > ParseHexV(const UniValue &v, std::string_view name)
std::vector< RPCResult > ElideGroup(std::vector< RPCResult > fields, std::string summary)
Stamp elision onto an entire vector of RPCResult fields at once.
UniValue JSONRPCPSBTError(PSBTError err)
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
const std::string UNIX_EPOCH_TIME
String used to describe UNIX epoch time in documentation, factored out to a constant for consistency.
std::string GetAllOutputTypes()
Gets all existing output types formatted for RPC help sections.
int ParseVerbosity(const UniValue &arg, int default_verbosity, bool allow_bool)
Parses verbosity from provided UniValue.
std::optional< int > ParseSighashString(const UniValue &sighash)
Returns a sighash value corresponding to the passed in argument.
uint256 ParseHashV(const UniValue &v, std::string_view name)
Utilities: convert hex-encoded Values (throws error if not hex).
std::vector< RPCResult > ScriptPubKeyDoc()
#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.
opcodetype
Script opcodes.
NodeContext & EnsureAnyNodeContext(const std::any &context)
CTxMemPool & EnsureMemPool(const NodeContext &node)
ChainstateManager & EnsureChainman(const NodeContext &node)
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
void UpdateInput(CTxIn &input, const SignatureData &data)
bool IsSegWitOutput(const SigningProvider &provider, const CScript &script)
Check whether a scriptPubKey is known to be segwit.
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn, const CTxOut &txout)
Extract signature data from a transaction input, and insert it.
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.
@ WITNESS_UNKNOWN
Only for Witness versions not already defined above.
@ ANCHOR
anyone can spend script
@ NULL_DATA
unspendable OP_RETURN script that carries data
A mutable version of CTransaction.
std::vector< std::vector< unsigned char > > stack
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.
@ OMITTED
Optional argument for which the default value is omitted from help text for one of two reasons:
@ 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)
NodeContext struct containing references to chain state and connection state.
Holds the results of AnalyzePSBT (miscellaneous information about a PSBT)
std::vector< PSBTInputAnalysis > inputs
More information about the individual inputs of the transaction.
std::string error
Error message.
std::optional< CAmount > fee
Amount of fee being paid by the transaction.
std::optional< size_t > estimated_vsize
Estimated weight of the transaction.
std::optional< CFeeRate > estimated_feerate
Estimated feerate (fee / weight) of the transaction.
PSBTRole next
Which of the BIP 174 roles needs to handle the transaction next.
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
std::vector< uint16_t > keys
FuzzedDataProvider provider
std::unique_ptr< TxIndex > g_txindex
The global transaction index, used in GetTransaction. May be null.
std::string EncodeBase64(std::span< const unsigned char > input)
V Cat(V v1, V &&v2)
Concatenate two vectors, moving elements.