Skip to content

Commit 73bdae3

Browse files
committed
Sort same-kind locktimes by consensus u32 in Terminal::cmp.
Compare After and Older nodes by consensus u32 rather than locktime Ord, and add a Miniscript ordering regression test.
1 parent bd68e35 commit 73bdae3

2 files changed

Lines changed: 17 additions & 3 deletions

File tree

src/miniscript/display.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::iter::{Tree, TreeLike};
1010
use crate::miniscript::types::Type;
1111
use crate::miniscript::Terminal;
1212
use crate::prelude::sync::Arc;
13+
use crate::primitives::locktime_consensus_cmp;
1314
use crate::{Miniscript, MiniscriptKey, ScriptContext};
1415

1516
#[derive(Clone)]
@@ -343,8 +344,12 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Ord for Terminal<Pk, Ctx> {
343344
(DisplayNode::ThresholdK(me), DisplayNode::ThresholdK(you)) => me.cmp(&you),
344345
(DisplayNode::Key(me), DisplayNode::Key(you)) => me.cmp(you),
345346
(DisplayNode::RawKeyHash(me), DisplayNode::RawKeyHash(you)) => me.cmp(you),
346-
(DisplayNode::After(me), DisplayNode::After(you)) => me.cmp(you),
347-
(DisplayNode::Older(me), DisplayNode::Older(you)) => me.cmp(you),
347+
(DisplayNode::After(me), DisplayNode::After(you)) => {
348+
locktime_consensus_cmp(me.to_consensus_u32(), you.to_consensus_u32())
349+
}
350+
(DisplayNode::Older(me), DisplayNode::Older(you)) => {
351+
locktime_consensus_cmp(me.to_consensus_u32(), you.to_consensus_u32())
352+
}
348353
(DisplayNode::Sha256(me), DisplayNode::Sha256(you)) => me.cmp(you),
349354
(DisplayNode::Hash256(me), DisplayNode::Hash256(you)) => me.cmp(you),
350355
(DisplayNode::Ripemd160(me), DisplayNode::Ripemd160(you)) => me.cmp(you),

src/miniscript/mod.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1262,7 +1262,8 @@ mod tests {
12621262
use crate::policy::Liftable;
12631263
use crate::test_utils::{StrKeyTranslator, StrXOnlyKeyTranslator};
12641264
use crate::{
1265-
hex_script, BareCtx, Error, Legacy, RelLockTime, Satisfier, ToPublicKey, ValidationError,
1265+
hex_script, AbsLockTime, BareCtx, Error, Legacy, RelLockTime, Satisfier, ToPublicKey,
1266+
ValidationError,
12661267
};
12671268

12681269
type Segwitv0Script = Miniscript<bitcoin::PublicKey, Segwitv0>;
@@ -1979,6 +1980,14 @@ mod tests {
19791980
);
19801981
}
19811982

1983+
#[test]
1984+
fn terminal_ord_locktimes_are_consistent() {
1985+
let a = Miniscript::<String, Segwitv0>::after(AbsLockTime::from_consensus(9).unwrap());
1986+
let b = Miniscript::<String, Segwitv0>::after(AbsLockTime::from_consensus(10).unwrap());
1987+
// Matches policy ordering: 9 < 10 under locktime_consensus_cmp
1988+
assert!(a < b, "after(9) < after(10) under consensus u32 ordering");
1989+
}
1990+
19821991
#[test]
19831992
fn template_timelocks() {
19841993
use crate::{AbsLockTime, RelLockTime};

0 commit comments

Comments
 (0)