use crate::utils::Address;
pub const ALIAS_OFFSET: Address = match Address::parse_const("0x1111000000000000000000000000000000001111") {
Some(address) => address,
None => Address::ZERO,
};
#[must_use]
pub fn apply_alias(l1: Address) -> Address {
add(l1.bytes(), ALIAS_OFFSET.bytes(), false)
}
#[must_use]
pub fn undo_alias(l2: Address) -> Address {
add(l2.bytes(), ALIAS_OFFSET.bytes(), true)
}
fn add(a: &[u8; 20], b: &[u8; 20], subtract: bool) -> Address {
let mut out = [0u8; 20];
let mut carry = 0i16;
for at in (0..20).rev() {
let step = match subtract {
true => i16::from(a[at]) - i16::from(b[at]) + carry,
false => i16::from(a[at]) + i16::from(b[at]) + carry,
};
out[at] = step.rem_euclid(256) as u8;
carry = step.div_euclid(256);
}
Address::from_bytes(out)
}
#[cfg(test)]
#[path = "tests/alias.rs"]
mod tests;