@@ -25,6 +25,7 @@ use bitcoin::blockdata::{opcodes, script};
25
25
use bitcoin:: hashes:: hex:: FromHex ;
26
26
use bitcoin:: hashes:: { hash160, ripemd160, sha256, sha256d, Hash } ;
27
27
28
+ use descriptor:: PkTranslate ;
28
29
use errstr;
29
30
use expression;
30
31
use miniscript:: types:: { self , Property } ;
@@ -59,11 +60,29 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
59
60
}
60
61
}
61
62
62
- impl < Pk : MiniscriptKey , Ctx : ScriptContext > Terminal < Pk , Ctx > {
63
+ impl < Pk : MiniscriptKey , Q : MiniscriptKey , Ctx : ScriptContext > PkTranslate < Pk , Q >
64
+ for Terminal < Pk , Ctx >
65
+ {
66
+ type Output = Terminal < Q , Ctx > ;
67
+
63
68
/// Convert an AST element with one public key type to one of another
64
69
/// public key type .This will panic while converting to
65
70
/// Segwit Miniscript using uncompressed public keys
66
- pub fn translate_pk < FPk , FPkh , Q , Error > (
71
+ fn translate_pk < FPk , FPkh , FuncError > (
72
+ & self ,
73
+ mut translatefpk : FPk ,
74
+ mut translatefpkh : FPkh ,
75
+ ) -> Result < Self :: Output , FuncError >
76
+ where
77
+ FPk : FnMut ( & Pk ) -> Result < Q , FuncError > ,
78
+ FPkh : FnMut ( & Pk :: Hash ) -> Result < Q :: Hash , FuncError > ,
79
+ {
80
+ self . real_translate_pk ( & mut translatefpk, & mut translatefpkh)
81
+ }
82
+ }
83
+
84
+ impl < Pk : MiniscriptKey , Ctx : ScriptContext > Terminal < Pk , Ctx > {
85
+ pub ( super ) fn real_translate_pk < FPk , FPkh , Q , Error > (
67
86
& self ,
68
87
translatefpk : & mut FPk ,
69
88
translatefpkh : & mut FPkh ,
@@ -84,61 +103,63 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
84
103
Terminal :: Hash160 ( x) => Terminal :: Hash160 ( x) ,
85
104
Terminal :: True => Terminal :: True ,
86
105
Terminal :: False => Terminal :: False ,
87
- Terminal :: Alt ( ref sub) => {
88
- Terminal :: Alt ( Arc :: new ( sub. translate_pk ( translatefpk, translatefpkh) ?) )
89
- }
90
- Terminal :: Swap ( ref sub) => {
91
- Terminal :: Swap ( Arc :: new ( sub. translate_pk ( translatefpk, translatefpkh) ?) )
92
- }
93
- Terminal :: Check ( ref sub) => {
94
- Terminal :: Check ( Arc :: new ( sub. translate_pk ( translatefpk, translatefpkh) ?) )
95
- }
96
- Terminal :: DupIf ( ref sub) => {
97
- Terminal :: DupIf ( Arc :: new ( sub. translate_pk ( translatefpk, translatefpkh) ?) )
98
- }
99
- Terminal :: Verify ( ref sub) => {
100
- Terminal :: Verify ( Arc :: new ( sub. translate_pk ( translatefpk, translatefpkh) ?) )
101
- }
102
- Terminal :: NonZero ( ref sub) => {
103
- Terminal :: NonZero ( Arc :: new ( sub. translate_pk ( translatefpk, translatefpkh) ?) )
104
- }
105
- Terminal :: ZeroNotEqual ( ref sub) => {
106
- Terminal :: ZeroNotEqual ( Arc :: new ( sub. translate_pk ( translatefpk, translatefpkh) ?) )
107
- }
106
+ Terminal :: Alt ( ref sub) => Terminal :: Alt ( Arc :: new (
107
+ sub. real_translate_pk ( translatefpk, translatefpkh) ?,
108
+ ) ) ,
109
+ Terminal :: Swap ( ref sub) => Terminal :: Swap ( Arc :: new (
110
+ sub. real_translate_pk ( translatefpk, translatefpkh) ?,
111
+ ) ) ,
112
+ Terminal :: Check ( ref sub) => Terminal :: Check ( Arc :: new (
113
+ sub. real_translate_pk ( translatefpk, translatefpkh) ?,
114
+ ) ) ,
115
+ Terminal :: DupIf ( ref sub) => Terminal :: DupIf ( Arc :: new (
116
+ sub. real_translate_pk ( translatefpk, translatefpkh) ?,
117
+ ) ) ,
118
+ Terminal :: Verify ( ref sub) => Terminal :: Verify ( Arc :: new (
119
+ sub. real_translate_pk ( translatefpk, translatefpkh) ?,
120
+ ) ) ,
121
+ Terminal :: NonZero ( ref sub) => Terminal :: NonZero ( Arc :: new (
122
+ sub. real_translate_pk ( translatefpk, translatefpkh) ?,
123
+ ) ) ,
124
+ Terminal :: ZeroNotEqual ( ref sub) => Terminal :: ZeroNotEqual ( Arc :: new (
125
+ sub. real_translate_pk ( translatefpk, translatefpkh) ?,
126
+ ) ) ,
108
127
Terminal :: AndV ( ref left, ref right) => Terminal :: AndV (
109
- Arc :: new ( left. translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
110
- Arc :: new ( right. translate_pk ( translatefpk, translatefpkh) ?) ,
128
+ Arc :: new ( left. real_translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
129
+ Arc :: new ( right. real_translate_pk ( translatefpk, translatefpkh) ?) ,
111
130
) ,
112
131
Terminal :: AndB ( ref left, ref right) => Terminal :: AndB (
113
- Arc :: new ( left. translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
114
- Arc :: new ( right. translate_pk ( translatefpk, translatefpkh) ?) ,
132
+ Arc :: new ( left. real_translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
133
+ Arc :: new ( right. real_translate_pk ( translatefpk, translatefpkh) ?) ,
115
134
) ,
116
135
Terminal :: AndOr ( ref a, ref b, ref c) => Terminal :: AndOr (
117
- Arc :: new ( a. translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
118
- Arc :: new ( b. translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
119
- Arc :: new ( c. translate_pk ( translatefpk, translatefpkh) ?) ,
136
+ Arc :: new ( a. real_translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
137
+ Arc :: new ( b. real_translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
138
+ Arc :: new ( c. real_translate_pk ( translatefpk, translatefpkh) ?) ,
120
139
) ,
121
140
Terminal :: OrB ( ref left, ref right) => Terminal :: OrB (
122
- Arc :: new ( left. translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
123
- Arc :: new ( right. translate_pk ( translatefpk, translatefpkh) ?) ,
141
+ Arc :: new ( left. real_translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
142
+ Arc :: new ( right. real_translate_pk ( translatefpk, translatefpkh) ?) ,
124
143
) ,
125
144
Terminal :: OrD ( ref left, ref right) => Terminal :: OrD (
126
- Arc :: new ( left. translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
127
- Arc :: new ( right. translate_pk ( translatefpk, translatefpkh) ?) ,
145
+ Arc :: new ( left. real_translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
146
+ Arc :: new ( right. real_translate_pk ( translatefpk, translatefpkh) ?) ,
128
147
) ,
129
148
Terminal :: OrC ( ref left, ref right) => Terminal :: OrC (
130
- Arc :: new ( left. translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
131
- Arc :: new ( right. translate_pk ( translatefpk, translatefpkh) ?) ,
149
+ Arc :: new ( left. real_translate_pk ( & mut * translatefpk, & mut * translatefpkh) ?) ,
150
+ Arc :: new ( right. real_translate_pk ( translatefpk, translatefpkh) ?) ,
132
151
) ,
133
152
Terminal :: OrI ( ref left, ref right) => Terminal :: OrI (
134
- Arc :: new ( left. translate_pk ( & mut * & mut * translatefpk, & mut * & mut * translatefpkh) ?) ,
135
- Arc :: new ( right. translate_pk ( translatefpk, translatefpkh) ?) ,
153
+ Arc :: new (
154
+ left. real_translate_pk ( & mut * & mut * translatefpk, & mut * & mut * translatefpkh) ?,
155
+ ) ,
156
+ Arc :: new ( right. real_translate_pk ( translatefpk, translatefpkh) ?) ,
136
157
) ,
137
158
Terminal :: Thresh ( k, ref subs) => {
138
159
let subs: Result < Vec < Arc < Miniscript < Q , _ > > > , _ > = subs
139
160
. iter ( )
140
161
. map ( |s| {
141
- s. translate_pk ( & mut * translatefpk, & mut * translatefpkh)
162
+ s. real_translate_pk ( & mut * translatefpk, & mut * translatefpkh)
142
163
. and_then ( |x| Ok ( Arc :: new ( x) ) )
143
164
} )
144
165
. collect ( ) ;
0 commit comments