token_id.rs 979 B

12345678910111213141516171819202122
  1. use super::types::DrkTokenId;
  2. use crate::{util::NetworkName, Result};
  3. pub fn generate_id(network: &NetworkName, token_str: &str) -> Result<DrkTokenId> {
  4. let mut net_bytes: Vec<u8> = network.to_string().as_bytes().to_vec();
  5. // TODO: Check for fixed length token_str
  6. let mut token_bytes = match network {
  7. NetworkName::DarkFi => bs58::decode(token_str).into_vec()?,
  8. NetworkName::Bitcoin => bs58::decode(token_str).into_vec()?,
  9. NetworkName::Ethereum => hex::decode(token_str.strip_prefix("0x").unwrap())?,
  10. NetworkName::Solana => bs58::decode(token_str).into_vec()?,
  11. };
  12. net_bytes.append(&mut token_bytes);
  13. // Since our circuit is built to take a 2^64-1 range, we take the first 64
  14. // bits of the hash and make an unsigned integer from it, which we can then
  15. // cast into pallas::Base.
  16. let data: [u8; 8] = blake3::hash(&net_bytes).as_bytes()[0..8].try_into()?;
  17. Ok(DrkTokenId::from(u64::from_le_bytes(data)))
  18. }