rpc: add decoded tx details to gettransaction with extra wallet fields

This commit is contained in:
Matthew Zipkin
2025-05-15 14:18:11 -04:00
parent ad1c3bdba5
commit 060bb55508
4 changed files with 18 additions and 13 deletions

View File

@@ -242,7 +242,7 @@ static RPCHelpMan getrawtransaction()
{RPCResult::Type::NUM, "time", /*optional=*/true, "Same as \"blocktime\""}, {RPCResult::Type::NUM, "time", /*optional=*/true, "Same as \"blocktime\""},
{RPCResult::Type::STR_HEX, "hex", "The serialized, hex-encoded data for 'txid'"}, {RPCResult::Type::STR_HEX, "hex", "The serialized, hex-encoded data for 'txid'"},
}, },
DecodeTxDoc(/*txid_field_doc=*/"The transaction id (same as provided)")), DecodeTxDoc(/*txid_field_doc=*/"The transaction id (same as provided)", /*wallet=*/false)),
}, },
RPCResult{"for verbosity = 2", RPCResult{"for verbosity = 2",
RPCResult::Type::OBJ, "", "", RPCResult::Type::OBJ, "", "",
@@ -415,7 +415,7 @@ static RPCHelpMan decoderawtransaction()
}, },
RPCResult{ RPCResult{
RPCResult::Type::OBJ, "", "", RPCResult::Type::OBJ, "", "",
DecodeTxDoc(/*txid_field_doc=*/"The transaction id"), DecodeTxDoc(/*txid_field_doc=*/"The transaction id", /*wallet=*/false),
}, },
RPCExamples{ RPCExamples{
HelpExampleCli("decoderawtransaction", "\"hexstring\"") HelpExampleCli("decoderawtransaction", "\"hexstring\"")

View File

@@ -335,7 +335,7 @@ void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const
} }
} }
std::vector<RPCResult> DecodeTxDoc(const std::string& txid_field_doc) std::vector<RPCResult> DecodeTxDoc(const std::string& txid_field_doc, bool wallet)
{ {
return { return {
{RPCResult::Type::STR_HEX, "txid", txid_field_doc}, {RPCResult::Type::STR_HEX, "txid", txid_field_doc},
@@ -366,13 +366,17 @@ std::vector<RPCResult> DecodeTxDoc(const std::string& txid_field_doc)
}}, }},
{RPCResult::Type::ARR, "vout", "", {RPCResult::Type::ARR, "vout", "",
{ {
{RPCResult::Type::OBJ, "", "", {RPCResult::Type::OBJ, "", "", Cat(
{ {
{RPCResult::Type::STR_AMOUNT, "value", "The value in " + CURRENCY_UNIT}, {RPCResult::Type::STR_AMOUNT, "value", "The value in " + CURRENCY_UNIT},
{RPCResult::Type::NUM, "n", "index"}, {RPCResult::Type::NUM, "n", "index"},
{RPCResult::Type::OBJ, "scriptPubKey", "", ScriptPubKeyDoc()}, {RPCResult::Type::OBJ, "scriptPubKey", "", ScriptPubKeyDoc()},
{RPCResult::Type::BOOL, "ischange", /*optional=*/true, "Output script is change (only if wallet transaction and true for selected rpcwallet)"}, },
}}, wallet ?
std::vector<RPCResult>{{RPCResult::Type::BOOL, "ischange", /*optional=*/true, "Output script is change (only present if true)"}} :
std::vector<RPCResult>{}
)
},
}}, }},
}; };
} }

View File

@@ -56,7 +56,7 @@ void AddOutputs(CMutableTransaction& rawTx, const UniValue& outputs_in);
/** Create a transaction from univalue parameters */ /** Create a transaction from univalue parameters */
CMutableTransaction ConstructTransaction(const UniValue& inputs_in, const UniValue& outputs_in, const UniValue& locktime, std::optional<bool> rbf); CMutableTransaction ConstructTransaction(const UniValue& inputs_in, const UniValue& outputs_in, const UniValue& locktime, std::optional<bool> rbf);
/** Explain the UniValue "decoded" transaction object **/ /** Explain the UniValue "decoded" transaction object, may include extra fields if processed by wallet **/
std::vector<RPCResult> DecodeTxDoc(const std::string& txid_field_doc); std::vector<RPCResult> DecodeTxDoc(const std::string& txid_field_doc, bool wallet);
#endif // BITCOIN_RPC_RAWTRANSACTION_UTIL_H #endif // BITCOIN_RPC_RAWTRANSACTION_UTIL_H

View File

@@ -6,6 +6,7 @@
#include <key_io.h> #include <key_io.h>
#include <policy/rbf.h> #include <policy/rbf.h>
#include <rpc/util.h> #include <rpc/util.h>
#include <rpc/rawtransaction_util.h>
#include <rpc/blockchain.h> #include <rpc/blockchain.h>
#include <util/vector.h> #include <util/vector.h>
#include <wallet/receive.h> #include <wallet/receive.h>
@@ -738,7 +739,7 @@ RPCHelpMan gettransaction()
{RPCResult::Type::STR_HEX, "hex", "Raw data for transaction"}, {RPCResult::Type::STR_HEX, "hex", "Raw data for transaction"},
{RPCResult::Type::OBJ, "decoded", /*optional=*/true, "The decoded transaction (only present when `verbose` is passed)", {RPCResult::Type::OBJ, "decoded", /*optional=*/true, "The decoded transaction (only present when `verbose` is passed)",
{ {
{RPCResult::Type::ELISION, "", "Equivalent to the RPC decoderawtransaction method, or the RPC getrawtransaction method when `verbose` is passed."}, DecodeTxDoc(/*txid_field_doc=*/"The transaction id", /*wallet=*/true),
}}, }},
RESULT_LAST_PROCESSED_BLOCK, RESULT_LAST_PROCESSED_BLOCK,
}) })