Просмотр исходного кода

crypto/token_id: Add helper function to parse base58 into a token ID.

TODO: Maybe generalise it a bit more.
parazyd 4 лет назад
Родитель
Сommit
8aa1ba063d
1 измененных файлов с 18 добавлено и 1 удалено
  1. 18 1
      src/crypto/token_id.rs

+ 18 - 1
src/crypto/token_id.rs

@@ -1,5 +1,7 @@
+use group::ff::PrimeField;
+
 use super::types::DrkTokenId;
-use crate::{util::NetworkName, Result};
+use crate::{util::NetworkName, Error, Result};
 
 pub fn generate_id(network: &NetworkName, token_str: &str) -> Result<DrkTokenId> {
     let mut net_bytes: Vec<u8> = network.to_string().as_bytes().to_vec();
@@ -20,3 +22,18 @@ pub fn generate_id(network: &NetworkName, token_str: &str) -> Result<DrkTokenId>
 
     Ok(DrkTokenId::from(u64::from_le_bytes(data)))
 }
+
+/// Parse a `DrkTokenId` from a base58-encoded string
+pub fn parse_b58(s: &str) -> Result<DrkTokenId> {
+    let bytes = bs58::decode(s).into_vec()?;
+    if bytes.len() != 32 {
+        return Err(Error::ParseFailed("Failed parsing DrkTokenId from base58 string"))
+    }
+
+    let ret = DrkTokenId::from_repr(bytes.try_into().unwrap());
+    if ret.is_some().unwrap_u8() == 1 {
+        return Ok(ret.unwrap())
+    }
+
+    Err(Error::ParseFailed("Failed parsing DrkTokenId from base58 string"))
+}