zksync_utils 0.1.0

ZKsync utilities
Documentation
use zksync_basic_types::{web3::keccak256, H256, U256};

pub const fn ceil_div(a: u64, b: u64) -> u64 {
    if a == 0 {
        a
    } else {
        (a - 1) / b + 1
    }
}

pub fn ceil_div_u256(a: U256, b: U256) -> U256 {
    (a + b - U256::from(1)) / b
}

pub fn concat_and_hash(hash1: H256, hash2: H256) -> H256 {
    let mut bytes = [0_u8; 64];
    bytes[..32].copy_from_slice(&hash1.0);
    bytes[32..].copy_from_slice(&hash2.0);
    H256(keccak256(&bytes))
}

pub fn expand_memory_contents(packed: &[(usize, U256)], memory_size_bytes: usize) -> Vec<u8> {
    let mut result: Vec<u8> = vec![0; memory_size_bytes];

    for (offset, value) in packed {
        value.to_big_endian(&mut result[(offset * 32)..(offset + 1) * 32]);
    }

    result
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_ceil_div_u64_max() {
        assert_eq!(0, ceil_div(u64::MIN, u64::MAX));
        assert_eq!(1, ceil_div(u64::MAX, u64::MAX));
    }

    #[test]
    fn test_ceil_div_roundup_required() {
        assert_eq!(3, ceil_div(5, 2));
        assert_eq!(4, ceil_div(10, 3));
        assert_eq!(3, ceil_div(15, 7));
    }

    #[test]
    fn test_ceil_div_no_roundup_required() {
        assert_eq!(2, ceil_div(4, 2));
        assert_eq!(2, ceil_div(6, 3));
        assert_eq!(2, ceil_div(14, 7));
    }
}