From 97282b090330b74c6a73529f78e63f54568fa98d Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Tue, 31 Mar 2020 01:48:02 +0000 Subject: [PATCH] script: Return total sum of input amounts from SignTransaction when available --- src/script/sign.cpp | 21 ++++++++++++++++++++- src/script/sign.h | 4 +++- src/wallet/scriptpubkeyman.cpp | 8 ++++---- src/wallet/scriptpubkeyman.h | 6 +++--- src/wallet/wallet.cpp | 4 ++-- src/wallet/wallet.h | 2 +- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 85589fe86b..a2bb42c0b3 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -17,6 +17,8 @@ #include #include +#include + typedef std::vector valtype; MutableTransactionSignatureCreator::MutableTransactionSignatureCreator(const CMutableTransaction& tx, unsigned int input_idx, const CAmount& amount, int hash_type) @@ -752,7 +754,7 @@ bool IsSegWitOutput(const SigningProvider& provider, const CScript& script) return false; } -bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore, const std::map& coins, int nHashType, std::map& input_errors) +bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore, const std::map& coins, int nHashType, std::map& input_errors, std::optional* inputs_amount_sum) { bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE); @@ -777,20 +779,37 @@ bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore, } // Sign what we can: + if (inputs_amount_sum) *inputs_amount_sum = 0; for (unsigned int i = 0; i < mtx.vin.size(); ++i) { CTxIn& txin = mtx.vin[i]; auto coin = coins.find(txin.prevout); if (coin == coins.end() || coin->second.IsSpent()) { + if (inputs_amount_sum) { + inputs_amount_sum->reset(); + inputs_amount_sum = nullptr; + } input_errors[i] = _("Input not found or already spent"); continue; } const CScript& prevPubKey = coin->second.out.scriptPubKey; const CAmount& amount = coin->second.out.nValue; + if (inputs_amount_sum && *inputs_amount_sum) { + if (amount > 0) { + **inputs_amount_sum += amount; + } else { + inputs_amount_sum->reset(); + inputs_amount_sum = nullptr; + } + } SignatureData sigdata = DataFromTransaction(mtx, i, coin->second.out); // Only sign SIGHASH_SINGLE if there's a corresponding output: if (!fHashSingle || (i < mtx.vout.size())) { ProduceSignature(*keystore, MutableTransactionSignatureCreator(mtx, i, amount, &txdata, nHashType), prevPubKey, sigdata); + if ((!sigdata.witness) && inputs_amount_sum && *inputs_amount_sum) { + inputs_amount_sum->reset(); + inputs_amount_sum = nullptr; + } } UpdateInput(txin, sigdata); diff --git a/src/script/sign.h b/src/script/sign.h index f46bc55992..613faec3ce 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -15,6 +15,8 @@ #include