LCOV - code coverage report
Current view: top level - src/wallet - fees.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 40 45 88.9 %
Date: 2026-06-25 07:23:43 Functions: 6 7 85.7 %

          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

Generated by: LCOV version 1.16