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:
Karl-Johan Alm 2018-04-08 11:53:13 +09:00 committed by Luke Dashjr
parent 7a1133787f
commit 5d91e03e63
4 changed files with 20 additions and 6 deletions

View File

@ -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, "", "",

View File

@ -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());

View File

@ -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

View File

@ -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;
},
};