Eliminate fee overpaying edge case when subtracting fee from recipients

This commit is contained in:
Alex Morcos 2017-07-27 17:01:39 -04:00
parent 0b11a07848
commit 49d903e696

View file

@ -2774,10 +2774,6 @@ bool CWallet::CreateTransaction(const std::vector<CRecipient>& vecSend, CWalletT
// selected to meet nFeeNeeded result in a transaction that // selected to meet nFeeNeeded result in a transaction that
// requires less fee than the prior iteration. // requires less fee than the prior iteration.
// TODO: The case where nSubtractFeeFromAmount > 0 remains
// to be addressed because it requires returning the fee to
// the payees and not the change output.
// If we have no change and a big enough excess fee, then // If we have no change and a big enough excess fee, then
// try to construct transaction again only without picking // try to construct transaction again only without picking
// new inputs. We now know we only need the smaller fee // new inputs. We now know we only need the smaller fee
@ -2804,6 +2800,8 @@ bool CWallet::CreateTransaction(const std::vector<CRecipient>& vecSend, CWalletT
else if (!pick_new_inputs) { else if (!pick_new_inputs) {
// This shouldn't happen, we should have had enough excess // This shouldn't happen, we should have had enough excess
// fee to pay for the new output and still meet nFeeNeeded // fee to pay for the new output and still meet nFeeNeeded
// Or we should have just subtracted fee from recipients and
// nFeeNeeded should not have changed
strFailReason = _("Transaction fee and change calculation failed"); strFailReason = _("Transaction fee and change calculation failed");
return false; return false;
} }
@ -2820,6 +2818,12 @@ bool CWallet::CreateTransaction(const std::vector<CRecipient>& vecSend, CWalletT
} }
} }
// If subtracting fee from recipients, we now know what fee we
// need to subtract, we have no reason to reselect inputs
if (nSubtractFeeFromAmount > 0) {
pick_new_inputs = false;
}
// Include more fee and try again. // Include more fee and try again.
nFeeRet = nFeeNeeded; nFeeRet = nFeeNeeded;
continue; continue;