@@ -129,7 +129,8 @@ fn check_multi_sig(bytes_pkhs: Vec<MyValue>, bytes_keyed_signatures: Vec<MyValue
129
129
}
130
130
_ => {
131
131
// TODO change panic by error
132
- unreachable ! ( "check_multi_sig should pick only bytes" ) ;
132
+ //unreachable!("check_multi_sig should pick only bytes");
133
+ return false ;
133
134
}
134
135
}
135
136
}
@@ -990,4 +991,143 @@ mod tests {
990
991
] ;
991
992
assert ! ( !execute_script( s, & ScriptContext { block_timestamp: 0 } ) ) ;
992
993
}
994
+
995
+ #[ test]
996
+ fn test_execute_script_atomic_swap_2 ( ) {
997
+ let secret = vec ! [ 1 , 2 , 3 , 4 ] ;
998
+ let hash_secret = calculate_sha256 ( & secret) ;
999
+ let pk_1 = PublicKey :: from_bytes ( [ 1 ; 33 ] ) ;
1000
+ let pk_2 = PublicKey :: from_bytes ( [ 2 ; 33 ] ) ;
1001
+
1002
+ let ks_1 = ks_from_pk ( pk_1. clone ( ) ) ;
1003
+ let ks_2 = ks_from_pk ( pk_2. clone ( ) ) ;
1004
+
1005
+ // 1 can spend after timelock
1006
+ let s = vec ! [
1007
+ // Witness script
1008
+ Item :: Value ( MyValue :: Signature ( ks_1. to_pb_bytes( ) . unwrap( ) ) ) ,
1009
+ // Redeem script
1010
+ Item :: Value ( MyValue :: Integer ( 10_000 ) ) ,
1011
+ Item :: Operator ( MyOperator :: CheckTimeLock ) ,
1012
+ Item :: Operator ( MyOperator :: If ) ,
1013
+ Item :: Value ( MyValue :: Bytes ( pk_1. pkh( ) . bytes( ) . to_vec( ) ) ) ,
1014
+ Item :: Operator ( MyOperator :: CheckSig ) ,
1015
+ Item :: Operator ( MyOperator :: Verify ) ,
1016
+ Item :: Operator ( MyOperator :: Else ) ,
1017
+ Item :: Operator ( MyOperator :: Sha256 ) ,
1018
+ Item :: Value ( MyValue :: Bytes ( hash_secret. as_ref( ) . to_vec( ) ) ) ,
1019
+ Item :: Operator ( MyOperator :: Equal ) ,
1020
+ Item :: Operator ( MyOperator :: Verify ) ,
1021
+ Item :: Value ( MyValue :: Bytes ( pk_2. pkh( ) . bytes( ) . to_vec( ) ) ) ,
1022
+ Item :: Operator ( MyOperator :: CheckSig ) ,
1023
+ Item :: Operator ( MyOperator :: Verify ) ,
1024
+ Item :: Operator ( MyOperator :: EndIf ) ,
1025
+ ] ;
1026
+ assert ! ( execute_script(
1027
+ s,
1028
+ & ScriptContext {
1029
+ block_timestamp: 20_000
1030
+ }
1031
+ ) ) ;
1032
+
1033
+ // 1 cannot spend before timelock
1034
+ let s = vec ! [
1035
+ // Witness script
1036
+ Item :: Value ( MyValue :: Signature ( ks_1. to_pb_bytes( ) . unwrap( ) ) ) ,
1037
+ // Redeem script
1038
+ Item :: Value ( MyValue :: Integer ( 10_000 ) ) ,
1039
+ Item :: Operator ( MyOperator :: CheckTimeLock ) ,
1040
+ Item :: Operator ( MyOperator :: If ) ,
1041
+ Item :: Value ( MyValue :: Bytes ( pk_1. pkh( ) . bytes( ) . to_vec( ) ) ) ,
1042
+ Item :: Operator ( MyOperator :: CheckSig ) ,
1043
+ Item :: Operator ( MyOperator :: Verify ) ,
1044
+ Item :: Operator ( MyOperator :: Else ) ,
1045
+ Item :: Operator ( MyOperator :: Sha256 ) ,
1046
+ Item :: Value ( MyValue :: Bytes ( hash_secret. as_ref( ) . to_vec( ) ) ) ,
1047
+ Item :: Operator ( MyOperator :: Equal ) ,
1048
+ Item :: Operator ( MyOperator :: Verify ) ,
1049
+ Item :: Value ( MyValue :: Bytes ( pk_2. pkh( ) . bytes( ) . to_vec( ) ) ) ,
1050
+ Item :: Operator ( MyOperator :: CheckSig ) ,
1051
+ Item :: Operator ( MyOperator :: Verify ) ,
1052
+ Item :: Operator ( MyOperator :: EndIf ) ,
1053
+ ] ;
1054
+ assert ! ( !execute_script( s, & ScriptContext { block_timestamp: 0 } ) ) ;
1055
+
1056
+ // 2 can spend with secret
1057
+ let s = vec ! [
1058
+ // Witness script
1059
+ Item :: Value ( MyValue :: Signature ( ks_2. to_pb_bytes( ) . unwrap( ) ) ) ,
1060
+ Item :: Value ( MyValue :: Bytes ( secret. clone( ) ) ) ,
1061
+ // Redeem script
1062
+ Item :: Value ( MyValue :: Integer ( 10_000 ) ) ,
1063
+ Item :: Operator ( MyOperator :: CheckTimeLock ) ,
1064
+ Item :: Operator ( MyOperator :: If ) ,
1065
+ Item :: Value ( MyValue :: Bytes ( pk_1. pkh( ) . bytes( ) . to_vec( ) ) ) ,
1066
+ Item :: Operator ( MyOperator :: CheckSig ) ,
1067
+ Item :: Operator ( MyOperator :: Verify ) ,
1068
+ Item :: Operator ( MyOperator :: Else ) ,
1069
+ Item :: Operator ( MyOperator :: Sha256 ) ,
1070
+ Item :: Value ( MyValue :: Bytes ( hash_secret. as_ref( ) . to_vec( ) ) ) ,
1071
+ Item :: Operator ( MyOperator :: Equal ) ,
1072
+ Item :: Operator ( MyOperator :: Verify ) ,
1073
+ Item :: Value ( MyValue :: Bytes ( pk_2. pkh( ) . bytes( ) . to_vec( ) ) ) ,
1074
+ Item :: Operator ( MyOperator :: CheckSig ) ,
1075
+ Item :: Operator ( MyOperator :: Verify ) ,
1076
+ Item :: Operator ( MyOperator :: EndIf ) ,
1077
+ ] ;
1078
+ assert ! ( execute_script( s, & ScriptContext { block_timestamp: 0 } ) ) ;
1079
+
1080
+ // 2 cannot spend with a wrong secret
1081
+ let s = vec ! [
1082
+ // Witness script
1083
+ Item :: Value ( MyValue :: Signature ( ks_2. to_pb_bytes( ) . unwrap( ) ) ) ,
1084
+ Item :: Value ( MyValue :: Bytes ( vec![ 0 , 0 , 0 , 0 ] ) ) ,
1085
+ // Redeem script
1086
+ Item :: Value ( MyValue :: Integer ( 10_000 ) ) ,
1087
+ Item :: Operator ( MyOperator :: CheckTimeLock ) ,
1088
+ Item :: Operator ( MyOperator :: If ) ,
1089
+ Item :: Value ( MyValue :: Bytes ( pk_1. pkh( ) . bytes( ) . to_vec( ) ) ) ,
1090
+ Item :: Operator ( MyOperator :: CheckSig ) ,
1091
+ Item :: Operator ( MyOperator :: Verify ) ,
1092
+ Item :: Operator ( MyOperator :: Else ) ,
1093
+ Item :: Operator ( MyOperator :: Sha256 ) ,
1094
+ Item :: Value ( MyValue :: Bytes ( hash_secret. as_ref( ) . to_vec( ) ) ) ,
1095
+ Item :: Operator ( MyOperator :: Equal ) ,
1096
+ Item :: Operator ( MyOperator :: Verify ) ,
1097
+ Item :: Value ( MyValue :: Bytes ( pk_2. pkh( ) . bytes( ) . to_vec( ) ) ) ,
1098
+ Item :: Operator ( MyOperator :: CheckSig ) ,
1099
+ Item :: Operator ( MyOperator :: Verify ) ,
1100
+ Item :: Operator ( MyOperator :: EndIf ) ,
1101
+ ] ;
1102
+ assert ! ( !execute_script( s, & ScriptContext { block_timestamp: 0 } ) ) ;
1103
+
1104
+ // 2 cannot spend after timelock
1105
+ let s = vec ! [
1106
+ // Witness script
1107
+ Item :: Value ( MyValue :: Signature ( ks_2. to_pb_bytes( ) . unwrap( ) ) ) ,
1108
+ Item :: Value ( MyValue :: Bytes ( secret) ) ,
1109
+ // Redeem script
1110
+ Item :: Value ( MyValue :: Integer ( 10_000 ) ) ,
1111
+ Item :: Operator ( MyOperator :: CheckTimeLock ) ,
1112
+ Item :: Operator ( MyOperator :: If ) ,
1113
+ Item :: Value ( MyValue :: Bytes ( pk_1. pkh( ) . bytes( ) . to_vec( ) ) ) ,
1114
+ Item :: Operator ( MyOperator :: CheckSig ) ,
1115
+ Item :: Operator ( MyOperator :: Verify ) ,
1116
+ Item :: Operator ( MyOperator :: Else ) ,
1117
+ Item :: Operator ( MyOperator :: Sha256 ) ,
1118
+ Item :: Value ( MyValue :: Bytes ( hash_secret. as_ref( ) . to_vec( ) ) ) ,
1119
+ Item :: Operator ( MyOperator :: Equal ) ,
1120
+ Item :: Operator ( MyOperator :: Verify ) ,
1121
+ Item :: Value ( MyValue :: Bytes ( pk_2. pkh( ) . bytes( ) . to_vec( ) ) ) ,
1122
+ Item :: Operator ( MyOperator :: CheckSig ) ,
1123
+ Item :: Operator ( MyOperator :: Verify ) ,
1124
+ Item :: Operator ( MyOperator :: EndIf ) ,
1125
+ ] ;
1126
+ assert ! ( !execute_script(
1127
+ s,
1128
+ & ScriptContext {
1129
+ block_timestamp: 20_000
1130
+ }
1131
+ ) ) ;
1132
+ }
993
1133
}
0 commit comments