Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 11 additions & 44 deletions lib/core/fiat_conversion_service.dart
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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");
}
41 changes: 39 additions & 2 deletions lib/new-ui/model/charts/price_api_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand All @@ -33,6 +48,8 @@ class PriceRequest {
"quote": from.apiString,
"base": to.apiString,
});

Uri get onionUri => Uri.https(priceApiHostOnion, uri.path, uri.queryParameters);
}

class PriceApiClient {
Expand All @@ -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 [];
}
Expand All @@ -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),
);
}
}
Loading