mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-06-04 00:12:33 +02:00
wallet: Show fee in results for signrawtransaction* when known
The fee is considered known when all inputs are segwit inputs (which means amounts are enforced/known)..
This commit is contained in:
parent
7a1133787f
commit
5d91e03e63
@ -760,6 +760,7 @@ static RPCHelpMan signrawtransactionwithkey()
|
||||
{
|
||||
{RPCResult::Type::STR_HEX, "hex", "The hex-encoded raw transaction with signature(s)"},
|
||||
{RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
|
||||
{RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The fee (input amounts minus output amounts), if known"},
|
||||
{RPCResult::Type::ARR, "errors", /*optional=*/true, "Script verification errors (if there are any)",
|
||||
{
|
||||
{RPCResult::Type::OBJ, "", "",
|
||||
|
@ -21,6 +21,8 @@
|
||||
#include <util/strencodings.h>
|
||||
#include <util/translation.h>
|
||||
|
||||
#include <optional>
|
||||
|
||||
void AddInputs(CMutableTransaction& rawTx, const UniValue& inputs_in, std::optional<bool> rbf)
|
||||
{
|
||||
UniValue inputs;
|
||||
@ -308,12 +310,13 @@ void SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore,
|
||||
|
||||
// Script verification errors
|
||||
std::map<int, bilingual_str> input_errors;
|
||||
std::optional<CAmount> inputs_amount_sum;
|
||||
|
||||
bool complete = SignTransaction(mtx, keystore, coins, nHashType, input_errors);
|
||||
SignTransactionResultToJSON(mtx, complete, coins, input_errors, result);
|
||||
bool complete = SignTransaction(mtx, keystore, coins, nHashType, input_errors, &inputs_amount_sum);
|
||||
SignTransactionResultToJSON(mtx, complete, coins, input_errors, result, inputs_amount_sum);
|
||||
}
|
||||
|
||||
void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const std::map<COutPoint, Coin>& coins, const std::map<int, bilingual_str>& input_errors, UniValue& result)
|
||||
void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const std::map<COutPoint, Coin>& coins, const std::map<int, bilingual_str>& input_errors, UniValue& result, const std::optional<CAmount>& inputs_amount_sum)
|
||||
{
|
||||
// Make errors UniValue
|
||||
UniValue vErrors(UniValue::VARR);
|
||||
@ -327,6 +330,13 @@ void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const
|
||||
|
||||
result.pushKV("hex", EncodeHexTx(CTransaction(mtx)));
|
||||
result.pushKV("complete", complete);
|
||||
if (inputs_amount_sum) {
|
||||
CAmount inout_amount = *inputs_amount_sum;
|
||||
for (const CTxOut& txout : mtx.vout) {
|
||||
inout_amount -= txout.nValue;
|
||||
}
|
||||
result.pushKV("fee", ValueFromAmount(inout_amount));
|
||||
}
|
||||
if (!vErrors.empty()) {
|
||||
if (result.exists("errors")) {
|
||||
vErrors.push_backV(result["errors"].getValues());
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <addresstype.h>
|
||||
#include <consensus/amount.h>
|
||||
#include <map>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <optional>
|
||||
|
||||
@ -29,7 +30,7 @@ class SigningProvider;
|
||||
* @param result JSON object where signed transaction results accumulate
|
||||
*/
|
||||
void SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore, const std::map<COutPoint, Coin>& coins, const UniValue& hashType, UniValue& result);
|
||||
void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const std::map<COutPoint, Coin>& coins, const std::map<int, bilingual_str>& input_errors, UniValue& result);
|
||||
void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const std::map<COutPoint, Coin>& coins, const std::map<int, bilingual_str>& input_errors, UniValue& result, const std::optional<CAmount>& inputs_amount_sum);
|
||||
|
||||
/**
|
||||
* Parse a prevtxs UniValue array and get the map of coins from it
|
||||
|
@ -904,6 +904,7 @@ RPCHelpMan signrawtransactionwithwallet()
|
||||
{
|
||||
{RPCResult::Type::STR_HEX, "hex", "The hex-encoded raw transaction with signature(s)"},
|
||||
{RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
|
||||
{RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The fee (input amounts minus output amounts), if known"},
|
||||
{RPCResult::Type::ARR, "errors", /*optional=*/true, "Script verification errors (if there are any)",
|
||||
{
|
||||
{RPCResult::Type::OBJ, "", "",
|
||||
@ -953,10 +954,11 @@ RPCHelpMan signrawtransactionwithwallet()
|
||||
|
||||
// Script verification errors
|
||||
std::map<int, bilingual_str> input_errors;
|
||||
std::optional<CAmount> inputs_amount_sum;
|
||||
|
||||
bool complete = pwallet->SignTransaction(mtx, coins, nHashType, input_errors);
|
||||
bool complete = pwallet->SignTransaction(mtx, coins, nHashType, input_errors, &inputs_amount_sum);
|
||||
UniValue result(UniValue::VOBJ);
|
||||
SignTransactionResultToJSON(mtx, complete, coins, input_errors, result);
|
||||
SignTransactionResultToJSON(mtx, complete, coins, input_errors, result, inputs_amount_sum);
|
||||
return result;
|
||||
},
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user