alloy_zksync/
utils.rs

1//! Helper utilities.
2
3use alloy::{
4    hex::FromHex,
5    primitives::{Address, U256},
6};
7use std::str::FromStr;
8
9/// ETH address on L1.
10pub const ETHER_L1_ADDRESS: Address = Address::new([
11    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12    0x00, 0x00, 0x00, 0x00,
13]);
14
15///  Utility function that converts an L1 address to the L2 address.
16pub fn apply_l1_to_l2_alias(l1_address: Address) -> Address {
17    let address_modulo: U256 = U256::from(2).pow(U256::from(160));
18    let contract_address = U256::from_str(&l1_address.to_string()).unwrap();
19    let l1_to_l2_alias_offset =
20        U256::from_str("0x1111000000000000000000000000000000001111").unwrap();
21
22    let l2_address = (contract_address + l1_to_l2_alias_offset) % address_modulo;
23    Address::from_hex(format!("{l2_address:x}")).unwrap()
24}
25
26#[cfg(test)]
27mod tests {
28    use super::apply_l1_to_l2_alias;
29    use alloy::primitives::address;
30
31    #[tokio::test(flavor = "multi_thread")]
32    async fn get_main_contract_test() {
33        let l2_alias = apply_l1_to_l2_alias(address!("702942B8205E5dEdCD3374E5f4419843adA76Eeb"));
34        assert_eq!(
35            l2_alias,
36            address!("813A42B8205E5DedCd3374e5f4419843ADa77FFC")
37        );
38    }
39}