token_list.rs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. use std::str::FromStr;
  2. use fxhash::FxHashMap;
  3. use pasta_curves::group::ff::PrimeField;
  4. use serde_json::Value;
  5. use super::{token_id::generate_id, types::DrkTokenId};
  6. use crate::{util::net_name::NetworkName, Result};
  7. #[derive(Clone, Debug)]
  8. pub struct TokenInfo {
  9. pub net_address: String,
  10. pub drk_address: DrkTokenId,
  11. pub name: String,
  12. pub decimals: u64,
  13. }
  14. #[derive(Clone)]
  15. pub struct TokenList(pub FxHashMap<String, TokenInfo>);
  16. impl TokenList {
  17. /// Create a new `TokenList` given a standard JSON object (as bytes)
  18. pub fn new(network_name: &str, data: &[u8]) -> Result<Self> {
  19. let tokenlist: Value = serde_json::from_slice(data)?;
  20. let mut map = FxHashMap::default();
  21. for i in tokenlist["tokens"].as_array().unwrap() {
  22. let net_address = i["address"].as_str().unwrap().to_string();
  23. let decimals = i["decimals"].as_u64().unwrap();
  24. let name = i["name"].as_str().unwrap().to_string();
  25. let drk_address = generate_id(&NetworkName::from_str(network_name)?, &net_address)?;
  26. let info = TokenInfo { net_address, drk_address, decimals, name };
  27. let ticker = i["symbol"].as_str().unwrap().to_uppercase().to_string();
  28. map.insert(ticker, info);
  29. }
  30. Ok(Self(map))
  31. }
  32. /// Tries to find the address and name of a given ticker in
  33. /// the hashmap.
  34. pub fn get(&self, ticker: String) -> Option<TokenInfo> {
  35. if let Some(info) = self.0.get(&ticker) {
  36. return Some(info.clone())
  37. }
  38. None
  39. }
  40. }
  41. #[derive(Clone)]
  42. pub struct DrkTokenList {
  43. pub by_net: FxHashMap<NetworkName, TokenList>,
  44. pub by_addr: FxHashMap<String, (NetworkName, TokenInfo)>,
  45. }
  46. impl DrkTokenList {
  47. pub fn new(data: &[(&str, &[u8])]) -> Result<Self> {
  48. let mut by_net = FxHashMap::default();
  49. let mut by_addr = FxHashMap::default();
  50. for (name, json) in data {
  51. let net_name = NetworkName::from_str(name)?;
  52. let tokenlist = TokenList::new(name, json)?;
  53. for (_, token) in tokenlist.0.iter() {
  54. by_addr.insert(
  55. bs58::encode(token.drk_address.to_repr()).into_string(),
  56. (net_name.clone(), token.clone()),
  57. );
  58. }
  59. by_net.insert(net_name, tokenlist);
  60. }
  61. Ok(Self { by_net, by_addr })
  62. }
  63. }