@@ -103,6 +103,7 @@ mod private {
103103 Terminal :: Check ( ..) => Terminal :: Check ( stack. pop ( ) . unwrap ( ) ) ,
104104 Terminal :: DupIf ( ..) => Terminal :: DupIf ( stack. pop ( ) . unwrap ( ) ) ,
105105 Terminal :: Verify ( ..) => Terminal :: Verify ( stack. pop ( ) . unwrap ( ) ) ,
106+ Terminal :: Drop ( ..) => Terminal :: Drop ( stack. pop ( ) . unwrap ( ) ) ,
106107 Terminal :: NonZero ( ..) => Terminal :: NonZero ( stack. pop ( ) . unwrap ( ) ) ,
107108 Terminal :: ZeroNotEqual ( ..) => Terminal :: ZeroNotEqual ( stack. pop ( ) . unwrap ( ) ) ,
108109 Terminal :: AndV ( ..) => {
@@ -236,6 +237,7 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Miniscript<Pk, Ctx> {
236237 Terminal :: After ( n) => script_num_size ( n. to_consensus_u32 ( ) as usize ) + 1 ,
237238 Terminal :: Older ( n) => script_num_size ( n. to_consensus_u32 ( ) as usize ) + 1 ,
238239 Terminal :: Verify ( ref sub) => usize:: from ( !sub. ext . has_free_verify ) ,
240+ Terminal :: Drop ( ..) => 1 ,
239241 Terminal :: Thresh ( ref thresh) => {
240242 script_num_size ( thresh. k ( ) ) // k
241243 + 1 // EQUAL
@@ -553,6 +555,7 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Miniscript<Pk, Ctx> {
553555 Terminal :: Check ( ..) => Terminal :: Check ( translated. pop ( ) . unwrap ( ) ) ,
554556 Terminal :: DupIf ( ..) => Terminal :: DupIf ( translated. pop ( ) . unwrap ( ) ) ,
555557 Terminal :: Verify ( ..) => Terminal :: Verify ( translated. pop ( ) . unwrap ( ) ) ,
558+ Terminal :: Drop ( ..) => Terminal :: Drop ( translated. pop ( ) . unwrap ( ) ) ,
556559 Terminal :: NonZero ( ..) => Terminal :: NonZero ( translated. pop ( ) . unwrap ( ) ) ,
557560 Terminal :: ZeroNotEqual ( ..) => Terminal :: ZeroNotEqual ( translated. pop ( ) . unwrap ( ) ) ,
558561 Terminal :: AndV ( ..) => {
@@ -618,6 +621,7 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Miniscript<Pk, Ctx> {
618621 Terminal :: Check ( ..) => Terminal :: Check ( stack. pop ( ) . unwrap ( ) ) ,
619622 Terminal :: DupIf ( ..) => Terminal :: DupIf ( stack. pop ( ) . unwrap ( ) ) ,
620623 Terminal :: Verify ( ..) => Terminal :: Verify ( stack. pop ( ) . unwrap ( ) ) ,
624+ Terminal :: Drop ( ..) => Terminal :: Drop ( stack. pop ( ) . unwrap ( ) ) ,
621625 Terminal :: NonZero ( ..) => Terminal :: NonZero ( stack. pop ( ) . unwrap ( ) ) ,
622626 Terminal :: ZeroNotEqual ( ..) => Terminal :: ZeroNotEqual ( stack. pop ( ) . unwrap ( ) ) ,
623627 Terminal :: AndV ( ..) => Terminal :: AndV ( stack. pop ( ) . unwrap ( ) , stack. pop ( ) . unwrap ( ) ) ,
@@ -729,6 +733,7 @@ where
729733 'c' => unwrapped = Terminal :: Check ( Arc :: new ( ms) ) ,
730734 'd' => unwrapped = Terminal :: DupIf ( Arc :: new ( ms) ) ,
731735 'v' => unwrapped = Terminal :: Verify ( Arc :: new ( ms) ) ,
736+ 'r' => unwrapped = Terminal :: Drop ( Arc :: new ( ms) ) ,
732737 'j' => unwrapped = Terminal :: NonZero ( Arc :: new ( ms) ) ,
733738 'n' => unwrapped = Terminal :: ZeroNotEqual ( Arc :: new ( ms) ) ,
734739 't' => unwrapped = Terminal :: AndV ( Arc :: new ( ms) , Arc :: new ( Miniscript :: TRUE ) ) ,
@@ -1202,6 +1207,9 @@ mod tests {
12021207 assert_eq ! ( abs. minimum_n_keys( ) , Some ( 3 ) ) ;
12031208
12041209 roundtrip ( & ms_str ! ( "older(921)" ) , "OP_PUSHBYTES_2 9903 OP_CSV" ) ;
1210+ roundtrip ( & ms_str ! ( "and_v(r:after(1024),1)" ) , "OP_PUSHBYTES_2 0004 OP_CLTV OP_DROP OP_PUSHNUM_1" ) ;
1211+ roundtrip ( & ms_str ! ( "and_v(r:older(1024),1)" ) , "OP_PUSHBYTES_2 0004 OP_CSV OP_DROP OP_PUSHNUM_1" ) ;
1212+ roundtrip ( & ms_str ! ( "and_v(r:1,1)" ) , "OP_PUSHNUM_1 OP_DROP OP_PUSHNUM_1" ) ;
12051213
12061214 roundtrip (
12071215 & ms_str ! ( "sha256({})" , sha256:: Hash :: hash( & [ ] ) ) ,
@@ -1461,6 +1469,41 @@ mod tests {
14611469 assert ! ( ms_str. is_err( ) ) ;
14621470 }
14631471
1472+ #[ test]
1473+ fn drop_wrapper ( ) {
1474+ type SwMs = Miniscript < String , Segwitv0 > ;
1475+ fn assert_error ( s : & str , expected_error : Option < & str > ) {
1476+ match SwMs :: from_str_insane ( & s) {
1477+ Ok ( _) => match expected_error {
1478+ Some ( e) => {
1479+ panic ! ( "Expected error: {}" , e) ;
1480+ }
1481+ None => {
1482+ // do nothing
1483+ }
1484+ } ,
1485+ Err ( e1) => match expected_error {
1486+ Some ( e2) => assert_eq ! ( e1. to_string( ) , e2. to_string( ) ) ,
1487+ None => { panic ! ( "Unexpected error: {}" , e1) ; }
1488+ } ,
1489+ }
1490+ }
1491+
1492+ {
1493+ assert_error ( "and_v(r:after(1024),1)" , None ) ;
1494+ }
1495+
1496+ {
1497+
1498+ fn assert_error_cannot_wrap ( s : & str , prefix : & str ) {
1499+ let err_cannot_wrap = format ! ( "typecheck: fragment «{}:after(1024)» cannot wrap a fragment of type V" , prefix) ;
1500+ assert_error ( s, Some ( & err_cannot_wrap) ) ;
1501+ }
1502+ assert_error_cannot_wrap ( "and_v(rr:after(1024),1)" , "rr" ) ;
1503+ assert_error_cannot_wrap ( "and_v(rv:after(1024),1)" , "rv" ) ;
1504+ }
1505+ }
1506+
14641507 #[ test]
14651508 fn translate_tests ( ) {
14661509 let ms = Miniscript :: < String , Segwitv0 > :: from_str ( "pk(A)" ) . unwrap ( ) ;
0 commit comments