diff --git a/Cargo.lock b/Cargo.lock index 698a822d9..1c9b11df4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2267,7 +2267,7 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "safe-client-gateway" -version = "1.11.1" +version = "1.11.2" dependencies = [ "cargo-watch", "chrono", diff --git a/Cargo.toml b/Cargo.toml index edc3c7d93..d58b12f77 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "safe-client-gateway" -version = "1.11.1" +version = "1.11.2" authors = ["jpalvarezl ", "rmeissner "] edition = "2018" diff --git a/src/config/mod.rs b/src/config/mod.rs index 85aa4a9fc..a08b1fc40 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -4,6 +4,14 @@ pub fn base_transaction_service_url() -> String { format!("{}{}", env::var("TRANSACTION_SERVICE_URL").unwrap(), "/api") } +pub fn base_exchange_api_url() -> String { + format!( + "{}?access_key={}", + env::var("EXCHANGE_API_BASE_URL").unwrap(), + env::var("EXCHANGE_API_KEY").unwrap() + ) +} + pub fn webhook_token() -> String { env::var("WEBHOOK_TOKEN").unwrap() } diff --git a/src/providers/info.rs b/src/providers/info.rs index f602b50b4..1cf1fc610 100644 --- a/src/providers/info.rs +++ b/src/providers/info.rs @@ -1,7 +1,8 @@ use crate::config::{ - address_info_cache_duration, base_transaction_service_url, exchange_api_cache_duration, - long_error_duration, safe_app_info_request_timeout, safe_app_manifest_cache_duration, - safe_info_cache_duration, short_error_duration, token_info_cache_duration, + address_info_cache_duration, base_exchange_api_url, base_transaction_service_url, + exchange_api_cache_duration, long_error_duration, safe_app_info_request_timeout, + safe_app_manifest_cache_duration, safe_info_cache_duration, short_error_duration, + token_info_cache_duration, }; use crate::models::commons::Page; use crate::providers::address_info::{AddressInfo, ContractInfo}; @@ -246,10 +247,14 @@ impl DefaultInfoProvider<'_> { let currency_code = currency_code.to_uppercase(); let exchange = self.fetch_exchange()?; match exchange.rates { - Some(rates) => rates - .get(¤cy_code) - .cloned() - .ok_or(client_error!(422, "Currency not found")), + Some(rates) => { + let base_to_usd = rates.get("USD").unwrap_or(&0.0); + rates + .get(¤cy_code) + .cloned() + .map(|base_to_requested_code| base_to_requested_code / base_to_usd) + .ok_or(client_error!(422, "Currency not found")) + } None => Err(client_error!(422, "Currency not found")), } } @@ -262,7 +267,7 @@ impl DefaultInfoProvider<'_> { } fn fetch_exchange(&self) -> ApiResult { - let url = format!("https://api.exchangeratesapi.io/latest?base=USD"); + let url = base_exchange_api_url(); let body = self.cache.request_cached( self.client, &url, diff --git a/src/services/balances.rs b/src/services/balances.rs index 8a3eb3eb3..3c3784d77 100644 --- a/src/services/balances.rs +++ b/src/services/balances.rs @@ -33,7 +33,7 @@ pub fn balances( let backend_balances: Vec = serde_json::from_str(&body)?; let info_provider = DefaultInfoProvider::new(&context); - let usd_to_fiat = info_provider.exchange_usd_to(fiat)?; + let usd_to_fiat = info_provider.exchange_usd_to(fiat).unwrap_or(0.0); let mut total_fiat = 0.0;