diff options
| author | Alex Morcos <[email protected]> | 2017-01-05 09:10:08 -0500 |
|---|---|---|
| committer | Alex Morcos <[email protected]> | 2017-01-06 10:12:05 -0500 |
| commit | 42f5ce40931402aaa395ef2959deb64e9a9fff02 (patch) | |
| tree | 650bad83761a48cafdeed51a047fb3a63b559a3c | |
| parent | Merge #9138: Improve fee estimation (diff) | |
| download | discoin-42f5ce40931402aaa395ef2959deb64e9a9fff02.tar.xz discoin-42f5ce40931402aaa395ef2959deb64e9a9fff02.zip | |
Try to reduce change output to make needed fee in CreateTransaction
Once we've picked coins and dummy-signed the transaction to calculate fee, if we don't have sufficient fee, then try to meet the fee by reducing change before resorting to picking new coins.
| -rw-r--r-- | src/wallet/wallet.cpp | 12 | ||||
| -rw-r--r-- | src/wallet/wallet.h | 4 |
2 files changed, 15 insertions, 1 deletions
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index ff7a03bc5..bdf6d3c7a 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2537,6 +2537,18 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt if (nFeeRet >= nFeeNeeded) break; // Done, enough fee included. + // Try to reduce change to include necessary fee + if (nChangePosInOut != -1 && nSubtractFeeFromAmount == 0) { + CAmount additionalFeeNeeded = nFeeNeeded - nFeeRet; + vector<CTxOut>::iterator change_position = txNew.vout.begin()+nChangePosInOut; + // Only reduce change if remaining amount is still a large enough output. + if (change_position->nValue >= MIN_FINAL_CHANGE + additionalFeeNeeded) { + change_position->nValue -= additionalFeeNeeded; + nFeeRet += additionalFeeNeeded; + break; // Done, able to increase fee from change + } + } + // Include more fee and try again. nFeeRet = nFeeNeeded; continue; diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 1d1f84ebb..b9fa6bb24 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -48,8 +48,10 @@ static const CAmount DEFAULT_TRANSACTION_FEE = 0; static const CAmount DEFAULT_FALLBACK_FEE = 20000; //! -mintxfee default static const CAmount DEFAULT_TRANSACTION_MINFEE = 1000; -//! minimum change amount +//! target minimum change amount static const CAmount MIN_CHANGE = CENT; +//! final minimum change amount after paying for fees +static const CAmount MIN_FINAL_CHANGE = MIN_CHANGE/2; //! Default for -spendzeroconfchange static const bool DEFAULT_SPEND_ZEROCONF_CHANGE = true; //! Default for -sendfreetransactions |