token_list.rs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. use serde_json::Value;
  2. use std::collections::HashMap;
  3. use crate::{
  4. util::{generate_id, NetworkName},
  5. Error, Result,
  6. };
  7. #[derive(Debug, Clone)]
  8. pub struct SolTokenList {
  9. sol_tokenlist: Value,
  10. }
  11. impl SolTokenList {
  12. pub fn new() -> Result<Self> {
  13. let file_contents = include_bytes!("../../token/solanatokenlist.json");
  14. let sol_tokenlist: Value = serde_json::from_slice(file_contents)?;
  15. let tokens = sol_tokenlist["tokens"]
  16. .as_array()
  17. .ok_or(Error::TokenParseError)?;
  18. let mut symbols = Vec::new();
  19. for item in tokens {
  20. let symbol = item["symbol"].as_str().unwrap();
  21. symbols.push(symbol.to_string());
  22. }
  23. Ok(Self { sol_tokenlist })
  24. }
  25. pub fn get_symbols(self) -> Result<Vec<String>> {
  26. let tokens = self.sol_tokenlist["tokens"]
  27. .as_array()
  28. .ok_or(Error::TokenParseError)?;
  29. let mut symbols = Vec::new();
  30. for item in tokens {
  31. let symbol = item["symbol"].as_str().unwrap();
  32. symbols.push(symbol.to_string());
  33. }
  34. return Ok(symbols);
  35. }
  36. pub fn search_id(&self, symbol: &str) -> Result<String> {
  37. let tokens = self.sol_tokenlist["tokens"]
  38. .as_array()
  39. .ok_or(Error::TokenParseError)?;
  40. for item in tokens {
  41. if item["symbol"] == symbol.to_uppercase() {
  42. let address = item["address"].clone();
  43. let address = address.as_str().ok_or(Error::TokenParseError)?;
  44. return Ok(address.to_string());
  45. }
  46. }
  47. unreachable!();
  48. }
  49. pub fn search_all_id(&self, symbol: &str) -> Result<Vec<String>> {
  50. let tokens = self.sol_tokenlist["tokens"]
  51. .as_array()
  52. .ok_or(Error::TokenParseError)?;
  53. let mut ids = Vec::new();
  54. for item in tokens {
  55. if item["symbol"] == symbol.to_uppercase() {
  56. let address = item["address"].clone();
  57. let address = address.as_str().ok_or(Error::TokenParseError)?;
  58. ids.push(address.to_string());
  59. }
  60. }
  61. return Ok(ids);
  62. }
  63. pub fn search_decimal(self, symbol: &str) -> Result<usize> {
  64. let tokens = self.sol_tokenlist["tokens"]
  65. .as_array()
  66. .ok_or(Error::TokenParseError)?;
  67. for item in tokens {
  68. if item["symbol"] == symbol.to_uppercase() {
  69. let decimals = item["decimals"].clone();
  70. let decimals = decimals.as_u64().ok_or(Error::TokenParseError)?;
  71. let decimals = decimals as usize;
  72. return Ok(decimals);
  73. }
  74. }
  75. unreachable!();
  76. }
  77. }
  78. pub struct DrkTokenList {
  79. pub drk_tokenlist: HashMap<String, jubjub::Fr>,
  80. }
  81. impl DrkTokenList {
  82. pub fn new(list: SolTokenList) -> Result<Self> {
  83. // get symbols
  84. let symbols = list.clone().get_symbols()?;
  85. // get ids
  86. let ids: Vec<jubjub::Fr> = symbols
  87. .iter()
  88. .map(|sym| generate_id(sym, &NetworkName::Solana).unwrap())
  89. .collect();
  90. // create the hashmap
  91. let drk_tokenlist: HashMap<String, jubjub::Fr> = symbols
  92. .iter()
  93. .zip(ids.iter())
  94. .map(|(key, value)| return (key.clone(), value.clone()))
  95. .collect();
  96. Ok(Self { drk_tokenlist })
  97. }
  98. }
  99. #[allow(unused_imports)]
  100. mod tests {
  101. use super::*;
  102. use crate::util::{DrkTokenList, SolTokenList};
  103. use crate::Result;
  104. #[test]
  105. pub fn test_get_symbols() -> Result<()> {
  106. let token = SolTokenList::new()?;
  107. let symbols = token.get_symbols()?;
  108. for symbol in symbols {
  109. println!("{}", symbol)
  110. }
  111. Ok(())
  112. }
  113. #[test]
  114. pub fn test_get_id_from_symbols() -> Result<()> {
  115. let token = SolTokenList::new()?;
  116. let symbols = token.clone().get_symbols()?;
  117. for symbol in symbols {
  118. token.clone().search_all_id(&symbol)?;
  119. }
  120. Ok(())
  121. }
  122. #[test]
  123. pub fn test_hashmap() -> Result<()> {
  124. let token = SolTokenList::new()?;
  125. let drk_token = DrkTokenList::new(token)?;
  126. println!("{:?}", drk_token.drk_tokenlist);
  127. Ok(())
  128. }
  129. }