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 }