Coverage Report

Created: 2026-09-01 13:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/root/bitcoin/src/policy/feerate.h
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
#ifndef BITCOIN_POLICY_FEERATE_H
7
#define BITCOIN_POLICY_FEERATE_H
8
9
#include <consensus/amount.h>
10
#include <serialize.h>
11
#include <util/feefrac.h>
12
#include <util/fees.h>
13
14
15
#include <cstdint>
16
#include <string>
17
#include <type_traits>
18
19
inline const std::string CURRENCY_UNIT = "BTC"; // One formatted unit
20
inline const std::string CURRENCY_ATOM = "sat"; // One indivisible minimum value unit
21
22
enum class FeeRateFormat {
23
    BTC_KVB, //!< Use BTC/kvB fee rate unit
24
    SAT_VB,  //!< Use sat/vB fee rate unit
25
};
26
27
/**
28
 * Fee rate in satoshis per virtualbyte: CAmount / vB
29
 * the feerate is represented internally as FeeFrac
30
 */
31
class CFeeRate
32
{
33
private:
34
    /** Fee rate in sats/vB (satoshis per N virtualbytes) */
35
    FeePerVSize m_feerate;
36
37
public:
38
    /** Fee rate of 0 satoshis per 0 vB */
39
9.99k
    CFeeRate() = default;
40
    template<std::integral I> // Disallow silent float -> int conversion
41
6.24M
    explicit constexpr CFeeRate(const I m_feerate_kvb) : m_feerate(FeePerVSize(m_feerate_kvb, 1000)) {}
_ZN8CFeeRateC2ITkSt8integrallEET_
Line
Count
Source
41
254k
    explicit constexpr CFeeRate(const I m_feerate_kvb) : m_feerate(FeePerVSize(m_feerate_kvb, 1000)) {}
_ZN8CFeeRateC2ITkSt8integraljEET_
Line
Count
Source
41
828k
    explicit constexpr CFeeRate(const I m_feerate_kvb) : m_feerate(FeePerVSize(m_feerate_kvb, 1000)) {}
_ZN8CFeeRateC2ITkSt8integraliEET_
Line
Count
Source
41
3.62M
    explicit constexpr CFeeRate(const I m_feerate_kvb) : m_feerate(FeePerVSize(m_feerate_kvb, 1000)) {}
_ZN8CFeeRateC2ITkSt8integralxEET_
Line
Count
Source
41
1.54M
    explicit constexpr CFeeRate(const I m_feerate_kvb) : m_feerate(FeePerVSize(m_feerate_kvb, 1000)) {}
42
43
    /**
44
     * Construct a fee rate from a fee in satoshis and a vsize in vB.
45
     *
46
     * Passing any virtual_bytes less than or equal to 0 will result in 0 fee rate per 0 size.
47
     */
48
    CFeeRate(const CAmount& nFeePaid, int32_t virtual_bytes);
49
50
    /**
51
     * Construct from a fee rate expressed as FeePerVSize.
52
     *
53
     * Lossless: CFeeRate is internally a FeePerVSize, so the exact
54
     * fee/vsize fraction is preserved. A feerate whose size is less than
55
     * or equal to 0 results in 0 fee rate per 0 size.
56
     */
57
479
    explicit CFeeRate(const FeePerVSize& feerate) : m_feerate{feerate.size > 0 ? feerate : FeePerVSize{}} {}
  Branch (57:63): [True: 295, False: 184]
58
59
    /**
60
     * Return the fee in satoshis for the given vsize in vbytes.
61
     * If the calculated fee would have fractional satoshis, then the
62
     * returned fee will always be rounded up to the nearest satoshi.
63
     */
64
    CAmount GetFee(int32_t virtual_bytes) const;
65
66
63.0k
    FeePerVSize GetFeePerVSize() const { return m_feerate; }
67
68
    /**
69
     * Return the fee in satoshis for a vsize of 1000 vbytes
70
     */
71
861k
    CAmount GetFeePerK() const { return CAmount(m_feerate.EvaluateFeeDown(1000)); }
72
    friend std::strong_ordering operator<=>(const CFeeRate& a, const CFeeRate& b) noexcept
73
565k
    {
74
565k
        return ByRatio{a.m_feerate} <=> ByRatio{b.m_feerate};
75
565k
    }
76
    friend bool operator==(const CFeeRate& a, const CFeeRate& b) noexcept
77
2.37k
    {
78
2.37k
        return ByRatio{a.m_feerate} == ByRatio{b.m_feerate};
79
2.37k
    }
80
21.3k
    CFeeRate& operator+=(const CFeeRate& a) {
81
21.3k
        m_feerate = FeePerVSize(GetFeePerK() + a.GetFeePerK(), 1000);
82
21.3k
        return *this;
83
21.3k
    }
84
    std::string ToString(FeeRateFormat fee_rate_format = FeeRateFormat::BTC_KVB) const;
85
0
    friend CFeeRate operator*(const CFeeRate& f, int a) { return CFeeRate(a * f.m_feerate.fee, f.m_feerate.size); }
86
3.70k
    friend CFeeRate operator*(int a, const CFeeRate& f) { return CFeeRate(a * f.m_feerate.fee, f.m_feerate.size); }
87
88
6
    SERIALIZE_METHODS(CFeeRate, obj) { READWRITE(obj.m_feerate.fee, obj.m_feerate.size); }
_ZN8CFeeRate16SerializationOpsI10SpanReaderS_17ActionUnserializeEEvRT0_RT_T1_
Line
Count
Source
88
3
    SERIALIZE_METHODS(CFeeRate, obj) { READWRITE(obj.m_feerate.fee, obj.m_feerate.size); }
_ZN8CFeeRate16SerializationOpsI10DataStreamKS_15ActionSerializeEEvRT0_RT_T1_
Line
Count
Source
88
2
    SERIALIZE_METHODS(CFeeRate, obj) { READWRITE(obj.m_feerate.fee, obj.m_feerate.size); }
_ZN8CFeeRate16SerializationOpsI10DataStreamS_17ActionUnserializeEEvRT0_RT_T1_
Line
Count
Source
88
1
    SERIALIZE_METHODS(CFeeRate, obj) { READWRITE(obj.m_feerate.fee, obj.m_feerate.size); }
89
};
90
91
#endif // BITCOIN_POLICY_FEERATE_H