12345678910111213141516171819use evm_coder::types::{uint256, address};20pub use pallet_evm::account::{Config, CrossAccountId};21use sp_core::H160;22use up_data_structs::CollectionId;23242526const ETH_COLLECTION_PREFIX: [u8; 16] = [27 0x17, 0xc4, 0xe6, 0x45, 0x3c, 0xc4, 0x9a, 0xaa, 0xae, 0xac, 0xa8, 0x94, 0xe6, 0xd9, 0x68, 0x3e,28];293031pub fn map_eth_to_id(eth: &H160) -> Option<CollectionId> {32 if eth[0..16] != ETH_COLLECTION_PREFIX {33 return None;34 }35 let mut id_bytes = [0; 4];36 id_bytes.copy_from_slice(ð[16..20]);37 Some(CollectionId(u32::from_be_bytes(id_bytes)))38}394041pub fn collection_id_to_address(id: CollectionId) -> H160 {42 let mut out = [0; 20];43 out[0..16].copy_from_slice(Ð_COLLECTION_PREFIX);44 out[16..20].copy_from_slice(&u32::to_be_bytes(id.0));45 H160(out)46}474849pub fn is_collection(address: &H160) -> bool {50 address[0..16] == ETH_COLLECTION_PREFIX51}525354pub fn convert_cross_account_to_uint256<T: Config>(from: &T::CrossAccountId) -> uint25655where56 T::AccountId: AsRef<[u8; 32]>,57{58 let slice = from.as_sub().as_ref();59 uint256::from_big_endian(slice)60}616263pub fn convert_uint256_to_cross_account<T: Config>(from: uint256) -> T::CrossAccountId64where65 T::AccountId: From<[u8; 32]>,66{67 let mut new_admin_arr = [0_u8; 32];68 from.to_big_endian(&mut new_admin_arr);69 let account_id = T::AccountId::from(new_admin_arr);70 T::CrossAccountId::from_sub(account_id)71}727374pub fn convert_cross_account_to_tuple<T: Config>(75 cross_account_id: &T::CrossAccountId,76) -> (address, uint256)77where78 T::AccountId: AsRef<[u8; 32]>,79{80 if cross_account_id.is_canonical_substrate() {81 let sub = convert_cross_account_to_uint256::<T>(cross_account_id);82 (Default::default(), sub)83 } else {84 let eth = *cross_account_id.as_eth();85 (eth, Default::default())86 }87}88899091929394pub fn convert_tuple_to_cross_account<T: Config>(95 eth_cross_account_id: (address, uint256),96) -> evm_coder::execution::Result<T::CrossAccountId>97where98 T::AccountId: From<[u8; 32]>,99{100 if eth_cross_account_id == Default::default() {101 Err("All fields of cross account is zeroed".into())102 } else if eth_cross_account_id.0 == Default::default() {103 Ok(convert_uint256_to_cross_account::<T>(104 eth_cross_account_id.1,105 ))106 } else if eth_cross_account_id.1 == Default::default() {107 Ok(T::CrossAccountId::from_eth(eth_cross_account_id.0))108 } else {109 Err("All fields of cross account is non zeroed".into())110 }111}