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