Branch data Line data Source code
# 1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto # 2 : : // Copyright (c) 2009-2020 The Bitcoin Core developers # 3 : : // Distributed under the MIT software license, see the accompanying # 4 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. # 5 : : # 6 : : #include <wallet/fees.h> # 7 : : # 8 : : #include <wallet/coincontrol.h> # 9 : : #include <wallet/wallet.h> # 10 : : # 11 : : # 12 : : CAmount GetRequiredFee(const CWallet& wallet, unsigned int nTxBytes) # 13 : 18 : { # 14 : 18 : return GetRequiredFeeRate(wallet).GetFee(nTxBytes); # 15 : 18 : } # 16 : : # 17 : : # 18 : : CAmount GetMinimumFee(const CWallet& wallet, unsigned int nTxBytes, const CCoinControl& coin_control, FeeCalculation* feeCalc) # 19 : 0 : { # 20 : 0 : return GetMinimumFeeRate(wallet, coin_control, feeCalc).GetFee(nTxBytes); # 21 : 0 : } # 22 : : # 23 : : CFeeRate GetRequiredFeeRate(const CWallet& wallet) # 24 : 9951 : { # 25 : 9951 : return std::max(wallet.m_min_fee, wallet.chain().relayMinFee()); # 26 : 9951 : } # 27 : : # 28 : : CFeeRate GetMinimumFeeRate(const CWallet& wallet, const CCoinControl& coin_control, FeeCalculation* feeCalc) # 29 : 10097 : { # 30 : : /* User control of how to calculate fee uses the following parameter precedence: # 31 : : 1. coin_control.m_feerate # 32 : : 2. coin_control.m_confirm_target # 33 : : 3. m_pay_tx_fee (user-set member variable of wallet) # 34 : : 4. m_confirm_target (user-set member variable of wallet) # 35 : : The first parameter that is set is used. # 36 : : */ # 37 : 10097 : CFeeRate feerate_needed; # 38 [ + + ]: 10097 : if (coin_control.m_feerate) { // 1. # 39 : 537 : feerate_needed = *(coin_control.m_feerate); # 40 [ + - ]: 537 : if (feeCalc) feeCalc->reason = FeeReason::PAYTXFEE; # 41 : : // Allow to override automatic min/max check over coin control instance # 42 [ + + ]: 537 : if (coin_control.fOverrideFeeRate) return feerate_needed; # 43 : 9560 : } # 44 [ + + ][ + + ]: 9560 : else if (!coin_control.m_confirm_target && wallet.m_pay_tx_fee != CFeeRate(0)) { // 3. TODO: remove magic value of 0 for wallet member m_pay_tx_fee # [ + + ] # 45 : 420 : feerate_needed = wallet.m_pay_tx_fee; # 46 [ + + ]: 420 : if (feeCalc) feeCalc->reason = FeeReason::PAYTXFEE; # 47 : 420 : } # 48 : 9140 : else { // 2. or 4. # 49 : : // We will use smart fee estimation # 50 [ + + ]: 9140 : unsigned int target = coin_control.m_confirm_target ? *coin_control.m_confirm_target : wallet.m_confirm_target; # 51 : : // By default estimates are economical iff we are signaling opt-in-RBF # 52 : 9140 : bool conservative_estimate = !coin_control.m_signal_bip125_rbf.value_or(wallet.m_signal_rbf); # 53 : : // Allow to override the default fee estimate mode over the CoinControl instance # 54 [ - + ]: 9140 : if (coin_control.m_fee_mode == FeeEstimateMode::CONSERVATIVE) conservative_estimate = true; # 55 [ + + ]: 9140 : else if (coin_control.m_fee_mode == FeeEstimateMode::ECONOMICAL) conservative_estimate = false; # 56 : : # 57 : 9140 : feerate_needed = wallet.chain().estimateSmartFee(target, conservative_estimate, feeCalc); # 58 [ + + ]: 9140 : if (feerate_needed == CFeeRate(0)) { # 59 : : // if we don't have enough data for estimateSmartFee, then use fallback fee # 60 : 4828 : feerate_needed = wallet.m_fallback_fee; # 61 [ + + ]: 4828 : if (feeCalc) feeCalc->reason = FeeReason::FALLBACK; # 62 : : # 63 : : // directly return if fallback fee is disabled (feerate 0 == disabled) # 64 [ + + ]: 4828 : if (wallet.m_fallback_fee == CFeeRate(0)) return feerate_needed; # 65 : 9132 : } # 66 : : // Obey mempool min fee when using smart fee estimation # 67 : 9132 : CFeeRate min_mempool_feerate = wallet.chain().mempoolMinFee(); # 68 [ - + ]: 9132 : if (feerate_needed < min_mempool_feerate) { # 69 : 0 : feerate_needed = min_mempool_feerate; # 70 [ # # ]: 0 : if (feeCalc) feeCalc->reason = FeeReason::MEMPOOL_MIN; # 71 : 0 : } # 72 : 9132 : } # 73 : : # 74 : : // prevent user from paying a fee below the required fee rate # 75 : 10097 : CFeeRate required_feerate = GetRequiredFeeRate(wallet); # 76 [ + + ]: 9933 : if (required_feerate > feerate_needed) { # 77 : 65 : feerate_needed = required_feerate; # 78 [ + + ]: 65 : if (feeCalc) feeCalc->reason = FeeReason::REQUIRED; # 79 : 65 : } # 80 : 9933 : return feerate_needed; # 81 : 10097 : } # 82 : : # 83 : : CFeeRate GetDiscardRate(const CWallet& wallet) # 84 : 5009 : { # 85 : 5009 : unsigned int highest_target = wallet.chain().estimateMaxBlocks(); # 86 : 5009 : CFeeRate discard_rate = wallet.chain().estimateSmartFee(highest_target, false /* conservative */); # 87 : : // Don't let discard_rate be greater than longest possible fee estimate if we get a valid fee estimate # 88 [ + + ]: 5009 : discard_rate = (discard_rate == CFeeRate(0)) ? wallet.m_discard_rate : std::min(discard_rate, wallet.m_discard_rate); # 89 : : // Discard rate must be at least dustRelayFee # 90 : 5009 : discard_rate = std::max(discard_rate, wallet.chain().relayDustFee()); # 91 : 5009 : return discard_rate; # 92 : 5009 : }