diff --git a/lib/core/fiat_conversion_service.dart b/lib/core/fiat_conversion_service.dart index 34104f07a6..08c0f2f98b 100644 --- a/lib/core/fiat_conversion_service.dart +++ b/lib/core/fiat_conversion_service.dart @@ -1,48 +1,6 @@ -import 'package:cw_core/utils/print_verbose.dart'; -import 'package:cw_core/utils/proxy_wrapper.dart'; +import "package:cake_wallet/new-ui/model/charts/price_api_client.dart"; import 'package:cw_core/crypto_currency.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; -import 'dart:convert'; -import 'package:cake_wallet/.secrets.g.dart' as secrets; - -const _fiatApiClearNetAuthority = 'prices.cakewallet.com'; -const _fiatApiOnionAuthority = '46wisoe2uwipcj2j4og6smiq7hbmj34fkkrquwlzbbsqtgat7bf3erid.onion'; -const _fiatApiPath = '/v2/rates'; - -Future _fetchPrice(String crypto, String fiat, bool torOnly) async { - final Map queryParams = { - 'interval_count': '1', - 'base': crypto.split(".").first, - 'quote': fiat, - }; - - num price = 0.0; - - try { - final onionUri = Uri.http(_fiatApiOnionAuthority, _fiatApiPath, queryParams); - final clearnetUri = Uri.https(_fiatApiClearNetAuthority, _fiatApiPath, queryParams); - - final response = await ProxyWrapper() - .get(onionUri: onionUri, clearnetUri: torOnly ? onionUri : clearnetUri, headers: { - "x-api-key": secrets.fiatApiKey, - }); - - if (response.statusCode != 200) { - return 0.0; - } - - final responseJSON = json.decode(response.body) as Map; - final results = responseJSON['results'] as Map; - - if (results.isNotEmpty) { - price = results.values.first as num; - } - - return price.toDouble(); - } catch (e) { - return price.toDouble(); - } -} /// Override specific [CryptoCurrency] to fix its price to the price of another /// e.g. nDEPS should have the same price as DEPS, but only DEPS is tracked @@ -57,5 +15,14 @@ class FiatConversionService { required FiatCurrency fiat, required bool torOnly, }) async => - await _fetchPrice(_overrideCryptoCurrency(crypto).toString(), fiat.toString(), torOnly); + double.parse((await PriceApiClient.getLatestPrice( + LatestPriceRequest( + from: _overrideCryptoCurrency(crypto), + to: fiat, + ), + torOnly: torOnly, + )) + ?.quote + .toString() ?? + "0"); } diff --git a/lib/new-ui/model/charts/price_api_client.dart b/lib/new-ui/model/charts/price_api_client.dart index 9afe64a619..0c3fa0e256 100644 --- a/lib/new-ui/model/charts/price_api_client.dart +++ b/lib/new-ui/model/charts/price_api_client.dart @@ -9,6 +9,21 @@ import "package:cw_core/utils/print_verbose.dart"; import "package:cw_core/utils/proxy_wrapper.dart"; const priceApiHost = "prices.cakewallet.com"; +const priceApiHostOnion = "46wisoe2uwipcj2j4og6smiq7hbmj34fkkrquwlzbbsqtgat7bf3erid.onion"; + +class LatestPriceRequest { + LatestPriceRequest({required this.from, required this.to}); + + final Currency from; + final Currency to; + + Uri get uri => Uri.https(priceApiHost, "/v3/rates", { + "base": from.apiString, + "quote": to.apiString, + }); + + Uri get onionUri => Uri.https(priceApiHostOnion, uri.path, uri.queryParameters); +} class PriceRequest { const PriceRequest({ @@ -33,6 +48,8 @@ class PriceRequest { "quote": from.apiString, "base": to.apiString, }); + + Uri get onionUri => Uri.https(priceApiHostOnion, uri.path, uri.queryParameters); } class PriceApiClient { @@ -51,10 +68,10 @@ class PriceApiClient { } } - static Future> getPrices(PriceRequest request) async { + static Future> getPrices(PriceRequest request, {bool torOnly = false}) async { final List ret = []; printV(request.uri); - final data = await _getJson(request.uri); + final data = await _getJson(torOnly ? request.onionUri : request.uri); if (data == null) { return []; } @@ -75,4 +92,24 @@ class PriceApiClient { } return ret; } + + static Future getLatestPrice( + LatestPriceRequest request, { + bool torOnly = false, + }) async { + final data = await _getJson(torOnly ? request.onionUri : request.uri); + if (data == null) { + return null; + } + final results = data["results"] as Map?; + if (results == null) { + return null; + } + final result = results[results.keys.first]; + return PriceData( + time: DateTime.now(), + base: request.from, + quote: Money.parse((result as num).toString(), request.to, strictParsing: false), + ); + } }