@@ -23,7 +23,7 @@ pub use self::semantic::Policy as Semantic;
23
23
use crate :: descriptor:: Descriptor ;
24
24
use crate :: miniscript:: { Miniscript , ScriptContext } ;
25
25
use crate :: sync:: Arc ;
26
- use crate :: { Error , MiniscriptKey , Terminal } ;
26
+ use crate :: { Error , MiniscriptKey , Terminal , Vec } ;
27
27
28
28
/// Policy entailment algorithm maximum number of terminals allowed.
29
29
const ENTAILMENT_MAX_TERMINALS : usize = 20 ;
@@ -136,28 +136,43 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Liftable<Pk> for Terminal<Pk, Ctx> {
136
136
| Terminal :: NonZero ( ref sub)
137
137
| Terminal :: ZeroNotEqual ( ref sub) => sub. node . lift ( ) ?,
138
138
Terminal :: AndV ( ref left, ref right) | Terminal :: AndB ( ref left, ref right) => {
139
- Semantic :: Threshold ( 2 , vec ! [ left. node. lift( ) ?, right. node. lift( ) ?] )
139
+ Semantic :: Threshold (
140
+ 2 ,
141
+ vec ! [ Arc :: new( left. node. lift( ) ?) , Arc :: new( right. node. lift( ) ?) ] ,
142
+ )
140
143
}
141
144
Terminal :: AndOr ( ref a, ref b, ref c) => Semantic :: Threshold (
142
145
1 ,
143
146
vec ! [
144
- Semantic :: Threshold ( 2 , vec![ a. node. lift( ) ?, b. node. lift( ) ?] ) ,
145
- c. node. lift( ) ?,
147
+ Arc :: new( Semantic :: Threshold (
148
+ 2 ,
149
+ vec![ Arc :: new( a. node. lift( ) ?) , Arc :: new( b. node. lift( ) ?) ] ,
150
+ ) ) ,
151
+ Arc :: new( c. node. lift( ) ?) ,
146
152
] ,
147
153
) ,
148
154
Terminal :: OrB ( ref left, ref right)
149
155
| Terminal :: OrD ( ref left, ref right)
150
156
| Terminal :: OrC ( ref left, ref right)
151
- | Terminal :: OrI ( ref left, ref right) => {
152
- Semantic :: Threshold ( 1 , vec ! [ left. node. lift( ) ?, right. node. lift( ) ?] )
153
- }
157
+ | Terminal :: OrI ( ref left, ref right) => Semantic :: Threshold (
158
+ 1 ,
159
+ vec ! [ Arc :: new( left. node. lift( ) ?) , Arc :: new( right. node. lift( ) ?) ] ,
160
+ ) ,
154
161
Terminal :: Thresh ( k, ref subs) => {
155
- let semantic_subs: Result < _ , Error > = subs. iter ( ) . map ( |s| s. node . lift ( ) ) . collect ( ) ;
156
- Semantic :: Threshold ( k, semantic_subs?)
157
- }
158
- Terminal :: Multi ( k, ref keys) | Terminal :: MultiA ( k, ref keys) => {
159
- Semantic :: Threshold ( k, keys. iter ( ) . map ( |k| Semantic :: Key ( k. clone ( ) ) ) . collect ( ) )
162
+ let semantic_subs: Result < Vec < Semantic < Pk > > , Error > =
163
+ subs. iter ( ) . map ( |s| s. node . lift ( ) ) . collect ( ) ;
164
+ let semantic_subs = semantic_subs?
165
+ . into_iter ( )
166
+ . map ( |sub| Arc :: new ( sub) )
167
+ . collect ( ) ;
168
+ Semantic :: Threshold ( k, semantic_subs)
160
169
}
170
+ Terminal :: Multi ( k, ref keys) | Terminal :: MultiA ( k, ref keys) => Semantic :: Threshold (
171
+ k,
172
+ keys. iter ( )
173
+ . map ( |k| Arc :: new ( Semantic :: Key ( k. clone ( ) ) ) )
174
+ . collect ( ) ,
175
+ ) ,
161
176
}
162
177
. normalized ( ) ;
163
178
Ok ( ret)
@@ -197,17 +212,31 @@ impl<Pk: MiniscriptKey> Liftable<Pk> for Concrete<Pk> {
197
212
Concrete :: Ripemd160 ( ref h) => Semantic :: Ripemd160 ( h. clone ( ) ) ,
198
213
Concrete :: Hash160 ( ref h) => Semantic :: Hash160 ( h. clone ( ) ) ,
199
214
Concrete :: And ( ref subs) => {
200
- let semantic_subs: Result < _ , Error > = subs. iter ( ) . map ( Liftable :: lift) . collect ( ) ;
201
- Semantic :: Threshold ( 2 , semantic_subs?)
215
+ let semantic_subs: Result < Vec < Semantic < Pk > > , Error > =
216
+ subs. iter ( ) . map ( Liftable :: lift) . collect ( ) ;
217
+ let semantic_subs = semantic_subs?
218
+ . into_iter ( )
219
+ . map ( |sub| Arc :: new ( sub) )
220
+ . collect ( ) ;
221
+ Semantic :: Threshold ( 2 , semantic_subs)
202
222
}
203
223
Concrete :: Or ( ref subs) => {
204
- let semantic_subs: Result < _ , Error > =
224
+ let semantic_subs: Result < Vec < Semantic < Pk > > , Error > =
205
225
subs. iter ( ) . map ( |( _p, sub) | sub. lift ( ) ) . collect ( ) ;
206
- Semantic :: Threshold ( 1 , semantic_subs?)
226
+ let semantic_subs = semantic_subs?
227
+ . into_iter ( )
228
+ . map ( |sub| Arc :: new ( sub) )
229
+ . collect ( ) ;
230
+ Semantic :: Threshold ( 1 , semantic_subs)
207
231
}
208
232
Concrete :: Threshold ( k, ref subs) => {
209
- let semantic_subs: Result < _ , Error > = subs. iter ( ) . map ( Liftable :: lift) . collect ( ) ;
210
- Semantic :: Threshold ( k, semantic_subs?)
233
+ let semantic_subs: Result < Vec < Semantic < Pk > > , Error > =
234
+ subs. iter ( ) . map ( Liftable :: lift) . collect ( ) ;
235
+ let semantic_subs = semantic_subs?
236
+ . into_iter ( )
237
+ . map ( |sub| Arc :: new ( sub) )
238
+ . collect ( ) ;
239
+ Semantic :: Threshold ( k, semantic_subs)
211
240
}
212
241
}
213
242
. normalized ( ) ;
@@ -346,14 +375,14 @@ mod tests {
346
375
Semantic :: Threshold (
347
376
1 ,
348
377
vec![
349
- Semantic :: Threshold (
378
+ Arc :: new ( Semantic :: Threshold (
350
379
2 ,
351
380
vec![
352
- Semantic :: Key ( key_a) ,
353
- Semantic :: Older ( Sequence :: from_height( 42 ) )
381
+ Arc :: new ( Semantic :: Key ( key_a) ) ,
382
+ Arc :: new ( Semantic :: Older ( Sequence :: from_height( 42 ) ) )
354
383
]
355
- ) ,
356
- Semantic :: Key ( key_b)
384
+ ) ) ,
385
+ Arc :: new ( Semantic :: Key ( key_b) )
357
386
]
358
387
) ,
359
388
ms_str. lift( ) . unwrap( )
0 commit comments