Skip to content

Commit 44c43b3

Browse files
committed
tests: add sortedmulti_a example
The example is to show that the address is the same regardless of the x-only pubkey order within the miniscript.
1 parent d334c2a commit 44c43b3

1 file changed

Lines changed: 34 additions & 0 deletions

File tree

examples/xpub_descriptors.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ fn main() {
2020

2121
// P2WSH-P2SH and ranged xpubs.
2222
let _ = p2sh_p2wsh(&secp);
23+
24+
// P2TR with xpubs in sortedmulti_a
25+
let _ = p2tr_sortedmulti_a(&secp);
2326
}
2427

2528
/// Parses a P2WSH descriptor, returns the associated address.
@@ -64,3 +67,34 @@ fn p2sh_p2wsh<C: Verification>(secp: &Secp256k1<C>) -> Address {
6467
assert_eq!(address, expected);
6568
address
6669
}
70+
71+
/// Parses a P2TR sortedmulti_a descriptor, returns the associated address.
72+
fn p2tr_sortedmulti_a<C: Verification>(secp: &Secp256k1<C>) -> Address {
73+
let internal = "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0";
74+
// It does not matter what order the two xpubs go in, the same address will be generated.
75+
let s1 = format!("tr({},sortedmulti_a(2,{}/1/0/*,{}/0/0/*))", internal, XPUB_1, XPUB_2);
76+
let s2 = format!("tr({},sortedmulti_a(2,{}/0/0/*,{}/1/0/*))", internal, XPUB_2, XPUB_1);
77+
78+
let [address1, address2]: [Address; 2] = [s1, s2]
79+
.into_iter()
80+
.map(|s| {
81+
Descriptor::<DescriptorPublicKey>::from_str(&s)
82+
.unwrap()
83+
.derived_descriptor(secp, 5)
84+
.unwrap()
85+
.address(Network::Bitcoin)
86+
.unwrap()
87+
})
88+
.collect::<Vec<_>>()
89+
.try_into()
90+
.unwrap();
91+
92+
let expected =
93+
Address::from_str("bc1ppfd3y5lxq4nf3tfstccz0t0hly3vmj93t7z46e52zlpt6dyf4hwqxaxnxc")
94+
.unwrap()
95+
.require_network(Network::Bitcoin)
96+
.unwrap();
97+
assert_eq!(address1, expected);
98+
assert_eq!(address1, address2);
99+
address1
100+
}

0 commit comments

Comments
 (0)