parse.rs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. use crate::{
  2. serial::{deserialize, serialize},
  3. util::{NetworkName, TokenList},
  4. Error, Result,
  5. };
  6. use log::debug;
  7. use sha2::{Digest, Sha256};
  8. use std::str::FromStr;
  9. //1. deposit(network, asset)
  10. //
  11. //internal ID = hash(externalID, NetworkName)
  12. //deposit(internalID)
  13. //2. withdraw(network, asset, amount)
  14. //internal ID = hash(externalID, NetworkName)
  15. //amountu64 = amount.to_u64()
  16. //withdraw(internalID, amount)
  17. //3. transfer(asset, amount, address)
  18. //asset = { match [SOL, BTC, TOKEN]
  19. // return token-id from wallet.db }
  20. //amountu64 = amount.to_u64()
  21. //address = jubjub::SubgroupPoint
  22. //transfer(token_id, amountu64, address)
  23. //
  24. //
  25. //
  26. //
  27. //
  28. // extern_tokenID
  29. // tokenID
  30. //
  31. //pub fn create_id(extern_tokenID, NetworkName) -> Result<jubjub::Fr> {
  32. //}
  33. // DEPOSIT
  34. // parse_network
  35. // parse_id
  36. // generate_id
  37. //
  38. // WITHDRAW
  39. // parse_network
  40. // parse_id
  41. //
  42. // generate_id
  43. // amount.to_u64()
  44. //
  45. // TRANSFER
  46. // get_id
  47. // amount.to_u64()
  48. // here we hash the alphanumeric token ID. if it fails, we change the last 4 bytes and hash it
  49. // again, and keep repeating until it works.
  50. pub fn generate_id(tkn_str: &str, network: &NetworkName) -> Result<jubjub::Fr> {
  51. let mut id_string = network.to_string();
  52. id_string.push_str(tkn_str);
  53. if bs58::decode(id_string.clone()).into_vec().is_err() {
  54. // TODO: make this an error
  55. debug!(target: "PARSE ID", "COULD NOT DECODE STR");
  56. }
  57. let mut data = bs58::decode(id_string).into_vec().unwrap();
  58. let token_id = match deserialize::<jubjub::Fr>(&data) {
  59. Ok(v) => v,
  60. Err(_) => {
  61. let mut counter = 0;
  62. loop {
  63. data.truncate(28);
  64. let serialized_counter = serialize(&counter);
  65. data.extend(serialized_counter.iter());
  66. let mut hasher = Sha256::new();
  67. hasher.update(&data);
  68. let hash = hasher.finalize();
  69. let token_id = deserialize::<jubjub::Fr>(&hash);
  70. if token_id.is_err() {
  71. counter += 1;
  72. continue;
  73. }
  74. debug!(target: "CASHIER", "DESERIALIZATION SUCCESSFUL");
  75. return Ok(token_id.unwrap());
  76. }
  77. }
  78. };
  79. Ok(token_id)
  80. }
  81. //pub fn parse_wrapped_token(token: &str, tokenlist: TokenList) -> Result<jubjub::Fr> {
  82. // match token.to_lowercase().as_str() {
  83. // "sol" => {
  84. // let id = "So11111111111111111111111111111111111111112";
  85. // let token_id = generate_id(id)?;
  86. // Ok(token_id)
  87. // }
  88. // "btc" => Err(Error::TokenParseError),
  89. // tkn => {
  90. // // (== 44) can represent a Solana base58 token mint address
  91. // let id = if token.len() == 44 {
  92. // token.to_string()
  93. // } else {
  94. // symbol_to_id(tkn, tokenlist)?
  95. // };
  96. //
  97. // let token_id = generate_id(&id)?;
  98. // Ok(token_id)
  99. // }
  100. // }
  101. //}
  102. pub fn assign_id(network: &str, token: &str, tokenlist: TokenList) -> Result<String> {
  103. match NetworkName::from_str(network)? {
  104. NetworkName::Solana => match token.to_lowercase().as_str() {
  105. "solana" | "sol" => {
  106. let token_id = "So11111111111111111111111111111111111111112";
  107. Ok(token_id.to_string())
  108. }
  109. tkn => {
  110. // (== 44) can represent a Solana base58 token mint address
  111. let id = if token.len() == 44 {
  112. token.to_string()
  113. } else {
  114. symbol_to_id(tkn, tokenlist)?
  115. };
  116. Ok(id)
  117. }
  118. },
  119. NetworkName::Bitcoin => Err(Error::NetworkParseError),
  120. }
  121. }
  122. //pub fn parse_params(
  123. // network: &str,
  124. // token: &str,
  125. // amount: u64,
  126. // tokenlist: TokenList,
  127. //) -> Result<(String, u64)> {
  128. // match NetworkName::from_str(network)? {
  129. // NetworkName::Solana => match token {
  130. // "solana" | "sol" => {
  131. // let token_id = "So11111111111111111111111111111111111111112";
  132. // let decimals = 9;
  133. // let amount_in_apo = amount * u64::pow(10, decimals as u32);
  134. // Ok((token_id.to_string(), amount_in_apo))
  135. // }
  136. // tkn => {
  137. // let token_id = symbol_to_id(tkn, tokenlist.clone())?;
  138. // let decimals = tokenlist.search_decimal(tkn)?;
  139. // let amount_in_apo = amount * u64::pow(10, decimals as u32);
  140. // Ok((token_id, amount_in_apo))
  141. // }
  142. // },
  143. // NetworkName::Bitcoin => Err(Error::NetworkParseError),
  144. // }
  145. //}
  146. //
  147. pub fn decimals(network: &str, token: &str, tokenlist: TokenList) -> Result<u64> {
  148. match NetworkName::from_str(network)? {
  149. NetworkName::Solana => match token {
  150. "solana" | "sol" => {
  151. let decimals = 9;
  152. Ok(decimals)
  153. }
  154. tkn => {
  155. let decimals = tokenlist.search_decimal(tkn)?;
  156. Ok(decimals)
  157. }
  158. },
  159. NetworkName::Bitcoin => Err(Error::NetworkParseError),
  160. }
  161. }
  162. pub fn to_apo(amount: f64, decimals: u32) -> Result<u64> {
  163. let apo = amount as u64 * u64::pow(10, decimals as u32);
  164. Ok(apo)
  165. }
  166. pub fn symbol_to_id(token: &str, tokenlist: TokenList) -> Result<String> {
  167. let vec: Vec<char> = token.chars().collect();
  168. let mut counter = 0;
  169. for c in vec {
  170. if c.is_alphabetic() {
  171. counter += 1;
  172. }
  173. }
  174. if counter == token.len() {
  175. tokenlist.search_id(token)
  176. } else {
  177. Ok(token.to_string())
  178. }
  179. }