@@ -179,6 +179,75 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
179
179
} ;
180
180
Ok ( frag)
181
181
}
182
+
183
+ /// Substitutes raw public keys hashes with the public keys as provided by map.
184
+ pub fn substitute_raw_pkh ( & self , pk_map : & HashMap < hash160:: Hash , Pk > ) -> Terminal < Pk , Ctx > {
185
+ match self {
186
+ Terminal :: RawPkH ( ref p) => match pk_map. get ( p) {
187
+ Some ( pk) => Terminal :: PkH ( pk. clone ( ) ) . into ( ) ,
188
+ None => Terminal :: RawPkH ( * p) . into ( ) ,
189
+ } ,
190
+ Terminal :: PkK ( ..)
191
+ | Terminal :: PkH ( ..)
192
+ | Terminal :: Multi ( ..)
193
+ | Terminal :: MultiA ( ..)
194
+ | Terminal :: After ( ..)
195
+ | Terminal :: Older ( ..)
196
+ | Terminal :: Sha256 ( ..)
197
+ | Terminal :: Hash256 ( ..)
198
+ | Terminal :: Ripemd160 ( ..)
199
+ | Terminal :: Hash160 ( ..)
200
+ | Terminal :: True
201
+ | Terminal :: False => self . clone ( ) . into ( ) ,
202
+ Terminal :: Alt ( ref sub) => Terminal :: Alt ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
203
+ Terminal :: Swap ( ref sub) => Terminal :: Swap ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
204
+ Terminal :: Check ( ref sub) => Terminal :: Check ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
205
+ Terminal :: DupIf ( ref sub) => Terminal :: DupIf ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
206
+ Terminal :: Verify ( ref sub) => Terminal :: Verify ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) ) ,
207
+ Terminal :: NonZero ( ref sub) => {
208
+ Terminal :: NonZero ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) )
209
+ }
210
+ Terminal :: ZeroNotEqual ( ref sub) => {
211
+ Terminal :: ZeroNotEqual ( Arc :: new ( sub. substitute_raw_pkh ( pk_map) ) )
212
+ }
213
+ Terminal :: AndV ( ref left, ref right) => Terminal :: AndV (
214
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
215
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
216
+ ) ,
217
+ Terminal :: AndB ( ref left, ref right) => Terminal :: AndB (
218
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
219
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
220
+ ) ,
221
+ Terminal :: AndOr ( ref a, ref b, ref c) => Terminal :: AndOr (
222
+ Arc :: new ( a. substitute_raw_pkh ( pk_map) ) ,
223
+ Arc :: new ( b. substitute_raw_pkh ( pk_map) ) ,
224
+ Arc :: new ( c. substitute_raw_pkh ( pk_map) ) ,
225
+ ) ,
226
+ Terminal :: OrB ( ref left, ref right) => Terminal :: OrB (
227
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
228
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
229
+ ) ,
230
+ Terminal :: OrD ( ref left, ref right) => Terminal :: OrD (
231
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
232
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
233
+ ) ,
234
+ Terminal :: OrC ( ref left, ref right) => Terminal :: OrC (
235
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
236
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
237
+ ) ,
238
+ Terminal :: OrI ( ref left, ref right) => Terminal :: OrI (
239
+ Arc :: new ( left. substitute_raw_pkh ( pk_map) ) ,
240
+ Arc :: new ( right. substitute_raw_pkh ( pk_map) ) ,
241
+ ) ,
242
+ Terminal :: Thresh ( k, ref subs) => {
243
+ let subs: Vec < Arc < Miniscript < _ , _ > > > = subs
244
+ . iter ( )
245
+ . map ( |s| Arc :: new ( s. substitute_raw_pkh ( pk_map) ) )
246
+ . collect ( ) ;
247
+ Terminal :: Thresh ( * k, subs)
248
+ }
249
+ }
250
+ }
182
251
}
183
252
184
253
impl < Pk : MiniscriptKey , Ctx : ScriptContext > ForEachKey < Pk > for Terminal < Pk , Ctx > {
0 commit comments