From 43dbc696b9e9bb5472b01708d33e022042b5ce3b Mon Sep 17 00:00:00 2001 From: Pol Espinasa Date: Thu, 7 Nov 2024 19:42:09 +0100 Subject: [PATCH] Decode P2WSH and P2SH if data from prev tx is available on decodingawtransaction functions --- src/core_write.cpp | 12 ++++++++-- src/rpc/rawtransaction.cpp | 6 +++++ src/script/script.cpp | 45 ++++++++++++++++++++++++++++++++++++++ src/script/script.h | 3 +++ 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/core_write.cpp b/src/core_write.cpp index 253dfde1006..4a3b61699de 100644 --- a/src/core_write.cpp +++ b/src/core_write.cpp @@ -201,23 +201,31 @@ void TxToUniv(const CTransaction& tx, const uint256& block_hash, UniValue& entry o.pushKV("hex", HexStr(txin.scriptSig)); in.pushKV("scriptSig", std::move(o)); } - if (!tx.vin[i].scriptWitness.IsNull()) { + + if (!txin.scriptWitness.IsNull()) { UniValue txinwitness(UniValue::VARR); for (const auto& item : tx.vin[i].scriptWitness.stack) { txinwitness.push_back(HexStr(item)); } in.pushKV("txinwitness", std::move(txinwitness)); } + if (have_undo) { const Coin& prev_coin = txundo->vprevout[i]; const CTxOut& prev_txout = prev_coin.out; amt_total_in += prev_txout.nValue; + std::pair script = GetScriptForTransactionInput(prev_txout.scriptPubKey, txin); + UniValue redeemScript(UniValue::VOBJ); + ScriptToUniv(script.first, redeemScript, false, true); + if (script.second != -2) { + in.pushKV("redeemScript", std::move(redeemScript)); + } + if (verbosity == TxVerbosity::SHOW_DETAILS_AND_PREVOUT) { UniValue o_script_pub_key(UniValue::VOBJ); ScriptToUniv(prev_txout.scriptPubKey, /*out=*/o_script_pub_key, /*include_hex=*/true, /*include_address=*/true); - UniValue p(UniValue::VOBJ); p.pushKV("generated", bool(prev_coin.fCoinBase)); p.pushKV("height", uint64_t(prev_coin.nHeight)); diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index db35421688e..be93794c8c2 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -119,6 +119,12 @@ static std::vector DecodeTxDoc(const std::string& txid_field_doc) { {RPCResult::Type::STR_HEX, "hex", "hex-encoded witness data (if any)"}, }}, + {RPCResult::Type::OBJ, "redeemScript", /*optional=*/true, "The decoded redeem script", + { + {RPCResult::Type::STR, "asm", "Human readable disassembly of the redeem script"}, + {RPCResult::Type::STR, "desc", "Descriptor of the redeem script"}, + {RPCResult::Type::STR, "type", "Type of the redeem script"}, + }}, {RPCResult::Type::NUM, "sequence", "The script sequence number"}, }}, }}, diff --git a/src/script/script.cpp b/src/script/script.cpp index d650db9a0d6..22a1bf5c604 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -10,9 +10,13 @@ #include #include #include +#include