move FiatConversionService to newer charts api (#3544)

* move FiatConversionService to newer charts api

* remove debug print

* disable strict parsing on getLatestPrice

* fix for lack of toDouble

* ci
This commit is contained in:
malik1004x
2026-09-29 12:39:43 +02:00
committed by GitHub
parent bc302f0e24
commit 9679f91a8c
2 changed files with 50 additions and 46 deletions
+11 -44
View File
@@ -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<double> _fetchPrice(String crypto, String fiat, bool torOnly) async {
final Map<String, String> 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<String, dynamic>;
final results = responseJSON['results'] as Map<String, dynamic>;
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");
}
+39 -2
View File
@@ -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<List<PriceData>> getPrices(PriceRequest request) async {
static Future<List<PriceData>> getPrices(PriceRequest request, {bool torOnly = false}) async {
final List<PriceData> 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<PriceData?> 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<String, dynamic>?;
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),
);
}
}