Skip to content

Commit f47cfd9

Browse files
committed
Merge rust-bitcoin#748: fix: zero sequence check for from_height
d030b8f feat: add from_height_unchecked (ChrisCho-H) 02a92d8 fix: zero sequence check for from_height (ChrisCho-H) Pull request description: This is following rust-bitcoin#740. I missed `from_height` also needs to check if zero. I'm afraid as it's API breaking change. ACKs for top commit: apoelstra: ACK d030b8f successfully ran local tests Tree-SHA512: ceac7ece6a61fe485eec7f8e1acccbc1f9ac8a076cbed5c0f6eb83da9a2794d7e8a3fa69d0abf59356ee824d942dcecdfa8a5afba541255bc2e513cc831fa576
2 parents 8990b63 + d030b8f commit f47cfd9

File tree

6 files changed

+50
-34
lines changed

6 files changed

+50
-34
lines changed

src/interpreter/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1211,7 +1211,7 @@ mod tests {
12111211
assert_eq!(
12121212
older_satisfied.unwrap(),
12131213
vec![SatisfiedConstraint::RelativeTimelock {
1214-
n: crate::RelLockTime::from_height(1000).into()
1214+
n: crate::RelLockTime::from_height(1000).unwrap().into()
12151215
}]
12161216
);
12171217

src/miniscript/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,10 +1428,10 @@ mod tests {
14281428
let mut abs = miniscript.lift().unwrap();
14291429
assert_eq!(abs.n_keys(), 5);
14301430
assert_eq!(abs.minimum_n_keys(), Some(2));
1431-
abs = abs.at_age(RelLockTime::from_height(10000).into());
1431+
abs = abs.at_age(RelLockTime::from_height(10000).unwrap().into());
14321432
assert_eq!(abs.n_keys(), 5);
14331433
assert_eq!(abs.minimum_n_keys(), Some(2));
1434-
abs = abs.at_age(RelLockTime::from_height(9999).into());
1434+
abs = abs.at_age(RelLockTime::from_height(9999).unwrap().into());
14351435
assert_eq!(abs.n_keys(), 3);
14361436
assert_eq!(abs.minimum_n_keys(), Some(3));
14371437
abs = abs.at_age(RelLockTime::ZERO.into());
@@ -1791,28 +1791,28 @@ mod tests {
17911791
(
17921792
format!("or_d(pk({}),and_v(v:pk({}),older(12960)))", key_missing, key_present),
17931793
None,
1794-
Some(RelLockTime::from_height(12960)),
1794+
Some(RelLockTime::from_height(12960).unwrap()),
17951795
),
17961796
(
17971797
format!(
17981798
"thresh(3,pk({}),s:pk({}),snl:older(10),snl:after(11))",
17991799
key_present, key_missing
18001800
),
18011801
Some(AbsLockTime::from_consensus(11).unwrap()),
1802-
Some(RelLockTime::from_height(10)),
1802+
Some(RelLockTime::from_height(10).unwrap()),
18031803
),
18041804
(
18051805
format!("and_v(v:and_v(v:pk({}),older(10)),older(20))", key_present),
18061806
None,
1807-
Some(RelLockTime::from_height(20)),
1807+
Some(RelLockTime::from_height(20).unwrap()),
18081808
),
18091809
(
18101810
format!(
18111811
"andor(pk({}),older(10),and_v(v:pk({}),older(20)))",
18121812
key_present, key_missing
18131813
),
18141814
None,
1815-
Some(RelLockTime::from_height(10)),
1815+
Some(RelLockTime::from_height(10).unwrap()),
18161816
),
18171817
];
18181818

src/policy/compiler.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,7 +1386,7 @@ mod tests {
13861386
(
13871387
1,
13881388
Arc::new(Concrete::And(vec![
1389-
Arc::new(Concrete::Older(RelLockTime::from_height(10000))),
1389+
Arc::new(Concrete::Older(RelLockTime::from_height(10000).unwrap())),
13901390
Arc::new(Concrete::Thresh(
13911391
Threshold::from_iter(2, key_pol[5..8].iter().map(|p| (p.clone()).into()))
13921392
.unwrap(),
@@ -1416,10 +1416,10 @@ mod tests {
14161416
let mut abs = policy.lift().unwrap();
14171417
assert_eq!(abs.n_keys(), 8);
14181418
assert_eq!(abs.minimum_n_keys(), Some(2));
1419-
abs = abs.at_age(RelLockTime::from_height(10000).into());
1419+
abs = abs.at_age(RelLockTime::from_height(10000).unwrap().into());
14201420
assert_eq!(abs.n_keys(), 8);
14211421
assert_eq!(abs.minimum_n_keys(), Some(2));
1422-
abs = abs.at_age(RelLockTime::from_height(9999).into());
1422+
abs = abs.at_age(RelLockTime::from_height(9999).unwrap().into());
14231423
assert_eq!(abs.n_keys(), 5);
14241424
assert_eq!(abs.minimum_n_keys(), Some(3));
14251425
abs = abs.at_age(RelLockTime::ZERO.into());
@@ -1449,15 +1449,15 @@ mod tests {
14491449
assert!(ms.satisfy(no_sat).is_err());
14501450
assert!(ms.satisfy(&left_sat).is_ok());
14511451
assert!(ms
1452-
.satisfy((&right_sat, RelLockTime::from_height(10001)))
1452+
.satisfy((&right_sat, RelLockTime::from_height(10001).unwrap(),))
14531453
.is_ok());
14541454
//timelock not met
14551455
assert!(ms
1456-
.satisfy((&right_sat, RelLockTime::from_height(9999)))
1456+
.satisfy((&right_sat, RelLockTime::from_height(9999).unwrap()))
14571457
.is_err());
14581458

14591459
assert_eq!(
1460-
ms.satisfy((left_sat, RelLockTime::from_height(9999)))
1460+
ms.satisfy((left_sat, RelLockTime::from_height(9999).unwrap()))
14611461
.unwrap(),
14621462
vec![
14631463
// sat for left branch
@@ -1469,7 +1469,7 @@ mod tests {
14691469
);
14701470

14711471
assert_eq!(
1472-
ms.satisfy((right_sat, RelLockTime::from_height(10000)))
1472+
ms.satisfy((right_sat, RelLockTime::from_height(10000).unwrap()))
14731473
.unwrap(),
14741474
vec![
14751475
// sat for right branch

src/policy/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ mod tests {
357357
Semantic::Thresh(Threshold::or(
358358
Arc::new(Semantic::Thresh(Threshold::and(
359359
Arc::new(Semantic::Key(key_a)),
360-
Arc::new(Semantic::Older(RelLockTime::from_height(42)))
360+
Arc::new(Semantic::Older(RelLockTime::from_height(42).unwrap()))
361361
))),
362362
Arc::new(Semantic::Key(key_b))
363363
)),

src/policy/semantic.rs

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -722,26 +722,33 @@ mod tests {
722722
assert_eq!(
723723
policy
724724
.clone()
725-
.at_age(RelLockTime::from_height(10000).into()),
725+
.at_age(RelLockTime::from_height(10000).unwrap().into()),
726726
policy
727727
);
728728
assert_eq!(policy.n_keys(), 1);
729729
assert_eq!(policy.minimum_n_keys(), Some(1));
730730

731731
let policy = StringPolicy::from_str("older(1000)").unwrap();
732-
assert_eq!(policy, Policy::Older(RelLockTime::from_height(1000)));
732+
assert_eq!(policy, Policy::Older(RelLockTime::from_height(1000).unwrap()));
733733
assert_eq!(policy.absolute_timelocks(), vec![]);
734734
assert_eq!(policy.relative_timelocks(), vec![1000]);
735735
assert_eq!(policy.clone().at_age(RelLockTime::ZERO.into()), Policy::Unsatisfiable);
736736
assert_eq!(
737-
policy.clone().at_age(RelLockTime::from_height(999).into()),
737+
policy
738+
.clone()
739+
.at_age(RelLockTime::from_height(999).unwrap().into()),
738740
Policy::Unsatisfiable
739741
);
740-
assert_eq!(policy.clone().at_age(RelLockTime::from_height(1000).into()), policy);
741742
assert_eq!(
742743
policy
743744
.clone()
744-
.at_age(RelLockTime::from_height(10000).into()),
745+
.at_age(RelLockTime::from_height(1000).unwrap().into()),
746+
policy
747+
);
748+
assert_eq!(
749+
policy
750+
.clone()
751+
.at_age(RelLockTime::from_height(10000).unwrap().into()),
745752
policy
746753
);
747754
assert_eq!(policy.n_keys(), 0);
@@ -752,24 +759,28 @@ mod tests {
752759
policy,
753760
Policy::Thresh(Threshold::or(
754761
Policy::Key("".to_owned()).into(),
755-
Policy::Older(RelLockTime::from_height(1000)).into(),
762+
Policy::Older(RelLockTime::from_height(1000).unwrap()).into(),
756763
))
757764
);
758765
assert_eq!(policy.relative_timelocks(), vec![1000]);
759766
assert_eq!(policy.absolute_timelocks(), vec![]);
760767
assert_eq!(policy.clone().at_age(RelLockTime::ZERO.into()), Policy::Key("".to_owned()));
761768
assert_eq!(
762-
policy.clone().at_age(RelLockTime::from_height(999).into()),
769+
policy
770+
.clone()
771+
.at_age(RelLockTime::from_height(999).unwrap().into()),
763772
Policy::Key("".to_owned())
764773
);
765774
assert_eq!(
766-
policy.clone().at_age(RelLockTime::from_height(1000).into()),
775+
policy
776+
.clone()
777+
.at_age(RelLockTime::from_height(1000).unwrap().into()),
767778
policy.clone().normalized()
768779
);
769780
assert_eq!(
770781
policy
771782
.clone()
772-
.at_age(RelLockTime::from_height(10000).into()),
783+
.at_age(RelLockTime::from_height(10000).unwrap().into()),
773784
policy.clone().normalized()
774785
);
775786
assert_eq!(policy.n_keys(), 1);
@@ -813,11 +824,11 @@ mod tests {
813824
Threshold::new(
814825
2,
815826
vec![
816-
Policy::Older(RelLockTime::from_height(1000)).into(),
817-
Policy::Older(RelLockTime::from_height(10000)).into(),
818-
Policy::Older(RelLockTime::from_height(1000)).into(),
819-
Policy::Older(RelLockTime::from_height(2000)).into(),
820-
Policy::Older(RelLockTime::from_height(2000)).into(),
827+
Policy::Older(RelLockTime::from_height(1000).unwrap()).into(),
828+
Policy::Older(RelLockTime::from_height(10000).unwrap()).into(),
829+
Policy::Older(RelLockTime::from_height(1000).unwrap()).into(),
830+
Policy::Older(RelLockTime::from_height(2000).unwrap()).into(),
831+
Policy::Older(RelLockTime::from_height(2000).unwrap()).into(),
821832
]
822833
)
823834
.unwrap()
@@ -840,9 +851,9 @@ mod tests {
840851
Threshold::new(
841852
2,
842853
vec![
843-
Policy::Older(RelLockTime::from_height(1000)).into(),
844-
Policy::Older(RelLockTime::from_height(10000)).into(),
845-
Policy::Older(RelLockTime::from_height(1000)).into(),
854+
Policy::Older(RelLockTime::from_height(1000).unwrap()).into(),
855+
Policy::Older(RelLockTime::from_height(10000).unwrap()).into(),
856+
Policy::Older(RelLockTime::from_height(1000).unwrap()).into(),
846857
Policy::Unsatisfiable.into(),
847858
Policy::Unsatisfiable.into(),
848859
]
@@ -964,7 +975,7 @@ mod tests {
964975
.entails(
965976
liquid_pol
966977
.clone()
967-
.at_age(RelLockTime::from_height(4095).into())
978+
.at_age(RelLockTime::from_height(4095).unwrap().into())
968979
)
969980
.unwrap());
970981

src/primitives/relative_locktime.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,12 @@ impl RelLockTime {
4848
pub fn to_consensus_u32(self) -> u32 { self.0.to_consensus_u32() }
4949

5050
/// Takes a 16-bit number of blocks and produces a relative locktime from it.
51-
pub fn from_height(height: u16) -> Self { RelLockTime(Sequence::from_height(height)) }
51+
pub fn from_height(height: u16) -> Result<Self, RelLockTimeError> {
52+
convert::TryFrom::try_from(Sequence::from_height(height))
53+
}
54+
55+
/// Takes a 16-bit number of blocks and produces a relative locktime from it.
56+
pub fn from_height_unchecked(height: u16) -> Self { RelLockTime(Sequence::from_height(height)) }
5257

5358
/// Takes a 16-bit number of 512-second time intervals and produces a relative locktime from it.
5459
pub fn from_512_second_intervals(time: u16) -> Self {

0 commit comments

Comments
 (0)