/ src / token.rs
token.rs
 1  use ethers::core::types::Address;
 2  use rusqlite::{named_params, Connection};
 3  
 4  use crate::chain::Chain;
 5  use account_monitor::FullString;
 6  
 7  pub struct Token {
 8      pub symbol: String,
 9      pub decimals: u32, // ERC20 supports only u8, but format units expects u32
10  }
11  
12  pub trait FromChainAddress {
13      fn from_chain_address(chain: &Chain, address: Address) -> Token;
14  }
15  
16  impl FromChainAddress for Token {
17      fn from_chain_address(chain: &Chain, address: Address) -> Token {
18          let connection = Connection::open("rotki_db.db").unwrap();
19          let query = "SELECT
20                     decimals,
21                     symbol
22                  FROM evm_tokens
23                  JOIN common_asset_details ON evm_tokens.identifier = common_asset_details.identifier
24                  WHERE
25                    lower(address) = lower(:address) AND
26                    chain = :chain";
27          let mut statement = connection.prepare(query).unwrap();
28  
29          let res: Result<Token, rusqlite::Error> = statement.query_row(
30              named_params! {":address": address.full_string(),":chain": chain.id.unwrap().as_u64()},
31              |row| {
32                  Ok(Token {
33                      decimals: row.get(0).unwrap(),
34                      symbol: row.get(1).unwrap(),
35                  })
36              },
37          );
38  
39          match res {
40              Ok(res_token) => res_token,
41              Err(_) => Token {
42                  decimals: 18,
43                  symbol: "UNK".to_owned(),
44              },
45          }
46      }
47  }