diff --git a/assets/config/cfg.json b/assets/config/cfg.json index 9ccfe013e8..dd43e26fd6 100644 --- a/assets/config/cfg.json +++ b/assets/config/cfg.json @@ -5,11 +5,15 @@ "fr", "tr" ], + "current_currency": "USD", "current_fiat": "USD", "available_fiat": [ + "USD", + "EUR" + ], + "possible_currencies": [ "USD", "BTC", - "EUR", "KMD" ] } \ No newline at end of file diff --git a/atomic_qt_design/qml/Constants/API.qml b/atomic_qt_design/qml/Constants/API.qml index 932310daff..71528cfd9b 100644 --- a/atomic_qt_design/qml/Constants/API.qml +++ b/atomic_qt_design/qml/Constants/API.qml @@ -28,7 +28,10 @@ QtObject { balance_fiat_all: "12345678.90", - fiat: "EUR", + current_currency: "EUR", + get_available_fiats: () => ["USD", "EUR"], + get_available_currencies: () => ["EUR", "BTC", "KMD"], + lang: "en", get_available_langs: () => ["en", "fr", "tr"], diff --git a/atomic_qt_design/qml/Constants/General.qml b/atomic_qt_design/qml/Constants/General.qml index 9f82b89ca6..ebb6a545e6 100644 --- a/atomic_qt_design/qml/Constants/General.qml +++ b/atomic_qt_design/qml/Constants/General.qml @@ -83,10 +83,16 @@ QtObject { return list.find(c => c.ticker === ticker) } + function validFiatRates(data, fiat) { + return data && data.rates && data.rates[fiat] + } + function formatFiat(received, amount, fiat) { const symbols = { "USD": "$", - "EUR": "€" + "EUR": "€", + "BTC": "₿", + "KMD": "KMD", } return diffPrefix(received) + symbols[fiat] + " " + amount diff --git a/atomic_qt_design/qml/Portfolio/Portfolio.qml b/atomic_qt_design/qml/Portfolio/Portfolio.qml index d108a545db..26aedf4c63 100644 --- a/atomic_qt_design/qml/Portfolio/Portfolio.qml +++ b/atomic_qt_design/qml/Portfolio/Portfolio.qml @@ -34,8 +34,12 @@ ColumnLayout { } function getColor(data) { - return data.rates === null || data.rates[API.get().fiat].percent_change_24h === 0 ? Style.colorWhite4 : - data.rates[API.get().fiat].percent_change_24h > 0 ? Style.colorGreen : Style.colorRed + const fiat = API.get().current_currency + + if(General.validFiatRates(data, fiat) && data.rates[fiat].percent_change_24h !== 0) + return data.rates[fiat].percent_change_24h > 0 ? Style.colorGreen : Style.colorRed + + return Style.colorWhite4 } function updateChart(chart, historical) { @@ -73,6 +77,7 @@ ColumnLayout { height: 200 ColumnLayout { + id: top_layout anchors.centerIn: parent // Total Title @@ -89,11 +94,23 @@ ColumnLayout { DefaultText { Layout.alignment: Qt.AlignHCenter Layout.bottomMargin: 30 - text_value: API.get().empty_string + (General.formatFiat("", API.get().balance_fiat_all, API.get().fiat)) + text_value: API.get().empty_string + (General.formatFiat("", API.get().balance_fiat_all, API.get().current_currency)) font.pixelSize: Style.textSize4 } } + MouseArea { + anchors.fill: top_layout + + onClicked: { + const current_fiat = API.get().current_currency + const available_fiats = API.get().get_available_currencies() + const current_index = available_fiats.indexOf(current_fiat) + const next_index = (current_index + 1) % available_fiats.length + const next_fiat = available_fiats[next_index] + API.get().current_currency = next_fiat + } + } // Add button PlusButton { @@ -158,7 +175,7 @@ ColumnLayout { id: balance_header icon_at_left: true anchors.left: parent.left - anchors.leftMargin: parent.width * 0.3 + anchors.leftMargin: parent.width * 0.265 anchors.verticalCenter: parent.verticalCenter text: API.get().empty_string + (qsTr("Balance")) @@ -170,7 +187,7 @@ ColumnLayout { id: change_24h_header icon_at_left: false anchors.right: parent.right - anchors.rightMargin: parent.width * 0.27 + anchors.rightMargin: parent.width * 0.37 anchors.verticalCenter: parent.verticalCenter text: API.get().empty_string + (qsTr("Change 24h")) @@ -182,7 +199,7 @@ ColumnLayout { id: trend_7d_header icon_at_left: false anchors.right: parent.right - anchors.rightMargin: parent.width * 0.15 + anchors.rightMargin: parent.width * 0.24 anchors.verticalCenter: parent.verticalCenter text: API.get().empty_string + (qsTr("Trend 7d")) @@ -266,8 +283,8 @@ ColumnLayout { case sort_by_balance: return (parseFloat(b.balance) - parseFloat(a.balance)) * order case sort_by_trend: return (parseFloat(b.price) - parseFloat(a.price)) * order case sort_by_change: - val_a = a.rates === null ? -9999999 : a.rates[API.get().fiat].percent_change_24h - val_b = b.rates === null ? -9999999 : b.rates[API.get().fiat].percent_change_24h + val_a = General.validFiatRates(a, API.get().current_currency) ? a.rates[API.get().current_currency].percent_change_24h : -9999999 + val_b = General.validFiatRates(b, API.get().current_currency) ? b.rates[API.get().current_currency].percent_change_24h : -9999999 return (val_b - val_a) * order } @@ -355,7 +372,7 @@ ColumnLayout { anchors.left: balance_ticker.right anchors.leftMargin: 10 - text_value: API.get().empty_string + ("(" + General.formatFiat('', model.modelData.balance_fiat, API.get().fiat) + ")") + text_value: API.get().empty_string + ("(" + General.formatFiat('', model.modelData.balance_fiat, API.get().current_currency) + ")") color: Style.colorWhite5 anchors.verticalCenter: parent.verticalCenter } @@ -365,7 +382,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: change_24h_header.anchors.rightMargin - text_value: API.get().empty_string + (model.modelData.rates === null ? '-' : General.formatPercent(model.modelData.rates[API.get().fiat].percent_change_24h)) + text_value: API.get().empty_string + (General.validFiatRates(model.modelData, API.get().current_currency) ? General.formatPercent(model.modelData.rates[API.get().current_currency].percent_change_24h) : '-') color: getColor(model.modelData) anchors.verticalCenter: parent.verticalCenter } @@ -375,7 +392,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: price_header.anchors.rightMargin - text_value: API.get().empty_string + (General.formatFiat('', model.modelData.price, API.get().fiat)) + text_value: API.get().empty_string + (General.formatFiat('', model.modelData.price, API.get().current_currency)) color: Style.colorThemeDarkLight anchors.verticalCenter: parent.verticalCenter } diff --git a/atomic_qt_design/qml/Settings/Settings.qml b/atomic_qt_design/qml/Settings/Settings.qml index e8b9865227..9b65977cc9 100644 --- a/atomic_qt_design/qml/Settings/Settings.qml +++ b/atomic_qt_design/qml/Settings/Settings.qml @@ -7,6 +7,7 @@ import "../Components" import "../Constants" Item { + id: root function disconnect() { API.get().disconnect() onDisconnect() @@ -21,7 +22,7 @@ Item { } property string mm2_version: '' - property var fiats: (["USD", "EUR"]) + property var fiats: API.get().get_available_fiats() InnerBackground { id: layout_background @@ -44,10 +45,10 @@ Item { property bool initialized: false field.onCurrentIndexChanged: { - if(initialized) API.get().fiat = fiats[field.currentIndex] + if(initialized) API.get().current_currency = fiats[field.currentIndex] } Component.onCompleted: { - field.currentIndex = fiats.indexOf(API.get().fiat) + field.currentIndex = fiats.indexOf(API.get().current_currency) initialized = true } } diff --git a/atomic_qt_design/qml/Wallet/Main.qml b/atomic_qt_design/qml/Wallet/Main.qml index b62d487849..3ad85152af 100644 --- a/atomic_qt_design/qml/Wallet/Main.qml +++ b/atomic_qt_design/qml/Wallet/Main.qml @@ -91,7 +91,7 @@ Item { } DefaultText { - text_value: API.get().empty_string + (General.formatFiat("", API.get().current_coin_info.fiat_amount, API.get().fiat)) + text_value: API.get().empty_string + (General.formatFiat("", API.get().current_coin_info.current_currency_amount, API.get().current_currency)) Layout.alignment: Qt.AlignLeft font.pixelSize: name.font.pixelSize } @@ -121,7 +121,7 @@ Item { const c = General.getCoin(portfolio_coins, API.get().current_coin_info.ticker) if(c === undefined) return "-" - return API.get().empty_string + (General.formatFiat('', c.price, API.get().fiat)) + return API.get().empty_string + (General.formatFiat('', c.price, API.get().current_currency)) } Layout.alignment: Qt.AlignLeft @@ -143,9 +143,10 @@ Item { DefaultText { text_value: { const c = General.getCoin(portfolio_coins, API.get().current_coin_info.ticker) - if(c === undefined || c.rates === null) return "-" + const fiat = API.get().current_currency + if(!General.validFiatRates(c, fiat)) return "-" - return API.get().empty_string + (General.formatPercent(c.rates[API.get().fiat].percent_change_24h)) + return API.get().empty_string + (General.formatPercent(c.rates[fiat].percent_change_24h)) } Layout.alignment: Qt.AlignLeft font.pixelSize: name.font.pixelSize @@ -153,9 +154,10 @@ Item { const c = General.getCoin(portfolio_coins, API.get().current_coin_info.ticker) const def_color = Style.colorWhite4 - if(c === undefined || c.rates === null) return def_color + const fiat = API.get().current_currency + if(!General.validFiatRates(c, fiat)) return def_color - const v = parseFloat(c.rates[API.get().fiat].percent_change_24h) + const v = parseFloat(c.rates[fiat].percent_change_24h) return v === 0 ? def_color : v > 0 ? Style.colorGreen : Style.colorRed } } diff --git a/atomic_qt_design/qml/Wallet/TransactionDetailsModal.qml b/atomic_qt_design/qml/Wallet/TransactionDetailsModal.qml index 6c21b823aa..013fe34883 100644 --- a/atomic_qt_design/qml/Wallet/TransactionDetailsModal.qml +++ b/atomic_qt_design/qml/Wallet/TransactionDetailsModal.qml @@ -24,7 +24,7 @@ DefaultModal { // Amount TextWithTitle { title: API.get().empty_string + (qsTr("Amount")) - text: API.get().empty_string + (General.formatCrypto(details.received, details.amount, API.get().current_coin_info.ticker, details.amount_fiat, API.get().fiat)) + text: API.get().empty_string + (General.formatCrypto(details.received, details.amount, API.get().current_coin_info.ticker, details.amount_fiat, API.get().current_currency)) value_color: details.received ? Style.colorGreen : Style.colorRed } diff --git a/atomic_qt_design/qml/Wallet/Transactions.qml b/atomic_qt_design/qml/Wallet/Transactions.qml index f4d0364691..bf6f9d1857 100644 --- a/atomic_qt_design/qml/Wallet/Transactions.qml +++ b/atomic_qt_design/qml/Wallet/Transactions.qml @@ -68,7 +68,7 @@ DefaultListView { // Fiat DefaultText { - text_value: API.get().empty_string + (General.formatFiat(model.modelData.received, model.modelData.amount_fiat, API.get().fiat)) + text_value: API.get().empty_string + (General.formatFiat(model.modelData.received, model.modelData.amount_fiat, API.get().current_currency)) font.pixelSize: description.font.pixelSize anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left diff --git a/src/atomic.dex.app.cpp b/src/atomic.dex.app.cpp index e815cb97f9..562b2fba40 100644 --- a/src/atomic.dex.app.cpp +++ b/src/atomic.dex.app.cpp @@ -274,7 +274,7 @@ namespace atomic_dex } std::error_code ec; - auto fiat_balance_std = paprika.get_price_in_fiat_all(m_config.current_fiat, ec); + auto fiat_balance_std = paprika.get_price_in_fiat_all(m_config.current_currency, ec); if (!ec) { @@ -303,12 +303,12 @@ namespace atomic_dex QString target_balance = QString::fromStdString(mm2.my_balance(m_coin_info->get_ticker().toStdString(), ec)); m_coin_info->set_balance(target_balance); - if (std::any_of(begin(m_config.available_fiat), end(m_config.available_fiat), [this](const std::string& cur_fiat) { - return cur_fiat == m_config.current_fiat; + if (std::any_of(begin(m_config.possible_currencies), end(m_config.possible_currencies), [this](const std::string& cur_fiat) { + return cur_fiat == m_config.current_currency; })) { ec = std::error_code(); - auto amount = QString::fromStdString(paprika.get_price_in_fiat(m_config.current_fiat, m_coin_info->get_ticker().toStdString(), ec)); + auto amount = QString::fromStdString(paprika.get_price_in_fiat(m_config.current_currency, m_coin_info->get_ticker().toStdString(), ec)); if (!ec) { m_coin_info->set_fiat_amount(amount); @@ -325,7 +325,7 @@ namespace atomic_dex if (!ec) { m_coin_info->set_transactions( - to_qt_binding(std::move(txs), this, get_paprika(), QString::fromStdString(m_config.current_fiat), m_coin_info->get_ticker().toStdString())); + to_qt_binding(std::move(txs), this, get_paprika(), QString::fromStdString(m_config.current_currency), m_coin_info->get_ticker().toStdString())); } auto tx_state = mm2.get_tx_state(m_coin_info->get_ticker().toStdString(), ec); @@ -453,19 +453,19 @@ namespace atomic_dex } QString - application::get_current_fiat() const noexcept + application::get_current_currency() const noexcept { - return QString::fromStdString(this->m_config.current_fiat); + return QString::fromStdString(this->m_config.current_currency); } void - application::set_current_fiat(QString current_fiat) noexcept + application::set_current_currency(QString current_currency) noexcept { - if (current_fiat.toStdString() != m_config.current_fiat) + if (current_currency.toStdString() != m_config.current_currency) { - spdlog::info("change lang {} to {}", m_config.current_fiat, current_fiat.toStdString()); - atomic_dex::change_fiat(m_config, current_fiat.toStdString()); - emit on_fiat_changed(); + spdlog::info("change currency {} to {}", m_config.current_currency, current_currency.toStdString()); + atomic_dex::change_currency(m_config, current_currency.toStdString()); + emit on_currency_changed(); } } @@ -880,9 +880,9 @@ namespace atomic_dex nlohmann::json cur_obj{ {"ticker", coin.ticker}, {"name", coin.name}, - {"price", get_paprika().get_rate_conversion(m_config.current_fiat, coin.ticker, ec, true)}, + {"price", get_paprika().get_rate_conversion(m_config.current_currency, coin.ticker, ec, true)}, {"balance", get_mm2().my_balance(coin.ticker, ec)}, - {"balance_fiat", get_paprika().get_price_in_fiat(m_config.current_fiat, coin.ticker, ec)}, + {"balance_fiat", get_paprika().get_price_in_fiat(m_config.current_currency, coin.ticker, ec)}, {"rates", get_paprika().get_ticker_infos(coin.ticker).answer}, {"historical", get_paprika().get_ticker_historical(coin.ticker).answer}}; j.push_back(cur_obj); @@ -957,6 +957,15 @@ namespace atomic_dex return out; } + QStringList + application::get_available_currencies() const + { + QStringList out; + out.reserve(m_config.possible_currencies.size()); + for (auto&& cur_currency: m_config.possible_currencies) { out.push_back(QString::fromStdString(cur_currency)); } + return out; + } + const QString& application::get_empty_string() const { @@ -1165,7 +1174,7 @@ namespace atomic_dex std::error_code ec; return QString::fromStdString(get_paprika().get_cex_rates(base.toStdString(), rel.toStdString(), ec)); } -} +} // namespace atomic_dex //! OHLC Relative functions namespace atomic_dex diff --git a/src/atomic.dex.app.hpp b/src/atomic.dex.app.hpp index 1aa27f87c2..9684556c0b 100644 --- a/src/atomic.dex.app.hpp +++ b/src/atomic.dex.app.hpp @@ -48,7 +48,7 @@ namespace atomic_dex Q_PROPERTY(QList enabled_coins READ get_enabled_coins NOTIFY enabledCoinsChanged) Q_PROPERTY(QList enableable_coins READ get_enableable_coins NOTIFY enableableCoinsChanged) Q_PROPERTY(QObject* current_coin_info READ get_current_coin_info NOTIFY coinInfoChanged) - Q_PROPERTY(QString fiat READ get_current_fiat WRITE set_current_fiat NOTIFY on_fiat_changed) + Q_PROPERTY(QString current_currency READ get_current_currency WRITE set_current_currency NOTIFY on_currency_changed) // Q_PROPERTY(QString second_fiat READ get_second_current_fiat WRITE set_second_current_fiat NOTIFY on_second_fiat_changed) Q_PROPERTY(QString lang READ get_current_lang WRITE set_current_lang NOTIFY on_lang_changed) Q_PROPERTY(QString wallet_default_name READ get_wallet_default_name WRITE set_wallet_default_name NOTIFY on_wallet_default_name_changed) @@ -89,7 +89,7 @@ namespace atomic_dex QObject* get_current_coin_info() const noexcept; QObjectList get_enabled_coins() const noexcept; QObjectList get_enableable_coins() const noexcept; - QString get_current_fiat() const noexcept; + QString get_current_currency() const noexcept; QString get_current_lang() const noexcept; QString get_balance_fiat_all() const noexcept; QString get_second_balance_fiat_all() const noexcept; @@ -98,7 +98,7 @@ namespace atomic_dex Q_INVOKABLE QString get_version() const noexcept; //! Properties Setter - void set_current_fiat(QString current_fiat) noexcept; + void set_current_currency(QString current_currency) noexcept; void set_current_lang(const QString& current_lang) noexcept; void set_wallet_default_name(QString wallet_default_name) noexcept; void set_current_balance_fiat_all(QString current_fiat_all_balance) noexcept; @@ -131,6 +131,7 @@ namespace atomic_dex Q_INVOKABLE QString get_export_folder() const; Q_INVOKABLE QStringList get_available_langs() const; Q_INVOKABLE QStringList get_available_fiats() const; + Q_INVOKABLE QStringList get_available_currencies() const; Q_INVOKABLE static void change_state(int visibility); //! Portfolio QML API Bindings @@ -190,7 +191,7 @@ namespace atomic_dex void enabledCoinsChanged(); void enableableCoinsChanged(); void coinInfoChanged(); - void on_fiat_changed(); + void on_currency_changed(); void on_second_fiat_changed(); void on_lang_changed(); void lang_changed(); diff --git a/src/atomic.dex.cfg.cpp b/src/atomic.dex.cfg.cpp index 06aca1a323..1474b03f69 100644 --- a/src/atomic.dex.cfg.cpp +++ b/src/atomic.dex.cfg.cpp @@ -27,8 +27,10 @@ namespace assert(ifs.is_open()); ifs >> config_json_data; - config_json_data["lang"] = config.current_lang; - config_json_data["current_fiat"] = config.current_fiat; + config_json_data["lang"] = config.current_lang; + config_json_data["current_currency"] = config.current_currency; + config_json_data["current_fiat"] = config.current_fiat; + config_json_data["possible_currencies"] = config.possible_currencies; ifs.close(); @@ -37,7 +39,7 @@ namespace assert(ofs.is_open()); ofs << config_json_data; } -} +} // namespace namespace atomic_dex { @@ -46,8 +48,10 @@ namespace atomic_dex { j.at("lang").get_to(config.current_lang); j.at("available_lang").get_to(config.available_lang); + j.at("current_currency").get_to(config.current_currency); j.at("current_fiat").get_to(config.current_fiat); j.at("available_fiat").get_to(config.available_fiat); + j.at("possible_currencies").get_to(config.possible_currencies); } void @@ -73,9 +77,17 @@ namespace atomic_dex } void - change_fiat(cfg& config, const std::string& new_fiat) + change_currency(cfg& config, const std::string& new_currency) { - config.current_fiat = new_fiat; + config.current_currency = new_currency; + + //! If it's fiat, i set the first element of the possible currencies to the new currency (the new fiat here) and i also set the current fiat + if (ranges::any_of(config.available_fiat, [new_currency](const std::string& current_fiat) { return current_fiat == new_currency; })) + { + spdlog::info("{} is fiat, setting it as current fiat and possible currencies", new_currency); + config.current_fiat = new_currency; + config.possible_currencies[0] = new_currency; + } upgrade_cfg(config); } } // namespace atomic_dex diff --git a/src/atomic.dex.cfg.hpp b/src/atomic.dex.cfg.hpp index 97913bf56a..35d43119f6 100644 --- a/src/atomic.dex.cfg.hpp +++ b/src/atomic.dex.cfg.hpp @@ -22,14 +22,16 @@ namespace atomic_dex { struct cfg { - std::string current_lang{"en"}; - std::string current_fiat; - std::vector available_lang; - std::vector available_fiat; + std::string current_lang{"en"}; + std::string current_currency; + std::string current_fiat; + std::vector available_lang; + std::vector available_fiat; + std::array possible_currencies; }; void from_json(const nlohmann::json& j, cfg& config); void change_lang(cfg& config, const std::string& new_lang); - void change_fiat(cfg& config, const std::string& new_fiat); + void change_currency(cfg& config, const std::string& new_currency); cfg load_cfg(); } // namespace atomic_dex \ No newline at end of file diff --git a/src/atomic.dex.mm2.cpp b/src/atomic.dex.mm2.cpp index af458a60c0..7847f77953 100644 --- a/src/atomic.dex.mm2.cpp +++ b/src/atomic.dex.mm2.cpp @@ -634,7 +634,7 @@ namespace atomic_dex using namespace std::chrono_literals; // loguru::set_thread_name("mm2 init thread"); - const auto wait_ec = m_mm2_instance.wait(750ms).second; + const auto wait_ec = m_mm2_instance.wait(2s).second; fs::remove(mm2_cfg_path); if (wait_ec.value() == static_cast(std::errc::timed_out) || wait_ec.value() == 258) { diff --git a/src/atomic.dex.provider.coinpaprika.cpp b/src/atomic.dex.provider.coinpaprika.cpp index 0d5b66b861..b330d0a3b0 100644 --- a/src/atomic.dex.provider.coinpaprika.cpp +++ b/src/atomic.dex.provider.coinpaprika.cpp @@ -41,7 +41,7 @@ namespace void process_ticker_infos(const atomic_dex::coin_config& current_coin, atomic_dex::coinpaprika_provider::t_ticker_infos_registry& reg) { - const ticker_infos_request request{.ticker_currency_id = current_coin.coinpaprika_id, .ticker_quotes = {"USD", "EUR"}}; + const ticker_infos_request request{.ticker_currency_id = current_coin.coinpaprika_id, .ticker_quotes = {"USD", "EUR", "BTC"}}; auto answer = tickers_info(request); retry(answer, request, [&answer](const ticker_infos_request& request) { answer = tickers_info(request); }); @@ -141,26 +141,29 @@ namespace atomic_dex t_coins coins = m_mm2_instance.get_enabled_coins(); + std::vector> out_fut; + + out_fut.reserve(coins.size() * 6); for (auto&& current_coin: coins) { if (current_coin.coinpaprika_id == "test-coin") { continue; } - spawn([this, cur_coin = current_coin]() { process_ticker_infos(cur_coin, this->m_ticker_infos_registry); }); - spawn([this, cur_coin = current_coin]() { process_ticker_historical(cur_coin, this->m_ticker_historical_registry); }); - process_provider(current_coin, m_usd_rate_providers, "usd-us-dollars"); + out_fut.push_back(spawn([this, cur_coin = current_coin]() { process_ticker_infos(cur_coin, this->m_ticker_infos_registry); })); + out_fut.push_back(spawn([this, cur_coin = current_coin]() { process_ticker_historical(cur_coin, this->m_ticker_historical_registry); })); + out_fut.push_back(spawn([this, cur_coin = current_coin]() { process_provider(cur_coin, m_usd_rate_providers, "usd-us-dollars"); })); if (current_coin.ticker != "BTC") { - process_provider(current_coin, m_btc_rate_providers, "btc-bitcoin"); + out_fut.push_back(spawn([this, cur_coin = current_coin]() { process_provider(cur_coin, m_btc_rate_providers, "btc-bitcoin"); })); } if (current_coin.ticker != "KMD") { - process_provider(current_coin, m_kmd_rate_providers, "kmd-komodo"); + out_fut.push_back(spawn([this, cur_coin = current_coin]() { process_provider(cur_coin, m_kmd_rate_providers, "kmd-komodo"); })); } - process_provider(current_coin, m_eur_rate_providers, "eur-euro"); + out_fut.push_back(spawn([this, cur_coin = current_coin]() { process_provider(cur_coin, m_eur_rate_providers, "eur-euro"); })); } - + for (auto&& cur_fut: out_fut) { cur_fut.get(); } } while (not m_provider_thread_timer.wait_for(120s)); }); } @@ -203,11 +206,12 @@ namespace atomic_dex if (not skip_precision) { - if (auto final_price_str = final_price.str(2, std::ios_base::fixed); final_price_str == "0.00" && final_price > 0.00000000) + std::size_t default_precision = (fiat == "USD" || fiat == "EUR") ? 2 : 8; + if (auto final_price_str = final_price.str(default_precision, std::ios_base::fixed); final_price_str == "0.00" && final_price > 0.00000000) { - return final_price.str(2); + return final_price.str(default_precision); } - ss.precision(2); + ss.precision(default_precision); } ss << std::fixed << final_price; @@ -248,9 +252,13 @@ namespace atomic_dex } } - ss.precision(2); + std::size_t default_precision = (fiat == "USD" || fiat == "EUR") ? 2 : 8; + ss.precision(default_precision); ss << std::fixed << final_price_f; - return ss.str(); + std::string result = ss.str(); + boost::trim_right_if(result, boost::is_any_of("0")); + boost::trim_right_if(result, boost::is_any_of(".")); + return result; } catch (const std::exception& error) { @@ -274,12 +282,13 @@ namespace atomic_dex } const t_float_50 amount_f(amount); const t_float_50 current_price_f(current_price); - const t_float_50 final_price = amount_f * current_price_f; - if (auto final_price_str = final_price.str(2, std::ios_base::fixed); final_price_str == "0.00" && final_price > 0.00000000) + const t_float_50 final_price = amount_f * current_price_f; + std::size_t default_precision = (fiat == "USD" || fiat == "EUR") ? 2 : 8; + if (auto final_price_str = final_price.str(default_precision, std::ios_base::fixed); final_price_str == "0.00" && final_price > 0.00000000) { - return final_price.str(2); + return final_price.str(default_precision); } - return final_price.str(2, std::ios_base::fixed); + return final_price.str(default_precision, std::ios_base::fixed); } std::string @@ -335,13 +344,22 @@ namespace atomic_dex if (adjusted) { + std::size_t default_precision = (fiat == "USD" || fiat == "EUR") ? 2 : 8; + t_float_50 current_price_f(current_price); + if (fiat == "USD" || fiat == "EUR") + { + if (current_price_f < 1.0) + { + default_precision = 5; + } + } //! Trick: If there conversion in a fixed representation is 0.00 then use a default precision to 2 without fixed ios flags - if (auto fixed_str = current_price_f.str(2, std::ios_base::fixed); fixed_str == "0.00" && current_price_f > 0.00000000) + if (auto fixed_str = current_price_f.str(default_precision, std::ios_base::fixed); fixed_str == "0.00" && current_price_f > 0.00000000) { - return current_price_f.str(2); + return current_price_f.str(default_precision); } - return current_price_f.str(2, std::ios_base::fixed); + return current_price_f.str(default_precision, std::ios::fixed); } return current_price; }