diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a6c06597fa..2d72a9c0b0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,6 +1,6 @@ --- name: Bug report -about: Something looks wierd or doesn't work as expected? Let us know the details so we can fix it! +about: Something looks weird or doesn't work as expected? Let us know the details so we can fix it! title: "[BUG]: " labels: bug assignees: '' @@ -26,10 +26,10 @@ 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 ] - - AtomicDEX Version: [e.g. 0.5.7] + - Komodo Wallet Version: [e.g. 0.6.1] - Build branch: [e.g. master/dev] **Additional context** - Add any related context about the problem here (e.g. screen resolution, mining activity on address) - - Attach [log files](https://forum.komodoplatform.com/t/accessing-atomicdex-desktop-log-files/540) + - Attach [log files](https://forum.komodoplatform.com/t/accessing-komodo-wallet-desktop-log-files/540) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 11f973fa6c..6a2d2d5040 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -16,9 +16,9 @@ A clear and concise description of how your solution could be implemented. **Describe alternatives you've considered** -Have you considered any alternative approaches to solving to the problem? +Have you considered any alternative approaches to solving the problem? **Additional context** For visual features, screenshots are great to include. -If your request is similar to a feature frm a different app, please include a link. +If your request is similar to a feature from a different app, please include a link. diff --git a/.github/ISSUE_TEMPLATE/support.md b/.github/ISSUE_TEMPLATE/support.md index c3b49f6c2a..edf217c51b 100644 --- a/.github/ISSUE_TEMPLATE/support.md +++ b/.github/ISSUE_TEMPLATE/support.md @@ -8,5 +8,5 @@ assignees: '' --- [Komodo Platform Discord Support Channel](https://discord.gg/RRZ8hzc) -[Komodo Platform Forum](https://forum.komodoplatform.com/t/atomicdex-desktop-collection/541) +[Komodo Platform Forum](https://forum.komodoplatform.com/t/komodo-wallet-desktop-collection/541) [Develper Documentation](https://developers.komodoplatform.com/) \ No newline at end of file diff --git a/.github/workflows/firodex-desktop-ci.yml b/.github/workflows/firodex-desktop-ci.yml index 93238ce19e..4826cc8730 100644 --- a/.github/workflows/firodex-desktop-ci.yml +++ b/.github/workflows/firodex-desktop-ci.yml @@ -18,7 +18,6 @@ env: DEX_DISPLAY_NAME: "Firo Dex" DEX_COMPANY: "Firo" DEX_WEBSITE: "https://firo.org/" - jobs: ci-flow: @@ -80,6 +79,9 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} submodules: 'true' + - name: Expose GitHub Runtime Env + uses: crazy-max/ghaction-github-runtime@v2 + - name: Setup Python uses: actions/setup-python@v4 with: @@ -108,7 +110,7 @@ jobs: - name: Install QT (macOS) if: runner.os == 'macOS' - uses: jurplel/install-qt-action@v3.0.0 + uses: jurplel/install-qt-action@v3.3.0 with: version: ${{ matrix.qt }} host: ${{ matrix.host }} @@ -121,7 +123,7 @@ jobs: - name: Install QT (Linux) if: runner.os == 'Linux' - uses: jurplel/install-qt-action@v3.0.0 + uses: jurplel/install-qt-action@v3.3.0 with: version: ${{ matrix.qt }} host: ${{ matrix.host }} @@ -133,7 +135,7 @@ jobs: - name: Install QT (Windows) if: runner.os == 'Windows' - uses: jurplel/install-qt-action@v3.0.0 + uses: jurplel/install-qt-action@v3.3.0 with: version: ${{ matrix.qt }} host: ${{ matrix.host }} @@ -149,13 +151,24 @@ jobs: run: | export DEBIAN_FRONTEND=noninteractive export SHELL=/bin/bash - echo "CHOOSENIM_CHOOSE_VERSION=1.6.10" >> $GITHUB_ENV - export CHOOSENIM_CHOOSE_VERSION=1.6.10 + 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 export PATH=/home/runner/.nimble/bin:$PATH - chmod +x /home/runner/.choosenim/toolchains/nim-1.6.10/bin/* + chmod +x /home/runner/.choosenim/toolchains/nim-1.6.2/bin/* + + - name: Install nim (MacOS) + if: runner.os == 'macOS' + 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 + export PATH=/Users/runner/.nimble/bin:$PATH + chmod +x /Users/runner/.choosenim/toolchains/nim-1.6.2/bin/* - name: Install deps (Linux) if: runner.os == 'Linux' @@ -182,10 +195,9 @@ jobs: echo "CC=clang-12" >> $GITHUB_ENV - name: vcpkg deps (All) - uses: lukka/run-vcpkg@v10 + uses: lukka/run-vcpkg@v11 with: vcpkgDirectory: '${{ github.workspace }}/ci_tools_atomic_dex/vcpkg-repo' - appendedCacheKey: ${{ hashFiles('vcpkg.json') }} vcpkgJsonGlob: 'vcpkg.json' @@ -208,9 +220,7 @@ jobs: # p12-file-base64: ${{ secrets.CERTIFICATES_INSTALLER_P12 }} # p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }} - - - - name: Build AtomicDEX (MacOS) + - name: Build Komodo Wallet (MacOS) if: runner.os == 'macOS' run: | xcrun --sdk macosx --show-sdk-path @@ -225,6 +235,7 @@ jobs: export ASC_PUBLIC_ID="${{ secrets.ASC_PUBLIC_ID }}" export QT_INSTALL_CMAKE_PATH=${{ github.workspace }}/Qt/${{ matrix.qt }}/clang_64/lib/cmake export QT_ROOT=${{ github.workspace }}/Qt/${{ matrix.qt }} + export PATH=/Users/runner/.nimble/bin:$PATH export MACOSX_DEPLOYMENT_TARGET=10.15 export CC=clang export CXX=clang++ @@ -234,7 +245,7 @@ jobs: - - name: Build AtomicDEX (Linux) + - name: Build Komodo Wallet (Linux) if: runner.os == 'Linux' run: | export QT_INSTALL_CMAKE_PATH=${{ github.workspace }}/Qt/${{ matrix.qt }}/gcc_64/lib/cmake @@ -377,6 +388,7 @@ jobs: export ATOMICDEX_PASSWORD=${{ secrets.ATOMICDEX_PASSWORD }} export QT_INSTALL_CMAKE_PATH=${{ github.workspace }}/Qt/${{ matrix.qt }}/clang_64/lib/cmake export QT_ROOT=${{ github.workspace }}/Qt/${{ matrix.qt }} + export PATH=/Users/runner/.nimble/bin:$PATH export CC=clang export CXX=clang++ #echo "Running tests" diff --git a/.gitignore b/.gitignore index df4eea238a..93ff04824c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # This file is used to ignore files which are generated # ---------------------------------------------------------------------------- - +.vscode/ *~ *.autosave *.a diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 02e4592433..1c25541055 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,9 +18,9 @@ variables: cache: - key: $CI_COMMIT_REF_SLUG paths: - - atomicdex-desktop-linux-${CI_COMMIT_SHA::9}.zip - - atomicdex-desktop-linux-${CI_COMMIT_SHA::9}.tar.zst - - atomicdex-desktop-${CI_COMMIT_SHA::9}-x86_64.AppImage + - komodo-wallet-linux-${CI_COMMIT_SHA::9}.zip + - komodo-wallet-linux-${CI_COMMIT_SHA::9}.tar.zst + - komodo-wallet-${CI_COMMIT_SHA::9}-x86_64.AppImage - key: $CI_PROJECT_NAME paths: - "$CI_PROJECT_DIR/.cache/vcpkg" @@ -68,12 +68,12 @@ linux:build: - rm -rf build_ninja || echo "no build_ninja folder to rm" - mkdir build_ninja && cd $_ - cmake -DCMAKE_BUILD_TYPE=Release -GNinja ../ - - ninja atomicdex-desktop - ninja install + - ninja komodo-wallet - cd $CI_PROJECT_DIR - - cp $CI_PROJECT_DIR/bundled/linux/atomicdex-desktop-linux-${CI_COMMIT_SHA::9}.zip . - - cp $CI_PROJECT_DIR/bundled/linux/atomicdex-desktop-linux-${CI_COMMIT_SHA::9}.tar.zst . - - cp $CI_PROJECT_DIR/bundled/linux/atomicdex-desktop-${CI_COMMIT_SHA::9}-x86_64.AppImage . + - cp $CI_PROJECT_DIR/bundled/linux/komodo-wallet-linux-${CI_COMMIT_SHA::9}.zip . + - cp $CI_PROJECT_DIR/bundled/linux/komodo-wallet-linux-${CI_COMMIT_SHA::9}.tar.zst . + - cp $CI_PROJECT_DIR/bundled/linux/komodo-wallet-${CI_COMMIT_SHA::9}-x86_64.AppImage . AtomicDex-linux-zip: stage: upload_linux_zip @@ -83,7 +83,7 @@ AtomicDex-linux-zip: artifacts: name: "AtomicDex-linux-${CI_COMMIT_SHA::9}.zip" paths: - - $CI_PROJECT_DIR/atomicdex-desktop-linux-${CI_COMMIT_SHA::9}.zip + - $CI_PROJECT_DIR/komodo-wallet-linux-${CI_COMMIT_SHA::9}.zip when: always expire_in: 3 days @@ -95,7 +95,7 @@ AtomicDex-linux-AppImage: artifacts: name: "AtomicDex-linux-${CI_COMMIT_SHA::9}-AppImage" paths: - - $CI_PROJECT_DIR/atomicdex-desktop-${CI_COMMIT_SHA::9}-x86_64.AppImage + - $CI_PROJECT_DIR/komodo-wallet-${CI_COMMIT_SHA::9}-x86_64.AppImage when: always expire_in: 3 days @@ -107,6 +107,6 @@ AtomicDex-linux-tar: artifacts: name: "AtomicDex-linux-${CI_COMMIT_SHA::9}.tar.zst" paths: - - $CI_PROJECT_DIR/atomicdex-desktop-linux-${CI_COMMIT_SHA::9}.tar.zst + - $CI_PROJECT_DIR/komodo-wallet-linux-${CI_COMMIT_SHA::9}.tar.zst when: always expire_in: 3 days diff --git a/CMakeLists.txt b/CMakeLists.txt index 4dbf66bc0d..9035cce18b 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.5.7) +project(${DEX_PROJECT_NAME} LANGUAGES CXX VERSION 0.6.1) 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(mm2 - URL https://github.com/KomodoPlatform/atomicDEX-API/releases/download/beta-2.1.8741/mm2-6e4de5d21-Darwin-Release.zip) + URL https://github.com/KomodoPlatform/komodo-defi-framework/releases/download/v1.0.7-beta/mm2-79f620559-Darwin-Release.zip) elseif (UNIX AND NOT APPLE) FetchContent_Declare(mm2 - URL https://github.com/KomodoPlatform/atomicDEX-API/releases/download/beta-2.1.8741/mm2-6e4de5d21-Linux-Release.zip) + URL https://github.com/KomodoPlatform/komodo-defi-framework/releases/download/v1.0.7-beta/mm2-79f620559-Linux-Release.zip) else () FetchContent_Declare(mm2 - URL https://github.com/KomodoPlatform/atomicDEX-API/releases/download/beta-2.1.8741/mm2-6e4de5d21-Windows_NT-Release.zip) + URL https://github.com/KomodoPlatform/komodo-defi-framework/releases/download/v1.0.7-beta/mm2-79f620559-Win64.zip) endif () #FetchContent_Declare(qmaterial URL https://github.com/KomodoPlatform/Qaterial/archive/last-clang-working-2.zip) @@ -81,24 +81,25 @@ FetchContent_Declare(jl777-coins URL https://github.com/KomodoPlatform/coins/archive/master.zip) #FetchContent_Declare(adex-generics-coins -# URL https://github.com/KomodoPlatform/atomicdex-desktop-generics/archive/main.zip) +# URL https://github.com/KomodoPlatform/komodo-wallet-desktop/archive/main.zip) FetchContent_MakeAvailable(mm2 jl777-coins qmaterial) ##! Configure our needs. if (UNIX) - configure_file(${jl777-coins_SOURCE_DIR}/utils/coins_config.json ${CMAKE_CURRENT_SOURCE_DIR}/assets/config/${PROJECT_VERSION}-coins.json COPYONLY) + 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/mm2/coins COPYONLY) configure_file(${mm2_SOURCE_DIR}/mm2 ${CMAKE_CURRENT_SOURCE_DIR}/assets/tools/mm2/${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.json ${CMAKE_BINARY_DIR}/bin/assets/config/${PROJECT_VERSION}-coins.json COPYONLY) + 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/mm2/coins COPYONLY) configure_file(${mm2_SOURCE_DIR}/mm2.exe ${CMAKE_BINARY_DIR}/bin/assets/tools/mm2/${DEX_API}.exe COPYONLY) configure_file(${mm2_SOURCE_DIR}/msvcp140.dll ${CMAKE_BINARY_DIR}/bin/assets/tools/mm2/msvcp140.dll COPYONLY) configure_file(${mm2_SOURCE_DIR}/vcruntime140.dll ${CMAKE_BINARY_DIR}/bin/assets/tools/mm2/vcruntime140.dll COPYONLY) endif () + add_subdirectory(vendor/antara-gaming_sdk/modules) ##! Osx bundle icon diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index fc0b09b16b..2cc2bc9e98 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -104,7 +104,7 @@ -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - C:\Users\MSI\atomicDEX-Desktop\build + C:\Users\MSI\komodo-wallet-desktop\build @@ -215,15 +215,15 @@ 2 - atomicdex-desktop - CMakeProjectManager.CMakeRunConfiguration.atomicdex-desktop - atomicdex-desktop + komodo-wallet + CMakeProjectManager.CMakeRunConfiguration.komodo-wallet + komodo-wallet false true true false true - C:/Users/MSI/atomicDEX-Desktop/build/bin + C:/Users/MSI/komodo-wallet-desktop/build/bin dwarf @@ -286,15 +286,15 @@ 2 - atomicdex-desktop_tests - CMakeProjectManager.CMakeRunConfiguration.atomicdex-desktop_tests - atomicdex-desktop_tests + komodo-wallet_tests + CMakeProjectManager.CMakeRunConfiguration.komodo-wallet_tests + komodo-wallet_tests false true true false true - C:/Users/MSI/atomicDEX-Desktop/build/bin + C:/Users/MSI/komodo-wallet-desktop/build/bin 2 diff --git a/README.md b/README.md index 5cae0c5800..667aceb78a 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,47 @@

- - + + komodo-wallet-logo_dark-theme

- - + + - - downloads + + downloads - - last commit + + last commit - - + +
- - issues + + issues - - issues closed + + issues closed - - pulls + + pulls - - pulls closed + + pulls closed
- - build status + + build status - - release version + + release version chat on Discord - - + follow on Twitter

@@ -50,9 +50,10 @@ ## What is FiroDEX? FiroDEX is a secure wallet and non-custodial decentralized exchange rolled into one application. Store your coins, + trade peer-to-peer with minimal fees and never give up control over your digital assets. -AtomicDEX Desktop has been tested on the following platforms: +Komodo Wallet has been tested on the following platforms: - Windows 10 - Linux (Ubuntu 18.04+) @@ -64,7 +65,7 @@ AtomicDEX Desktop has been tested on the following platforms: You can [download](https://github.com/firoorg/FiroDEX-Desktop/releases) the pre-built beta binaries on our [GitHub release page](https://github.com/firoorg/FiroDEX-Desktop/releases). -Build instructions can be found [here](https://github.com/KomodoPlatform/atomicDEX-Desktop/wiki/Build-Instructions) +Build instructions can be found [here](https://github.com/KomodoPlatform/komodo-wallet-desktop/wiki/Build-Instructions) Please join our [Discord Server](https://komodoplatform.com/discord) for support, discussions and general UI/UX feedback. @@ -72,16 +73,16 @@ feedback. ## Useful links -- :book: [AtomicDEX Documentation](https://developers.komodoplatform.com/basic-docs/atomicdex/atomicdex-tutorials/introduction-to-atomicdex.html) -- :link: [AtomicDEX Website](https://atomicdex.io/) -- :speech_balloon: [AtomicDEX Discord](https://discord.gg/tvp96Gf) -- :hammer_and_wrench: [AtomicDEX Development Boards](https://github.com/KomodoPlatform/atomicDEX-Desktop/projects) -- :notebook_with_decorative_cover: [AtomicDex Wiki](https://github.com/KomodoPlatform/atomicDEX-Desktop/wiki/) +- :book: [Komodo Wallet Documentation](https://developers.komodoplatform.com/basic-docs/atomicdex/atomicdex-tutorials/introduction-to-atomicdex.html) +- :link: [Komodo Wallet Website](https://atomicdex.io/) +- :speech_balloon: [Komodo Wallet Discord](https://discord.gg/tvp96Gf) +- :hammer_and_wrench: [Komodo Wallet Development Boards](https://github.com/KomodoPlatform/komodo-wallet-desktop/projects) +- :notebook_with_decorative_cover: [Komodo Wallet Wiki](https://github.com/KomodoPlatform/komodo-wallet-desktop/wiki/) -## AtomicDEX mobile +## Komodo Wallet mobile -Check out AtomicDEX mobile, available for [Android and iOS](https://atomicdex.io) +Check out Komodo Wallet mobile, available for [Android and iOS](https://atomicdex.io) ## Self-Hosted Dependencies @@ -103,58 +104,58 @@ Check out AtomicDEX mobile, available for [Android and iOS](https://atomicdex.io ## Contributors / Thanks - +
- Milerius
Milerius

✍️💻 + Milerius
Milerius

✍️💻
- syl
syl

✍️💻 + syl
syl

✍️💻
- naezith
naezith

✍️💻 + naezith
naezith

✍️💻
- ssakone
ssakone

✍️💻 + ssakone
ssakone

✍️💻
- Anton TonyL Lysakov
Anton "TonyL" Lysakov

🛠💻 + Anton TonyL Lysakov
Anton "TonyL" Lysakov

🛠💻
- ca333
ca333

:penguin: :guardsman: + ca333
ca333

:penguin: :guardsman:
- smk762
smk762

🛠:wolf: + smk762
smk762

🛠:wolf:
- cipig
cipig

✍️💻 + cipig
cipig

✍️💻
- SirSevenG
SirSevenG

🛠💻 + SirSevenG
SirSevenG

🛠💻
- dathbezumniy
dathbezumniy

🛠💻 + dathbezumniy
dathbezumniy

🛠💻
- BloodyNora
BloodyNora

🛠💻 + BloodyNora
BloodyNora

🛠💻
- zatJUM
zatJUM

:heart:💻 + zatJUM
zatJUM

:heart:💻
- + ## License -For details please refer to our [license](https://github.com/KomodoPlatform/atomicDEX-Desktop/blob/master/LICENSE). +For details please refer to our [license](https://github.com/KomodoPlatform/komodo-wallet-desktop/blob/master/LICENSE). This is experimental alpha software - use at your own risk! diff --git a/assets/config/cfg.json b/assets/config/cfg.json index ce61d0f8d0..ba5bf75787 100644 --- a/assets/config/cfg.json +++ b/assets/config/cfg.json @@ -1,5 +1,6 @@ { "notification_enabled": true, + "spamfilter_enabled": false, "current_currency": "USD", "current_fiat": "USD", "current_currency_sign": "$", @@ -78,6 +79,14 @@ "HUF", "SEK" ], + "recommended_fiat": [ + "USD", + "EUR", + "GBP", + "HKD", + "IDR", + "ILS" + ], "possible_currencies": [ "USD", "BTC", diff --git a/assets/themes/Binance - Dark/colors.json b/assets/themes/Binance - Dark/colors.json index 4a30ca5a52..96f4325b46 100644 --- a/assets/themes/Binance - Dark/colors.json +++ b/assets/themes/Binance - Dark/colors.json @@ -1,81 +1,139 @@ { - "accentColor": "#0A0A0AFF", - "foregroundColor": "#ffffffFF", - "backgroundColor": "#161515FF", - "backgroundColorDeep": "#0A0A0AFF", - - "busyIndicatorColor": "#cb9800FF", - - "buttonColorDisabled": "#8B6900FF", - "buttonColorEnabled": "#cb9800FF", - "buttonColorHovered": "#EBB514FF", - "buttonColorPressed": "#EBB514FF", - "buttonTextDisabledColor": "#3B3B3BFF", - "buttonTextEnabledColor": "#fafffaFF", + "accentColor": "#F0B90BFF", + "foregroundColor": "#FFFFFFFF", + "foregroundColor2": "#8790B2FF", + "foregroundColor3": "#ABC0D3FF", + "backgroundColor": "#000000FF", + "secondBackgroundColor": "#0E111AFF", + "backgroundColorDeep": "#060A10FF", + + "busyIndicatorColor": "#F0B90BFF", + + "buttonColorDisabled": "#745804FF", + "buttonColorEnabled": "#F0B90BFF", + "buttonColorHovered": "#FFC200FF", + "buttonColorPressed": "#F0B90B6C", + + "buttonTextDisabledColor": "#444444FF", + "buttonTextEnabledColor": "#FFFFFF", "buttonTextHoveredColor": "#000000FF", "buttonTextPressedColor": "#000000FF", - - "gradientButtonStartColor": "#cb9800FF", - "gradientButtonEndColor": "#cb9800FF", - "gradientButtonDisabledStartColor": "#8B6900FF", - "gradientButtonDisabledEndColor": "#8B6900FF", - "gradientButtonHoveredStartColor": "#EBB514FF", - "gradientButtonHoveredEndColor": "#EBB514FF", - "gradientButtonPressedStartColor": "#EBB514FF", - "gradientButtonPressedEndColor": "#EBB514FF", - "gradientButtonTextEnabledColor": "#080707FF", - "gradientButtonTextDisabledColor": "#3B3B3BFF", + + "buttonSecondaryColorDisabled": "#745804", + "buttonSecondaryColorEnabled": "#CFA00B", + "buttonSecondaryColorHovered": "#FFC200FF", + "buttonSecondaryColorPressed": "#F0B90B6C", + + "buttonCancelColorDisabled": "#2C3D66FF", + "buttonCancelColorEnabled": "#5B4606FF", + "buttonCancelColorHovered": "#FFC200FF", + "buttonCancelColorPressed": "#F0B90B6C", + + "gradientButtonStartColor": "#F0B90BAD", + "gradientButtonEndColor": "#F0B90BFF", + "gradientButtonDisabledStartColor": "#F0B90B4D", + "gradientButtonDisabledEndColor": "#F0B90B34", + "gradientButtonHoveredStartColor": "#FFC200FF", + "gradientButtonHoveredEndColor": "#FFD346FF", + "gradientButtonPressedStartColor": "#F0B90BFF", + "gradientButtonPressedEndColor": "#F0B90BFF", + "gradientButtonTextEnabledColor": "#000000FF", + "gradientButtonTextDisabledColor": "#000000FF", "gradientButtonTextHoveredColor": "#000000FF", "gradientButtonTextPressedColor": "#000000FF", - "checkBoxTickColor": "#FFFFFFFF", - "checkBoxGradientStartColor": "#cb9800FF", - "checkBoxGradientEndColor": "#EBB514FF", - - "switchGradientStartColor": "#cb9800FF", - "switchGradientEndColor": "#EBB514FF", - "switchGradientStartColor2": "#FFFFFFFF", - "switchGradientEndColor2": "#FFFFFFFF", - - "modalPageCounterGradientStartColor": "#cb9800FF", - "modalPageCounterGradientEndColor": "#EBB514FF", - - "tabSelectedColor": "#EBB514FF", - - "textDisabledColor": "#444444FF", - "textSelectionColor": "#4986EAFF", - "textPlaceholderColor": "#8B6900FF", - "textSelectedColor": "#0e1021FF", - - "textFieldBackgroundColor": "#0e0e0eFF", - "textFieldActiveBackgroundColor": "#0c0c0cFF", - "textFieldPrefixColor": "#8790B2FF", - "textFieldSuffixColor": "#456078FF", + "checkBoxTickColor": "#000000", + "checkBoxGradientStartColor": "#F0B90BFF", + "checkBoxGradientEndColor": "#F0B90BFF", - "comboBoxBackgroundColor": "#0A0A0AFF", + "switchGradientStartColor": "#F0B90BFF", + "switchGradientEndColor": "#F0B90BFF", + "switchGradientStartColor2": "#000000", + "switchGradientEndColor2": "#000000", + + "comboBoxBackgroundColor": "#1D232FFF", "comboBoxArrowsColor": "#FFFFFFFF", - "comboBoxDropdownItemHighlightedColor": "#111111FF", - - "chartTradingLineBackgroundColor": "#24283dFF", - "chartTradingLineColor": "#74fbeeFF", - - "innerBackgroundColor": "#111111FF", - - "floatingBackgroundColor": "#222222FF", - - "sidebarBgColor": "#161515FF", - "sidebarVersionTextColor": "#BBBBBBFF", - "sidebarCursorStartColor": "#cb9800FF", - "sidebarCursorEndColor": "#EBB51400", - "sidebarLineTextHovered": "#8B6900FF", - - "okColor": "#74fbeeFF", - "noColor": "#d13990FF", - - "senderColorStart": "#F85757FF", - "receiverColorStart": "#845FEFFF", - "arrowUpColor": "#F85757FF", - "arrowDownColor": "#845FEFFF", - - "lineSeparatorColor": "#222222FF" + "comboBoxDropdownItemHighlightedColor": "#F0B90BFF", + + "modalPageCounterGradientStartColor": "#F0B90BFF", + "modalPageCounterGradientEndColor": "#F0B90BFF", + + "notifPopupBackgroundColor": "#0E111AFF", + "notifPopupTextColor": "#FFFFFFFF", + "notifPopupTimerColor": "#8790B2FF", + "notifPopupTimerBackgroundColor": "#94A3B11F", + "notifPopupIconStartColor": "#FFFFFFFF", + "notifPopupIconEndColor": "#FFFFFFFF", + + "scrollBarIndicatorColor": "#8790B2", + "scrollBarBackgroundColor": "#94A3B1", + + "tabSelectedColor": "#F0B90B", + + "textDisabledColor": "#707070", + "textSelectionColor": "#F0B90B", + "textPlaceholderColor": "#5A4400", + "textSelectedColor": "#211D0E", + + "textFieldBackgroundColor": "#262424", + "textFieldActiveBackgroundColor": "#262424", + "textFieldPrefixColor": "#F0B90B", + "textFieldSuffixColor": "#F0B90B", + + "tickerBadgeBackgroundColor": "#161515", + + "chartTradingLineBackgroundColor": "#161515", + "chartTradingLineColor": "#F0B90B", + + "innerBackgroundColor": "#161515", + + "floatingBackgroundColor": "#161515", + + "rangeSliderBackgroundColor": "#F0B90B", + "rangeSliderDistanceColor": "#F0B90B33", + "rangeSliderIndicatorBackgroundStartColor": "#F0B90B", + "rangeSliderIndicatorBackgroundEndColor": "#F0B90B", + + "userIconColorStart": "#F0B90B", + "userIconColorEnd": "#F0B90B33", + + "sidebarBgColor": "#000000", + "sidebarVersionTextColor": "#F0B90B", + "sidebarCursorStartColor": "#F0B90B", + "sidebarCursorEndColor": "#16151500", + "sidebarLineTextHovered": "#F0B90B", + "sidebarLineTextSelected": "#FFFFFF", + + "tradeSellModeSelectorBackgroundColorStart": "#E52167", + "tradeSellModeSelectorBackgroundColorEnd": "#CD0F53", + "tradeBuyModeSelectorBackgroundColorStart": "#0BC05F", + "tradeBuyModeSelectorBackgroundColorEnd": "#037B3A", + + "inputModifierBackgroundColor": "#F0B90B21", + "inputFieldBackgroundColor": "#161515", + + "inputFieldBorderColor": "#F0B90B", + "inputPlaceholderTextColor": "#FF00FF", + "inputRightIconColor": "#FFFFFF", + "inputLeftIconColor": "#FFFFFF", + "inputLeftIconBackgroundColor": "#161515", + + "listItemOddBackground": "#000000", + "listItemEvenBackground": "#161515", + "listItemHoveredBackground": "#5B4704", + + "addressBookTagColors": ["#003bbbFF", "#006133FF", "#612600FF", "#430061FF", "#004d61FF"], + + "okColor": "#00C058", + "warningColor": "#E52167", + "swapIconColor": "#005FBE", + + "senderColorStart": "#F85757", + "receiverColorStart": "#845FEF", + + "arrowUpColor": "#F85757", + "arrowDownColor": "#845FEF", + + "lineSeparatorColor": "#161515" + } \ No newline at end of file diff --git a/assets/themes/Default - Dark/colors.json b/assets/themes/Default - Dark/colors.json index ccd4c5acab..3664b2bc25 100644 --- a/assets/themes/Default - Dark/colors.json +++ b/assets/themes/Default - Dark/colors.json @@ -3,7 +3,6 @@ "foregroundColor": "#ffffff", "backgroundColor": "#1F1E1E", "backgroundColorDeep": "#1F1E1E", - "busyIndicatorColor": "#EB1C2EAF", "buttonColorDisabled": "#3E34349A", @@ -14,7 +13,6 @@ "buttonTextEnabledColor": "#ffffff", "buttonTextHoveredColor": "#7A8EA1FF", "buttonTextPressedColor": "#ABC0D3FF", - "gradientButtonStartColor": "#9B1C2EFF", "gradientButtonEndColor": "#EE5C78FF", "gradientButtonDisabledStartColor": "#9B1C2E4D", @@ -94,10 +92,24 @@ "tradeSellModeSelectorBackgroundColorEnd": "#F48EA1FF", "tradeMarketModeSelectorNotSelectedBackgroundColor": "#89B6FF21", - "addressBookTagColors": ["#627EEAFF", "#FFD87AFF", "#F7931AFF"], + "inputModifierBackgroundColor": "#89B6FF21", + "inputFieldBackgroundColor": "#313555FF", + + "inputFieldBorderColor": "#20233788", + "inputPlaceholderTextColor": "#FFFFFFFF", + "inputRightIconColor": "#FFFFFFFF", + "inputLeftIconColor": "#FFFFFFFF", + "inputLeftIconBackgroundColor": "#202337FF", + + "listItemOddBackground": "#202337FF", + "listItemEvenBackground": "#24273DFF", + "listItemHoveredBackground": "#4068B9FF", + + "addressBookTagColors": ["#003bbbFF", "#006133FF", "#612600FF", "#430061FF", "#004d61FF"], "okColor": "#00C058FF", - "noColor": "#E52167FF", + "warningColor": "#E52167FF", + "swapIconColor": "#005FBEFF", "senderColorStart": "#F85757FF", "receiverColorStart": "#845FEFFF", diff --git a/assets/themes/Default - Light/colors.json b/assets/themes/Default - Light/colors.json index 8b22d12e81..660b906c66 100644 --- a/assets/themes/Default - Light/colors.json +++ b/assets/themes/Default - Light/colors.json @@ -3,7 +3,6 @@ "foregroundColor": "#110202", "backgroundColor": "#F9F5F5FF", "backgroundColorDeep": "#F9F5F5FF", - "busyIndicatorColor": "#CB1C2EAF", "buttonColorDisabled": "#D8E3F8", @@ -27,7 +26,6 @@ "gradientButtonTextDisabledColor": "#EEF5FF", "gradientButtonTextHoveredColor": "#EEF5FF", "gradientButtonTextPressedColor": "#EEF5FF", - "checkBoxTickColor": "#000000FF", "checkBoxGradientStartColor": "#8892EBFF", "checkBoxGradientEndColor": "#9DD4F3FF", @@ -40,7 +38,6 @@ "comboBoxBackgroundColor": "#FFFFFFFF", "comboBoxArrowsColor": "#000000FF", "comboBoxDropdownItemHighlightedColor": "#BA2A45FF", - "modalPageCounterGradientStartColor": "#BA2A45FF", "modalPageCounterGradientEndColor": "#BA2A45FF", @@ -94,13 +91,27 @@ "tradeSellModeSelectorBackgroundColorEnd": "#F48EA1FF", "tradeMarketModeSelectorNotSelectedBackgroundColor": "#89B6FF21", - "addressBookTagColors": ["#627EEAFF", "#FFD87AFF", "#F7931AFF"], + "inputModifierBackgroundColor": "#89B6FF21", + "inputFieldBackgroundColor": "#F3F5F6FF", + + "inputFieldBorderColor": "#DCE8FD88", + "inputPlaceholderTextColor": "#456078FF", + "inputRightIconColor": "#456078FF", + "inputLeftIconColor": "#456078FF", + "inputLeftIconBackgroundColor": "#DCE8FDFF", + + "listItemOddBackground": "#FCFCFCFF", + "listItemEvenBackground": "#EDF4FFFF", + "listItemHoveredBackground": "#D7E7FFFF", + + "addressBookTagColors": ["#003bbbFF", "#006133FF", "#612600FF", "#430061FF", "#004d61FF"], "okColor": "#00C058FF", - "noColor": "#E52167FF", + "warningColor": "#E52167FF", + "swapIconColor": "#005FBEFF", - "senderColorStart": "#F85757", - "receiverColorStart": "#845FEF", + "senderColorStart": "#F85757FF", + "receiverColorStart": "#845FEFFF", "arrowUpColor": "#F85757FF", "arrowDownColor": "#845FEFFF", diff --git a/atomic_defi_design/Dex/Addressbook/AddAddressForm.qml b/atomic_defi_design/Dex/Addressbook/AddAddressForm.qml index 7fdf8b444d..b2633f2084 100644 --- a/atomic_defi_design/Dex/Addressbook/AddAddressForm.qml +++ b/atomic_defi_design/Dex/Addressbook/AddAddressForm.qml @@ -165,7 +165,7 @@ Dex.Rectangle Layout.preferredWidth: 458 Layout.preferredHeight: 60 visible: text !== "" - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor wrapMode: Dex.Text.WordWrap elide: Dex.Text.ElideRight horizontalAlignment: Text.AlignHCenter @@ -176,7 +176,7 @@ Dex.Rectangle Layout.topMargin: 10 Layout.fillWidth: true - Dex.Button + Dex.CancelButton { Layout.preferredWidth: 116 Layout.preferredHeight: 38 @@ -195,7 +195,7 @@ Dex.Rectangle Layout.preferredWidth: 116 Layout.preferredHeight: 38 radius: 18 - text: isConvertMode ? qsTr("Convert") : editionMode ? qsTr("Edit") : qsTr("Add") + text: isConvertMode ? qsTr("Convert") : editionMode ? qsTr("Update") : qsTr("Save") onClicked: { let addressType = getTypeForAddressChecker(addressTypeComboBox.currentText) @@ -301,7 +301,7 @@ Dex.Rectangle }, // Cancel button - Dex.Button + Dex.CancelButton { Layout.rightMargin: 5 text: qsTr("Cancel") diff --git a/atomic_defi_design/Dex/Addressbook/AddTagPopup.qml b/atomic_defi_design/Dex/Addressbook/AddTagPopup.qml index 0e53be333c..000cd1a024 100644 --- a/atomic_defi_design/Dex/Addressbook/AddTagPopup.qml +++ b/atomic_defi_design/Dex/Addressbook/AddTagPopup.qml @@ -13,6 +13,7 @@ Dex.Popup width: 250 height: 55 + onOpened: tagNameField.forceActiveFocus() onClosed: tagNameField.text = "" contentItem: Row @@ -22,10 +23,17 @@ Dex.Popup Dex.TextField { id: tagNameField + visible: contactModel.categories.length < 5 width: parent.width * 0.6 height: parent.height placeholderText: qsTr("Tag name") + onTextChanged: { + if(text.length > 10) { + text = text.substring(0, 10) + } + } + Dex.ToolTip { id: tagAlreadyTakenToolTip @@ -40,6 +48,7 @@ Dex.Popup Dex.Button { + visible: contactModel.categories.length < 5 width: parent.width * 0.36 height: parent.height text: qsTr("+ ADD") @@ -56,5 +65,16 @@ Dex.Popup else root.close() } } + + Dex.Text + { + id: tagLimitText + visible: contactModel.categories.length > 4 + width: parent.width * 0.6 + height: parent.height + color: Style.colorRed + text: qsTr("A contact can only have 5 tags.") + } + } } diff --git a/atomic_defi_design/Dex/Addressbook/AddressTypeSelector.qml b/atomic_defi_design/Dex/Addressbook/AddressTypeSelector.qml index b8ad13881b..6e79fabad7 100644 --- a/atomic_defi_design/Dex/Addressbook/AddressTypeSelector.qml +++ b/atomic_defi_design/Dex/Addressbook/AddressTypeSelector.qml @@ -38,9 +38,9 @@ Dex.ComboBoxWithSearchBar } else { - _contentRow.ticker = model.data(model.index(index, 0), Qt.UserRole + 1) - _contentRow.name = model.data(model.index(index, 0), Qt.UserRole + 3) - _contentRow.type = model.data(model.index(index, 0), Qt.UserRole + 9) + _contentRow.ticker = model.data ? model.data(model.index(index, 0), Qt.UserRole + 1) : "" + _contentRow.name = model.data ? model.data(model.index(index, 0), Qt.UserRole + 3) : "" + _contentRow.type = model.data ? model.data(model.index(index, 0), Qt.UserRole + 9) : "" } } @@ -77,16 +77,13 @@ Dex.ComboBoxWithSearchBar } } - contentItem: Item + contentItem: AssetRow { - AssetRow - { - id: _contentRow + id: _contentRow - anchors.left: parent.left - anchors.leftMargin: 13 - anchors.verticalCenter: parent.verticalCenter - } + anchors.left: parent.left + anchors.leftMargin: 13 + anchors.verticalCenter: parent.verticalCenter } onCurrentIndexChanged: diff --git a/atomic_defi_design/Dex/Addressbook/AssetFromStandardSelector.qml b/atomic_defi_design/Dex/Addressbook/AssetFromStandardSelector.qml index c7416f1727..26a103de95 100644 --- a/atomic_defi_design/Dex/Addressbook/AssetFromStandardSelector.qml +++ b/atomic_defi_design/Dex/Addressbook/AssetFromStandardSelector.qml @@ -90,7 +90,7 @@ Dex.MultipageModal anchors.leftMargin: 6 anchors.verticalCenter: parent.verticalCenter text: qsTr("Disabled") - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor font: Dex.DexTypo.caption } diff --git a/atomic_defi_design/Dex/Addressbook/EditContactModal.qml b/atomic_defi_design/Dex/Addressbook/EditContactModal.qml index 673c52936a..22993be058 100644 --- a/atomic_defi_design/Dex/Addressbook/EditContactModal.qml +++ b/atomic_defi_design/Dex/Addressbook/EditContactModal.qml @@ -192,7 +192,7 @@ Dex.MultipageModal { visible: !addressList.contactAddAddressMode anchors.horizontalCenter: parent.horizontalCenter - text: qsTr("+ Add") + text: qsTr("+ Add Address") width: 211 height: 38 radius: 18 @@ -224,7 +224,7 @@ Dex.MultipageModal width: parent.width model: contactModel.categories orientation: Qt.Horizontal - spacing: 6 + spacing: 4 delegate: Dex.MouseArea { width: tagBg.width + tagRemoveBut.width + 2 @@ -234,17 +234,19 @@ Dex.MultipageModal Dex.Rectangle { id: tagBg + property int _currentColorIndex: contactTable._getCurrentTagColorId() anchors.verticalCenter: parent.verticalCenter width: tagLabel.width + 12 height: 21 radius: 20 - color: Dex.CurrentTheme.accentColor + color: Dex.CurrentTheme.addressBookTagColors[_currentColorIndex] Dex.Text { id: tagLabel anchors.centerIn: parent text: modelData + color: "white" } } @@ -255,8 +257,8 @@ Dex.MultipageModal anchors.left: tagBg.right anchors.leftMargin: 2 anchors.verticalCenter: parent.verticalCenter - width: 18 - height: 18 + width: 16 + height: 16 color: "transparent" iconSource: Qaterial.Icons.close onClicked: contactModel.removeCategory(modelData) @@ -283,12 +285,12 @@ Dex.MultipageModal footer: [ - Dex.Button + Dex.CancelButton { Layout.preferredWidth: 199 Layout.preferredHeight: 48 radius: 18 - text: qsTr("Cancel") + text: qsTr("Cancel Updates") onClicked: root.close() }, @@ -299,7 +301,7 @@ Dex.MultipageModal Layout.preferredWidth: 199 Layout.preferredHeight: 48 radius: 18 - text: qsTr("Confirm") + text: qsTr("Save Updates") onClicked: { contactModel.name = contactNameInput.field.text diff --git a/atomic_defi_design/Dex/Addressbook/EnableAssetModal.qml b/atomic_defi_design/Dex/Addressbook/EnableAssetModal.qml index 63317676f5..d8776239ac 100644 --- a/atomic_defi_design/Dex/Addressbook/EnableAssetModal.qml +++ b/atomic_defi_design/Dex/Addressbook/EnableAssetModal.qml @@ -34,7 +34,7 @@ Dex.MultipageModal }, // Cancel button - Dex.Button + Dex.CancelButton { Layout.rightMargin: 5 text: qsTr("Cancel") diff --git a/atomic_defi_design/Dex/Addressbook/Main.qml b/atomic_defi_design/Dex/Addressbook/Main.qml index df7b1e4a2a..fba4df4df4 100644 --- a/atomic_defi_design/Dex/Addressbook/Main.qml +++ b/atomic_defi_design/Dex/Addressbook/Main.qml @@ -194,29 +194,30 @@ Item { model: modelData.categories.slice(0, 6) - delegate: Dex.Rectangle + delegate: Dex.MouseArea { - property int _currentColorIndex: contactTable._getCurrentTagColorId() + width: tagBg.width + 2 + height: tagBg.height + onClicked: searchbar.textField.text = modelData + hoverEnabled: true - width: tagLabel.width > 73 ? 83 : tagLabel.width + 10 - height: 21 - radius: 20 - color: Dex.CurrentTheme.addressBookTagColors[_currentColorIndex] - - Dex.MouseArea + Dex.Rectangle { - anchors.fill: parent - onClicked: searchbar.textField.text = modelData - } + id: tagBg + property int _currentColorIndex: contactTable._getCurrentTagColorId() + anchors.verticalCenter: parent.verticalCenter + width: tagLabel.width + 12 + height: 21 + radius: 20 + color: Dex.CurrentTheme.addressBookTagColors[_currentColorIndex] - Dex.Text - { - id: tagLabel - width: 70 - anchors.centerIn: parent - text: modelData - horizontalAlignment: Text.AlignHCenter - elide: Text.ElideRight + Dex.Text + { + id: tagLabel + anchors.centerIn: parent + text: modelData + color: "white" + } } } } diff --git a/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml b/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml index 4c61b27c64..afddfffb9e 100644 --- a/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml +++ b/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml @@ -6,6 +6,7 @@ import QtQuick.Layouts 1.15 import "../Components" import "../Constants" import Dex.Components 1.0 as Dex +import Dex.Themes 1.0 as Dex Dex.Popup { @@ -14,6 +15,7 @@ Dex.Popup height: 88 onOpened: nameField.forceActiveFocus() onClosed: nameField.text = "" + bgColor: Dex.CurrentTheme.innerBackgroundColor contentItem: Column { @@ -47,7 +49,7 @@ Dex.Popup { id: add_contact_btn font: DexTypo.body2 - text: qsTr("+ ADD") + text: qsTr("Save") height: 30 anchors.horizontalCenter: parent.horizontalCenter onClicked: diff --git a/atomic_defi_design/Dex/App.qml b/atomic_defi_design/Dex/App.qml index b0137c1c15..47b9735d40 100644 --- a/atomic_defi_design/Dex/App.qml +++ b/atomic_defi_design/Dex/App.qml @@ -32,7 +32,6 @@ DexRectangle property var notification_modal: notifications_modal property var logout_confirm_modal: logout_modal property var notifications_list: _currentPage === App.ScreenType.Dashboard ? loader.item.notifications_list : [] - property bool segwit_on: false property var _currentPage: API.app.wallet_mgr.log_status() ? App.ScreenType.Dashboard : App.ScreenType.Startup property var _availablePages: [_startup, dashboard] diff --git a/atomic_defi_design/Dex/Components/CancelButton.qml b/atomic_defi_design/Dex/Components/CancelButton.qml new file mode 100644 index 0000000000..2409171be9 --- /dev/null +++ b/atomic_defi_design/Dex/Components/CancelButton.qml @@ -0,0 +1,12 @@ +import QtQuick 2.15 +import App 1.0 +import Dex.Themes 1.0 as Dex +import "../Constants" + +// Add button +DexAppButton { + btnPressedColor: Dex.CurrentTheme.buttonCancelColorPressed + btnHoveredColor: Dex.CurrentTheme.buttonCancelColorHovered + btnEnabledColor: Dex.CurrentTheme.buttonCancelColorEnabled + btnDisabledColor: Dex.CurrentTheme.buttonCancelColorDisabled +} diff --git a/atomic_defi_design/Dex/Components/CannotEnableCoinModal.qml b/atomic_defi_design/Dex/Components/CannotEnableCoinModal.qml index 19c44755c6..dad42aa5ac 100644 --- a/atomic_defi_design/Dex/Components/CannotEnableCoinModal.qml +++ b/atomic_defi_design/Dex/Components/CannotEnableCoinModal.qml @@ -32,7 +32,7 @@ MultipageModal close() } } - DefaultButton + CancelButton { Layout.fillWidth: true text: qsTr("Cancel") diff --git a/atomic_defi_design/Dex/Components/CexInfoModal.qml b/atomic_defi_design/Dex/Components/CexInfoModal.qml index 64777e138f..cc7c3725a4 100644 --- a/atomic_defi_design/Dex/Components/CexInfoModal.qml +++ b/atomic_defi_design/Dex/Components/CexInfoModal.qml @@ -17,9 +17,7 @@ MultipageModal { Layout.preferredHeight: 200 Layout.fillWidth: true - text: qsTr('Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.

Data is sourced via Band Decentralized Oracle and CoinGecko.

Oracle Supported Pairs:
%1

Last reference (Band Oracle):
%2') - .arg(API.app.portfolio_pg.oracle_price_supported_pairs.join(', ')) - .arg(API.app.portfolio_pg.oracle_last_price_reference) + text: qsTr('Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.

Data is sourced via CoinGecko.') } } } diff --git a/atomic_defi_design/Dex/Components/CoinTypeTag.qml b/atomic_defi_design/Dex/Components/CoinTypeTag.qml index 7f544b8183..d423956f0f 100644 --- a/atomic_defi_design/Dex/Components/CoinTypeTag.qml +++ b/atomic_defi_design/Dex/Components/CoinTypeTag.qml @@ -1,22 +1,22 @@ -import QtQuick 2.15 -import "../Constants" -import App 1.0 - -AnimatedRectangle { - property string type - radius: 20 - - height: type_tag.font.pixelSize * 1.5 - width: type_tag.width + 8 - - color: Style.getCoinTypeColor(type) - - DexLabel { - id: type_tag - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - text: type - color: Style.getCoinTypeTextColor(type) - font: DexTypo.overLine - } -} +import QtQuick 2.15 +import "../Constants" +import App 1.0 + +AnimatedRectangle { + property string type + radius: 20 + + height: type_tag.font.pixelSize * 1.5 + width: type_tag.width + 8 + + color: Style.getCoinTypeColor(type) + + DexLabel { + id: type_tag + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + text: type + color: Style.getCoinTypeTextColor(type) + font: DexTypo.overLine + } +} diff --git a/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml b/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml index 908c6a407f..bbd86393f1 100644 --- a/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml +++ b/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml @@ -11,7 +11,7 @@ ComboBox { id: control - property int radius: 20 + property int radius: 10 property int popupWidth: width property int popupMaxHeight: 450 property bool popupForceMaxHeight: false @@ -24,8 +24,7 @@ ComboBox background: Rectangle { id: bg - implicitWidth: control.width - implicitHeight: control.height + anchors.fill: parent color: control.backgroundColor radius: control.radius } diff --git a/atomic_defi_design/Dex/Components/DefaultAlertIcon.qml b/atomic_defi_design/Dex/Components/DefaultAlertIcon.qml index 696a7f50b3..b980ab0c94 100644 --- a/atomic_defi_design/Dex/Components/DefaultAlertIcon.qml +++ b/atomic_defi_design/Dex/Components/DefaultAlertIcon.qml @@ -4,20 +4,20 @@ import Qaterial 1.0 as Qaterial import "../Constants" as Constants import App 1.0 -Qaterial.Icon + +DefaultImage { property int iconSize: 24 property string tooltipText: "" - property var iconColor: "gold" - property var iconColorHover: "yellow" - icon: Qaterial.Icons.alert - size: iconSize + source: General.image_path + "warning.svg" + height: iconSize + width: iconSize + opacity: alertArea.containsMouse ? 0.9 : 1 anchors.left: parent.left anchors.leftMargin: iconSize / 2 anchors.rightMargin: iconSize / 2 anchors.verticalCenter: parent.verticalCenter - color: alertArea.containsMouse ? iconColorHover : iconColor DexMouseArea { diff --git a/atomic_defi_design/Dex/Components/DefaultButton.qml b/atomic_defi_design/Dex/Components/DefaultButton.qml index 12f0a4655d..458a254905 100644 --- a/atomic_defi_design/Dex/Components/DefaultButton.qml +++ b/atomic_defi_design/Dex/Components/DefaultButton.qml @@ -3,6 +3,5 @@ import "../Constants" import App 1.0 // Add button -DexButton { - -} +DexAppButton {} + \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DefaultCalendar.qml b/atomic_defi_design/Dex/Components/DefaultCalendar.qml index c366cf1c8c..54c708c022 100644 --- a/atomic_defi_design/Dex/Components/DefaultCalendar.qml +++ b/atomic_defi_design/Dex/Components/DefaultCalendar.qml @@ -104,7 +104,7 @@ Calendar dayDelegate: DefaultRectangle { anchors.fill: parent - color: styleData.date !== undefined && styleData.selected ? selectedDateColor : styleData.hovered ? hoveredDateColor : "transparent" + color: styleData.hasOwnProperty('date') && styleData.selected ? selectedDateColor : styleData.hovered ? hoveredDateColor : "transparent" readonly property bool addExtraMargin: control.frameVisible && styleData.selected readonly property color sameMonthDateTextColor: Dex.CurrentTheme.foregroundColor @@ -116,7 +116,7 @@ Calendar DefaultText { id: dayDelegateText - text: styleData.date.getDate() + text: styleData.hasOwnProperty('date') ? styleData.date.getDate() : "" anchors.centerIn: parent horizontalAlignment: Text.AlignRight font.pixelSize: Math.min(parent.height/3, parent.width/3) diff --git a/atomic_defi_design/Dex/Components/DefaultPopup.qml b/atomic_defi_design/Dex/Components/DefaultPopup.qml index e893062d08..353a8557b1 100644 --- a/atomic_defi_design/Dex/Components/DefaultPopup.qml +++ b/atomic_defi_design/Dex/Components/DefaultPopup.qml @@ -2,14 +2,16 @@ import QtQuick 2.12 import QtQuick.Controls 2.15 //> Popup +import Dex.Themes 1.0 as Dex Popup { id: popup + property color bgColor: Dex.CurrentTheme.floatingBackgroundColor y: parent.height x: (parent.width / 2) - (width / 2) closePolicy: Popup.CloseOnPressOutsideParent | Popup.CloseOnEscape - background: FloatingBackground { } + background: FloatingBackground { color: bgColor } } diff --git a/atomic_defi_design/Dex/Components/DefaultProgressBar.qml b/atomic_defi_design/Dex/Components/DefaultProgressBar.qml index ed56dd814b..ca5e1a7c3a 100644 --- a/atomic_defi_design/Dex/Components/DefaultProgressBar.qml +++ b/atomic_defi_design/Dex/Components/DefaultProgressBar.qml @@ -13,7 +13,7 @@ RowLayout id: root property double label_width: 175 property double bar_width_pct: 0 - property color bar_color: Dex.DexTheme.greenColor + property color bar_color: Dex.DexTheme.okColor property alias label: _label property alias pct_bar: _pct_bar property alias pct_value: _pct_value diff --git a/atomic_defi_design/Dex/Components/DexAmountField.qml b/atomic_defi_design/Dex/Components/DexAmountField.qml index 6699d59e81..c42949bb18 100644 --- a/atomic_defi_design/Dex/Components/DexAmountField.qml +++ b/atomic_defi_design/Dex/Components/DexAmountField.qml @@ -22,7 +22,7 @@ Item { id: _background anchors.fill: parent radius: 4 - color: DexTheme.surfaceColor + color: DexTheme.backgroundDarkColor2 border.color: DexTheme.accentColor border.width: input_field.focus ? 1 : 0 } @@ -56,7 +56,7 @@ Item { anchors.topMargin: 1 anchors.bottomMargin: 1 radius: 0 - color: DexTheme.surfaceColor + color: DexTheme.backgroundDarkColor2 DexTextField { id: input_field validator: RegExpValidator { diff --git a/atomic_defi_design/Dex/Components/DexAppButton.qml b/atomic_defi_design/Dex/Components/DexAppButton.qml index 4414add9d2..db494f9cac 100644 --- a/atomic_defi_design/Dex/Components/DexAppButton.qml +++ b/atomic_defi_design/Dex/Components/DexAppButton.qml @@ -22,6 +22,12 @@ DexRectangle property int verticalPadding: 2 property int horizontalPadding: 2 property int iconSize: _label.font.pixelSize + 2 + property color iconColor: _label.color + + property color btnPressedColor: Dex.CurrentTheme.buttonColorPressed + property color btnHoveredColor: Dex.CurrentTheme.buttonColorHovered + property color btnEnabledColor: Dex.CurrentTheme.buttonColorEnabled + property color btnDisabledColor: Dex.CurrentTheme.buttonColorDisabled property alias label: _label property alias font: _label.font @@ -41,10 +47,7 @@ DexRectangle colorAnimation: false color: enabled ? _controlMouseArea.containsMouse ? _controlMouseArea.containsPress ? - Dex.CurrentTheme.buttonColorPressed : - Dex.CurrentTheme.buttonColorHovered : - Dex.CurrentTheme.buttonColorEnabled : - Dex.CurrentTheme.buttonColorDisabled + btnPressedColor : btnHoveredColor : btnEnabledColor : btnDisabledColor opacity: _controlMouseArea.containsMouse ? 1 : .8 Row diff --git a/atomic_defi_design/Dex/Components/DexAppPasswordField.qml b/atomic_defi_design/Dex/Components/DexAppPasswordField.qml index a071c90e17..6fde726c1a 100644 --- a/atomic_defi_design/Dex/Components/DexAppPasswordField.qml +++ b/atomic_defi_design/Dex/Components/DexAppPasswordField.qml @@ -14,25 +14,22 @@ DexAppTextField property bool forceFocus: false property string leftIcon: Qaterial.Icons.keyVariant - property color leftIconColor: Dex.CurrentTheme.foregroundColor + property color leftIconColor: Dex.CurrentTheme.inputLeftIconColor + property color rightIconColor: Dex.CurrentTheme.inputRightIconColor property alias hideFieldButton: _hideFieldButton height: 50 width: 300 background.radius: 25 max_length: General.max_std_pw_length + field.echoMode: TextField.Password - field.font: Qt.font( - { - pixelSize: (16 * DexTypo.fontDensity) * (Screen.pixelDensity / 160), - letterSpacing: 0.5, - family: DexTypo.fontFamily, - weight: Font.Normal - }) + field.font: DexTypo.inputFieldFont field.horizontalAlignment: Qt.AlignLeft field.leftPadding: 75 field.rightPadding: 60 field.placeholderText: qsTr("Type password") + Component.onCompleted: { if (forceFocus) field.forceActiveFocus() @@ -44,8 +41,7 @@ DexAppTextField height: 40 width: 60 radius: 20 - color: Dex.CurrentTheme.accentColor - border.color: Dex.CurrentTheme.accentColor + color: Dex.CurrentTheme.inputLeftIconBackgroundColor border.width: _inputPassword.focus ? 2 : 0 anchors.verticalCenter: parent.verticalCenter @@ -66,7 +62,7 @@ DexAppTextField icon { source: _inputPassword.field.echoMode === TextField.Password ? Qaterial.Icons.eyeOffOutline : Qaterial.Icons.eyeOutline - color: Dex.CurrentTheme.foregroundColor + color: rightIconColor } anchors { diff --git a/atomic_defi_design/Dex/Components/DexAppTextArea.qml b/atomic_defi_design/Dex/Components/DexAppTextArea.qml index ff29faec4d..1a1ecda547 100644 --- a/atomic_defi_design/Dex/Components/DexAppTextArea.qml +++ b/atomic_defi_design/Dex/Components/DexAppTextArea.qml @@ -50,8 +50,8 @@ Item { width: parent.width height: parent.height radius: 4 - color: DexTheme.surfaceColor - border.color: control.error ? DexTheme.redColor : input_field.focus ? DexTheme.accentColor : DexTheme.rectangleBorderColor + color: DexTheme.backgroundDarkColor2 + border.color: control.error ? DexTheme.warningColor : input_field.focus ? DexTheme.accentColor : DexTheme.rectangleBorderColor border.width: input_field.focus ? 1 : 0 Behavior on x { NumberAnimation { @@ -72,7 +72,7 @@ Item { anchors.topMargin: 1 anchors.bottomMargin: 1 radius: _background.radius - color: DexTheme.surfaceColor + color: DexTheme.backgroundDarkColor2 DexFlickable { anchors.fill: parent contentHeight: input_field.height diff --git a/atomic_defi_design/Dex/Components/DexAppTextField.qml b/atomic_defi_design/Dex/Components/DexAppTextField.qml index 9fd086e981..81773020b4 100644 --- a/atomic_defi_design/Dex/Components/DexAppTextField.qml +++ b/atomic_defi_design/Dex/Components/DexAppTextField.qml @@ -5,6 +5,7 @@ import QtQuick.Layouts 1.5 import App 1.0 import Dex.Themes 1.0 as Dex +import "../Constants" Item { @@ -75,8 +76,8 @@ Item width: parent.width height: parent.height radius: 4 - color: Dex.CurrentTheme.backgroundColor - border.color: control.error ? Dex.CurrentTheme.noColor : input_field.focus ? Dex.CurrentTheme.accentColor : color + color: Dex.CurrentTheme.inputFieldBackgroundColor + border.color: control.error ? Dex.CurrentTheme.warningColor : input_field.focus ? Dex.CurrentTheme.inputFieldBorderColor : color border.width: input_field.focus ? 1 : 0 Behavior on x @@ -126,7 +127,7 @@ Item anchors.topMargin: 1 anchors.bottomMargin: 1 radius: _background.radius - color: background.color + color: Dex.CurrentTheme.inputFieldBackgroundColor DexTextField { @@ -157,13 +158,12 @@ Item text: control.placeholderText anchors.verticalCenter: parent.verticalCenter leftPadding: input_field.leftPadding - color: Dex.CurrentTheme.foregroundColor - font: DexTypo.body1 + color: Dex.CurrentTheme.inputPlaceholderTextColor + font: DexTypo.inputFieldFont elide: DexLabel.ElideRight width: parent.width - 10 wrapMode: DexLabel.NoWrap visible: input_field.text === "" - opacity: .2 } } } @@ -182,8 +182,7 @@ Item text: rightText color: Dex.CurrentTheme.foregroundColor opacity: .4 - font.pixelSize: 14 - font.weight: Font.Medium + font: DexTypo.inputFieldSuffixFont } } } diff --git a/atomic_defi_design/Dex/Components/DexButton.qml b/atomic_defi_design/Dex/Components/DexButton.qml deleted file mode 100644 index f886729bf8..0000000000 --- a/atomic_defi_design/Dex/Components/DexButton.qml +++ /dev/null @@ -1,6 +0,0 @@ -import QtQuick 2.15 -import "../Constants" -import App 1.0 - -// Add button -DexAppButton {} diff --git a/atomic_defi_design/Dex/Components/DexCheckBox.qml b/atomic_defi_design/Dex/Components/DexCheckBox.qml index b471d0d922..344df181ad 100644 --- a/atomic_defi_design/Dex/Components/DexCheckBox.qml +++ b/atomic_defi_design/Dex/Components/DexCheckBox.qml @@ -15,6 +15,7 @@ CheckBox property alias label: _label property alias boxWidth: _indicator.implicitWidth property alias boxHeight: _indicator.implicitHeight + property alias boxRadius: _indicator.radius property alias mouseArea: mouseArea property color textColor: Dex.CurrentTheme.foregroundColor property int labelWidth: 0 diff --git a/atomic_defi_design/Dex/Components/DexDialogManager.qml b/atomic_defi_design/Dex/Components/DexDialogManager.qml index 8bf9ab578c..fc3726ec11 100644 --- a/atomic_defi_design/Dex/Components/DexDialogManager.qml +++ b/atomic_defi_design/Dex/Components/DexDialogManager.qml @@ -18,7 +18,7 @@ Popup { Overlay.modal: Item { DexRectangle { anchors.fill: parent - color: Qt.darker(DexTheme.dexBoxBackgroundColor) + color: Qt.darker(DexTheme.backgroundDarkColor6) opacity: .8 } } @@ -56,7 +56,7 @@ Popup { DexRectangle { anchors.fill: parent radius: 4 - color: DexTheme.surfaceColor + color: DexTheme.backgroundDarkColor2 } } @@ -128,7 +128,7 @@ Popup { height: 45 error: false visible: dialog.getText - defaultBorderColor: DexTheme.dexBoxBackgroundColor + defaultBorderColor: DexTheme.backgroundDarkColor6 background.border.width: 1 field.font: DexTypo.body2 placeholderText: dialog.placeholderText @@ -155,7 +155,7 @@ Popup { anchors.centerIn: parent iconSize: 19 source: Qaterial.Icons.keyVariant - color: DexTheme.surfaceColor + color: DexTheme.backgroundDarkColor2 } } @@ -215,7 +215,7 @@ Popup { onReset: dialog.reset() topPadding: 25 background: Rectangle { - color: DexTheme.dexBoxBackgroundColor + color: DexTheme.backgroundDarkColor6 } delegate: Qaterial.Button { id: _dialogManagerButton @@ -224,7 +224,7 @@ Popup { topInset: 0 opacity: enabled ? 1 : .6 enabled: DialogButtonBox.buttonRole === DialogButtonBox.RejectRole ? true : dialog.enableAcceptButton - backgroundColor: DialogButtonBox.buttonRole === DialogButtonBox.RejectRole ? 'transparent' : dialog.warning ? DexTheme.redColor : DexTheme.accentColor + backgroundColor: DialogButtonBox.buttonRole === DialogButtonBox.RejectRole ? 'transparent' : dialog.warning ? DexTheme.warningColor : DexTheme.accentColor property alias cursorShape: mouseArea.cursorShape Component.onCompleted: { if (text === "Yes" && dialog.yesButtonText !== "") { diff --git a/atomic_defi_design/Dex/Components/DexItemBox.qml b/atomic_defi_design/Dex/Components/DexItemBox.qml index 67cdd130d2..eaec5d467e 100644 --- a/atomic_defi_design/Dex/Components/DexItemBox.qml +++ b/atomic_defi_design/Dex/Components/DexItemBox.qml @@ -64,7 +64,7 @@ InnerBackground { } //shadowOff: true - color: DexTheme.portfolioPieGradient ? 'transparent' : DexTheme.dexBoxBackgroundColor + color: DexTheme.portfolioPieGradient ? 'transparent' : DexTheme.backgroundDarkColor6 property alias titleLabel: _texto onExpandedVertChanged: { @@ -139,7 +139,7 @@ InnerBackground { width: parent.width height: 40 radius: parent.parent.height < 41 ? parent.parent.radius : 0 - color: DexTheme.portfolioPieGradient ? 'transparent' : DexTheme.dexBoxBackgroundColor + color: DexTheme.portfolioPieGradient ? 'transparent' : DexTheme.backgroundDarkColor6 visible: visibility && !_control.hideHeader RowLayout { anchors.fill: parent @@ -237,7 +237,7 @@ InnerBackground { height: parent.height anchors.right: parent.right radius: parent.parent.height < 41 ? parent.parent.radius : 0 - color: DexTheme.dexBoxBackgroundColor + color: DexTheme.backgroundDarkColor6 visible: !isVertical && hidden DefaultText { id: _texto2 diff --git a/atomic_defi_design/Dex/Components/DexKeyChecker.qml b/atomic_defi_design/Dex/Components/DexKeyChecker.qml index fe8634f5e2..aa48c9771d 100644 --- a/atomic_defi_design/Dex/Components/DexKeyChecker.qml +++ b/atomic_defi_design/Dex/Components/DexKeyChecker.qml @@ -49,7 +49,7 @@ ColumnLayout { } function hintColor(valid) { - return valid ? DexTheme.greenColor : DexTheme.redColor + return valid ? DexTheme.okColor : DexTheme.warningColor } function hintPrefix(valid) { diff --git a/atomic_defi_design/Dex/Components/DexModal.qml b/atomic_defi_design/Dex/Components/DexModal.qml index 7b476bca3a..5ee466fbcb 100644 --- a/atomic_defi_design/Dex/Components/DexModal.qml +++ b/atomic_defi_design/Dex/Components/DexModal.qml @@ -16,7 +16,7 @@ Popup { modal: true padding: 0 Overlay.modeless: DefaultRectangle { - color: Dex.CurrentTheme.dexBoxBackgroundColor + color: Dex.CurrentTheme.backgroundDarkColor6 opacity: .3 } @@ -27,7 +27,7 @@ Popup { anchors.fill: parent border.width: 2 radius: parent.radius - color: Dex.CurrentTheme.dexBoxBackgroundColor + color: Dex.CurrentTheme.backgroundDarkColor6 Container { id: _header width: parent.width diff --git a/atomic_defi_design/Dex/Components/DexSweetComboBox.qml b/atomic_defi_design/Dex/Components/DexSweetComboBox.qml index e8a7086ab6..cc47e64e63 100644 --- a/atomic_defi_design/Dex/Components/DexSweetComboBox.qml +++ b/atomic_defi_design/Dex/Components/DexSweetComboBox.qml @@ -174,7 +174,7 @@ ComboBox highlighted: control.highlightedIndex === index contentItem: DefaultText { - text_value: "" + ticker + "" + " %1".arg(General.coinName(ticker)) + text_value: "" + ticker + "" + " %1".arg(General.coinName(ticker)) } background: DefaultRectangle diff --git a/atomic_defi_design/Dex/Components/DexTextField.qml b/atomic_defi_design/Dex/Components/DexTextField.qml index 485f4b449a..1764675b85 100644 --- a/atomic_defi_design/Dex/Components/DexTextField.qml +++ b/atomic_defi_design/Dex/Components/DexTextField.qml @@ -11,7 +11,8 @@ TextField property alias left_text: left_text.text_value property alias right_text: right_text.text_value property alias radius: background.radius - property alias backgroundColor: background.color + property color backgroundColor: Dex.CurrentTheme.textFieldBackgroundColor + property color backgroundColorActive: Dex.CurrentTheme.textFieldActiveBackgroundColor property bool forceFocus: false font: DexTypo.body2 @@ -30,7 +31,7 @@ TextField background: DefaultRectangle { id: background - color: text_field.focus ? Dex.CurrentTheme.textFieldActiveBackgroundColor : Dex.CurrentTheme.textFieldBackgroundColor + color: text_field.focus ? backgroundColorActive : backgroundColor radius: 18 anchors.fill: parent } diff --git a/atomic_defi_design/Dex/Components/EulaModal.qml b/atomic_defi_design/Dex/Components/EulaModal.qml index 4191801010..ad71f04fab 100644 --- a/atomic_defi_design/Dex/Components/EulaModal.qml +++ b/atomic_defi_design/Dex/Components/EulaModal.qml @@ -82,7 +82,7 @@ MultipageModal Layout.alignment: Qt.AlignRight - DefaultButton + CancelButton { text: close_only ? qsTr("Close") : qsTr("Cancel") radius: 18 diff --git a/atomic_defi_design/Dex/Components/LogModal.qml b/atomic_defi_design/Dex/Components/LogModal.qml index 570f96bf63..492856d7ef 100644 --- a/atomic_defi_design/Dex/Components/LogModal.qml +++ b/atomic_defi_design/Dex/Components/LogModal.qml @@ -21,7 +21,7 @@ MultipageModal { // Buttons footer: [ - DefaultButton { + CancelButton { text: qsTr("Close") Layout.fillWidth: true onClicked: root.close() diff --git a/atomic_defi_design/Dex/Components/LogoutModal.qml b/atomic_defi_design/Dex/Components/LogoutModal.qml index f205e15293..029a275a1f 100644 --- a/atomic_defi_design/Dex/Components/LogoutModal.qml +++ b/atomic_defi_design/Dex/Components/LogoutModal.qml @@ -25,7 +25,7 @@ MultipageModal { Layout.alignment: Qt.AlignHCenter horizontalAlignment: Text.AlignHCenter Layout.fillWidth: true - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor text_value: { for (let i = 0; i < orders.count; i++) diff --git a/atomic_defi_design/Dex/Components/PaginationButton.qml b/atomic_defi_design/Dex/Components/PaginationButton.qml index 5d850f8b2e..501fca07a0 100644 --- a/atomic_defi_design/Dex/Components/PaginationButton.qml +++ b/atomic_defi_design/Dex/Components/PaginationButton.qml @@ -1,6 +1,6 @@ import "../Components" -DexButton +DexAppButton { font.pixelSize: 12 } diff --git a/atomic_defi_design/Dex/Components/PairItemBadge.qml b/atomic_defi_design/Dex/Components/PairItemBadge.qml index a256f6a174..4fec7de383 100644 --- a/atomic_defi_design/Dex/Components/PairItemBadge.qml +++ b/atomic_defi_design/Dex/Components/PairItemBadge.qml @@ -1,102 +1,97 @@ +import bignumberjs 1.0 + import QtQuick 2.15 import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtGraphicalEffects 1.0 +import QtQuick.Controls.Universal 2.15 -import bignumberjs 1.0 - -import "../Constants" +import "../Constants" as Dex +import App 1.0 +import Dex.Themes 1.0 as Dex +import Dex.Components 1.0 as Dex -DefaultRectangle +DexRectangle { id: root - property alias ticker: ticker.text - property alias fullname: fullname.text - property string amount - - width: 260 - height: 66 radius: 10 + visible: enabled + opacity: .9 + color: Dex.CurrentTheme.innerBackgroundColor + property string ticker + property string fullname + property string amount + property int padding: 0 + property alias middle_text: middle_line.text_value + property alias bottom_text: bottom_line.text_value + Layout.fillHeight: true + Layout.fillWidth: true + Layout.leftMargin: 10 + Layout.rightMargin: 20 RowLayout { - Layout.fillWidth: true - Layout.fillHeight: true anchors.fill: parent - anchors.margins: 15 - spacing: 8 + anchors.centerIn: parent + Layout.leftMargin: 20 + Layout.rightMargin: 20 - Item { Layout.fillWidth: true } - - DefaultImage + Dex.Image { id: icon - Layout.preferredWidth: 35 - Layout.preferredHeight: 35 - Layout.alignment: Qt.AlignVCenter - source: General.coinIcon(root.ticker) + source: General.coinIcon(ticker) + Layout.preferredWidth: 40 + Layout.preferredHeight: 40 + Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft + Layout.leftMargin: 20 + Layout.rightMargin: 10 + Layout.topMargin: 0 + Layout.bottomMargin: 0 } - - Item { Layout.fillWidth: true } - ColumnLayout { - Layout.fillWidth: true - Layout.fillHeight: true + spacing: 2 Layout.alignment: Qt.AlignVCenter - spacing: 5 - DefaultText + Dex.Text { - id: ticker - Layout.fillWidth: true - font.pixelSize: 11 - horizontalAlignment: Text.AlignLeft - wrapMode: Text.NoWrap - } + Layout.preferredWidth: parent.width - 15 - DefaultText - { - Layout.fillWidth: true - font.pixelSize: 11 - horizontalAlignment: Text.AlignLeft + text_value: `${ticker}   ${fullname}` + font.pixelSize: Style.textSizeSmall3 + elide: Text.ElideRight wrapMode: Text.NoWrap - text: - { - BigNumber.config({ DECIMAL_PLACES: 6 }) - return new BigNumber(root.amount).toString(10) - } } - } - Item { Layout.fillWidth: true } - - ColumnLayout - { - Layout.fillWidth: true - Layout.fillHeight: true - Layout.alignment: Qt.AlignVCenter - spacing: 5 - - DefaultText + Dex.Text { - id: fullname + id: middle_line + + property string coin_value: amount + text: coin_value Layout.fillWidth: true - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignLeft - font.pixelSize: 11 + elide: Text.ElideRight + color: Dex.CurrentTheme.foregroundColor + font: DexTypo.body2 + wrapMode: Label.NoWrap + ToolTip.text: coin_value + Component.onCompleted: font.pixelSize = 11.5 } - DefaultText + Dex.Text { - id: amount_fiat - visible: text != '' + id: bottom_line + + property string fiat_value: General.getFiatText(amount, ticker) + text: fiat_value Layout.fillWidth: true - font.pixelSize: 11 - wrapMode: Text.NoWrap - horizontalAlignment: Text.AlignLeft elide: Text.ElideRight + color: Dex.CurrentTheme.foregroundColor + font: DexTypo.body2 + wrapMode: Label.NoWrap + ToolTip.text: fiat_value + Component.onCompleted: font.pixelSize = 11.5 } } - - Item { Layout.fillWidth: true } } -} +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/PasswordField.qml b/atomic_defi_design/Dex/Components/PasswordField.qml index 163d44ac01..6e7301354e 100644 --- a/atomic_defi_design/Dex/Components/PasswordField.qml +++ b/atomic_defi_design/Dex/Components/PasswordField.qml @@ -46,7 +46,7 @@ ColumnLayout { } function hintColor(valid) { - return valid ? DexTheme.greenColor : DexTheme.redColor + return valid ? DexTheme.okColor : DexTheme.warningColor } function hintPrefix(valid) { diff --git a/atomic_defi_design/Dex/Components/PopupManager.qml b/atomic_defi_design/Dex/Components/PopupManager.qml index 8d2a3d7f66..2093bacb80 100644 --- a/atomic_defi_design/Dex/Components/PopupManager.qml +++ b/atomic_defi_design/Dex/Components/PopupManager.qml @@ -12,7 +12,8 @@ Popup id: dialog width: 420 - height: _insideColumn.height > dialog.height ? _insideColumn.height + 82 : dialog.height + // There is a binding loop issue if this line is active + // height: _insideColumn.height > dialog.height ? _insideColumn.height + 82 : dialog.height dim: true modal: true anchors.centerIn: Overlay.overlay @@ -80,7 +81,8 @@ Popup contentItem: Qaterial.ClipRRect { width: dialog.width - height: _insideColumn.height > dialog.height ? _insideColumn.height + 92 : dialog.height + // There is a binding loop issue if this line is active + // height: _insideColumn.height > dialog.height ? _insideColumn.height + 92 : dialog.height radius: 18 focus: true Column @@ -254,7 +256,7 @@ Popup anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter width: parent.width - 80 - DexAppButton + CancelButton { id: cancelBtn visible: showCancelBtn @@ -338,7 +340,7 @@ Popup topPadding: 25 background: Rectangle { - color: DexTheme.dexBoxBackgroundColor + color: DexTheme.backgroundDarkColor6 } delegate: Qaterial.Button { @@ -348,7 +350,7 @@ Popup topInset: 0 opacity: enabled ? 1 : .6 enabled: DialogButtonBox.buttonRole === DialogButtonBox.RejectRole ? true : dialog.enableAcceptButton - backgroundColor: DialogButtonBox.buttonRole === DialogButtonBox.RejectRole ? 'transparent' : dialog.warning ? DexTheme.redColor : DexTheme.accentColor + backgroundColor: DialogButtonBox.buttonRole === DialogButtonBox.RejectRole ? 'transparent' : dialog.warning ? DexTheme.warningColor : DexTheme.accentColor property alias cursorShape: mouseArea.cursorShape Component.onCompleted: { diff --git a/atomic_defi_design/Dex/Components/SearchField.qml b/atomic_defi_design/Dex/Components/SearchField.qml index 1c18a39086..40bcae12df 100644 --- a/atomic_defi_design/Dex/Components/SearchField.qml +++ b/atomic_defi_design/Dex/Components/SearchField.qml @@ -51,8 +51,10 @@ Rectangle placeholderText: qsTr("Search") placeholderTextColor: Dex.CurrentTheme.textPlaceholderColor - onTextChanged: searchModel.setFilterFixedString(_textField.text) - Component.onDestruction: searchModel.setFilterFixedString("") + onTextChanged: Array.isArray(searchModel) ? "" : searchModel.setFilterFixedString(_textField.text) + + + Component.onDestruction: Array.isArray(searchModel) ? "" : searchModel.setFilterFixedString("") } DefaultRectangle diff --git a/atomic_defi_design/Dex/Components/Toast.qml b/atomic_defi_design/Dex/Components/Toast.qml index 3351d60831..e67142167d 100644 --- a/atomic_defi_design/Dex/Components/Toast.qml +++ b/atomic_defi_design/Dex/Components/Toast.qml @@ -36,7 +36,7 @@ AnimatedRectangle { radius: margin / 3 opacity: 0 - color: isError ? DexTheme.redColor : Style.colorTheme1 + color: isError ? DexTheme.warningColor : Style.colorTheme1 z: 1000 DexLabel { diff --git a/atomic_defi_design/Dex/Components/ZcashParamsModal.qml b/atomic_defi_design/Dex/Components/ZcashParamsModal.qml index c32d414c4c..30c642674a 100644 --- a/atomic_defi_design/Dex/Components/ZcashParamsModal.qml +++ b/atomic_defi_design/Dex/Components/ZcashParamsModal.qml @@ -78,7 +78,7 @@ Dex.MultipageModal onClicked: Qt.openUrlExternally("https://www.coinbureau.com/education/zcash-ceremony/") }, Item { Layout.fillWidth: true }, - Dex.DefaultButton + Dex.CancelButton { text: qsTr("Close") onClicked: close() diff --git a/atomic_defi_design/Dex/Components/qmldir b/atomic_defi_design/Dex/Components/qmldir index bc894bd813..dab8794241 100644 --- a/atomic_defi_design/Dex/Components/qmldir +++ b/atomic_defi_design/Dex/Components/qmldir @@ -20,3 +20,4 @@ TextField 1.0 DefaultTextField.qml TextFieldWithTitle 1.0 TextFieldWithTitle.qml ToolTip 1.0 DefaultTooltip.qml UserIcon 1.0 UserIcon.qml +CancelButton 1.0 CancelButton.qml \ No newline at end of file diff --git a/atomic_defi_design/Dex/Constants/DexTheme.qml b/atomic_defi_design/Dex/Constants/DexTheme.qml index 4104684b0b..7653d2e248 100644 --- a/atomic_defi_design/Dex/Constants/DexTheme.qml +++ b/atomic_defi_design/Dex/Constants/DexTheme.qml @@ -90,18 +90,14 @@ QtObject { property color headTextColor: accentColor - property color proviewItemBoxBackgroundColor: dexBoxBackgroundColor + property color proviewItemBoxBackgroundColor: backgroundDarkColor6 property color proviewItemBoxBorderColor: 'transparent' property color proviewItemBoxTitleColor: headTextColor property color proviewItemBoxIconColor: accentColor property int proviewItemBoxBorderWidth: 0 property color comboBoxBorderColor: rectangleBorderColor - property color comboBoxBackgroundColor: dexBoxBackgroundColor - - - property bool walletSidebarShadowVisibility: true - property color walletSidebarLeftBorderColor: backgroundColorDeep + property color comboBoxBackgroundColor: backgroundDarkColor6 property color leftSidebarBorderColor: rectangleBorderColor @@ -118,33 +114,11 @@ QtObject { property bool portfolioPieGradient: false - property color senderColorStart: redColor - property color receiverColorStart: greenColor - - + property color senderColorStart: warningColor + property color receiverColorStart: okColor - // Old Theme - property string chartTheme: Style.dark_theme ? "dark" : "light" - - property color surfaceColor: backgroundDarkColor2 - property color backgroundColorDeep: backgroundDarkColor2 - property color dexBoxBackgroundColor: backgroundDarkColor6 - - property color hightlightColor: accentDarkColor3 - property color hoverColor: buttonColorHovered - property color modalStepColor: accentColor - property color modelStepBorderColor: hightlightColor - - property int sidebarShadowRadius: 32 - property real sideBarAnimationDuration: Style.animationDuration - - property color chartTradingLineColor: Dex.CurrentTheme.chartTradingLineColor - property color chartTradingLineBackgroundColor: Dex.CurrentTheme.chartTradingLineBackgroundColor - property color lineChartColor: accentColor property color chartGridLineColor: Qt.rgba(255,255,255,0.4) - property color busyIndicatorColor: Dex.CurrentTheme.busyIndicatorColor - // Button property color buttonColorDisabled: Dex.CurrentTheme.buttonColorDisabled property color buttonColorHovered: Dex.CurrentTheme.buttonColorHovered @@ -155,6 +129,16 @@ QtObject { property color buttonColorTextEnabled: Dex.CurrentTheme.buttonTextEnabledColor property color buttonColorTextPressed: Dex.CurrentTheme.buttonTextPressedColor + property color buttonSecondaryColorDisabled: Dex.CurrentTheme.buttonSecondaryColorDisabled + property color buttonSecondaryColorEnabled: Dex.CurrentTheme.buttonSecondaryColorEnabled + property color buttonSecondaryColorHovered: Dex.CurrentTheme.buttonSecondaryColorHovered + property color buttonSecondaryColorPressed: Dex.CurrentTheme.buttonSecondaryColorPressed + + property color buttonCancelColorDisabled: Dex.CurrentTheme.buttonCancelColorDisabled + property color buttonCancelColorEnabled: Dex.CurrentTheme.buttonCancelColorEnabled + property color buttonCancelColorHovered: Dex.CurrentTheme.buttonCancelColorHovered + property color buttonCancelColorPressed: Dex.CurrentTheme.buttonCancelColorPressed + property color buttonGradientEnabled1: DexTheme.buttonColorEnabled property color buttonGradientEnabled2: DexTheme.buttonColorEnabled property color buttonGradientTextEnabled: DexTheme.foregroundColor @@ -174,30 +158,13 @@ QtObject { property color colorScrollbarGradient1: Style.colorScrollbarGradient1 property color colorScrollbarGradient2: Style.colorScrollbarGradient2 - property color greenColor: Dex.CurrentTheme.okColor - property color redColor: Dex.CurrentTheme.noColor + property color okColor: Dex.CurrentTheme.okColor + property color warningColor: Dex.CurrentTheme.warningColor + property color swapIconColor: Dex.CurrentTheme.swapIconColor // Widget settings property int rectangleRadius: Style.rectangleCornerRadius - - - - - - - - - - - - - - - - - - @@ -359,126 +326,9 @@ QtObject { function getValueColor(v) { v = parseFloat(v) if(v !== 0) - return v > 0 ? greenColor : redColor + return v > 0 ? okColor : warningColor return Style.colorWhite4 } - function getCoinColor(ticker) { - const c = colorCoin[ticker] - return c || Style.colorTheme2 - } - - readonly property var colorCoin: ({ - "ARPA": "#CCD9E2", - "BCH": "#8DC351", - "BTC": "#F7931A", - "CLC": "#0970DC", - "FTC": "#FFFFFF", - "GLEEC": "#8C41FF", - "GRS": "#377E96", - "DOGE": "#C3A634", - "ETH": "#627EEA", - "KMD": "#2B6680", - "MORTY": "#A4764D", - "RICK": "#A5CBDD", - "EMC2": "#00CCFF", - "DASH": "#008CE7", - "RVN": "#384182", - "DGB": "#006AD2", - "FIRO": "#BB2100", - "LTC": "#BFBBBB", - "ZEC": "#ECB244", - "ZER": "#FFFFFF", - "NAV": "#7D59B5", - "DP": "#E41D25", - "ECA": "#A915DC", - "QTUM": "#2E9AD0", - "CHIPS": "#598182", - "AXE": "#C63877", - "PANGEA": "#D88245", - "JUMBLR": "#2B4649", - "DEX": "#43B7B6", - "COQUI": "#79A541", - "CRYPTO": "#F58736", - "LABS": "#C1F6E1", - "MGW": "#854F2F", - "MONA": "#DEC799", - "NMC": "#186C9D", - "RFOX": "#D83331", - "BOTS": "#F69B57", - "MCL": "#EA0000", - "CCL": "#FFE400", - "BET": "#F69B57", - "SUPERNET": "#F69B57", - "OOT": "#25AAE1", - "REVS": "#F69B57", - "ILN": "#523170", - "VRSC": "#3164D3", - "THC": "#819F6F", - "1INCH": "#95A7C5", - "BAT": "#FF5000", - "BUSD": "#EDB70B", - "DAI": "#B68900", - "USDC": "#317BCB", - "PAX": "#EDE70A", - "SUSHI": "#E25DA8", - "TUSD": "#2E3181", - "AWC": "#31A5F6", - "VRA": "#D70A41", - "SPACE": "#E44C65", - "QC": "#00D7B3", - "PBC": "#64A3CB", - "AAVE": "#9C64A6", - "ANT": "#33DAE6", - "AGI": "#6815FF", - "BAND": "#526BFF", - "BLK": "#191919", - "BNT": "#000D2B", - "BTCZ": "#F5B036", - "CEL": "#4055A6", - "CENNZ": "#2E87F1", - "COMP": "#00DBA3", - "CRO": "#243565", - "CVC": "#3AB03E", - "CVT": "#4B0082", - "DODO": "#FFF706", - "ELF": "#2B5EBB", - "ENJ": "#6752C3", - "EURS": "#2F77ED", - "FUN": "#EF1C70", - "GNO": "#00B0CC", - "HOT": "#983EFF", - "IOTX": "#00CDCE", - "KNC": "#117980", - "LEO": "#F79B2C", - "LINK": "#356CE4", - "LRC": "#32C2F8", - "MANA": "#FF3C6C", - "MATIC": "#1E61ED", - "MED": "#00B5FF", - "MKR": "#1BAF9F", - "NPXS": "#F3CB00", - "POWR": "#05BCAA", - "QI": "#FFFFFF", - "QIAIR": "#FEFEFE", - "QKC": "#2175B4", - "QNT": "#46DDC8", - "REP": "#0E0E21", - "REV": "#78034D", - "RLC": "#FFE100", - "SFUSD": "#9881B8", - "SNT": "#596BED", - "SNX": "#00D1FF", - "SOULJA": "#8F734A", - "STORJ": "#2683FF", - "TSL": "#64B082", - "VRM": "#586A7A", - "WSB": "#FEBB84", - "WBTC": "#CCCCCC", - "YFI": "#006BE6", - "ZRX": "#302C2C", - "UNI": "#FF007A", - "RUNES": "#336699" - }) } diff --git a/atomic_defi_design/Dex/Constants/DexTypo.qml b/atomic_defi_design/Dex/Constants/DexTypo.qml index 55f4e4c55e..8df64967c7 100644 --- a/atomic_defi_design/Dex/Constants/DexTypo.qml +++ b/atomic_defi_design/Dex/Constants/DexTypo.qml @@ -3,8 +3,7 @@ pragma Singleton import QtQuick 2.15 import QtQuick.Layouts 1.15 import QtQuick.Controls 2.15 - -import App 1.0 as App +import QtQuick.Window 2.15 QtObject { id: _font @@ -12,7 +11,7 @@ QtObject { property real fontDensity: 1.0 property real languageDensity: { - switch (App.API.app.settings_pg.lang) { + switch (General.getLanguage()) { case "en": return 0.99999 case "fr": @@ -155,4 +154,16 @@ QtObject { family: "Courier", weight: Font.Normal }) + property font inputFieldFont: Qt.font({ + pixelSize: (16 * DexTypo.fontDensity) * (Screen.pixelDensity / 160), + letterSpacing: 0.5, + family: DexTypo.fontFamily, + weight: Font.Normal + }) + property font inputFieldSuffixFont: Qt.font({ + pixelSize: (14 * DexTypo.fontDensity) * (Screen.pixelDensity / 140), + letterSpacing: 0.1, + family: fontFamily, + weight: Font.Medium + }) } diff --git a/atomic_defi_design/Dex/Constants/General.qml b/atomic_defi_design/Dex/Constants/General.qml index f0d737d380..2577767cd9 100644 --- a/atomic_defi_design/Dex/Constants/General.qml +++ b/atomic_defi_design/Dex/Constants/General.qml @@ -4,10 +4,10 @@ import AtomicDEX.TradingError 1.0 import AtomicDEX.MarketMode 1.0 QtObject { - readonly property int width: 1280 - readonly property int height: 800 + readonly property int width: 1280 // Set for maximum user compatibility + readonly property int height: 720 // See https://gs.statcounter.com/screen-resolution-stats/desktop/worldwide readonly property int minimumWidth: 1280 - readonly property int minimumHeight: 800 + readonly property int minimumHeight: 720 readonly property int max_camo_pw_length: 256 readonly property int max_std_pw_length: 256 readonly property int max_pw_length: max_std_pw_length + max_camo_pw_length @@ -32,11 +32,40 @@ QtObject { { return coin_icons_path + ticker.toString().toLowerCase().replace('-', '_') + ".png" } + if (['Smart Chain'].indexOf(ticker) >= 0) + { + return coin_icons_path + ticker.toString().toLowerCase().replace(' ', '_') + ".png" + } const coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) - return (coin_info.is_custom_coin ? custom_coin_icons_path : coin_icons_path) + atomic_qt_utilities.retrieve_main_ticker(ticker.toString()).toLowerCase() + ".png" + let icon = atomic_qt_utilities.retrieve_main_ticker(ticker.toString()).toLowerCase() + ".png" + return (coin_info.is_custom_coin ? custom_coin_icons_path : coin_icons_path) + icon } } + function getChartTicker(ticker) + { + let coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) + return coin_info.livecoinwatch_id + } + + function coinWithoutSuffix(ticker) + { + if (ticker.search("-") > -1) + { + return ticker.split("-")[0] + } + else + { + return ticker + } + } + + function is_testcoin(ticker) + { + let coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) + return coin_info.is_testnet + } + function coinName(ticker) { if(ticker === "" || ticker === "All" || ticker===undefined) { return "" @@ -58,6 +87,21 @@ QtObject { return API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker).is_wallet_only } + function isFaucetCoin(ticker) + { + return API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker).is_faucet_coin + } + + function isCoinWithMemo(ticker) { + const coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) + return coin_info.has_memos + } + + function getLanguage() + { + return API.app.settings_pg.lang + } + function isZhtlc(ticker) { const coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) @@ -77,47 +121,50 @@ QtObject { { let progress = 100 if (!activation_status.hasOwnProperty("result")) return progress + const coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(coin) + let block_offset = coin_info.checkpoint_height let status = activation_status.result.status let details = activation_status.result.details - - let block_offset = 0 - if (coin == 'ARRR') block_offset = 1900000 - // use range from checkpoint block to present - if (status == "Ready") + if (!status) + { + return -1 + } + else if (status == "Ok") { if (details.hasOwnProperty("error")) - console.log("[zhtlcActivationProgress] Error enabling: " + JSON.stringify(details.error)) + console.log("["+coin+"] [zhtlcActivationProgress] Error enabling: " + JSON.stringify(details.error)) } else if (status == "InProgress") { if (details.hasOwnProperty("UpdatingBlocksCache")) { + block_offset = details.UpdatingBlocksCache.first_sync_block.actual let n = details.UpdatingBlocksCache.current_scanned_block - block_offset let d = details.UpdatingBlocksCache.latest_block - block_offset - progress = 5 + parseInt(n/d*15) + progress = 5 + parseInt(n/d*20) } else if (details.hasOwnProperty("BuildingWalletDb")) { + block_offset = details.BuildingWalletDb.first_sync_block.actual let n = details.BuildingWalletDb.current_scanned_block - block_offset let d = details.BuildingWalletDb.latest_block - block_offset - progress = 20 + parseInt(n/d*80) + progress = 45 + parseInt(n/d*60) + if (progress > 95) { + progress = 95 + } + } - else if (details.hasOwnProperty("RequestingBalance")) progress = 98 + else if (details.hasOwnProperty("RequestingBalance")) progress = 95 + else if (details.hasOwnProperty("ActivatingCoin")) progress = 5 else progress = 5 } - else console.log("[zhtlcActivationProgress] Unexpected status: " + status) - return progress - } - - function getNomicsId(ticker) { - if(ticker === "" || ticker === "All" || ticker===undefined) { - return "" - } else { - const nomics_id = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker).nomics_id - if (nomics_id == 'test-coin') return "" - return nomics_id + else console.log("["+coin+"] [zhtlcActivationProgress] Unexpected status: " + status) + if (progress > 100) { + progress = 98 } + + return progress } function coinContractAddress(ticker) { diff --git a/atomic_defi_design/Dex/Constants/Style.qml b/atomic_defi_design/Dex/Constants/Style.qml index ff2dbd105c..e53a2422bf 100644 --- a/atomic_defi_design/Dex/Constants/Style.qml +++ b/atomic_defi_design/Dex/Constants/Style.qml @@ -1,6 +1,7 @@ pragma Singleton import QtQuick 2.15 import Qaterial 1.0 as Qaterial +import Dex.Themes 1.0 as Dex QtObject { function setQaterialStyle() { @@ -65,7 +66,7 @@ QtObject { readonly property double hoverLightMultiplier: 1.5 readonly property double hoverOpacity: 0.6 - property bool dark_theme: true + property bool dark_theme: Dex.CurrentTheme.getColorMode() === Dex.CurrentTheme.ColorMode.Dark function applyOpacity(hex, opacity="00") { @@ -184,30 +185,32 @@ QtObject { { switch (type) { - case 'ERC-20': return getCoinColor("ETH") - case 'ZHTLC': return getCoinColor("ARRR") - case 'QRC-20': return getCoinColor("QTUM") - case 'Smart Chain': return getCoinColor("KMD") - case 'WALLET ONLY': return "#4D4D4D" - case 'UTXO': return getCoinColor("BTC") - case 'BEP-20': return getCoinColor("BNB") - case 'SLP': return getCoinColor("BCH") - case 'IDO': return getCoinColor("TKL") - case 'Matic': return getCoinColor("MATIC") - case 'Optimism': return "#BB2100" - case 'Arbitrum': return getCoinColor("ETH") - case 'AVX-20': return getCoinColor("AVAX") - case 'FTM-20': return getCoinColor("FTM") - case 'HRC-20': return getCoinColor("ONE") - case 'Ubiq': return getCoinColor("UBQ") - case 'KRC-20': return getCoinColor("KCS") - case 'Moonriver': return getCoinColor("MOVR") - case 'Moonbeam': return getCoinColor("GLMR") - case 'HecoChain': return getCoinColor("HECO") - case 'SmartBCH': return getCoinColor("SBCH") - case 'Ethereum Classic': return getCoinColor("ETC") - case 'RSK Smart Bitcoin': return getCoinColor("BTC") - default: return getCoinColor("BTC") + case 'IDO': return dark_theme ? colorCoinDark["IDO"] : colorCoin["IDO"] + case 'AVX-20': return dark_theme ? colorCoinDark["AVAX"] : colorCoin["AVAX"] + case 'ZHTLC': return dark_theme ? colorCoinDark["ARRR"] : colorCoin["ARRR"] + case 'COSMOS': return dark_theme ? colorCoinDark["ATOM"] : colorCoin["ATOM"] + case 'SLP': return dark_theme ? colorCoinDark["BCH"] : colorCoin["BCH"] + case 'BEP-20': return dark_theme ? colorCoinDark["BNB"] : colorCoin["BNB"] + case 'RSK Smart Bitcoin': return dark_theme ? colorCoinDark["UTXO"] : colorCoin["UTXO"] + case 'UTXO': return dark_theme ? colorCoinDark["UTXO"] : colorCoin["UTXO"] + case 'Ethereum Classic': return dark_theme ? colorCoinDark["ETC"] : colorCoin["ETC"] + case 'Arbitrum': return dark_theme ? colorCoinDark["ETH"] : colorCoin["ETH"] + case 'ERC-20': return dark_theme ? colorCoinDark["ETH"] : colorCoin["ETH"] + case 'EWT': return dark_theme ? colorCoinDark["EWT"] : colorCoin["EWT"] + case 'FTM-20': return dark_theme ? colorCoinDark["FTM"] : colorCoin["FTM"] + case 'Moonbeam': return dark_theme ? colorCoinDark["GLMR"] : colorCoin["GLMR"] + case 'HecoChain': return dark_theme ? colorCoinDark["HECO"] : colorCoin["HECO"] + case 'QRC-20': return dark_theme ? colorCoinDark["QTUM"] : colorCoin["QTUM"] + case 'KRC-20': return dark_theme ? colorCoinDark["KCS"] : colorCoin["KCS"] + case 'Smart Chain': return dark_theme ? colorCoinDark["KMD"] : colorCoin["KMD"] + case 'Matic': return dark_theme ? colorCoinDark["MATIC"] : colorCoin["MATIC"] + case 'Moonriver': return dark_theme ? colorCoinDark["MOVR"] : colorCoin["MOVR"] + case 'HRC-20': return dark_theme ? colorCoinDark["ONE"] : colorCoin["ONE"] + case 'SmartBCH': return dark_theme ? colorCoinDark["SBCH"] : colorCoin["SBCH"] + case 'Ubiq': return dark_theme ? colorCoinDark["UBQ"] : colorCoin["UBQ"] + case 'Optimism': return "#BB2100" + case 'WALLET ONLY': return dark_theme ? colorCoinDark["WALLET ONLY"] : colorCoin["WALLET ONLY"] + default: return dark_theme ? colorCoinDark["default"] : colorCoin["default"] } } @@ -220,277 +223,104 @@ QtObject { } } + function getCoinGroupTextColor(type) + { + switch (type) + { + case 'IDO': return dark_theme ? colorCoinDark["IDO"] : colorCoin["IDO"] + case 'AVX-20': return dark_theme ? colorCoinDark["AVAX"] : colorCoin["AVAX"] + case 'ZHTLC': return dark_theme ? colorCoinDark["ARRR"] : colorCoin["ARRR"] + case 'COSMOS': return dark_theme ? colorCoinDark["ATOM"] : colorCoin["ATOM"] + case 'SLP': return dark_theme ? colorCoinDark["BCH"] : colorCoin["BCH"] + case 'BEP-20': return dark_theme ? colorCoinDark["BNB"] : colorCoin["BNB"] + case 'RSK Smart Bitcoin': return dark_theme ? colorCoinDark["UTXO"] : colorCoin["UTXO"] + case 'UTXO': return dark_theme ? colorCoinDark["UTXO"] : colorCoin["UTXO"] + case 'Ethereum Classic': return dark_theme ? colorCoinDark["ETC"] : colorCoin["ETC"] + case 'Arbitrum': return dark_theme ? colorCoinDark["ETH"] : colorCoin["ETH"] + case 'ERC-20': return dark_theme ? colorCoinDark["ETH"] : colorCoin["ETH"] + case 'EWT': return dark_theme ? colorCoinDark["EWT"] : colorCoin["EWT"] + case 'FTM-20': return dark_theme ? colorCoinDark["FTM"] : colorCoin["FTM"] + case 'Moonbeam': return dark_theme ? colorCoinDark["GLMR"] : colorCoin["GLMR"] + case 'HecoChain': return dark_theme ? colorCoinDark["HECO"] : colorCoin["HECO"] + case 'QRC-20': return dark_theme ? colorCoinDark["QTUM"] : colorCoin["QTUM"] + case 'KRC-20': return dark_theme ? colorCoinDark["KCS"] : colorCoin["KCS"] + case 'Smart Chain': return dark_theme ? colorCoinDark["KMD"] : colorCoin["KMD"] + case 'Matic': return dark_theme ? colorCoinDark["MATIC"] : colorCoin["MATIC"] + case 'Moonriver': return dark_theme ? colorCoinDark["MOVR"] : colorCoin["MOVR"] + case 'HRC-20': return dark_theme ? colorCoinDark["ONE"] : colorCoin["ONE"] + case 'SmartBCH': return dark_theme ? colorCoinDark["SBCH"] : colorCoin["SBCH"] + case 'Ubiq': return dark_theme ? colorCoinDark["UBQ"] : colorCoin["UBQ"] + case 'Optimism': return "#BB2100" + case 'WALLET ONLY': return dark_theme ? colorCoinDark["WALLET ONLY"] : colorCoin["WALLET ONLY"] + default: return dark_theme ? colorCoinDark["default"] : colorCoin["default"] + } + } + function getCoinColor(ticker) { - const c = colorCoin[atomic_qt_utilities.retrieve_main_ticker(ticker)] - return c || Style.colorTheme2 + let info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) + if (!info.type) { return colorWhite3 } + let color = getCoinGroupTextColor(info.type) + let base_ticker = atomic_qt_utilities.retrieve_main_ticker(ticker) + if (colorCoin.hasOwnProperty(base_ticker) && !dark_theme) + { + return colorCoin[base_ticker] + } + if (colorCoinDark.hasOwnProperty(base_ticker) && dark_theme) + { + return colorCoinDark[base_ticker] + } + return color } readonly property var colorCoin: ({ - "ABY": "#8B0D10", - "ACTN": "#E84142", - "ADA": "#214D78", - "ADX": "#1B75BC", - "ANKR": "#2075E8", - "APE": "#0052F2", - "ARPA": "#CCD9E2", "ARRR": "#C7A34C", - "ATOM": "#474B6C", - "AUR": "#0A6C5E", - "AVA": "#5B567F", + "ATOM": "#963b9a", "AVAX": "#E84142", - "AVN": "#33E0CE", - "AXS": "#0055D5", - "BAL": "#4D4D4D", - "BNB": "#F9D987", + "BNB": "#b35900", "BCH": "#8DC351", - "BIDR": "#F0B90B", - "BRZ": "#B5DEC3", - "BSTY": "#78570D", - "BTC": "#E9983C", - "RBTC": "#E9983C", - "BTT": "#666666", - "BTTC": "#666666", - "BTE": "#FFE201", - "BTX": "#FB30A6", - "CAKE": "#D1884F", - "CASE": "#FFFF12", - "CDN": "#90191C", - "CLC": "#0970DC", - "CRV": "#517AB5", - "DGC": "#BC7600", - "DIMI": "#0BFBE2", - "DOI": "#120641", - "DUST": "#6A032F", - "EOS": "#4D4D4D", - "FET": "#202944", - "FLOW": "#00EF8B", - "FTC": "#FFFFFF", - "FTM": "#13B5EC", - "GALA": "#011B36", - "GLEEC": "#8C41FF", - "GRMS": "#12B690", - "GLM": "#0050E6", - "GMS": "#0BFBE2", - "GMT": "#E9CB7B", - "GMX": "#07A9E6", - "GRS": "#377E96", - "GRT": "#6E54DB", - "GST": "#D7D7D7", - "IOTA": "#404040", - "ILNF": "#28873b", - "IC": "#72009D", - "JST": "#B41514", - "JSTR": "#627EEA", - "DOGE": "#C3A634", "ETC": "#328432", "ETH": "#687DE3", - "ETHR": "#627EEA", - "KMD": "#7490AA", - "KCS": "#25AF90", - "KSM": "#595959", - "MORTY": "#A4764D", - "RICK": "#A5CBDD", - "EMC2": "#00CCFF", - "INJ": "#17EAE9", - "JPYC": "#16449A", - "DASH": "#008CE7", - "RVN": "#384182", - "SAND": "#05C1F4", - "CADC": "#FF6666", - "DGB": "#006AD2", - "DIA": "#B94897", - "DOT": "#E80082", - "FLUX": "#2B61D1", - "FIRO": "#BB2100", - "LBC": "#00775C", - "LDO": "#F69988", - "LOOM": "#48BEFF", - "LTC": "#BFBBBB", - "LUNA": "#FFD83D", - "LYNX": "#0071BA", - "LTFN": "#0099CC", - "MIR": "#2C9FEF", - "XPM": "#A67522", - "XVC": "#B50126", - "ZEC": "#ECB244", - "ZER": "#FFFFFF", - "NAV": "#7D59B5", - "DP": "#E41D25", - "ECA": "#A915DC", + "EWT": "#A466FF", + "FTM": "#13B5EC", + "HECO": "#00953F", + "GLMR": "#F6007C", "QTUM": "#2E9AD0", - "UBQ": "#00EB90", - "CHIPS": "#598182", - "CIPHS": "#ECD900", - "AXE": "#C63877", - "PANGEA": "#D88245", - "JUMBLR": "#2B4649", - "DEX": "#43B7B6", - "CRYPTO": "#F58736", - "LABS": "#C1F6E1", - "LCC": "#068210", - "LNC": "#C3A635", - "MESH": "#0098DA", - "MGW": "#854F2F", - "MONA": "#DEC799", + "KCS": "#25AF90", + "KMD": "#2d4f86", "MOVR": "#52CCC9", + "MATIC": "#804EE1", + "ONE": "#00BEEE", + "SBCH": "#74dd54", + "UBQ": "#00EB90", + "UTXO": "#349d5f", + "default": "#2f2f2f", + "IDO": "#536E93", + "WALLET ONLY": "#404040" + }) + + readonly property var colorCoinDark: ({ + "ARRR": "#C7A34C", + "ATOM": "#963b9a", + "AVAX": "#E84142", + "BNB": "#ffc266", + "BCH": "#8DC351", + "ETC": "#328432", + "ETH": "#687DE3", + "EWT": "#A466FF", + "FTM": "#13B5EC", + "HECO": "#00953F", "GLMR": "#F6007C", - "NMC": "#186C9D", - "NZDS": "#1B3044", - "RFOX": "#D83331", - "BOTS": "#F69B57", - "MC": "#E16428", - "MCL": "#EA0000", - "ILNSW": "#28873B", - "MM": "#F5B700", - "CCL": "#FFE400", - "BET": "#F69B57", - "JCHF": "#D80027", - "JEUR": "#003399", - "JGBP": "#C8102E", - "JJPY": "#BC002D", - "JRT": "#5EFC84", - "SUPERNET": "#F69B57", - "REVS": "#F69B57", - "EILN": "#1ADEC9", - "ILN": "#814EB1", - "VRSC": "#3164D3", - "WCN": "#E49F00", - "WWCN": "#E49F00", - "TFT": "#80C7CF", - "THC": "#819F6F", - "1INCH": "#95A7C5", - "BABYDOGE": "#F3AA47", - "BAT": "#FF5000", - "BUSD": "#F0B90B", - "HUSD": "#0075FB", - "DAI": "#B68900", - "USDC": "#317BCB", - "USDI": "#C29E47", - "USDT": "#26A17B", - "PAX": "#408C69", - "PAXG": "#DABE37", - "REN": "#595959", - "SMTF": "#F75836", - "SUSHI": "#E25DA8", - "TRYB": "#0929AA", - "TUSD": "#2E3181", - "AWC": "#31A5F6", - "VRA": "#D70A41", - "SPACE": "#E44C65", - "QC": "#00D7B3", - "PBC": "#64A3CB", - "AAVE": "#9C64A6", - "ANT": "#33DAE6", - "AGIX": "#6815FF", - "BAND": "#526BFF", - "BLK": "#595959", - "IL8P": "#696969", - "BNT": "#0000FF", - "BTCZ": "#F5B036", - "CEL": "#4055A6", - "CELR": "#595959", - "CENNZ": "#2E87F1", - "CHTA": "#C3A634", - "COMP": "#00DBA3", - "CRO": "#243565", - "CVC": "#3AB03E", - "CVT": "#4B0082", - "PIC": "#04D9FF", - "DODO": "#FAF621", - "EFL": "#FF940B", - "EGLD": "#1D4CB5", - "ELF": "#2B5EBB", - "ENJ": "#6752C3", - "EURS": "#2F77ED", - "FIL": "#4CCAD2", - "FJC": "#00AFEC", - "FJCB": "#FFCC33", - "FUN": "#EF1C70", - "GNO": "#00B0CC", - "HOT": "#983EFF", - "HECO": "#00953F", - "IOTX": "#00CDCE", - "KNC": "#117980", - "LEO": "#F79B2C", - "LINK": "#356CE4", - "LRC": "#32C2F8", - "LSTR": "#7E3193", - "MANA": "#FF3C6C", + "QTUM": "#2E9AD0", + "KCS": "#25AF90", + "KMD": "#799bd2", + "MOVR": "#52CCC9", "MATIC": "#804EE1", - "MKR": "#1BAF9F", - "MINDS": "#687DE3", - "NEAR": "#595959", - "NENG": "#BFBBBB", - "NEXO": "#A3B3D6", - "NVC": "#FCF96D", - "NYAN": "#008CE7", - "OCEAN": "#595959", - "OMG": "#595959", "ONE": "#00BEEE", - "ONT": "#2692AF", - "PND": "#EBD430", - "POWR": "#05BCAA", - "PPC": "#46BC60", - "PRUX": "#FF8000", - "PRCY": "#012828", - "QI": "#FFFFFF", - "QIAIR": "#FEFEFE", - "QKC": "#2175B4", - "QNT": "#000000", - "REP": "#0E0E21", - "REV": "#78034D", - "RLC": "#FFE100", - "RTM": "#B74427", "SBCH": "#74dd54", - "SIBM": "#0C4855", - "SFUSD": "#9881B8", - "SNT": "#596BED", - "SNX": "#00D1FF", - "SOL": "#7BFBB5", - "SOULJA": "#8F734A", - "STFIRO": "#00D4F7", - "STORJ": "#2683FF", - "SXP": "#FD5F3B", - "SYS": "#0084C7", - "TEL": "#1BD8FF", - "TKL": "#536E93", - "TON": "#0088CC", - "TRC": "#096432", - "TRX": "#F30031", - "TSL": "#64B082", - "UIS": "#008DCD", - "UNO": "#2F87BB", - "UST": "#5493F7", - "VAL": "#1EEC84", - "VET": "#18C6FF", - "VITE": "#007AFF", - "VRM": "#586A7A", - "VTC": "#049161", - "WSB": "#FEBB84", - "WAVES": "#016BFF", - "WBTC": "#CCCCCC", - "WHIVE": "#FFCC00", - "WOO": "#595959", - "XEC": "#273498", - "XEP": "#0277E5", - "XLM": "#737373", - "XMY": "#F01385", - "XRP": "#2E353D", - "XRG": "#162D50", - "XSGD": "#1048E5", - "XTZ": "#A8E000", - "XVS": "#F4BC54", - "YFI": "#006BE6", - "YFII": "#FF2A79", - "ZET": "#155169", - "ZIL": "#42BBB9", - "ZOMBIE": "#72B001", - "ZRX": "#302C2C", - "UNI": "#FF007A", - "VOTE2022": "#7490AA", - "USBL": "#279553", - "RUNES": "#336699", - "SIX": "#ed0909", - "NATURE": "#04cf13" + "UBQ": "#00EB90", + "UTXO": "#349d5f", + "default": "#c8c8c8", + "IDO": "#536E93", + "WALLET ONLY": "#cccccc" }) } diff --git a/atomic_defi_design/Dex/Dashboard/FatalErrorModal.qml b/atomic_defi_design/Dex/Dashboard/FatalErrorModal.qml index e4bc2646d4..2213fb772f 100644 --- a/atomic_defi_design/Dex/Dashboard/FatalErrorModal.qml +++ b/atomic_defi_design/Dex/Dashboard/FatalErrorModal.qml @@ -32,7 +32,7 @@ MultipageModal { } footer: [ - DefaultButton { + CancelButton { Layout.fillWidth: true text: qsTr("Close") onClicked: root.close() diff --git a/atomic_defi_design/Dex/Dashboard/NotificationsModal.qml b/atomic_defi_design/Dex/Dashboard/NotificationsModal.qml index c6d8fa9e79..2d2cb5e9c9 100644 --- a/atomic_defi_design/Dex/Dashboard/NotificationsModal.qml +++ b/atomic_defi_design/Dex/Dashboard/NotificationsModal.qml @@ -32,10 +32,11 @@ DexPopup readonly property string check_internet_connection_text: qsTr("Please check your internet connection (e.g. VPN service or firewall might block it).") - function reset() + function reset(close_after_reset = false) { notifications_list = [] - root.close() + if (close_after_reset) + root.close() } enum NotificationKind @@ -80,7 +81,7 @@ DexPopup app.pageLoader.item.switchPage(Dashboard.PageType.DEX) break case "open_log_modal": - showError(notification.getTitle(), notification.long_message) + showError(getNotificationTitle(notification), notification.long_message) break default: console.warn("Unknown notification click action", notification.click_action) @@ -234,28 +235,20 @@ DexPopup function onBalanceUpdateStatus(am_i_sender, amount, ticker, human_date, timestamp) { - - if (!app.segwit_on) + if (amount != 0) { - if (amount != 0) - { - newNotification( - balanceUpdateStatusNotification, - { - am_i_sender, - amount, - ticker, - human_date, - timestamp - }, - timestamp, + newNotification( + balanceUpdateStatusNotification, + { + am_i_sender, + amount, + ticker, human_date, - "open_wallet_page") - } - } - else - { - app.segwit_on = false + timestamp + }, + timestamp, + human_date, + "open_wallet_page") } } @@ -622,12 +615,12 @@ DexPopup } OutlineButton - { - text: qsTr('Mark all as read') + { + text: notifications_list.length !== 0 ? qsTr('Mark all as read') : qsTr('Close') height: 40 width: 260 Layout.alignment: Qt.AlignHCenter - onClicked: root.reset() + onClicked: notifications_list.length !== 0 ? root.reset(false) : root.reset(true) } } } diff --git a/atomic_defi_design/Dex/Exchange/Exchange.qml b/atomic_defi_design/Dex/Exchange/Exchange.qml index fb405c887f..8751d0baa4 100644 --- a/atomic_defi_design/Dex/Exchange/Exchange.qml +++ b/atomic_defi_design/Dex/Exchange/Exchange.qml @@ -9,7 +9,8 @@ import App 1.0 Item { id: exchange - readonly property int layout_margin: 15 + readonly property int layout_margin: 12 + width: 450 property int current_page: idx_exchange_trade diff --git a/atomic_defi_design/Dex/Exchange/ProView/Chart.qml b/atomic_defi_design/Dex/Exchange/ProView/Chart.qml index 4dbc9dc49d..80766a3d06 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/Chart.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/Chart.qml @@ -15,43 +15,62 @@ Item readonly property string theme: Dex.CurrentTheme.getColorMode() === Dex.CurrentTheme.ColorMode.Dark ? "dark" : "light" property string loaded_symbol property bool pair_supported: false + property string selected_testcoin onPair_supportedChanged: if (!pair_supported) webEngineViewPlaceHolder.visible = false - function loadChart(right_ticker, left_ticker, force = false, source="nomics") + function loadChart(right_ticker, left_ticker, force = false, source="livecoinwatch") { + + //
+ let chart_html = "" let symbol = "" + let widget_x = 385 + let widget_y = 150 + let scale_x = root.width / widget_x + let scale_y = root.height / widget_y - if (source == "nomics") + if (source == "livecoinwatch") { - let right_ticker_full = General.coinName(right_ticker) - let right_ticker_id = General.getNomicsId(right_ticker) - let left_ticker_id = General.getNomicsId(left_ticker) - - if (right_ticker_id != "" && left_ticker_id != "") + selected_testcoin = "" + if (General.is_testcoin(left_ticker)) { - symbol = right_ticker_id+"-"+left_ticker_id + pair_supported = false + selected_testcoin = left_ticker + return + } + if (General.is_testcoin(right_ticker)) + { + pair_supported = false + selected_testcoin = right_ticker + return + } + let rel_ticker = General.getChartTicker(right_ticker) + let base_ticker = General.getChartTicker(left_ticker) + if (rel_ticker != "" && base_ticker != "") + { pair_supported = true + symbol = rel_ticker+"-"+base_ticker if (symbol === loaded_symbol && !force) { webEngineViewPlaceHolder.visible = true return } - - loaded_symbol = symbol - chart_html = ` - - -
- - ` + +
+ ` } } + // console.log(chart_html) if (chart_html == "") { @@ -78,7 +97,7 @@ Item loaded_symbol = symbol - let chart_html = ` + chart_html = ` @@ -118,6 +137,17 @@ Item catch (e) { console.error(e) } } +// Currently chart should not resize, but in future it might be needed + +// onWidthChanged: { +// try +// { +// loadChart(left_ticker?? atomic_app_primary_coin, +// right_ticker?? atomic_app_secondary_coin) +// } +// catch (e) { console.error(e) } +// } + RowLayout { anchors.fill: parent @@ -140,8 +170,16 @@ Item DefaultText { - visible: !pair_supported - text_value: qsTr("There is no chart data for this pair yet") + visible: !pair_supported && selected_testcoin == "" + text_value: qsTr("There is no chart data for this pair") + Layout.topMargin: 30 + Layout.alignment: Qt.AlignCenter + } + + DefaultText + { + visible: !pair_supported && selected_testcoin != "" + text_value: qsTr("There is no chart data for %1 (testcoin) pairs").arg(selected_testcoin) Layout.topMargin: 30 Layout.alignment: Qt.AlignCenter } @@ -151,6 +189,7 @@ Item { id: webEngineViewPlaceHolder anchors.fill: parent + anchors.centerIn: parent visible: false Component.onCompleted: diff --git a/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml b/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml index 368bce3c3c..aeae50a0c7 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml @@ -10,6 +10,7 @@ import App 1.0 import Dex.Themes 1.0 as Dex import Dex.Components 1.0 as Dex + RowLayout { id: root @@ -17,6 +18,7 @@ RowLayout property int padding: 0 property var details property color color: !details ? "white" : Style.getCoinColor(details.ticker) + property alias middle_text: middle_line.text_value property alias bottom_text: bottom_line.text_value property int activation_progress: Dex.General.zhtlcActivationProgress(details.activation_status, details.ticker) @@ -26,8 +28,8 @@ RowLayout { id: icon source: General.coinIcon(details.ticker) - Layout.preferredWidth: 32 - Layout.preferredHeight: 45 + Layout.preferredWidth: 40 + Layout.preferredHeight: 40 Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft Layout.leftMargin: padding Layout.topMargin: Layout.leftMargin @@ -37,8 +39,8 @@ RowLayout { anchors.centerIn: parent anchors.fill: parent - radius: 15 - enabled: Dex.General.isZhtlc(details.ticker) ? activation_progress != 100 : false + radius: 10 + enabled: Dex.General.isZhtlc(details.ticker) ? activation_progress < 100 : false visible: enabled opacity: .9 color: Dex.DexTheme.backgroundColor @@ -48,13 +50,13 @@ RowLayout { anchors.centerIn: parent anchors.fill: parent - enabled: Dex.General.isZhtlc(details.ticker) ? activation_progress != 100 : false + enabled: Dex.General.isZhtlc(details.ticker) ? activation_progress < 100 : false visible: enabled horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: activation_progress + "%" font: Dex.DexTypo.body2 - color: Dex.DexTheme.greenColor + color: Dex.DexTheme.okColor } ColumnLayout @@ -62,7 +64,8 @@ RowLayout anchors.left: parent.right anchors.leftMargin: 12 anchors.verticalCenter: parent.verticalCenter - width: root.width - 40 + width: root.width - 48 + spacing: 3 Dex.Text { @@ -77,18 +80,32 @@ RowLayout Dex.Text { - id: bottom_line + id: middle_line - property string real_value: !details ? "" : - details.balance + " (" + General.formatFiat("", details.main_currency_balance, API.app.settings_pg.current_fiat_sign) + ")" + property string coin_value: !details ? "" : details.balance + text: 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 + } + + Dex.Text + { + id: bottom_line - text: real_value + property string fiat_value: !details ? "" : + General.formatFiat("", details.main_currency_balance, API.app.settings_pg.current_fiat_sign) + text: fiat_value Layout.fillWidth: true elide: Text.ElideRight color: Dex.CurrentTheme.foregroundColor font: DexTypo.body2 wrapMode: Label.NoWrap - ToolTip.text: real_value + ToolTip.text: fiat_value Component.onCompleted: font.pixelSize = 11.5 } } diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/Main.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/Main.qml index 62e2c1675d..4a1b5d710d 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/Main.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/Main.qml @@ -23,7 +23,7 @@ Widget readonly property bool trade_preimage_ready: fees.hasOwnProperty('base_transaction_fees_ticker') readonly property bool can_submit_trade: last_trading_error === TradingError.None - margins: 15 + margins: 10 collapsable: false Connections { @@ -75,13 +75,13 @@ Widget Layout.bottomMargin: 2 Layout.alignment: Qt.AlignHCenter Layout.preferredWidth: parent.width - height: 40 + height: 32 MarketModeSelector { Layout.alignment: Qt.AlignLeft Layout.preferredWidth: (parent.width / 100) * 46 - Layout.preferredHeight: 40 + Layout.preferredHeight: 32 marketMode: MarketMode.Buy ticker: atomic_qt_utilities.retrieve_main_ticker(left_ticker) } @@ -92,7 +92,7 @@ Widget { Layout.alignment: Qt.AlignRight Layout.preferredWidth: (parent.width / 100) * 46 - Layout.preferredHeight: 40 + Layout.preferredHeight: 32 ticker: atomic_qt_utilities.retrieve_main_ticker(left_ticker) } } @@ -100,7 +100,7 @@ Widget // Protocol text for platform tokens Item { - height: 40 + height: 32 Layout.alignment: Qt.AlignHCenter Layout.preferredWidth: parent.width visible: protocolIcon != "" @@ -151,7 +151,7 @@ Widget { Layout.alignment: Qt.AlignHCenter Layout.preferredWidth: parent.width - height: 40 + height: 32 RowLayout { @@ -163,7 +163,7 @@ Widget DefaultText { Layout.leftMargin: 15 - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor text: qsTr("Order Selected") } @@ -174,7 +174,7 @@ Widget Layout.preferredHeight: parent.height Layout.preferredWidth: 30 Layout.rightMargin: 5 - foregroundColor: Dex.CurrentTheme.noColor + foregroundColor: Dex.CurrentTheme.warningColor onClicked: { API.app.trading_pg.reset_order() reset_fees_state() @@ -184,7 +184,7 @@ Widget { anchors.centerIn: parent iconSize: 16 - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor source: Qaterial.Icons.close } } @@ -196,7 +196,7 @@ Widget anchors.fill: parent radius: 8 color: 'transparent' - border.color: Dex.CurrentTheme.noColor + border.color: Dex.CurrentTheme.warningColor } } @@ -204,7 +204,7 @@ Widget { id: formBase width: parent.width - height: 340 + height: 330 Layout.alignment: Qt.AlignHCenter } @@ -213,7 +213,7 @@ Widget // Error messages Item { - height: 60 + height: 55 Layout.preferredWidth: parent.width // Show errors @@ -225,7 +225,7 @@ Widget anchors.centerIn: parent horizontalAlignment: Text.AlignHCenter font.pixelSize: Style.textSizeSmall4 - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor text_value: General.getTradingError( last_trading_error, curr_fee_info, @@ -237,7 +237,7 @@ Widget TotalView { - height: 80 + height: 70 Layout.preferredWidth: parent.width Layout.alignment: Qt.AlignHCenter } @@ -245,11 +245,11 @@ Widget DexGradientAppButton { id: swap_btn - height: 40 - Layout.preferredWidth: parent.width - 20 + height: 32 + Layout.preferredWidth: parent.width - 30 Layout.alignment: Qt.AlignHCenter - radius: 18 + radius: 16 text: qsTr("START SWAP") font.weight: Font.Medium enabled: can_submit_trade && !show_waiting_for_trade_preimage && errors.text_value == "" diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/MarketModeSelector.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/MarketModeSelector.qml index 6eb535000b..b4ffbdbf17 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/MarketModeSelector.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/MarketModeSelector.qml @@ -11,6 +11,7 @@ Rectangle property string ticker: "" radius: 18 + opacity: marketMode != API.app.trading_pg.market_mode ? 0.1 : 1 gradient: Gradient { @@ -32,28 +33,6 @@ Rectangle } } - // Background on topover of gradient to hide it when the market mode is different - DefaultRectangle - { - anchors.centerIn: parent - width: parent.width - 2 - height: parent.height - 2 - radius: parent.radius - 1 - color: Dex.CurrentTheme.backgroundColor - visible: marketMode != API.app.trading_pg.market_mode - } - - // Background when market mode is different - DefaultRectangle - { - anchors.centerIn: parent - width: parent.width - 2 - height: parent.height - 2 - radius: parent.radius - 1 - color: Dex.CurrentTheme.tradeMarketModeSelectorNotSelectedBackgroundColor - visible: marketMode != API.app.trading_pg.market_mode - } - DefaultText { anchors.centerIn: parent diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml index 99f66e762d..ddbf9c89b4 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml @@ -18,7 +18,7 @@ ColumnLayout } readonly property string total_amount: API.app.trading_pg.total_amount - readonly property int input_height: 70 + readonly property int input_height: 65 readonly property int subfield_margin: 5 @@ -68,7 +68,7 @@ ColumnLayout color: enabled ? Dex.CurrentTheme.foregroundColor : Dex.CurrentTheme.foregroundColor2 text: backend_price ? backend_price : General.formatDouble(API.app.trading_pg.cex_price) width: parent.width - height: 41 + height: 36 radius: 18 onTextChanged: setPrice(text) @@ -118,11 +118,11 @@ ColumnLayout { id: input_volume width: parent.width - height: 41 + height: 36 radius: 18 - left_text: qsTr("Volume") + left_text: sell_mode ? qsTr("Send") : qsTr("Receive") right_text: left_ticker - placeholderText: sell_mode ? qsTr("Amount to sell") : qsTr("Amount to receive") + placeholderText: "0" text: API.app.trading_pg.volume onTextChanged: setVolume(text) } @@ -168,7 +168,7 @@ ColumnLayout { id: input_minvolume width: parent.width - height: 41 + height: 36 radius: 18 left_text: qsTr("Min Volume") right_text: left_ticker @@ -211,7 +211,7 @@ ColumnLayout Item { Layout.preferredWidth: parent.width - Layout.preferredHeight: 30 + Layout.preferredHeight: 24 visible: !_useCustomMinTradeAmountCheckbox.checked DefaultText @@ -228,7 +228,7 @@ ColumnLayout Layout.rightMargin: 2 Layout.leftMargin: 2 Layout.preferredWidth: parent.width - Layout.preferredHeight: 30 + Layout.preferredHeight: 28 spacing: 5 DefaultCheckBox diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderFormSubfield.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderFormSubfield.qml index 1370518b6a..c39c0619c4 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderFormSubfield.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderFormSubfield.qml @@ -33,13 +33,12 @@ RowLayout width: btn_width height: parent.height - // Background when market mode is different DefaultRectangle { anchors.centerIn: parent width: parent.width height: parent.height - color: Dex.CurrentTheme.tradeMarketModeSelectorNotSelectedBackgroundColor + color: Dex.CurrentTheme.inputModifierBackgroundColor } DefaultText @@ -94,13 +93,12 @@ RowLayout width: btn_width height: parent.height - // Background when market mode is different DefaultRectangle { anchors.centerIn: parent width: parent.width height: parent.height - color: Dex.CurrentTheme.tradeMarketModeSelectorNotSelectedBackgroundColor + color: Dex.CurrentTheme.inputModifierBackgroundColor DefaultMouseArea { @@ -155,14 +153,13 @@ RowLayout width: btn_width height: parent.height - // Background when market mode is different DefaultRectangle { id: right_rect anchors.centerIn: parent width: parent.width height: parent.height - color: Dex.CurrentTheme.tradeMarketModeSelectorNotSelectedBackgroundColor + color: Dex.CurrentTheme.inputModifierBackgroundColor } DefaultText diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/TotalView.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/TotalView.qml index 588c1a054b..83d6e8a380 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/TotalView.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/TotalView.qml @@ -24,7 +24,7 @@ ColumnLayout Layout.fillWidth: true Layout.alignment: Qt.AlignLeft color: Dex.CurrentTheme.foregroundColor3 - text: "Total " + API.app.settings_pg.current_fiat + " " + General.cex_icon + text: "Trade Value " + API.app.settings_pg.current_fiat + " " + General.cex_icon font.pixelSize: 14 font.weight: Font.Normal opacity: .6 @@ -60,7 +60,7 @@ ColumnLayout Layout.fillWidth: true color: Dex.CurrentTheme.foregroundColor3 Layout.preferredWidth: parent.width * 0.3 - text: "Total " + right_ticker + text: sell_mode ? qsTr("Receive %1").arg(right_ticker) : qsTr("Send %1").arg(right_ticker) font.pixelSize: 14 opacity: .6 font.weight: Font.Normal diff --git a/atomic_defi_design/Dex/Exchange/ProView/SearchableTickerSelector.qml b/atomic_defi_design/Dex/Exchange/ProView/SearchableTickerSelector.qml index de90ed3f2d..6bda8f68fe 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/SearchableTickerSelector.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/SearchableTickerSelector.qml @@ -18,7 +18,7 @@ Dex.ComboBoxWithSearchBar property string ticker property bool index_changed: false - height: 60 + height: 70 enabled: !block_everything textRole: "ticker" @@ -34,7 +34,7 @@ Dex.ComboBoxWithSearchBar { id: _delegate width: control.width - height: visible ? 60 : 0 + height: visible ? 70 : 0 highlighted: control.highlightedIndex === index contentItem: DexComboBoxLine { details: model } diff --git a/atomic_defi_design/Dex/Exchange/ProView/TickerSelectors.qml b/atomic_defi_design/Dex/Exchange/ProView/TickerSelectors.qml index 86df283110..6c52fed103 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TickerSelectors.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TickerSelectors.qml @@ -22,7 +22,7 @@ Row { id: selectorLeft - width: parent.width * 0.45 + width: 210 height: parent.height left_side: true @@ -40,7 +40,7 @@ Row SwapIcon { - width: parent.width * 0.1 + width: 25 anchors.verticalCenter: parent.verticalCenter top_arrow_ticker: selectorLeft.ticker bottom_arrow_ticker: selectorRight.ticker @@ -63,7 +63,7 @@ Row { id: selectorRight - width: parent.width * 0.45 + width: 210 height: parent.height left_side: false diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/Main.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/Main.qml index b08a691dcf..0c520adfcf 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/Main.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/Main.qml @@ -12,6 +12,7 @@ import "../../ProView" Widget { + width: 450 property alias currentIndex: tabView.currentIndex title: qsTr("Trading Information") @@ -63,10 +64,10 @@ Widget Rectangle { - Layout.fillWidth: true Layout.fillHeight: true color: Dex.CurrentTheme.floatingBackgroundColor radius: 10 + Layout.preferredWidth: 450 Qaterial.SwipeView { @@ -79,25 +80,26 @@ Widget ColumnLayout { Layout.fillHeight: true + Layout.fillWidth: true spacing: 10 // Chart Chart { id: chart - Layout.topMargin: 20 - Layout.leftMargin: 28 - Layout.rightMargin: 28 - Layout.fillWidth: true - Layout.preferredHeight: 310 - + Layout.topMargin: 8 + Layout.leftMargin: 5 + Layout.rightMargin: 5 + Layout.fillHeight: true + width: 435 + height: 240 } PriceLineSimplified { id: price_line - Layout.bottomMargin: 20 - Layout.leftMargin: 28 - Layout.rightMargin: 28 + Layout.bottomMargin: 12 + Layout.leftMargin: 5 + Layout.rightMargin: 5 Layout.fillWidth: true Layout.fillHeight: true } diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml index fc880aa0ea..87d5456f62 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml @@ -273,7 +273,7 @@ FloatingBackground visible: (!is_history ? details.cancellable ?? false : false) === true ? (mouseArea.containsMouse || hovered) ? true : false : false - outlinedColor: Dex.CurrentTheme.noColor + outlinedColor: Dex.CurrentTheme.warningColor hoverEnabled: true onClicked: if (details) cancelOrder(details.order_id) @@ -289,7 +289,7 @@ FloatingBackground { anchors.centerIn: parent iconSize: 16 - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor source: Qaterial.Icons.close scale: parent.visible ? 1 : 0 } diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderList.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderList.qml index 7a5a4aa007..7aff067cf9 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderList.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderList.qml @@ -24,7 +24,7 @@ Item HorizontalLine { Layout.fillWidth: true - Layout.maximumWidth: 511 + Layout.maximumWidth: 450 } DefaultListView diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderModal.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderModal.qml index 381a7d7bc0..2c0f7854c1 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderModal.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderModal.qml @@ -14,8 +14,9 @@ MultipageModal id: root property var details - horizontalPadding: 60 - verticalPadding: 40 + width: 720 + horizontalPadding: 40 + verticalPadding: 30 onDetailsChanged: { if (!details) root.close() } onOpened: @@ -27,11 +28,11 @@ MultipageModal MultipageModalContent { - titleText: !details ? "" : details.is_swap ? qsTr("Swap Details") : qsTr("Order Details") + titleText: !details ? "" : visible ? getStatusText(details.order_status) : '' title.font.pixelSize: Style.textSize2 titleAlignment: Qt.AlignHCenter - titleTopMargin: 10 - topMarginAfterTitle: 10 + titleTopMargin: 0 + topMarginAfterTitle: 8 flickMax: window.height - 450 header: [ @@ -41,7 +42,8 @@ MultipageModal visible: !details ? false : details.is_swap && details.order_status === "successful" Layout.alignment: Qt.AlignHCenter source: General.image_path + "exchange-trade-complete.png" - height: 100 + Layout.preferredHeight: 60 + Layout.preferredWidth: 60 }, // Loading symbol @@ -51,49 +53,45 @@ MultipageModal details.is_swap && !["successful", "failed"].includes(details.order_status) running: visible && Qt.platform.os != "osx" Layout.alignment: Qt.AlignHCenter - height: 100 + Layout.preferredHeight: 60 + Layout.preferredWidth: 60 }, - + RowLayout { - Layout.topMargin: 10 - height: 70 + id: dex_pair_badges + Layout.preferredHeight: 70 + Layout.fillWidth: true + PairItemBadge { ticker: details ? details.base_coin : "" fullname: details ? General.coinName(details.base_coin) : "" amount: details ? details.base_amount : "" + Layout.preferredHeight: 70 } + Item { Layout.fillWidth: true } + Qaterial.Icon { - Layout.fillWidth: true + Layout.preferredHeight: 70 Layout.alignment: Qt.AlignVCenter - color: Dex.CurrentTheme.foregroundColor icon: Qaterial.Icons.swapHorizontal } + Item { Layout.fillWidth: true } + PairItemBadge { ticker: details ? details.rel_coin : "" fullname: details ? General.coinName(details.rel_coin) : "" amount: details ? details.rel_amount : "" + Layout.preferredHeight: 70 } - }, - // Status Text - DefaultText - { - id: statusText - Layout.alignment: Qt.AlignHCenter - Layout.topMargin: 5 - font.pixelSize: Style.textSizeMid1 - font.bold: true - visible: !details ? false : details.is_swap || !details.is_maker - text_value: !details ? "" : visible ? getStatusText(details.order_status) : '' - height: 25 }, DefaultText @@ -289,7 +287,7 @@ MultipageModal Layout.fillWidth: true }, - DefaultButton + CancelButton { id: close_order_button text: qsTr("Close") diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml index 5ff799eda8..3629b41dae 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml @@ -84,13 +84,13 @@ Item { { anchors.horizontalCenter: parent.horizontalCenter anchors.fill: parent - anchors.margins: 28 + anchors.margins: 20 anchors.bottomMargin: is_history ? 0 : 10 - spacing: 15 + spacing: 8 RowLayout { - spacing: 10 + spacing: 8 DefaultButton { Layout.preferredHeight: 29 @@ -101,6 +101,30 @@ Item { onClicked: settings.visible = !settings.visible } + DefaultButton + { + visible: settings.visible && root.is_history + Layout.preferredHeight: 29 + enabled: list_model_proxy.can_i_apply_filtering + radius: 7 + label.font: DexTypo.body2 + text: qsTr("Apply Filter") + onClicked: list_model_proxy.apply_all_filtering() + } + + DefaultText + { + color: Dex.CurrentTheme.foregroundColor2 + font: DexTypo.caption + visible: !settings.visible + text: qsTr("Filter") + ": %1 / %2
%3: %4 - %5".arg(combo_base.currentTicker).arg(combo_rel.currentTicker).arg(qsTr("Date")).arg(min_date.selectedDate.toLocaleDateString(Locale.ShortFormat, "yyyy-MM-dd")).arg(max_date.selectedDate.toLocaleDateString(Locale.ShortFormat, "yyyy-MM-dd")) + } + + Item + { + Layout.fillWidth: true + } + DefaultButton { visible: root.is_history @@ -115,12 +139,16 @@ Item { } } - DefaultText + DefaultButton { - color: Dex.CurrentTheme.foregroundColor2 - font: DexTypo.caption - visible: !settings.visible - text: qsTr("Filter") + ": %1 / %2
%3: %4 - %5".arg(combo_base.currentTicker).arg(combo_rel.currentTicker).arg(qsTr("Date")).arg(min_date.selectedDate.toLocaleDateString(Locale.ShortFormat, "yyyy-MM-dd")).arg(max_date.selectedDate.toLocaleDateString(Locale.ShortFormat, "yyyy-MM-dd")) + visible: !root.is_history && list_model.length > 0 + enabled: list_model.length > 0 + Layout.preferredHeight: 29 + radius: 7 + label.font: DexTypo.body2 + text: qsTr("Cancel All") + iconSource: Qaterial.Icons.close + onClicked: API.app.trading_pg.orders.cancel_order(list_model_proxy.get_filtered_ids()) } } @@ -130,33 +158,7 @@ Item { visible: false spacing: 8 - RowLayout - { - spacing: 10 - DefaultButton - { - visible: root.is_history - enabled: list_model_proxy.can_i_apply_filtering - Layout.preferredHeight: 29 - radius: 7 - label.font: DexTypo.body2 - text: qsTr("Apply Filter") - onClicked: list_model_proxy.apply_all_filtering() - } - - DefaultButton - { - visible: !root.is_history - enabled: API.app.orders_mdl.length > 0 - Layout.preferredHeight: 29 - radius: 7 - label.font: DexTypo.body2 - text: qsTr("Cancel All") - iconSource: Qaterial.Icons.close - onClicked: API.app.trading_pg.orders.cancel_order(list_model_proxy.get_filtered_ids()) - } - } - + // Coin Selection comboboxes RowLayout { Layout.alignment: Qt.AlignHCenter diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/PriceLine.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/PriceLine.qml index 63cbdaf723..bf5d0d2286 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/PriceLine.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/PriceLine.qml @@ -20,7 +20,7 @@ ColumnLayout readonly property int fontSizeBigger: Style.textSizeSmall2 readonly property int lineScale: General.getComparisonScale(cexPriceDiff) - spacing: 20 + spacing: 10 DefaultText { @@ -72,7 +72,7 @@ ColumnLayout Layout.topMargin: 10 Layout.bottomMargin: Layout.topMargin Layout.alignment: Qt.AlignHCenter - color: parseFloat(cexPriceDiff) <= 0 ? Dex.CurrentTheme.okColor : Dex.CurrentTheme.noColor + color: parseFloat(cexPriceDiff) <= 0 ? Dex.CurrentTheme.okColor : Dex.CurrentTheme.warningColor text_value: (parseFloat(cexPriceDiff) > 0 ? qsTr("Expensive") : qsTr("Expedient")) + ":    " + qsTr("%1 compared to CEX", "PRICE_DIFF%").arg("" + General.formatPercent(General.limitDigits(cexPriceDiff)) + "") font.pixelSize: fontSize } @@ -92,7 +92,7 @@ ColumnLayout height: 6 start_color: Dex.CurrentTheme.okColor - end_color: Dex.CurrentTheme.noColor + end_color: Dex.CurrentTheme.warningColor AnimatedRectangle { width: 4 diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/SwapProgress.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/SwapProgress.qml index ad019be3da..3f0963b269 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/SwapProgress.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/SwapProgress.qml @@ -248,10 +248,10 @@ ColumnLayout if (event) { // Red for the Finished if swap failed - if (event.state === "Finished" && details.order_status === "failed") return Dex.CurrentTheme.noColor + if (event.state === "Finished" && details.order_status === "failed") return Dex.CurrentTheme.warningColor // Red for error event, green for the others - return details.error_events.indexOf(event.state) === -1 ? Dex.CurrentTheme.okColor : Dex.CurrentTheme.noColor + return details.error_events.indexOf(event.state) === -1 ? Dex.CurrentTheme.okColor : Dex.CurrentTheme.warningColor } // In progress one is orange diff --git a/atomic_defi_design/Dex/Exchange/Trade/BestOrder/List.qml b/atomic_defi_design/Dex/Exchange/Trade/BestOrder/List.qml index 695385521e..85a7be4ebe 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/BestOrder/List.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/BestOrder/List.qml @@ -15,8 +15,8 @@ Widget { id: _control title: qsTr("Best Orders") - margins: 20 - spacing: 20 + margins: 10 + spacing: 10 Header { diff --git a/atomic_defi_design/Dex/Exchange/Trade/BestOrder/ListDelegate.qml b/atomic_defi_design/Dex/Exchange/Trade/BestOrder/ListDelegate.qml index a1189a5540..e5893f2e31 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/BestOrder/ListDelegate.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/BestOrder/ListDelegate.qml @@ -100,7 +100,7 @@ Item parseFloat(cex_rates).toFixed(2) + "%" color: cex_rates === "0" ? Qt.darker(Dex.CurrentTheme.foregroundColor) : parseFloat(cex_rates) < 0 ? Dex.CurrentTheme.okColor : - Dex.CurrentTheme.noColor + Dex.CurrentTheme.warningColor Behavior on rightPadding { diff --git a/atomic_defi_design/Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml b/atomic_defi_design/Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml index be005b5314..fece784f8e 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml @@ -101,7 +101,7 @@ MultipageModal { // Buttons footer: [ - DefaultButton { + CancelButton { text: qsTr("Cancel") Layout.fillWidth: true onClicked: root.close() diff --git a/atomic_defi_design/Dex/Exchange/Trade/ConfirmTradeModal.qml b/atomic_defi_design/Dex/Exchange/Trade/ConfirmTradeModal.qml index 8a4f6bf1ea..4054ef6606 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/ConfirmTradeModal.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/ConfirmTradeModal.qml @@ -17,8 +17,8 @@ MultipageModal id: root readonly property var fees: API.app.trading_pg.fees width: 720 - horizontalPadding: 30 - verticalPadding: 30 + horizontalPadding: 20 + verticalPadding: 20 closePolicy: Popup.NoAutoClose MultipageModalContent @@ -34,29 +34,41 @@ MultipageModal RowLayout { id: dex_pair_badges + Layout.fillWidth: true + Layout.preferredHeight: 70 + Layout.preferredWidth: 480 + + Item { Layout.fillWidth: true } PairItemBadge { ticker: base_ticker fullname: General.coinName(base_ticker) amount: base_amount + Layout.fillHeight: true } + Item { Layout.fillWidth: true } + Qaterial.Icon { - Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter - color: Dex.CurrentTheme.foregroundColor icon: Qaterial.Icons.swapHorizontal + Layout.fillHeight: true } + Item { Layout.fillWidth: true } + PairItemBadge { ticker: rel_ticker fullname: General.coinName(rel_ticker) amount: rel_amount + Layout.fillHeight: true } + + Item { Layout.fillWidth: true } }, PriceLineSimplified @@ -95,6 +107,7 @@ MultipageModal spacing: 2 boxWidth: 16 boxHeight: 16 + boxRadius: 8 label.wrapMode: Label.NoWrap text: qsTr("Trade price is more than 50% different to CEX! Confirm?") font: DexTypo.caption @@ -215,7 +228,7 @@ MultipageModal width: parent.width horizontalAlignment: DefaultText.AlignHCenter font: DexTypo.caption - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor text_value: General.getTradingError( last_trading_error, curr_fee_info, @@ -396,7 +409,7 @@ MultipageModal [ Item { Layout.fillWidth: true }, - DefaultButton + CancelButton { text: qsTr("Cancel") padding: 10 diff --git a/atomic_defi_design/Dex/Exchange/Trade/OrderBook/ListDelegate.qml b/atomic_defi_design/Dex/Exchange/Trade/OrderBook/ListDelegate.qml index 20239d25d2..5ce557fc6b 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/OrderBook/ListDelegate.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/OrderBook/ListDelegate.qml @@ -135,7 +135,7 @@ Item height: 6 radius: width / 2 visible: is_mine - color: isAsk ? Dex.CurrentTheme.noColor : Dex.CurrentTheme.okColor + color: isAsk ? Dex.CurrentTheme.warningColor : Dex.CurrentTheme.okColor } // Progress bar @@ -156,7 +156,7 @@ Item Behavior on width { NumberAnimation { duration: 1000 } } radius: 3 opacity: 0.8 - color: isAsk ? Dex.CurrentTheme.noColor : Dex.CurrentTheme.okColor + color: isAsk ? Dex.CurrentTheme.warningColor : Dex.CurrentTheme.okColor Component.onCompleted: width = ((depth * 100) * (mouse_area.width + 40)) / 100 } } @@ -176,7 +176,7 @@ Item text: { new BigNumber(price).toFixed(8) } font.family: DexTypo.fontFamily font.pixelSize: 12 - color: isAsk ? Dex.CurrentTheme.noColor : Dex.CurrentTheme.okColor + color: isAsk ? Dex.CurrentTheme.warningColor : Dex.CurrentTheme.okColor horizontalAlignment: Text.AlignRight wrapMode: Text.NoWrap } diff --git a/atomic_defi_design/Dex/Exchange/Trade/OrderBook/Vertical.qml b/atomic_defi_design/Dex/Exchange/Trade/OrderBook/Vertical.qml index 9c5e4c9d74..0cbee94e75 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/OrderBook/Vertical.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/OrderBook/Vertical.qml @@ -13,8 +13,8 @@ Widget { title: qsTr("Order Book") - margins: 20 - spacing: 20 + margins: 10 + spacing: 10 Header { diff --git a/atomic_defi_design/Dex/Exchange/Trade/PriceLineSimplified.qml b/atomic_defi_design/Dex/Exchange/Trade/PriceLineSimplified.qml index a9c257204d..1c14921fda 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/PriceLineSimplified.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/PriceLineSimplified.qml @@ -111,7 +111,7 @@ ColumnLayout Layout.preferredHeight: 6 start_color: Dex.CurrentTheme.okColor - end_color: Dex.CurrentTheme.noColor + end_color: Dex.CurrentTheme.warningColor AnimatedRectangle { @@ -146,7 +146,7 @@ ColumnLayout id: price_diff_text Layout.topMargin: 10 Layout.alignment: Qt.AlignHCenter - color: parseFloat(cexPriceDiff) <= 0 ? Dex.CurrentTheme.okColor : Dex.CurrentTheme.noColor + color: parseFloat(cexPriceDiff) <= 0 ? Dex.CurrentTheme.okColor : Dex.CurrentTheme.warningColor text_value: (parseFloat(cexPriceDiff) > 0 ? qsTr("Expensive") : qsTr("Expedient")) + ":    " + qsTr("%1 compared to CEX", "PRICE_DIFF%").arg("" + General.formatPercent(General.limitDigits(cexPriceDiff)) + "") font.pixelSize: fontSize } diff --git a/atomic_defi_design/Dex/Exchange/Trade/ProView.qml b/atomic_defi_design/Dex/Exchange/Trade/ProView.qml index f5b7252082..aad3a1036c 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/ProView.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/ProView.qml @@ -54,7 +54,7 @@ RowLayout { setMarketMode(!is_asks ? MarketMode.Sell : MarketMode.Buy) - API.app.trading_pg.preffered_order = { + let selected_order = { "coin": coin, "price": price, "price_denom": price_denom, @@ -69,6 +69,8 @@ RowLayout "uuid": uuid } + API.app.trading_pg.preffered_order = selected_order + // Shows place order form in case it has been hidden in the settings. placeOrderForm.visible = true } @@ -111,8 +113,8 @@ RowLayout { Layout.alignment: Qt.AlignTop - Layout.minimumWidth: selectors.visible || tradingInfo.visible ? 480 : -1 - Layout.maximumWidth: (!orderBook.visible && !bestOrders.visible) || (!placeOrderForm.visible) ? -1 : 735 + Layout.minimumWidth: selectors.visible || tradingInfo.visible ? 450 : -1 + Layout.maximumWidth: (!orderBook.visible && !bestOrders.visible) || (!placeOrderForm.visible) ? -1 : 450 Layout.fillWidth: true Layout.fillHeight: true @@ -145,7 +147,7 @@ RowLayout property real _orderBookHeightRatio: 0.65 property real _bestOrdersHeightRatio: 0.35 - Layout.minimumWidth: orderBook.visible || bestOrders.visible ? 353 : -1 + Layout.minimumWidth: orderBook.visible || bestOrders.visible ? 350 : -1 Layout.fillWidth: true Layout.fillHeight: true Layout.alignment: Qt.AlignTop @@ -180,8 +182,8 @@ RowLayout { id: placeOrderForm - Layout.minimumWidth: visible ? 302 : -1 - Layout.maximumWidth: 350 + Layout.minimumWidth: visible ? 305 : -1 + Layout.maximumWidth: 305 Layout.fillWidth: true Layout.fillHeight: true diff --git a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/List.qml b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/List.qml index 1605adb463..c9ea3a02df 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/List.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/List.qml @@ -302,7 +302,7 @@ DexListView Layout.fillHeight: true bottomInset: 0 topInset: 0 - outlinedColor: DexTheme.redColor + outlinedColor: DexTheme.warningColor visible: !main_order.is_history && details.cancellable onClicked: { if(details) cancelOrder(details.order_id) } Row { @@ -312,12 +312,12 @@ DexListView anchors.verticalCenter: parent.verticalCenter source: Qaterial.Icons.close iconSize: 17 - color: DexTheme.redColor + color: DexTheme.warningColor } DexLabel { anchors.verticalCenter: parent.verticalCenter text: "Cancel " - color: DexTheme.redColor + color: DexTheme.warningColor } } } diff --git a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Main.qml b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Main.qml index ee73c2f269..649d133c0b 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Main.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Main.qml @@ -40,76 +40,87 @@ Item spacing: 30 anchors.horizontalCenter: parent.horizontalCenter - Item // Sub-pages Tabs Selector + Rectangle // Tabs Border { anchors.horizontalCenter: parent.horizontalCenter - width: _selectedTabMarker.width * 3 - height: 30 - - Rectangle // Selected Tab Rectangle + width: _selectedTabMarker.width * 3 + 8 + height: 38 + border.color: Dex.CurrentTheme.gradientButtonStartColor + border.width: 1 + color: Dex.CurrentTheme.floatingBackgroundColor + radius: 19 + + Item // Sub-pages Tabs Selector { - id: _selectedTabMarker + anchors.centerIn: parent + width: _selectedTabMarker.width * 3 + height: 30 - function update() // Updates transform according to selected sub-page. + Rectangle // Selected Tab Rectangle { - switch (currentSubPage) + id: _selectedTabMarker + + function update() // Updates transform according to selected sub-page. { - case subPages.Trade: - x = 0 - break; - case subPages.Orders: - x = (parent.width / 3) - orders_view.update() - break; - case subPages.History: - x = (parent.width / 3) *2 - history_view.update() - break; + switch (currentSubPage) + { + case subPages.Trade: + x = 0 + break; + case subPages.Orders: + x = (parent.width / 3) + orders_view.update() + break; + case subPages.History: + x = (parent.width / 3) * 2 + history_view.update() + break; + } } - } - anchors.verticalCenter: parent.verticalCenter - height: parent.height - width: 108 - radius: 15 - color: Dex.CurrentTheme.tabSelectedColor - - Behavior on x { NumberAnimation { duration: 150 } } - } + anchors.verticalCenter: parent.verticalCenter + height: parent.height + width: 108 + radius: 15 + color: Dex.CurrentTheme.tabSelectedColor - RowLayout - { - anchors.fill: parent - spacing: 0 - - ClickableText - { - id: _tradeText - Layout.preferredWidth: parent.width / 3 - Layout.fillHeight: true - text: qsTr("Trade") - font.pixelSize: Constants.Style.textSize - onClicked: if (currentSubPage !== subPages.Trade) currentSubPage = subPages.Trade + Behavior on x { NumberAnimation { duration: 150 } } } - ClickableText + RowLayout { - id: _ordersText - Layout.preferredWidth: parent.width / 3 - Layout.fillHeight: true - text: qsTr("Orders") - font.pixelSize: Constants.Style.textSize - onClicked: if (currentSubPage !== subPages.Orders) currentSubPage = subPages.Orders - } + anchors.fill: parent + spacing: 0 - ClickableText - { - id: _historyText - Layout.preferredWidth: parent.width / 3 - Layout.fillHeight: true - text: qsTr("History") - font.pixelSize: Constants.Style.textSize - onClicked: if (currentSubPage !== subPages.History) currentSubPage = subPages.History + ClickableText + { + id: _tradeText + Layout.preferredWidth: parent.width / 3 + Layout.fillHeight: true + text: qsTr("Swap") + font.pixelSize: Constants.Style.textSize + onClicked: if (currentSubPage !== subPages.Trade) currentSubPage = subPages.Trade + } + + ClickableText + { + id: _ordersText + Layout.preferredWidth: parent.width / 3 + Layout.fillHeight: true + text: qsTr("Orders") + font.pixelSize: Constants.Style.textSize + onClicked: if (currentSubPage !== subPages.Orders) currentSubPage = subPages.Orders + } + + ClickableText + { + id: _historyText + Layout.preferredWidth: parent.width / 3 + Layout.fillHeight: true + text: qsTr("History") + font.pixelSize: Constants.Style.textSize + onClicked: if (currentSubPage !== subPages.History) currentSubPage = subPages.History + } } } } diff --git a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubBestOrder.qml b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubBestOrder.qml index 7cd7d5552c..e1a7e9bc13 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubBestOrder.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubBestOrder.qml @@ -128,10 +128,10 @@ DexListView width: _rowWidth height: _rowHeight - radius: 0 + radius: mouse_area.containsMouse ? 3 : 0 border.width: 0 colorAnimation: false - color: mouse_area.containsMouse ? Dex.CurrentTheme.buttonColorHovered : 'transparent' + color: mouse_area.containsMouse ? Dex.CurrentTheme.listItemHoveredBackground : 'transparent' DexMouseArea { @@ -162,6 +162,7 @@ DexListView { property int _iconWidth: 24 Layout.preferredWidth: _tokenColumnSize + Layout.leftMargin: 3 DexImage // Order Token Icon { @@ -206,7 +207,7 @@ DexListView { Layout.preferredWidth: _cexRateColumnSize horizontalAlignment: Text.AlignRight - color: cex_rates=== "0" ? Qt.darker(DexTheme.foregroundColor) : parseFloat(cex_rates)>0? DexTheme.redColor : DexTheme.greenColor + color: cex_rates=== "0" ? Qt.darker(DexTheme.foregroundColor) : parseFloat(cex_rates)>0? DexTheme.warningColor : DexTheme.okColor text_value: cex_rates=== "0" ? "N/A" : parseFloat(cex_rates)>0? "+"+parseFloat(cex_rates).toFixed(2)+"%" : parseFloat(cex_rates).toFixed(2)+"%" } diff --git a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubCoinSelector.qml b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubCoinSelector.qml index 5a89dd366d..bf1938c322 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubCoinSelector.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubCoinSelector.qml @@ -130,7 +130,7 @@ DexListView radius: 0 border.width: 0 colorAnimation: false - color: mouse_area.containsMouse ? Dex.CurrentTheme.buttonColorHovered : 'transparent' + color: mouse_area.containsMouse ? Dex.CurrentTheme.listItemHoveredBackground : 'transparent' DexMouseArea { diff --git a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubHistory.qml b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubHistory.qml index b6171ada9c..917e515db6 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubHistory.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubHistory.qml @@ -252,7 +252,7 @@ Item anchors.fill: parent spacing: 15 - DefaultButton + CancelButton { Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter diff --git a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubOrders.qml b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubOrders.qml index 680331ad66..7b26d92157 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubOrders.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/SubOrders.qml @@ -245,7 +245,7 @@ Item { anchors.fill: parent spacing: 15 - DefaultButton + CancelButton { Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter @@ -253,6 +253,7 @@ Item text: qsTr("Cancel") onClicked: _subOrdersRoot.displayFilter = false } + DefaultButton { Layout.fillWidth: true diff --git a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Trade.qml b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Trade.qml index 480c041971..e8f5950ecd 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Trade.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/SimpleView/Trade.qml @@ -26,7 +26,7 @@ ClipRRect // Trade Card readonly property bool coin_tradable: selectedTicker !== "" && sell_ticker_balance > 0 readonly property bool waiting_for_sell_coin_info: (max_trade_volume == 0 || !Constants.General.isZhtlcReady(left_ticker)) && sell_ticker_balance != 0 - property string selectedTicker: sell_ticker_balance > 0 ? left_ticker : "" + property string selectedTicker: left_ticker property var selectedOrder: undefined property bool best: false property bool coinSelection: false @@ -269,6 +269,7 @@ ClipRRect // Trade Card opacity: .6 } + // Tooltip MouseArea { anchors.left: _fromBalanceIcon.left @@ -279,7 +280,11 @@ ClipRRect // Trade Card DefaultTooltip { visible: parent.containsMouse - text: qsTr("Tradable: ") + parent.parent.text + text: + { + 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)' + } } } diff --git a/atomic_defi_design/Dex/Exchange/Trade/Trade.qml b/atomic_defi_design/Dex/Exchange/Trade/Trade.qml index 9b334ac34f..1217a4ba3d 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/Trade.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/Trade.qml @@ -158,9 +158,9 @@ Item Column { anchors.fill: parent - spacing: 15 - anchors.leftMargin: 20 - anchors.rightMargin: 20 + spacing: 8 + anchors.leftMargin: 8 + anchors.rightMargin: 8 TradeViewHeader { @@ -179,7 +179,7 @@ Item { id: proView width: parent.width - height: parent.height * 0.90 + height: parent.height * 0.91 visible: API.app.trading_pg.current_trading_mode == TradingMode.Pro enabled: visible } diff --git a/atomic_defi_design/Dex/Exchange/Trade/Trading/TradeViewHeader.qml b/atomic_defi_design/Dex/Exchange/Trade/Trading/TradeViewHeader.qml index 15755c1920..8cc01d06d4 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/Trading/TradeViewHeader.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/Trading/TradeViewHeader.qml @@ -47,6 +47,7 @@ Item id: _simpleLabel text: "Simple" color: API.app.trading_pg.current_trading_mode == TradingMode.Simple ? Dex.CurrentTheme.foregroundColor : Dex.CurrentTheme.foregroundColor2 + anchors.leftMargin: 16 anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter font.pixelSize: 14 diff --git a/atomic_defi_design/Dex/NewUpdateModal.qml b/atomic_defi_design/Dex/NewUpdateModal.qml index 4f9d7e3907..eccb4867c4 100644 --- a/atomic_defi_design/Dex/NewUpdateModal.qml +++ b/atomic_defi_design/Dex/NewUpdateModal.qml @@ -53,7 +53,7 @@ Dex.MultipageModal footer: [ Item { Layout.fillWidth: true }, - Dex.DefaultButton + Dex.CancelButton { text: qsTr("Close") onClicked: close() @@ -75,7 +75,7 @@ Dex.MultipageModal footer: [ Item { Layout.fillWidth: true }, - Dex.DefaultButton + Dex.CancelButton { text: qsTr("Close") onClicked: close() @@ -134,7 +134,7 @@ Dex.MultipageModal footer: [ Item { Layout.fillWidth: true }, - Dex.DefaultButton + Dex.CancelButton { text: qsTr("Close") onClicked: close() diff --git a/atomic_defi_design/Dex/Portfolio/AmountChart.qml b/atomic_defi_design/Dex/Portfolio/AmountChart.qml index ec3bef155b..1f7bca35d2 100644 --- a/atomic_defi_design/Dex/Portfolio/AmountChart.qml +++ b/atomic_defi_design/Dex/Portfolio/AmountChart.qml @@ -217,7 +217,7 @@ InnerBackground { Rectangle { anchors.fill: parent opacity: .6 - color: DexTheme.dexBoxBackgroundColor + color: DexTheme.backgroundDarkColor6 visible: portfolio_asset_chart.isProgress radius: parent.radius DefaultBusyIndicator { diff --git a/atomic_defi_design/Dex/Portfolio/AssetsList.qml b/atomic_defi_design/Dex/Portfolio/AssetsList.qml index ded8fd3eda..1edddc6658 100644 --- a/atomic_defi_design/Dex/Portfolio/AssetsList.qml +++ b/atomic_defi_design/Dex/Portfolio/AssetsList.qml @@ -96,13 +96,13 @@ Dex.DexListView delegate: Rectangle { - property color _idleColor: index % 2 === 1 ? Dex.CurrentTheme.backgroundColor : Dex.CurrentTheme.innerBackgroundColor + property color _idleColor: index % 2 === 1 ? Dex.CurrentTheme.listItemOddBackground : Dex.CurrentTheme.listItemEvenBackground property int activation_progress: Dex.General.zhtlcActivationProgress(activation_status, ticker) width: list.width height: _assetRowHeight - color: mouseArea.containsMouse ? Dex.CurrentTheme.buttonColorHovered : _idleColor + color: mouseArea.containsMouse ? Dex.CurrentTheme.listItemHoveredBackground : _idleColor RowLayout { @@ -126,7 +126,7 @@ Dex.DexListView anchors.centerIn: parent anchors.fill: parent radius: 15 - enabled: Dex.General.isZhtlc(ticker) ? activation_progress != 100 : false + enabled: Dex.General.isZhtlc(ticker) ? activation_progress < 100 : false visible: enabled opacity: .9 color: Dex.DexTheme.backgroundColor @@ -136,13 +136,13 @@ Dex.DexListView { anchors.centerIn: parent anchors.fill: parent - enabled: Dex.General.isZhtlc(ticker) ? activation_progress != 100 : false + enabled: Dex.General.isZhtlc(ticker) ? activation_progress < 100 : false visible: enabled horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: activation_progress + "%" font: Dex.DexTypo.head8 - color: Dex.DexTheme.greenColor + color: Dex.DexTheme.okColor } } @@ -165,7 +165,7 @@ Dex.DexListView text: model.type font: Dex.DexTypo.overLine opacity: .7 - color: Dex.Style.getCoinTypeColor(model.type) + color: Dex.Style.getCoinColor(ticker) Dex.DexLabel { @@ -177,7 +177,7 @@ Dex.DexListView text: "IDO" font: Dex.DexTypo.overLine opacity: .7 - color: Dex.DexTheme.redColor + color: Dex.DexTheme.warningColor } } } @@ -203,7 +203,6 @@ Dex.DexListView return parseFloat(balance).toFixed(8) } - color: text_value == parseFloat(balance).toFixed(8) ? Qt.darker(Dex.DexTheme.foregroundColor, 0.8) : Dex.DexTheme.redColor privacy: true } @@ -217,8 +216,6 @@ Dex.DexListView font: Dex.DexTypo.body2 text_value: Dex.General.formatFiat("", main_currency_balance, Dex.API.app.settings_pg.current_currency) - - color: Qt.darker(Dex.DexTheme.foregroundColor, 0.8) privacy: true } @@ -252,7 +249,6 @@ Dex.DexListView text_value: Dex.General.formatFiat('', main_currency_price_for_one_unit, Dex.API.app.settings_pg.current_currency, 6) - color: Dex.DexTheme.colorThemeDarkLight } Item // Price Provider diff --git a/atomic_defi_design/Dex/Portfolio/Portfolio.qml b/atomic_defi_design/Dex/Portfolio/Portfolio.qml index cac69abde3..01af593f48 100644 --- a/atomic_defi_design/Dex/Portfolio/Portfolio.qml +++ b/atomic_defi_design/Dex/Portfolio/Portfolio.qml @@ -21,8 +21,7 @@ Item { id: portfolio Layout.fillWidth: true Layout.fillHeight: true - Layout.bottomMargin: 40 - Layout.margins: 40 + Layout.margins: 20 readonly property int sort_by_name: 0 readonly property int sort_by_value: 1 @@ -104,62 +103,10 @@ Item { chart.axes[i].visible = false } - Item - { - width: parent.width - height: 80 - visible: true - - RowLayout - { - anchors.fill: parent - anchors.leftMargin: 40 - anchors.rightMargin: 40 - anchors.topMargin: 30 - - Item - { - Layout.fillWidth: true - Layout.fillHeight: true - - DefaultText - { - font: DexTypo.head6 - anchors.verticalCenter: parent.verticalCenter - text: qsTr("Portfolio") - } - } - - Item - { - width: 120 - Layout.alignment: Qt.AlignVCenter - Layout.preferredWidth: 200 - - Row - { - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - - DexGradientAppButton - { - height: 40 - iconSource: Qaterial.Icons.plus - radius: 15 - padding: 25 - font: DexTypo.body2 - text: qsTr("ADD ASSET") - onClicked: enable_coin_modal.open() - } - } - } - } - } - Flickable { id: flick anchors.fill: parent - anchors.topMargin: 80 + anchors.topMargin: 20 contentHeight: _column.height clip: true diff --git a/atomic_defi_design/Dex/Portfolio/SmartChartView.qml b/atomic_defi_design/Dex/Portfolio/TradingViewChart.qml similarity index 100% rename from atomic_defi_design/Dex/Portfolio/SmartChartView.qml rename to atomic_defi_design/Dex/Portfolio/TradingViewChart.qml diff --git a/atomic_defi_design/Dex/Screens/Dashboard.qml b/atomic_defi_design/Dex/Screens/Dashboard.qml index 95595a6206..a59d814663 100644 --- a/atomic_defi_design/Dex/Screens/Dashboard.qml +++ b/atomic_defi_design/Dex/Screens/Dashboard.qml @@ -20,6 +20,7 @@ import "../Support" as SupportPage import "../Screens" import "../Addressbook" as Addressbook import Dex.Themes 1.0 as Dex +import AtomicDEX.TradingMode 1.0 Item { @@ -86,14 +87,7 @@ Item sidebar.currentLineType = currentPage if (currentPage == Dashboard.PageType.DEX) { - if (API.app.trading_pg.current_trading_mode == TradingMode.Pro) - { - API.app.trading_pg.set_pair(false, api_wallet_page.ticker) - } - else - { - API.app.trading_pg.set_pair(true, api_wallet_page.ticker) - } + API.app.trading_pg.set_pair(true, api_wallet_page.ticker) } } @@ -115,6 +109,7 @@ Item } } + // Right side AnimatedRectangle { @@ -123,6 +118,18 @@ Item x: sidebar.width border.color: 'transparent' + Rectangle + { + radius: 0 + anchors.fill: parent + anchors.rightMargin : - border.width + anchors.bottomMargin: - border.width + anchors.leftMargin: - border.width + border.width: 1 + border.color: Dex.CurrentTheme.lineSeparatorColor + color: 'transparent' + } + // Modals ModalLoader { @@ -272,6 +279,7 @@ Item enabled: loader.status === Loader.Ready onLineSelected: currentPage = lineType; + onAddCryptoClicked: enable_coin_modal.open() onSettingsClicked: setting_modal.open() onSupportClicked: support_modal.open() } @@ -366,7 +374,7 @@ Item return Dex.CurrentTheme.sidebarLineTextHovered case "failed": default: - return DexTheme.redColor + return DexTheme.warningColor } } diff --git a/atomic_defi_design/Dex/Screens/Startup/ImportWallet.qml b/atomic_defi_design/Dex/Screens/Startup/ImportWallet.qml index acb83d2be4..2abfd27ab4 100644 --- a/atomic_defi_design/Dex/Screens/Startup/ImportWallet.qml +++ b/atomic_defi_design/Dex/Screens/Startup/ImportWallet.qml @@ -166,14 +166,13 @@ SetupPage height: 40 width: 60 radius: 20 - color: Dex.CurrentTheme.accentColor anchors.verticalCenter: parent.verticalCenter Qaterial.ColorIcon { anchors.centerIn: parent iconSize: 19 source: Qaterial.Icons.wallet - color: Dex.CurrentTheme.foregroundColor + color: Dex.CurrentTheme.inputLeftIconColor } } } @@ -205,7 +204,7 @@ SetupPage id: _seedError visible: _seedField.error text: qsTr("Your seed is not BIP39 compliant.\nTry again or select 'Allow custom seed' to continue.") - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor Layout.preferredWidth: parent.width - 40 font: DexTypo.body2 } @@ -267,7 +266,7 @@ SetupPage DefaultText { text_value: text_error - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor visible: text !== '' } @@ -306,7 +305,7 @@ SetupPage DexAppPasswordField { id: _inputPassword - field.font: DexTypo.body2 + field.placeholderText: qsTr("Enter password") Layout.fillWidth: true Layout.preferredHeight: 50 field.onAccepted: trySubmit() @@ -324,7 +323,6 @@ SetupPage DexAppPasswordField { id: _inputPasswordConfirm - field.font: DexTypo.body2 field.placeholderText: qsTr("Enter the same password to confirm") Layout.fillWidth: true Layout.preferredHeight: 50 @@ -364,7 +362,7 @@ SetupPage DefaultText { text_value: text_error - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor visible: text !== '' } } diff --git a/atomic_defi_design/Dex/Screens/Startup/Login.qml b/atomic_defi_design/Dex/Screens/Startup/Login.qml index 299c505ea2..74401c45e2 100644 --- a/atomic_defi_design/Dex/Screens/Startup/Login.qml +++ b/atomic_defi_design/Dex/Screens/Startup/Login.qml @@ -67,7 +67,6 @@ SetupPage max_length: General.max_pw_length height: 50 width: 300 - background.color: Dex.CurrentTheme.floatingBackgroundColor forceFocus: true field.onTextChanged: { _isPasswordWrong = false } field.onAccepted: @@ -88,9 +87,6 @@ SetupPage return false; } } - - leftIconColor: Dex.CurrentTheme.foregroundColor - hideFieldButton.icon.color: Dex.CurrentTheme.foregroundColor } DexLabel @@ -98,7 +94,7 @@ SetupPage Layout.alignment: Qt.AlignHCenter height: 14 text: _isPasswordWrong ? qsTr("Incorrect Password") : "" - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor } GradientButton @@ -119,14 +115,12 @@ SetupPage visible: false } - DexAppButton + CancelButton { text: qsTr("Cancel") - color: containsMouse ? Dex.CurrentTheme.buttonColorHovered : 'transparent' height: 25 radius: 20 width: 100 - border.color: 'transparent' Layout.alignment: Qt.AlignHCenter font: Qt.font( { diff --git a/atomic_defi_design/Dex/Screens/Startup/NewWallet.qml b/atomic_defi_design/Dex/Screens/Startup/NewWallet.qml index 2a2f30e59a..ef22a5bbd6 100644 --- a/atomic_defi_design/Dex/Screens/Startup/NewWallet.qml +++ b/atomic_defi_design/Dex/Screens/Startup/NewWallet.qml @@ -318,14 +318,15 @@ SetupPage height: 40 width: 60 radius: 20 - color: Dex.CurrentTheme.accentColor anchors.verticalCenter: parent.verticalCenter + color: Dex.CurrentTheme.inputLeftIconBackgroundColor + Qaterial.ColorIcon { anchors.centerIn: parent iconSize: 19 source: Qaterial.Icons.wallet - color: Dex.CurrentTheme.foregroundColor + color: Dex.CurrentTheme.inputLeftIconColor } } } @@ -335,7 +336,7 @@ SetupPage Layout.topMargin: 10 Layout.bottomMargin: Layout.topMargin Layout.fillWidth: true - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor height: warning_texts.height + 20 radius: 20 @@ -457,7 +458,7 @@ SetupPage DefaultText { text_value: text_error - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor visible: text !== '' } @@ -568,7 +569,8 @@ SetupPage width: (_insideFlow2.width - 30) / 4 text: modelData ?? "" radius: 20 - color: Dex.CurrentTheme.accentColor + btnEnabledColor: Dex.CurrentTheme.buttonColorEnabled + btnHoveredColor: Dex.CurrentTheme.accentColor font: DexTypo.body2 onClicked: @@ -609,9 +611,9 @@ SetupPage { x: 5 height: 40 - width: 60 + width: 50 radius: 20 - color: Dex.CurrentTheme.accentColor + color: Dex.CurrentTheme.inputLeftIconBackgroundColor anchors.verticalCenter: parent.verticalCenter DefaultText @@ -664,7 +666,7 @@ SetupPage DefaultText { text_value: guess_text_error - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor visible: input_seed_word.error DexVisibleBehavior on visible {} @@ -685,6 +687,7 @@ SetupPage id: _inputPassword Layout.fillWidth: true Layout.preferredHeight: 50 + field.placeholderText: qsTr("Enter password") field.onAccepted: _keyChecker.isValid() ? eula_modal.open() : undefined } @@ -742,7 +745,7 @@ SetupPage DefaultText { text_value: text_error - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor visible: text !== '' } } diff --git a/atomic_defi_design/Dex/Screens/Startup/WalletsView.qml b/atomic_defi_design/Dex/Screens/Startup/WalletsView.qml index 6d21be4af2..7db17d6390 100644 --- a/atomic_defi_design/Dex/Screens/Startup/WalletsView.qml +++ b/atomic_defi_design/Dex/Screens/Startup/WalletsView.qml @@ -225,7 +225,7 @@ SetupPage iconSize: 18 anchors.centerIn: parent opacity: .8 - color: _deleteArea.containsMouse ? Dex.CurrentTheme.noColor : Dex.CurrentTheme.foregroundColor + color: _deleteArea.containsMouse ? Dex.CurrentTheme.warningColor : Dex.CurrentTheme.foregroundColor } DexMouseArea @@ -242,7 +242,7 @@ SetupPage text: qsTr("Enter password to confirm deletion of") + " %1 ".arg(wallet_name) + qsTr("wallet"), standardButtons: Dialog.Yes | Dialog.Cancel, warning: true, - iconColor: Dex.CurrentTheme.noColor, + iconColor: Dex.CurrentTheme.warningColor, isPassword: true, placeholderText: qsTr("Type password"), yesButtonText: qsTr("Delete"), diff --git a/atomic_defi_design/Dex/Settings/AddCustomCoinModal.qml b/atomic_defi_design/Dex/Settings/AddCustomCoinModal.qml index da91a1695a..d3dd686fed 100644 --- a/atomic_defi_design/Dex/Settings/AddCustomCoinModal.qml +++ b/atomic_defi_design/Dex/Settings/AddCustomCoinModal.qml @@ -146,7 +146,7 @@ MultipageModal // Buttons footer: [ - DefaultButton + CancelButton { text: qsTr("Cancel") Layout.preferredWidth: 220 diff --git a/atomic_defi_design/Dex/Settings/CamouflagePasswordModal.qml b/atomic_defi_design/Dex/Settings/CamouflagePasswordModal.qml index e0f83cd7a3..a798ff68dc 100644 --- a/atomic_defi_design/Dex/Settings/CamouflagePasswordModal.qml +++ b/atomic_defi_design/Dex/Settings/CamouflagePasswordModal.qml @@ -78,7 +78,7 @@ MultipageModal // Buttons footer: [ - DexAppButton + CancelButton { text: qsTr("Cancel") leftPadding: 40 diff --git a/atomic_defi_design/Dex/Settings/Combo_fiat.qml b/atomic_defi_design/Dex/Settings/Combo_fiat.qml index 0842bb41ef..b62c61b59f 100644 --- a/atomic_defi_design/Dex/Settings/Combo_fiat.qml +++ b/atomic_defi_design/Dex/Settings/Combo_fiat.qml @@ -77,6 +77,7 @@ Item const new_fiat = fiats[currentIndex] API.app.settings_pg.current_fiat = new_fiat API.app.settings_pg.current_currency = new_fiat + setting_modal.recommended_fiats = API.app.settings_pg.get_recommended_fiats() } } @@ -123,7 +124,7 @@ Item { text: modelData color: DexTheme.foregroundColor - opacity: fiats_mouse_area.containsMouse ? .7 : 1 + opacity: text == API.app.settings_pg.current_fiat ? 1 : fiats_mouse_area.containsMouse ? .8 : .6 DexMouseArea { diff --git a/atomic_defi_design/Dex/Settings/DeleteWalletModal.qml b/atomic_defi_design/Dex/Settings/DeleteWalletModal.qml index b126dab5e5..c19c6854f9 100644 --- a/atomic_defi_design/Dex/Settings/DeleteWalletModal.qml +++ b/atomic_defi_design/Dex/Settings/DeleteWalletModal.qml @@ -70,7 +70,7 @@ MultipageModal { // Buttons footer: [ - DefaultButton { + CancelButton { text: qsTr("Cancel") Layout.fillWidth: true onClicked: root.close() diff --git a/atomic_defi_design/Dex/Settings/RecoverSeedModal.qml b/atomic_defi_design/Dex/Settings/RecoverSeedModal.qml index 09ec5b13a6..39253a7786 100644 --- a/atomic_defi_design/Dex/Settings/RecoverSeedModal.qml +++ b/atomic_defi_design/Dex/Settings/RecoverSeedModal.qml @@ -69,10 +69,7 @@ MultipageModal Layout.margins: 20 Layout.alignment: Qt.AlignHCenter field.onAccepted: tryViewKeysAndSeed() - leftIconColor: Dex.CurrentTheme.foregroundColor field.onTextChanged: { _isPasswordWrong = false } - background.color: Dex.CurrentTheme.accentColor - hideFieldButton.icon.color: Dex.CurrentTheme.foregroundColor } DexLabel @@ -80,7 +77,7 @@ MultipageModal Layout.alignment: Qt.AlignHCenter height: 14 text: _isPasswordWrong ? qsTr("Incorrect Password") : "" - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor } // Footer @@ -88,7 +85,7 @@ MultipageModal { Layout.preferredWidth: parent.width Layout.topMargin: 30 - DefaultButton + CancelButton { text: qsTr("Cancel") Layout.preferredWidth: parent.width / 100 * 48 diff --git a/atomic_defi_design/Dex/Settings/SettingModal.qml b/atomic_defi_design/Dex/Settings/SettingModal.qml index a600817bec..b4a1dd3d83 100644 --- a/atomic_defi_design/Dex/Settings/SettingModal.qml +++ b/atomic_defi_design/Dex/Settings/SettingModal.qml @@ -25,6 +25,8 @@ Qaterial.Dialog property var fiats: API.app.settings_pg.get_available_fiats() property var enableable_coins_count: enableable_coins_count_combo_box.currentValue property var orders: API.app.orders_mdl.orders_proxy_mdl.ModelHelper + readonly property date default_min_date: new Date("2019-01-01") + readonly property date default_max_date: new Date(new Date().setDate(new Date().getDate())) width: 950 height: 650 @@ -205,6 +207,7 @@ Qaterial.Dialog topPadding: 10 spacing: 15 + // Notifications toggle RowLayout { width: parent.width - 30 @@ -229,6 +232,32 @@ Qaterial.Dialog } } + // Spam filter toggle + RowLayout + { + width: parent.width - 30 + anchors.horizontalCenter: parent.horizontalCenter + height: 50 + + DexLabel + { + Layout.alignment: Qt.AlignVCenter + Layout.fillWidth: true + font: DexTypo.subtitle1 + text: qsTr("Hide Poison Transactions in History") + } + + Item { Layout.fillWidth: true } + + DexSwitch + { + Layout.alignment: Qt.AlignVCenter + Component.onCompleted: checked = API.app.settings_pg.spamfilter_enabled + onCheckedChanged: API.app.settings_pg.spamfilter_enabled = checked + } + } + + // Max Coins Dropdown RowLayout { width: parent.width - 30 @@ -271,6 +300,44 @@ Qaterial.Dialog onClicked: openLogsFolder() } + // Sync date picker + RowLayout + { + width: parent.width - 30 + anchors.horizontalCenter: parent.horizontalCenter + height: 50 + + DexLabel + { + Layout.alignment: Qt.AlignVCenter + Layout.fillWidth: true + font: DexTypo.subtitle1 + text: qsTr("ZHTLC sync date") + } + + Item { Layout.fillWidth: true } + + DatePicker + { + id: sync_date + titleText: qsTr("Sync Date") + minimumDate: default_min_date + maximumDate: default_max_date + selectedDate: { + var date = new Date(new Date(0).setUTCSeconds(API.app.settings_pg.get_pirate_sync_date())); + console.log(API.app.settings_pg.get_pirate_sync_date()); + console.log(date); + return date; + } + onAccepted: { + atomic_settings2.setValue( + "PirateSyncDate", + parseInt(selectedDate.getTime().valueOf()/1000) + ) + } + } + } + SettingsButton { width: parent.width - 30 @@ -462,7 +529,7 @@ Qaterial.Dialog standardButtons: Dialog.Yes | Dialog.Cancel, closePolicy: Popup.NoAutoClose, warning: true, - iconColor: Dex.CurrentTheme.noColor, + iconColor: Dex.CurrentTheme.warningColor, isPassword: true, placeholderText: qsTr("Type password"), yesButtonText: qsTr("Confirm"), diff --git a/atomic_defi_design/Dex/Sidebar/Bottom.qml b/atomic_defi_design/Dex/Sidebar/Bottom.qml index 18067aba60..af9829b03a 100644 --- a/atomic_defi_design/Dex/Sidebar/Bottom.qml +++ b/atomic_defi_design/Dex/Sidebar/Bottom.qml @@ -11,6 +11,7 @@ MouseArea { id: root + signal addCryptoClicked() signal supportClicked() signal settingsClicked() @@ -27,6 +28,7 @@ MouseArea if (isExpanded) waitForSidebarExpansionAnimation.start(); else { + addCryptoLine.label.opacity = 0; settingsLine.label.opacity = 0; supportLine.label.opacity = 0; privacyLine.label.opacity = 0; @@ -37,7 +39,7 @@ MouseArea NumberAnimation { id: waitForSidebarExpansionAnimation - targets: [settingsLine.label, supportLine.label, privacyLine.label] + targets: [addCryptoLine.label, settingsLine.label, supportLine.label, privacyLine.label] properties: "opacity" duration: 200 from: 0 @@ -48,7 +50,7 @@ MouseArea NumberAnimation { id: labelsOpacityAnimation - targets: [settingsLine.label, supportLine.label, privacyLine.label] + targets: [addCryptoLine.label, settingsLine.label, supportLine.label, privacyLine.label] properties: "opacity" duration: 350 from: 0.0 @@ -59,21 +61,29 @@ MouseArea { anchors.fill: parent FigurativeLine + { + id: addCryptoLine + + Layout.fillWidth: true + label.text: qsTr("Add Crypto") // isExpanded ? qsTr("Add Crypto") : "" + icon.source: General.image_path + "bank-plus.svg" + onClicked: addCryptoClicked() + } + FigurativeLine { id: settingsLine Layout.fillWidth: true - label.text: isExpanded ? qsTr("Settings") : "" + label.text: qsTr("Settings") // isExpanded ? qsTr("Settings") : "" icon.source: General.image_path + "menu-settings-white.svg" onClicked: settingsClicked() } - FigurativeLine { id: supportLine Layout.fillWidth: true - label.text: isExpanded ? qsTr("Support") : "" + label.text: qsTr("Support") // isExpanded ? qsTr("Support") : "" icon.source: General.image_path + "menu-support-white.png" onClicked: supportClicked(type) } @@ -85,6 +95,7 @@ MouseArea Layout.fillWidth: true label.text: qsTr("Privacy") label.visible: isExpanded + anchors.leftMargin: 60 onClicked: { @@ -99,7 +110,7 @@ MouseArea standardButtons: Dialog.Yes | Dialog.Cancel, closePolicy: Popup.NoAutoClose, warning: true, - iconColor: Dex.CurrentTheme.noColor, + iconColor: Dex.CurrentTheme.warningColor, isPassword: true, placeholderText: qsTr("Type password"), yesButtonText: qsTr("Confirm"), @@ -148,9 +159,9 @@ MouseArea id: privacySwitch anchors.left: parent.left - anchors.leftMargin: 10 + anchors.leftMargin: -5 anchors.verticalCenter: parent.verticalCenter - scale: 0.75 + scale: 0.5 mouseArea.hoverEnabled: true onClicked: parent.clicked() } diff --git a/atomic_defi_design/Dex/Sidebar/Center.qml b/atomic_defi_design/Dex/Sidebar/Center.qml index 9e203908ac..89ab94df97 100644 --- a/atomic_defi_design/Dex/Sidebar/Center.qml +++ b/atomic_defi_design/Dex/Sidebar/Center.qml @@ -65,7 +65,7 @@ MouseArea Layout.fillWidth: true type: Main.LineType.Portfolio - label.text: isExpanded ? qsTr("Portfolio") : "" + label.text: qsTr("Portfolio") // isExpanded ? qsTr("Portfolio") : "" icon.source: General.image_path + "menu-assets-portfolio.svg" onClicked: lineSelected(type) } @@ -76,7 +76,7 @@ MouseArea Layout.fillWidth: true type: Main.LineType.Wallet - label.text: isExpanded ? qsTr("Wallet") : "" + label.text: qsTr("Wallet") // isExpanded ? qsTr("Wallet") : "" icon.source: General.image_path + "menu-assets-white.svg" onClicked: lineSelected(type) } @@ -87,7 +87,7 @@ MouseArea Layout.fillWidth: true type: Main.LineType.DEX - label.text: isExpanded ? qsTr("DEX") : "" + label.text: qsTr("DEX") // isExpanded ? qsTr("DEX") : "" icon.source: General.image_path + "menu-exchange-white.svg" onClicked: lineSelected(type) } @@ -98,7 +98,7 @@ MouseArea Layout.fillWidth: true type: Main.LineType.Addressbook - label.text: isExpanded ? qsTr("Address Book") : "" + label.text: qsTr("Address Book") // isExpanded ? qsTr("Address Book") : "" icon.source: General.image_path + "menu-news-white.svg" onClicked: lineSelected(type) } @@ -110,7 +110,7 @@ MouseArea label.enabled: false icon.enabled: false Layout.fillWidth: true - label.text: isExpanded ? qsTr("Fiat") : "" + label.text: qsTr("Fiat") // isExpanded ? qsTr("Fiat") : "" icon.source: General.image_path + "bill.svg" } } diff --git a/atomic_defi_design/Dex/Sidebar/FigurativeLine.qml b/atomic_defi_design/Dex/Sidebar/FigurativeLine.qml index 3010810c46..540ca6e11b 100644 --- a/atomic_defi_design/Dex/Sidebar/FigurativeLine.qml +++ b/atomic_defi_design/Dex/Sidebar/FigurativeLine.qml @@ -13,7 +13,7 @@ Line id: _icon anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left - anchors.leftMargin: 30 + anchors.leftMargin: 18 height: 16 } diff --git a/atomic_defi_design/Dex/Sidebar/Line.qml b/atomic_defi_design/Dex/Sidebar/Line.qml index 4c50cdc75a..c8a24b5949 100644 --- a/atomic_defi_design/Dex/Sidebar/Line.qml +++ b/atomic_defi_design/Dex/Sidebar/Line.qml @@ -24,7 +24,7 @@ Item id: _label anchors.left: parent.left - anchors.leftMargin: 70 + anchors.leftMargin: 45 anchors.verticalCenter: parent.verticalCenter font: Qt.font diff --git a/atomic_defi_design/Dex/Sidebar/Main.qml b/atomic_defi_design/Dex/Sidebar/Main.qml index d4a47b7d38..c36fb5b895 100644 --- a/atomic_defi_design/Dex/Sidebar/Main.qml +++ b/atomic_defi_design/Dex/Sidebar/Main.qml @@ -17,8 +17,8 @@ Item Support } - property bool isExpanded: containsMouse - property real lineHeight: 44 + property bool isExpanded: true + property real lineHeight: 36 property var currentLineType: Main.LineType.Portfolio property alias _selectionCursor: _selectionCursor property bool containsMouse: mouseArea.containsMouse @@ -26,25 +26,32 @@ Item signal lineSelected(var lineType) signal settingsClicked() signal supportClicked() + signal addCryptoClicked() signal privacySwitched(var checked) signal expanded(var isExpanded) signal expandStarted(var isExpanding) - width: isExpanded ? 200 : 80 + width: 150 height: parent.height // Background Rectangle - Rectangle + DefaultRectangle { + radius: 0 anchors.fill: parent + anchors.rightMargin : - border.width + anchors.bottomMargin: - border.width + anchors.leftMargin: - border.width + border.width: 1 + border.color: Dex.CurrentTheme.lineSeparatorColor color: Dex.CurrentTheme.sidebarBgColor } // Animation when changing width. - Behavior on width - { - NumberAnimation { duration: 300; targets: [width, _selectionCursor.width]; properties: "width"; onRunningChanged: { if (!running) expanded(isExpanded); else expandStarted(isExpanded); } } - } + // Behavior on width + // { + // NumberAnimation { duration: 300; targets: [width, _selectionCursor.width]; properties: "width"; onRunningChanged: { if (!running) expanded(isExpanded); else expandStarted(isExpanded); } } + // } // Selection Cursor AnimatedRectangle @@ -59,8 +66,8 @@ Item anchors.left: parent.left anchors.leftMargin: 12 - radius: 18 - width: parent.width - 14 + radius: 12 + width: parent.width - 20 height: lineHeight opacity: .7 @@ -98,7 +105,7 @@ Item id: center width: parent.width anchors.top: top.bottom - anchors.topMargin: 69.5 + anchors.topMargin: 70 onLineSelected: { if (currentLineType === lineType) @@ -113,16 +120,11 @@ Item id: bottom width: parent.width anchors.bottom: parent.bottom - anchors.bottomMargin: 62 + anchors.bottomMargin: 60 + onAddCryptoClicked: root.addCryptoClicked() onSettingsClicked: root.settingsClicked() onSupportClicked: root.supportClicked() } - - VerticalLine - { - height: parent.height - anchors.right: parent.right - } } } diff --git a/atomic_defi_design/Dex/Sidebar/Top.qml b/atomic_defi_design/Dex/Sidebar/Top.qml index d6c2e1b697..b73aebbc77 100644 --- a/atomic_defi_design/Dex/Sidebar/Top.qml +++ b/atomic_defi_design/Dex/Sidebar/Top.qml @@ -15,28 +15,28 @@ MouseArea { target: parent.parent - function onExpanded(isExpanded) - { - if (isExpanded) - { - fadeInTextVerAnimation.start(); - dexLogo.scale = .8; - dexLogo.source = Dex.CurrentTheme.bigLogoPath; - dexLogo.sourceSize.width = 200; - } - } + // function onExpanded(isExpanded) + // { + // if (isExpanded) + // { + // fadeInTextVerAnimation.start(); + // dexLogo.scale = .8; + // dexLogo.source = Dex.CurrentTheme.bigLogoPath; + // dexLogo.sourceSize.width = 200; + // } + // } - function onExpandStarted(isExpanding) - { - if (!isExpanding) - { - versionLabel.opacity = 0; - dexLogo.scale = .5; - dexLogo.source = Dex.CurrentTheme.logoPath; - dexLogo.sourceSize.width = 80; - versionLabel.opacity = 0; - } - } + // function onExpandStarted(isExpanding) + // { + // if (!isExpanding) + // { + // versionLabel.opacity = 0; + // dexLogo.scale = .5; + // dexLogo.source = Dex.CurrentTheme.logoPath; + // dexLogo.sourceSize.width = 80; + // versionLabel.opacity = 0; + // } + // } } NumberAnimation @@ -56,8 +56,8 @@ MouseArea Component.onCompleted: { sourceSize.width = parent.width - source = isExpanded ? Dex.CurrentTheme.bigLogoPath : Dex.CurrentTheme.logoPath; - scale = isExpanded ? .8 : .5 + source = Dex.CurrentTheme.bigLogoPath // isExpanded ? Dex.CurrentTheme.bigLogoPath : Dex.CurrentTheme.logoPath; + scale = 1 // isExpanded ? .8 : .5 } Connections @@ -65,7 +65,7 @@ MouseArea target: Dex.CurrentTheme function onThemeChanged() { - dexLogo.source = isExpanded ? Dex.CurrentTheme.bigLogoPath : Dex.CurrentTheme.logoPath + dexLogo.source = Dex.CurrentTheme.bigLogoPath // isExpanded ? Dex.CurrentTheme.bigLogoPath : Dex.CurrentTheme.logoPath } } } @@ -80,8 +80,8 @@ MouseArea text_value: General.version_string font: DexTypo.caption color: Dex.CurrentTheme.sidebarVersionTextColor - visible: root.width > 120 + visible: true // root.width > 120 - Component.onCompleted: opacity = isExpanded ? 1 : 0 + Component.onCompleted: opacity = 1 // isExpanded ? 1 : 0 } } diff --git a/atomic_defi_design/Dex/Support/SupportModal.qml b/atomic_defi_design/Dex/Support/SupportModal.qml index 3c197c9b4f..0ea8c92c52 100644 --- a/atomic_defi_design/Dex/Support/SupportModal.qml +++ b/atomic_defi_design/Dex/Support/SupportModal.qml @@ -29,7 +29,7 @@ Qaterial.Dialog topPadding: 30 bottomPadding: 30 anchors.centerIn: parent - + dim: true modal: true title: "Support" @@ -142,6 +142,19 @@ For this reason, we recommend cancelling orders before closing %1, or reviewing Network fees can vary greatly depending on your selected trading pair.").arg(API.app_name) } + // TODO: Update link to the KP blog when relevent article available. + FAQLine + { + title: qsTr("I see a transaction in my wallet that was marked as 'poison'. What does this mean?") + text: qsTr('Address poisoning is a relatively new tye of phishing attack, where a malicious actor aims to trick you into sending funds to an address that you did not intend to send funds to. + +This is often done by sending a zero value transaction to your wallet from an address which looks very similar to your actual address, with the exact same letters at the start and end. This transaction will then appear in your transaction history, with the scammer hoping you will mistake the fake address for your own and send funds to it. + +To protect you from this, %1 will mark any transaction that it detects as potentially being a poison transaction with a "poison" label. You should always be careful to confirm any address you send funds to is correct. + +There is a toggle in settings where you can turn on/off the display of these transactions.').arg(API.app_name) + } + FAQLine { title: qsTr("Do you provide user support?") @@ -195,7 +208,7 @@ Network fees can vary greatly depending on your selected trading pair.").arg(API Layout.preferredHeight: column_layout.height hoverEnabled: true - onClicked: update_modal.open() + onClicked: Qt.openUrlExternally("https://github.com/KomodoPlatform/komodo-wallet-desktop/pull/2296") ColumnLayout { diff --git a/atomic_defi_design/Dex/Themes/CurrentTheme.qml b/atomic_defi_design/Dex/Themes/CurrentTheme.qml index a39439456c..94ef9960d9 100644 --- a/atomic_defi_design/Dex/Themes/CurrentTheme.qml +++ b/atomic_defi_design/Dex/Themes/CurrentTheme.qml @@ -105,6 +105,16 @@ ThemeData buttonTextHoveredColor = Dex.Color.argbStrFromRgbaStr(themeData.buttonTextHoveredColor || defaultTheme.buttonTextHoveredColor); buttonTextPressedColor = Dex.Color.argbStrFromRgbaStr(themeData.buttonTextPressedColor || defaultTheme.buttonTextPressedColor); + buttonSecondaryColorDisabled = Dex.Color.argbStrFromRgbaStr(themeData.buttonSecondaryColorDisabled || defaultTheme.buttonSecondaryColorDisabled); + buttonSecondaryColorEnabled = Dex.Color.argbStrFromRgbaStr(themeData.buttonSecondaryColorEnabled || defaultTheme.buttonSecondaryColorEnabled); + buttonSecondaryColorHovered = Dex.Color.argbStrFromRgbaStr(themeData.buttonSecondaryColorHovered || defaultTheme.buttonSecondaryColorHovered); + buttonSecondaryColorPressed = Dex.Color.argbStrFromRgbaStr(themeData.buttonSecondaryColorPressed || defaultTheme.buttonSecondaryColorPressed); + + buttonCancelColorDisabled = Dex.Color.argbStrFromRgbaStr(themeData.buttonCancelColorDisabled || defaultTheme.buttonCancelColorDisabled); + buttonCancelColorEnabled = Dex.Color.argbStrFromRgbaStr(themeData.buttonCancelColorEnabled || defaultTheme.buttonCancelColorEnabled); + buttonCancelColorHovered = Dex.Color.argbStrFromRgbaStr(themeData.buttonCancelColorHovered || defaultTheme.buttonCancelColorHovered); + buttonCancelColorPressed = Dex.Color.argbStrFromRgbaStr(themeData.buttonCancelColorPressed || defaultTheme.buttonCancelColorPressed); + gradientButtonStartColor = Dex.Color.argbStrFromRgbaStr(themeData.gradientButtonStartColor || defaultTheme.gradientButtonStartColor); gradientButtonEndColor = Dex.Color.argbStrFromRgbaStr(themeData.gradientButtonEndColor || defaultTheme.gradientButtonEndColor); gradientButtonDisabledStartColor = Dex.Color.argbStrFromRgbaStr(themeData.gradientButtonDisabledStartColor || defaultTheme.gradientButtonDisabledStartColor); @@ -156,6 +166,8 @@ ThemeData textFieldPrefixColor = Dex.Color.argbStrFromRgbaStr(themeData.textFieldPrefixColor || defaultTheme.textFieldPrefixColor); textFieldSuffixColor = Dex.Color.argbStrFromRgbaStr(themeData.textFieldSuffixColor || defaultTheme.textFieldSuffixColor); + tickerBadgeBackgroundColor = Dex.Color.argbStrFromRgbaStr(themeData.tickerBadgeBackgroundColor || defaultTheme.tickerBadgeBackgroundColor); + chartTradingLineBackgroundColor = Dex.Color.argbStrFromRgbaStr(themeData.chartTradingLineBackgroundColor || defaultTheme.chartTradingLineBackgroundColor); chartTradingLineColor = Dex.Color.argbStrFromRgbaStr(themeData.chartTradingLineColor || defaultTheme.chartTradingLineColor); @@ -182,7 +194,18 @@ ThemeData tradeBuyModeSelectorBackgroundColorEnd = Dex.Color.argbStrFromRgbaStr(themeData.tradeBuyModeSelectorBackgroundColorEnd || defaultTheme.tradeBuyModeSelectorBackgroundColorEnd); tradeSellModeSelectorBackgroundColorStart = Dex.Color.argbStrFromRgbaStr(themeData.tradeSellModeSelectorBackgroundColorStart || defaultTheme.tradeSellModeSelectorBackgroundColorStart); tradeSellModeSelectorBackgroundColorEnd = Dex.Color.argbStrFromRgbaStr(themeData.tradeSellModeSelectorBackgroundColorEnd || defaultTheme.tradeSellModeSelectorBackgroundColorEnd); - tradeMarketModeSelectorNotSelectedBackgroundColor = Dex.Color.argbStrFromRgbaStr(themeData.tradeMarketModeSelectorNotSelectedBackgroundColor || defaultTheme.tradeMarketModeSelectorNotSelectedBackgroundColor); + + inputModifierBackgroundColor = Dex.Color.argbStrFromRgbaStr(themeData.inputModifierBackgroundColor || defaultTheme.inputModifierBackgroundColor); + inputFieldBackgroundColor = Dex.Color.argbStrFromRgbaStr(themeData.inputFieldBackgroundColor || defaultTheme.inputFieldBackgroundColor); + inputFieldBorderColor = Dex.Color.argbStrFromRgbaStr(themeData.inputFieldBorderColor || defaultTheme.inputFieldBorderColor); + inputPlaceholderTextColor = Dex.Color.argbStrFromRgbaStr(themeData.inputPlaceholderTextColor || defaultTheme.inputPlaceholderTextColor); + inputRightIconColor = Dex.Color.argbStrFromRgbaStr(themeData.inputRightIconColor || defaultTheme.inputRightIconColor); + inputLeftIconColor = Dex.Color.argbStrFromRgbaStr(themeData.inputLeftIconColor || defaultTheme.inputLeftIconColor); + inputLeftIconBackgroundColor = Dex.Color.argbStrFromRgbaStr(themeData.inputLeftIconBackgroundColor || defaultTheme.inputLeftIconBackgroundColor); + + listItemOddBackground = Dex.Color.argbStrFromRgbaStr(themeData.listItemOddBackground || defaultTheme.listItemOddBackground); + listItemEvenBackground = Dex.Color.argbStrFromRgbaStr(themeData.listItemEvenBackground || defaultTheme.listItemEvenBackground); + listItemHoveredBackground = Dex.Color.argbStrFromRgbaStr(themeData.listItemHoveredBackground || defaultTheme.listItemHoveredBackground); addressBookTagColors = themeData.addressBookTagColors || defaultTheme.addressBookTagColors for (var i = 0; i < addressBookTagColors.length; i++) @@ -190,13 +213,14 @@ ThemeData addressBookTagColors[i] = Dex.Color.argbStrFromRgbaStr(addressBookTagColors[i]) } - okColor = Dex.Color.argbStrFromRgbaStr(themeData.okColor || defaultTheme.okColor); - noColor = Dex.Color.argbStrFromRgbaStr(themeData.noColor || defaultTheme.noColor); + okColor = Dex.Color.argbStrFromRgbaStr(themeData.okColor || defaultTheme.okColor); + warningColor = Dex.Color.argbStrFromRgbaStr(themeData.warningColor || defaultTheme.warningColor); + swapIconColor = Dex.Color.argbStrFromRgbaStr(themeData.swapIconColor || defaultTheme.swapIconColor); - senderColorStart = Dex.Color.argbStrFromRgbaStr(themeData.senderColorStart || defaultTheme.senderColorStart); - receiverColorStart = Dex.Color.argbStrFromRgbaStr(themeData.receiverColorStart || defaultTheme.receiverColorStart); + senderColorStart = Dex.Color.argbStrFromRgbaStr(themeData.senderColorStart || defaultTheme.senderColorStart); + receiverColorStart = Dex.Color.argbStrFromRgbaStr(themeData.receiverColorStart || defaultTheme.receiverColorStart); - lineSeparatorColor = Dex.Color.argbStrFromRgbaStr(themeData.lineSeparatorColor || defaultTheme.lineSeparatorColor); + lineSeparatorColor = Dex.Color.argbStrFromRgbaStr(themeData.lineSeparatorColor || defaultTheme.lineSeparatorColor); } function loadLogo(themeName) @@ -278,6 +302,8 @@ ThemeData console.info("Dex.Themes.CurrentTheme.printValues.textFieldPrefixColor : %1".arg(textFieldPrefixColor)); console.info("Dex.Themes.CurrentTheme.printValues.textFieldSuffixColor : %1".arg(textFieldSuffixColor)); + console.info("Dex.Themes.CurrentTheme.printValues.tickerBadgeBackgroundColor : %1".arg(tickerBadgeBackgroundColor)); + console.info("Dex.Themes.CurrentTheme.printValues.chartTradingLineBackgroundColor : %1".arg(chartTradingLineBackgroundColor)); console.info("Dex.Themes.CurrentTheme.printValues.chartTradingLineColor : %1".arg(chartTradingLineColor)); @@ -304,12 +330,12 @@ ThemeData console.info("Dex.Themes.CurrentTheme.printValues.tradeBuyModeSelectorBackgroundColorEnd : %1".arg(tradeBuyModeSelectorBackgroundColorEnd)); console.info("Dex.Themes.CurrentTheme.printValues.tradeSellModeSelectorBackgroundColorStart : %1".arg(tradeSellModeSelectorBackgroundColorStart)); console.info("Dex.Themes.CurrentTheme.printValues.tradeSellModeSelectorBackgroundColorEnd : %1".arg(tradeSellModeSelectorBackgroundColorEnd)); - console.info("Dex.Themes.CurrentTheme.printValues.tradeMarketModeSelectorNotSelectedBackgroundColor : %1".arg(tradeMarketModeSelectorNotSelectedBackgroundColor)); + console.info("Dex.Themes.CurrentTheme.printValues.inputModifierBackgroundColor : %1".arg(inputModifierBackgroundColor)); console.info("Dex.Themes.CurrentTheme.printValues.addressBookTagColors : %1".arg(addressBookTagColors)); console.info("Dex.Themes.CurrentTheme.printValues.okColor : %1".arg(okColor)); - console.info("Dex.Themes.CurrentTheme.printValues.noColor : %1".arg(noColor)); + console.info("Dex.Themes.CurrentTheme.printValues.warningColor : %1".arg(warningColor)); console.info("Dex.Themes.CurrentTheme.printValues.senderColorStart : %1".arg(senderColorStart)); console.info("Dex.Themes.CurrentTheme.printValues.receiverColorStart : %1".arg(receiverColorStart)); diff --git a/atomic_defi_design/Dex/Themes/DefaultTheme.js b/atomic_defi_design/Dex/Themes/DefaultTheme.js index bc44012fd8..07467a9850 100644 --- a/atomic_defi_design/Dex/Themes/DefaultTheme.js +++ b/atomic_defi_design/Dex/Themes/DefaultTheme.js @@ -21,6 +21,16 @@ function getHardcoded() buttonTextHoveredColor: "#000000FF", buttonTextPressedColor: "#000000FF", + buttonSecondaryColorDisabled: "#D8E3F8FF", + buttonSecondaryColorEnabled: "#F0F6FFFF", + buttonSecondaryColorHovered: "#D7E7FFFF", + buttonSecondaryColorPressed: "#B8D2F9FF", + + buttonCancelColorDisabled: "#D8E3F8FF", + buttonCancelColorEnabled: "#F0F6FFFF", + buttonCancelColorHovered: "#D7E7FFFF", + buttonCancelColorPressed: "#B8D2F9FF", + gradientButtonStartColor: "#5A68E6FF", gradientButtonEndColor: "#4986EAAB", gradientButtonDisabledStartColor: "#CDD0F6FF", @@ -72,6 +82,8 @@ function getHardcoded() textFieldPrefixColor: "#45607894", textFieldSuffixColor: "#456078FF", + tickerBadgeBackgroundColor: "#D5DCF8FF", + chartTradingLineBackgroundColor: "#C5F2EFFF", chartTradingLineColor: "#53EBD7FF", @@ -94,16 +106,27 @@ function getHardcoded() sidebarLineTextHovered: "#2C87B9FF", sidebarLineTextSelected: "#FFFFFFFF", - tradeBuyModeSelectorBackgroundColorStart: "#6A4DE3FF", - tradeBuyModeSelectorBackgroundColorEnd: "#2279F1FF", + tradeBuyModeSelectorBackgroundColorStart: "#6A4DE3FF", + tradeBuyModeSelectorBackgroundColorEnd: "#2279F1FF", tradeSellModeSelectorBackgroundColorStart: "#E52167FF", - tradeSellModeSelectorBackgroundColorEnd: "#E216A9FF", - tradeMarketModeSelectorNotSelectedBackgroundColor: "#89B6FF21", + tradeSellModeSelectorBackgroundColorEnd: "#E216A9FF", + + inputModifierBackgroundColor: "#89B6FF21", + inputFieldBackgroundColor: "#313555FF", + inputFieldBorderColor: "#20233788", + inputPlaceholderTextColor: "#FFFFFFFF", + inputRightIconColor: "#FFFFFFFF", + inputLeftIconColor: "#FFFFFFFF", + inputLeftIconBackgroundColor: "#202337FF", + + listItemOddBackground: "#202337FF", + listItemEvenBackground: "#24273DFF", + listItemHoveredBackground: "#4068B9FF", - addressBookTagColors: ["#627EEAFF", "#FFD87AFF", "#F7931AFF"], + addressBookTagColors: ["#003bbbFF", "#006133FF", "#612600FF", "#430061FF", "#004d61FF"], okColor: "#00C058FF", - noColor: "#E52167FF", + warningColor: "#E52167FF", senderColorStart: "#F85757FF", receiverColorStart: "#845FEFFF", diff --git a/atomic_defi_design/Dex/Themes/ThemeData.qml b/atomic_defi_design/Dex/Themes/ThemeData.qml index 43cd03337d..a138eb816c 100644 --- a/atomic_defi_design/Dex/Themes/ThemeData.qml +++ b/atomic_defi_design/Dex/Themes/ThemeData.qml @@ -20,6 +20,16 @@ QtObject property color buttonTextHoveredColor property color buttonTextPressedColor + property color buttonSecondaryColorDisabled + property color buttonSecondaryColorEnabled + property color buttonSecondaryColorHovered + property color buttonSecondaryColorPressed + + property color buttonCancelColorDisabled + property color buttonCancelColorEnabled + property color buttonCancelColorHovered + property color buttonCancelColorPressed + property color gradientButtonStartColor property color gradientButtonEndColor property color gradientButtonDisabledStartColor @@ -71,6 +81,8 @@ QtObject property color textFieldPrefixColor property color textFieldSuffixColor + property color tickerBadgeBackgroundColor + property color chartTradingLineBackgroundColor property color chartTradingLineColor @@ -100,14 +112,27 @@ QtObject property color tradeBuyModeSelectorBackgroundColorEnd property color tradeSellModeSelectorBackgroundColorStart property color tradeSellModeSelectorBackgroundColorEnd - property color tradeMarketModeSelectorNotSelectedBackgroundColor + + // Inputs styling + property color inputModifierBackgroundColor + property color inputFieldBackgroundColor + property color inputFieldBorderColor + property color inputPlaceholderTextColor + property color inputRightIconColor + property color inputLeftIconColor + property color inputLeftIconBackgroundColor + + property color listItemOddBackground + property color listItemEvenBackground + property color listItemHoveredBackground // Address book page related property var addressBookTagColors // Colors used to tell when something is good or wrong. property color okColor - property color noColor + property color warningColor + property color swapIconColor property color senderColorStart property color receiverColorStart diff --git a/atomic_defi_design/Dex/Wallet/ClaimFaucetResultModal.qml b/atomic_defi_design/Dex/Wallet/ClaimFaucetResultModal.qml index 7e74f78fd2..203658f13b 100644 --- a/atomic_defi_design/Dex/Wallet/ClaimFaucetResultModal.qml +++ b/atomic_defi_design/Dex/Wallet/ClaimFaucetResultModal.qml @@ -24,5 +24,15 @@ MultipageModal { text_value: claiming_faucet_rpc_result && claiming_faucet_rpc_result.message ? claiming_faucet_rpc_result.message : "" } + + CancelButton + { + Layout.preferredWidth: 300 + text: qsTr("Close") + Layout.topMargin: 20 + Layout.alignment: Qt.AlignCenter + radius: 18 + onClicked: close() + } } } diff --git a/atomic_defi_design/Dex/Wallet/ClaimRewardsModal.qml b/atomic_defi_design/Dex/Wallet/ClaimRewardsModal.qml index 4222e0189f..f067a7886f 100644 --- a/atomic_defi_design/Dex/Wallet/ClaimRewardsModal.qml +++ b/atomic_defi_design/Dex/Wallet/ClaimRewardsModal.qml @@ -414,7 +414,7 @@ MultipageModal // Buttons footer: [ - DexAppButton + CancelButton { text: qsTr("Cancel") leftPadding: 40 diff --git a/atomic_defi_design/Dex/Wallet/EnableCoinModal.qml b/atomic_defi_design/Dex/Wallet/EnableCoinModal.qml index 332f7049b0..d8f53a2d3f 100644 --- a/atomic_defi_design/Dex/Wallet/EnableCoinModal.qml +++ b/atomic_defi_design/Dex/Wallet/EnableCoinModal.qml @@ -15,6 +15,8 @@ import Dex.Themes 1.0 as Dex MultipageModal { id: root + horizontalPadding: 35 + verticalPadding: 35 property var coin_cfg_model: API.app.portfolio_pg.global_cfg_mdl @@ -28,8 +30,7 @@ MultipageModal coin_cfg_model.all_disabled_proxy.setFilterFixedString(text === undefined ? input_coin_filter.textField.text : text) } - width: 676 - height: 720 + width: 600 onOpened: { @@ -45,12 +46,20 @@ MultipageModal coin_cfg_model.checked_nb = 0; } - MultipageModalContent + ColumnLayout { - titleText: qsTr("Enable assets") - titleAlignment: Qt.AlignHCenter - titleTopMargin: 15 - topMarginAfterTitle: 15 + spacing: 5 + Layout.fillWidth: true + Layout.fillHeight: true + + DefaultText + { + id: _title + Layout.topMargin: 5 + Layout.alignment: Qt.AlignHCenter + font: DexTypo.head6 + text: qsTr("Enable assets") + } // Search input SearchField @@ -59,146 +68,154 @@ MultipageModal searchIconLeftMargin: 20 Layout.alignment: Qt.AlignHCenter - Layout.topMargin: 10 + Layout.topMargin: 15 Layout.fillWidth: true - Layout.preferredHeight: 44 - textField.placeholderText: qsTr("Search asset") + Layout.preferredHeight: 40 + textField.placeholderText: qsTr("Search assets") textField.forceFocus: true textField.onTextChanged: filterCoins() } - RowLayout + MultipageModalContent { - spacing: 0 - Layout.topMargin: 10 - Layout.fillWidth: true - Layout.preferredHeight: 24 + titleTopMargin: 0 + topMarginAfterTitle: 0 + spacing: 5 + - DefaultCheckBox + RowLayout { - id: _selectAllCheckBox + spacing: 0 + Layout.topMargin: 10 Layout.fillWidth: true + Layout.preferredHeight: 24 - spacing: 0 - boxWidth: 20 - boxHeight: 20 - labelWidth: parent.width - 40 - label.wrapMode: Label.NoWrap - label.leftPadding: 24 + DefaultCheckBox + { + id: _selectAllCheckBox + Layout.fillWidth: true - text: qsTr("Select all assets") - visible: list.visible + spacing: 0 + boxWidth: 20 + boxHeight: 20 + labelWidth: parent.width - 40 + label.wrapMode: Label.NoWrap + label.leftPadding: 24 - onToggled: root.setCheckState(checked) - } - } + text: qsTr("Select all assets") + visible: list.visible - HorizontalLine { Layout.topMargin: 5; Layout.alignment: Qt.AlignHCenter; Layout.fillWidth: true } + onToggled: root.setCheckState(checked) + } + } - DefaultListView - { - id: list - visible: coin_cfg_model.all_disabled_proxy.length > 0 - model: coin_cfg_model.all_disabled_proxy + HorizontalLine { Layout.topMargin: 5; Layout.alignment: Qt.AlignHCenter; Layout.fillWidth: true } - Layout.topMargin: -5 - Layout.alignment: Qt.AlignHCenter - Layout.preferredHeight: 300 - Layout.fillWidth: true - - delegate: Item + DefaultListView { - height: 30 - width: list.width + id: list + visible: coin_cfg_model.all_disabled_proxy.length > 0 + model: coin_cfg_model.all_disabled_proxy - RowLayout + Layout.topMargin: -5 + Layout.alignment: Qt.AlignHCenter + Layout.preferredHeight: 300 + Layout.fillWidth: true + + delegate: Item { - spacing: 0 - Layout.topMargin: 10 - Layout.fillWidth: true - Layout.preferredHeight: 24 + height: 30 + width: list.width - DefaultCheckBox + RowLayout { - id: listInnerRowCheckbox - readonly property bool backend_checked: model.checked - - Layout.fillWidth: true - spacing: 0 - boxWidth: 20 - boxHeight: 20 - labelWidth: parent.width - 40 + Layout.topMargin: 10 + Layout.fillWidth: true + Layout.preferredHeight: 24 - onBackend_checkedChanged: if (checked !== backend_checked) checked = backend_checked - onCheckStateChanged: + DefaultCheckBox { - if (checked !== backend_checked) - { - var data_index = coin_cfg_model.all_disabled_proxy.index(index, 0) - if ((coin_cfg_model.all_disabled_proxy.setData(data_index, checked, Qt.UserRole + 11)) === false) - { - checked = false - } - } - } + id: listInnerRowCheckbox + readonly property bool backend_checked: model.checked + + Layout.fillWidth: true - contentItem: RowLayout - { - Layout.alignment: Qt.AlignVCenter spacing: 0 + boxWidth: 20 + boxHeight: 20 + labelWidth: parent.width - 40 - // Icon - DefaultImage + onBackend_checkedChanged: if (checked !== backend_checked) checked = backend_checked + onCheckStateChanged: { - id: icon - Layout.leftMargin: 24 - Layout.alignment: Qt.AlignVCenter - source: General.coinIcon(model.ticker) - Layout.preferredWidth: 18 - Layout.preferredHeight: 18 + if (checked !== backend_checked) + { + var data_index = coin_cfg_model.all_disabled_proxy.index(index, 0) + if ((coin_cfg_model.all_disabled_proxy.setData(data_index, checked, Qt.UserRole + 11)) === false) + { + checked = false + } + } } - DefaultText + contentItem: RowLayout { - Layout.leftMargin: 4 Layout.alignment: Qt.AlignVCenter - text: model.name + " (" + model.ticker + ")" - } + spacing: 0 - CoinTypeTag - { - id: typeTag - Layout.leftMargin: 6 - Layout.alignment: Qt.AlignVCenter - type: model.type - } + // Icon + DefaultImage + { + id: icon + Layout.leftMargin: 24 + Layout.alignment: Qt.AlignVCenter + source: General.coinIcon(model.ticker) + Layout.preferredWidth: 18 + Layout.preferredHeight: 18 + } - CoinTypeTag - { - Layout.leftMargin: 6 - Layout.alignment: Qt.AlignVCenter - enabled: General.isIDO(model.ticker) - visible: enabled - type: "IDO" - } + DefaultText + { + Layout.leftMargin: 4 + Layout.alignment: Qt.AlignVCenter + text: model.name + " (" + model.ticker + ")" + } - CoinTypeTag - { - Layout.leftMargin: 6 - Layout.alignment: Qt.AlignVCenter - enabled: API.app.portfolio_pg.global_cfg_mdl.get_coin_info(model.ticker).is_wallet_only - visible: enabled - type: "WALLET ONLY" + CoinTypeTag + { + id: typeTag + Layout.leftMargin: 6 + Layout.alignment: Qt.AlignVCenter + type: model.type + } + + CoinTypeTag + { + Layout.leftMargin: 6 + Layout.alignment: Qt.AlignVCenter + enabled: General.isIDO(model.ticker) + visible: enabled + type: "IDO" + } + + CoinTypeTag + { + Layout.leftMargin: 6 + Layout.alignment: Qt.AlignVCenter + enabled: API.app.portfolio_pg.global_cfg_mdl.get_coin_info(model.ticker).is_wallet_only + visible: enabled + type: "WALLET ONLY" + } } } } - } - DefaultMouseArea - { - anchors.fill: parent - onClicked: listInnerRowCheckbox.checked = !listInnerRowCheckbox.checked + DefaultMouseArea + { + anchors.fill: parent + onClicked: listInnerRowCheckbox.checked = !listInnerRowCheckbox.checked + } } } } @@ -208,36 +225,29 @@ MultipageModal Layout.topMargin: 6 Layout.fillWidth: true Layout.alignment: Qt.AlignHCenter - DefaultText { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter text: coin_cfg_model.all_disabled_proxy.length > 0 ? - qsTr("You can still enable %1 assets. Selected: %2.") - .arg(setting_modal.enableable_coins_count - API.app.portfolio_pg.portfolio_mdl.length - coin_cfg_model.checked_nb) - .arg(coin_cfg_model.checked_nb) : - qsTr("All assets are already enabled!") - + qsTr("You can still enable %1 assets. Selected: %2.") + .arg(setting_modal.enableable_coins_count - API.app.portfolio_pg.portfolio_mdl.length - coin_cfg_model.checked_nb) + .arg(coin_cfg_model.checked_nb) : + qsTr("All assets are already enabled!") color: Dex.CurrentTheme.textPlaceholderColor } } - HorizontalLine { Layout.preferredWidth: 500; Layout.alignment: Qt.AlignHCenter } - Item { Layout.alignment: Qt.AlignHCenter Layout.fillWidth: true - Layout.topMargin: 10 - Layout.preferredHeight: 60 + Layout.preferredHeight: 40 DexTransparentButton { anchors.left: parent.left text: qsTr("Change assets limit") - topPadding: 5 - bottomPadding: 5 Layout.preferredHeight: 35 onClicked: { @@ -250,8 +260,6 @@ MultipageModal { anchors.right: parent.right text: qsTr("Add a custom asset") - topPadding: 5 - bottomPadding: 5 Layout.preferredHeight: 35 iconSource: Qaterial.Icons.plus onClicked: { @@ -261,16 +269,22 @@ MultipageModal } } - footer: - [ - DefaultButton + // Footer + RowLayout + { + id: _footer + Layout.topMargin: Style.rowSpacing + spacing: Style.buttonSpacing + height: 40 + + CancelButton { Layout.preferredWidth: 199 text: qsTr("Cancel") radius: 20 onClicked: root.close() - }, - Item { Layout.fillWidth: true }, + } + Item { Layout.fillWidth: true } DexGradientAppButton { @@ -288,6 +302,6 @@ MultipageModal root.close() } } - ] + } } } diff --git a/atomic_defi_design/Dex/Wallet/Main.qml b/atomic_defi_design/Dex/Wallet/Main.qml index f046780849..7ecf682d91 100644 --- a/atomic_defi_design/Dex/Wallet/Main.qml +++ b/atomic_defi_design/Dex/Wallet/Main.qml @@ -42,6 +42,7 @@ Item Layout.fillHeight: true Layout.fillWidth: true + // TODO: Move this section for the coin summary bar at the top to its own component ColumnLayout { id: wallet_layout @@ -112,7 +113,7 @@ Item verticalAlignment: Text.AlignVCenter text: activation_progress + "%" font: DexTypo.head8 - color: DexTheme.greenColor + color: DexTheme.okColor } } @@ -166,77 +167,6 @@ Item Item { Layout.fillWidth: true } - ColumnLayout - { - visible: false //current_ticker_infos.segwit_supported - Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - spacing: 2 - - DefaultText - { - text_value: qsTr("Segwit") - Layout.alignment: Qt.AlignLeft - font.pixelSize: headerTitleFont - color: headerTitleColor - } - - DefaultSwitch - { - id: segwitSwitch - Layout.alignment: Qt.AlignVCenter - - onToggled: - { - if(parseFloat(current_ticker_infos.balance) > 0) { - Qaterial.DialogManager.showDialog({ - title: qsTr("Confirmation"), - text: qsTr("Do you want to send your %1 funds to %2 wallet first?").arg(current_ticker_infos.is_segwit_on ? "segwit" : "legacy").arg(!current_ticker_infos.is_segwit_on ? "segwit" : "legacy"), - standardButtons: Dialog.Yes | Dialog.No, - onAccepted: function() { - var address = API.app.wallet_pg.switch_address_mode(!current_ticker_infos.is_segwit_on); - if (address != current_ticker_infos.address && address != "") { - send_modal.open() - send_modal.item.address_field.text = address - send_modal.item.max_mount.checked = true - send_modal.item.segwit = true - send_modal.item.segwit_callback = function () { - if(send_modal.item.segwit_success) { - API.app.wallet_pg.post_switch_address_mode(!current_ticker_infos.is_segwit_on) - Qaterial.DialogManager.showDialog({ - title: qsTr("Success"), - text: qsTr("Your transaction is send, may take some time to arrive") - }) - } else { - segwitSwitch.checked = current_ticker_infos.is_segwit_on - } - } - } - }, - - onRejected: function () { - app.segwit_on = true - API.app.wallet_pg.post_switch_address_mode(!current_ticker_infos.is_segwit_on) - } - }) - - } else { - app.segwit_on = true - API.app.wallet_pg.post_switch_address_mode(!current_ticker_infos.is_segwit_on) - } - } - } - } - - Connections - { - target: API.app.wallet_pg - function onTickerInfosChanged() { - if (segwitSwitch.checked != current_ticker_infos.is_segwit_on) { - segwitSwitch.checked = current_ticker_infos.is_segwit_on - } - } - } - // Price ColumnLayout { @@ -309,7 +239,7 @@ Item DefaultText { id: portfolio_title - text_value: qsTr("Porfolio") + text_value: qsTr("Portfolio") Layout.alignment: Qt.AlignHCenter color: headerTitleColor font.pixelSize: headerTitleFont @@ -432,11 +362,11 @@ Item enabled: General.canSend(api_wallet_page.ticker, activation_progress) anchors.fill: parent radius: 18 - label.text: qsTr("Send") label.font.pixelSize: 16 content.anchors.left: content.parent.left content.anchors.leftMargin: enabled ? 23 : 48 + content.anchors.rightMargin: 23 onClicked: { @@ -444,13 +374,19 @@ Item else enable_fees_coin_modal.open() } - TransactionArrow + Row { - id: arrow_send - amISender: true anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: 19 + anchors.rightMargin: 23 + + Qaterial.Icon + { + icon: Qaterial.Icons.arrowTopRight + size: 24 + anchors.verticalCenter: parent.verticalCenter + color: Dex.CurrentTheme.warningColor + } } } @@ -544,12 +480,19 @@ Item onClicked: receive_modal.open() - TransactionArrow + Row { anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: 19 - amISender: false + anchors.rightMargin: 23 + + Qaterial.Icon + { + icon: Qaterial.Icons.arrowBottomRight + size: 24 + anchors.verticalCenter: parent.verticalCenter + color: Dex.CurrentTheme.okColor + } } } @@ -592,21 +535,17 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: arrow_send.anchors.rightMargin - spacing: 2 - - TransactionArrow - { - amISender: true - anchors.verticalCenter: parent.verticalCenter - } + anchors.rightMargin: 23 - TransactionArrow + Qaterial.Icon { - amISender: false + icon: Qaterial.Icons.swapHorizontal + size: 28 anchors.verticalCenter: parent.verticalCenter + color: Dex.CurrentTheme.swapIconColor } } + } // Swap button error icon @@ -656,7 +595,7 @@ Item { Layout.preferredWidth: 180 Layout.preferredHeight: 48 - visible: current_ticker_infos.is_smartchain_test_coin + visible: current_ticker_infos.is_faucet_coin DefaultButton { @@ -675,23 +614,14 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: arrow_send.anchors.rightMargin + anchors.rightMargin: 23 Qaterial.Icon { icon: Qaterial.Icons.water size: 24 - anchors.right: parent.right - anchors.leftMargin: iconSize / 2 - anchors.rightMargin: iconSize / 2 anchors.verticalCenter: parent.verticalCenter color: "cyan" - - DefaultTooltip - { - visible: alertArea.containsMouse && tooltipText != "" - text: "" - } } } } @@ -970,13 +900,15 @@ Item GradientStop { position: 1; color: Dex.CurrentTheme.backgroundColor } } } - + + // Transactions history table Transactions { width: parent.width height: parent.height } + // Placeholder if no tx history available, or being fetched. ColumnLayout { visible: current_ticker_infos.tx_state !== "InProgress" && transactions_mdl.length === 0 @@ -1011,6 +943,7 @@ Item visible: api_wallet_page.tx_fetching_busy } + // When no tx history available, or being fetched, show a button to open the explorer. DefaultText { id: explorerLink diff --git a/atomic_defi_design/Dex/Wallet/ReceiveModal.qml b/atomic_defi_design/Dex/Wallet/ReceiveModal.qml index cb91aded2d..bf28c7b6c6 100644 --- a/atomic_defi_design/Dex/Wallet/ReceiveModal.qml +++ b/atomic_defi_design/Dex/Wallet/ReceiveModal.qml @@ -55,7 +55,7 @@ MultipageModal footer: [ Item { Layout.fillWidth: true }, - DefaultButton + CancelButton { text: qsTr("Close") Layout.fillWidth: true diff --git a/atomic_defi_design/Dex/Wallet/SendModal.qml b/atomic_defi_design/Dex/Wallet/SendModal.qml index e48aefb716..e21a31f106 100644 --- a/atomic_defi_design/Dex/Wallet/SendModal.qml +++ b/atomic_defi_design/Dex/Wallet/SendModal.qml @@ -18,14 +18,13 @@ MultipageModal property bool needFix: false property bool errorView: false - property bool segwit: false - property bool segwit_success: false - property var segwit_callback property var address_data readonly property var default_send_result: ({ has_error: false, error_message: "", withdraw_answer: { - total_amount_fiat: "", tx_hex: "", date: "", "fee_details": { total_fee: "" } + total_amount_fiat: "", tx_hex: "", + memo: "", date: "", + "fee_details": { total_fee: "" } }, explorer_url: "", max: false }) property var send_result: default_send_result @@ -48,9 +47,8 @@ MultipageModal function getCryptoAmount() { return _preparePage.cryptoSendMode ? input_amount.text : equivalentAmount.value } - function prepareSendCoin(address, amount, with_fees, fees_amount, is_special_token, gas_limit, gas_price) { + function prepareSendCoin(address, amount, with_fees, fees_amount, is_special_token, gas_limit, gas_price, memo="") { let max = parseFloat(current_ticker_infos.balance) === parseFloat(amount) - // Save for later check async_param_max = max @@ -62,7 +60,7 @@ MultipageModal gas_price, gas_limit: gas_limit === "" ? 0 : parseInt(gas_limit) } - api_wallet_page.send(address, amount, max, with_fees, fees_info) + api_wallet_page.send(address, amount, max, with_fees, fees_info, memo) } function sendCoin() { @@ -82,6 +80,7 @@ MultipageModal send_result = default_send_result input_address.text = "" input_amount.text = "" + input_memo.text = "" input_custom_fees.text = "" input_custom_fees_gas.text = "" input_custom_fees_gas_price.text = "" @@ -154,11 +153,6 @@ MultipageModal onClosed: { - if (segwit) - { - segwit_callback() - } - segwit = false reset() } @@ -260,7 +254,7 @@ MultipageModal DefaultRectangle { - enabled: !root.segwit && !root.is_send_busy + enabled: !root.is_send_busy Layout.preferredWidth: 500 Layout.preferredHeight: 44 @@ -342,7 +336,7 @@ MultipageModal Layout.preferredWidth: 320 wrapMode: Label.Wrap - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor text_value: qsTr("The address has to be mixed case.") } @@ -560,6 +554,31 @@ MultipageModal } } + // Memo + DefaultRectangle + { + visible: General.isCoinWithMemo(api_wallet_page.ticker) + enabled: !root.is_send_busy + + Layout.preferredWidth: 500 + Layout.preferredHeight: 44 + Layout.alignment: Qt.AlignHCenter + + color: input_memo.background.color + radius: input_memo.background.radius + + DefaultTextField + { + id: input_memo + + width: 470 + height: 44 + placeholderText: qsTr("Enter memo") + forceFocus: true + font: General.isZhtlc(api_wallet_page.ticker) ? DexTypo.body3 : DexTypo.body2 + } + } + ColumnLayout { visible: General.getCustomFeeType(current_ticker_infos) @@ -589,7 +608,7 @@ MultipageModal font.pixelSize: 14 Layout.alignment: Qt.AlignHCenter horizontalAlignment: DefaultText.AlignHCenter - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor } DefaultText @@ -598,7 +617,7 @@ MultipageModal font.pixelSize: 14 Layout.alignment: Qt.AlignHCenter horizontalAlignment: DefaultText.AlignHCenter - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor text_value: qsTr("Only use custom fees if you know what you are doing! ") } @@ -608,7 +627,7 @@ MultipageModal font.pixelSize: 14 Layout.alignment: Qt.AlignHCenter horizontalAlignment: DefaultText.AlignHCenter - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor text_value: qsTr("Only use custom fees if you know what you are doing! ") + General.cex_icon DefaultInfoTrigger { triggerModal: gas_info_modal } } @@ -699,7 +718,7 @@ MultipageModal wrapMode: Label.Wrap visible: !fee_error.visible && !hasFunds() - color: Dex.CurrentTheme.noColor + color: Dex.CurrentTheme.warningColor text_value: qsTr("Not enough funds.") + "\n" + qsTr("You have %1", "AMT TICKER").arg(General.formatCrypto("", API.app.get_balance(api_wallet_page.ticker), api_wallet_page.ticker)) @@ -733,7 +752,7 @@ MultipageModal Layout.alignment: Qt.AlignHCenter Layout.topMargin: 20 - DefaultButton + CancelButton { text: qsTr("Cancel") @@ -758,8 +777,16 @@ MultipageModal text: qsTr("Prepare") - onClicked: prepareSendCoin(input_address.text, getCryptoAmount(), custom_fees_switch.checked, input_custom_fees.text, - General.isSpecialToken(current_ticker_infos), input_custom_fees_gas.text, input_custom_fees_gas_price.text) + onClicked: prepareSendCoin( + input_address.text, + getCryptoAmount(), + custom_fees_switch.checked, + input_custom_fees.text, + General.isSpecialToken(current_ticker_infos), + input_custom_fees_gas.text, + input_custom_fees_gas_price.text, + input_memo.text + ) } } @@ -830,6 +857,14 @@ MultipageModal } } + // Memo + TextEditWithTitle + { + title: qsTr("Memo") + visible: input_memo.text != "" + text: input_memo.text + } + // Fees TextEditWithTitle { @@ -906,7 +941,6 @@ MultipageModal function onClose() { - if (root.segwit) root.segwit_success = true root.close() } } diff --git a/atomic_defi_design/Dex/Wallet/SendResult.qml b/atomic_defi_design/Dex/Wallet/SendResult.qml index 41b06be0cb..8ac93c37a5 100644 --- a/atomic_defi_design/Dex/Wallet/SendResult.qml +++ b/atomic_defi_design/Dex/Wallet/SendResult.qml @@ -76,6 +76,18 @@ MultipageModalContent } } + // Memo + TextEditWithTitle + { + title: qsTr("Memo") + visible: result.withdraw_answer.memo + + text: + { + result.withdraw_answer.memo + } + } + // Fees TextEditWithTitle { @@ -105,7 +117,7 @@ MultipageModalContent // Buttons footer: [ - DexButton + CancelButton { Layout.fillWidth: true text: qsTr("Close") diff --git a/atomic_defi_design/Dex/Wallet/Sidebar.qml b/atomic_defi_design/Dex/Wallet/Sidebar.qml index 4df9424272..0539e74499 100644 --- a/atomic_defi_design/Dex/Wallet/Sidebar.qml +++ b/atomic_defi_design/Dex/Wallet/Sidebar.qml @@ -6,7 +6,7 @@ import QtGraphicalEffects 1.0 import Qaterial 1.0 as Qaterial import "../Components" -import "../Constants" as Constants +import "../Constants" import App 1.0 import Dex.Themes 1.0 as Dex import Dex.Components 1.0 as Dex @@ -28,10 +28,16 @@ Item DefaultRectangle { id: background - anchors.right: parent.right + radius: 0 width: parent.width - height: parent.height + anchors.right: parent.right + anchors.rightMargin : - border.width + anchors.topMargin : - border.width + anchors.bottomMargin: - border.width + anchors.leftMargin: - border.width + border.width: 0 + color: 'transparent' // Panel contents Item @@ -44,11 +50,11 @@ Item ColumnLayout { anchors.fill: parent - anchors.topMargin: 30 - anchors.bottomMargin: 30 + anchors.topMargin: 20 + anchors.bottomMargin: 10 anchors.leftMargin: 10 - anchors.rightMargin: 20 - spacing: 20 + anchors.rightMargin: 10 + spacing: 10 // Searchbar SearchField @@ -57,7 +63,8 @@ Item Layout.alignment: Qt.AlignHCenter Layout.preferredWidth: 150 - Layout.preferredHeight: 38 + Layout.fillWidth: true + Layout.preferredHeight: 36 textField.placeholderText: qsTr("Search") forceFocus: true @@ -77,69 +84,14 @@ Item id: list height: list_bg.height model: portfolio_coins - topMargin: 5 - bottomMargin: 5 scrollbar_visible: false reuseItems: true delegate: SidebarItemDelegate { } - Dex.Rectangle - { - anchors.bottom: parent.bottom - anchors.horizontalCenter: parent.horizontalCenter - width: parent.width + 4 - height: 30 - radius: 8 - opacity: .5 - visible: list.position < (.98 - list.scrollVert.visualSize) ? true : false - Qaterial.Icon - { - anchors.centerIn: parent - color: Dex.CurrentTheme.foregroundColor - icon: Qaterial.Icons.arrowDownCircleOutline - } - } - - Dex.Rectangle - { - anchors.horizontalCenter: parent.horizontalCenter - width: parent.width + 4 - height: 30 - radius: 8 - opacity: .5 - visible: list.position > 0 ? true : false - Qaterial.Icon - { - anchors.centerIn: parent - color: Dex.CurrentTheme.foregroundColor - icon: Qaterial.Icons.arrowUpCircleOutline - } - } } } - - DexAppButton { - id: add_coin_button - onClicked: enable_coin_modal.open() - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: 140 - radius: 18 - spacing: 2 - font: Qt.font({ - pixelSize: 9 * DexTypo.fontDensity, - letterSpacing: 1.25, - capitalization: Font.AllUppercase, - family: DexTypo.fontFamily, - weight: Font.Normal - }) - text: qsTr("Add asset") - iconSource: Qaterial.Icons.plus - leftPadding: 3 - rightPadding: 3 - - } } } } diff --git a/atomic_defi_design/Dex/Wallet/SidebarItemDelegate.qml b/atomic_defi_design/Dex/Wallet/SidebarItemDelegate.qml index 8d3a1ad757..a4551cd784 100644 --- a/atomic_defi_design/Dex/Wallet/SidebarItemDelegate.qml +++ b/atomic_defi_design/Dex/Wallet/SidebarItemDelegate.qml @@ -62,7 +62,7 @@ GradientRectangle anchors.centerIn: parent anchors.fill: parent radius: 15 - enabled: Dex.General.isZhtlc(ticker) ? activation_progress != 100 : false + enabled: Dex.General.isZhtlc(ticker) ? activation_progress < 100 : false visible: enabled opacity: .9 color: Dex.DexTheme.backgroundColor @@ -72,13 +72,13 @@ GradientRectangle { anchors.centerIn: parent anchors.fill: parent - enabled: Dex.General.isZhtlc(ticker) ? activation_progress != 100 : false + enabled: Dex.General.isZhtlc(ticker) ? activation_progress < 100 : false visible: enabled horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: activation_progress + "%" font: Dex.DexTypo.head8 - color: Dex.DexTheme.greenColor + color: Dex.DexTheme.okColor } } diff --git a/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml b/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml index 25380f302a..ab69b7cba4 100644 --- a/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml +++ b/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml @@ -18,6 +18,7 @@ MultipageModal function reset() { } property var details + property bool is_spam: !details ? false : details.amount == 0 onClosed: { @@ -29,6 +30,30 @@ MultipageModal { titleText: qsTr("Transaction Details") + // Warning for spam/poison transactions + DefaultText + { + id: warning_text + visible: is_spam + Layout.alignment: Qt.AlignVCenter + Layout.fillWidth: true + wrapMode: Label.Wrap + color: Style.colorOrange + text_value: qsTr("This transaction has been identified as a potential address poisoning attack.") + } + + // Warning for spam/poison transactions + DefaultText + { + id: warning_text2 + visible: is_spam + Layout.alignment: Qt.AlignVCenter + Layout.fillWidth: true + wrapMode: Label.Wrap + color: Style.colorOrange + text_value: qsTr("Please see the Support FAQ for more information.") + } + // Transaction Hash TitleText { @@ -46,7 +71,7 @@ MultipageModal text_box_width: 600 text_value: !details ? "" : details.tx_hash linkURL: !details ? "" :General.getTxExplorerURL(api_wallet_page.ticker, details.tx_hash, false) - onCopyNotificationTitle: qsTr("%1 txid", "TICKER").arg(api_wallet_page.ticker) + onCopyNotificationTitle: qsTr("%1 txid", "TICKER").arg(api_wallet_page.ticker) onCopyNotificationMsg: qsTr("copied to clipboard.") privacy: true } @@ -56,7 +81,7 @@ MultipageModal { title: qsTr("Amount") text: !details ? "" : General.formatCrypto(!details.am_i_sender, details.amount, api_wallet_page.ticker, details.amount_fiat, API.app.settings_pg.current_currency) - value_color: !details ? "white" : details.am_i_sender ? Dex.CurrentTheme.noColor : Dex.CurrentTheme.okColor + value_color: !details ? "white" : details.am_i_sender ? Dex.CurrentTheme.warningColor : Dex.CurrentTheme.okColor privacy: true label.font.pixelSize: 13 } @@ -66,7 +91,7 @@ MultipageModal { title: qsTr("Fees") text: !details ? "" : General.formatCrypto(parseFloat(details.fees) < 0, Math.abs(parseFloat(details.fees)), current_ticker_infos.fee_ticker, details.fees_amount_fiat, API.app.settings_pg.current_currency) - value_color: !details ? "white" : parseFloat(details.fees) > 0 ? Dex.CurrentTheme.noColor : Dex.CurrentTheme.okColor + value_color: !details ? "white" : parseFloat(details.fees) > 0 ? Dex.CurrentTheme.warningColor : Dex.CurrentTheme.okColor privacy: true label.font.pixelSize: 13 } @@ -78,7 +103,7 @@ MultipageModal model: !details ? [] : details.from linkURL: !details ? "" :General.getAddressExplorerURL(api_wallet_page.ticker, details.from) - onCopyNotificationTitle: qsTr("From address") + onCopyNotificationTitle: is_spam ? "" : qsTr("From address") } AddressList @@ -92,7 +117,7 @@ MultipageModal : details.to.length > 1 ? General.getAddressExplorerURL(api_wallet_page.ticker, General.arrayExclude(details.to, details.from[0])) : General.getAddressExplorerURL(api_wallet_page.ticker, details.to) - onCopyNotificationTitle: qsTr("To address") + onCopyNotificationTitle: is_spam ? "" : qsTr("To address") } // Date @@ -147,7 +172,7 @@ MultipageModal // Buttons footer: [ - DefaultButton + CancelButton { Layout.fillWidth: true text: qsTr("Close") diff --git a/atomic_defi_design/Dex/Wallet/Transactions.qml b/atomic_defi_design/Dex/Wallet/Transactions.qml index 30e94fa2b8..c86c58ef11 100644 --- a/atomic_defi_design/Dex/Wallet/Transactions.qml +++ b/atomic_defi_design/Dex/Wallet/Transactions.qml @@ -1,6 +1,7 @@ import QtQuick 2.15 import QtQuick.Layouts 1.15 import QtQuick.Controls 2.15 +import Qaterial 1.0 as Qaterial import "../Components" import "../Constants" @@ -21,16 +22,17 @@ Dex.ListView model: transactions_mdl.proxy_mdl - // Row + // Transaction Row delegate: Dex.Rectangle { id: rectangle + property bool is_spam: amount == 0 width: list.width height: row_height radius: 0 border.width: 0 colorAnimation: false - color: mouse_area.containsMouse ? Dex.CurrentTheme.buttonColorHovered : 'transparent' + color: mouse_area.containsMouse ? Dex.CurrentTheme.listItemHoveredBackground : 'transparent' Dex.MouseArea { @@ -63,10 +65,13 @@ Dex.ListView visible: transaction_note !== "" } - TransactionArrow + // When a spam / poison tx, we show a warning icon + Qaterial.Icon { id: received_icon - amISender: am_i_sender ? true : false + size: 16 + icon: is_spam ? Qaterial.Icons.radioactive : am_i_sender ? Qaterial.Icons.arrowTopRight : Qaterial.Icons.arrowBottomRight + color: is_spam ? Style.colorOrange : am_i_sender ? Dex.CurrentTheme.warningColor : Dex.CurrentTheme.okColor } // Description @@ -74,8 +79,9 @@ Dex.ListView { id: description horizontalAlignment: Qt.AlignLeft - text_value: am_i_sender ? qsTr("Sent") : qsTr("Received") + text_value: is_spam ? qsTr("Poison") : am_i_sender ? qsTr("Sent") : qsTr("Received") font.pixelSize: Style.textSizeSmall3 + color: is_spam ? Style.colorOrange : am_i_sender ? Dex.CurrentTheme.warningColor : Dex.CurrentTheme.okColor } } @@ -93,7 +99,7 @@ Dex.ListView } font.pixelSize: description.font.pixelSize - color: am_i_sender ? Dex.CurrentTheme.noColor : Dex.CurrentTheme.okColor + color: is_spam ? Style.colorWhite7 : am_i_sender ? Dex.CurrentTheme.warningColor : Dex.CurrentTheme.okColor privacy: true } @@ -104,8 +110,9 @@ Dex.ListView horizontalAlignment: Text.AlignRight text_value: General.formatFiat(!am_i_sender, amount_fiat, API.app.settings_pg.current_currency) font.pixelSize: description.font.pixelSize - color: crypto_amount.color + color: is_spam ? Style.colorWhite7 : crypto_amount.color privacy: true + } // Fee @@ -117,6 +124,7 @@ Dex.ListView current_ticker_infos.fee_ticker + " " + qsTr("fees")) font.pixelSize: description.font.pixelSize privacy: true + color: is_spam ? Style.colorWhite7 : crypto_amount.color } // Date @@ -127,6 +135,7 @@ Dex.ListView font.pixelSize: description.font.pixelSize text_value: !date || unconfirmed ? qsTr("Unconfirmed") : date privacy: true + color: is_spam ? Style.colorWhite7 : crypto_amount.color } } } diff --git a/atomic_defi_design/Dex/main.qml b/atomic_defi_design/Dex/main.qml index 546f406a79..81bea29475 100644 --- a/atomic_defi_design/Dex/main.qml +++ b/atomic_defi_design/Dex/main.qml @@ -158,6 +158,7 @@ DexWindow { width: _row.width height: 30 + clip: true Behavior on x { NumberAnimation @@ -354,10 +355,14 @@ DexWindow iconSize: 24 icon: { - if (Dex.CurrentTheme.getColorMode() === Dex.CurrentTheme.ColorMode.Light) - return Qaterial.Icons.moonWaningCrescent; - else if (Dex.CurrentTheme.getColorMode() === Dex.CurrentTheme.ColorMode.Dark) - return Qaterial.Icons.whiteBalanceSunny; + if (Dex.CurrentTheme.getColorMode() !== Dex.CurrentTheme.ColorMode.None) + { + if (Dex.CurrentTheme.getColorMode() === Dex.CurrentTheme.ColorMode.Light) + return Qaterial.Icons.moonWaningCrescent; + else if (Dex.CurrentTheme.getColorMode() === Dex.CurrentTheme.ColorMode.Dark) + return Qaterial.Icons.whiteBalanceSunny; + } + return Qaterial.Icons.moonWaningCrescent; } onClicked: { diff --git a/atomic_defi_design/assets/images/arrow-bottom-right.svg b/atomic_defi_design/assets/images/arrow-bottom-right.svg new file mode 100644 index 0000000000..c667cc0ea1 --- /dev/null +++ b/atomic_defi_design/assets/images/arrow-bottom-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/atomic_defi_design/assets/images/arrow-top-right.svg b/atomic_defi_design/assets/images/arrow-top-right.svg new file mode 100644 index 0000000000..2a4d5229e1 --- /dev/null +++ b/atomic_defi_design/assets/images/arrow-top-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/atomic_defi_design/assets/images/bank-plus.svg b/atomic_defi_design/assets/images/bank-plus.svg new file mode 100644 index 0000000000..a7f8e8dbbf --- /dev/null +++ b/atomic_defi_design/assets/images/bank-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/atomic_defi_design/assets/images/swap-horizontal.svg b/atomic_defi_design/assets/images/swap-horizontal.svg new file mode 100644 index 0000000000..6b4d56ecb7 --- /dev/null +++ b/atomic_defi_design/assets/images/swap-horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/atomic_defi_design/assets/images/warning.svg b/atomic_defi_design/assets/images/warning.svg new file mode 100644 index 0000000000..2bfc1aa8b6 --- /dev/null +++ b/atomic_defi_design/assets/images/warning.svg @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/atomic_defi_design/assets/languages/atomic_defi_de.ts b/atomic_defi_design/assets/languages/atomic_defi_de.ts index 06dad49822..dbf66353bb 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_de.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_de.ts @@ -4,53 +4,53 @@ AddAddressForm - + Use standard network address Standard-Netzwerkadresse verwenden - + Label Bezeichnung - + This key already exists. Dieser Schlüssel existiert bereits. - + Address Adresse - - + + Cancel Abbrechen - + Convert Umwandeln - + Edit Bearbeiten - + Add Hinzufügen - + You need to enable %1 before adding this kind of address. Sie müssen %1 aktivieren, bevor Sie diese Art von Adresse hinzufügen. - + Enable Aktivieren @@ -233,7 +233,7 @@ App - + Recover Funds Result Ergebnis der Rückerstattung der Geldmittel @@ -307,7 +307,7 @@ - + Price provider is: %1 Preisanbieter ist: %1 @@ -315,68 +315,73 @@ Bottom - + + Add Crypto + + + + Settings Einstellungen - + Support Support - + Privacy Datenschutz - + Disable Privacy? Datenschutz deaktivieren? - + Enter wallet password to confirm Geben Sie zur Bestätigung das Kennwort der Brieftasche ein - + Type password Kennwort eingeben - + Confirm Bestätigen - + Cancel Abbrechen - + Privacy status Status Datenschutz - + Privacy mode disabled successfully Der Datenschutzmodus wurde erfolgreich deaktiviert - - + + Ok Ok - + Wrong password! Falsches Kennwort! - + wallet password is incorrect Kennwort der Brieftasche ist falsch @@ -495,21 +500,34 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 - Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> - Mit dem Symbol ⓘ gekennzeichnete Marktdaten (Kurse, Charts etc.) stammen aus Drittquellen.<br><br>Die Daten stammen von <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> und <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle unterstützte Paare:</b><br>%1<br><br><b>Letzte Referenz (Band Oracle):</b><br><a href="%2">%2</a> + Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://coingecko.com">CoinGecko</a>. + Mit dem Symbol ⓘ gekennzeichnete Marktdaten (Kurse, Charts etc.) stammen aus Drittquellen.<br><br>Die Daten stammen von <a href="https://coingecko.com">CoinGecko</a>. Chart - + Loading market data Laden von Marktdaten - - There is no chart data for this pair yet - Für dieses Paar liegen noch keine Chartdaten vor + + There is no chart data for this pair + + + + + There is no chart data for %1 (testcoin) pairs + + + + + ClaimFaucetResultModal + + + Close + Schließen @@ -733,83 +751,83 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 ConfirmTradeModal - + Confirm Exchange Details Bestätigen Sie die Austausch-Details - + Trade price is more than 50% different to CEX! Confirm? Der Handelspreis unterscheidet sich um mehr als 50% vom CEX-Preis. Bestätigen? - + This swap request can not be undone and is a final event! Diese Tauschanfrage kann nicht rückgängig gemacht werden und ist ein endgültiges Ereignis! - + This transaction can take up to 60 mins - DO NOT close this application! Diese Transaktion kann bis zu 60 Minuten dauern - schließen Sie diese Anwendung NICHT! - + Loading fees... Lade Gebühren... - + <b>Total %1 fees:</b> <b>Gesamt %1 Gebühren:</b> - + Security configuration Sicherheitskonfiguration - + %1 confirmations for incoming %2 transactions %1 Bestätigungen für eingehende %2 Transaktionen - + Read more about dPoW Lesen Sie mehr über dPoW - + Use custom protection settings for incoming %1 transactions TICKER Benutzerdefinierte Schutzeinstellungen für eingehende %1 Transaktionen verwenden - + Enable Komodo dPoW security Komodo dPoW-Sicherheit aktivieren - + dPoW protected dPoW-gesichert - + Required Confirmations Erforderliche Bestätigungen - + Warning, this atomic swap is not dPoW protected! Achtung, dieser Atomic Swap ist nicht dPoW-geschützt! - + Cancel Abbrechen - + Confirm Bestätigen @@ -825,182 +843,182 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 Dashboard - + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. Die aktuelle Anzahl aktivierter Coins stimmt nicht mit Ihrer Konfigurationsvorgabe überein. Die Konfiguration der Assets wird zurückgesetzt. - + Matching Zusammenführung - + Order Matching Order wird zusammengeführt - + Matched Zusammengeführt - + Order Matched Order wurde zusammengeführt - + Ongoing Laufend - + Swap Ongoing Austausch läuft - + Successful Erfolgreich - + Swap Successful Tausch erfolgreich - + Refunding Rückzahlung - + Failed Fehlgeschlagen - + Swap Failed Tausch fehlgeschlagen - + Unknown Unbekannt - + Unknown State Unbekannter Status - + Started Gestartet - + Negotiated Ausgehandelt - + Taker fee sent Taker-Gebühr gesendet - + Maker payment received Maker-Zahlung erhalten - + Maker payment wait confirm started Warten auf die Zahlungsbestätigung des Makers gestartet - + Maker payment validated and confirmed Maker-Zahlung validiert und bestätigt - + Taker payment sent Taker-Zahlung gesendet - + Taker payment spent Taker-Zahlung ausgegeben - + Maker payment spent Maker-Zahlung ausgegeben - + Finished Fertig - + Start failed Start fehlgeschlagen - + Negotiate failed Verhandeln fehlgeschlagen - + Taker fee validate failed Validierung der Abnehmergebühr fehlgeschlagen - + Maker payment transaction failed Maker-Zahlungstransaktion fehlgeschlagen - + Maker payment Data send failed Fehler beim Senden der Maker-Zahlungsdaten - + Maker payment wait confirm failed Warten auf die Zahlungsbestätigung des Makers fehlgeschlagen - + Taker payment validate failed Validierung der Taker-Zahlung fehlgeschlagen - + Taker payment wait confirm failed Warten auf die Zahlungsbestätigung des Takers fehlgeschlagen - + Taker payment spend failed Zahlungsausgabe des Takers fehlgeschlagen - + Maker payment wait refund started Countdown für die Rückerstattung der Maker-Zahlung hat begonnen - + Maker payment refunded Maker-Zahlung zurückerstattet - + Maker payment refund failed Rückerstattung der Maker-Zahlung fehlgeschlagen @@ -1084,7 +1102,7 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 DexAppPasswordField - + Type password Kennwort eingeben @@ -1385,7 +1403,7 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 General - + %n day(s) %n Tag @@ -1393,7 +1411,7 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 - + %nd day @@ -1402,7 +1420,7 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 - + %nh hours @@ -1411,7 +1429,7 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 - + %nm minutes @@ -1420,7 +1438,7 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 - + %ns seconds @@ -1429,7 +1447,7 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 - + %nms milliseconds @@ -1438,92 +1456,117 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 - + - - - + <b>Taker tx fee:</b> <b>Taker tx Gebühren:</b> - + <b>Dex tx fee:</b> <b>Dex tx Gebühren:</b> - + <b>Dex fee:</b> <b>Dex Gebühren:</b> - + <b>Maker tx fee:</b> <b>Maker tx Gebühren:</b> - + + %1 balance is zero + + + + + Activating %1 (%2%) + + + + + Loading wallet... + + + + + Min: %1 + Minimum: %1 + + + + Enter an amount + Betrag eingeben + + + Trading Fee Handelsgebühr - + Minimum Trading Amount Mindesthandelsbetrag - + Wallet %1 already exists WALLETNAME Brieftasche %1 existiert bereits - + %1 balance is lower than the fees amount: %2 %3 Das %1 Guthaben ist niedriger als der Gebührenbetrag: %2 %3 - + Tradable (after fees) %1 balance is lower than minimum trade amount Handelbares %1 Guthaben (nach Gebühren) ist niedriger als der Mindesthandelsbetrag - + Please fill the price field Bitte füllen Sie das Preisfeld aus - + Please fill the volume field - - + + Please wait for %1 to fully activate - - + + %1 volume is lower than minimum trade amount %1 Volumen ist niedriger als der minimale Handelsbetrag - - + + %1 needs to be enabled in order to use %2 %1 muss aktiviert werden, um %2 verwenden zu können - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions Das %1 Guthaben muss finanziert werden, ein Guthaben größer Null ist erforderlich, um das Benzin von %2 Transaktionen zu bezahlen - + Unknown Error Unbekannter Fehler @@ -1589,89 +1632,94 @@ Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456Name der Brieftasche - + Enter seed Geben Sie den Seed ein - + Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue. Ihr Seed ist nicht BIP39-konform. Versuchen Sie es erneut oder wählen Sie "benutzerdefinierten Seed erlauben" um fortzufahren - - + + i understand Ich verstehe - - + + я согласен - - + + je comprends - - + + entiendo - - + + anladım - - + + ich verstehe - + Ok Ok - + Allow custom seed Benutzerdefinierten Seed zulassen - + <strong>Allow custom seed</strong> <strong>Benutzerdefinierten Seed zulassen</strong> - + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. Benutzerdefinierte Seed-Phrasen sind möglicherweise weniger sicher und leichter zu knacken als eine generierte BIP39-konforme Seed-Phrase oder ein privater Schlüssel (WIF).<br><br>Um zu bestätigen, dass Sie das Risiko verstehen und wissen, was Sie tun, geben Sie bitte <strong>'Ich verstehe'</strong> in das Feld unten ein. - + I understand Ich verstehe - + Next Weiter - + + Enter password + + + + Enter the same password to confirm Geben Sie zur Bestätigung dasselbe Kennwort ein - + Continue Fortsetzen @@ -1715,10 +1763,15 @@ Try again or select 'Allow custom seed' to continue. ListDelegate - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 ist nicht aktiviert - Möchten Sie es aktivieren, um die günstigsten Order von %2 auswählen zu können? <br><a href='#'>Ja</a> - <a href='#no'>Nein</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 @@ -1759,17 +1812,17 @@ Try again or select 'Allow custom seed' to continue. Login - + Incorrect Password Falsches Kennwort - + Log In Anmelden - + Cancel Abbrechen @@ -1812,181 +1865,152 @@ They will be removed from the orderbook until you log in again. Main - - Segwit - Segwit - - - - Confirmation - Bestätigung - - - - Do you want to send your %1 funds to %2 wallet first? - Möchten Sie Ihr %1-Guthaben zuerst an die %2-Brieftasche senden? - - - - Success - Erfolg - - - - Your transaction is send, may take some time to arrive - Ihre Transaktion wird gesendet, es kann einige Zeit dauern, bis sie ankommt - - - + Price Preis - + Change 24hr 24h Veränderung - - Porfolio - Portfolio - - - + Contract Address Vertragsadresse - + Send Senden - + Enable %1 ? %1 aktivieren? - + Yes Ja - + No Nein - + Receive Empfangen - + + Swap Tausch - + + Portfolio + Portfolio + + + is wallet only nur Brieftasche (kein DEX möglich) - + Rewards Belohnungen - + Faucet Faucet - - - + + + Public Key Öffentlicher Schlüssel - + Copied to Clipboard In die Zwischenablage kopiert - + Loading market data Laden von Marktdaten - + There is no chart data for this ticker yet Für diesen Ticker liegen noch keine Chartdaten vor - + Fetching transactions... Transaktionen werden abgerufen... - + Please wait, %1 is %2 - + % activated... - + No transactions available Keine Transaktionen verfügbar - + Click to view your address on %1 (%2) block explorer Klicken Sie hier, um Ihre Adresse im %1 (%2) Block-Explorer anzuzeigen - - Trade - Handeln - - - + Trading Information Handelsinformationen - + Chart Chart - - + + Orders Order - - + + History Historie - + Place Order Order platzieren - + Order Selected Order ausgewählt - + START SWAP TAUSCH STARTEN @@ -2040,13 +2064,13 @@ They will be removed from the orderbook until you log in again. MarketModeSelector - + Sell %1 TICKER %1 Verkaufen - + Buy %1 TICKER %1 Kaufen @@ -2099,17 +2123,17 @@ They will be removed from the orderbook until you log in again. NewContactPopup - + Contact name Kontaktname - + This contact name already exists. Dieser Kontaktname existiert bereits. - + + ADD + HINZUFÜGEN @@ -2226,67 +2250,72 @@ They will be removed from the orderbook until you log in again. Wählen sie ein Kennwort - + Important: Back up your seed phrase before proceeding! Wichtig: Sichern Sie Ihre Seed-Phrase, bevor Sie fortfahren! - + We recommend storing it offline. Wir empfehlen, sie offline zu speichern. - + Generated Seed Generierter Seed - + Seed phrase Seed Phrase - + copied to clipboard In die Zwischenablage kopiert - + Next Weiter - + Let's double check your seed phrase Lassen Sie uns Ihre Seed-Phrase noch einmal überprüfen - + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. Ihre Seed-Phrase ist wichtig – deshalb stellen wir gerne sicher, dass sie korrekt ist. Wir stellen Ihnen drei verschiedene Fragen zu Ihrer Seed-Phrase, um sicherzustellen, dass Sie Ihre Wallet jederzeit problemlos wiederherstellen können. - + Enter the Geben Sie das - + word Wort ein - + Check Prüfen - + + Enter password + + + + Enter the same password to confirm Geben Sie zur Bestätigung dasselbe Kennwort ein - + Continue Fortsetzen @@ -2401,6 +2430,11 @@ They will be removed from the orderbook until you log in again. Your wallet balance changed Ihr Guthaben hat sich geändert + + + Close + Schließen + %1 Enable status @@ -2420,49 +2454,49 @@ They will be removed from the orderbook until you log in again. - + Failed to disable %1 TICKER - + Endpoint not reachable Endpunkt nicht erreichbar - + Could not reach to endpoint Endpunkt konnte nicht erreicht werden - + Show Zeigen - + Restart Neustart - + Quit Beenden - + Notifications Benachrichtigungen - + There aren't any notifications Es gibt keine Benachrichtigungen - + Mark all as read Alle als gelesen makieren @@ -2470,97 +2504,92 @@ They will be removed from the orderbook until you log in again. OrderForm - + Price Preis - + Reduce 1% relative to CEX market price. - + Use CEX market price. - + Increase 1% relative to CEX market price. - - Volume - Volumen - - - - Amount to sell - Zu verkaufender Betrag + + Send + Senden - - Amount to receive - Zu erhaltender Betrag + + Receive + Empfangen - + Max Max - + Swap 25% of your tradable balance. - + Swap 50% of your tradable balance. - + Swap 100% of your tradable balance. - + Min Volume - + Min amount to sell - + Min amount to receive - + Minimum accepted trade equals 10% of order volume. - + Minimum accepted trade equals 25% of order volume. - + Minimum accepted trade equals 50% of order volume. - + Min volume: Mindestvolumen: - + Use custom minimum trade amount Benutzerdefinierten Mindesthandelsbetrag verwenden @@ -2584,114 +2613,104 @@ They will be removed from the orderbook until you log in again. OrderModal - - Swap Details - Tauschdetails - - - - Order Details - Orderdetails - - - + Order Type Orderart - + Maker Order Maker-Order - + Taker Order Taker-Order - + Refund State Rückerstattungsstatus - + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back Ihr Umtausch ist fehlgeschlagen, aber der automatische Rückerstattungsprozess für Ihre Zahlung hat bereits begonnen. Bitte warten Sie und lassen Sie die Anwendung geöffnet, bis Sie Ihre Zahlung zurückerhalten - + Date Datum - + Error ID Fehler-ID - - + + Error Log Fehlerprotokoll - + Close Schließen - + Cancel Order Order Abbrechen - - + + Swap ID Swap ID - + Maker Payment Sent Transaction ID Maker-Zahlung gesendet: Transaktions-ID - + Maker Payment Spent Transaction ID Maker-Zahlung ausgegeben: Transaktions-ID - + Maker Payment TXID Maker-Zahlung: TXID - + Taker Payment Spent Transaction ID Taker-Zahlung ausgegeben: Transaktions-ID - + Taker Payment Sent Transaction ID Taker-Zahlung gesendet: Transaktions-ID - + Taker Payment TXID Taker-Zahlung: TXID - + Recover Funds Rückerstattung der Geldmittel - + Refunding... Rückzahlung… - + View on Explorer Ansicht im Explorer @@ -2720,42 +2739,42 @@ Bitte wählen Sie eine neue Order aus. OrdersPage - + Filter Filter - + Date Datum - + Export CSV CSV exportieren - + Apply Filter Filter anwenden - + Cancel All Alles stornieren - + From Von - + To Bis - + Please choose the CSV export name and location Bitte wählen Sie den CSV-Exportnamen und den Speicherort aus @@ -2828,8 +2847,8 @@ Bitte wählen Sie eine neue Order aus. Portfolio - ADD ASSET - ASSET HINZUFÜGEN + ADD CRYPTO + @@ -2837,12 +2856,12 @@ Bitte wählen Sie eine neue Order aus. Asset suchen - + Show only coins with balance Nur Coins mit Guthaben anzeigen - + (%1/%2) (%1/%2) @@ -2928,12 +2947,12 @@ Bitte wählen Sie eine neue Order aus. ProView - + Failed to place the order Die Order konnte nicht platziert werden - + Placed the order Order platziert @@ -2981,7 +3000,7 @@ Bitte wählen Sie eine neue Order aus. RecoverSeedModal - + View seed and private keys Seed- und privaten Schlüsseln anzeigen @@ -2991,64 +3010,64 @@ Bitte wählen Sie eine neue Order aus. Bitte geben Sie Ihr Kennwort ein, um den Seed anzuzeigen. - + Seed Seed - + Backup Seed Seed Sicherung - + Public Address copied to clipboard Öffentliche Adresse in die Zwischenablage kopiert - + Cancel Abbrechen - + Incorrect Password Falsches Kennwort - + View Ansehen - - + + copied to clipboard In die Zwischenablage kopiert - - + + RPC Password RPC Kennwort - + Search a coin. Coin suchen. - + Public Address Öffentliche Adresse - + Private Key copied to clipboard Privater Schlüssel in die Zwischenablage kopiert - + Private Key Privater Schlüssel @@ -3074,17 +3093,17 @@ Bitte wählen Sie eine neue Order aus. RestartModal - + Applying the changes... Übernehmen der Änderungen... - + Restarting the application. %1 Neustart der Anwendung. %1 - + Restarting the application... Neustart der Anwendung... @@ -3118,162 +3137,172 @@ Bitte wählen Sie eine neue Order aus. SendModal - + Failed to send Fehler beim Senden - + Prepare to send Versandvorbereitung von - + Address of the recipient Adresse des Empfängers - + Amount to send Zu sendender Betrag - + Gas price Gas Preis - + Cancel Abbrechen - + Recipient's address Empfängeradresse - + The address has to be mixed case. Die Adresse muss Groß-/Kleinschreibung sein. - + Failed to Broadcast - + Fix Korrigieren - + MAX MAX - + Fiat amount: Unavailable Fiat-Betrag: Nicht verfügbar - + Fiat amount: %1 Fiat-Betrag: %1 - + %1 amount: %2 %1 Betrag: %2 - + Specify in Fiat In Fiat angeben - + Specify in Crypto In Krypto angeben - + + Enter memo + + + + Enable Custom Fees Benutzerdefinierte Gebühren - + Enter the custom fee Geben Sie die benutzerdefinierte Gebühr ein - + Gas Limit Gas Limit - + Custom Fee can't be higher than the amount Die benutzerdefinierten Gebühren dürfen nicht höher sein als der Betrag - + Not enough funds. Nicht genug Geldmittel. - - + + You have %1 AMT TICKER Sie haben %1 - - + + Only use custom fees if you know what you are doing! - + Prepare Vorbereiten - - + + Send Senden - + %1 address TICKER - + copied to clipboard. In die Zwischenablage kopiert - + Amount Menge - + + Memo + + + + Fees Gebühren - + Date Datum - + Back Zurück @@ -3359,11 +3388,16 @@ Bitte wählen Sie eine neue Order aus. + Memo + + + + Fees Gebühren - + Date Datum @@ -3373,12 +3407,12 @@ Bitte wählen Sie eine neue Order aus. Transaktions-Hash - + Close Schließen - + View on Explorer Ansicht im Explorer @@ -3386,8 +3420,8 @@ Bitte wählen Sie eine neue Order aus. SettingModal - - + + Cancel Abbrechen @@ -3417,98 +3451,103 @@ Bitte wählen Sie eine neue Order aus. Sicherheit - + Enable Desktop Notifications Desktop-Benachrichtigungen aktivieren - + + Hide Poison Transactions in History + + + + Maximum number of enabled coins Maximale Anzahl aktivierter Coins - + Logs Protokolle - + Open Folder Ordner öffnen - + Reset Zurücksetzen - + Current Font Aktuelle Schriftart - + Current font changed to %1. Aktuelle Schriftart in %1 geändert. - + Theme Thema - + Changing theme to %1 Design zu %1 geändert - + Disable 2FA? 2FA deaktivieren? - + Enter your wallet password to confirm Geben Sie zur Bestätigung das Kennwort ihrer Brieftasche ein - + Type password Kennwort eingeben - + 2FA status 2FA Status - + 2FA disabled successfully 2FA erfolgreich deaktiviert - - + + Ok Ok - + Wrong password! Falsches Kennwort! - + Wallet password is incorrect Kennwort der Brieftasche ist falsch - + Application Version Anwendungsversion - + copied to clipboard In die Zwischenablage kopiert @@ -3518,95 +3557,95 @@ Bitte wählen Sie eine neue Order aus. Über & Version - - + + Reset wallet configuration Konfiguration der Brieftasche zurücksetzen - + This will restart your wallet with default settings Dadurch wird Ihre Brieftasche mit den Standardeinstellungen neu gestartet - - + + Confirm Bestätigen - + Ask system's password before sending coins ? (2FA) Vor dem Senden von Coins nach dem Kennwort des Systems fragen? (2FA) - + View seed and private keys Seed- und privaten Schlüsseln anzeigen - - + + Show Zeigen - + Setup Camouflage Password Tarnkennwort einrichten - + Open Öffnen - + Disclaimer and ToS Haftungsausschluss und Nutzungsbedingungen - + Application version Anwendungsversion - + MM2 version MM2 Version - + MM2 Version MM2 Version - + MM2 Version copied to clipboard. MM2 Version in die Zwischenablage kopiert. - + Qt version Qt Version - + Qt Version Qt Version - + Qt Version copied to clipboard. Qt Version in die Zwischenablage kopiert. - + Search Update Update suchen - + Logout Abmelden @@ -3614,27 +3653,14 @@ Bitte wählen Sie eine neue Order aus. Sidebar - + Search Suchen - Add asset - Asset hinzufügen - - - - SmartChartView - - - Loading market data - Laden von Marktdaten - - - - There is no chart data for this ticker yet - Für diesen Ticker liegen noch keine Chartdaten vor + ADD CRYPTO + @@ -3665,10 +3691,15 @@ Bitte wählen Sie eine neue Order aus. CEX-Kurs - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 ist nicht aktiviert - Möchten Sie es aktivieren, um die günstigsten Order von %2 auswählen zu können? <br><a href='#'>Ja</a> - <a href='#no'>Nein</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + SubCoinSelector @@ -3765,7 +3796,7 @@ Bitte wählen Sie eine neue Order aus. SubOrders - + Orders Order @@ -3810,12 +3841,12 @@ Bitte wählen Sie eine neue Order aus. Abbrechen - + Apply filter Filter anwenden - + No results found Keine Ergebnisse gefunden @@ -3910,62 +3941,78 @@ Network fees can vary greatly depending on your selected trading pair. Die Netzwerkgebühren können je nach ausgewähltem Handelspaar stark variieren. - + + I see a transaction in my wallet that was marked as 'poison'. What does this mean? + + + + + Address poisoning is a relatively new tye of phishing attack, where a malicious actor aims to trick you into sending funds to an address that you did not intend to send funds to. + +This is often done by sending a zero value transaction to your wallet from an address which looks very similar to your actual address, with the exact same letters at the start and end. This transaction will then appear in your transaction history, with the scammer hoping you will mistake the fake address for your own and send funds to it. + +To protect you from this, %1 will mark any transaction that it detects as potentially being a poison transaction with a "poison" label. You should always be careful to confirm any address you send funds to is correct. + +There is a toggle in settings where you can turn on/off the display of these transactions. + + + + Do you provide user support? Bieten Sie Benutzerunterstützung an? - + Yes! %1 offers support through the <a href="%2">%1 Discord server</a>. The team and the community are always happy to help! Ja! %1 bietet Support über den <a href="%2">%1 Discord server</a>. Das Team und die Community helfen Euch gerne weiter! - + Who is behind %1? Wer steckt hinter %1? - + %1 is developed by the Komodo team. Komodo is one of the most established blockchain projects working on innovative solutions like atomic swaps, Delayed Proof of Work, and an interoperable multi-chain architecture. %1 wird vom Komodo-Team entwickelt. Komodo ist eines der etabliertesten Blockchain-Projekte, das an innovativen Lösungen wie Atomic Swaps, Delayed Proof of Work und einer interoperablen Multi-Chain-Architektur arbeitet. - + Is it possible to develop my own white-label exchange on %1? Ist es möglich, meine eigene White-Label-Börse auf %1 zu entwickeln? - + Absolutely! You can read our developer documentation for more details or contact us with your partnership inquiries. Have a specific technical question? The %1 developer community is always ready to help! Auf jeden Fall! Sie können unsere Entwicklerdokumentation für weitere Details lesen oder uns mit Ihren Partnerschaftsanfragen kontaktieren. Haben Sie eine spezielle technische Frage? Die %1-Entwicklercommunity ist immer bereit zu helfen! - + Which devices can I use %1 on? Auf welchen Geräten kann ich %1 verwenden? - + %1 is available for mobile on both <a href="%2">Android and iPhone, and for desktop on Windows, Mac, and Linux</a> operating systems. %1 ist auf Mobilgeräte für <a href="%2">Android und iPhone sowie auf dem Desktop für Windows, Mac und Linux</a> Betriebssystemen erhältlich. - + Compliance Info Compliance-Informationen - + Due to regulatory and legal circumstances the citizens of certain jurisdictions including, but not limited to, the United States of America, Canada, Hong Kong, Israel, Singapore, Sudan, Austria, Iran and any other state, country or other jurisdiction that is embargoed by the United States of America or the European Union are not allowed to use this application. Aufgrund regulatorischer und rechtlicher Umstände sind die Bürger bestimmter Gerichtsbarkeiten, einschließlich, aber nicht beschränkt auf, der Vereinigten Staaten von Amerika, Kanada, Hongkong, Israel, Singapur, Sudan, Österreich, Iran und alle anderen Staaten, Länder oder anderen Gerichtsbarkeiten, die mit einem Embargo von den Vereinigten Staaten von Amerika oder der Europäischen Union belegt sind, dürfen diese Anwendung nicht verwenden. - + Changelog Änderungsprotokoll - + Open Logs Folder Protokollordner öffnen @@ -4035,157 +4082,138 @@ Die Netzwerkgebühren können je nach ausgewähltem Handelspaar stark variieren. Klicken Sie hier, um die Details anzuzeigen + + TotalView + + + Receive %1 + + + + + Send %1 + + + Trade - + Swap Tauschen - + Instant trading with best orders Sofortiger Handel mit den besten Order - + Reset form Formular zurücksetzen - + You have no tradable assets Keine handelbaren Assets vorhanden - + From Von - - Enter an amount - Betrag eingeben + + Entered amount must be higher than 0. + + + + + Select an order. + - + MAX MAX - + To Nach - + Pick an order Order auswählen - + Price Preis - + Better price found: %1. Updating forms. Besseren Preis gefunden: %1. Formulare aktualisieren. - + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. Besseren Preis (%1) gefunden, aber erhaltene Menge (%2) ist niedriger als Ihre aktuelle (%3). Klicken Sie hier, um den ausgewählte Order zu aktualisieren. - + %1 %1 - - Tradable: - Handelbar: - - - - Min: %1 - Minimum: %1 + + Balance: + - + Pick a coin Wählen Sie einen Coin - + SWAP NOW JETZT TAUSCHEN - + Failed to place the order Die Order konnte nicht platziert werden - + Placed the order Order platziert - - Entered amount must be superior than 0. - Der eingegebene Betrag muss größer als 0 sein. - - - - You must select an order. - Sie müssen eine Order auswählen. - - - - Entered amount is below the minimum required by this order: %1 - Der eingegebene Betrag liegt unter dem für diese Order erforderlichen Mindestbetrag: %1 - - - - - %1 needs to be enabled in order to use %2 - %1 muss aktiviert werden, um %2 verwenden zu können - - - - - %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - Das %1 Guthaben muss finanziert werden, ein Guthaben größer Null ist erforderlich, um das Benzin von %2 Transaktionen zu bezahlen - - - - %1 balance does not have enough funds to pay the gas of %2 transactions - Das Guthaben von %1 reicht nicht aus, um das Gas von %2 Transaktionen zu bezahlen - - - + No buy orders found for %1. Keine Kauforder für %1 gefunden. - + You can check later or try to sell a different coin. Sie können später nachsehen oder versuchen, einen anderen Coin zu verkaufen. - + Calculating fee estimate... Geschätzten Gebühren werden berechnet... - + Total %1 fees: %1 Gesamtgebühren: - + %2 (%3) %2 (%3) @@ -4228,91 +4256,114 @@ Die Netzwerkgebühren können je nach ausgewähltem Handelspaar stark variieren. Order platzieren + + TradingViewChart + + + Loading market data + Laden von Marktdaten + + + + There is no chart data for this ticker yet + Für diesen Ticker liegen noch keine Chartdaten vor + + TransactionDetailsModal - + Transaction Details Transaktionsdetails - + Amount Menge - + Fees Gebühren - + Date Datum - + Unconfirmed Unbestätigt - + Transaction Hash Transaktions-Hash - + Confirmations Bestätigungen - + Block Height Blockhöhe - + From Von - + + This transaction has been identified as a potential address poisoning attack. + + + + + Please see the Support FAQ for more information. + + + + %1 txid TICKER - + copied to clipboard. In die Zwischenablage kopiert - + From address Von Adresse - + To Nach - + To address Nach Adresse - + Notes Anmerkungen - + Close Schließen - + View on Explorer Ansicht im Explorer @@ -4320,22 +4371,27 @@ Die Netzwerkgebühren können je nach ausgewähltem Handelspaar stark variieren. Transactions - + Sent Gesendet - + Received Erhalten - + + Poison + + + + fees Gebühren - + Unconfirmed Unbestätigt @@ -4469,7 +4525,7 @@ This might take a few minutes... atomic_dex::settings_page - + An error has occurred. @@ -4492,47 +4548,47 @@ This might take a few minutes... Sie benötigen %1, um das Benzin für %2 Transaktionen zu bezahlen. - + Checksum verification failed for %1. Überprüfung der Prüfsumme für %1 fehlgeschlagen. - + Invalid checksum for %1. Click the button to convert to mixed case address. Ungültige Prüfsumme für %1. Klicken Sie auf die Schaltfläche, um die Adresse in Groß-/Kleinschreibung umzuwandeln. - + Legacy address used for %1. Click the button to convert to a Cashaddress. Legacy-Adresse für %1 verwendet. Klicken Sie auf die Schaltfläche, um sie in eine Cashadresse umzuwandeln. - + %1 address must be prefixed with 0x %1 Adresse muss 0x vorangestellt werden - + %1 address length is invalid, please use a valid address. Länge der %1 Adresse ist ungültig, bitte verwenden Sie eine gültige Adresse. - + %1 address is invalid. %1 Adresse ist ungültig. - + Invalid checksum. Ungültige Prüfsumme. - + %1 address has invalid prefixes. %1 Adresse hat ungültige Vorsilben. - + Backend error: %1 Backend Fehler: %1 @@ -4545,7 +4601,7 @@ This might take a few minutes... Abmelden - + Balance Balance diff --git a/atomic_defi_design/assets/languages/atomic_defi_en.ts b/atomic_defi_design/assets/languages/atomic_defi_en.ts index 574da37ff9..07a60d72c5 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_en.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_en.ts @@ -4,53 +4,53 @@ AddAddressForm - + Use standard network address - + Label - + This key already exists. - + Address - - + + Cancel Cancel - + Convert - + Edit - + Add - + You need to enable %1 before adding this kind of address. - + Enable @@ -233,7 +233,7 @@ App - + Recover Funds Result @@ -307,7 +307,7 @@ - + Price provider is: %1 @@ -315,68 +315,73 @@ Bottom - + + Add Crypto + + + + Settings - + Support - + Privacy - + Disable Privacy? - + Enter wallet password to confirm - + Type password - + Confirm - + Cancel Cancel - + Privacy status - + Privacy mode disabled successfully - - + + Ok - + Wrong password! - + wallet password is incorrect @@ -494,20 +499,33 @@ - Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> + Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://coingecko.com">CoinGecko</a>. Chart - + Loading market data - - There is no chart data for this pair yet + + There is no chart data for this pair + + + + + There is no chart data for %1 (testcoin) pairs + + + + + ClaimFaucetResultModal + + + Close @@ -732,83 +750,83 @@ ConfirmTradeModal - + Confirm Exchange Details - + Trade price is more than 50% different to CEX! Confirm? - + This swap request can not be undone and is a final event! - + This transaction can take up to 60 mins - DO NOT close this application! - + Loading fees... - + <b>Total %1 fees:</b> - + Security configuration - + %1 confirmations for incoming %2 transactions - + Read more about dPoW - + Use custom protection settings for incoming %1 transactions TICKER - + Enable Komodo dPoW security - + dPoW protected - + Required Confirmations - + Warning, this atomic swap is not dPoW protected! - + Cancel Cancel - + Confirm @@ -824,182 +842,182 @@ Dashboard - + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. - + Matching - + Order Matching - + Matched - + Order Matched - + Ongoing - + Swap Ongoing - + Successful - + Swap Successful - + Refunding - + Failed - + Swap Failed - + Unknown - + Unknown State - + Started - + Negotiated - + Taker fee sent - + Maker payment received - + Maker payment wait confirm started - + Maker payment validated and confirmed - + Taker payment sent - + Taker payment spent - + Maker payment spent - + Finished - + Start failed - + Negotiate failed - + Taker fee validate failed - + Maker payment transaction failed - + Maker payment Data send failed - + Maker payment wait confirm failed - + Taker payment validate failed - + Taker payment wait confirm failed - + Taker payment spend failed - + Maker payment wait refund started - + Maker payment refunded - + Maker payment refund failed @@ -1083,7 +1101,7 @@ DexAppPasswordField - + Type password @@ -1384,7 +1402,7 @@ General - + %n day(s) @@ -1392,7 +1410,7 @@ - + %nd day @@ -1401,7 +1419,7 @@ - + %nh hours @@ -1410,7 +1428,7 @@ - + %nm minutes @@ -1419,7 +1437,7 @@ - + %ns seconds @@ -1428,7 +1446,7 @@ - + %nms milliseconds @@ -1437,92 +1455,117 @@ - + - - + <b>Taker tx fee:</b> - + <b>Dex tx fee:</b> - + <b>Dex fee:</b> - + <b>Maker tx fee:</b> - + + %1 balance is zero + + + + + Activating %1 (%2%) + + + + + Loading wallet... + + + + + Min: %1 + + + + + Enter an amount + + + + Trading Fee - + Minimum Trading Amount - + Wallet %1 already exists WALLETNAME - + %1 balance is lower than the fees amount: %2 %3 - + Tradable (after fees) %1 balance is lower than minimum trade amount - + Please fill the price field - + Please fill the volume field - - + + Please wait for %1 to fully activate - - + + %1 volume is lower than minimum trade amount - - + + %1 needs to be enabled in order to use %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - + Unknown Error @@ -1588,89 +1631,94 @@ - + Enter seed - + Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue. - - + + i understand - - + + я согласен - - + + je comprends - - + + entiendo - - + + anladım - - + + ich verstehe - + Ok - + Allow custom seed - + <strong>Allow custom seed</strong> - + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. - + I understand - + Next - + + Enter password + + + + Enter the same password to confirm - + Continue @@ -1714,10 +1762,15 @@ Try again or select 'Allow custom seed' to continue. ListDelegate - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 @@ -1758,17 +1811,17 @@ Try again or select 'Allow custom seed' to continue. Login - + Incorrect Password - + Log In - + Cancel Cancel @@ -1811,181 +1864,152 @@ They will be removed from the orderbook until you log in again. Main - - Segwit - - - - - Confirmation - - - - - Do you want to send your %1 funds to %2 wallet first? - - - - - Success - - - - - Your transaction is send, may take some time to arrive - - - - + Price - + Change 24hr - - Porfolio - - - - + Contract Address - + Send - + Enable %1 ? - + Yes Yes - + No - + Receive - + + Swap - + + Portfolio + + + + is wallet only - + Rewards - + Faucet - - - + + + Public Key - + Copied to Clipboard - + Loading market data - + There is no chart data for this ticker yet - + Fetching transactions... - + Please wait, %1 is %2 - + % activated... - + No transactions available - + Click to view your address on %1 (%2) block explorer - - Trade - - - - + Trading Information - + Chart - - + + Orders - - + + History - + Place Order - + Order Selected - + START SWAP @@ -2039,13 +2063,13 @@ They will be removed from the orderbook until you log in again. MarketModeSelector - + Sell %1 TICKER - + Buy %1 TICKER @@ -2098,17 +2122,17 @@ They will be removed from the orderbook until you log in again. NewContactPopup - + Contact name - + This contact name already exists. - + + ADD @@ -2225,67 +2249,72 @@ They will be removed from the orderbook until you log in again. - + Important: Back up your seed phrase before proceeding! - + We recommend storing it offline. - + Generated Seed - + Seed phrase - + copied to clipboard - + Next - + Let's double check your seed phrase - + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. - + Enter the - + word - + Check - + + Enter password + + + + Enter the same password to confirm - + Continue @@ -2400,6 +2429,11 @@ They will be removed from the orderbook until you log in again. Your wallet balance changed + + + Close + + %1 Enable status @@ -2419,49 +2453,49 @@ They will be removed from the orderbook until you log in again. - + Failed to disable %1 TICKER - + Endpoint not reachable - + Could not reach to endpoint - + Show - + Restart - + Quit - + Notifications - + There aren't any notifications - + Mark all as read @@ -2469,97 +2503,92 @@ They will be removed from the orderbook until you log in again. OrderForm - + Price - + Reduce 1% relative to CEX market price. - + Use CEX market price. - + Increase 1% relative to CEX market price. - - Volume - - - - - Amount to sell + + Send - - Amount to receive + + Receive - + Max - + Swap 25% of your tradable balance. - + Swap 50% of your tradable balance. - + Swap 100% of your tradable balance. - + Min Volume - + Min amount to sell - + Min amount to receive - + Minimum accepted trade equals 10% of order volume. - + Minimum accepted trade equals 25% of order volume. - + Minimum accepted trade equals 50% of order volume. - + Min volume: - + Use custom minimum trade amount @@ -2583,114 +2612,104 @@ They will be removed from the orderbook until you log in again. OrderModal - - Swap Details - - - - - Order Details - - - - + Order Type - + Maker Order - + Taker Order - + Refund State - + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back - + Date - + Error ID - - + + Error Log - + Close - + Cancel Order - - + + Swap ID - + Maker Payment Sent Transaction ID - + Maker Payment Spent Transaction ID - + Maker Payment TXID - + Taker Payment Spent Transaction ID - + Taker Payment Sent Transaction ID - + Taker Payment TXID - + Recover Funds - + Refunding... - + View on Explorer @@ -2718,42 +2737,42 @@ Please select a new order. OrdersPage - + Filter - + Date - + Export CSV - + Apply Filter - + Cancel All - + From - + To - + Please choose the CSV export name and location @@ -2826,7 +2845,7 @@ Please select a new order. Portfolio - ADD ASSET + ADD CRYPTO @@ -2835,12 +2854,12 @@ Please select a new order. - + Show only coins with balance - + (%1/%2) @@ -2926,12 +2945,12 @@ Please select a new order. ProView - + Failed to place the order - + Placed the order @@ -2979,7 +2998,7 @@ Please select a new order. RecoverSeedModal - + View seed and private keys @@ -2989,64 +3008,64 @@ Please select a new order. - + Seed - + Backup Seed - + Public Address copied to clipboard - + Cancel Cancel - + Incorrect Password - + View - - + + copied to clipboard - - + + RPC Password - + Search a coin. - + Public Address - + Private Key copied to clipboard - + Private Key @@ -3072,17 +3091,17 @@ Please select a new order. RestartModal - + Applying the changes... - + Restarting the application. %1 - + Restarting the application... @@ -3116,162 +3135,172 @@ Please select a new order. SendModal - + Failed to send - + Prepare to send - + Address of the recipient - + Amount to send - + Gas price - + Cancel Cancel - + Recipient's address - + The address has to be mixed case. - + Failed to Broadcast - + Fix - + MAX - + Fiat amount: Unavailable - + Fiat amount: %1 - + %1 amount: %2 - + Specify in Fiat - + Specify in Crypto - + + Enter memo + + + + Enable Custom Fees - + Enter the custom fee - + Gas Limit - + Custom Fee can't be higher than the amount - + Not enough funds. - - + + You have %1 AMT TICKER - - + + Only use custom fees if you know what you are doing! - + Prepare - - + + Send - + %1 address TICKER - + copied to clipboard. - + Amount - + + Memo + + + + Fees - + Date - + Back @@ -3357,11 +3386,16 @@ Please select a new order. + Memo + + + + Fees - + Date @@ -3371,12 +3405,12 @@ Please select a new order. - + Close - + View on Explorer @@ -3384,8 +3418,8 @@ Please select a new order. SettingModal - - + + Cancel Cancel @@ -3415,57 +3449,57 @@ Please select a new order. - + Enable Desktop Notifications - + Maximum number of enabled coins - + Logs - + Open Folder - + Reset - + Current Font - + Current font changed to %1. - + Theme - + Changing theme to %1 - + Application Version - + copied to clipboard @@ -3475,136 +3509,141 @@ Please select a new order. - - + + Hide Poison Transactions in History + + + + + Reset wallet configuration - + This will restart your wallet with default settings - - + + Confirm - + Ask system's password before sending coins ? (2FA) - + Disable 2FA? - + Enter your wallet password to confirm - + Type password - + 2FA status - + 2FA disabled successfully - - + + Ok - + Wrong password! - + Wallet password is incorrect - + View seed and private keys - - + + Show - + Setup Camouflage Password - + Open - + Disclaimer and ToS - + Application version - + MM2 version - + MM2 Version - + MM2 Version copied to clipboard. - + Qt version - + Qt Version - + Qt Version copied to clipboard. - + Search Update - + Logout @@ -3612,26 +3651,13 @@ Please select a new order. Sidebar - + Search - Add asset - - - - - SmartChartView - - - Loading market data - - - - - There is no chart data for this ticker yet + ADD CRYPTO @@ -3663,10 +3689,15 @@ Please select a new order. - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + SubCoinSelector @@ -3763,7 +3794,7 @@ Please select a new order. SubOrders - + Orders @@ -3808,12 +3839,12 @@ Please select a new order. Cancel - + Apply filter - + No results found @@ -3892,62 +3923,78 @@ Network fees can vary greatly depending on your selected trading pair. - + + I see a transaction in my wallet that was marked as 'poison'. What does this mean? + + + + + Address poisoning is a relatively new tye of phishing attack, where a malicious actor aims to trick you into sending funds to an address that you did not intend to send funds to. + +This is often done by sending a zero value transaction to your wallet from an address which looks very similar to your actual address, with the exact same letters at the start and end. This transaction will then appear in your transaction history, with the scammer hoping you will mistake the fake address for your own and send funds to it. + +To protect you from this, %1 will mark any transaction that it detects as potentially being a poison transaction with a "poison" label. You should always be careful to confirm any address you send funds to is correct. + +There is a toggle in settings where you can turn on/off the display of these transactions. + + + + Do you provide user support? - + Yes! %1 offers support through the <a href="%2">%1 Discord server</a>. The team and the community are always happy to help! - + Who is behind %1? - + %1 is developed by the Komodo team. Komodo is one of the most established blockchain projects working on innovative solutions like atomic swaps, Delayed Proof of Work, and an interoperable multi-chain architecture. - + Is it possible to develop my own white-label exchange on %1? - + Absolutely! You can read our developer documentation for more details or contact us with your partnership inquiries. Have a specific technical question? The %1 developer community is always ready to help! - + Which devices can I use %1 on? - + %1 is available for mobile on both <a href="%2">Android and iPhone, and for desktop on Windows, Mac, and Linux</a> operating systems. - + Compliance Info - + Due to regulatory and legal circumstances the citizens of certain jurisdictions including, but not limited to, the United States of America, Canada, Hong Kong, Israel, Singapore, Sudan, Austria, Iran and any other state, country or other jurisdiction that is embargoed by the United States of America or the European Union are not allowed to use this application. - + Changelog - + Open Logs Folder @@ -4017,157 +4064,138 @@ Network fees can vary greatly depending on your selected trading pair. + + TotalView + + + Receive %1 + + + + + Send %1 + + + Trade - + Swap - + Instant trading with best orders - + Reset form - + You have no tradable assets - + From - - Enter an amount + + Entered amount must be higher than 0. + + + + + Select an order. - + MAX - + To - + Pick an order - + Price - + Better price found: %1. Updating forms. - + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. - + %1 - - Tradable: + + Balance: - - Min: %1 - - - - + Pick a coin - + SWAP NOW - + Failed to place the order - + Placed the order - - Entered amount must be superior than 0. - - - - - You must select an order. - - - - - Entered amount is below the minimum required by this order: %1 - - - - - - %1 needs to be enabled in order to use %2 - - - - - - %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - - - - - %1 balance does not have enough funds to pay the gas of %2 transactions - - - - + No buy orders found for %1. - + You can check later or try to sell a different coin. - + Calculating fee estimate... - + Total %1 fees: - + %2 (%3) @@ -4210,91 +4238,114 @@ Network fees can vary greatly depending on your selected trading pair. + + TradingViewChart + + + Loading market data + + + + + There is no chart data for this ticker yet + + + TransactionDetailsModal - + Transaction Details - + + This transaction has been identified as a potential address poisoning attack. + + + + + Please see the Support FAQ for more information. + + + + %1 txid TICKER - + copied to clipboard. - + Amount - + Fees - + From address - + To address - + Date - + Unconfirmed - + Transaction Hash - + Confirmations - + Block Height - + From - + To - + Notes - + Close - + View on Explorer @@ -4302,22 +4353,27 @@ Network fees can vary greatly depending on your selected trading pair. Transactions - + Sent - + Received - + + Poison + + + + fees - + Unconfirmed @@ -4451,7 +4507,7 @@ This might take a few minutes... atomic_dex::settings_page - + An error has occurred. @@ -4474,47 +4530,47 @@ This might take a few minutes... - + Checksum verification failed for %1. - + Invalid checksum for %1. Click the button to convert to mixed case address. - + Legacy address used for %1. Click the button to convert to a Cashaddress. - + %1 address must be prefixed with 0x - + %1 address length is invalid, please use a valid address. - + %1 address is invalid. - + Invalid checksum. - + %1 address has invalid prefixes. - + Backend error: %1 @@ -4527,7 +4583,7 @@ This might take a few minutes... - + Balance diff --git a/atomic_defi_design/assets/languages/atomic_defi_es.ts b/atomic_defi_design/assets/languages/atomic_defi_es.ts index c2b1055f75..f221b0af03 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_es.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_es.ts @@ -4,53 +4,53 @@ AddAddressForm - + Use standard network address Utilice la dirección de red - + Label Etiqueta - + This key already exists. Esta clave ya existe. - + Address Dirección - - + + Cancel Cancelar - + Convert Convertir - + Edit Editar - + Add Agregar - + You need to enable %1 before adding this kind of address. Debe habilitar %1 antes de agregar este tipo de dirección. - + Enable Habilitar @@ -233,7 +233,7 @@ App - + Recover Funds Result Resultados de Recuperar Fondos @@ -307,7 +307,7 @@ Activando: - + Price provider is: %1 El proveedor de precios es: %1 @@ -315,68 +315,73 @@ Bottom - + + Add Crypto + + + + Settings Configuración - + Support Soporte - + Privacy Privacidad - + Disable Privacy? ¿Deshabilitar privacidad? - + Enter wallet password to confirm Ingrese la contraseña de la billetera para confirmar - + Type password Escriba la contraseña - + Confirm Confirmar - + Cancel Cancelar - + Privacy status Estado de privacidad - + Privacy mode disabled successfully Modo de privacidad deshabilitado correctamente - - + + Ok Ok - + Wrong password! ¡Contraseña incorrecta! - + wallet password is incorrect la contraseña de la billetera es incorrecta @@ -494,21 +499,34 @@ - Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> - Datos de mercado (precios, estadisticas, etc.) marcados con ⓘ se obtienen a través de fuentes terceras.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> + Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://coingecko.com">CoinGecko</a>. + Datos de mercado (precios, estadisticas, etc.) marcados con ⓘ se obtienen a través de fuentes terceras.<br><br>Data is sourced via <a href="https://coingecko.com">CoinGecko</a>. Chart - + Loading market data Cargando datos de mercado - - There is no chart data for this pair yet - Todavía no hay datos de gráficos para este par + + There is no chart data for this pair + + + + + There is no chart data for %1 (testcoin) pairs + + + + + ClaimFaucetResultModal + + + Close + Cerrar @@ -732,83 +750,83 @@ ConfirmTradeModal - + Confirm Exchange Details Confirmar Detalles de Intercambio - + Trade price is more than 50% different to CEX! Confirm? ¡El precio comercial es más del 50% diferente al de CEX! ¿Confirmar? - + This swap request can not be undone and is a final event! ¡Esta solicitud de intercambio no se puede deshacer y es un evento final! - + This transaction can take up to 60 mins - DO NOT close this application! Esta transacción puede demorar hasta 60 minutos. ¡NO cierre esta aplicación! - + Loading fees... Cargando tarifas... - + <b>Total %1 fees:</b> <b>Cuota total de %1:</b> - + Security configuration Configuración de seguridad - + %1 confirmations for incoming %2 transactions %1 confirmaciones para %2 transacciones entrantes - + Read more about dPoW Obtenga más información sobre dPoW - + Use custom protection settings for incoming %1 transactions TICKER Utilice configuraciones de protección personalizadas para %1 transacciones entrantes - + Enable Komodo dPoW security Habilite la seguridad dPoW de Komodo - + dPoW protected Protegido por dPoW - + Required Confirmations Confirmaciones Requeridas - + Warning, this atomic swap is not dPoW protected! Advertencia, este intercambio atómico no está protegido por dPoW! - + Cancel Cancelar - + Confirm Confirmar @@ -824,182 +842,182 @@ Dashboard - + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. El número actual de monedas habilitadas no coincide con su especificación de configuración. Se restablecerá la configuración de sus activos. - + Matching Emparejando - + Order Matching Emparejando Orden - + Matched Emparejado - + Order Matched Orden Emparejada - + Ongoing En Curso - + Swap Ongoing Intercambio En Curso - + Successful Exitoso - + Swap Successful Intercambio exitoso - + Refunding Reembolso - + Failed Fallo - + Swap Failed Intercambio fallido - + Unknown Desconocido - + Unknown State Estado Desconocido - + Started Iniciado - + Negotiated Negociado - + Taker fee sent Tarifa taker enviada - + Maker payment received Pago de maker recibido - + Maker payment wait confirm started Inicio de espera de confirmacion de pago de maker - + Maker payment validated and confirmed Validacion y confirmacion de pago de maker - + Taker payment sent Pago de taker enviado - + Taker payment spent Pago del taker gastado - + Maker payment spent Pago del maker gastado - + Finished Terminado - + Start failed Inicio fallido - + Negotiate failed Negociacion fallida - + Taker fee validate failed Validación de tarifa del taker fallida - + Maker payment transaction failed Transacción de pago de maker fallo - + Maker payment Data send failed Envio de data de pago de maker fallo - + Maker payment wait confirm failed Espera de confirmacion de pago de maker fallo - + Taker payment validate failed Validacion de pago de taker fallo - + Taker payment wait confirm failed Espera de confirmacion de pago de taker fallo - + Taker payment spend failed Gasto de pago de taker fallo - + Maker payment wait refund started Reembolso de espera de pago de maker iniciado - + Maker payment refunded Pago de maker reembolsado - + Maker payment refund failed Reembolso del pago de maker fallo @@ -1083,7 +1101,7 @@ DexAppPasswordField - + Type password Escriba la contraseña @@ -1384,7 +1402,7 @@ General - + %n day(s) %n día @@ -1392,7 +1410,7 @@ - + %nd day @@ -1401,7 +1419,7 @@ - + %nh hours @@ -1410,7 +1428,7 @@ - + %nm minutes @@ -1419,7 +1437,7 @@ - + %ns seconds @@ -1428,7 +1446,7 @@ - + %nms milliseconds @@ -1437,92 +1455,117 @@ - + - - - + <b>Taker tx fee:</b> <b>Cuota de tx del taker:</b> - + <b>Dex tx fee:</b> <b>Cuota de tx del Dex:</b> - + <b>Dex fee:</b> <b>Cuota Dex:</b> - + <b>Maker tx fee:</b> <b>Cuota tx del maker:</b> - + + %1 balance is zero + + + + + Activating %1 (%2%) + + + + + Loading wallet... + + + + + Min: %1 + Mín.: %1 + + + + Enter an amount + Ingrese una cantidad + + + Trading Fee Tarifa de Intercambio - + Minimum Trading Amount Cantidad Mínima de Intercambio - + Wallet %1 already exists WALLETNAME Monedero %1 ya existe - + %1 balance is lower than the fees amount: %2 %3 El saldo de %1 es inferior al monto de las tarifas: %2 %3 - + Tradable (after fees) %1 balance is lower than minimum trade amount El saldo de %1 (después de las tarifas) es inferior al monto mínimo de intercambio - + Please fill the price field Por favor complete el campo de precio - + Please fill the volume field Complete el campo de volumen - - + + Please wait for %1 to fully activate Espere a que %1 se active por completo - - + + %1 volume is lower than minimum trade amount El volumen de %1 es inferior al monto mínimo de intercambio - - + + %1 needs to be enabled in order to use %2 %1 debe habilitarse para usar %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions se debe rellenar el saldo de %1, se requiere un saldo distinto de cero para pagar el gas de %2 transacciones - + Unknown Error Error Desconocido @@ -1588,90 +1631,95 @@ Nombre de billetera - + Enter seed Ingresar semilla - + Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue. Su semilla no cumple con BIP39. Vuelva a intentarlo o seleccione 'Permitir semilla personalizada' personalizada continúe. - - + + i understand entiendo - - + + я согласен - - + + je comprends - - + + entiendo - - + + anladım - - + + ich verstehe - + Ok Ok - + Allow custom seed Permitir semilla personalizada - + <strong>Allow custom seed</strong> <strong>Permitir semilla personalizada</strong> - + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. Las frases semilla personalizadas pueden ser menos seguras y más fáciles de descifrar que una frase semilla o clave privada (WIF) compatible con BIP39.<br><br>Para confirmar que comprende el riesgo y sabe lo que está haciendo, escriba <strong> 'Entiendo'</strong> en el cuadro de abajo. - + I understand Entiendo - + Next Siguiente - + + Enter password + + + + Enter the same password to confirm Ingrese la misma contraseña para confirmar - + Continue Continuar @@ -1715,10 +1763,15 @@ Vuelva a intentarlo o seleccione 'Permitir semilla personalizada' pers ListDelegate - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 no está habilitado. ¿Desea habilitarlo para poder seleccionar %2 mejores ordenes?<br><a href='#'>Sí</a> - <a href='#no'>No</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 @@ -1759,17 +1812,17 @@ Vuelva a intentarlo o seleccione 'Permitir semilla personalizada' pers Login - + Incorrect Password Contraseña incorrecta - + Log In Iniciar sesión - + Cancel Cancelar @@ -1814,181 +1867,152 @@ Se eliminarán del libro de pedidos hasta que vuelva a iniciar sesión. Main - - Segwit - Segwit - - - - Confirmation - Confirmación - - - - Do you want to send your %1 funds to %2 wallet first? - ¿Desea enviar sus fondos de %1 a la billetera %2 primero? - - - - Success - Éxito - - - - Your transaction is send, may take some time to arrive - Su transacción se envió, puede demorar algún tiempo en llegar - - - + Price Precio - + Change 24hr Cambio - - Porfolio - Cartera - - - + Contract Address Dirección del Contrato - + Send Enviar - + Enable %1 ? ¿Habilitar %1? - + Yes - + No No - + Receive Recibir - + + Swap Intercambiar - + + Portfolio + Cartera + + + is wallet only es solo billetera - + Rewards Recompensas - + Faucet Grifo - - - + + + Public Key Clave Pública - + Copied to Clipboard Copiada en el Portapapeles - + Loading market data Cargando datos de mercado - + There is no chart data for this ticker yet No hay datos de gráficos para este ticker aún - + Fetching transactions... Obteniendo transacciones... - + Please wait, %1 is %2 Por favor espera %1 es %2 - + % activated... % activado... - + No transactions available No hay transacciones disponibles - + Click to view your address on %1 (%2) block explorer Haga clic para ver su dirección en %1 (%2) explorador de bloques - - Trade - Intercambio - - - + Trading Information Información de Intercambios - + Chart Gráfico - - + + Orders Pedidos - - + + History Historial - + Place Order Realizar pedido - + Order Selected Pedido seleccionado - + START SWAP INICIO INTERCAMBIAR @@ -2042,13 +2066,13 @@ Se eliminarán del libro de pedidos hasta que vuelva a iniciar sesión. MarketModeSelector - + Sell %1 TICKER Vender %1 - + Buy %1 TICKER Comprar %1 @@ -2101,17 +2125,17 @@ Se eliminarán del libro de pedidos hasta que vuelva a iniciar sesión. NewContactPopup - + Contact name Nombre - + This contact name already exists. Este nombre de contacto ya existe. - + + ADD + Añadir @@ -2228,67 +2252,72 @@ Se eliminarán del libro de pedidos hasta que vuelva a iniciar sesión.Elegir contraseña - + Important: Back up your seed phrase before proceeding! Importante: ¡Haga una copia de seguridad de su frase semilla antes de continuar! - + We recommend storing it offline. Recomendamos almacenarlo fuera de línea. - + Generated Seed Semilla Generada - + Seed phrase Frase semilla - + copied to clipboard copiado al portapapeles - + Next Siguiente - + Let's double check your seed phrase Verifiquemos dos veces su frase semilla - + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. Su frase semilla es importante, por eso nos gusta asegurarnos de que sea correcta. Le haremos tres preguntas diferentes sobre su frase semilla para asegurarnos de que podrá restaurar fácilmente su billetera cuando lo desee. - + Enter the Ingresa la - + word palabra - + Check Verificar - + + Enter password + + + + Enter the same password to confirm Ingrese la misma contraseña para confirmar - + Continue Continuar @@ -2403,6 +2432,11 @@ Se eliminarán del libro de pedidos hasta que vuelva a iniciar sesión.Your wallet balance changed El saldo de tu billetera cambió + + + Close + Cerrar + %1 Enable status @@ -2422,49 +2456,49 @@ Se eliminarán del libro de pedidos hasta que vuelva a iniciar sesión. - + Failed to disable %1 TICKER Error al deshabilitar %1 - + Endpoint not reachable Punto final no accesible - + Could not reach to endpoint No se pudo llegar al punto final - + Show Mostrar - + Restart Reiniciar - + Quit Salir - + Notifications Notificaciones - + There aren't any notifications No hay ' notificaciones - + Mark all as read Marcar todo como leído @@ -2472,97 +2506,92 @@ Se eliminarán del libro de pedidos hasta que vuelva a iniciar sesión. OrderForm - + Price Precio - + Reduce 1% relative to CEX market price. Reducción del 1% en relación con el precio de mercado CEX. - + Use CEX market price. Utilice el precio de mercado CEX. - + Increase 1% relative to CEX market price. Aumento del 1% en relación con el precio de mercado de CEX. - - Volume - Volumen - - - - Amount to sell - Importe para vender + + Send + Enviar - - Amount to receive - Importe para recibir + + Receive + Recibir - + Max Max - + Swap 25% of your tradable balance. Usar el 25% de su saldo comercial. - + Swap 50% of your tradable balance. Usar el 50% de su saldo comercial. - + Swap 100% of your tradable balance. Usar el 100% de su saldo comercial. - + Min Volume Volumen Mínimo - + Min amount to sell Cantidad mínima para vender - + Min amount to receive Cantidad mínimo para recibir - + Minimum accepted trade equals 10% of order volume. El comercio mínimo aceptado es igual al 10% del volumen del pedido. - + Minimum accepted trade equals 25% of order volume. El comercio mínimo aceptado es igual al 25% del volumen del pedido. - + Minimum accepted trade equals 50% of order volume. El comercio mínimo aceptado es igual al 50% del volumen del pedido. - + Min volume: Volumen mínimo: - + Use custom minimum trade amount Utilizar una cantidad personalizada de intercambio mínima @@ -2586,114 +2615,104 @@ Se eliminarán del libro de pedidos hasta que vuelva a iniciar sesión. OrderModal - - Swap Details - Detalles de Intercambio - - - - Order Details - Detalles de Orden - - - + Order Type Tipo de Orden - + Maker Order Orden de Maker - + Taker Order Orden de Taker - + Refund State Estado del Reembolso - + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back Su intercambio falló, pero el proceso de reembolso automático para su pago ya comenzó. Espere y mantenga la aplicación abierta hasta que reciba su pago - + Date Fecha - + Error ID ID de Error - - + + Error Log Registro de Error - + Close Cerrar - + Cancel Order Cancelar Pedido - - + + Swap ID ID de Intercambio - + Maker Payment Sent Transaction ID ID de la transacción pago enviada de Maker - + Maker Payment Spent Transaction ID ID de la transacción pago gastado de Maker - + Maker Payment TXID TXID del pago de Maker - + Taker Payment Spent Transaction ID ID de la transacción pago gastado de Taker - + Taker Payment Sent Transaction ID ID de la transacción pago enviada de Taker - + Taker Payment TXID TXID del pago de Taker - + Recover Funds Recuperar fondos - + Refunding... Reembolso... - + View on Explorer Ver en Explorer @@ -2722,42 +2741,42 @@ Seleccione un nuevo pedido. OrdersPage - + Filter Filtrar - + Date Fecha - + Export CSV Exportar CSV - + Apply Filter Aplicar Filtro - + Cancel All Cancelar Todo - + From Desde - + To A - + Please choose the CSV export name and location Por favor, elija el nombre y la ubicación de exportación CSV @@ -2830,8 +2849,8 @@ Seleccione un nuevo pedido. Portfolio - ADD ASSET - AGREGAR ACTIVO + ADD CRYPTO + @@ -2839,12 +2858,12 @@ Seleccione un nuevo pedido. Buscar activo - + Show only coins with balance Mostrar solo monedas con saldo - + (%1/%2) (%1/%2) @@ -2930,12 +2949,12 @@ Seleccione un nuevo pedido. ProView - + Failed to place the order Error al realizar el pedido - + Placed the order Realizó el pedido El @@ -2983,7 +3002,7 @@ Seleccione un nuevo pedido. RecoverSeedModal - + View seed and private keys Ver semilla y claves privadas @@ -2993,64 +3012,64 @@ Seleccione un nuevo pedido. Por favor ingrese su contraseña para ver la semilla. - + Seed Semilla - + Backup Seed Copia de seguridad de semilla - + Public Address copied to clipboard Direccion publica copiada en el portapapeles - + Cancel Cancelar - + Incorrect Password Contraseña incorrecta - + View Ver - - + + copied to clipboard copiado al portapapeles - - + + RPC Password Contraseña RPC - + Search a coin. Buscar una moneda. - + Public Address Dirección Pública - + Private Key copied to clipboard Clave Privada copiada en el portapapeles - + Private Key Clave Privada @@ -3076,17 +3095,17 @@ Seleccione un nuevo pedido. RestartModal - + Applying the changes... Aplicando los cambios... - + Restarting the application. %1 Reiniciando la aplicación. %1 - + Restarting the application... Reiniciando la aplicación... @@ -3120,162 +3139,172 @@ Seleccione un nuevo pedido. SendModal - + Failed to send Error al enviar - + Prepare to send Preparar para enviar - + Address of the recipient Dirección del destinatario - + Amount to send Cantidad a enviar - + Gas price Precio del gas - + Cancel Cancelar - + Recipient's address Dirección del destinatario - + The address has to be mixed case. La dirección debe estar en mayúsculas y minúsculas. - + Failed to Broadcast Error al transmitir - + Fix Arreglar - + MAX MAX - + Fiat amount: Unavailable Cantidad en Fiat: No disponible - + Fiat amount: %1 Cantidad de Fiat: %1 - + %1 amount: %2 Cantidad de %1: %2 - + Specify in Fiat Especificar en Fiat - + Specify in Crypto Especificar en Crypto - + + Enter memo + + + + Enable Custom Fees Habilitar Tarifas Personalizadas - + Enter the custom fee Ingrese la tarifa personalizada - + Gas Limit Límite de gas - + Custom Fee can't be higher than the amount Tarifa personalizada no puede ser mayor que la cantidad - + Not enough funds. No hay suficientes fondos. - - + + You have %1 AMT TICKER Tiene %1 - - + + Only use custom fees if you know what you are doing! ¡Solo use tarifas personalizadas si sabe lo que está haciendo! - + Prepare Preparar - - + + Send Enviar - + %1 address TICKER %1 dirección - + copied to clipboard. copiado al portapapeles. - + Amount Cantidad - + + Memo + + + + Fees Tarifas - + Date Fecha - + Back Atrás @@ -3361,11 +3390,16 @@ Seleccione un nuevo pedido. + Memo + + + + Fees Tarifas - + Date Fecha @@ -3375,12 +3409,12 @@ Seleccione un nuevo pedido. Hash de Transaccion - + Close Cerrar - + View on Explorer Ver en Explorer @@ -3388,8 +3422,8 @@ Seleccione un nuevo pedido. SettingModal - - + + Cancel Cancelar @@ -3419,57 +3453,57 @@ Seleccione un nuevo pedido. Seguridad - + Enable Desktop Notifications Habilitar notificaciones de escritorio - + Maximum number of enabled coins Número máximo de monedas habilitadas - + Logs Registros - + Open Folder Carpeta Abierta - + Reset Restablecer - + Current Font Fuente Actual - + Current font changed to %1. La fuente actual cambió a %1. - + Theme Tema - + Changing theme to %1 Cambiando el tema a %1 - + Application Version La versión de la aplicación - + copied to clipboard copiado al portapapeles @@ -3479,136 +3513,141 @@ Seleccione un nuevo pedido. Acerca de & Versión - - + + Hide Poison Transactions in History + + + + + Reset wallet configuration Restablecer configuración de billetera - + This will restart your wallet with default settings Esto reiniciará su billetera con la configuración predeterminada - - + + Confirm Confirmar - + Ask system's password before sending coins ? (2FA) ¿Preguntar la contraseña del sistema antes de enviar monedas? (2FA) - + Disable 2FA? ¿Deshabilitar 2FA? - + Enter your wallet password to confirm Ingrese la contraseña de su billetera para confirmar - + Type password Escriba la contraseña - + 2FA status Estado 2FA - + 2FA disabled successfully 2FA deshabilitado correctamente - - + + Ok Ok - + Wrong password! ¡Contraseña incorrecta! - + Wallet password is incorrect Contraseña de la billetera es incorrecta - + View seed and private keys Ver semilla y claves privadas - - + + Show Mostrar - + Setup Camouflage Password Configuración de Contraseña Camuflaje - + Open Abrir - + Disclaimer and ToS Descargo de Responsabilidad y Terminos de Servicio - + Application version Versión de Aplicación - + MM2 version Versión MM2 - + MM2 Version Versión MM2 - + MM2 Version copied to clipboard. Versión MM2 copiada al portapapeles. - + Qt version Versión Qt - + Qt Version Versión Qt - + Qt Version copied to clipboard. Versión de Qt copiada al portapapeles. - + Search Update Buscar Actualizacion - + Logout Cerrar sesión @@ -3616,27 +3655,14 @@ Seleccione un nuevo pedido. Sidebar - + Search Buscar - Add asset - Agregar activo - - - - SmartChartView - - - Loading market data - Cargando datos de mercado - - - - There is no chart data for this ticker yet - No hay datos de gráficos para este ticker aún + ADD CRYPTO + @@ -3667,10 +3693,15 @@ Seleccione un nuevo pedido. Tasa CEX - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 no está habilitado. ¿Desea habilitarlo para poder seleccionar %2 mejores ordenes?<br><a href='#'>Sí</a> - <a href='#no'>No</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + SubCoinSelector @@ -3767,7 +3798,7 @@ Seleccione un nuevo pedido. SubOrders - + Orders Pedidos @@ -3812,12 +3843,12 @@ Seleccione un nuevo pedido. Cancelar - + Apply filter Aplicar filtro - + No results found No se encontraron resultados @@ -3912,62 +3943,78 @@ Network fees can vary greatly depending on your selected trading pair. Las tarifas de la red pueden variar mucho según el par comercial seleccionado. - + + I see a transaction in my wallet that was marked as 'poison'. What does this mean? + + + + + Address poisoning is a relatively new tye of phishing attack, where a malicious actor aims to trick you into sending funds to an address that you did not intend to send funds to. + +This is often done by sending a zero value transaction to your wallet from an address which looks very similar to your actual address, with the exact same letters at the start and end. This transaction will then appear in your transaction history, with the scammer hoping you will mistake the fake address for your own and send funds to it. + +To protect you from this, %1 will mark any transaction that it detects as potentially being a poison transaction with a "poison" label. You should always be careful to confirm any address you send funds to is correct. + +There is a toggle in settings where you can turn on/off the display of these transactions. + + + + Do you provide user support? ¿Ofrecen soporte al usuario? - + Yes! %1 offers support through the <a href="%2">%1 Discord server</a>. The team and the community are always happy to help! ¡Sí! %1 ofrece soporte a través del <a href="%2">%1 servidor Discord</a>. ¡El equipo y la comunidad siempre están dispuestos a ayudar! - + Who is behind %1? ¿Quién está detrás de %1? - + %1 is developed by the Komodo team. Komodo is one of the most established blockchain projects working on innovative solutions like atomic swaps, Delayed Proof of Work, and an interoperable multi-chain architecture. %1 está desarrollado por el equipo de Komodo. Komodo es uno de los proyectos de cadena de bloques más establecidos que trabaja en soluciones innovadoras como intercambios atómicos, prueba de trabajo retrasada y una arquitectura multicadena interoperable. - + Is it possible to develop my own white-label exchange on %1? ¿Es posible desarrollar mi propio intercambio de marca blanca en %1? - + Absolutely! You can read our developer documentation for more details or contact us with your partnership inquiries. Have a specific technical question? The %1 developer community is always ready to help! ¡Absolutamente! Puede leer nuestra documentación para desarrolladores para obtener más detalles o ponerse en contacto con nosotros con sus consultas de asociación. ¿Tiene una pregunta técnica específica? ¡La comunidad de desarrolladores de %1 siempre está lista para ayudar! - + Which devices can I use %1 on? ¿En qué dispositivos puedo usar %1? - + %1 is available for mobile on both <a href="%2">Android and iPhone, and for desktop on Windows, Mac, and Linux</a> operating systems. %1 está disponible para dispositivos móviles en <a href="%2">Android y iPhone, y para escritorio en Windows, Mac y Linux</a> sistemas operativos. - + Compliance Info Información de cumplimiento - + Due to regulatory and legal circumstances the citizens of certain jurisdictions including, but not limited to, the United States of America, Canada, Hong Kong, Israel, Singapore, Sudan, Austria, Iran and any other state, country or other jurisdiction that is embargoed by the United States of America or the European Union are not allowed to use this application. Debido a circunstancias reglamentarias y legales, los ciudadanos de ciertas jurisdicciones, incluidos, entre otros, los Estados Unidos de América, Canadá, Hong Kong, Israel, Singapur, Sudán, Austria, Irán y cualquier otro estado, país u otra jurisdicción que está embargado por los Estados Unidos de América o la Unión Europea no se les permite utilizar esta aplicación. - + Changelog Cambios - + Open Logs Folder Abrir Carpeta de Registros @@ -4037,157 +4084,138 @@ Las tarifas de la red pueden variar mucho según el par comercial seleccionado.< Haga clic aquí para ver los detalles + + TotalView + + + Receive %1 + Recibir %1 + + + + Send %1 + + + Trade - + Swap Intercambiar - + Instant trading with best orders Comercio instantáneo con las mejores órdenes - + Reset form Restablecer formulario - + You have no tradable assets No tiene activos intercambiables - + From Desde - - Enter an amount - Ingrese una cantidad + + Entered amount must be higher than 0. + + + + + Select an order. + - + MAX MAX - + To A - + Pick an order Elegir una orden - + Price Precio - + Better price found: %1. Updating forms. Mejor precio encontrado: %1. Actualización de formularios. - + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. Mejor precio (%1) encontrado pero la cantidad recibida (%2) es más baja que la actual (%3). Haga clic aquí para actualizar el pedido seleccionado. - + %1 %1 - - Tradable: - Negociable: - - - - Min: %1 - Mín.: %1 + + Balance: + - + Pick a coin Elija una moneda - + SWAP NOW CAMBIE AHORA - + Failed to place the order Error al realizar el pedido - + Placed the order Realizó el pedido El - - Entered amount must be superior than 0. - monto ingresado debe ser superior a 0. - - - - You must select an order. - Debe seleccionar un pedido. - - - - Entered amount is below the minimum required by this order: %1 - El monto ingresado está por debajo del mínimo requerido por esta orden: %1 - - - - - %1 needs to be enabled in order to use %2 - %1 debe habilitarse para usar %2 - - - - - %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - se debe rellenar el saldo de %1, se requiere un saldo distinto de cero para pagar el gas de %2 transacciones - - - - %1 balance does not have enough funds to pay the gas of %2 transactions - %1 el saldo no tiene fondos suficientes para pagar el gas de %2 transacciones - - - + No buy orders found for %1. No se encontraron órdenes de compra para %1. - + You can check later or try to sell a different coin. Puede verificar más tarde o intentar vender una moneda diferente. - + Calculating fee estimate... Calculando tarifa estimada... - + Total %1 fees: Total de %1 tarifas: - + %2 (%3) %2 (%3) @@ -4230,91 +4258,114 @@ Las tarifas de la red pueden variar mucho según el par comercial seleccionado.< Realizar pedido + + TradingViewChart + + + Loading market data + Cargando datos de mercado + + + + There is no chart data for this ticker yet + No hay datos de gráficos para este ticker aún + + TransactionDetailsModal - + Transaction Details Detalles de Transacción - + + This transaction has been identified as a potential address poisoning attack. + + + + + Please see the Support FAQ for more information. + + + + %1 txid TICKER %1 txid - + copied to clipboard. copiado al portapapeles. - + Amount Cantidad - + Fees Tarifas - + From address Desde dirección - + To address Para dirección - + Date Fecha - + Unconfirmed Sin confirmar - + Transaction Hash Hash de Transaccion - + Confirmations Confirmaciones - + Block Height Altura del Bloque - + From Desde - + To A - + Notes Notas - + Close Cerrar - + View on Explorer Ver en Explorer @@ -4322,22 +4373,27 @@ Las tarifas de la red pueden variar mucho según el par comercial seleccionado.< Transactions - + Sent Enviado - + Received Recibido - + + Poison + + + + fees tarifas - + Unconfirmed Sin confirmar @@ -4472,7 +4528,7 @@ Esto puede tardar unos minutos... atomic_dex::settings_page - + An error has occurred. Se ha producido un error. @@ -4495,47 +4551,47 @@ Esto puede tardar unos minutos... Necesita tener %1 para pagar la gasolina de %2 transacciones. - + Checksum verification failed for %1. La verificación de la suma de comprobación falló para %1. - + Invalid checksum for %1. Click the button to convert to mixed case address. Suma de comprobación no válida para %1. Haga clic en el botón para convertir a dirección de mayúsculas y minúsculas. - + Legacy address used for %1. Click the button to convert to a Cashaddress. Dirección heredada utilizada para %1. Haga clic en el botón para convertir a una dirección de efectivo. - + %1 address must be prefixed with 0x La dirección %1 debe tener el prefijo 0x - + %1 address length is invalid, please use a valid address. La longitud de la dirección %1 no es válida, utilice una dirección válida. - + %1 address is invalid. La dirección %1 no es válida. - + Invalid checksum. Suma de comprobación no válida. - + %1 address has invalid prefixes. La dirección %1 tiene prefijos no válidos. - + Backend error: %1 Error de backend: %1 @@ -4548,7 +4604,7 @@ Esto puede tardar unos minutos... Cerrar sesión - + Balance Saldo diff --git a/atomic_defi_design/assets/languages/atomic_defi_fr.ts b/atomic_defi_design/assets/languages/atomic_defi_fr.ts index ca2981786a..764afef0bc 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_fr.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_fr.ts @@ -4,53 +4,53 @@ AddAddressForm - + Use standard network address - + Label - + This key already exists. Cette clé existe déjà. - + Address Adresse - - + + Cancel Annuler - + Convert - + Edit Éditer - + Add Ajouter - + You need to enable %1 before adding this kind of address. - + Enable Activer @@ -233,7 +233,7 @@ App - + Recover Funds Result Le résultat de la récupération des fonds @@ -307,7 +307,7 @@ - + Price provider is: %1 Fournisseur de prix : %1 @@ -315,68 +315,73 @@ Bottom - + + Add Crypto + + + + Settings Réglages - + Support Support - + Privacy Intimité - + Disable Privacy? - + Enter wallet password to confirm - + Type password Tapez votre mot de passe - + Confirm Confirmer - + Cancel Annuler - + Privacy status - + Privacy mode disabled successfully - - + + Ok Ok - + Wrong password! - + wallet password is incorrect le mot de passe du portefeuille est incorrect @@ -494,21 +499,34 @@ - Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> - Les données de marché (prix, graphiques, etc.) marquées de l'icône ⓘ proviennent de sources tierces.<br><br>Les données proviennent de <a href="https://bandprotocol.com/"> Band Decentralized Oracle</a> et <a href="https://www.coingecko.com/fr">Coingecko </a>.<br><br><b>Paires prises en charge par Oracle:</b><br>%1<br><br><b>Dernière référence (Band Oracle) :</b><br><a href="%2">%2</a> + Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://coingecko.com">CoinGecko</a>. + Les données de marché (prix, graphiques, etc.) marquées de l'icône ⓘ proviennent de sources tierces.<br><br>Les données proviennent de <a href="https://www.coingecko.com/fr">Coingecko </a>. Chart - + Loading market data Chargement des données de marché - - There is no chart data for this pair yet - Il n'y a pas encore de données graphiques pour cette paire + + There is no chart data for this pair + + + + + There is no chart data for %1 (testcoin) pairs + + + + + ClaimFaucetResultModal + + + Close + Fermer @@ -732,83 +750,83 @@ ConfirmTradeModal - + Confirm Exchange Details Détails de la confirmation de l'échange - + This swap request can not be undone and is a final event! La requête de ce swap ne peut pas être annulé, c'est irréversible ! - + Security configuration Configuration de la sécurité - + Read more about dPoW En savoir plus sur dPoW - + Use custom protection settings for incoming %1 transactions TICKER Utiliser les paramètres de protection personnalisés pour les transactions %1 entrantes - + Enable Komodo dPoW security Activer la sécurité de Komodo dPoW - + %1 confirmations for incoming %2 transactions Il y a %1 confirmations pour les transactions entrantes du ticker %2 - + This transaction can take up to 60 mins - DO NOT close this application! Cette transaction peut prendre jusqu'à 60 minutes - NE fermez PAS cette application ! - + Trade price is more than 50% different to CEX! Confirm? Le prix est supérieur à 50% du prix sur les CEX ! Êtes-vous sûr ? - + Loading fees... - + <b>Total %1 fees:</b> Frais totaux %1: - + dPoW protected Protégé par dPoW - + Required Confirmations Confirmations requises - + Warning, this atomic swap is not dPoW protected! Attention, ce swap atomique n'est pas protégé par dPoW ! - + Cancel Annuler - + Confirm Confirmer @@ -824,182 +842,182 @@ Dashboard - + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. Le nombre actuel d'actifs activées ne correspond pas à vos spécifications de configuration. La configuration de vos actifs sera réinitialisée. - + Matching Recherche en cours - + Order Matching Recherche d'un ordre - + Matched Trouvé - + Order Matched Ordre trouvé - + Ongoing En cours - + Swap Ongoing Échange en cours - + Successful Réussi - + Swap Successful Échange terminé - + Refunding En cours de remboursement - + Failed Échoué - + Swap Failed Erreur lors de l'échange - + Unknown Inconnue - + Unknown State État inconnu - + Started Commencé - + Negotiated Négocié - + Taker fee sent Frais de preneur envoyés - + Maker payment received Paiement de l'envoyeur reçu - + Maker payment wait confirm started La confirmation d'attente de paiement de l'envoyeur a commencé - + Maker payment validated and confirmed Paiement de l'envoyeur validé et confirmé - + Taker payment sent Paiement du preneur envoyé - + Taker payment spent Paiement du preneur dépensé - + Maker payment spent Paiement de l'envoyeur dépensé - + Finished Fini - + Start failed Le démarrage a échoué - + Negotiate failed La négociation a échoué - + Taker fee validate failed Échec de la validation des frais du preneur - + Maker payment transaction failed La transaction de paiement du créateur a échoué - + Maker payment Data send failed Échec de l'envoi des données de paiement du créateur - + Maker payment wait confirm failed La confirmation de l'attente de paiement du créateur a échoué - + Taker payment validate failed La validation du paiement du preneur a échoué - + Taker payment wait confirm failed La confirmation de l'attente de paiement du preneur a échoué - + Taker payment spend failed Échec des dépenses de paiement du preneur - + Maker payment wait refund started attente de paiement du créateur, remboursement commencé - + Maker payment refunded Paiement du créateur remboursé - + Maker payment refund failed échec du remboursement du paiement du créateur @@ -1083,7 +1101,7 @@ DexAppPasswordField - + Type password Tapez votre mot de passe @@ -1384,7 +1402,7 @@ General - + %n day(s) %n jour(s) @@ -1392,7 +1410,7 @@ - + %nd day @@ -1401,7 +1419,7 @@ - + %nh hours @@ -1410,7 +1428,7 @@ - + %nm minutes @@ -1419,7 +1437,7 @@ - + %ns seconds @@ -1428,7 +1446,7 @@ - + %nms milliseconds @@ -1437,92 +1455,117 @@ - + - - - + <b>Taker tx fee:</b> Taxes de transaction du preneur: - + <b>Dex tx fee:</b> Taxes de transaction de DEX: - + <b>Dex fee:</b> Taxes de DEX: - + <b>Maker tx fee:</b> Taxes de transaction du créateur - + + %1 balance is zero + + + + + Activating %1 (%2%) + + + + + Loading wallet... + + + + + Min: %1 + + + + + Enter an amount + Entrez un montant + + + Trading Fee Frais d'échanges - + Minimum Trading Amount Frais d'échange minimum - + Wallet %1 already exists WALLETNAME Le portefeuille %1 existe déjà - + %1 balance is lower than the fees amount: %2 %3 La %1 balance est inférieur aux frais: %2 %3 - + Tradable (after fees) %1 balance is lower than minimum trade amount Le solde négociable (après frais) %1 est inférieur au montant minimum de la transaction - + Please fill the price field Veuillez remplir le champ de prix - + Please fill the volume field - - + + Please wait for %1 to fully activate - - + + %1 volume is lower than minimum trade amount Le volume de %1 est inférieur au montant minimum de la transaction - - + + %1 needs to be enabled in order to use %2 %1 doit être activé pour utiliser %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions Le solde %1 doit être financé, un solde différent de zéro est requis pour payer les frais de transactions de %2 - + Unknown Error Erreur inconnue @@ -1588,89 +1631,94 @@ Nom du portefeuille - + Enter seed Entrez la phrase de récupération - + Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue. - - + + i understand je comprends - - + + я согласен - - + + je comprends - - + + entiendo - - + + anladım - - + + ich verstehe - + Ok Ok - + Allow custom seed Autoriser les phrases de récupération personnalisées - + <strong>Allow custom seed</strong> <strong>Autoriser les phrases personnalisées</strong> - + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. Les phrases de départ personnalisées peuvent être moins sécurisées et plus faciles à déchiffrer qu'une phrase de départ ou une clé privée (WIF) conforme à BIP39 générée.<br><br>Pour confirmer que vous comprenez le risque et savez ce que vous faites, tapez <strong>'Je comprends'</strong> dans la case ci-dessous. - + I understand Je comprends - + Next Suivant - + + Enter password + + + + Enter the same password to confirm Entrez le même mot de passe pour confirmer - + Continue Continuer @@ -1714,10 +1762,15 @@ Try again or select 'Allow custom seed' to continue. ListDelegate - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 n'est pas activé - Souhaitez vous l'activer pour pouvoir selectionnez les meilleurs offres %2 ?<br><a href='#'>Oui</a> - <a href='#no'>Non</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 @@ -1758,17 +1811,17 @@ Try again or select 'Allow custom seed' to continue. Login - + Incorrect Password Mot de passe incorrect - + Log In - + Cancel Annuler @@ -1811,181 +1864,152 @@ They will be removed from the orderbook until you log in again. Main - - Segwit - Segwit - - - - Confirmation - Confirmation - - - - Do you want to send your %1 funds to %2 wallet first? - Voulez-vous d'abord envoyer vos fonds %1 vers le portefeuille %2 ? - - - - Success - Succès - - - - Your transaction is send, may take some time to arrive - Votre transaction est envoyée, peut prendre un certain temps pour arriver - - - + Price Prix - + Change 24hr - - Porfolio - - - - + Contract Address - + Send Envoyez - + Enable %1 ? Activer %1 ? - + Yes Oui - + No Non - + Receive Recevoir - + + Swap Échange - + + Portfolio + Portfolio + + + is wallet only - + Rewards Récompenses - + Faucet Robinet - - - + + + Public Key - + Copied to Clipboard Copier dans le presse-papier - + Loading market data Chargement des données de marché - + There is no chart data for this ticker yet Il n'y a pas encore de données graphiques pour ce ticker - + Fetching transactions... - + Please wait, %1 is %2 - + % activated... - + No transactions available - + Click to view your address on %1 (%2) block explorer - - Trade - Échanger - - - + Trading Information Informations de Trading - + Chart Chart - - + + Orders Ordres - - + + History Historique - + Place Order Placer l'ordre - + Order Selected Ordre séléctionné - + START SWAP COMMENCER L'ÉCHANGE @@ -2039,13 +2063,13 @@ They will be removed from the orderbook until you log in again. MarketModeSelector - + Sell %1 TICKER - + Buy %1 TICKER @@ -2098,17 +2122,17 @@ They will be removed from the orderbook until you log in again. NewContactPopup - + Contact name - + This contact name already exists. Ce nom de contact existe déjà. - + + ADD @@ -2225,67 +2249,72 @@ They will be removed from the orderbook until you log in again. Choisissez un mot de passe - + Important: Back up your seed phrase before proceeding! Important: sauvegardez votre phrase de recupération avant de continuer ! - + We recommend storing it offline. Nous vous recommandons de le stocker hors ligne. - + Generated Seed Générer un Seed - + Seed phrase Phrase de récupération - + copied to clipboard copié dans le presse-papier - + Next Suivant - + Let's double check your seed phrase Vérifions à nouveau votre phrase de récupération - + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. Votre phrase de récupération est importante - c'est pourquoi nous aimons nous assurer qu'elle est correcte. Nous vous poserons trois questions différentes au sujet de votre phrase source pour vous assurer que vous pourrez facilement restaurer votre portefeuille à tout moment. - + Enter the - + word - + Check Vérifier - + + Enter password + + + + Enter the same password to confirm Entrez le même mot de passe pour confirmer - + Continue Continuer @@ -2400,6 +2429,11 @@ They will be removed from the orderbook until you log in again. Your wallet balance changed Le solde de votre portefeuille a changé + + + Close + Fermer + %1 Enable status @@ -2419,49 +2453,49 @@ They will be removed from the orderbook until you log in again. - + Failed to disable %1 TICKER - + Endpoint not reachable Point final non accessible - + Could not reach to endpoint Impossible d'atteindre le point de terminaison - + Show Montrer - + Restart Redémarrer - + Quit Quitter - + Notifications - + There aren't any notifications - + Mark all as read Tout marquer comme lu @@ -2469,100 +2503,95 @@ They will be removed from the orderbook until you log in again. OrderForm - - Amount to sell - Montant à vendre + + Send + Envoyez - - Amount to receive - Montant à recevoir + + Receive + Recevoir - + Max Max - + Swap 25% of your tradable balance. - + Swap 50% of your tradable balance. - + Swap 100% of your tradable balance. - + Min Volume - + Min amount to sell - + Min amount to receive - + Minimum accepted trade equals 10% of order volume. - + Minimum accepted trade equals 25% of order volume. - + Minimum accepted trade equals 50% of order volume. - + Min volume: Min volume : - + Use custom minimum trade amount Utiliser le montant d'échange minimum personnalisé - + Price Prix - + Reduce 1% relative to CEX market price. - + Use CEX market price. - + Increase 1% relative to CEX market price. - - - Volume - Volume - OrderLine @@ -2583,114 +2612,104 @@ They will be removed from the orderbook until you log in again. OrderModal - - Swap Details - Détails de l'échange - - - - Order Details - Détails de l'ordre - - - + Order Type - + Maker Order Ordre de vente - + Taker Order Ordre d'achat - + Refund State État de remboursement - + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back Votre échange a échoué, mais le processus de remboursement automatique de votre paiement a déjà commencé. Veuillez patienter et garder l'application ouverte jusqu'à ce que vous receviez votre remboursement - + Date Date - + Recover Funds Récupérer des fonds - + Refunding... Remboursement... - + View on Explorer Voir dans l'explorateur - + Cancel Order Annuler l'ordre - + Error ID ID de l'erreur - - + + Swap ID ID du Swap - + Maker Payment Sent Transaction ID - + Maker Payment Spent Transaction ID - + Maker Payment TXID - + Taker Payment Spent Transaction ID - + Taker Payment Sent Transaction ID - + Taker Payment TXID - - + + Error Log Journal des erreurs - + Close Fermer @@ -2717,43 +2736,43 @@ Please select a new order. OrdersPage - + From De - + To Vers - + Apply Filter Appliquer les changements - + Filter Filtrer - + Date Date - + Export CSV Exporter CSV - + Cancel All - + Please choose the CSV export name and location Veuillez choisir le nom et l'emplacement de l'exportation CSV @@ -2826,7 +2845,7 @@ Please select a new order. Portfolio - ADD ASSET + ADD CRYPTO @@ -2835,12 +2854,12 @@ Please select a new order. Rechercher un actif - + Show only coins with balance Afficher uniquement les assets avec solde - + (%1/%2) (%1/%2) @@ -2926,12 +2945,12 @@ Please select a new order. ProView - + Failed to place the order Échec lors du placement de l'ordre - + Placed the order L'ordre a été placé avec succès @@ -2979,7 +2998,7 @@ Please select a new order. RecoverSeedModal - + View seed and private keys Afficher le seed et les clefs privées @@ -2989,64 +3008,64 @@ Please select a new order. Veuillez entrer votre mot de passe pour voir la phrase de récupération. - + Seed - + Backup Seed - + Public Address copied to clipboard - + Cancel Annuler - + Incorrect Password Mot de passe incorrect - - + + copied to clipboard copié dans le presse-papier - - + + RPC Password Mot de passe RPC - + Search a coin. Rechercher une asset. - + Public Address Adresse publique - + Private Key copied to clipboard - + Private Key Clé privée - + View Voir @@ -3072,17 +3091,17 @@ Please select a new order. RestartModal - + Applying the changes... Application des modifications... - + Restarting the application... Redémarrage de l'application ... - + Restarting the application. %1 Redémarrage de l'application. %1 @@ -3116,162 +3135,172 @@ Please select a new order. SendModal - + Failed to send Échec de l'envoi - + Prepare to send Préparez à envoyer du - + Address of the recipient Adresse du destinataire - + Amount to send Montant à envoyer - + Gas price Prix ​​du gaz - + Cancel Annuler - + Recipient's address Adresse du destinataire - + The address has to be mixed case. L'adresse doit être mixte (case). - + Failed to Broadcast - + Fix Réparer - + MAX MAX - + Fiat amount: Unavailable - + Fiat amount: %1 - + %1 amount: %2 - + Specify in Fiat - + Specify in Crypto - + + Enter memo + + + + Enable Custom Fees Activer les frais personnalisés - + Enter the custom fee Entrez les frais personnalisées - + Gas Limit Limite de gaz - + Custom Fee can't be higher than the amount Les frais personnalisées ne peuvent pas être supérieurs au montant - + Not enough funds. Pas assez de fonds. - - + + You have %1 AMT TICKER Vous avez %1 - - + + Only use custom fees if you know what you are doing! - + Prepare Préparer - - + + Send Envoyez - + %1 address TICKER - + copied to clipboard. - + Amount Montant - + + Memo + + + + Fees Frais - + Date Date - + Back Retour @@ -3357,11 +3386,16 @@ Please select a new order. + Memo + + + + Fees Frais - + Date Date @@ -3371,12 +3405,12 @@ Please select a new order. Hachage de la transaction - + Close Fermer - + View on Explorer Voir dans l'explorateur @@ -3384,8 +3418,8 @@ Please select a new order. SettingModal - - + + Cancel Annuler @@ -3420,191 +3454,196 @@ Please select a new order. À propos & version - + Enable Desktop Notifications Activer les notifications - + + Hide Poison Transactions in History + + + + Maximum number of enabled coins Nombre maximum d'actifs activés - + Logs Journaux - + Open Folder Ouvrir le dossier - - + + Reset wallet configuration Réinitialiser la configuration du portefeuille - + This will restart your wallet with default settings Cela redémarrera votre portefeuille avec les paramètres par défaut - - + + Confirm Confirmer - + Changing theme to %1 Changer le thème en %1 - + Disable 2FA? - + Enter your wallet password to confirm - + Type password Tapez votre mot de passe - + 2FA status - + 2FA disabled successfully - - + + Ok Ok - + Wrong password! - + Wallet password is incorrect - + Application Version - + copied to clipboard copié dans le presse-papier - + Reset Réinitialiser - + Current Font Police actuelle - + Current font changed to %1. La police actuelle est passée à %1. - + Theme Thème - + Ask system's password before sending coins ? (2FA) Demander le mot de passe du système avant d'envoyer des actifs ? (2FA) - + Application version Version de l'application - + MM2 version Version de MM2 - + MM2 Version MM2 Version - + MM2 Version copied to clipboard. MM2 Version copiée dans le presse-papiers. - + Qt version Version de Qt - + Qt Version Qt Version - + Qt Version copied to clipboard. Version Qt copiée dans le presse-papiers. - + Search Update Rechercher une mise à jour - + Logout Se déconnecter - + View seed and private keys Afficher la phrase de récupération et les clefs privées - - + + Show Montrer - + Setup Camouflage Password Configurer le mot de passe de camouflage - + Open Ouvrir - + Disclaimer and ToS Clause de non-responsabilité et conditions d'utilisation @@ -3612,27 +3651,14 @@ Please select a new order. Sidebar - + Search Rechercher - Add asset - Ajouter un actif - - - - SmartChartView - - - Loading market data - Chargement des données de marché - - - - There is no chart data for this ticker yet - Il n'y a pas encore de données graphiques pour cet actif + ADD CRYPTO + @@ -3663,10 +3689,15 @@ Please select a new order. Taux CEX - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 n'est pas activé - Souhaitez vous l'activer pour pouvoir selectionnez les meilleurs offres %2 ?<br><a href='#'>Oui</a> - <a href='#no'>Non</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + SubCoinSelector @@ -3763,7 +3794,7 @@ Please select a new order. SubOrders - + Orders Ordres @@ -3808,12 +3839,12 @@ Please select a new order. Annuler - + Apply filter Appliquer changement - + No results found Aucun résultat trouvé @@ -3894,62 +3925,78 @@ Network fees can vary greatly depending on your selected trading pair. - + + I see a transaction in my wallet that was marked as 'poison'. What does this mean? + + + + + Address poisoning is a relatively new tye of phishing attack, where a malicious actor aims to trick you into sending funds to an address that you did not intend to send funds to. + +This is often done by sending a zero value transaction to your wallet from an address which looks very similar to your actual address, with the exact same letters at the start and end. This transaction will then appear in your transaction history, with the scammer hoping you will mistake the fake address for your own and send funds to it. + +To protect you from this, %1 will mark any transaction that it detects as potentially being a poison transaction with a "poison" label. You should always be careful to confirm any address you send funds to is correct. + +There is a toggle in settings where you can turn on/off the display of these transactions. + + + + Do you provide user support? Fournissez-vous un support utilisateur ? - + Yes! %1 offers support through the <a href="%2">%1 Discord server</a>. The team and the community are always happy to help! Oui! %1 offre une assistance via le <a href="%2">%1 serveur Discord</a>. L'équipe et la communauté sont toujours ravies de vous aider ! - + Who is behind %1? Qui est derrière %1 ? - + %1 is developed by the Komodo team. Komodo is one of the most established blockchain projects working on innovative solutions like atomic swaps, Delayed Proof of Work, and an interoperable multi-chain architecture. %1 est développé par l'équipe de Komodo. Komodo est l'un des projets de blockchain les plus établis travaillant sur des solutions innovantes telles que les échanges atomiques, la preuve de travail différée et une architecture multichaîne interopérable. - + Is it possible to develop my own white-label exchange on %1? Est-il possible de développer mon propre échange en white label sur %1 ? - + Absolutely! You can read our developer documentation for more details or contact us with your partnership inquiries. Have a specific technical question? The %1 developer community is always ready to help! Absolument! Vous pouvez lire notre documentation développeur pour plus de détails ou nous contacter avec vos demandes de partenariat. Vous avez une question technique spécifique? La communauté de développeurs %1 est toujours prête à vous aider ! - + Which devices can I use %1 on? Sur quels appareils puis-je utiliser %1 ? - + %1 is available for mobile on both <a href="%2">Android and iPhone, and for desktop on Windows, Mac, and Linux</a> operating systems. %1 est disponible pour mobile sur <a href="%2">Android et iPhone, et pour ordinateur de bureau sur les systèmes d'exploitation Windows, Mac et Linux</a>. - + Compliance Info Informations de conformité - + Due to regulatory and legal circumstances the citizens of certain jurisdictions including, but not limited to, the United States of America, Canada, Hong Kong, Israel, Singapore, Sudan, Austria, Iran and any other state, country or other jurisdiction that is embargoed by the United States of America or the European Union are not allowed to use this application. En raison de circonstances réglementaires et juridiques, les citoyens de certaines juridictions, y compris, mais sans s'y limiter, les États-Unis d'Amérique, le Canada, Hong Kong, Israël, Singapour, le Soudan, l'Autriche, l'Iran et tout autre État, pays ou autre juridiction sous embargo par les États-Unis d'Amérique ou l'Union européenne ne sont pas autorisés à utiliser cette application. - + Changelog Changelog - + Open Logs Folder Ouvrir le répertoire de logs @@ -4019,157 +4066,138 @@ Network fees can vary greatly depending on your selected trading pair. Cliquez ici pour voir les détails + + TotalView + + + Receive %1 + + + + + Send %1 + + + Trade - + Swap Échange - + Instant trading with best orders Trading instantané avec les meilleurs ordres - + Reset form - + You have no tradable assets - + From De - - Enter an amount - Entrez un montant + + Entered amount must be higher than 0. + + + + + Select an order. + - + MAX MAX - + To Vers - + Pick an order Choisir une commande - + Price Prix - + Better price found: %1. Updating forms. Meilleur prix trouvé : %1. Mise à jour du formulaire. - + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. Meilleur prix (%1) trouvé mais la quantité reçue (%2) est inférieure à votre montant de réception (%3). Cliquez ici pour mettre à jour la commande sélectionnée. - + %1 - - Tradable: - Disponible: - - - - Min: %1 + + Balance: - + Pick a coin Choisissez un actif - + SWAP NOW ÉCHANGER MAINTENANT - + Failed to place the order Échec lors du placement de l'ordre - + Placed the order L'ordre a été placé - - Entered amount must be superior than 0. - Le montant saisi doit être supérieur à 0. - - - - You must select an order. - Vous devez sélectionner une commande. - - - - Entered amount is below the minimum required by this order: %1 - Le montant saisi est inférieur au minimum requis par cette commande : %1 - - - - - %1 needs to be enabled in order to use %2 - %1 doit être activé pour utiliser %2 - - - - - %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - Le solde %1 doit être financé, un solde différent de zéro est requis pour payer les frais de transactions de %2 - - - - %1 balance does not have enough funds to pay the gas of %2 transactions - - - - + No buy orders found for %1. Aucun ordre d'achat trouvé pour %1. - + You can check later or try to sell a different coin. Vous pouvez vérifier plus tard ou essayer de vendre un actif différent. - + Calculating fee estimate... - + Total %1 fees: Frais totaux %1 : - + %2 (%3) @@ -4212,91 +4240,114 @@ Network fees can vary greatly depending on your selected trading pair. Placer l'ordre + + TradingViewChart + + + Loading market data + Chargement des données de marché + + + + There is no chart data for this ticker yet + Il n'y a pas encore de données graphiques pour ce ticker + + TransactionDetailsModal - + Transaction Details Détails de la transaction - + + This transaction has been identified as a potential address poisoning attack. + + + + + Please see the Support FAQ for more information. + + + + %1 txid TICKER - + copied to clipboard. - + Amount Montant - + Fees Frais - + From address - + To address - + Date Date - + Unconfirmed Non confirmé - + Transaction Hash Hachage de la transaction - + Confirmations Confirmations - + Block Height Hauteur de bloc - + From De - + To Vers - + Notes Remarques - + Close Fermer - + View on Explorer Voir dans l'explorateur @@ -4304,22 +4355,27 @@ Network fees can vary greatly depending on your selected trading pair. Transactions - + Received Reçue - + Sent Envoyé - + + Poison + + + + fees frais - + Unconfirmed Non confirmé @@ -4453,7 +4509,7 @@ This might take a few minutes... atomic_dex::settings_page - + An error has occurred. @@ -4476,47 +4532,47 @@ This might take a few minutes... Vous devez avoir %1 activée pour payer les frais de transactions de %2. - + Checksum verification failed for %1. Échec de la vérification du checksum de contrôle pour %1. - + Invalid checksum for %1. Click the button to convert to mixed case address. - + Legacy address used for %1. Click the button to convert to a Cashaddress. - + %1 address must be prefixed with 0x L'adresse %1 doit être précédée de 0x - + %1 address length is invalid, please use a valid address. La longueur de l'adresse %1 n'est pas valide, veuillez utiliser une adresse valide. - + %1 address is invalid. L'adresse %1 n'est pas valide. - + Invalid checksum. Somme de contrôle invalide. - + %1 address has invalid prefixes. L'adresse %1 a des préfixes non valides. - + Backend error: %1 Erreur de backend : %1 @@ -4529,7 +4585,7 @@ This might take a few minutes... Se déconnecter - + Balance Balance diff --git a/atomic_defi_design/assets/languages/atomic_defi_lang_template.ts b/atomic_defi_design/assets/languages/atomic_defi_lang_template.ts index 5836a5dfc1..fa46445515 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_lang_template.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_lang_template.ts @@ -405,7 +405,7 @@ - Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> + Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://coingecko.com">CoinGecko</a>. diff --git a/atomic_defi_design/assets/languages/atomic_defi_ru.ts b/atomic_defi_design/assets/languages/atomic_defi_ru.ts index 31ae9a0ed6..0f6bd5fc2f 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_ru.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_ru.ts @@ -4,53 +4,53 @@ AddAddressForm - + Use standard network address - + Label - + This key already exists. Этот ключ уже существует. - + Address Адрес - - + + Cancel - + Convert Преобразовать - + Edit Редактировать - + Add Добавить - + You need to enable %1 before adding this kind of address. - + Enable Добавить @@ -233,7 +233,7 @@ App - + Recover Funds Result Результат восстановления средств @@ -307,7 +307,7 @@ - + Price provider is: %1 Провайдер цены: %1 @@ -315,68 +315,73 @@ Bottom - + + Add Crypto + + + + Settings Настройки - + Support Поддержка - + Privacy Скрыть баланс - + Disable Privacy? - + Enter wallet password to confirm - + Type password Введите пароль - + Confirm - + Cancel - + Privacy status - + Privacy mode disabled successfully - - + + Ok Ок - + Wrong password! - + wallet password is incorrect введен неправильный пароль @@ -494,21 +499,34 @@ - Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> - Рыночные данные (цены, графики, и тд.) отмеченные ⓘ иконкой получены от <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> и <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> + Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://coingecko.com">CoinGecko</a>. + Рыночные данные (цены, графики, и тд.) отмеченные ⓘ иконкой получены от <a href="https://coingecko.com">CoinGecko</a>. Chart - + Loading market data Загрузка рыночных данных - - There is no chart data for this pair yet - Нет данных для построения графика для этой торговой пары + + There is no chart data for this pair + + + + + There is no chart data for %1 (testcoin) pairs + + + + + ClaimFaucetResultModal + + + Close + Закрыть @@ -732,83 +750,83 @@ ConfirmTradeModal - + Confirm Exchange Details Подтвердить данные обмена - + Trade price is more than 50% different to CEX! Confirm? Стоимость обмена в сравнении с CEX дороже более чем на 50%, вы подтверждаете сделку? - + This swap request can not be undone and is a final event! Этот запрос на своп не может быть отменен и является окончательным! - + This transaction can take up to 60 mins - DO NOT close this application! Эта транзакция может занять до 60 минут - НЕ закрывайте приложение! - + Loading fees... - + <b>Total %1 fees:</b> - + Security configuration Настройки безопасности - + %1 confirmations for incoming %2 transactions %1 подтверждений для входящих %2 транзакций - + Read more about dPoW Узнать больше о dPoW - + Use custom protection settings for incoming %1 transactions TICKER Использовать пользовательские настройки защиты для входящих транзакций %1 - + Enable Komodo dPoW security Включить Komodo dPoW - + dPoW protected dPoW защита - + Required Confirmations Необходимое количество подтверждений - + Warning, this atomic swap is not dPoW protected! Предупреждение, этот атомарный своп не защищен dPoW! - + Cancel Отменить - + Confirm Подтверждение @@ -824,182 +842,182 @@ Dashboard - + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. Текущее количество включенных монет не совпадает с конфигурацией. Ваша конфигурация активов будет сброшена. - + Matching Матчинг - + Order Matching Матчинг ордеров - + Matched Сматчен - + Order Matched Ордер сматчен - + Ongoing В процессе - + Swap Ongoing Своп продолжается - + Successful Успешно - + Swap Successful Своп успешно завершен - + Refunding Проводится возврат - + Failed Не завершено - + Swap Failed Своп не был завершен - + Unknown Неизвестно - + Unknown State Статус неизвестен - + Started Начат - + Negotiated Согласован - + Taker fee sent Комиссия тейкера отправлена - + Maker payment received Платеж мейкера получен - + Maker payment wait confirm started Ожидание платежа мейкера - + Maker payment validated and confirmed Платеж мейкера валидирован и подтвержден - + Taker payment sent Платеж тейкера отправлен - + Taker payment spent Платеж тейкера потрачен - + Maker payment spent Платеж мейкера потрачен - + Finished Завершено - + Start failed Не удалось начать - + Negotiate failed Согласование не прошло - + Taker fee validate failed Валидация комиссии тейкера не прошла - + Maker payment transaction failed Платежная транзакция мейкера не прошла - + Maker payment Data send failed Отправка платежных данных мейкера не прошла - + Maker payment wait confirm failed Платежная транзакция мейкера не была подтверждена - + Taker payment validate failed Не прошла валидация платежа тейкера - + Taker payment wait confirm failed Платежная транзакция тейкера не была подтверждена - + Taker payment spend failed Spend платежа тейкера не прошел - + Maker payment wait refund started Ожидание возврата платежа мейкера - + Maker payment refunded Платеж мейкера возвращен - + Maker payment refund failed Возврат платежа мейкера не выполнен @@ -1083,7 +1101,7 @@ DexAppPasswordField - + Type password Введите пароль @@ -1384,7 +1402,7 @@ General - + %n day(s) %n день @@ -1393,7 +1411,7 @@ - + %nd day @@ -1403,7 +1421,7 @@ - + %nh hours @@ -1413,7 +1431,7 @@ - + %nm minutes @@ -1423,7 +1441,7 @@ - + %ns seconds @@ -1433,7 +1451,7 @@ - + %nms milliseconds @@ -1443,92 +1461,117 @@ - + - - - + <b>Taker tx fee:</b> - + <b>Dex tx fee:</b> - + <b>Dex fee:</b> - + <b>Maker tx fee:</b> - + + %1 balance is zero + + + + + Activating %1 (%2%) + + + + + Loading wallet... + + + + + Min: %1 + Мин: %1 + + + + Enter an amount + Введите количество + + + Trading Fee Торговая комиссия - + Minimum Trading Amount Минимальный объем сделки - + Wallet %1 already exists WALLETNAME Кошелек %1 уже существует - + %1 balance is lower than the fees amount: %2 %3 %1 баланс менее чем размер комиссий: %2 %3 - + Tradable (after fees) %1 balance is lower than minimum trade amount Торгуемый (после комиссий) баланс %1 - меньше минимальной суммы сделки - + Please fill the price field Пожалуйста, укажите цену - + Please fill the volume field - - + + Please wait for %1 to fully activate - - + + %1 volume is lower than minimum trade amount Сумма %1 меньше минимальной суммы сделки - - + + %1 needs to be enabled in order to use %2 %1 должен быть активным для использования %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions нужно пополнить баланс %1 для оплаты газа %2 транзакций - + Unknown Error Неизвестная ошибка @@ -1594,89 +1637,94 @@ Название кошелька - + Enter seed Введите сид-фразу - + Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue. - - + + i understand Я согласен - - + + я согласен - - + + je comprends - - + + entiendo - - + + anladım - - + + ich verstehe - + Ok Ок - + Allow custom seed Разрешить пользовательский формат сид-фразы - + <strong>Allow custom seed</strong> <strong>Разрешить произвольный seed</strong> - + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. Пользовательские исходные фразы могут быть менее безопасными и их легче взломать, чем сгенерированные исходные фразы или закрытый ключ (WIF), совместимые с BIP39.<br><br>Чтобы подтвердить, что вы понимаете риск и знаете, что делаете, введите <strong>'Я согласен'</strong> в поле ниже. - + I understand Я согласен - + Next Далее - + + Enter password + + + + Enter the same password to confirm Введите тот же пароль для подтверждения - + Continue Продолжить @@ -1720,10 +1768,15 @@ Try again or select 'Allow custom seed' to continue. ListDelegate - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 не активирован -Вы хотите активировать этот %2 актив чтобы видеть лучшие ордеры для него ?<br><a href='#'>Да</a> - <a href='#no'>Нет</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 @@ -1764,17 +1817,17 @@ Try again or select 'Allow custom seed' to continue. Login - + Incorrect Password Неправильный пароль - + Log In - + Cancel Отменить @@ -1817,181 +1870,152 @@ They will be removed from the orderbook until you log in again. Main - - Segwit - Segwit - - - - Confirmation - Подтверждение - - - - Do you want to send your %1 funds to %2 wallet first? - Хотели бы вы сначала отправить ваши %1 средства на кошелек %2? - - - - Success - Успех - - - - Your transaction is send, may take some time to arrive - Ваша транзакция была отправлена, получение может занять какое-то время - - - + Price Цена - + Change 24hr - - Porfolio - - - - + Contract Address - + Send Отправить - + Enable %1 ? Активировать %1 ? - + Yes Да - + No Нет - + Receive Получить - + + Swap Обменять - + + Portfolio + Портфолио + + + is wallet only - + Rewards Награды - + Faucet Фаусет - - - + + + Public Key - + Copied to Clipboard Скопировано в буфер обмена - + Loading market data Загрузка рыночных данных - + There is no chart data for this ticker yet Для данного актива пока еще нет графиков данных - + Fetching transactions... - + Please wait, %1 is %2 - + % activated... - + No transactions available - + Click to view your address on %1 (%2) block explorer - - Trade - торговля - - - + Trading Information Торговая информация - + Chart График - - + + Orders Ордеры - - + + History История - + Place Order Разместить ордер - + Order Selected Ордер выбран - + START SWAP НАЧАТЬ ОБМЕН @@ -2045,13 +2069,13 @@ They will be removed from the orderbook until you log in again. MarketModeSelector - + Sell %1 TICKER - + Buy %1 TICKER @@ -2104,17 +2128,17 @@ They will be removed from the orderbook until you log in again. NewContactPopup - + Contact name - + This contact name already exists. Контакт с таким именем уже существует. - + + ADD @@ -2231,67 +2255,72 @@ They will be removed from the orderbook until you log in again. Задайте пароль - + Important: Back up your seed phrase before proceeding! Важно: убедитесь, что вы сохранили ваш seed ключ, прежде чем продолжить! - + We recommend storing it offline. Мы рекумендуем хранить его офлайн. - + Generated Seed Сгенерированный seed ключ - + Seed phrase Seed фраза - + copied to clipboard скопировано в буфер - + Next Далее - + Let's double check your seed phrase Давайте перепроверим ваш seed ключ - + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. Ваш seed ключ важен, и поэтому мы хотим убедиться, что вы его сохранили. Мы зададим вам три разных вопроса о вашем seed ключе, чтобы убедиться, что вы сможете легко восстановить свой кошелек, когда захотите. - + Enter the - + word - + Check Проверить - + + Enter password + + + + Enter the same password to confirm Введите тот же пароль для подтверждения - + Continue Продолжить @@ -2406,6 +2435,11 @@ They will be removed from the orderbook until you log in again. Your wallet balance changed Баланс вашего кошелька изменился + + + Close + Закрыть + %1 Enable status @@ -2425,49 +2459,49 @@ They will be removed from the orderbook until you log in again. - + Failed to disable %1 TICKER - + Endpoint not reachable Эндпоинт не доступен - + Could not reach to endpoint Не удалось подключиться - + Show Показать - + Restart Перезапустить - + Quit Выйти - + Notifications - + There aren't any notifications - + Mark all as read Отметить все как прочитанные @@ -2475,97 +2509,92 @@ They will be removed from the orderbook until you log in again. OrderForm - + Price Цена - + Reduce 1% relative to CEX market price. - + Use CEX market price. - + Increase 1% relative to CEX market price. - - Volume - Объем - - - - Amount to sell - Сумма для продажи + + Send + Отправить - - Amount to receive - Получаемая сумма + + Receive + Получить - + Max Макс - + Swap 25% of your tradable balance. - + Swap 50% of your tradable balance. - + Swap 100% of your tradable balance. - + Min Volume - + Min amount to sell - + Min amount to receive - + Minimum accepted trade equals 10% of order volume. - + Minimum accepted trade equals 25% of order volume. - + Minimum accepted trade equals 50% of order volume. - + Min volume: Мин. объем: - + Use custom minimum trade amount Задать минимальный объем сделки @@ -2589,114 +2618,104 @@ They will be removed from the orderbook until you log in again. OrderModal - - Swap Details - Детали свопа - - - - Order Details - Детали ордера - - - + Order Type - + Maker Order Мейкер ордер - + Taker Order Тейкер ордер - + Refund State Статус рефанда - + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back Обмен не был завершен, но процесс автоматического рефанда уже начался. Пожалуйста, подождите, оставляя приложение открытым, пока вы не получите свои средства - + Date Дата - + Error ID ID ошибки - - + + Error Log Лог ошибки - + Close Закрыть - + Cancel Order Отменить ордер - - + + Swap ID ID обмена - + Maker Payment Sent Transaction ID - + Maker Payment Spent Transaction ID - + Maker Payment TXID - + Taker Payment Spent Transaction ID - + Taker Payment Sent Transaction ID - + Taker Payment TXID - + Recover Funds Восстановить средства - + Refunding... Возмещается... - + View on Explorer Показать в эксплорере @@ -2723,43 +2742,43 @@ Please select a new order. OrdersPage - + From От - + To Кому - + Export CSV Скачать CSV - + Filter Фильтр - + Date Дата - + Apply Filter Применить фильтр - + Cancel All - + Please choose the CSV export name and location Выберите название и расположение загружаемого файла @@ -2832,7 +2851,7 @@ Please select a new order. Portfolio - ADD ASSET + ADD CRYPTO @@ -2841,12 +2860,12 @@ Please select a new order. Поиск актива - + Show only coins with balance Показывать только монеты с балансом - + (%1/%2) (%1/%2) @@ -2932,12 +2951,12 @@ Please select a new order. ProView - + Failed to place the order Не удалось разместить ордер - + Placed the order Ордер размещен @@ -2985,7 +3004,7 @@ Please select a new order. RecoverSeedModal - + View seed and private keys Показать seed-фразу и приватные ключи @@ -2995,64 +3014,64 @@ Please select a new order. Введите пароль для отображения seed ключа. - + Seed - + Backup Seed - + Public Address copied to clipboard - + Cancel Отменить - + Incorrect Password Неправильный пароль - - + + copied to clipboard скопировано в буфер - - + + RPC Password RPC Пароль - + Search a coin. Поиск актива. - + Public Address Публичный адрес - + Private Key copied to clipboard - + Private Key Приватный ключ - + View Показать @@ -3078,17 +3097,17 @@ Please select a new order. RestartModal - + Applying the changes... Применяю изменения... - + Restarting the application... Перезапуск приложения... - + Restarting the application. %1 Перезапуск приложения. %1 @@ -3122,162 +3141,172 @@ Please select a new order. SendModal - + Failed to send Ошибка отправки - + Prepare to send Подготовить к отправке - + Address of the recipient Адрес получателя - + Amount to send Сумма для отправки - + Gas price Цена газа - + Cancel - + Recipient's address Адрес получателя - + The address has to be mixed case. Адрес должен быть написан в смешанном регистре. - + Failed to Broadcast - + Fix Фикс - + MAX МАКС - + Fiat amount: Unavailable - + Fiat amount: %1 - + %1 amount: %2 - + Specify in Fiat - + Specify in Crypto - + + Enter memo + + + + Enable Custom Fees Включить настройку комиссий - + Enter the custom fee Введите комиссию сети - + Gas Limit Gas лимит - + Custom Fee can't be higher than the amount Комиссия не может больше общей суммы транзакции - + Not enough funds. Недостаточно средств. - - + + You have %1 AMT TICKER У вас %1 - - + + Only use custom fees if you know what you are doing! - + Prepare Подготовка - - + + Send Отправить - + %1 address TICKER - + copied to clipboard. - + Amount Сумма - + + Memo + + + + Fees Комиссия - + Date Дата - + Back Назад @@ -3363,11 +3392,16 @@ Please select a new order. + Memo + + + + Fees Комиссия сети - + Date Дата @@ -3377,12 +3411,12 @@ Please select a new order. Хэш транзакции - + Close Закрыть - + View on Explorer Смотреть в эксплорере @@ -3390,8 +3424,8 @@ Please select a new order. SettingModal - - + + Cancel Отмена @@ -3426,191 +3460,196 @@ Please select a new order. О программе - + Enable Desktop Notifications Включить уведомления для рабочего стола - + + Hide Poison Transactions in History + + + + Maximum number of enabled coins Макс. количество активированных монет - + Logs Логи - + Open Folder Открыть папку с логами - - + + Reset wallet configuration Сбросить конфигурацию кошелька - + This will restart your wallet with default settings Эта опция перезапустит ваш кошелек с настройками по умолчанию - - + + Confirm Подтвердить - + Changing theme to %1 Изменить тему на %1 - + Disable 2FA? - + Enter your wallet password to confirm - + Type password Введите пароль - + 2FA status - + 2FA disabled successfully - - + + Ok Ок - + Wrong password! - + Wallet password is incorrect - + Application Version - + copied to clipboard скопировано в буфер - + Reset Сбросить - + Current Font Текущий шрифт - + Current font changed to %1. Текущий шрифт изменен на %1. - + Theme Тема - + Ask system's password before sending coins ? (2FA) Спрашивать системный пароль перед отправкой монет? (2FA) - + Application version Версия приложения - + MM2 version Версия MM2 - + MM2 Version Версия MM2 - + MM2 Version copied to clipboard. Версия MM2 скопирована в буфер обмена. - + Qt version Версия Qt - + Qt Version Версия Qt - + Qt Version copied to clipboard. Версия Qt скопирована в буфер обмена. - + Search Update Проверить на обновления - + Logout Выход - + View seed and private keys Показать seed-фразу и приватные ключи - - + + Show Показать - + Setup Camouflage Password Установить камуфляжный пароль - + Open Установить - + Disclaimer and ToS Дисклеймер и Условия Использования @@ -3618,27 +3657,14 @@ Please select a new order. Sidebar - + Search Поиск - Add asset - Добавить крипто актив - - - - SmartChartView - - - Loading market data - Загрузка рыночных данных - - - - There is no chart data for this ticker yet - Для этого графика пока еще нет данных + ADD CRYPTO + @@ -3669,10 +3695,15 @@ Please select a new order. CEX цена - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 не активирован -Вы хотите активировать этот %2 актив чтобы видеть лучшие ордеры для него ?<br><a href='#'>Да</a> - <a href='#no'>Нет</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + SubCoinSelector @@ -3769,7 +3800,7 @@ Please select a new order. SubOrders - + Orders Ордеры @@ -3814,12 +3845,12 @@ Please select a new order. Отменить - + Apply filter Применить фильтр - + No results found Не найдено результатов @@ -3898,62 +3929,78 @@ Network fees can vary greatly depending on your selected trading pair. - + + I see a transaction in my wallet that was marked as 'poison'. What does this mean? + + + + + Address poisoning is a relatively new tye of phishing attack, where a malicious actor aims to trick you into sending funds to an address that you did not intend to send funds to. + +This is often done by sending a zero value transaction to your wallet from an address which looks very similar to your actual address, with the exact same letters at the start and end. This transaction will then appear in your transaction history, with the scammer hoping you will mistake the fake address for your own and send funds to it. + +To protect you from this, %1 will mark any transaction that it detects as potentially being a poison transaction with a "poison" label. You should always be careful to confirm any address you send funds to is correct. + +There is a toggle in settings where you can turn on/off the display of these transactions. + + + + Do you provide user support? Предоставляете ли вы поддержку пользователей? - + Yes! %1 offers support through the <a href="%2">%1 Discord server</a>. The team and the community are always happy to help! Да! %1 предоставляет саппорт через <a href="%2">%1 Discord сервер</a>. Команда и сообщество проекта всегда рады помочь! - + Who is behind %1? Кто создал %1? - + %1 is developed by the Komodo team. Komodo is one of the most established blockchain projects working on innovative solutions like atomic swaps, Delayed Proof of Work, and an interoperable multi-chain architecture. %1 разрабатывается командой Komodo. Komodo один из наиболее известных блокчейн проектов который работает над такими инновационными решениями как Атомарные Свопы, "Отложенный" PoW, а также над совместимой мульти-чейн архитектурой. - + Is it possible to develop my own white-label exchange on %1? Возможно ли разработать децентрализованную биржу с моим брендом на %1? - + Absolutely! You can read our developer documentation for more details or contact us with your partnership inquiries. Have a specific technical question? The %1 developer community is always ready to help! Обязательно! Вы можете прочитать нашу документацию для разработчиков для более детального ревью или же связаться с нашей командой по поводу партнерства. Есть очень специфичный технический вопрос? %1 наше комьюнити разработчиков всегда готово помочь! - + Which devices can I use %1 on? На каких устройствах я могу использовать %1 ? - + %1 is available for mobile on both <a href="%2">Android and iPhone, and for desktop on Windows, Mac, and Linux</a> operating systems. %1 доступен для Android и iOS мобильных устройв <a href="%2">, и для операционных систем Windows, Mac и Linux</a> на PC. - + Compliance Info Комплаенс информация - + Due to regulatory and legal circumstances the citizens of certain jurisdictions including, but not limited to, the United States of America, Canada, Hong Kong, Israel, Singapore, Sudan, Austria, Iran and any other state, country or other jurisdiction that is embargoed by the United States of America or the European Union are not allowed to use this application. В связи с нормативными и правовыми обстоятельствами граждане определенных юрисдикций, включая, помимо прочего, Соединенные Штаты Америки, Канаду, Гонконг, Израиль, Сингапур, Судан, Австрию, Иран и любые другие государства, страны или другие юрисдикции, на которые введено эмбарго. Соединенных Штатов Америки или Европейского Союза не могут использовать это приложение. - + Changelog Журнал изменений - + Open Logs Folder Открыть папку с логами @@ -4023,157 +4070,138 @@ Network fees can vary greatly depending on your selected trading pair. Нажмите, чтобы узнать подробности + + TotalView + + + Receive %1 + + + + + Send %1 + + + Trade - + Swap Обменять - + Instant trading with best orders Быстрая торговля с лучшими ордерами - + Reset form - + You have no tradable assets - + From От - - Enter an amount - Введите количество + + Entered amount must be higher than 0. + - + + Select an order. + + + + MAX МАКС - + To Получатель - + Pick an order Выберите ордер - + Price Цена - + Better price found: %1. Updating forms. Найдена цена лучше: %1.Обновляю форму. - + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. Лучшая цена (%1) была обнаружена но количество (%2) меньше чем в вашем текущем ордере (%3).Нажмите чтобы обновить выбранный ордер. - + %1 %1 - - Tradable: - Доступно: - - - - Min: %1 - Мин: %1 + + Balance: + - + Pick a coin Выберите монету - + SWAP NOW - + Failed to place the order Не удалось разместить ордер - + Placed the order Ордер размещен - - Entered amount must be superior than 0. - Введенная сумма должна быть больше 0. - - - - You must select an order. - Вы должны выбрать ордер. - - - - Entered amount is below the minimum required by this order: %1 - Введнная сумма меньше минимальной для этого ордера: %1 - - - - - %1 needs to be enabled in order to use %2 - %1 должен быть активным для использования %2 - - - - - %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - нужно пополнить баланс %1 для оплаты газа %2 транзакций - - - - %1 balance does not have enough funds to pay the gas of %2 transactions - - - - + No buy orders found for %1. Не найдено ордеров на покупку дл] %1. - + You can check later or try to sell a different coin. Вы можете попробовать позже или попробовать продать другой актив. - + Calculating fee estimate... - + Total %1 fees: Всего %1 комиссий: - + %2 (%3) %2 (%3) @@ -4216,91 +4244,114 @@ Network fees can vary greatly depending on your selected trading pair. Разместить ордер + + TradingViewChart + + + Loading market data + Загрузка рыночных данных + + + + There is no chart data for this ticker yet + Для данного актива пока еще нет графиков данных + + TransactionDetailsModal - + Transaction Details Детали транзакции - + + This transaction has been identified as a potential address poisoning attack. + + + + + Please see the Support FAQ for more information. + + + + %1 txid TICKER - + copied to clipboard. - + Amount Сумма - + Fees Комиссия сети - + From address - + To address - + Date Дата - + Unconfirmed Не подтверждена - + Transaction Hash Хэш транзакции - + Confirmations Подтверждения - + Block Height Блок - + From От - + To Получатель - + Notes Заметки - + Close Закрыть - + View on Explorer Смотреть в эксплорере @@ -4308,22 +4359,27 @@ Network fees can vary greatly depending on your selected trading pair. Transactions - + Received Получено - + Sent Отправлено - + + Poison + + + + fees комиссии - + Unconfirmed Не подтверждена @@ -4457,7 +4513,7 @@ This might take a few minutes... atomic_dex::settings_page - + An error has occurred. @@ -4480,47 +4536,47 @@ This might take a few minutes... Вам нужен %1 для оплаты газа за %2 транзакции. - + Checksum verification failed for %1. Checksum верфикация неуспешна для %1. - + Invalid checksum for %1. Click the button to convert to mixed case address. - + Legacy address used for %1. Click the button to convert to a Cashaddress. - + %1 address must be prefixed with 0x %1 адрес должен начинаться с 0x - + %1 address length is invalid, please use a valid address. %1 длина адреса не валидна, пожалуйста используйте валидный адрес. - + %1 address is invalid. некорректный адрес %1. - + Invalid checksum. Неверная чек-сумма. - + %1 address has invalid prefixes. у адреса %1 неверный префикс. - + Backend error: %1 Ошибка бэкенда: %1 @@ -4533,7 +4589,7 @@ This might take a few minutes... Выход - + Balance Баланс diff --git a/atomic_defi_design/assets/languages/atomic_defi_tr.ts b/atomic_defi_design/assets/languages/atomic_defi_tr.ts index d4fe94d9c5..388a76a257 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_tr.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_tr.ts @@ -4,53 +4,53 @@ AddAddressForm - + Use standard network address - + Label - + This key already exists. Bu anahtar zaten mevcut. - + Address Adres - - + + Cancel İptal - + Convert - + Edit Düzenle - + Add Ekle - + You need to enable %1 before adding this kind of address. - + Enable Etkinleştir @@ -233,7 +233,7 @@ App - + Recover Funds Result Fon Kurtarma Sonucu @@ -307,7 +307,7 @@ - + Price provider is: %1 @@ -315,68 +315,73 @@ Bottom - + + Add Crypto + + + + Settings Ayarlar - + Support Destek - + Privacy Gizlilik - + Disable Privacy? - + Enter wallet password to confirm - + Type password - + Confirm Onayla - + Cancel İptal - + Privacy status - + Privacy mode disabled successfully - - + + Ok Tamam - + Wrong password! - + wallet password is incorrect @@ -494,21 +499,34 @@ - Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> - ⓘ simgesiyle işaretlenen piyasa verileri (fiyatlar, grafikler vb.) üçüncü taraf kaynaklardan alınmıştır. .<br><br>Veriler kaynakları: <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> ve <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Son referans (Band Oracle):</b><br><a href="%2">%2</a> + Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://coingecko.com">CoinGecko</a>. + ⓘ simgesiyle işaretlenen piyasa verileri (fiyatlar, grafikler vb.) üçüncü taraf kaynaklardan alınmıştır. .<br><br>Veriler kaynakları: <a href="https://coingecko.com">CoinGecko</a>. Chart - + Loading market data Piyasa bilgisi yükleniyor - - There is no chart data for this pair yet - Bu parite için henüz grafik verisi yok + + There is no chart data for this pair + + + + + There is no chart data for %1 (testcoin) pairs + + + + + ClaimFaucetResultModal + + + Close + Kapat @@ -732,83 +750,83 @@ ConfirmTradeModal - + Confirm Exchange Details Al-Sat Detaylarını Onayla - + This swap request can not be undone and is a final event! Bu takas isteği geri döndürülemez! - + Security configuration Güvenlik yapılandırması - + Read more about dPoW dPoW hakkında daha fazla bilgi - + Use custom protection settings for incoming %1 transactions TICKER %1 işlemleri için özel güvenlik ayarları kullan - + Enable Komodo dPoW security Komodo dPoW güvenliğini etkinleştir - + %1 confirmations for incoming %2 transactions Gelen %2 işlemleri için %1 onay - + This transaction can take up to 60 mins - DO NOT close this application! Bu işlem 60 dakikayı bulabilir - Programı KAPATMAYINIZ! - + Trade price is more than 50% different to CEX! Confirm? Takas ücreti CEX ile karşılaştırıldığında %50'den daha fazla farka sahip. Onaylıyor musunuz? - + Loading fees... - + <b>Total %1 fees:</b> <b>Toplam %1 işlem giderleri: </b> - + dPoW protected dPoW korumalı - + Required Confirmations Gereken Onaylar - + Warning, this atomic swap is not dPoW protected! Uyarı, bu atomik takas dPoW korumalı değil! - + Cancel İptal - + Confirm Onayla @@ -824,182 +842,182 @@ Dashboard - + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. Etkinleştirilmiş koinlerin mevcut sayısı yapılandırma ayarlarınızla eşleşmiyor. Varlık yapılandırmanız sıfırlanacak. - + Matching Eşleşiyor - + Order Matching Emir Eşleşiyor - + Matched Eşleşti - + Order Matched Emir Eşleşti - + Ongoing Devam ediyor - + Swap Ongoing Takas Devam Ediyor - + Successful Başarılı - + Swap Successful Takas Başarılı - + Refunding Geri ödeniyor - + Failed Başarısız - + Swap Failed Takas Başarısız - + Unknown Bilinmiyor - + Unknown State Bilinmeyen durum - + Started Başlatıldı - + Negotiated Pazarlık yapıldı - + Taker fee sent Alıcı ücreti gönderildi - + Maker payment received Yapıcı ödemesi alındı - + Maker payment wait confirm started Yapıcı ödemesi bekleme onayı başladı - + Maker payment validated and confirmed Yapıcı ödemesi doğrulandı ve onaylandı - + Taker payment sent Alıcı ödemesi gönderildi - + Taker payment spent Alıcı ödemesi harcandı - + Maker payment spent Yapıcı ödemesi harcandı - + Finished Tamamlandı - + Start failed Başlatılamadı - + Negotiate failed Pazarlık başarısız - + Taker fee validate failed Alıcı ücreti doğrulanamadı - + Maker payment transaction failed Yapıcı ödeme işlemi başarısız - + Maker payment Data send failed Yapıcı ödeme verileri gönderilemedi - + Maker payment wait confirm failed Yapıcı ödemesi bekleme onayı başarısız - + Taker payment validate failed Alıcı ödemesi doğrulanamadı - + Taker payment wait confirm failed Alıcı ödemesi bekleme onayı başarısız oldu - + Taker payment spend failed Alıcı ödeme harcaması başarısız oldu - + Maker payment wait refund started Yapıcı ödemesi bekleme iadesi başladı - + Maker payment refunded Yapıcı ödemesi iade edildi - + Maker payment refund failed Yapıcı ödeme iadesi başarısız @@ -1083,7 +1101,7 @@ DexAppPasswordField - + Type password @@ -1384,14 +1402,14 @@ General - + %n day(s) %n gün - + %nd day @@ -1399,7 +1417,7 @@ - + %nh hours @@ -1407,7 +1425,7 @@ - + %nm minutes @@ -1415,7 +1433,7 @@ - + %ns seconds @@ -1423,7 +1441,7 @@ - + %nms milliseconds @@ -1431,92 +1449,117 @@ - + - - - + <b>Taker tx fee:</b> - + <b>Dex tx fee:</b> - + <b>Dex fee:</b> - + <b>Maker tx fee:</b> - + + %1 balance is zero + + + + + Activating %1 (%2%) + + + + + Loading wallet... + + + + + Min: %1 + + + + + Enter an amount + Bir miktar gir + + + Trading Fee Takas Ücreti - + Minimum Trading Amount Minimum Takas Hacmi - + Wallet %1 already exists WALLETNAME %1 cüzdanı zaten mevcut - + %1 balance is lower than the fees amount: %2 %3 %1 bakiye ücret tutarının altında: %2 %3 - + Tradable (after fees) %1 balance is lower than minimum trade amount Takas edilebilir (ücretlerden sonra)%1 bakiyesi minimum işlem ücretinden düşük - + Please fill the price field Lütfen fiyat alanını doldurun - + Please fill the volume field - - + + Please wait for %1 to fully activate - - + + %1 volume is lower than minimum trade amount %1 hacmi, minimum işlem ücretinden düşük - - + + %1 needs to be enabled in order to use %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - + Unknown Error Bilinmeyen Hata @@ -1582,89 +1625,94 @@ Cüzdan Adı - + Enter seed - + Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue. - - + + i understand Anladım - - + + я согласен - - + + je comprends - - + + entiendo - - + + anladım - - + + ich verstehe - + Ok Tamam - + Allow custom seed Özel Seed'e izin ver - + <strong>Allow custom seed</strong> - + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. Özel çekirdek tümceler, oluşturulmuş bir BIP39 uyumlu çekirdek sözcük grubu veya özel anahtara (WIF).<br><br> Riski anladığınızı ve ne yaptığınızı bildiğinizi doğrulamak için lütfen aşağıdaki kutuya <strong>'Anladım'</strong> yazın. - + I understand Anladım - + Next İleri - + + Enter password + + + + Enter the same password to confirm Doğrulamak için aynı parolayı giriniz - + Continue Devam @@ -1708,10 +1756,15 @@ Try again or select 'Allow custom seed' to continue. ListDelegate - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 etkin değil - En iyi %2 siparişini seçebilmesi için etkinleştirmek istiyor musunuz ? <br><a href='#'>Evet</a> - <a href='#no'>Hayır</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 @@ -1752,17 +1805,17 @@ Try again or select 'Allow custom seed' to continue. Login - + Incorrect Password Yanlış Parola - + Log In - + Cancel İptal @@ -1805,181 +1858,152 @@ They will be removed from the orderbook until you log in again. Main - - Segwit - - - - - Confirmation - - - - - Do you want to send your %1 funds to %2 wallet first? - - - - - Success - - - - - Your transaction is send, may take some time to arrive - - - - + Price Fiyat - + Change 24hr - - Porfolio - - - - + Contract Address - + Send Gönder - + Enable %1 ? %1 Etkinleştirilsin mi ? - + Yes Evet - + No Hayır - + Receive Al - + + Swap Takasla - + + Portfolio + + + + is wallet only - + Rewards - + Faucet Musluk - - - + + + Public Key - + Copied to Clipboard Panoya Kopyalandı - + Loading market data Piyasa bilgisi yükleniyor - + There is no chart data for this ticker yet Henüz bu hisse senedi için grafik verisi yok - + Fetching transactions... - + Please wait, %1 is %2 - + % activated... - + No transactions available - + Click to view your address on %1 (%2) block explorer - - Trade - Al Sat - - - + Trading Information Al Sat Bilgisi - + Chart Grafik - - + + Orders Emirler - - + + History Tarihçe - + Place Order Emir Ver - + Order Selected Emir Seçildi - + START SWAP Takası başlat @@ -2033,13 +2057,13 @@ They will be removed from the orderbook until you log in again. MarketModeSelector - + Sell %1 TICKER - + Buy %1 TICKER @@ -2092,17 +2116,17 @@ They will be removed from the orderbook until you log in again. NewContactPopup - + Contact name - + This contact name already exists. Bu kişi adı zaten mevcut. - + + ADD @@ -2219,67 +2243,72 @@ They will be removed from the orderbook until you log in again. - + Important: Back up your seed phrase before proceeding! Önemli: Devam etmeden önce seed kelimelerinizi yedekleyin! - + We recommend storing it offline. Çevrimdışı saklamanızı öneririz. - + Generated Seed Seed Oluştur - + Seed phrase - + copied to clipboard - + Next İleri - + Let's double check your seed phrase Seed kelimelerinizi tekrar kontrol edelim - + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. Seed kelimeleriniz önemlidir - bu yüzden doğru olduğundan emin olmak istiyoruz. Cüzdanınızı istediğiniz zaman kolayca kurtarabileceğinizden emin olmak için seed kelimeleriniz hakkında üç farklı soru soracağız. - + Enter the - + word - + Check - + + Enter password + + + + Enter the same password to confirm Doğrulamak için aynı parolayı giriniz - + Continue Devam @@ -2394,6 +2423,11 @@ They will be removed from the orderbook until you log in again. Your wallet balance changed Cüzdan bakiyeniz değişti + + + Close + Kapat + %1 Enable status @@ -2413,49 +2447,49 @@ They will be removed from the orderbook until you log in again. - + Failed to disable %1 TICKER - + Endpoint not reachable Uç nokta ulaşılabilir değil - + Could not reach to endpoint Uç noktaya ulaşılamadı - + Show Göster - + Restart Yeniden Başlat - + Quit Çık - + Notifications - + There aren't any notifications - + Mark all as read @@ -2463,100 +2497,95 @@ They will be removed from the orderbook until you log in again. OrderForm - - Amount to sell - Satılacak miktar + + Send + Gönder - - Amount to receive - Alınacak miktar + + Receive + Al - + Max Maks - + Swap 25% of your tradable balance. - + Swap 50% of your tradable balance. - + Swap 100% of your tradable balance. - + Min Volume - + Min amount to sell - + Min amount to receive - + Minimum accepted trade equals 10% of order volume. - + Minimum accepted trade equals 25% of order volume. - + Minimum accepted trade equals 50% of order volume. - + Min volume: - + Use custom minimum trade amount - + Price Fiyat - + Reduce 1% relative to CEX market price. - + Use CEX market price. - + Increase 1% relative to CEX market price. - - - Volume - Hacim - OrderLine @@ -2577,114 +2606,104 @@ They will be removed from the orderbook until you log in again. OrderModal - - Swap Details - Takas Detayları - - - - Order Details - Emir Detayları - - - + Order Type - + Maker Order Yapıcı Emri - + Taker Order Alıcı Emri - + Refund State Geri Ödeme Durumu - + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back Takas işlemi başarısız oldu, ancak otomatik geri ödeme süreci başladı. Lütfen bekleyin ve ödemenizi geri alana kadar uygulamayı açık tutun - + Date Tarih - + Recover Funds Fon Kurtar - + Refunding... - + View on Explorer Explorer'da Göster - + Cancel Order Emri İptal Et - + Error ID Hata ID - - + + Swap ID - + Maker Payment Sent Transaction ID - + Maker Payment Spent Transaction ID - + Maker Payment TXID - + Taker Payment Spent Transaction ID - + Taker Payment Sent Transaction ID - + Taker Payment TXID - - + + Error Log Hata Kaydı - + Close Kapat @@ -2711,43 +2730,43 @@ Please select a new order. OrdersPage - + From Gönderen - + To Alan - + Apply Filter Filtreyi Uygula - + Filter - + Date Tarih - + Export CSV CSV'yi dışa aktar - + Cancel All - + Please choose the CSV export name and location Lütfen CSV dışa aktarma adını ve konumunu seçin @@ -2820,7 +2839,7 @@ Please select a new order. Portfolio - ADD ASSET + ADD CRYPTO @@ -2829,12 +2848,12 @@ Please select a new order. - + Show only coins with balance Sadece bakiyesi olan koinleri göster - + (%1/%2) @@ -2920,12 +2939,12 @@ Please select a new order. ProView - + Failed to place the order Emir başarısız oldu - + Placed the order Emir başarılı @@ -2973,7 +2992,7 @@ Please select a new order. RecoverSeedModal - + View seed and private keys Seed ve özel anahtarları görüntüle @@ -2983,64 +3002,64 @@ Please select a new order. Seed'i görmek için lütfen parolanızı giriniz. - + Seed - + Backup Seed - + Public Address copied to clipboard - + Cancel İptal - + Incorrect Password Yanlış Parola - - + + copied to clipboard - - + + RPC Password RPC Parolası - + Search a coin. Koin ara. - + Public Address Public Adres - + Private Key copied to clipboard - + Private Key Private Key - + View Görüntüle @@ -3066,17 +3085,17 @@ Please select a new order. RestartModal - + Applying the changes... Değişiklikler uygulanıyor... - + Restarting the application... Uygulama yeniden başlatılıyor... - + Restarting the application. %1 @@ -3110,162 +3129,172 @@ Please select a new order. SendModal - + Failed to send Gönderilemedi - + Prepare to send Göndermeye hazırlanıyor - + Address of the recipient - + Amount to send - + Gas price - + Cancel İptal - + Recipient's address Alıcı adresi - + The address has to be mixed case. Adres, büyük-küçük harf karışık olmalıdır. - + Failed to Broadcast - + Fix Düzelt - + MAX MAKS - + Fiat amount: Unavailable - + Fiat amount: %1 - + %1 amount: %2 - + Specify in Fiat - + Specify in Crypto - + + Enter memo + + + + Enable Custom Fees Özel İşlem Ücretlerini Etkinleştir - + Enter the custom fee Özel ücreti giriniz - + Gas Limit Gas Limiti - + Custom Fee can't be higher than the amount Özel İşlem Ücreti takas miktarından daha yüksek olamaz - + Not enough funds. Yetersiz bakiye. - - + + You have %1 AMT TICKER %1'niz var - - + + Only use custom fees if you know what you are doing! - + Prepare Hazırla - - + + Send Gönder - + %1 address TICKER - + copied to clipboard. - + Amount Miktar - + + Memo + + + + Fees İşlem Ücreti - + Date Tarih - + Back Geri @@ -3351,11 +3380,16 @@ Please select a new order. + Memo + + + + Fees İşlem Ücreti - + Date Tarih @@ -3365,12 +3399,12 @@ Please select a new order. İşlem Hash'i - + Close Kapat - + View on Explorer Explorer'da göster @@ -3378,8 +3412,8 @@ Please select a new order. SettingModal - - + + Cancel İptal @@ -3414,191 +3448,196 @@ Please select a new order. - + Enable Desktop Notifications Masaüstü Bildirimlerini Aktif Et - + + Hide Poison Transactions in History + + + + Maximum number of enabled coins Maksimum etkin koin sayısı - + Logs Günlük Kaydı - + Open Folder Klasörü Aç - - + + Reset wallet configuration - + This will restart your wallet with default settings - - + + Confirm Onayla - + Changing theme to %1 - + Disable 2FA? - + Enter your wallet password to confirm - + Type password - + 2FA status - + 2FA disabled successfully - - + + Ok Tamam - + Wrong password! - + Wallet password is incorrect - + Application Version - + copied to clipboard - + Reset Sıfırla - + Current Font Geçerli Yazı Tipi - + Current font changed to %1. - + Theme Tema - + Ask system's password before sending coins ? (2FA) Para göndermeden önce sistem parolası sorulsun mu ? (2FA) - + Application version Uygulama sürümü - + MM2 version MM2 sürümü - + MM2 Version - + MM2 Version copied to clipboard. - + Qt version Qt sürümü - + Qt Version - + Qt Version copied to clipboard. - + Search Update Güncelleme Ara - + Logout Çıkış - + View seed and private keys Seed ve özel anahtarları görüntüle - - + + Show Göster - + Setup Camouflage Password Kamuflaj Parolasını Ayarla - + Open - + Disclaimer and ToS Sorumluluk Reddi ve K.Ş. @@ -3606,27 +3645,14 @@ Please select a new order. Sidebar - + Search Ara - Add asset - Varlık ekle - - - - SmartChartView - - - Loading market data - Piyasa bilgisi yükleniyor - - - - There is no chart data for this ticker yet - Henüz bu kontrat için grafik verisi yok + ADD CRYPTO + @@ -3657,10 +3683,15 @@ Please select a new order. CEX Oranı - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 etkin değil - En iyi %2 siparişini seçebilmesi için etkinleştirmek istiyor musunuz ? <br><a href='#'>Evet</a> - <a href='#no'>Hayır</a> + + + %1 is not enabled - Please enable it through the coin activation menu + + SubCoinSelector @@ -3757,7 +3788,7 @@ Please select a new order. SubOrders - + Orders Emirler @@ -3802,12 +3833,12 @@ Please select a new order. İptal - + Apply filter Filtreyi uygula - + No results found @@ -3886,62 +3917,78 @@ Network fees can vary greatly depending on your selected trading pair. - + + I see a transaction in my wallet that was marked as 'poison'. What does this mean? + + + + + Address poisoning is a relatively new tye of phishing attack, where a malicious actor aims to trick you into sending funds to an address that you did not intend to send funds to. + +This is often done by sending a zero value transaction to your wallet from an address which looks very similar to your actual address, with the exact same letters at the start and end. This transaction will then appear in your transaction history, with the scammer hoping you will mistake the fake address for your own and send funds to it. + +To protect you from this, %1 will mark any transaction that it detects as potentially being a poison transaction with a "poison" label. You should always be careful to confirm any address you send funds to is correct. + +There is a toggle in settings where you can turn on/off the display of these transactions. + + + + Do you provide user support? Kullanıcı desteği sağlıyor musunuz? - + Yes! %1 offers support through the <a href="%2">%1 Discord server</a>. The team and the community are always happy to help! - + Who is behind %1? %1 arkasında kim var? - + %1 is developed by the Komodo team. Komodo is one of the most established blockchain projects working on innovative solutions like atomic swaps, Delayed Proof of Work, and an interoperable multi-chain architecture. %1, Komodo ekibi tarafından geliştirilmiştir. Komodo, atomik takaslar, Gecikmeli Çalışma Kanıtı ve birlikte çalışabilir bir çok zincirli mimari gibi yenilikçi çözümler üzerinde çalışan en köklü blok zinciri projelerinden biridir. - + Is it possible to develop my own white-label exchange on %1? %1 üzerinde kendi markamla borsamı geliştirmem mümkün mü? - + Absolutely! You can read our developer documentation for more details or contact us with your partnership inquiries. Have a specific technical question? The %1 developer community is always ready to help! Kesinlikle! Daha fazla ayrıntı için geliştirici belgelerimizi okuyabilir veya ortaklık sorularınız için bizimle iletişime geçebilirsiniz. Belirli bir teknik sorunuz mu var? %1 geliştirici topluluğu her zaman yardıma hazır! - + Which devices can I use %1 on? %1 'i hangi cihazlarda kullanabilirim? - + %1 is available for mobile on both <a href="%2">Android and iPhone, and for desktop on Windows, Mac, and Linux</a> operating systems. - + Compliance Info Uyumluluk Bilgisi - + Due to regulatory and legal circumstances the citizens of certain jurisdictions including, but not limited to, the United States of America, Canada, Hong Kong, Israel, Singapore, Sudan, Austria, Iran and any other state, country or other jurisdiction that is embargoed by the United States of America or the European Union are not allowed to use this application. Düzenleyici ve yasal koşullar nedeniyle, Amerika Birleşik Devletleri, Kanada, Hong Kong, İsrail, Singapur, Sudan, Avusturya, İran ve Amerika Birleşik Devletleri veya Avrupa Birliği tarafından ambargo uygulanan diğer herhangi bir eyalet, ülke veya diğer bölge vatandaşlarının bu uygulamayı kullanmasına izin verilmez. - + Changelog Değişim günlüğü - + Open Logs Folder Günlük Kaydı Klasörünü Aç @@ -4011,157 +4058,138 @@ Network fees can vary greatly depending on your selected trading pair. Detayları görmek için buraya tıklayın + + TotalView + + + Receive %1 + + + + + Send %1 + + + Trade - + Swap Takasla - + Instant trading with best orders En iyi emirlerle anında alım satım - + Reset form - + You have no tradable assets - + From Gönderen - - Enter an amount - Bir miktar gir + + Entered amount must be higher than 0. + + + + + Select an order. + - + MAX MAKS - + To Alan - + Pick an order Emri seç - + Price Fiyat - + Better price found: %1. Updating forms. Daha iyi fiyat bulundu: %1. Formları güncelliyor. - + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. Daha iyi fiyat (%1) bulundu, ancak alınan miktar (%2) mevcut fiyattan (%3) daha düşük. Seçilen emri güncellemek için buraya tıklayın. - + %1 %1 - - Tradable: - Al sat yapılabilir: - - - - Min: %1 + + Balance: - + Pick a coin - + SWAP NOW - + Failed to place the order Emir başarısız oldu - + Placed the order Emir başarılı - - Entered amount must be superior than 0. - Girilen tutar 0'dan büyük olmalıdır. - - - - You must select an order. - Bir emir seçmelisiniz. - - - - Entered amount is below the minimum required by this order: %1 - Girilen miktar, bu emrin gerektirdiği minimum %1 tutarının altında - - - - - %1 needs to be enabled in order to use %2 - - - - - - %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - - - - - %1 balance does not have enough funds to pay the gas of %2 transactions - - - - + No buy orders found for %1. - + You can check later or try to sell a different coin. - + Calculating fee estimate... - + Total %1 fees: Toplam %1 işlem giderleri: - + %2 (%3) %2 (%3) @@ -4204,91 +4232,114 @@ Network fees can vary greatly depending on your selected trading pair. Emir Ver + + TradingViewChart + + + Loading market data + Piyasa bilgisi yükleniyor + + + + There is no chart data for this ticker yet + Henüz bu hisse senedi için grafik verisi yok + + TransactionDetailsModal - + Transaction Details İşlem Detayları - + + This transaction has been identified as a potential address poisoning attack. + + + + + Please see the Support FAQ for more information. + + + + %1 txid TICKER - + copied to clipboard. - + Amount Miktar - + Fees İşlem Ücreti - + From address - + To address - + Date Tarih - + Unconfirmed Onaylanmamış - + Transaction Hash İşlem Hash'i - + Confirmations Onay Sayısı - + Block Height Blok Uzunluğu - + From Gönderen - + To Alan - + Notes Notlar - + Close Kapat - + View on Explorer Explorer'da göster @@ -4296,22 +4347,27 @@ Network fees can vary greatly depending on your selected trading pair. Transactions - + Received Alınan - + Sent Gönderilen - + + Poison + + + + fees işlem ücretleri - + Unconfirmed Onaylanmamış @@ -4445,7 +4501,7 @@ This might take a few minutes... atomic_dex::settings_page - + An error has occurred. @@ -4468,47 +4524,47 @@ This might take a few minutes... %2 işlemi için gaz ödemek üzere %1'e sahip olmanız gerekir. - + Checksum verification failed for %1. %1 için sağlama toplamı doğrulaması başarısız oldu. - + Invalid checksum for %1. Click the button to convert to mixed case address. - + Legacy address used for %1. Click the button to convert to a Cashaddress. - + %1 address must be prefixed with 0x %1 adresinin önüne 0x konulmalı - + %1 address length is invalid, please use a valid address. %1 adres uzunluğu geçersiz, lütfen geçerli bir adres kullanın. - + %1 address is invalid. - + Invalid checksum. - + %1 address has invalid prefixes. - + Backend error: %1 @@ -4521,7 +4577,7 @@ This might take a few minutes... Çıkış - + Balance Bakiye diff --git a/atomic_defi_design/assets/languages/translations_matrix.csv b/atomic_defi_design/assets/languages/translations_matrix.csv index 37a934e80a..0960cf64dc 100644 --- a/atomic_defi_design/assets/languages/translations_matrix.csv +++ b/atomic_defi_design/assets/languages/translations_matrix.csv @@ -90,7 +90,7 @@ 474,Dex/Sidebar/Center.qml,,475,Address Book,476,Adressbuch,Libreta de direcciones,, 479,Dex/Sidebar/Center.qml,,480,Fiat,481,Fiat,Fiat,, 487,Dex/Components/CexInfoModal.qml,,488,Market Data,489,Marktdaten,Data de Mercado,, -492,Dex/Components/CexInfoModal.qml,,493,"Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a>",494,"Mit dem Symbol ⓘ gekennzeichnete Marktdaten (Kurse, Charts etc.) stammen aus Drittquellen.<br><br>Die Daten stammen von <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> und <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle unterstützte Paare:</b><br>%1<br><br><b>Letzte Referenz (Band Oracle):</b><br><a href="%2">%2</a>","Datos de mercado (precios, estadisticas, etc.) marcados con ⓘ se obtienen a través de fuentes terceras.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a>",, +492,Dex/Components/CexInfoModal.qml,,493,"Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://coingecko.com">CoinGecko</a>.",494,"Mit dem Symbol ⓘ gekennzeichnete Marktdaten (Kurse, Charts etc.) stammen aus Drittquellen.<br><br>Die Daten stammen von <a href="https://coingecko.com">CoinGecko</a>.","Datos de mercado (precios, estadisticas, etc.) marcados con ⓘ se obtienen a través de fuentes terceras.<br><br>Data is sourced via <a href="https://coingecko.com">CoinGecko</a>.",, 500,Dex/Exchange/ProView/Chart.qml,,501,Loading market data,502,Laden von Marktdaten,Cargando datos de mercado,, 505,Dex/Exchange/ProView/Chart.qml,,506,There is no chart data for this pair yet,507,Für dieses Paar liegen noch keine Chartdaten vor,Todavía no hay datos de gráficos para este par,, 513,Dex/Wallet/ClaimRewardsModal.qml,,514,Failed to prepare to claim rewards,515,Vorbereitung zum Einfordern von Belohnungen fehlgeschlagen,No se pudo preparar para reclamar recompensas,, diff --git a/ci_tools_atomic_dex/README.md b/ci_tools_atomic_dex/README.md index ccd2ff8e1f..366d249015 100644 --- a/ci_tools_atomic_dex/README.md +++ b/ci_tools_atomic_dex/README.md @@ -1,4 +1,4 @@ -# AtomicDEX Pro alpha build instructions +# Komodo Wallet Pro alpha build instructions ## Prerequisites @@ -68,7 +68,7 @@ git checkout curl-7_70_0 make install ``` -Installling libbitcoin: +Installing libbitcoin: ``` git clone --depth 1 --branch version5 --single-branch "https://github.com/KomodoPlatform/secp256k1" @@ -140,7 +140,7 @@ mv packages_commandline.json packages_official.json cd - ``` -## Build AtomicDEX Pro +## Build Komodo Wallet Pro Please clone with submodules initialization : `git clone --recurse-submodules --remote-submodules https://github.com/KomodoPlatform/atomicDEX-Pro.git` @@ -176,7 +176,7 @@ nimble build ./ci_tools_atomic_dex build release ``` -## Bundle AtomicDEX Pro +## Bundle Komodo Wallet Pro ### Windows @@ -202,7 +202,7 @@ nimble build -## Create AtomicDEX Pro Installer +## Create Komodo Wallet Pro Installer ### Windows @@ -229,7 +229,7 @@ chmod +x QtInstallerFramework-linux-x64.run e.g.: In `.bashrc` add: `export QT_IFW_PATH=~/Qt/QtIFW-3.2.2` -- Build AtomicDex Pro `./ci_tools_atomic_dex build release` +- Build Komodo Wallet Pro `./ci_tools_atomic_dex build release` - Run `ci_tools_atomic_dex\create_installer_linux.sh` script, pass build type as argument to script diff --git a/ci_tools_atomic_dex/ci_scripts/ATOMICDEXinstaller_script.iss b/ci_tools_atomic_dex/ci_scripts/ATOMICDEXinstaller_script.iss index 17d94e2837..e050f2f114 100644 --- a/ci_tools_atomic_dex/ci_scripts/ATOMICDEXinstaller_script.iss +++ b/ci_tools_atomic_dex/ci_scripts/ATOMICDEXinstaller_script.iss @@ -1,11 +1,11 @@ ; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! -#define MyAppName "AtomicDEX-Desktop" +#define MyAppName "Komodo-Wallet" #define MyAppVersion "0.5.0" #define MyAppPublisher "Komodo Platform" #define MyAppURL "https://www.komodoplatform.com/" -#define MyAppExeName "atomicdex-desktop.exe" +#define MyAppExeName "komodo-wallet.exe" #define MyUserName "smk" #define CommitHash "b2ce1cc" @@ -27,8 +27,8 @@ DisableProgramGroupPage=yes ;PrivilegesRequired=lowest ;PrivilegesRequiredOverridesAllowed=dialog OutputDir=C:\Users\{#MyUserName}\Documents\temp -OutputBaseFilename=atomicdex-desktop-{#MyAppVersion}-windows-installer -SetupIconFile=C:\Users\{#MyUserName}\Downloads\atomicdex-desktop-windows-10-qt-5-15-2-{#CommitHash}.zip\bin\assets\logo\dex-logo.ico +OutputBaseFilename=komodo-wallet-{#MyAppVersion}-windows-installer +SetupIconFile=C:\Users\{#MyUserName}\Downloads\komodo-wallet-windows-10-qt-5-15-2-{#CommitHash}.zip\bin\assets\logo\dex-logo.ico Compression=lzma SolidCompression=yes WizardStyle=modern @@ -43,8 +43,8 @@ Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl" Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] -Source: "C:\Users\{#MyUserName}\Downloads\atomicdex-desktop-windows-10-qt-5-15-2-{#CommitHash}.zip\bin\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion -Source: "C:\Users\{#MyUserName}\Downloads\atomicdex-desktop-windows-10-qt-5-15-2-{#CommitHash}.zip\bin\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "C:\Users\{#MyUserName}\Downloads\komodo-wallet-windows-10-qt-5-15-2-{#CommitHash}.zip\bin\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion +Source: "C:\Users\{#MyUserName}\Downloads\komodo-wallet-windows-10-qt-5-15-2-{#CommitHash}.zip\bin\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] diff --git a/ci_tools_atomic_dex/ci_scripts/GLEECDEXinstaller_script.iss b/ci_tools_atomic_dex/ci_scripts/GLEECDEXinstaller_script.iss index 9620861cdb..a2db7159fe 100644 --- a/ci_tools_atomic_dex/ci_scripts/GLEECDEXinstaller_script.iss +++ b/ci_tools_atomic_dex/ci_scripts/GLEECDEXinstaller_script.iss @@ -4,7 +4,7 @@ #define MyAppName "GleecDEX-Desktop" #define MyAppVersion "0.5.0" #define MyAppPublisher "Komodo Platform" -#define MyAppURL "https://github.com/KomodoPlatform/atomicDEX-Desktop" +#define MyAppURL "https://github.com/KomodoPlatform/komodo-wallet-desktop" #define MyAppExeName "GleecDEX.exe" #define MyUserName "smk" #define CommitHash "cc57ab3" diff --git a/ci_tools_atomic_dex/ci_scripts/linux_script.sh b/ci_tools_atomic_dex/ci_scripts/linux_script.sh index c6d84279ab..95d20d4f4a 100755 --- a/ci_tools_atomic_dex/ci_scripts/linux_script.sh +++ b/ci_tools_atomic_dex/ci_scripts/linux_script.sh @@ -2,8 +2,8 @@ sudo apt-get update # prevents repo404 errors on apt-remove below sudo apt-get remove php* msodbcsql17 mysql* -sudo apt-get update -sudo ACCEPT_EULA=Y apt-get upgrade -y +#sudo apt-get update +#sudo ACCEPT_EULA=Y apt-get upgrade -y # base deps sudo apt-get install build-essential \ libgl1-mesa-dev \ @@ -54,7 +54,7 @@ sudo cp -r * /usr/local/ cmake --version # get libwally -git clone https://github.com/KomodoPlatform/libwally-core.git +git clone https://github.com/KomodoPlatform/libwally-core.git --recurse-submodules cd libwally-core ./tools/autogen.sh ./configure --disable-shared diff --git a/ci_tools_atomic_dex/ci_scripts/osx_script.sh b/ci_tools_atomic_dex/ci_scripts/osx_script.sh index 949442963e..f47910cab6 100755 --- a/ci_tools_atomic_dex/ci_scripts/osx_script.sh +++ b/ci_tools_atomic_dex/ci_scripts/osx_script.sh @@ -31,7 +31,7 @@ export MACOSX_DEPLOYMENT_TARGET=10.15 #make -j3 install #cd ../ -git clone https://github.com/KomodoPlatform/libwally-core.git +git clone https://github.com/KomodoPlatform/libwally-core.git --recurse-submodules cd libwally-core ./tools/autogen.sh ./configure --disable-shared diff --git a/ci_tools_atomic_dex/ci_scripts/windows_script.ps1 b/ci_tools_atomic_dex/ci_scripts/windows_script.ps1 index c3b07f0f79..fce5224209 100644 --- a/ci_tools_atomic_dex/ci_scripts/windows_script.ps1 +++ b/ci_tools_atomic_dex/ci_scripts/windows_script.ps1 @@ -6,7 +6,7 @@ iwr -useb 'https://raw.githubusercontent.com/scoopinstaller/install/master/insta #Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh') -RunAsAdmin scoop install llvm --global scoop install ninja --global -scoop install cmake@3.22.0 --global +scoop install cmake@3.26.3 --global scoop install git --global scoop install 7zip --global scoop cache rm 7zip @@ -26,4 +26,5 @@ mkdir build cd build cmake -DCMAKE_BUILD_TYPE="$Env:CMAKE_BUILD_TYPE" -GNinja ../ + ninja install diff --git a/ci_tools_atomic_dex/ci_tools_atomic_dex.nimble b/ci_tools_atomic_dex/ci_tools_atomic_dex.nimble index b684a5b138..189a9d0ac4 100644 --- a/ci_tools_atomic_dex/ci_tools_atomic_dex.nimble +++ b/ci_tools_atomic_dex/ci_tools_atomic_dex.nimble @@ -2,7 +2,7 @@ version = "0.1.0" author = "romanszterg" -description = "AtomicDex CI utilities" +description = "Komodo Wallet CI utilities" license = "MIT" srcDir = "src" bin = @["ci_tools_atomic_dex"] diff --git a/ci_tools_atomic_dex/installer/osx/config/config.xml.in b/ci_tools_atomic_dex/installer/osx/config/config.xml.in index 7b601889c4..3662ef3bc5 100644 --- a/ci_tools_atomic_dex/installer/osx/config/config.xml.in +++ b/ci_tools_atomic_dex/installer/osx/config/config.xml.in @@ -1,7 +1,7 @@ ${DEX_DISPLAY_NAME} - 0.5.7 + @DEX_VERSION@ ${DEX_DISPLAY_NAME} Installer ${DEX_WEBSITE} ${DEX_COMPANY} diff --git a/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/meta/package.xml.in b/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/meta/package.xml.in index 06109f6ba9..a9487a11ad 100644 --- a/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/meta/package.xml.in +++ b/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/meta/package.xml.in @@ -2,8 +2,8 @@ ${DEX_DISPLAY_NAME} Install ${DEX_DISPLAY_NAME}. - 0.5.7 - 2022-11-09 + ${DEX_VERSION} + 2023-11-06 diff --git a/ci_tools_atomic_dex/installer/windows/config/config.xml.in b/ci_tools_atomic_dex/installer/windows/config/config.xml.in index 9fe11ef931..bf4f0848fa 100644 --- a/ci_tools_atomic_dex/installer/windows/config/config.xml.in +++ b/ci_tools_atomic_dex/installer/windows/config/config.xml.in @@ -1,7 +1,7 @@ @DEX_DISPLAY_NAME@ - 0.5.7 + @DEX_VERSION@ @DEX_DISPLAY_NAME@ Installer @DEX_WEBSITE@ @DEX_COMPANY@ diff --git a/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/installscript.qs.in b/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/installscript.qs.in index 204713cb6d..106dd0af5e 100644 --- a/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/installscript.qs.in +++ b/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/installscript.qs.in @@ -1,12 +1,12 @@ function Component() { - -} + // installer.gainAdminRights(); + component.loaded.connect(this, this.installerLoaded); +} Component.prototype.createOperations = function() { component.createOperations(); - if (installer.value("os") === "win") { // Start Menu Shortcut component.addOperation("CreateShortcut", @@ -32,4 +32,48 @@ Component.prototype.createOperations = function() "iconPath=@DEX_ICON_DIR@", "iconId=0", "description=Start @DEX_MAINTENANCE_TOOL_NAME@"); } +} + +Component.prototype.installerLoaded = function() +{ + installer.setDefaultPageVisible(QInstaller.TargetDirectory, false); + installer.addWizardPage(component, "TargetWidget", QInstaller.TargetDirectory); + + targetDirectoryPage = gui.pageWidgetByObjectName("DynamicTargetWidget"); + targetDirectoryPage.windowTitle = "Choose Installation Directory"; + targetDirectoryPage.description.setText("Please select where the app will be installed:"); + targetDirectoryPage.targetDirectory.textChanged.connect(this, this.targetDirectoryChanged); + targetDirectoryPage.targetDirectory.setText(installer.value("TargetDir")); + targetDirectoryPage.targetChooser.released.connect(this, this.targetChooserClicked); + + gui.pageById(QInstaller.ComponentSelection).entered.connect(this, this.componentSelectionPageEntered); +} + +Component.prototype.targetChooserClicked = function() +{ + var dir = QFileDialog.getExistingDirectory("", targetDirectoryPage.targetDirectory.text); + targetDirectoryPage.targetDirectory.setText(dir); +} + +Component.prototype.targetDirectoryChanged = function() +{ + var dir = targetDirectoryPage.targetDirectory.text; + if (installer.fileExists(dir) && installer.fileExists(dir + "/maintenancetool.exe")) { + targetDirectoryPage.warning.setText("

Existing installation detected and will be overwritten.

"); + } + else if (installer.fileExists(dir)) { + targetDirectoryPage.warning.setText("

Installing in existing directory. It will be wiped on uninstallation.

"); + } + else { + targetDirectoryPage.warning.setText(""); + } + installer.setValue("TargetDir", dir); +} + +Component.prototype.componentSelectionPageEntered = function() +{ + var dir = installer.value("TargetDir"); + if (installer.fileExists(dir) && installer.fileExists(dir + "/maintenancetool.exe")) { + installer.execute(dir + "/maintenancetool.exe", ["purge", "-c"]); + } } \ No newline at end of file diff --git a/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/package.xml.in b/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/package.xml.in index 1a0b0bc1c3..090e2c430f 100644 --- a/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/package.xml.in +++ b/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/package.xml.in @@ -2,11 +2,14 @@ ${DEX_DISPLAY_NAME} Install ${DEX_DISPLAY_NAME}. - 0.5.7 - 2022-10-24 + ${DEX_VERSION} + 2023-11-06 true + + targetwidget.ui + diff --git a/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/targetwidget.ui b/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/targetwidget.ui new file mode 100644 index 0000000000..6237332046 --- /dev/null +++ b/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/targetwidget.ui @@ -0,0 +1,113 @@ + + + TargetWidget + + + + 0 + 0 + 491 + 190 + + + + + 0 + 0 + + + + + 491 + 190 + + + + Form + + + + + + + + + + + + + + + true + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + ... + + + + + + + + + 0 + + + + + true + + + TextLabel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 122 + + + + + + + + + \ No newline at end of file diff --git a/ci_tools_atomic_dex/src/tests.nim b/ci_tools_atomic_dex/src/tests.nim index 78ee2980ff..0508b9cabb 100644 --- a/ci_tools_atomic_dex/src/tests.nim +++ b/ci_tools_atomic_dex/src/tests.nim @@ -32,20 +32,20 @@ proc run_tests*(build_type: string, osx_sdk_path: string, compiler_path: string) echo os.getCurrentDir() discard osproc.execCmd("ls") # os.setCurrentDir(os.getCurrentDir().joinPath("bin").joinPath(os.getEnv("DEX_PROJECT_NAME") & "_tests.app").joinPath("Contents").joinPath("MacOS")) - echo "Running AtomicDex Pro Unit tests" + echo "Running Komodo Wallet Pro Unit tests" discard osproc.execCmd("./" & os.getEnv("DEX_PROJECT_NAME") & "_tests --reporters=xml --out=" & os.getEnv("DEX_PROJECT_NAME") & "-tests-result.xml -s") echo "Successfully Generated", os.getEnv("DEX_PROJECT_NAME"), "-tests-result.xml" when defined(linux): echo os.getCurrentDir() os.setCurrentDir(os.getCurrentDir().joinPath("bin").joinPath("AntaraAtomicDexTestsAppDir").joinPath("usr").joinPath("bin")) - echo "Running AtomicDex Pro Unit tests" + echo "Running Komodo Wallet Pro Unit tests" discard osproc.execCmd("./" & os.getEnv("DEX_PROJECT_NAME") & "_tests --reporters=xml --out=" & os.getEnv("DEX_PROJECT_NAME") & "-tests-result.xml -s") echo "Successfully Generated", os.getEnv("DEX_PROJECT_NAME"), "-tests-result.xml" when defined(windows): echo os.getCurrentDir() os.setCurrentDir(os.getCurrentDir().joinPath("bin")) - echo "Running AtomicDex Pro Unit tests" + echo "Running Komodo Wallet Pro Unit tests" discard osproc.execCmd(".\\" & os.getEnv("DEX_PROJECT_NAME") & "_tests --reporters=xml --out=" & os.getEnv("DEX_PROJECT_NAME") & "-tests-result.xml -s") echo "Successfully Generated", os.getEnv("DEX_PROJECT_NAME"), "-tests-result.xml" diff --git a/ci_tools_atomic_dex/util/compare_themes.py b/ci_tools_atomic_dex/util/compare_themes.py index 40b5f097cd..714b833282 100755 --- a/ci_tools_atomic_dex/util/compare_themes.py +++ b/ci_tools_atomic_dex/util/compare_themes.py @@ -10,7 +10,7 @@ Usage: `./compare_themes.py` ''' -REPO_URL = "https://raw.githubusercontent.com/KomodoPlatform/atomicDEX-Desktop" +REPO_URL = "https://raw.githubusercontent.com/KomodoPlatform/komodo-wallet-desktop" BRANCHES = ['smartdex', 'GleecDEX', 'shibadex'] diff --git a/ci_tools_atomic_dex/vcpkg-repo b/ci_tools_atomic_dex/vcpkg-repo index 086ef2a484..1712ed5174 160000 --- a/ci_tools_atomic_dex/vcpkg-repo +++ b/ci_tools_atomic_dex/vcpkg-repo @@ -1 +1 @@ -Subproject commit 086ef2a4845fd12e5164df1876737afa67942208 +Subproject commit 1712ed51743a2e739c2f2c3855cd1d16fbbb6873 diff --git a/cmake/cfg_hash.cmake b/cmake/cfg_hash.cmake index 7179dc15d9..3c1c7af15c 100644 --- a/cmake/cfg_hash.cmake +++ b/cmake/cfg_hash.cmake @@ -1,5 +1,5 @@ #if (UNIX) -# execute_process(COMMAND bash -c "git ls-remote https://github.com/KomodoPlatform/atomicdex-desktop-generics refs/heads/main | cut -f 1 | tr -d '\n'" +# execute_process(COMMAND bash -c "git ls-remote https://github.com/KomodoPlatform/komodo-wallet-desktop-generics refs/heads/main | cut -f 1 | tr -d '\n'" # OUTPUT_VARIABLE GENERICS_VERSION_ID # ) # if (NOT EXISTS ${GENERICS_VERSION_ID}.cfg_hash) diff --git a/cmake/install/macos/Packaging_CMakeDMGSetup.scpt b/cmake/install/macos/Packaging_CMakeDMGSetup.scpt index b816533e58..f06196f7f3 100644 --- a/cmake/install/macos/Packaging_CMakeDMGSetup.scpt +++ b/cmake/install/macos/Packaging_CMakeDMGSetup.scpt @@ -39,7 +39,7 @@ on run argv set statusbar visible to false set toolbar visible to false set the bounds to { 400, 100, 900, 465 } - set position of item "atomicdex-desktop.app" to { 133, 200 } + set position of item "komodo-wallet.app" to { 133, 200 } set position of item "Applications" to { 378, 200 } end tell update without registering applications diff --git a/cmake/install/macos/dex_install.cmake b/cmake/install/macos/dex_install.cmake index c472d7684d..8b27af7e9b 100644 --- a/cmake/install/macos/dex_install.cmake +++ b/cmake/install/macos/dex_install.cmake @@ -1,11 +1,13 @@ if (APPLE) message(STATUS "ICON ->>>> ${ICON}") + message(STATUS "PROJECT_NAME ->>>> ${PROJECT_NAME}") + message(STATUS "DEX_VERSION ->>>> ${DEX_VERSION}") set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}" RESOURCE ${ICON} MACOSX_BUNDLE_ICON_FILE dex-logo - MACOSX_BUNDLE_SHORT_VERSION_STRING 0.5.7 - MACOSX_BUNDLE_LONG_VERSION_STRING 0.5.7 + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION} + MACOSX_BUNDLE_LONG_VERSION_STRING ${PROJECT_VERSION} MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/cmake/MacOSXBundleInfo.plist.in") add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND diff --git a/cmake/install/macos/osx_post_install.cmake b/cmake/install/macos/osx_post_install.cmake index bd42ae336c..51f1c6cc4d 100644 --- a/cmake/install/macos/osx_post_install.cmake +++ b/cmake/install/macos/osx_post_install.cmake @@ -99,8 +99,49 @@ endif () file(COPY ${CMAKE_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.dmg DESTINATION ${TARGET_APP_PATH}) get_filename_component(QT_ROOT_DIR $ENV{QT_ROOT} DIRECTORY) -set(IFW_BINDIR ${QT_ROOT_DIR}/Tools/QtInstallerFramework/4.5/bin) -message(STATUS "IFW_BIN PATH IS ${IFW_BINDIR}") +set(IFW_ROOT ${QT_ROOT_DIR}/Tools/QtInstallerFramework) +message(STATUS "IFW_ROOT PATH IS ${IFW_ROOT}") +execute_process(COMMAND ls ${IFW_ROOT}) + +# Find all subdirectories +file(GLOB subdirs "${IFW_ROOT}/*") +# Initialize variables to track the highest version and folder +set(IFW_VERSION "") +# Loop through the subdirectories +foreach(subdir ${subdirs}) + get_filename_component(folder_name ${subdir} NAME) + message(STATUS "scanning: ${subdir} [${folder_name}]") + # Use string manipulation to extract version from folder name + string(REGEX MATCH "([0-9]+\\.[0-9]+\\.[0-9]+)" version ${folder_name}) + # Check if the extracted version is higher than the current highest + # TODO: For some reason this var fails to populate in windows + if(version STREQUAL "") + continue() + elseif(version STRGREATER IFW_VERSION) + set(IFW_VERSION ${version}) + endif() +endforeach() +# Fallback to last scanned subfolder if variable empty. Usually there is only one folder. +if(version STREQUAL "") + set(IFW_VERSION ${folder_name}) +endif() + +message(STATUS "===========================================") +message(STATUS "Creating Installer") +set(IFW_BINDIR ${IFW_ROOT}/${IFW_VERSION}/bin) +message(STATUS ">>>> IFW_BIN PATH IS ${IFW_BINDIR}") +execute_process(COMMAND ls "${IFW_BINDIR}") +message(STATUS ">>>> IFW_BIN PATH IS ${PROJECT_APP_PATH}") +execute_process(COMMAND ls "${PROJECT_APP_PATH}") +message(STATUS ">>>> IFW_BIN PATH IS ${CMAKE_SOURCE_DIR}") +execute_process(COMMAND ls "${CMAKE_SOURCE_DIR}") +message(STATUS ">>>> IFW_BIN PATH IS ${TARGET_APP_PATH}") +execute_process(COMMAND ls "${TARGET_APP_PATH}") +message(STATUS ">>>> IFW_BIN PATH IS ${CMAKE_CURRENT_SOURCE_DIR}") +execute_process(COMMAND ls "${CMAKE_CURRENT_SOURCE_DIR}") +message(STATUS ">>>> IFW_BIN PATH IS ${CMAKE_CURRENT_SOURCE_DIR}/bin") +execute_process(COMMAND ls "${CMAKE_CURRENT_SOURCE_DIR}/bin") +message(STATUS "===========================================") if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.7z) message(STATUS "command is: [${IFW_BINDIR}/archivegen ${DEX_PROJECT_NAME}.7z ${PROJECT_APP_PATH} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin]") execute_process(COMMAND @@ -111,7 +152,8 @@ if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.7z) else() message(STATUS "${DEX_PROJECT_NAME}.7z already created - skipping") endif() - +message(STATUS "===========================================") +execute_process(COMMAND ls ${CMAKE_CURRENT_SOURCE_DIR}/bin ) message(STATUS "Copying ${CMAKE_CURRENT_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.7z TO ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/data") file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.7z DESTINATION ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/data) diff --git a/cmake/install/windows/windows_post_install.cmake b/cmake/install/windows/windows_post_install.cmake index a477153535..79ca6b1444 100644 --- a/cmake/install/windows/windows_post_install.cmake +++ b/cmake/install/windows/windows_post_install.cmake @@ -70,9 +70,52 @@ execute_process(COMMAND powershell.exe -File ${PROJECT_ROOT_DIR}/ci_tools_atomic ERROR_VARIABLE MANIFEST_ERROR) message(STATUS "manifest output: ${MANIFEST_RESULT} ${MANIFEST_OUTPUT} ${MANIFEST_ERROR}") +# Set the path to the ifw root directory +set(IFW_ROOT "$ENV{QT_ROOT}/Tools/QtInstallerFramework") +message(STATUS "IFW_ROOT PATH IS ${IFW_ROOT}") +execute_process(COMMAND ls "${IFW_ROOT}") +# Find all subdirectories +file(GLOB subdirs "${IFW_ROOT}/*") +# Initialize variables to track the highest version and folder +set(IFW_VERSION "") +# Loop through the subdirectories +foreach(subdir ${subdirs}) + get_filename_component(folder_name ${subdir} NAME) + message(STATUS "scanning: ${subdir} [${folder_name}]") + # Use string manipulation to extract version from folder name + string(REGEX MATCH "([0-9]+\\.[0-9]+\\.[0-9]+)" version ${folder_name}) + # Check if the extracted version is higher than the current highest + # TODO: For some reason this var fails to populate in windows + if(version STREQUAL "") + continue() + elseif(version STRGREATER IFW_VERSION) + set(IFW_VERSION ${version}) + endif() +endforeach() +# Fallback to last scanned subfolder if variable empty. Usually there is only one folder. +if(version STREQUAL "") + set(IFW_VERSION ${folder_name}) +endif() + +message(STATUS "===========================================") message(STATUS "Creating Installer") -set(IFW_BINDIR $ENV{QT_ROOT}/Tools/QtInstallerFramework/4.5/bin) +set(IFW_BINDIR ${IFW_ROOT}/${IFW_VERSION}/bin) +message(STATUS ">>>> IFW_BIN PATH IS ${IFW_BINDIR}") +execute_process(COMMAND ls "${IFW_BINDIR}") +message(STATUS ">>>> IFW_BIN PATH IS ${PROJECT_APP_PATH}") +execute_process(COMMAND ls "${PROJECT_APP_PATH}") +message(STATUS ">>>> IFW_BIN PATH IS ${CMAKE_SOURCE_DIR}") +execute_process(COMMAND ls "${CMAKE_SOURCE_DIR}") +message(STATUS ">>>> IFW_BIN PATH IS ${TARGET_APP_PATH}") +execute_process(COMMAND ls "${TARGET_APP_PATH}") +message(STATUS ">>>> IFW_BIN PATH IS ${CMAKE_CURRENT_SOURCE_DIR}") +execute_process(COMMAND ls "${CMAKE_CURRENT_SOURCE_DIR}") +message(STATUS ">>>> IFW_BIN PATH IS ${CMAKE_CURRENT_SOURCE_DIR}/bin") +execute_process(COMMAND ls "${CMAKE_CURRENT_SOURCE_DIR}/bin") +message(STATUS "===========================================") +set(IFW_BINDIR ${IFW_ROOT}/${IFW_VERSION}/bin) message(STATUS "IFW_BIN PATH IS ${IFW_BINDIR}") + if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${DEX_PROJECT_NAME}.7z) message(STATUS "Contents of folder: ls ${CMAKE_CURRENT_SOURCE_DIR}") execute_process(COMMAND ls "${CMAKE_CURRENT_SOURCE_DIR}") diff --git a/cmake/project.metadata.cmake b/cmake/project.metadata.cmake index a838dd9f6a..3c51249ee0 100644 --- a/cmake/project.metadata.cmake +++ b/cmake/project.metadata.cmake @@ -47,6 +47,9 @@ endif () if (DEFINED ENV{DEX_WEBSITE}) set(DEX_WEBSITE $ENV{DEX_WEBSITE}) endif () +if (DEFINED ENV{DEX_VERSION}) + set(DEX_VERSION $ENV{DEX_VERSION}) +endif () if (DEFINED ENV{PROJECT_ROOT}) set(PROJECT_ROOT $ENV{PROJECT_ROOT}) else () @@ -67,6 +70,7 @@ message(STATUS "CMAKE_BUILD_TYPE --> ${CMAKE_BUILD_TYPE}") message(STATUS "DEX_PROJECT_NAME --> ${DEX_PROJECT_NAME}") message(STATUS "DEX_DISPLAY_NAME --> ${DEX_DISPLAY_NAME}") message(STATUS "DEX_COMPANY --> ${DEX_COMPANY}") +message(STATUS "DEX_VERSION --> ${DEX_VERSION}") message(STATUS "DEX_WEBSITE --> ${DEX_WEBSITE}") message(STATUS "CMAKE_SOURCE_DIR --> ${CMAKE_SOURCE_DIR}") message(STATUS "PROJECT_ROOT --> ${PROJECT_ROOT}") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 531c27e8d6..5d33a981a0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -17,7 +17,7 @@ DEX_NEW_LIB(core INTERFACE DEX_API="${DEX_API}" DEX_RPC="${DEX_RPC}" DEX_RPCPORT="${DEX_RPCPORT}" DEX_NAME="${DEX_DISPLAY_NAME}" DEX_WEBSITE_URL="${DEX_WEBSITE}" DEX_SUPPORT_URL="${DEX_SUPPORT_PAGE}" DEX_DISCORD_URL="${DEX_DISCORD}" DEX_TWITTER_URL="${DEX_TWITTER}" DEX_PRIMARY_COIN="${DEX_PRIMARY_COIN}" DEX_SECOND_PRIMARY_COIN="${DEX_SECOND_PRIMARY_COIN}" #DEX_COMMON_DATA_FOLDER="${DEX_COMMON_DATA_FOLDER}" - DEX_PROJECT_NAME="${DEX_PROJECT_NAME}" DEX_COMPANY_NAME="${DEX_COMPANY_NAME}" + DEX_PROJECT_NAME="${DEX_PROJECT_NAME}" DEX_COMPANY_NAME="${DEX_COMPANY_NAME}" DEX_VERSION="${DEX_VERSION}" DEX_REPOSITORY_OWNER="${DEX_REPOSITORY_OWNER}" DEX_REPOSITORY_NAME="${DEX_REPOSITORY_NAME}" DEX_CHECKSUM_API_URL="${DEX_CHECKSUM_API_URL}" DEX_APPDATA_FOLDER="${DEX_APPDATA_FOLDER}" INTERFACE_DEFS diff --git a/src/app/app.cpp b/src/app/app.cpp index ee80584c2e..d7cd93d9a7 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -44,7 +44,6 @@ #include "atomicdex/services/price/komodo_prices/komodo.prices.provider.hpp" #include "atomicdex/services/price/coingecko/coingecko.wallet.charts.hpp" #include "atomicdex/services/price/coinpaprika/coinpaprika.provider.hpp" -#include "atomicdex/services/price/oracle/band.provider.hpp" #include "atomicdex/services/price/orderbook.scanner.service.hpp" namespace @@ -181,6 +180,8 @@ namespace atomic_dex bool application::has_coins_with_balance() { + // TODO: Does this ignore test coins? + // Simple view on fresh wallet with only test coins from faucet returns `no tradable assets` auto* portfolio_page = get_portfolio_page(); auto* portfolio_mdl = portfolio_page->get_portfolio(); auto portfolio_data = portfolio_mdl->get_underlying_data(); @@ -371,12 +372,9 @@ namespace atomic_dex } //! TODO: figure out why sometimes ZHTLC coins end up in here twice. When they do, without this check it crashes. if (std::find(to_init.begin(), to_init.end(), ticker) != to_init.end()) { - SPDLOG_DEBUG("Ticker {} is already in vector", ticker); + // SPDLOG_DEBUG("Ticker {} is already in vector", ticker); add_to_init = false; } - else { - SPDLOG_DEBUG("Ticker {} is not already in vector", ticker); - } if (add_to_init) { to_init.push_back(ticker); } @@ -502,8 +500,7 @@ namespace atomic_dex system_manager_.create_system(system_manager_, this); system_manager_.create_system(system_manager_, settings_page_system.get_cfg()); system_manager_.create_system(system_manager_); - system_manager_.create_system(); - // system_manager_.create_system(system_manager_); + //system_manager_.create_system(system_manager_); //system_manager_.create_system(system_manager_); system_manager_.create_system(); system_manager_.create_system(); diff --git a/src/app/main.prerequisites.hpp b/src/app/main.prerequisites.hpp index ebb8a79841..f026bd21ab 100644 --- a/src/app/main.prerequisites.hpp +++ b/src/app/main.prerequisites.hpp @@ -338,12 +338,15 @@ handle_settings(QSettings& settings) #else create_settings_functor("ThemePath", QString::fromStdString(atomic_dex::utils::get_themes_path().string())); #endif + using namespace std::chrono; + int timestamp = duration_cast(system_clock::now().time_since_epoch()).count() - 86400 * 2; create_settings_functor("AutomaticUpdateOrderBot", QVariant(false)); create_settings_functor("WalletChartsCategory", qint32(WalletChartsCategories::OneMonth)); create_settings_functor("AvailableLang", QStringList{"en", "es", "fr", "de", "tr", "ru"}); create_settings_functor("CurrentLang", QString("en")); create_settings_functor("2FA", 0); create_settings_functor("MaximumNbCoinsEnabled", 50); + create_settings_functor("PirateSyncDate", timestamp); create_settings_functor("DefaultTradingMode", TradingMode::Simple); create_settings_functor("FontMode", QQuickWindow::TextRenderType::QtTextRendering); } diff --git a/src/core/atomicdex/api/faucet/faucet.cpp b/src/core/atomicdex/api/faucet/faucet.cpp index 2fb699ceb1..06e2e44cb3 100644 --- a/src/core/atomicdex/api/faucet/faucet.cpp +++ b/src/core/atomicdex/api/faucet/faucet.cpp @@ -23,7 +23,7 @@ namespace { - constexpr const char* g_faucet_api_endpoint = "https://faucet.komodo.live/faucet/"; + constexpr const char* g_faucet_api_endpoint = "https://faucet.komodo.earth/faucet/"; const auto g_faucet_api_client = std::make_unique(FROM_STD_STR(g_faucet_api_endpoint)); } // namespace diff --git a/src/core/atomicdex/api/komodo_prices/komodo.prices.cpp b/src/core/atomicdex/api/komodo_prices/komodo.prices.cpp index 65ca7505bb..f0616ad4d6 100644 --- a/src/core/atomicdex/api/komodo_prices/komodo.prices.cpp +++ b/src/core/atomicdex/api/komodo_prices/komodo.prices.cpp @@ -10,7 +10,7 @@ namespace { - constexpr const char* g_komodo_prices_endpoint = "https://prices.komodo.live:1313"; + constexpr const char* g_komodo_prices_endpoint = "https://prices.komodo.earth"; constexpr const char* g_komodo_prices_endpoint_fallback = "https://prices.cipig.net:1717"; web::http::client::http_client_config g_komodo_prices_cfg{[]() @@ -61,10 +61,6 @@ namespace atomic_dex::komodo_prices::api { x = provider::forex; } - else if (j == "nomics") - { - x = provider::nomics; - } else { x = provider::unknown; diff --git a/src/core/atomicdex/api/komodo_prices/komodo.prices.hpp b/src/core/atomicdex/api/komodo_prices/komodo.prices.hpp index de183477af..36ec80e245 100644 --- a/src/core/atomicdex/api/komodo_prices/komodo.prices.hpp +++ b/src/core/atomicdex/api/komodo_prices/komodo.prices.hpp @@ -13,7 +13,6 @@ namespace atomic_dex::komodo_prices::api coingecko, coinpaprika, forex, - nomics, unknown }; diff --git a/src/core/atomicdex/api/mm2/enable_slp_rpc.cpp b/src/core/atomicdex/api/mm2/enable_slp_rpc.cpp index 314005d743..82f1524d94 100644 --- a/src/core/atomicdex/api/mm2/enable_slp_rpc.cpp +++ b/src/core/atomicdex/api/mm2/enable_slp_rpc.cpp @@ -19,7 +19,6 @@ namespace atomic_dex::mm2 void from_json(const nlohmann::json& j, enable_slp_rpc_result& in) { - j.at("token_id").get_to(in.token_id); j.at("platform_coin").get_to(in.platform_coin); j.at("required_confirmations").get_to(in.required_confirmations); j.at("token_id").get_to(in.token_id); diff --git a/src/core/atomicdex/api/mm2/mm2.client.cpp b/src/core/atomicdex/api/mm2/mm2.client.cpp index 381cb28822..3dd79528fe 100644 --- a/src/core/atomicdex/api/mm2/mm2.client.cpp +++ b/src/core/atomicdex/api/mm2/mm2.client.cpp @@ -28,6 +28,8 @@ #include "atomicdex/constants/dex.constants.hpp" #include "rpc.hpp" #include "rpc.tx.history.hpp" +#include "rpc2.enable_tendermint_token.hpp" +#include "rpc2.enable_tendermint_with_assets.hpp" namespace { @@ -38,10 +40,10 @@ namespace { using namespace std::chrono_literals; - constexpr auto client_timeout = 30s; + //constexpr auto client_timeout = 30s; web::http::client::http_client_config cfg; - cfg.set_timeout(client_timeout); + //cfg.set_timeout(client_timeout); return {FROM_STD_STR(atomic_dex::g_dex_rpc), cfg}; } @@ -70,11 +72,12 @@ namespace template Rpc process_rpc_answer(const web::http::http_response& answer) { + // SPDLOG_DEBUG("rpc answer: {}", TO_STD_STR(answer.extract_string(true).get())); Rpc rpc; auto json_answer = nlohmann::json::parse(TO_STD_STR(answer.extract_string(true).get())); - if (Rpc::is_v2) { + // SPDLOG_DEBUG("v2 rpc answer") if (answer.status_code() == 200) rpc.result = json_answer.at("result").get(); else @@ -160,6 +163,8 @@ namespace atomic_dex::mm2 template void mm2_client::process_rpc_async(const std::function&); template void mm2_client::process_rpc_async(const std::function&); template void mm2_client::process_rpc_async(const std::function&); + template void mm2_client::process_rpc_async(const std::function&); + template void mm2_client::process_rpc_async(const std::function&); template void mm2_client::process_rpc_async(const std::function&); template void mm2_client::process_rpc_async(const std::function&); @@ -192,11 +197,11 @@ namespace atomic_dex::mm2 template TAnswer - mm2_client::process_rpc(TRequest&& request, std::string rpc_command) + mm2_client::process_rpc(TRequest&& request, std::string rpc_command, bool is_v2) { SPDLOG_DEBUG("Processing rpc call: {}", rpc_command); - nlohmann::json json_data = mm2::template_request(rpc_command); + nlohmann::json json_data = mm2::template_request(rpc_command, is_v2); mm2::to_json(json_data, request); @@ -211,6 +216,12 @@ namespace atomic_dex::mm2 return rpc_process_answer(resp, rpc_command); } + t_enable_z_coin_cancel_answer + mm2_client::rpc_enable_z_coin_cancel(t_enable_z_coin_cancel_request&& request) + { + return process_rpc(std::forward(request), "task::enable_z_coin::cancel", true); + } + t_disable_coin_answer mm2_client::rpc_disable_coin(t_disable_coin_request&& request) { @@ -226,4 +237,4 @@ namespace atomic_dex::mm2 } // namespace atomic_dex template atomic_dex::mm2::tx_history_answer atomic_dex::mm2::mm2_client::rpc_process_answer(const web::http::http_response& resp, const std::string& rpc_command); -template atomic_dex::mm2::disable_coin_answer atomic_dex::mm2::mm2_client::rpc_process_answer(const web::http::http_response& resp, const std::string& rpc_command); \ No newline at end of file +template atomic_dex::mm2::disable_coin_answer atomic_dex::mm2::mm2_client::rpc_process_answer(const web::http::http_response& resp, const std::string& rpc_command); diff --git a/src/core/atomicdex/api/mm2/mm2.client.hpp b/src/core/atomicdex/api/mm2/mm2.client.hpp index 22f9a94c89..26a6b92672 100644 --- a/src/core/atomicdex/api/mm2/mm2.client.hpp +++ b/src/core/atomicdex/api/mm2/mm2.client.hpp @@ -11,6 +11,7 @@ #include "rpc.disable.hpp" #include "rpc.recover.funds.hpp" #include "rpc.hpp" +#include "rpc2.task.enable_z_coin.cancel.hpp" namespace atomic_dex::mm2 { @@ -35,12 +36,13 @@ namespace atomic_dex::mm2 //! Synced template - TAnswer process_rpc(TRequest&& request, std::string rpc_command); + TAnswer process_rpc(TRequest&& request, std::string rpc_command, bool is_v2 = false); template RpcReturnType rpc_process_answer(const web::http::http_response& resp, const std::string& rpc_command); - t_disable_coin_answer rpc_disable_coin(t_disable_coin_request&& request); - t_recover_funds_of_swap_answer rpc_recover_funds(t_recover_funds_of_swap_request&& request); + t_disable_coin_answer rpc_disable_coin(t_disable_coin_request&& request); + t_recover_funds_of_swap_answer rpc_recover_funds(t_recover_funds_of_swap_request&& request); + t_enable_z_coin_cancel_answer rpc_enable_z_coin_cancel(t_enable_z_coin_cancel_request&& request); }; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/mm2.cpp b/src/core/atomicdex/api/mm2/mm2.cpp index d889bd07d1..4f8baa3321 100644 --- a/src/core/atomicdex/api/mm2/mm2.cpp +++ b/src/core/atomicdex/api/mm2/mm2.cpp @@ -26,8 +26,8 @@ #include "atomicdex/api/mm2/rpc.recover.funds.hpp" #include "atomicdex/api/mm2/rpc.trade.preimage.hpp" #include "atomicdex/api/mm2/rpc.validate.address.hpp" -#include "atomicdex/api/mm2/rpc.withdraw.hpp" -#include "atomicdex/api/mm2/rpc2.withdraw_status.hpp" +#include "atomicdex/api/mm2/rpc2.withdraw.hpp" +#include "atomicdex/api/mm2/rpc2.task.withdraw.status.hpp" #include "atomicdex/api/mm2/rpc.recover.funds.hpp" #include "atomicdex/pages/qt.settings.page.hpp" #include "atomicdex/services/price/global.provider.hpp" diff --git a/src/core/atomicdex/api/mm2/mm2.hpp b/src/core/atomicdex/api/mm2/mm2.hpp index ae8c9f170d..4c55afafe8 100644 --- a/src/core/atomicdex/api/mm2/mm2.hpp +++ b/src/core/atomicdex/api/mm2/mm2.hpp @@ -34,7 +34,7 @@ namespace ag = antara::gaming; namespace atomic_dex::mm2 { - inline constexpr const char* g_etherscan_proxy_endpoint = "https://komodo.live:3334"; + inline constexpr const char* g_etherscan_proxy_endpoint = "https://komodo.earth:3334"; inline std::unique_ptr g_etherscan_proxy_http_client{ std::make_unique(FROM_STD_STR(g_etherscan_proxy_endpoint))}; inline std::unique_ptr g_qtum_proxy_http_client{ diff --git a/src/core/atomicdex/api/mm2/my_tx_history_rpc.cpp b/src/core/atomicdex/api/mm2/my_tx_history_rpc.cpp index 6a0c86ef95..a154fa4a0f 100644 --- a/src/core/atomicdex/api/mm2/my_tx_history_rpc.cpp +++ b/src/core/atomicdex/api/mm2/my_tx_history_rpc.cpp @@ -1,4 +1,4 @@ -// atomicdex-desktop +// komodo-wallet // Author(s): syl #include diff --git a/src/core/atomicdex/api/mm2/my_tx_history_rpc.hpp b/src/core/atomicdex/api/mm2/my_tx_history_rpc.hpp index ea308b14b6..bc7e6e1c94 100644 --- a/src/core/atomicdex/api/mm2/my_tx_history_rpc.hpp +++ b/src/core/atomicdex/api/mm2/my_tx_history_rpc.hpp @@ -1,4 +1,4 @@ -// atomicdex-desktop +// komodo-wallet // Author(s): syl #include diff --git a/src/core/atomicdex/api/mm2/my_tx_history_v1_rpc.hpp b/src/core/atomicdex/api/mm2/my_tx_history_v1_rpc.hpp index 8b85d28cc5..1ff69bcc08 100644 --- a/src/core/atomicdex/api/mm2/my_tx_history_v1_rpc.hpp +++ b/src/core/atomicdex/api/mm2/my_tx_history_v1_rpc.hpp @@ -1,4 +1,4 @@ -// atomicdex-desktop +// komodo-wallet // Author(s): syl #pragma once diff --git a/src/core/atomicdex/api/mm2/orderbook.order.contents.cpp b/src/core/atomicdex/api/mm2/orderbook.order.contents.cpp index 7c066603fd..0da85f01c7 100644 --- a/src/core/atomicdex/api/mm2/orderbook.order.contents.cpp +++ b/src/core/atomicdex/api/mm2/orderbook.order.contents.cpp @@ -32,6 +32,15 @@ namespace atomic_dex::mm2 { j.at("coin").get_to(contents.coin); + if (contents.coin.find("-segwit") != std::string::npos) + { + std::string uuid = j["uuid"]; + contents.uuid = uuid + "-segwit"; + } + else + { + j.at("uuid").get_to(contents.uuid); + } if (j.at("address").contains("address_data")) { j.at("address").at("address_data").get_to(contents.address); @@ -40,9 +49,7 @@ namespace atomic_dex::mm2 { contents.address = "Shielded"; } - j.at("pubkey").get_to(contents.pubkey); - j.at("uuid").get_to(contents.uuid); j.at("is_mine").get_to(contents.is_mine); j.at("price").at("decimal").get_to(contents.price); diff --git a/src/core/atomicdex/api/mm2/paging_options.cpp b/src/core/atomicdex/api/mm2/paging_options.cpp index a0f95fc001..91e2c9b834 100644 --- a/src/core/atomicdex/api/mm2/paging_options.cpp +++ b/src/core/atomicdex/api/mm2/paging_options.cpp @@ -1,4 +1,4 @@ -// atomicdex-desktop +// komodo-wallet // Author(s): syl #include diff --git a/src/core/atomicdex/api/mm2/paging_options.hpp b/src/core/atomicdex/api/mm2/paging_options.hpp index df3ba02200..4f48ec69db 100644 --- a/src/core/atomicdex/api/mm2/paging_options.hpp +++ b/src/core/atomicdex/api/mm2/paging_options.hpp @@ -1,4 +1,4 @@ -// atomicdex-desktop +// komodo-wallet // Author(s): syl #pragma once diff --git a/src/core/atomicdex/api/mm2/rpc.electrum.cpp b/src/core/atomicdex/api/mm2/rpc.electrum.cpp index dfea39b95b..9ac193efba 100644 --- a/src/core/atomicdex/api/mm2/rpc.electrum.cpp +++ b/src/core/atomicdex/api/mm2/rpc.electrum.cpp @@ -37,8 +37,14 @@ namespace atomic_dex::mm2 if (cfg.coin_type == CoinType::QRC20) { - j["swap_contract_address"] = cfg.is_testnet ? cfg.testnet_qrc_swap_contract_address : cfg.mainnet_qrc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.testnet_fallback_qrc_swap_contract_address : cfg.mainnet_fallback_qrc_swap_contract_address; + if (cfg.swap_contract_address.has_value()) + { + j["swap_contract_address"] = cfg.swap_contract_address.value(); + } + if (cfg.fallback_swap_contract_address.has_value()) + { + j["fallback_swap_contract_address"] = cfg.fallback_swap_contract_address.value(); + } } if (cfg.bchd_urls.has_value()) { diff --git a/src/core/atomicdex/api/mm2/rpc.electrum.hpp b/src/core/atomicdex/api/mm2/rpc.electrum.hpp index 1960e56ec3..86dc73d6ac 100644 --- a/src/core/atomicdex/api/mm2/rpc.electrum.hpp +++ b/src/core/atomicdex/api/mm2/rpc.electrum.hpp @@ -32,14 +32,12 @@ namespace atomic_dex::mm2 CoinType coin_type; bool is_testnet{false}; bool with_tx_history{true}; - const std::string testnet_qrc_swap_contract_address{"0xba8b71f3544b93e2f681f996da519a98ace0107a"}; - const std::string testnet_fallback_qrc_swap_contract_address{testnet_qrc_swap_contract_address}; - const std::string mainnet_qrc_swap_contract_address{"0x2f754733acd6d753731c00fee32cb484551cc15d"}; - const std::string mainnet_fallback_qrc_swap_contract_address{mainnet_qrc_swap_contract_address}; + std::optional swap_contract_address{std::nullopt}; + std::optional fallback_swap_contract_address{std::nullopt}; std::optional address_format; std::optional merge_params; - std::optional> bchd_urls; - std::optional allow_slp_unsafe_conf; + std::optional> bchd_urls; + std::optional allow_slp_unsafe_conf; }; struct electrum_answer diff --git a/src/core/atomicdex/api/mm2/rpc.enable.cpp b/src/core/atomicdex/api/mm2/rpc.enable.cpp index 0722bb9c23..845694e8de 100644 --- a/src/core/atomicdex/api/mm2/rpc.enable.cpp +++ b/src/core/atomicdex/api/mm2/rpc.enable.cpp @@ -28,125 +28,43 @@ namespace atomic_dex::mm2 to_json(nlohmann::json& j, const enable_request& cfg) { j["coin"] = cfg.coin_name; - switch (cfg.coin_type) { case CoinType::ERC20: { - j["gas_station_url"] = cfg.gas_station_url; - j["urls"] = cfg.urls; - j["swap_contract_address"] = cfg.is_testnet ? cfg.erc_testnet_swap_contract_address : cfg.erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.erc_testnet_fallback_swap_contract_address : cfg.erc_fallback_swap_contract_address; - break; + if (cfg.gas_station_url.has_value()) + { + j["gas_station_url"] = cfg.gas_station_url.value(); + } } case CoinType::Matic: { - j["gas_station_url"] = cfg.is_testnet ? cfg.testnet_matic_gas_station_url : cfg.matic_gas_station_url; - j["gas_station_decimals"] = cfg.matic_gas_station_decimals; - j["urls"] = cfg.urls; - j["swap_contract_address"] = cfg.is_testnet ? cfg.matic_erc_testnet_swap_contract_address : cfg.matic_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.matic_erc_testnet_fallback_swap_contract_address : cfg.matic_erc_fallback_swap_contract_address; - break; - } - case CoinType::Optimism: - { - j["urls"] = cfg.urls; - j["swap_contract_address"] = cfg.optimism_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.optimism_erc_fallback_swap_contract_address; - break; - } - case CoinType::Arbitrum: - { - j["urls"] = cfg.urls; - j["swap_contract_address"] = cfg.arbitrum_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.arbitrum_erc_fallback_swap_contract_address; - break; - } - case CoinType::BEP20: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.bnb_testnet_swap_contract_address : cfg.bnb_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.bnb_testnet_fallback_swap_contract_address : cfg.bnb_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::AVX20: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.avax_erc_testnet_swap_contract_address : cfg.avax_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.avax_erc_testnet_fallback_swap_contract_address : cfg.avax_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::FTM20: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.ftm_erc_testnet_swap_contract_address : cfg.ftm_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.ftm_erc_testnet_fallback_swap_contract_address : cfg.ftm_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::HRC20: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.one_erc_testnet_swap_contract_address : cfg.one_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.one_erc_testnet_fallback_swap_contract_address : cfg.one_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::Ubiq: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.ubiq_erc_testnet_swap_contract_address : cfg.ubiq_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.ubiq_erc_testnet_fallback_swap_contract_address : cfg.ubiq_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::KRC20: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.krc_erc_testnet_swap_contract_address : cfg.krc_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.krc_erc_testnet_fallback_swap_contract_address : cfg.krc_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::Moonriver: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.movr_erc_testnet_swap_contract_address : cfg.movr_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.movr_erc_testnet_fallback_swap_contract_address : cfg.movr_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::Moonbeam: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.glmr_erc_testnet_swap_contract_address : cfg.glmr_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.glmr_erc_testnet_fallback_swap_contract_address : cfg.glmr_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::HecoChain: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.hco_erc_testnet_swap_contract_address : cfg.hco_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.hco_erc_testnet_fallback_swap_contract_address : cfg.hco_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::SmartBCH: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.sbch_erc_testnet_swap_contract_address : cfg.sbch_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.sbch_erc_testnet_fallback_swap_contract_address : cfg.sbch_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::EthereumClassic: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.etc_erc_testnet_swap_contract_address : cfg.etc_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.etc_erc_testnet_fallback_swap_contract_address : cfg.etc_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; - } - case CoinType::RSK: - { - j["swap_contract_address"] = cfg.is_testnet ? cfg.rsk_erc_testnet_swap_contract_address : cfg.rsk_erc_swap_contract_address; - j["fallback_swap_contract"] = cfg.is_testnet ? cfg.rsk_erc_testnet_fallback_swap_contract_address : cfg.rsk_erc_fallback_swap_contract_address; - j["urls"] = cfg.urls; - break; + if (cfg.is_testnet) + { + if (cfg.testnet_matic_gas_station_url.has_value()) + { + j["gas_station_url"] = cfg.testnet_matic_gas_station_url.value(); + } + } + else + { + if (cfg.matic_gas_station_url.has_value()) + { + j["gas_station_url"] = cfg.matic_gas_station_url.value(); + } + } + if (cfg.matic_gas_station_decimals.has_value()) + { + j["gas_station_decimals"] = cfg.matic_gas_station_decimals.value(); + } } default: + j["urls"] = cfg.urls; + j["swap_contract_address"] = cfg.swap_contract_address; + if (cfg.fallback_swap_contract_address.has_value()) + { + j["fallback_swap_contract"] = cfg.fallback_swap_contract_address.value(); + } break; } diff --git a/src/core/atomicdex/api/mm2/rpc.enable.hpp b/src/core/atomicdex/api/mm2/rpc.enable.hpp index 2b7d3274e3..69170a0341 100644 --- a/src/core/atomicdex/api/mm2/rpc.enable.hpp +++ b/src/core/atomicdex/api/mm2/rpc.enable.hpp @@ -17,6 +17,7 @@ #pragma once //! Deps +#include #include //! Project Headers @@ -27,76 +28,18 @@ namespace atomic_dex::mm2 //! Only for erc 20 struct enable_request { - std::string coin_name; - std::vector urls; - CoinType coin_type; - bool is_testnet{false}; - const std::string erc_swap_contract_address{"0x24ABE4c71FC658C91313b6552cd40cD808b3Ea80"}; - const std::string erc_testnet_swap_contract_address{"0x6b5A52217006B965BB190864D62dc3d270F7AaFD"}; - const std::string erc_fallback_swap_contract_address{"0x8500AFc0bc5214728082163326C2FF0C73f4a871"}; - const std::string erc_testnet_fallback_swap_contract_address{"0x7Bc1bBDD6A0a722fC9bffC49c921B685ECB84b94"}; - const std::string etc_erc_swap_contract_address{"0x6d9ce4BD298DE38bAfEFD15f5C6f5c95313B1d94"}; - const std::string etc_erc_testnet_swap_contract_address{"0x6d9ce4BD298DE38bAfEFD15f5C6f5c95313B1d94"}; - const std::string etc_erc_fallback_swap_contract_address{"0x6d9ce4BD298DE38bAfEFD15f5C6f5c95313B1d94"}; - const std::string etc_erc_testnet_fallback_swap_contract_address{"0x6d9ce4BD298DE38bAfEFD15f5C6f5c95313B1d94"}; - const std::string ubiq_erc_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string ubiq_erc_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string ubiq_erc_testnet_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string ubiq_erc_testnet_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string krc_erc_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string krc_erc_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string krc_erc_testnet_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string krc_erc_testnet_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string movr_erc_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string movr_erc_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string movr_erc_testnet_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string movr_erc_testnet_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string glmr_erc_swap_contract_address{"0x6d9ce4BD298DE38bAfEFD15f5C6f5c95313B1d94"}; - const std::string glmr_erc_fallback_swap_contract_address{"0x6d9ce4BD298DE38bAfEFD15f5C6f5c95313B1d94"}; - const std::string glmr_erc_testnet_swap_contract_address{"0x6d9ce4BD298DE38bAfEFD15f5C6f5c95313B1d94"}; - const std::string glmr_erc_testnet_fallback_swap_contract_address{"0x6d9ce4BD298DE38bAfEFD15f5C6f5c95313B1d94"}; - const std::string hco_erc_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string hco_erc_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string hco_erc_testnet_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string hco_erc_testnet_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string avax_erc_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string avax_erc_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string avax_erc_testnet_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string avax_erc_testnet_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string one_erc_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string one_erc_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string one_erc_testnet_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string one_erc_testnet_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string ftm_erc_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string ftm_erc_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string ftm_erc_testnet_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string ftm_erc_testnet_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string matic_erc_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string matic_erc_fallback_swap_contract_address{"0x9130b257D37A52E52F21054c4DA3450c72f595CE"}; - const std::string matic_erc_testnet_swap_contract_address{"0x73c1Dd989218c3A154C71Fc08Eb55A24Bd2B3A10"}; - const std::string matic_erc_testnet_fallback_swap_contract_address{"0x73c1Dd989218c3A154C71Fc08Eb55A24Bd2B3A10"}; - const std::string optimism_erc_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; - const std::string optimism_erc_fallback_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; - const std::string arbitrum_erc_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; - const std::string arbitrum_erc_fallback_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; - const std::string sbch_erc_swap_contract_address{"0x25bF2AAB8749AD2e4360b3e0B738f3Cd700C4D68"}; - const std::string sbch_erc_fallback_swap_contract_address{"0x25bF2AAB8749AD2e4360b3e0B738f3Cd700C4D68"}; - const std::string sbch_erc_testnet_swap_contract_address{"0x25bF2AAB8749AD2e4360b3e0B738f3Cd700C4D68"}; - const std::string sbch_erc_testnet_fallback_swap_contract_address{"0x25bF2AAB8749AD2e4360b3e0B738f3Cd700C4D68"}; - const std::string rsk_erc_swap_contract_address{"0x6D9CE4bD298de38Bafefd15F5C6F5c95313B1d94"}; - const std::string rsk_erc_fallback_swap_contract_address{"0x6D9CE4bD298de38Bafefd15F5C6F5c95313B1d94"}; - const std::string rsk_erc_testnet_swap_contract_address{"0x6D9CE4bD298de38Bafefd15F5C6F5c95313B1d94"}; - const std::string rsk_erc_testnet_fallback_swap_contract_address{"0x6D9CE4bD298de38Bafefd15F5C6F5c95313B1d94"}; - const std::string bnb_testnet_swap_contract_address{"0xcCD17C913aD7b772755Ad4F0BDFF7B34C6339150"}; - const std::string bnb_swap_contract_address{"0xeDc5b89Fe1f0382F9E4316069971D90a0951DB31"}; - const std::string bnb_fallback_swap_contract_address{bnb_swap_contract_address}; - const std::string bnb_testnet_fallback_swap_contract_address{bnb_testnet_swap_contract_address}; - const std::size_t matic_gas_station_decimals{9}; - std::string gas_station_url{"https://ethgasstation.info/json/ethgasAPI.json"}; - std::string matic_gas_station_url{"https://gasstation-mainnet.matic.network/"}; - std::string testnet_matic_gas_station_url{"https://gasstation-mumbai.matic.today/"}; - std::string type; ///< QRC-20 ? - bool with_tx_history{true}; + std::string coin_name; + std::vector urls; + CoinType coin_type; + bool is_testnet{false}; + const std::string swap_contract_address; + std::optional fallback_swap_contract_address{std::nullopt}; + std::optional matic_gas_station_decimals{9}; + std::optional gas_station_url{std::nullopt}; + std::optional matic_gas_station_url{std::nullopt}; + std::optional testnet_matic_gas_station_url{std::nullopt}; + std::optional type; ///< QRC-20 ? + bool with_tx_history{true}; }; void to_json(nlohmann::json& j, const enable_request& cfg); diff --git a/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_token.cpp b/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_token.cpp new file mode 100644 index 0000000000..d20efa4132 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_token.cpp @@ -0,0 +1,25 @@ +#include + +#include "rpc2.enable_tendermint_token.hpp" + +namespace atomic_dex::mm2 +{ + void to_json(nlohmann::json& j, const enable_tendermint_token_rpc_request& request) + { + j["ticker"] = request.ticker; + if (request.activation_params.required_confirmations) + { + j["activation_params"]["required_confirmations"] = *request.activation_params.required_confirmations; + } + else + { + j["activation_params"] = nlohmann::json::object(); + } + } + + void from_json(const nlohmann::json& j, enable_tendermint_token_rpc_result& in) + { + j.at("platform_coin").get_to(in.platform_coin); + j.at("balances").get_to>(in.balances); + } +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_token.hpp b/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_token.hpp new file mode 100644 index 0000000000..a41920ad3d --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_token.hpp @@ -0,0 +1,59 @@ +/****************************************************************************** + * Copyright © 2013-2022 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 //> nlohmann::json + +#include "rpc.hpp" +#include "balance_info.hpp" + +namespace atomic_dex::mm2 +{ + struct enable_tendermint_token_rpc + { + static constexpr auto endpoint = "enable_tendermint_token"; + static constexpr bool is_v2 = true; + + struct expected_request_type + { + std::string ticker; + struct { std::optional required_confirmations; } activation_params; + }; + + struct expected_result_type + { + std::string platform_coin; + std::unordered_map balances; + }; + + using expected_error_type = rpc_basic_error_type; + + expected_request_type request; + std::optional result; + std::optional error; + }; + + using enable_tendermint_token_rpc_request = enable_tendermint_token_rpc::expected_request_type; + using enable_tendermint_token_rpc_result = enable_tendermint_token_rpc::expected_result_type; + using enable_tendermint_token_rpc_error = enable_tendermint_token_rpc::expected_error_type; + + void to_json(nlohmann::json& j, const enable_tendermint_token_rpc_request& request); + void from_json(const nlohmann::json& j, enable_tendermint_token_rpc_result& in); +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_with_assets.cpp b/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_with_assets.cpp new file mode 100644 index 0000000000..b924bbe656 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_with_assets.cpp @@ -0,0 +1,39 @@ +#include + +#include "rpc2.enable_tendermint_with_assets.hpp" + +namespace atomic_dex::mm2 +{ + void to_json(nlohmann::json& j, const enable_tendermint_with_assets_request_rpc& in) + { + j["ticker"] = in.ticker; + j["rpc_urls"] = in.rpc_urls; + j["tx_history"] = in.tx_history; + j["tokens_params"] = in.tokens_params; + if (in.required_confirmations.has_value()) + j["required_confirmations"] = in.required_confirmations.value(); + if (in.requires_notarization.has_value()) + j["requires_notarization"] = in.requires_notarization.value(); + } + + void to_json(nlohmann::json& j, const enable_tendermint_with_assets_request_rpc::tendermint_token_request_t& in) + { + j["ticker"] = in.ticker; + if (in.required_confirmations) + j["required_confirmations"] = in.required_confirmations.value(); + } + + void from_json(const nlohmann::json& json, enable_tendermint_with_assets_result_rpc& out) + { + out.address = json["address"]; + out.current_block = json["current_block"]; + out.tendermint_balances_infos = json["balance"].get(); + out.tendermint_token_balances_infos = json["tokens_balances"].get(); + } + + void from_json(const nlohmann::json& json, enable_tendermint_with_assets_result_rpc::tendermint_balance_infos_t& out) + { + out.balances.spendable = json["spendable"]; + out.balances.unspendable = json["unspendable"]; + } +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_with_assets.hpp b/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_with_assets.hpp new file mode 100644 index 0000000000..c65408658f --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.enable_tendermint_with_assets.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include + +#include "rpc.hpp" +#include "balance_info.hpp" +#include "atomicdex/config/electrum.cfg.hpp" + +namespace atomic_dex::mm2 +{ + struct enable_tendermint_with_assets_rpc + { + static constexpr auto endpoint = "enable_tendermint_with_assets"; + static constexpr bool is_v2 = true; + + struct expected_request_type + { + struct tendermint_token_request_t + { + std::string ticker; + std::optional required_confirmations; + }; + + std::string ticker; + std::vector rpc_urls; + bool tx_history{true}; + std::vector tokens_params; + std::optional required_confirmations; + std::optional requires_notarization; + }; + + struct expected_result_type + { + struct tendermint_balance_infos_t + { + balance_info balances; + }; + + std::string address; + std::size_t current_block; + tendermint_balance_infos_t tendermint_balances_infos; + std::unordered_map tendermint_token_balances_infos; + }; + + using expected_error_type = rpc_basic_error_type; + + expected_request_type request; + std::optional result; + std::optional error; + }; + + using enable_tendermint_with_assets_request_rpc = enable_tendermint_with_assets_rpc::expected_request_type; + using enable_tendermint_with_assets_result_rpc = enable_tendermint_with_assets_rpc::expected_result_type; + using enable_tendermint_with_assets_error_rpc = enable_tendermint_with_assets_rpc::expected_error_type; + + void to_json(nlohmann::json& j, const enable_tendermint_with_assets_request_rpc& in); + void to_json(nlohmann::json& j, const enable_tendermint_with_assets_request_rpc::tendermint_token_request_t& in); + void from_json(const nlohmann::json& json, enable_tendermint_with_assets_result_rpc& out); + void from_json(const nlohmann::json& json, enable_tendermint_with_assets_result_rpc::tendermint_balance_infos_t& out); +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.cancel.cpp b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.cancel.cpp new file mode 100644 index 0000000000..1c2a90f384 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.cancel.cpp @@ -0,0 +1,53 @@ +/****************************************************************************** + * Copyright © 2013-2022 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. * + * * + ******************************************************************************/ + +//! Deps +#include + +//! Project Headers +#include "atomicdex/api/mm2/rpc2.task.enable_z_coin.cancel.hpp" + +//! Implementation 2.0 RPC [enable_z_coin_cancel] +namespace atomic_dex::mm2 +{ + //! Serialization + void to_json(nlohmann::json& j, const enable_z_coin_cancel_request& request) + { + j["params"]["task_id"] = request.task_id; + } + + //! Deserialization + void from_json(const nlohmann::json& j, enable_z_coin_cancel_answer_success& answer) + { + answer.result = j.at("result").get(); + } + + void + from_json(const nlohmann::json& j, enable_z_coin_cancel_answer& answer) + { + if (j.count("error") >= 1) + { + answer.error = j; + } + else + { + if (j.contains("result") && j.contains("mmrpc") && j.at("mmrpc").get() == "2.0") + { + answer.result = j.get(); + } + } + } +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.cancel.hpp b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.cancel.hpp new file mode 100644 index 0000000000..fa6976dfc3 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.cancel.hpp @@ -0,0 +1,60 @@ +/****************************************************************************** + * Copyright © 2013-2022 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 + +// Std Headers +#include + +// Deps Headers +#include + +//! Project Headers +#include "generic.error.hpp" + +namespace atomic_dex::mm2 +{ + struct enable_z_coin_cancel_request + { + int task_id; + }; + + void to_json(nlohmann::json& j, const enable_z_coin_cancel_request& request); + + struct enable_z_coin_cancel_answer_success + { + std::string result; + }; + + void from_json(const nlohmann::json& j, enable_z_coin_cancel_answer_success& answer); + + struct enable_z_coin_cancel_answer + { + std::optional result; + std::optional error; + std::string raw_result; ///< internal + int rpc_result_code; ///< internal + }; + + void from_json(const nlohmann::json& j, enable_z_coin_cancel_answer& answer); +} + +namespace atomic_dex +{ + using t_enable_z_coin_cancel_request = mm2::enable_z_coin_cancel_request; + using t_enable_z_coin_cancel_answer = mm2::enable_z_coin_cancel_answer; + using t_enable_z_coin_cancel_answer_success = mm2::enable_z_coin_cancel_answer_success; +} // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc2.init_z_coin.cpp b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.init.cpp similarity index 78% rename from src/core/atomicdex/api/mm2/rpc2.init_z_coin.cpp rename to src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.init.cpp index 6c61b672eb..a4eadae928 100644 --- a/src/core/atomicdex/api/mm2/rpc2.init_z_coin.cpp +++ b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.init.cpp @@ -18,23 +18,26 @@ #include //! Project Headers -#include "atomicdex/api/mm2/rpc2.init_z_coin.hpp" +#include "atomicdex/api/mm2/rpc2.task.enable_z_coin.init.hpp" -//! Implementation 2.0 RPC [init_z_coin] +//! Implementation 2.0 RPC [enable_z_coin] namespace atomic_dex::mm2 { //! Serialization - void to_json(nlohmann::json& j, const init_z_coin_request& request) + void to_json(nlohmann::json& j, const enable_z_coin_request& request) { j["params"]["ticker"] = request.coin_name; j["params"]["activation_params"]["mode"]["rpc"] = "Light"; + j["params"]["activation_params"]["mode"]["rpc_data"]["sync_params"]["height"] = request.sync_height; j["params"]["activation_params"]["mode"]["rpc_data"]["electrum_servers"] = request.servers; j["params"]["activation_params"]["mode"]["rpc_data"]["light_wallet_d_servers"] = request.z_urls; + j["params"]["activation_params"]["scan_blocks_per_iteration"] = 5000; + j["params"]["activation_params"]["scan_interval"] = 0; j["params"]["tx_history"] = request.with_tx_history; } //! Deserialization - void from_json(const nlohmann::json& j, init_z_coin_answer& answer) + void from_json(const nlohmann::json& j, enable_z_coin_answer& answer) { j.at("task_id").get_to(answer.task_id); } diff --git a/src/core/atomicdex/api/mm2/rpc2.init_z_coin.hpp b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.init.hpp similarity index 82% rename from src/core/atomicdex/api/mm2/rpc2.init_z_coin.hpp rename to src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.init.hpp index d7fe101369..7fa02c2f92 100644 --- a/src/core/atomicdex/api/mm2/rpc2.init_z_coin.hpp +++ b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.init.hpp @@ -28,27 +28,28 @@ namespace atomic_dex::mm2 { - struct init_z_coin_request + struct enable_z_coin_request { std::string coin_name; std::vector servers; std::vector z_urls; CoinType coin_type; + int sync_height{0}; bool is_testnet{false}; bool with_tx_history{false}; // Not yet in API }; - struct init_z_coin_answer + struct enable_z_coin_answer { int task_id; }; - void to_json(nlohmann::json& j, const init_z_coin_request& request); - void from_json(const nlohmann::json& j, init_z_coin_answer& answer); + void to_json(nlohmann::json& j, const enable_z_coin_request& request); + void from_json(const nlohmann::json& j, enable_z_coin_answer& answer); } namespace atomic_dex { - using t_init_z_coin_request = mm2::init_z_coin_request; - using t_init_z_coin_answer = mm2::init_z_coin_answer; + using t_enable_z_coin_request = mm2::enable_z_coin_request; + using t_enable_z_coin_answer = mm2::enable_z_coin_answer; } // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.cpp b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.status.cpp similarity index 75% rename from src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.cpp rename to src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.status.cpp index ded987e419..eff12d0753 100644 --- a/src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.cpp +++ b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.status.cpp @@ -18,19 +18,20 @@ #include //! Project Headers -#include "atomicdex/api/mm2/rpc2.init_z_coin_status.hpp" +#include "atomicdex/api/mm2/rpc2.task.enable_z_coin.status.hpp" -//! Implementation 2.0 RPC [init_z_coin_status] +//! Implementation 2.0 RPC [enable_z_coin_status] namespace atomic_dex::mm2 { //! Serialization - void to_json(nlohmann::json& j, const init_z_coin_status_request& request) + void to_json(nlohmann::json& j, const enable_z_coin_status_request& request) { j["params"]["task_id"] = request.task_id; + j["params"]["forget_if_finished"] = false; } //! Deserialization - void from_json(const nlohmann::json& j, init_z_coin_status_answer_success& answer) + void from_json(const nlohmann::json& j, enable_z_coin_status_answer_success& answer) { j.at("result").at("status").get_to(answer.status); // [InProgress, Ready] j.at("result").at("details").get_to(answer.details); @@ -48,21 +49,21 @@ namespace atomic_dex::mm2 if (j.at("result").at("details").contains("result")) { - answer.coin = j.at("result").at("details").at("result").at("ticker").get(); - answer.current_block = j.at("result").at("details").at("result").at("current_block").get(); + answer.coin = j.at("result").at("details").at("ticker").get(); + answer.current_block = j.at("result").at("details").at("current_block").get(); - if (j.at("result").at("details").at("result").contains("wallet_balance")) + if (j.at("result").at("details").contains("wallet_balance")) { - answer.wallet_type = j.at("result").at("details").at("result").at("wallet_balance").at("wallet_type").get(); - answer.address = j.at("result").at("details").at("result").at("wallet_balance").at("address").get(); - answer.spendable_balance = j.at("result").at("details").at("result").at("wallet_balance").at("balance").at("spendable").get(); - answer.unspendable_balance = j.at("result").at("details").at("result").at("wallet_balance").at("balance").at("unspendable").get(); + answer.wallet_type = j.at("result").at("details").at("wallet_balance").at("wallet_type").get(); + answer.address = j.at("result").at("details").at("wallet_balance").at("address").get(); + answer.spendable_balance = j.at("result").at("details").at("wallet_balance").at("balance").at("spendable").get(); + answer.unspendable_balance = j.at("result").at("details").at("wallet_balance").at("balance").at("unspendable").get(); } } } void - from_json(const nlohmann::json& j, init_z_coin_status_answer& answer) + from_json(const nlohmann::json& j, enable_z_coin_status_answer& answer) { if (j.count("error") >= 1) { @@ -72,7 +73,7 @@ namespace atomic_dex::mm2 { if (j.contains("result") && j.contains("mmrpc") && j.at("mmrpc").get() == "2.0") { - answer.result = j.at("result").get(); + answer.result = j.at("result").get(); } } } diff --git a/src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.hpp b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.status.hpp similarity index 75% rename from src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.hpp rename to src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.status.hpp index 845c5e6356..e55735448f 100644 --- a/src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.hpp +++ b/src/core/atomicdex/api/mm2/rpc2.task.enable_z_coin.status.hpp @@ -27,14 +27,14 @@ namespace atomic_dex::mm2 { - struct init_z_coin_status_request + struct enable_z_coin_status_request { int task_id; }; - void to_json(nlohmann::json& j, const init_z_coin_status_request& request); + void to_json(nlohmann::json& j, const enable_z_coin_status_request& request); - struct init_z_coin_status_answer_success + struct enable_z_coin_status_answer_success { std::string status{"disabled"}; std::string details{"N/A"}; @@ -48,22 +48,22 @@ namespace atomic_dex::mm2 std::optional unspendable_balance; }; - void from_json(const nlohmann::json& j, init_z_coin_status_answer_success& answer); + void from_json(const nlohmann::json& j, enable_z_coin_status_answer_success& answer); - struct init_z_coin_status_answer + struct enable_z_coin_status_answer { - std::optional result; + std::optional result; std::optional error; std::string raw_result; ///< internal int rpc_result_code; ///< internal }; - void from_json(const nlohmann::json& j, init_z_coin_status_answer& answer); + void from_json(const nlohmann::json& j, enable_z_coin_status_answer& answer); } namespace atomic_dex { - using t_init_z_coin_status_request = mm2::init_z_coin_status_request; - using t_init_z_coin_status_answer = mm2::init_z_coin_status_answer; - using t_init_z_coin_status_answer_success = mm2::init_z_coin_status_answer_success; + using t_enable_z_coin_status_request = mm2::enable_z_coin_status_request; + using t_enable_z_coin_status_answer = mm2::enable_z_coin_status_answer; + using t_enable_z_coin_status_answer_success = mm2::enable_z_coin_status_answer_success; } // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/rpc2.init_withdraw.cpp b/src/core/atomicdex/api/mm2/rpc2.task.withdraw.init.cpp similarity index 82% rename from src/core/atomicdex/api/mm2/rpc2.init_withdraw.cpp rename to src/core/atomicdex/api/mm2/rpc2.task.withdraw.init.cpp index b42ca76fb2..29d44086fe 100644 --- a/src/core/atomicdex/api/mm2/rpc2.init_withdraw.cpp +++ b/src/core/atomicdex/api/mm2/rpc2.task.withdraw.init.cpp @@ -18,20 +18,20 @@ #include //! Project Headers -#include "atomicdex/api/mm2/rpc2.init_withdraw.hpp" +#include "atomicdex/api/mm2/rpc2.task.withdraw.init.hpp" -//! Implementation 2.0 RPC [init_withdraw] +//! Implementation 2.0 RPC [withdraw_init] namespace atomic_dex::mm2 { void - to_json(nlohmann::json& j, const init_withdraw_fees& request) + to_json(nlohmann::json& j, const withdraw_init_fees& request) { j["type"] = request.type; j["amount"] = request.amount.value(); } //! Serialization - void to_json(nlohmann::json& j, const init_withdraw_request& request) + void to_json(nlohmann::json& j, const withdraw_init_request& request) { nlohmann::json obj = nlohmann::json::object(); @@ -40,6 +40,10 @@ namespace atomic_dex::mm2 obj["params"]["amount"] = request.amount; obj["params"]["max"] = request.max; + if (request.memo.has_value()) + { + obj["params"]["memo"] = request.memo.value(); + } if (request.fees.has_value()) { obj["params"]["fee"] = request.fees.value(); @@ -48,7 +52,7 @@ namespace atomic_dex::mm2 } //! Deserialization - void from_json(const nlohmann::json& j, init_withdraw_answer& answer) + void from_json(const nlohmann::json& j, withdraw_init_answer& answer) { j.at("task_id").get_to(answer.task_id); } diff --git a/src/core/atomicdex/api/mm2/rpc2.init_withdraw.hpp b/src/core/atomicdex/api/mm2/rpc2.task.withdraw.init.hpp similarity index 76% rename from src/core/atomicdex/api/mm2/rpc2.init_withdraw.hpp rename to src/core/atomicdex/api/mm2/rpc2.task.withdraw.init.hpp index 2f214f6de9..88558fd1cd 100644 --- a/src/core/atomicdex/api/mm2/rpc2.init_withdraw.hpp +++ b/src/core/atomicdex/api/mm2/rpc2.task.withdraw.init.hpp @@ -24,33 +24,34 @@ namespace atomic_dex::mm2 { - struct init_withdraw_fees + struct withdraw_init_fees { std::string type; ///< UtxoFixed, UtxoPerKbyte, EthGas, Qrc20Gas std::optional amount; ///< Utxo only }; - struct init_withdraw_request + struct withdraw_init_request { std::string coin; std::string to; std::string amount; - std::optional fees{std::nullopt}; ///< ignored if std::nullopt + std::optional fees{std::nullopt}; ///< ignored if std::nullopt + std::optional memo; ///< memo for zhtlc bool max{false}; }; - struct init_withdraw_answer + struct withdraw_init_answer { int task_id; }; - void to_json(nlohmann::json& j, const init_withdraw_request& request); - void from_json(const nlohmann::json& j, init_withdraw_answer& answer); + void to_json(nlohmann::json& j, const withdraw_init_request& request); + void from_json(const nlohmann::json& j, withdraw_init_answer& answer); } namespace atomic_dex { - using t_init_withdraw_request = mm2::init_withdraw_request; - using t_init_withdraw_fees = mm2::init_withdraw_fees; - using t_init_withdraw_answer = mm2::init_withdraw_answer; + using t_withdraw_init_request = mm2::withdraw_init_request; + using t_withdraw_init_fees = mm2::withdraw_init_fees; + using t_withdraw_init_answer = mm2::withdraw_init_answer; } // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/rpc2.withdraw_status.cpp b/src/core/atomicdex/api/mm2/rpc2.task.withdraw.status.cpp similarity index 90% rename from src/core/atomicdex/api/mm2/rpc2.withdraw_status.cpp rename to src/core/atomicdex/api/mm2/rpc2.task.withdraw.status.cpp index c38d5cfbe0..9df0b7b0af 100644 --- a/src/core/atomicdex/api/mm2/rpc2.withdraw_status.cpp +++ b/src/core/atomicdex/api/mm2/rpc2.task.withdraw.status.cpp @@ -18,7 +18,7 @@ #include //! Project Headers -#include "atomicdex/api/mm2/rpc2.withdraw_status.hpp" +#include "atomicdex/api/mm2/rpc2.task.withdraw.status.hpp" //! Implementation 2.0 RPC [withdraw_status] namespace atomic_dex::mm2 @@ -27,6 +27,7 @@ namespace atomic_dex::mm2 void to_json(nlohmann::json& j, const withdraw_status_request& request) { j["params"]["task_id"] = request.task_id; + j["params"]["forget_if_finished"] = false; } //! Deserialization @@ -38,7 +39,7 @@ namespace atomic_dex::mm2 } else { - answer.result = j.at("result").at("details").at("result").get(); + answer.result = j.at("result").at("details").get(); } } } // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc2.withdraw_status.hpp b/src/core/atomicdex/api/mm2/rpc2.task.withdraw.status.hpp similarity index 100% rename from src/core/atomicdex/api/mm2/rpc2.withdraw_status.hpp rename to src/core/atomicdex/api/mm2/rpc2.task.withdraw.status.hpp diff --git a/src/core/atomicdex/api/mm2/rpc.withdraw.cpp b/src/core/atomicdex/api/mm2/rpc2.withdraw.cpp similarity index 66% rename from src/core/atomicdex/api/mm2/rpc.withdraw.cpp rename to src/core/atomicdex/api/mm2/rpc2.withdraw.cpp index a37bd5c91d..cdf6ccf902 100644 --- a/src/core/atomicdex/api/mm2/rpc.withdraw.cpp +++ b/src/core/atomicdex/api/mm2/rpc2.withdraw.cpp @@ -6,7 +6,7 @@ #include //! Our Headers -#include "rpc.withdraw.hpp" +#include "rpc2.withdraw.hpp" namespace atomic_dex::mm2 { @@ -41,22 +41,19 @@ namespace atomic_dex::mm2 { nlohmann::json obj = nlohmann::json::object(); - obj["coin"] = cfg.coin; - obj["amount"] = cfg.amount; - obj["to"] = cfg.to; - obj["max"] = cfg.max; - if (cfg.fees.has_value()) - { - obj["fee"] = cfg.fees.value(); - } - if (j.contains("mmrpc") && j.at("mmrpc").get() == "2.0") + obj["params"]["coin"] = cfg.coin; + obj["params"]["amount"] = cfg.amount; + obj["params"]["to"] = cfg.to; + obj["params"]["max"] = cfg.max; + if (cfg.memo.has_value()) { - j["params"] = obj; + obj["params"]["memo"] = cfg.memo.value(); } - else + if (cfg.fees.has_value()) { - j.update(obj); + obj["params"]["fee"] = cfg.fees.value(); } + j.update(obj); } void @@ -68,14 +65,7 @@ namespace atomic_dex::mm2 } else { - if (j.contains("result") && j.contains("mmrpc") && j.at("mmrpc").get() == "2.0") - { - answer.result = j.at("result").get(); - } - else - { - answer.result = j.get(); - } + answer.result = j.at("result").get(); } } } // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.withdraw.hpp b/src/core/atomicdex/api/mm2/rpc2.withdraw.hpp similarity index 95% rename from src/core/atomicdex/api/mm2/rpc.withdraw.hpp rename to src/core/atomicdex/api/mm2/rpc2.withdraw.hpp index d424c7c825..51b9a687d8 100644 --- a/src/core/atomicdex/api/mm2/rpc.withdraw.hpp +++ b/src/core/atomicdex/api/mm2/rpc2.withdraw.hpp @@ -28,6 +28,7 @@ namespace atomic_dex::mm2 std::string to; ///< coins will be withdraw to this address std::string amount; ///< ignored if max is true std::optional fees{std::nullopt}; ///< ignored if std::nullopt + std::optional memo; ///< memo for tendermint bool max{false}; }; diff --git a/src/core/atomicdex/api/mm2/transaction.data.cpp b/src/core/atomicdex/api/mm2/transaction.data.cpp index 54dbf4b2e8..fd140e4667 100644 --- a/src/core/atomicdex/api/mm2/transaction.data.cpp +++ b/src/core/atomicdex/api/mm2/transaction.data.cpp @@ -18,6 +18,14 @@ namespace atomic_dex::mm2 j.at("total_fee").get_to(cfg.total_fee); } + void from_json(const nlohmann::json& j, fee_tendermint_coin& cfg) + { + j.at("coin").get_to(cfg.coin); + j.at("type").get_to(cfg.type); + j.at("amount").get_to(cfg.amount); + j.at("gas_limit").get_to(cfg.gas_limit); + } + void from_json(const nlohmann::json& j, fee_qrc_coin& cfg) { j.at("coin").get_to(cfg.coin); @@ -78,6 +86,20 @@ namespace atomic_dex::mm2 cfg.confirmations = j.at("confirmations").get(); } + // API returns null if no memo + if (j.contains("memo")) + { + try + { + cfg.memo = j.at("memo").get(); + } + catch (const std::exception& ex) + { + cfg.memo = ""; + //SPDLOG_ERROR("Error parsing memo: {}", ex.what()); + } + } + if (cfg.from.empty()) { if (cfg.coin == "FIRO") @@ -90,6 +112,11 @@ namespace atomic_dex::mm2 } } + if (j.contains("transaction_type")) + { + cfg.transaction_type = j.at("transaction_type").get(); + } + // transaction_fee only in ZHTLC response if (j.contains("transaction_fee")) { diff --git a/src/core/atomicdex/api/mm2/transaction.data.hpp b/src/core/atomicdex/api/mm2/transaction.data.hpp index 9882c9a532..a39f64b9fd 100644 --- a/src/core/atomicdex/api/mm2/transaction.data.hpp +++ b/src/core/atomicdex/api/mm2/transaction.data.hpp @@ -25,6 +25,16 @@ namespace atomic_dex::mm2 void from_json(const nlohmann::json& j, fee_erc_coin& cfg); + struct fee_tendermint_coin + { + std::string type; + std::string coin; + std::string amount; + std::size_t gas_limit; + }; + + void from_json(const nlohmann::json& j, fee_erc_coin& cfg); + struct fee_qrc_coin { std::string coin; @@ -38,9 +48,10 @@ namespace atomic_dex::mm2 struct fees_data { - std::optional normal_fees; ///< btc, kmd based coins - std::optional erc_fees; ///< eth based coins - std::optional qrc_fees; // Qtum based coin + std::optional normal_fees; ///< btc, kmd based coins + std::optional erc_fees; ///< eth based coins + std::optional qrc_fees; // Qtum based coin + std::optional tendermint_fees; // Qtum based coin }; void from_json(const nlohmann::json& j, fees_data& cfg); @@ -48,21 +59,23 @@ namespace atomic_dex::mm2 struct transaction_data { std::size_t timestamp; + std::string tx_hex; + std::string tx_hash; std::vector from; std::vector to; - fees_data fee_details; - std::size_t block_height; - std::string coin; + std::string total_amount{"0"}; std::string spent_by_me; std::string received_by_me; std::string my_balance_change; - std::string total_amount{"0"}; - std::string tx_hash; - std::string tx_hex; - std::string timestamp_as_date; ///< human readeable timestamp + std::size_t block_height; + fees_data fee_details; + std::string coin; std::optional transaction_fee; std::optional internal_id; std::optional confirmations; + std::optional transaction_type; + std::optional memo; + std::string timestamp_as_date; ///< human readeable timestamp }; void from_json(const nlohmann::json& j, transaction_data& cfg); diff --git a/src/core/atomicdex/config/app.cfg.cpp b/src/core/atomicdex/config/app.cfg.cpp index c4b25502cb..ba9fb02313 100644 --- a/src/core/atomicdex/config/app.cfg.cpp +++ b/src/core/atomicdex/config/app.cfg.cpp @@ -39,15 +39,17 @@ namespace file.open(QIODevice::ReadOnly | QIODevice::Text); nlohmann::json config_json_data; - QString val = file.readAll(); - config_json_data = nlohmann::json::parse(val.toStdString()); - config_json_data["current_currency"] = config.current_currency; - config_json_data["current_fiat"] = config.current_fiat; - config_json_data["possible_currencies"] = config.possible_currencies; - config_json_data["current_currency_sign"] = config.current_currency_sign; - config_json_data["current_fiat_sign"] = config.current_fiat_sign; - config_json_data["available_signs"] = config.available_currency_signs; - config_json_data["notification_enabled"] = config.notification_enabled; + QString val = file.readAll(); + config_json_data = nlohmann::json::parse(val.toStdString()); + config_json_data["current_currency"] = config.current_currency; + config_json_data["current_fiat"] = config.current_fiat; + config_json_data["recommended_fiat"] = config.recommended_fiat; + config_json_data["possible_currencies"] = config.possible_currencies; + config_json_data["current_currency_sign"] = config.current_currency_sign; + config_json_data["current_fiat_sign"] = config.current_fiat_sign; + config_json_data["available_signs"] = config.available_currency_signs; + config_json_data["notification_enabled"] = config.notification_enabled; + config_json_data["spamfilter_enabled"] = config.spamfilter_enabled; file.close(); @@ -66,11 +68,21 @@ namespace atomic_dex 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("recommended_fiat").get_to(config.recommended_fiat); j.at("possible_currencies").get_to(config.possible_currencies); j.at("current_currency_sign").get_to(config.current_currency_sign); j.at("available_signs").get_to(config.available_currency_signs); j.at("current_fiat_sign").get_to(config.current_fiat_sign); j.at("notification_enabled").get_to(config.notification_enabled); + + if (j.contains("spamfilter_enabled")) + { + j.at("spamfilter_enabled").get_to(config.spamfilter_enabled); + } + else + { + config.spamfilter_enabled = true; + } } void @@ -83,6 +95,16 @@ namespace atomic_dex } } + void + change_spamfilter_status(cfg& config, bool is_enabled) + { + if (config.spamfilter_enabled != is_enabled) + { + config.spamfilter_enabled = is_enabled; + upgrade_cfg(config); + } + } + cfg load_cfg() { @@ -124,9 +146,21 @@ namespace atomic_dex if (is_this_currency_a_fiat(config, new_currency)) { SPDLOG_INFO("{} is fiat, setting it as current fiat and possible currencies", new_currency); - config.current_fiat = new_currency; - config.current_fiat_sign = config.current_currency_sign; - config.possible_currencies[0] = new_currency; + config.current_fiat = new_currency; + config.current_fiat_sign = config.current_currency_sign; + config.possible_currencies[0] = new_currency; + bool update_recommended_fiat{true}; + + if (std::count(config.recommended_fiat.begin(), config.recommended_fiat.end(), new_currency)) + { + SPDLOG_INFO("{} is already in recommended fiats", new_currency); + update_recommended_fiat = false; + } + if (update_recommended_fiat) { + SPDLOG_INFO("Adding {} to recommended fiats", new_currency); + config.recommended_fiat.pop_back(); + config.recommended_fiat.insert(config.recommended_fiat.begin(), new_currency); + } } upgrade_cfg(config); } diff --git a/src/core/atomicdex/config/app.cfg.hpp b/src/core/atomicdex/config/app.cfg.hpp index 3edd54cfa6..41b954d4dc 100644 --- a/src/core/atomicdex/config/app.cfg.hpp +++ b/src/core/atomicdex/config/app.cfg.hpp @@ -29,14 +29,17 @@ namespace atomic_dex std::string current_fiat_sign; std::unordered_map available_currency_signs; std::vector available_fiat; + std::vector recommended_fiat; std::vector possible_currencies; bool notification_enabled; + bool spamfilter_enabled{false}; }; void from_json(const nlohmann::json& j, cfg& config); void change_currency(cfg& config, const std::string& new_currency); void change_fiat(cfg& config, const std::string& new_fiat); void change_notification_status(cfg& config, bool is_enabled); + void change_spamfilter_status(cfg& config, bool is_enabled); [[nodiscard]] bool is_this_currency_a_fiat(const cfg& config, const std::string& currency); cfg load_cfg(); std::string retrieve_sign_from_ticker(const cfg& config, const std::string& currency); diff --git a/src/core/atomicdex/config/coins.cfg.cpp b/src/core/atomicdex/config/coins.cfg.cpp index b74b08a035..f428f7abc9 100644 --- a/src/core/atomicdex/config/coins.cfg.cpp +++ b/src/core/atomicdex/config/coins.cfg.cpp @@ -23,7 +23,8 @@ namespace { - CoinType get_coin_type_from_str(const std::string& coin_type) + CoinType + get_coin_type_from_str(const std::string& coin_type) { if (coin_type == "QRC-20") { @@ -33,6 +34,10 @@ namespace { return CoinType::ERC20; } + if (coin_type == "EWT") + { + return CoinType::EWT; + } if (coin_type == "UTXO") { return CoinType::UTXO; @@ -105,6 +110,14 @@ namespace { return CoinType::RSK; } + if (coin_type == "TENDERMINT") + { + return CoinType::TENDERMINT; + } + if (coin_type == "TENDERMINTTOKEN") + { + return CoinType::TENDERMINTTOKEN; + } if (coin_type == "ZHTLC") { return CoinType::ZHTLC; @@ -113,18 +126,25 @@ namespace return CoinType::Invalid; // throw std::invalid_argument{"Undefined given coin type."}; } -} +} // namespace namespace atomic_dex { - bool is_wallet_only(std::string ticker) + bool + is_wallet_only(std::string ticker) { return std::any_of(g_wallet_only_coins.begin(), g_wallet_only_coins.end(), [ticker](std::string x) { return ticker == x; }); } - bool is_default_coin(std::string ticker) + bool + is_default_coin(std::string ticker) { return std::any_of(g_default_coins.begin(), g_default_coins.end(), [ticker](std::string x) { return ticker == x; }); } + bool + is_faucet_coin(std::string ticker) + { + return std::any_of(g_faucet_coins.begin(), g_faucet_coins.end(), [ticker](std::string x) { return ticker == x; }); + } void from_json(const nlohmann::json& j, coin_config& cfg) @@ -135,28 +155,30 @@ namespace atomic_dex cfg.coin_type = get_coin_type_from_str(cfg.type); j.at("active").get_to(cfg.active); j.at("explorer_url").get_to(cfg.explorer_url); - + cfg.has_memos = false; cfg.gui_ticker = j.contains("gui_coin") ? j.at("gui_coin").get() : cfg.ticker; + cfg.parent_coin = j.contains("parent_coin") ? j.at("parent_coin").get() : cfg.ticker; cfg.minimal_claim_amount = cfg.is_claimable ? j.at("minimal_claim_amount").get() : "0"; cfg.coinpaprika_id = j.contains("coinpaprika_id") ? j.at("coinpaprika_id").get() : "test-coin"; cfg.coingecko_id = j.contains("coingecko_id") ? j.at("coingecko_id").get() : "test-coin"; - cfg.nomics_id = j.contains("nomics_id") ? j.at("nomics_id").get() : "test-coin"; + cfg.livecoinwatch_id = j.contains("livecoinwatch_id") ? j.at("livecoinwatch_id").get() : "test-coin"; cfg.is_claimable = j.count("is_claimable") > 0; cfg.is_custom_coin = j.contains("is_custom_coin") ? j.at("is_custom_coin").get() : false; cfg.is_testnet = j.contains("is_testnet") ? j.at("is_testnet").get() : false; cfg.wallet_only = is_wallet_only(cfg.ticker) ? is_wallet_only(cfg.ticker) : j.contains("wallet_only") ? j.at("wallet_only").get() : false; cfg.default_coin = is_default_coin(cfg.ticker); + cfg.is_faucet_coin = is_faucet_coin(cfg.ticker); + cfg.checkpoint_height = 0; + cfg.checkpoint_blocktime = 0; + using namespace std::chrono; if (j.contains("other_types")) { std::vector other_types; - + j.at("other_types").get_to(other_types); cfg.other_types = std::set(); - for (const auto& other_type : other_types) - { - cfg.other_types->emplace(get_coin_type_from_str(other_type)); - } + for (const auto& other_type: other_types) { cfg.other_types->emplace(get_coin_type_from_str(other_type)); } } if (j.contains("utxo_merge")) { @@ -182,12 +204,19 @@ namespace atomic_dex if (j.contains("nodes")) { // Todo: this is bad, we are using 2 times the required memory. Something can be improved here. - cfg.urls = j.at("nodes").get>(); + cfg.urls = j.at("nodes").get>(); cfg.eth_family_urls = std::vector(); cfg.eth_family_urls.value().reserve(cfg.urls.value().size()); - for (const auto& url : cfg.urls.value()) + for (const auto& url: cfg.urls.value()) { cfg.eth_family_urls->push_back(url.url); } + } + if (j.contains("rpc_urls")) + { + auto rpc_urls_obj = j.at("rpc_urls").get>(); + std::vector rpc_urls_list; + cfg.rpc_urls = rpc_urls_list; + for (const auto& url : rpc_urls_obj) { - cfg.eth_family_urls->push_back(url.url); + cfg.rpc_urls->push_back(url.url); } } if (j.contains("allow_slp_unsafe_conf")) @@ -199,16 +228,19 @@ namespace atomic_dex { cfg.z_urls = j.at("light_wallet_d_servers").get>(); } - if (j.contains("is_segwit_on")) + if (j.contains("checkpoint_blocktime")) { - cfg.segwit = true; - j.at("is_segwit_on").get_to(cfg.is_segwit_on); - SPDLOG_INFO("coin: {} support segwit with current_segwit mode: {}", cfg.ticker, cfg.is_segwit_on); + cfg.checkpoint_blocktime = j.at("checkpoint_blocktime").get(); + } + if (j.contains("checkpoint_height")) + { + cfg.checkpoint_height = j.at("checkpoint_height").get(); } if (j.contains("alias_ticker")) { cfg.alias_ticker = j.at("alias_ticker").get(); } + // Explorer url suffixes if (j.contains("explorer_tx_url")) { j.at("explorer_tx_url").get_to(cfg.tx_uri); @@ -217,6 +249,33 @@ namespace atomic_dex { j.at("explorer_address_url").get_to(cfg.address_url); } + // Swap contract addresses + if (j.contains("swap_contract_address")) + { + cfg.swap_contract_address = j["swap_contract_address"]; + } + if (j.contains("fallback_swap_contract_address")) + { + cfg.fallback_swap_contract_address = j["fallback_swap_contract_address"]; + } + // Gas station urls + if (j.contains("gas_station_url")) + { + cfg.gas_station_url = j.at("gas_station_url").get(); + } + if (j.contains("matic_gas_station_url")) + { + cfg.matic_gas_station_url = j.at("matic_gas_station_url").get(); + } + if (j.contains("testnet_matic_gas_station_url")) + { + cfg.testnet_matic_gas_station_url = j.at("testnet_matic_gas_station_url").get(); + } + if (j.contains("matic_gas_station_decimals")) + { + cfg.matic_gas_station_decimals = j.at("matic_gas_station_decimals").get(); + } + switch (cfg.coin_type) { @@ -249,6 +308,11 @@ namespace atomic_dex cfg.fees_ticker = "ETH-ARB20"; cfg.is_erc_family = true; break; + case CoinType::EWT: + cfg.has_parent_fees_ticker = true; + cfg.fees_ticker = "EWT"; + cfg.is_erc_family = true; + break; case CoinType::AVX20: cfg.has_parent_fees_ticker = true; cfg.fees_ticker = cfg.is_testnet.value() ? "AVAXT" : "AVAX"; @@ -308,10 +372,21 @@ namespace atomic_dex cfg.has_parent_fees_ticker = true; cfg.fees_ticker = cfg.is_testnet.value() ? "tBCH" : "BCH"; break; + case CoinType::TENDERMINT: + cfg.has_parent_fees_ticker = true; + cfg.fees_ticker = cfg.parent_coin; + cfg.has_memos = true; + break; + case CoinType::TENDERMINTTOKEN: + cfg.has_parent_fees_ticker = true; + cfg.fees_ticker = cfg.parent_coin; + cfg.has_memos = true; + break; case CoinType::ZHTLC: cfg.has_parent_fees_ticker = false; cfg.is_zhtlc_family = true; cfg.fees_ticker = cfg.ticker; + cfg.has_memos = true; break; case CoinType::Invalid: cfg.has_parent_fees_ticker = false; @@ -324,13 +399,12 @@ namespace atomic_dex } } - void print_coins(std::vector coins) + void + print_coins(std::vector coins) { std::stringstream ss; ss << "["; - for (auto&& coin: coins) { - ss << coin.ticker << " "; - } + for (auto&& coin: coins) { ss << coin.ticker << " "; } ss << "]"; SPDLOG_INFO("{}", ss.str()); } diff --git a/src/core/atomicdex/config/coins.cfg.hpp b/src/core/atomicdex/config/coins.cfg.hpp index b612e2684e..b33e79ac7b 100644 --- a/src/core/atomicdex/config/coins.cfg.hpp +++ b/src/core/atomicdex/config/coins.cfg.hpp @@ -32,50 +32,62 @@ namespace atomic_dex { struct coin_config { - static constexpr const char* erc_gas_stations = "https://ethgasstation.info/json/ethgasAPI.json"; - static constexpr const char* matic_gas_stations = "https://gasstation-mainnet.matic.network/"; + std::optional erc_gas_stations{std::nullopt}; + std::optional matic_gas_stations{std::nullopt}; using electrum_servers = std::vector; using nodes = std::vector; + using url_list = std::vector; using eth_family_url_list = std::vector; using bchd_url_list = std::vector; using light_wallet_d_servers = std::vector; ///< For ZHTLC - std::string ticker; - std::optional alias_ticker{std::nullopt}; - std::string gui_ticker; ///< Ticker displayed in the gui - std::string name; ///< nice name - std::optional utxo_merge{false}; - std::optional allow_slp_unsafe_conf; - std::optional urls; - std::optional eth_family_urls; - std::optional bchd_urls; - std::optional electrum_urls; - std::optional z_urls; - bool is_claimable{false}; - std::string minimal_claim_amount{"0"}; - bool currently_enabled{false}; - bool active{false}; - std::string coinpaprika_id{"test-coin"}; - std::string coingecko_id{"test-coin"}; - std::string nomics_id{"test-coin"}; - bool is_custom_coin{false}; - std::string type; - std::optional> other_types; - std::string explorer_url; ///< usefull for transaction, take this url and append transaction id - std::string tx_uri{"tx/"}; - std::string address_url{"address/"}; - std::optional custom_backup; - nlohmann::json activation_status; - std::optional is_testnet{false}; ///< True if testnet (tBTC, tQTUM, QRC-20 on testnet, tETH) - CoinType coin_type; - bool checked{false}; - bool wallet_only{false}; - bool has_parent_fees_ticker{false}; ///< True if parent fees is different from current ticker eg: ERC20 tokens - std::string fees_ticker; - bool segwit{false}; - bool is_segwit_on{false}; - bool is_erc_family{false}; - bool is_zhtlc_family{false}; - bool default_coin{false}; + std::string ticker; + std::string gui_ticker; ///< Ticker displayed in the gui + std::string name; ///< nice name + std::string parent_coin; + std::string fees_ticker; + std::string type; + std::string coinpaprika_id{"test-coin"}; + std::string coingecko_id{"test-coin"}; + std::string livecoinwatch_id{"test-coin"}; + std::string explorer_url; + std::string tx_uri{"tx/"}; + std::string address_url{"address/"}; + std::string minimal_claim_amount{"0"}; + CoinType coin_type; + nlohmann::json activation_status; + int checkpoint_height{0}; + int checkpoint_blocktime{0}; + bool segwit{false}; + bool active{false}; + bool checked{false}; + bool wallet_only{false}; + bool is_claimable{false}; + bool has_memos{false}; + bool is_custom_coin{false}; + bool is_faucet_coin{false}; + bool currently_enabled{false}; + bool has_parent_fees_ticker{false}; ///< True if parent fees is different from current ticker eg: ERC20 tokens + bool is_erc_family{false}; + bool is_zhtlc_family{false}; + bool default_coin{false}; + std::optional alias_ticker{std::nullopt}; + std::optional allow_slp_unsafe_conf; + std::optional is_testnet{false}; ///< True if testnet (tBTC, tQTUM, QRC-20 on testnet, tETH) + std::optional utxo_merge{false}; + std::optional swap_contract_address{std::nullopt}; + std::optional fallback_swap_contract_address{std::nullopt}; + std::optional gas_station_url{std::nullopt}; + std::optional matic_gas_station_url{std::nullopt}; + std::optional testnet_matic_gas_station_url{std::nullopt}; + std::optional matic_gas_station_decimals{std::nullopt}; + std::optional custom_backup; + std::optional> other_types; + std::optional electrum_urls; + std::optional urls; + std::optional rpc_urls; + std::optional z_urls; + std::optional eth_family_urls; + std::optional bchd_urls; }; void from_json(const nlohmann::json& j, coin_config& cfg); @@ -83,4 +95,5 @@ namespace atomic_dex void print_coins(std::vector coins); bool is_wallet_only(std::string ticker); bool is_default_coin(std::string ticker); -} // namespace atomic_dex + bool is_faucet_coin(std::string ticker); +} // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/constants/dex.constants.hpp b/src/core/atomicdex/constants/dex.constants.hpp index 631975d3fe..57360d61e1 100644 --- a/src/core/atomicdex/constants/dex.constants.hpp +++ b/src/core/atomicdex/constants/dex.constants.hpp @@ -37,6 +37,7 @@ namespace atomic_dex "REVS", "SUPERNET", "XPM", + "VOTE2023", "ATOM" }; } diff --git a/src/core/atomicdex/constants/qt.coins.enums.hpp b/src/core/atomicdex/constants/qt.coins.enums.hpp index 83f70bcc5e..be0c32e824 100644 --- a/src/core/atomicdex/constants/qt.coins.enums.hpp +++ b/src/core/atomicdex/constants/qt.coins.enums.hpp @@ -52,10 +52,13 @@ namespace atomic_dex EthereumClassic = 18, RSK = 19, ZHTLC = 20, - Disabled = 21, - Invalid = 22, - All = 23, - Size = 24 + TENDERMINT = 21, + TENDERMINTTOKEN = 22, + EWT = 23, + Disabled = 24, + Invalid = 25, + All = 26, + Size = 27 }; Q_ENUM(CoinTypeEnum) @@ -65,4 +68,4 @@ namespace atomic_dex }; } // namespace atomic_dex -using CoinType = atomic_dex::CoinTypeGadget::CoinTypeEnum; \ No newline at end of file +using CoinType = atomic_dex::CoinTypeGadget::CoinTypeEnum; diff --git a/src/core/atomicdex/events/events.hpp b/src/core/atomicdex/events/events.hpp index d5e23753ce..c5f34d4e73 100644 --- a/src/core/atomicdex/events/events.hpp +++ b/src/core/atomicdex/events/events.hpp @@ -30,7 +30,6 @@ namespace atomic_dex using gui_leave_trading = entt::tag<"gui_leave_trading"_hs>; using mm2_initialized = entt::tag<"mm2_running_and_enabling"_hs>; using default_coins_enabled = entt::tag<"default_coins_enabled"_hs>; - using band_oracle_refreshed = entt::tag<"band_oracle_refreshed"_hs>; using current_currency_changed = entt::tag<"update_orders_and_swap_values"_hs>; using force_update_providers = entt::tag<"force_update_providers"_hs>; using download_started = entt::tag<"download_started"_hs>; @@ -132,4 +131,4 @@ namespace atomic_dex { std::string message; }; -} // namespace atomic_dex \ No newline at end of file +} // namespace atomic_dex diff --git a/src/core/atomicdex/models/qt.global.coins.cfg.model.cpp b/src/core/atomicdex/models/qt.global.coins.cfg.model.cpp index 6acc6c482d..9af4ddcdf9 100644 --- a/src/core/atomicdex/models/qt.global.coins.cfg.model.cpp +++ b/src/core/atomicdex/models/qt.global.coins.cfg.model.cpp @@ -36,7 +36,7 @@ namespace {"ticker", QString::fromStdString(coin.ticker)}, {"name", QString::fromStdString(coin.name)}, {"type", QString::fromStdString(coin.type)}, - {"nomics_id", QString::fromStdString(coin.nomics_id)}, + {"livecoinwatch_id", QString::fromStdString(coin.livecoinwatch_id)}, {"explorer_url", QString::fromStdString(coin.explorer_url)}, {"tx_uri", QString::fromStdString(coin.tx_uri)}, {"address_uri", QString::fromStdString(coin.address_url)}, @@ -47,6 +47,9 @@ namespace {"is_erc_family", coin.is_erc_family}, {"is_zhtlc_family", coin.is_zhtlc_family}, {"is_wallet_only", coin.wallet_only}, + {"checkpoint_height", coin.checkpoint_height}, + {"checkpoint_blocktime", coin.checkpoint_blocktime}, + {"has_memos", coin.has_memos}, {"fees_ticker", QString::fromStdString(coin.fees_ticker)}}; return j; } @@ -206,7 +209,7 @@ namespace atomic_dex m_enabled_coins[cur.ticker] = cur; } } - cfg.push_back(coin_config{.ticker = "All", .currently_enabled = true, .active = true}); + cfg.push_back(coin_config{.ticker = "All", .active = true, .currently_enabled = true}); SPDLOG_INFO("Initializing global coin cfg model with size {}", cfg.size()); set_checked_nb(0); beginResetModel(); @@ -308,6 +311,12 @@ namespace atomic_dex return m_proxies[CoinType::ERC20]; } + global_coins_cfg_proxy_model* + global_coins_cfg_model::get_all_ewt_proxy() const + { + return m_proxies[CoinType::EWT]; + } + global_coins_cfg_proxy_model* global_coins_cfg_model::get_all_bep20_proxy() const { @@ -398,4 +407,4 @@ namespace atomic_dex auto cfg = get_coin_info(ticker.toStdString()); return QString::fromStdString(cfg.fees_ticker); } -} // namespace atomic_dex \ No newline at end of file +} // namespace atomic_dex diff --git a/src/core/atomicdex/models/qt.global.coins.cfg.model.hpp b/src/core/atomicdex/models/qt.global.coins.cfg.model.hpp index f64b244322..17ceb76bbb 100644 --- a/src/core/atomicdex/models/qt.global.coins.cfg.model.hpp +++ b/src/core/atomicdex/models/qt.global.coins.cfg.model.hpp @@ -83,6 +83,7 @@ namespace atomic_dex [[nodiscard]] global_coins_cfg_proxy_model* get_all_proxy() const; [[nodiscard]] global_coins_cfg_proxy_model* get_all_qrc20_proxy() const; [[nodiscard]] global_coins_cfg_proxy_model* get_all_erc20_proxy() const; + [[nodiscard]] global_coins_cfg_proxy_model* get_all_ewt_proxy() const; [[nodiscard]] global_coins_cfg_proxy_model* get_all_bep20_proxy() const; [[nodiscard]] global_coins_cfg_proxy_model* get_all_smartchains_proxy() const; [[nodiscard]] global_coins_cfg_proxy_model* get_all_utxo_proxy() const; @@ -104,6 +105,7 @@ namespace atomic_dex Q_PROPERTY(global_coins_cfg_proxy_model* all_proxy READ get_all_proxy NOTIFY all_proxyChanged) Q_PROPERTY(global_coins_cfg_proxy_model* all_qrc20_proxy READ get_all_qrc20_proxy NOTIFY all_qrc20_proxyChanged) Q_PROPERTY(global_coins_cfg_proxy_model* all_erc20_proxy READ get_all_erc20_proxy NOTIFY all_erc20_proxyChanged) + Q_PROPERTY(global_coins_cfg_proxy_model* all_ewt_proxy READ get_all_ewt_proxy NOTIFY all_ewt_proxyChanged) Q_PROPERTY(global_coins_cfg_proxy_model* all_bep20_proxy READ get_all_bep20_proxy NOTIFY all_bep20_proxyChanged) Q_PROPERTY(global_coins_cfg_proxy_model* all_smartchains_proxy READ get_all_smartchains_proxy NOTIFY all_smartchains_proxyChanged) Q_PROPERTY(global_coins_cfg_proxy_model* all_utxo_proxy READ get_all_utxo_proxy NOTIFY all_utxo_proxyChanged) @@ -119,6 +121,7 @@ namespace atomic_dex void all_proxyChanged(); void all_qrc20_proxyChanged(); void all_erc20_proxyChanged(); + void all_ewt_proxyChanged(); void all_bep20_proxyChanged(); void all_smartchains_proxyChanged(); void all_utxo_proxyChanged(); @@ -139,4 +142,4 @@ namespace atomic_dex entt::registry& m_entity_registry; }; -} // namespace atomic_dex \ No newline at end of file +} // namespace atomic_dex diff --git a/src/core/atomicdex/models/qt.orderbook.model.cpp b/src/core/atomicdex/models/qt.orderbook.model.cpp index daf5353b75..3abd2b6151 100644 --- a/src/core/atomicdex/models/qt.orderbook.model.cpp +++ b/src/core/atomicdex/models/qt.orderbook.model.cpp @@ -362,8 +362,9 @@ namespace atomic_dex } void - orderbook_model::reset_orderbook(const t_orders_contents& orderbook) + orderbook_model::reset_orderbook(const t_orders_contents& orderbook, bool is_bestorders) { + SPDLOG_DEBUG("[orderbook_model::reset_orderbook]"); if (!orderbook.empty()) { SPDLOG_INFO( @@ -381,6 +382,8 @@ namespace atomic_dex } this->endResetModel(); emit lengthChanged(); + // This assert was causing a crash due to duplicated UUIDs being filtered out for orders that exist for both segwit and non-segwit of a coin, + // because bestorders response will add duplicate entries (one for each address format) to the response. assert(m_model_data.size() == m_orders_id_registry.size()); } @@ -399,7 +402,6 @@ namespace atomic_dex SPDLOG_WARN("Order with uuid: {} already present...skipping.", order.uuid); return; } - assert(m_model_data.size() == m_orders_id_registry.size()); beginInsertRows(QModelIndex(), m_model_data.size(), m_model_data.size()); m_model_data.push_back(order); @@ -437,7 +439,6 @@ namespace atomic_dex { //! ID Found, update ! const QModelIndex& idx = res.at(0); - const auto uuid_to_be_updated = this->data(idx, OrderbookRoles::UUIDRole).toString().toStdString(); auto&& [_, new_price, is_price_changed] = update_value(OrderbookRoles::PriceRole, QString::fromStdString(order.price), idx, *this); update_value(OrderbookRoles::PriceNumerRole, QString::fromStdString(order.price_fraction_numer), idx, *this); update_value(OrderbookRoles::PriceDenomRole, QString::fromStdString(order.price_fraction_denom), idx, *this); @@ -518,19 +519,19 @@ namespace atomic_dex } void - orderbook_model::refresh_orderbook(const t_orders_contents& orderbook) + orderbook_model::refresh_orderbook(const t_orders_contents& orderbook, bool is_bestorders) { auto refresh_functor = [this](const std::vector& contents) { - for (auto&& current_order: contents) + for (auto&& order: contents) { - if (this->m_orders_id_registry.find(current_order.uuid) != this->m_orders_id_registry.end()) + if (this->m_orders_id_registry.find(order.uuid) != this->m_orders_id_registry.end()) { - this->update_order(current_order); + this->update_order(order); } else { - this->initialize_order(current_order); + this->initialize_order(order); } } @@ -539,7 +540,8 @@ namespace atomic_dex for (auto&& id: this->m_orders_id_registry) { bool res = std::none_of(begin(contents), end(contents), [id](auto&& contents) { return contents.uuid == id; }); - //! Need to remove the row + // Need to remove the row + // segwits are deleted here when they shouldnt be if (res) { auto res_list = this->match(index(0, 0), UUIDRole, QString::fromStdString(id)); @@ -617,6 +619,7 @@ namespace atomic_dex return m_current_orderbook_kind; } + // This is used when betterOrderDetected QVariantMap orderbook_model::get_order_from_uuid([[maybe_unused]] QString uuid) { diff --git a/src/core/atomicdex/models/qt.orderbook.model.hpp b/src/core/atomicdex/models/qt.orderbook.model.hpp index 6e320e68f9..0e74f3d645 100644 --- a/src/core/atomicdex/models/qt.orderbook.model.hpp +++ b/src/core/atomicdex/models/qt.orderbook.model.hpp @@ -88,8 +88,8 @@ namespace atomic_dex bool setData(const QModelIndex& index, const QVariant& value, int role) final; bool removeRows(int row, int count, const QModelIndex& parent) override; - void reset_orderbook(const t_orders_contents& orderbook); - void refresh_orderbook(const t_orders_contents& orderbook); + void reset_orderbook(const t_orders_contents& orderbook, bool is_bestorders=false); + void refresh_orderbook(const t_orders_contents& orderbook, bool is_bestorders=false); void clear_orderbook(); [[nodiscard]] int get_length() const; [[nodiscard]] orderbook_proxy_model* get_orderbook_proxy() const; diff --git a/src/core/atomicdex/models/qt.orders.model.cpp b/src/core/atomicdex/models/qt.orders.model.cpp index 8a74a41fed..184c531e06 100644 --- a/src/core/atomicdex/models/qt.orders.model.cpp +++ b/src/core/atomicdex/models/qt.orders.model.cpp @@ -716,7 +716,8 @@ namespace atomic_dex mm2::to_json(json_data, req); batch.push_back(json_data); - SPDLOG_DEBUG("recover_funds_of_swap request: {}", json_data.dump(-1)); + // json_data["userpass"] = "*****"; + // SPDLOG_DEBUG("recover_funds_of_swap request: {}", json_data.dump(-1)); auto answer_functor = [this](web::http::http_response resp) { diff --git a/src/core/atomicdex/models/qt.portfolio.model.cpp b/src/core/atomicdex/models/qt.portfolio.model.cpp index 24e70efad8..c0f8f892eb 100644 --- a/src/core/atomicdex/models/qt.portfolio.model.cpp +++ b/src/core/atomicdex/models/qt.portfolio.model.cpp @@ -399,6 +399,17 @@ namespace atomic_dex return true; } + QString + portfolio_model::coin_balance(QString coin) + { + auto res = this->match(this->index(0, 0), TickerRole, coin, 1, Qt::MatchFlag::MatchExactly); + // assert(not res.empty()); + if (not res.empty()) + { + return QString(this->data(res.at(0), BalanceRole).toString()); + } + } + void portfolio_model::disable_coins(const QStringList& coins) { @@ -522,7 +533,12 @@ namespace atomic_dex QString amount = QString::fromStdString(amount_f.str(8, std::ios_base::fixed)); qint64 timestamp = duration_cast(system_clock::now().time_since_epoch()).count(); QString human_date = QString::fromStdString(utils::to_human_date(timestamp, "%e %b %Y, %H:%M")); - this->m_dispatcher.trigger(am_i_sender, amount, ticker, human_date, timestamp); + // Logs showed `balance update notification: am_i_sender: false amount: 0.00000000 ticker: USDT-SLP` sometimes, just before a crash. + // This is a temporary fix to see if it prevents the crash. + if (amount_f > 0.0) + { + this->m_dispatcher.trigger(am_i_sender, amount, ticker, human_date, timestamp); + } emit portfolioItemDataChanged(); } diff --git a/src/core/atomicdex/models/qt.portfolio.model.hpp b/src/core/atomicdex/models/qt.portfolio.model.hpp index 9ed6e57ff1..fb0d99bcc7 100644 --- a/src/core/atomicdex/models/qt.portfolio.model.hpp +++ b/src/core/atomicdex/models/qt.portfolio.model.hpp @@ -96,18 +96,19 @@ namespace atomic_dex Q_INVOKABLE void clean_priv_keys(); //! Public api - void initialize_portfolio(const std::vector& tickers); - bool update_currency_values(); - bool update_balance_values(const std::vector& tickers); - void adjust_percent_current_currency(QString balance_all); - void disable_coins(const QStringList& coins); - void set_cfg(atomic_dex::cfg& cfg); - [[nodiscard]] t_portfolio_datas get_underlying_data() const; + void initialize_portfolio(const std::vector& tickers); + bool update_currency_values(); + bool update_balance_values(const std::vector& tickers); + void adjust_percent_current_currency(QString balance_all); + void disable_coins(const QStringList& coins); + void set_cfg(atomic_dex::cfg& cfg); + [[nodiscard]] t_portfolio_datas get_underlying_data() const; + [[nodiscard]] Q_INVOKABLE QString coin_balance(QString coin); //! Properties - [[nodiscard]] portfolio_proxy_model* get_portfolio_proxy_mdl() const; - [[nodiscard]] portfolio_proxy_model* get_pie_char_proxy_mdl() const; - [[nodiscard]] int get_length() const; + [[nodiscard]] portfolio_proxy_model* get_portfolio_proxy_mdl() const; + [[nodiscard]] portfolio_proxy_model* get_pie_char_proxy_mdl() const; + [[nodiscard]] int get_length() const; void reset(); diff --git a/src/core/atomicdex/pages/qt.portfolio.page.cpp b/src/core/atomicdex/pages/qt.portfolio.page.cpp index 51e1971b0c..3b0663bd07 100644 --- a/src/core/atomicdex/pages/qt.portfolio.page.cpp +++ b/src/core/atomicdex/pages/qt.portfolio.page.cpp @@ -23,7 +23,6 @@ #include "atomicdex/pages/qt.wallet.page.hpp" #include "atomicdex/services/price/coingecko/coingecko.wallet.charts.hpp" #include "atomicdex/services/price/global.provider.hpp" -#include "atomicdex/services/price/oracle/band.provider.hpp" namespace atomic_dex { @@ -33,7 +32,6 @@ namespace atomic_dex { emit portfolioChanged(); this->dispatcher_.sink().connect<&portfolio_page::on_update_portfolio_values_event>(*this); - this->dispatcher_.sink().connect<&portfolio_page::on_band_oracle_refreshed>(*this); this->dispatcher_.sink().connect<&portfolio_page::on_coin_cfg_parsed>(*this); SPDLOG_INFO("portfolio_page created"); } @@ -51,28 +49,6 @@ namespace atomic_dex portfolio_page::~portfolio_page() {} - QStringList - portfolio_page::get_oracle_price_supported_pairs() const - { - auto result = m_system_manager.get_system().supported_pair(); - QStringList out; - out.reserve(result.size()); - for (auto&& cur: result) { out.push_back(QString::fromStdString(cur)); } - return out; - } - - QString - portfolio_page::get_oracle_last_price_reference() const - { - return QString::fromStdString(m_system_manager.get_system().last_oracle_reference()); - } - - void - portfolio_page::on_band_oracle_refreshed(const band_oracle_refreshed&) - { - emit oraclePriceUpdated(); - } - void portfolio_page::set_current_balance_fiat_all(QString current_fiat_all_balance) { diff --git a/src/core/atomicdex/pages/qt.portfolio.page.hpp b/src/core/atomicdex/pages/qt.portfolio.page.hpp index 3f7b4a7d4d..7aa469e625 100644 --- a/src/core/atomicdex/pages/qt.portfolio.page.hpp +++ b/src/core/atomicdex/pages/qt.portfolio.page.hpp @@ -35,8 +35,6 @@ namespace atomic_dex //! Properties Q_PROPERTY(portfolio_model* portfolio_mdl READ get_portfolio NOTIFY portfolioChanged) - Q_PROPERTY(QString oracle_last_price_reference READ get_oracle_last_price_reference NOTIFY oraclePriceUpdated) - Q_PROPERTY(QStringList oracle_price_supported_pairs READ get_oracle_price_supported_pairs NOTIFY oraclePriceUpdated) Q_PROPERTY(QString balance_fiat_all READ get_balance_fiat_all WRITE set_current_balance_fiat_all NOTIFY onFiatBalanceAllChanged) Q_PROPERTY(QString main_balance_fiat_all READ get_main_balance_fiat_all NOTIFY onMainFiatBalanceAllChanged) Q_PROPERTY(global_coins_cfg_model* global_cfg_mdl READ get_global_cfg NOTIFY globalCfgMdlChanged) @@ -69,8 +67,6 @@ namespace atomic_dex [[nodiscard]] portfolio_model* get_portfolio() const; [[nodiscard]] global_coins_cfg_model* get_global_cfg() const; - [[nodiscard]] QString get_oracle_last_price_reference() const; - [[nodiscard]] QStringList get_oracle_price_supported_pairs() const; [[nodiscard]] Q_INVOKABLE QStringList get_all_enabled_coins() const; [[nodiscard]] Q_INVOKABLE QStringList get_all_coins_by_type(const QString& coin_type) const; [[nodiscard]] Q_INVOKABLE bool is_coin_enabled(const QString& coin_name) const; @@ -89,13 +85,11 @@ namespace atomic_dex [[nodiscard]] QString get_max_total_chart() const; //! Events - void on_band_oracle_refreshed([[maybe_unused]] const band_oracle_refreshed& evt); void on_update_portfolio_values_event(const update_portfolio_values&); void on_coin_cfg_parsed(const coin_cfg_parsed& evt); signals: void portfolioChanged(); - void oraclePriceUpdated(); void onFiatBalanceAllChanged(); void onMainFiatBalanceAllChanged(); void globalCfgMdlChanged(); diff --git a/src/core/atomicdex/pages/qt.settings.page.cpp b/src/core/atomicdex/pages/qt.settings.page.cpp index 1183ad18cb..c1767dae3a 100644 --- a/src/core/atomicdex/pages/qt.settings.page.cpp +++ b/src/core/atomicdex/pages/qt.settings.page.cpp @@ -32,6 +32,7 @@ #include "atomicdex/models/qt.global.coins.cfg.model.hpp" #include "atomicdex/pages/qt.portfolio.page.hpp" #include "atomicdex/pages/qt.settings.page.hpp" +#include "atomicdex/pages/qt.wallet.page.hpp" #include "atomicdex/services/mm2/mm2.service.hpp" #include "atomicdex/services/price/coingecko/coingecko.wallet.charts.hpp" #include "atomicdex/services/price/global.provider.hpp" @@ -78,6 +79,42 @@ namespace atomic_dex { void settings_page::update() {} } // Getters|Setters namespace atomic_dex { + int settings_page::get_pirate_sync_date() const + { + QSettings& settings = entity_registry_.ctx(); + return settings.value("PirateSyncDate").toInt(); + } + int settings_page::get_pirate_sync_height(int sync_date, int checkpoint_height, int checkpoint_blocktime) const + { + if (checkpoint_height == 0) + { + return 0; + } + int blocktime_estimate = 65; // Based on average block time between checkpoint block and block 2575600 + margin of error + SPDLOG_INFO("sync_date: {}", sync_date); + SPDLOG_INFO("checkpoint_height: {}", checkpoint_height); + SPDLOG_INFO("checkpoint_blocktime: {}", checkpoint_blocktime); + int time_delta = sync_date - checkpoint_blocktime; + SPDLOG_INFO("time_delta: {}", time_delta); + int block_delta = static_cast(time_delta / blocktime_estimate); + SPDLOG_INFO("block_delta: {}", block_delta); + // As block time is variable, we round height to the nearest 1000 blocks + int height = checkpoint_height + static_cast(block_delta / 1000) * 1000; + if (height < 0) + { + height = 0; + } + SPDLOG_INFO("height: {}", height); + return height; + } + + void settings_page::set_pirate_sync_date(int new_timestamp) + { + QSettings& settings = entity_registry_.ctx(); + settings.setValue("PirateSyncDate", new_timestamp); + settings.sync(); + } + QString settings_page::get_current_lang() const { QSettings& settings = entity_registry_.ctx(); @@ -122,9 +159,9 @@ namespace atomic_dex auto path = QString{":/assets/languages/atomic_defi_" + new_lang}; - SPDLOG_INFO("Locale before parsing AtomicDEX settings: {}", QLocale().name().toStdString()); + SPDLOG_INFO("Locale before parsing Komodo Wallet settings: {}", QLocale().name().toStdString()); QLocale::setDefault(get_locale(new_lang.toStdString())); - SPDLOG_INFO("Locale after parsing AtomicDEX settings: {}", QLocale().name().toStdString()); + SPDLOG_INFO("Locale after parsing Komodo Wallet settings: {}", QLocale().name().toStdString()); if (!this->m_translator.load(path)) { SPDLOG_ERROR("Failed to load {} translation in {}.qm", new_lang.toStdString(), path.toStdString()); @@ -136,6 +173,25 @@ namespace atomic_dex emit onLangChanged(); } + bool atomic_dex::settings_page::is_spamfilter_enabled() const + { + return m_config.spamfilter_enabled; + } + + void settings_page::set_spamfilter_enabled(bool is_enabled) + { + if (m_config.spamfilter_enabled != is_enabled) + { + + auto& mm2 = m_system_manager.get_system(); + auto& wallet_pg = m_system_manager.get_system(); + QString ticker = QString::fromStdString(mm2.get_current_ticker()); + change_spamfilter_status(m_config, is_enabled); + emit onSpamFilterEnabledChanged(); + wallet_pg.set_current_ticker(ticker, true); + } + } + bool atomic_dex::settings_page::is_notification_enabled() const { return m_config.notification_enabled; @@ -310,12 +366,12 @@ namespace atomic_dex return out; } - QStringList settings_page::get_recommended_fiats() const + QStringList settings_page::get_recommended_fiats() { static const auto nb_recommended = 6; QStringList out; out.reserve(nb_recommended); - for (auto&& it = m_config.available_fiat.begin(); it != m_config.available_fiat.end() && it < m_config.available_fiat.begin() + nb_recommended; it++) + for (auto&& it = m_config.recommended_fiat.begin(); it != m_config.recommended_fiat.end() && it < m_config.recommended_fiat.begin() + nb_recommended; it++) { out.push_back(QString::fromStdString(*it)); } diff --git a/src/core/atomicdex/pages/qt.settings.page.hpp b/src/core/atomicdex/pages/qt.settings.page.hpp index d1dd6712cb..50035ca337 100644 --- a/src/core/atomicdex/pages/qt.settings.page.hpp +++ b/src/core/atomicdex/pages/qt.settings.page.hpp @@ -45,6 +45,7 @@ namespace atomic_dex Q_PROPERTY(QString current_fiat_sign READ get_current_fiat_sign NOTIFY onFiatSignChanged) Q_PROPERTY(QString current_fiat READ get_current_fiat WRITE set_current_fiat NOTIFY onFiatChanged) Q_PROPERTY(bool notification_enabled READ is_notification_enabled WRITE set_notification_enabled NOTIFY onNotificationEnabledChanged) + Q_PROPERTY(bool spamfilter_enabled READ is_spamfilter_enabled WRITE set_spamfilter_enabled NOTIFY onSpamFilterEnabledChanged) Q_PROPERTY(QVariant custom_token_data READ get_custom_token_data WRITE set_custom_token_data NOTIFY customTokenDataChanged) Q_PROPERTY(bool fetching_custom_token_data_busy READ is_fetching_custom_token_data_busy WRITE set_fetching_custom_token_data_busy NOTIFY customTokenDataStatusChanged) Q_PROPERTY(bool fetching_priv_keys_busy READ is_fetching_priv_key_busy WRITE set_fetching_priv_key_busy NOTIFY privKeyStatusChanged) @@ -80,8 +81,11 @@ namespace atomic_dex [[nodiscard]] QString get_current_currency_sign() const; [[nodiscard]] QString get_current_fiat_sign() const; [[nodiscard]] QString get_current_fiat() const; + void set_pirate_sync_date(int new_timestamp); [[nodiscard]] bool is_notification_enabled() const; void set_notification_enabled(bool is_enabled); + [[nodiscard]] bool is_spamfilter_enabled() const; + void set_spamfilter_enabled(bool is_enabled); void set_current_currency(const QString& current_currency); void set_current_fiat(const QString& current_fiat); [[nodiscard]] bool is_fetching_custom_token_data_busy() const; @@ -100,11 +104,13 @@ namespace atomic_dex Q_INVOKABLE void remove_custom_coin(const QString& ticker); Q_INVOKABLE [[nodiscard]] QStringList get_available_langs() const; Q_INVOKABLE [[nodiscard]] QStringList get_available_fiats() const; - Q_INVOKABLE [[nodiscard]] QStringList get_recommended_fiats() const; // Returns 6 recommended fiats. Basically, the first 6 values in cfg.json. + Q_INVOKABLE [[nodiscard]] QStringList get_recommended_fiats(); Q_INVOKABLE [[nodiscard]] QStringList get_available_currencies() const; Q_INVOKABLE [[nodiscard]] bool is_this_ticker_present_in_raw_cfg(const QString& ticker) const; Q_INVOKABLE [[nodiscard]] bool is_this_ticker_present_in_normal_cfg(const QString& ticker) const; Q_INVOKABLE [[nodiscard]] QString get_custom_coins_icons_path() const; + Q_INVOKABLE [[nodiscard]] int get_pirate_sync_date() const; + Q_INVOKABLE [[nodiscard]] int get_pirate_sync_height(int sync_date, int checkpoint_height, int checkpoint_blocktime) const; Q_INVOKABLE void process_token_add(const QString& contract_address, const QString& coingecko_id, const QString& icon_filepath, CoinType coin_type); Q_INVOKABLE void process_qrc_20_token_add(const QString& contract_address, const QString& coingecko_id, const QString& icon_filepath); Q_INVOKABLE void submit(); @@ -124,6 +130,7 @@ namespace atomic_dex void onFiatSignChanged(); void onFiatChanged(); void onNotificationEnabledChanged(); + void onSpamFilterEnabledChanged(); void customTokenDataChanged(); void customTokenDataStatusChanged(); void privKeyStatusChanged(); diff --git a/src/core/atomicdex/pages/qt.trading.page.cpp b/src/core/atomicdex/pages/qt.trading.page.cpp index 1a4ecf6415..a58a581e0a 100644 --- a/src/core/atomicdex/pages/qt.trading.page.cpp +++ b/src/core/atomicdex/pages/qt.trading.page.cpp @@ -488,24 +488,31 @@ namespace atomic_dex if (!ec) { + // SPDLOG_DEBUG("[process_action::post_process_orderbook_finished]"); auto* wrapper = get_orderbook_wrapper(); m_models_actions[orderbook_need_a_reset] ? wrapper->reset_orderbook(result) : wrapper->refresh_orderbook(result); if (m_models_actions[orderbook_need_a_reset] && this->m_current_trading_mode == TradingModeGadget::Pro) { // This goes to a function which looks like it is for bot trading. We dont need to run it at this stage. - // this->set_preferred_settings(); + this->set_preferred_settings(); } else { const auto base_max_taker_vol = safe_float(wrapper->get_base_max_taker_vol().toJsonObject()["decimal"].toString().toStdString()); + // SPDLOG_DEBUG("[base_max_taker_vol]: {}", wrapper->get_base_max_taker_vol().toJsonObject()["decimal"].toString().toStdString()); auto rel_max_taker = wrapper->get_rel_max_taker_vol().toJsonObject()["decimal"].toString().toStdString(); + // SPDLOG_DEBUG("[rel_max_taker]: {}", wrapper->get_rel_max_taker_vol().toJsonObject()["decimal"].toString().toStdString()); + if (rel_max_taker.empty()) { rel_max_taker = "0"; } + const auto rel_max_taker_vol = safe_float(rel_max_taker); t_float_50 min_vol = safe_float(m_minimal_trading_amount.toStdString()); + // SPDLOG_DEBUG("[min_vol]: {}", m_minimal_trading_amount.toStdString()); + auto adjust_functor = [this, wrapper]() { if (m_post_clear_forms && this->m_current_trading_mode == TradingModeGadget::Pro) @@ -519,6 +526,7 @@ namespace atomic_dex if ((m_market_mode == MarketMode::Buy && rel_max_taker_vol > 0 && min_vol <= 0) || (m_market_mode == MarketMode::Sell && base_max_taker_vol > 0 && min_vol <= 0)) { + // SPDLOG_DEBUG("[adjust_functor()]: Adjusting...."); adjust_functor(); } } @@ -973,7 +981,7 @@ namespace atomic_dex bool trading_page::set_pair(bool is_left_side, const QString& changed_ticker) { - SPDLOG_INFO("Changed ticker: {}", changed_ticker.toStdString()); + // SPDLOG_DEBUG("Changed ticker: {}", changed_ticker.toStdString()); const auto* market_pair = get_market_pairs_mdl(); auto base = market_pair->get_left_selected_coin(); auto rel = market_pair->get_right_selected_coin(); diff --git a/src/core/atomicdex/pages/qt.wallet.page.cpp b/src/core/atomicdex/pages/qt.wallet.page.cpp index ec0fd4e477..14f35759b5 100644 --- a/src/core/atomicdex/pages/qt.wallet.page.cpp +++ b/src/core/atomicdex/pages/qt.wallet.page.cpp @@ -14,9 +14,9 @@ #include "atomicdex/api/mm2/rpc.convertaddress.hpp" #include "atomicdex/api/mm2/rpc.electrum.hpp" #include "atomicdex/api/mm2/rpc.validate.address.hpp" -#include "atomicdex/api/mm2/rpc.withdraw.hpp" -#include "atomicdex/api/mm2/rpc2.init_withdraw.hpp" -#include "atomicdex/api/mm2/rpc2.withdraw_status.hpp" +#include "atomicdex/api/mm2/rpc2.withdraw.hpp" +#include "atomicdex/api/mm2/rpc2.task.withdraw.init.hpp" +#include "atomicdex/api/mm2/rpc2.task.withdraw.status.hpp" #include "atomicdex/services/mm2/mm2.service.hpp" #include "atomicdex/services/price/global.provider.hpp" #include "atomicdex/services/price/komodo_prices/komodo.prices.provider.hpp" @@ -107,11 +107,11 @@ namespace atomic_dex return QString::fromStdString(mm2_system.get_current_ticker()); } - void wallet_page::set_current_ticker(const QString& ticker) + void wallet_page::set_current_ticker(const QString& ticker, bool force) { auto& mm2_system = m_system_manager.get_system(); auto coin_info = mm2_system.get_coin_info(ticker.toStdString()); - if (mm2_system.set_current_ticker(ticker.toStdString())) + if (mm2_system.set_current_ticker(ticker.toStdString()) || force) { SPDLOG_INFO("new ticker: {}", ticker.toStdString()); m_transactions_mdl->reset(); @@ -267,10 +267,9 @@ namespace atomic_dex {"blocks_left", 1}, {"transactions_left", 0}, {"current_block", 1}, - {"is_smartchain_test_coin", false}, + {"is_faucet_coin", false}, {"qrcode_address", ""}, - {"segwit_supported", false}, - {"is_segwit_on", false}}; + {"segwit_supported", false}}; std::error_code ec; auto& mm2_system = m_system_manager.get_system(); if (mm2_system.is_mm2_running()) @@ -285,11 +284,9 @@ namespace atomic_dex obj["name"] = QString::fromStdString(coin_info.name); obj["type"] = QString::fromStdString(coin_info.type); obj["segwit_supported"] = coin_info.segwit; - obj["is_segwit_on"] = coin_info.is_segwit_on; obj["has_parent_fees_ticker"] = coin_info.has_parent_fees_ticker; obj["fees_ticker"] = QString::fromStdString(coin_info.fees_ticker); obj["is_claimable"] = coin_info.is_claimable; - obj["address"] = QString::fromStdString(mm2_system.address(ticker, ec)); obj["minimal_balance_for_asking_rewards"] = QString::fromStdString(coin_info.minimal_claim_amount); obj["explorer_url"] = QString::fromStdString(coin_info.explorer_url); obj["current_currency_ticker_price"] = QString::fromStdString(price_service.get_rate_conversion(config.current_currency, ticker, true)); @@ -299,15 +296,26 @@ namespace atomic_dex obj["fiat_amount"] = QString::fromStdString(price_service.get_price_in_fiat(config.current_currency, ticker, ec)); obj["activation_status"] = nlohmann_json_object_to_qt_json_object(coin_info.activation_status); obj["trend_7d"] = nlohmann_json_array_to_qt_json_array(provider.get_ticker_historical(ticker)); - obj["fee_ticker"] = QString::fromStdString(coin_info.fees_ticker); - obj["blocks_left"] = static_cast(tx_state.blocks_left); - obj["transactions_left"] = static_cast(tx_state.transactions_left); - obj["current_block"] = static_cast(tx_state.current_block); - obj["is_smartchain_test_coin"] = coin_info.ticker == "RICK" || coin_info.ticker == "MORTY" || coin_info.ticker == "ZOMBIE"; + obj["fee_ticker"] = QString::fromStdString(coin_info.fees_ticker); + obj["blocks_left"] = static_cast(tx_state.blocks_left); + obj["transactions_left"] = static_cast(tx_state.transactions_left); + obj["current_block"] = static_cast(tx_state.current_block); + obj["is_faucet_coin"] = coin_info.is_faucet_coin; + std::error_code ec; - qrcodegen::QrCode qr0 = qrcodegen::QrCode::encodeText(mm2_system.address(ticker, ec).c_str(), qrcodegen::QrCode::Ecc::MEDIUM); - std::string svg = qr0.toSvgString(2); - obj["qrcode_address"] = QString::fromStdString("data:image/svg+xml;base64,") + QString::fromStdString(svg).toLocal8Bit().toBase64(); + if (!mm2_system.is_zhtlc_coin_ready(coin_info.ticker)) + { + obj["address"] = "activating"; + obj["qrcode_address"] = ""; + + } + else + { + obj["address"] = QString::fromStdString(mm2_system.address(ticker, ec)); + qrcodegen::QrCode qr0 = qrcodegen::QrCode::encodeText(mm2_system.address(ticker, ec).c_str(), qrcodegen::QrCode::Ecc::MEDIUM); + std::string svg = qr0.toSvgString(2); + obj["qrcode_address"] = QString::fromStdString("data:image/svg+xml;base64,") + QString::fromStdString(svg).toLocal8Bit().toBase64(); + } } return obj; } @@ -496,7 +504,7 @@ namespace atomic_dex } void - wallet_page::send(const QString& address, const QString& amount, bool max, bool with_fees, QVariantMap fees_data) + wallet_page::send(const QString& address, const QString& amount, bool max, bool with_fees, QVariantMap fees_data, const QString& memo) { //! Preparation this->set_send_busy(true); @@ -507,20 +515,20 @@ namespace atomic_dex if (coin_info.is_zhtlc_family) { - t_init_withdraw_request init_withdraw_req{.coin = ticker, .to = address.toStdString(), .amount = max ? "0" : amount.toStdString(), .max = max}; + t_withdraw_init_request withdraw_init_req{.coin = ticker, .to = address.toStdString(), .amount = max ? "0" : amount.toStdString(), .memo = memo.toStdString(), .max = max}; if (with_fees) { qDebug() << fees_data; auto json_fees = nlohmann::json::parse(QString(QJsonDocument(QVariant(fees_data).toJsonObject()).toJson()).toStdString()); - init_withdraw_req.fees = t_init_withdraw_fees{ + withdraw_init_req.fees = t_withdraw_init_fees{ .type = "UtxoFixed", .amount = json_fees.at("fees_amount").get() }; } - nlohmann::json json_data = mm2::template_request("init_withdraw", true); + nlohmann::json json_data = mm2::template_request("task::withdraw::init", true); - mm2::to_json(json_data, init_withdraw_req); + mm2::to_json(json_data, withdraw_init_req); batch.push_back(json_data); std::string amount_std = amount.toStdString(); @@ -548,12 +556,13 @@ namespace atomic_dex using namespace std::chrono_literals; auto& mm2_system = m_system_manager.get_system(); static std::size_t z_nb_try = 1; + static std::size_t loop_limit = 600; nlohmann::json z_error = nlohmann::json::array(); nlohmann::json z_batch_array = nlohmann::json::array(); QString z_status; t_withdraw_status_request z_request{.task_id = task_id}; - nlohmann::json j = mm2::template_request("withdraw_status", true); + nlohmann::json j = mm2::template_request("task::withdraw::status", true); mm2::to_json(j, z_request); z_batch_array.push_back(j); @@ -564,19 +573,19 @@ namespace atomic_dex z_error = z_answers; z_status = QString::fromStdString(z_answers[0].at("result").at("status").get()); - SPDLOG_DEBUG("[{}/120] Waiting for {} withdraw status [{}]...", z_nb_try, ticker, z_status.toUtf8().constData()); - if (z_status == "Ready") + SPDLOG_DEBUG("[{}/{}] Waiting for {} withdraw status [{}]...", z_nb_try, loop_limit, ticker, z_status.toUtf8().constData()); + if (z_status == "Ok") { break; } else { - set_withdraw_status("Generating transaction... "); + set_withdraw_status("Generating transaction"); } std::this_thread::sleep_for(2s); z_nb_try += 1; - } while (z_nb_try < 120); + } while (z_nb_try < loop_limit); try { if (z_error[0].at("result").at("details").contains("error")) @@ -585,7 +594,7 @@ namespace atomic_dex z_status = QString::fromStdString(z_error[0].at("result").at("details").at("error").get()); set_withdraw_status(z_status); } - else if (z_nb_try == 120) + else if (z_nb_try == loop_limit) { // TODO: Handle this case. // There could be no error message if scanning takes too long. @@ -596,9 +605,9 @@ namespace atomic_dex } else { - auto withdraw_answer = mm2::rpc_process_answer_batch(z_error[0], "withdraw_status"); + auto withdraw_answer = mm2::rpc_process_answer_batch(z_error[0], "task::withdraw::status"); nlohmann::json j_out = nlohmann::json::object(); - j_out["withdraw_answer"] = z_error[0]["result"]["details"]["result"]; + j_out["withdraw_answer"] = z_error[0]["result"]["details"]; j_out.at("withdraw_answer")["date"] = withdraw_answer.result.value().timestamp_as_date; // Add total amount in fiat currency. @@ -632,7 +641,6 @@ namespace atomic_dex j_out["withdraw_answer"]["fee_details"]["amount_fiat"] = global_price_system.get_price_as_currency_from_amount(current_fiat, coin_info.fees_ticker, fee); } - SPDLOG_DEBUG("zhtlc set_rpc_send_data (else)"); this->set_rpc_send_data(nlohmann_json_object_to_qt_json_object(j_out)); set_withdraw_status("Complete"); } @@ -676,7 +684,13 @@ namespace atomic_dex } else { - t_withdraw_request withdraw_req{.coin = ticker, .to = address.toStdString(), .amount = max ? "0" : amount.toStdString(), .max = max}; + t_withdraw_request withdraw_req{ + .coin = ticker, + .to = address.toStdString(), + .amount = max ? "0" : amount.toStdString(), + .memo = memo.toStdString(), + .max = max + }; if (with_fees) { @@ -977,16 +991,32 @@ namespace atomic_dex if (!evt.with_error && QString::fromStdString(evt.ticker) == get_current_ticker()) { std::error_code ec; + const auto& settings = m_system_manager.get_system(); t_transactions transactions = m_system_manager.get_system().get_tx_history(ec); + t_transactions to_init; + if (settings.is_spamfilter_enabled()) + { + for (auto&& cur_tx: transactions) + { + if (safe_float(cur_tx.total_amount) != 0) + { + to_init.push_back(cur_tx); + } + } + } + else + { + to_init = transactions; + } if (m_transactions_mdl->rowCount() == 0) { //! insert all transactions - m_transactions_mdl->init_transactions(transactions); + m_transactions_mdl->init_transactions(to_init); } else { //! Update tx (only unconfirmed) or insert (new tx) - m_transactions_mdl->update_or_insert_transactions(transactions); + m_transactions_mdl->update_or_insert_transactions(to_init); } if (ec) { @@ -1141,107 +1171,4 @@ namespace atomic_dex m_converted_address = converted_address; emit convertedAddressChanged(); } - - QString - wallet_page::switch_address_mode(bool checked) - { - auto& mm2_system = m_system_manager.get_system(); - std::string address = ""; - if (mm2_system.is_mm2_running()) - { - const auto ticker = get_current_ticker().toStdString(); - const auto coin_cfg = mm2_system.get_coin_info(ticker); - if (coin_cfg.segwit) - { - nlohmann::json address_format = nlohmann::json::object(); - address_format = {{"format", "segwit"}}; - if (!checked) - { - //! We go from segwit to legacy - if (coin_cfg.ticker != "BCH") - { - address_format = {{"format", "standard"}}; - } - else - { - address_format = {{"format", "bch"}}; - } - } - - - std::error_code ec; - address = mm2_system.address(ticker, ec); - t_convert_address_request req{.coin = ticker, .from = address, .to_address_format = address_format}; - nlohmann::json batch = nlohmann::json::array(); - nlohmann::json json_data = mm2::template_request("convertaddress"); - mm2::to_json(json_data, req); - batch.push_back(json_data); - json_data["userpass"] = "******"; - SPDLOG_INFO("convertaddress request: {}", json_data.dump()); - web::http::http_response resp = mm2_system.get_mm2_client().async_rpc_batch_standalone(batch).get(); - std::string body = TO_STD_STR(resp.extract_string(true).get()); - SPDLOG_DEBUG("resp convertaddress: {}", body); - if (resp.status_code() == static_cast(antara::app::http_code::ok)) - { - auto answers = nlohmann::json::parse(body); - auto convert_answer = mm2::rpc_process_answer_batch(answers[0], "convertaddress"); - if (convert_answer.result.has_value()) - { - return QString::fromStdString(convert_answer.result.value().address); - } - } - } - } - return QString::fromStdString(address); - } - - void - wallet_page::post_switch_address_mode(bool is_segwit) - { - SPDLOG_INFO("switching to : {}", is_segwit ? "segwit" : "legacy"); - auto& mm2_system = m_system_manager.get_system(); - if (mm2_system.is_mm2_running()) - { - //! Need disable + enable + refresh balance + refresh current coin info (address) + change segwit in cfg - const auto ticker = get_current_ticker().toStdString(); - nlohmann::json batch = nlohmann::json::array(); - nlohmann::json json_data = mm2::template_request("disable_coin"); - t_disable_coin_request req{.coin = ticker}; - mm2::to_json(json_data, req); - batch.push_back(json_data); - //! Disable is in the batch - - //! electrum - auto coin_info = mm2_system.get_coin_info(ticker); - t_electrum_request electrum_req{ - .coin_name = coin_info.ticker, .servers = coin_info.electrum_urls.value(), .coin_type = coin_info.coin_type, .with_tx_history = true}; - if (is_segwit) - { - electrum_req.address_format = nlohmann::json::object(); - electrum_req.address_format.value()["format"] = "segwit"; - } - nlohmann::json electrum_data = mm2::template_request("electrum"); - mm2::to_json(electrum_data, electrum_req); - batch.push_back(electrum_data); - electrum_data["userpass"] = "*******"; - SPDLOG_INFO("electrum_req: {}", electrum_data.dump(-1)); - - //! Answer functor - auto answer_functor = [this, ticker, is_segwit](web::http::http_response resp) - { - std::string body = TO_STD_STR(resp.extract_string(true).get()); - SPDLOG_DEBUG("resp disable/enable: {}", body); - if (resp.status_code() == static_cast(antara::app::http_code::ok)) - { - auto& mm2_system = m_system_manager.get_system(); - mm2_system.change_segwit_status(ticker, is_segwit); - mm2_system.fetch_infos_thread(true, false); - SPDLOG_INFO("Switching address mode success"); - } - }; - - //! Rpc processing - mm2_system.get_mm2_client().async_rpc_batch_standalone(batch).then(answer_functor).then(&handle_exception_pplx_task); - } - } } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/pages/qt.wallet.page.hpp b/src/core/atomicdex/pages/qt.wallet.page.hpp index 033699279b..97b90f739f 100644 --- a/src/core/atomicdex/pages/qt.wallet.page.hpp +++ b/src/core/atomicdex/pages/qt.wallet.page.hpp @@ -30,7 +30,7 @@ namespace atomic_dex // Getters/Setters [[nodiscard]] transactions_model* get_transactions_mdl() const; [[nodiscard]] QString get_current_ticker() const; - void set_current_ticker(const QString& ticker); + void set_current_ticker(const QString& ticker, bool force = false); [[nodiscard]] QVariant get_ticker_infos() const; [[nodiscard]] bool is_broadcast_busy() const; void set_broadcast_busy(bool status); @@ -79,8 +79,8 @@ namespace atomic_dex // QML API Q_INVOKABLE void validate_address(QString address); Q_INVOKABLE void validate_address(QString address, QString ticker); - Q_INVOKABLE void convert_address(QString from, QVariant to_address_format); // https://developers.atomicdex.io/basic-docs/atomicdex/atomicdex-api.html#convertaddress - Q_INVOKABLE void convert_address(QString from, QString ticker, QVariant to_address_format); // https://developers.atomicdex.io/basic-docs/atomicdex/atomicdex-api.html#convertaddress + Q_INVOKABLE void convert_address(QString from, QVariant to_address_format); // https://developers.atomicdex.io/basic-docs/atomicdex/komodo-defi-framework.html#convertaddress + Q_INVOKABLE void convert_address(QString from, QString ticker, QVariant to_address_format); // https://developers.atomicdex.io/basic-docs/atomicdex/komodo-defi-framework.html#convertaddress Q_INVOKABLE void claim_rewards(); Q_INVOKABLE void claim_faucet(); Q_INVOKABLE void broadcast(const QString& tx_hex, bool is_claiming, bool is_max, const QString& amount); @@ -88,9 +88,7 @@ namespace atomic_dex bool is_auth, const QString& tx_hex, bool is_claiming, bool is_max, const QString& amount); // Broadcast requires OS local user credentials verification. This is called by the Q_INVOKABLE broadcast() method after // entering credentials. - Q_INVOKABLE void send(const QString& address, const QString& amount, bool max, bool with_fees, QVariantMap fees_data); - Q_INVOKABLE QString switch_address_mode(bool checked); - Q_INVOKABLE void post_switch_address_mode(bool is_segwit); + Q_INVOKABLE void send(const QString& address, const QString& amount, bool max, bool with_fees, QVariantMap fees_data, const QString& memo); // QML API Properties Q_PROPERTY(transactions_model* transactions_mdl READ get_transactions_mdl NOTIFY transactionsMdlChanged) diff --git a/src/core/atomicdex/pages/widgets/dex/qt.orderbook.cpp b/src/core/atomicdex/pages/widgets/dex/qt.orderbook.cpp index 3f9eb34d2d..d8c68184ef 100644 --- a/src/core/atomicdex/pages/widgets/dex/qt.orderbook.cpp +++ b/src/core/atomicdex/pages/widgets/dex/qt.orderbook.cpp @@ -91,12 +91,12 @@ namespace atomic_dex else if (m_best_orders->rowCount() == 0) { // SPDLOG_INFO("[qt_orderbook_wrapper::refresh_orderbook] : reset_best_orders"); - m_best_orders->reset_orderbook(data); + m_best_orders->reset_orderbook(data, true); } else { // SPDLOG_INFO("[qt_orderbook_wrapper::refresh_orderbook] : refresh_best_orders"); - m_best_orders->refresh_orderbook(data); + m_best_orders->refresh_orderbook(data, true); } this->set_both_taker_vol(); } diff --git a/src/core/atomicdex/services/internet/internet.checker.service.cpp b/src/core/atomicdex/services/internet/internet.checker.service.cpp index 548cf80071..f848c3a6b9 100644 --- a/src/core/atomicdex/services/internet/internet.checker.service.cpp +++ b/src/core/atomicdex/services/internet/internet.checker.service.cpp @@ -170,7 +170,7 @@ namespace atomic_dex auto& mm2 = this->m_system_manager.get_system(); if (mm2.is_mm2_running()) { - SPDLOG_INFO("mm2 is alive, checking if ware able to fetch a simple orderbook"); + SPDLOG_INFO("mm2 is alive, checking if we are able to fetch a simple orderbook"); nlohmann::json batch = nlohmann::json::array(); nlohmann::json current_request = mm2::template_request("orderbook", true); t_orderbook_request req_orderbook{.base = g_primary_dex_coin, .rel = g_second_primary_dex_coin}; diff --git a/src/core/atomicdex/services/ip/ip.checker.service.cpp b/src/core/atomicdex/services/ip/ip.checker.service.cpp index ec9880d4df..26223954cd 100644 --- a/src/core/atomicdex/services/ip/ip.checker.service.cpp +++ b/src/core/atomicdex/services/ip/ip.checker.service.cpp @@ -33,7 +33,7 @@ namespace return cfg; }()}; - t_http_client_ptr g_ip_proxy_client{std::make_unique(FROM_STD_STR("https://komodo.live:3335"), g_ip_cfg)}; + t_http_client_ptr g_ip_proxy_client{std::make_unique(FROM_STD_STR("https://komodo.earth:3335"), g_ip_cfg)}; t_http_client_ptr g_ipify_client{std::make_unique(FROM_STD_STR("https://api.ipify.org"), g_ip_cfg)}; pplx::task diff --git a/src/core/atomicdex/services/mm2/mm2.service.cpp b/src/core/atomicdex/services/mm2/mm2.service.cpp index 49250a8fa6..85b52068af 100644 --- a/src/core/atomicdex/services/mm2/mm2.service.cpp +++ b/src/core/atomicdex/services/mm2/mm2.service.cpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2022 The Komodo Platform Developers. * + * Copyright © 2013-2023 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -24,6 +24,7 @@ #include #include #include +#include #include "atomicdex/api/mm2/utxo.merge.params.hpp" #include "atomicdex/api/mm2/rpc.electrum.hpp" @@ -31,12 +32,13 @@ #include "atomicdex/api/mm2/rpc.min.volume.hpp" #include "atomicdex/api/mm2/rpc.tx.history.hpp" #include "atomicdex/api/mm2/rpc2.z_coin_tx_history.hpp" -#include "atomicdex/api/mm2/rpc2.init_z_coin.hpp" -#include "atomicdex/api/mm2/rpc2.init_z_coin_status.hpp" +#include "atomicdex/api/mm2/rpc2.task.enable_z_coin.init.hpp" +#include "atomicdex/api/mm2/rpc2.task.enable_z_coin.status.hpp" #include "atomicdex/config/mm2.cfg.hpp" #include "atomicdex/config/coins.cfg.hpp" #include "atomicdex/constants/dex.constants.hpp" #include "atomicdex/managers/qt.wallet.manager.hpp" +#include "atomicdex/pages/qt.settings.page.hpp" #include "atomicdex/services/internet/internet.checker.service.hpp" #include "atomicdex/services/mm2/mm2.service.hpp" #include "atomicdex/utilities/qt.utilities.hpp" @@ -161,13 +163,9 @@ namespace } if (field_name == "active") { - SPDLOG_INFO("ticker: {} status active: {}", ticker, status); + SPDLOG_DEBUG("ticker: {} status active: {}", ticker, status); registry[ticker].active = status; } - else if (field_name == "is_segwit_on") - { - registry[ticker].is_segwit_on = status; - } } } @@ -294,6 +292,7 @@ namespace atomic_dex std::vector tickers; for (auto&& coin: coins) { + SPDLOG_DEBUG("{}: Active [{}]", coin.ticker, coin.active); if (!coin.active) { tickers.push_back(coin.ticker); @@ -301,7 +300,7 @@ namespace atomic_dex } if (!tickers.empty()) { - SPDLOG_INFO("coin_status_update required, {}", m_nb_update_required); + SPDLOG_DEBUG("coin_status_update required, {}", m_nb_update_required); update_coin_status(this->m_current_wallet_name, tickers, true, m_coins_informations, m_coin_cfg_mutex); } m_nb_update_required -= 1; @@ -413,6 +412,13 @@ namespace atomic_dex return destination; } + void mm2_service::enable_z_coin_cancel(const std::int8_t task_id) + { + t_enable_z_coin_cancel_request request{.task_id = task_id}; + auto answer = m_mm2_client.rpc_enable_z_coin_cancel(std::move(request)); + SPDLOG_DEBUG("mm2_service::enable_z_coin_cancel: [task_id {}] result: {}", task_id, answer.raw_result); + } + bool mm2_service::disable_coin(const std::string& ticker, std::error_code& ec) { coin_config coin_info = get_coin_info(ticker); @@ -496,6 +502,9 @@ namespace atomic_dex t_coins slp_coins; t_coins slp_testnet_coins; t_coins zhtlc_coins; + t_coins osmosis_coins; + t_coins iris_coins; + t_coins cosmos_coins; for (const auto& coin_config : coins) { @@ -514,6 +523,26 @@ namespace atomic_dex slp_coins.push_back(coin_config); } } + else if (coin_config.coin_type == CoinType::TENDERMINT || coin_config.coin_type == CoinType::TENDERMINTTOKEN) + { + if (coin_config.parent_coin == "ATOM") + { + cosmos_coins.push_back(coin_config); + } + else if (coin_config.parent_coin == "IRIS") + { + iris_coins.push_back(coin_config); + } + else if (coin_config.parent_coin == "OSMO") + { + osmosis_coins.push_back(coin_config); + } + else + { + SPDLOG_WARN("Unexpected Tendermint ticker: {}", coin_config.ticker); + SPDLOG_WARN("Parent coin: {}", coin_config.parent_coin); + } + } else if (coin_config.coin_type == CoinType::ZHTLC) { zhtlc_coins.push_back(coin_config); @@ -547,6 +576,18 @@ namespace atomic_dex { enable_zhtlc(zhtlc_coins); } + if (iris_coins.size() > 0) + { + enable_tendermint_coins(iris_coins, "IRIS"); + } + if (cosmos_coins.size() > 0) + { + enable_tendermint_coins(cosmos_coins, "ATOM"); + } + if (osmosis_coins.size() > 0) + { + enable_tendermint_coins(osmosis_coins, "OSMO"); + } } void mm2_service::enable_erc_family_coin(const coin_config& coin_config) @@ -626,14 +667,18 @@ namespace atomic_dex { t_enable_request request { - .coin_name = coin_config.ticker, - .urls = coin_config.eth_family_urls.value_or(std::vector{}), - .coin_type = coin_config.coin_type, - .is_testnet = coin_config.is_testnet.value_or(false), - .with_tx_history = false + .coin_name = coin_config.ticker, + .urls = coin_config.eth_family_urls.value_or(std::vector{}), + .coin_type = coin_config.coin_type, + .is_testnet = coin_config.is_testnet.value_or(false), + .swap_contract_address = coin_config.swap_contract_address.value_or(""), + .with_tx_history = false }; + if (coin_config.fallback_swap_contract_address.value_or("") != "") + { + request.fallback_swap_contract_address = coin_config.fallback_swap_contract_address; + } nlohmann::json j = mm2::template_request("enable"); - mm2::to_json(j, request); batch_array.push_back(j); } @@ -732,12 +777,6 @@ namespace atomic_dex .is_testnet = coin_config.is_testnet.value_or(false), .with_tx_history = true }; - - if (coin_config.segwit && coin_config.is_segwit_on) - { - request.address_format = nlohmann::json::object(); - request.address_format.value()["format"] = "segwit"; - } if (coin_config.utxo_merge.value_or(false)) { mm2::utxo_merge_params merge_params{.merge_at = 250, .check_every = 300, .max_merge_at_once = 125}; @@ -746,6 +785,14 @@ namespace atomic_dex mm2::to_json(json_merge_params, merge_params); request.merge_params = json_merge_params; } + if (coin_config.swap_contract_address.value_or("") != "") + { + request.swap_contract_address = coin_config.swap_contract_address; + } + if (coin_config.fallback_swap_contract_address.value_or("") != "") + { + request.fallback_swap_contract_address = coin_config.fallback_swap_contract_address; + } mm2::to_json(j, request); batch_array.push_back(j); } @@ -754,6 +801,151 @@ namespace atomic_dex .then([this, batch_array](pplx::task previous_task) { this->handle_exception_pplx_task(previous_task, "enable_qrc_family_coins", batch_array); }); } + + void mm2_service::enable_tendermint_coin(coin_config coin_config, std::string parent_ticker) + { + enable_tendermint_coins(t_coins{std::move(coin_config)}, parent_ticker); + } + + void mm2_service::enable_tendermint_coins(const t_coins& coins, const std::string parent_ticker) + { + SPDLOG_INFO("Parent ticker: {}", parent_ticker); + auto callback = [this](RpcRequest rpc) + { + if (rpc.error) + { + if (rpc.error->error_type.find("PlatformIsAlreadyActivated") != std::string::npos || rpc.error->error_type.find("TokenIsAlreadyActivated") != std::string::npos) + { + SPDLOG_ERROR("{} {}: ", rpc.request.ticker, rpc.error->error_type); + fetch_single_balance(get_coin_info(rpc.request.ticker)); + m_coins_informations[rpc.request.ticker].currently_enabled = true; + dispatcher_.trigger(coin_fully_initialized{.tickers = {rpc.request.ticker}}); + if constexpr (std::is_same_v) + { + for (const auto& tendermint_coin_info : rpc.request.tokens_params) + { + SPDLOG_ERROR("{} {}: ", tendermint_coin_info.ticker, rpc.error->error_type); + fetch_single_balance(get_coin_info(tendermint_coin_info.ticker)); + m_coins_informations[tendermint_coin_info.ticker].currently_enabled = true; + dispatcher_.trigger(coin_fully_initialized{.tickers = {tendermint_coin_info.ticker}}); + } + } + } + else + { + m_coins_informations[rpc.request.ticker].currently_enabled = false; + update_coin_active({rpc.request.ticker}, false); + this->dispatcher_.trigger(rpc.request.ticker, rpc.error->error); + } + } + else + { + dispatcher_.trigger(coin_fully_initialized{.tickers = {rpc.request.ticker}}); + fetch_single_balance(get_coin_info(rpc.request.ticker)); + m_coins_informations[rpc.request.ticker].currently_enabled = true; + if constexpr (std::is_same_v) + { + for (const auto& tendermint_token_addresses_info : rpc.result->tendermint_token_balances_infos) + { + dispatcher_.trigger(coin_fully_initialized{.tickers = {tendermint_token_addresses_info.first}}); + process_balance_answer(rpc); + m_coins_informations[tendermint_token_addresses_info.first].currently_enabled = true; + } + } + process_balance_answer(rpc); + } + }; + + if (!has_coin(parent_ticker)) + { + static constexpr auto error = "{} is not present in the config. Cannot enable TENDERMINT tokens."; + SPDLOG_ERROR(error); + this->dispatcher_.trigger(parent_ticker, fmt::format(error, parent_ticker)); + return; + } + + auto parent_ticker_info = get_coin_info(parent_ticker); + + if (parent_ticker_info.currently_enabled) + { + for (const auto& coin_config : coins) + { + mm2::enable_tendermint_token_rpc rpc{.request={.ticker = coin_config.ticker}}; + + if (coin_config.ticker == parent_ticker_info.ticker) + { + continue; + } + m_mm2_client.process_rpc_async(rpc.request, callback); + } + } + else + { + mm2::enable_tendermint_with_assets_rpc rpc; + + rpc.request.ticker = parent_ticker_info.ticker; + rpc.request.rpc_urls = parent_ticker_info.rpc_urls.value_or(std::vector{}); + for (const auto& coin_config : coins) + { + if (coin_config.ticker == parent_ticker_info.ticker) + { + continue; + } + rpc.request.tokens_params.push_back({.ticker = coin_config.ticker}); + } + m_mm2_client.process_rpc_async(rpc.request, callback); + } + this->m_nb_update_required += 1; + } + + void mm2_service::process_balance_answer(const mm2::enable_tendermint_token_rpc& rpc) + { + const auto& answer = rpc.result.value(); + mm2::balance_answer balance_answer; + + balance_answer.address = answer.balances.begin()->first; + balance_answer.balance = answer.balances.begin()->second.spendable; + balance_answer.coin = answer.platform_coin; + + { + std::unique_lock lock(m_balance_mutex); + m_balance_informations[balance_answer.coin] = std::move(balance_answer); + } + } + + void mm2_service::process_balance_answer(const mm2::enable_tendermint_with_assets_rpc& rpc) + { + const auto& answer = rpc.result.value(); + { + mm2::balance_answer balance_answer; + + balance_answer.coin = rpc.request.ticker; + balance_answer.balance = answer.tendermint_balances_infos.balances.spendable; + balance_answer.address = answer.address; + { + std::unique_lock lock(m_balance_mutex); + m_balance_informations[balance_answer.coin] = std::move(balance_answer); + } + } + if (answer.tendermint_token_balances_infos.empty()) + { + return; + } + for (auto [ticker, data] : answer.tendermint_token_balances_infos) + { + mm2::balance_answer balance_answer; + + balance_answer.coin = ticker; + balance_answer.address = answer.address; + balance_answer.balance = data.spendable; + + { + std::unique_lock lock(m_balance_mutex); + m_balance_informations[balance_answer.coin] = std::move(balance_answer); + } + } + } + void mm2_service::enable_slp_coin(coin_config coin_config) { enable_slp_coins(t_coins{std::move(coin_config)}); @@ -1103,20 +1295,26 @@ namespace atomic_dex } else { - std::string method = "my_tx_history"; std::size_t limit = 5000; bool requires_v2 = false; - if (coin_info.is_zhtlc_family) - { - requires_v2 = true; - limit = 50; - method = "z_coin_tx_history"; - } - else if (coin_info.coin_type == CoinTypeGadget::SLP || coin_info.ticker == "tBCH" || coin_info.ticker == "BCH") + std::string method = "my_tx_history"; + if (coin_info.coin_type == CoinTypeGadget::ZHTLC || coin_info.coin_type == CoinTypeGadget::TENDERMINT || coin_info.coin_type == CoinTypeGadget::TENDERMINTTOKEN || coin_info.coin_type == CoinTypeGadget::SLP || coin_info.ticker == "tBCH" || coin_info.ticker == "BCH") { requires_v2 = true; + if (coin_info.is_zhtlc_family) + { + // Don't request balance / history if not completely activated. + if (coin_info.activation_status.at("result").at("status") == "Ok") + { + limit = 50; + method = "z_coin_tx_history"; + } + else + { + return std::make_tuple(batch_array, tickers_idx, tokens_to_fetch); + } + } } - t_tx_history_request request{.coin = ticker, .limit = limit}; nlohmann::json j = mm2::template_request(method, requires_v2); mm2::to_json(j, request); @@ -1127,6 +1325,17 @@ namespace atomic_dex { for (auto&& coin : enabled_coins) { + coin_info = get_coin_info(ticker); + + if (coin_info.is_zhtlc_family) + { + // Don't request balance / history if not completely activated. + if (coin_info.activation_status.at("result").at("status") != "Ok") + { + continue; + } + } + if (is_pin_cfg_enabled()) { std::shared_lock lock(m_balance_mutex); ///< shared_lock @@ -1184,18 +1393,24 @@ namespace atomic_dex { auto request_functor = [this](coin_config coin_info) -> std::pair> { - t_init_z_coin_request request{ + const auto& settings_system = m_system_manager.get_system(); + int sync_date = settings_system.get_pirate_sync_date(); + int sync_height = settings_system.get_pirate_sync_height(sync_date, coin_info.checkpoint_height, coin_info.checkpoint_blocktime); + + t_enable_z_coin_request request{ .coin_name = coin_info.ticker, .servers = coin_info.electrum_urls.value_or(get_electrum_server_from_token(coin_info.ticker)), .z_urls = coin_info.z_urls.value_or(std::vector{}), .coin_type = coin_info.coin_type, + .sync_height = sync_height, .is_testnet = coin_info.is_testnet.value_or(false), .with_tx_history = false}; // Tx history not yet ready for ZHTLC - nlohmann::json j = mm2::template_request("init_z_coin", true); + nlohmann::json j = mm2::template_request("task::enable_z_coin::init", true); mm2::to_json(j, request); nlohmann::json batch = nlohmann::json::array(); batch.push_back(j); + // SPDLOG_INFO("ZHTLC request: {}", batch.dump(4)); return {batch, {coin_info.ticker}}; }; @@ -1250,11 +1465,11 @@ namespace atomic_dex static std::size_t z_nb_try = 0; nlohmann::json z_error = nlohmann::json::array(); nlohmann::json z_batch_array = nlohmann::json::array(); - t_init_z_coin_status_request z_request{.task_id = task_id}; + t_enable_z_coin_status_request z_request{.task_id = task_id}; - SPDLOG_DEBUG("{} init_z_coin Task ID: {}", tickers[idx], task_id); + SPDLOG_INFO("{} enable_z_coin Task ID: {}", tickers[idx], task_id); - nlohmann::json j = mm2::template_request("init_z_coin_status", true); + nlohmann::json j = mm2::template_request("task::enable_z_coin::status", true); mm2::to_json(j, z_request); z_batch_array.push_back(j); std::string last_event = "none"; @@ -1267,9 +1482,12 @@ namespace atomic_dex z_error = z_answers; std::string status = z_answers[0].at("result").at("status").get(); + // SPDLOG_DEBUG("{} status : {}", tickers[idx], status); + SPDLOG_INFO("{} Activation Status: {}", tickers[idx], z_answers[0].dump()); - if (status == "Ready") + if (status == "Ok") { + SPDLOG_INFO("{} activation ready...", tickers[idx]); m_coins_informations[tickers[idx]].activation_status = z_answers[0]; if (z_answers[0].at("result").at("details").contains("error")) { @@ -1281,10 +1499,10 @@ namespace atomic_dex } } event = z_answers[0].at("result").at("details").at("error").get(); - SPDLOG_DEBUG("Enabling [{}] error: {}", tickers[idx], event); + SPDLOG_INFO("Enabling [{}] error: {}", tickers[idx], event); break; } - SPDLOG_DEBUG("{} activation complete!", tickers[idx]); + SPDLOG_INFO("{} activation complete!", tickers[idx]); std::unique_lock lock(m_coin_cfg_mutex); m_coins_informations[tickers[idx]].currently_enabled = true; @@ -1292,6 +1510,11 @@ namespace atomic_dex this->m_nb_update_required += 1; break; } + else if (status == "Error") + { + event = z_answers[0].at("result").at("details").at("error_data").at("error").get(); + break; + } else { // todo(syl): many unused variables. @@ -1304,14 +1527,23 @@ namespace atomic_dex { event = "BuildingWalletDb"; } + else if (z_answers[0].at("result").at("details").contains("ActivatingCoin")) + { + event = "ActivatingCoin"; + } + else if (z_answers[0].at("result").at("details").contains("TemporaryError")) + { + event = "TemporaryError"; + } else { event = z_answers[0].at("result").at("details").get(); } + // SPDLOG_DEBUG("{} activation event [{}]", event, tickers[idx]); if (event != last_event) { - SPDLOG_DEBUG("Waiting for {} to enable [{}: {}]...", tickers[idx], status, event); + SPDLOG_INFO("Waiting for {} to enable [{}: {}]...", tickers[idx], status, event); if (!m_coins_informations[tickers[idx]].currently_enabled && event != "ActivatingCoin") { std::unique_lock lock(m_coin_cfg_mutex); @@ -1323,21 +1555,19 @@ namespace atomic_dex this->dispatcher_.trigger(tickers[idx], event); last_event = event; } - // todo(syl): refactor to a background task - std::this_thread::sleep_for(2s); + std::this_thread::sleep_for(5s); } m_coins_informations[tickers[idx]].activation_status = z_answers[0]; z_nb_try += 1; - } while (z_nb_try < 1000); + } while (z_nb_try < 10000); try { if (z_error[0].at("result").at("details").contains("error")) { - std::string zhtlc_error = z_error[0].at("result").at("details").at("error").get(); - SPDLOG_DEBUG("Error enabling {}: {} ", tickers[idx], zhtlc_error); - SPDLOG_DEBUG( + SPDLOG_INFO("Error enabling {}: {} ", tickers[idx], event); + SPDLOG_INFO( "Removing zhtlc from enabling, idx: {}, tickers size: {}, answers size: {}", tickers[idx], idx, tickers.size(), answers.size() ); @@ -1346,16 +1576,15 @@ namespace atomic_dex this->dispatcher_.trigger(tickers[idx], z_error[0].dump(4)); to_remove.emplace(tickers[idx]); } - else if (z_nb_try == 1000) + else if (z_nb_try == 10000) { // TODO: Handle this case. // There could be no error message if scanning takes too long. // Either we force disable here, or schedule to check on it later // If this happens, address will be "Invalid" and balance will be zero. - // We could save this ticker in a list to try `init_z_coin_status` again on it periodically until complete. - - SPDLOG_DEBUG("Exited zhtlc enable loop after 1000 tries"); - SPDLOG_DEBUG( + // We could save this ticker in a list to try `enable_z_coin_status` again on it periodically until complete. + SPDLOG_INFO("Exited {} enable loop after 10000 tries ", tickers[idx]); + SPDLOG_INFO( "Bad answer for zhtlc_error: [{}] -> idx: {}, tickers size: {}, answers size: {}", tickers[idx], idx, tickers.size(), answers.size() ); @@ -1365,12 +1594,13 @@ namespace atomic_dex } else { + SPDLOG_INFO("{} enable loop complete!", tickers[idx]); this->dispatcher_.trigger(tickers[idx], "Complete!"); } } catch (const std::exception& error) { - SPDLOG_ERROR("exception caught in zhtlc batch_enable_coins: {}", error.what()); + SPDLOG_INFO("exception caught in zhtlc batch_enable_coins: {}", error.what()); } } } @@ -1380,11 +1610,13 @@ namespace atomic_dex if (!to_remove.empty()) { + SPDLOG_DEBUG("Removing coins which failed activation..."); std::vector disable_coins; for (auto&& t: to_remove) { tickers.erase(std::remove(tickers.begin(), tickers.end(), t), tickers.end()); disable_coins.push_back(t); } + SPDLOG_DEBUG("Updating coins status..."); update_coin_status(this->m_current_wallet_name, disable_coins, false, m_coins_informations, m_coin_cfg_mutex); } @@ -1393,6 +1625,7 @@ namespace atomic_dex dispatcher_.trigger(tickers); if (tickers.size() == 1) { + SPDLOG_DEBUG("Init balance for {}...", tickers[0]); fetch_single_balance(get_coin_info(tickers[0])); } this->m_nb_update_required += 1; @@ -1440,10 +1673,10 @@ namespace atomic_dex { if (coin_info.activation_status.contains("result")) { - SPDLOG_DEBUG("coin_info.activation_status {} {} :", coin, coin_info.activation_status.dump(4)); + // SPDLOG_DEBUG("coin_info.activation_status {} {} :", coin, coin_info.activation_status.dump(4)); if (coin_info.activation_status.at("result").contains("status")) { - if (coin_info.activation_status.at("result").at("status") == "Ready") + if (coin_info.activation_status.at("result").at("status") == "Ok") { if (coin_info.activation_status.at("result").contains("details")) { @@ -1480,6 +1713,7 @@ namespace atomic_dex return m_coins_informations.contains(ticker); } + // [smk] Only called by trading_page::process_action() t_orderbook_answer mm2_service::get_orderbook(t_mm2_ec& ec) const { auto&& [base, rel] = this->m_synchronized_ticker_pair.get(); @@ -1500,7 +1734,7 @@ namespace atomic_dex nlohmann::json mm2_service::prepare_batch_orderbook(bool is_a_reset) { - // SPDLOG_INFO("is_a_reset: {}", is_a_reset); + SPDLOG_INFO("[prepare_batch_orderbook] is_a_reset: {}", is_a_reset); auto&& [base, rel] = m_synchronized_ticker_pair.get(); if (rel.empty()) return nlohmann::json::array(); @@ -2488,4 +2722,4 @@ namespace atomic_dex { update_coin_status(this->m_current_wallet_name, {ticker}, status, m_coins_informations, m_coin_cfg_mutex, "is_segwit_on"); } -} // namespace atomic_dex \ No newline at end of file +} // namespace atomic_dex diff --git a/src/core/atomicdex/services/mm2/mm2.service.hpp b/src/core/atomicdex/services/mm2/mm2.service.hpp index 9b998f044d..a10b20de19 100644 --- a/src/core/atomicdex/services/mm2/mm2.service.hpp +++ b/src/core/atomicdex/services/mm2/mm2.service.hpp @@ -1,5 +1,5 @@ /****************************************************************************** -* Copyright © 2013-2022 The Komodo Platform Developers. * +* Copyright © 2013-2023 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -37,6 +37,8 @@ #include "atomicdex/api/mm2/rpc.orderbook.hpp" #include "atomicdex/api/mm2/enable_bch_with_tokens_rpc.hpp" #include "atomicdex/api/mm2/enable_slp_rpc.hpp" +#include "atomicdex/api/mm2/rpc2.enable_tendermint_with_assets.hpp" +#include "atomicdex/api/mm2/rpc2.enable_tendermint_token.hpp" #include "atomicdex/config/raw.mm2.coins.cfg.hpp" #include "atomicdex/constants/dex.constants.hpp" #include "atomicdex/data/dex/orders.and.swaps.data.hpp" @@ -175,11 +177,15 @@ namespace atomic_dex void enable_slp_coins(const t_coins& coins); void enable_slp_testnet_coin(coin_config coin_config); void enable_slp_testnet_coins(const t_coins& coins); + void enable_tendermint_coin(coin_config coin_config, std::string parent_ticker); + void enable_tendermint_coins(const t_coins& coins, const std::string parent_ticker); void enable_zhtlc(const t_coins& coins); - + // Balances processing functions void process_balance_answer(const mm2::enable_bch_with_tokens_rpc& rpc); // Called after enabling SLP coins along tBCH/BCH. void process_balance_answer(const mm2::enable_slp_rpc& rpc); // Called after enabling an SLP coin. + void process_balance_answer(const mm2::enable_tendermint_with_assets_rpc& rpc); + void process_balance_answer(const mm2::enable_tendermint_token_rpc& rpc); public: //! Add a new coin in the coin_info cfg add_new_coin(normal_cfg, mm2_cfg) @@ -191,6 +197,9 @@ namespace atomic_dex [[nodiscard]] nlohmann::json get_zhtlc_status(const std::string coin) const; + //! Cancel zhtlc activation + void enable_z_coin_cancel(const std::int8_t task_id); + //! Disable a single coin bool disable_coin(const std::string& ticker, std::error_code& ec); @@ -270,7 +279,6 @@ namespace atomic_dex //! Pagination void set_orders_and_swaps_pagination_infos(std::size_t current_page = 1, std::size_t limit = 50, t_filtering_infos infos = {}); - void change_segwit_status(std::string ticker, bool status); }; } // namespace atomic_dex diff --git a/src/core/atomicdex/services/mm2/mm2_events.hpp b/src/core/atomicdex/services/mm2/mm2_events.hpp index 2329a147f9..b5b24fa784 100644 --- a/src/core/atomicdex/services/mm2/mm2_events.hpp +++ b/src/core/atomicdex/services/mm2/mm2_events.hpp @@ -1,4 +1,4 @@ -// atomicdex-desktop +// komodo-wallet // Author(s): syl #pragma once diff --git a/src/core/atomicdex/services/price/global.provider.cpp b/src/core/atomicdex/services/price/global.provider.cpp index 966b67dd48..465d989bfe 100644 --- a/src/core/atomicdex/services/price/global.provider.cpp +++ b/src/core/atomicdex/services/price/global.provider.cpp @@ -19,7 +19,6 @@ #include "atomicdex/api/coinpaprika/coinpaprika.hpp" #include "atomicdex/pages/qt.settings.page.hpp" #include "atomicdex/services/price/komodo_prices/komodo.prices.provider.hpp" -#include "atomicdex/services/price/oracle/band.provider.hpp" namespace { @@ -30,7 +29,7 @@ namespace cfg.set_timeout(std::chrono::seconds(5)); return cfg; }()}; - t_http_client_ptr g_openrates_client = std::make_unique(FROM_STD_STR("https://rates.komodo.live"), g_openrates_cfg); + t_http_client_ptr g_openrates_client = std::make_unique(FROM_STD_STR("https://rates.komodo.earth"), g_openrates_cfg); pplx::cancellation_token_source g_token_source; pplx::task @@ -177,9 +176,9 @@ namespace atomic_dex const auto now = std::chrono::high_resolution_clock::now(); const auto s = std::chrono::duration_cast(now - m_update_clock); - if (s >= 2min) + if (s >= 5min) { - SPDLOG_INFO("2min spend - refreshing provider"); + SPDLOG_INFO("[global_price_service::update()] - 5min elapsed, updating providers"); this->on_force_update_providers({}); m_update_clock = std::chrono::high_resolution_clock::now(); } @@ -198,51 +197,27 @@ namespace atomic_dex //! FIXME: fix zatJum crash report, frontend QML try to retrieve price before program is even launched if (ticker.empty()) return "0"; - auto& provider = m_system_manager.get_system(); - auto& band_service = m_system_manager.get_system(); - std::string current_price = band_service.retrieve_if_this_ticker_supported(ticker); - const bool is_oracle_ready = band_service.is_oracle_ready(); + auto& provider = m_system_manager.get_system(); + std::string current_price = provider.get_rate_conversion(ticker); - if (current_price.empty()) + if (!is_this_currency_a_fiat(m_cfg, fiat)) { - current_price = provider.get_rate_conversion(ticker); - if (!is_this_currency_a_fiat(m_cfg, fiat)) + t_float_50 rate(1); { - t_float_50 rate(1); + if (m_coin_rate_providers.contains(fiat)) { - if (m_coin_rate_providers.contains(fiat)) - { - std::shared_lock lock(m_coin_rate_mutex); - rate = t_float_50(m_coin_rate_providers.at(fiat)); ///< Retrieve BTC or KMD rate let's say for USD - } - } - t_float_50 tmp_current_price = t_float_50(current_price) * rate; - current_price = tmp_current_price.str(); - } - else if (fiat != "USD") - { - if (m_other_fiats_rates->contains("rates")) - { - t_float_50 tmp_current_price = t_float_50(current_price) * m_other_fiats_rates->at("rates").at(fiat).get(); - current_price = tmp_current_price.str(); + std::shared_lock lock(m_coin_rate_mutex); + rate = t_float_50(m_coin_rate_providers.at(fiat)); ///< Retrieve BTC or KMD rate let's say for USD } } + t_float_50 tmp_current_price = t_float_50(current_price) * rate; + current_price = tmp_current_price.str(); } - else + else if (fiat != "USD") { - //! We use oracle - if (is_this_currency_a_fiat(m_cfg, fiat) && fiat != "USD") - { - if (m_other_fiats_rates->contains("rates")) - { - t_float_50 tmp_current_price = t_float_50(current_price) * m_other_fiats_rates->at("rates").at(fiat).get(); - current_price = tmp_current_price.str(); - } - } - - else if (!is_this_currency_a_fiat(m_cfg, fiat) && is_oracle_ready) + if (m_other_fiats_rates->contains("rates")) { - t_float_50 tmp_current_price = (t_float_50(current_price)) * band_service.retrieve_rates(fiat); + t_float_50 tmp_current_price = t_float_50(current_price) * m_other_fiats_rates->at("rates").at(fiat).get(); current_price = tmp_current_price.str(); } } diff --git a/src/core/atomicdex/services/price/komodo_prices/komodo.prices.provider.cpp b/src/core/atomicdex/services/price/komodo_prices/komodo.prices.provider.cpp index 140f2cd53b..e427c62635 100644 --- a/src/core/atomicdex/services/price/komodo_prices/komodo.prices.provider.cpp +++ b/src/core/atomicdex/services/price/komodo_prices/komodo.prices.provider.cpp @@ -141,8 +141,6 @@ namespace atomic_dex return "coinpaprika"; case komodo_prices::api::provider::forex: return "forex"; - case komodo_prices::api::provider::nomics: - return "nomics"; default: return "unknown"; } diff --git a/src/core/atomicdex/services/price/oracle/band.provider.cpp b/src/core/atomicdex/services/price/oracle/band.provider.cpp deleted file mode 100644 index 94724b861c..0000000000 --- a/src/core/atomicdex/services/price/oracle/band.provider.cpp +++ /dev/null @@ -1,146 +0,0 @@ -//! Project Headers -#include "band.provider.hpp" - -namespace atomic_dex -{ - band_oracle_price_service::band_oracle_price_service(entt::registry& registry) : system(registry) - { - m_update_clock = std::chrono::high_resolution_clock::now(); - fetch_oracle(); - } - - void - from_json(const nlohmann::json& j, band_oracle_price_result& result) - { - for (auto&& obj: j.at("result")) - { - std::string symbol = obj.at("symbol").get(); - t_float_50 px = t_float_50(obj.at("px").get()); - t_float_50 multiplier = t_float_50(obj.at("multiplier").get()); - t_float_50 price = px / multiplier; - std::stringstream sstream(obj.at("resolve_time").get()); - std::size_t timestamp; - sstream >> timestamp; - result.band_oracle_data[symbol].timestamp = timestamp; - result.band_oracle_data[symbol].reference = "https://guanyu-poa.cosmoscan.io/request/" + obj.at("request_id").get(); - result.band_oracle_data[symbol].price = price; - t_float_50 rates = t_float_50("1") / price; - result.band_oracle_data[symbol].rate = rates; - } - } -} // namespace atomic_dex - -namespace atomic_dex -{ - pplx::task - band_oracle_price_service::async_fetch_oracle_result() - { - web::http::http_request req; - req.set_method(web::http::methods::POST); - nlohmann::json json_body; - json_body["min_count"] = 10; - json_body["ask_count"] = 16; - json_body["symbols"] = nlohmann::json::array(); - for (auto&& cur_symbol: this->m_supported_tickers) { json_body["symbols"].push_back(cur_symbol); } - req.headers().set_content_type(FROM_STD_STR("application/json")); - // SPDLOG_INFO("req: {}", json_body.dump(4)); - req.set_body(json_body.dump()); - return m_band_http_client->request(req); - } - - void - band_oracle_price_service::fetch_oracle() - { - SPDLOG_INFO("start fetching oracle"); - async_fetch_oracle_result() - .then([this](web::http::http_response resp) { - auto body = TO_STD_STR(resp.extract_string(true).get()); - if (resp.status_code() == 200) - { - nlohmann::json j = nlohmann::json::parse(body); - band_oracle_price_result result; - from_json(j, result); - this->m_oracle_price_result = result; - using namespace std::chrono_literals; - auto last_oracle_timestamp = result.band_oracle_data.at("BAND").timestamp; - const auto now = std::chrono::system_clock::now(); - const auto last_oracle_timestamp_std = std::chrono::system_clock::from_time_t(last_oracle_timestamp); - const auto s = std::chrono::duration_cast(now - last_oracle_timestamp_std); - this->m_oracle_ready = s > 20min ? false : true; - if (s > 20min) - { - SPDLOG_WARN( - "last oracle too much outdated: {}, fallback to coinpaprika", - utils::to_human_date(last_oracle_timestamp, "%e %b %Y, %H:%M")); - } - this->dispatcher_.trigger(); - } - else - { - SPDLOG_ERROR("Cannot fetch oracle price: {}", body); - } - }) - .then(&handle_exception_pplx_task); - } -} // namespace atomic_dex - -namespace atomic_dex -{ - void - band_oracle_price_service::update() - { - using namespace std::chrono_literals; - - const auto now = std::chrono::high_resolution_clock::now(); - const auto s = std::chrono::duration_cast(now - m_update_clock); - if (s >= 5min) - { - fetch_oracle(); - m_update_clock = std::chrono::high_resolution_clock::now(); - } - } - - bool - band_oracle_price_service::is_oracle_ready() const - { - return this->m_oracle_ready.load(); - } - - std::string - band_oracle_price_service::retrieve_if_this_ticker_supported(const std::string& ticker) const - { - std::string current_price = ""; - if (is_oracle_ready()) - { - const auto result = m_oracle_price_result.synchronize(); - const auto it = result->band_oracle_data.find(ticker); - if (it != result->band_oracle_data.end()) - { - current_price = it->second.price.str(); - } - } - return current_price; - } - - t_float_50 - band_oracle_price_service::retrieve_rates(const std::string& fiat) const - { - const auto synchronized = m_oracle_price_result.synchronize(); - return synchronized->band_oracle_data.at(fiat).rate; - } - - std::vector - band_oracle_price_service::supported_pair() const - { - std::vector out; - out.reserve(this->m_supported_tickers.size()); - for (auto&& cur_symbol: this->m_supported_tickers) { out.emplace_back(cur_symbol + "/USD"); } - return out; - } - - std::string - band_oracle_price_service::last_oracle_reference() const - { - return ""; - } -} // namespace atomic_dex diff --git a/src/core/atomicdex/services/price/oracle/band.provider.hpp b/src/core/atomicdex/services/price/oracle/band.provider.hpp deleted file mode 100644 index 6f694da823..0000000000 --- a/src/core/atomicdex/services/price/oracle/band.provider.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include "atomicdex/services/mm2/mm2.service.hpp" - -namespace atomic_dex -{ - struct band_data - { - std::size_t timestamp; - std::string human_date; - t_float_50 price; - t_float_50 rate; - std::string reference; - }; - - struct band_oracle_price_result - { - std::unordered_map band_oracle_data; - }; - - void from_json(const nlohmann::json& j, band_oracle_price_result& result); - - class band_oracle_price_service final : public ag::ecs::pre_update_system - { - using t_update_time_point = std::chrono::high_resolution_clock::time_point; - using t_oracle_price_synchronized = boost::synchronized_value; - - static constexpr const char* m_band_endpoint{"http://komodo-rpc.bandchain.org/oracle/request_prices"}; - t_http_client_ptr m_band_http_client{std::make_unique(FROM_STD_STR(m_band_endpoint))}; - t_update_time_point m_update_clock; - t_oracle_price_synchronized m_oracle_price_result; - std::atomic_bool m_oracle_ready{false}; - std::vector m_supported_tickers{"BAND"}; - - void fetch_oracle() ; - pplx::task async_fetch_oracle_result() ; - - public: - explicit band_oracle_price_service(entt::registry& registry); - ~band_oracle_price_service() final = default; - - void update() final; - - //! Public API - bool is_oracle_ready() const ; - std::string retrieve_if_this_ticker_supported(const std::string& ticker) const ; - t_float_50 retrieve_rates(const std::string& fiat) const ; - std::vector supported_pair() const ; - std::string last_oracle_reference() const ; - }; -} // namespace atomic_dex - -REFL_AUTO(type(atomic_dex::band_oracle_price_service)) diff --git a/src/core/atomicdex/services/update/update.checker.service.cpp b/src/core/atomicdex/services/update/update.checker.service.cpp index db89277ca7..e366ae316e 100644 --- a/src/core/atomicdex/services/update/update.checker.service.cpp +++ b/src/core/atomicdex/services/update/update.checker.service.cpp @@ -29,7 +29,7 @@ namespace { - constexpr const char* g_komodolive_endpoint = "https://komodo.live/adexproversion"; + constexpr const char* g_komodolive_endpoint = "https://komodo.earth/adexproversion"; t_http_client_ptr g_komodolive_client{std::make_unique(FROM_STD_STR(g_komodolive_endpoint))}; pplx::task async_check_retrieve() diff --git a/src/core/atomicdex/version/version.hpp b/src/core/atomicdex/version/version.hpp index ee2e5373d4..fb4ee52209 100644 --- a/src/core/atomicdex/version/version.hpp +++ b/src/core/atomicdex/version/version.hpp @@ -21,19 +21,19 @@ namespace atomic_dex constexpr const char* get_version() { - return "0.5.7-beta"; + return "0.6.1-beta"; } constexpr int get_num_version() noexcept { - return 57; + return 61; } constexpr const char* get_raw_version() { - return "0.5.7"; + return "0.6.1"; } constexpr const char* diff --git a/src/tests/api/mm2/mm2.rpc.trade.preimage.tests.cpp b/src/tests/api/mm2/mm2.rpc.trade.preimage.tests.cpp index 1dce6caf12..5b088505ae 100644 --- a/src/tests/api/mm2/mm2.rpc.trade.preimage.tests.cpp +++ b/src/tests/api/mm2/mm2.rpc.trade.preimage.tests.cpp @@ -58,7 +58,7 @@ namespace "numer":"1" }, "amount_rat":[[1,[1]],[1,[10000]]], - "coin":"RICK" + "coin":"DOC" }, "taker_fee": { "coin": "MYCOIN1", @@ -72,7 +72,7 @@ namespace "numer":"1" }, "amount_rat":[[1,[1]],[1,[10000]]], - "coin":"RICK" + "coin":"DOC" } } )"_json; @@ -95,7 +95,7 @@ namespace "numer":"0" }, "amount_rat":[[0,[]],[1,[1]]], - "coin":"RICK" + "coin":"DOC" } } } @@ -119,7 +119,7 @@ namespace "numer":"1" }, "amount_rat":[[1,[1]],[1,[10000]]], - "coin":"RICK" + "coin":"DOC" }, "taker_fee": { "amount":"0.0001", @@ -128,7 +128,7 @@ namespace "numer":"1" }, "amount_rat":[[1,[1]],[1,[10000]]], - "coin":"RICK" + "coin":"DOC" }, "fee_to_send_taker_fee":{ @@ -138,7 +138,7 @@ namespace "numer":"1" }, "amount_rat":[[1,[1]],[1,[10000]]], - "coin":"RICK" + "coin":"DOC" } } } @@ -162,7 +162,7 @@ namespace "numer":"0" }, "amount_rat":[[0,[]],[1,[1]]], - "coin":"RICK" + "coin":"DOC" }, "volume":"2.21363478", "volume_fraction":{ @@ -176,7 +176,7 @@ namespace "numer":"0" }, "amount_rat":[[0,[]],[1,[1]]], - "coin":"RICK" + "coin":"DOC" }, "fee_to_send_taker_fee":{ "amount":"0.00033219", @@ -209,23 +209,23 @@ namespace "numer":"0" }, "amount_rat":[[0,[]],[1,[1]]], - "coin":"RICK" + "coin":"DOC" } } })"_json; - const nlohmann::json g_preimage_request_buy_rick_morty_real = R"( + const nlohmann::json g_preimage_request_buy_DOC_MARTY_real = R"( { - "base": "RICK", + "base": "DOC", "method": "trade_preimage", - "rel": "MORTY", + "rel": "MARTY", "swap_method": "buy", "userpass": "", "volume": "1", "price": "1" })"_json; - const nlohmann::json g_preimage_request_buy_rick_nonexistent_real = R"( + const nlohmann::json g_preimage_request_buy_DOC_nonexistent_real = R"( { - "base": "RICK", + "base": "DOC", "method": "trade_preimage", "rel": "NONEXISTENT", "swap_method": "buy", @@ -261,7 +261,7 @@ TEST_CASE("atomic_dex::mm2::preimage_answer_success deserialization from buy") TEST_SUITE("atomic_dex::mm2::preimage_answer deserialization test suites") { - TEST_CASE("setprice BTC/RICK") + TEST_CASE("setprice BTC/DOC") { atomic_dex::t_trade_preimage_answer answer; atomic_dex::mm2::from_json(g_preimage_answer_setprice, answer); @@ -270,7 +270,7 @@ TEST_SUITE("atomic_dex::mm2::preimage_answer deserialization test suites") CHECK_FALSE(answer.result.value().fee_to_send_taker_fee.has_value()); } - TEST_CASE("buy BTC/RICK") + TEST_CASE("buy BTC/DOC") { atomic_dex::t_trade_preimage_answer answer; atomic_dex::mm2::from_json(g_preimage_answer_buy, answer); @@ -279,7 +279,7 @@ TEST_SUITE("atomic_dex::mm2::preimage_answer deserialization test suites") CHECK(answer.result.value().fee_to_send_taker_fee.has_value()); } - TEST_CASE("sell max BTC/RICK") + TEST_CASE("sell max BTC/DOC") { atomic_dex::t_trade_preimage_answer answer; atomic_dex::mm2::from_json(g_preimage_answer_sell_max, answer); @@ -288,7 +288,7 @@ TEST_SUITE("atomic_dex::mm2::preimage_answer deserialization test suites") CHECK(answer.result.value().fee_to_send_taker_fee.has_value()); } - TEST_CASE("setprice ERC20 BAT/RICK") + TEST_CASE("setprice ERC20 BAT/DOC") { atomic_dex::t_trade_preimage_answer answer; atomic_dex::mm2::from_json(g_preimage_answer_setprice_erc, answer); @@ -371,11 +371,11 @@ SCENARIO("atomic_dex::mm2::preimage scenario") return atomic_dex::mm2::rpc_process_answer_batch(answers[0], "trade_preimage"); }; - //! A test with RICK/MORTY - GIVEN("Preparing a simple buy request RICK/MORTY") + //! A test with DOC/MARTY + GIVEN("Preparing a simple buy request DOC/MARTY") { //! Request values - atomic_dex::t_trade_preimage_request request{.base_coin = "RICK", .rel_coin = "MORTY", .swap_method = "buy", .volume = "1", .price = "1"}; + atomic_dex::t_trade_preimage_request request{.base_coin = "DOC", .rel_coin = "MARTY", .swap_method = "buy", .volume = "1", .price = "1"}; //! Transform request into json atomic_dex::mm2::to_json(request_json, request); @@ -386,7 +386,7 @@ SCENARIO("atomic_dex::mm2::preimage scenario") //! Check request without userpass against a constants at the top of the file auto copy_request = request_json; copy_request["userpass"] = ""; - CHECK_EQ(copy_request, g_preimage_request_buy_rick_morty_real); + CHECK_EQ(copy_request, g_preimage_request_buy_DOC_MARTY_real); //! A Test Case WHEN("I execute the request") @@ -403,14 +403,14 @@ SCENARIO("atomic_dex::mm2::preimage scenario") } //! See above - GIVEN("Preparing a wrong request RICK/NONEXISTENT coin") + GIVEN("Preparing a wrong request DOC/NONEXISTENT coin") { - atomic_dex::t_trade_preimage_request request{.base_coin = "RICK", .rel_coin = "NONEXISTENT", .swap_method = "buy", .volume = "1"}; + atomic_dex::t_trade_preimage_request request{.base_coin = "DOC", .rel_coin = "NONEXISTENT", .swap_method = "buy", .volume = "1"}; atomic_dex::mm2::to_json(request_json, request); batch.push_back(request_json); auto copy_request = request_json; copy_request["userpass"] = ""; - CHECK_EQ(copy_request, g_preimage_request_buy_rick_nonexistent_real); + CHECK_EQ(copy_request, g_preimage_request_buy_DOC_nonexistent_real); WHEN("I execute the request") { const atomic_dex::t_trade_preimage_answer answer = generic_resp_process(); diff --git a/src/tests/atomic.dex.tests.hpp b/src/tests/atomic.dex.tests.hpp index 93b3611a39..55f4ea8cd7 100644 --- a/src/tests/atomic.dex.tests.hpp +++ b/src/tests/atomic.dex.tests.hpp @@ -30,7 +30,7 @@ struct tests_context : public antara::gaming::world::app private: std::atomic_bool m_test_context_ready{false}; std::atomic_bool m_extra_coins_ready{false}; - std::vector m_extra_coins{"RICK", "MORTY"}; + std::vector m_extra_coins{"DOC", "MARTY"}; public: void @@ -81,16 +81,16 @@ struct tests_context : public antara::gaming::world::app SPDLOG_INFO("Using default password from the application"); } - if (not wallet_manager.get_wallets().contains("atomicdex-desktop_tests")) + if (not wallet_manager.get_wallets().contains("komodo-wallet_tests")) { wallet_manager.create( - test_password != nullptr ? test_password : "fakepasswordtemporary", test_seed != nullptr ? test_seed : "fake seed", "atomicdex-desktop_tests"); + test_password != nullptr ? test_password : "fakepasswordtemporary", test_seed != nullptr ? test_seed : "fake seed", "komodo-wallet_tests"); } else { - SPDLOG_INFO("atomicdex-desktop_tests already exists - skipping"); + SPDLOG_INFO("komodo-wallet_tests already exists - skipping"); } - wallet_manager.login(test_password != nullptr ? test_password : "fakepasswordtemporary", "atomicdex-desktop_tests"); + wallet_manager.login(test_password != nullptr ? test_password : "fakepasswordtemporary", "komodo-wallet_tests"); //! Waits for mm2 to be initialized before running tests while (!mm2.is_mm2_running() && !m_test_context_ready) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); }