use blvm_consensus::script::verify_script;
pub const MAX_REDEEM_SCRIPT_SIZE: usize = 520;
#[test]
fn test_redeem_script_size_limits() {
let redeem_script_max = vec![0x51; MAX_REDEEM_SCRIPT_SIZE];
let redeem_script_too_large = vec![0x51; MAX_REDEEM_SCRIPT_SIZE + 1];
let script_sig = vec![0x51]; let script_pubkey = vec![0xa9, 0x14];
let result_max = verify_script(&script_sig, &script_pubkey, Some(&redeem_script_max), 0x01); assert!(result_max.is_ok() || result_max.is_err());
let result_too_large = verify_script(
&script_sig,
&script_pubkey,
Some(&redeem_script_too_large),
0x01,
);
assert!(result_too_large.is_ok() || result_too_large.is_err());
}
#[test]
fn test_redeem_script_evaluation_order() {
let script_pubkey = vec![
0xa9, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x87, ];
let redeem_script = vec![0x51];
let script_sig = redeem_script.clone();
let flags = 0x01; let result = verify_script(&script_sig, &script_pubkey, Some(&redeem_script), flags);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_redeem_script_with_segwit() {
let script_pubkey = vec![
0xa9, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x87, ];
let redeem_script = vec![
0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
];
let script_sig = redeem_script.clone();
let flags = 0x01 | 0x800;
let result = verify_script(&script_sig, &script_pubkey, Some(&redeem_script), flags);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_redeem_script_disabled_opcodes() {
let disabled_opcodes = vec![0xba, 0xbb];
for opcode in disabled_opcodes {
let redeem_script = vec![opcode];
let script_sig = redeem_script.clone();
let script_pubkey = vec![
0xa9, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87,
];
let flags = 0x01; let result = verify_script(&script_sig, &script_pubkey, Some(&redeem_script), flags);
assert!(result.is_ok() || result.is_err());
}
}
#[test]
fn test_redeem_script_stack_size() {
use blvm_consensus::constants::MAX_STACK_SIZE;
let mut redeem_script = Vec::new();
for _ in 0..=MAX_STACK_SIZE {
redeem_script.push(0x51); }
let script_sig = vec![0x51];
let script_pubkey = vec![
0xa9, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87,
];
let flags = 0x01; let result = verify_script(&script_sig, &script_pubkey, Some(&redeem_script), flags);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_invalid_redeem_script_rejection() {
let script_pubkey = vec![
0xa9, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x87, ];
let wrong_redeem_script = vec![0x52];
let script_sig = wrong_redeem_script.clone();
let flags = 0x01;
let result = verify_script(
&script_sig,
&script_pubkey,
Some(&wrong_redeem_script),
flags,
);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_redeem_script_boundaries() {
let redeem_script_exact = vec![0x51; MAX_REDEEM_SCRIPT_SIZE];
let redeem_script_under = vec![0x51; MAX_REDEEM_SCRIPT_SIZE - 1];
let redeem_script_over = vec![0x51; MAX_REDEEM_SCRIPT_SIZE + 1];
let script_sig = vec![0x51];
let script_pubkey = vec![
0xa9, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87,
];
let flags = 0x01;
let result_exact = verify_script(
&script_sig,
&script_pubkey,
Some(&redeem_script_exact),
flags,
);
assert!(result_exact.is_ok() || result_exact.is_err());
let result_under = verify_script(
&script_sig,
&script_pubkey,
Some(&redeem_script_under),
flags,
);
assert!(result_under.is_ok() || result_under.is_err());
let result_over = verify_script(
&script_sig,
&script_pubkey,
Some(&redeem_script_over),
flags,
);
assert!(result_over.is_ok() || result_over.is_err());
}