@@ -28,7 +28,7 @@ use {Error, Miniscript, MiniscriptKey, Satisfier, Segwitv0, ToPublicKey};
2828
2929use super :: {
3030 checksum:: { desc_checksum, verify_checksum} ,
31- DescriptorTrait , SortedMultiVec ,
31+ DescriptorTrait , PkTranslate , SortedMultiVec ,
3232} ;
3333/// A Segwitv0 wsh descriptor
3434#[ derive( Clone , Ord , PartialOrd , Eq , PartialEq ) ]
@@ -247,6 +247,31 @@ where
247247 }
248248}
249249
250+ impl < P : MiniscriptKey , Q : MiniscriptKey > PkTranslate < P , Q > for Wsh < P > {
251+ type Output = Wsh < Q > ;
252+
253+ fn translate_pk < Fpk , Fpkh , E > (
254+ & self ,
255+ mut translatefpk : Fpk ,
256+ mut translatefpkh : Fpkh ,
257+ ) -> Result < Self :: Output , E >
258+ where
259+ Fpk : FnMut ( & P ) -> Result < Q , E > ,
260+ Fpkh : FnMut ( & P :: Hash ) -> Result < Q :: Hash , E > ,
261+ Q : MiniscriptKey ,
262+ {
263+ let inner = match self . inner {
264+ WshInner :: SortedMulti ( ref smv) => {
265+ WshInner :: SortedMulti ( smv. translate_pk ( & mut translatefpk) ?)
266+ }
267+ WshInner :: Ms ( ref ms) => {
268+ WshInner :: Ms ( ms. translate_pk ( & mut translatefpk, & mut translatefpkh) ?)
269+ }
270+ } ;
271+ Ok ( Wsh { inner : inner } )
272+ }
273+ }
274+
250275/// A bare Wpkh descriptor at top level
251276#[ derive( Clone , Ord , PartialOrd , Eq , PartialEq ) ]
252277pub struct Wpkh < Pk : MiniscriptKey > {
@@ -414,3 +439,20 @@ where
414439 addr. script_pubkey ( )
415440 }
416441}
442+
443+ impl < P : MiniscriptKey , Q : MiniscriptKey > PkTranslate < P , Q > for Wpkh < P > {
444+ type Output = Wpkh < Q > ;
445+
446+ fn translate_pk < Fpk , Fpkh , E > (
447+ & self ,
448+ mut translatefpk : Fpk ,
449+ _translatefpkh : Fpkh ,
450+ ) -> Result < Self :: Output , E >
451+ where
452+ Fpk : FnMut ( & P ) -> Result < Q , E > ,
453+ Fpkh : FnMut ( & P :: Hash ) -> Result < Q :: Hash , E > ,
454+ Q : MiniscriptKey ,
455+ {
456+ Ok ( Wpkh :: new ( translatefpk ( & self . pk ) ?) . expect ( "Uncompressed keys in Wpkh" ) )
457+ }
458+ }
0 commit comments