@@ -582,22 +582,71 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Miniscript<Pk, Ctx> {
582
582
583
583
/// Substitutes raw public keys hashes with the public keys as provided by map.
584
584
pub fn substitute_raw_pkh ( & self , pk_map : & BTreeMap < hash160:: Hash , Pk > ) -> Miniscript < Pk , Ctx > {
585
- let mut translated = vec ! [ ] ;
586
- for data in Arc :: new ( self . clone ( ) ) . post_order_iter ( ) {
587
- let new_term = if let Terminal :: RawPkH ( ref p) = data. node . node {
588
- match pk_map. get ( p) {
589
- Some ( pk) => Terminal :: PkH ( pk. clone ( ) ) ,
590
- None => Terminal :: RawPkH ( * p) ,
591
- }
592
- } else {
593
- data. node . node . clone ( )
594
- } ;
595
-
596
- let new_ms = Miniscript :: from_ast ( new_term) . expect ( "typeck" ) ;
597
- translated. push ( Arc :: new ( new_ms) ) ;
598
- }
585
+ let new_term = match & self . node {
586
+ Terminal :: RawPkH ( ref p) => match pk_map. get ( p) {
587
+ Some ( pk) => Terminal :: PkH ( pk. clone ( ) ) ,
588
+ None => Terminal :: RawPkH ( * p) ,
589
+ } ,
590
+ Terminal :: Alt ( sub) => Terminal :: Alt ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
591
+ Terminal :: Swap ( sub) => Terminal :: Swap ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
592
+ Terminal :: Check ( sub) => Terminal :: Check ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
593
+ Terminal :: DupIf ( sub) => Terminal :: DupIf ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
594
+ Terminal :: Verify ( sub) => Terminal :: Verify ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
595
+ Terminal :: NonZero ( sub) => Terminal :: NonZero ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
596
+ Terminal :: ZeroNotEqual ( sub) => {
597
+ Terminal :: ZeroNotEqual ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) )
598
+ }
599
+ Terminal :: AndV ( left, right) => Terminal :: AndV (
600
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
601
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
602
+ ) ,
603
+ Terminal :: AndB ( left, right) => Terminal :: AndB (
604
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
605
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
606
+ ) ,
607
+ Terminal :: OrB ( left, right) => Terminal :: OrB (
608
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
609
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
610
+ ) ,
611
+ Terminal :: OrD ( left, right) => Terminal :: OrD (
612
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
613
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
614
+ ) ,
615
+ Terminal :: OrC ( left, right) => Terminal :: OrC (
616
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
617
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
618
+ ) ,
619
+ Terminal :: OrI ( left, right) => Terminal :: OrI (
620
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
621
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
622
+ ) ,
623
+ Terminal :: AndOr ( a, b, c) => Terminal :: AndOr (
624
+ Arc :: new ( a. substitute_raw_pkh ( pk_map) ) ,
625
+ Arc :: new ( b. substitute_raw_pkh ( pk_map) ) ,
626
+ Arc :: new ( c. substitute_raw_pkh ( pk_map) ) ,
627
+ ) ,
628
+ Terminal :: Thresh ( t) => {
629
+ let new_subs = t
630
+ . iter ( )
631
+ . map ( |sub| Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) )
632
+ . collect ( ) ;
633
+ Terminal :: Thresh ( crate :: Threshold :: new ( t. k ( ) , new_subs) . expect ( "" ) )
634
+ }
635
+ // Multi doesn't contain any RawPkH to substitute
636
+ Terminal :: Multi ( t) => Terminal :: Multi ( t. clone ( ) ) ,
637
+ Terminal :: MultiA ( t) => Terminal :: MultiA ( t. clone ( ) ) ,
638
+ Terminal :: True | Terminal :: False | Terminal :: PkK ( _) | Terminal :: PkH ( _) => {
639
+ self . node . clone ( )
640
+ }
641
+ Terminal :: After ( n) => Terminal :: After ( * n) , // No substitution needed
642
+ Terminal :: Older ( n) => Terminal :: Older ( * n) , // No substitution needed
643
+ Terminal :: Sha256 ( hash) => Terminal :: Sha256 ( hash. clone ( ) ) , // No substitution needed
644
+ Terminal :: Hash256 ( hash) => Terminal :: Hash256 ( hash. clone ( ) ) , // No substitution needed
645
+ Terminal :: Ripemd160 ( hash) => Terminal :: Ripemd160 ( hash. clone ( ) ) , // No substitution needed
646
+ Terminal :: Hash160 ( hash) => Terminal :: Hash160 ( hash. clone ( ) ) , // No s
647
+ } ;
599
648
600
- Arc :: try_unwrap ( translated . pop ( ) . unwrap ( ) ) . unwrap ( )
649
+ Miniscript :: from_ast ( new_term ) . expect ( "typeck" )
601
650
}
602
651
}
603
652
0 commit comments