diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 623343db29..c83aeedff8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -26,7 +26,7 @@ Please describe what you expected to happen. **Operating Environment(s):** - OS: [e.g. Windows/OSX/Linux. If Linux, include distro. ] - OS version: [e.g. 7/10/11, 10.13/10.15, 18.04/20.04 ] - - Komodo Wallet Desktop Version: [e.g. 0.7.2] + - Komodo Wallet Desktop Version: [e.g. 0.8.0] - Build branch: [e.g. master/dev] diff --git a/.github/workflows/atomicdex-desktop-cd.yml b/.github/workflows/atomicdex-desktop-cd.yml index f5050b8e31..18d8bc396b 100644 --- a/.github/workflows/atomicdex-desktop-cd.yml +++ b/.github/workflows/atomicdex-desktop-cd.yml @@ -9,7 +9,7 @@ env: DEX_PROJECT_NAME: "komodo-wallet" DEX_DISPLAY_NAME: "Komodo Wallet" DEX_COMPANY: "KomodoPlatform" - DEX_VERSION: "0.7.2" + DEX_VERSION: "0.8.0" DEX_WEBSITE: "https://atomicdex.io/" jobs: diff --git a/.github/workflows/atomicdex-desktop-ci.yml b/.github/workflows/atomicdex-desktop-ci.yml index 45c8fa9ec1..87af63785f 100644 --- a/.github/workflows/atomicdex-desktop-ci.yml +++ b/.github/workflows/atomicdex-desktop-ci.yml @@ -17,7 +17,7 @@ env: DEX_PROJECT_NAME: "komodo-wallet" DEX_DISPLAY_NAME: "Komodo Wallet" DEX_COMPANY: "KomodoPlatform" - DEX_VERSION: "0.7.2" + DEX_VERSION: "0.8.0" DEX_WEBSITE: "https://atomicdex.io/" VCPKG_DEFAULT_BINARY_CACHE: ${{ github.workspace }}/b/vcpkg_cache VCPKG_BINARY_SOURCES: clear;x-gha,readwrite @@ -159,9 +159,7 @@ jobs: export SHELL=/bin/bash echo "CHOOSENIM_CHOOSE_VERSION=1.6.2" >> $GITHUB_ENV export CHOOSENIM_CHOOSE_VERSION=1.6.2 - curl https://nim-lang.org/choosenim/init.sh > choosenim.sh - chmod +x choosenim.sh - ./choosenim.sh -y + ./ci_tools_atomic_dex/ci_scripts/choosenim.sh -y export PATH=/home/runner/.nimble/bin:$PATH chmod +x /home/runner/.choosenim/toolchains/nim-1.6.2/bin/* @@ -170,9 +168,7 @@ jobs: run: | echo "CHOOSENIM_CHOOSE_VERSION=1.6.2" >> $GITHUB_ENV export CHOOSENIM_CHOOSE_VERSION=1.6.2 - curl https://nim-lang.org/choosenim/init.sh > choosenim.sh - chmod +x choosenim.sh - ./choosenim.sh -y + ./ci_tools_atomic_dex/ci_scripts/choosenim.sh -y export PATH=/Users/runner/.nimble/bin:$PATH chmod +x /Users/runner/.choosenim/toolchains/nim-1.6.2/bin/* diff --git a/CMakeLists.txt b/CMakeLists.txt index 35f69d82e0..49fa003f6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ include(vcpkg_prerequisites) include(qt_prerequisites) include(cfg_hash) -project(${DEX_PROJECT_NAME} LANGUAGES CXX VERSION 0.7.2) +project(${DEX_PROJECT_NAME} LANGUAGES CXX VERSION 0.8.0) message(STATUS "${PROJECT_NAME} is version ${PROJECT_VERSION}") include(cmake_default_options) @@ -60,13 +60,13 @@ endif () ##! We fetch our dependencies if (APPLE) FetchContent_Declare(kdf - URL https://sdk.devbuilds.komodo.earth/main/kdf_35e9239-mac-x86-64.zip) + URL https://github.com/KomodoPlatform/komodo-defi-framework/releases/download/v2.1.0-beta/mm2-35e923949-Darwin-Release.zip) elseif (UNIX AND NOT APPLE) FetchContent_Declare(kdf - URL https://sdk.devbuilds.komodo.earth/main/kdf_35e9239-linux-x86-64.zip) + URL https://github.com/KomodoPlatform/komodo-defi-framework/releases/download/v2.1.0-beta/mm2-35e923949-Linux-Release.zip) else () FetchContent_Declare(kdf - URL https://sdk.devbuilds.komodo.earth/main/kdf_35e9239-win-x86-64.zip) + URL https://github.com/KomodoPlatform/komodo-defi-framework/releases/download/v2.1.0-beta/mm2-35e923949-Win64.zip) endif () #FetchContent_Declare(qmaterial URL https://github.com/KomodoPlatform/Qaterial/archive/last-clang-working-2.zip) @@ -89,12 +89,12 @@ FetchContent_MakeAvailable(kdf jl777-coins qmaterial) if (UNIX) configure_file(${jl777-coins_SOURCE_DIR}/utils/coins_config_tcp.json ${CMAKE_CURRENT_SOURCE_DIR}/assets/config/${PROJECT_VERSION}-coins.json COPYONLY) configure_file(${jl777-coins_SOURCE_DIR}/coins ${CMAKE_CURRENT_SOURCE_DIR}/assets/tools/kdf/coins COPYONLY) - configure_file(${kdf_SOURCE_DIR}/kdf ${CMAKE_CURRENT_SOURCE_DIR}/assets/tools/kdf/${DEX_API} COPYONLY) + configure_file(${kdf_SOURCE_DIR}/mm2 ${CMAKE_CURRENT_SOURCE_DIR}/assets/tools/kdf/${DEX_API} COPYONLY) file(COPY ${jl777-coins_SOURCE_DIR}/icons/ DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/atomic_defi_design/assets/images/coins/) else () configure_file(${jl777-coins_SOURCE_DIR}/utils/coins_config_tcp.json ${CMAKE_BINARY_DIR}/bin/assets/config/${PROJECT_VERSION}-coins.json COPYONLY) configure_file(${jl777-coins_SOURCE_DIR}/coins ${CMAKE_BINARY_DIR}/bin/assets/tools/kdf/coins COPYONLY) - configure_file(${kdf_SOURCE_DIR}/kdf.exe ${CMAKE_BINARY_DIR}/bin/assets/tools/kdf/${DEX_API}.exe COPYONLY) + configure_file(${kdf_SOURCE_DIR}/mm2.exe ${CMAKE_BINARY_DIR}/bin/assets/tools/kdf/${DEX_API}.exe COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ci_tools_atomic_dex/windows_misc/msvcp140.dll ${CMAKE_BINARY_DIR}/bin/assets/tools/kdf/msvcp140.dll COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ci_tools_atomic_dex/windows_misc/vcruntime140.dll ${CMAKE_BINARY_DIR}/bin/assets/tools/kdf/vcruntime140.dll COPYONLY) endif () diff --git a/atomic_defi_design/Dex/Components/DexLabel.qml b/atomic_defi_design/Dex/Components/DexLabel.qml index ef6694978d..77d8bc4d00 100644 --- a/atomic_defi_design/Dex/Components/DexLabel.qml +++ b/atomic_defi_design/Dex/Components/DexLabel.qml @@ -20,13 +20,10 @@ Text } } + text: privacy && Dex.General.privacy_mode ? Dex.General.privacy_text : text_value font: monospace ? Dex.DexTypo.monoSmall : Dex.DexTypo.body2 - color: enabled ? Dex.CurrentTheme.foregroundColor : Dex.CurrentTheme.textDisabledColor - - text: privacy && Dex.General.privacy_mode ? Dex.General.privacy_text : text_value wrapMode: Text.WordWrap - onLinkActivated: Qt.openUrlExternally(link) linkColor: color } diff --git a/atomic_defi_design/Dex/Components/DexTextField.qml b/atomic_defi_design/Dex/Components/DexTextField.qml index 1764675b85..1aafddd2e2 100644 --- a/atomic_defi_design/Dex/Components/DexTextField.qml +++ b/atomic_defi_design/Dex/Components/DexTextField.qml @@ -10,6 +10,8 @@ TextField property alias left_text: left_text.text_value property alias right_text: right_text.text_value + property alias left_fontsize: left_text.font.pixelSize + property alias right_fontsize: right_text.font.pixelSize property alias radius: background.radius property color backgroundColor: Dex.CurrentTheme.textFieldBackgroundColor property color backgroundColorActive: Dex.CurrentTheme.textFieldActiveBackgroundColor diff --git a/atomic_defi_design/Dex/Components/PairItemBadge.qml b/atomic_defi_design/Dex/Components/PairItemBadge.qml index ceeaa3c0b0..5ceab63666 100644 --- a/atomic_defi_design/Dex/Components/PairItemBadge.qml +++ b/atomic_defi_design/Dex/Components/PairItemBadge.qml @@ -30,7 +30,8 @@ DexRectangle Layout.leftMargin: 10 Layout.rightMargin: 20 - Dex.Text{ + DexLabel + { anchors.bottom: parent.top anchors.bottomMargin: 5 anchors.horizontalCenter: parent.horizontalCenter @@ -46,6 +47,7 @@ DexRectangle Layout.leftMargin: 20 Layout.rightMargin: 20 + // Coin Icon Dex.Image { id: icon @@ -58,49 +60,46 @@ DexRectangle Layout.topMargin: 0 Layout.bottomMargin: 0 } + + // ColumnLayout { spacing: 2 Layout.alignment: Qt.AlignVCenter - Dex.Text + DexLabel { Layout.preferredWidth: parent.width - 15 - text_value: `${ticker}   ${fullname}` - font.pixelSize: Style.textSizeSmall3 + font: Dex.DexTypo.body2 elide: Text.ElideRight wrapMode: Text.NoWrap } - Dex.Text + DexLabel { id: middle_line - property string coin_value: amount - text: coin_value + text_value: coin_value Layout.fillWidth: true elide: Text.ElideRight - color: Dex.CurrentTheme.foregroundColor - font: DexTypo.body2 wrapMode: Label.NoWrap - ToolTip.text: coin_value - Component.onCompleted: font.pixelSize = 11.5 + font: DexTypo.body3 + ToolTip.text: text_value + privacy: true } - Dex.Text + DexLabel { id: bottom_line - property string fiat_value: General.getFiatText(amount, ticker) - text: fiat_value + text_value: fiat_value Layout.fillWidth: true elide: Text.ElideRight - color: Dex.CurrentTheme.foregroundColor - font: DexTypo.body2 + font: DexTypo.body3 wrapMode: Label.NoWrap - ToolTip.text: fiat_value - Component.onCompleted: font.pixelSize = 11.5 + ToolTip.text: text_value + privacy: true } } } diff --git a/atomic_defi_design/Dex/Constants/General.qml b/atomic_defi_design/Dex/Constants/General.qml index 7cfea9c828..d54a8dbd7d 100644 --- a/atomic_defi_design/Dex/Constants/General.qml +++ b/atomic_defi_design/Dex/Constants/General.qml @@ -419,6 +419,14 @@ QtObject { } function getFeesDetail(fees) { + if (privacy_mode) { + return [ + {"label": privacy_text}, + {"label": privacy_text}, + {"label": privacy_text}, + {"label": privacy_text} + ] + } return [ {"label": qsTr("Taker tx fee: "), "fee": fees.base_transaction_fees, "ticker": fees.base_transaction_fees_ticker}, {"label": qsTr("Dex tx fee: "), "fee": fees.fee_to_send_taker_fee, "ticker": fees.fee_to_send_taker_fee_ticker}, @@ -444,6 +452,10 @@ QtObject { } function getSimpleFromPlaceholder(selectedTicker, selectedOrder, sell_ticker_balance) { + if (privacy_mode) + { + return "0" + } if (sell_ticker_balance == 0) { return qsTr("%1 balance is zero").arg(selectedTicker) @@ -498,6 +510,7 @@ QtObject { } function getTxExplorerURL(ticker, txid, add_0x=true) { + if (privacy_mode) return '' if(txid !== '') { const coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) const txid_prefix = (add_0x && coin_info.is_erc_family) ? '0x' : '' @@ -506,6 +519,7 @@ QtObject { } function getAddressExplorerURL(ticker, address) { + if (privacy_mode) return '' if(address !== '') { const coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) return coin_info.explorer_url + addressTxUri(coin_info) + address @@ -514,12 +528,14 @@ QtObject { } function viewTxAtExplorer(ticker, txid, add_0x=true) { + if (privacy_mode) return '' if(txid !== '') { Qt.openUrlExternally(getTxExplorerURL(ticker, txid, add_0x)) } } function viewAddressAtExplorer(ticker, address) { + if (privacy_mode) return '' if(address !== '') { Qt.openUrlExternally(getAddressExplorerURL(ticker, address)) } @@ -564,6 +580,7 @@ QtObject { } function convertUsd(v) { + if (privacy_mode) return '' let rate = API.app.get_rate_conversion("USD", API.app.settings_pg.current_currency) let value = parseFloat(v) / parseFloat(rate) @@ -575,6 +592,7 @@ QtObject { } function formatFiat(received, amount, fiat, precision=2) { + if (privacy_mode) return '' if (precision == 2 && fiat == "BTC") { precision = 8 } @@ -584,6 +602,7 @@ QtObject { } function formatPercent(value, show_prefix=true) { + if (privacy_mode) return '' let prefix = '' if(value > 0) prefix = '+ ' else if(value < 0) { @@ -628,6 +647,7 @@ QtObject { } function formatCrypto(received, amount, ticker, fiat_amount, fiat, precision, trail_zeros) { + if (privacy_mode) return '' return diffPrefix(received) + ticker + " " + formatDouble(amount, precision, trail_zeros) + (fiat_amount ? " (" + formatFiat("", fiat_amount, fiat) + ")" : "") } @@ -786,15 +806,10 @@ QtObject { } function feeText(trade_info, base_ticker, has_info_icon=true, has_limited_space=false) { - - if(!trade_info || !trade_info.trading_fee) return "" - const tx_fee = txFeeText(trade_info, base_ticker, has_info_icon, has_limited_space) const trading_fee = tradingFeeText(trade_info, base_ticker, has_info_icon) const minimum_amount = minimumtradingFeeText(trade_info, base_ticker, has_info_icon) - - return tx_fee + "\n" + trading_fee +"
"+minimum_amount } @@ -813,13 +828,9 @@ QtObject { } function txFeeText(trade_info, base_ticker, has_info_icon=true, has_limited_space=false) { - if(!trade_info || !trade_info.trading_fee) return "" - const has_parent_coin_fees = hasParentCoinFees(trade_info) - var info = qsTr('%1 Transaction Fee'.arg(trade_info.base_transaction_fees_ticker))+': '+ trade_info.base_transaction_fees + " (%1)".arg(getFiatText(trade_info.base_transaction_fees, trade_info.base_transaction_fees_ticker, has_info_icon)) - if (has_parent_coin_fees) { info = info+"
"+qsTr('%1 Transaction Fee'.arg(trade_info.rel_transaction_fees_ticker))+': '+ trade_info.rel_transaction_fees + " (%1)".arg(getFiatText(trade_info.rel_transaction_fees, trade_info.rel_transaction_fees_ticker, has_info_icon)) } diff --git a/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml b/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml index 0d8269efb9..0e83f5af8d 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml @@ -87,9 +87,9 @@ RowLayout Dex.Text { id: middle_line - property string coin_value: !details ? "" : details.balance - text: coin_value + text_value: coin_value + privacy: true Layout.fillWidth: true elide: Text.ElideRight color: Dex.CurrentTheme.foregroundColor @@ -105,13 +105,14 @@ RowLayout property string fiat_value: !details ? "" : General.formatFiat("", details.main_currency_balance, API.app.settings_pg.current_currency) - text: fiat_value + text_value: fiat_value Layout.fillWidth: true elide: Text.ElideRight color: Dex.CurrentTheme.foregroundColor font: DexTypo.body2 wrapMode: Label.NoWrap ToolTip.text: fiat_value + privacy: true Component.onCompleted: font.pixelSize = 11 } } diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml index 1cc7440e66..3e50b624b1 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml @@ -103,7 +103,8 @@ ColumnLayout id: input_price left_text: qsTr("Price") - right_text: right_ticker + right_text: General.coinWithoutSuffix(right_ticker) + right_fontsize: 10 enabled: !(API.app.trading_pg.preferred_order.price !== undefined) color: enabled ? Dex.CurrentTheme.foregroundColor : Dex.CurrentTheme.foregroundColor2 text: backend_price ? backend_price : General.formatDouble(API.app.trading_pg.cex_price) @@ -167,13 +168,15 @@ ColumnLayout height: 36 radius: 18 left_text: sell_mode ? qsTr("Send") : qsTr("Receive") - right_text: left_ticker + right_text: General.coinWithoutSuffix(left_ticker) + right_fontsize: 10 placeholderText: "0" text: API.app.trading_pg.volume onTextChanged: { setVolume(text) reset_fees_state() } + enabled: !General.privacy_mode } OrderFormSubfield @@ -204,9 +207,9 @@ ColumnLayout left_label: "25%" middle_label: "50%" right_label: qsTr("Max") - left_tooltip_text: qsTr("Swap 25% of your tradable balance.") - middle_tooltip_text: qsTr("Swap 50% of your tradable balance.") - right_tooltip_text: qsTr("Swap 100% of your tradable balance.") + left_tooltip_text: General.privacy_mode ? qsTr("Diasble privacy mode to trade") : qsTr("Swap 25% of your tradable balance.") + middle_tooltip_text: General.privacy_mode ? qsTr("Diasble privacy mode to trade") : qsTr("Swap 50% of your tradable balance.") + right_tooltip_text: General.privacy_mode ? qsTr("Diasble privacy mode to trade") : qsTr("Swap 100% of your tradable balance.") } } @@ -419,6 +422,7 @@ ColumnLayout radius: 16 text: API.app.trading_pg.maker_mode ? qsTr("CREATE MAKER SWAP") : qsTr("START TAKER SWAP") font.weight: Font.Medium + enabled: !General.privacy_mode } } } \ No newline at end of file diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml index 87d5456f62..91eb121226 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml @@ -49,7 +49,7 @@ FloatingBackground Layout.preferredWidth: 24 Layout.alignment: Qt.AlignCenter - DefaultText + DexLabel { id: statusText anchors.centerIn: parent @@ -86,34 +86,34 @@ FloatingBackground clip: true - DefaultText + DexLabel { id: baseAmountLabel anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter font.pixelSize: 12 - text: + text_value: { - if (!details) return + if (!details) return BigNumber.config({ DECIMAL_PLACES: 6 }) return new BigNumber(details.base_amount).toString(10) } - privacy: is_placed_order + privacy: true elide: Text.ElideRight maximumLineCount: 1 } - DefaultText + DexLabel { anchors.left: baseAmountLabel.right anchors.leftMargin: 3 anchors.verticalCenter: parent.verticalCenter font.pixelSize: 12 - text: !details ? "" : "(%1 %2)".arg(details.base_amount_current_currency).arg(API.app.settings_pg.current_fiat_sign) - privacy: is_placed_order + text_value: !details ? "" : "(%1 %2)".arg(details.base_amount_current_currency).arg(API.app.settings_pg.current_fiat_sign) + privacy: true elide: Text.ElideRight maximumLineCount: 1 } @@ -128,14 +128,14 @@ FloatingBackground iconSize: 18 } - DefaultText + DexLabel { anchors.right: relAmountInCurrCurrency.left anchors.rightMargin: 3 anchors.verticalCenter: parent.verticalCenter font.pixelSize: 12 - text: + text_value: { if (!details) return @@ -143,12 +143,12 @@ FloatingBackground return new BigNumber(details.rel_amount).toString(10) } - privacy: is_placed_order + privacy: true elide: Text.ElideRight maximumLineCount: 1 } - DefaultText + DexLabel { id: relAmountInCurrCurrency @@ -156,8 +156,8 @@ FloatingBackground anchors.verticalCenter: parent.verticalCenter font.pixelSize: 12 - text: !details ? "" : "(%1 %2)".arg(details.rel_amount_current_currency).arg(API.app.settings_pg.current_fiat_sign) - privacy: is_placed_order + text_value: !details ? "" : "(%1 %2)".arg(details.rel_amount_current_currency).arg(API.app.settings_pg.current_fiat_sign) + privacy: true elide: Text.ElideRight maximumLineCount: 1 } @@ -181,7 +181,7 @@ FloatingBackground source: General.coinIcon(!details ? atomic_app_primary_coin : details.base_coin ?? atomic_app_primary_coin) } - DefaultText + DexLabel { anchors.left: baseIcon.right anchors.leftMargin: 2 @@ -189,13 +189,13 @@ FloatingBackground font.weight: Font.Bold font.pixelSize: 12 - text: !details ? "" : details.base_coin - privacy: is_placed_order + text_value: !details ? "" : details.base_coin + privacy: true elide: Text.ElideRight maximumLineCount: 1 } - DefaultText + DexLabel { visible: clickable @@ -209,7 +209,7 @@ FloatingBackground color: Dex.CurrentTheme.foregroundColor2 } - DefaultText + DexLabel { anchors.right: relCoin.left anchors.rightMargin: 2 @@ -217,8 +217,8 @@ FloatingBackground font.weight: Font.Bold font.pixelSize: 12 - text: !details ? "" : details.rel_coin - privacy: is_placed_order + text_value: !details ? "" : details.rel_coin + privacy: true elide: Text.ElideRight maximumLineCount: 1 } @@ -244,7 +244,7 @@ FloatingBackground Layout.preferredWidth: 24 Layout.alignment: Qt.AlignCenter - DefaultText + DexLabel { anchors.centerIn: parent @@ -255,7 +255,7 @@ FloatingBackground DefaultTooltip { - contentItem: DefaultText + contentItem: DexLabel { text_value: qsTr("Funds are recoverable") font.pixelSize: Style.textSizeSmall4 diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml index 3629b41dae..ab0e0968f7 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml @@ -132,6 +132,7 @@ Item { radius: 7 label.font: DexTypo.body2 text: qsTr("Export CSV") + enabled: list_model.length > 0 && ! General.privacy_mode onClicked: { export_csv_dialog.folder = General.os_file_prefix + API.app.settings_pg.get_export_folder() @@ -142,10 +143,10 @@ Item { DefaultButton { visible: !root.is_history && list_model.length > 0 - enabled: list_model.length > 0 Layout.preferredHeight: 29 radius: 7 label.font: DexTypo.body2 + enabled: list_model.length > 0 && ! General.privacy_mode text: qsTr("Cancel All") iconSource: Qaterial.Icons.close onClicked: API.app.trading_pg.orders.cancel_order(list_model_proxy.get_filtered_ids()) diff --git a/atomic_defi_design/Dex/Exchange/Trade/FeeIcon.qml b/atomic_defi_design/Dex/Exchange/Trade/FeeIcon.qml index a5f65a9ba9..883e5e13d1 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/FeeIcon.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/FeeIcon.qml @@ -24,12 +24,12 @@ DefaultText { visible: mouse_area.containsMouse contentItem: ColumnLayout { - DefaultText { + DexLabel { id: tx_fee_text text_value: General.txFeeText(trade_info, base, false) font.pixelSize: Style.textSizeSmall4 } - DefaultText { + DexLabel { text_value: General.tradingFeeText(trade_info, base, false) font.pixelSize: tx_fee_text.font.pixelSize } diff --git a/atomic_defi_design/Dex/Exchange/Trade/OrderBook/ListDelegate.qml b/atomic_defi_design/Dex/Exchange/Trade/OrderBook/ListDelegate.qml index 25eca66c04..b812cb792f 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/OrderBook/ListDelegate.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/OrderBook/ListDelegate.qml @@ -45,6 +45,10 @@ Item { if (mouse_area.containsMouse) { + if (General.privacy_mode) + { + return qsTr("Orderbook is disabled in privacy mode") + } if (API.app.trading_pg.maker_mode) { return qsTr("Orderbook is disabled while creating maker orders") @@ -109,6 +113,7 @@ Item // Populate form with selected order onClicked: { + if (General.privacy_mode) return if (is_mine) return if (API.app.trading_pg.maker_mode) return diff --git a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/List.qml b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/List.qml index c9ea3a02df..c900b3ca17 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/List.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/List.qml @@ -27,8 +27,6 @@ DexListView delegate: ClipRRect { property var details: model - readonly property bool is_placed_order: !details ? false : - details.order_id !== '' property bool expanded: order_list_view.currentIndex === index @@ -78,7 +76,7 @@ DexListView height: width anchors.centerIn: parent running: !isSwapDone(details.order_status) && Qt.platform.os != "osx" - DefaultText + DexLabel { anchors.centerIn: parent font.pixelSize: getStatusFontSize(details.order_status) @@ -105,13 +103,13 @@ DexListView anchors.verticalCenter: parent.verticalCenter } - DefaultText + DexLabel { id: base_amount text_value: !details ? "" : General.formatCrypto("", details.base_amount, details.base_coin).replace(" ","
") font: rel_amount.font - privacy: is_placed_order + privacy: true anchors.verticalCenter: parent.verticalCenter } } @@ -150,7 +148,7 @@ DexListView height: width anchors.verticalCenter: parent.verticalCenter } - DefaultText + DexLabel { id: rel_amount text_value: !details ? "" : @@ -162,7 +160,7 @@ DexListView weight: Font.Normal }) anchors.verticalCenter: parent.verticalCenter - privacy: is_placed_order + privacy: true } } @@ -194,8 +192,9 @@ DexListView Layout.fillWidth: true Layout.fillHeight: true verticalAlignment: Label.AlignVCenter - text: !details ? "" : + text_value: !details ? "" : General.formatCrypto("", details.base_amount, details.base_coin) + privacy: true } DexLabel { @@ -203,8 +202,9 @@ DexListView Layout.fillHeight: true verticalAlignment: Label.AlignVCenter horizontalAlignment: Text.AlignRight - text: !details ? "" : + text_value: !details ? "" : General.formatCrypto("", details.rel_amount, details.rel_coin) + privacy: true } } @@ -215,20 +215,22 @@ DexListView anchors.horizontalCenter: parent.horizontalCenter height: 20 opacity: .6 - DefaultText + DexLabel { Layout.fillWidth: true - Layout.fillHeight: true + Layout.fillHeight: true verticalAlignment: Label.AlignVCenter - text: "%1 %2".arg(API.app.settings_pg.current_currency).arg(details.base_amount_current_currency) + text_value: "%1 %2".arg(API.app.settings_pg.current_currency).arg(details.base_amount_current_currency) + privacy: true } - DefaultText + DexLabel { Layout.fillWidth: true Layout.fillHeight: true verticalAlignment: Label.AlignVCenter horizontalAlignment: Text.AlignRight - text: "%1 %2".arg(API.app.settings_pg.current_currency).arg(details.rel_amount_current_currency) + text_value: "%1 %2".arg(API.app.settings_pg.current_currency).arg(details.rel_amount_current_currency) + privacy: true } } @@ -244,7 +246,8 @@ DexListView Layout.fillWidth: true Layout.fillHeight: true verticalAlignment: Label.AlignVCenter - text: !details ? "" : details.date?? "" + text_value: !details ? "" : details.date?? "" + privacy: true } Item { @@ -283,7 +286,7 @@ DexListView contentItem: ColumnLayout { - DefaultText { + DexLabel { text_value: qsTr("Funds are recoverable") font.pixelSize: Constants.Style.textSizeSmall4 } diff --git a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubCoinSelector.qml b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubCoinSelector.qml index bf1938c322..852291ca5f 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubCoinSelector.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubCoinSelector.qml @@ -174,6 +174,7 @@ DexListView text_value: model.balance.replace(" ","") font.pixelSize: 14 wrapMode: Text.NoWrap + privacy: true } DexLabel @@ -184,6 +185,7 @@ DexListView text_value: "%1".arg(General.getFiatText(model.balance, model.ticker, false)) font.pixelSize: 14 wrapMode: Text.NoWrap + privacy: true } } } diff --git a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Trade.qml b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Trade.qml index 6a92ed7e0e..0eccd7fdbb 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Trade.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Trade.qml @@ -160,7 +160,7 @@ ClipRRect // Trade Card opacity: .85 } - DefaultText // Description + DexLabel // Description { anchors.topMargin: 10 font.pixelSize: Constants.Style.textSizeSmall4 @@ -231,7 +231,7 @@ ClipRRect // Trade Card radius: 20 visible: !coinSelectorSimplified.visible && has_coins_with_balance - DefaultText // From Text + DexLabel // From Text { id: _fromTitle anchors.top: parent.top @@ -242,7 +242,7 @@ ClipRRect // Trade Card font.pixelSize: Constants.Style.textSizeSmall4 } - Text // Tradable Balance + DexLabel // Tradable Balance { readonly property int _maxWidth: 140 @@ -252,10 +252,11 @@ ClipRRect // Trade Card anchors.verticalCenter: _fromTitle.verticalCenter anchors.right: parent.right anchors.rightMargin: 17 - text: qsTr("%1").arg(max_trade_volume) // This is slow to appear + text_value: qsTr("%1").arg(max_trade_volume) // This is slow to appear font.pixelSize: Constants.Style.textSizeSmall2 elide: Text.ElideRight color: DexTheme.foregroundColorLightColor1 + privacy: true DefaultImage { @@ -282,6 +283,10 @@ ClipRRect // Trade Card visible: parent.containsMouse text: { + if (General.privacy_mode) + { + return qsTr("Balance: ") + qsTr("****") + } let balance = Constants.API.app.portfolio_pg.portfolio_mdl.coin_balance(selectedTicker); return qsTr("Balance: ") + Constants.API.app.portfolio_pg.portfolio_mdl.coin_balance(selectedTicker) + ' (' + parent.parent.text + ' tradable)' } @@ -300,7 +305,7 @@ ClipRRect // Trade Card AmountField // Amount { id: _fromValue - enabled: sell_ticker_balance == 0 ? false : waiting_for_sell_coin_info ? false : true + enabled: sell_ticker_balance == 0 ? false : waiting_for_sell_coin_info ? false : General.privacy_mode ? false : true anchors.bottom: parent.bottom anchors.bottomMargin: 19 anchors.left: parent.left @@ -329,7 +334,7 @@ ClipRRect // Trade Card Component.onCompleted: text = "" } - Text // Amount In Fiat + DexLabel // Amount In Fiat { enabled: _fromValue.text visible: enabled @@ -340,7 +345,8 @@ ClipRRect // Trade Card font.pixelSize: Constants.Style.textSizeSmall1 color: DexTheme.foregroundColor opacity: .9 - text: enabled ? Constants.General.getFiatText(_fromValue.text, selectedTicker) : "" + text_value: enabled ? Constants.General.getFiatText(_fromValue.text, selectedTicker) : "" + privacy: true } Rectangle // Select ticker button @@ -387,7 +393,7 @@ ClipRRect // Trade Card source: Constants.General.coinIcon(selectedTicker) } - DefaultText + DexLabel { id: _selectedTickerText @@ -403,7 +409,7 @@ ClipRRect // Trade Card wrapMode: Text.NoWrap - DefaultText + DexLabel { id: _selectedTickerTypeText @@ -432,16 +438,13 @@ ClipRRect // Trade Card ClickableText // MAX Button { id: _maxClickableLabel - anchors.right: _selectTickerBut.left anchors.rightMargin: 10 anchors.verticalCenter: _selectTickerBut.verticalCenter - visible: selectedTicker !== "" - text: qsTr("MAX") color: Dex.CurrentTheme.foregroundColor2 - + enabled: !General.privacy_mode onClicked: _fromValue.text = max_trade_volume } @@ -464,7 +467,7 @@ ClipRRect // Trade Card && !coinSelectorSimplified.visible && has_coins_with_balance - DefaultText + DexLabel { anchors.fill: parent anchors.leftMargin: 17 @@ -487,7 +490,7 @@ ClipRRect // Trade Card background: Rectangle { color: swap_from_card.color} } - DefaultText // Amount In Fiat + DexLabel // Amount In Fiat { enabled: parseFloat(_toValue.text) > 0 && _toValue.text != "" anchors.top: _toValue.bottom @@ -533,7 +536,7 @@ ClipRRect // Trade Card } // When no order is currently selected. - DefaultText + DexLabel { id: _bestOrderNoTickerText @@ -567,7 +570,7 @@ ClipRRect // Trade Card } // Ticker (When a best order is currently selected) - DefaultText + DexLabel { id: _bestOrderTickerText @@ -584,7 +587,7 @@ ClipRRect // Trade Card font.pixelSize: Constants.Style.textSizeSmall2 wrapMode: Text.NoWrap - DefaultText + DexLabel { id: _bestOrderTickerTypeText @@ -623,14 +626,14 @@ ClipRRect // Trade Card && !coinSelectorSimplified.visible && has_coins_with_balance - DefaultText + DexLabel { Layout.rightMargin: 120 font.pixelSize: Constants.Style.textSizeSmall3 text: qsTr("Price") } - DefaultText + DexLabel { Layout.alignment: Qt.AlignRight font.pixelSize: Constants.Style.textSizeSmall3 @@ -714,7 +717,10 @@ ClipRRect // Trade Card function getAlert() { - console.log("_fromValue.text: " + _fromValue.text) + if (Constants.General.privacy_mode) + { + return qsTr("Disable privacy mode to trade.") + } var right_ticker = Constants.API.app.trading_pg.market_pairs_mdl.right_selected_coin var base_ticker = Constants.API.app.trading_pg.market_pairs_mdl.base_selected_coin var rel_ticker = Constants.API.app.trading_pg.market_pairs_mdl.rel_selected_coin @@ -932,7 +938,7 @@ ClipRRect // Trade Card anchors.fill: parent } - DefaultText + DexLabel { anchors.centerIn: parent text: qsTr("Calculating fee estimate... ") @@ -959,7 +965,7 @@ ClipRRect // Trade Card Component.onCompleted: _feesCard.height += 10 Component.onDestruction: _feesCard.height -= 10 - DefaultText + DexLabel { Layout.alignment: Qt.AlignLeft Layout.leftMargin: 10 @@ -967,7 +973,7 @@ ClipRRect // Trade Card font.pixelSize: Constants.Style.textSizeSmall3 } - DefaultText + DexLabel { Layout.alignment: Qt.AlignRight Layout.rightMargin: 10 diff --git a/atomic_defi_design/Dex/Sidebar/Center.qml b/atomic_defi_design/Dex/Sidebar/Center.qml index 89ab94df97..a3e2586d90 100644 --- a/atomic_defi_design/Dex/Sidebar/Center.qml +++ b/atomic_defi_design/Dex/Sidebar/Center.qml @@ -15,6 +15,25 @@ MouseArea height: lineHeight * 5 hoverEnabled: true + Connections + { + target: API.app.timesyncCheckerService + + function onTimesyncInfoChanged() + { + if (!API.app.timesyncCheckerService.timesyncInfo) + { + _dexLine.timesyncInfo = false + if (currentLineType === Main.LineType.DEX) currentLineType = Main.LineType.Portfolio + root.lineSelected(Main.LineType.Portfolio); + } + else + { + _dexLine.timesyncInfo = true + } + } + } + Connections { target: parent.parent @@ -84,12 +103,15 @@ MouseArea FigurativeLine { id: _dexLine + property var timesyncInfo: API.app.timesyncCheckerService.timesyncInfo Layout.fillWidth: true type: Main.LineType.DEX + label.color: timesyncInfo ? Dex.CurrentTheme.foregroundColor : Dex.CurrentTheme.textDisabledColor label.text: qsTr("DEX") // isExpanded ? qsTr("DEX") : "" icon.source: General.image_path + "menu-exchange-white.svg" - onClicked: lineSelected(type) + onClicked: timesyncInfo ? lineSelected(type) : null + disabled_tt_text: timesyncInfo ? "" : qsTr("DEX is disabled due to system clock synchronization issues. Please check your device time settings.") } FigurativeLine diff --git a/atomic_defi_design/Dex/Sidebar/FigurativeLine.qml b/atomic_defi_design/Dex/Sidebar/FigurativeLine.qml index 540ca6e11b..a747a36e7f 100644 --- a/atomic_defi_design/Dex/Sidebar/FigurativeLine.qml +++ b/atomic_defi_design/Dex/Sidebar/FigurativeLine.qml @@ -1,12 +1,14 @@ import QtQuick 2.12 import "../Components" +import "../Constants" import Dex.Themes 1.0 as Dex // FigurativeLine acts the same as Line but contains a figurative icon on the left of its label Line { property alias icon: _icon + property string disabled_tt_text: "" DefaultImage { @@ -26,4 +28,13 @@ Line currentLineType === type && type != Main.LineType.Support ? Dex.CurrentTheme.sidebarLineTextSelected : Dex.CurrentTheme.foregroundColor } + + DexTooltip + { + visible: mouseArea.containsMouse && disabled_tt_text + delay: 500 + timeout: 5000 + text: disabled_tt_text + font.pixelSize: Style.textSizeSmall4 + } } diff --git a/atomic_defi_design/Dex/Wallet/SendResult.qml b/atomic_defi_design/Dex/Wallet/SendResult.qml index 8ac93c37a5..c7db8ebd8f 100644 --- a/atomic_defi_design/Dex/Wallet/SendResult.qml +++ b/atomic_defi_design/Dex/Wallet/SendResult.qml @@ -16,7 +16,7 @@ MultipageModalContent property string custom_amount property alias tx_hash: tx_hash.text_value - titleText: qsTr("Transaction Complete!") + titleText: qsTr("Transaction Broadcast!") // Transaction Hash TitleText diff --git a/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml b/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml index ab69b7cba4..35bad4fb0d 100644 --- a/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml +++ b/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml @@ -124,7 +124,7 @@ MultipageModal TextEditWithTitle { title: qsTr("Date") - text: !details ? "" : details.timestamp === 0 ? qsTr("Unconfirmed"): details.date + text: !details ? "" : details.timestamp === 0 ? qsTr("Awaiting confirmation"): details.timestamp label.font.pixelSize: 13 } diff --git a/ci_tools_atomic_dex/ci_scripts/choosenim.sh b/ci_tools_atomic_dex/ci_scripts/choosenim.sh new file mode 100755 index 0000000000..b255b48ab1 --- /dev/null +++ b/ci_tools_atomic_dex/ci_scripts/choosenim.sh @@ -0,0 +1,196 @@ +#!/bin/sh +# Copyright 2017 Dominik Picheta and Nim developers. +# +# Licensed under the BSD-3-Clause license. +# +# This script performs some platform detection, downloads the latest version +# of choosenim and initiates its installation. + +set -u +set -e + + +url_prefix="https://github.com/dom96/choosenim/releases/download/" + +temp_prefix="${TMPDIR:-/tmp}" + +CHOOSE_VERSION="${CHOOSENIM_CHOOSE_VERSION:-stable}" + +need_tty=yes +debug="" + +has_curl() { + command -v curl >/dev/null 2>&1 +} + +has_wget() { + command -v wget >/dev/null 2>&1 +} + +install() { + get_platform || return 1 + local platform=$RET_VAL + local stable_version=0.8.4 + local filename="choosenim-$stable_version"_"$platform" + local url="$url_prefix"v"$stable_version/$filename" + local ext="" + + case $platform in + *macosx_amd64* | *linux_amd64* ) + ;; + *windows_amd64* ) + # Download ZIP for Windows + local ext=".exe" + local filename="$filename$ext" + local url="$url$ext" + ;; + * ) + say_err "Sorry, your platform ($platform) is not supported by choosenim." + say_err "You will need to install Nim using an alternative method." + say_err "See the following link for more info: https://nim-lang.org/install.html" + exit 1 + ;; + esac + + say "Downloading $filename" + if has_curl; then + curl -sSfL "$url" -o "$temp_prefix/$filename" + elif has_wget; then + wget -qO "$temp_prefix/$filename" "$url" + fi + chmod +x "$temp_prefix/$filename" + + if [ "$need_tty" = "yes" ]; then + # The installer is going to want to ask for confirmation by + # reading stdin. This script was piped into `sh` though and + # doesn't have stdin to pass to its children. Instead we're going + # to explicitly connect /dev/tty to the installer's stdin. + if [ ! -t 1 ]; then + err "Unable to run interactively. Run with -y to accept defaults." + fi + + # Install Nim from desired channel. + "$temp_prefix/$filename" $CHOOSE_VERSION --firstInstall ${debug} < /dev/tty + else + "$temp_prefix/$filename" $CHOOSE_VERSION --firstInstall -y ${debug} + fi + + # Copy choosenim binary to Nimble bin. + local nimbleBinDir=`"$temp_prefix/$filename" --getNimbleBin` + cp "$temp_prefix/$filename" "$nimbleBinDir/choosenim$ext" + say "ChooseNim installed in $nimbleBinDir" + say "You must now ensure that the Nimble bin dir is in your PATH." + if [ "$platform" != "windows_amd64" ]; then + say "Place the following line in the ~/.profile or ~/.bashrc file." + say " export PATH=$nimbleBinDir:\$PATH" + case "${SHELL:=sh}" in + *fish*) + say "Running fish shell?" + say "set -ga fish_user_paths $nimbleBinDir" + ;; + esac + fi +} + +get_platform() { + # Get OS/CPU info and store in a `myos` and `mycpu` variable. + local ucpu=`uname -m` + local uos=`uname` + local ucpu=`echo $ucpu | tr "[:upper:]" "[:lower:]"` + local uos=`echo $uos | tr "[:upper:]" "[:lower:]"` + + case $uos in + *linux* ) + local myos="linux" + ;; + *dragonfly* ) + local myos="freebsd" + ;; + *freebsd* ) + local myos="freebsd" + ;; + *openbsd* ) + local myos="openbsd" + ;; + *netbsd* ) + local myos="netbsd" + ;; + *darwin* ) + local myos="macosx" + if [ "$HOSTTYPE" = "x86_64" ] ; then + local ucpu="amd64" + fi + if [ "$HOSTTYPE" = "arm64" ] ; then + # TODO: We don't have arm binaries for choosenim so far, rely on Rosetta. + local ucpu="amd64" + fi + ;; + *aix* ) + local myos="aix" + ;; + *solaris* | *sun* ) + local myos="solaris" + ;; + *haiku* ) + if has_curl; then + stable_version=`curl -sSfL https://nim-lang.org/choosenim/stable` + elif has_wget; then + stable_version=`wget -qO - https://nim-lang.org/choosenim/stable` + fi + err "unknown operating system: $uos" + ;; + esac + + case $ucpu in + *i386* | *i486* | *i586* | *i686* | *bepc* | *i86pc* ) + local mycpu="i386" ;; + *amd*64* | *x86-64* | *x86_64* ) + local mycpu="amd64" ;; + *sparc*|*sun* ) + local mycpu="sparc" + if [ "$(isainfo -b)" = "64" ]; then + local mycpu="sparc64" + fi + ;; + *ppc64* ) + local mycpu="powerpc64" ;; + *power*|*ppc* ) + local mycpu="powerpc" ;; + *mips* ) + local mycpu="mips" ;; + *arm*|*armv6l* ) + local mycpu="arm" ;; + *aarch64* ) + local mycpu="arm64" ;; + *) + err "unknown processor: $ucpu" + ;; + esac + + RET_VAL="$myos"_"$mycpu" +} + +say() { + echo "choosenim-init: $1" +} + +say_err() { + say "Error: $1" >&2 +} + +err() { + say_err "$1" + exit 1 +} + + +# check if we have to use /dev/tty to prompt the user +while getopts "dy" opt; do + case "$opt" in + y) need_tty=no + ;; + d) debug="--debug" + esac +done + +install diff --git a/cmake/project.metadata.cmake b/cmake/project.metadata.cmake index e15cabe5e2..b799e8dbfd 100644 --- a/cmake/project.metadata.cmake +++ b/cmake/project.metadata.cmake @@ -7,7 +7,7 @@ set(DEX_DISPLAY_NAME "Komodo Wallet") set(DEX_MAINTENANCE_TOOL_NAME "Komodo Wallet Maintenance Tool") set(DEX_COMPANY "KomodoPlatform") set(DEX_WEBSITE "https://atomicdex.io/") -set(DEX_VERSION "0.7.2") +set(DEX_VERSION "0.8.0") set(DEX_SUPPORT_PAGE "https://support.komodoplatform.com/support/home") set(DEX_DISCORD "https://komodoplatform.com/discord") set(DEX_TWITTER "https://twitter.com/AtomicDEX") diff --git a/src/app/app.cpp b/src/app/app.cpp index 8036d57e47..f2bf63ef11 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -44,6 +44,7 @@ #include "atomicdex/services/price/komodo_prices/komodo.prices.provider.hpp" #include "atomicdex/services/price/coingecko/coingecko.wallet.charts.hpp" #include "atomicdex/services/price/orderbook.scanner.service.hpp" +#include "atomicdex/services/sync/timesync.checker.service.hpp" namespace { @@ -498,6 +499,7 @@ namespace atomic_dex system_manager_.create_system(system_manager_); system_manager_.create_system(); system_manager_.create_system(); + system_manager_.create_system(); system_manager_.create_system(system_manager_); system_manager_.create_system(system_manager_); system_manager_.create_system( @@ -910,7 +912,18 @@ namespace atomic_dex } } // namespace atomic_dex -//! update checker +//! time sync checker +namespace atomic_dex +{ + timesync_checker_service* application::get_timesync_checker_service() const + { + auto ptr = const_cast(std::addressof(system_manager_.get_system())); + assert(ptr != nullptr); + return ptr; + } +} // namespace atomic_dex + +//! zcash_params checker namespace atomic_dex { zcash_params_service* application::get_zcash_params_service() const diff --git a/src/app/app.hpp b/src/app/app.hpp index e6d26b7fd1..6e1e93a9fe 100644 --- a/src/app/app.hpp +++ b/src/app/app.hpp @@ -50,6 +50,7 @@ #include "atomicdex/services/price/global.provider.hpp" #include "atomicdex/services/update/update.checker.service.hpp" #include "atomicdex/services/update/zcash.params.service.hpp" +#include "atomicdex/services/sync/timesync.checker.service.hpp" #include "atomicdex/utilities/qt.utilities.hpp" namespace ag = antara::gaming; @@ -75,6 +76,7 @@ namespace atomic_dex Q_PROPERTY(settings_page* settings_pg READ get_settings_page NOTIFY settingsPageChanged) Q_PROPERTY(qt_wallet_manager* wallet_mgr READ get_wallet_mgr NOTIFY walletMgrChanged) Q_PROPERTY(update_checker_service* updateCheckerService READ get_update_checker_service NOTIFY updateCheckerServiceChanged) + Q_PROPERTY(timesync_checker_service* timesyncCheckerService READ get_timesync_checker_service NOTIFY timesyncCheckerServiceChanged) Q_PROPERTY(zcash_params_service* zcash_params READ get_zcash_params_service NOTIFY zcashParamsServiceChanged) //! Private function @@ -135,6 +137,7 @@ namespace atomic_dex qt_wallet_manager* get_wallet_mgr() const; internet_service_checker* get_internet_checker() const; update_checker_service* get_update_checker_service() const; + timesync_checker_service* get_timesync_checker_service() const; [[nodiscard]] zcash_params_service* get_zcash_params_service() const; exporter_service* get_exporter_service() const; @@ -180,6 +183,7 @@ namespace atomic_dex void walletPageChanged(); void ordersChanged(); void updateCheckerServiceChanged(); + void timesyncCheckerServiceChanged(); void zcashParamsServiceChanged(); void tradingPageChanged(); void settingsPageChanged(); diff --git a/src/core/atomicdex/constants/dex.constants.hpp b/src/core/atomicdex/constants/dex.constants.hpp index 99ed0c8c23..e9a8cc18bf 100644 --- a/src/core/atomicdex/constants/dex.constants.hpp +++ b/src/core/atomicdex/constants/dex.constants.hpp @@ -11,8 +11,7 @@ namespace atomic_dex g_primary_dex_coin, g_second_primary_dex_coin, "BTC-segwit", - "DGB-segwit", - "VOTE2024", + "DGB-segwit" }; inline const std::vector g_faucet_coins{ "DOC", @@ -21,12 +20,7 @@ namespace atomic_dex "IRISTEST", }; inline const std::vector g_vote_coins{ - "KIP0002", - "KIP0003", - "KIP0004", - "VOTE2024", }; - inline const std::vector g_wallet_only_coins{ "ARRR-BEP20", "RBTC", @@ -34,10 +28,6 @@ namespace atomic_dex "PAXG-ERC20", "USDT-ERC20", "XPM", - "KIP0002", - "KIP0003", - "KIP0004", - "VOTE2024", "ATOM" }; } diff --git a/src/core/atomicdex/services/kdf/kdf.service.cpp b/src/core/atomicdex/services/kdf/kdf.service.cpp index 741a21fdea..71469bd2e3 100644 --- a/src/core/atomicdex/services/kdf/kdf.service.cpp +++ b/src/core/atomicdex/services/kdf/kdf.service.cpp @@ -2227,6 +2227,17 @@ namespace atomic_dex .passphrase = std::move(passphrase), .rpc_password = std::move(rpcpass) == "" ? std::move(atomic_dex::gen_random_password()) : std::move(rpcpass) }; + + auto dbdir_parent = std::filesystem::path(utils::get_atomic_dex_data_folder() / "kdf"); + auto old_dbdir_parent = std::filesystem::path(utils::get_atomic_dex_data_folder() / "mm2"); + if (not std::filesystem::exists(dbdir_parent)) + { + if (std::filesystem::exists(old_dbdir_parent)) + { + std::filesystem::rename(old_dbdir_parent, dbdir_parent); + } + } + kdf::set_system_manager(m_system_manager); kdf::set_rpc_password(cfg.rpc_password); json json_cfg; diff --git a/src/core/atomicdex/services/sync/timesync.checker.service.cpp b/src/core/atomicdex/services/sync/timesync.checker.service.cpp new file mode 100644 index 0000000000..2909368a4e --- /dev/null +++ b/src/core/atomicdex/services/sync/timesync.checker.service.cpp @@ -0,0 +1,118 @@ +/****************************************************************************** + * Copyright © 2013-2024 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#include +#include "atomicdex/services/sync/timesync.checker.service.hpp" +#include "atomicdex/utilities/cpprestsdk.utilities.hpp" + +namespace +{ + constexpr const char* g_timesync_endpoint = "https://worldtimeapi.org"; + web::http::client::http_client_config g_timesync_cfg{[]() + { + web::http::client::http_client_config cfg; + cfg.set_validate_certificates(false); + cfg.set_timeout(std::chrono::seconds(5)); + return cfg; + }()}; + t_http_client_ptr g_timesync_client = std::make_unique(FROM_STD_STR(g_timesync_endpoint), g_timesync_cfg); + pplx::cancellation_token_source g_synctoken_source; + + pplx::task + async_fetch_timesync() + { + web::http::http_request req; + req.set_method(web::http::methods::GET); + req.set_request_uri(FROM_STD_STR("api/timezone/UTC")); + return g_timesync_client->request(req, g_synctoken_source.get_token()); + } + + bool get_timesync_info_rpc(web::http::http_response resp_http) + { + using namespace std::string_literals; + nlohmann::json resp; + bool sync_ok = false; + std::string resp_str = TO_STD_STR(resp_http.extract_string(true).get()); + if (resp_http.status_code() != 200) + { + SPDLOG_ERROR("Cannot reach the endpoint [{}]: {}", g_timesync_endpoint); + } + else + { + resp = nlohmann::json::parse(resp_str); + int64_t epoch_ts = resp["unixtime"]; + int64_t current_ts = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + int64_t ts_diff = epoch_ts - current_ts; + if (abs(ts_diff) < 60) + { + sync_ok = true; + } + } + return sync_ok; + } +} // namespace + + +namespace atomic_dex +{ + timesync_checker_service::timesync_checker_service(entt::registry& registry, QObject* parent) : QObject(parent), system(registry) + { + m_timesync_clock = std::chrono::high_resolution_clock::now(); + m_timesync_status = true; + fetch_timesync_status(); + } + + void timesync_checker_service::update() + { + using namespace std::chrono_literals; + + int64_t m_timesync_clock_ts = std::chrono::duration_cast(m_timesync_clock.time_since_epoch()).count(); + int64_t now_ts = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + int64_t ts_diff = now_ts - m_timesync_clock_ts; + if (abs(ts_diff) >= 60) + { + fetch_timesync_status(); + m_timesync_clock = std::chrono::high_resolution_clock::now(); + } + } + + void timesync_checker_service::fetch_timesync_status() + { + if (is_timesync_fetching) + { + return; + } + is_timesync_fetching = true; + emit isTimesyncFetchingChanged(); + async_fetch_timesync() + .then([this](web::http::http_response resp) { + this->m_timesync_status = get_timesync_info_rpc(resp); + emit timesyncInfoChanged(); + }) + .then(&handle_exception_pplx_task); + is_timesync_fetching = false; + emit isTimesyncFetchingChanged(); + + } + + bool timesync_checker_service::get_timesync_info() const + { + return *m_timesync_status; + } + +} // namespace atomic_dex + + diff --git a/src/core/atomicdex/services/sync/timesync.checker.service.hpp b/src/core/atomicdex/services/sync/timesync.checker.service.hpp new file mode 100644 index 0000000000..54b3f73bf5 --- /dev/null +++ b/src/core/atomicdex/services/sync/timesync.checker.service.hpp @@ -0,0 +1,60 @@ +/****************************************************************************** + * Copyright © 2013-2024 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +#include +#include + +#include +#include + +#include + +namespace atomic_dex +{ + class timesync_checker_service final : public QObject, public ag::ecs::pre_update_system + { + Q_OBJECT + + Q_PROPERTY(QVariant timesyncInfo READ get_timesync_info NOTIFY timesyncInfoChanged) + Q_PROPERTY(bool isTimesyncFetching READ get_is_timesync_fetching NOTIFY isTimesyncFetchingChanged) + + using t_timesync_time_point = std::chrono::high_resolution_clock::time_point; + using t_bool_synchronized = boost::synchronized_value; + + t_bool_synchronized m_timesync_status; + t_timesync_time_point m_timesync_clock; + t_bool_synchronized is_timesync_fetching; + + void fetch_timesync_status(); + + public: + explicit timesync_checker_service(entt::registry& registry, QObject* parent = nullptr); + ~timesync_checker_service() final = default; + + void update() final; + + [[nodiscard]] bool get_timesync_info() const; + [[nodiscard]] bool get_is_timesync_fetching() const noexcept { return *is_timesync_fetching; } + + signals: + void timesyncInfoChanged(); + void isTimesyncFetchingChanged(); + }; +} // namespace atomic_dex + +REFL_AUTO(type(atomic_dex::timesync_checker_service)) diff --git a/src/core/atomicdex/version/version.hpp b/src/core/atomicdex/version/version.hpp index 55dd6fcdd0..921a490787 100644 --- a/src/core/atomicdex/version/version.hpp +++ b/src/core/atomicdex/version/version.hpp @@ -21,24 +21,24 @@ namespace atomic_dex constexpr const char* get_version() { - return "0.7.2-beta"; + return "0.8.0-beta"; } constexpr int get_num_version() noexcept { - return 72; + return 80; } constexpr const char* get_raw_version() { - return "0.7.2"; + return "0.8.0"; } constexpr const char* get_precedent_raw_version() { - return "0.7.1"; + return "0.7.2"; } } // namespace atomic_dex diff --git a/vcpkg.json b/vcpkg.json index 6d6777bd47..d53535cd46 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "komodo-wallet-desktop", - "version-string": "0.7.2", + "version-string": "0.8.0", "dependencies": [ "entt", "boost-multiprecision",