use crate::errors::FirewallError;
use crate::types::{
DepType, FirewallLockConfig, FirewallSpendDepsConfig, ScriptLike, TransactionCellDep,
};
pub fn build_firewall_lock_args(config: &FirewallLockConfig) -> Result<Vec<u8>, FirewallError> {
if (config.flags & 0x03) == 0 {
return Err(FirewallError::InvalidRegistryData);
}
if config.flags & 0xfc != 0 {
return Err(FirewallError::InvalidRegistryData);
}
if config.registries.len() > 255 {
return Err(FirewallError::InvalidRegistryData);
}
if config.inner_args.len() > 0xffff {
return Err(FirewallError::InvalidRegistryData);
}
let n = config.registries.len();
let mut out = Vec::with_capacity(3 + n * 66 + 32 + 1 + 2 + config.inner_args.len());
out.push(0x02);
out.push(config.flags);
out.push(n as u8);
for reg in &config.registries {
out.extend_from_slice(®.code_hash);
out.push(reg.hash_type.to_byte());
out.extend_from_slice(®.type_id_value);
out.push(if reg.required { 1 } else { 0 });
}
out.extend_from_slice(&config.inner_code_hash);
out.push(config.inner_hash_type.to_byte());
let inner_len = config.inner_args.len() as u16;
out.extend_from_slice(&inner_len.to_le_bytes());
out.extend_from_slice(&config.inner_args);
Ok(out)
}
pub fn build_firewall_lock_script(
config: &FirewallLockConfig,
) -> Result<ScriptLike, FirewallError> {
Ok(ScriptLike {
code_hash: config.firewall_code_hash,
hash_type: config.firewall_hash_type.clone(),
args: build_firewall_lock_args(config)?,
})
}
pub fn build_firewall_spend_cell_deps(config: &FirewallSpendDepsConfig) -> Vec<TransactionCellDep> {
let mut deps = Vec::with_capacity(2 + config.registry_out_points.len());
deps.push(TransactionCellDep {
out_point: config.firewall_lock_out_point.clone(),
dep_type: DepType::Code,
});
deps.push(TransactionCellDep {
out_point: config.inner_lock_out_point.clone(),
dep_type: DepType::Code,
});
for op in &config.registry_out_points {
deps.push(TransactionCellDep {
out_point: op.clone(),
dep_type: DepType::Code,
});
}
deps
}