forked from apezord/ord-dogecoin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfee_rate.rs
66 lines (57 loc) Β· 1.52 KB
/
fee_rate.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use super::*;
#[derive(Debug, PartialEq, Clone, Copy)]
pub struct FeeRate(f64);
impl FromStr for FeeRate {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Self::try_from(f64::from_str(s)?)
}
}
impl TryFrom<f64> for FeeRate {
type Error = Error;
fn try_from(rate: f64) -> Result<Self, Self::Error> {
if rate.is_sign_negative() | rate.is_nan() | rate.is_infinite() {
bail!("invalid fee rate: {rate}")
}
Ok(Self(rate))
}
}
impl FeeRate {
pub(crate) fn fee(&self, vsize: usize) -> Amount {
#[allow(clippy::cast_possible_truncation)]
#[allow(clippy::cast_sign_loss)]
Amount::from_sat((self.0 * vsize as f64).round() as u64)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse() {
assert_eq!("1.1".parse::<FeeRate>().unwrap().0, 1.1);
assert_eq!("11.19".parse::<FeeRate>().unwrap().0, 11.19);
assert_eq!("11.1111".parse::<FeeRate>().unwrap().0, 11.1111);
assert!("-4.2".parse::<FeeRate>().is_err());
assert!(FeeRate::try_from(f64::INFINITY).is_err());
assert!(FeeRate::try_from(f64::NAN).is_err());
}
#[test]
fn fee() {
assert_eq!(
"2.5".parse::<FeeRate>().unwrap().fee(100),
Amount::from_sat(250)
);
assert_eq!(
"2.0".parse::<FeeRate>().unwrap().fee(1024),
Amount::from_sat(2048)
);
assert_eq!(
"1.1".parse::<FeeRate>().unwrap().fee(100),
Amount::from_sat(110)
);
assert_eq!(
"1.0".parse::<FeeRate>().unwrap().fee(123456789),
Amount::from_sat(123456789)
);
}
}