token_id.rs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. use sha2::{Digest, Sha256};
  2. use super::types::DrkTokenId;
  3. use crate::{
  4. util::{
  5. serial::{deserialize, serialize},
  6. NetworkName,
  7. },
  8. Result,
  9. };
  10. /// Hash the external token ID and NetworkName param.
  11. /// If it fails, change the last 4 bytes and hash it again.
  12. /// Keep repeating until it works.
  13. pub fn generate_id(tkn_str: &str, network: &NetworkName) -> Result<DrkTokenId> {
  14. let mut id_string = network.to_string();
  15. id_string.push_str(tkn_str);
  16. let mut data: Vec<u8> = serialize(&id_string);
  17. let token_id = match deserialize::<DrkTokenId>(&data) {
  18. Ok(v) => v,
  19. Err(_) => {
  20. let mut counter = 0;
  21. loop {
  22. data.truncate(28);
  23. let serialized_counter = serialize(&counter);
  24. data.extend(serialized_counter.iter());
  25. let mut hasher = Sha256::new();
  26. hasher.update(&data);
  27. let hash = hasher.finalize();
  28. let token_id = deserialize::<DrkTokenId>(&hash);
  29. if token_id.is_err() {
  30. counter += 1;
  31. continue
  32. }
  33. return Ok(token_id.unwrap())
  34. }
  35. }
  36. };
  37. Ok(token_id)
  38. }
  39. /// YOLO
  40. pub fn generate_id2(tkn_str: &str, network: &NetworkName) -> Result<DrkTokenId> {
  41. let mut num = 0_u64;
  42. match network {
  43. NetworkName::Solana => {
  44. for i in ['s', 'o', 'l'] {
  45. num += i as u64;
  46. }
  47. }
  48. NetworkName::Bitcoin => {
  49. for i in ['b', 't', 'c'] {
  50. num += i as u64;
  51. }
  52. }
  53. NetworkName::Ethereum => {
  54. for i in ['e', 't', 'h'] {
  55. num += i as u64;
  56. }
  57. }
  58. NetworkName::Empty => unimplemented!(),
  59. }
  60. for i in tkn_str.chars() {
  61. num += i as u64;
  62. }
  63. Ok(DrkTokenId::from(num))
  64. }