Add more clear interface for CoinControl.h regarding individual feerate

This commit is contained in:
Jonas Schnelli 2016-05-06 11:01:50 +02:00
parent 3b35e4896b
commit 04eaa90958
No known key found for this signature in database
GPG key ID: 29D4BCB6416F53EC
4 changed files with 13 additions and 5 deletions

View file

@ -18,7 +18,9 @@ public:
bool fAllowWatchOnly; bool fAllowWatchOnly;
//! Minimum absolute fee (not per kilobyte) //! Minimum absolute fee (not per kilobyte)
CAmount nMinimumTotalFee; CAmount nMinimumTotalFee;
//! Feerate to use (0 = estimate fee with payTxFee fallback) //! Override estimated feerate
bool fOverrideFeeRate;
//! Feerate to use if overrideFeeRate is true
CFeeRate nFeeRate; CFeeRate nFeeRate;
CCoinControl() CCoinControl()
@ -34,6 +36,7 @@ public:
setSelected.clear(); setSelected.clear();
nMinimumTotalFee = 0; nMinimumTotalFee = 0;
nFeeRate = CFeeRate(0); nFeeRate = CFeeRate(0);
fOverrideFeeRate = false;
} }
bool HasSelected() const bool HasSelected() const

View file

@ -2486,6 +2486,7 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp)
bool includeWatching = false; bool includeWatching = false;
bool lockUnspents = false; bool lockUnspents = false;
CFeeRate feeRate = CFeeRate(0); CFeeRate feeRate = CFeeRate(0);
bool overrideEstimatedFeerate = false;
if (params.size() > 1) { if (params.size() > 1) {
if (params[1].type() == UniValue::VBOOL) { if (params[1].type() == UniValue::VBOOL) {
@ -2518,7 +2519,10 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp)
lockUnspents = options["lockUnspents"].get_bool(); lockUnspents = options["lockUnspents"].get_bool();
if (options.exists("feeRate")) if (options.exists("feeRate"))
{
feeRate = CFeeRate(options["feeRate"].get_real()); feeRate = CFeeRate(options["feeRate"].get_real());
overrideEstimatedFeerate = true;
}
} }
} }
@ -2537,7 +2541,7 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp)
CAmount nFeeOut; CAmount nFeeOut;
string strFailReason; string strFailReason;
if(!pwalletMain->FundTransaction(tx, nFeeOut, feeRate, changePosition, strFailReason, includeWatching, lockUnspents, changeAddress)) if(!pwalletMain->FundTransaction(tx, nFeeOut, overrideEstimatedFeerate, feeRate, changePosition, strFailReason, includeWatching, lockUnspents, changeAddress))
throw JSONRPCError(RPC_INTERNAL_ERROR, strFailReason); throw JSONRPCError(RPC_INTERNAL_ERROR, strFailReason);
UniValue result(UniValue::VOBJ); UniValue result(UniValue::VOBJ);

View file

@ -1918,7 +1918,7 @@ bool CWallet::SelectCoins(const vector<COutput>& vAvailableCoins, const CAmount&
return res; return res;
} }
bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, const CFeeRate& specificFeeRate, int& nChangePosInOut, std::string& strFailReason, bool includeWatching, bool lockUnspents, const CTxDestination& destChange) bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, bool overrideEstimatedFeeRate, const CFeeRate& specificFeeRate, int& nChangePosInOut, std::string& strFailReason, bool includeWatching, bool lockUnspents, const CTxDestination& destChange)
{ {
vector<CRecipient> vecSend; vector<CRecipient> vecSend;
@ -1933,6 +1933,7 @@ bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, const C
coinControl.destChange = destChange; coinControl.destChange = destChange;
coinControl.fAllowOtherInputs = true; coinControl.fAllowOtherInputs = true;
coinControl.fAllowWatchOnly = includeWatching; coinControl.fAllowWatchOnly = includeWatching;
coinControl.fOverrideFeeRate = overrideEstimatedFeeRate;
coinControl.nFeeRate = specificFeeRate; coinControl.nFeeRate = specificFeeRate;
BOOST_FOREACH(const CTxIn& txin, tx.vin) BOOST_FOREACH(const CTxIn& txin, tx.vin)
@ -2244,7 +2245,7 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt
if (coinControl && nFeeNeeded > 0 && coinControl->nMinimumTotalFee > nFeeNeeded) { if (coinControl && nFeeNeeded > 0 && coinControl->nMinimumTotalFee > nFeeNeeded) {
nFeeNeeded = coinControl->nMinimumTotalFee; nFeeNeeded = coinControl->nMinimumTotalFee;
} }
if (coinControl && coinControl->nFeeRate > CFeeRate(0)) if (coinControl && coinControl->fOverrideFeeRate)
nFeeNeeded = coinControl->nFeeRate.GetFee(nBytes); nFeeNeeded = coinControl->nFeeRate.GetFee(nBytes);
// If we made it here and we aren't even able to meet the relay fee on the next pass, give up // If we made it here and we aren't even able to meet the relay fee on the next pass, give up

View file

@ -740,7 +740,7 @@ public:
* Insert additional inputs into the transaction by * Insert additional inputs into the transaction by
* calling CreateTransaction(); * calling CreateTransaction();
*/ */
bool FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, const CFeeRate& specificFeeRate, int& nChangePosInOut, std::string& strFailReason, bool includeWatching, bool lockUnspents, const CTxDestination& destChange = CNoDestination()); bool FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, bool overrideEstimatedFeeRate, const CFeeRate& specificFeeRate, int& nChangePosInOut, std::string& strFailReason, bool includeWatching, bool lockUnspents, const CTxDestination& destChange = CNoDestination());
/** /**
* Create a new transaction paying the recipients with a set of coins * Create a new transaction paying the recipients with a set of coins