@@ -21,6 +21,7 @@ pub mod semantic;
21
21
pub use self :: concrete:: Policy as Concrete ;
22
22
pub use self :: semantic:: Policy as Semantic ;
23
23
use crate :: descriptor:: Descriptor ;
24
+ use crate :: iter:: TreeLike as _;
24
25
use crate :: miniscript:: { Miniscript , ScriptContext } ;
25
26
use crate :: sync:: Arc ;
26
27
#[ cfg( all( not( feature = "std" ) , not( test) ) ) ]
@@ -111,68 +112,64 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Liftable<Pk> for Miniscript<Pk, Ctx>
111
112
// check whether the root miniscript can have a spending path that is
112
113
// a combination of heightlock and timelock
113
114
self . lift_check ( ) ?;
114
- self . as_inner ( ) . lift ( )
115
- }
116
- }
117
115
118
- impl < Pk : MiniscriptKey , Ctx : ScriptContext > Liftable < Pk > for Terminal < Pk , Ctx > {
119
- fn lift ( & self ) -> Result < Semantic < Pk > , Error > {
120
- let ret = match * self {
121
- Terminal :: PkK ( ref pk) | Terminal :: PkH ( ref pk) => Semantic :: Key ( pk. clone ( ) ) ,
122
- Terminal :: RawPkH ( ref _pkh) => {
123
- return Err ( Error :: LiftError ( LiftError :: RawDescriptorLift ) )
124
- }
125
- Terminal :: After ( t) => Semantic :: After ( t) ,
126
- Terminal :: Older ( t) => Semantic :: Older ( t) ,
127
- Terminal :: Sha256 ( ref h) => Semantic :: Sha256 ( h. clone ( ) ) ,
128
- Terminal :: Hash256 ( ref h) => Semantic :: Hash256 ( h. clone ( ) ) ,
129
- Terminal :: Ripemd160 ( ref h) => Semantic :: Ripemd160 ( h. clone ( ) ) ,
130
- Terminal :: Hash160 ( ref h) => Semantic :: Hash160 ( h. clone ( ) ) ,
131
- Terminal :: False => Semantic :: Unsatisfiable ,
132
- Terminal :: True => Semantic :: Trivial ,
133
- Terminal :: Alt ( ref sub)
134
- | Terminal :: Swap ( ref sub)
135
- | Terminal :: Check ( ref sub)
136
- | Terminal :: DupIf ( ref sub)
137
- | Terminal :: Verify ( ref sub)
138
- | Terminal :: NonZero ( ref sub)
139
- | Terminal :: ZeroNotEqual ( ref sub) => sub. node . lift ( ) ?,
140
- Terminal :: AndV ( ref left, ref right) | Terminal :: AndB ( ref left, ref right) => {
141
- Semantic :: Thresh ( Threshold :: and (
142
- Arc :: new ( left. node . lift ( ) ?) ,
143
- Arc :: new ( right. node . lift ( ) ?) ,
144
- ) )
145
- }
146
- Terminal :: AndOr ( ref a, ref b, ref c) => Semantic :: Thresh ( Threshold :: or (
147
- Arc :: new ( Semantic :: Thresh ( Threshold :: and (
148
- Arc :: new ( a. node . lift ( ) ?) ,
149
- Arc :: new ( b. node . lift ( ) ?) ,
116
+ let mut stack = vec ! [ ] ;
117
+ for item in self . rtl_post_order_iter ( ) {
118
+ let new_term = match item. node . node {
119
+ Terminal :: PkK ( ref pk) | Terminal :: PkH ( ref pk) => {
120
+ Arc :: new ( Semantic :: Key ( pk. clone ( ) ) )
121
+ }
122
+ Terminal :: RawPkH ( ref _pkh) => {
123
+ return Err ( Error :: LiftError ( LiftError :: RawDescriptorLift ) )
124
+ }
125
+ Terminal :: After ( t) => Arc :: new ( Semantic :: After ( t) ) ,
126
+ Terminal :: Older ( t) => Arc :: new ( Semantic :: Older ( t) ) ,
127
+ Terminal :: Sha256 ( ref h) => Arc :: new ( Semantic :: Sha256 ( h. clone ( ) ) ) ,
128
+ Terminal :: Hash256 ( ref h) => Arc :: new ( Semantic :: Hash256 ( h. clone ( ) ) ) ,
129
+ Terminal :: Ripemd160 ( ref h) => Arc :: new ( Semantic :: Ripemd160 ( h. clone ( ) ) ) ,
130
+ Terminal :: Hash160 ( ref h) => Arc :: new ( Semantic :: Hash160 ( h. clone ( ) ) ) ,
131
+ Terminal :: False => Arc :: new ( Semantic :: Unsatisfiable ) ,
132
+ Terminal :: True => Arc :: new ( Semantic :: Trivial ) ,
133
+ Terminal :: Alt ( ..)
134
+ | Terminal :: Swap ( ..)
135
+ | Terminal :: Check ( ..)
136
+ | Terminal :: DupIf ( ..)
137
+ | Terminal :: Verify ( ..)
138
+ | Terminal :: NonZero ( ..)
139
+ | Terminal :: ZeroNotEqual ( ..) => stack. pop ( ) . unwrap ( ) ,
140
+ Terminal :: AndV ( ..) | Terminal :: AndB ( ..) => Arc :: new ( Semantic :: Thresh (
141
+ Threshold :: and ( stack. pop ( ) . unwrap ( ) , stack. pop ( ) . unwrap ( ) ) ,
142
+ ) ) ,
143
+ Terminal :: AndOr ( ..) => Arc :: new ( Semantic :: Thresh ( Threshold :: or (
144
+ Arc :: new ( Semantic :: Thresh ( Threshold :: and (
145
+ stack. pop ( ) . unwrap ( ) ,
146
+ stack. pop ( ) . unwrap ( ) ,
147
+ ) ) ) ,
148
+ stack. pop ( ) . unwrap ( ) ,
150
149
) ) ) ,
151
- Arc :: new ( c. node . lift ( ) ?) ,
152
- ) ) ,
153
- Terminal :: OrB ( ref left, ref right)
154
- | Terminal :: OrD ( ref left, ref right)
155
- | Terminal :: OrC ( ref left, ref right)
156
- | Terminal :: OrI ( ref left, ref right) => Semantic :: Thresh ( Threshold :: or (
157
- Arc :: new ( left. node . lift ( ) ?) ,
158
- Arc :: new ( right. node . lift ( ) ?) ,
159
- ) ) ,
160
- Terminal :: Thresh ( ref thresh) => thresh
161
- . translate_ref ( |sub| sub. lift ( ) . map ( Arc :: new) )
162
- . map ( Semantic :: Thresh ) ?,
163
- Terminal :: Multi ( ref thresh) => Semantic :: Thresh (
164
- thresh
165
- . map_ref ( |key| Arc :: new ( Semantic :: Key ( key. clone ( ) ) ) )
166
- . forget_maximum ( ) ,
167
- ) ,
168
- Terminal :: MultiA ( ref thresh) => Semantic :: Thresh (
169
- thresh
170
- . map_ref ( |key| Arc :: new ( Semantic :: Key ( key. clone ( ) ) ) )
171
- . forget_maximum ( ) ,
172
- ) ,
150
+ Terminal :: OrB ( ..) | Terminal :: OrD ( ..) | Terminal :: OrC ( ..) | Terminal :: OrI ( ..) => {
151
+ Arc :: new ( Semantic :: Thresh ( Threshold :: or (
152
+ stack. pop ( ) . unwrap ( ) ,
153
+ stack. pop ( ) . unwrap ( ) ,
154
+ ) ) )
155
+ }
156
+ Terminal :: Thresh ( ref thresh) => {
157
+ Arc :: new ( Semantic :: Thresh ( thresh. map_ref ( |_| stack. pop ( ) . unwrap ( ) ) ) )
158
+ }
159
+ Terminal :: Multi ( ref thresh) => Arc :: new ( Semantic :: Thresh (
160
+ thresh
161
+ . map_ref ( |key| Arc :: new ( Semantic :: Key ( key. clone ( ) ) ) )
162
+ . forget_maximum ( ) ,
163
+ ) ) ,
164
+ Terminal :: MultiA ( ref thresh) => Arc :: new ( Semantic :: Thresh (
165
+ thresh
166
+ . map_ref ( |key| Arc :: new ( Semantic :: Key ( key. clone ( ) ) ) )
167
+ . forget_maximum ( ) ,
168
+ ) ) ,
169
+ } ;
170
+ stack. push ( new_term)
173
171
}
174
- . normalized ( ) ;
175
- Ok ( ret)
172
+ Ok ( Arc :: try_unwrap ( stack. pop ( ) . unwrap ( ) ) . unwrap ( ) . normalized ( ) )
176
173
}
177
174
}
178
175
0 commit comments