1use alloy::{
4 hex::FromHex,
5 primitives::{Address, U256},
6};
7use std::str::FromStr;
8
9pub 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
15pub 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}