diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 8c5ba697e1..2d72a9c0b0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,32 +1,35 @@ --- name: Bug report -about: Create a report to help us improve +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: Milerius, tonymorony +assignees: '' --- **Describe the bug** -A clear and concise description of what the bug is. +Please give us a clear and concise description of what the bug is, including screenshots or video if applicable. + **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' -2. Click on '....' -3. Scroll down to '....' +2. Scroll down to '....' +3. Click on '....' 4. See error + **Expected behavior** -A clear and concise description of what you expected to happen. +Please describe what you expected to happen. + -**Screenshots** -If applicable, add screenshots to help explain your problem. +**Operating Environment(s):** + - OS: [e.g. Windows/OSX/Linux. If Linux, include distro. ] + - OS version: [e.g. 7/10/11, 10.13/10.15, 18.04/20.04 ] + - Komodo Wallet Version: [e.g. 0.6.1] + - Build branch: [e.g. master/dev] -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] **Additional context** -Add any other context about the problem here. + - 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-komodo-wallet-desktop-log-files/540) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index bcb9403fc6..6a2d2d5040 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,20 +1,24 @@ --- name: Feature request -about: Suggest an idea for this project -title: "[FEATURE REQUEST]: " +about: Something missing? Got a cool idea? Let us know! +title: "[FR]: " labels: '' -assignees: Milerius, tonymorony +assignees: '' --- **Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] +What problem does your suggestion solve? E.g. It would be more convenient if [...] + + +**Describe your solution** +A clear and concise description of how your solution could be implemented. -**Describe the solution you'd like** -A clear and concise description of what you want to happen. **Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. +Have you considered any alternative approaches to solving the problem? + **Additional context** -Add any other context or screenshots about the feature request here. +For visual features, screenshots are great to include. +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 new file mode 100644 index 0000000000..edf217c51b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/support.md @@ -0,0 +1,12 @@ +--- +name: Support query +about: Did something go wrong? Need some help? Please follow the links below for assistance +title: "[SQ]: " +labels: 'support' +assignees: '' + +--- + +[Komodo Platform Discord Support Channel](https://discord.gg/RRZ8hzc) +[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/atomicdex-desktop-cd.yml b/.github/workflows/atomicdex-desktop-cd.yml index f9f3dae234..0ee68a3f46 100644 --- a/.github/workflows/atomicdex-desktop-cd.yml +++ b/.github/workflows/atomicdex-desktop-cd.yml @@ -1,4 +1,4 @@ -name: AtomicDex-Desktop CD releases +name: komodo-wallet-desktop CD releases on: push: @@ -6,9 +6,10 @@ on: - temporary_disabled env: - DEX_PROJECT_NAME: "atomicdex-desktop" - DEX_DISPLAY_NAME: "AtomicDex Desktop" + DEX_PROJECT_NAME: "komodo-wallet" + DEX_DISPLAY_NAME: "Komodo Wallet" DEX_COMPANY: "KomodoPlatform" + DEX_VERSION: "0.6.1" DEX_WEBSITE: "https://atomicdex.io/" jobs: diff --git a/.github/workflows/atomicdex-desktop-ci.yml b/.github/workflows/atomicdex-desktop-ci.yml index c937165c73..542a09b46a 100644 --- a/.github/workflows/atomicdex-desktop-ci.yml +++ b/.github/workflows/atomicdex-desktop-ci.yml @@ -1,4 +1,4 @@ -name: AtomicDex-Desktop CI +name: komodo-wallet-desktop CI on: pull_request: @@ -10,10 +10,18 @@ on: - cron: '0 0 * * 1' env: + DEX_API: "mm2-gleecdex" + DEX_RPCPORT: 7983 + DEX_RPC: "http://127.0.0.1:7983" DEX_PROJECT_NAME: "GleecDEX" DEX_DISPLAY_NAME: "GleecDEX" DEX_COMPANY: "Gleec" + DEX_VERSION: "0.6.1" DEX_WEBSITE: "https://gleec.com/" + VCPKG_DEFAULT_BINARY_CACHE: ${{ github.workspace }}/b/vcpkg_cache + VCPKG_BINARY_SOURCES: clear;x-gha,readwrite + RUNVCPKG_VCPKG_ROOT: ${{ github.workspace }}\komodo-wallet-desktop\ci_tools_atomic_dex\vcpkg-repo + VCPKG_ROOT: ${{ github.workspace }}\komodo-wallet-desktop\ci_tools_atomic_dex\vcpkg-repo jobs: @@ -25,112 +33,147 @@ jobs: fail-fast: false matrix: name: [ - ubuntu-qt-5-15-2, - osx-qt-5-15-2, - windows-10-qt-5-15-2 + ubuntu-release, + ubuntu-debug, + osx-release, + osx-debug, + windows-release, + windows-debug ] include: - - name: ubuntu-qt-5-15-2 - os: ubuntu-18.04 + - name: ubuntu-release + os: ubuntu-20.04 qt: '5.15.2' - type: 'release' + type: 'Release' + host: 'linux' - - name: osx-qt-5-15-2 - os: macos-latest + - name: ubuntu-debug + os: ubuntu-20.04 qt: '5.15.2' - type: 'release' + type: 'Debug' + host: 'linux' - - name: windows-10-qt-5-15-2 + - name: osx-release + os: macos-11 + qt: '5.15.2' + type: 'Release' + host: 'mac' + + - name: osx-debug + os: macos-11 + qt: '5.15.2' + type: 'Debug' + host: 'mac' + + - name: windows-release os: windows-latest qt: '5.15.2' - type: 'release' + type: 'Release' + host: 'windows' - #- name: osx-qt-5-15-2-dbg - # os: macos-latest - # qt: '5.15.2' - # type: 'debug' + - name: windows-debug + os: windows-latest + qt: '5.15.2' + type: 'Debug' + host: 'windows' steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} submodules: 'true' + - name: Expose GitHub Runtime Env + uses: crazy-max/ghaction-github-runtime@v2 - - uses: actions/setup-python@v2 + - name: Setup Python + uses: actions/setup-python@v4 with: - python-version: '3.8' + python-version: '3.9' - - name: Install QT (Linux) - if: runner.os == 'Linux' - uses: KomodoPlatform/install-qt-action@v2.9.0 + - name: Install MSVC + if: runner.os == 'Windows' + uses: ilammy/msvc-dev-cmd@v1.12.0 + + - name: Build libwally (Windows) + if: runner.os == 'Windows' + run: | + cd '${{ github.workspace }}' + git clone -b v0.8.5 --recurse-submodules https://github.com/KomodoPlatform/libwally-core.git + cd '${{ github.workspace }}\libwally-core' + git submodule init + git submodule sync --recursive + git submodule update --init --recursive + $env:LIBWALLY_DIR='${{ github.workspace }}\libwally-core' + "$env:LIBWALLY_DIR\tools\msvc\gen_ecmult_static_context.bat" + copy src\ccan\ccan\str\hex\hex.c src\ccan\ccan\str\hex\hex_.c + copy src\ccan\ccan\base64\base64.c src\ccan\ccan\base64\base64_.c + cl /utf-8 /DUSE_ECMULT_STATIC_PRECOMPUTATION /DECMULT_WINDOW_SIZE=15 /DWALLY_CORE_BUILD /DHAVE_CONFIG_H /DSECP256K1_BUILD /I$env:LIBWALLY_DIR\src\wrap_js\windows_config /I$env:LIBWALLY_DIR /I$env:LIBWALLY_DIR\src /I$env:LIBWALLY_DIR\include /I$env:LIBWALLY_DIR\src\ccan /I$env:LIBWALLY_DIR\src\ccan\base64 /I$env:LIBWALLY_DIR\src\secp256k1 /Zi /LD src/aes.c src/anti_exfil.c src/base58.c src/base64.c src/bech32.c src/bip32.c src/bip38.c src/bip39.c src/blech32.c src/ecdh.c src/elements.c src/hex.c src/hmac.c src/internal.c src/mnemonic.c src/pbkdf2.c src/pullpush.c src/psbt.c src/script.c src/scrypt.c src/sign.c src/symmetric.c src/transaction.c src/wif.c src/wordlist.c src/ccan/ccan/crypto/ripemd160/ripemd160.c src/ccan/ccan/crypto/sha256/sha256.c src/ccan/ccan/crypto/sha512/sha512.c src/ccan/ccan/base64/base64_.c src\ccan\ccan\str\hex\hex_.c src/secp256k1/src/secp256k1.c src/secp256k1/src/precomputed_ecmult_gen.c src/secp256k1/src/precomputed_ecmult.c /Fewally.dll + Copy-Item "${{ github.workspace }}\libwally-core\wally.dll" -Destination "${{ github.workspace }}\wally\wally.dll" -force + + + - name: Install QT (macOS) + if: runner.os == 'macOS' + uses: jurplel/install-qt-action@v3.3.0 with: version: ${{ matrix.qt }} - host: 'linux' - target: 'desktop' + host: ${{ matrix.host }} dir: '${{ github.workspace }}' - #mirror: 'http://mirrors.ocf.berkeley.edu/qt/' - mirror: https://qt-mirror.dannhauer.de/ - #mirror: https://www.funet.fi/pub/mirrors/download.qt-project.org/ - #mirror: https://ftp.fau.de/qtproject/ - modules: 'qtcharts qtwidgets debug_info qtwebengine qtwebview' - aqtversion: '==0.8' - py7zrversion: '==0.6' - - - name: Install QT (MacOS) - if: runner.os == 'macOS' - uses: KomodoPlatform/install-qt-action@v2.9.0 + target: 'desktop' + modules: 'qtcharts debug_info qtwebengine' + tools: 'tools_ifw' + setup-python: 'false' + cache: true + + - name: Install QT (Linux) + if: runner.os == 'Linux' + uses: jurplel/install-qt-action@v3.3.0 with: version: ${{ matrix.qt }} - host: 'mac' - target: 'desktop' - #mirror: 'http://mirrors.ocf.berkeley.edu/qt/' - mirror: https://qt-mirror.dannhauer.de/ - #mirror: https://www.funet.fi/pub/mirrors/download.qt-project.org/ - #mirror: https://ftp.fau.de/qtproject/ + host: ${{ matrix.host }} dir: '${{ github.workspace }}' - modules: 'qtcharts qtwidgets debug_info qtwebview qtwebengine' - - - name: Install QT IFW (MacOS) - if: runner.os == 'macOS' - run: | - python3 -m aqt tool mac tools_ifw 4.1.1-202105261132 qt.tools.ifw.41 -b https://qt-mirror.dannhauer.de/ --outputdir ${{ github.workspace }}/Qt - echo "${{ github.workspace }}/Qt/Tools/QtInstallerFramework/4.0/bin" >> $GITHUB_PATH + target: 'desktop' + modules: 'qtcharts debug_info qtwebengine' + setup-python: 'false' + cache: true - name: Install QT (Windows) if: runner.os == 'Windows' - uses: KomodoPlatform/install-qt-action@v2.9.0 + uses: jurplel/install-qt-action@v3.3.0 with: version: ${{ matrix.qt }} - host: 'windows' + host: ${{ matrix.host }} + dir: 'C:\' target: 'desktop' + modules: 'qtcharts debug_info qtwebengine' + tools: 'tools_ifw' arch: 'win64_msvc2019_64' - #mirror: 'http://mirrors.ocf.berkeley.edu/qt/' - mirror: https://qt-mirror.dannhauer.de/ - #mirror: https://www.funet.fi/pub/mirrors/download.qt-project.org/ - #mirror: https://ftp.fau.de/qtproject/ - dir: 'C:\' - modules: 'qtcharts qtwidgets debug_info qtwebview qtwebengine' - - - name: Install QT IFW (Windows) - if: runner.os == 'Windows' - run: | - python -m pip install --upgrade pip - python -m aqt tool windows tools_ifw 4.1.1-202105261131 qt.tools.ifw.41 -b https://qt-mirror.dannhauer.de/ --outputdir C:/Qt - echo "C:/Qt/Tools/QtInstallerFramework/4.0/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - echo $env:GITHUB_PATH - echo $env:PATH + cache: true - name: Install nim (Linux) if: runner.os == 'Linux' run: | export DEBIAN_FRONTEND=noninteractive - echo "CHOOSENIM_CHOOSE_VERSION=1.4.0" >> $GITHUB_ENV + export SHELL=/bin/bash + echo "CHOOSENIM_CHOOSE_VERSION=1.6.2" >> $GITHUB_ENV + export CHOOSENIM_CHOOSE_VERSION=1.6.2 curl https://nim-lang.org/choosenim/init.sh > choosenim.sh chmod +x choosenim.sh ./choosenim.sh -y export PATH=/home/runner/.nimble/bin:$PATH + 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' @@ -139,33 +182,76 @@ jobs: echo ${{ github.sha }} sudo ./ci_tools_atomic_dex/ci_scripts/linux_script.sh + - name: Install deps (MacOS) + if: runner.os == 'macOS' + run: | + ./ci_tools_atomic_dex/ci_scripts/osx_script.sh + + - name: Upload env variable for vpkg (MacOS) + if: runner.os == 'macOS' + run: | + echo "CXX=/usr/local/opt/llvm/bin/clang++" >> $GITHUB_ENV + echo "CC=/usr/local/opt/llvm/bin/clang" >> $GITHUB_ENV + - name: Upload env variable for vpkg (Linux) if: runner.os == 'Linux' run: | - #echo "CXXFLAGS=-stdlib=libc++" >> $GITHUB_ENV - #echo "LDFLAGS=-stdlib=libc++" >> $GITHUB_ENV echo "CXX=clang++-12" >> $GITHUB_ENV echo "CC=clang-12" >> $GITHUB_ENV - name: vcpkg deps (All) - uses: KomodoPlatform/run-vcpkg@v7 + uses: lukka/run-vcpkg@v11 with: vcpkgDirectory: '${{ github.workspace }}/ci_tools_atomic_dex/vcpkg-repo' - setupOnly: true - appendedCacheKey: ${{ hashFiles('vcpkg.json') }} + vcpkgJsonGlob: 'vcpkg.json' - - name: Install deps (MacOS) - if: runner.os == 'macOS' - run: | - ./ci_tools_atomic_dex/ci_scripts/osx_script.sh + - name: import code signing certificates (macos) + if: runner.os == 'macOS' && 'KomodoPlatform/komodo-wallet-desktop' == github.repository + uses: Apple-Actions/import-codesign-certs@v1 + with: + keychain: ${{ github.run_id }} + keychain-password: ${{ github.run_id }} + p12-file-base64: ${{ secrets.CERTIFICATES_P12 }} + p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }} + + - name: import installer code signing certificates (macos) + if: runner.os == 'macOS' && 'KomodoPlatform/komodo-wallet-desktop' == github.repository + uses: apple-actions/import-codesign-certs@v1 + with: + keychain: ${{ github.run_id }} + keychain-password: ${{ github.run_id }} + create-keychain: false + p12-file-base64: ${{ secrets.CERTIFICATES_INSTALLER_P12 }} + p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }} - - name: Upload env variable for vpkg (MacOS) + + + - name: Build Komodo Wallet (MacOS) if: runner.os == 'macOS' run: | - echo "CXX=/usr/local/opt/llvm/bin/clang++" >> $GITHUB_ENV - echo "CC=/usr/local/opt/llvm/bin/clang" >> $GITHUB_ENV + xcrun --sdk macosx --show-sdk-path + export SDK_PATH=$(xcrun --sdk macosx --show-sdk-path) + ls /Applications/Xcode_13.2.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs + echo $HOME/sdk + ls $HOME/sdk + export MAC_SIGN_IDENTITY="${{ secrets.MAC_SIGN_IDENTITY }}" + export INSTALLER_MAC_SIGN_IDENTITY="${{ secrets.INSTALLER_MAC_SIGN_IDENTITY }}" + export APPLE_ATOMICDEX_PASSWORD="${{ secrets.APPLE_ATOMICDEX_PASSWORD }}" + export APPLE_ID="${{ secrets.APPLE_ID }}" + 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++ + cd ci_tools_atomic_dex + nimble build -y + ./ci_tools_atomic_dex bundle ${{ matrix.type }} --osx_sdk=$HOME/sdk/MacOSX10.15.sdk --compiler=clang++ + - - 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 @@ -179,182 +265,154 @@ jobs: cd ci_tools_atomic_dex nimble build -y - ./ci_tools_atomic_dex build release - ./ci_tools_atomic_dex bundle release - - #- name: import code signing certificates (macos) - # if: runner.os == 'macOS' - # uses: Apple-Actions/import-codesign-certs@v1 - # with: - # keychain: ${{ github.run_id }} - # keychain-password: ${{ github.run_id }} - # p12-file-base64: ${{ secrets.CERTIFICATES_P12 }} - # p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }} - - #- name: import installer code signing certificates (macos) - # if: runner.os == 'macOS' - # uses: apple-actions/import-codesign-certs@v1 - # with: - # keychain: ${{ github.run_id }} - # keychain-password: ${{ github.run_id }} - # create-keychain: false - # p12-file-base64: ${{ secrets.CERTIFICATES_INSTALLER_P12 }} - # p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }} - - - name: Build AtomicDEX (MacOS) - if: runner.os == 'macOS' - run: | - #export MAC_SIGN_IDENTITY="${{ secrets.MAC_SIGN_IDENTITY }}" - #export INSTALLER_MAC_SIGN_IDENTITY="${{ secrets.INSTALLER_MAC_SIGN_IDENTITY }}" - #export APPLE_ATOMICDEX_PASSWORD="${{ secrets.APPLE_ATOMICDEX_PASSWORD }}" - #export APPLE_ID="${{ secrets.APPLE_ID }}" - export QT_INSTALL_CMAKE_PATH=${{ github.workspace }}/Qt/${{ matrix.qt }}/clang_64/lib/cmake - export QT_ROOT=${{ github.workspace }}/Qt/${{ matrix.qt }} - export MACOSX_DEPLOYMENT_TARGET=10.14 - export CC=clang - export CXX=clang++ - cd ci_tools_atomic_dex - nimble build -y - ./ci_tools_atomic_dex bundle ${{ matrix.type }} --osx_sdk=$HOME/sdk/MacOSX10.14.sdk --compiler=clang++ + ./ci_tools_atomic_dex build ${{ matrix.type }} + ./ci_tools_atomic_dex bundle ${{ matrix.type }} - - name: Build AtomicDEX (Windows) + + - name: Build Komodo Wallet (Windows) if: runner.os == 'Windows' shell: powershell run: | $Env:QT_VERSION = "${{ matrix.qt }}" + $Env:CMAKE_BUILD_TYPE = "${{ matrix.type }}" .\ci_tools_atomic_dex\ci_scripts\windows_script.ps1 - #- name: Running Tests (Linux) - # working-directory: ci_tools_atomic_dex - # if: runner.os == 'Linux' && 'KomodoPlatform/atomicDEX-Desktop' == github.repository - # run: | - # #export REPORT_CI_TOKEN=${{ secrets.REPORT_CI_TOKEN_SECRET }} - # export ATOMICDEX_TEST_SEED=${{ secrets.ATOMICDEX_TEST_SEED }} - # export ATOMICDEX_PASSWORD=${{ secrets.ATOMICDEX_PASSWORD }} - # export QT_INSTALL_CMAKE_PATH=${{ github.workspace }}/Qt/${{ matrix.qt }}/gcc_64/lib/cmake - # export QT_ROOT=${{ github.workspace }}/Qt/${{ matrix.qt }} - # export PATH=${{ github.workspace }}/Qt/${{ matrix.qt }}/gcc_64/bin:$PATH - # export PATH=$HOME/.nimble/bin:$PATH - # export CXXFLAGS=-stdlib=libc++ - # export LDFLAGS=-stdlib=libc++ - # export CXX=clang++-11 - # export CC=clang-11 - # echo "Running tests" - # ./ci_tools_atomic_dex tests release - # cd build-Release/bin/AntaraAtomicDexTestsAppDir/usr/bin - # cat ${{ env.DEX_PROJECT_NAME }}-tests-result.xml - #curl https://report.ci/upload.py --output upload.py - # ls - #python upload.py --sha `git rev-parse HEAD` -n "[Doctest Linux]" --include='${{ env.DEX_PROJECT_NAME }}-tests-result.xml' --framework=doctest --merge ".*" - #echo "Uploading tests on Linux finished" - - #- name: Running Tests (MacOS) - # working-directory: ci_tools_atomic_dex - # if: runner.os == 'macOS' && 'KomodoPlatform/atomicDEX-Desktop' == github.repository - # run: | - # export REPORT_CI_TOKEN=${{ secrets.REPORT_CI_TOKEN_SECRET }} - # export ATOMICDEX_TEST_SEED=${{ secrets.ATOMICDEX_TEST_SEED }} - # 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 CC=clang - # export CXX=clang++ - # echo "Running tests" - # ./ci_tools_atomic_dex tests ${{ matrix.type }} - # cd build-${{ matrix.type }}/bin/${{ env.DEX_PROJECT_NAME }}_tests.app/Contents/MacOS - # cat ${{ env.DEX_PROJECT_NAME }}-tests-result.xml - #curl https://report.ci/upload.py --output upload.py - # ls - #python upload.py --sha `git rev-parse HEAD` -n "[Doctest MacOS ${{ matrix.type }}]" --include='${{ env.DEX_PROJECT_NAME }}-tests-result.xml' --framework=doctest --merge ".*" - #echo "Uploading tests on OSX finished" - - #- name: Running Tests (Windows) - # shell: powershell - # working-directory: ci_tools_atomic_dex - # if: runner.os == 'Windows' && 'KomodoPlatform/atomicDEX-Desktop' == github.repository - # run: | - # echo "Running tests" - # $Env:REPORT_CI_TOKEN = "${{ secrets.REPORT_CI_TOKEN_SECRET }}" - # $Env:QT_INSTALL_CMAKE_PATH = "C:\Qt\${{ matrix.qt }}\msvc2019_64" - # cmd /c '.\ci_tools_atomic_dex.exe tests release 2>&1' - # cd build-Release - # cd bin - # ls - #Invoke-WebRequest -Uri https://report.ci/upload.py -OutFile upload.py - #python upload.py --sha $(git rev-parse HEAD) -n "[Doctest Windows]" --include='${{ env.DEX_PROJECT_NAME }}-tests-result.xml' --framework=doctest --merge ".*" - - name: Upload env variable for artifacts (Linux) if: runner.os == 'Linux' run: | - ls ./bundled/linux/ echo "artifact_name_zstd=${{ env.DEX_PROJECT_NAME }}-${{ matrix.name }}-$(git rev-parse --short HEAD).tar.zst" >> $GITHUB_ENV echo "artifact_name_zip=${{ env.DEX_PROJECT_NAME }}-${{ matrix.name }}-$(git rev-parse --short HEAD).zip" >> $GITHUB_ENV echo "artifact_name_appimage=${{ env.DEX_PROJECT_NAME }}-${{ matrix.name }}-$(git rev-parse --short HEAD)-x86_64.AppImage" >> $GITHUB_ENV echo "target_name_zstd=${{ env.DEX_PROJECT_NAME }}-linux-$(git rev-parse --short HEAD).tar.zst" >> $GITHUB_ENV echo "target_name_zip=${{ env.DEX_PROJECT_NAME }}-linux-$(git rev-parse --short HEAD).zip" >> $GITHUB_ENV - echo "target_name_appimage=${{ env.DEX_PROJECT_NAME }}-$(git rev-parse --short HEAD)-x86_64.AppImage" >> $GITHUB_ENV + echo "target_name_appimage=${{ env.DEX_PROJECT_NAME }}-linux-$(git rev-parse --short HEAD)-x86_64.AppImage" >> $GITHUB_ENV + + - name: Upload bundle artifact (Linux ZSTD) if: runner.os == 'Linux' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.artifact_name_zstd }} path: ./bundled/linux/${{ env.target_name_zstd }} + retention-days: 7 - name: Upload bundle artifact (Linux ZIP) if: runner.os == 'Linux' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.artifact_name_zip }} path: ./bundled/linux/${{ env.target_name_zip }} + retention-days: 7 - name: Upload bundle artifact (Linux AppImage) if: runner.os == 'Linux' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.artifact_name_appimage }} path: ./bundled/linux/${{ env.target_name_appimage }} + retention-days: 7 - name: Upload env variable for artifacts (macOS) if: runner.os == 'macOS' run: | - ls ./bundled/osx/ echo "artifact_name_dmg=${{ env.DEX_PROJECT_NAME }}-${{ matrix.name }}-$(git rev-parse --short HEAD).dmg" >> $GITHUB_ENV echo "artifact_name_installer=${{ env.DEX_PROJECT_NAME }}-installer-${{ matrix.name }}-$(git rev-parse --short HEAD).7z" >> $GITHUB_ENV - name: Upload artifacts (MacOS dmg) if: runner.os == 'macOS' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.artifact_name_dmg }} path: ./bundled/osx/${{ env.DEX_PROJECT_NAME }}.dmg + retention-days: 7 - name: Upload artifacts (MacOS installer) if: runner.os == 'macOS' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.artifact_name_installer }} path: ./bundled/osx/${{ env.DEX_PROJECT_NAME }}_installer.7z + retention-days: 7 - name: Upload env variable for artifacts (Windows) if: runner.os == 'Windows' run: | echo "on_windows" echo "artifact_name_zip=${{ env.DEX_PROJECT_NAME }}-${{ matrix.name }}-$(git rev-parse --short HEAD).zip" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - echo "artifact_name_installer=${{ env.DEX_PROJECT_NAME }}-installer-${{ matrix.name }}-$(git rev-parse --short HEAD).exe" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + echo "artifact_name_installer=${{ env.DEX_PROJECT_NAME }}-${{ matrix.name }}-installer-$(git rev-parse --short HEAD).exe" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - name: Upload artifacts (Windows zip) if: runner.os == 'Windows' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.artifact_name_zip }} - path: ./bundled/windows/bin.zip + path: ./bundled/windows/${{ env.DEX_PROJECT_NAME }}.zip + retention-days: 7 - name: Upload artifacts (Windows installer) if: runner.os == 'Windows' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.artifact_name_installer }} path: ./bundled/windows/${{ env.DEX_PROJECT_NAME }}_installer.exe - - + retention-days: 7 + + + + - name: Running Tests (Linux) + working-directory: ci_tools_atomic_dex + continue-on-error: true + if: runner.os == 'Linux' && 'KomodoPlatform/komodo-wallet-desktop' == github.repository + run: | + export REPORT_CI_TOKEN=${{ secrets.REPORT_CI_TOKEN_SECRET }} + export ATOMICDEX_TEST_SEED=${{ secrets.ATOMICDEX_TEST_SEED }} + export ATOMICDEX_PASSWORD=${{ secrets.ATOMICDEX_PASSWORD }} + export QT_INSTALL_CMAKE_PATH=${{ github.workspace }}/Qt/${{ matrix.qt }}/gcc_64/lib/cmake + export QT_ROOT=${{ github.workspace }}/Qt/${{ matrix.qt }} + export PATH=${{ github.workspace }}/Qt/${{ matrix.qt }}/gcc_64/bin:$PATH + export PATH=$HOME/.nimble/bin:$PATH + export CXX=clang++-12 + export CC=clang-12 + #echo "Running tests" + #./ci_tools_atomic_dex tests ${{ matrix.type }} + #cd build-${{ matrix.type }}/bin/AntaraAtomicDexTestsAppDir/usr/bin + #cat ${{ env.DEX_PROJECT_NAME }}-tests-result.xml + + - name: Running Tests (MacOS) + working-directory: ci_tools_atomic_dex + continue-on-error: true + if: runner.os == 'macOS' && 'KomodoPlatform/komodo-wallet-desktop' == github.repository + run: | + export MAC_SIGN_IDENTITY="${{ secrets.MAC_SIGN_IDENTITY }}" + export INSTALLER_MAC_SIGN_IDENTITY="${{ secrets.INSTALLER_MAC_SIGN_IDENTITY }}" + export APPLE_ATOMICDEX_PASSWORD="${{ secrets.APPLE_ATOMICDEX_PASSWORD }}" + export APPLE_ID="${{ secrets.APPLE_ID }}" + export ASC_PUBLIC_ID="${{ secrets.ASC_PUBLIC_ID }}" + export MACOSX_DEPLOYMENT_TARGET=10.13 + export REPORT_CI_TOKEN=${{ secrets.REPORT_CI_TOKEN_SECRET }} + export ATOMICDEX_TEST_SEED=${{ secrets.ATOMICDEX_TEST_SEED }} + 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" + #nimble build -y + #./ci_tools_atomic_dex tests ${{ matrix.type }} + #cd build-${{ matrix.type }}/bin/${{ env.DEX_PROJECT_NAME }}_tests.app/Contents/MacOS + #cat ${{ env.DEX_PROJECT_NAME }}-tests-result.xml + + - name: Running Tests (Windows) + shell: powershell + continue-on-error: true + if: runner.os == 'Windows' && 'KomodoPlatform/komodo-wallet-desktop' == github.repository + run: | + #echo "Running tests" + $Env:REPORT_CI_TOKEN = "${{ secrets.REPORT_CI_TOKEN_SECRET }}" + $Env:QT_INSTALL_CMAKE_PATH = "C:\Qt\${{ matrix.qt }}\msvc2019_64" + #cd b\bin + #./${{ env.DEX_PROJECT_NAME }}_tests.exe --reporters=xml --out=${{ env.DEX_PROJECT_NAME }}-tests-result.xml -s + #Invoke-WebRequest -Uri https://report.ci/upload.py -OutFile upload.py + #python upload.py --sha $(git rev-parse HEAD) -n "[Doctest Windows]" --include='${{ env.DEX_PROJECT_NAME }}-tests-result.xml' --framework=doctest --merge ".*" \ No newline at end of file diff --git a/.github/workflows/atomicdex-desktop-release-vt.yml b/.github/workflows/atomicdex-desktop-release-vt.yml index 9215686717..c42a6507ac 100644 --- a/.github/workflows/atomicdex-desktop-release-vt.yml +++ b/.github/workflows/atomicdex-desktop-release-vt.yml @@ -1,4 +1,4 @@ -name: AtomicDex-Desktop VirustTotal Release +name: komodo-wallet-desktop VirustTotal Release on: release: @@ -10,7 +10,7 @@ jobs: steps: - name: VirusTotal Scan - uses: crazy-max/ghaction-virustotal@v2.2.1 + uses: crazy-max/ghaction-virustotal@v3.1.0 with: vt_api_key: ${{ secrets.VT_API_KEY }} github_token: ${{ github.token }} @@ -20,4 +20,4 @@ jobs: .zip$ .tar.zst$ .dmg$ - .7z$ \ No newline at end of file + .7z$ 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 a15c11a911..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,9 +83,9 @@ 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: 1 week + expire_in: 3 days AtomicDex-linux-AppImage: stage: upload_linux_appimage @@ -95,9 +95,9 @@ 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: 1 week + expire_in: 3 days AtomicDex-linux-tar: stage: upload_linux_tar @@ -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: 1 week + expire_in: 3 days diff --git a/.gitmodules b/.gitmodules index 6a25344e0b..6efc0e3d16 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "ci_tools_atomic_dex/vcpkg-custom-ports"] path = ci_tools_atomic_dex/vcpkg-custom-ports url = https://github.com/KomodoPlatform/vcpkg-custom-ports +[submodule "atomic_defi_design/imports/bignumberjs/bignumber.js"] + path = atomic_defi_design/imports/bignumberjs/bignumber.js + url = https://github.com/KomodoPlatform/bignumber.js.git diff --git a/CMakeLists.txt b/CMakeLists.txt index b8b37771e4..2f4f825ced 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.15) +cmake_minimum_required(VERSION 3.18) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) @@ -11,14 +11,13 @@ include(vcpkg_prerequisites) include(qt_prerequisites) include(cfg_hash) -project(${DEX_PROJECT_NAME} LANGUAGES CXX VERSION 0.5.0) +project(${DEX_PROJECT_NAME} LANGUAGES CXX VERSION 0.6.1) message(STATUS "${PROJECT_NAME} is version ${PROJECT_VERSION}") include(cmake_default_options) include(ipo_prerequisites) ##! Options -option(PREFER_BOOST_FILESYSTEM "Enable to use boost filesystem instead of std::filesystem" OFF) option(WITH_HOTRELOAD "Enable to use qml Hot reload" OFF) if (NOT WITH_HOTRELOAD) @@ -61,13 +60,13 @@ endif () ##! We fetch our dependencies if (APPLE) FetchContent_Declare(mm2 - URL http://195.201.0.6/dev/mm2-1e75b09f2-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.3666/mm2-572f7a1b5-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.3666/mm2-572f7a1b5-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) @@ -82,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(assets/config/${PROJECT_VERSION}-coins.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/mm2 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(assets/config/${PROJECT_VERSION}-coins.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/mm2.exe COPYONLY) - configure_file(${mm2_SOURCE_DIR}/msvcp140.dll ${CMAKE_BINARY_DIR}/bin/assets/tools/mm2/msvcp140.dll COPYONLY) - configure_file(${mm2_SOURCE_DIR}/msvcr100.dll ${CMAKE_BINARY_DIR}/bin/assets/tools/mm2/msvcr100.dll COPYONLY) - configure_file(${mm2_SOURCE_DIR}/vcruntime140.dll ${CMAKE_BINARY_DIR}/bin/assets/tools/mm2/vcruntime140.dll COPYONLY) + configure_file(${mm2_SOURCE_DIR}/mm2.exe ${CMAKE_BINARY_DIR}/bin/assets/tools/mm2/${DEX_API}.exe COPYONLY) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ci_tools_atomic_dex/windows_misc/msvcp140.dll ${CMAKE_BINARY_DIR}/bin/assets/tools/mm2/msvcp140.dll COPYONLY) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ci_tools_atomic_dex/windows_misc/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 6a39d2ffe7..536c3a064f 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,160 @@ -# [![AtomicDEX](https://i.ibb.co/D5GJLWy/adex.png)](https://atomicdex.io) +

+ + komodo-wallet-logo_dark-theme + +

+ +

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

+ + +## What is Komodo Wallet? + +Komodo Wallet 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. -[![Discord](https://img.shields.io/discord/302123079818149888.svg?style=for-the-badge&logo=discord)](https://discord.gg/tvp96Gf) -[![GitHub license](https://img.shields.io/github/license/KomodoPlatform/atomicDEX-Desktop?style=for-the-badge)](https://raw.githubusercontent.com/KomodoPlatform/atomicDEX-Desktop/master/LICENSE) -[![GitHub All Releases](https://img.shields.io/github/downloads/KomodoPlatform/atomicDEX-Desktop/total?style=for-the-badge)](https://github.com/KomodoPlatform/atomicDEX-Desktop/releases)
-[![Website](https://img.shields.io/website?down_message=offline&style=for-the-badge&up_message=online&url=https%3A%2F%2Fatomicdex.io%2F)](https://atomicdex.io/) -[![GitHub issues](https://img.shields.io/github/issues-raw/KomodoPlatform/atomicDEX-Desktop?style=for-the-badge)](https://github.com/KomodoPlatform/atomicdex-desktop/issues) -[![PRs](https://img.shields.io/github/issues-pr-closed/komodoplatform/atomicdex-desktop?style=for-the-badge)](https://github.com/KomodoPlatform/atomicdex-desktop/pulls)
-[![Commits](https://img.shields.io/github/commit-activity/y/komodoplatform/atomicdex-desktop?style=for-the-badge)](https://github.com/KomodoPlatform/atomicdex-desktop/commits/dev) -[![Contributors](https://img.shields.io/github/contributors/komodoplatform/atomicdex-desktop?style=for-the-badge)](https://github.com/KomodoPlatform/atomicdex-desktop/graphs/contributors) -[![Last Commit](https://img.shields.io/github/last-commit/komodoplatform/atomicdex-desktop/dev?style=for-the-badge)](https://github.com/KomodoPlatform/atomicdex-desktop/graphs/commit-activity)
-[![gitstars](https://img.shields.io/github/stars/KomodoPlatform/atomicDEX-Desktop?style=social)](https://github.com/KomodoPlatform/atomicdex-desktop/stargazers) -[![twitter](https://img.shields.io/twitter/follow/atomicdex?style=social)](https://twitter.com/atomicdex) +Komodo Wallet has been tested on the following platforms: -[![atomicDEX Gif](https://i.imgur.com/KN4i6XS.gif)](https://atomicdex.io) +- Windows 10 +- Linux (Ubuntu 18.04+) +- macOS (10.14 - 11.0) -## CI/CD status -| CI/CD Names | Status | -|-------------|--------| -| Windows/Linux/macOS | [![GitHub All Releases](https://img.shields.io/github/workflow/status/KomodoPlatform/atomicDEX-Desktop/AtomicDex-Desktop%20CI?style=for-the-badge)](https://github.com/KomodoPlatform/atomicDEX-Desktop/actions) | +## Get Started -## Useful links +You can [download](https://github.com/KomodoPlatform/komodo-wallet-desktop/releases) the pre-built beta binaries on +our [GitHub release page](https://github.com/KomodoPlatform/komodo-wallet-desktop/releases). -- :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/) +Build instructions can be found [here](https://github.com/KomodoPlatform/komodo-wallet-desktop/wiki/Build-Instructions) -## What is AtomicDEX? +Please join our [Discord Server](https://komodoplatform.com/discord) for support, discussions and general UI/UX +feedback. -AtomicDEX 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. -## On which platforms can I use AtomicDEX Desktop? +## Useful links -AtomicDEX Desktop has been tested on the following platforms: +- :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/) -- Windows 10 -- Linux (Ubuntu 16.04+) -- macOS (10.14 - 11.0) +## Komodo Wallet mobile -## Get Started +Check out Komodo Wallet mobile, available for [Android and iOS](https://atomicdex.io) -You can [download](https://github.com/KomodoPlatform/atomicDEX-Desktop/releases) the pre-built beta binaries on -our [GitHub release page](https://github.com/KomodoPlatform/atomicDEX-Desktop/releases). -Please join our [Discord Server](https://komodoplatform.com/discord) discussions around AtomicDEX and general UI/UX -feedback. +## Self-Hosted Dependencies + +| Dependencies | Version | Description | Categories | +|---------------|------------|-------------------------------------------------------------------------------------------------------------------------------------------------|---------------------| +| boost | 1.78 | Boost provides free peer-reviewed portable C++ source libraries. | General Programming | +| doctest | 2.3.8 | The fastest feature-rich C++11/14/17/20 single-header testing framework | Testing | +| fmt | 7.1.0 | A modern formatting library | Formatting | +| nlohmann_json | 3.9.1 | JSON for Modern C++ | Parsing | +| range-v3 | 0.11.0 | Range library for C++14/17/20, basis for C++20's std::ranges | Algorithm | +| date | 2019-11-08 | A date and time library based on the C++11/14/17 header | Timezone/Calendar | +| spdlog | 1.8.5 | Fast C++ logging library. | Logging | +| openssl | 1.1.1h | TLS/SSL and crypto library | Network/Crypto | +| entt | 3.5.1 | Gaming meets modern C++ - a fast and reliable entity component system (ECS) and much more | Architecture | +| cpprestsdk | 2.10.15-1 | The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. | HTTP | +| taskflow | 2.2.0 | Parallel and Heterogeneous Task Programming in Modern C++ | Threading | +| qt | 5.15.2 | Qt is a cross-platform application development framework for desktop, embedded and mobile. | GUI | + -## AtomicDEX mobile +## Contributors / Thanks + +
+ + + + + + + + + + + + + + + + + + + +
+ Milerius
Milerius

✍️💻 +
+ syl
syl

✍️💻 +
+ naezith
naezith

✍️💻 +
+ ssakone
ssakone

✍️💻 +
+ Anton TonyL Lysakov
Anton "TonyL" Lysakov

🛠💻 +
+ ca333
ca333

:penguin: :guardsman: +
+ smk762
smk762

🛠:wolf: +
+ cipig
cipig

✍️💻 +
+ SirSevenG
SirSevenG

🛠💻 +
+ dathbezumniy
dathbezumniy

🛠💻 +
+ BloodyNora
BloodyNora

🛠💻 +
+ zatJUM
zatJUM

:heart:💻 +
+
-Check out AtomicDEX mobile, available -for [Android and iOS](https://atomicdex.io) [![atomicDEX mobile](https://s5.gifyu.com/images/atomicdex_animation_small2.gif)](https://atomicdex.io) ## 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! @@ -65,68 +162,3 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -## Self-Hosted Dependencies - -| Dependencies | Version | Description | Categories | -|---------------|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------|---------------------| -| boost | 1.75 | Boost provides free peer-reviewed portable C++ source libraries. | General Programming | -| doctest | 2.3.8 | The fastest feature-rich C++11/14/17/20 single-header testing framework | Testing | -| fmt | 7.1.0 | A modern formatting library | Formatting | -| nlohmann_json | 3.9.1 | JSON for Modern C++ | Parsing | -| range-v3 | 0.11.0 | Range library for C++14/17/20, basis for C++20's std::ranges | Algorithm | -| date | 2019-11-08 | A date and time library based on the C++11/14/17 header | Timezone/Calendar | -| spdlog | 1.8.0 | Fast C++ logging library. | Logging | -| openssl | 1.1.1h | TLS/SSL and crypto library | Network/Crypto | -| entt | 3.5.1 | Gaming meets modern C++ - a fast and reliable entity component system (ECS) and much more | Architecture | -| cpprestsdk | 2.10.15-1 | The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. | HTTP | -| taskflow | 2.2.0 | Parallel and Heterogeneous Task Programming in Modern C++ | Threading | -| qt | 5.15.2 | Qt is a cross-platform application development framework for desktop, embedded and mobile. | GUI | - -## How do I build it ? - -Build instructions can be found [here](https://github.com/KomodoPlatform/atomicDEX-Desktop/wiki/Build-Instructions) - -## Contributors / Thanks - - - - - - - - - - - - - - - - - - - -
- Milerius
Milerius

✍️💻 -
- naezith
naezith

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

🛠💻 -
- cipig
cipig

✍️💻 -
- ca333
ca333

:penguin: :guardsman: -
- zatJUM
zatJUM

:heart:💻 -
- SirSevenG
SirSevenG

🛠💻 -
- smk762
smk762

🛠:wolf: -
- BloodyNora
BloodyNora

🛠💻 -
- dathbezumniy
dathbezumniy

🛠💻 -
- syl
syl

✍️💻 -
diff --git a/assets/config/.gitignore b/assets/config/.gitignore new file mode 100644 index 0000000000..2f7e12e1e9 --- /dev/null +++ b/assets/config/.gitignore @@ -0,0 +1 @@ +*-coins.json diff --git a/assets/config/0.5.0-coins.json b/assets/config/0.5.0-coins.json deleted file mode 100644 index 7d198dd787..0000000000 --- a/assets/config/0.5.0-coins.json +++ /dev/null @@ -1,5102 +0,0 @@ -{ - "AAVE-BEP20": { - "coin": "AAVE-BEP20", - "name": "Aave", - "coinpaprika_id": "aave-new", - "coingecko_id": "aave", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "AAVE-ERC20": { - "coin": "AAVE-ERC20", - "name": "Aave", - "coinpaprika_id": "aave-new", - "coingecko_id": "aave", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "ABY": { - "coin": "ABY", - "name": "ArtByte", - "coinpaprika_id": "aby-artbyte", - "coingecko_id": "artbyte", - "electrum": [ - { - "url": "electrumx.aby.ewmcx.biz:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "failover.aby.ewmcx.biz:50002", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "http://aby-explorer.ewmcx.info/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "ADA-BEP20": { - "coin": "ADA-BEP20", - "name": "Cardano", - "coinpaprika_id": "ada-cardano", - "coingecko_id": "cardano", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "ADX-BEP20": { - "coin": "ADX-BEP20", - "name": "AdEx", - "coinpaprika_id": "adx-adex", - "coingecko_id": "adex", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "ADX-ERC20": { - "coin": "ADX-ERC20", - "name": "AdEx", - "coinpaprika_id": "adx-adex", - "coingecko_id": "adex", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "ANKR-BEP20": { - "coin": "ANKR-BEP20", - "name": "Ankr", - "coinpaprika_id": "ankr-ankr-network", - "coingecko_id": "ankr", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "ANKR-ERC20": { - "coin": "ANKR-ERC20", - "name": "Ankr", - "coinpaprika_id": "ankr-ankr-network", - "coingecko_id": "ankr", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "BNB": { - "coin": "BNB", - "name": "Binance Coin", - "coinpaprika_id": "bnb-binance-coin", - "coingecko_id": "binancecoin", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "BNBT": { - "coin": "BNBT", - "name": "Binance Coin (Testnet)", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "nodes": [ - "https://data-seed-prebsc-1-s2.binance.org:8545" - ], - "explorer_url": [ - "https://testnet.bscscan.com/" - ], - "is_testnet": true, - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "1INCH-BEP20": { - "coin": "1INCH-BEP20", - "name": "1inch", - "coinpaprika_id": "1inch-1inch", - "coingecko_id": "1inch", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "1INCH-ERC20": { - "coin": "1INCH-ERC20", - "name": "1inch", - "coinpaprika_id": "1inch-1inch", - "coingecko_id": "1inch", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "ARPA": { - "coin": "ARPA", - "name": "ARPA Chain", - "coinpaprika_id": "arpa-arpa-chain", - "coingecko_id": "arpa-chain", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "ATOM-BEP20": { - "coin": "ATOM-BEP20", - "name": "Cosmos", - "coinpaprika_id": "atom-cosmos", - "coingecko_id": "cosmos", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "AUR": { - "coin": "AUR", - "name": "Auroracoin", - "coinpaprika_id": "aur-auroracoin", - "coingecko_id": "auroracoin", - "electrum": [ - { - "url": "electrumx.aur.ewmcx.info:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "failover.aur.ewmcx.biz:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "lenoir.ecoincore.com:12343", - "protocol": "SSL", - "disable_cert_verification": false - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/aur/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "AVA-BEP20": { - "coin": "AVA-BEP20", - "name": "Travala.com", - "coinpaprika_id": "ava-travala", - "coingecko_id": "concierge-io", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "AVAX-BEP20": { - "coin": "AVAX-BEP20", - "name": "Avalanche", - "coinpaprika_id": "avax-avalanche", - "coingecko_id": "avalanche-2", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "AXE": { - "coin": "AXE", - "name": "Axe", - "coinpaprika_id": "axe-axe", - "coingecko_id": "axe", - "electrum": [ - { - "url": "electrum1.cipig.net:10057", - "ws_url": "electrum1.cipig.net:30057" - }, - { - "url": "electrum2.cipig.net:10057", - "ws_url": "electrum2.cipig.net:30057" - }, - { - "url": "electrum3.cipig.net:10057", - "ws_url": "electrum3.cipig.net:30057" - } - ], - "explorer_url": [ - "https://axe-explorer.arcpool.com/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "BABYDOGE": { - "coin": "BABYDOGE", - "name": "Baby Doge Coin", - "coinpaprika_id": "babydoge-baby-doge-coin", - "coingecko_id": "baby-doge-coin", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "BAL-BEP20": { - "coin": "BAL-BEP20", - "name": "Balancer", - "coinpaprika_id": "bal-balancer", - "coingecko_id": "balancer", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "BAL-ERC20": { - "coin": "BAL-ERC20", - "name": "Balancer", - "coinpaprika_id": "bal-balancer", - "coingecko_id": "balancer", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "BAND-BEP20": { - "coin": "BAND-BEP20", - "name": "Band Protocol", - "coinpaprika_id": "band-band-protocol", - "coingecko_id": "band-protocol", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "BAND-ERC20": { - "coin": "BAND-ERC20", - "name": "Band Protocol", - "coinpaprika_id": "band-band-protocol", - "coingecko_id": "band-protocol", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "BIDR-BEP20": { - "coin": "BIDR-BEP20", - "name": "BIDR", - "coinpaprika_id": "bidr-binanceidr", - "coingecko_id": "binanceidr", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "BLK": { - "coin": "BLK", - "name": "BlackCoin", - "coinpaprika_id": "blk-blackcoin", - "coingecko_id": "blackcoin", - "electrum": [ - { - "url": "electrum1.blackcoin.nl:10002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrum2.blackcoin.nl:20002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrum3.blackcoin.nl:30002", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/blk/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "BNT-BEP20": { - "coin": "BNT-BEP20", - "name": "Bancor", - "coinpaprika_id": "bnt-bancor", - "coingecko_id": "bancor", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "BNT-ERC20": { - "coin": "BNT-ERC20", - "name": "Bancor", - "coinpaprika_id": "bnt-bancor", - "coingecko_id": "bancor", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "BSTY": { - "coin": "BSTY", - "name": "GlobalBoost-Y", - "coinpaprika_id": "bsty-globalboost-y", - "coingecko_id": "globalboost", - "electrum": [ - { - "url": "66.172.33.175:50001", - "protocol": "TCP" - }, - { - "url": "bsty-main.coinmunity.gold:50012", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "bsty-bkp.coinmunity.gold:50012", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://insight.globalboost.info/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "BTC": { - "coin": "BTC", - "name": "Bitcoin", - "type": "UTXO", - "coingecko_id": "bitcoin", - "coinpaprika_id": "btc-bitcoin", - "electrum": [ - { - "url": "electrum3.cipig.net:10000", - "ws_url": "electrum3.cipig.net:30000" - }, - { - "url": "electrum2.cipig.net:10000", - "ws_url": "electrum2.cipig.net:30000" - }, - { - "url": "electrum1.cipig.net:10000", - "ws_url": "electrum3.cipig.net:30000" - } - ], - "explorer_url": [ - "https://blockstream.info/" - ], - "active": true, - "currently_enabled": false - }, - "BTC-BEP20": { - "coin": "BTC-BEP20", - "name": "Bitcoin", - "coinpaprika_id": "btc-bitcoin", - "coingecko_id": "bitcoin", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "BTCH": { - "coin": "BTCH", - "name": "Bitcoin Hush", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10020", - "ws_url": "electrum1.cipig.net:30020" - }, - { - "url": "electrum2.cipig.net:10020", - "ws_url": "electrum2.cipig.net:30020" - }, - { - "url": "electrum3.cipig.net:10020", - "ws_url": "electrum3.cipig.net:30020" - } - ], - "explorer_url": [ - "https://btch.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "BTCZ": { - "coin": "BTCZ", - "name": "BitcoinZ", - "coinpaprika_id": "btcz-bitcoinz", - "coingecko_id": "bitcoinz", - "electrum": [ - { - "url": "electrum1.btcz.rocks:50001" - }, - { - "url": "electrum2.btcz.rocks:50001" - } - ], - "explorer_url": [ - "https://btczexplorer.blockhub.info/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "BCH": { - "active": false, - "coin": "BCH", - "coingecko_id": "bitcoin-cash", - "coinpaprika_id": "bch-bitcoin-cash", - "currently_enabled": false, - "electrum": [ - { - "url": "electrum1.cipig.net:10055", - "ws_url": "electrum1.cipig.net:30055" - }, - { - "url": "electrum2.cipig.net:10055", - "ws_url": "electrum2.cipig.net:30055" - }, - { - "url": "electrum3.cipig.net:10055", - "ws_url": "electrum3.cipig.net:30055" - } - ], - "explorer_url": [ - "https://explorer.bitcoin.com/bch/" - ], - "type": "UTXO", - "name": "Bitcoin Cash" - }, - "BET": { - "coin": "BET", - "name": "BET", - "type": "Smart Chain", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10012", - "ws_url": "electrum1.cipig.net:30012" - }, - { - "url": "electrum2.cipig.net:10012", - "ws_url": "electrum2.cipig.net:30012" - }, - { - "url": "electrum3.cipig.net:10012", - "ws_url": "electrum3.cipig.net:30012" - } - ], - "explorer_url": [ - "https://bet.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "BOTS": { - "coin": "BOTS", - "name": "BOTS", - "type": "Smart Chain", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10007", - "ws_url": "electrum1.cipig.net:30007" - }, - { - "url": "electrum2.cipig.net:10007", - "ws_url": "electrum2.cipig.net:30007" - }, - { - "url": "electrum3.cipig.net:10007", - "ws_url": "electrum3.cipig.net:30007" - } - ], - "explorer_url": [ - "https://bots.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "BTT-BEP20": { - "coin": "BTT-BEP20", - "name": "BitTorrent", - "coinpaprika_id": "btt-bittorrent", - "coingecko_id": "bittorrent-2", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "BUSD-ERC20": { - "coin": "BUSD-ERC20", - "name": "Binance USD", - "coinpaprika_id": "busd-binance-usd", - "coingecko_id": "binance-usd", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "BUSD-BEP20": { - "coin": "BUSD-BEP20", - "name": "Binance USD", - "coinpaprika_id": "busd-binance-usd", - "coingecko_id": "binance-usd", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "BTE": { - "coin": "BTE", - "name": "Bitweb", - "type": "UTXO", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrumx.bitwebcore.org:20001" - }, - { - "url": "electrumx6.scalaris.info:20001" - }, - { - "url": "electrumx7.scalaris.info:20001" - } - ], - "explorer_url": [ - "https://explorer.bitwebcore.org/" - ], - "active": false, - "currently_enabled": false - }, - "CAKE": { - "coin": "CAKE", - "name": "PancakeSwap", - "coinpaprika_id": "cake-pancakeswap", - "coingecko_id": "pancakeswap-token", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "CCL": { - "coin": "CCL", - "name": "CoinCollect", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10029", - "ws_url": "electrum1.cipig.net:30029" - }, - { - "url": "electrum2.cipig.net:10029", - "ws_url": "electrum2.cipig.net:30029" - }, - { - "url": "electrum3.cipig.net:10029", - "ws_url": "electrum3.cipig.net:30029" - } - ], - "explorer_url": [ - "https://ccl.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "CDN": { - "coin": "CDN", - "name": "Canada eCoin", - "coinpaprika_id": "cdn-canada-ecoin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "mumbai.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "holland.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "oakland.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "miami.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "seattle.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "woolloomooloo.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": false - }, - { - "url": "lenoir.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/cdn/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "CLC": { - "coin": "CLC", - "name": "Collider Coin", - "coinpaprika_id": "clc-collider-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrumx.cryptocollider.com:10001" - }, - { - "url": "electrumx2.cryptocollider.com:10001" - } - ], - "explorer_url": [ - "https://clc.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "COMP-BEP20": { - "coin": "COMP-BEP20", - "name": "Compound", - "coinpaprika_id": "comp-compoundd", - "coingecko_id": "compound-governance-token", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "COMP-ERC20": { - "coin": "COMP-ERC20", - "name": "Compound", - "coinpaprika_id": "comp-compoundd", - "coingecko_id": "compound-governance-token", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "COQUI": { - "coin": "COQUI", - "name": "Coqui Cash", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10011", - "ws_url": "electrum1.cipig.net:30011" - }, - { - "url": "electrum2.cipig.net:10011", - "ws_url": "electrum2.cipig.net:30011" - }, - { - "url": "electrum3.cipig.net:10011", - "ws_url": "electrum3.cipig.net:30011" - } - ], - "explorer_url": [ - "https://coquicash.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "CRYPTO": { - "coin": "CRYPTO", - "name": "CRYPTO", - "type": "Smart Chain", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10008", - "ws_url": "electrum1.cipig.net:30008" - }, - { - "url": "electrum2.cipig.net:10008", - "ws_url": "electrum2.cipig.net:30008" - }, - { - "url": "electrum3.cipig.net:10008", - "ws_url": "electrum3.cipig.net:30008" - } - ], - "explorer_url": [ - "https://crypto.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "DAI-BEP20": { - "coin": "DAI-BEP20", - "name": "Dai", - "coinpaprika_id": "dai-dai", - "coingecko_id": "dai", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "DAI-ERC20": { - "coin": "DAI-ERC20", - "name": "Dai", - "coinpaprika_id": "dai-dai", - "coingecko_id": "dai", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "DASH": { - "active": false, - "coin": "DASH", - "name": "Dash", - "coingecko_id": "dash", - "coinpaprika_id": "dash-dash", - "currently_enabled": false, - "electrum": [ - { - "url": "electrum1.cipig.net:10061", - "ws_url": "electrum1.cipig.net:30061" - }, - { - "url": "electrum2.cipig.net:10061", - "ws_url": "electrum2.cipig.net:30061" - }, - { - "url": "electrum3.cipig.net:10061", - "ws_url": "electrum3.cipig.net:30061" - } - ], - "explorer_url": [ - "https://blockchair.com/dash/" - ], - "explorer_tx_url": "transaction/", - "type": "UTXO" - }, - "DGB": { - "active": false, - "coin": "DGB", - "name": "DigiByte", - "coinpaprika_id": "dgb-digibyte", - "coingecko_id": "digibyte", - "currently_enabled": false, - "electrum": [ - { - "url": "electrum1.cipig.net:10059", - "ws_url": "electrum1.cipig.net:30059" - }, - { - "url": "electrum2.cipig.net:10059", - "ws_url": "electrum2.cipig.net:30059" - }, - { - "url": "electrum3.cipig.net:10059", - "ws_url": "electrum3.cipig.net:30059" - } - ], - "explorer_url": [ - "https://digiexplorer.info/" - ], - "type": "UTXO" - }, - "DGC": { - "coin": "DGC", - "name": "Digitalcoin", - "coinpaprika_id": "dgc-digitalcoin", - "coingecko_id": "digitalcoin", - "electrum": [ - { - "url": "electrumx.dgc.ewmcx.org:50001", - "protocol": "TCP" - }, - { - "url": "failover.dgc.ewmcx.biz:50002", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/dgc/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "DIMI": { - "coin": "DIMI", - "name": "Diminutive Coin", - "coinpaprika_id": "dimi-diminutive-coin", - "coingecko_id": "diminutive-coin", - "electrum": [ - { - "url": "electrumx1.diminutivecoin.com:50012", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrumx2.diminutivecoin.com:50012", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://explorer.diminutivecoin.com/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "DODO-BEP20": { - "coin": "DODO-BEP20", - "name": "DODO", - "coinpaprika_id": "dodo-dodo", - "coingecko_id": "dodo", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "DODO-ERC20": { - "coin": "DODO-ERC20", - "name": "DODO", - "coinpaprika_id": "dodo-dodo", - "coingecko_id": "dodo", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "DOGE": { - "coin": "DOGE", - "name": "Dogecoin", - "coinpaprika_id": "doge-dogecoin", - "coingecko_id": "dogecoin", - "electrum": [ - { - "url": "electrum1.cipig.net:10060", - "ws_url": "electrum1.cipig.net:30060" - }, - { - "url": "electrum2.cipig.net:10060", - "ws_url": "electrum2.cipig.net:30060" - }, - { - "url": "electrum3.cipig.net:10060", - "ws_url": "electrum3.cipig.net:30060" - } - ], - "explorer_url": [ - "https://dogechain.info/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "DOGE-BEP20": { - "coin": "DOGE-BEP20", - "name": "Dogecoin", - "coinpaprika_id": "doge-dogecoin", - "coingecko_id": "dogecoin", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "DOT-BEP20": { - "coin": "DOT-BEP20", - "name": "Polkadot", - "coinpaprika_id": "dot-polkadot", - "coingecko_id": "polkadot", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "DP": { - "coin": "DP", - "name": "DigitalPrice", - "coinpaprika_id": "dp-digitalprice", - "coingecko_id": "digitalprice", - "electrum": [ - { - "url": "1.eu.dp.electrum.dexstats.info:10021" - } - ], - "explorer_url": [ - "https://dp.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "ECA": { - "coin": "ECA", - "name": "Electra", - "coinpaprika_id": "eca-electra", - "coingecko_id": "electra", - "electrum": [ - { - "url": "electrum1.cipig.net:10052", - "ws_url": "electrum1.cipig.net:30052" - }, - { - "url": "electrum2.cipig.net:10052", - "ws_url": "electrum2.cipig.net:30052" - }, - { - "url": "electrum3.cipig.net:10052", - "ws_url": "electrum3.cipig.net:30052" - } - ], - "explorer_url": [ - "https://eca.ccore.online/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "EFL": { - "coin": "EFL", - "name": "e-Gulden", - "coinpaprika_id": "efl-e-gulden", - "coingecko_id": "electronicgulden", - "electrum": [ - { - "url": "holland.ecoincore.com:11017", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "lenoir.ecoincore.com:11017", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrum1.egulden.org:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrum2.egulden.org:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrum3.egulden.org:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrum4.egulden.org:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrum5.egulden.org:11017", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/efl/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "EGLD-BEP20": { - "coin": "EGLD-BEP20", - "name": "Elrond", - "coinpaprika_id": "egld-elrond", - "coingecko_id": "elrond-erd-2", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "ELF-BEP20": { - "coin": "ELF-BEP20", - "name": "aelf", - "coinpaprika_id": "elf-aelf", - "coingecko_id": "aelf", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "ELF-ERC20": { - "coin": "ELF-ERC20", - "name": "aelf", - "coinpaprika_id": "elf-aelf", - "coingecko_id": "aelf", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "EMC2": { - "coin": "EMC2", - "name": "Einsteinium", - "coinpaprika_id": "emc2-einsteinium", - "coingecko_id": "einsteinium", - "electrum": [ - { - "url": "electrum1.cipig.net:10062", - "ws_url": "electrum1.cipig.net:30062" - }, - { - "url": "electrum2.cipig.net:10062", - "ws_url": "electrum2.cipig.net:30062" - }, - { - "url": "electrum3.cipig.net:10062", - "ws_url": "electrum3.cipig.net:30062" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/emc2/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "EOS-BEP20": { - "coin": "EOS-BEP20", - "name": "EOS", - "coinpaprika_id": "eos-eos", - "coingecko_id": "eos", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "ETC-BEP20": { - "coin": "ETC-BEP20", - "name": "Ethereum Classic", - "coinpaprika_id": "etc-ethereum-classic", - "coingecko_id": "ethereum-classic", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "FIL-BEP20": { - "coin": "FIL-BEP20", - "name": "Filecoin", - "coinpaprika_id": "fil-filecoin", - "coingecko_id": "filecoin", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "FIRO": { - "coin": "FIRO", - "name": "Firo", - "coinpaprika_id": "firo-firo", - "coingecko_id": "zcoin", - "electrum": [ - { - "url": "electrumx01.firo.org:50001" - }, - { - "url": "electrumx02.firo.org:50001" - }, - { - "url": "electrumx03.firo.org:50001" - } - ], - "explorer_url": [ - "https://explorer.firo.org/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "FIRO-BEP20": { - "coin": "FIRO-BEP20", - "name": "Firo", - "coinpaprika_id": "firo-firo", - "coingecko_id": "zcoin", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "FJC": { - "coin": "FJC", - "name": "Fujicoin", - "coinpaprika_id": "fjc-fujicoin", - "coingecko_id": "fujicoin", - "electrum": [ - { - "url": "electrumx1.fujicoin.org:50003", - "protocol": "SSL" - }, - { - "url": "electrumx2.fujicoin.org:50003", - "protocol": "SSL" - } - ], - "explorer_url": [ - "https://explorer.fujicoin.org/" - ], - "explorer_tx_url": "tx/", - "explorer_address_url": "address/", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "STFIRO": { - "coin": "STFIRO", - "name": "StakedFIRO", - "coinpaprika_id": "test-coin", - "coingecko_id": "stakehound", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "FTC": { - "coin": "FTC", - "name": "Feathercoin", - "coinpaprika_id": "ftc-feathercoin", - "coingecko_id": "feathercoin", - "electrum": [ - { - "url": "electrum1.cipig.net:10054", - "ws_url": "electrum1.cipig.net:30054" - }, - { - "url": "electrum2.cipig.net:10054", - "ws_url": "electrum2.cipig.net:30054" - }, - { - "url": "electrum3.cipig.net:10054", - "ws_url": "electrum3.cipig.net:30054" - } - ], - "explorer_url": [ - "http://explorer.feathercoin.com/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "FTM-BEP20": { - "coin": "FTM-BEP20", - "name": "Fantom", - "coinpaprika_id": "ftm-fantom", - "coingecko_id": "fantom", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "FTM-ERC20": { - "coin": "FTM-ERC20", - "name": "Fantom", - "coinpaprika_id": "ftm-fantom", - "coingecko_id": "fantom", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "GLEEC": { - "coin": "GLEEC", - "name": "Gleec", - "coinpaprika_id": "gleec-gleec-coin", - "coingecko_id": "gleec-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10022", - "ws_url": "electrum1.cipig.net:30022" - }, - { - "url": "electrum2.cipig.net:10022", - "ws_url": "electrum2.cipig.net:30022" - }, - { - "url": "electrum3.cipig.net:10022", - "ws_url": "electrum3.cipig.net:30022" - } - ], - "explorer_url": [ - "https://gleec.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "GLEEC-OLD": { - "coin": "GLEEC-OLD", - "name": "Gleec", - "coinpaprika_id": "gleec-gleec-coin", - "coingecko_id": "gleec-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10069", - "ws_url": "electrum1.cipig.net:30069" - }, - { - "url": "electrum2.cipig.net:10069", - "ws_url": "electrum2.cipig.net:30069" - }, - { - "url": "electrum3.cipig.net:10069", - "ws_url": "electrum3.cipig.net:30069" - } - ], - "explorer_url": [ - "https://gleechain.com/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "GRS": { - "coin": "GRS", - "name": "Groestlcoin", - "coinpaprika_id": "grs-groestlcoin", - "coingecko_id": "groestlcoin", - "electrum": [ - { - "url": "electrum10.groestlcoin.org:50001" - }, - { - "url": "electrum11.groestlcoin.org:50001" - }, - { - "url": "electrum13.groestlcoin.org:50001" - }, - { - "url": "electrum14.groestlcoin.org:50001" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/grs/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "HODL": { - "coin": "HODL", - "name": "HODL", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10009", - "ws_url": "electrum1.cipig.net:30009" - }, - { - "url": "electrum2.cipig.net:10009", - "ws_url": "electrum2.cipig.net:30009" - }, - { - "url": "electrum3.cipig.net:10009", - "ws_url": "electrum3.cipig.net:30009" - } - ], - "explorer_url": [ - "https://hodl.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "INJ-BEP20": { - "coin": "INJ-BEP20", - "name": "Injective Protocol", - "coinpaprika_id": "inj-injective-protocol", - "coingecko_id": "injective-protocol", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "INJ-ERC20": { - "coin": "INJ-ERC20", - "name": "Injective Protocol", - "coinpaprika_id": "inj-injective-protocol", - "coingecko_id": "injective-protocol", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "IOTA-BEP20": { - "coin": "IOTA-BEP20", - "name": "IOTA", - "coinpaprika_id": "miota-iota", - "coingecko_id": "iota", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "IOTX-BEP20": { - "coin": "IOTX-BEP20", - "name": "IoTeX", - "coinpaprika_id": "iotx-iotex", - "coingecko_id": "iotex", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "JSTR": { - "coin": "JSTR", - "name": "Ropsten test ERC20", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "is_testnet": true, - "nodes": [ - "https://ropsten.infura.io/v3/1d059a9aca7d49a3a380c71068bffb1c" - ], - "explorer_url": [ - "https://ropsten.etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "JUMBLR": { - "coin": "JUMBLR", - "name": "JUMBLR", - "type": "Smart Chain", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10004", - "ws_url": "electrum1.cipig.net:30004" - }, - { - "url": "electrum2.cipig.net:10004", - "ws_url": "electrum2.cipig.net:30004" - }, - { - "url": "electrum3.cipig.net:10004", - "ws_url": "electrum3.cipig.net:30004" - } - ], - "explorer_url": [ - "https://jumblr.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "KOIN": { - "coin": "KOIN", - "name": "Koinon", - "coinpaprika_id": "koin-koinon", - "coingecko_id": "koinon", - "electrum": [ - { - "url": "electrum1.cipig.net:10024", - "ws_url": "electrum1.cipig.net:30024" - }, - { - "url": "electrum2.cipig.net:10024", - "ws_url": "electrum2.cipig.net:30024" - }, - { - "url": "electrum3.cipig.net:10024", - "ws_url": "electrum3.cipig.net:30024" - } - ], - "explorer_url": [ - "https://koin.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "LBC": { - "coin": "LBC", - "name": "LBRY Credits", - "coinpaprika_id": "lbc-lbry-credits", - "coingecko_id": "lbry-credits", - "electrum": [ - { - "url": "spv1.lbry.com:50001" - }, - { - "url": "spv13.lbry.com:50001" - }, - { - "url": "spv15.lbry.com:50001" - }, - { - "url": "spv17.lbry.com:50001" - }, - { - "url": "spv19.lbry.com:50001" - } - ], - "explorer_url": [ - "https://explorer.lbry.com/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "LCC": { - "coin": "LCC", - "name": "Litecoin Cash", - "coinpaprika_id": "lcc-litecoin-cash", - "coingecko_id": "litecoin-cash", - "electrum": [ - { - "url": "188.166.117.139:50001" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/lcc/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "LTC": { - "active": true, - "coin": "LTC", - "coingecko_id": "litecoin", - "coinpaprika_id": "ltc-litecoin", - "currently_enabled": false, - "electrum": [ - { - "url": "electrum1.cipig.net:10063", - "ws_url": "electrum1.cipig.net:30063" - }, - { - "url": "electrum2.cipig.net:10063", - "ws_url": "electrum2.cipig.net:30063" - }, - { - "url": "electrum3.cipig.net:10063", - "ws_url": "electrum3.cipig.net:30063" - } - ], - "explorer_url": [ - "https://blockexplorer.one/litecoin/mainnet/" - ], - "type": "UTXO", - "name": "Litecoin" - }, - "LYNX": { - "coin": "LYNX", - "name": "Lynx", - "coinpaprika_id": "lynx-lynx", - "coingecko_id": "lynx", - "electrum": [ - { - "url": "electrum.deliverypath.com:50002", - "protocol": "SSL", - "disable_cert_verification": false - }, - { - "url": "electrum.dirtdivas.net:50002", - "protocol": "SSL", - "disable_cert_verification": false - }, - { - "url": "electrum.getlynx.club:50002", - "protocol": "SSL", - "disable_cert_verification": false - }, - { - "url": "electrum.atechhelp.com:50002", - "protocol": "SSL", - "disable_cert_verification": false - }, - { - "url": "electrum.getlynx.io:50001", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/lynx/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "MATIC-BEP20": { - "coin": "MATIC-BEP20", - "name": "Polygon", - "coinpaprika_id": "matic-matic-network", - "coingecko_id": "matic-network", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "MATIC-ERC20": { - "coin": "MATIC-ERC20", - "name": "Polygon", - "coinpaprika_id": "matic-matic-network", - "coingecko_id": "matic-network", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "MCL": { - "active": false, - "coin": "MCL", - "coingecko_id": "test-coin", - "coinpaprika_id": "mcl-marmara-credit-loops", - "currently_enabled": false, - "electrum": [ - { - "url": "electrum1.cipig.net:10023", - "ws_url": "electrum1.cipig.net:30023" - }, - { - "url": "electrum2.cipig.net:10023", - "ws_url": "electrum2.cipig.net:30023" - }, - { - "url": "electrum3.cipig.net:10023", - "ws_url": "electrum3.cipig.net:30023" - } - ], - "explorer_url": [ - "http://explorer.marmara.io/" - ], - "type": "Smart Chain", - "name": "MCL" - }, - "MM-ERC20": { - "coin": "MM-ERC20", - "name": "Million", - "coinpaprika_id": "test-coin", - "coingecko_id": "million", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "MSHARK": { - "coin": "MSHARK", - "name": "MiliShark", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10013", - "ws_url": "electrum1.cipig.net:30013" - }, - { - "url": "electrum2.cipig.net:10013", - "ws_url": "electrum2.cipig.net:30013" - }, - { - "url": "electrum3.cipig.net:10013", - "ws_url": "electrum3.cipig.net:30013" - } - ], - "explorer_url": [ - "https://mshark.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "NEAR-BEP20": { - "coin": "NEAR-BEP20", - "name": "NEAR Protocol", - "coinpaprika_id": "near-near-protocol", - "coingecko_id": "near", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "OCEAN-BEP20": { - "coin": "OCEAN-BEP20", - "name": "Ocean Protocol", - "coinpaprika_id": "ocean-ocean-protocol", - "coingecko_id": "ocean-protocol", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "OCEAN-ERC20": { - "coin": "OCEAN-ERC20", - "name": "Ocean Protocol", - "coinpaprika_id": "ocean-ocean-protocol", - "coingecko_id": "ocean-protocol", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "ONT-BEP20": { - "coin": "ONT-BEP20", - "name": "Ontology", - "coinpaprika_id": "ont-ontology", - "coingecko_id": "ontology", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "PAX-BEP20": { - "coin": "PAX-BEP20", - "name": "Paxos Standard", - "coinpaprika_id": "pax-paxos-standard-token", - "coingecko_id": "paxos-standard", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "PAX-ERC20": { - "coin": "PAX-ERC20", - "name": "Paxos Standard", - "coinpaprika_id": "pax-paxos-standard-token", - "coingecko_id": "paxos-standard", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "PAXG-BEP20": { - "coin": "PAXG-BEP20", - "name": "PAX Gold", - "coinpaprika_id": "paxg-pax-gold", - "coingecko_id": "pax-gold", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "PAXG-ERC20": { - "coin": "PAXG-ERC20", - "name": "PAX Gold", - "coinpaprika_id": "paxg-pax-gold", - "coingecko_id": "pax-gold", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "ETH": { - "active": false, - "coin": "ETH", - "coingecko_id": "ethereum", - "coinpaprika_id": "eth-ethereum", - "currently_enabled": false, - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "name": "Ethereum" - }, - "ETHR": { - "active": false, - "coin": "ETHR", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "currently_enabled": false, - "is_testnet": true, - "nodes": [ - "https://ropsten.infura.io/v3/1d059a9aca7d49a3a380c71068bffb1c" - ], - "explorer_url": [ - "https://ropsten.etherscan.io/" - ], - "type": "ERC-20", - "name": "Ethereum Ropsten (Testnet)" - }, - "ETH-BEP20": { - "coin": "ETH-BEP20", - "name": "Ethereum", - "coinpaprika_id": "eth-ethereum", - "coingecko_id": "ethereum", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "UIS": { - "coin": "UIS", - "name": "Unitus", - "coinpaprika_id": "uis-unitus", - "coingecko_id": "unitus", - "electrum": [ - { - "url": "failover.trc-uis.ewmcx.biz:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrumx.uis.ewmcx.info:50001" - } - ], - "explorer_url": [ - "https://explorer.unitus.network/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "UNO": { - "coin": "UNO", - "name": "Unobtanium", - "coinpaprika_id": "uno-unobtanium", - "coingecko_id": "unobtanium", - "electrum": [ - { - "url": "uno-main.coinmunity.gold:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "uno-bkp.coinmunity.gold:50002", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/uno/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "USDC-BEP20": { - "coin": "USDC-BEP20", - "name": "USD Coin", - "coinpaprika_id": "usdc-usd-coin", - "coingecko_id": "usd-coin", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "USDC-ERC20": { - "coin": "USDC-ERC20", - "name": "USD Coin", - "coinpaprika_id": "usdc-usd-coin", - "coingecko_id": "usd-coin", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "USDT-BEP20": { - "coin": "USDT-BEP20", - "name": "Tether", - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "USDT-ERC20": { - "coin": "USDT-ERC20", - "name": "Tether", - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "AWC": { - "active": false, - "coin": "AWC", - "coingecko_id": "atomic-wallet-coin", - "coinpaprika_id": "awc-atomic-wallet-coin", - "currently_enabled": false, - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "name": "Atomic Wallet Coin" - }, - "JRT-ERC20": { - "coin": "JRT-ERC20", - "name": "Jarvis Reward Token", - "coinpaprika_id": "jrt-jarvis-reward-token", - "coingecko_id": "jarvis-reward-token", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "BAT-ERC20": { - "coin": "BAT-ERC20", - "name": "Basic Attention Token", - "coinpaprika_id": "bat-basic-attention-token", - "coingecko_id": "basic-attention-token", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "BAT-BEP20": { - "coin": "BAT-BEP20", - "name": "Basic Attention Token", - "coinpaprika_id": "bat-basic-attention-token", - "coingecko_id": "basic-attention-token", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "KMD": { - "coin": "KMD", - "name": "Komodo", - "type": "Smart Chain", - "is_claimable": true, - "minimal_claim_amount": "10", - "coingecko_id": "komodo", - "coinpaprika_id": "kmd-komodo", - "electrum": [ - { - "url": "electrum3.cipig.net:10001", - "ws_url": "electrum3.cipig.net:30001" - }, - { - "url": "electrum2.cipig.net:10001", - "ws_url": "electrum3.cipig.net:30001" - }, - { - "url": "electrum1.cipig.net:10001", - "ws_url": "electrum3.cipig.net:30001" - } - ], - "explorer_url": [ - "https://kmdexplorer.io/" - ], - "active": true, - "currently_enabled": false - }, - "KMD-BEP20": { - "coin": "KMD-BEP20", - "name": "Komodo", - "coinpaprika_id": "kmd-komodo", - "coingecko_id": "komodo", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "LABS": { - "coin": "LABS", - "name": "Labs", - "type": "Smart Chain", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10019", - "ws_url": "electrum1.cipig.net:30019" - }, - { - "url": "electrum2.cipig.net:10019", - "ws_url": "electrum2.cipig.net:30019" - }, - { - "url": "electrum3.cipig.net:10019", - "ws_url": "electrum3.cipig.net:30019" - } - ], - "explorer_url": [ - "https://labs.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false - }, - "LINK-BEP20": { - "coin": "LINK-BEP20", - "name": "Chainlink", - "coinpaprika_id": "link-chainlink", - "coingecko_id": "chainlink", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "LINK-ERC20": { - "coin": "LINK-ERC20", - "name": "Chainlink", - "coinpaprika_id": "link-chainlink", - "coingecko_id": "chainlink", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "MESH": { - "coin": "MESH", - "name": "SuperMESH", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10016" - }, - { - "url": "electrum2.cipig.net:10016" - }, - { - "url": "electrum3.cipig.net:10016" - } - ], - "explorer_url": [ - "https://mesh.kmdexplorer.io/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "MGW": { - "coin": "MGW", - "name": "MGW", - "type": "Smart Chain", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10015", - "ws_url": "electrum1.cipig.net:30015" - }, - { - "url": "electrum2.cipig.net:10015", - "ws_url": "electrum2.cipig.net:30015" - }, - { - "url": "electrum3.cipig.net:10015", - "ws_url": "electrum3.cipig.net:30015" - } - ], - "explorer_url": [ - "https://mgw.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "DEX": { - "coin": "DEX", - "name": "Dex", - "type": "Smart Chain", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10006", - "ws_url": "electrum1.cipig.net:30006" - }, - { - "url": "electrum2.cipig.net:10006", - "ws_url": "electrum2.cipig.net:30006" - }, - { - "url": "electrum3.cipig.net:10006", - "ws_url": "electrum3.cipig.net:30006" - } - ], - "explorer_url": [ - "https://dex.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "RICK": { - "coin": "RICK", - "asset": "RICK", - "type": "Smart Chain", - "name": "Rick (TESTCOIN)", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum3.cipig.net:10017", - "ws_url": "electrum3.cipig.net:30017" - }, - { - "url": "electrum2.cipig.net:10017", - "ws_url": "electrum2.cipig.net:30017" - }, - { - "url": "electrum1.cipig.net:10017", - "ws_url": "electrum1.cipig.net:30017" - } - ], - "explorer_url": [ - "https://rick.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false - }, - "MORTY": { - "coin": "MORTY", - "asset": "MORTY", - "type": "Smart Chain", - "name": "Morty (TESTCOIN)", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum3.cipig.net:10018", - "ws_url": "electrum3.cipig.net:30018" - }, - { - "url": "electrum2.cipig.net:10018", - "ws_url": "electrum2.cipig.net:30018" - }, - { - "url": "electrum1.cipig.net:10018", - "ws_url": "electrum1.cipig.net:30018" - } - ], - "explorer_url": [ - "https://morty.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false - }, - "PANGEA": { - "coin": "PANGEA", - "name": "Pangea", - "type": "Smart Chain", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10010", - "ws_url": "electrum1.cipig.net:30010" - }, - { - "url": "electrum2.cipig.net:10010", - "ws_url": "electrum2.cipig.net:30010" - }, - { - "url": "electrum3.cipig.net:10010", - "ws_url": "electrum3.cipig.net:30010" - } - ], - "explorer_url": [ - "https://pangea.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "QIAIR": { - "coin": "QIAIR", - "name": "Qi Airdrop Token", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "QI": { - "coin": "QI", - "name": "QiSwap", - "coingecko_id": "qiswap", - "coinpaprika_id": "test-coin", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "REVS": { - "coin": "REVS", - "name": "REVS", - "type": "Smart Chain", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10003", - "ws_url": "electrum1.cipig.net:30003" - }, - { - "url": "electrum2.cipig.net:10003", - "ws_url": "electrum2.cipig.net:30003" - }, - { - "url": "electrum3.cipig.net:10003", - "ws_url": "electrum3.cipig.net:30003" - } - ], - "explorer_url": [ - "https://revs.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "SMTF": { - "coin": "SMTF", - "name": "SmartFi", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "SOULJA": { - "coin": "SOULJA", - "name": "SouljaCoin", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10035", - "ws_url": "electrum1.cipig.net:30035" - }, - { - "url": "electrum2.cipig.net:10035", - "ws_url": "electrum2.cipig.net:30035" - }, - { - "url": "electrum3.cipig.net:10035", - "ws_url": "electrum3.cipig.net:30035" - } - ], - "explorer_url": [ - "https://explorer.souljacoin.cash/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "SXP-BEP20": { - "coin": "SXP-BEP20", - "name": "Swipe", - "coinpaprika_id": "sxp-swipe", - "coingecko_id": "swipe", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "SXP-ERC20": { - "coin": "SXP-ERC20", - "name": "Swipe", - "coinpaprika_id": "sxp-swipe", - "coingecko_id": "swipe", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "SYS": { - "coin": "SYS", - "name": "Syscoin", - "coinpaprika_id": "sys-syscoin", - "coingecko_id": "syscoin", - "electrum": [ - { - "url": "electrum1.cipig.net:10064", - "ws_url": "electrum1.cipig.net:30064" - }, - { - "url": "electrum2.cipig.net:10064", - "ws_url": "electrum2.cipig.net:30064" - }, - { - "url": "electrum3.cipig.net:10064", - "ws_url": "electrum3.cipig.net:30064" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/sys/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "WSB": { - "coin": "WSB", - "name": "WallStreetBets", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10033", - "ws_url": "electrum1.cipig.net:30033" - }, - { - "url": "electrum2.cipig.net:10033", - "ws_url": "electrum2.cipig.net:30033" - }, - { - "url": "electrum3.cipig.net:10033", - "ws_url": "electrum3.cipig.net:30033" - } - ], - "explorer_url": [ - "https://wsb.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "CHIPS": { - "coin": "CHIPS", - "type": "UTXO", - "name": "Chips", - "coingecko_id": "test-coin", - "coinpaprika_id": "chips-chips", - "electrum": [ - { - "url": "electrum3.cipig.net:10053", - "ws_url": "electrum3.cipig.net:30053" - }, - { - "url": "electrum2.cipig.net:10053", - "ws_url": "electrum2.cipig.net:30053" - }, - { - "url": "electrum1.cipig.net:10053", - "ws_url": "electrum1.cipig.net:30053" - } - ], - "explorer_url": [ - "https://explorer.chips.cash/" - ], - "active": false, - "currently_enabled": false - }, - "SCA": { - "coin": "SCA", - "name": "Scalaris", - "type": "UTXO", - "coingecko_id": "test-coin", - "coinpaprika_id": "sca-scalaris", - "electrum": [ - { - "url": "electrum1.scalaris.info:10001" - }, - { - "url": "electrum2.scalaris.info:10001" - }, - { - "url": "electrum3.scalaris.info:10001" - } - ], - "explorer_url": [ - "https://explorer.scalaris.info/" - ], - "active": false, - "currently_enabled": false - }, - "SUPERNET": { - "coin": "SUPERNET", - "name": "Supernet", - "type": "Smart Chain", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10005", - "ws_url": "electrum1.cipig.net:30005" - }, - { - "url": "electrum2.cipig.net:10005", - "ws_url": "electrum2.cipig.net:30005" - }, - { - "url": "electrum3.cipig.net:10005", - "ws_url": "electrum3.cipig.net:30005" - } - ], - "explorer_url": [ - "https://supernet.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "SUSHI-BEP20": { - "coin": "SUSHI-BEP20", - "name": "Sushi", - "coinpaprika_id": "sushi-sushi", - "coingecko_id": "sushi", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "SUSHI-ERC20": { - "coin": "SUSHI-ERC20", - "name": "Sushi", - "coinpaprika_id": "sushi-sushi", - "coingecko_id": "sushi", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "VITE-BEP20": { - "coin": "VITE-BEP20", - "name": "Vite", - "coinpaprika_id": "vite-vite", - "coingecko_id": "vite", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "VRSC": { - "coin": "VRSC", - "type": "Smart Chain", - "name": "Verus Coin", - "coingecko_id": "verus-coin", - "coinpaprika_id": "vrsc-verus-coin", - "electrum": [ - { - "url": "el0.verus.io:17486", - "protocol": "SSL", - "disable_cert_verification": false - }, - { - "url": "el1.verus.io:17486", - "protocol": "SSL", - "disable_cert_verification": false - }, - { - "url": "el2.verus.io:17486", - "protocol": "SSL", - "disable_cert_verification": false - } - ], - "explorer_url": [ - "https://explorer.verus.io/" - ], - "active": false, - "currently_enabled": false - }, - "IL8P": { - "coin": "IL8P", - "name": "InfiniLooP", - "coinpaprika_id": "il8p-infiniloop", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "il8p.electrumx.transcenders.name:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "il9p.electrumx.transcenders.name:50002", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/il8p/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "ILN": { - "coin": "ILN", - "type": "Smart Chain", - "name": "iLien", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.ilien.io:65011" - }, - { - "url": "electrum2.ilien.io:65011" - } - ], - "explorer_url": [ - "https://iln.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false - }, - "MKR-BEP20": { - "coin": "MKR-BEP20", - "name": "Maker", - "coinpaprika_id": "mkr-maker", - "coingecko_id": "maker", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "MKR-ERC20": { - "coin": "MKR-ERC20", - "name": "Maker", - "coinpaprika_id": "mkr-maker", - "coingecko_id": "maker", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "MONA": { - "coin": "MONA", - "name": "MonaCoin", - "coinpaprika_id": "mona-monacoin", - "coingecko_id": "monacoin", - "electrum": [ - { - "url": "electrumx3.monacoin.nl:50001" - }, - { - "url": "electrumx1.monacoin.ninja:50001" - }, - { - "url": "electrumx.tamami-foundation.org:50001" - } - ], - "explorer_url": [ - "https://mona.chainsight.info/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "NAV": { - "coin": "NAV", - "name": "NavCoin", - "coinpaprika_id": "nav-navcoin", - "coingecko_id": "nav-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10056" - }, - { - "url": "electrum2.cipig.net:10056" - }, - { - "url": "electrum3.cipig.net:10056" - } - ], - "explorer_url": [ - "https://www.navexplorer.com/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "NMC": { - "coin": "NMC", - "name": "Namecoin", - "coinpaprika_id": "nmc-namecoin", - "coingecko_id": "namecoin", - "electrum": [ - { - "url": "82.119.233.36:50001" - }, - { - "url": "nmc.bitcoins.sk:50001" - }, - { - "url": "electrumx1.nmc.bitclc.net:50001" - }, - { - "url": "electrumx2.nmc.bitclc.net:50001" - }, - { - "url": "electrumx3.nmc.bitclc.net:50001" - }, - { - "url": "electrumx4.nmc.bitclc.net:50001" - } - ], - "explorer_url": [ - "https://nmc.tokenview.com/en/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "NVC": { - "coin": "NVC", - "name": "Novacoin", - "coinpaprika_id": "nvc-novacoin", - "coingecko_id": "novacoin", - "electrum": [ - { - "url": "electrumx.nvc.ewmcx.org:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "failover.nvc.ewmcx.biz:50002", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://explorer.novaco.in/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "OOT": { - "coin": "OOT", - "name": "Utrum", - "coinpaprika_id": "oot-utrum", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10021" - }, - { - "url": "electrum2.cipig.net:10021" - }, - { - "url": "electrum3.cipig.net:10021" - } - ], - "explorer_url": [ - "https://explorer.utrum.io/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "QKC-BEP20": { - "coin": "QKC-BEP20", - "name": "QuarkChain", - "coinpaprika_id": "qkc-quarkchain", - "coingecko_id": "quark-chain", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "QKC-ERC20": { - "coin": "QKC-ERC20", - "name": "QuarkChain", - "coinpaprika_id": "qkc-quarkchain", - "coingecko_id": "quark-chain", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "QTUM": { - "need_electrum": true, - "coin": "QTUM", - "name": "Qtum", - "coinpaprika_id": "qtum-qtum", - "coingecko_id": "qtum", - "electrum": [ - { - "url": "electrum1.cipig.net:10050" - }, - { - "url": "electrum2.cipig.net:10050" - }, - { - "url": "electrum3.cipig.net:10050" - } - ], - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20", - "active": false, - "currently_enabled": false - }, - "RVN": { - "coin": "RVN", - "name": "Ravencoin", - "coinpaprika_id": "rvn-ravencoin", - "coingecko_id": "ravencoin", - "electrum": [ - { - "url": "electrum1.cipig.net:10051", - "ws_url": "electrum1.cipig.net:30051" - }, - { - "url": "electrum2.cipig.net:10051", - "ws_url": "electrum2.cipig.net:30051" - }, - { - "url": "electrum3.cipig.net:10051", - "ws_url": "electrum3.cipig.net:30051" - } - ], - "explorer_url": [ - "https://ravencoin.network/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "SNX-BEP20": { - "coin": "SNX-BEP20", - "name": "Synthetix", - "coinpaprika_id": "snx-synthetix-network-token", - "coingecko_id": "havven", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "SNX-ERC20": { - "coin": "SNX-ERC20", - "name": "Synthetix", - "coinpaprika_id": "snx-synthetix-network-token", - "coingecko_id": "havven", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "SPACE": { - "coin": "SPACE", - "name": "Spacecoin", - "coingecko_id": "test-coin", - "coinpaprika_id": "space-spacecoin7367", - "electrum": [ - { - "url": "electrum1.spaceworks.co:50001" - }, - { - "url": "electrum2.spaceworks.co:50001" - } - ], - "explorer_url": [ - "https://explorer.spaceworks.co/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "THC": { - "coin": "THC", - "name": "HempCoin", - "coinpaprika_id": "thc-hempcoin", - "coingecko_id": "hempcoin-thc", - "electrum": [ - { - "url": "1.eu.thc.electrum.dexstats.info:10020" - }, - { - "url": "2.eu.thc.electrum.dexstats.info:10020" - } - ], - "explorer_url": [ - "https://thc.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "TRC": { - "coin": "TRC", - "name": "Terracoin", - "coinpaprika_id": "trc-terracoin", - "coingecko_id": "terracoin", - "electrum": [ - { - "url": "failover.trc-uis.ewmcx.biz:50006", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrum.terracoin.io:50001" - }, - { - "url": "electrum.southofheaven.ca:50001" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/trc/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "TRX-BEP20": { - "coin": "TRX-BEP20", - "name": "TRON", - "coinpaprika_id": "trx-tron", - "coingecko_id": "tron", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "TRYB-BEP20": { - "coin": "TRYB-BEP20", - "name": "BiLira", - "coinpaprika_id": "tryb-bilira", - "coingecko_id": "bilira", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "TRYB-ERC20": { - "coin": "TRYB-ERC20", - "name": "BiLira", - "coinpaprika_id": "tryb-bilira", - "coingecko_id": "bilira", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "TUSD-BEP20": { - "coin": "TUSD-BEP20", - "name": "TrueUSD", - "coinpaprika_id": "tusd-trueusd", - "coingecko_id": "true-usd", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "TUSD-ERC20": { - "coin": "TUSD-ERC20", - "name": "TrueUSD", - "coinpaprika_id": "tusd-trueusd", - "coingecko_id": "true-usd", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "VAL": { - "coin": "VAL", - "name": "Validity", - "coinpaprika_id": "val-validity", - "coingecko_id": "radium", - "electrum": [ - { - "url": "e1.validitytech.com:11002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "e2.validitytech.com:11002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "e3.validitytech.com:11002", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/val/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "VRA": { - "coin": "VRA", - "name": "Verasity", - "coingecko_id": "verasity", - "coinpaprika_id": "vra-verasity", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "VRM": { - "coin": "VRM", - "name": "Verium Reserve", - "coingecko_id": "test-coin", - "coinpaprika_id": "vrm-veriumreserve", - "electrum": [ - { - "url": "electrum01-vrm.vericonomy.com:50001" - }, - { - "url": "electrum02-vrm.vericonomy.com:50001" - } - ], - "explorer_url": [ - "https://explorer-vrm.vericonomy.com/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "WCN": { - "coin": "WCN", - "name": "Widecoin", - "coinpaprika_id": "wcn-widecoin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrumx.widecoin.org:50001" - }, - { - "url": "electrumx2.widecoin.org:50001" - }, - { - "url": "electrumx3.widecoin.org:50001" - } - ], - "explorer_url": [ - "https://explorer.widecoin.org/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "WLC": { - "coin": "WLC", - "name": "Wireless Coin", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10014", - "ws_url": "electrum1.cipig.net:30014" - }, - { - "url": "electrum2.cipig.net:10014", - "ws_url": "electrum2.cipig.net:30014" - }, - { - "url": "electrum3.cipig.net:10014", - "ws_url": "electrum3.cipig.net:30014" - } - ], - "explorer_url": [ - "https://wlc21.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "XLM-BEP20": { - "coin": "XLM-BEP20", - "name": "Stellar", - "coinpaprika_id": "xlm-stellar", - "coingecko_id": "stellar", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "XMY": { - "coin": "XMY", - "name": "Myriad", - "coinpaprika_id": "xmy-myriad", - "coingecko_id": "myriadcoin", - "electrum": [ - { - "url": "lenoir.ecoincore.com:10892", - "protocol": "SSL" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/xmy/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "XPM": { - "coin": "XPM", - "name": "Primecoin", - "coinpaprika_id": "xpm-primecoin", - "coingecko_id": "primecoin", - "electrum": [ - { - "url": "electrumx.primecoin.org:50001", - "protocol": "TCP" - }, - { - "url": "electrumx.mainnet.primecoin.org:50011", - "protocol": "TCP" - }, - { - "url": "electrumx.gemmer.primecoin.org:50011", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://www.blockseek.io/xpm/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "XRP-BEP20": { - "coin": "XRP-BEP20", - "name": "XRP", - "coinpaprika_id": "xrp-xrp", - "coingecko_id": "ripple", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "XTZ-BEP20": { - "coin": "XTZ-BEP20", - "name": "Tezos", - "coinpaprika_id": "xtz-tezos", - "coingecko_id": "tezos", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "XVC": { - "coin": "XVC", - "name": "Vanillacash", - "coinpaprika_id": "xvc-vcash", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrumx.xvc.ewmcx.org:50001", - "protocol": "TCP" - }, - { - "url": "failover.xvc.ewmcx.biz:50001", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://xvc.freicoin.info/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "XVC-BEP20": { - "coin": "XVC-BEP20", - "name": "Vanillacash", - "coinpaprika_id": "xvc-vcash", - "coingecko_id": "test-coin", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "XVS": { - "coin": "XVS", - "name": "Venus", - "coinpaprika_id": "xvs-venus", - "coingecko_id": "venus", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "YFI-BEP20": { - "coin": "YFI-BEP20", - "name": "yearn.finance", - "coinpaprika_id": "yfi-yearnfinance", - "coingecko_id": "yearn-finance", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "YFI-ERC20": { - "coin": "YFI-ERC20", - "name": "yearn.finance", - "coinpaprika_id": "yfi-yearnfinance", - "coingecko_id": "yearn-finance", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "YFII-BEP20": { - "coin": "YFII-BEP20", - "name": "DFI.Money", - "coinpaprika_id": "yfii-dfimoney", - "coingecko_id": "yfii-finance", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "YFII-ERC20": { - "coin": "YFII-ERC20", - "name": "DFI.Money", - "coinpaprika_id": "yfii-dfimoney", - "coingecko_id": "yfii-finance", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "ZEC": { - "active": false, - "coin": "ZEC", - "name": "Zcash", - "coinpaprika_id": "zec-zcash", - "coingecko_id": "zcash", - "currently_enabled": false, - "electrum": [ - { - "url": "electrum1.cipig.net:10058", - "ws_url": "electrum1.cipig.net:30058" - }, - { - "url": "electrum2.cipig.net:10058", - "ws_url": "electrum2.cipig.net:30058" - }, - { - "url": "electrum3.cipig.net:10058", - "ws_url": "electrum3.cipig.net:30058" - } - ], - "explorer_tx_url": "transaction/", - "explorer_url": [ - "https://explorer.zcha.in/" - ], - "type": "UTXO" - }, - "ZER": { - "coin": "ZER", - "name": "Zero", - "coinpaprika_id": "zer-zero", - "coingecko_id": "zero", - "electrum": [ - { - "url": "electrum1.cipig.net:10065" - }, - { - "url": "electrum2.cipig.net:10065" - }, - { - "url": "electrum3.cipig.net:10065" - } - ], - "explorer_url": [ - "https://insight.zerocurrency.io/insight/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "ZET": { - "coin": "ZET", - "name": "Zetacoin", - "coinpaprika_id": "zet-zetacoin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "failover.zet.ewmci.xyz:50002", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/zet/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "ZIL-BEP20": { - "coin": "ZIL-BEP20", - "name": "Zilliqa", - "coinpaprika_id": "zil-zilliqa", - "coingecko_id": "zilliqa", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "ZILLA": { - "coin": "ZILLA", - "name": "ChainZilla", - "coinpaprika_id": "zilla-chainzilla", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10028", - "ws_url": "electrum1.cipig.net:30028" - }, - { - "url": "electrum2.cipig.net:10028", - "ws_url": "electrum2.cipig.net:30028" - }, - { - "url": "electrum3.cipig.net:10028", - "ws_url": "electrum3.cipig.net:30028" - } - ], - "explorer_url": [ - "https://zilla.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "tBTC-TEST": { - "coin": "tBTC-TEST", - "name": "tBTC (testnet)", - "is_testnet": true, - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "testnet.aranguren.org:51001", - "protocol": "TCP" - }, - { - "url": "electrum1.cipig.net:10068" - }, - { - "url": "electrum2.cipig.net:10068" - }, - { - "url": "electrum3.cipig.net:10068" - } - ], - "explorer_url": [ - "https://blockstream.info/testnet/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "QRC20": { - "is_testnet": true, - "active": false, - "coin": "QRC20", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "currently_enabled": false, - "explorer_url": [ - "https://testnet.qtum.info/" - ], - "name": "QRC20 (testnet)", - "type": "QRC-20" - }, - "tQTUM": { - "coin": "tQTUM", - "name": "tQTUM (testnet)", - "need_electrum": true, - "is_testnet": true, - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10071" - }, - { - "url": "electrum2.cipig.net:10071" - }, - { - "url": "electrum3.cipig.net:10071" - } - ], - "explorer_url": [ - "https://testnet.qtum.info/" - ], - "type": "QRC-20", - "active": false, - "currently_enabled": false - }, - "INK": { - "coin": "INK", - "name": "Ink", - "coingecko_id": "ink", - "coinpaprika_id": "ink-ink", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "SPC": { - "coin": "SPC", - "name": "SpaceChain", - "coingecko_id": "spacechain", - "coinpaprika_id": "spc-spacechain", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "HPY": { - "coin": "HPY", - "name": "Hyper Pay", - "coingecko_id": "hyper-pay", - "coinpaprika_id": "hpy-hyper-pay", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "HLC": { - "coin": "HLC", - "name": "HalalChain", - "coingecko_id": "halalchain", - "coinpaprika_id": "hlc-halalchain", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "LSTR": { - "coin": "LSTR", - "name": "Luna Stars", - "coingecko_id": "meetluna", - "coinpaprika_id": "lstr-luna-stars", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "QBT": { - "coin": "QBT", - "name": "Qbao", - "coingecko_id": "qbao", - "coinpaprika_id": "qbt-qbao", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "OC": { - "coin": "OC", - "name": "OceanChain", - "coingecko_id": "oceanchain", - "coinpaprika_id": "oc-oceanchain", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "PUT": { - "coin": "PUT", - "name": "Profile Utility Token", - "coingecko_id": "profile-utility-token", - "coinpaprika_id": "put-profile-utility-token", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "TSL": { - "coin": "TSL", - "name": "Energo", - "coingecko_id": "energo", - "coinpaprika_id": "tsl-energo", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "QC": { - "coin": "QC", - "name": "Qcash", - "coingecko_id": "qcash", - "coinpaprika_id": "test-coin", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "SFUSD": { - "coin": "SFUSD", - "name": "SmartUSD", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10070", - "ws_url": "electrum1.cipig.net:30070" - }, - { - "url": "electrum2.cipig.net:10070", - "ws_url": "electrum2.cipig.net:30070" - }, - { - "url": "electrum3.cipig.net:10070", - "ws_url": "electrum3.cipig.net:30070" - } - ], - "explorer_url": [ - "https://explorer.sfusd.kmd.sh/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "AGI": { - "coin": "AGI", - "name": "SingularityNET", - "coinpaprika_id": "agi-singularitynet", - "coingecko_id": "singularitynet", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "ANT": { - "coin": "ANT", - "name": "Aragon", - "coinpaprika_id": "ant-aragon", - "coingecko_id": "aragon", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "BEST": { - "coin": "BEST", - "name": "Bitpanda Ecosystem Token", - "coinpaprika_id": "best-bitpanda-ecosystem-token", - "coingecko_id": "bitpanda-ecosystem-token", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "BTU": { - "coin": "BTU", - "name": "BTU Protocol", - "coinpaprika_id": "btu-btu-protocol", - "coingecko_id": "btu-protocol", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "CEL": { - "coin": "CEL", - "name": "Celsius", - "coinpaprika_id": "cel-celsius", - "coingecko_id": "celsius-degree-token", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "CENNZ": { - "coin": "CENNZ", - "name": "Centrality Token", - "coinpaprika_id": "cennz-centrality", - "coingecko_id": "centrality", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "CHSB": { - "coin": "CHSB", - "name": "SwissBorg", - "coinpaprika_id": "chsb-swissborg", - "coingecko_id": "swissborg", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "CHZ": { - "coin": "CHZ", - "name": "chiliZ", - "coinpaprika_id": "chz-chiliz", - "coingecko_id": "chiliz", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "CRO": { - "coin": "CRO", - "name": "Crypto.com Coin", - "coinpaprika_id": "cro-cryptocom-chain", - "coingecko_id": "crypto-com-chain", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "CRV": { - "coin": "CRV", - "name": "Curve DAO Token", - "coinpaprika_id": "crv-curve-dao-token", - "coingecko_id": "curve-dao-token", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "CVC": { - "coin": "CVC", - "name": "Civic", - "coinpaprika_id": "cvc-civic", - "coingecko_id": "civic", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "CVT": { - "coin": "CVT", - "name": "CyberVeinToken", - "coinpaprika_id": "cvt-cybervein", - "coingecko_id": "cybervein", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "DIA": { - "coin": "DIA", - "name": "DIAToken", - "coinpaprika_id": "dia-dia", - "coingecko_id": "dia-data", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "DX": { - "coin": "DX", - "name": "DxChain Token", - "coinpaprika_id": "dx-dxchain-token", - "coingecko_id": "dxchain", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "ENJ": { - "coin": "ENJ", - "name": "EnjinCoin", - "coinpaprika_id": "enj-enjin-coin", - "coingecko_id": "enjincoin", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "EURS": { - "coin": "EURS", - "name": "STASIS EURS Token", - "coinpaprika_id": "eurs-stasis-eurs", - "coingecko_id": "stasis-eurs", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "GNO": { - "coin": "GNO", - "name": "Gnosis", - "coinpaprika_id": "gno-gnosis", - "coingecko_id": "gnosis", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "HEX": { - "coin": "HEX", - "name": "HEX", - "coinpaprika_id": "hex-hex", - "coingecko_id": "hex", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "HOT": { - "coin": "HOT", - "name": "HoloToken", - "coinpaprika_id": "hot-holo", - "coingecko_id": "holotoken", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "HT": { - "coin": "HT", - "name": "HuobiToken", - "coinpaprika_id": "ht-huobi-token", - "coingecko_id": "huobi-token", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "HUSD": { - "coin": "HUSD", - "name": "HUSD", - "coinpaprika_id": "husd-husd", - "coingecko_id": "husd", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "KNC": { - "coin": "KNC", - "name": "KyberNetwork", - "coinpaprika_id": "knc-kyber-network", - "coingecko_id": "kyber-network", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "LEO": { - "coin": "LEO", - "name": "Bitfinex LEO Token", - "coinpaprika_id": "leo-leo-token", - "coingecko_id": "leo-token", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "LRC": { - "coin": "LRC", - "name": "Loopring", - "coinpaprika_id": "lrc-loopring", - "coingecko_id": "loopring", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "MANA": { - "coin": "MANA", - "name": "Decentraland", - "coinpaprika_id": "mana-decentraland", - "coingecko_id": "decentraland", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "MLN": { - "coin": "MLN", - "name": "Melon Token", - "coinpaprika_id": "mln-melon", - "coingecko_id": "melon", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "OKB": { - "coin": "OKB", - "name": "OKB", - "coinpaprika_id": "okb-okb", - "coingecko_id": "okb", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "PNK": { - "coin": "PNK", - "name": "Pinakion", - "coinpaprika_id": "pnk-kleros", - "coingecko_id": "kleros", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "POWR": { - "coin": "POWR", - "name": "PowerLedger", - "coinpaprika_id": "powr-power-ledger", - "coingecko_id": "power-ledger", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "QNT": { - "coin": "QNT", - "name": "Quant", - "coinpaprika_id": "qnt-quant", - "coingecko_id": "quant-network", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "REN": { - "coin": "REN", - "name": "Republic", - "coinpaprika_id": "ren-republic-protocol", - "coingecko_id": "republic-protocol", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "REP": { - "coin": "REP", - "name": "Reputation", - "coinpaprika_id": "rep-augur", - "coingecko_id": "augur", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "REV": { - "coin": "REV", - "name": "Revain", - "coinpaprika_id": "rev-revain", - "coingecko_id": "revain", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "RLC": { - "coin": "RLC", - "name": "RLC", - "coinpaprika_id": "rlc-iexec-rlc", - "coingecko_id": "iexec-rlc", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "RSR": { - "coin": "RSR", - "name": "Reserve Rights", - "coinpaprika_id": "rsr-reserve-rights", - "coingecko_id": "reserve-rights-token", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "S4F": { - "coin": "S4F", - "name": "S4FE", - "coinpaprika_id": "s4f-s4fe", - "coingecko_id": "s4fe", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "SHR": { - "coin": "SHR", - "name": "ShareToken", - "coinpaprika_id": "shr-sharetoken", - "coingecko_id": "sharering", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "SKL": { - "coin": "SKL", - "name": "SKALE", - "coinpaprika_id": "skl-skale", - "coingecko_id": "skale", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "SNT": { - "coin": "SNT", - "name": "StatusNetwork", - "coinpaprika_id": "snt-status", - "coingecko_id": "status", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "SRM": { - "coin": "SRM", - "name": "Serum", - "coinpaprika_id": "srm-serum", - "coingecko_id": "serum", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "STORJ": { - "coin": "STORJ", - "name": "Storj", - "coinpaprika_id": "storj-storj", - "coingecko_id": "storj", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "TMTG": { - "coin": "TMTG", - "name": "The Midas Touch Gold", - "coinpaprika_id": "tmtg-the-midas-touch-gold", - "coingecko_id": "the-midas-touch-gold", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "TRAC": { - "coin": "TRAC", - "name": "Trace", - "coinpaprika_id": "trac-origintrail", - "coingecko_id": "origintrail", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "TTT": { - "coin": "TTT", - "name": "The Transfer Token", - "coinpaprika_id": "ttt-the-transfer-token", - "coingecko_id": "the-transfer-token", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "UBT": { - "coin": "UBT", - "name": "UniBright", - "coinpaprika_id": "ubt-unibright", - "coingecko_id": "unibright", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "UMA": { - "coin": "UMA", - "name": "UMA Voting Token v1", - "coinpaprika_id": "uma-uma", - "coingecko_id": "uma", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "UNI-BEP20": { - "coin": "UNI-BEP20", - "name": "Uniswap", - "coinpaprika_id": "uni-uniswap", - "coingecko_id": "uniswap", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "type": "BEP-20", - "active": false, - "currently_enabled": false - }, - "UNI-ERC20": { - "coin": "UNI-ERC20", - "name": "Uniswap", - "coinpaprika_id": "uni-uniswap", - "coingecko_id": "uniswap", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "UOS": { - "coin": "UOS", - "name": "Ultra Token", - "coinpaprika_id": "uos-ultra", - "coingecko_id": "ultra", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "UQC": { - "coin": "UQC", - "name": "Uquid Coin", - "coinpaprika_id": "uqc-uquid-coin", - "coingecko_id": "uquid-coin", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "UTK": { - "coin": "UTK", - "name": "UTRUST", - "coinpaprika_id": "utk-utrust", - "coingecko_id": "utrust", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "VGX": { - "coin": "VGX", - "name": "Voyager", - "coinpaprika_id": "ethos-ethos", - "coingecko_id": "ethos", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "WBTC": { - "coin": "WBTC", - "name": "Wrapped BTC", - "coinpaprika_id": "wbtc-wrapped-bitcoin", - "coingecko_id": "wrapped-bitcoin", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "XOR": { - "coin": "XOR", - "name": "Sora Token", - "coinpaprika_id": "xor-sora", - "coingecko_id": "sora", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "ZRX": { - "coin": "ZRX", - "name": "ZRX", - "coinpaprika_id": "zrx-0x", - "coingecko_id": "0x", - "nodes": [ - "http://eth1.cipig.net:8555", - "http://eth2.cipig.net:8555", - "http://eth3.cipig.net:8555" - ], - "explorer_url": [ - "https://etherscan.io/" - ], - "type": "ERC-20", - "active": false, - "currently_enabled": false - }, - "CIPHS": { - "coin": "CIPHS", - "name": "Ciphscoin", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "152.89.247.97:10001" - }, - { - "url": "212.114.52.2:10001" - } - ], - "explorer_url": [ - "http://152.89.247.97:50604/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - } -} diff --git a/assets/config/cfg.json b/assets/config/cfg.json index c83e5e1436..ada8d5df25 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": "$", @@ -40,7 +41,8 @@ "SEK": "kr", "BTC": "₿", "BTC_ALT": "฿", - "LTC": "Ł" + "LTC": "Ł", + "KMD": "KMD" }, "available_fiat": [ "USD", @@ -77,10 +79,17 @@ "HUF", "SEK" ], + "recommended_fiat": [ + "USD", + "EUR", + "GBP", + "HKD", + "IDR", + "ILS" + ], "possible_currencies": [ "USD", - "BTC", "KMD", - "LTC" + "BTC" ] } \ No newline at end of file diff --git a/assets/config/game.config.maker.json b/assets/config/game.config.maker.json index 666850111a..390e7d0647 100644 --- a/assets/config/game.config.maker.json +++ b/assets/config/game.config.maker.json @@ -12,7 +12,7 @@ "native_desktop_mode": false, "scale_mode": "fit", "window_height": 900.0, - "window_title": "atomicDEX Desktop", + "window_title": "Komodo Wallet", "window_width": 1280.0, "no_style": false, "mouse_grabbed": false, diff --git a/assets/logo/dex-logo-sidebar.png b/assets/logo/dex-logo-big.png similarity index 100% rename from assets/logo/dex-logo-sidebar.png rename to assets/logo/dex-logo-big.png diff --git a/assets/themes/Binance - Dark/colors.json b/assets/themes/Binance - Dark/colors.json new file mode 100644 index 0000000000..96f4325b46 --- /dev/null +++ b/assets/themes/Binance - Dark/colors.json @@ -0,0 +1,139 @@ +{ + "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", + + "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": "#000000", + "checkBoxGradientStartColor": "#F0B90BFF", + "checkBoxGradientEndColor": "#F0B90BFF", + + "switchGradientStartColor": "#F0B90BFF", + "switchGradientEndColor": "#F0B90BFF", + "switchGradientStartColor2": "#000000", + "switchGradientEndColor2": "#000000", + + "comboBoxBackgroundColor": "#1D232FFF", + "comboBoxArrowsColor": "#FFFFFFFF", + "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/Binance.json b/assets/themes/Binance.json deleted file mode 100644 index f09dc431da..0000000000 --- a/assets/themes/Binance.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "accentColor": "#cb9800", - "backgroundColor": "#161515", - "backgroundColorDeep": "#0A0A0A", - "barColor": "#23273c", - "bigSidebarLogo": "dex-logo-sidebar.png", - "buttonColorDisabled": "#8B6900", - "buttonColorEnabled": "#cb9800", - "buttonColorHovered": "#EBB514", - "buttonColorTextDisabled": "#3B3B3B", - "buttonColorTextEnabled": "#080707", - "buttonColorTextHovered": "#000000", - "chartTheme": "dark", - "chartTradingLineBackgroundColor": "#24283d", - "chartTradingLineColor": "#cb9800", - "colorInnerShadowBottom": "#2a2f48", - "colorInnerShadowTop": "#0d1021", - "colorLineGradient1": "#2c2f3c", - "colorLineGradient2": "#06070c", - "colorLineGradient3": "#090910", - "colorLineGradient4": "#24283b", - "colorSidebarDropShadow": "#90000000", - "colorThemeDarkLight": "#78808d", - "dexBoxBackgroundColor": "#0F0E0E", - "floatBoxShadowDark": "transparent", - "floatShadow1": "transparent", - "floatShadow2": "transparent", - "foregroundColor": "#ffffff", - "greenColor": "#74fbee", - "hightlightColor": "#23273c", - "innerShadowColor": "#a0000000", - "navigationSideBarButtonGradient1": "#C29E32", - "navigationSideBarButtonGradient2": "#9E7700", - "navigationSideBarButtonGradient3": "#5A4505", - "navigationSideBarButtonGradient4": "#006bcef4", - "primaryColor": "#cb9800", - "redColor": "#d13990", - "sideBarGradient1": "#000000", - "sideBarGradient2": "#141414", - "smallSidebarLogo": "dex-logo.png", - "surfaceColor": "#0A0A0A", - "textPlaceHolderColor": "#444444", - "textSelectedColor": "#0e1021", - "textSelectionColor": "#14bca6", - "whiteblack": "#ffffff" -} \ No newline at end of file diff --git a/assets/themes/Dark.json b/assets/themes/Dark.json deleted file mode 100644 index ec894bce43..0000000000 --- a/assets/themes/Dark.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "accentColor": "#AB2EE8", - "backgroundColor": "#1F2130", - "backgroundColorDeep": "#1F2130", - "barColor": "#23273c", - "bigSidebarLogo": "dex-logo-sidebar.png", - "buttonColorDisabled": "#0e1021", - "buttonColorEnabled": "#181922", - "buttonColorHovered": "#1E1F27", - "buttonColorTextDisabled": "#555555", - "buttonColorTextEnabled": "#ffffff", - "buttonColorTextHovered": "#ffffff", - "chartTheme": "dark", - "chartTradingLineBackgroundColor": "#24283d", - "chartTradingLineColor": "#AB2EE8", - "colorInnerShadowBottom": "#2a2f48", - "colorInnerShadowTop": "#0d1021", - "colorLineGradient1": "#2c2f3c", - "colorLineGradient2": "#06070c", - "colorLineGradient3": "#090910", - "colorLineGradient4": "#24283b", - "colorSidebarDropShadow": "#90000000", - "colorThemeDarkLight": "#78808d", - "dexBoxBackgroundColor": "#181922", - "floatBoxShadowDark": "#050615", - "floatShadow1": "#216975a4", - "floatShadow2": "#606975a4", - "foregroundColor": "#ffffff", - "greenColor": "#74fbee", - "hightlightColor": "#23273c", - "innerShadowColor": "#a0000000", - "navigationSideBarButtonGradient1": "#F433FF", - "navigationSideBarButtonGradient2": "#AB2EE8", - "navigationSideBarButtonGradient3": "#5F1683", - "navigationSideBarButtonGradient4": "#1F2130", - "primaryColor": "#AB2EE8", - "redColor": "#d13990", - "sideBarGradient1": "#1A1D2D", - "sideBarGradient2": "#181922", - "smallSidebarLogo": "dex-logo.png", - "surfaceColor": "#1F2130", - "textPlaceHolderColor": "#444444", - "textSelectedColor": "#0e1021", - "textSelectionColor": "#14bca6", - "whiteblack": "#ffffff" -} \ No newline at end of file diff --git a/assets/themes/Default - Dark/colors.json b/assets/themes/Default - Dark/colors.json new file mode 100644 index 0000000000..faee423f39 --- /dev/null +++ b/assets/themes/Default - Dark/colors.json @@ -0,0 +1,137 @@ +{ + "accentColor": "#2C3D66FF", + "foregroundColor": "#FFFFFFFF", + "foregroundColor2": "#7A8EA1FF", + "foregroundColor3": "#ABC0D3FF", + "backgroundColor": "#202337FF", + "secondBackgroundColor": "#24273DFF", + "backgroundColorDeep": "#171a2cFF", + + "busyIndicatorColor": "#4986EAFF", + + "buttonColorDisabled": "#28375AFF", + "buttonColorEnabled": "#293254FF", + "buttonColorHovered": "#4068B929", + "buttonColorPressed": "#2932546C", + "buttonTextDisabledColor": "#444444FF", + "buttonTextEnabledColor": "#FFFFFFFF", + "buttonTextHoveredColor": "#FFFFFFFF", + "buttonTextPressedColor": "#FFFFFFFF", + + "buttonSecondaryColorDisabled": "#28375AFF", + "buttonSecondaryColorEnabled": "#293254FF", + "buttonSecondaryColorHovered": "#4068B929", + "buttonSecondaryColorPressed": "#2932546C", + + "buttonCancelColorDisabled": "#28375AFF", + "buttonCancelColorEnabled": "#293254FF", + "buttonCancelColorHovered": "#4068B929", + "buttonCancelColorPressed": "#2932546C", + + "gradientButtonStartColor": "#4986EAAD", + "gradientButtonEndColor": "#5A68E6FF", + "gradientButtonDisabledStartColor": "#5A68E64D", + "gradientButtonDisabledEndColor": "#4986EA34", + "gradientButtonHoveredStartColor": "#4986EAAD", + "gradientButtonHoveredEndColor": "#4986EAAD", + "gradientButtonPressedStartColor": "#4986EAFF", + "gradientButtonPressedEndColor": "#4986EAFF", + "gradientButtonTextEnabledColor": "#FFFFFFFF", + "gradientButtonTextDisabledColor": "#FFFFFFFF", + "gradientButtonTextHoveredColor": "#FFFFFFFF", + "gradientButtonTextPressedColor": "#FFFFFFFF", + + "checkBoxTickColor": "#FFFFFFFF", + "checkBoxGradientStartColor": "#6673E3FF", + "checkBoxGradientEndColor": "#5EBBF0FF", + + "switchGradientStartColor": "#1D80B0FF", + "switchGradientEndColor": "#5B69E6FF", + "switchGradientStartColor2": "#FFFFFFFF", + "switchGradientEndColor2": "#FFFFFFFF", + + "comboBoxBackgroundColor": "#303757FF", + "comboBoxArrowsColor": "#FFFFFFFF", + "comboBoxDropdownItemHighlightedColor": "#4663E8FF", + + "modalPageCounterGradientStartColor": "#1D80B0FF", + "modalPageCounterGradientEndColor": "#5B69E6FF", + + "notifPopupBackgroundColor": "#24273DFF", + "notifPopupTextColor": "#FFFFFFFF", + "notifPopupTimerColor": "#8790B2FF", + "notifPopupTimerBackgroundColor": "#94A3B11F", + "notifPopupIconStartColor": "#FFFFFFFF", + "notifPopupIconEndColor": "#FFFFFFFF", + + "scrollBarIndicatorColor": "#8790B2FF", + "scrollBarBackgroundColor": "#94A3B11F", + + "tabSelectedColor": "#2C3D66FF", + + "textDisabledColor": "#444444FF", + "textSelectionColor": "#4986EAFF", + "textPlaceholderColor": "#91A8E8FF", + "textSelectedColor": "#0e1021FF", + + "textFieldBackgroundColor": "#313555FF", + "textFieldActiveBackgroundColor": "#3b3f62FF", + "textFieldPrefixColor": "#8790B2FF", + "textFieldSuffixColor": "#8790B2FF", + + "tickerBadgeBackgroundColor": "#202337FF", + + "chartTradingLineBackgroundColor": "#24283dFF", + "chartTradingLineColor": "#74fbeeFF", + + "innerBackgroundColor": "#1F263FFF", + + "floatingBackgroundColor": "#24273DFF", + + "rangeSliderBackgroundColor": "#5A68E6FF", + "rangeSliderDistanceColor": "#4986EA3B", + "rangeSliderIndicatorBackgroundStartColor": "#5A68E6FF", + "rangeSliderIndicatorBackgroundEndColor": "#4986EAFF", + + "userIconColorStart": "#5A68E6FF", + "userIconColorEnd": "#4986EAAD", + + "sidebarBgColor": "#202337FF", + "sidebarVersionTextColor": "#2F5688FF", + "sidebarCursorStartColor": "#31B1F0FF", + "sidebarCursorEndColor": "#5B69E600", + "sidebarLineTextHovered": "#2C87B9FF", + "sidebarLineTextSelected": "#FFFFFFFF", + + "tradeSellModeSelectorBackgroundColorStart": "#E52167FF", + "tradeSellModeSelectorBackgroundColorEnd": "#CD0F53FF", + "tradeBuyModeSelectorBackgroundColorStart": "#0F713CFF", + "tradeBuyModeSelectorBackgroundColorEnd": "#037B3AFF", + + "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", + "warningColor": "#E52167FF", + "swapIconColor": "#005FBEFF", + + "senderColorStart": "#F85757FF", + "receiverColorStart": "#845FEFFF", + + "arrowUpColor": "#F85757FF", + "arrowDownColor": "#845FEFFF", + + "lineSeparatorColor": "#262941FF" +} diff --git a/assets/themes/Default - Dark/dex-logo-big.png b/assets/themes/Default - Dark/dex-logo-big.png new file mode 100644 index 0000000000..c29e54e856 Binary files /dev/null and b/assets/themes/Default - Dark/dex-logo-big.png differ diff --git a/assets/themes/Default - Dark/dex-logo.png b/assets/themes/Default - Dark/dex-logo.png new file mode 100644 index 0000000000..b245f67f57 Binary files /dev/null and b/assets/themes/Default - Dark/dex-logo.png differ diff --git a/assets/themes/Default - Light/colors.json b/assets/themes/Default - Light/colors.json new file mode 100644 index 0000000000..de287782f6 --- /dev/null +++ b/assets/themes/Default - Light/colors.json @@ -0,0 +1,135 @@ +{ + "accentColor": "#F0F2FFFF", + "foregroundColor": "#456078FF", + "backgroundColor": "#FCFCFCFF", + "secondBackgroundColor": "#ECECECFF", + "backgroundColorDeep": "#ECECECFF", + + "busyIndicatorColor": "#5A68E6FF", + + "buttonColorDisabled": "#D8E3F8FF", + "buttonColorEnabled": "#DDE6F2FF", + "buttonColorHovered": "#CDE1FFFF", + "buttonColorPressed": "#B8D2F9FF", + "buttonTextDisabledColor": "#D1D4DCFF", + "buttonTextEnabledColor": "#456078FF", + "buttonTextHoveredColor": "#2F5678FF", + "buttonTextPressedColor": "#3A5B78FF", + + "buttonSecondaryColorDisabled": "#D8E3F8FF", + "buttonSecondaryColorEnabled": "#F0F6FFFF", + "buttonSecondaryColorHovered": "#D7E7FFFF", + "buttonSecondaryColorPressed": "#B8D2F9FF", + + "buttonCancelColorDisabled": "#D8E3F8FF", + "buttonCancelColorEnabled": "#DDE6F2FF", + "buttonCancelColorHovered": "#CDE1FFFF", + "buttonCancelColorPressed": "#B8D2F9FF", + + "gradientButtonStartColor": "#5A68E6FF", + "gradientButtonEndColor": "#4986EAAB", + "gradientButtonDisabledStartColor": "#CDD0F6FF", + "gradientButtonDisabledEndColor": "#DAE5F9FF", + "gradientButtonHoveredStartColor": "#5A68E6FF", + "gradientButtonHoveredEndColor": "#5A68E6FF", + "gradientButtonPressedStartColor": "#6A4DE3FF", + "gradientButtonPressedEndColor": "#6A4DE3FF", + "gradientButtonTextEnabledColor": "#FFFFFFFF", + "gradientButtonTextDisabledColor": "#FFFFFFFF", + "gradientButtonTextHoveredColor": "#FFFFFFFF", + "gradientButtonTextPressedColor": "#FFFFFFFF", + + "checkBoxTickColor": "#456078FF", + "checkBoxGradientStartColor": "#8892EBFF", + "checkBoxGradientEndColor": "#9DD4F3FF", + + "switchGradientStartColor": "#8892EBFF", + "switchGradientEndColor": "#9DD4F3FF", + "switchGradientStartColor2": "#FFFFFFFF", + "switchGradientEndColor2": "#FFFFFFFF", + + "comboBoxBackgroundColor": "#DDE6F2FF", + "comboBoxArrowsColor": "#456078FF", + "comboBoxDropdownItemHighlightedColor": "#CDE1FFFF", + + "modalPageCounterGradientStartColor": "#9DD4F3FF", + "modalPageCounterGradientEndColor": "#9DD4F3FF", + + "notifPopupBackgroundColor": "#EDF4FFFF", + "notifPopupTextColor": "#456078FF", + "notifPopupTimerColor": "#DBE0E4FF", + "notifPopupTimerBackgroundColor": "#93A3B1FF", + "notifPopupIconStartColor": "#000000FF", + "notifPopupIconEndColor": "#000000FF", + + "scrollBarIndicatorColor": "#DBE0E4FF", + "scrollBarBackgroundColor": "#93A3B1FF", + + "tabSelectedColor": "#DCE8FDFF", + + "textDisabledColor": "#C5CFD8FF", + "textSelectionColor": "#5A68E6FF", + "textPlaceholderColor": "#91A8E8FF", + "textSelectedColor": "#F9F9FBFF", + + "textFieldBackgroundColor": "#F3F5F6FF", + "textFieldActiveBackgroundColor": "#EDF4FFFF", + "textFieldPrefixColor": "#45607894", + "textFieldSuffixColor": "#456078FF", + + "tickerBadgeBackgroundColor": "#D5DCF8FF", + + "chartTradingLineBackgroundColor": "#C5F2EFFF", + "chartTradingLineColor": "#53EBD7FF", + + "innerBackgroundColor": "#DDE6F2FF", + + "floatingBackgroundColor": "#EDF4FFFF", + + "rangeSliderBackgroundColor": "#5A68E6FF", + "rangeSliderDistanceColor": "#4986EA3B", + "rangeSliderIndicatorBackgroundStartColor": "#5A68E6FF", + "rangeSliderIndicatorBackgroundEndColor": "#4986EAFF", + + "userIconColorStart": "#5A68E6FF", + "userIconColorEnd": "#4986EAAD", + + "sidebarBgColor": "#FCFCFCFF", + "sidebarVersionTextColor": "#456078FF", + "sidebarCursorStartColor": "#5A68E6FF", + "sidebarCursorEndColor": "#2CB9F000", + "sidebarLineTextHovered": "#2C87B9FF", + "sidebarLineTextSelected": "#FFFFFFFF", + + "tradeSellModeSelectorBackgroundColorStart": "#E52167FF", + "tradeSellModeSelectorBackgroundColorEnd": "#CD0F53FF", + "tradeBuyModeSelectorBackgroundColorStart": "#0F713CFF", + "tradeBuyModeSelectorBackgroundColorEnd": "#037B3AFF", + + "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", + "warningColor": "#E52167FF", + "swapIconColor": "#005FBEFF", + + "senderColorStart": "#F85757FF", + "receiverColorStart": "#845FEFFF", + + "arrowUpColor": "#F85757FF", + "arrowDownColor": "#845FEFFF", + + "lineSeparatorColor": "#CDD3DC88" +} diff --git a/assets/logo/dex-logo-sidebar-dark.png b/assets/themes/Default - Light/dex-logo-big.png similarity index 100% rename from assets/logo/dex-logo-sidebar-dark.png rename to assets/themes/Default - Light/dex-logo-big.png diff --git a/assets/themes/Default - Light/dex-logo.png b/assets/themes/Default - Light/dex-logo.png new file mode 100644 index 0000000000..236788d6c6 Binary files /dev/null and b/assets/themes/Default - Light/dex-logo.png differ diff --git a/assets/themes/GoldLight.json b/assets/themes/GoldLight.json deleted file mode 100644 index 43ef1c8a3b..0000000000 --- a/assets/themes/GoldLight.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "accentColor": "#e1b303", - "backgroundColor": "#eeeeee", - "backgroundColorDeep": "#f6f6f9", - "barColor": "#ececf2", - "bigSidebarLogo": "dex-logo-sidebar.png", - "buttonColorDisabled": "#8B6900", - "buttonColorEnabled": "#cb9800", - "buttonColorHovered": "#EBB514", - "buttonColorTextDisabled": "#3B3B3B", - "buttonColorTextEnabled": "#080707", - "buttonColorTextHovered": "#000000", - "chartTheme": "light", - "chartGridLineColor":"#707070", - "chartTradingLineBackgroundColor": "#e3f2fd", - "chartTradingLineColor": "#37a6ef", - "colorInnerShadowBottom": "#dddddd", - "colorInnerShadowTop": "#efefef", - "colorLineGradient1": "#eef1f7", - "colorLineGradient2": "#dce1e8", - "colorLineGradient3": "#eef1f7", - "colorLineGradient4": "#dce1e8", - "colorSidebarDropShadow": "#becde2", - "colorThemeDarkLight": "#456078", - "dexBoxBackgroundColor": "#eeeeee", - "floatBoxShadowDark": "#becde2", - "floatShadow1": "#21ffffff", - "floatShadow2": "#60ffffff", - "foregroundColor": "#000", - "greenColor": "#028A3F", - "hightlightColor": "#A08000", - "innerShadowColor": "#becde2", - "navigationSideBarButtonGradient1": "#C29E32", - "navigationSideBarButtonGradient2": "#9E7700", - "navigationSideBarButtonGradient3": "#5A4505", - "navigationSideBarButtonGradient4": "#006bcef4", - "primaryColor": "#171a2c", - "redColor": "#9a1165", - "sideBarGradient1": "#3A2B00", - "sideBarGradient2": "#000000", - "smallSidebarLogo": "dex-logo.png", - "surfaceColor": "#f6f6f9", - "textPlaceHolderColor": "#8e9293", - "textSelectedColor": "#f9f9fb", - "textSelectionColor": "#14bca6", - "sidebarShadowRadius[int]":"0", - "whiteblack": "#000000" -} \ No newline at end of file diff --git a/assets/themes/Light.json b/assets/themes/Light.json deleted file mode 100644 index 6aa7f88581..0000000000 --- a/assets/themes/Light.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "accentColor": "#AB2EE8", - "backgroundColor": "#f2f2f7", - "backgroundColorDeep": "#f6f6f9", - "barColor": "#ececf2", - "bigSidebarLogo": "dex-logo-sidebar.png", - "buttonColorDisabled": "#f9f9fb", - "buttonColorEnabled": "#f2f2f7", - "buttonColorHovered": "#efeff5", - "buttonColorTextDisabled": "#777777", - "buttonColorTextEnabled": "#405366", - "buttonColorTextHovered": "#405366", - "chartTheme": "light", - "chartTradingLineBackgroundColor": "#e3f2fd", - "chartTradingLineColor": "#37a6ef", - "colorInnerShadowBottom": "#dddddd", - "colorInnerShadowTop": "#efefef", - "colorLineGradient1": "#eef1f7", - "colorLineGradient2": "#dce1e8", - "colorLineGradient3": "#eef1f7", - "colorLineGradient4": "#dce1e8", - "colorSidebarDropShadow": "#becde2", - "colorThemeDarkLight": "#456078", - "dexBoxBackgroundColor": "#f9f9fb", - "floatBoxShadowDark": "#becde2", - "floatShadow1": "#21ffffff", - "floatShadow2": "#60ffffff", - "foregroundColor": "#000", - "greenColor": "#109f8d", - "hightlightColor": "#8C41FF", - "innerShadowColor": "#becde2", - "navigationSideBarButtonGradient1": "#AB2EE8", - "navigationSideBarButtonGradient2": "#A311EC", - "navigationSideBarButtonGradient3": "#9E38D1", - "navigationSideBarButtonGradient4": "#006bcef4", - "primaryColor": "#171a2c", - "redColor": "#9a1165", - "sideBarGradient1": "#7D37E7", - "sideBarGradient2": "#350C74", - "smallSidebarLogo": "dex-logo.png", - "surfaceColor": "#f6f6f9", - "textPlaceHolderColor": "#8e9293", - "textSelectedColor": "#f9f9fb", - "textSelectionColor": "#14bca6", - "sidebarShadowRadius[int]":"0", - "whiteblack": "#000000" -} \ No newline at end of file diff --git a/assets/themes/RedDark.json b/assets/themes/RedDark.json deleted file mode 100644 index fa787d05e9..0000000000 --- a/assets/themes/RedDark.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "accentColor": "#db2d33", - "backgroundColor": "#601b22", - "backgroundColorDeep": "#601b22", - "barColor": "#420D11", - "bigSidebarLogo": "dex-logo-sidebar.png", - "buttonColorDisabled": "#3B3B3B", - "buttonColorEnabled": "#705F5F", - "buttonColorHovered": "#AF3438", - "buttonColorTextDisabled": "#555555", - "buttonColorTextEnabled": "#ffffff", - "buttonColorTextHovered": "#ffffff", - "chartTheme": "dark", - "chartTradingLineBackgroundColor": "#460D11", - "chartTradingLineColor": "#C5111D", - "colorInnerShadowBottom": "#290E10", - "colorInnerShadowTop": "#290E10", - "colorLineGradient1": "#7C1527", - "colorLineGradient2": "#550C1873", - "colorLineGradient3": "#550C1854", - "colorLineGradient4": "#7C1527", - "colorSidebarDropShadow": "#350000", - "colorThemeDarkLight": "#78808d", - "dexBoxBackgroundColor": "#3D0D11", - "floatBoxShadowDark": "#290E10", - "floatShadow1": "transparent", - "floatShadow2": "transparent", - "foregroundColor": "#ffffff", - "greenColor": "#04BB93", - "hightlightColor": "#7C1527", - "innerShadowColor": "#a0000000", - "navigationSideBarButtonGradient1": "#7C1527", - "navigationSideBarButtonGradient2": "#6D0819", - "navigationSideBarButtonGradient3": "#BB1632", - "navigationSideBarButtonGradient4": "#001b5e7d", - "primaryColor": "#8A191C", - "redColor": "#FF002B", - "rectangleBorderColor": "transparent", - "rectangleRadius[int]": 6, - "sideBarGradient1": "#140506", - "sideBarGradient2": "#660B1A", - "smallSidebarLogo": "dex-logo.png", - "surfaceColor": "#601b22", - "textPlaceHolderColor": "#ACAAAA", - "textSelectedColor": "#0e1021", - "textSelectionColor": "#39a1ee", - "whiteblack": "#ffffff" -} \ No newline at end of file diff --git a/assets/themes/RedLight.json b/assets/themes/RedLight.json deleted file mode 100644 index f9f3ec0228..0000000000 --- a/assets/themes/RedLight.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "accentColor": "#FD666B", - "backgroundColor": "#DDDDDD", - "backgroundColorDeep": "#E4E4E4", - "barColor": "#838383", - "bigSidebarLogo": "dex-logo-sidebar.png", - "buttonColorDisabled": "#F1F1F1", - "buttonColorEnabled": "#ADADAD", - "buttonColorHovered": "#C7C7C7", - "buttonColorTextDisabled": "#D3D3D3", - "buttonColorTextEnabled": "#3D3D3D", - "buttonColorTextHovered": "#2C2C2C", - "chartTheme": "light", - "chartGridLineColor":"#707070", - "chartTradingLineBackgroundColor": "#e3f2fd", - "chartTradingLineColor": "#37a6ef", - "colorInnerShadowBottom": "#D6C1C1", - "colorInnerShadowTop": "#E2C2C2", - "colorLineGradient1": "#919397", - "colorLineGradient2": "#505050", - "colorLineGradient3": "#C3C3C3", - "colorLineGradient4": "#626262", - "colorSidebarDropShadow": "#0000000", - "colorThemeDarkLight": "#456078", - "dexBoxBackgroundColor": "#D1D1D1", - "floatBoxShadowDark": "transparent", - "floatShadow1": "transparent", - "floatShadow2": "transparent", - "foregroundColor": "#050505", - "greenColor": "#109f8d", - "hightlightColor": "#959494", - "innerShadowColor": "#505050", - "navigationSideBarButtonGradient1": "#7C1527", - "navigationSideBarButtonGradient2": "#6D0819", - "navigationSideBarButtonGradient3": "#BB1632", - "navigationSideBarButtonGradient4": "#001b5e7d", - "primaryColor": "#171a2c", - "redColor": "#9a1165", - "sideBarGradient1": "#140506", - "sideBarGradient2": "#660B1A", - "smallSidebarLogo": "dex-logo.png", - "surfaceColor": "#E4E4E4", - "textPlaceHolderColor": "#8e9293", - "textSelectedColor": "#848486", - "textSelectionColor": "#14bca6", - "whiteblack": "#000000" -} \ No newline at end of file diff --git a/assets/tools/.gitignore b/assets/tools/.gitignore new file mode 100644 index 0000000000..b7e0b1c746 --- /dev/null +++ b/assets/tools/.gitignore @@ -0,0 +1,2 @@ +mm2 +coins diff --git a/atomic_defi_design/Dex/.gitignore b/atomic_defi_design/Dex/.gitignore new file mode 100644 index 0000000000..90d1f28b17 --- /dev/null +++ b/atomic_defi_design/Dex/.gitignore @@ -0,0 +1 @@ +qml.qrc \ No newline at end of file diff --git a/atomic_defi_design/Dex/Addressbook/AddAddressForm.qml b/atomic_defi_design/Dex/Addressbook/AddAddressForm.qml new file mode 100644 index 0000000000..b2633f2084 --- /dev/null +++ b/atomic_defi_design/Dex/Addressbook/AddAddressForm.qml @@ -0,0 +1,315 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 + +import Qaterial 1.0 as Qaterial + +import Dex.Themes 1.0 as Dex +import Dex.Components 1.0 as Dex +import "../Components" as Dex +import "../Constants" as Dex + +Dex.Rectangle +{ + id: root + + property var contactModel + + // Edition mode variables + property bool editionMode: false + property string addressType + property string addressKey + property string addressValue + + property var availableNetworkStandards: ["QRC-20", "ERC-20", "BEP-20", "Smart Chain", "SLP"] + + // Return the asset type that will be used in the backend to validate the address + function getTypeForAddressChecker(addressType) + { + switch (addressType) + { + case "QRC-20": return "QTUM" + case "BEP-20": return "BNB" + case "ERC-20": return "ETH" + case "Smart Chain": return "KMD" + case "SLP": return "USDT-SLP" + } + + let coinInfo = Dex.API.app.portfolio_pg.global_cfg_mdl.get_coin_info(addressType); + if (coinInfo.has_parent_fees_ticker && coinInfo.type !== "SLP") + return coinInfo.fees_ticker; + return addressType + } + + // Tells if the given address type represents a network standard address (e.g. BEP-20) + function isNetworkStandard(addressType) + { + switch (addressType) + { + case "QRC-20": return true + case "BEP-20": return true + case "ERC-20": return true + case "Smart Chain": return true + case "SLP": return true + } + return false + } + + signal cancel() + signal addressCreated() + + width: 500 + height: column.height + 26 + radius: 10 + + onVisibleChanged: + { + if (!visible) + { + // Resets data when address is added/edited. + addressKeyField.text = "" + addressValueField.text = "" + invalidAddressValueLabel.text = "" + editionMode = false + addressType = "" + addressKey = "" + addressValue = "" + } + else if (editionMode) + { + // Feeds form with the data we are currently editing. + + if (!isNetworkStandard(addressType)) + { + useStandardsCheckBox.checked = false + let addressTypeIndex = + Dex.API.app.portfolio_pg.global_cfg_mdl.all_proxy.match( + Dex.API.app.portfolio_pg.global_cfg_mdl.all_proxy.index(0, 0), + Qt.UserRole + 1, addressType, 1, Qt.MatchExactly)[0] + addressTypeComboBox.currentIndex = addressTypeIndex.row + } + else + { + useStandardsCheckBox.checked = true + let addressTypeIndex = availableNetworkStandards.indexOf(addressType) + addressTypeComboBox.currentIndex = addressTypeIndex + } + addressKeyField.text = addressKey + addressValueField.text = addressValue + } + } + + ColumnLayout + { + id: column + anchors.centerIn: parent + spacing: 17 + + RowLayout + { + Layout.preferredWidth: 458 + Layout.preferredHeight: 38 + + AddressTypeSelector + { + id: addressTypeComboBox + Layout.fillWidth: true + Layout.fillHeight: true + showAssetStandards: useStandardsCheckBox.checked + } + + RowLayout { + id: rowLayout + spacing: 4 + Dex.DefaultCheckBox + { + id: useStandardsCheckBox + Layout.preferredWidth: 30 + Layout.fillHeight: true + Layout.leftMargin: 4 + } + Dex.DefaultText { + Layout.minimumWidth: 120 + Layout.maximumWidth: 120 + text: qsTr("Use standard network address") + font: Dex.DexTypo.caption + } + } + } + + Dex.TextField + { + id: addressKeyField + Layout.preferredWidth: 458 + Layout.preferredHeight: 38 + placeholderText: qsTr("Label") + + Dex.ToolTip + { + id: addressKeyAlreadyExistsToolTip + contentItem: Dex.Text { text_value: qsTr("This key already exists.") } + } + } + + Dex.TextField + { + id: addressValueField + Layout.preferredWidth: 458 + Layout.preferredHeight: 38 + placeholderText: qsTr("Address") + } + + Dex.Text + { + id: invalidAddressValueLabel + Layout.preferredWidth: 458 + Layout.preferredHeight: 60 + visible: text !== "" + color: Dex.CurrentTheme.warningColor + wrapMode: Dex.Text.WordWrap + elide: Dex.Text.ElideRight + horizontalAlignment: Text.AlignHCenter + } + + RowLayout + { + Layout.topMargin: 10 + Layout.fillWidth: true + + Dex.CancelButton + { + Layout.preferredWidth: 116 + Layout.preferredHeight: 38 + radius: 18 + text: qsTr("Cancel") + onClicked: cancel() + } + + Item { Layout.fillWidth: true } + + Dex.GradientButton + { + property bool isConvertMode: Dex.API.app.wallet_pg.validate_address_data.convertible ?? false + + enabled: addressKeyField.length > 0 && addressValueField.length > 0 && !Dex.API.app.wallet_pg.validate_address_busy + Layout.preferredWidth: 116 + Layout.preferredHeight: 38 + radius: 18 + text: isConvertMode ? qsTr("Convert") : editionMode ? qsTr("Update") : qsTr("Save") + onClicked: + { + let addressType = getTypeForAddressChecker(addressTypeComboBox.currentText) + + if (!Dex.API.app.portfolio_pg.global_cfg_mdl.get_coin_info(addressType).is_enabled) + { + enableAssetModal.assetTicker = addressType + enableAssetModal.open() + } + else if (isConvertMode) + Dex.API.app.wallet_pg.convert_address(addressValueField.text, addressType, Dex.API.app.wallet_pg.validate_address_data.to_address_format); + else + Dex.API.app.wallet_pg.validate_address(addressValueField.text, addressType) + } + } + } + } + + Connections + { + target: Dex.API.app.wallet_pg + + function onConvertAddressBusyChanged() + { + if (Dex.API.app.wallet_pg.convert_address_busy) // Currently converting entered address + { + return + } + + addressValueField.text = Dex.API.app.wallet_pg.converted_address + Dex.API.app.wallet_pg.validate_address_data = {} + invalidAddressValueLabel.text = "" + } + + function onValidateAddressBusyChanged() + { + if (Dex.API.app.wallet_pg.validate_address_busy) // Currently checking entered address + { + return + } + + let validation_data = Dex.API.app.wallet_pg.validate_address_data + if (!validation_data.is_valid) // Entered address is invalid. + { + invalidAddressValueLabel.text = validation_data.reason + + return + } + + if (editionMode) // Removes old address entry before if we are in edition mode. + { + contactModel.removeAddressEntry(addressType, addressKey); + } + + var createAddressResult = contactModel.addAddressEntry(addressTypeComboBox.currentText, addressKeyField.text, addressValueField.text); + if (createAddressResult === true) + { + addressCreated() + Dex.API.app.addressbookPg.model.proxy.searchExp = "x" + Dex.API.app.addressbookPg.model.proxy.searchExp = "" + } + else + { + addressKeyAlreadyExistsToolTip.visible = true + } + } + } + + Dex.ModalLoader + { + id: enableAssetModal + + property string assetTicker + + onLoaded: item.assetTicker = assetTicker + + sourceComponent: Dex.MultipageModal + { + property string assetTicker + Dex.MultipageModalContent + { + Layout.fillWidth: true + titleText: qsTr("Enable " + assetTicker) + + Dex.Text + { + Layout.fillWidth: true + text: qsTr("You need to enable %1 before adding this kind of address.").arg(assetTicker) + } + + footer: + [ + // Enable button + Dex.Button + { + text: qsTr("Enable") + + onClicked: + { + Dex.API.app.enable_coin(assetTicker) + close() + } + }, + + // Cancel button + Dex.CancelButton + { + Layout.rightMargin: 5 + text: qsTr("Cancel") + + onClicked: close() + } + ] + } + } + } +} diff --git a/atomic_defi_design/Dex/Addressbook/AddTagPopup.qml b/atomic_defi_design/Dex/Addressbook/AddTagPopup.qml new file mode 100644 index 0000000000..000cd1a024 --- /dev/null +++ b/atomic_defi_design/Dex/Addressbook/AddTagPopup.qml @@ -0,0 +1,80 @@ +// Qt Imports +import QtQuick 2.15 +import QtQuick.Layouts 1.15 + +// Project Imports +import "../Constants" +import Dex.Components 1.0 as Dex + +Dex.Popup +{ + id: root + + width: 250 + height: 55 + + onOpened: tagNameField.forceActiveFocus() + onClosed: tagNameField.text = "" + + contentItem: Row + { + spacing: 4 + + 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 + visible: false + timeout: 3000 + contentItem: Dex.Text + { + text_value: qsTr("Contact already has this tag.") + } + } + } + + Dex.Button + { + visible: contactModel.categories.length < 5 + width: parent.width * 0.36 + height: parent.height + text: qsTr("+ ADD") + onClicked: + { + if (tagNameField.text.length === 0) + { + return + } + + var addTagResult = contactModel.addCategory(tagNameField.text) + + if (addTagResult === false) tagAlreadyTakenToolTip.visible = true + 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 new file mode 100644 index 0000000000..6e79fabad7 --- /dev/null +++ b/atomic_defi_design/Dex/Addressbook/AddressTypeSelector.qml @@ -0,0 +1,99 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.3 + +import Qaterial 1.0 as Qaterial + +import Dex.Themes 1.0 as Dex +import Dex.Components 1.0 as Dex +import "../Components" as Dex +import "../Constants" as Dex + +Dex.ComboBoxWithSearchBar +{ + id: control + + property bool showAssetStandards: false + property var assetStandards: availableNetworkStandards + + function resetList() + { + if (showAssetStandards) currentIndex = 0; else { resetSearch(); currentIndex = 1 } + setContentItem(currentIndex) + } + + function resetSearch() + { + Dex.API.app.portfolio_pg.global_cfg_mdl.all_proxy.setFilterFixedString(""); + searchBar.textField.text = ""; + } + + function setContentItem(index) + { + if (showAssetStandards) + { + _contentRow.ticker = assetStandards[index] + _contentRow.name = assetStandards[index] + _contentRow.type = assetStandards[index] + } + else + { + _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) : "" + } + } + + popupForceMaxHeight: true + popupMaxHeight: 220 + + model: showAssetStandards ? assetStandards : Dex.API.app.portfolio_pg.global_cfg_mdl.all_proxy + textRole: showAssetStandards ? "" : "ticker" + + searchBar.visible: !showAssetStandards + searchBar.searchModel: model + + delegate: ItemDelegate + { + id: _delegate + + visible: model.ticker !== "All" + + width: control.width + height: visible ? 40 : 0 + highlighted: control.highlightedIndex === index + + contentItem: AssetRow + { + ticker: showAssetStandards ? modelData : model.ticker + name: showAssetStandards ? modelData : model.name + type: showAssetStandards ? modelData : model.type + } + + background: Dex.Rectangle + { + anchors.fill: _delegate + color: _delegate.highlighted ? Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor : Dex.CurrentTheme.comboBoxBackgroundColor + } + } + + contentItem: AssetRow + { + id: _contentRow + + anchors.left: parent.left + anchors.leftMargin: 13 + anchors.verticalCenter: parent.verticalCenter + } + + onCurrentIndexChanged: + { + if (!showAssetStandards && currentIndex === 0 && searchBar.textField.text == "") currentIndex = 1 + setContentItem(currentIndex) + } + onActivated: setContentItem(index) + onShowAssetStandardsChanged: resetList() + onVisibleChanged: if (!visible) resetList() + Component.onDestruction: resetList() + Component.onCompleted: resetList() +} diff --git a/atomic_defi_design/Dex/Addressbook/AssetFromStandardSelector.qml b/atomic_defi_design/Dex/Addressbook/AssetFromStandardSelector.qml new file mode 100644 index 0000000000..26a103de95 --- /dev/null +++ b/atomic_defi_design/Dex/Addressbook/AssetFromStandardSelector.qml @@ -0,0 +1,108 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.3 + +import Dex.Components 1.0 as Dex +import Dex.Themes 1.0 as Dex +import "../Constants" as Dex + +Dex.MultipageModal +{ + id: root + + property string standard + + signal selected(var assetTicker) + + width: 560 + + Component.onDestruction: + { + Dex.API.app.portfolio_pg.global_cfg_mdl.all_qrc20_proxy.setFilterFixedString("") + Dex.API.app.portfolio_pg.global_cfg_mdl.all_erc20_proxy.setFilterFixedString("") + Dex.API.app.portfolio_pg.global_cfg_mdl.all_bep20_proxy.setFilterFixedString("") + Dex.API.app.portfolio_pg.global_cfg_mdl.all_smartchains_proxy.setFilterFixedString("") + } + + Dex.MultipageModalContent + { + titleText: qsTr("Choose a valid ") + standard + qsTr(" asset") + contentSpacing: 8 + + Dex.SearchField + { + Layout.fillWidth: true + Layout.preferredHeight: 30 + textField.placeholderText: qsTr("Search an asset") + textField.onTextChanged: + { + switch (standard) + { + case "QRC-20": Dex.API.app.portfolio_pg.global_cfg_mdl.all_qrc20_proxy.setFilterFixedString(textField.text) + break; + case "ERC-20": Dex.API.app.portfolio_pg.global_cfg_mdl.all_erc20_proxy.setFilterFixedString(textField.text) + break; + case "BEP-20": Dex.API.app.portfolio_pg.global_cfg_mdl.all_bep20_proxy.setFilterFixedString(textField.text) + break; + default: Dex.API.app.portfolio_pg.global_cfg_mdl.all_smartchains_proxy.setFilterFixedString(textField.text) + break; + } + } + } + + Dex.ListView + { + id: list + + Layout.fillWidth: true + Layout.maximumHeight: 500 + + model: standard == "QRC-20" ? Dex.API.app.portfolio_pg.global_cfg_mdl.all_qrc20_proxy : + standard == "ERC-20" ? Dex.API.app.portfolio_pg.global_cfg_mdl.all_erc20_proxy : + standard == "BEP-20" ? Dex.API.app.portfolio_pg.global_cfg_mdl.all_bep20_proxy : + Dex.API.app.portfolio_pg.global_cfg_mdl.all_smartchains_proxy + + spacing: 8 + + delegate: Item + { + width: list.width + height: 40 + + Dex.Rectangle + { + anchors.fill: parent + color: mouseArea.containsMouse ? Dex.CurrentTheme.buttonColorHovered : "transparent" + } + + AssetRow + { + id: assetRow + height: parent.height + ticker: model.ticker + type: model.type + name: model.name + } + + Dex.Text + { + visible: !model.enabled + anchors.left: assetRow.right + anchors.leftMargin: 6 + anchors.verticalCenter: parent.verticalCenter + text: qsTr("Disabled") + color: Dex.CurrentTheme.warningColor + font: Dex.DexTypo.caption + } + + Dex.MouseArea + { + id: mouseArea + + anchors.fill: parent + hoverEnabled: true + onClicked: root.selected(model.ticker) + } + } + } + } +} diff --git a/atomic_defi_design/Dex/Addressbook/AssetRow.qml b/atomic_defi_design/Dex/Addressbook/AssetRow.qml new file mode 100644 index 0000000000..12a4ee31d6 --- /dev/null +++ b/atomic_defi_design/Dex/Addressbook/AssetRow.qml @@ -0,0 +1,35 @@ +import QtQuick 2.12 + +import Dex.Components 1.0 as Dex +import "../Constants" as Dex + +Row +{ + property string ticker + property string name + property string type + + spacing: 10 + + Dex.Image + { + width: 25 + height: 25 + anchors.verticalCenter: parent.verticalCenter + source: Dex.General.coinIcon(ticker) + } + + Dex.Text + { + anchors.verticalCenter: parent.verticalCenter + text: name + } + + Dex.Text + { + anchors.verticalCenter: parent.verticalCenter + text: type + color: Dex.Style.getCoinTypeColor(type) + font: Dex.DexTypo.overLine + } +} diff --git a/atomic_defi_design/Dex/Addressbook/EditContactModal.qml b/atomic_defi_design/Dex/Addressbook/EditContactModal.qml new file mode 100644 index 0000000000..22993be058 --- /dev/null +++ b/atomic_defi_design/Dex/Addressbook/EditContactModal.qml @@ -0,0 +1,314 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.15 + +import Qaterial 1.0 as Qaterial + +import Dex.Themes 1.0 as Dex +import Dex.Components 1.0 as Dex +import "../Constants" as Dex + +Dex.MultipageModal +{ + id: root + + property var contactModel: { "name": "", "categories": [] } + + Dex.MultipageModalContent + { + titleText: qsTr("Edit contact") + titleTopMargin: 0 + titleAlignment: Qt.AlignHCenter + contentSpacing: 24 + + Dex.TextFieldWithTitle + { + id: contactNameInput + title: qsTr("Contact name") + field.placeholderText: qsTr("Enter a contact name") + field.text: contactModel.name + field.onTextChanged: if (field.text.length > 30) field.text = field.text.substring(0, 30) + } + + Column + { + id: addressList + property bool contactAddAddressMode: false + + Layout.fillWidth: true + spacing: 18 + + Dex.Text + { + text: qsTr("Address list") + } + + Dex.ListView + { + visible: !addressList.contactAddAddressMode + model: contactModel.proxyFilter + spacing: 10 + height: contentHeight > 190 ? 190 : contentHeight + width: parent.width + + delegate: Dex.MouseArea + { + id: addressRowMouseArea + height: 82 + width: addressList.width - 10 + hoverEnabled: true + + Dex.Rectangle + { + visible: parent.containsMouse + anchors.fill: parent + radius: 17 + color: Dex.CurrentTheme.accentColor + } + + Item + { + anchors.fill: parent + anchors.verticalCenter: parent.verticalCenter + anchors.margins: 10 + + ColumnLayout + { + property var coinInfo: Dex.API.app.portfolio_pg.global_cfg_mdl.get_coin_info(address_type) + + Row + { + spacing: 10 + Dex.Image + { + anchors.verticalCenter: parent.verticalCenter + width: 25 + height: 25 + source: Dex.General.coinIcon(address_type.toLowerCase()) + } + + Dex.Text + { + anchors.verticalCenter: parent.verticalCenter + text: address_type + } + + Dex.Text + { + anchors.verticalCenter: parent.verticalCenter + text: parent.parent.coinInfo.type + color: Dex.Style.getCoinTypeColor(parent.parent.coinInfo.type) + font: Dex.DexTypo.overLine + } + + Dex.Button + { + visible: addressRowMouseArea.containsMouse + anchors.verticalCenter: parent.verticalCenter + width: 9 + height: 9 + color: "transparent" + iconSource: Qaterial.Icons.close + onClicked: contactModel.removeAddressEntry(address_type, address_key) + } + } + + Dex.Text + { + Layout.leftMargin: 36 + Layout.maximumWidth: 330 + text: address_key + font: Dex.DexTypo.caption + elide: Text.ElideRight + } + + Dex.Text + { + Layout.leftMargin: 36 + Layout.maximumWidth: 330 + text: address_value + font: Dex.DexTypo.caption + elide: Text.ElideRight + + Dex.Button + { + width: 18 + height: 20 + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.right + anchors.leftMargin: 3 + color: "transparent" + iconSource: Qaterial.Icons.contentCopy + + onClicked: + { + Dex.API.qt_utilities.copy_text_to_clipboard(address_value) + app.notifyCopy(qsTr("Address Book"), qsTr("address copied to clipboard")) + } + } + } + } + + Row + { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + spacing: 20 + + Dex.ClickableText + { + anchors.verticalCenter: parent.verticalCenter + visible: addressRowMouseArea.containsMouse + text: qsTr("Edit") + font.underline: true + onClicked: + { + addAddressForm.editionMode = true + addAddressForm.addressType = address_type + addAddressForm.addressKey = address_key + addAddressForm.addressValue = address_value + addressList.contactAddAddressMode = true + } + } + + Dex.Button + { + anchors.verticalCenter: parent.verticalCenter + width: 37 + height: 37 + radius: 18.5 + visible: addressRowMouseArea.containsMouse + iconSource: Qaterial.Icons.sendOutline + onClicked: + { + trySend(address_value, address_type) + } + } + } + } + } + } + + Dex.Button + { + visible: !addressList.contactAddAddressMode + anchors.horizontalCenter: parent.horizontalCenter + text: qsTr("+ Add Address") + width: 211 + height: 38 + radius: 18 + onClicked: addressList.contactAddAddressMode = true + } + + AddAddressForm + { + id: addAddressForm + visible: addressList.contactAddAddressMode + contactModel: root.contactModel + onCancel: addressList.contactAddAddressMode = false + onAddressCreated: addressList.contactAddAddressMode = false + } + } + + Column + { + Layout.fillWidth: true + spacing: 12 + + Dex.Text + { + text: qsTr("Tags") + } + + Dex.ListView + { + width: parent.width + model: contactModel.categories + orientation: Qt.Horizontal + spacing: 4 + delegate: Dex.MouseArea + { + width: tagBg.width + tagRemoveBut.width + 2 + height: tagBg.height + hoverEnabled: true + + Dex.Rectangle + { + 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 + anchors.centerIn: parent + text: modelData + color: "white" + } + } + + Dex.Button + { + id: tagRemoveBut + visible: parent.containsMouse + anchors.left: tagBg.right + anchors.leftMargin: 2 + anchors.verticalCenter: parent.verticalCenter + width: 16 + height: 16 + color: "transparent" + iconSource: Qaterial.Icons.close + onClicked: contactModel.removeCategory(modelData) + } + } + } + + Dex.Button + { + iconSource: Qaterial.Icons.plus + text: qsTr("Add tag") + font: Dex.DexTypo.body2 + color: "transparent" + onClicked: addTagPopup.open() + + AddTagPopup + { + y: -10 + x: parent.width + 10 + id: addTagPopup + } + } + } + + footer: + [ + Dex.CancelButton + { + Layout.preferredWidth: 199 + Layout.preferredHeight: 48 + radius: 18 + text: qsTr("Cancel Updates") + onClicked: root.close() + }, + + Item { Layout.fillWidth: true }, + + Dex.GradientButton + { + Layout.preferredWidth: 199 + Layout.preferredHeight: 48 + radius: 18 + text: qsTr("Save Updates") + onClicked: + { + contactModel.name = contactNameInput.field.text + contactModel.save() + root.close() + } + } + ] + } +} diff --git a/atomic_defi_design/Dex/Addressbook/EnableAssetModal.qml b/atomic_defi_design/Dex/Addressbook/EnableAssetModal.qml new file mode 100644 index 0000000000..d8776239ac --- /dev/null +++ b/atomic_defi_design/Dex/Addressbook/EnableAssetModal.qml @@ -0,0 +1,46 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 + +import "../Constants" as Dex +import Dex.Components 1.0 as Dex + +Dex.MultipageModal +{ + property string assetTicker + + Dex.MultipageModalContent + { + Layout.fillWidth: true + titleText: qsTr("Enable " + assetTicker) + + Dex.Text + { + Layout.fillWidth: true + text: qsTr("The selected address belongs to a disabled asset, you need to enabled it before sending.") + } + + footer: + [ + // Enable button + Dex.Button + { + text: qsTr("Enable") + + onClicked: + { + Dex.API.app.enable_coin(assetTicker) + close() + } + }, + + // Cancel button + Dex.CancelButton + { + Layout.rightMargin: 5 + text: qsTr("Cancel") + + onClicked: close() + } + ] + } +} diff --git a/atomic_defi_design/Dex/Addressbook/Main.qml b/atomic_defi_design/Dex/Addressbook/Main.qml new file mode 100644 index 0000000000..fba4df4df4 --- /dev/null +++ b/atomic_defi_design/Dex/Addressbook/Main.qml @@ -0,0 +1,419 @@ +// Qt Imports +import QtQuick 2.15 +import QtQuick.Layouts 1.15 + +import Qaterial 1.0 as Qaterial + +// Project Imports +import Dex.Components 1.0 as Dex +import "../Components" as Dex +import Dex.Themes 1.0 as Dex +import "../Constants" as Dex +import "../Wallet" as Wallet + +Item +{ + function trySend(address, type) + { + // Checks if the selected address type represents an asset standard instead of an asset. + if (Dex.API.app.portfolio_pg.global_cfg_mdl.is_coin_type(type)) + { + assetFromStandardSelectorLoader.address = address + assetFromStandardSelectorLoader.standard = type + assetFromStandardSelectorLoader.open() + } + + // Checks if the asset is currently enabled. + else if (!Dex.API.app.portfolio_pg.is_coin_enabled(type)) + { + enabledAssetModalLoader.assetTicker = type; + enabledAssetModalLoader.open() + } + + // If the coin is enabled, opens the send modal. + else + { + if (assetFromStandardSelectorLoader.visible) + assetFromStandardSelectorLoader.close() + Dex.API.app.wallet_pg.ticker = type + sendModalLoader.address = address + sendModalLoader.open() + } + } + + ColumnLayout + { + anchors.fill: parent + anchors.margins: 30 + + spacing: 32 + + Row + { + Layout.fillWidth: true + + Column + { + width: parent.width * 0.5 + spacing: 34 + + Dex.Text + { + text: qsTr("Address Book") + font: Dex.DexTypo.head5 + } + + Dex.SearchField + { + id: searchbar + + width: 206 + height: 42 + textField.forceFocus: true + textField.placeholderText: qsTr("Search contact") + + textField.onTextChanged: Dex.API.app.addressbookPg.model.proxy.searchExp = textField.text + Component.onDestruction: Dex.API.app.addressbookPg.model.proxy.searchExp = "" + } + } + + Row + { + width: parent.width * 0.5 + layoutDirection: Qt.RightToLeft + + Dex.GradientButton + { + height: 40 + radius: 15 + text: qsTr("+ NEW CONTACT") + + onClicked: newContactPopup.open() + + NewContactPopup + { + id: newContactPopup + } + } + } + } + + // Contact table header + Row + { + Layout.fillWidth: true + Layout.topMargin: 30 + + Dex.Text + { + width: parent.width * 0.3 + text: qsTr("Name") + font: Dex.DexTypo.head8 + leftPadding: 18 + } + + Dex.Text + { + text: qsTr("Tags") + font: Dex.DexTypo.head8 + leftPadding: 18 + } + } + + // Contact table content + Dex.DefaultListView + { + id: contactTable + + function _getCurrentTagColorId() + { + if (typeof _getCurrentTagColorId.counter == 'undefined') + _getCurrentTagColorId.counter = 0 + if (_getCurrentTagColorId.counter >= Dex.CurrentTheme.addressBookTagColors.length) + _getCurrentTagColorId.counter = 0 + + return _getCurrentTagColorId.counter++ + } + + Layout.fillWidth: true + Layout.fillHeight: true + + model: Dex.API.app.addressbookPg.model.proxy + + delegate: Dex.Expandable + { + id: expandable + + padding: 10 + color: index % 2 === 0 ? Dex.CurrentTheme.innerBackgroundColor : Dex.CurrentTheme.backgroundColor + width: contactTable.width + + header: Item + { + height: 56 + width: expandable.width + + Dex.DefaultMouseArea + { + anchors.fill: parent + onClicked: expandable.isExpanded = !expandable.isExpanded + } + + Row + { + width: parent.width * 0.3 + anchors.verticalCenter: parent.verticalCenter + spacing: 12 + + Dex.UserIcon + { + anchors.verticalCenter: parent.verticalCenter + } + + Dex.Text + { + anchors.verticalCenter: parent.verticalCenter + text: modelData.name + } + + Dex.Arrow + { + anchors.verticalCenter: parent.verticalCenter + up: expandable.isExpanded + } + } + + Flow + { + anchors.verticalCenter: parent.verticalCenter + x: parent.width * 0.3 + width: parent.width * 0.57 + spacing: 17 + + Repeater + { + model: modelData.categories.slice(0, 6) + + delegate: Dex.MouseArea + { + width: tagBg.width + 2 + height: tagBg.height + onClicked: searchbar.textField.text = modelData + hoverEnabled: true + + Dex.Rectangle + { + 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 + anchors.centerIn: parent + text: modelData + color: "white" + } + } + } + } + } + + Row + { + spacing: 45 + width: edit_contact.implicitWidth + delete_contact.implicitWidth + 65 + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 20 + + Dex.ClickableText + { + id: edit_contact + anchors.verticalCenter: parent.verticalCenter + font: Dex.DexTypo.underline14 + text: qsTr("Edit") + onClicked: + { + editContactLoader.contactModel = modelData + editContactLoader.open() + } + } + + Dex.ClickableText + { + id: delete_contact + anchors.verticalCenter: parent.verticalCenter + font: Dex.DexTypo.underline14 + text: qsTr("Delete") + onClicked: removeContactPopup.open() + + RemoveContactPopup + { + id: removeContactPopup + + contactName: modelData.name + } + } + } + } + + content: Item + { + height: noAddressLabel.visible ? 50 : addressList.height + width: contactTable.width + + Dex.ListView + { + id: addressList + + visible: addressList.model.rowCount() > 0 + x: 30 + model: modelData.proxyFilter + width: parent.width - 40 + implicitHeight: contentHeight > 240 ? 240 : contentHeight + spacing: 18 + + delegate: Item + { + property var coinInfo: Dex.API.app.portfolio_pg.global_cfg_mdl.get_coin_info(address_type) + + width: addressList.width + height: 30 + + Row + { + anchors.verticalCenter: parent.verticalCenter + spacing: 10 + Dex.Image + { + anchors.verticalCenter: parent.verticalCenter + width: 25 + height: 25 + source: Dex.General.coinIcon(address_type.toLowerCase()) + } + + Dex.Text + { + anchors.verticalCenter: parent.verticalCenter + text: address_type + } + + Dex.Text + { + anchors.verticalCenter: parent.verticalCenter + text: parent.parent.coinInfo.type + color: Dex.Style.getCoinTypeColor(parent.parent.coinInfo.type) + font: Dex.DexTypo.overLine + } + } + + Row + { + x: parent.width * 0.25 + spacing: 3 + + Dex.Text + { + anchors.verticalCenter: parent.verticalCenter + text: "%1 : %2".arg(address_key).arg(address_value) + } + + + Dex.Button + { + width: 25 + height: 25 + iconSource: Qaterial.Icons.contentCopy + color: "transparent" + onClicked: + { + Dex.API.qt_utilities.copy_text_to_clipboard(address_value) + app.notifyCopy(qsTr("Address Book"), qsTr("address copied to clipboard")) + } + } + + Dex.Button + { + width: 25 + height: 25 + iconSource: Qaterial.Icons.sendOutline + color: "transparent" + onClicked: trySend(address_value, address_type) + } + } + } + } + + Dex.Text + { + id: noAddressLabel + height: 20 + x: 30 + y: 15 + visible: addressList.model.rowCount() === 0 + text: qsTr("This contact does not have any registered address.") + } + } + } + } + } + + Dex.ModalLoader + { + id: editContactLoader + + property var contactModel + + onLoaded: item.contactModel = contactModel + + sourceComponent: EditContactModal { } + } + + Dex.ModalLoader + { + id: sendModalLoader + + property string address + + onLoaded: item.address_field.text = address + + sourceComponent: Wallet.SendModal + { + address_field.enabled: false + } + } + + Dex.ModalLoader + { + id: assetFromStandardSelectorLoader + + property string standard + property string address + + onLoaded: item.standard = standard + + sourceComponent: AssetFromStandardSelector + { + onSelected: + { + trySend(assetFromStandardSelectorLoader.address, assetTicker) + } + } + } + + Dex.ModalLoader + { + id: enabledAssetModalLoader + + property string assetTicker + + onLoaded: item.assetTicker = assetTicker + + sourceComponent: EnableAssetModal { } + } +} diff --git a/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml b/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml new file mode 100644 index 0000000000..afddfffb9e --- /dev/null +++ b/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml @@ -0,0 +1,76 @@ +// Qt Imports +import QtQuick 2.15 +import QtQuick.Layouts 1.15 + +// Project Imports +import "../Components" +import "../Constants" +import Dex.Components 1.0 as Dex +import Dex.Themes 1.0 as Dex + +Dex.Popup +{ + id: root + width: parent.width < 180 ? 180 : parent.width + height: 88 + onOpened: nameField.forceActiveFocus() + onClosed: nameField.text = "" + bgColor: Dex.CurrentTheme.innerBackgroundColor + + contentItem: Column + { + id: new_contact_input + anchors.centerIn: parent + anchors.fill: parent + anchors.margins: 8 + spacing: 8 + + Dex.TextField + { + id: nameField + height: 30 + width: parent.width - 20 + anchors.horizontalCenter: parent.horizontalCenter + placeholderText: qsTr("Contact name") + + Dex.ToolTip + { + id: nameAlreadyTakenToolTip + visible: false + timeout: 3000 + contentItem: Dex.Text + { + text_value: qsTr("This contact name already exists.") + } + } + } + + DefaultButton + { + id: add_contact_btn + font: DexTypo.body2 + text: qsTr("Save") + height: 30 + anchors.horizontalCenter: parent.horizontalCenter + onClicked: + { + if (nameField.text.length === 0) + { + return + } + + var createContactResult = API.app.addressbookPg.model.addContact(nameField.text) + + if (createContactResult === false) nameAlreadyTakenToolTip.visible = true + else + { + root.close() + + let contactModelIndex = API.app.addressbookPg.model.index(API.app.addressbookPg.model.rowCount() - 1, 0) + editContactLoader.contactModel = API.app.addressbookPg.model.data(contactModelIndex, Qt.UserRole + 1) + editContactLoader.open() + } + } + } + } +} diff --git a/atomic_defi_design/Dex/Addressbook/RemoveContactPopup.qml b/atomic_defi_design/Dex/Addressbook/RemoveContactPopup.qml new file mode 100644 index 0000000000..419c5c64b4 --- /dev/null +++ b/atomic_defi_design/Dex/Addressbook/RemoveContactPopup.qml @@ -0,0 +1,51 @@ +// Qt Imports +import QtQuick 2.15 +import QtQuick.Layouts 1.15 + +// Project Imports +import "../Constants" as Dex +import Dex.Components 1.0 as Dex + +Dex.Popup +{ + id: root + + property string contactName + + width: 140 + height: 120 + + contentItem: ColumnLayout + { + spacing: 8 + width: root.width + + Dex.Text + { + Layout.fillWidth: true + text: qsTr("Do you want to remove this contact ?") + } + + Row + { + Layout.fillWidth: true + spacing: 6 + Dex.ClickableText + { + text: qsTr("Yes") + font.underline: true + onClicked: + { + Dex.API.app.addressbookPg.model.removeContact(contactName) + close() + } + } + Dex.ClickableText + { + text: qsTr("No") + font.underline: true + onClicked: close() + } + } + } +} diff --git a/atomic_defi_design/Dex/App.qml b/atomic_defi_design/Dex/App.qml new file mode 100644 index 0000000000..47b9735d40 --- /dev/null +++ b/atomic_defi_design/Dex/App.qml @@ -0,0 +1,487 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtGraphicalEffects 1.0 +import Qt.labs.settings 1.0 +import Qt.labs.platform 1.0 + +import Qaterial 1.0 as Qaterial + +import "Screens" +import "Constants" +import "Components" +import "Dashboard" +import App 1.0 +import Dex.Themes 1.0 as Dex +import "Screens/Startup" +as Startup + +DexRectangle +{ + id: app + + // This enumeration represents every possible visual state (commonly named "screen") of the application + enum ScreenType + { + Startup, // Wallets selection, login, create wallet, import wallet, etc. + Dashboard // After logged to a wallet. + } + + property string currentWalletName: API.app.wallet_mgr.wallet_default_name + property bool debug: debug_bar + 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 var _currentPage: API.app.wallet_mgr.log_status() ? App.ScreenType.Dashboard : App.ScreenType.Startup + property var _availablePages: [_startup, dashboard] + property alias pageLoader: loader + + + property alias globalGradient: globalGradient + + // Preload Chart + signal pairChanged(string base, string rel) + + + function return_to_login() { + app.notifications_list = [] + userMenu.close() + app.currentWalletName = "" + API.app.disconnect() + app.onDisconnect() + window.logged = false + logout_modal.close() + } + + function onDisconnect() + { + app.notifications_list = []; + API.app.wallet_mgr.set_log_status(false); + _currentPage = App.ScreenType.Startup; + } + + Shortcut + { + sequence: "F11" + onActivated: window.showNormal() + } + + Component + { + id: no_connection + + NoConnection + {} + } + + NotificationsModal + { + id: notifications_modal + } + + Component + { + id: _startup + Startup.Main + { + _selectedWalletName: currentWalletName + onLogged: + { + currentWalletName = walletName; + _currentPage = App.ScreenType.Dashboard; + window.logged = true + } + } + } + + Component + { + id: dashboard + + Dashboard + {} + } + + Component + { + id: dialogManager + DexDialogManager + {} + } + + Component + { + id: popupManager + PopupManager { } + } + + Loader + { + id: loader + anchors.fill: parent + sourceComponent: + { + if (!API.app.internet_checker.internet_reacheable) + return no_connection + + return _availablePages[_currentPage] + } + } + + // Error Modal + ModalLoader + { + id: error_log_modal + sourceComponent: LogModal + {} + } + + function showError(title, content) + { + if (content === undefined || content === null) return + error_log_modal.open() + error_log_modal.item.header = title + error_log_modal.item.field.text = content + } + + ModalLoader + { + id: logout_modal + sourceComponent: LogoutModal {} + } + + // Toast + ToastManager + { + id: toast + } + + // Update Modal + NewUpdateModal + { + id: newUpdateModal + visible: false + } + + UpdateInvalidChecksum + { + id: update_invalid_checksum + visible: false + } + + // Fatal Error Modal + FatalErrorModal + { + id: fatal_error_modal + visible: false + } + + // Recover funds result modal + LogModal + { + id: recoverFundsResultModal + + visible: false + + header: qsTr("Recover Funds Result") + + onClosed: field.text = "{}" + + Connections // Catches signals from orders_model. + { + target: API.app.orders_mdl + + function onRecoverFundDataChanged() + { + if (!API.app.orders_mdl.recover_fund_busy) + { + recoverFundsResultModal.field.text = General.prettifyJSON(API.app.orders_mdl.recover_fund_data) + recoverFundsResultModal.open() + } + } + } + } + + Component + { + id: alertComponent + Popup + { + id: alertPopup + + property color backgroundColor: Dex.CurrentTheme.notifPopupBackgroundColor + property color foregroundColor: Dex.CurrentTheme.notifPopupTextColor + + property string title: "Test Title" + property string subTitle: "Lorem ipsum dolor sit amet, consectetur adipis" + + property color timerColor: Dex.CurrentTheme.notifPopupTimerColor + property color timerBackgroundColor: Dex.CurrentTheme.notifPopupTimerBackgroundColor + + property string icon: Qaterial.Icons.checkCircleOutline + property real iconSize: 50 + property color iconStartColor: Dex.CurrentTheme.notifPopupIconStartColor + property color iconEndColor: Dex.CurrentTheme.notifPopupIconEndColor + + property real timeout: 3000 + + x: parent.width - width - 40 + y: 40 + width: 300 + height: col.height + 25 + + function show(data) + { + if ("backgroundColor" in data) + { + alertPopup.backgroundColor = data.backgroundColor + } + + if ("foregroundColor" in data) + { + alertPopup.foregroundColor = data.foregroundColor + } + + if ("title" in data) + { + alertPopup.title = data.title + } + + if ("subTitle" in data) + { + alertPopup.subTitle = data.subTitle + } + + if ("icon" in data) + { + alertPopup.icon = data.icon + } + + if ("timeout" in data) + { + alertPopup.timeout = data.timeout + } + + alertPopup.open() + insideRect.width = 0 + alertTimer.restart() + } + + background: Qaterial.ClipRRect + { + radius: 18 + DefaultRectangle + { + anchors.fill: parent + color: alertPopup.backgroundColor + } + + DefaultRectangle + { + width: parent.width + height: 8 + radius: 0 + border.width: 0 + color: alertPopup.timerBackgroundColor + DefaultRectangle + { + id: insideRect + width: parent.width + height: parent.height + radius: 0 + color: alertPopup.timerColor + border.width: 0 + Behavior on width + { + NumberAnimation + { + duration: alertPopup.timeout + } + } + } + } + } + + Timer + { + id: alertTimer + interval: alertPopup.timeout + running: areaAlert.containsMouse ? false : true + onTriggered: alertPopup.close() + } + + RowLayout + { + anchors.fill: parent + Item + { + Layout.fillHeight: true + width: 60 + Qaterial.Icon + { + icon: alertPopup.icon + size: alertPopup.iconSize + anchors.centerIn: parent + color: alertPopup.foregroundColor + + LinearGradient + { + source: parent + GradientStop + { + position: 0 + color: alertPopup.iconStartColor + } + GradientStop + { + position: 0.9311 + color: alertPopup.iconEndColor + } + } + } + } + Item + { + Layout.fillWidth: true + Layout.fillHeight: true + Column + { + id: col + width: parent.width + anchors.verticalCenter: parent.verticalCenter + spacing: 6 + + DexLabel + { + text: alertPopup.title + color: alertPopup.foregroundColor + font: DexTypo.head6 + } + + DexLabel + { + text: alertPopup.subTitle + color: alertPopup.foregroundColor + font: DexTypo.subtitle1 + wrapMode: DexLabel.Wrap + width: parent.width - 10 + opacity: .6 + } + } + } + } + DexMouseArea + { + id: areaAlert + hoverEnabled: true + anchors.fill: parent + onClicked: alertPopup.close() + } + } + } + + function notifyCopy(title, subTitle) + { + app.notify( + { + title: title, + subTitle: subTitle, + icon: Qaterial.Icons.contentCopy, + iconSize: 35 + }); + } + + function notify(data) + { + let c = alertComponent.createObject(window); + c.show(data); + } + + Settings + { + id: atomic_settings2 + fileName: atomic_cfg_file + } + + QtObject + { + id: _font + property real fontDensity: DexTypo.fontDensity + property string fontFamily: DexTypo.fontFamily + } + + Settings + { + id: ui_font_settings + property alias fontDensity: _font.fontDensity + property alias fontFamily: _font.fontFamily + } + + function loadTheme() + { + atomic_settings2.sync(); + let current = atomic_settings2.value("CurrentTheme"); + Dex.CurrentTheme.loadFromFilesystem(current); + } + + function showDialog(data) + { + let dialog = popupManager.createObject(window, data) + for (var i in data) + { + if (i.startsWith('on')) eval('dialog.%1.connect(data[i])'.arg(i)); + } + dialog.open() + return dialog + } + + function getText(data) + { + data['getText'] = true; + return showDialog(data); + } + + Component.onCompleted: + { + loadTheme() + if(API.app.wallet_mgr.log_status()) + { + window.logged = true + } + } + + Timer + { + interval: 5000 + repeat: true + running: false + onTriggered: loadTheme() + } + + Gradient + { + id: globalGradient + GradientStop + { + position: .80 + color: DexTheme.contentColorTop + } + GradientStop + { + position: 1 + color: 'transparent' + } + } + + Shortcut + { + sequence: "Ctrl+R" + onActivated: loadTheme() + } + + color: Dex.CurrentTheme.backgroundColor + radius: 0 + border.width: 0 + border.color: 'transparent' +} diff --git a/atomic_defi_design/qml/Components/AddressField.qml b/atomic_defi_design/Dex/Components/AddressField.qml similarity index 100% rename from atomic_defi_design/qml/Components/AddressField.qml rename to atomic_defi_design/Dex/Components/AddressField.qml diff --git a/atomic_defi_design/Dex/Components/AddressFieldWithTitle.qml b/atomic_defi_design/Dex/Components/AddressFieldWithTitle.qml new file mode 100644 index 0000000000..78e9a02717 --- /dev/null +++ b/atomic_defi_design/Dex/Components/AddressFieldWithTitle.qml @@ -0,0 +1,13 @@ +import QtQuick 2.15 + +TextFieldWithTitle { + readonly property int max_length: 60 + + + field.onTextChanged: { + field.text = field.text.trim() + if (field.text.length > max_length) { + field.text = field.text.substring(0, max_length) + } + } +} diff --git a/atomic_defi_design/Dex/Components/AmountField.qml b/atomic_defi_design/Dex/Components/AmountField.qml new file mode 100644 index 0000000000..1d280a8bc6 --- /dev/null +++ b/atomic_defi_design/Dex/Components/AmountField.qml @@ -0,0 +1,9 @@ +import QtQuick 2.15 + +DefaultTextField +{ + validator: RegExpValidator + { + regExp: /(0|([1-9][0-9]*))(\.[0-9]{1,8})?/ + } +} diff --git a/atomic_defi_design/qml/Components/AmountFieldWithInfo.qml b/atomic_defi_design/Dex/Components/AmountFieldWithInfo.qml similarity index 95% rename from atomic_defi_design/qml/Components/AmountFieldWithInfo.qml rename to atomic_defi_design/Dex/Components/AmountFieldWithInfo.qml index 7d753dd2df..a27ab941f6 100644 --- a/atomic_defi_design/qml/Components/AmountFieldWithInfo.qml +++ b/atomic_defi_design/Dex/Components/AmountFieldWithInfo.qml @@ -1,5 +1,6 @@ import QtQuick 2.15 import "../Constants" +import App 1.0 TextFieldWithTitle { id: root diff --git a/atomic_defi_design/Dex/Components/AmountIntField.qml b/atomic_defi_design/Dex/Components/AmountIntField.qml new file mode 100644 index 0000000000..e61b143b7e --- /dev/null +++ b/atomic_defi_design/Dex/Components/AmountIntField.qml @@ -0,0 +1,9 @@ +import QtQuick 2.15 + +DefaultTextField +{ + validator: RegExpValidator + { + regExp: /[0-9]+/ + } +} diff --git a/atomic_defi_design/Dex/Components/AnimatedRectangle.qml b/atomic_defi_design/Dex/Components/AnimatedRectangle.qml new file mode 100644 index 0000000000..d2df414c53 --- /dev/null +++ b/atomic_defi_design/Dex/Components/AnimatedRectangle.qml @@ -0,0 +1,12 @@ +import QtQuick 2.15 +import "../Constants" +import App 1.0 +import Dex.Themes 1.0 as Dex + +Rectangle +{ + property bool colorAnimation: true + Behavior on color { ColorAnimation { duration: colorAnimation ? Style.animationDuration : 0; } } + + color: Dex.CurrentTheme.backgroundColor +} diff --git a/atomic_defi_design/Dex/Components/Arrow.qml b/atomic_defi_design/Dex/Components/Arrow.qml new file mode 100644 index 0000000000..827d13e558 --- /dev/null +++ b/atomic_defi_design/Dex/Components/Arrow.qml @@ -0,0 +1,34 @@ +// Qt Imports +import QtQuick 2.15 + +// Project Imports +import "../Constants" //> General.image_path +import Dex.Themes 1.0 as Dex //> CurrentTheme + +Item { + property bool up: true + property alias color: imgOverlay.color + + width: img.width + height: img.height + + DefaultImage + { + id: img + + width: 18 + height: 10 + visible: false + source: General.image_path + "arrow_" + (up ? "up" : "down") + ".svg" + } + + DefaultColorOverlay + { + id: imgOverlay + + anchors.fill: img + source: img + color: Dex.CurrentTheme.foregroundColor + } +} + diff --git a/atomic_defi_design/qml/Components/Blank.qml b/atomic_defi_design/Dex/Components/Blank.qml similarity index 100% rename from atomic_defi_design/qml/Components/Blank.qml rename to atomic_defi_design/Dex/Components/Blank.qml 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/qml/Components/CannotEnableCoinModal.qml b/atomic_defi_design/Dex/Components/CannotEnableCoinModal.qml similarity index 88% rename from atomic_defi_design/qml/Components/CannotEnableCoinModal.qml rename to atomic_defi_design/Dex/Components/CannotEnableCoinModal.qml index 69c59d8811..dad42aa5ac 100644 --- a/atomic_defi_design/qml/Components/CannotEnableCoinModal.qml +++ b/atomic_defi_design/Dex/Components/CannotEnableCoinModal.qml @@ -2,7 +2,7 @@ import QtQuick 2.12 import QtQuick.Layouts 1.15 -BasicModal +MultipageModal { property string coin_to_enable_ticker // The coin you tried to enable. property var settings_modal: setting_modal // A reference to a SettingModal object. Open when "Increase limit in settings" button is clicked. @@ -10,9 +10,9 @@ BasicModal id: root width: 600 - ModalContent + MultipageModalContent { - title: qsTr("Failed to enable %1").arg(coin_to_enable_ticker) + titleText: qsTr("Failed to enable %1").arg(coin_to_enable_ticker) DefaultText { Layout.fillWidth: true @@ -32,7 +32,7 @@ BasicModal 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 new file mode 100644 index 0000000000..cc7c3725a4 --- /dev/null +++ b/atomic_defi_design/Dex/Components/CexInfoModal.qml @@ -0,0 +1,23 @@ +// Qt Imports +import QtQuick 2.15 +import QtQuick.Layouts 1.15 + +// Project Imports +import "../Constants" +import App 1.0 + +MultipageModal { + id: root + + // Inside modal + MultipageModalContent { + titleText: General.cex_icon + " " + qsTr("Market Data") + + DefaultText { + 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 CoinGecko.') + } + } +} diff --git a/atomic_defi_design/Dex/Components/CheckEye.qml b/atomic_defi_design/Dex/Components/CheckEye.qml new file mode 100644 index 0000000000..e3bb0bca61 --- /dev/null +++ b/atomic_defi_design/Dex/Components/CheckEye.qml @@ -0,0 +1,55 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.12 + +import Qaterial 1.0 as Qaterial + +import App 1.0 +import Dex.Themes 1.0 as Dex + +Item +{ + id: control + + property alias text: _label.text + property alias iconSource: _icon.source + property var target + + width: parent.width + height: row.height + + RowLayout + { + id: row + width: parent.width - 20 + spacing: 10 + + Qaterial.ColorIcon + { + id: _icon + Layout.alignment: Qt.AlignVCenter + source: target.visible ? Qaterial.Icons.eyeOutline : Qaterial.Icons.eyeOffOutline + color: target.visible ? Dex.CurrentTheme.foregroundColor : Dex.CurrentTheme.buttonTextDisabledColor + iconSize: 17 + } + + DefaultText + { + id: _label + font.pixelSize: 15 + text: "" + color: target.visible ? Dex.CurrentTheme.foregroundColor : Dex.CurrentTheme.buttonTextDisabledColor + Layout.fillWidth: true + Layout.alignment: Qt.AlignVCenter + } + } + + DefaultMouseArea + { + anchors.fill: parent + onClicked: + { + if (target.visible) target.visible = false + else target.visible = true + } + } +} diff --git a/atomic_defi_design/qml/Components/Circle.qml b/atomic_defi_design/Dex/Components/Circle.qml similarity index 92% rename from atomic_defi_design/qml/Components/Circle.qml rename to atomic_defi_design/Dex/Components/Circle.qml index ea1ee9cd56..092dca5853 100644 --- a/atomic_defi_design/qml/Components/Circle.qml +++ b/atomic_defi_design/Dex/Components/Circle.qml @@ -1,5 +1,6 @@ import QtQuick 2.15 import "../Constants" +import App 1.0 AnimatedRectangle { id: circle diff --git a/atomic_defi_design/Dex/Components/ClickableText.qml b/atomic_defi_design/Dex/Components/ClickableText.qml new file mode 100644 index 0000000000..7c4c6e86b6 --- /dev/null +++ b/atomic_defi_design/Dex/Components/ClickableText.qml @@ -0,0 +1,31 @@ +import QtQuick 2.12 + +import Dex.Themes 1.0 as Dex + +Text +{ + id: control + + property alias hoverEnabled: _mouseArea.hoverEnabled + property alias containsMouse: _mouseArea.containsMouse + property alias containsPress: _mouseArea.containsPress + + signal clicked() + + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + color: enabled ? _mouseArea.containsPress ? + Dex.CurrentTheme.buttonTextPressedColor : _mouseArea.containsMouse ? + Dex.CurrentTheme.buttonTextHoveredColor : Dex.CurrentTheme.foregroundColor : + Dex.CurrentTheme.textDisabledColor + + MouseArea + { + id: _mouseArea + + anchors.fill: parent + hoverEnabled: true + cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor + onClicked: control.clicked() + } +} diff --git a/atomic_defi_design/qml/Components/ClipRRect.qml b/atomic_defi_design/Dex/Components/ClipRRect.qml similarity index 100% rename from atomic_defi_design/qml/Components/ClipRRect.qml rename to atomic_defi_design/Dex/Components/ClipRRect.qml diff --git a/atomic_defi_design/qml/Components/CoinMenu.qml b/atomic_defi_design/Dex/Components/CoinMenu.qml similarity index 87% rename from atomic_defi_design/qml/Components/CoinMenu.qml rename to atomic_defi_design/Dex/Components/CoinMenu.qml index e378261091..73227c6835 100644 --- a/atomic_defi_design/qml/Components/CoinMenu.qml +++ b/atomic_defi_design/Dex/Components/CoinMenu.qml @@ -2,12 +2,14 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Controls.Universal 2.15 import "../Constants" +import App 1.0 Menu { Universal.theme: Style.dark_theme ? Universal.Dark : Universal.Light Universal.accent: Style.colorQtThemeAccent Universal.foreground: Style.colorQtThemeForeground Universal.background: Style.colorQtThemeBackground + property bool can_disable; // Ugly but required hack for automatic menu width, otherwise long texts are being cut width: { @@ -27,7 +29,7 @@ Menu { id: disable_action text: qsTr("Disable %1", "TICKER").arg(ticker) onTriggered: API.app.disable_coins([ticker]) - enabled: General.canDisable(ticker) + enabled: can_disable } MenuItem { @@ -52,4 +54,11 @@ Menu { text: qsTr("Disable all assets") onTriggered: API.app.disable_coins(API.app.portfolio_pg.get_all_enabled_coins()) } + + MenuItem + { + enabled: !General.prevent_coin_disabling.running + text: qsTr("Disable 0 balance assets") + onTriggered: API.app.disable_no_balance_coins() + } } diff --git a/atomic_defi_design/Dex/Components/CoinTypeTag.qml b/atomic_defi_design/Dex/Components/CoinTypeTag.qml new file mode 100644 index 0000000000..d423956f0f --- /dev/null +++ b/atomic_defi_design/Dex/Components/CoinTypeTag.qml @@ -0,0 +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 + } +} diff --git a/atomic_defi_design/Dex/Components/ColumnHeader.qml b/atomic_defi_design/Dex/Components/ColumnHeader.qml new file mode 100644 index 0000000000..0fdcc5abd6 --- /dev/null +++ b/atomic_defi_design/Dex/Components/ColumnHeader.qml @@ -0,0 +1,82 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.12 +import "../Constants" +import App 1.0 + +Item +{ + property int sort_type + property alias header_font: title.font + property alias text: title.text_value + property alias h_align: title.horizontalAlignment + + // Click area + + DexMouseArea + { + id: click_area + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + + onClicked: + { + if(current_sort === sort_type) + { + ascending = !ascending + } + else + { + current_sort = sort_type + ascending = false + } + applyCurrentSort() + } + + RowLayout + { + width: parent.width + height: parent.height + + Item { + visible: title.horizontalAlignment != Text.AlignLeft + Layout.fillWidth: true + Layout.fillHeight: true + } + + DexLabel + { + id: title + verticalAlignment: Text.AlignVCenter + //color: Qt.lighter(DexTheme.accentColor, click_area.containsMouse ? Style.hoverLightMultiplier : 1.0) + + // Arrow icon + DefaultImage + { + id: arrow_icon + anchors.left: parent.right + anchors.leftMargin: 3 + anchors.verticalCenter: parent.verticalCenter + source: General.image_path + "arrow-" + (ascending ? "down" : "up") + ".svg" + width: title.font.pixelSize * 0.5 + visible: current_sort === sort_type + + DefaultColorOverlay + { + visible: current_sort === sort_type + anchors.fill: parent + source: arrow_icon + color: title.color + } + } + } + + + Item { + visible: title.horizontalAlignment != Text.AlignRight + Layout.fillWidth: true + Layout.fillHeight: true + } + } + } +} diff --git a/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml b/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml new file mode 100644 index 0000000000..bbd86393f1 --- /dev/null +++ b/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml @@ -0,0 +1,137 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.3 + +import Qaterial 1.0 as Qaterial + +import Dex.Themes 1.0 as Dex +import "../Constants" + +ComboBox +{ + id: control + + property int radius: 10 + property int popupWidth: width + property int popupMaxHeight: 450 + property bool popupForceMaxHeight: false + property color backgroundColor: Dex.CurrentTheme.comboBoxBackgroundColor + property color popupBackgroundColor: Dex.CurrentTheme.comboBoxBackgroundColor + property color highlightedBackgroundColor: Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor + property alias searchBar: _searchBar + property string searchBarPlaceholderText: qsTr("Search") + + background: Rectangle + { + id: bg + anchors.fill: parent + color: control.backgroundColor + radius: control.radius + } + + popup: Popup + { + id: popup + width: control.popupWidth + height: popupForceMaxHeight ? control.popupMaxHeight : Math.min(contentItem.implicitHeight, control.popupMaxHeight) + leftPadding: 0 + rightPadding: 0 + topPadding: 16 + bottomPadding: 16 + + contentItem: ColumnLayout + { + width: popup.width + height: popup.height + + SearchField + { + id: _searchBar + textField.placeholderText: searchBarPlaceholderText + Layout.fillWidth: true + Layout.leftMargin: 5 + Layout.rightMargin: 5 + Layout.preferredHeight: 40 + searchModel: control.delegateModel + textField.forceFocus: true + } + + DefaultListView + { + id: _list + Layout.fillHeight: true + model: control.popup.visible ? control.delegateModel : null + currentIndex: control.highlightedIndex + ScrollBar.vertical: ScrollBar + { + visible: _list.contentHeight > control.dropDownMaxHeight + anchors.right: _list.right + anchors.rightMargin: 2 + width: 7 + background: DefaultRectangle + { + radius: 12 + color: Dex.CurrentTheme.scrollBarBackgroundColor + } + contentItem: DefaultRectangle + { + radius: 12 + color: Dex.CurrentTheme.scrollBarIndicatorColor + } + } + } + } + + background: Rectangle + { + radius: control.radius + color: control.popupBackgroundColor + } + } + + delegate: ItemDelegate + { + id: delegate + + width: control.width + highlighted: control.highlightedIndex === index + + contentItem: DefaultText + { + width: control.width + font: DexTypo.subtitle2 + text_value: control.textRole === "" ? model.modelData : !model.modelData ? model[textRole] : model.modelData[textRole] + elide: Text.ElideRight + } + + background: Rectangle + { + anchors.fill: delegate + color: delegate.highlighted ? Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor : Dex.CurrentTheme.comboBoxBackgroundColor + } + } + + indicator: Column + { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 8 + spacing: -12 + + Qaterial.Icon + { + width: 20 + height: 20 + color: Dex.CurrentTheme.comboBoxArrowsColor + icon: Qaterial.Icons.chevronUp + } + + Qaterial.Icon + { + width: 20 + height: 20 + color: Dex.CurrentTheme.comboBoxArrowsColor + icon: Qaterial.Icons.chevronDown + } + } +} diff --git a/atomic_defi_design/qml/Components/ComboBoxWithTitle.qml b/atomic_defi_design/Dex/Components/ComboBoxWithTitle.qml similarity index 78% rename from atomic_defi_design/qml/Components/ComboBoxWithTitle.qml rename to atomic_defi_design/Dex/Components/ComboBoxWithTitle.qml index a3ba7fb491..5623f39e52 100644 --- a/atomic_defi_design/qml/Components/ComboBoxWithTitle.qml +++ b/atomic_defi_design/Dex/Components/ComboBoxWithTitle.qml @@ -1,7 +1,8 @@ import QtQuick 2.15 import QtQuick.Layouts 1.15 -ColumnLayout { +ColumnLayout +{ property alias title: title_text.text property alias field: input_field property alias model: input_field.model @@ -11,12 +12,11 @@ ColumnLayout { property alias textRole: input_field.textRole property alias valueRole: input_field.valueRole - TitleText { - id: title_text - } + TitleText { id: title_text } - DexComboBox { + DexComboBox + { id: input_field - Layout.fillWidth: true + Layout.preferredWidth: 300 } } diff --git a/atomic_defi_design/Dex/Components/ComponentWithTitle.qml b/atomic_defi_design/Dex/Components/ComponentWithTitle.qml new file mode 100644 index 0000000000..c36298acd9 --- /dev/null +++ b/atomic_defi_design/Dex/Components/ComponentWithTitle.qml @@ -0,0 +1,51 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 + +import App 1.0 +import "../Constants" +import Dex.Themes 1.0 as Dex + +ColumnLayout +{ + property alias title: title.text + property alias title_font: title.font + property bool expandable: false + property bool expanded: false + readonly property bool show_content: !expandable || expanded + + RowLayout + { + id: rowLayout + Layout.fillWidth: true + + Arrow + { + id: arrowIco + + visible: expandable + + Layout.alignment: Qt.AlignVCenter + + up: expanded + color: mouseArea.containsMouse ? Dex.CurrentTheme.foregroundColor3 : Dex.CurrentTheme.foregroundColor2 + } + + TitleText + { + id: title + Layout.fillWidth: true + + color: Dex.CurrentTheme.foregroundColor2 + + DefaultMouseArea + { + id: mouseArea + enabled: expandable + anchors.fill: parent + anchors.leftMargin: -arrowIco.width - rowLayout.spacing + hoverEnabled: true + onClicked: expanded = !expanded + } + } + } +} diff --git a/atomic_defi_design/qml/Components/CopyFieldButton.qml b/atomic_defi_design/Dex/Components/CopyFieldButton.qml similarity index 98% rename from atomic_defi_design/qml/Components/CopyFieldButton.qml rename to atomic_defi_design/Dex/Components/CopyFieldButton.qml index f21e242477..4d6fa14c38 100644 --- a/atomic_defi_design/qml/Components/CopyFieldButton.qml +++ b/atomic_defi_design/Dex/Components/CopyFieldButton.qml @@ -1,5 +1,6 @@ import QtQuick 2.15 import "../Constants" +import App 1.0 // Copy button DefaultImage { diff --git a/atomic_defi_design/Dex/Components/DangerButton.qml b/atomic_defi_design/Dex/Components/DangerButton.qml new file mode 100644 index 0000000000..51246b694f --- /dev/null +++ b/atomic_defi_design/Dex/Components/DangerButton.qml @@ -0,0 +1,5 @@ +import QtQuick 2.15 + +DefaultButton +{ +} diff --git a/atomic_defi_design/Dex/Components/DatePicker.qml b/atomic_defi_design/Dex/Components/DatePicker.qml new file mode 100644 index 0000000000..c0ce19742e --- /dev/null +++ b/atomic_defi_design/Dex/Components/DatePicker.qml @@ -0,0 +1,80 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 + +import Qaterial 1.0 as Qaterial + +import Dex.Themes 1.0 as Dex +import "../Constants" + +DefaultMouseArea +{ + id: control + + property alias titleText: title.text + property alias minimumDate: calendar.minimumDate + property alias maximumDate: calendar.maximumDate + property alias selectedDate: calendar.selectedDate + + signal accepted() + + width: 100 + height: column.height + + onClicked: modal.open() + + Column + { + id: column + width: parent.width + + DefaultText + { + id: title + text: qsTr("Date") + font: DexTypo.overLine + color: Dex.CurrentTheme.foregroundColor2 + } + + RowLayout + { + width: parent.width + + DefaultText + { + id: label + text: selectedDate.toLocaleDateString(Locale.ShortFormat, "yyyy-MM-dd") + font: DexTypo.caption + } + Item { Layout.fillWidth: true } + DefaultImage + { + Layout.preferredWidth: 25 + Layout.preferredHeight: 25 + source: Qaterial.Icons.calendarBlank + + DefaultColorOverlay + { + source: parent + anchors.fill: parent + color: Dex.CurrentTheme.foregroundColor2 + } + } + } + } + + DefaultModal + { + id: modal + width: 300 + height: 450 + verticalPadding: 0 + horizontalPadding: 0 + + DefaultCalendar + { + id: calendar + anchors.fill: parent + onSelectedDateChanged: {modal.close(); control.accepted()} + } + } +} diff --git a/atomic_defi_design/Dex/Components/DefaultAlertIcon.qml b/atomic_defi_design/Dex/Components/DefaultAlertIcon.qml new file mode 100644 index 0000000000..b980ab0c94 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultAlertIcon.qml @@ -0,0 +1,34 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import Qaterial 1.0 as Qaterial +import "../Constants" as Constants +import App 1.0 + + +DefaultImage +{ + property int iconSize: 24 + property string tooltipText: "" + + 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 + + DexMouseArea + { + id: alertArea + anchors.fill: parent + hoverEnabled: true + } + + DefaultTooltip + { + visible: alertArea.containsMouse && tooltipText != "" + text: tooltipText + } +} \ No newline at end of file diff --git a/atomic_defi_design/qml/Components/DefaultAnimatedImage.qml b/atomic_defi_design/Dex/Components/DefaultAnimatedImage.qml similarity index 100% rename from atomic_defi_design/qml/Components/DefaultAnimatedImage.qml rename to atomic_defi_design/Dex/Components/DefaultAnimatedImage.qml diff --git a/atomic_defi_design/Dex/Components/DefaultBusyIndicator.qml b/atomic_defi_design/Dex/Components/DefaultBusyIndicator.qml new file mode 100644 index 0000000000..73992fc6dc --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultBusyIndicator.qml @@ -0,0 +1,7 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Universal 2.15 +import "../Constants" +import App 1.0 + +DexBusyIndicator {} diff --git a/atomic_defi_design/Dex/Components/DefaultButton.qml b/atomic_defi_design/Dex/Components/DefaultButton.qml new file mode 100644 index 0000000000..458a254905 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultButton.qml @@ -0,0 +1,7 @@ +import QtQuick 2.15 +import "../Constants" +import App 1.0 + +// Add button +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 new file mode 100644 index 0000000000..54c708c022 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultCalendar.qml @@ -0,0 +1,136 @@ +import QtQuick 2.0 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +import Qaterial 1.0 as Qaterial + +import Dex.Themes 1.0 as Dex + +Calendar +{ + width: 300 + height: 450 + style: CalendarStyle + { + gridColor: "transparent" + gridVisible: false + + background: DefaultRectangle + { + color: Dex.CurrentTheme.floatingBackgroundColor + radius: 18 + } + + navigationBar: DefaultRectangle + { + height: 50 + color: Dex.CurrentTheme.floatingBackgroundColor + radius: 18 + + DefaultButton + { + id: previousYear + width: previousMonth.width + height: width + anchors.left: parent.left + anchors.leftMargin: 5 + anchors.verticalCenter: parent.verticalCenter + iconSource: Qaterial.Icons.arrowLeft + onClicked: control.showPreviousYear() + } + + DefaultButton + { + id: previousMonth + width: parent.height - 14 + height: width + anchors.left: previousYear.right + anchors.leftMargin: 2 + anchors.verticalCenter: parent.verticalCenter + iconSource: Qaterial.Icons.arrowLeft + onClicked: control.showPreviousMonth() + } + + DefaultText + { + id: dateText + text: styleData.title + elide: Text.ElideRight + horizontalAlignment: Text.AlignHCenter + anchors.verticalCenter: parent.verticalCenter + anchors.left: previousMonth.right + anchors.leftMargin: 2 + anchors.right: nextMonth.left + anchors.rightMargin: 2 + } + + DefaultButton + { + id: nextYear + width: nextMonth.width + height: width + anchors.right: parent.right + anchors.rightMargin: 5 + anchors.verticalCenter: parent.verticalCenter + iconSource: Qaterial.Icons.arrowRight + onClicked: control.showNextYear() + } + + DefaultButton + { + id: nextMonth + width: parent.height - 14 + height: width + anchors.verticalCenter: parent.verticalCenter + anchors.right: nextYear.left + anchors.rightMargin: 2 + iconSource: Qaterial.Icons.arrowRight + onClicked: control.showNextMonth() + } + } + + dayOfWeekDelegate: DefaultRectangle + { + color: "transparent" + implicitHeight: 20 + Label + { + text: control.locale.dayName(styleData.dayOfWeek, control.dayOfWeekFormat) + anchors.centerIn: parent + color: Dex.CurrentTheme.foregroundColor + } + } + + dayDelegate: DefaultRectangle + { + anchors.fill: parent + 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 + readonly property color hoveredDateColor: Dex.CurrentTheme.buttonColorHovered + readonly property color selectedDateColor: Dex.CurrentTheme.buttonColorPressed + readonly property color selectedDateTextColor: Dex.CurrentTheme.foregroundColor + readonly property color differentMonthDateTextColor: Dex.CurrentTheme.foregroundColor3 + readonly property color invalidDateColor: Dex.CurrentTheme.textDisabledColor + DefaultText + { + id: dayDelegateText + text: styleData.hasOwnProperty('date') ? styleData.date.getDate() : "" + anchors.centerIn: parent + horizontalAlignment: Text.AlignRight + font.pixelSize: Math.min(parent.height/3, parent.width/3) + color: { + var theColor = invalidDateColor; + if (styleData.valid) { + // Date is within the valid range. + theColor = styleData.visibleMonth ? sameMonthDateTextColor : differentMonthDateTextColor; + if (styleData.selected) + theColor = selectedDateTextColor; + } + theColor; + } + } + } + } +} diff --git a/atomic_defi_design/Dex/Components/DefaultCheckBox.qml b/atomic_defi_design/Dex/Components/DefaultCheckBox.qml new file mode 100644 index 0000000000..7c51a5d02e --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultCheckBox.qml @@ -0,0 +1,6 @@ +import QtQuick.Controls 2.15 +import QtQuick.Controls.Universal 2.15 +import "../Constants" +import App 1.0 + +DexCheckBox { } diff --git a/atomic_defi_design/qml/Components/DefaultColorOverlay.qml b/atomic_defi_design/Dex/Components/DefaultColorOverlay.qml similarity index 91% rename from atomic_defi_design/qml/Components/DefaultColorOverlay.qml rename to atomic_defi_design/Dex/Components/DefaultColorOverlay.qml index fec6a3e72d..387a84bc0c 100644 --- a/atomic_defi_design/qml/Components/DefaultColorOverlay.qml +++ b/atomic_defi_design/Dex/Components/DefaultColorOverlay.qml @@ -1,6 +1,7 @@ import QtQuick 2.15 import QtGraphicalEffects 1.0 import "../Constants" +import App 1.0 ColorOverlay { Behavior on color { ColorAnimation { duration: Style.animationDuration } } diff --git a/atomic_defi_design/Dex/Components/DefaultComboBox.qml b/atomic_defi_design/Dex/Components/DefaultComboBox.qml new file mode 100644 index 0000000000..1fef6bc0c5 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultComboBox.qml @@ -0,0 +1,3 @@ +import QtQuick 2.15 + +DexComboBox { } \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DefaultCopyIcon.qml b/atomic_defi_design/Dex/Components/DefaultCopyIcon.qml new file mode 100644 index 0000000000..4c52187303 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultCopyIcon.qml @@ -0,0 +1,30 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import Qaterial 1.0 as Qaterial +import App 1.0 + +Qaterial.Icon +{ + property int iconSize: 14 + property string copyText: "" + property string notifyTitle: "" + property string notifyMsg: qsTr("copied to clipboard") + + Layout.alignment: Qt.AlignVCenter + + size: iconSize + icon: Qaterial.Icons.contentCopy + color: copyArea.containsMouse ? Style.colorText2 : DexTheme.foregroundColor + + DexMouseArea + { + id: copyArea + anchors.fill: parent + hoverEnabled: true + onClicked: + { + Qaterial.Clipboard.text = copyText + app.notifyCopy(notifyTitle, notifyMsg) + } + } +} \ No newline at end of file diff --git a/atomic_defi_design/qml/Components/DefaultFlickable.qml b/atomic_defi_design/Dex/Components/DefaultFlickable.qml similarity index 95% rename from atomic_defi_design/qml/Components/DefaultFlickable.qml rename to atomic_defi_design/Dex/Components/DefaultFlickable.qml index 4fb99fe9fc..c4b68109aa 100644 --- a/atomic_defi_design/qml/Components/DefaultFlickable.qml +++ b/atomic_defi_design/Dex/Components/DefaultFlickable.qml @@ -1,7 +1,8 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 -Flickable { +Flickable +{ id: root property bool scrollbar_visible: contentHeight > height diff --git a/atomic_defi_design/Dex/Components/DefaultImage.qml b/atomic_defi_design/Dex/Components/DefaultImage.qml new file mode 100644 index 0000000000..09d4a0cb39 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultImage.qml @@ -0,0 +1,3 @@ +import QtQuick 2.15 + +DexImage {} diff --git a/atomic_defi_design/Dex/Components/DefaultInfoTrigger.qml b/atomic_defi_design/Dex/Components/DefaultInfoTrigger.qml new file mode 100644 index 0000000000..0fd98f8e73 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultInfoTrigger.qml @@ -0,0 +1,9 @@ +import QtQuick 2.15 + +DefaultMouseArea { + id: mouse_area + property bool no_default: true + property var triggerModal + anchors.fill: parent + onClicked: no_default ? triggerModal.open() : () => {} +} diff --git a/atomic_defi_design/qml/Components/DefaultInnerShadow.qml b/atomic_defi_design/Dex/Components/DefaultInnerShadow.qml similarity index 79% rename from atomic_defi_design/qml/Components/DefaultInnerShadow.qml rename to atomic_defi_design/Dex/Components/DefaultInnerShadow.qml index 499eb6b11d..fc94f9a107 100644 --- a/atomic_defi_design/qml/Components/DefaultInnerShadow.qml +++ b/atomic_defi_design/Dex/Components/DefaultInnerShadow.qml @@ -1,6 +1,7 @@ import QtQuick 2.15 import QtGraphicalEffects 1.0 import "../Constants" +import App 1.0 InnerShadow { cached: false @@ -8,6 +9,6 @@ InnerShadow { verticalOffset: 0.7 radius: 13 samples: 32 - color: theme.innerShadowColor + color: DexTheme.innerShadowColor smooth: true } diff --git a/atomic_defi_design/Dex/Components/DefaultLinkIcon.qml b/atomic_defi_design/Dex/Components/DefaultLinkIcon.qml new file mode 100644 index 0000000000..845777d965 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultLinkIcon.qml @@ -0,0 +1,25 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import Qaterial 1.0 as Qaterial +import App 1.0 + + +Qaterial.Icon +{ + property int iconSize: 14 + property string linkURL: "" + + Layout.alignment: Qt.AlignVCenter + + size: iconSize + icon: Qaterial.Icons.linkVariant + color: linkArea.containsMouse ? Style.colorText2 : DexTheme.foregroundColor + + DexMouseArea + { + id: linkArea + anchors.fill: parent + hoverEnabled: true + onClicked: Qt.openUrlExternally(linkURL) + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DefaultListView.qml b/atomic_defi_design/Dex/Components/DefaultListView.qml new file mode 100644 index 0000000000..107ae3076a --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultListView.qml @@ -0,0 +1,8 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../Constants" +import App 1.0 + +DexListView +{} diff --git a/atomic_defi_design/qml/Components/DefaultLoader.qml b/atomic_defi_design/Dex/Components/DefaultLoader.qml similarity index 100% rename from atomic_defi_design/qml/Components/DefaultLoader.qml rename to atomic_defi_design/Dex/Components/DefaultLoader.qml diff --git a/atomic_defi_design/Dex/Components/DefaultModal.qml b/atomic_defi_design/Dex/Components/DefaultModal.qml new file mode 100644 index 0000000000..8aa3f955bc --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultModal.qml @@ -0,0 +1,45 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../Constants" +import App 1.0 +import Dex.Themes 1.0 as Dex + +Popup +{ + id: root + + property int radius: 18 + + anchors.centerIn: Overlay.overlay + horizontalPadding: 88 + verticalPadding: 52 + + modal: true + focus: true + + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside + + background: DefaultRectangle { radius: root.radius; color: Dex.CurrentTheme.floatingBackgroundColor } + + Overlay.modal: DefaultRectangle { color: "#AA000000" } + + // Fade in animation + onVisibleChanged: + { + if (visible) + { + opacity = 0 + fadeAnimation.start() + } + } + + NumberAnimation + { + id: fadeAnimation + target: root + property: "opacity" + duration: Style.animationDuration + to: 1 + } +} diff --git a/atomic_defi_design/Dex/Components/DefaultMouseArea.qml b/atomic_defi_design/Dex/Components/DefaultMouseArea.qml new file mode 100644 index 0000000000..cac534d7ca --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultMouseArea.qml @@ -0,0 +1,3 @@ +import QtQuick 2.15 + +DexMouseArea {} diff --git a/atomic_defi_design/Dex/Components/DefaultPopup.qml b/atomic_defi_design/Dex/Components/DefaultPopup.qml new file mode 100644 index 0000000000..353a8557b1 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultPopup.qml @@ -0,0 +1,17 @@ +// Qt Imports +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 { color: bgColor } +} diff --git a/atomic_defi_design/Dex/Components/DefaultProgressBar.qml b/atomic_defi_design/Dex/Components/DefaultProgressBar.qml new file mode 100644 index 0000000000..ca5e1a7c3a --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultProgressBar.qml @@ -0,0 +1,69 @@ +// Qt Imports +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 + +// Project Imports +import "../Constants" as Dex +import "../Components" as Dex +import App 1.0 + +RowLayout +{ + id: root + property double label_width: 175 + property double bar_width_pct: 0 + property color bar_color: Dex.DexTheme.okColor + property alias label: _label + property alias pct_bar: _pct_bar + property alias pct_value: _pct_value + anchors.leftMargin: 10 + anchors.rightMargin: 10 + width: parent.width + height: 42 + spacing: 10 + + Dex.DexLabel + { + id: _label + font.bold: true + Layout.preferredWidth: label_width + Layout.alignment: Qt.AlignVCenter + Component.onCompleted: font.weight = Font.Bold + } + + // Progress bar + Item + { + Layout.alignment: Qt.AlignVCenter + Layout.fillWidth: true + height: 5 + + Rectangle + { + id: bg_bar + anchors.fill: parent + radius: 5 + opacity: 0.1 + color: DexTheme.foregroundColorLightColor5 + } + + Rectangle + { + id: _pct_bar + height: parent.height + radius: 5 + width: bar_width_pct / 100 * parent.width + color: root.bar_color + } + } + + Dex.DexLabel + { + id: _pct_value + Layout.preferredWidth: 60 + text: "0.00 %" + Layout.alignment: Qt.AlignVCenter + Component.onCompleted: font.family = 'lato' + } +} diff --git a/atomic_defi_design/Dex/Components/DefaultRangeSlider.qml b/atomic_defi_design/Dex/Components/DefaultRangeSlider.qml new file mode 100644 index 0000000000..390e62c0fd --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultRangeSlider.qml @@ -0,0 +1,117 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.12 +import QtWebEngine 1.8 + +import Qaterial 1.0 as Qaterial + +import "../Exchange/Trade/" +import "../Constants/" as Constants +import Dex.Themes 1.0 as Dex + +RangeSlider +{ + id: control + + property color rangeDistanceColor: Dex.CurrentTheme.rangeSliderDistanceColor + property color rangeBackgroundColor: Dex.CurrentTheme.rangeSliderBackgroundColor + property bool firstDisabled: true + property var firstSavedValue: first.value + + property alias leftText: _left_item.text + property alias rightText: _right_item.text + + opacity: enabled ? 1 : .5 + first.value: 0.25 + second.value: .75 + + background: Rectangle + { + x: control.leftPadding + y: control.topPadding + control.availableHeight / 2 - height / 2 + implicitWidth: 200 + implicitHeight: 4 + width: control.availableWidth + height: implicitHeight + radius: 2 + color: control.rangeDistanceColor + + Rectangle + { + x: control.first.visualPosition * parent.width + width: control.second.visualPosition * parent.width - x + height: parent.height + color: control.rangeBackgroundColor + radius: 2 + } + } + + first.handle: Rectangle + { + x: control.leftPadding + control.first.visualPosition * (control.availableWidth - width) + y: control.topPadding + control.availableHeight / 2 - height / 2 + implicitWidth: 18 + implicitHeight: 18 + radius: 9 + visible: !firstDisabled + enabled: visible + gradient: Gradient + { + orientation: Qt.Horizontal + GradientStop + { + color: Dex.CurrentTheme.rangeSliderIndicatorBackgroundStartColor + position: 0 + } + GradientStop + { + color: Dex.CurrentTheme.rangeSliderIndicatorBackgroundEndColor + position: 0.6 + } + } + } + first.onValueChanged: + { + if (firstDisabled) first.value = firstSavedValue; + else firstSavedValue = first.value + } + + second.handle: Rectangle + { + x: control.leftPadding + control.second.visualPosition * (control.availableWidth - width) + y: control.topPadding + control.availableHeight / 2 - height / 2 + implicitWidth: 18 + implicitHeight: 18 + radius: 9 + gradient: Gradient + { + orientation: Qt.Horizontal + GradientStop + { + color: Dex.CurrentTheme.rangeSliderIndicatorBackgroundStartColor + position: 0 + } + GradientStop + { + color: Dex.CurrentTheme.rangeSliderIndicatorBackgroundEndColor + position: 0.6 + } + } + } + + DefaultText + { + id: _left_item + anchors.left: parent.left + anchors.top: parent.bottom + text_value: qsTr("Min") + } + + DefaultText + { + id: _right_item + anchors.right: parent.right + anchors.top: parent.bottom + text_value: qsTr("Max") + } +} diff --git a/atomic_defi_design/Dex/Components/DefaultRectangle.qml b/atomic_defi_design/Dex/Components/DefaultRectangle.qml new file mode 100644 index 0000000000..7b2a0740b2 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultRectangle.qml @@ -0,0 +1,3 @@ +import QtQuick 2.15 + +DexRectangle {} diff --git a/atomic_defi_design/Dex/Components/DefaultScrollBar.qml b/atomic_defi_design/Dex/Components/DefaultScrollBar.qml new file mode 100644 index 0000000000..a67e17d701 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultScrollBar.qml @@ -0,0 +1,6 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import App 1.0 + +DexScrollBar { } \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DefaultScrollView.qml b/atomic_defi_design/Dex/Components/DefaultScrollView.qml new file mode 100644 index 0000000000..4eee53c923 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultScrollView.qml @@ -0,0 +1,29 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import Dex.Themes 1.0 as Dex + +ScrollView +{ + id: control + + clip: true + ScrollBar.vertical.background: Rectangle { color: Dex.CurrentTheme.scrollBarBackgroundColor; radius: 8 } + ScrollBar.vertical.contentItem: Rectangle + { + implicitWidth: 10 + implicitHeight: 20 + color: Dex.CurrentTheme.scrollBarIndicatorColor + radius: 8 + } + ScrollBar.vertical.policy: contentHeight > height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff + ScrollBar.horizontal.background: Rectangle { color: Dex.CurrentTheme.scrollBarBackgroundColor; radius: 8 } + ScrollBar.horizontal.contentItem: Rectangle + { + implicitWidth: 20 + implicitHeight: 10 + color: Dex.CurrentTheme.scrollBarIndicatorColor + radius: 8 + } + ScrollBar.horizontal.policy: contentHeight > height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff +} diff --git a/atomic_defi_design/Dex/Components/DefaultSlider.qml b/atomic_defi_design/Dex/Components/DefaultSlider.qml new file mode 100644 index 0000000000..be74bd2ce4 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultSlider.qml @@ -0,0 +1,48 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../Constants" +import App 1.0 +import Dex.Themes 1.0 as Dex + +Slider +{ + id: control + value: 0.5 + opacity: enabled ? 1 : .5 + + background: Rectangle + { + x: control.leftPadding + y: control.topPadding + control.availableHeight / 2 - height / 2 + implicitWidth: 200 + implicitHeight: 4 + width: control.availableWidth + height: implicitHeight + radius: 2 + color: Dex.CurrentTheme.rangeSliderDistanceColor + + Rectangle + { + width: control.visualPosition * parent.width + height: parent.height + color: Dex.CurrentTheme.rangeSliderBackgroundColor + radius: 2 + } + } + + handle: Rectangle + { + x: control.leftPadding + control.visualPosition * (control.availableWidth - width) + y: control.topPadding + control.availableHeight / 2 - height / 2 + implicitWidth: 18 + implicitHeight: 18 + radius: 13 + gradient: Gradient + { + orientation: Gradient.Horizontal + GradientStop { position: 0.125; color: Dex.CurrentTheme.rangeSliderIndicatorBackgroundStartColor } + GradientStop { position: 0.925; color: Dex.CurrentTheme.rangeSliderIndicatorBackgroundEndColor } + } + } +} diff --git a/atomic_defi_design/qml/Components/DefaultSplitView.qml b/atomic_defi_design/Dex/Components/DefaultSplitView.qml similarity index 100% rename from atomic_defi_design/qml/Components/DefaultSplitView.qml rename to atomic_defi_design/Dex/Components/DefaultSplitView.qml diff --git a/atomic_defi_design/qml/Components/DefaultSubstractRectangle.qml b/atomic_defi_design/Dex/Components/DefaultSubstractRectangle.qml similarity index 98% rename from atomic_defi_design/qml/Components/DefaultSubstractRectangle.qml rename to atomic_defi_design/Dex/Components/DefaultSubstractRectangle.qml index de70e60039..552b43476e 100644 --- a/atomic_defi_design/qml/Components/DefaultSubstractRectangle.qml +++ b/atomic_defi_design/Dex/Components/DefaultSubstractRectangle.qml @@ -7,6 +7,7 @@ import Qt.labs.settings 1.0 import AtomicDEX.MarketMode 1.0 import "../Constants" +import App 1.0 Rectangle { id: _mask diff --git a/atomic_defi_design/Dex/Components/DefaultSweetComboBox.qml b/atomic_defi_design/Dex/Components/DefaultSweetComboBox.qml new file mode 100644 index 0000000000..b125969769 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultSweetComboBox.qml @@ -0,0 +1,4 @@ +import QtQuick 2.15 + +DexSweetComboBox +{} \ No newline at end of file diff --git a/atomic_defi_design/qml/Components/DefaultSwitch.qml b/atomic_defi_design/Dex/Components/DefaultSwitch.qml similarity index 84% rename from atomic_defi_design/qml/Components/DefaultSwitch.qml rename to atomic_defi_design/Dex/Components/DefaultSwitch.qml index d6baa5fa10..0f6010adf3 100644 --- a/atomic_defi_design/qml/Components/DefaultSwitch.qml +++ b/atomic_defi_design/Dex/Components/DefaultSwitch.qml @@ -2,6 +2,7 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Controls.Universal 2.15 import "../Constants" +import App 1.0 DexSwitch { diff --git a/atomic_defi_design/Dex/Components/DefaultText.qml b/atomic_defi_design/Dex/Components/DefaultText.qml new file mode 100644 index 0000000000..d5ea6215e2 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultText.qml @@ -0,0 +1,7 @@ +import QtQuick 2.15 +import "../Constants" +import App 1.0 + +DexLabel { + +} diff --git a/atomic_defi_design/qml/Components/DefaultTextArea.qml b/atomic_defi_design/Dex/Components/DefaultTextArea.qml similarity index 78% rename from atomic_defi_design/qml/Components/DefaultTextArea.qml rename to atomic_defi_design/Dex/Components/DefaultTextArea.qml index 2a09d0fba7..3a86a18c8b 100644 --- a/atomic_defi_design/qml/Components/DefaultTextArea.qml +++ b/atomic_defi_design/Dex/Components/DefaultTextArea.qml @@ -1,16 +1,18 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import "../Constants" +import App 1.0 -TextArea { +TextArea +{ id: text_field font.family: Style.font_family - placeholderTextColor: theme.textPlaceHolderColor - selectedTextColor: theme.textSelectedColor - selectionColor: theme.textSelectionColor - color: theme.foregroundColor + placeholderTextColor: DexTheme.textPlaceHolderColor + selectedTextColor: DexTheme.textSelectedColor + selectionColor: DexTheme.textSelectionColor + color: DexTheme.foregroundColor Behavior on color { ColorAnimation { duration: Style.animationDuration } } Behavior on placeholderTextColor { ColorAnimation { duration: Style.animationDuration } } @@ -44,7 +46,7 @@ TextArea { selectByMouse: true persistentSelection: true - background: InnerBackground { auto_set_size: false } + background: InnerBackground { } RightClickMenu { } } diff --git a/atomic_defi_design/Dex/Components/DefaultTextEdit.qml b/atomic_defi_design/Dex/Components/DefaultTextEdit.qml new file mode 100644 index 0000000000..adfa328500 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultTextEdit.qml @@ -0,0 +1,54 @@ +import QtQuick 2.15 +import "../Constants" +import App 1.0 + +TextEdit +{ + id: control + property string text_value + property bool privacy: false + property string linkURL: "" + property string onCopyNotificationTitle: "" + property string onCopyNotificationMsg: qsTr("copied to clipboard") + + font.family: Style.font_family + font.pixelSize: Style.textSize + text: privacy && General.privacy_mode ? General.privacy_text : text_value + wrapMode: Text.WordWrap + selectByMouse: true + readOnly: true + + selectedTextColor: DexTheme.textSelectedColor + selectionColor: DexTheme.textSelectionColor + color: DexTheme.foregroundColor + + Behavior on color { ColorAnimation { duration: Style.animationDuration } } + + onLinkActivated: Qt.openUrlExternally(link) + + DefaultMouseArea + { + anchors.fill: parent + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + acceptedButtons: Qt.NoButton + } + + DefaultCopyIcon + { + id: copy_icon + anchors.verticalCenter: parent.verticalCenter + copyText: control.text_value + notifyTitle: control.onCopyNotificationTitle + notifyMsg: control.onCopyNotificationMsg + x: control.implicitWidth + 6 + iconSize: 14 + } + + DefaultLinkIcon + { + anchors.verticalCenter: parent.verticalCenter + linkURL: control.linkURL + x: control.onCopyNotificationTitle == '' ? control.implicitWidth + 6 : control.implicitWidth + copy_icon.implicitWidth + 8 + iconSize: 14 + } +} \ No newline at end of file diff --git a/atomic_defi_design/qml/Components/DefaultTextField.qml b/atomic_defi_design/Dex/Components/DefaultTextField.qml similarity index 85% rename from atomic_defi_design/qml/Components/DefaultTextField.qml rename to atomic_defi_design/Dex/Components/DefaultTextField.qml index 941ddaf660..a0c57e16c7 100644 --- a/atomic_defi_design/qml/Components/DefaultTextField.qml +++ b/atomic_defi_design/Dex/Components/DefaultTextField.qml @@ -1,6 +1,7 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import "../Constants" +import App 1.0 DexTextField { diff --git a/atomic_defi_design/Dex/Components/DefaultTooltip.qml b/atomic_defi_design/Dex/Components/DefaultTooltip.qml new file mode 100644 index 0000000000..122e98b848 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DefaultTooltip.qml @@ -0,0 +1,4 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +DexTooltip {} diff --git a/atomic_defi_design/Dex/Components/DexAmountField.qml b/atomic_defi_design/Dex/Components/DexAmountField.qml new file mode 100644 index 0000000000..c42949bb18 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexAmountField.qml @@ -0,0 +1,97 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import Qaterial 1.0 as Qaterial +import QtQuick.Layouts 1.5 + +import App 1.0 + +Item { + id: control + width: 200 + height: 35 + property alias value: input_field.text + property alias field: input_field + property string leftText: "Price" + property string rightText: "" + property alias background: _background + property int leftWidth: -1 + readonly property int max_length: 18 + + anchors.centerIn: parent + Rectangle { + id: _background + anchors.fill: parent + radius: 4 + color: DexTheme.backgroundDarkColor2 + border.color: DexTheme.accentColor + border.width: input_field.focus ? 1 : 0 + } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 5 + anchors.rightMargin: 5 + spacing: 2 + Item { + visible: leftText !== "" + Layout.preferredWidth: leftWidth !== -1 ? leftWidth : _title_label.implicitWidth + 2 + Layout.fillHeight: true + DexLabel { + id: _title_label + anchors.verticalCenter: parent.verticalCenter + leftPadding: 5 + horizontalAlignment: DexLabel.AlignHCenter + text: leftText + color: DexTheme.foregroundColor + opacity: .4 + font.pixelSize: 14 + font.weight: Font.Medium + } + } + Item { + Layout.fillWidth: true + Layout.fillHeight: true + Rectangle { + anchors.fill: parent + anchors.topMargin: 1 + anchors.bottomMargin: 1 + radius: 0 + color: DexTheme.backgroundDarkColor2 + DexTextField { + id: input_field + validator: RegExpValidator { + regExp: /(0|([1-9][0-9]*))(\.[0-9]{1,8})?/ + } + onTextChanged: { + text = text.trim() + if (text.length > control.max_length) { + text = text.substring(0, control.max_length) + } + } + horizontalAlignment: Qt.AlignRight + echoMode: TextInput.Normal + background: Item {} + font.weight: Font.Medium + font.family: 'Lato' + font.pixelSize: 13 + anchors.fill: parent + } + } + } + Item { + visible: rightText !== "" + Layout.preferredWidth: _suffix_label.implicitWidth + 2 + Layout.fillHeight: true + DexLabel { + id: _suffix_label + anchors.centerIn: parent + horizontalAlignment: DexLabel.AlignHCenter + text: rightText + color: DexTheme.foregroundColor + opacity: .4 + font.pixelSize: 14 + font.weight: Font.Medium + } + } + } +} \ No newline at end of file diff --git a/atomic_defi_design/qml/Components/DexAnimatedImage.qml b/atomic_defi_design/Dex/Components/DexAnimatedImage.qml similarity index 92% rename from atomic_defi_design/qml/Components/DexAnimatedImage.qml rename to atomic_defi_design/Dex/Components/DexAnimatedImage.qml index e504de5105..69429687e1 100644 --- a/atomic_defi_design/qml/Components/DexAnimatedImage.qml +++ b/atomic_defi_design/Dex/Components/DexAnimatedImage.qml @@ -3,4 +3,4 @@ import QtQuick 2.15 AnimatedImage { mipmap: true fillMode: Image.PreserveAspectFit -} +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexAppButton.qml b/atomic_defi_design/Dex/Components/DexAppButton.qml new file mode 100644 index 0000000000..db494f9cac --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexAppButton.qml @@ -0,0 +1,96 @@ +//! Qt Imports +import QtQuick 2.15 + +//! 3rdParty Imports +import Qaterial 1.0 as Qaterial + +//! Project Imports +import Dex.Themes 1.0 as Dex +import "../Constants" +import App 1.0 + +DexRectangle +{ + id: control + + property string text: "" + property string iconSource: "" + property int padding: 12 + property int spacing: 4 + property int verticalAlignment: Qt.AlignVCenter + property int horizontalAlignment: Qt.AlignHCenter + 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 + property alias content: _contentRow + property alias leftPadding: _contentRow.leftPadding + property alias rightPadding: _contentRow.rightPadding + property alias topPadding: _contentRow.topPadding + property alias bottomPadding: _contentRow.bottomPadding + property alias text_obj: _label + property alias containsMouse: _controlMouseArea.containsMouse + + signal clicked() + + radius: 5 + height: _label.implicitHeight + (padding * verticalPadding) + width: _contentRow.implicitWidth + (padding * horizontalPadding) + + colorAnimation: false + color: enabled ? _controlMouseArea.containsMouse ? _controlMouseArea.containsPress ? + btnPressedColor : btnHoveredColor : btnEnabledColor : btnDisabledColor + opacity: _controlMouseArea.containsMouse ? 1 : .8 + + Row + { + id: _contentRow + + anchors + { + horizontalCenter: parent.horizontalAlignment == Qt.AlignHCenter ? parent.horizontalCenter : undefined + verticalCenter: parent.verticalAlignment == Qt.AlignVCenter ? parent.verticalCenter : undefined + } + + spacing: _icon.visible ? parent.spacing : 0 + + Qaterial.ColorIcon + { + id: _icon + iconSize: control.iconSize + visible: control.iconSource === "" ? false : true + source: control.iconSource + color: _label.color + anchors.verticalCenter: parent.verticalCenter + } + + DexLabel + { + id: _label + anchors.verticalCenter: parent.verticalCenter + font: DexTypo.body2 + text: control.text + color: enabled ? _controlMouseArea.containsMouse ? _controlMouseArea.containsPress ? + Dex.CurrentTheme.buttonTextPressedColor : + Dex.CurrentTheme.buttonTextHoveredColor : + Dex.CurrentTheme.buttonTextEnabledColor : + Dex.CurrentTheme.buttonTextDisabledColor + } + } + + DexMouseArea + { + id: _controlMouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: control.clicked() + } +} diff --git a/atomic_defi_design/Dex/Components/DexAppOutlineButton.qml b/atomic_defi_design/Dex/Components/DexAppOutlineButton.qml new file mode 100644 index 0000000000..41c9bfdff5 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexAppOutlineButton.qml @@ -0,0 +1,118 @@ +import QtQuick 2.15 +import Qaterial 1.0 as Qaterial +import App 1.0 + +DexRectangle { + id: control + signal clicked() + + colorAnimation: false + + property int padding: 12 + property int spacing: 4 + property int verticalAlignment: Qt.AlignVCenter + property int horizontalAlignment: Qt.AlignHCenter + property int verticalPadding: 2 + property int horizontalPadding: 2 + + + // old button property + property alias text_obj: _label + property alias containsMouse: _controlMouseArea.containsMouse + + property bool text_left_align: false + + property int minWidth: 90 + + property int borderWidth: 3 + + property real textScale: 1 + + property string outlinedColor: "" + + property string button_type: "default" + + border.width: 0 + // end + + + property alias label: _label + property alias font: _label.font + property alias leftPadding: _contentRow.leftPadding + property alias rightPadding: _contentRow.rightPadding + property alias topPadding: _contentRow.topPadding + property alias bottomPadding: _contentRow.bottomPadding + + property string text: "" + property string iconSource: "" + + property string foregroundColor: containsMouse ? DexTheme.buttonGradientTextEnabled : DexTheme.foregroundColor + radius: 12 + + Gradient { + id: btnGradient + orientation: Qt.Horizontal + GradientStop { + position: 0.1255 + color: DexTheme.buttonGradientEnabled1 + } + GradientStop { + position: 0.933 + color: DexTheme.buttonGradientEnabled2 + } + } + + color: outlinedColor + gradient: outlinedColor !== "" ? undefined : btnGradient + + DexRectangle { + visible: !parent.containsMouse + radius: parent.radius - 2 + anchors.centerIn: parent + width: parent.width - (control.borderWidth*2) + height: parent.height - (control.borderWidth*2) + color: DexTheme.contentColorTopBold + border.width: 0 + } + height: _label.implicitHeight + (padding * verticalPadding) + width: _contentRow.implicitWidth + (padding * horizontalPadding) + + Row + { + id: _contentRow + + anchors + { + horizontalCenter: parent.horizontalAlignment == Qt.AlignHCenter ? parent.horizontalCenter : undefined + verticalCenter: parent.verticalAlignment == Qt.AlignVCenter ? parent.verticalCenter : undefined + } + + spacing: _icon.visible ? parent.spacing : 0 + + Qaterial.ColorIcon + { + id: _icon + iconSize: _label.font.pixelSize + 2 + visible: control.iconSource === "" ? false : true + source: control.iconSource + color: _label.color + anchors.verticalCenter: parent.verticalCenter + } + + DexLabel + { + id: _label + anchors.verticalCenter: parent.verticalCenter + font: DexTypo.body2 + text: control.text + color: control.foregroundColor + } + } + + DexMouseArea { + id: _controlMouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: control.clicked() + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexAppPasswordField.qml b/atomic_defi_design/Dex/Components/DexAppPasswordField.qml new file mode 100644 index 0000000000..6fde726c1a --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexAppPasswordField.qml @@ -0,0 +1,79 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Window 2.15 + +import Qaterial 1.0 as Qaterial + +import App 1.0 +import Dex.Themes 1.0 as Dex +import "../Constants" + +DexAppTextField +{ + id: _inputPassword + + property bool forceFocus: false + property string leftIcon: Qaterial.Icons.keyVariant + 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: DexTypo.inputFieldFont + field.horizontalAlignment: Qt.AlignLeft + field.leftPadding: 75 + field.rightPadding: 60 + field.placeholderText: qsTr("Type password") + + Component.onCompleted: + { + if (forceFocus) field.forceActiveFocus() + } + + DefaultRectangle + { + x: 5 + height: 40 + width: 60 + radius: 20 + color: Dex.CurrentTheme.inputLeftIconBackgroundColor + border.width: _inputPassword.focus ? 2 : 0 + + anchors.verticalCenter: parent.verticalCenter + Qaterial.ColorIcon + { + anchors.centerIn: parent + iconSize: 19 + color: leftIconColor + source: _inputPassword.leftIcon + } + } + + Qaterial.AppBarButton + { + id: _hideFieldButton + + opacity: .8 + icon + { + source: _inputPassword.field.echoMode === TextField.Password ? Qaterial.Icons.eyeOffOutline : Qaterial.Icons.eyeOutline + color: rightIconColor + } + anchors + { + verticalCenter: parent.verticalCenter + right: parent.right + rightMargin: 10 + } + onClicked: + { + if (_inputPassword.field.echoMode === TextField.Password) _inputPassword.field.echoMode = TextField.Normal; + else _inputPassword.field.echoMode = TextField.Password; + } + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexAppTextArea.qml b/atomic_defi_design/Dex/Components/DexAppTextArea.qml new file mode 100644 index 0000000000..1a1ecda547 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexAppTextArea.qml @@ -0,0 +1,108 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import Qaterial 1.0 as Qaterial +import QtQuick.Layouts 1.5 +import App 1.0 + +Item { + id: control + width: 200 + height: 35 + signal accepted() + property alias value: input_field.text + property alias field: input_field + property alias background: _background + readonly property int max_length: 1000 + property color textColor: DexTheme.foregroundColor + property bool error: false + onErrorChanged: { + if (error) { + _animationTimer.start() + _animate.start() + } + } + Timer { + id: _animationTimer + interval: 350 + onTriggered: { + _animate.stop() + _background.x = 0 + } + } + Timer { + id: _animate + interval: 30 + repeat: true + onTriggered: { + if (_background.x == -3) { + _background.x = 3 + } else { + _background.x = -3 + } + } + } + + function reset() { + input_field.text = "" + } + Rectangle { + id: _background + width: parent.width + height: parent.height + radius: 4 + 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 { + duration: 40 + } + } + } + RowLayout { + anchors.fill: parent + anchors.leftMargin: 5 + anchors.rightMargin: 5 + spacing: 2 + Item { + Layout.fillWidth: true + Layout.fillHeight: true + Rectangle { + anchors.fill: parent + anchors.topMargin: 1 + anchors.bottomMargin: 1 + radius: _background.radius + color: DexTheme.backgroundDarkColor2 + DexFlickable { + anchors.fill: parent + contentHeight: input_field.height + contentWidth: width + interactive: false + + TextArea.flickable: TextArea { + + id: input_field + horizontalAlignment: Qt.AlignLeft + color: control.textColor + background: Item {} + wrapMode: TextEdit.Wrap + selectByMouse: true + persistentSelection: true + font.weight: Font.Medium + font.family: DexTypo.body2 + Keys.onReturnPressed: control.accepted() + onTextChanged: { + control.error = false + if (text.length > control.max_length) { + text = text.substring(0, control.max_length) + } + if (text.indexOf('\r') !== -1 || text.indexOf('\n') !== -1) { + text = text.replace(/[\r\n]/, '') + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexAppTextField.qml b/atomic_defi_design/Dex/Components/DexAppTextField.qml new file mode 100644 index 0000000000..81773020b4 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexAppTextField.qml @@ -0,0 +1,189 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import Qaterial 1.0 as Qaterial +import QtQuick.Layouts 1.5 + +import App 1.0 +import Dex.Themes 1.0 as Dex +import "../Constants" + +Item +{ + id: control + width: 200 + height: 35 + + property int leftWidth: -1 + property int max_length: 180 + + property alias field: input_field + property alias value: input_field.text + property alias background: _background + + property string leftText: "" + property string rightText: "" + property string placeholderText: "" + + property bool error: false + + onErrorChanged: + { + if (error) + { + _animationTimer.start() + _animate.start() + } + } + + Timer + { + id: _animationTimer + interval: 350 + onTriggered: + { + _animate.stop() + _background.x = 0 + } + } + + Timer + { + id: _animate + interval: 30 + repeat: true + + onTriggered: + { + if (_background.x == -3) + { + _background.x = 3 + } + else + { + _background.x = -3 + } + } + } + + function reset() + { + input_field.text = "" + } + + Rectangle + { + id: _background + width: parent.width + height: parent.height + radius: 4 + 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 + { + NumberAnimation + { + duration: 40 + } + } + } + + RowLayout + { + anchors.fill: parent + anchors.leftMargin: 5 + anchors.rightMargin: 5 + spacing: 2 + + Item + { + visible: leftText !== "" + Layout.preferredWidth: leftWidth !== -1 ? leftWidth : _title_label.implicitWidth + 2 + Layout.fillHeight: true + + DexLabel + { + id: _title_label + anchors.verticalCenter: parent.verticalCenter + leftPadding: 5 + horizontalAlignment: DexLabel.AlignHCenter + text: leftText + color: Dex.CurrentTheme.foregroundColor + opacity: .4 + font.pixelSize: 14 + font.weight: Font.Medium + } + } + + Item + { + Layout.fillWidth: true + Layout.fillHeight: true + + Rectangle + { + anchors.fill: parent + anchors.topMargin: 1 + anchors.bottomMargin: 1 + radius: _background.radius + color: Dex.CurrentTheme.inputFieldBackgroundColor + + DexTextField + { + id: input_field + anchors.fill: parent + horizontalAlignment: Qt.AlignLeft + + font.weight: Font.Medium + font.family: 'Lato' + font.pixelSize: 13 + echoMode: TextInput.Normal + background: Item + {} + + onTextChanged: + { + if (text.length > control.max_length) + { + text = text.substring(0, control.max_length) + } + control.error = false + } + + } + + DexLabel + { + text: control.placeholderText + anchors.verticalCenter: parent.verticalCenter + leftPadding: input_field.leftPadding + color: Dex.CurrentTheme.inputPlaceholderTextColor + font: DexTypo.inputFieldFont + elide: DexLabel.ElideRight + width: parent.width - 10 + wrapMode: DexLabel.NoWrap + visible: input_field.text === "" + } + } + } + + Item + { + visible: rightText !== "" + Layout.preferredWidth: _suffix_label.implicitWidth + 2 + Layout.fillHeight: true + + DexLabel + { + id: _suffix_label + anchors.centerIn: parent + horizontalAlignment: DexLabel.AlignHCenter + text: rightText + color: Dex.CurrentTheme.foregroundColor + opacity: .4 + font: DexTypo.inputFieldSuffixFont + } + } + } +} \ No newline at end of file diff --git a/atomic_defi_design/qml/Components/DexBox.qml b/atomic_defi_design/Dex/Components/DexBox.qml similarity index 87% rename from atomic_defi_design/qml/Components/DexBox.qml rename to atomic_defi_design/Dex/Components/DexBox.qml index 2124691d46..91f43c9032 100644 --- a/atomic_defi_design/qml/Components/DexBox.qml +++ b/atomic_defi_design/Dex/Components/DexBox.qml @@ -8,6 +8,7 @@ import QtQuick 2.15 import QtGraphicalEffects 1.12 import Qaterial 1.0 as Qaterial import "../Constants" +import App 1.0 Item { id: control @@ -17,10 +18,9 @@ Item { property alias border: rect.border property bool shadowOff: false property bool auto_set_size: true + implicitWidth: auto_set_size ? inner_space.width : 0 implicitHeight: auto_set_size ? inner_space.height : 0 - property color bottomBorderColor: theme.colorInnerShadowBottom - property color topBorderColor: theme.colorInnerShadowTop Item { id: rect_with_shadow @@ -30,7 +30,7 @@ Item { id: rect anchors.fill: parent border.color: "transparent" - color: theme.backgroundColor + color: DexTheme.backgroundColor Loader { anchors.centerIn: parent @@ -49,5 +49,3 @@ Item { } } } - - diff --git a/atomic_defi_design/qml/Components/DexBoxManager.qml b/atomic_defi_design/Dex/Components/DexBoxManager.qml similarity index 87% rename from atomic_defi_design/qml/Components/DexBoxManager.qml rename to atomic_defi_design/Dex/Components/DexBoxManager.qml index ed40d4a05a..6d09647a2e 100644 --- a/atomic_defi_design/qml/Components/DexBoxManager.qml +++ b/atomic_defi_design/Dex/Components/DexBoxManager.qml @@ -1,9 +1,9 @@ - import QtQuick 2.15 import QtQuick.Controls 2.15 SplitView { id: splitManager + spacing: 10 property var itemLists: [] - + } \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexBusyIndicator.qml b/atomic_defi_design/Dex/Components/DexBusyIndicator.qml new file mode 100644 index 0000000000..0390ddea6e --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexBusyIndicator.qml @@ -0,0 +1,75 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Universal 2.15 +import "../Constants" +import Dex.Themes 1.0 as Dex +import App 1.0 + +BusyIndicator +{ + id: control + property int indicatorSize: 64 + property int indicatorDotSize: 10 + + contentItem: Item + { + implicitWidth: indicatorSize + implicitHeight: indicatorSize + + Item + { + id: item + x: (parent.width - indicatorSize) / 2 + y: (parent.height - indicatorSize) / 2 + width: indicatorSize + height: indicatorSize + opacity: control.running ? 1 : 0 + + Behavior on opacity + { + OpacityAnimator + { + duration: 250 + } + } + + RotationAnimator + { + target: item + running: control.visible && control.running + from: 0 + to: 360 + loops: Animation.Infinite + duration: 1250 + } + + Repeater + { + id: repeater + model: 6 + + Rectangle + { + x: (item.width - width) / 2 + y: (item.height - height) / 2 + implicitWidth: indicatorDotSize + implicitHeight: indicatorDotSize + radius: indicatorDotSize / 2 + color: Dex.CurrentTheme.busyIndicatorColor + transform: [ + Translate + { + y: -Math.min(item.width, item.height) * 0.5 + indicatorDotSize / 2 + }, + Rotation + { + angle: index / repeater.count * 360 + origin.x: indicatorDotSize / 2 + origin.y: indicatorDotSize / 2 + } + ] + } + } + } + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexCheckBox.qml b/atomic_defi_design/Dex/Components/DexCheckBox.qml new file mode 100644 index 0000000000..344df181ad --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexCheckBox.qml @@ -0,0 +1,95 @@ +//! Qt Imports. +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Universal 2.15 + +//! Project Imports. +import App 1.0 +import Dex.Themes 1.0 as Dex + +CheckBox +{ + id: control + + 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 + + font.family: Style.font_family + + indicator: DefaultRectangle + { + id: _indicator + anchors.verticalCenter: control.verticalCenter + + implicitWidth: 20 + implicitHeight: 20 + radius: 4 + + gradient: Gradient + { + orientation: Gradient.Horizontal + GradientStop { position: 0.1; color: Dex.CurrentTheme.checkBoxGradientStartColor } + GradientStop { position: 0.6; color: Dex.CurrentTheme.checkBoxGradientEndColor } + } + + DefaultImage { + id: check_icon + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + width: parent.width - 6 + height: parent.height - 6 + source: General.image_path + "white_check.svg" + visible: control.checkState === Qt.Checked + } + + DefaultColorOverlay + { + anchors.fill: check_icon + source: check_icon + color: Dex.CurrentTheme.checkBoxTickColor + } + + DefaultRectangle + { + visible: !control.checked + anchors.centerIn: parent + width: parent.width - 6 + height: parent.height - 6 + radius: parent.radius + } + + opacity: enabled ? 1 : 0.5 + } + + contentItem: RowLayout + { + id: _content + Layout.alignment: Qt.AlignVCenter + height: _label.height + spacing: 0 + + DefaultText + { + id: _label + text: control.text + font: control.font + color: control.textColor + verticalAlignment: Text.AlignVCenter + leftPadding: control.indicator.width + control.spacing + wrapMode: Label.Wrap + } + } + + DefaultMouseArea + { + id: mouseArea + anchors.fill: parent + acceptedButtons: Qt.NoButton + } +} diff --git a/atomic_defi_design/Dex/Components/DexColorOverlay.qml b/atomic_defi_design/Dex/Components/DexColorOverlay.qml new file mode 100644 index 0000000000..a17e26800c --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexColorOverlay.qml @@ -0,0 +1,12 @@ +import QtQuick 2.15 +import QtGraphicalEffects 1.0 +import "../Constants" +import App 1.0 + +ColorOverlay { + Behavior on color { + ColorAnimation { + duration: Style.animationDuration + } + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexComboBox.qml b/atomic_defi_design/Dex/Components/DexComboBox.qml new file mode 100644 index 0000000000..38245425d2 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexComboBox.qml @@ -0,0 +1,156 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.impl 2.15 + +import Qaterial 1.0 as Qaterial + +import "../Constants" +import App 1.0 +import Dex.Themes 1.0 as Dex + +ComboBox +{ + id: control + + property alias radius: bg_rect.radius + property int dropDownMaxHeight: 450 + property color comboBoxBackgroundColor: Dex.CurrentTheme.comboBoxBackgroundColor + property color mainBackgroundColor: Dex.CurrentTheme.comboBoxBackgroundColor + property color popupBackgroundColor: Dex.CurrentTheme.comboBoxBackgroundColor + property color highlightedBackgroundColor: Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor + property string mainLineText: control.displayText + property var dropdownLineText: m => textRole === "" ? + m.modelData : + !m.modelData ? m[textRole] : m.modelData[textRole] + + font.family: Style.font_family + hoverEnabled: true + + // Main, selected text + contentItem: Item + { + DefaultText + { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: 13 + width: parent.width - anchors.leftMargin + font: DexTypo.subtitle2 + text_value: control.mainLineText + elide: Text.ElideRight + } + } + + // Main background + background: FloatingBackground + { + id: bg_rect + implicitWidth: 150 + implicitHeight: 45 + color: control.mainBackgroundColor + radius: 20 + } + + // Dropdown itself + popup: Popup + { + width: control.width + leftPadding: 0 + rightPadding: 0 + topPadding: 16 + bottomPadding: 16 + + contentItem: DefaultListView + { + id: _list + model: control.popup.visible ? control.delegateModel : null + implicitHeight: contentHeight > control.dropDownMaxHeight ? control.dropDownMaxHeight : contentHeight + currentIndex: control.highlightedIndex + + ScrollBar.vertical: ScrollBar + { + visible: _list.contentHeight > control.dropDownMaxHeight + anchors.right: _list.right + anchors.rightMargin: 2 + width: 7 + background: DefaultRectangle + { + radius: 12 + color: Dex.CurrentTheme.scrollBarBackgroundColor + } + contentItem: DefaultRectangle + { + radius: 12 + color: Dex.CurrentTheme.scrollBarIndicatorColor + } + } + + DefaultMouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + } + } + + background: Rectangle + { + radius: control.radius + color: control.popupBackgroundColor + } + } + + // Each dropdown item + delegate: ItemDelegate + { + id: combo_item + + width: control.width + highlighted: control.highlightedIndex === index + + contentItem: DefaultText + { + width: control.width + font: DexTypo.subtitle2 + text_value: control.dropdownLineText(model) + elide: Text.ElideRight + } + + background: Rectangle + { + anchors.fill: combo_item + color: combo_item.highlighted ? Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor : Dex.CurrentTheme.comboBoxBackgroundColor + } + } + + // Dropdown arrow icon at right side + indicator: Column + { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 8 + spacing: -12 + + Qaterial.Icon + { + width: 20 + height: 20 + color: Dex.CurrentTheme.comboBoxArrowsColor + icon: Qaterial.Icons.chevronUp + } + + Qaterial.Icon + { + width: 20 + height: 20 + color: Dex.CurrentTheme.comboBoxArrowsColor + icon: Qaterial.Icons.chevronDown + } + } + + DefaultMouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + } +} diff --git a/atomic_defi_design/Dex/Components/DexCopyableLabel.qml b/atomic_defi_design/Dex/Components/DexCopyableLabel.qml new file mode 100644 index 0000000000..6b0bfbb2da --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexCopyableLabel.qml @@ -0,0 +1,59 @@ +//! Qt Imports. +import QtQuick 2.12 +import QtQuick.Controls 2.1 //> TextField + +//! 3rdParty Imports. +import Qaterial 1.0 as Qaterial //> Icon + +//! Project Imports. +import App 1.0 //> DexTheme + +// DexCopyableLabel is a label which content can be copied to clipboard with the help of a copy icon right to te text. +// It is not editable by users. +Item +{ + id: control + + property alias text: label.text + + property string onCopyNotificationTitle + property string onCopyNotificationMsg + + implicitWidth: label.width + copyIcon.width + copyIcon._leftMargin + implicitHeight: label.height + + DexLabel + { + id: label + font: Qt.font({ + pixelSize: 13, + letterSpacing: 0.25, + weight: Font.Normal + }) + color: DexTheme.foregroundColor + } + + Qaterial.Icon + { + id: copyIcon + + property int _leftMargin: 10 + + anchors.left: label.right + anchors.leftMargin: _leftMargin + size: 16 + icon: Qaterial.Icons.contentCopy + color: copyArea.containsMouse ? DexTheme.accentColor : DexTheme.foregroundColor + DexMouseArea + { + id: copyArea + anchors.fill: parent + hoverEnabled: true + onClicked: + { + Qaterial.Clipboard.text = label.text + app.notifyCopy(onCopyNotificationTitle, onCopyNotificationMsg) + } + } + } +} diff --git a/atomic_defi_design/qml/Components/DexDialogManager.qml b/atomic_defi_design/Dex/Components/DexDialogManager.qml similarity index 82% rename from atomic_defi_design/qml/Components/DexDialogManager.qml rename to atomic_defi_design/Dex/Components/DexDialogManager.qml index ae5d93742c..fc3726ec11 100644 --- a/atomic_defi_design/qml/Components/DexDialogManager.qml +++ b/atomic_defi_design/Dex/Components/DexDialogManager.qml @@ -2,6 +2,7 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import Qaterial 1.0 as Qaterial import QtQuick.Layouts 1.12 +import App 1.0 Popup { id: dialog @@ -17,8 +18,8 @@ Popup { Overlay.modal: Item { DexRectangle { anchors.fill: parent - color: Qt.darker(theme.dexBoxBackgroundColor) - opacity: .6 + color: Qt.darker(DexTheme.backgroundDarkColor6) + opacity: .8 } } @@ -31,6 +32,10 @@ Popup { signal helpRequested() signal rejected() signal reset() + signal checkValidator() + + property + var validator: undefined property string title: "" property string text: "" @@ -44,13 +49,14 @@ Popup { property string cancelButtonText: "" property bool getText: false property bool isPassword: false + property bool enableAcceptButton: validator === undefined ? true : validator(_insideField.field.text) background: Qaterial.ClipRRect { radius: 4 - Rectangle { + DexRectangle { anchors.fill: parent radius: 4 - color: theme.surfaceColor + color: DexTheme.backgroundDarkColor2 } } @@ -66,6 +72,7 @@ Popup { padding: 0 topPadding: 10 spacing: 0 + bottomPadding: 3 Item { id: _header height: _label.height + 10 @@ -77,12 +84,13 @@ Popup { width: parent.width wrapMode: Label.Wrap leftPadding: 5 - font: theme.textType.body1 - color: theme.foregroundColor + font: DexTypo.body1 + color: DexTheme.foregroundColor anchors.verticalCenter: parent.verticalCenter text: dialog.title } } + Container { id: _col width: parent.width - 20 @@ -99,6 +107,8 @@ Popup { icon.color: dialog.iconColor width: parent.width + color: DexTheme.foregroundColor + text: dialog.text wrapMode: Text.WordWrap horizontalAlignment: Label.AlignLeft @@ -118,29 +128,34 @@ Popup { height: 45 error: false visible: dialog.getText - defaultBorderColor: theme.dexBoxBackgroundColor + defaultBorderColor: DexTheme.backgroundDarkColor6 background.border.width: 1 - field.font: theme.textType.body2 - field.placeholderText: dialog.placeholderText + field.font: DexTypo.body2 + placeholderText: dialog.placeholderText + field.placeholderText: "" field.rightPadding: dialog.isPassword ? 55 : 20 - field.leftPadding: 70 + field.leftPadding: dialog.isPassword ? 70 : 20 field.echoMode: dialog.isPassword ? TextField.Password : TextField.Normal + field.onAccepted: { - dialog.accepted(field.text) + if(dialog.enableAcceptButton) { + dialog.accepted(field.text) + } } + DexRectangle { x: 3 visible: dialog.isPassword height: 40 width: 60 radius: 20 - color: theme.accentColor + color: DexTheme.accentColor anchors.verticalCenter: parent.verticalCenter Qaterial.ColorIcon { anchors.centerIn: parent iconSize: 19 source: Qaterial.Icons.keyVariant - color: theme.surfaceColor + color: DexTheme.backgroundDarkColor2 } } @@ -149,7 +164,7 @@ Popup { opacity: .8 icon { source: _insideField.field.echoMode === TextField.Password ? Qaterial.Icons.eyeOffOutline : Qaterial.Icons.eyeOutline - color: _insideField.field.focus ? _insideField.background.border.color : theme.accentColor + color: _insideField.field.focus ? _insideField.background.border.color : DexTheme.accentColor } anchors { verticalCenter: parent.verticalCenter @@ -171,7 +186,8 @@ Popup { id: _dialogButtonBox visible: standardButtons !== Dialog.NoButton standardButtons: dialog.standardButtons - width: parent.width + width: parent.width - 2 + anchors.horizontalCenter: parent.horizontalCenter height: 60 alignment: Qt.AlignRight buttonLayout: DialogButtonBox.AndroidLayout @@ -199,16 +215,17 @@ Popup { onReset: dialog.reset() topPadding: 25 background: Rectangle { - color: theme.dexBoxBackgroundColor + color: DexTheme.backgroundDarkColor6 } delegate: Qaterial.Button { - id: _deleteButton + id: _dialogManagerButton flat: DialogButtonBox.buttonRole === DialogButtonBox.RejectRole bottomInset: 0 topInset: 0 - backgroundColor: DialogButtonBox.buttonRole === DialogButtonBox.RejectRole ? 'transparent' : dialog.warning ? theme.redColor : theme.accentColor + opacity: enabled ? 1 : .6 + enabled: DialogButtonBox.buttonRole === DialogButtonBox.RejectRole ? true : dialog.enableAcceptButton + backgroundColor: DialogButtonBox.buttonRole === DialogButtonBox.RejectRole ? 'transparent' : dialog.warning ? DexTheme.warningColor : DexTheme.accentColor property alias cursorShape: mouseArea.cursorShape - Component.onCompleted: { if (text === "Yes" && dialog.yesButtonText !== "") { text = dialog.yesButtonText diff --git a/atomic_defi_design/qml/Components/DexDialogTextField.qml b/atomic_defi_design/Dex/Components/DexDialogTextField.qml similarity index 81% rename from atomic_defi_design/qml/Components/DexDialogTextField.qml rename to atomic_defi_design/Dex/Components/DexDialogTextField.qml index 1c4c75be8b..cee884a867 100644 --- a/atomic_defi_design/qml/Components/DexDialogTextField.qml +++ b/atomic_defi_design/Dex/Components/DexDialogTextField.qml @@ -12,11 +12,12 @@ Item { property alias value: input_field.text property alias field: input_field property alias background: _background - property string defaultBorderColor: theme.rectangleBorderColor + property string defaultBorderColor: DexTheme.rectangleBorderColor property string leftText: "" property string rightText: "" + property string placeholderText: "" property int leftWidth: -1 - readonly property int max_length: 40 + property int max_length: 40 property bool error: false onErrorChanged: { if (error) { @@ -48,14 +49,14 @@ Item { function reset() { input_field.text = "" } - + Rectangle { id: _background width: parent.width height: parent.height radius: 25 color: 'transparent' - border.color: theme.accentColor + border.color: DexTheme.accentColor border.width: input_field.focus ? 1 : 0 Behavior on x { NumberAnimation { @@ -66,8 +67,8 @@ Item { RowLayout { anchors.fill: parent - anchors.leftMargin: 5 - anchors.rightMargin: 5 + anchors.leftMargin: 2 + anchors.rightMargin: 2 spacing: 2 Item { visible: leftText !== "" @@ -79,7 +80,7 @@ Item { leftPadding: 5 horizontalAlignment: DexLabel.AlignHCenter text: leftText - color: theme.foregroundColor + color: DexTheme.foregroundColor opacity: .4 font.pixelSize: 14 font.weight: Font.Medium @@ -93,7 +94,7 @@ Item { anchors.topMargin: 1 anchors.bottomMargin: 1 radius: _background.radius - color: theme.surfaceColor + color: _background.color DexTextField { id: input_field onTextChanged: { @@ -110,6 +111,15 @@ Item { font.pixelSize: 13 anchors.fill: parent } + DexLabel { + anchors.verticalCenter: parent.verticalCenter + leftPadding: input_field.leftPadding + font: input_field.font + color: DexTheme.foregroundColor + opacity: .5 + text: control.placeholderText + visible: input_field.text === "" + } } } Item { @@ -121,11 +131,11 @@ Item { anchors.centerIn: parent horizontalAlignment: DexLabel.AlignHCenter text: rightText - color: theme.foregroundColor + color: DexTheme.foregroundColor opacity: .4 font.pixelSize: 14 font.weight: Font.Medium } } } -} \ No newline at end of file +} diff --git a/atomic_defi_design/qml/Components/DexFadebehavior.qml b/atomic_defi_design/Dex/Components/DexFadebehavior.qml similarity index 80% rename from atomic_defi_design/qml/Components/DexFadebehavior.qml rename to atomic_defi_design/Dex/Components/DexFadebehavior.qml index 3fb1a16582..71be432d8c 100644 --- a/atomic_defi_design/qml/Components/DexFadebehavior.qml +++ b/atomic_defi_design/Dex/Components/DexFadebehavior.qml @@ -7,7 +7,8 @@ Behavior { property QtObject fadeTarget: targetProperty.object property string fadeProperty: "scale" property int fadeDuration: 150 - property var fadeValue: 0 + property + var fadeValue: 0 property string easingType: "Quad" property alias exitAnimation: exitAnimation @@ -20,16 +21,16 @@ Behavior { property: root.fadeProperty duration: root.fadeDuration to: root.fadeValue - easing.type: root.easingType === "Linear" ? Easing.Linear : Easing["In"+root.easingType] + easing.type: root.easingType === "Linear" ? Easing.Linear : Easing["In" + root.easingType] } - PropertyAction { } + PropertyAction {} NumberAnimation { id: enterAnimation target: root.fadeTarget property: root.fadeProperty duration: root.fadeDuration to: 1 - easing.type: root.easingType === "Linear" ? Easing.Linear : Easing["Out"+root.easingType] + easing.type: root.easingType === "Linear" ? Easing.Linear : Easing["Out" + root.easingType] } } } \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexFlickable.qml b/atomic_defi_design/Dex/Components/DexFlickable.qml new file mode 100644 index 0000000000..59f82966dd --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexFlickable.qml @@ -0,0 +1,16 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +Flickable { + id: root + + property bool scrollbar_visible: contentHeight > height + property int rightMargin: 3 + + boundsBehavior: Flickable.StopAtBounds + ScrollBar.vertical: DexScrollBar { + anchors.rightMargin: root.rightMargin + } + + clip: true +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexGradientAppButton.qml b/atomic_defi_design/Dex/Components/DexGradientAppButton.qml new file mode 100644 index 0000000000..5624512c13 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexGradientAppButton.qml @@ -0,0 +1,123 @@ +import QtQuick 2.15 +import Qaterial 1.0 as Qaterial + +import App 1.0 +import Dex.Themes 1.0 as Dex + +DexRectangle +{ + id: control + + property int padding: 12 + property int spacing: 4 + property int verticalAlignment: Qt.AlignVCenter + property int horizontalAlignment: Qt.AlignHCenter + property int verticalPadding: 2 + property int horizontalPadding: 2 + + + // old button property + property alias text_obj: _label + property alias containsMouse: _controlMouseArea.containsMouse + + property bool text_left_align: false + + property int minWidth: 90 + + property real textScale: 1 + + property string button_type: "default" + + property alias label: _label + property alias font: _label.font + property alias leftPadding: _contentRow.leftPadding + property alias rightPadding: _contentRow.rightPadding + property alias topPadding: _contentRow.topPadding + property alias bottomPadding: _contentRow.bottomPadding + + property string text: "" + property string iconSource: "" + property string iconSourceRight: "" + + signal clicked() + + radius: 5 + gradient: Gradient + { + orientation: Qt.Horizontal + GradientStop + { + position: 0.1255 + color: enabled ? _controlMouseArea.containsMouse ? _controlMouseArea.containsPress ? + Dex.CurrentTheme.gradientButtonPressedStartColor : + Dex.CurrentTheme.gradientButtonHoveredStartColor : + Dex.CurrentTheme.gradientButtonStartColor : + Dex.CurrentTheme.gradientButtonDisabledStartColor + } + GradientStop + { + position: 0.933 + color: enabled ? _controlMouseArea.containsMouse ? _controlMouseArea.containsPress ? + Dex.CurrentTheme.gradientButtonPressedEndColor : + Dex.CurrentTheme.gradientButtonHoveredEndColor : + Dex.CurrentTheme.gradientButtonEndColor : + Dex.CurrentTheme.gradientButtonDisabledEndColor + } + } + height: _label.implicitHeight + (padding * verticalPadding) + width: _contentRow.implicitWidth + (padding * horizontalPadding) + + Row + { + id: _contentRow + + anchors + { + horizontalCenter: parent.horizontalAlignment == Qt.AlignHCenter ? parent.horizontalCenter : undefined + verticalCenter: parent.verticalAlignment == Qt.AlignVCenter ? parent.verticalCenter : undefined + } + + spacing: _icon.visible ? parent.spacing : 0 + + Qaterial.ColorIcon + { + id: _icon + iconSize: _label.font.pixelSize + 2 + visible: control.iconSource === "" ? false : true + source: control.iconSource + color: _label.color + anchors.verticalCenter: parent.verticalCenter + } + + DexLabel + { + id: _label + anchors.verticalCenter: parent.verticalCenter + font: DexTypo.body2 + text: control.text + color: enabled ? _controlMouseArea.containsMouse ? _controlMouseArea.containsPress ? + Dex.CurrentTheme.gradientButtonTextPressedColor : + Dex.CurrentTheme.gradientButtonTextHoveredColor : + Dex.CurrentTheme.gradientButtonTextEnabledColor : + Dex.CurrentTheme.gradientButtonTextDisabledColor + } + + Qaterial.ColorIcon + { + id: _iconRight + iconSize: _label.font.pixelSize + 2 + visible: control.iconSourceRight === "" ? false : true + source: control.iconSourceRight + color: _label.color + anchors.verticalCenter: parent.verticalCenter + } + } + + DexMouseArea + { + id: _controlMouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: control.clicked() + } +} diff --git a/atomic_defi_design/Dex/Components/DexIconButton.qml b/atomic_defi_design/Dex/Components/DexIconButton.qml new file mode 100644 index 0000000000..ca187f3d3b --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexIconButton.qml @@ -0,0 +1,43 @@ +//! Qt Imports. +import QtQuick 2.15 + +//! 3rdParty Imports. +import Qaterial 1.0 as Qaterial + +//! Project Imports. +import App 1.0 +import Dex.Themes 1.0 as Dex + +Item +{ + id: control + + property int padding: 10 + property string icon: Qaterial.Icons.bellOutline + property alias color: _label.color + property alias iconSize: _label.size + property alias containsMouse: _controlMouseArea.containsMouse + property bool active: false + + signal clicked() + + height: 20 + width: 20 + + Qaterial.Icon + { + id: _label + anchors.centerIn: parent + icon: parent.icon + color: Dex.CurrentTheme.foregroundColor + opacity: _controlMouseArea.containsMouse ? 1 : .7 + } + + DexMouseArea + { + id: _controlMouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: control.clicked() + } +} diff --git a/atomic_defi_design/qml/Components/DexImage.qml b/atomic_defi_design/Dex/Components/DexImage.qml similarity index 82% rename from atomic_defi_design/qml/Components/DexImage.qml rename to atomic_defi_design/Dex/Components/DexImage.qml index 96f463282c..603f734457 100644 --- a/atomic_defi_design/qml/Components/DexImage.qml +++ b/atomic_defi_design/Dex/Components/DexImage.qml @@ -1,6 +1,7 @@ import QtQuick 2.15 -Image { +Image +{ mipmap: true fillMode: Image.PreserveAspectFit -} +} \ No newline at end of file diff --git a/atomic_defi_design/qml/Components/DexInnerShadow.qml b/atomic_defi_design/Dex/Components/DexInnerShadow.qml similarity index 79% rename from atomic_defi_design/qml/Components/DexInnerShadow.qml rename to atomic_defi_design/Dex/Components/DexInnerShadow.qml index 499eb6b11d..b3858c15d9 100644 --- a/atomic_defi_design/qml/Components/DexInnerShadow.qml +++ b/atomic_defi_design/Dex/Components/DexInnerShadow.qml @@ -1,6 +1,7 @@ import QtQuick 2.15 import QtGraphicalEffects 1.0 import "../Constants" +import App 1.0 InnerShadow { cached: false @@ -8,6 +9,6 @@ InnerShadow { verticalOffset: 0.7 radius: 13 samples: 32 - color: theme.innerShadowColor + color: DexTheme.innerShadowColor smooth: true -} +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexItemBox.qml b/atomic_defi_design/Dex/Components/DexItemBox.qml new file mode 100644 index 0000000000..eaec5d467e --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexItemBox.qml @@ -0,0 +1,333 @@ +import QtQuick 2.15 +import Qaterial 1.0 as Qaterial +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.12 +import "../Exchange/Trade/" +import "../Constants/" +as Constants + +InnerBackground { + id: _control + border.width: 1.1 + signal reload() + + property bool hideHeader: false + property bool visibility: isVertical ? height >= 40 ? true : false : width >= 40 ? true : false + property bool hidden: false + property bool expandedVert: false + property bool expandedHort: false + property bool showed: true + property bool duplicable: false + property bool closable: false + property bool expandable: true + property string title: "Default Title" + property int minimumHeight: isVertical ? 40 : 250 + property int minimumWidth: isVertical ? 40 : 250 + property int maximumHeight: 9999999 + property int maximumWidth: 9999999 + property int defaultHeight: 250 + property int defaultWidth: 250 + property bool reloadable: false + property bool contentVisible: !hidden + + property bool isVertical: _control.parent.parent.orientation === Qt.Vertical + function setHeight(height) { + SplitView.preferredHeight = height + } + + function setWidth(width) { + SplitView.preferredWidth = width + } + + onHiddenChanged: { + if (isVertical && hidden) { + SplitView.preferredHeight = 40 + SplitView.minimumHeight = 40 + SplitView.maximumHeight = 40 + } else if (isVertical && !hidden) { + SplitView.preferredHeight = defaultHeight + SplitView.minimumHeight = minimumHeight + SplitView.maximumHeight = maximumHeight + SplitView.fillHeight = true + SplitView.view.update() + } else if (!isVertical && hidden) { + SplitView.preferredWidth = 40 + SplitView.minimumWidth = 40 + SplitView.maximumWidth = 40 + } else if (!isVertical && !hidden) { + SplitView.preferredWidth = defaultWidth + SplitView.minimumWidth = minimumWidth + SplitView.maximumWidth = maximumWidth + SplitView.fillWidth = true + + } + } + + //shadowOff: true + color: DexTheme.portfolioPieGradient ? 'transparent' : DexTheme.backgroundDarkColor6 + property alias titleLabel: _texto + + onExpandedVertChanged: { + if (expandedVert) { + if (DefaultSplitView.view != null) { + for (var i = 0; i < DefaultSplitView.view.children.length; i++) { + if (DefaultSplitView.view.children[i] !== _control) { + try { + DefaultSplitView.view.children[i].expandedVert = false + } catch (e) {} + + } + } + SplitView.fillHeight = true + } + } else { + SplitView.fillHeight = false + } + } + onExpandedHortChanged: { + if (expandedHort) { + if (DefaultSplitView.view != null) { + for (var i = 0; i < SplitView.view.children.length; i++) { + if (SplitView.view.children[i] !== _control) { + try { + SplitView.view.children[i].expandedHort = false + } catch (e) {} + } + } + SplitView.fillHeight = true + } + } else { + SplitView.fillHeight = false + } + } + + + + Behavior on SplitView.preferredHeight { + SmoothedAnimation { + duration: 200 + + } + } + Behavior on SplitView.preferredWidth { + SmoothedAnimation { + duration: 200 + + } + } + Component.onCompleted: { + SplitView.minimumHeight = minimumHeight + SplitView.minimumWidth = minimumWidth + SplitView.maximumHeight = maximumHeight + SplitView.maximumWidth = maximumWidth + SplitView.preferredHeight = defaultHeight + SplitView.preferredWidth = defaultWidth + SplitView.fillHeight = expandedVert ? true : false + SplitView.fillWidth = expandedHort ? true : false + } + + + //SplitView.maximumWidth: maximumWidth + property Component contentItem + + radius: 8 + ClipRRect { + anchors.fill: parent + radius: parent.radius + + Rectangle { + width: parent.width + height: 40 + radius: parent.parent.height < 41 ? parent.parent.radius : 0 + color: DexTheme.portfolioPieGradient ? 'transparent' : DexTheme.backgroundDarkColor6 + visible: visibility && !_control.hideHeader + RowLayout { + anchors.fill: parent + Layout.rightMargin: 10 + Layout.leftMargin: 10 + DefaultText { + id: _texto + leftPadding: 10 + Layout.alignment: Qt.AlignVCenter + Layout.fillWidth: true + text: _control.title + color: DexTheme.foregroundColor + bottomPadding: 5 + } + Row { + Layout.alignment: Qt.AlignVCenter + opacity: .8 + spacing: -8 + Qaterial.AppBarButton { + Timer { + id: _tm + interval: 5000 + running: false + onTriggered: { + parent.enabled = true + } + } + + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + visible: _control.reloadable + icon.source: Qaterial.Icons.refresh + onClicked: { + _tm.restart() + enabled = false + _control.reload() + + } + } + Qaterial.AppBarButton { + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + icon.source: _control.expandable ? Qaterial.Icons.eyeOutline : Qaterial.Icons.eyeOffOutline + onClicked: _control.hidden = !_control.hidden + } + Qaterial.AppBarButton { + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + visible: _control.expandable && _control.parent.parent.orientation === Qt.Vertical + icon.source: _control.expandedVert ? Qaterial.Icons.unfoldLessHorizontal : Qaterial.Icons.unfoldMoreHorizontal + onClicked: _control.expandedVert = !_control.expandedVert + } + Qaterial.AppBarButton { + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + visible: _control.expandable && _control.parent.parent.orientation === Qt.Horizontal + icon.source: _control.expandedHort ? Qaterial.Icons.unfoldLessVertical : Qaterial.Icons.unfoldMoreVertical + onClicked: _control.expandedHort = !_control.expandedHort + } + Qaterial.AppBarButton { + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + visible: _control.duplicable + icon.source: Qaterial.Icons.plus + } + Qaterial.AppBarButton { + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + visible: _control.closable + icon.source: Qaterial.Icons.close + } + } + } + } + Rectangle { + width: 40 + height: parent.height + anchors.right: parent.right + radius: parent.parent.height < 41 ? parent.parent.radius : 0 + color: DexTheme.backgroundDarkColor6 + visible: !isVertical && hidden + DefaultText { + id: _texto2 + leftPadding: 10 + Layout.alignment: Qt.AlignVCenter + Layout.fillWidth: true + text: _control.title + color: DexTheme.foregroundColor + bottomPadding: 5 + rotation: 90 + anchors.centerIn: parent + } + ColumnLayout { + anchors.fill: parent + Layout.rightMargin: 10 + Layout.leftMargin: 10 + Column { + opacity: .8 + spacing: -8 + + Qaterial.AppBarButton { + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + icon.source: _control.expandable ? Qaterial.Icons.eyeOutline : Qaterial.Icons.eyeOffOutline + onClicked: { + _control.hidden = !_control.hidden + } + } + Qaterial.AppBarButton { + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + visible: _control.expandable && _control.parent.parent.orientation === Qt.Vertical + icon.source: _control.expandedVert ? Qaterial.Icons.unfoldLessHorizontal : Qaterial.Icons.unfoldMoreHorizontal + onClicked: _control.expandedVert = !_control.expandedVert + } + Qaterial.AppBarButton { + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + visible: _control.expandable && _control.parent.parent.orientation === Qt.Horizontal + icon.source: _control.expandedHort ? Qaterial.Icons.unfoldLessVertical : Qaterial.Icons.unfoldMoreVertical + onClicked: _control.expandedHort = !_control.expandedHort + } + Qaterial.AppBarButton { + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + visible: _control.duplicable + icon.source: Qaterial.Icons.plus + } + Qaterial.AppBarButton { + implicitHeight: 40 + implicitWidth: 40 + icon.height: 17 + icon.width: 17 + foregroundColor: DexTheme.foregroundColor + visible: _control.closable + icon.source: Qaterial.Icons.close + } + } + Item { + Layout.fillHeight: true + } + } + } + Item { + anchors.fill: parent + visible: contentVisible + Loader { + id: _loader + anchors.fill: parent + anchors.topMargin: 40 + + sourceComponent: _control.contentItem + } + LoaderBusyIndicator { + target: _loader + } + } + + + } +} \ No newline at end of file diff --git a/atomic_defi_design/qml/Components/DexKeyChecker.qml b/atomic_defi_design/Dex/Components/DexKeyChecker.qml similarity index 88% rename from atomic_defi_design/qml/Components/DexKeyChecker.qml rename to atomic_defi_design/Dex/Components/DexKeyChecker.qml index 0048282a38..aa48c9771d 100644 --- a/atomic_defi_design/qml/Components/DexKeyChecker.qml +++ b/atomic_defi_design/Dex/Components/DexKeyChecker.qml @@ -1,24 +1,27 @@ import QtQuick 2.15 import QtQuick.Layouts 1.15 import "../Constants" +import App 1.0 ColumnLayout { id: control + property var field property bool hide_hint: false property bool new_password: true property bool double_validation: false property string match_password + property int max_pw_len: General.max_std_pw_length property bool high_security: true function isValid() { - if(double_validation) { + if (double_validation) { return control.field.acceptableInput && RegExp(high_security ? General.reg_pass_valid : General.reg_pass_valid_low_security).test(control.field.text) && passwordsDoMatch() } else { - return control.field.acceptableInput && RegExp(high_security ? General.reg_pass_valid : General.reg_pass_valid_low_security).test(control.field.text) - } + return control.field.acceptableInput && RegExp(high_security ? General.reg_pass_valid : General.reg_pass_valid_low_security).test(control.field.text) + } } function hasEnoughUppercaseCharacters() { @@ -46,7 +49,7 @@ ColumnLayout { } function hintColor(valid) { - return valid ? Style.colorGreen : Style.colorRed + return valid ? DexTheme.okColor : DexTheme.warningColor } function hintPrefix(valid) { @@ -60,7 +63,7 @@ ColumnLayout { DexLabel { visible: high_security - font: theme.textType.body2 + font: DexTypo.body2 Layout.fillWidth: true wrapMode: DexLabel.Wrap text_value: hintPrefix(hasEnoughLowercaseCharacters()) + qsTr("At least 1 lowercase alphabetical character") @@ -68,7 +71,7 @@ ColumnLayout { } DexLabel { visible: high_security - font: theme.textType.body2 + font: DexTypo.body2 Layout.fillWidth: true wrapMode: DexLabel.Wrap text_value: hintPrefix(hasEnoughUppercaseCharacters()) + qsTr("At least 1 uppercase alphabetical character") @@ -76,7 +79,7 @@ ColumnLayout { } DexLabel { visible: high_security - font: theme.textType.body2 + font: DexTypo.body2 Layout.fillWidth: true wrapMode: DexLabel.Wrap text_value: hintPrefix(hasEnoughNumericCharacters()) + qsTr("At least 1 numeric character") @@ -84,21 +87,21 @@ ColumnLayout { } DexLabel { visible: high_security - font: theme.textType.body2 + font: DexTypo.body2 Layout.fillWidth: true wrapMode: DexLabel.Wrap text_value: hintPrefix(hasEnoughSpecialCharacters()) + qsTr("At least 1 special character (eg. !@#$%)") color: hintColor(hasEnoughSpecialCharacters()) } DexLabel { - font: theme.textType.body2 + font: DexTypo.body2 Layout.fillWidth: true wrapMode: DexLabel.Wrap - text_value: hintPrefix(hasEnoughCharacters()) + qsTr("At least %n character(s)", "", high_security ? 16 : 1) + text_value: hintPrefix(hasEnoughCharacters()) + qsTr("Between %1 and %2 character(s)").arg(high_security ? 16 : 1).arg(max_pw_len) color: hintColor(hasEnoughCharacters()) } DexLabel { - font: theme.textType.body2 + font: DexTypo.body2 Layout.fillWidth: true wrapMode: DexLabel.Wrap text_value: hintPrefix(passwordsDoMatch()) + qsTr("Password and Confirm Password have to be same") diff --git a/atomic_defi_design/Dex/Components/DexLabel.qml b/atomic_defi_design/Dex/Components/DexLabel.qml new file mode 100644 index 0000000000..ef6694978d --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexLabel.qml @@ -0,0 +1,32 @@ +//! Qt Imports. +import QtQuick 2.15 + +//! Project Imports +import App 1.0 +import "../Constants" as Dex +import Dex.Themes 1.0 as Dex + +Text +{ + property string text_value + property bool privacy: false + property bool monospace: false + + Behavior on color + { + ColorAnimation + { + duration: Style.animationDuration + } + } + + font: monospace ? Dex.DexTypo.monoSmall : Dex.DexTypo.body2 + + color: enabled ? Dex.CurrentTheme.foregroundColor : Dex.CurrentTheme.textDisabledColor + + text: privacy && Dex.General.privacy_mode ? Dex.General.privacy_text : text_value + wrapMode: Text.WordWrap + + onLinkActivated: Qt.openUrlExternally(link) + linkColor: color +} diff --git a/atomic_defi_design/Dex/Components/DexLabelUnlinked.qml b/atomic_defi_design/Dex/Components/DexLabelUnlinked.qml new file mode 100644 index 0000000000..d2d59accaa --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexLabelUnlinked.qml @@ -0,0 +1,27 @@ +import QtQuick 2.15 +import "../Constants" +import App 1.0 + +Text { + property string text_value + property bool privacy: false + + Behavior on color { + ColorAnimation { + duration: Style.animationDuration + } + } + + font: DexTypo.body1 + color: DexTheme.foregroundColor + text: privacy && General.privacy_mode ? General.privacy_text : text_value + wrapMode: Text.WordWrap + + linkColor: color + + DefaultMouseArea { + anchors.fill: parent + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + acceptedButtons: Qt.NoButton + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexLanguage.qml b/atomic_defi_design/Dex/Components/DexLanguage.qml new file mode 100644 index 0000000000..1029bc7abb --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexLanguage.qml @@ -0,0 +1,93 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.impl 2.15 +import QtQuick.Controls.Universal 2.15 + +import QtGraphicalEffects 1.0 + +import "../Constants" +import App 1.0 +import Dex.Themes 1.0 as Dex + +DexComboBox +{ + id: control + model: API.app.settings_pg.get_available_langs() + height: 50 + + displayText: API.app.settings_pg.lang + leftPadding: 5 + + // Each dropdown item + delegate: ItemDelegate + { + id: combo_item + width: control.width + height: 35 + highlighted: control.highlightedIndex === index + + contentItem: RowLayout + { + anchors.fill: parent + spacing: -25 + + DexImage + { + id: image + Layout.preferredHeight: 25 + source: General.image_path + "lang/" + modelData + ".png" + } + + DexLabel + { + text: modelData + } + } + + background: Rectangle + { + anchors.fill: combo_item + radius: 6 + color: combo_item.highlighted ? Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor : Dex.CurrentTheme.comboBoxBackgroundColor + } + + onClicked: + { + if (modelData !== API.app.settings_pg.lang) + { + API.app.settings_pg.lang = modelData + } + } + } + + // Main, selected item + contentItem: Text + { + anchors.fill: parent + leftPadding: 0 + rightPadding: control.indicator.width + control.spacing + verticalAlignment: Text.AlignVCenter + + DexImage + { + id: image + height: 25 + x: 12 + anchors.verticalCenter: parent.verticalCenter + source: General.image_path + "lang/" + control.displayText + ".png" + } + } + + background: FloatingBackground + { + radius: 20 + color: Dex.CurrentTheme.comboBoxBackgroundColor + } + + DexMouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexListView.qml b/atomic_defi_design/Dex/Components/DexListView.qml new file mode 100644 index 0000000000..a65904698f --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexListView.qml @@ -0,0 +1,38 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../Constants" +import App 1.0 + +ListView +{ + id: root + + property alias position: scrollVert.position + property alias scrollVert: scrollVert + property bool scrollbar_visible: contentItem.childrenRect.height > height + property bool visibleBackground: false + readonly property double scrollbar_margin: scrollbar_visible ? 8 : 0 + + boundsBehavior: Flickable.StopAtBounds + implicitHeight: contentItem.childrenRect.height + implicitWidth: contentItem.childrenRect.width + clip: true + + opacity: root.count === 0 ? 0 : enabled ? 1 : 0.2 + + Behavior on opacity + { + SmoothedAnimation + { + duration: Style.animationDuration * 0.5 + velocity: -1 + } + } + + ScrollBar.vertical: DefaultScrollBar + { + id: scrollVert + visibleBackground: root.visibleBackground + } +} diff --git a/atomic_defi_design/Dex/Components/DexLoader.qml b/atomic_defi_design/Dex/Components/DexLoader.qml new file mode 100644 index 0000000000..202a3bb795 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexLoader.qml @@ -0,0 +1,14 @@ +import QtQuick 2.15 + +Loader { + property + var onLoadComplete: () => {} + + onLoaded: { + onLoadComplete() + onLoadComplete = () => {} + } + + asynchronous: true + visible: status === Loader.Ready +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexMacControl.qml b/atomic_defi_design/Dex/Components/DexMacControl.qml new file mode 100644 index 0000000000..7917c1b634 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexMacControl.qml @@ -0,0 +1,105 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import Qaterial 1.0 as Qaterial +import QtQuick.Controls.Universal 2.15 +import QtQuick.Layouts 1.12 + +import App 1.0 +import Dex.Themes 1.0 as Dex + +Item +{ + anchors.fill: parent + Item + { + width: parent.width + height: 30 + + Rectangle + { + width: parent.width + height: 30 + border.color: Dex.CurrentTheme.lineSeparatorColor + border.width: 1.5 + anchors.horizontalCenter: parent.horizontalCenter + color: Dex.CurrentTheme.backgroundColor + } + + MouseArea + { + onPressed: window.startSystemMove(); + anchors.fill: parent + anchors.rightMargin: 280 + onDoubleClicked: + { + if (window.visibility === ApplicationWindow.Maximized) window.showNormal() + else window.showMaximized() + } + } + DexMacosHeaderControl { anchors.verticalCenter: parent.verticalCenter } + } + Item + { + id: _left_resize + height: parent.height + width: 3 + MouseArea + { + onPressed: window.startSystemResize(Qt.LeftEdge) + anchors.fill: parent + cursorShape: "SizeHorCursor" + } + } + + Item + { + id: _right_resize + height: parent.height + anchors.right: parent.right + width: 3 + MouseArea + { + onPressed: window.startSystemResize(Qt.RightEdge) + cursorShape: "SizeHorCursor" + } + } + Item + { + id: _bottom_resize + height: 3 + width: parent.width + anchors.bottom: parent.bottom + MouseArea + { + onPressed: if (active) window.startSystemResize(Qt.BottomEdge) + anchors.fill: parent + cursorShape: "SizeVerCursor" + } + } + Item + { + id: _top_resize + height: 3 + width: parent.width + MouseArea + { + onPressed: window.startSystemResize(Qt.TopEdge) + anchors.fill: parent + cursorShape: "SizeVerCursor" + } + } + Item + { + id: _bottom_right_resize + height: 6 + width: 6 + anchors.right: parent.right + anchors.bottom: parent.bottom + MouseArea + { + onPressed: if (active) window.startSystemResize(Qt.BottomEdge | Qt.RightEdge) + anchors.fill: parent + cursorShape: "SizeFDiagCursor" + } + } +} diff --git a/atomic_defi_design/Dex/Components/DexMacosHeaderControl.qml b/atomic_defi_design/Dex/Components/DexMacosHeaderControl.qml new file mode 100644 index 0000000000..190d60301c --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexMacosHeaderControl.qml @@ -0,0 +1,111 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Universal 2.15 +import QtQuick.Layouts 1.12 + +import Qaterial 1.0 as Qaterial +import ModelHelper 0.1 + +import "../Constants" + +Row +{ + id: _headerControlRow + + property real size: 13 + property bool hovered: minimizeButton.containsMouse || closeButton.containsMouse || extendButton.containsMouse + property var orders: API.app.orders_mdl.orders_proxy_mdl.ModelHelper + + anchors.top: parent.top + width: 195 + x: 15 + height: 40 + spacing: 9 + + Rectangle + { + anchors.verticalCenter: parent.verticalCenter + width: parent.size + height: width + radius: width / 2 + color: closeButton.containsPress ? Qt.lighter("#FF5E57") : "#FF5E57" + + Qaterial.ColorIcon + { + visible: _headerControlRow.hovered + anchors.centerIn: parent + source: Qaterial.Icons.close + iconSize: parent.width - 2 + color: 'black' + } + + MouseArea + { + id: closeButton + hoverEnabled: true + anchors.fill: parent + onClicked: { + if (orders.count === 0 || !API.app.wallet_mgr.log_status()) Qt.quit() + else app.logout_confirm_modal.open() + } + } + } + + Rectangle + { + anchors.verticalCenter: parent.verticalCenter + width: parent.size + height: width + radius: width / 2 + color: minimizeButton.containsPress ? Qt.lighter("#FFBC2C") : "#FFBC2C" + + Qaterial.ColorIcon + { + anchors.centerIn: parent + visible: _headerControlRow.hovered + source: Qaterial.Icons.windowMinimize + iconSize: parent.width - 2 + color: 'black' + } + + MouseArea + { + id: minimizeButton + hoverEnabled: true + anchors.fill: parent + onClicked: window.showMinimized() + } + } + + Rectangle + { + anchors.verticalCenter: parent.verticalCenter + width: parent.size + height: width + radius: width / 2 + color: extendButton.containsPress ? Qt.lighter("#26CA42") : "#26CA42" + + Qaterial.ColorIcon + { + visible: _headerControlRow.hovered + anchors.centerIn: parent + source: window.visibility === ApplicationWindow.Maximized ? Qaterial.Icons.arrowCollapse : Qaterial.Icons.arrowExpand + iconSize: parent.width - 2 + color: 'black' + } + + MouseArea + { + id: extendButton + hoverEnabled: true + anchors.fill: parent + onClicked: + { + if (window.visibility === ApplicationWindow.Maximized) window.showNormal() + else window.showMaximized() + } + } + } + + +} diff --git a/atomic_defi_design/Dex/Components/DexModal.qml b/atomic_defi_design/Dex/Components/DexModal.qml new file mode 100644 index 0000000000..5ee466fbcb --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexModal.qml @@ -0,0 +1,73 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 + +import Dex.Themes 1.0 as Dex + +Popup { + id: control + parent: Overlay.overlay + property alias title: _headerBackground.text + property alias headerBackground: _headerBackground + property alias backgroundColor: _backgroundColor.color + property alias currentIndex: _layoutPopup.currentIndex + property alias header: _header.contentItem + property alias footer: _footer.contentItem + modal: true + padding: 0 + Overlay.modeless: DefaultRectangle { + color: Dex.CurrentTheme.backgroundDarkColor6 + opacity: .3 + } + + background: ClipRRect { + radius: 8 + DefaultRectangle { + id: _backgroundColor + anchors.fill: parent + border.width: 2 + radius: parent.radius + color: Dex.CurrentTheme.backgroundDarkColor6 + Container { + id: _header + width: parent.width + height: 60 + contentItem: DexModalHeader { + id: _headerBackground + } + } + HorizontalLine { + anchors.top: _footer.top + width: _headerBackground.width + opacity: .7 + } + Container { + id: _footer + anchors.bottom: parent.bottom + height: try { + contentItem.height + } catch (e) { + 0 + } + width: parent.width + } + + } + } + contentItem: StackLayout { + id: _layoutPopup + anchors.fill: parent + anchors.topMargin: try { + control.header.height + } catch (e) { + 0 + } + anchors.bottomMargin: try { + control.footer.height + } catch (e) { + 0 + } + + } + +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexModalHeader.qml b/atomic_defi_design/Dex/Components/DexModalHeader.qml new file mode 100644 index 0000000000..9eb7fbfc26 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexModalHeader.qml @@ -0,0 +1,24 @@ +import QtQuick 2.15 + +DexRectangle { + id: _headerBackground + property alias text: _title.text + /*width: parent.width + height: parent.height*/ + color: DexTheme.accentColor + border.width: 0 + radius: 0 + DexLabel { + id: _title + anchors.verticalCenter: parent.verticalCenter + text: "" + opacity: .8 + font: DexTypo.head6 + leftPadding: 10 + } + HorizontalLine { + anchors.bottom: parent.bottom + width: _headerBackground.width + opacity: .7 + } +} \ No newline at end of file diff --git a/atomic_defi_design/qml/Components/DexMouseArea.qml b/atomic_defi_design/Dex/Components/DexMouseArea.qml similarity index 82% rename from atomic_defi_design/qml/Components/DexMouseArea.qml rename to atomic_defi_design/Dex/Components/DexMouseArea.qml index fdb71d12ea..3f237b7d42 100644 --- a/atomic_defi_design/qml/Components/DexMouseArea.qml +++ b/atomic_defi_design/Dex/Components/DexMouseArea.qml @@ -1,5 +1,6 @@ import QtQuick 2.15 -MouseArea { +MouseArea +{ cursorShape: enabled ? Qt.PointingHandCursor : Qt.ArrowCursor -} +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexPaginator.qml b/atomic_defi_design/Dex/Components/DexPaginator.qml new file mode 100644 index 0000000000..cbe088fb83 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexPaginator.qml @@ -0,0 +1,172 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 + +import Qaterial 1.0 as Qaterial + +import "../Constants" as Constants +import App 1.0 +import Dex.Themes 1.0 as Dex + +RowLayout +{ + id: root + + spacing: 4 + + property var pageSize: Constants.API.app.orders_mdl.nb_pages + property var currentValue: Constants.API.app.orders_mdl.current_page + + property alias itemsPerPageComboBox: itemsPerPageComboBox + + function refreshBtn() + { + currentValue = Constants.API.app.orders_mdl.current_page + var model = [] + if (pageSize < 10) { + for (var i = 0; i < pageSize; i++) { + model.push({ + number: i + 1, + selected: currentValue === i + 1 + }) + } + } else { + + [1, 2].map(v => model.push({ + number: v, + selected: currentValue === v + })); + + model.push({ + number: currentValue - 2 > 1 + 3 ? -1 : 1 + 2, + selected: currentValue === 3 + }); + + for (var k = Math.max(1 + 3, currentValue - 2); k <= Math.min(pageSize - 3, currentValue + 2); k++) { + model.push({ + number: k, + selected: currentValue === k + }); + } + + model.push({ + number: currentValue + 2 < pageSize - 3 ? -1 : pageSize - 2, + selected: currentValue === pageSize - 2 + }); + [pageSize - 1, pageSize].map(v => model.push({ + number: v, + selected: currentValue === v + })); + } + btnGroup.model = model + } + + onPageSizeChanged: + { + currentValue = 1 + if (pageSize < 1) { + pageSize = 1 + } + refreshBtn() + } + + DexComboBox + { + id: itemsPerPageComboBox + + readonly property int item_count: Constants.API.app.orders_mdl.limit_nb_elements + readonly property + var options: [5, 10, 25, 50, 100, 200] + + Layout.preferredWidth: (root.width / 100) * 14 + Layout.maximumWidth: 62 + Layout.preferredHeight: 35 + Layout.alignment: Qt.AlignLeft + + model: options + currentIndex: options.indexOf(item_count) + onCurrentValueChanged: Constants.API.app.orders_mdl.limit_nb_elements = currentValue + } + + DexText + { + Layout.preferredWidth: (root.width / 100) * 16 + Layout.leftMargin: 20 + Layout.alignment: Qt.AlignLeft + font.pixelSize: 12 + text: qsTr("items per page") + color: Dex.CurrentTheme.foregroundColor2 + } + + Item + { + Layout.fillWidth: true + } + + PaginationButton + { + Layout.preferredWidth: (root.width / 100) * 5 + Layout.preferredHeight: width + radius: 20 + opacity: enabled ? 1 : .5 + Qaterial.ColorIcon + { + anchors.centerIn: parent + iconSize: 14 + color: Dex.CurrentTheme.foregroundColor + source: Qaterial.Icons.skipPreviousOutline + } + enabled: currentValue > 1 + onClicked: { + --Constants.API.app.orders_mdl.current_page + refreshBtn() + } + } + + + Repeater + { + id: btnGroup + model: + [{ + number: 1, + selected: true + }] + delegate: PaginationButton + { + text: modelData.number === -1 ? "..." : ("" + modelData.number) + radius: 30 + Layout.preferredWidth: (root.width / 100) * 4 + Layout.preferredHeight: width + Layout.alignment: Qt.AlignVCenter + color: modelData.number === currentValue ? 'transparent' : Dex.CurrentTheme.buttonColorEnabled + onClicked: { + if (currentValue !== model.modelData) { + Constants.API.app.orders_mdl.current_page = btnGroup.model[index].number + refreshBtn() + } + } + } + } + + PaginationButton + { + Layout.preferredWidth: (root.width / 100) * 5 + Layout.preferredHeight: width + radius: 20 + opacity: enabled ? 1 : .5 + Qaterial.ColorIcon + { + anchors.centerIn: parent + iconSize: 14 + color: Dex.CurrentTheme.foregroundColor + source: Qaterial.Icons.skipNextOutline + } + enabled: pageSize > 1 && currentValue < pageSize + onClicked: { + ++Constants.API.app.orders_mdl.current_page + refreshBtn() + } + + } +} diff --git a/atomic_defi_design/Dex/Components/DexPopup.qml b/atomic_defi_design/Dex/Components/DexPopup.qml new file mode 100644 index 0000000000..2a27f0685e --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexPopup.qml @@ -0,0 +1,124 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 + +import Qaterial 1.0 as Qaterial + +Qaterial.Popup +{ + id: root + + parent: Overlay.overlay + + spacing: 8 + padding: 4 + + property int arrowXDecalage: 0 + property int _arrowOrigin + property color backgroundColor: Qaterial.Style.dialogColor + + function openAt(origin, transformOrigin) { + root.transformOrigin = transformOrigin + root._arrowOrigin = transformOrigin + + if (transformOrigin === Item.Top || transformOrigin === Item.Bottom) + x = origin.x - implicitWidth / 2 + else if (transformOrigin === Item.Left) + x = origin.x + spacing + else + x = origin.x - implicitWidth - spacing + + if (transformOrigin === Item.Left || transformOrigin === Item.Right) + y = origin.y - implicitHeight / 2 + else if (transformOrigin === Item.Top) + y = origin.y + spacing + else + y = origin.y - implicitHeight - spacing + + open() + } + + background: Item + { + implicitWidth: 50 + implicitHeight: Qaterial.Style.menu.implicitHeight + + Rectangle + { + anchors.fill: parent + + radius: 18 + color: root.backgroundColor + layer.enabled: true + layer.effect: Qaterial.ElevationEffect + { + elevation: Qaterial.Style.menu.elevation + } // ElevationEffect + } + + Rectangle + { + x: { + if (root._arrowOrigin === Item.Top || root._arrowOrigin === Item.Bottom) + return ((parent.width - width) / 2) + root.arrowXDecalage + else if (root._arrowOrigin === Item.Left) + return (-width / 2) + root.arrowXDecalage + else + return (parent.width - width / 2) + root.arrowXDecalage + } + y: { + if (root._arrowOrigin === Item.Left || root._arrowOrigin === Item.Right) + return (parent.height - height) / 2 + else if (root._arrowOrigin === Item.Top) + return -height / 2 + else + return parent.height - height / 2 + } + width: 8 + height: 8 + rotation: 45 + color: root.backgroundColor + } // Triangle + } // Rectangle + + enter: Transition { + NumberAnimation { + property: "scale" + from: 0.0 + to: 1.0 + easing.type: Easing.OutQuint + duration: 220 + } + + NumberAnimation { + property: "opacity" + from: 0.0 + to: 1.0 + easing.type: Easing.OutCubic + duration: 150 + } + // NumberAnimation + } + // Transition + + exit: Transition { + NumberAnimation { + property: "scale" + from: 1.0 + to: 0.0 + easing.type: Easing.OutQuint + duration: 220 + } + // NumberAnimation + + NumberAnimation { + property: "opacity" + from: 1.0 + to: 0.0 + easing.type: Easing.OutCubic + duration: 150 + } + // NumberAnimation + } + // Transition +} +// Popup diff --git a/atomic_defi_design/qml/Components/DexRangeSlider.qml b/atomic_defi_design/Dex/Components/DexRangeSlider.qml similarity index 96% rename from atomic_defi_design/qml/Components/DexRangeSlider.qml rename to atomic_defi_design/Dex/Components/DexRangeSlider.qml index 45abae66c5..b138b4ce81 100644 --- a/atomic_defi_design/qml/Components/DexRangeSlider.qml +++ b/atomic_defi_design/Dex/Components/DexRangeSlider.qml @@ -4,19 +4,21 @@ import QtQuick.Controls 2.15 import QtQuick.Layouts 1.12 import QtWebEngine 1.8 import "../Exchange/Trade/" -import "../Constants/" as Constants +import "../Constants/" +as Constants RangeSlider { id: control - opacity: enabled? 1 : .5 + opacity: enabled ? 1 : .5 first.value: 0.25 second.value: .75 property color rangeDistanceColor: Constants.Style.colorGreen property color rangeBackgroundColor: Constants.Style.colorTheme9 property bool firstDisabled: false - property var defaultFirstValue: 0.0 + property + var defaultFirstValue: 0.0 property alias leftText: _left_item.text property alias halfText: _half_item.text @@ -43,7 +45,7 @@ RangeSlider { } } first.onValueChanged: { - if(firstDisabled) { + if (firstDisabled) { first.value = defaultFirstValue } } @@ -120,4 +122,4 @@ RangeSlider { text_value: qsTr("Max") } -} +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexRectangle.qml b/atomic_defi_design/Dex/Components/DexRectangle.qml new file mode 100644 index 0000000000..38fe98b08b --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexRectangle.qml @@ -0,0 +1,27 @@ +import QtQuick 2.15 +import App 1.0 + +import Dex.Themes 1.0 as Dex + +AnimatedRectangle { + id: rect + property bool sizeAnimation: false + property int sizeAnimationDuration: 150 + radius: DexTheme.rectangleRadius + color: Dex.CurrentTheme.backgroundColor + border.color: color + border.width: 1 + + Behavior on width { + enabled: rect.sizeAnimation + NumberAnimation { + duration: rect.sizeAnimationDuration + } + } + Behavior on height { + enabled: rect.sizeAnimation + NumberAnimation { + duration: rect.sizeAnimationDuration + } + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexScrollBar.qml b/atomic_defi_design/Dex/Components/DexScrollBar.qml new file mode 100644 index 0000000000..c17969e286 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexScrollBar.qml @@ -0,0 +1,42 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import App 1.0 +import Dex.Themes 1.0 as Dex + + +ScrollBar +{ + id: control + + anchors.right: root.right + anchors.rightMargin: 0 + policy: scrollbar_visible ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff + property bool visibleBackground: true + width: 6 + + contentItem: Item + { + DexRectangle + { + width: parent.width + height: parent.height + anchors.verticalCenter: parent.verticalCenter + + color: Dex.CurrentTheme.scrollBarIndicatorColor + } + } + + background: Item + { + width: 6 + DexRectangle + { + visible: control.visibleBackground + width: parent.width + height: parent.height + anchors.verticalCenter: parent.verticalCenter + color: Dex.CurrentTheme.scrollBarBackgroundColor + } + } +} diff --git a/atomic_defi_design/Dex/Components/DexSelectableButton.qml b/atomic_defi_design/Dex/Components/DexSelectableButton.qml new file mode 100644 index 0000000000..0bf8c8cddd --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexSelectableButton.qml @@ -0,0 +1,50 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtGraphicalEffects 1.0 +import Qt.labs.settings 1.0 + +import App 1.0 + +import QtQuick.Window 2.12 + +import Qaterial 1.0 as Qaterial + +Item { + property bool selected: false + property alias text: _label.text + property alias hovered: area.containsMouse + property bool outlined: false + + anchors.horizontalCenter: parent.horizontalCenter + + width: parent.width - 20 + height: 45 + + signal clicked() + + DexRectangle { + anchors.fill: parent + height: 45 + radius: 5 + opacity: parent.hovered ? .6 : !parent.selected ? 0 : .9 + color: outlined ? 'transparent' : DexTheme.accentColor + border.color: outlined ? DexTheme.accentColor : 'transparent' + } + + DexLabel { + id: _label + anchors.centerIn: parent + font: DexTypo.button + color: DexTheme.foregroundColor + text: "" + opacity: area.containsMouse ? 1 : .7 + } + + DexMouseArea { + id: area + hoverEnabled: true + onClicked: parent.clicked() + anchors.fill: parent + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexSplitView.qml b/atomic_defi_design/Dex/Components/DexSplitView.qml new file mode 100644 index 0000000000..f6a1209ef0 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexSplitView.qml @@ -0,0 +1,9 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +SplitView { + + property + var items: [] + +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexSubstractRectangle.qml b/atomic_defi_design/Dex/Components/DexSubstractRectangle.qml new file mode 100644 index 0000000000..1fe19e541b --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexSubstractRectangle.qml @@ -0,0 +1,43 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 + +import Qaterial 1.0 as Qaterial +import Qt.labs.settings 1.0 +import AtomicDEX.MarketMode 1.0 + +import "../Constants" +import App 1.0 + +Rectangle { + id: _mask + property + var target + property alias subStractItem: maskSubstract + anchors.fill: target + color: "transparent" + visible: true + radius: 10 + Rectangle { + id: maskSubstract + x: parent.width - 20 + anchors.verticalCenter: parent.verticalCenter + radius: 100 + width: 60 + height: 60 + } + layer.enabled: true + layer.samplerName: "maskSource" + layer.effect: ShaderEffect { + property variant source: _mask.target + fragmentShader: " + varying highp vec2 qt_TexCoord0; + uniform highp float qt_Opacity; + uniform lowp sampler2D source; + uniform lowp sampler2D maskSource; + void main(void) { + gl_FragColor = texture2D(source, qt_TexCoord0.st) * (1.0 - texture2D(maskSource, qt_TexCoord0.st).a) * qt_Opacity; + } + " + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexSweetComboBox.qml b/atomic_defi_design/Dex/Components/DexSweetComboBox.qml new file mode 100644 index 0000000000..cc47e64e63 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexSweetComboBox.qml @@ -0,0 +1,219 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.impl 2.15 + +import Qaterial 1.0 as Qaterial + +import "../Constants" as Constants +import App 1.0 +import Dex.Themes 1.0 as Dex + +ComboBox +{ + id: control + + property alias radius: bg_rect.radius + property color comboBoxBackgroundColor: Dex.CurrentTheme.comboBoxBackgroundColor + property color popupBackgroundColor: Dex.CurrentTheme.floatingBackgroundColor + property color highlightedBackgroundColor: Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor + property color mainBackgroundColor: Dex.CurrentTheme.floatingBackgroundColor + property string currentTicker: "All" + property var dropdownLineText: m => textRole === "" ? + m.modelData : !m.modelData ? + m[textRole] : m.modelData[textRole] + + // Combobox Dropdown Button Background + background: DexRectangle + { + id: bg_rect + implicitHeight: 40 + color: comboBoxBackgroundColor + radius: 20 + } + + contentItem: DexLabel + { + leftPadding: 10 + verticalAlignment: Text.AlignVCenter + width: bg_rect.width - leftPadding + height: bg_rect.height + text: control.currentTicker + elide: Text.ElideRight + wrapMode: Text.NoWrap + } + + // Each dropdown item + delegate: ItemDelegate + { + id: combo_item + width: control.width + 50 + highlighted: control.highlightedIndex === index + + contentItem: DexLabel + { + text_value: control.currentTicker + color: Dex.CurrentTheme.foregroundColor + } + + background: DexRectangle { + anchors.fill: combo_item + color: combo_item.highlighted ? highlightedBackgroundColor : mainBackgroundColor + } + } + + indicator: Qaterial.Icon + { + x: control.mirrored ? control.padding : control.width - width - control.padding - 4 + y: control.topPadding + (control.availableHeight - height) / 2 + color: Dex.CurrentTheme.foregroundColor + icon: Qaterial.Icons.chevronDown + } + + // Dropdown itself + popup: Popup + { + id: combo_popup + readonly property double max_height: 450 + + width: control.width + height: Math.min(contentItem.implicitHeight, max_height) + 20 + + padding: 1 + + contentItem: ColumnLayout + { + anchors.rightMargin: 5 + + DefaultTextField + { + id: input_coin_filter + placeholderText: qsTr("Search") + + font.pixelSize: 16 + Layout.fillWidth: true + Layout.leftMargin: 0 + Layout.preferredHeight: 40 + Layout.rightMargin: 2 + Layout.topMargin: Layout.leftMargin + + background: DexRectangle + { + anchors.fill: parent + anchors.topMargin: -5 + anchors.rightMargin: -1 + radius: control.radius + color: control.mainBackgroundColor + } + + onTextChanged: control.model.setFilterFixedString(text) + + function reset() + { + text = "" + } + + Connections + { + target: popup + function onOpened() + { + input_coin_filter.reset() + input_coin_filter.forceActiveFocus() + } + + function onClosed() + { + input_coin_filter.reset() + } + } + + Keys.onDownPressed: control.incrementCurrentIndex() + Keys.onUpPressed: control.decrementCurrentIndex() + Keys.onPressed: + { + if (event.key === Qt.Key_Return) + { + if (control.count > 0) + { + control.currentIndex = 0; + control.currentTicker = control.currentText; + } + popup.close(); + event.accepted = true; + } + } + } + + Item + { + Layout.maximumHeight: popup.max_height - 100 + Layout.fillWidth: true + implicitHeight: popup_list_view.contentHeight + 5 + + DexListView + { + id: popup_list_view + model: control.popup.visible ? control.model : null + currentIndex: control.highlightedIndex + anchors.fill: parent + anchors.bottomMargin: 10 + anchors.rightMargin: 2 + clip: true + + visibleBackground: true + + highlight: DefaultRectangle + { + radius: 0 + } + + delegate: ItemDelegate + { + width: control.width + 50 + highlighted: control.highlightedIndex === index + contentItem: DefaultText + { + text_value: "" + ticker + "" + " %1".arg(General.coinName(ticker)) + } + + background: DefaultRectangle + { + colorAnimation: false + color: popup_list_view.currentIndex === index ? Dex.CurrentTheme.buttonColorHovered : control.mainBackgroundColor + } + + onClicked: + { + control.currentTicker = ticker + popup.close() + } + } + + DexMouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + } + } + } + + } + + background: DefaultRectangle + { + width: parent.width + height: parent.height + radius: control.radius + color: control.popupBackgroundColor + colorAnimation: false + border.width: 1 + } + } + + DefaultMouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + } +} diff --git a/atomic_defi_design/Dex/Components/DexSwitch.qml b/atomic_defi_design/Dex/Components/DexSwitch.qml new file mode 100644 index 0000000000..10fd5a6090 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexSwitch.qml @@ -0,0 +1,145 @@ +//! Qt Imports. +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Universal 2.15 + +//! Projects Imports. +import "../Constants" +import App 1.0 +import Dex.Themes 1.0 as Dex + +Switch +{ + id: control + + property alias label: _label + property alias label2: _label2 + property alias switchButtonWidth: _indicator.width + property alias switchButtonHeight: _indicator.height + property alias switchButtonRadius: _indicator.radius + property alias mouseArea: _mouseArea + property color textColor: Dex.CurrentTheme.foregroundColor + property int labelWidth: label.text == '' ? 0 : 120 + + width: labelWidth + 60 + height: 50 + + font.family: DexTypo.fontFamily + indicator: DefaultRectangle + { + id: _indicator + width: 52 + height: 28 + radius: 13 + anchors.verticalCenter: control.verticalCenter + + gradient: Gradient + { + orientation: Gradient.Horizontal + GradientStop + { + position: 0 + color: Dex.CurrentTheme.switchGradientStartColor + } + GradientStop + { + position: 0.9311 + color: Dex.CurrentTheme.switchGradientEndColor + } + } + + Rectangle + { + visible: !control.checked + width: parent.width - 4 + height: parent.height - 4 + radius: parent.radius + x: 2 + y: 2 + + gradient: Gradient + { + orientation: Gradient.Horizontal + GradientStop + { + position: 0; + color: control.checked ? Dex.CurrentTheme.switchGradientStartColor : Dex.CurrentTheme.switchGradientStartColor2 + } + GradientStop + { + position: 0.9311; + color: control.checked ? Dex.CurrentTheme.switchGradientEndColor : Dex.CurrentTheme.switchGradientEndColor2 + } + } + } + + Rectangle + { + x: control.checked ? parent.width - width - 4 : 4 + y: 3 + width: parent.width / 2 - 2 + height: parent.height - 6 + radius: parent.radius + 2 + + gradient: Gradient + { + orientation: Gradient.Horizontal + GradientStop + { + position: 0; + color: control.checked ? Dex.CurrentTheme.switchGradientStartColor2 : Dex.CurrentTheme.switchGradientStartColor + } + GradientStop + { + position: 0.9311; + color: control.checked ? Dex.CurrentTheme.switchGradientEndColor2 : Dex.CurrentTheme.switchGradientEndColor + } + } + } + } + + ColumnLayout + { + Layout.preferredWidth: labelWidth + Layout.preferredHeight: control.height + Layout.alignment: Qt.AlignVCenter + anchors.verticalCenter: control.verticalCenter + + visible: _label.text != '' + + DefaultText + { + id: _label + Layout.fillHeight: true + Layout.alignment: Qt.AlignVCenter + visible: _label.text != '' + font: control.font + color: control.textColor + leftPadding: _indicator.width + control.spacing + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + wrapMode: Label.Wrap + } + + DefaultText + { + id: _label2 + Layout.fillHeight: true + visible: _label2.text != '' + font: DexTypo.caption + color: control.textColor + leftPadding: _indicator.width + control.spacing + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + wrapMode: Label.Wrap + } + } + + DefaultMouseArea + { + id: _mouseArea + anchors.fill: control + acceptedButtons: Qt.NoButton + } +} diff --git a/atomic_defi_design/Dex/Components/DexText.qml b/atomic_defi_design/Dex/Components/DexText.qml new file mode 100644 index 0000000000..456b18b017 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexText.qml @@ -0,0 +1,28 @@ +import QtQuick 2.15 +import "../Constants" +import App 1.0 + +Text { + property string text_value + property bool privacy: false + + Behavior on color { + ColorAnimation { + duration: Style.animationDuration + } + } + + font: DexTypo.body1 + color: DexTheme.foregroundColor + text: privacy && General.privacy_mode ? General.privacy_text : text_value + wrapMode: Text.WordWrap + + onLinkActivated: Qt.openUrlExternally(link) + linkColor: color + + DefaultMouseArea { + anchors.fill: parent + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + acceptedButtons: Qt.NoButton + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexTextArea.qml b/atomic_defi_design/Dex/Components/DexTextArea.qml new file mode 100644 index 0000000000..80cf2133b4 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexTextArea.qml @@ -0,0 +1,60 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import "../Constants" +import App 1.0 + +TextArea { + id: text_field + + font.family: Style.font_family + + placeholderTextColor: Style.colorPlaceholderText + selectedTextColor: Style.colorSelectedText + selectionColor: Style.colorSelection + + Behavior on color { + ColorAnimation { + duration: Style.animationDuration + } + } + Behavior on placeholderTextColor { + ColorAnimation { + duration: Style.animationDuration + } + } + + property bool remove_newline: true + wrapMode: TextEdit.Wrap + + Keys.onBacktabPressed: nextItemInFocusChain(false).forceActiveFocus(Qt.TabFocusReason) + Keys.onTabPressed: nextItemInFocusChain().forceActiveFocus(Qt.TabFocusReason) + + Keys.onPressed: { + if (event.key === Qt.Key_Return) { + if (onReturn !== undefined) { + onReturn() + } + + // Ignore \n \r stuff + if (remove_newline) event.accepted = true + } + } + + onTextChanged: { + if (remove_newline) { + if (text.indexOf('\r') !== -1 || text.indexOf('\n') !== -1) { + text = text.replace(/[\r\n]/, '') + } + } + } + + // Right click Context Menu + selectByMouse: true + persistentSelection: true + + background: InnerBackground { + auto_set_size: false + } + + RightClickMenu {} +} \ No newline at end of file diff --git a/atomic_defi_design/qml/Components/DexTextEdit.qml b/atomic_defi_design/Dex/Components/DexTextEdit.qml similarity index 81% rename from atomic_defi_design/qml/Components/DexTextEdit.qml rename to atomic_defi_design/Dex/Components/DexTextEdit.qml index c2433b4e01..1c034b5461 100644 --- a/atomic_defi_design/qml/Components/DexTextEdit.qml +++ b/atomic_defi_design/Dex/Components/DexTextEdit.qml @@ -1,5 +1,6 @@ import QtQuick 2.15 import "../Constants" +import App 1.0 TextEdit { property string text_value @@ -16,7 +17,11 @@ TextEdit { selectedTextColor: Style.colorSelectedText selectionColor: Style.colorSelection - Behavior on color { ColorAnimation { duration: Style.animationDuration } } + Behavior on color { + ColorAnimation { + duration: Style.animationDuration + } + } onLinkActivated: Qt.openUrlExternally(link) @@ -25,4 +30,4 @@ TextEdit { cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor acceptedButtons: Qt.NoButton } -} +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexTextField.qml b/atomic_defi_design/Dex/Components/DexTextField.qml new file mode 100644 index 0000000000..1764675b85 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexTextField.qml @@ -0,0 +1,87 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import "../Constants" +import App 1.0 +import Dex.Themes 1.0 as Dex + +TextField +{ + id: text_field + + property alias left_text: left_text.text_value + property alias right_text: right_text.text_value + property alias radius: background.radius + property color backgroundColor: Dex.CurrentTheme.textFieldBackgroundColor + property color backgroundColorActive: Dex.CurrentTheme.textFieldActiveBackgroundColor + property bool forceFocus: false + + font: DexTypo.body2 + placeholderTextColor: Dex.CurrentTheme.textPlaceholderColor + selectedTextColor: Dex.CurrentTheme.textSelectedColor + selectionColor: Dex.CurrentTheme.textSelectionColor + color: enabled ? Dex.CurrentTheme.foregroundColor : Dex.CurrentTheme.textDisabledColor + + // Right click Context Menu + selectByMouse: true + persistentSelection: true + + leftPadding: Math.max(0, left_text.width + 20) + rightPadding: Math.max(0, right_text.width + 20) + + background: DefaultRectangle + { + id: background + color: text_field.focus ? backgroundColorActive : backgroundColor + radius: 18 + anchors.fill: parent + } + + Behavior on color + { + ColorAnimation + { + duration: Style.animationDuration + } + } + + Behavior on placeholderTextColor + { + ColorAnimation + { + duration: Style.animationDuration + } + } + + RightClickMenu {} + + DexLabel + { + id: left_text + visible: text_value !== "" + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.verticalCenter: parent.verticalCenter + color: Dex.CurrentTheme.textFieldPrefixColor + font.pixelSize: text_field.font.pixelSize + } + + DexLabel + { + id: right_text + visible: text_value !== "" + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.verticalCenter: parent.verticalCenter + color: Dex.CurrentTheme.textFieldSuffixColor + font.pixelSize: text_field.font.pixelSize + } + + Component.onCompleted: + { + if (forceFocus) text_field.forceActiveFocus() + } + + onVisibleChanged: { + if (forceFocus && visible) text_field.forceActiveFocus() + } +} diff --git a/atomic_defi_design/Dex/Components/DexTooltip.qml b/atomic_defi_design/Dex/Components/DexTooltip.qml new file mode 100644 index 0000000000..070374053a --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexTooltip.qml @@ -0,0 +1,24 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 +import Dex.Themes 1.0 as Dex + + +ToolTip +{ + id: control + property bool background_visible: true + + contentItem: DexLabel + { + text: control.text + font: control.font + color: Dex.CurrentTheme.foregroundColor + } + + background: FloatingBackground + { + visible: background_visible + color: Dex.CurrentTheme.accentColor + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/DexTradeBox.qml b/atomic_defi_design/Dex/Components/DexTradeBox.qml new file mode 100644 index 0000000000..baadc04fc0 --- /dev/null +++ b/atomic_defi_design/Dex/Components/DexTradeBox.qml @@ -0,0 +1,362 @@ +import QtQuick 2.15 +import Qaterial 1.0 as Qaterial +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.12 +import "../Exchange/Trade/" +import App 1.0 +import Dex.Themes 1.0 as Dex + +Rectangle { + id: _control + signal reload() + + property bool hideHeader: false + property bool visibility: isVertical ? height >= 40 ? true : false : width >= 40 ? true : false + property bool hidden: false + property bool closed: false + property bool expandedVert: false + property bool expandedHort: false + property bool showed: true + property bool canBeFull: false + property bool duplicable: false + property bool closable: false + property bool expandable: true + property bool fullScreen: false + property string title: "Default Title" + property int minimumHeight: isVertical ? 40 : 250 + property int minimumWidth: isVertical ? 40 : 250 + property int maximumHeight: 9999999 + property int maximumWidth: 9999999 + property int defaultHeight: 250 + property int defaultWidth: 250 + property bool reloadable: false + property bool contentVisible: !hidden + property bool isVertical: _control.parent.parent.orientation === Qt.Vertical + radius: 3 + + function setHeight(height) { + SplitView.preferredHeight = height + } + + function setWidth(width) { + SplitView.preferredWidth = width + } + + onHiddenChanged: { + if (isVertical && hidden) { + SplitView.preferredHeight = 40 + SplitView.minimumHeight = 40 + SplitView.maximumHeight = 40 + } else if (isVertical && !hidden) { + SplitView.preferredHeight = defaultHeight + SplitView.minimumHeight = minimumHeight + SplitView.maximumHeight = maximumHeight + SplitView.fillHeight = true + SplitView.view.update() + } else if (!isVertical && hidden) { + SplitView.preferredWidth = 40 + SplitView.minimumWidth = 40 + SplitView.maximumWidth = 40 + } else if (!isVertical && !hidden) { + SplitView.preferredWidth = defaultWidth + SplitView.minimumWidth = minimumWidth + SplitView.maximumWidth = maximumWidth + SplitView.fillWidth = true + + } + } + + color: Dex.CurrentTheme.floatingBackgroundColor + //border.color: DexTheme.proviewItemBoxBorderColor + //border.width: DexTheme.proviewItemBoxBorderWidth + + property alias titleLabel: _texto + + function setFalseHeight() { + SplitView.fillHeight = false + } + + onExpandedVertChanged: { + let splitManager = SplitView.view + if (expandedVert) { + if (splitManager !== null) { + for (var i = 0; i < splitManager.itemLists.length; i++) { + let item = splitManager.itemLists[i] + if (item !== _control) { + try { + item.expandedVert = false + item.setFalseHeight() + } catch (e) {} + } + } + SplitView.fillHeight = true + } + } else { + var setted = false + if (splitManager !== null) { + for (var i = 0; i < splitManager.itemLists.length; i++) { + let item = splitManager.itemLists[i] + if (item !== _control && setted === false) { + try { + item.expandedVert = true + setted = true + } catch (e) {} + } + } + setFalseHeight() + } + } + } + + function setFalseWidth() { + SplitView.fillWidth = false + } + + /*onExpandedHortChanged: { + let splitManager = SplitView.view + if(expandedHort) { + if(splitManager==null){ + for(var i=0; i