* Fee rate in satoshis per virtualbyte: CAmount / vB * the feerate is represented internally as FeeFrac */
| 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 | CFeeRate() = default; |
| 40 | template<std::integral I> // Disallow silent float -> int conversion |
| 41 | explicit 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 | * Return the fee in satoshis for the given vsize in vbytes. |
| 52 | * If the calculated fee would have fractional satoshis, then the |
| 53 | * returned fee will always be rounded up to the nearest satoshi. |
| 54 | */ |
| 55 | CAmount GetFee(int32_t virtual_bytes) const; |
| 56 | |
| 57 | FeePerVSize GetFeePerVSize() const { return m_feerate; } |
| 58 | |
| 59 | /** |
| 60 | * Return the fee in satoshis for a vsize of 1000 vbytes |
| 61 | */ |
| 62 | CAmount GetFeePerK() const { return CAmount(m_feerate.EvaluateFeeDown(1000)); } |
| 63 | friend std::strong_ordering operator<=>(const CFeeRate& a, const CFeeRate& b) noexcept |
| 64 | { |
| 65 | return ByRatio{a.m_feerate} <=> ByRatio{b.m_feerate}; |
| 66 | } |
| 67 | friend bool operator==(const CFeeRate& a, const CFeeRate& b) noexcept |
| 68 | { |
| 69 | return ByRatio{a.m_feerate} == ByRatio{b.m_feerate}; |
| 70 | } |
| 71 | CFeeRate& operator+=(const CFeeRate& a) { |
| 72 | m_feerate = FeePerVSize(GetFeePerK() + a.GetFeePerK(), 1000); |
| 73 | return *this; |
| 74 | } |
| 75 | std::string ToString(FeeRateFormat fee_rate_format = FeeRateFormat::BTC_KVB) const; |
| 76 | friend CFeeRate operator*(const CFeeRate& f, int a) { return CFeeRate(a * f.m_feerate.fee, f.m_feerate.size); } |
| 77 | friend CFeeRate operator*(int a, const CFeeRate& f) { return CFeeRate(a * f.m_feerate.fee, f.m_feerate.size); } |
| 78 | |
| 79 | SERIALIZE_METHODS(CFeeRate, obj) { READWRITE(obj.m_feerate.fee, obj.m_feerate.size); } |
| 80 | }; |
| 81 | |
| 82 | #endif // BITCOIN_POLICY_FEERATE_H |