@@ -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