Use explicit calc getters and setters

We have a bunch of functions and impl blocks scattered around the place
for calculating fee from fee rate and weight.

In preparation for adding a `calc` module use getters and setters in
code that will move to the `calc` module.

(Remember, the `FeeRate` uses an inner sats per kwu value.)

Internal change only.
This commit is contained in:
Tobin C. Harding 2024-12-27 12:37:43 +11:00
parent 4ade08c755
commit cd908fec51
No known key found for this signature in database
GPG Key ID: 40BF9E4C269D6607
2 changed files with 10 additions and 8 deletions

View File

@ -375,7 +375,7 @@ impl Amount {
pub const fn checked_div_by_weight_ceil(self, weight: Weight) -> Option<FeeRate> { pub const fn checked_div_by_weight_ceil(self, weight: Weight) -> Option<FeeRate> {
let wu = weight.to_wu(); let wu = weight.to_wu();
// No `?` operator in const context. // No `?` operator in const context.
if let Some(sats) = self.0.checked_mul(1_000) { if let Some(sats) = self.to_sat().checked_mul(1_000) {
if let Some(wu_minus_one) = wu.checked_sub(1) { if let Some(wu_minus_one) = wu.checked_sub(1) {
if let Some(sats_plus_wu_minus_one) = sats.checked_add(wu_minus_one) { if let Some(sats_plus_wu_minus_one) = sats.checked_add(wu_minus_one) {
if let Some(fee_rate) = sats_plus_wu_minus_one.checked_div(wu) { if let Some(fee_rate) = sats_plus_wu_minus_one.checked_div(wu) {
@ -397,7 +397,7 @@ impl Amount {
#[must_use] #[must_use]
pub const fn checked_div_by_weight_floor(self, weight: Weight) -> Option<FeeRate> { pub const fn checked_div_by_weight_floor(self, weight: Weight) -> Option<FeeRate> {
// No `?` operator in const context. // No `?` operator in const context.
match self.0.checked_mul(1_000) { match self.to_sat().checked_mul(1_000) {
Some(res) => match res.checked_div(weight.to_wu()) { Some(res) => match res.checked_div(weight.to_wu()) {
Some(fee_rate) => Some(FeeRate::from_sat_per_kwu(fee_rate)), Some(fee_rate) => Some(FeeRate::from_sat_per_kwu(fee_rate)),
None => None, None => None,

View File

@ -112,7 +112,7 @@ impl FeeRate {
#[must_use] #[must_use]
pub const fn checked_mul_by_weight(self, weight: Weight) -> Option<Amount> { pub const fn checked_mul_by_weight(self, weight: Weight) -> Option<Amount> {
// No `?` operator in const context. // No `?` operator in const context.
match self.0.checked_mul(weight.to_wu()) { match self.to_sat_per_kwu().checked_mul(weight.to_wu()) {
Some(mul_res) => match mul_res.checked_add(999) { Some(mul_res) => match mul_res.checked_add(999) {
Some(add_res) => Some(Amount::from_sat(add_res / 1000)), Some(add_res) => Some(Amount::from_sat(add_res / 1000)),
None => None, None => None,
@ -216,7 +216,9 @@ impl ops::Div<Weight> for Amount {
/// ///
/// This is likely the wrong thing for a user dividing an amount by a weight. Consider using /// This is likely the wrong thing for a user dividing an amount by a weight. Consider using
/// `checked_div_by_weight` instead. /// `checked_div_by_weight` instead.
fn div(self, rhs: Weight) -> Self::Output { FeeRate(self.to_sat() * 1000 / rhs.to_wu()) } fn div(self, rhs: Weight) -> Self::Output {
FeeRate::from_sat_per_kwu(self.to_sat() * 1000 / rhs.to_wu())
}
} }
impl core::iter::Sum for FeeRate { impl core::iter::Sum for FeeRate {
@ -324,7 +326,7 @@ mod tests {
#[test] #[test]
fn fee_rate_div_by_weight() { fn fee_rate_div_by_weight() {
let fee_rate = Amount::from_sat(329) / Weight::from_wu(381); let fee_rate = Amount::from_sat(329) / Weight::from_wu(381);
assert_eq!(fee_rate, FeeRate(863)); assert_eq!(fee_rate, FeeRate::from_sat_per_kwu(863));
} }
#[test] #[test]
@ -402,7 +404,7 @@ mod tests {
#[test] #[test]
fn fee_wu() { fn fee_wu() {
let fee_overflow = FeeRate(10).fee_wu(Weight::MAX); let fee_overflow = FeeRate::from_sat_per_kwu(10).fee_wu(Weight::MAX);
assert!(fee_overflow.is_none()); assert!(fee_overflow.is_none());
let fee_rate = FeeRate::from_sat_per_vb(2).unwrap(); let fee_rate = FeeRate::from_sat_per_vb(2).unwrap();
@ -412,7 +414,7 @@ mod tests {
#[test] #[test]
fn fee_vb() { fn fee_vb() {
let fee_overflow = FeeRate(10).fee_vb(Weight::MAX.to_wu()); let fee_overflow = FeeRate::from_sat_per_kwu(10).fee_vb(Weight::MAX.to_wu());
assert!(fee_overflow.is_none()); assert!(fee_overflow.is_none());
let fee_rate = FeeRate::from_sat_per_vb(2).unwrap(); let fee_rate = FeeRate::from_sat_per_vb(2).unwrap();
@ -428,7 +430,7 @@ mod tests {
.expect("expected Amount"); .expect("expected Amount");
assert_eq!(Amount::from_sat(100), fee); assert_eq!(Amount::from_sat(100), fee);
let fee = FeeRate(10).checked_mul_by_weight(Weight::MAX); let fee = FeeRate::from_sat_per_kwu(10).checked_mul_by_weight(Weight::MAX);
assert!(fee.is_none()); assert!(fee.is_none());
let weight = Weight::from_vb(3).unwrap(); let weight = Weight::from_vb(3).unwrap();