2026-05-21 17:40:00 +08:00
|
|
|
#![cfg_attr(feature = "fuzzer-libfuzzer", no_main)]
|
2026-04-13 16:03:20 +08:00
|
|
|
|
|
|
|
|
use common::{
|
|
|
|
|
block::{Block, HashableBlockData},
|
|
|
|
|
transaction::NSSATransaction,
|
|
|
|
|
};
|
|
|
|
|
|
2026-05-21 17:40:00 +08:00
|
|
|
fuzz_props::fuzz_entry!(|data: &[u8]| {
|
2026-04-13 16:03:20 +08:00
|
|
|
// Attempt 1: decode as NSSATransaction and verify roundtrip
|
|
|
|
|
if let Ok(tx) = borsh::from_slice::<NSSATransaction>(data) {
|
|
|
|
|
let re_encoded = borsh::to_vec(&tx).expect("re-encode of valid tx must succeed");
|
|
|
|
|
let tx2 = borsh::from_slice::<NSSATransaction>(&re_encoded)
|
|
|
|
|
.expect("second decode of re-encoded tx must succeed");
|
|
|
|
|
assert_eq!(
|
2026-04-24 12:04:20 +08:00
|
|
|
re_encoded,
|
2026-04-13 16:03:20 +08:00
|
|
|
borsh::to_vec(&tx2).unwrap(),
|
|
|
|
|
"NSSATransaction roundtrip encoding divergence"
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Attempt 2: decode as Block — must never panic
|
|
|
|
|
let _ = borsh::from_slice::<Block>(data);
|
|
|
|
|
|
|
|
|
|
// Attempt 3: decode as HashableBlockData — must never panic
|
|
|
|
|
let _ = borsh::from_slice::<HashableBlockData>(data);
|
|
|
|
|
});
|