Changeset View
Changeset View
Standalone View
Standalone View
src/wallet/fees.cpp
// Copyright (c) 2009-2010 Satoshi Nakamoto | // Copyright (c) 2009-2010 Satoshi Nakamoto | ||||
// Copyright (c) 2009-2017 The Bitcoin Core developers | // Copyright (c) 2009-2017 The Bitcoin Core developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include <wallet/fees.h> | #include <wallet/fees.h> | ||||
#include <config.h> | #include <config.h> | ||||
#include <policy/policy.h> | #include <policy/policy.h> | ||||
#include <txmempool.h> | #include <txmempool.h> | ||||
#include <util.h> | #include <util.h> | ||||
#include <validation.h> | #include <validation.h> | ||||
#include <wallet/coincontrol.h> | #include <wallet/coincontrol.h> | ||||
#include <wallet/wallet.h> | #include <wallet/wallet.h> | ||||
Amount GetRequiredFee(unsigned int nTxBytes) { | Amount GetRequiredFee(unsigned int nTxBytes) { | ||||
return GetConfig().GetMinFeePerKB().GetFee(nTxBytes); | return GetRequiredFeeRate().GetFeeCeiling(nTxBytes); | ||||
} | } | ||||
Amount GetMinimumFee(unsigned int nTxBytes, const CCoinControl &coinControl, | Amount GetMinimumFee(unsigned int nTxBytes, const CCoinControl &coin_control, | ||||
const CTxMemPool &pool) { | const CTxMemPool &pool) { | ||||
Amount targetFee = (coinControl.fOverrideFeeRate && coinControl.m_feerate) | Amount nFeeNeeded = | ||||
? coinControl.m_feerate->GetFee(nTxBytes) | GetMinimumFeeRate(coin_control, pool).GetFeeCeiling(nTxBytes); | ||||
: payTxFee.GetFeeCeiling(nTxBytes); | |||||
Amount nFeeNeeded = targetFee; | |||||
if (nFeeNeeded == Amount::zero()) { | |||||
nFeeNeeded = pool.estimateFee().GetFeeCeiling(nTxBytes); | |||||
// ... unless we don't have enough mempool data for estimatefee, then | |||||
// use fallbackFee. | |||||
if (nFeeNeeded == Amount::zero()) { | |||||
nFeeNeeded = CWallet::fallbackFee.GetFeeCeiling(nTxBytes); | |||||
} | |||||
} | |||||
// Prevent user from paying a fee below minRelayTxFee or minTxFee. | |||||
nFeeNeeded = std::max(nFeeNeeded, GetRequiredFee(nTxBytes)); | |||||
// But always obey the maximum. | // But always obey the maximum. | ||||
if (nFeeNeeded > maxTxFee) { | if (nFeeNeeded > maxTxFee) { | ||||
nFeeNeeded = maxTxFee; | nFeeNeeded = maxTxFee; | ||||
} | } | ||||
return nFeeNeeded; | return nFeeNeeded; | ||||
} | } | ||||
CFeeRate GetRequiredFeeRate() { | |||||
return GetConfig().GetMinFeePerKB(); | |||||
} | |||||
CFeeRate GetMinimumFeeRate(const CCoinControl &coin_control, | |||||
const CTxMemPool &pool) { | |||||
CFeeRate neededFeeRate = | |||||
(coin_control.fOverrideFeeRate && coin_control.m_feerate) | |||||
? *coin_control.m_feerate | |||||
: payTxFee; | |||||
if (neededFeeRate == CFeeRate()) { | |||||
neededFeeRate = pool.estimateFee(); | |||||
// ... unless we don't have enough mempool data for estimatefee, then | |||||
// use fallbackFee. | |||||
if (neededFeeRate == CFeeRate()) { | |||||
neededFeeRate = CWallet::fallbackFee; | |||||
} | |||||
} | |||||
// Prevent user from paying a fee below minRelayTxFee or minTxFee. | |||||
return std::max(neededFeeRate, GetRequiredFeeRate()); | |||||
} |