mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-12 04:42:36 -03:00
Remove checking of mempool min fee from estimateSmartFee.
This check has been moved to the wallet logic GetMinimumFee. The rpc call to estimatesmartfee will now no longer return a result maxed with the mempool min fee, but automated fee calculations from the wallet will produce the same result as before and coincontrol and sendcoins dialogs in the GUI will correctly display the right prospective fee. changes to policy/fees.cpp include a big whitespace indentation change.
This commit is contained in:
parent
2fffaa9738
commit
fd29d3df29
5 changed files with 61 additions and 74 deletions
|
@ -826,8 +826,10 @@ double CBlockPolicyEstimator::estimateConservativeFee(unsigned int doubleTarget,
|
||||||
* estimates, however, required the 95% threshold at 2 * target be met for any
|
* estimates, however, required the 95% threshold at 2 * target be met for any
|
||||||
* longer time horizons also.
|
* longer time horizons also.
|
||||||
*/
|
*/
|
||||||
CFeeRate CBlockPolicyEstimator::estimateSmartFee(int confTarget, FeeCalculation *feeCalc, const CTxMemPool& pool, bool conservative) const
|
CFeeRate CBlockPolicyEstimator::estimateSmartFee(int confTarget, FeeCalculation *feeCalc, bool conservative) const
|
||||||
{
|
{
|
||||||
|
LOCK(cs_feeEstimator);
|
||||||
|
|
||||||
if (feeCalc) {
|
if (feeCalc) {
|
||||||
feeCalc->desiredTarget = confTarget;
|
feeCalc->desiredTarget = confTarget;
|
||||||
feeCalc->returnedTarget = confTarget;
|
feeCalc->returnedTarget = confTarget;
|
||||||
|
@ -835,8 +837,6 @@ CFeeRate CBlockPolicyEstimator::estimateSmartFee(int confTarget, FeeCalculation
|
||||||
|
|
||||||
double median = -1;
|
double median = -1;
|
||||||
EstimationResult tempResult;
|
EstimationResult tempResult;
|
||||||
{
|
|
||||||
LOCK(cs_feeEstimator);
|
|
||||||
|
|
||||||
// Return failure if trying to analyze a target we're not tracking
|
// Return failure if trying to analyze a target we're not tracking
|
||||||
if (confTarget <= 0 || (unsigned int)confTarget > longStats->GetMaxConfirms())
|
if (confTarget <= 0 || (unsigned int)confTarget > longStats->GetMaxConfirms())
|
||||||
|
@ -898,17 +898,9 @@ CFeeRate CBlockPolicyEstimator::estimateSmartFee(int confTarget, FeeCalculation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // Must unlock cs_feeEstimator before taking mempool locks
|
|
||||||
|
|
||||||
if (feeCalc) feeCalc->returnedTarget = confTarget;
|
if (feeCalc) feeCalc->returnedTarget = confTarget;
|
||||||
|
|
||||||
// If mempool is limiting txs , return at least the min feerate from the mempool
|
|
||||||
CAmount minPoolFee = pool.GetMinFee(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000).GetFeePerK();
|
|
||||||
if (minPoolFee > 0 && minPoolFee > median) {
|
|
||||||
if (feeCalc) feeCalc->reason = FeeReason::MEMPOOL_MIN;
|
|
||||||
return CFeeRate(minPoolFee);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (median < 0)
|
if (median < 0)
|
||||||
return CFeeRate(0);
|
return CFeeRate(0);
|
||||||
|
|
||||||
|
|
|
@ -208,7 +208,7 @@ public:
|
||||||
* the closest target where one can be given. 'conservative' estimates are
|
* the closest target where one can be given. 'conservative' estimates are
|
||||||
* valid over longer time horizons also.
|
* valid over longer time horizons also.
|
||||||
*/
|
*/
|
||||||
CFeeRate estimateSmartFee(int confTarget, FeeCalculation *feeCalc, const CTxMemPool& pool, bool conservative) const;
|
CFeeRate estimateSmartFee(int confTarget, FeeCalculation *feeCalc, bool conservative) const;
|
||||||
|
|
||||||
/** Return a specific fee estimate calculation with a given success
|
/** Return a specific fee estimate calculation with a given success
|
||||||
* threshold and time horizon, and optionally return detailed data about
|
* threshold and time horizon, and optionally return detailed data about
|
||||||
|
|
|
@ -815,7 +815,6 @@ UniValue estimatesmartfee(const JSONRPCRequest& request)
|
||||||
"\n"
|
"\n"
|
||||||
"A negative value is returned if not enough transactions and blocks\n"
|
"A negative value is returned if not enough transactions and blocks\n"
|
||||||
"have been observed to make an estimate for any number of blocks.\n"
|
"have been observed to make an estimate for any number of blocks.\n"
|
||||||
"However it will not return a value below the mempool reject fee.\n"
|
|
||||||
"\nExample:\n"
|
"\nExample:\n"
|
||||||
+ HelpExampleCli("estimatesmartfee", "6")
|
+ HelpExampleCli("estimatesmartfee", "6")
|
||||||
);
|
);
|
||||||
|
@ -831,7 +830,7 @@ UniValue estimatesmartfee(const JSONRPCRequest& request)
|
||||||
|
|
||||||
UniValue result(UniValue::VOBJ);
|
UniValue result(UniValue::VOBJ);
|
||||||
FeeCalculation feeCalc;
|
FeeCalculation feeCalc;
|
||||||
CFeeRate feeRate = ::feeEstimator.estimateSmartFee(nBlocks, &feeCalc, ::mempool, conservative);
|
CFeeRate feeRate = ::feeEstimator.estimateSmartFee(nBlocks, &feeCalc, conservative);
|
||||||
result.push_back(Pair("feerate", feeRate == CFeeRate(0) ? -1.0 : ValueFromAmount(feeRate.GetFeePerK())));
|
result.push_back(Pair("feerate", feeRate == CFeeRate(0) ? -1.0 : ValueFromAmount(feeRate.GetFeePerK())));
|
||||||
result.push_back(Pair("blocks", feeCalc.returnedTarget));
|
result.push_back(Pair("blocks", feeCalc.returnedTarget));
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -177,16 +177,6 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
|
||||||
for (int i = 2; i < 9; i++) { // At 9, the original estimate was already at the bottom (b/c scale = 2)
|
for (int i = 2; i < 9; i++) { // At 9, the original estimate was already at the bottom (b/c scale = 2)
|
||||||
BOOST_CHECK(feeEst.estimateFee(i).GetFeePerK() < origFeeEst[i-1] - deltaFee);
|
BOOST_CHECK(feeEst.estimateFee(i).GetFeePerK() < origFeeEst[i-1] - deltaFee);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test that if the mempool is limited, estimateSmartFee won't return a value below the mempool min fee
|
|
||||||
mpool.addUnchecked(tx.GetHash(), entry.Fee(feeV[5]).Time(GetTime()).Height(blocknum).FromTx(tx));
|
|
||||||
// evict that transaction which should set a mempool min fee of minRelayTxFee + feeV[5]
|
|
||||||
mpool.TrimToSize(1);
|
|
||||||
BOOST_CHECK(mpool.GetMinFee(1).GetFeePerK() > feeV[5]);
|
|
||||||
for (int i = 1; i < 10; i++) {
|
|
||||||
BOOST_CHECK(feeEst.estimateSmartFee(i, NULL, mpool, true).GetFeePerK() >= feeEst.estimateRawFee(i, 0.85, FeeEstimateHorizon::MED_HALFLIFE).GetFeePerK());
|
|
||||||
BOOST_CHECK(feeEst.estimateSmartFee(i, NULL, mpool, true).GetFeePerK() >= mpool.GetMinFee(1).GetFeePerK());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
|
@ -2951,12 +2951,18 @@ CAmount CWallet::GetMinimumFee(unsigned int nTxBytes, const CCoinControl& coin_c
|
||||||
if (coin_control.m_fee_mode == FeeEstimateMode::CONSERVATIVE) conservative_estimate = true;
|
if (coin_control.m_fee_mode == FeeEstimateMode::CONSERVATIVE) conservative_estimate = true;
|
||||||
else if (coin_control.m_fee_mode == FeeEstimateMode::ECONOMICAL) conservative_estimate = false;
|
else if (coin_control.m_fee_mode == FeeEstimateMode::ECONOMICAL) conservative_estimate = false;
|
||||||
|
|
||||||
fee_needed = estimator.estimateSmartFee(target, feeCalc, pool, conservative_estimate).GetFee(nTxBytes);
|
fee_needed = estimator.estimateSmartFee(target, feeCalc, conservative_estimate).GetFee(nTxBytes);
|
||||||
if (fee_needed == 0) {
|
if (fee_needed == 0) {
|
||||||
// if we don't have enough data for estimateSmartFee, then use fallbackFee
|
// if we don't have enough data for estimateSmartFee, then use fallbackFee
|
||||||
fee_needed = fallbackFee.GetFee(nTxBytes);
|
fee_needed = fallbackFee.GetFee(nTxBytes);
|
||||||
if (feeCalc) feeCalc->reason = FeeReason::FALLBACK;
|
if (feeCalc) feeCalc->reason = FeeReason::FALLBACK;
|
||||||
}
|
}
|
||||||
|
// Obey mempool min fee when using smart fee estimation
|
||||||
|
CAmount min_mempool_fee = pool.GetMinFee(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000).GetFee(nTxBytes);
|
||||||
|
if (fee_needed < min_mempool_fee) {
|
||||||
|
fee_needed = min_mempool_fee;
|
||||||
|
if (feeCalc) feeCalc->reason = FeeReason::MEMPOOL_MIN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// prevent user from paying a fee below minRelayTxFee or minTxFee
|
// prevent user from paying a fee below minRelayTxFee or minTxFee
|
||||||
|
|
Loading…
Reference in a new issue