1234567891011121314151617use up_data_structs::{CollectionId, TokenId};18use sp_core::H160;19202122const ETH_ACCOUNT_PREFIX: [u8; 16] = [23 0x17, 0xc4, 0xe6, 0x45, 0x3c, 0xc4, 0x9a, 0xaa, 0xae, 0xac, 0xa8, 0x94, 0xe6, 0xd9, 0x68, 0x3e,24];25262728const ETH_ACCOUNT_TOKEN_PREFIX: [u8; 12] = [29 0xf8, 0x23, 0x8c, 0xcf, 0xff, 0x8e, 0xd8, 0x87, 0x46, 0x3f, 0xd5, 0xe0,30];3132pub fn map_eth_to_id(eth: &H160) -> Option<CollectionId> {33 if eth[0..16] != ETH_ACCOUNT_PREFIX {34 return None;35 }36 let mut id_bytes = [0; 4];37 id_bytes.copy_from_slice(ð[16..20]);38 Some(CollectionId(u32::from_be_bytes(id_bytes)))39}40pub fn collection_id_to_address(id: CollectionId) -> H160 {41 let mut out = [0; 20];42 out[0..16].copy_from_slice(Ð_ACCOUNT_PREFIX);43 out[16..20].copy_from_slice(&u32::to_be_bytes(id.0));44 H160(out)45}4647pub fn map_eth_to_token_id(eth: &H160) -> Option<(CollectionId, TokenId)> {48 if eth[0..12] != ETH_ACCOUNT_TOKEN_PREFIX {49 return None;50 }51 let mut id_bytes = [0; 4];52 let mut token_id_bytes = [0; 4];53 id_bytes.copy_from_slice(ð[12..16]);54 token_id_bytes.copy_from_slice(ð[16..20]);55 Some((56 CollectionId(u32::from_be_bytes(id_bytes)),57 TokenId(u32::from_be_bytes(token_id_bytes)),58 ))59}60pub fn collection_token_id_to_address(id: CollectionId, token: TokenId) -> H160 {61 let mut out = [0; 20];62 out[0..12].copy_from_slice(Ð_ACCOUNT_TOKEN_PREFIX);63 out[12..16].copy_from_slice(&u32::to_be_bytes(id.0));64 out[16..20].copy_from_slice(&u32::to_be_bytes(token.0));65 H160(out)66}