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 : namespace wallet { 12 120 : CAmount GetRequiredFee(const CWallet& wallet, unsigned int nTxBytes) 13 : { 14 120 : return GetRequiredFeeRate(wallet).GetFee(nTxBytes); 15 : } 16 : 17 0 : CAmount GetMinimumFee(const CWallet& wallet, unsigned int nTxBytes, const CCoinControl& coin_control, FeeCalculation* feeCalc) 18 : { 19 0 : return GetMinimumFeeRate(wallet, coin_control, feeCalc).GetFee(nTxBytes); 20 : } 21 : 22 14047 : CFeeRate GetRequiredFeeRate(const CWallet& wallet) 23 : { 24 14047 : return std::max(wallet.m_min_fee, wallet.chain().relayMinFee()); 25 : } 26 : 27 14464 : CFeeRate GetMinimumFeeRate(const CWallet& wallet, const CCoinControl& coin_control, FeeCalculation* feeCalc) 28 : { 29 : /* User control of how to calculate fee uses the following parameter precedence: 30 : 1. coin_control.m_feerate 31 : 2. coin_control.m_confirm_target 32 : 3. m_pay_tx_fee (user-set member variable of wallet) 33 : 4. m_confirm_target (user-set member variable of wallet) 34 : The first parameter that is set is used. 35 : */ 36 14464 : CFeeRate feerate_needed; 37 14464 : if (coin_control.m_feerate) { // 1. 38 952 : feerate_needed = *(coin_control.m_feerate); 39 952 : if (feeCalc) feeCalc->reason = FeeReason::PAYTXFEE; 40 : // Allow to override automatic min/max check over coin control instance 41 952 : if (coin_control.fOverrideFeeRate) return feerate_needed; 42 425 : } 43 13512 : 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 44 1764 : feerate_needed = wallet.m_pay_tx_fee; 45 1764 : if (feeCalc) feeCalc->reason = FeeReason::PAYTXFEE; 46 1764 : } 47 : else { // 2. or 4. 48 : // We will use smart fee estimation 49 11748 : unsigned int target = coin_control.m_confirm_target ? *coin_control.m_confirm_target : wallet.m_confirm_target; 50 : // By default estimates are economical 51 11748 : bool conservative_estimate = true; 52 : // Allow to override the default fee estimate mode over the CoinControl instance 53 11748 : if (coin_control.m_fee_mode == FeeEstimateMode::CONSERVATIVE) conservative_estimate = true; 54 11748 : else if (coin_control.m_fee_mode == FeeEstimateMode::ECONOMICAL) conservative_estimate = false; 55 : 56 11748 : feerate_needed = wallet.chain().estimateSmartFee(target, conservative_estimate, feeCalc); 57 11748 : if (feerate_needed == CFeeRate(0)) { 58 : // if we don't have enough data for estimateSmartFee, then use fallback fee 59 7361 : feerate_needed = wallet.m_fallback_fee; 60 7361 : if (feeCalc) feeCalc->reason = FeeReason::FALLBACK; 61 : 62 : // directly return if fallback fee is disabled (feerate 0 == disabled) 63 7361 : if (wallet.m_fallback_fee.GetFee(1000) == 0) return feerate_needed; 64 7349 : } 65 : // Obey mempool min fee when using smart fee estimation 66 11736 : CFeeRate min_mempool_feerate = wallet.chain().mempoolMinFee(); 67 11736 : if (feerate_needed < min_mempool_feerate) { 68 0 : feerate_needed = min_mempool_feerate; 69 0 : if (feeCalc) feeCalc->reason = FeeReason::MEMPOOL_MIN; 70 0 : } 71 : } 72 : 73 : // prevent user from paying a fee below the required fee rate 74 13925 : CFeeRate required_feerate = GetRequiredFeeRate(wallet); 75 13925 : if (required_feerate > feerate_needed) { 76 265 : feerate_needed = required_feerate; 77 265 : if (feeCalc) feeCalc->reason = FeeReason::REQUIRED; 78 265 : } 79 13925 : return feerate_needed; 80 14464 : } 81 : 82 14293 : CFeeRate GetDiscardRate(const CWallet& wallet) 83 : { 84 14293 : unsigned int highest_target = wallet.chain().estimateMaxBlocks(); 85 14293 : CFeeRate discard_rate = wallet.chain().estimateSmartFee(highest_target, false /* conservative */); 86 : // Don't let discard_rate be greater than longest possible fee estimate if we get a valid fee estimate 87 14293 : discard_rate = (discard_rate == CFeeRate(0)) ? wallet.m_discard_rate : std::min(discard_rate, wallet.m_discard_rate); 88 : // Discard rate must be at least dustRelayFee 89 14293 : discard_rate = std::max(discard_rate, wallet.chain().relayDustFee()); 90 14293 : return discard_rate; 91 : } 92 : } // namespace wallet