use crate::util;
use super::encoding::{encoded_method_tokens_size, varint_encoded_len};
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct NefHeader {
pub magic: [u8; 4],
pub compiler: String,
pub source: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct MethodToken {
pub hash: [u8; 20],
pub method: String,
pub parameters_count: u16,
pub has_return_value: bool,
pub call_flags: u8,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct NefFile {
pub header: NefHeader,
pub method_tokens: Vec<MethodToken>,
pub script: Vec<u8>,
pub checksum: u32,
}
impl NefFile {
#[must_use]
pub fn payload_len(&self) -> usize {
let fixed_header_len = super::FIXED_HEADER_SIZE; let source_bytes = self.header.source.as_bytes();
let source_len = varint_encoded_len(source_bytes.len() as u32) + source_bytes.len();
let tokens_len = encoded_method_tokens_size(&self.method_tokens);
let script_len = varint_encoded_len(self.script.len() as u32) + self.script.len();
fixed_header_len + source_len + 1 + tokens_len + 2 + script_len
}
#[must_use]
pub fn script_hash(&self) -> [u8; 20] {
util::hash160(&self.script)
}
#[must_use]
#[deprecated(
since = "0.5.1",
note = "use `script_hash()` instead, which is identical"
)]
pub fn script_hash_le(&self) -> [u8; 20] {
self.script_hash()
}
#[must_use]
pub fn script_hash_be(&self) -> [u8; 20] {
let mut hash = self.script_hash();
hash.reverse();
hash
}
}