diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 3a058c8b6c..a6c06597fa 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,6 +1,6 @@ --- name: Bug report -about: Create a report to help us improve +about: Something looks wierd or doesn't work as expected? Let us know the details so we can fix it! title: "[BUG]: " labels: bug assignees: '' @@ -8,25 +8,28 @@ 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 ] + - AtomicDEX Version: [e.g. 0.5.7] + - 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-atomicdex-desktop-log-files/540) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 89af96c70e..11f973fa6c 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: '' --- **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 to 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 frm 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..c3b49f6c2a --- /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/atomicdex-desktop-collection/541) +[Develper Documentation](https://developers.komodoplatform.com/) \ No newline at end of file diff --git a/.github/workflows/atomicdex-desktop-ci.yml b/.github/workflows/atomicdex-desktop-ci.yml index 4f6964f310..0da80bdc12 100644 --- a/.github/workflows/atomicdex-desktop-ci.yml +++ b/.github/workflows/atomicdex-desktop-ci.yml @@ -12,10 +12,13 @@ on: - cron: '0 0 * * 1' env: + DEX_API: "mm2" + DEX_RPCPORT: 7783 + DEX_RPC: "http://127.0.0.1:7783" DEX_PROJECT_NAME: "atomicdex-desktop-ce" DEX_DISPLAY_NAME: "AtomicDex Desktop CE" - DEX_COMPANY: "KomodoPlatform" - DEX_WEBSITE: "https://atomicdex.io/" + DEX_COMPANY: "Komodian" + DEX_WEBSITE: "https://komodian.org/" jobs: @@ -27,31 +30,50 @@ 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 @@ -64,55 +86,74 @@ jobs: with: python-version: '3.9' - - name: Install QT (Linux) - if: runner.os == 'Linux' + - name: Install MSVC + if: runner.os == 'Windows' + uses: ilammy/msvc-dev-cmd@v1.4.1 + + - 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: KomodoPlatform/install-qt-action@v2.14.0 with: version: ${{ matrix.qt }} setup-python: 'false' - host: 'linux' + host: ${{ matrix.host }} target: 'desktop' dir: '${{ github.workspace }}' modules: 'qtcharts qtwidgets debug_info qtwebengine qtwebview' - aqtversion: '==0.8' - py7zrversion: '==0.6' - - name: Install QT (MacOS) - if: runner.os == 'macOS' + - name: Install QT (Linux) + if: runner.os == 'Linux' uses: KomodoPlatform/install-qt-action@v2.14.0 with: version: ${{ matrix.qt }} setup-python: 'false' - host: 'mac' + host: ${{ matrix.host }} target: 'desktop' 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.4.1 qt.tools.ifw.44 --outputdir ${{ github.workspace }}/Qt - echo "${{ github.workspace }}/Qt/Tools/QtInstallerFramework/4.4/bin" >> $GITHUB_PATH + modules: 'qtcharts qtwidgets debug_info qtwebengine qtwebview' + aqtversion: '==0.8' + py7zrversion: '==0.6' - name: Install QT (Windows) if: runner.os == 'Windows' uses: KomodoPlatform/install-qt-action@v2.14.0 with: version: ${{ matrix.qt }} - host: 'windows' + host: ${{ matrix.host }} target: 'desktop' arch: 'win64_msvc2019_64' dir: 'C:\' modules: 'qtcharts qtwidgets debug_info qtwebview qtwebengine' + - name: Install QT IFW (MacOS) + if: runner.os == 'macOS' + run: | + python3 -m aqt tool ${{ matrix.host }} tools_ifw 4.5.1 qt.tools.ifw.45 --outputdir ${{ github.workspace }}/Qt + echo "${{ github.workspace }}/Qt/Tools/QtInstallerFramework/4.5/bin" >> $GITHUB_PATH + - name: Install QT IFW (Windows) if: runner.os == 'Windows' run: | python -m pip install --upgrade pip - python -m aqt tool windows tools_ifw 4.4.1 qt.tools.ifw.44 --outputdir C:/Qt - echo "C:/Qt/Tools/QtInstallerFramework/4.4/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - echo $env:GITHUB_PATH - echo $env:PATH + python -m aqt tool ${{ matrix.host }} tools_ifw 4.5.1 qt.tools.ifw.45 --outputdir C:/Qt + echo "C:/Qt/Tools/QtInstallerFramework/4.5/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Install nim (Linux) if: runner.os == 'Linux' @@ -125,7 +166,6 @@ jobs: chmod +x choosenim.sh ./choosenim.sh -y export PATH=/home/runner/.nimble/bin:$PATH - ls /home/runner/.choosenim/toolchains chmod +x /home/runner/.choosenim/toolchains/nim-1.4.8/bin/* - name: Install deps (Linux) @@ -135,11 +175,20 @@ 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 @@ -150,52 +199,27 @@ jobs: setupOnly: true appendedCacheKey: ${{ hashFiles('vcpkg.json') }} - - 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: import code signing certificates (macos) + # if: runner.os == 'macOS' && 'KomodoPlatform/atomicDEX-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/atomicDEX-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: Build AtomicDEX (Linux) - if: runner.os == 'Linux' - run: | - 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++-12 - export CC=clang-12 - 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' @@ -207,27 +231,17 @@ jobs: export ASC_PUBLIC_ID="${{ secrets.ASC_PUBLIC_ID }}" export QT_INSTALL_CMAKE_PATH=${{ github.workspace }}/Qt/${{ matrix.qt }}/clang_64/lib/cmake export QT_ROOT=${{ github.workspace }}/Qt/${{ matrix.qt }} - export MACOSX_DEPLOYMENT_TARGET=10.13 + 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.14.sdk --compiler=clang++ + ./ci_tools_atomic_dex bundle ${{ matrix.type }} --osx_sdk=$HOME/sdk/MacOSX10.15.sdk --compiler=clang++ - - name: Build AtomicDEX (Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $Env:QT_VERSION = "${{ matrix.qt }}" - .\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 + - name: Build AtomicDEX (Linux) + if: runner.os == 'Linux' 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 @@ -236,57 +250,31 @@ jobs: #export LDFLAGS=-stdlib=libc++ export CXX=clang++-12 export CC=clang-12 - 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" + cd ci_tools_atomic_dex + nimble build -y - - 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" + ./ci_tools_atomic_dex build ${{ matrix.type }} + ./ci_tools_atomic_dex bundle ${{ matrix.type }} - - name: Running Tests (Windows) + + - name: Build AtomicDEX (Windows) + if: runner.os == 'Windows' shell: powershell - 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" - 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 ".*" + $Env:QT_VERSION = "${{ matrix.qt }}" + .\ci_tools_atomic_dex\ci_scripts\windows_script.ps1 - 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' @@ -315,7 +303,6 @@ jobs: - 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 @@ -340,7 +327,7 @@ jobs: 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' @@ -357,3 +344,61 @@ jobs: 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/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 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/atomicDEX-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 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/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" + #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 8ce53e0185..dd678373a9 100644 --- a/.github/workflows/atomicdex-desktop-release-vt.yml +++ b/.github/workflows/atomicdex-desktop-release-vt.yml @@ -10,7 +10,7 @@ jobs: steps: - name: VirusTotal Scan - uses: crazy-max/ghaction-virustotal@v2.4.1 + uses: crazy-max/ghaction-virustotal@v3.1.0 with: vt_api_key: ${{ secrets.VT_API_KEY }} github_token: ${{ github.token }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b1c01a392..1056b03058 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ include(vcpkg_prerequisites) include(qt_prerequisites) include(cfg_hash) -project(${DEX_PROJECT_NAME} LANGUAGES CXX VERSION 0.5.6) +project(${DEX_PROJECT_NAME} LANGUAGES CXX VERSION 0.5.7) message(STATUS "${PROJECT_NAME} is version ${PROJECT_VERSION}") include(cmake_default_options) @@ -61,13 +61,13 @@ endif () ##! We fetch our dependencies if (APPLE) FetchContent_Declare(mm2 - URL https://github.com/KomodoPlatform/atomicDEX-API/releases/download/beta-2.1.7132/mm2-cfb031a21-Darwin-Release.zip) + URL https://github.com/KomodoPlatform/atomicDEX-API/releases/download/beta-2.1.8741/mm2-6e4de5d21-Darwin-Release.zip) elseif (UNIX AND NOT APPLE) FetchContent_Declare(mm2 - URL https://github.com/KomodoPlatform/atomicDEX-API/releases/download/beta-2.1.7132/mm2-cfb031a21-Linux-Release.zip) + URL https://github.com/KomodoPlatform/atomicDEX-API/releases/download/beta-2.1.8741/mm2-6e4de5d21-Linux-Release.zip) else () FetchContent_Declare(mm2 - URL https://github.com/KomodoPlatform/atomicDEX-API/releases/download/beta-2.1.7132/mm2-cfb031a21-Windows_NT-Release.zip) + URL https://github.com/KomodoPlatform/atomicDEX-API/releases/download/beta-2.1.8741/mm2-6e4de5d21-Windows_NT-Release.zip) endif () #FetchContent_Declare(qmaterial URL https://github.com/KomodoPlatform/Qaterial/archive/last-clang-working-2.zip) @@ -88,15 +88,14 @@ 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.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) 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.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}/mm2.exe ${CMAKE_BINARY_DIR}/bin/assets/tools/mm2/${DEX_API}.exe COPYONLY) configure_file(${mm2_SOURCE_DIR}/msvcp140.dll ${CMAKE_BINARY_DIR}/bin/assets/tools/mm2/msvcp140.dll COPYONLY) - configure_file(${mm2_SOURCE_DIR}/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) endif () 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.6-coins.json b/assets/config/0.5.6-coins.json deleted file mode 100644 index f24ad8f9c1..0000000000 --- a/assets/config/0.5.6-coins.json +++ /dev/null @@ -1,10541 +0,0 @@ -{ - "1INCH-AVX20": { - "coin": "1INCH-AVX20", - "name": "1inch", - "coinpaprika_id": "1inch-1inch", - "coingecko_id": "1inch", - "nomics_id": "1INCH", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "1INCH-BEP20": { - "coin": "1INCH-BEP20", - "name": "1inch", - "coinpaprika_id": "1inch-1inch", - "coingecko_id": "1inch", - "nomics_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", - "nomics_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 - }, - "1INCH-HRC20": { - "coin": "1INCH-HRC20", - "name": "1inch", - "coinpaprika_id": "1inch-1inch", - "coingecko_id": "1inch", - "nomics_id": "1INCH", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "1INCH-KRC20": { - "coin": "1INCH-KRC20", - "name": "1inch", - "coinpaprika_id": "1inch-1inch", - "coingecko_id": "1inch", - "nomics_id": "1INCH", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "1INCH-PLG20": { - "coin": "1INCH-PLG20", - "name": "1inch", - "coinpaprika_id": "1inch-1inch", - "coingecko_id": "1inch", - "nomics_id": "1INCH", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "AAVE-AVX20": { - "coin": "AAVE-AVX20", - "name": "Aave", - "coinpaprika_id": "aave-new", - "coingecko_id": "aave", - "nomics_id": "AAVE", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "AAVE-BEP20": { - "coin": "AAVE-BEP20", - "name": "Aave", - "coinpaprika_id": "aave-new", - "coingecko_id": "aave", - "nomics_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", - "nomics_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 - }, - "AAVE-FTM20": { - "coin": "AAVE-FTM20", - "name": "Aave", - "coinpaprika_id": "aave-new", - "coingecko_id": "aave", - "nomics_id": "AAVE", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "AAVE-HCO20": { - "coin": "AAVE-HCO20", - "name": "Aave", - "coinpaprika_id": "aave-new", - "coingecko_id": "aave", - "nomics_id": "AAVE", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "AAVE-HRC20": { - "coin": "AAVE-HRC20", - "name": "Aave", - "coinpaprika_id": "aave-new", - "coingecko_id": "aave", - "nomics_id": "AAVE", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "AAVE-KRC20": { - "coin": "AAVE-KRC20", - "name": "Aave", - "coinpaprika_id": "aave-new", - "coingecko_id": "aave", - "nomics_id": "AAVE", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "AAVE-PLG20": { - "coin": "AAVE-PLG20", - "name": "Aave", - "coinpaprika_id": "aave-new", - "coingecko_id": "aave", - "nomics_id": "AAVE", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "ABY-OLD": { - "coin": "ABY-OLD", - "name": "ArtByte (OLD)", - "coinpaprika_id": "aby-artbyte", - "coingecko_id": "artbyte", - "nomics_id": "ABY2", - "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 - }, - "ABY": { - "coin": "ABY", - "name": "ArtByte", - "coinpaprika_id": "aby-artbyte", - "coingecko_id": "artbyte", - "nomics_id": "ABY2", - "electrum": [ - { - "url": "elec-seeder-one.artbytecoin.org:50012", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "elec-seeder-one.artbytecoin.org:50013" - }, - { - "url": "elec-seeder-two.artbytecoin.org:50012", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "elec-seeder-two.artbytecoin.org:50013" - }, - { - "url": "electrumx-three.artbyte.live:50012", - "protocol": "SSL", - "disable_cert_verification": false, - "ws_url": "electrumx-three.artbyte.live:50013" - }, - { - "url": "electrumx-four.artbyte.live:50012", - "protocol": "SSL", - "disable_cert_verification": false, - "ws_url": "electrumx-four.artbyte.live:50013" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/aby/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "ADA-BEP20": { - "coin": "ADA-BEP20", - "name": "Cardano", - "coinpaprika_id": "ada-cardano", - "coingecko_id": "cardano", - "nomics_id": "ADA", - "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", - "nomics_id": "ADX", - "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", - "nomics_id": "ADX", - "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 - }, - "AGIX-ERC20": { - "coin": "AGIX-ERC20", - "name": "SingularityNET", - "coinpaprika_id": "agix-singularitynet", - "coingecko_id": "singularitynet", - "nomics_id": "AGIX", - "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 - }, - "AGIX-PLG20": { - "coin": "AGIX-PLG20", - "name": "SingularityNET", - "coinpaprika_id": "agix-singularitynet", - "coingecko_id": "singularitynet", - "nomics_id": "AGIX", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "ANKR-BEP20": { - "coin": "ANKR-BEP20", - "name": "Ankr", - "coinpaprika_id": "ankr-ankr-network", - "coingecko_id": "ankr", - "nomics_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", - "nomics_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 - }, - "APE-ERC20": { - "coin": "APE-ERC20", - "name": "ApeCoin", - "coinpaprika_id": "ape-apecoin", - "coingecko_id": "apecoin", - "nomics_id": "APE7", - "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 - }, - "APE-BEP20": { - "coin": "APE-BEP20", - "name": "ApeCoin", - "coinpaprika_id": "ape-apecoin", - "coingecko_id": "apecoin", - "nomics_id": "APE7", - "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 - }, - "ARRR-BEP20": { - "coin": "ARRR-BEP20", - "name": "Pirate", - "coinpaprika_id": "arrr-pirate", - "coingecko_id": "pirate-chain", - "nomics_id": "ARRR", - "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, - "wallet_only": true - }, - "ARPA-BEP20": { - "coin": "ARPA-BEP20", - "name": "ARPA Chain", - "coinpaprika_id": "arpa-arpa-chain", - "coingecko_id": "arpa-chain", - "nomics_id": "ARPA", - "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 - }, - "ARPA-ERC20": { - "coin": "ARPA-ERC20", - "name": "ARPA Chain", - "coinpaprika_id": "arpa-arpa-chain", - "coingecko_id": "arpa-chain", - "nomics_id": "ARPA", - "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", - "nomics_id": "ATOM", - "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", - "nomics_id": "AUR", - "electrum": [ - { - "url": "electrumx.aur.ewmcx.info:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "electrumx.aur.ewmcx.info:50003" - }, - { - "url": "failover.aur.ewmcx.biz:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "failover.aur.ewmcx.biz:50003" - } - ], - "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", - "nomics_id": "AVA", - "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", - "nomics_id": "AVAX", - "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": { - "coin": "AVAX", - "name": "Avalanche", - "coinpaprika_id": "avax-avalanche", - "coingecko_id": "avalanche-2", - "nomics_id": "AVAX", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "AVAXT": { - "coin": "AVAXT", - "name": "Avalanche Testnet", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "is_testnet": true, - "nodes": [ - "https://api.avax-test.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://cchain.explorer.avax-test.network/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "AXE": { - "coin": "AXE", - "name": "Axe", - "coinpaprika_id": "axe-axe", - "coingecko_id": "axe", - "nomics_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 - }, - "AXS-BEP20": { - "coin": "AXS-BEP20", - "name": "Axie Infinity", - "coinpaprika_id": "axs-axie-infinity", - "coingecko_id": "axie-infinity", - "nomics_id": "AXS2", - "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 - }, - "AXS-ERC20": { - "coin": "AXS-ERC20", - "name": "Axie Infinity", - "coinpaprika_id": "axs-axie-infinity", - "coingecko_id": "axie-infinity", - "nomics_id": "AXS2", - "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 - }, - "BABYDOGE-BEP20": { - "coin": "BABYDOGE-BEP20", - "name": "Baby Doge Coin", - "coinpaprika_id": "babydoge-baby-doge-coin", - "coingecko_id": "baby-doge-coin", - "nomics_id": "BABYDOGE2", - "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", - "nomics_id": "BAL", - "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", - "nomics_id": "BAL", - "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 - }, - "BAL-KRC20": { - "coin": "BAL-KRC20", - "name": "Balancer", - "coinpaprika_id": "bal-balancer", - "coingecko_id": "balancer", - "nomics_id": "BAL", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "BAL-PLG20": { - "coin": "BAL-PLG20", - "name": "Balancer", - "coinpaprika_id": "bal-balancer", - "coingecko_id": "balancer", - "nomics_id": "BAL", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "BANANO-BEP20": { - "coin": "BANANO-BEP20", - "name": "Banano", - "coinpaprika_id": "ban-banano", - "coingecko_id": "banano", - "nomics_id": "BAN", - "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-BEP20": { - "coin": "BAND-BEP20", - "name": "Band Protocol", - "coinpaprika_id": "band-band-protocol", - "coingecko_id": "band-protocol", - "nomics_id": "BAND", - "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 - }, - "BAND-FTM20": { - "coin": "BAND-FTM20", - "name": "Band Protocol", - "coinpaprika_id": "band-band-protocol", - "coingecko_id": "band-protocol", - "nomics_id": "BAND", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "BAND-PLG20": { - "coin": "BAND-PLG20", - "name": "Band Protocol", - "coinpaprika_id": "band-band-protocol", - "coingecko_id": "band-protocol", - "nomics_id": "BAND", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "BCH": { - "coin": "BCH", - "coingecko_id": "bitcoin-cash", - "coinpaprika_id": "bch-bitcoin-cash", - "nomics_id": "BCH", - "active": false, - "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" - }, - "BCH-ERC20": { - "coin": "BCH-ERC20", - "name": "Bitcoin Cash", - "coinpaprika_id": "bch-bitcoin-cash", - "coingecko_id": "bitcoin-cash", - "nomics_id": "BCH", - "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 - }, - "BCH-BEP20": { - "coin": "BCH-BEP20", - "name": "Bitcoin Cash", - "coinpaprika_id": "bch-bitcoin-cash", - "coingecko_id": "bitcoin-cash", - "nomics_id": "BCH", - "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 - }, - "BCH-HCO20": { - "coin": "BCH-HCO20", - "name": "Bitcoin Cash", - "coinpaprika_id": "bch-bitcoin-cash", - "coingecko_id": "bitcoin-cash", - "nomics_id": "BCH", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "BIDR-BEP20": { - "coin": "BIDR-BEP20", - "name": "BIDR", - "forex_id": "IDR", - "coinpaprika_id": "bidr-binanceidr", - "coingecko_id": "binanceidr", - "nomics_id": "BIDR", - "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", - "nomics_id": "BLK", - "electrum": [ - { - "url": "electrum1.blackcoin.nl:10002", - "protocol": "SSL", - "disable_cert_verification": false, - "ws_url": "electrum1.blackcoin.nl:10004" - }, - { - "url": "electrum2.blackcoin.nl:20002", - "protocol": "SSL", - "disable_cert_verification": false, - "ws_url": "electrum2.blackcoin.nl:20004" - }, - { - "url": "electrum3.blackcoin.nl:30002", - "protocol": "SSL", - "disable_cert_verification": false, - "ws_url": "electrum3.blackcoin.nl:30004" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/blk/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "BLK-BEP20": { - "coin": "BLK-BEP20", - "name": "BlackCoin", - "coinpaprika_id": "blk-blackcoin", - "coingecko_id": "blackcoin", - "nomics_id": "BLK", - "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 - }, - "tBLK": { - "coin": "tBLK", - "name": "BlackCoin (testnet)", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "is_testnet": true, - "electrum": [ - { - "url": "electrum1.blackcoin.nl:10012", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "electrum1.blackcoin.nl:10014" - }, - { - "url": "electrum2.blackcoin.nl:20012", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "electrum2.blackcoin.nl:20014" - }, - { - "url": "electrum3.blackcoin.nl:30012", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "electrum3.blackcoin.nl:30014" - } - ], - "explorer_url": [ - "https://explorer.blackcoin.nl/" - ], - "explorer_tx_url": "tx/", - "explorer_address_url": "address/", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "BNB": { - "coin": "BNB", - "name": "Binance Coin", - "coinpaprika_id": "bnb-binance-coin", - "coingecko_id": "binancecoin", - "nomics_id": "BNB", - "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 - }, - "BNT-BEP20": { - "coin": "BNT-BEP20", - "name": "Bancor", - "coinpaprika_id": "bnt-bancor", - "coingecko_id": "bancor", - "nomics_id": "BNT", - "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", - "nomics_id": "BNT", - "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 - }, - "BNT-PLG20": { - "coin": "BNT-PLG20", - "name": "Bancor", - "coinpaprika_id": "bnt-bancor", - "coingecko_id": "bancor", - "nomics_id": "BNT", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "BONE-ERC20" : { - "coin": "BONE-ERC20", - "name": "Bone ShibaSwap", - "coinpaprika_id": "bone-bone-shibaswap", - "coingecko_id": "bone-shibaswap", - "nomics_id": "BONE6", - "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 - }, - "BRZ-BEP20": { - "coin": "BRZ-BEP20", - "name": "Brazilian Digital Token", - "forex_id": "BRL", - "coinpaprika_id": "brz-brazilian-digital-token", - "coingecko_id": "brz", - "nomics_id": "BRZ", - "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 - }, - "BRZ-ERC20": { - "coin": "BRZ-ERC20", - "name": "Brazilian Digital Token", - "forex_id": "BRL", - "coinpaprika_id": "brz-brazilian-digital-token", - "coingecko_id": "brz", - "nomics_id": "BRZ", - "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", - "nomics_id": "BSTY", - "electrum": [ - { - "url": "66.172.33.175:50001", - "protocol": "TCP" - }, - { - "url": "bsty-main.coinmunity.gold:50012", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "bsty-main.coinmunity.gold:50013" - }, - { - "url": "bsty-bkp.coinmunity.gold:50012", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "bsty-bkp.coinmunity.gold:50013" - } - ], - "explorer_url": [ - "https://insight.globalboost.info/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "RBTC": { - "coin": "RBTC", - "name": "RSK Smart Bitcoin", - "alias_ticker": "BTC", - "coinpaprika_id": "rbtc-smart-bitcoin", - "coingecko_id": "rootstock", - "nodes": [ - "https://public-node.rsk.co" - ], - "explorer_url": [ - "https://explorer.rsk.co" - ], - "type": "RSK Smart Bitcoin", - "active": false, - "currently_enabled": false - }, - "BTC": { - "coin": "BTC", - "name": "Bitcoin", - "type": "UTXO", - "coingecko_id": "bitcoin", - "coinpaprika_id": "btc-bitcoin", - "nomics_id": "BTC", - "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": "electrum1.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", - "nomics_id": "BTC", - "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 - }, - "BTCZ": { - "coin": "BTCZ", - "name": "BitcoinZ", - "coinpaprika_id": "btcz-bitcoinz", - "coingecko_id": "bitcoinz", - "nomics_id": "BTCZ", - "electrum": [ - { - "url": "electrum1.btcz.rocks:50001", - "ws_url": "electrum1.btcz.rocks:50004" - }, - { - "url": "electrum2.btcz.rocks:50001", - "ws_url": "electrum2.btcz.rocks:50004" - } - ], - "explorer_url": [ - "https://explorer.btcz.rocks/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "BTX": { - "coin": "BTX", - "name": "BitCore", - "coinpaprika_id": "btx-bitcore", - "coingecko_id": "bitcore", - "nomics_id": "BTX", - "electrum": [ - { - "url": "btx-electrumx.coinsmunity.com:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "btx-electrumx.coinsmunity.com:50003" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/btx/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "BTX-BEP20": { - "coin": "BTX-BEP20", - "name": "BitCore", - "coinpaprika_id": "btx-bitcore", - "coingecko_id": "bitcore", - "nomics_id": "BTX", - "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 - }, - "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 - }, - "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 - }, - "BTT-BEP20": { - "coin": "BTT-BEP20", - "name": "BitTorrent (OLD)", - "coinpaprika_id": "btt-bittorrent", - "coingecko_id": "bittorrent-old", - "nomics_id": "BITTORRENT", - "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 - }, - "BTTC-BEP20": { - "coin": "BTTC-BEP20", - "name": "BitTorrent", - "coinpaprika_id": "bttc-bittorrent-chain", - "coingecko_id": "bittorrent", - "nomics_id": "BTT2", - "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 - }, - "BTU-ERC20": { - "coin": "BTU-ERC20", - "name": "BTU Protocol", - "coinpaprika_id": "btu-btu-protocol", - "coingecko_id": "btu-protocol", - "nomics_id": "BTU", - "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-PLG20": { - "coin": "BTU-PLG20", - "name": "BTU Protocol", - "coinpaprika_id": "btu-btu-protocol", - "coingecko_id": "btu-protocol", - "nomics_id": "BTU", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "BUSD-AVX20": { - "coin": "BUSD-AVX20", - "name": "Binance USD", - "coinpaprika_id": "busd-binance-usd", - "coingecko_id": "binance-usd", - "nomics_id": "BUSD", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "BUSD-MVR20": { - "coin": "BUSD-MVR20", - "name": "Binance USD", - "coinpaprika_id": "busd-binance-usd", - "coingecko_id": "binance-usd", - "nomics_id": "BUSD", - "nodes": [ - "https://rpc.api.moonriver.moonbeam.network" - ], - "explorer_url": [ - "https://moonriver.moonscan.io/" - ], - "type": "Moonriver", - "active": false, - "currently_enabled": false - }, - "BUSD-ERC20": { - "coin": "BUSD-ERC20", - "name": "Binance USD", - "coinpaprika_id": "busd-binance-usd", - "coingecko_id": "binance-usd", - "nomics_id": "BUSD", - "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", - "nomics_id": "BUSD", - "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-HRC20": { - "coin": "BUSD-HRC20", - "name": "Binance USD", - "coinpaprika_id": "busd-binance-usd", - "coingecko_id": "binance-usd", - "nomics_id": "BUSD", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "BUSD-PLG20": { - "coin": "BUSD-PLG20", - "name": "Binance USD", - "coinpaprika_id": "busd-binance-usd", - "coingecko_id": "binance-usd", - "nomics_id": "BUSD", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "BTE": { - "coin": "BTE", - "name": "Bitweb", - "type": "UTXO", - "coingecko_id": "bitweb", - "coinpaprika_id": "bte-bitweb", - "nomics_id": "BTE3", - "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 - }, - "CADC-ERC20": { - "coin": "CADC-ERC20", - "name": "CAD Coin", - "forex_id": "CAD", - "coinpaprika_id": "cadc-cad-coin", - "coingecko_id": "cad-coin", - "nomics_id": "CADC", - "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 - }, - "CADC-PLG20": { - "coin": "CADC-PLG20", - "name": "CAD Coin", - "forex_id": "CAD", - "coinpaprika_id": "cadc-cad-coin", - "coingecko_id": "cad-coin", - "nomics_id": "CADC", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "CAKE": { - "coin": "CAKE", - "name": "PancakeSwap", - "coinpaprika_id": "cake-pancakeswap", - "coingecko_id": "pancakeswap-token", - "nomics_id": "CAKE", - "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 - }, - "CASE": { - "coin": "CASE", - "name": "Case Token", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "nomics_id": "CASE", - "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", - "nomics_id": "CDN", - "electrum": [ - { - "url": "mumbai.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "mumbai.ecoincore.com:34335" - }, - { - "url": "holland.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "holland.ecoincore.com:34335" - }, - { - "url": "miami.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "miami.ecoincore.com:34335" - }, - { - "url": "woolloomooloo.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "woolloomooloo.ecoincore.com:34335" - }, - { - "url": "lenoir.ecoincore.com:34333", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "lenoir.ecoincore.com:34335" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/cdn/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "CELR-ERC20": { - "coin": "CELR-ERC20", - "name": "Celer Network", - "coinpaprika_id": "celr-celer-network", - "coingecko_id": "celer-network", - "nomics_id": "CELR", - "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 - }, - "CELR-BEP20": { - "coin": "CELR-BEP20", - "name": "Celer Network", - "coinpaprika_id": "celr-celer-network", - "coingecko_id": "celer-network", - "nomics_id": "CELR", - "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 - }, - "CELR-ARB20": { - "coin": "CELR-ARB20", - "name": "Celer Network", - "coinpaprika_id": "celr-celer-network", - "coingecko_id": "celer-network", - "nomics_id": "CELR", - "nodes": [ - "https://arb1.arbitrum.io/rpc" - ], - "explorer_url": [ - "https://arbiscan.io/" - ], - "type": "Arbitrum", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "CLC": { - "coin": "CLC", - "name": "Collider Coin", - "coinpaprika_id": "clc-collider-coin", - "coingecko_id": "test-coin", - "nomics_id": "CLC2", - "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-AVX20": { - "coin": "COMP-AVX20", - "name": "Compound", - "coinpaprika_id": "comp-compoundd", - "coingecko_id": "compound-governance-token", - "nomics_id": "COMP", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "COMP-BEP20": { - "coin": "COMP-BEP20", - "name": "Compound", - "coinpaprika_id": "comp-compoundd", - "coingecko_id": "compound-governance-token", - "nomics_id": "COMP", - "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", - "nomics_id": "COMP", - "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 - }, - "COMP-KRC20": { - "coin": "COMP-KRC20", - "name": "Compound", - "coinpaprika_id": "comp-compoundd", - "coingecko_id": "compound-governance-token", - "nomics_id": "COMP", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "COMP-PLG20": { - "coin": "COMP-PLG20", - "name": "Compound", - "coinpaprika_id": "comp-compoundd", - "coingecko_id": "compound-governance-token", - "nomics_id": "COMP", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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 - }, - "CUMMIES-BEP20": { - "coin": "CUMMIES-BEP20", - "name": "CumRocket", - "nomics_id": "CUMMIES", - "coinpaprika_id": "cummies-cumrocket", - "coingecko_id": "cumrocket", - "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-AVX20": { - "coin": "DAI-AVX20", - "name": "Dai", - "coinpaprika_id": "dai-dai", - "coingecko_id": "dai", - "nomics_id": "DAI", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "DAI-FTM20": { - "coin": "DAI-FTM20", - "name": "Dai", - "coinpaprika_id": "dai-dai", - "coingecko_id": "dai", - "nomics_id": "DAI", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "DAI-HCO20": { - "coin": "DAI-HCO20", - "name": "Dai", - "coinpaprika_id": "dai-dai", - "coingecko_id": "dai", - "nomics_id": "DAI", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "DAI-HRC20": { - "coin": "DAI-HRC20", - "name": "Dai", - "coinpaprika_id": "dai-dai", - "coingecko_id": "dai", - "nomics_id": "DAI", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "DAI-BEP20": { - "coin": "DAI-BEP20", - "name": "Dai", - "coinpaprika_id": "dai-dai", - "coingecko_id": "dai", - "nomics_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", - "nomics_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 - }, - "DAI-MVR20": { - "coin": "DAI-MVR20", - "name": "Dai", - "coinpaprika_id": "dai-dai", - "coingecko_id": "dai", - "nomics_id": "DAI", - "nodes": [ - "https://rpc.api.moonriver.moonbeam.network" - ], - "explorer_url": [ - "https://moonriver.moonscan.io/" - ], - "type": "Moonriver", - "active": false, - "currently_enabled": false - }, - "DAI-PLG20": { - "coin": "DAI-PLG20", - "name": "Dai", - "coinpaprika_id": "dai-dai", - "coingecko_id": "dai", - "nomics_id": "DAI", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "DASH": { - "active": false, - "coin": "DASH", - "name": "Dash", - "coingecko_id": "dash", - "coinpaprika_id": "dash-dash", - "nomics_id": "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" - }, - "DUST": { - "coin": "DUST", - "name": "Dragonfairy", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "51.222.85.227:10001", - "ws_url": "51.222.85.227:9001" - }, - { - "url": "78.141.233.64:10001", - "ws_url": "78.141.233.64:9001" - }, - { - "url": "192.248.166.207:10001", - "ws_url": "192.248.166.207:9001" - } - ], - "explorer_url": [ - "http://dragonfairy.gives/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "DGB": { - "active": false, - "coin": "DGB", - "name": "DigiByte", - "coinpaprika_id": "dgb-digibyte", - "coingecko_id": "digibyte", - "nomics_id": "DGB", - "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", - "nomics_id": "DGC", - "electrum": [ - { - "url": "electrumx.dgc.ewmcx.org:50001", - "protocol": "TCP", - "ws_url": "electrumx.dgc.ewmcx.org:50003" - }, - { - "url": "failover.dgc.ewmcx.biz:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "failover.dgc.ewmcx.biz:50003" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/dgc/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "DIA-ERC20": { - "coin": "DIA-ERC20", - "name": "DIAToken", - "coinpaprika_id": "dia-dia", - "coingecko_id": "dia-data", - "nomics_id": "DIA", - "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-BEP20": { - "coin": "DIA-BEP20", - "name": "DIAToken", - "coinpaprika_id": "dia-dia", - "coingecko_id": "dia-data", - "nomics_id": "DIA", - "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 - }, - "DIMI": { - "coin": "DIMI", - "name": "Diminutive Coin", - "coinpaprika_id": "dimi-diminutive-coin", - "coingecko_id": "diminutive-coin", - "nomics_id": "DIMI", - "electrum": [ - { - "url": "electrumx1.diminutivecoin.com:50012", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "electrumx1.diminutivecoin.com:50013" - }, - { - "url": "electrumx2.diminutivecoin.com:50012", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "electrumx2.diminutivecoin.com:50013" - } - ], - "explorer_url": [ - "https://explorer.diminutivecoin.com/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "DIMI-BEP20": { - "coin": "DIMI-BEP20", - "name": "DiminutiveCoin", - "coinpaprika_id": "dimi-diminutive-coin", - "coingecko_id": "diminutive-coin", - "nomics_id": "DIMI", - "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 - }, - "DIMI-QRC20": { - "coin": "DIMI-QRC20", - "name": "DiminutiveCoin", - "coinpaprika_id": "dimi-diminutive-coin", - "coingecko_id": "diminutive-coin", - "nomics_id": "DIMI", - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20", - "active": false, - "currently_enabled": false - }, - "DODO-BEP20": { - "coin": "DODO-BEP20", - "name": "DODO", - "coinpaprika_id": "dodo-dodo", - "coingecko_id": "dodo", - "nomics_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", - "nomics_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 - }, - "DODO-KRC20": { - "coin": "DODO-KRC20", - "name": "DODO", - "coinpaprika_id": "dodo-dodo", - "coingecko_id": "dodo", - "nomics_id": "DODO", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "DOGE": { - "coin": "DOGE", - "name": "Dogecoin", - "coinpaprika_id": "doge-dogecoin", - "coingecko_id": "dogecoin", - "nomics_id": "DOGE", - "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", - "nomics_id": "DOGE", - "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 - }, - "DOGEDASH-BEP20": { - "coin": "DOGEDASH-BEP20", - "name": "Doge Dash", - "coinpaprika_id": "dogedash-doge-dash", - "coingecko_id": "doge-dash", - "nomics_id": "DOGEDASH", - "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 - }, - "DOGGY-BEP20": { - "coin": "DOGGY-BEP20", - "name": "Doggy", - "coinpaprika_id": "doggy-doggy", - "coingecko_id": "doggy", - "nomics_id": "DOGGY", - "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 - }, - "DOI": { - "coin": "DOI", - "name": "Doichain", - "coinpaprika_id": "doi-doicoin", - "coingecko_id": "doichain", - "nomics_id": "DOI", - "electrum": [ - { - "url": "itchy-jellyfish-89.doi.works:50002", - "protocol": "SSL", - "ws-url": "itchy-jellyfish-89.doi.works:50004" - }, - { - "url": "big-parrot-60.doi.works:50002", - "protocol": "SSL", - "ws-url": "big-parrot-60.doi.works:50004" - }, - { - "url": "ugly-bird-70.doi.works:50002", - "protocol": "SSL", - "ws-url": "ugly-bird-70.doi.works:50004" - }, - { - "url":"pink-deer-69.doi.works:50002", - "protocol": "SSL", - "ws-url": "pink-deer-69.doi.works:50004" - }, - { - "url":"pink-deer-69.doi.works:50001", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://explorer.doichain.org/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "DOT-BEP20": { - "coin": "DOT-BEP20", - "name": "Polkadot", - "coinpaprika_id": "dot-polkadot", - "coingecko_id": "polkadot", - "nomics_id": "DOT", - "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-HCO20": { - "coin": "DOT-HCO20", - "name": "Polkadot", - "coinpaprika_id": "dot-polkadot", - "coingecko_id": "polkadot", - "nomics_id": "DOT", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "DP": { - "coin": "DP", - "name": "DigitalPrice", - "coinpaprika_id": "dp-digitalprice", - "coingecko_id": "digitalprice", - "nomics_id": "DP", - "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", - "nomics_id": "ECA", - "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", - "nomics_id": "EFL", - "electrum": [ - { - "url": "holland.ecoincore.com:11017", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "holland.ecoincore.com:11019" - }, - { - "url": "lenoir.ecoincore.com:11017", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "lenoir.ecoincore.com:11019" - }, - { - "url": "electrum1.egulden.org:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "electrum1.egulden.org:50004" - }, - { - "url": "electrum2.egulden.org:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "electrum2.egulden.org:50004" - }, - { - "url": "electrum5.egulden.org:11017", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "electrum5.egulden.org:11019" - } - ], - "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", - "nomics_id": "EGLD", - "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 - }, - "EILN-ERC20": { - "coin": "EILN-ERC20", - "name": "ilien", - "coinpaprika_id": "eiln-e-ilien", - "coingecko_id": "test-coin", - "nomics_id": "EILN", - "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 - }, - "ELF-BEP20": { - "coin": "ELF-BEP20", - "name": "aelf", - "coinpaprika_id": "elf-aelf", - "coingecko_id": "aelf", - "nomics_id": "ELF", - "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", - "nomics_id": "ELF", - "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", - "nomics_id": "EMC2", - "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", - "nomics_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": { - "coin": "ETC", - "name": "Ethereum Classic", - "coinpaprika_id": "etc-ethereum-classic", - "coingecko_id": "ethereum-classic", - "nomics_id": "ETC", - "nodes": [ - "https://www.ethercluster.com/etc" - ], - "explorer_url": [ - "https://blockscout.com/etc/mainnet/" - ], - "type": "Ethereum Classic", - "active": false, - "currently_enabled": false - }, - "ETC-BEP20": { - "coin": "ETC-BEP20", - "name": "Ethereum Classic", - "coinpaprika_id": "etc-ethereum-classic", - "coingecko_id": "ethereum-classic", - "nomics_id": "ETC", - "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 - }, - "FET-ERC20": { - "coin": "FET-ERC20", - "name": "Fetch.ai", - "coinpaprika_id": "fetch-ai", - "coingecko_id": "fetch-ai", - "nomics_id": "FET", - "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 - }, - "FET-BEP20": { - "coin": "FET-BEP20", - "name": "Fetch.ai", - "coinpaprika_id": "fetch-ai", - "coingecko_id": "fetch-ai", - "nomics_id": "FET", - "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 - }, - "FET-PLG20": { - "coin": "FET-PLG20", - "name": "Fetch.ai", - "coinpaprika_id": "fetch-ai", - "coingecko_id": "fetch-ai", - "nomics_id": "FET", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "FIL-BEP20": { - "coin": "FIL-BEP20", - "name": "Filecoin", - "coinpaprika_id": "fil-filecoin", - "coingecko_id": "filecoin", - "nomics_id": "FIL", - "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-HCO20": { - "coin": "FIL-HCO20", - "name": "Filecoin", - "coinpaprika_id": "fil-filecoin", - "coingecko_id": "filecoin", - "nomics_id": "FIL", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "FLOKI-BEP20": { - "coin": "FLOKI-BEP20", - "name": "Floki Inu", - "coinpaprika_id": "floki-floki-inu", - "coingecko_id": "floki-inu", - "nomics_id": "FLOKI15", - "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 - }, - "FLUX": { - "coin": "FLUX", - "name": "Flux", - "coinpaprika_id": "zel-zelcash", - "coingecko_id": "zelcash", - "nomics_id": "ZEL", - "electrum": [ - { - "url": "electrumx.runonflux.io:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "electrumx.runonflux.io:50004" - }, - { - "url": "electrumx2.runonflux.io:50001", - "protocol": "TCP", - "ws_url": "electrumx2.runonflux.io:50004" - } - ], - "explorer_url": [ - "https://explorer.runonflux.io/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "FLUX-ERC20": { - "coin": "FLUX-ERC20", - "name": "Flux", - "coinpaprika_id": "zel-zelcash", - "coingecko_id": "zelcash", - "nomics_id": "ZEL", - "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 - }, - "FLUX-BEP20": { - "coin": "FLUX-BEP20", - "name": "Flux", - "coinpaprika_id": "zel-zelcash", - "coingecko_id": "zelcash", - "nomics_id": "ZEL", - "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", - "nomics_id": "FIRO", - "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", - "nomics_id": "FIRO", - "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", - "nomics_id": "FJC", - "electrum": [ - { - "url": "electrumx1.fujicoin.org:50001", - "protocol": "TCP" - }, - { - "url": "electrumx2.fujicoin.org:50001", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://explorer.fujicoin.org/" - ], - "explorer_tx_url": "tx/", - "explorer_address_url": "address/", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "FJC-BEP20": { - "coin": "FJC-BEP20", - "name": "Fujicoin", - "coinpaprika_id": "fjc-fujicoin", - "coingecko_id": "fujicoin", - "nomics_id": "FJC", - "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 - }, - "FJCB": { - "coin": "FJCB", - "name": "FJCB Fujicoin", - "coinpaprika_id": "fjcb-fjcb-fujicoin", - "coingecko_id": "test-coin", - "nomics_id": "FJCB", - "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 - }, - "FLOW-BEP20": { - "coin": "FLOW-BEP20", - "name": "Flow", - "coinpaprika_id": "flow-flow", - "coingecko_id": "flow", - "nomics_id": "FLOW2", - "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 - }, - "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", - "nomics_id": "FTC", - "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 - }, - "FTMT": { - "coin": "FTMT", - "name": "Fantom Testnet", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "is_testnet": true, - "nodes": [ - "https://rpc.testnet.fantom.network/" - ], - "explorer_url": [ - "https://testnet.ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "FTM": { - "coin": "FTM", - "name": "Fantom", - "coinpaprika_id": "ftm-fantom", - "coingecko_id": "fantom", - "nomics_id": "FTM", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "FTM-BEP20": { - "coin": "FTM-BEP20", - "name": "Fantom", - "coinpaprika_id": "ftm-fantom", - "coingecko_id": "fantom", - "nomics_id": "FTM", - "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", - "nomics_id": "FTM", - "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 - }, - "GALA-ERC20": { - "coin": "GALA-ERC20", - "name": "Gala", - "coinpaprika_id": "gala-gala", - "coingecko_id": "gala", - "nomics_id": "GALA", - "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 - }, - "GALA-BEP20": { - "coin": "GALA-BEP20", - "name": "Gala", - "coinpaprika_id": "gala-gala", - "coingecko_id": "gala", - "nomics_id": "GALA", - "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 - }, - "GLEEC": { - "coin": "GLEEC", - "name": "Gleec", - "coinpaprika_id": "gleec-gleec-coin", - "coingecko_id": "gleec-coin", - "nomics_id": "GLEEC", - "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 - }, - "GM-BEP20": { - "coin": "GM-BEP20", - "name": "GM Wagmi", - "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 - }, - "GMT-BEP20": { - "coin": "GMT-BEP20", - "name": "STEPN", - "coinpaprika_id": "test-coin", - "coingecko_id": "stepn", - "nomics_id": "GMT7", - "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 - }, - "GRMS": { - "coin": "GRMS", - "type": "Smart Chain", - "name": "GRMS", - "coingecko_id": "test-coin", - "coinpaprika_id": "grms-grms", - "nomics_id": "GRMS", - "electrum": [ - { - "url": "89.108.102.188:17485" - }, - { - "url": "31.31.199.13:17485" - } - ], - "explorer_url": [ - "https://explorer.grms.pw/" - ], - "active": false, - "currently_enabled": false - }, - "GRS": { - "coin": "GRS", - "name": "Groestlcoin", - "coinpaprika_id": "grs-groestlcoin", - "coingecko_id": "groestlcoin", - "nomics_id": "GRS", - "electrum": [ - { - "url": "electrum11.groestlcoin.org:50001", - "ws_url": "electrum11.groestlcoin.org:50004" - }, - { - "url": "electrum12.groestlcoin.org:50001", - "ws_url": "electrum12.groestlcoin.org:50004" - }, - { - "url": "electrum13.groestlcoin.org:50001", - "ws_url": "electrum13.groestlcoin.org:50004" - }, - { - "url": "electrum14.groestlcoin.org:50001", - "ws_url": "electrum14.groestlcoin.org:50004" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/grs/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "GRT-AVX20": { - "coin": "GRT-AVX20", - "name": "The Graph", - "coinpaprika_id": "grt-the-graph", - "coingecko_id": "the-graph", - "nomics_id": "GRT", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "GRT-ERC20": { - "coin": "GRT-ERC20", - "name": "The Graph", - "coinpaprika_id": "grt-the-graph", - "coingecko_id": "the-graph", - "nomics_id": "GRT", - "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 - }, - "GRT-KRC20": { - "coin": "GRT-KRC20", - "name": "The Graph", - "coinpaprika_id": "grt-the-graph", - "coingecko_id": "the-graph", - "nomics_id": "GRT", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "GRT-PLG20": { - "coin": "GRT-PLG20", - "name": "The Graph", - "coinpaprika_id": "grt-the-graph", - "coingecko_id": "the-graph", - "nomics_id": "GRT", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "GST-BEP20": { - "coin": "GST-BEP20", - "name": "Green Satoshi Token", - "coinpaprika_id": "gst-gst", - "coingecko_id": "green-satoshi-token", - "nomics_id": "GST7", - "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 - }, - "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 - }, - "INJ-BEP20": { - "coin": "INJ-BEP20", - "name": "Injective Protocol", - "coinpaprika_id": "inj-injective-protocol", - "coingecko_id": "injective-protocol", - "nomics_id": "INJ", - "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", - "nomics_id": "INJ", - "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", - "nomics_id": "IOT", - "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", - "nomics_id": "IOTX", - "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-PLG20": { - "coin": "IOTX-PLG20", - "name": "IoTeX", - "coinpaprika_id": "iotx-iotex", - "coingecko_id": "iotex", - "nomics_id": "IOTX", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "JCHF-ERC20": { - "coin": "JCHF-ERC20", - "name": "Jarvis Swiss Franc", - "forex_id": "CHF", - "coinpaprika_id": "test-coin", - "coingecko_id": "jarvis-synthetic-swiss-franc", - "nomics_id": "JCHF", - "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 - }, - "JCHF-PLG20": { - "coin": "JCHF-PLG20", - "name": "Jarvis Swiss Franc", - "forex_id": "CHF", - "coinpaprika_id": "test-coin", - "coingecko_id": "jarvis-synthetic-swiss-franc", - "nomics_id": "JCHF", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "JEUR-ERC20": { - "coin": "JEUR-ERC20", - "name": "Jarvis Euro", - "forex_id": "EUR", - "coinpaprika_id": "test-coin", - "coingecko_id": "jarvis-synthetic-euro", - "nomics_id": "JEUR", - "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 - }, - "JEUR-PLG20": { - "coin": "JEUR-PLG20", - "name": "Jarvis Euro", - "forex_id": "EUR", - "coinpaprika_id": "test-coin", - "coingecko_id": "jarvis-synthetic-euro", - "nomics_id": "JEUR", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "JGBP-ERC20": { - "coin": "JGBP-ERC20", - "name": "Jarvis British Pound", - "forex_id": "GBP", - "coinpaprika_id": "test-coin", - "coingecko_id": "jarvis-synthetic-british-pound", - "nomics_id": "JGBP", - "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 - }, - "JGBP-PLG20": { - "coin": "JGBP-PLG20", - "name": "Jarvis British Pound", - "forex_id": "GBP", - "coinpaprika_id": "test-coin", - "coingecko_id": "jarvis-synthetic-british-pound", - "nomics_id": "JGBP", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "JJPY-PLG20": { - "coin": "JJPY-PLG20", - "name": "Jarvis Japanese Yen", - "forex_id": "JPY", - "coinpaprika_id": "test-coin", - "coingecko_id": "jarvis-synthetic-japanese-yen", - "nomics_id": "JJPY", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "JPYC-AVX20": { - "coin": "JPYC-AVX20", - "name": "JPY Coin", - "forex_id": "JPY", - "coinpaprika_id": "fetch-ai", - "coingecko_id": "jpy-coin", - "nomics_id": "JPYC2", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://cchain.explorer.avax.network/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "JPYC-PLG20": { - "coin": "JPYC-PLG20", - "name": "JPY Coin", - "forex_id": "JPY", - "coinpaprika_id": "test-coin", - "coingecko_id": "jpy-coin", - "nomics_id": "JPYC2", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "JRT-ERC20": { - "coin": "JRT-ERC20", - "name": "Jarvis Reward Token", - "coinpaprika_id": "jrt-jarvis-reward-token", - "coingecko_id": "jarvis-reward-token", - "nomics_id": "JRT", - "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 - }, - "JRT-PLG20": { - "coin": "JRT-PLG20", - "name": "Jarvis Reward Token", - "coinpaprika_id": "jrt-jarvis-reward-token", - "coingecko_id": "jarvis-reward-token", - "nomics_id": "JRT", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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 - }, - "KNC-BEP20": { - "coin": "KNC-BEP20", - "name": "Kyber Network", - "coinpaprika_id": "knc-kyber-network", - "coingecko_id": "kyber-network-crystal", - "nomics_id": "KNC3", - "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 - }, - "KNC-ERC20": { - "coin": "KNC-ERC20", - "name": "Kyber Network", - "coinpaprika_id": "knc-kyber-network", - "coingecko_id": "kyber-network-crystal", - "nomics_id": "KNC3", - "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 - }, - "KOIN": { - "coin": "KOIN", - "name": "Koinon", - "coinpaprika_id": "koin-koinon", - "coingecko_id": "koinon", - "nomics_id": "KOIN", - "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", - "nomics_id": "LBC", - "electrum": [ - { - "url": "electrum1.cipig.net:10067", - "ws_url": "electrum1.cipig.net:30067" - }, - { - "url": "electrum2.cipig.net:10067", - "ws_url": "electrum2.cipig.net:30067" - }, - { - "url": "electrum3.cipig.net:10067", - "ws_url": "electrum3.cipig.net:30067" - } - ], - "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", - "nomics_id": "LCC", - "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", - "nomics_id": "LTC", - "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", - "is_segwit_on": false - }, - "LUNA-ERC20": { - "coin": "LUNA-ERC20", - "name": "Terra", - "coinpaprika_id": "luna-terra", - "coingecko_id": "terra-luna", - "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 - }, - "LUNA-BEP20": { - "coin": "LUNA-BEP20", - "name": "Terra", - "coinpaprika_id": "luna-terra", - "coingecko_id": "terra-luna", - "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, - "wallet_only": true - }, - "LUNA-HRC20": { - "coin": "LUNA-HRC20", - "name": "Terra", - "coinpaprika_id": "luna-terra", - "coingecko_id": "terra-luna", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "LUNA-PLG20": { - "coin": "LUNA-PLG20", - "name": "Terra", - "coinpaprika_id": "luna-terra", - "coingecko_id": "terra-luna", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "LYNX": { - "coin": "LYNX", - "name": "Lynx", - "coinpaprika_id": "lynx-lynx", - "coingecko_id": "lynx", - "nomics_id": "LYNX", - "electrum": [ - { - "url": "electrum5.getlynx.io:50002", - "protocol": "SSL", - "ws_url": "electrum5.getlynx.io:50004" - }, - { - "url": "electrum6.getlynx.io:50002", - "protocol": "SSL", - "ws_url": "electrum6.getlynx.io:50004" - }, - { - "url": "electrum7.getlynx.io:50002", - "protocol": "SSL", - "ws_url": "electrum7.getlynx.io:50004" - }, - { - "url": "electrum8.getlynx.io:50002", - "protocol": "SSL", - "ws_url": "electrum8.getlynx.io:50004" - }, - { - "url": "electrum9.getlynx.io:50002", - "protocol": "SSL", - "ws_url": "electrum9.getlynx.io:50004" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/lynx/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "LTFN": { - "coin": "LTFN", - "name": "Litecoin Finance", - "coinpaprika_id": "test-coin", - "coingecko_id": "litecoin-finance", - "nomics_id": "LTFN", - "electrum": [ - { - "url": "eltfnx.scalaris.info:30001" - }, - { - "url": "eltfnx6.scalaris.info:30001" - }, - { - "url": "eltfnx7.scalaris.info:30001" - } - ], - "explorer_url": [ - "https://openchains.info/coin/ltfn/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "MATICTEST": { - "coin": "MATICTEST", - "name": "Matic Testnet", - "is_testnet": true, - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "nodes": [ - "https://rpc-mumbai.matic.today", - "https://matic-mumbai.chainstacklabs.com", - "https://rpc-mumbai.maticvigil.com" - ], - "explorer_url": [ - "https://mumbai.polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "MATIC": { - "coin": "MATIC", - "name": "Polygon", - "coinpaprika_id": "matic-matic-network", - "coingecko_id": "matic-network", - "nomics_id": "MATIC", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "MATIC-BEP20": { - "coin": "MATIC-BEP20", - "name": "Polygon", - "coinpaprika_id": "matic-matic-network", - "coingecko_id": "matic-network", - "nomics_id": "MATIC", - "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", - "nomics_id": "MATIC", - "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 - }, - "MATIC-HCO20": { - "coin": "MATIC-HCO20", - "name": "Polygon", - "coinpaprika_id": "matic-matic-network", - "coingecko_id": "matic-network", - "nomics_id": "MATIC", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "MATIC-HRC20": { - "coin": "MATIC-HRC20", - "name": "Polygon", - "coinpaprika_id": "matic-matic-network", - "coingecko_id": "matic-network", - "nomics_id": "MATIC", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "MATIC-KRC20": { - "coin": "MATIC-KRC20", - "name": "Polygon", - "coinpaprika_id": "matic-matic-network", - "coingecko_id": "matic-network", - "nomics_id": "MATIC", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "MCL": { - "coin": "MCL", - "name": "Marmara Credit Loops", - "coingecko_id": "test-coin", - "coinpaprika_id": "mcl-marmara-credit-loops", - "nomics_id": "MCL", - "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", - "active": false, - "currently_enabled": false - }, - "GMS": { - "coin": "GMS", - "type": "Smart Chain", - "name": "GMSmining", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "electrum": [ - { - "url": "electrum.gmsmining.pw:17485" - }, - { - "url": "electrum1.gmsmining.pw:17485" - } - ], - "explorer_url": [ - "https://explorer.gmsmining.pw/" - ], - "active": false, - "currently_enabled": false - }, - "MIR-ERC20": { - "coin": "MIR-ERC20", - "name": "Mirror Protocol", - "coinpaprika_id": "mir-mirror-protocol", - "coingecko_id": "mirror-protocol", - "nomics_id": "MIRROR", - "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 - }, - "MIR-BEP20": { - "coin": "MIR-BEP20", - "name": "Mirror Protocol", - "coinpaprika_id": "mir-mirror-protocol", - "coingecko_id": "mirror-protocol", - "nomics_id": "MIRROR", - "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 - }, - "MM-ERC20": { - "coin": "MM-ERC20", - "name": "Million", - "coinpaprika_id": "mm-million", - "coingecko_id": "million", - "nomics_id": "MM4", - "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 - }, - "MM-AVX20": { - "coin": "MM-AVX20", - "name": "Million", - "coinpaprika_id": "mm-million", - "coingecko_id": "million", - "nomics_id": "MM4", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "MM-BEP20": { - "coin": "MM-BEP20", - "name": "Million", - "coinpaprika_id": "mm-million", - "coingecko_id": "million", - "nomics_id": "MM4", - "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 - }, - "MM-MVR20": { - "coin": "MM-MVR20", - "name": "Million", - "coinpaprika_id": "mm-million", - "coingecko_id": "million", - "nomics_id": "MM4", - "nodes": [ - "https://rpc.api.moonriver.moonbeam.network" - ], - "explorer_url": [ - "https://moonriver.moonscan.io/" - ], - "type": "Moonriver", - "active": false, - "currently_enabled": false - }, - "MM-PLG20": { - "coin": "MM-PLG20", - "name": "Million", - "coinpaprika_id": "mm-million", - "coingecko_id": "million", - "nomics_id": "MM4", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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 - }, - "NEAR-BEP20": { - "coin": "NEAR-BEP20", - "name": "NEAR Protocol", - "coinpaprika_id": "near-near-protocol", - "coingecko_id": "near", - "nomics_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", - "nomics_id": "OCEAN", - "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", - "nomics_id": "OCEAN", - "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 - }, - "OCEAN-PLG20": { - "coin": "OCEAN-PLG20", - "name": "Ocean Protocol", - "coinpaprika_id": "ocean-ocean-protocol", - "coingecko_id": "ocean-protocol", - "nomics_id": "OCEAN", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "ONE": { - "active": false, - "coin": "ONE", - "coingecko_id": "harmony", - "coinpaprika_id": "one-harmony", - "nomics_id": "HARMONY", - "currently_enabled": false, - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "name": "Harmony" - }, - "ONT-BEP20": { - "coin": "ONT-BEP20", - "name": "Ontology", - "coinpaprika_id": "ont-ontology", - "coingecko_id": "ontology", - "nomics_id": "ONT", - "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", - "nomics_id": "PAX", - "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", - "nomics_id": "PAX", - "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 - }, - "PAX-KRC20": { - "coin": "PAX-KRC20", - "name": "Paxos Standard", - "coinpaprika_id": "pax-paxos-standard-token", - "coingecko_id": "paxos-standard", - "nomics_id": "PAX", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "PAX-PLG20": { - "coin": "PAX-PLG20", - "name": "Paxos Standard", - "coinpaprika_id": "pax-paxos-standard-token", - "coingecko_id": "paxos-standard", - "nomics_id": "PAX", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "PAXG-BEP20": { - "coin": "PAXG-BEP20", - "name": "PAX Gold", - "coinpaprika_id": "paxg-pax-gold", - "coingecko_id": "pax-gold", - "nomics_id": "PAXG", - "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", - "nomics_id": "PAXG", - "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 - }, - "PAXG-PLG20": { - "coin": "PAXG-PLG20", - "name": "PAX Gold", - "coinpaprika_id": "paxg-pax-gold", - "coingecko_id": "pax-gold", - "nomics_id": "PAXG", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "KCS": { - "active": false, - "coin": "KCS", - "coingecko_id": "kucoin-shares", - "coinpaprika_id": "kcs-kucoin-token", - "nomics_id": "KCS", - "currently_enabled": false, - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "name": "KuCoin Token" - }, - "MOVR": { - "active": false, - "coin": "MOVR", - "coingecko_id": "moonriver", - "coinpaprika_id": "movr-moonriver", - "nomics_id": "MOVR", - "currently_enabled": false, - "nodes": [ - "https://rpc.api.moonriver.moonbeam.network" - ], - "explorer_url": [ - "https://moonriver.moonscan.io/" - ], - "type": "Moonriver", - "name": "Moonriver" - }, - "GLMR": { - "active": false, - "coin": "GLMR", - "coingecko_id": "moonbeam", - "coinpaprika_id": "glmr-moonbeam", - "nomics_id": "GLMR", - "currently_enabled": false, - "nodes": [ - "https://rpc.api.moonbeam.network" - ], - "explorer_url": [ - "https://moonscan.io/" - ], - "type": "Moonbeam", - "name": "Moonbeam" - }, - "ETH": { - "active": false, - "coin": "ETH", - "coingecko_id": "ethereum", - "coinpaprika_id": "eth-ethereum", - "nomics_id": "ETH", - "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" - }, - "ETH-BEP20": { - "coin": "ETH-BEP20", - "name": "Ethereum", - "coinpaprika_id": "eth-ethereum", - "coingecko_id": "ethereum", - "nomics_id": "ETH", - "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 - }, - "ETH-AVX20": { - "coin": "ETH-AVX20", - "name": "Ethereum", - "coinpaprika_id": "eth-ethereum", - "coingecko_id": "ethereum", - "nomics_id": "ETH", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "ETH-FTM20": { - "coin": "ETH-FTM20", - "name": "Ethereum", - "coinpaprika_id": "eth-ethereum", - "coingecko_id": "ethereum", - "nomics_id": "ETH", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "ETH-HCO20": { - "coin": "ETH-HCO20", - "name": "Ethereum", - "coinpaprika_id": "eth-ethereum", - "coingecko_id": "ethereum", - "nomics_id": "ETH", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "ETH-HRC20": { - "coin": "ETH-HRC20", - "name": "Ethereum", - "coinpaprika_id": "eth-ethereum", - "coingecko_id": "ethereum", - "nomics_id": "ETH", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "ETH-KRC20": { - "coin": "ETH-KRC20", - "name": "Ethereum", - "coinpaprika_id": "eth-ethereum", - "coingecko_id": "ethereum", - "nomics_id": "ETH", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "ETH-PLG20": { - "coin": "ETH-PLG20", - "name": "Ethereum", - "coinpaprika_id": "eth-ethereum", - "coingecko_id": "ethereum", - "nomics_id": "ETH", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "ETH-ARB20": { - "active": false, - "wallet_only": true, - "coin": "ETH-ARB20", - "coingecko_id": "ethereum", - "coinpaprika_id": "eth-ethereum", - "nomics_id": "ETH", - "currently_enabled": false, - "nodes": [ - "https://arb1.arbitrum.io/rpc" - ], - "explorer_url": [ - "https://arbiscan.io/" - ], - "type": "Arbitrum", - "name": "Ethereum" - }, - "ETHK-OPT20": { - "active": false, - "wallet_only": true, - "coin": "ETHK-OPT20", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "currently_enabled": false, - "is_testnet": true, - "nodes": [ - "https://kovan.optimism.io" - ], - "explorer_url": [ - "https://kovan-optimistic.etherscan.io/" - ], - "type": "Optimism", - "name": "EthKovan Optimism (Testnet)" - }, - "ETHR-ARB20": { - "active": false, - "wallet_only": true, - "coin": "ETHR-ARB20", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "currently_enabled": false, - "is_testnet": true, - "nodes": [ - "https://rinkeby.arbitrum.io/rpc" - ], - "explorer_url": [ - "https://rinkeby-explorer.arbitrum.io/#/" - ], - "type": "Arbitrum", - "name": "EthRinkeby Arbitrum (Testnet)" - }, - "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)" - }, - "UIS": { - "coin": "UIS", - "name": "Unitus", - "coinpaprika_id": "uis-unitus", - "coingecko_id": "unitus", - "nomics_id": "UIS", - "electrum": [ - { - "url": "failover.trc-uis.ewmcx.biz:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "failover.trc-uis.ewmcx.biz:50003" - }, - { - "url": "electrumx.uis.ewmcx.info:50001", - "ws_url": "electrumx.uis.ewmcx.info:50004" - } - ], - "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", - "nomics_id": "UNO", - "electrum": [ - { - "url": "uno-main.coinmunity.gold:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "uno-main.coinmunity.gold:50003" - }, - { - "url": "uno-bkp.coinmunity.gold:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "uno-bkp.coinmunity.gold:50003" - } - ], - "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-AVX20": { - "coin": "USDC-AVX20", - "name": "USD Coin", - "coinpaprika_id": "usdc-usd-coin", - "coingecko_id": "usd-coin", - "nomics_id": "USDC", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "USDC-MVR20": { - "coin": "USDC-MVR20", - "name": "USD Coin", - "coinpaprika_id": "usdc-usd-coin", - "coingecko_id": "usd-coin", - "nomics_id": "USDC", - "nodes": [ - "https://rpc.api.moonriver.moonbeam.network" - ], - "explorer_url": [ - "https://moonriver.moonscan.io/" - ], - "type": "Moonriver", - "active": false, - "currently_enabled": false - }, - "USDC-FTM20": { - "coin": "USDC-FTM20", - "name": "USD Coin", - "coinpaprika_id": "usdc-usd-coin", - "coingecko_id": "usd-coin", - "nomics_id": "USDC", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "USDC-BEP20": { - "coin": "USDC-BEP20", - "name": "USD Coin", - "coinpaprika_id": "usdc-usd-coin", - "coingecko_id": "usd-coin", - "nomics_id": "USDC", - "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", - "nomics_id": "USDC", - "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 - }, - "USDC-KRC20": { - "coin": "USDC-KRC20", - "name": "USD Coin", - "coinpaprika_id": "usdc-usd-coin", - "coingecko_id": "usd-coin", - "nomics_id": "USDC", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "USDC-HCO20": { - "coin": "USDC-HCO20", - "name": "USD Coin", - "coinpaprika_id": "usdc-usd-coin", - "coingecko_id": "usd-coin", - "nomics_id": "USDC", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "USDC-HRC20": { - "coin": "USDC-HRC20", - "name": "USD Coin", - "coinpaprika_id": "usdc-usd-coin", - "coingecko_id": "usd-coin", - "nomics_id": "USDC", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "USDC-PLG20": { - "coin": "USDC-PLG20", - "name": "USD Coin", - "coinpaprika_id": "usdc-usd-coin", - "coingecko_id": "usd-coin", - "nomics_id": "USDC", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "USDI": { - "coin": "USDI", - "name": "USD Inflation Coin", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "nomics_id": "USDI", - "electrum": [ - { - "url": "usdi1.blackcoin.nl:10002", - "protocol": "SSL" - }, - { - "url": "usdi2.blackcoin.nl:20002", - "protocol": "SSL" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/usdi/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "USDT-MVR20": { - "coin": "USDT-MVR20", - "name": "Tether", - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nomics_id": "USDT", - "nodes": [ - "https://rpc.api.moonriver.moonbeam.network" - ], - "explorer_url": [ - "https://moonriver.moonscan.io/" - ], - "type": "Moonriver", - "active": false, - "currently_enabled": false - }, - "USDT-HCO20": { - "coin": "USDT-HCO20", - "name": "Tether", - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nomics_id": "USDT", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "USDT-FTM20": { - "coin": "USDT-FTM20", - "name": "Tether", - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nomics_id": "USDT", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "USDT-KRC20": { - "coin": "USDT-KRC20", - "name": "Tether", - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nomics_id": "USDT", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "USDT-ARB20": { - "coin": "USDT-ARB20", - "name": "Tether", - "wallet_only": true, - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nomics_id": "USDT", - "nodes": [ - "https://arb1.arbitrum.io/rpc" - ], - "explorer_url": [ - "https://arbiscan.io/" - ], - "type": "Arbitrum", - "active": false, - "currently_enabled": false - }, - "USDT-AVX20": { - "coin": "USDT-AVX20", - "name": "Tether", - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nomics_id": "USDT", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "USDT-PLG20": { - "coin": "USDT-PLG20", - "name": "Tether", - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nomics_id": "USDT", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "USDT-BEP20": { - "coin": "USDT-BEP20", - "name": "Tether", - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nomics_id": "USDT", - "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", - "nomics_id": "USDT", - "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 - }, - "USDT-HRC20": { - "coin": "USDT-HRC20", - "name": "Tether", - "coinpaprika_id": "usdt-tether", - "coingecko_id": "tether", - "nomics_id": "USDT", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "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" - }, - "BAT-AVX20": { - "coin": "BAT-AVX20", - "name": "Basic Attention Token", - "coinpaprika_id": "bat-basic-attention-token", - "coingecko_id": "basic-attention-token", - "nomics_id": "BAT", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-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", - "nomics_id": "BAT", - "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", - "nomics_id": "BAT", - "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 - }, - "BAT-KRC20": { - "coin": "BAT-KRC20", - "name": "Basic Attention Token", - "coinpaprika_id": "bat-basic-attention-token", - "coingecko_id": "basic-attention-token", - "nomics_id": "BAT", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "BAT-PLG20": { - "coin": "BAT-PLG20", - "name": "Basic Attention Token", - "coinpaprika_id": "bat-basic-attention-token", - "coingecko_id": "basic-attention-token", - "nomics_id": "BAT", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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", - "nomics_id": "KMD", - "electrum": [ - { - "url": "electrum3.cipig.net:10001", - "ws_url": "electrum3.cipig.net:30001" - }, - { - "url": "electrum2.cipig.net:10001", - "ws_url": "electrum2.cipig.net:30001" - }, - { - "url": "electrum1.cipig.net:10001", - "ws_url": "electrum1.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", - "nomics_id": "KMD", - "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 - }, - "KSM-BEP20": { - "coin": "KSM-BEP20", - "name": "Kusama", - "coinpaprika_id": "ksm-kusama", - "coingecko_id": "kusama", - "nomics_id": "KSM", - "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-AVX20": { - "coin": "LINK-AVX20", - "name": "Chainlink", - "coinpaprika_id": "link-chainlink", - "coingecko_id": "chainlink", - "nomics_id": "LINK", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "LINK-BEP20": { - "coin": "LINK-BEP20", - "name": "Chainlink", - "coinpaprika_id": "link-chainlink", - "coingecko_id": "chainlink", - "nomics_id": "LINK", - "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", - "nomics_id": "LINK", - "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 - }, - "LINK-FTM20": { - "coin": "LINK-FTM20", - "name": "Chainlink", - "coinpaprika_id": "link-chainlink", - "coingecko_id": "chainlink", - "nomics_id": "LINK", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "LINK-HCO20": { - "coin": "LINK-HCO20", - "name": "Chainlink", - "coinpaprika_id": "link-chainlink", - "coingecko_id": "chainlink", - "nomics_id": "LINK", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "LINK-HRC20": { - "coin": "LINK-HRC20", - "name": "Chainlink", - "coinpaprika_id": "link-chainlink", - "coingecko_id": "chainlink", - "nomics_id": "LINK", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "LINK-KRC20": { - "coin": "LINK-KRC20", - "name": "Chainlink", - "coinpaprika_id": "link-chainlink", - "coingecko_id": "chainlink", - "nomics_id": "LINK", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "LINK-PLG20": { - "coin": "LINK-PLG20", - "name": "Chainlink", - "coinpaprika_id": "link-chainlink", - "coingecko_id": "chainlink", - "nomics_id": "LINK", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "MESH": { - "coin": "MESH", - "name": "SuperMESH", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10016", - "ws_url": "electrum1.cipig.net:30016" - }, - { - "url": "electrum2.cipig.net:10016", - "ws_url": "electrum2.cipig.net:30016" - }, - { - "url": "electrum3.cipig.net:10016", - "ws_url": "electrum3.cipig.net:30016" - } - ], - "explorer_url": [ - "https://mesh.kmdexplorer.io/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "MINDS": { - "coin": "MINDS", - "name": "Minds", - "coinpaprika_id": "minds-minds", - "coingecko_id": "minds", - "nomics_id": "MINDS", - "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 - }, - "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 - }, - "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 - }, - "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 - }, - "NYAN": { - "coin": "NYAN", - "name": "Nyancoin", - "coinpaprika_id": "nyan-nyancoin", - "coingecko_id": "test-coin", - "nomics_id": "NYAN", - "electrum": [ - { - "url": "txserver.live:50022", - "protocol": "SSL" - }, - { - "url": "txserver.live:50020", - "protocol": "TCP" - }, - { - "url": "electrumx.live:50022", - "protocol": "SSL" - }, - { - "url": "electrumx.live:50020", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://www.nyanchain.com/" - ], - "explorer_tx_url": "tx.nyan?", - "explorer_address_url": "ad.nyan?", - "type": "UTXO", - "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 - }, - "PGX-PLG20": { - "coin": "PGX-PLG20", - "name": "Pegaxy Stone", - "coinpaprika_id": "test-coin", - "coingecko_id": "pegaxy-stone", - "nomics_id": "PGX", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "PIC": { - "coin": "PIC", - "name": "Picacoin", - "coinpaprika_id": "pic-picacoin", - "coingecko_id": "test-coin", - "nomics_id": "PIC3", - "electrum": [ - { - "url": "143.198.143.180:50001" - }, - { - "url": "134.122.120.47:50001" - } - ], - "explorer_url": [ - "http://explorer.picacoin.org/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "PND": { - "coin": "PND", - "name": "Pandacoin", - "coinpaprika_id": "pnd-pandacoin", - "coingecko_id": "pandacoin", - "nomics_id": "PND", - "electrum": [ - { - "url": "electrum.thepandacoin.net:50002", - "protocol": "SSL", - "disable_cert_verification": false - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/pnd/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "PPC": { - "coin": "PPC", - "name": "Peercoin", - "coinpaprika_id": "ppc-peercoin", - "coingecko_id": "peercoin", - "nomics_id": "PPC", - "electrum": [ - { - "url": "electrum.peercoinexplorer.net:50002", - "protocol": "SSL", - "disable_cert_verification": false, - "ws_url": "electrum.peercoinexplorer.net:50004" - }, - { - "url": "allingas.peercoinexplorer.net:50002", - "protocol": "SSL", - "disable_cert_verification": false, - "ws_url": "allingas.peercoinexplorer.net:50004" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/ppc/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "PPC-ERC20": { - "coin": "PPC-ERC20", - "name": "Peercoin", - "coinpaprika_id": "ppc-peercoin", - "coingecko_id": "peercoin", - "nomics_id": "PPC", - "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 - }, - "PPC-PLG20": { - "coin": "PPC-PLG20", - "name": "Peercoin", - "coinpaprika_id": "ppc-peercoin", - "coingecko_id": "peercoin", - "nomics_id": "PPC", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "PRUX": { - "coin": "PRUX", - "name": "PRUX", - "coinpaprika_id": "prux-prux-coin", - "coingecko_id": "test-coin", - "nomics_id": "PRUX", - "electrum": [ - { - "url": "txserver.live:50002", - "protocol": "SSL" - }, - { - "url": "electrumx.live:50012", - "protocol": "SSL" - }, - { - "url": "txserver.live:50001", - "protocol": "TCP" - }, - { - "url": "electrumx.live:50010", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://explorer.prux.info/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "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": "qi-qiswap", - "nomics_id": "QI", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "QNT-ERC20": { - "coin": "QNT-ERC20", - "name": "Quant", - "coinpaprika_id": "qnt-quant", - "coingecko_id": "quant-network", - "nomics_id": "QNT", - "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-KRC20": { - "coin": "QNT-KRC20", - "name": "Quant", - "coinpaprika_id": "qnt-quant", - "coingecko_id": "quant-network", - "nomics_id": "QNT", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "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 - }, - "SBCH": { - "coin": "SBCH", - "name": "SmartBCH", - "alias_ticker": "BCH", - "coinpaprika_id": "bch-bitcoin-cash", - "coingecko_id": "bitcoin-cash", - "nomics_id": "BCH", - "nodes": [ - "https://smartbch.fountainhead.cash/mainnet" - ], - "explorer_url": [ - "https://www.smartscan.cash/" - ], - "type": "SmartBCH", - "active": false, - "currently_enabled": false - }, - "SIBM-BEP20": { - "coin": "SIBM-BEP20", - "name": "SibMining", - "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 - }, - "SMTF-v2": { - "coin": "SMTF-v2", - "name": "SmartFi", - "coinpaprika_id": "smtf-smartfi", - "coingecko_id": "smartfi", - "nomics_id": "SMTF", - "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", - "nomics_id": "SXP", - "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", - "nomics_id": "SXP", - "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", - "nomics_id": "SYS", - "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", - "nomics_id": "CHIPS6", - "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", - "nomics_id": "SCA2", - "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": "unity-supernet", - "nomics_id": "UNITY", - "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 - }, - "SUSHI-AVX20": { - "coin": "SUSHI-AVX20", - "name": "Sushi", - "coinpaprika_id": "sushi-sushi", - "coingecko_id": "sushi", - "nomics_id": "SUSHI", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "SUSHI-BEP20": { - "coin": "SUSHI-BEP20", - "name": "Sushi", - "coinpaprika_id": "sushi-sushi", - "coingecko_id": "sushi", - "nomics_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", - "nomics_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 - }, - "SUSHI-FTM20": { - "coin": "SUSHI-FTM20", - "name": "Sushi", - "coinpaprika_id": "sushi-sushi", - "coingecko_id": "sushi", - "nomics_id": "SUSHI", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "SUSHI-HRC20": { - "coin": "SUSHI-HRC20", - "name": "Sushi", - "coinpaprika_id": "sushi-sushi", - "coingecko_id": "sushi", - "nomics_id": "SUSHI", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "SUSHI-KRC20": { - "coin": "SUSHI-KRC20", - "name": "Sushi", - "coinpaprika_id": "sushi-sushi", - "coingecko_id": "sushi", - "nomics_id": "SUSHI", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "SUSHI-MVR20": { - "coin": "SUSHI-MVR20", - "name": "Sushi", - "coinpaprika_id": "sushi-sushi", - "coingecko_id": "sushi", - "nomics_id": "SUSHI", - "nodes": [ - "https://rpc.api.moonriver.moonbeam.network" - ], - "explorer_url": [ - "https://moonriver.moonscan.io/" - ], - "type": "Moonriver", - "active": false, - "currently_enabled": false - }, - "SUSHI-PLG20": { - "coin": "SUSHI-PLG20", - "name": "Sushi", - "coinpaprika_id": "sushi-sushi", - "coingecko_id": "sushi", - "nomics_id": "SUSHI", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "VITE-BEP20": { - "coin": "VITE-BEP20", - "name": "Vite", - "coinpaprika_id": "vite-vite", - "coingecko_id": "vite", - "nomics_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", - "nomics_id": "VRSC", - "electrum": [ - { - "url": "el0.verus.io:17486", - "protocol": "SSL", - "disable_cert_verification": false, - "ws_url": "el0.verus.io:17488" - }, - { - "url": "el1.verus.io:17486", - "protocol": "SSL", - "disable_cert_verification": false, - "ws_url": "el1.verus.io:17488" - }, - { - "url": "el2.verus.io:17486", - "protocol": "SSL", - "disable_cert_verification": false, - "ws_url": "el2.verus.io:17488" - } - ], - "explorer_url": [ - "https://explorer.verus.io/" - ], - "active": false, - "currently_enabled": false - }, - "IL8P": { - "coin": "IL8P", - "name": "InfiniLooP", - "coinpaprika_id": "il8p-infiniloop", - "coingecko_id": "test-coin", - "nomics_id": "IL8P", - "electrum": [ - { - "url": "il8p.electrumx.transcenders.name:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "il8p.electrumx.transcenders.name:50003" - }, - { - "url": "il9p.electrumx.transcenders.name:50002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "il9p.electrumx.transcenders.name:50003" - } - ], - "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", - "nomics_id": "ILNPOS", - "electrum": [ - { - "url": "electrum1.ilien.io:65011", - "ws_url": "electrum1.ilien.io:30069" - }, - { - "url": "electrum2.ilien.io:65011", - "ws_url": "electrum2.ilien.io:30069" - } - ], - "explorer_url": [ - "https://iln.explorer.dexstats.info/" - ], - "active": false, - "currently_enabled": false - }, - "ILN-BEP20": { - "coin": "ILN-BEP20", - "name": "ilien", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "nomics_id": "ILNPOS", - "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 - }, - "ILN-PLG20": { - "coin": "ILN-PLG20", - "name": "ilien", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "nomics_id": "ILNPOS", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "MKR-AVX20": { - "coin": "MKR-AVX20", - "name": "Maker", - "coinpaprika_id": "mkr-maker", - "coingecko_id": "maker", - "nomics_id": "MKR", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "MKR-BEP20": { - "coin": "MKR-BEP20", - "name": "Maker", - "coinpaprika_id": "mkr-maker", - "coingecko_id": "maker", - "nomics_id": "MKR", - "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", - "nomics_id": "MKR", - "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 - }, - "MKR-KRC20": { - "coin": "MKR-KRC20", - "name": "Maker", - "coinpaprika_id": "mkr-maker", - "coingecko_id": "maker", - "nomics_id": "MKR", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "MONA": { - "coin": "MONA", - "name": "MonaCoin", - "coinpaprika_id": "mona-monacoin", - "coingecko_id": "monacoin", - "nomics_id": "MONA", - "electrum": [ - { - "url": "electrumx3.monacoin.nl:50001" - }, - { - "url": "103.125.218.246:50001" - }, - { - "url": "electrumx.tamami-foundation.org:50001" - } - ], - "explorer_url": [ - "https://blockbook.electrum-mona.org/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "NAV": { - "coin": "NAV", - "name": "NavCoin", - "coinpaprika_id": "nav-navcoin", - "coingecko_id": "nav-coin", - "nomics_id": "NAV", - "electrum": [ - { - "url": "electrum.nav.community:40002", - "protocol": "SSL", - "ws_url": "electrum.nav.community:40004" - }, - { - "url": "electrum2.nav.community:40002", - "protocol": "SSL", - "ws_url": "electrum2.nav.community:40004" - }, - { - "url": "electrum3.nav.community:40002", - "protocol": "SSL", - "ws_url": "electrum3.nav.community:40004" - }, - { - "url": "electrum4.nav.community:40002", - "protocol": "SSL", - "ws_url": "electrum4.nav.community:40004" - } - ], - "explorer_url": [ - "https://www.navexplorer.com/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "NAV-BEP20": { - "coin": "NAV-BEP20", - "name": "Navcoin", - "coinpaprika_id": "nav-navcoin", - "coingecko_id": "nav-coin", - "nomics_id": "NAV", - "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 - }, - "NEXO-ERC20": { - "coin": "NEXO-ERC20", - "name": "Nexo", - "coinpaprika_id": "nexo-nexo", - "coingecko_id": "nexo", - "nomics_id": "NEXO", - "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 - }, - "NEXO-KRC20": { - "coin": "NEXO-KRC20", - "name": "Nexo", - "coinpaprika_id": "nexo-nexo", - "coingecko_id": "nexo", - "nomics_id": "NEXO", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "NEXO-PLG20": { - "coin": "NEXO-PLG20", - "name": "Nexo", - "coinpaprika_id": "nexo-nexo", - "coingecko_id": "nexo", - "nomics_id": "NEXO", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "NMC": { - "coin": "NMC", - "name": "Namecoin", - "coinpaprika_id": "nmc-namecoin", - "coingecko_id": "namecoin", - "nomics_id": "NMC", - "electrum": [ - { - "url": "nmc.bitcoins.sk:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "nmc2.bitcoins.sk:57002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "46.229.238.187:57001" - } - ], - "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", - "nomics_id": "NVC", - "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 - }, - "NVC-BEP20": { - "coin": "NVC-BEP20", - "name": "Novacoin", - "coinpaprika_id": "nvc-novacoin", - "coingecko_id": "novacoin", - "nomics_id": "NVC", - "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 - }, - "NVC-QRC20": { - "coin": "NVC-QRC20", - "name": "Novacoin", - "coinpaprika_id": "nvc-novacoin", - "coingecko_id": "novacoin", - "nomics_id": "NVC", - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20", - "active": false, - "currently_enabled": false - }, - "NZDS-ERC20": { - "coin": "NZDS-ERC20", - "name": "NZD Stablecoin", - "forex_id": "NZD", - "coinpaprika_id": "test-coin", - "coingecko_id": "nzd-stablecoin", - "nomics_id": "NZDS", - "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 - }, - "NZDS-PLG20": { - "coin": "NZDS-PLG20", - "name": "NZD Stablecoin", - "forex_id": "NZD", - "coinpaprika_id": "test-coin", - "coingecko_id": "nzd-stablecoin", - "nomics_id": "NZDS", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "OMG-ERC20": { - "coin": "OMG-ERC20", - "name": "OMG Network", - "coinpaprika_id": "omg-omg-network", - "coingecko_id": "omisego", - "nomics_id": "OMG", - "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 - }, - "OMG-PLG20": { - "coin": "OMG-PLG20", - "name": "OMG Network", - "coinpaprika_id": "omg-omg-network", - "coingecko_id": "omisego", - "nomics_id": "OMG", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "QKC-BEP20": { - "coin": "QKC-BEP20", - "name": "QuarkChain", - "coinpaprika_id": "qkc-quarkchain", - "coingecko_id": "quark-chain", - "nomics_id": "QKC", - "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", - "nomics_id": "QKC", - "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", - "nomics_id": "QTUM", - "electrum": [ - { - "url": "electrum1.cipig.net:10050", - "ws_url": "electrum1.cipig.net:30050" - }, - { - "url": "electrum2.cipig.net:10050", - "ws_url": "electrum2.cipig.net:30050" - }, - { - "url": "electrum3.cipig.net:10050", - "ws_url": "electrum3.cipig.net:30050" - } - ], - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20", - "active": false, - "currently_enabled": false - }, - "QTUM-ERC20": { - "coin": "QTUM-ERC20", - "name": "Qtum", - "coinpaprika_id": "qtum-qtum", - "coingecko_id": "qtum", - "nomics_id": "QTUM", - "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-ERC20": { - "coin": "REN-ERC20", - "name": "Ren", - "coinpaprika_id": "ren-republic-protocol", - "coingecko_id": "republic-protocol", - "nomics_id": "REN", - "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-HRC20": { - "coin": "REN-HRC20", - "name": "Ren", - "coinpaprika_id": "ren-republic-protocol", - "coingecko_id": "republic-protocol", - "nomics_id": "REN", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "REN-HCO20": { - "coin": "REN-HCO20", - "name": "Ren", - "coinpaprika_id": "ren-republic-protocol", - "coingecko_id": "republic-protocol", - "nomics_id": "REN", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "RSR-ERC20": { - "coin": "RSR-ERC20", - "name": "Reserve Rights", - "coinpaprika_id": "rsr-reserve-rights", - "coingecko_id": "reserve-rights-token", - "nomics_id": "RSR", - "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 - }, - "RTM": { - "coin": "RTM", - "name": "Raptoreum", - "coinpaprika_id": "rtm-raptoreum", - "coingecko_id": "raptoreum", - "nomics_id": "RTM", - "electrum": [ - { - "url": "209.151.151.21:50001", - "protocol": "TCP" - }, - { - "url": "209.50.52.239:50001", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://explorer.raptoreum.com/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "RVN": { - "coin": "RVN", - "name": "Ravencoin", - "coinpaprika_id": "rvn-ravencoin", - "coingecko_id": "ravencoin", - "nomics_id": "RVN", - "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 - }, - "SAND-ERC20": { - "coin": "SAND-ERC20", - "name": "The Sandbox", - "coinpaprika_id": "sand-the-sandbox", - "coingecko_id": "the-sandbox", - "nomics_id": "SAND2", - "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 - }, - "SAND-BEP20": { - "coin": "SAND-BEP20", - "name": "The Sandbox", - "coinpaprika_id": "sand-the-sandbox", - "coingecko_id": "the-sandbox", - "nomics_id": "SAND2", - "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 - }, - "SAND-PLG20": { - "coin": "SAND-PLG20", - "name": "The Sandbox", - "coinpaprika_id": "sand-the-sandbox", - "coingecko_id": "the-sandbox", - "nomics_id": "SAND2", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "SNX-AVX20": { - "coin": "SNX-AVX20", - "name": "Synthetix", - "coinpaprika_id": "snx-synthetix-network-token", - "coingecko_id": "havven", - "nomics_id": "SNX", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "SNX-BEP20": { - "coin": "SNX-BEP20", - "name": "Synthetix", - "coinpaprika_id": "snx-synthetix-network-token", - "coingecko_id": "havven", - "nomics_id": "SNX", - "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", - "nomics_id": "SNX", - "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 - }, - "SNX-FTM20": { - "coin": "SNX-FTM20", - "name": "Synthetix", - "coinpaprika_id": "snx-synthetix-network-token", - "coingecko_id": "havven", - "nomics_id": "SNX", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "SNX-KRC20": { - "coin": "SNX-KRC20", - "name": "Synthetix", - "coinpaprika_id": "snx-synthetix-network-token", - "coingecko_id": "havven", - "nomics_id": "SNX", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "SNX-PLG20": { - "coin": "SNX-PLG20", - "name": "Synthetix", - "coinpaprika_id": "snx-synthetix-network-token", - "coingecko_id": "havven", - "nomics_id": "SNX", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "SOL-BEP20": { - "coin": "SOL-BEP20", - "name": "Solana", - "coinpaprika_id": "sol-solana", - "coingecko_id": "solana", - "nomics_id": "SOL", - "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 - }, - "SPACE": { - "coin": "SPACE", - "name": "Spacecoin", - "coingecko_id": "test-coin", - "coinpaprika_id": "space-spacecoin7367", - "nomics_id": "SPACE7", - "electrum": [ - { - "url": "electrum3.cipig.net:10011", - "ws_url": "electrum3.cipig.net:30011" - }, - { - "url": "electrum2.cipig.net:10011", - "ws_url": "electrum2.cipig.net:30011" - }, - { - "url": "electrum1.cipig.net:10011", - "ws_url": "electrum1.cipig.net:30011" - } - ], - "explorer_url": [ - "https://explorer.spaceworks.co/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "TEL-ERC20": { - "coin": "TEL-ERC20", - "name": "Telcoin", - "coinpaprika_id": "tel-telcoin", - "coingecko_id": "telcoin", - "nomics_id": "TEL", - "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 - }, - "TEL-PLG20": { - "coin": "TEL-PLG20", - "name": "Telcoin", - "coinpaprika_id": "tel-telcoin", - "coingecko_id": "telcoin", - "nomics_id": "TEL", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "TEL-KRC20": { - "coin": "TEL-KRC20", - "name": "Telcoin", - "coinpaprika_id": "tel-telcoin", - "coingecko_id": "telcoin", - "nomics_id": "TEL", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "TFT-BEP20": { - "coin": "TFT-BEP20", - "name": "ThreeFold", - "coinpaprika_id": "tft-threefold-token", - "coingecko_id": "threefold-token", - "nomics_id": "THREEFOLDBEP20", - "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 - }, - "THC": { - "coin": "THC", - "name": "HempCoin", - "coinpaprika_id": "thc-hempcoin", - "coingecko_id": "hempcoin-thc", - "nomics_id": "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 - }, - "THC-BEP20": { - "coin": "THC-BEP20", - "name": "HempCoin", - "coinpaprika_id": "thc-hempcoin", - "coingecko_id": "hempcoin-thc", - "nomics_id": "THC", - "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 - }, - "TKL": { - "coin": "TKL", - "name": "Tokel", - "coinpaprika_id": "tkl-tokel", - "coingecko_id": "tokel", - "nomics_id": "TKL2", - "electrum": [ - { - "url": "1.eu.tokel.electrum.dexstats.info:10077", - "ws_url": "1.eu.tokel.electrum.dexstats.info:9077" - }, - { - "url": "2.eu.tokel.electrum.dexstats.info:10077", - "ws_url": "2.eu.tokel.electrum.dexstats.info:9077" - } - ], - "explorer_url": [ - "https://tokel.explorer.dexstats.info/" - ], - "type": "Smart Chain", - "active": false, - "currently_enabled": false - }, - "TRC": { - "coin": "TRC", - "name": "Terracoin", - "coinpaprika_id": "trc-terracoin", - "coingecko_id": "terracoin", - "nomics_id": "TRC", - "electrum": [ - { - "url": "failover.trc-uis.ewmcx.biz:50006", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "failover.trc-uis.ewmcx.biz:50007" - }, - { - "url": "electrum.terracoin.io:50001", - "ws_url": "electrum.terracoin.io:50004" - }, - { - "url": "electrum.southofheaven.ca:50001", - "ws_url": "electrum.southofheaven.ca:50004" - } - ], - "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", - "nomics_id": "TRX", - "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-AVX20": { - "coin": "TRYB-AVX20", - "name": "BiLira", - "forex_id": "TRY", - "coinpaprika_id": "tryb-bilira", - "coingecko_id": "bilira", - "nomics_id": "TRYB", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "TRYB-BEP20": { - "coin": "TRYB-BEP20", - "name": "BiLira", - "forex_id": "TRY", - "coinpaprika_id": "tryb-bilira", - "coingecko_id": "bilira", - "nomics_id": "TRYB", - "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-PLG20": { - "coin": "TRYB-PLG20", - "name": "BiLira", - "forex_id": "TRY", - "coinpaprika_id": "tryb-bilira", - "coingecko_id": "bilira", - "nomics_id": "TRYB", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "TRYB-ERC20": { - "coin": "TRYB-ERC20", - "name": "BiLira", - "forex_id": "TRY", - "coinpaprika_id": "tryb-bilira", - "coingecko_id": "bilira", - "nomics_id": "TRYB", - "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", - "nomics_id": "TUSD", - "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", - "nomics_id": "TUSD", - "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-HCO20": { - "coin": "TUSD-HCO20", - "name": "TrueUSD", - "coinpaprika_id": "tusd-trueusd", - "coingecko_id": "true-usd", - "nomics_id": "TUSD", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "TUSD-KRC20": { - "coin": "TUSD-KRC20", - "name": "TrueUSD", - "coinpaprika_id": "tusd-trueusd", - "coingecko_id": "true-usd", - "nomics_id": "TUSD", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "TUSD-PLG20": { - "coin": "TUSD-PLG20", - "name": "TrueUSD", - "coinpaprika_id": "tusd-trueusd", - "coingecko_id": "true-usd", - "nomics_id": "TUSD", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "UST-ERC20": { - "coin": "UST-ERC20", - "name": "TerraUSD", - "coinpaprika_id": "ust-terrausd", - "coingecko_id": "terrausd", - "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 - }, - "UST-BEP20": { - "coin": "UST-BEP20", - "name": "TerraUSD", - "coinpaprika_id": "ust-terrausd", - "coingecko_id": "terrausd", - "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, - "wallet_only": true - }, - "UST-HRC20": { - "coin": "UST-HRC20", - "name": "TerraUSD", - "coinpaprika_id": "ust-terrausd", - "coingecko_id": "terrausd", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "UST-PLG20": { - "coin": "UST-PLG20", - "name": "TerraUSD", - "coinpaprika_id": "ust-terrausd", - "coingecko_id": "terrausd", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false, - "wallet_only": true - }, - "VAL": { - "coin": "VAL", - "name": "Validity", - "coinpaprika_id": "val-validity", - "coingecko_id": "radium", - "nomics_id": "RADS", - "electrum": [ - { - "url": "e1.validitytech.com:11002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "e1.validitytech.com:11004" - }, - { - "url": "e2.validitytech.com:11002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "e2.validitytech.com:11004" - }, - { - "url": "e3.validitytech.com:11002", - "protocol": "SSL", - "disable_cert_verification": true, - "ws_url": "e3.validitytech.com:11004" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/val/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "VET-BEP20": { - "coin": "VET-BEP20", - "name": "VeChain", - "coinpaprika_id": "vet-vechain", - "coingecko_id": "vechain", - "nomics_id": "VET", - "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 - }, - "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", - "nomics_id": "VRM", - "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 - }, - "WAVES-BEP20": { - "coin": "WAVES-BEP20", - "name": "Waves", - "coinpaprika_id": "waves-waves", - "coingecko_id": "waves", - "nomics_id": "WAVES", - "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 - }, - "WBTC-ERC20": { - "coin": "WBTC-ERC20", - "name": "Wrapped Bitcoin", - "coinpaprika_id": "wbtc-wrapped-bitcoin", - "coingecko_id": "wrapped-bitcoin", - "nomics_id": "WBTC", - "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-HRC20": { - "coin": "WBTC-HRC20", - "name": "Wrapped Bitcoin", - "coinpaprika_id": "wbtc-wrapped-bitcoin", - "coingecko_id": "wrapped-bitcoin", - "nomics_id": "WBTC", - "nodes": [ - "https://api.harmony.one", - "https://api.s0.t.hmny.io" - ], - "explorer_url": [ - "https://explorer.harmony.one/" - ], - "type": "HRC-20", - "active": false, - "currently_enabled": false - }, - "WCN": { - "coin": "WCN", - "name": "Widecoin", - "coinpaprika_id": "wcn-widecoin", - "coingecko_id": "widecoin", - "nomics_id": "WCN2", - "electrum": [ - { - "url": "electrumx.widecoin.org:50001" - }, - { - "url": "electrumx2.widecoin.org:50001" - } - ], - "explorer_url": [ - "https://explorer.widecoin.org/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "WWCN-ERC20": { - "coin": "WWCN-ERC20", - "name": "Wrapped Widecoin", - "coinpaprika_id": "wwcn-wrapped-widecoin", - "coingecko_id": "wrapped-widecoin", - "nomics_id": "WWCN", - "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 - }, - "XEC": { - "coin": "XEC", - "name": "eCash", - "coingecko_id": "ecash", - "coinpaprika_id": "xec-ecash", - "nomics_id": "XEC", - "electrum": [ - { - "url": "electrum.bitcoinabc.org:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "fulcrum.pepipierre.fr:50002", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://blockchair.com/ecash/" - ], - "explorer_tx_url": "transaction/", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "XEP-BEP20": { - "coin": "XEP-BEP20", - "name": "Electra Protocol", - "coinpaprika_id": "xep-electra-protocol", - "coingecko_id": "electra-protocol", - "nomics_id": "XEP", - "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 - }, - "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", - "nomics_id": "XMY", - "electrum": [ - { - "url": "lenoir.ecoincore.com:10891", - "protocol": "TCP", - "ws_url": "lenoir.ecoincore.com:10894" - } - ], - "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", - "nomics_id": "XPM", - "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", - "nomics_id": "XRP", - "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 - }, - "XRG": { - "coin": "XRG", - "active": false, - "coinpaprika_id": "xrg-ergon", - "coingecko_id": "test-coin", - "nomics_id": "XRG", - "currently_enabled": false, - "electrum": [ - { - "url": "fulcrum.ergon.network:52138", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "blackie.c3-soft.com:52138", - "protocol": "SSL" - } - ], - "explorer_url": [ - "https://explorer.ergon.network/" - ], - "type": "UTXO", - "name": "Ergon" - }, - "XSGD-ERC20": { - "coin": "XSGD-ERC20", - "name": "StraitsX SGD", - "forex_id": "SGD", - "coinpaprika_id": "xsgd-xsgd", - "coingecko_id": "xsgd", - "nomics_id": "XSGD", - "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 - }, - "XSGD-PLG20": { - "coin": "XSGD-PLG20", - "name": "StraitsX SGD", - "forex_id": "SGD", - "coinpaprika_id": "xsgd-xsgd", - "coingecko_id": "xsgd", - "nomics_id": "XSGD", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "XTZ-BEP20": { - "coin": "XTZ-BEP20", - "name": "Tezos", - "coinpaprika_id": "xtz-tezos", - "coingecko_id": "tezos", - "nomics_id": "XTZ", - "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-OLD": { - "coin": "XVC-OLD", - "name": "Vanillacash", - "coinpaprika_id": "xvc-vcash", - "coingecko_id": "vcash", - "nomics_id": "XVC", - "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": { - "coin": "XVC", - "name": "Vanillacash", - "coinpaprika_id": "xvc-vcash", - "coingecko_id": "vcash", - "nomics_id": "XVC", - "electrum": [ - { - "url": "electrumx1.vanillacash.info:50011", - "ws_url": "electrumx1.vanillacash.info:50013" - }, - { - "url": "electrumx2.vanillacash.info:50011", - "ws_url": "electrumx2.vanillacash.info:50013" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/xvc/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "XVC-BEP20": { - "coin": "XVC-BEP20", - "name": "Vanillacash", - "coinpaprika_id": "xvc-vcash", - "coingecko_id": "vcash", - "nomics_id": "XVC", - "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-QRC20": { - "coin": "XVC-QRC20", - "name": "Vanillacash", - "coinpaprika_id": "xvc-vcash", - "coingecko_id": "vcash", - "nomics_id": "XVC", - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20", - "active": false, - "currently_enabled": false - }, - "XVS": { - "coin": "XVS", - "name": "Venus", - "coinpaprika_id": "xvs-venus", - "coingecko_id": "venus", - "nomics_id": "XVS", - "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-AVX20": { - "coin": "YFI-AVX20", - "name": "yearn.finance", - "coinpaprika_id": "yfi-yearnfinance", - "coingecko_id": "yearn-finance", - "nomics_id": "YFI", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "YFI-BEP20": { - "coin": "YFI-BEP20", - "name": "yearn.finance", - "coinpaprika_id": "yfi-yearnfinance", - "coingecko_id": "yearn-finance", - "nomics_id": "YFI", - "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", - "nomics_id": "YFI", - "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 - }, - "YFI-FTM20": { - "coin": "YFI-FTM20", - "name": "yearn.finance", - "coinpaprika_id": "yfi-yearnfinance", - "coingecko_id": "yearn-finance", - "nomics_id": "YFI", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "YFI-KRC20": { - "coin": "YFI-KRC20", - "name": "yearn.finance", - "coinpaprika_id": "yfi-yearnfinance", - "coingecko_id": "yearn-finance", - "nomics_id": "YFI", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "YFII-BEP20": { - "coin": "YFII-BEP20", - "name": "DFI.Money", - "coinpaprika_id": "yfii-dfimoney", - "coingecko_id": "yfii-finance", - "nomics_id": "YFII", - "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", - "nomics_id": "YFII", - "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": { - "coin": "ZEC", - "name": "Zcash", - "coinpaprika_id": "zec-zcash", - "coingecko_id": "zcash", - "nomics_id": "ZEC", - "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": "transactions/", - "explorer_url": [ - "https://explorer.zcha.in/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "ZER": { - "coin": "ZER", - "name": "Zero", - "coinpaprika_id": "zer-zero", - "coingecko_id": "zero", - "nomics_id": "ZER", - "electrum": [ - { - "url": "electrum1.cipig.net:10065", - "ws_url": "electrum1.cipig.net:30065" - }, - { - "url": "electrum2.cipig.net:10065", - "ws_url": "electrum2.cipig.net:30065" - }, - { - "url": "electrum3.cipig.net:10065", - "ws_url": "electrum3.cipig.net:30065" - } - ], - "explorer_url": [ - "https://insight.zerocurrency.io/insight/" - ], - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "ZET-OLD": { - "coin": "ZET-OLD", - "name": "Zetacoin (OLD)", - "coinpaprika_id": "zet-zetacoin", - "coingecko_id": "zetacoin", - "nomics_id": "ZET", - "electrum": [ - { - "url": "failover.zet.ewmci.xyz:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrumx.zet.ewmcx.info:50001", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/zet-old/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "ZET": { - "coin": "ZET", - "name": "Zetacoin", - "coinpaprika_id": "zet-zetacoin", - "coingecko_id": "zetacoin", - "nomics_id": "ZET", - "electrum": [ - { - "url": "207.180.252.200:50011", - "protocol": "TCP", - "ws_url": "207.180.252.200:50013" - }, - { - "url": "zeta-seed-c.zetacoin.tech:50012", - "protocol": "SSL", - "disable_cert_verification": false - } - ], - "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", - "nomics_id": "ZIL", - "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", - "nomics_id": "ZILLA", - "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 - }, - "ZRX-AVX20": { - "coin": "ZRX-AVX20", - "name": "0x", - "coinpaprika_id": "zrx-0x", - "coingecko_id": "0x", - "nomics_id": "ZRX", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "ZRX-ERC20": { - "coin": "ZRX-ERC20", - "name": "0x", - "coinpaprika_id": "zrx-0x", - "coingecko_id": "0x", - "nomics_id": "ZRX", - "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-PLG20": { - "coin": "ZRX-PLG20", - "name": "0x", - "coinpaprika_id": "zrx-0x", - "coingecko_id": "0x", - "nomics_id": "ZRX", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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", - "ws_url": "electrum1.cipig.net:30068" - }, - { - "url": "electrum2.cipig.net:10068", - "ws_url": "electrum2.cipig.net:30068" - }, - { - "url": "electrum3.cipig.net:10068", - "ws_url": "electrum3.cipig.net:30068" - } - ], - "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", - "ws_url": "electrum1.cipig.net:30071" - }, - { - "url": "electrum2.cipig.net:10071", - "ws_url": "electrum2.cipig.net:30071" - }, - { - "url": "electrum3.cipig.net:10071", - "ws_url": "electrum3.cipig.net:30071" - } - ], - "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", - "nomics_id": "INK", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "SPC": { - "coin": "SPC", - "name": "SpaceChain", - "coingecko_id": "spacechain-erc-20", - "coinpaprika_id": "spc-spacechain", - "nomics_id": "SPC", - "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", - "nomics_id": "HPY", - "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", - "nomics_id": "HLC", - "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", - "nomics_id": "LSTR", - "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", - "nomics_id": "QBT", - "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", - "nomics_id": "OC", - "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", - "nomics_id": "PUT", - "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", - "nomics_id": "TSL", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "QC": { - "coin": "QC", - "name": "Qcash", - "forex_id": "CNY", - "coingecko_id": "qcash", - "coinpaprika_id": "qc-qcash", - "nomics_id": "QC", - "active": false, - "currently_enabled": false, - "explorer_url": [ - "https://explorer.qtum.org/" - ], - "type": "QRC-20" - }, - "SFUSD": { - "coin": "SFUSD", - "name": "SmartUSD", - "forex_id": "USD", - "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 - }, - "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 - }, - "CEL-ERC20": { - "coin": "CEL-ERC20", - "name": "Celsius", - "coinpaprika_id": "cel-celsius", - "coingecko_id": "celsius-degree-token", - "nomics_id": "CEL", - "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-PLG20": { - "coin": "CEL-PLG20", - "name": "Celsius", - "coinpaprika_id": "cel-celsius", - "coingecko_id": "celsius-degree-token", - "nomics_id": "CEL", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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-ERC20": { - "coin": "CHSB-ERC20", - "name": "SwissBorg", - "coinpaprika_id": "chsb-swissborg", - "coingecko_id": "swissborg", - "nomics_id": "CHSB", - "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-PLG20": { - "coin": "CHSB-PLG20", - "name": "SwissBorg", - "coinpaprika_id": "chsb-swissborg", - "coingecko_id": "swissborg", - "nomics_id": "CHSB", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "CHZ-ERC20": { - "coin": "CHZ-ERC20", - "name": "chiliZ", - "coinpaprika_id": "chz-chiliz", - "coingecko_id": "chiliz", - "nomics_id": "CHZ", - "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-KRC20": { - "coin": "CHZ-KRC20", - "name": "chiliZ", - "coinpaprika_id": "chz-chiliz", - "coingecko_id": "chiliz", - "nomics_id": "CHZ", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "CHZ-PLG20": { - "coin": "CHZ-PLG20", - "name": "chiliZ", - "coinpaprika_id": "chz-chiliz", - "coingecko_id": "chiliz", - "nomics_id": "CHZ", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "CRO-ERC20": { - "coin": "CRO-ERC20", - "name": "Crypto.com", - "coinpaprika_id": "cro-cryptocom-chain", - "coingecko_id": "crypto-com-chain", - "nomics_id": "CRO", - "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-KRC20": { - "coin": "CRO-KRC20", - "name": "Crypto.com", - "coinpaprika_id": "cro-cryptocom-chain", - "coingecko_id": "crypto-com-chain", - "nomics_id": "CRO", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "CRO-PLG20": { - "coin": "CRO-PLG20", - "name": "Crypto.com", - "coinpaprika_id": "cro-cryptocom-chain", - "coingecko_id": "crypto-com-chain", - "nomics_id": "CRO", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "CRV-ERC20": { - "coin": "CRV-ERC20", - "name": "Curve DAO Token", - "coinpaprika_id": "crv-curve-dao-token", - "coingecko_id": "curve-dao-token", - "nomics_id": "CRV", - "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-AVX20": { - "coin": "CRV-AVX20", - "name": "Curve DAO Token", - "coinpaprika_id": "crv-curve-dao-token", - "coingecko_id": "curve-dao-token", - "nomics_id": "CRV", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "CRV-FTM20": { - "coin": "CRV-FTM20", - "name": "Curve DAO Token", - "coinpaprika_id": "crv-curve-dao-token", - "coingecko_id": "curve-dao-token", - "nomics_id": "CRV", - "nodes": [ - "https://rpc.ftm.tools/" - ], - "explorer_url": [ - "https://ftmscan.com/" - ], - "type": "FTM-20", - "active": false, - "currently_enabled": false - }, - "CRV-KRC20": { - "coin": "CRV-KRC20", - "name": "Curve DAO Token", - "coinpaprika_id": "crv-curve-dao-token", - "coingecko_id": "curve-dao-token", - "nomics_id": "CRV", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "CRV-PLG20": { - "coin": "CRV-PLG20", - "name": "Curve DAO Token", - "coinpaprika_id": "crv-curve-dao-token", - "coingecko_id": "curve-dao-token", - "nomics_id": "CRV", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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 - }, - "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-ERC20": { - "coin": "ENJ-ERC20", - "name": "Enjin Coin", - "coinpaprika_id": "enj-enjin-coin", - "coingecko_id": "enjincoin", - "nomics_id": "ENJ", - "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-KRC20": { - "coin": "ENJ-KRC20", - "name": "Enjin Coin", - "coinpaprika_id": "enj-enjin-coin", - "coingecko_id": "enjincoin", - "nomics_id": "ENJ", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "ENJ-PLG20": { - "coin": "ENJ-PLG20", - "name": "Enjin Coin", - "coinpaprika_id": "enj-enjin-coin", - "coingecko_id": "enjincoin", - "nomics_id": "ENJ", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "EURS-ERC20": { - "coin": "EURS-ERC20", - "name": "STASIS EURO", - "forex_id": "EUR", - "coinpaprika_id": "eurs-stasis-eurs", - "coingecko_id": "stasis-eurs", - "nomics_id": "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 - }, - "EURS-PLG20": { - "coin": "EURS-PLG20", - "name": "STASIS EURO", - "forex_id": "EUR", - "coinpaprika_id": "eurs-stasis-eurs", - "coingecko_id": "stasis-eurs", - "nomics_id": "EURS", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "GNO-ERC20": { - "coin": "GNO-ERC20", - "name": "Gnosis", - "coinpaprika_id": "gno-gnosis", - "coingecko_id": "gnosis", - "nomics_id": "GNO", - "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-PLG20": { - "coin": "GNO-PLG20", - "name": "Gnosis", - "coinpaprika_id": "gno-gnosis", - "coingecko_id": "gnosis", - "nomics_id": "GNO", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "HEX-ERC20": { - "coin": "HEX-ERC20", - "name": "HEX", - "coinpaprika_id": "hex-hex", - "coingecko_id": "hex", - "nomics_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 - }, - "HEX-PLG20": { - "coin": "HEX-PLG20", - "name": "HEX", - "coinpaprika_id": "hex-hex", - "coingecko_id": "hex", - "nomics_id": "HEX", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "HOT-ERC20": { - "coin": "HOT-ERC20", - "name": "Holo", - "coinpaprika_id": "hot-holo", - "coingecko_id": "holotoken", - "nomics_id": "HOT", - "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-PLG20": { - "coin": "HOT-PLG20", - "name": "Holo", - "coinpaprika_id": "hot-holo", - "coingecko_id": "holotoken", - "nomics_id": "HOT", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "HT": { - "active": false, - "coin": "HT", - "coingecko_id": "huobi-token", - "coinpaprika_id": "ht-huobi-token", - "nomics_id": "HT", - "currently_enabled": false, - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "name": "Huobi Token" - }, - "HT-ERC20": { - "coin": "HT-ERC20", - "name": "Huobi Token", - "coinpaprika_id": "ht-huobi-token", - "coingecko_id": "huobi-token", - "nomics_id": "HT", - "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-ERC20": { - "coin": "HUSD-ERC20", - "name": "HUSD", - "coinpaprika_id": "husd-husd", - "coingecko_id": "husd", - "nomics_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 - }, - "HUSD-HCO20": { - "coin": "HUSD-HCO20", - "name": "HUSD", - "coinpaprika_id": "husd-husd", - "coingecko_id": "husd", - "nomics_id": "HUSD", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "HUSD-KRC20": { - "coin": "HUSD-KRC20", - "name": "HUSD", - "coinpaprika_id": "husd-husd", - "coingecko_id": "husd", - "nomics_id": "HUSD", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "HUSD-PLG20": { - "coin": "HUSD-PLG20", - "name": "HUSD", - "coinpaprika_id": "husd-husd", - "coingecko_id": "husd", - "nomics_id": "HUSD", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "LEASH-ERC20" : { - "coin": "LEASH-ERC20", - "name": "Doge Killer", - "coinpaprika_id": "leash-doge-killer", - "coingecko_id": "leash", - "nomics_id": "LEASH", - "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-ERC20": { - "coin": "LEO-ERC20", - "name": "LEO Token", - "coinpaprika_id": "leo-leo-token", - "coingecko_id": "leo-token", - "nomics_id": "LEO", - "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-PLG20": { - "coin": "LEO-PLG20", - "name": "LEO Token", - "coinpaprika_id": "leo-leo-token", - "coingecko_id": "leo-token", - "nomics_id": "LEO", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "LRC-ERC20": { - "coin": "LRC-ERC20", - "name": "Loopring", - "coinpaprika_id": "lrc-loopring", - "coingecko_id": "loopring", - "nomics_id": "LRC", - "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-PLG20": { - "coin": "LRC-PLG20", - "name": "Loopring", - "coinpaprika_id": "lrc-loopring", - "coingecko_id": "loopring", - "nomics_id": "LRC", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "MANA-ERC20": { - "coin": "MANA-ERC20", - "name": "Decentraland", - "coinpaprika_id": "mana-decentraland", - "coingecko_id": "decentraland", - "nomics_id": "MANA", - "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-BEP20": { - "coin": "MANA-BEP20", - "name": "Decentraland", - "coinpaprika_id": "mana-decentraland", - "coingecko_id": "decentraland", - "nomics_id": "MANA", - "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 - }, - "MANA-KRC20": { - "coin": "MANA-KRC20", - "name": "Decentraland", - "coinpaprika_id": "mana-decentraland", - "coingecko_id": "decentraland", - "nomics_id": "MANA", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "MANA-PLG20": { - "coin": "MANA-PLG20", - "name": "Decentraland", - "coinpaprika_id": "mana-decentraland", - "coingecko_id": "decentraland", - "nomics_id": "MANA", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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-ERC20": { - "coin": "POWR-ERC20", - "name": "Power Ledger", - "coinpaprika_id": "powr-power-ledger", - "coingecko_id": "power-ledger", - "nomics_id": "POWR", - "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-PLG20": { - "coin": "POWR-PLG20", - "name": "Power Ledger", - "coinpaprika_id": "powr-power-ledger", - "coingecko_id": "power-ledger", - "nomics_id": "POWR", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "PRCY-BEP20": { - "coin": "PRCY-BEP20", - "name": "PRivaCY Coin", - "coinpaprika_id": "prcy-privacy-coin", - "coingecko_id": "privacy-coin", - "nomics_id": "PRCY", - "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 - }, - "PRCY-ERC20": { - "coin": "PRCY-ERC20", - "name": "PRivaCY Coin", - "coinpaprika_id": "prcy-privacy-coin", - "coingecko_id": "privacy-coin", - "nomics_id": "PRCY", - "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 - }, - "PRCY-PLG20": { - "coin": "PRCY-PLG20", - "name": "PRivaCY Coin", - "coinpaprika_id": "prcy-privacy-coin", - "coingecko_id": "privacy-coin", - "nomics_id": "PRCY", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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-ERC20": { - "coin": "RLC-ERC20", - "name": "iExec RLC", - "coinpaprika_id": "rlc-iexec-rlc", - "coingecko_id": "iexec-rlc", - "nomics_id": "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 - }, - "RLC-PLG20": { - "coin": "RLC-PLG20", - "name": "iExec RLC", - "coinpaprika_id": "rlc-iexec-rlc", - "coingecko_id": "iexec-rlc", - "nomics_id": "RLC", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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 - }, - "SHIB-BEP20": { - "coin": "SHIB-BEP20", - "name": "Shiba Inu", - "coinpaprika_id": "shib-shiba-inu", - "coingecko_id": "shiba-inu", - "nomics_id": "SHIB", - "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 - }, - "SHIB-ERC20": { - "coin": "SHIB-ERC20", - "name": "Shiba Inu", - "coinpaprika_id": "shib-shiba-inu", - "coingecko_id": "shiba-inu", - "nomics_id": "SHIB", - "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-ERC20": { - "coin": "SRM-ERC20", - "name": "Serum", - "coinpaprika_id": "srm-serum", - "coingecko_id": "serum", - "nomics_id": "SRM", - "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-PLG20": { - "coin": "SRM-PLG20", - "name": "Serum", - "coinpaprika_id": "srm-serum", - "coingecko_id": "serum", - "nomics_id": "SRM", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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 - }, - "UBQ": { - "coin": "UBQ", - "name": "Ubiq", - "coinpaprika_id": "ubq-ubiq", - "coingecko_id": "ubiq", - "nomics_id": "UBQ", - "nodes": [ - "https://rpc.octano.dev/" - ], - "explorer_url": [ - "https://ubiqscan.io/" - ], - "type": "Ubiq", - "active": false, - "currently_enabled": false - }, - "UBT-ERC20": { - "coin": "UBT-ERC20", - "name": "Unibright", - "coinpaprika_id": "ubt-unibright", - "coingecko_id": "unibright", - "nomics_id": "UBT", - "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-PLG20": { - "coin": "UBT-PLG20", - "name": "Unibright", - "coinpaprika_id": "ubt-unibright", - "coingecko_id": "unibright", - "nomics_id": "UBT", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "UMA-AVX20": { - "coin": "UMA-AVX20", - "name": "UMA", - "coinpaprika_id": "uma-uma", - "coingecko_id": "uma", - "nomics_id": "UMA", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "UMA-ERC20": { - "coin": "UMA-ERC20", - "name": "UMA", - "coinpaprika_id": "uma-uma", - "coingecko_id": "uma", - "nomics_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 - }, - "UMA-PLG20": { - "coin": "UMA-PLG20", - "name": "UMA", - "coinpaprika_id": "uma-uma", - "coingecko_id": "uma", - "nomics_id": "UMA", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "UNI-AVX20": { - "coin": "UNI-AVX20", - "name": "Uniswap", - "coinpaprika_id": "uni-uniswap", - "coingecko_id": "uniswap", - "nomics_id": "UNI", - "nodes": [ - "https://api.avax.network/ext/bc/C/rpc" - ], - "explorer_url": [ - "https://snowtrace.io/" - ], - "type": "AVX-20", - "active": false, - "currently_enabled": false - }, - "UNI-BEP20": { - "coin": "UNI-BEP20", - "name": "Uniswap", - "coinpaprika_id": "uni-uniswap", - "coingecko_id": "uniswap", - "nomics_id": "UNI", - "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", - "nomics_id": "UNI", - "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-HCO20": { - "coin": "UNI-HCO20", - "name": "Uniswap", - "coinpaprika_id": "uni-uniswap", - "coingecko_id": "uniswap", - "nomics_id": "UNI", - "nodes": [ - "https://http-mainnet.hecochain.com" - ], - "explorer_url": [ - "https://hecoinfo.com/" - ], - "type": "HecoChain", - "active": false, - "currently_enabled": false - }, - "UNI-KRC20": { - "coin": "UNI-KRC20", - "name": "Uniswap", - "coinpaprika_id": "uni-uniswap", - "coingecko_id": "uniswap", - "nomics_id": "UNI", - "nodes": [ - "https://rpc-mainnet.kcc.network" - ], - "explorer_url": [ - "https://explorer.kcc.io/en/" - ], - "type": "KRC-20", - "active": false, - "currently_enabled": false - }, - "UNI-PLG20": { - "coin": "UNI-PLG20", - "name": "Uniswap", - "coinpaprika_id": "uni-uniswap", - "coingecko_id": "uniswap", - "nomics_id": "UNI", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "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 - }, - "USBL": { - "coin": "USBL", - "name": "Balanced Dollar", - "coingecko_id": "test-coin", - "coinpaprika_id": "test-coin", - "nomics_id": "USBL", - "electrum": [ - { - "url": "swap.softbalanced.com:50001", - "protocol": "TCP" - }, - { - "url": "swap.softbalanced.com:50002", - "protocol": "SSL", - "disable_cert_verification": true - } - ], - "explorer_url": [ - "https://softbalanced.com:3001/insight/" - ], - "explorer_tx_url": "tx/", - "type": "UTXO", - "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-ERC20": { - "coin": "VGX-ERC20", - "name": "Voyager", - "coinpaprika_id": "ethos-ethos", - "coingecko_id": "ethos", - "nomics_id": "VGX", - "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-PLG20": { - "coin": "VGX-PLG20", - "name": "Voyager", - "coinpaprika_id": "ethos-ethos", - "coingecko_id": "ethos", - "nomics_id": "VGX", - "nodes": [ - "https://polygon-rpc.com", - "https://poly-rpc.gateway.pokt.network", - "https://matic-mainnet.chainstacklabs.com" - ], - "explorer_url": [ - "https://polygonscan.com/" - ], - "type": "Matic", - "active": false, - "currently_enabled": false - }, - "WHIVE": { - "coin": "WHIVE", - "name": "Whive", - "coingecko_id": "whive", - "coinpaprika_id": "whive-the-whive-protocol", - "nomics_id": "WHIVE", - "electrum": [ - { - "url": "electrumx1.cointest.com:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrumx2.cointest.com:50002", - "protocol": "SSL", - "disable_cert_verification": true - }, - { - "url": "electrumx1.cointest.com:50001", - "protocol": "TCP" - }, - { - "url": "electrumx2.cointest.com:50001", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://whiveexplorer.cointest.com/" - ], - "type": "UTXO", - "active": false, - "is_segwit_on": 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 - }, - "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 - }, - "VOTE2022": { - "coin": "VOTE2022", - "name": "Vote 2022", - "coinpaprika_id": "test-coin", - "coingecko_id": "test-coin", - "electrum": [ - { - "url": "electrum1.cipig.net:10002" - }, - { - "url": "electrum2.cipig.net:10002" - }, - { - "url": "electrum3.cipig.net:10002" - } - ], - "explorer_url": [ - "https://vote.kmdexplorer.io/" - ], - "type": "Smart Chain", - "active": false, - "wallet_only": true, - "currently_enabled": false - }, - "ZINU-BEP20": { - "coin": "ZINU-BEP20", - "name": "Zombie Inu", - "coinpaprika_id": "zombie-inu", - "coingecko_id": "zinu-zombie-inu", - "nomics_id": "ZINUBEP20", - "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 - }, - "IC": { - "coin": "IC", - "name": "Ignition", - "coingecko_id": "ignition", - "coinpaprika_id": "ic-ignition", - "nomics_id": "IC", - "electrum": [ - { - "url": "electrum1.ignitioncoin.org:10001", - "protocol": "TCP" - }, - { - "url": "electrum2.ignitioncoin.org:10001", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://chainz.cryptoid.info/ic/" - ], - "explorer_tx_url": "tx.dws?", - "explorer_address_url": "address.dws?", - "type": "UTXO", - "active": false, - "currently_enabled": false - }, - "RUNES": { - "coin": "RUNES", - "name": "Runebase", - "coinpaprika_id": "runes-runebase", - "coingecko_id": "runebase", - "nomics_id": "RUNES", - "electrum": [ - { - "url": "electrum1.runebase.io:50002", - "ws_url": "electrum1.runebase.io:50004", - "protocol": "SSL" - }, - { - "url": "electrum2.runebase.io:50002", - "ws_url": "electrum2.runebase.io:50004", - "protocol": "SSL" - }, - { - "url": "electrum3.runebase.io:50002", - "ws_url": "electrum3.runebase.io:50004", - "protocol": "SSL" - }, - { - "url": "electrum4.runebase.io:50002", - "ws_url": "electrum4.runebase.io:50004", - "protocol": "SSL" - }, - { - "url": "electrum1.runebase.io:50001", - "protocol": "TCP" - }, - { - "url": "electrum2.runebase.io:50001", - "protocol": "TCP" - }, - { - "url": "electrum3.runebase.io:50001", - "protocol": "TCP" - }, - { - "url": "electrum4.runebase.io:50001", - "protocol": "TCP" - } - ], - "explorer_url": [ - "https://explorer.runebase.io/" - ], - "explorer_tx_url": "tx/", - "explorer_address_url": "address/", - "type": "UTXO", - "active": false, - "is_segwit_on": false, - "currently_enabled": false - }, -"ACTN": { - "coin": "ACTN", - "name": "Action Coin", - "type": "Smart Chain", - "coinpaprika_id": "actn-action-coin", - "coingecko_id": "action-coin", - "nomics_id": "ACTN", - "electrum": [ - { - "url": "electrumx1.actioncoin.com:30001", - "ws_url": "electrumx1.actioncoin.com:20001", - "protocol": "SSL" - }, - { - "url": "electrumx2.actioncoin.com:30001", - "ws_url": "electrumx2.actioncoin.com:20001", - "protocol": "SSL" - }, - { - "url": "electrumx1.actioncoin.com:10001" - }, - { - "url": "electrumx2.actioncoin.com:10001" - } - ], - "explorer_url": [ - "https://exp.actioncoin.com/" - ], - "active": false, - "currently_enabled": false - }, - "ACTN-BEP20": { - "coin": "ACTN-BEP20", - "name": "Action Coin", - "type": "BEP-20", - "nomics_id": "ACTNBEP20", - "coinpaprika_id": "actn-action-coin", - "coingecko_id": "action-coin", - "nodes": [ - "http://bsc1.cipig.net:8655", - "http://bsc2.cipig.net:8655", - "http://bsc3.cipig.net:8655" - ], - "explorer_url": [ - "https://bscscan.com/" - ], - "active": false, - "currently_enabled": false - } -} 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/Addressbook/AddAddressForm.qml b/atomic_defi_design/Dex/Addressbook/AddAddressForm.qml index dc7357ecb4..7b73c27e05 100644 --- a/atomic_defi_design/Dex/Addressbook/AddAddressForm.qml +++ b/atomic_defi_design/Dex/Addressbook/AddAddressForm.qml @@ -21,7 +21,7 @@ Dex.Rectangle property string addressKey property string addressValue - property var availableNetworkStandards: ["QRC-20", "ERC-20", "BEP-20", "Smart Chain"] + 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) @@ -32,11 +32,11 @@ Dex.Rectangle case "BEP-20": return "BNB" case "ERC-20": return "ETH" case "Smart Chain": return "KMD" - case "SLP": return "BCH" + 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) + if (coinInfo.has_parent_fees_ticker && coinInfo.type !== "SLP") return coinInfo.fees_ticker; return addressType } @@ -46,11 +46,11 @@ Dex.Rectangle { 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 + 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 } @@ -156,10 +156,12 @@ Dex.Rectangle Dex.Text { id: invalidAddressValueLabel - Layout.fillWidth: true + Layout.preferredWidth: 458 + Layout.preferredHeight: 60 visible: text !== "" color: Dex.CurrentTheme.noColor - wrapMode: Dex.Text.Wrap + wrapMode: Dex.Text.WordWrap + elide: Dex.Text.ElideRight horizontalAlignment: Text.AlignHCenter } @@ -228,10 +230,12 @@ Dex.Rectangle { return } - - if (!Dex.API.app.wallet_pg.validate_address_data.is_valid) // Entered address is invalid. + + let validation_data = Dex.API.app.wallet_pg.validate_address_data + if (!validation_data.is_valid) // Entered address is invalid. { - invalidAddressValueLabel.text = Dex.API.app.wallet_pg.validate_address_data.reason + invalidAddressValueLabel.text = validation_data.reason + return } diff --git a/atomic_defi_design/Dex/Addressbook/EditContactModal.qml b/atomic_defi_design/Dex/Addressbook/EditContactModal.qml index 1800e7d7fa..673c52936a 100644 --- a/atomic_defi_design/Dex/Addressbook/EditContactModal.qml +++ b/atomic_defi_design/Dex/Addressbook/EditContactModal.qml @@ -288,7 +288,7 @@ Dex.MultipageModal Layout.preferredWidth: 199 Layout.preferredHeight: 48 radius: 18 - text: qsTr("Close") + text: qsTr("Cancel") onClicked: root.close() }, diff --git a/atomic_defi_design/Dex/Addressbook/Main.qml b/atomic_defi_design/Dex/Addressbook/Main.qml index 2b40183e76..df7b1e4a2a 100644 --- a/atomic_defi_design/Dex/Addressbook/Main.qml +++ b/atomic_defi_design/Dex/Addressbook/Main.qml @@ -84,9 +84,8 @@ Item Dex.GradientButton { - width: 213 - height: 48.51 - radius: 18 + height: 40 + radius: 15 text: qsTr("+ NEW CONTACT") onClicked: newContactPopup.open() @@ -226,15 +225,16 @@ Item Row { spacing: 45 - width: 160 + width: edit_contact.implicitWidth + delete_contact.implicitWidth + 65 anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: 2 + anchors.rightMargin: 20 + Dex.ClickableText { + id: edit_contact anchors.verticalCenter: parent.verticalCenter - font.underline: true - font.pixelSize: 15 + font: Dex.DexTypo.underline14 text: qsTr("Edit") onClicked: { @@ -242,11 +242,12 @@ Item editContactLoader.open() } } + Dex.ClickableText { + id: delete_contact anchors.verticalCenter: parent.verticalCenter - font.underline: true - font.pixelSize: 15 + font: Dex.DexTypo.underline14 text: qsTr("Delete") onClicked: removeContactPopup.open() diff --git a/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml b/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml index c0fc890e02..4c61b27c64 100644 --- a/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml +++ b/atomic_defi_design/Dex/Addressbook/NewContactPopup.qml @@ -3,28 +3,32 @@ import QtQuick 2.15 import QtQuick.Layouts 1.15 // Project Imports +import "../Components" import "../Constants" import Dex.Components 1.0 as Dex Dex.Popup { id: root - - width: 250 - height: 55 - + width: parent.width < 180 ? 180 : parent.width + height: 88 onOpened: nameField.forceActiveFocus() onClosed: nameField.text = "" - contentItem: Row + contentItem: Column { - spacing: 4 + id: new_contact_input + anchors.centerIn: parent + anchors.fill: parent + anchors.margins: 8 + spacing: 8 Dex.TextField { id: nameField - width: parent.width * 0.6 - height: parent.height + height: 30 + width: parent.width - 20 + anchors.horizontalCenter: parent.horizontalCenter placeholderText: qsTr("Contact name") Dex.ToolTip @@ -39,11 +43,13 @@ Dex.Popup } } - Dex.Button + DefaultButton { - width: parent.width * 0.36 - height: parent.height + id: add_contact_btn + font: DexTypo.body2 text: qsTr("+ ADD") + height: 30 + anchors.horizontalCenter: parent.horizontalCenter onClicked: { if (nameField.text.length === 0) diff --git a/atomic_defi_design/Dex/App.qml b/atomic_defi_design/Dex/App.qml index 0aac79294a..b0137c1c15 100644 --- a/atomic_defi_design/Dex/App.qml +++ b/atomic_defi_design/Dex/App.qml @@ -30,6 +30,7 @@ DexRectangle 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 bool segwit_on: false @@ -37,11 +38,23 @@ DexRectangle 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 = []; @@ -133,6 +146,12 @@ DexRectangle error_log_modal.item.field.text = content } + ModalLoader + { + id: logout_modal + sourceComponent: LogoutModal {} + } + // Toast ToastManager { diff --git a/atomic_defi_design/Dex/Components/CoinMenu.qml b/atomic_defi_design/Dex/Components/CoinMenu.qml index a28b0fcaf6..73227c6835 100644 --- a/atomic_defi_design/Dex/Components/CoinMenu.qml +++ b/atomic_defi_design/Dex/Components/CoinMenu.qml @@ -9,6 +9,7 @@ Menu { 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: { @@ -28,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 { diff --git a/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml b/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml index b2594dff5c..908c6a407f 100644 --- a/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml +++ b/atomic_defi_design/Dex/Components/ComboBoxWithSearchBar.qml @@ -21,7 +21,6 @@ ComboBox property alias searchBar: _searchBar property string searchBarPlaceholderText: qsTr("Search") - background: Rectangle { id: bg diff --git a/atomic_defi_design/Dex/Components/DefaultCopyIcon.qml b/atomic_defi_design/Dex/Components/DefaultCopyIcon.qml index 293ff4b09b..4c52187303 100644 --- a/atomic_defi_design/Dex/Components/DefaultCopyIcon.qml +++ b/atomic_defi_design/Dex/Components/DefaultCopyIcon.qml @@ -23,7 +23,7 @@ Qaterial.Icon hoverEnabled: true onClicked: { - Qaterial.Clipboard.text = control.text + Qaterial.Clipboard.text = copyText app.notifyCopy(notifyTitle, notifyMsg) } } diff --git a/atomic_defi_design/Dex/Components/CexInfoTrigger.qml b/atomic_defi_design/Dex/Components/DefaultInfoTrigger.qml similarity index 57% rename from atomic_defi_design/Dex/Components/CexInfoTrigger.qml rename to atomic_defi_design/Dex/Components/DefaultInfoTrigger.qml index 90e2feb801..0fd98f8e73 100644 --- a/atomic_defi_design/Dex/Components/CexInfoTrigger.qml +++ b/atomic_defi_design/Dex/Components/DefaultInfoTrigger.qml @@ -3,6 +3,7 @@ import QtQuick 2.15 DefaultMouseArea { id: mouse_area property bool no_default: true + property var triggerModal anchors.fill: parent - onClicked: no_default ? cex_rates_modal.open() : () => {} + onClicked: no_default ? triggerModal.open() : () => {} } diff --git a/atomic_defi_design/Dex/Components/DefaultProgressBar.qml b/atomic_defi_design/Dex/Components/DefaultProgressBar.qml new file mode 100644 index 0000000000..ed56dd814b --- /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.greenColor + 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/DefaultSlider.qml b/atomic_defi_design/Dex/Components/DefaultSlider.qml index e5a21c7154..be74bd2ce4 100644 --- a/atomic_defi_design/Dex/Components/DefaultSlider.qml +++ b/atomic_defi_design/Dex/Components/DefaultSlider.qml @@ -35,8 +35,8 @@ Slider { x: control.leftPadding + control.visualPosition * (control.availableWidth - width) y: control.topPadding + control.availableHeight / 2 - height / 2 - implicitWidth: 26 - implicitHeight: 26 + implicitWidth: 18 + implicitHeight: 18 radius: 13 gradient: Gradient { diff --git a/atomic_defi_design/Dex/Components/DexAppButton.qml b/atomic_defi_design/Dex/Components/DexAppButton.qml index 962bab8002..4414add9d2 100644 --- a/atomic_defi_design/Dex/Components/DexAppButton.qml +++ b/atomic_defi_design/Dex/Components/DexAppButton.qml @@ -47,7 +47,6 @@ DexRectangle Dex.CurrentTheme.buttonColorDisabled opacity: _controlMouseArea.containsMouse ? 1 : .8 - Row { id: _contentRow @@ -74,7 +73,7 @@ DexRectangle { id: _label anchors.verticalCenter: parent.verticalCenter - font: DexTypo.button + font: DexTypo.body2 text: control.text color: enabled ? _controlMouseArea.containsMouse ? _controlMouseArea.containsPress ? Dex.CurrentTheme.buttonTextPressedColor : diff --git a/atomic_defi_design/Dex/Components/DexAppOutlineButton.qml b/atomic_defi_design/Dex/Components/DexAppOutlineButton.qml index b754fb2e19..41c9bfdff5 100644 --- a/atomic_defi_design/Dex/Components/DexAppOutlineButton.qml +++ b/atomic_defi_design/Dex/Components/DexAppOutlineButton.qml @@ -61,8 +61,10 @@ DexRectangle { color: DexTheme.buttonGradientEnabled2 } } + color: outlinedColor gradient: outlinedColor !== "" ? undefined : btnGradient + DexRectangle { visible: !parent.containsMouse radius: parent.radius - 2 @@ -75,16 +77,20 @@ DexRectangle { height: _label.implicitHeight + (padding * verticalPadding) width: _contentRow.implicitWidth + (padding * horizontalPadding) - Row { + Row + { id: _contentRow - anchors { + 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 { + + Qaterial.ColorIcon + { id: _icon iconSize: _label.font.pixelSize + 2 visible: control.iconSource === "" ? false : true @@ -93,14 +99,16 @@ DexRectangle { anchors.verticalCenter: parent.verticalCenter } - DexLabel { + DexLabel + { id: _label anchors.verticalCenter: parent.verticalCenter - font: DexTypo.body1 + font: DexTypo.body2 text: control.text color: control.foregroundColor } } + DexMouseArea { id: _controlMouseArea anchors.fill: parent diff --git a/atomic_defi_design/Dex/Components/DexAppPasswordField.qml b/atomic_defi_design/Dex/Components/DexAppPasswordField.qml index 65d6a4e7fd..a071c90e17 100644 --- a/atomic_defi_design/Dex/Components/DexAppPasswordField.qml +++ b/atomic_defi_design/Dex/Components/DexAppPasswordField.qml @@ -6,6 +6,7 @@ import Qaterial 1.0 as Qaterial import App 1.0 import Dex.Themes 1.0 as Dex +import "../Constants" DexAppTextField { @@ -19,7 +20,7 @@ DexAppTextField height: 50 width: 300 background.radius: 25 - max_length: 1000 + max_length: General.max_std_pw_length field.echoMode: TextField.Password field.font: Qt.font( { diff --git a/atomic_defi_design/Dex/Components/DexComboBox.qml b/atomic_defi_design/Dex/Components/DexComboBox.qml index b3d2171fea..38245425d2 100644 --- a/atomic_defi_design/Dex/Components/DexComboBox.qml +++ b/atomic_defi_design/Dex/Components/DexComboBox.qml @@ -103,7 +103,7 @@ ComboBox // Each dropdown item delegate: ItemDelegate { - id: delegate + id: combo_item width: control.width highlighted: control.highlightedIndex === index @@ -118,8 +118,8 @@ ComboBox background: Rectangle { - anchors.fill: delegate - color: delegate.highlighted ? Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor : Dex.CurrentTheme.comboBoxBackgroundColor + anchors.fill: combo_item + color: combo_item.highlighted ? Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor : Dex.CurrentTheme.comboBoxBackgroundColor } } diff --git a/atomic_defi_design/Dex/Components/DexDialogTextField.qml b/atomic_defi_design/Dex/Components/DexDialogTextField.qml index e696f2fb99..cee884a867 100644 --- a/atomic_defi_design/Dex/Components/DexDialogTextField.qml +++ b/atomic_defi_design/Dex/Components/DexDialogTextField.qml @@ -17,7 +17,7 @@ Item { 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) { diff --git a/atomic_defi_design/Dex/Components/DexGradientAppButton.qml b/atomic_defi_design/Dex/Components/DexGradientAppButton.qml index f74b4ab822..5624512c13 100644 --- a/atomic_defi_design/Dex/Components/DexGradientAppButton.qml +++ b/atomic_defi_design/Dex/Components/DexGradientAppButton.qml @@ -93,7 +93,7 @@ DexRectangle { id: _label anchors.verticalCenter: parent.verticalCenter - font: DexTypo.button + font: DexTypo.body2 text: control.text color: enabled ? _controlMouseArea.containsMouse ? _controlMouseArea.containsPress ? Dex.CurrentTheme.gradientButtonTextPressedColor : @@ -112,6 +112,7 @@ DexRectangle anchors.verticalCenter: parent.verticalCenter } } + DexMouseArea { id: _controlMouseArea diff --git a/atomic_defi_design/Dex/Components/DexKeyChecker.qml b/atomic_defi_design/Dex/Components/DexKeyChecker.qml index 437caadbc9..fe8634f5e2 100644 --- a/atomic_defi_design/Dex/Components/DexKeyChecker.qml +++ b/atomic_defi_design/Dex/Components/DexKeyChecker.qml @@ -13,6 +13,7 @@ ColumnLayout { 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() { @@ -96,7 +97,7 @@ ColumnLayout { 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 { diff --git a/atomic_defi_design/Dex/Components/DexLanguage.qml b/atomic_defi_design/Dex/Components/DexLanguage.qml index 7c85c5291e..1029bc7abb 100644 --- a/atomic_defi_design/Dex/Components/DexLanguage.qml +++ b/atomic_defi_design/Dex/Components/DexLanguage.qml @@ -14,44 +14,42 @@ DexComboBox { id: control model: API.app.settings_pg.get_available_langs() - - property color highlightedBackgroundColor: Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor - property color mainBackgroundColor: Dex.CurrentTheme.floatingBackgroundColor - + height: 50 displayText: API.app.settings_pg.lang leftPadding: 5 + // Each dropdown item delegate: ItemDelegate { id: combo_item width: control.width - height: 30 + height: 35 highlighted: control.highlightedIndex === index contentItem: RowLayout { anchors.fill: parent - spacing: -13 + spacing: -25 DexImage { id: image - Layout.preferredHeight: 14 + Layout.preferredHeight: 25 source: General.image_path + "lang/" + modelData + ".png" } DexLabel { text: modelData - } } - // Dropdown Item background - background: DexRectangle { + background: Rectangle + { anchors.fill: combo_item - color: combo_item.highlighted ? highlightedBackgroundColor : mainBackgroundColor + radius: 6 + color: combo_item.highlighted ? Dex.CurrentTheme.comboBoxDropdownItemHighlightedColor : Dex.CurrentTheme.comboBoxBackgroundColor } onClicked: @@ -63,28 +61,30 @@ DexComboBox } } + // Main, selected item contentItem: Text { anchors.fill: parent leftPadding: 0 rightPadding: control.indicator.width + control.spacing - - //text: control.displayText - font: control.font - color: control.pressed ? "#17a81a" : "#21be2b" verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight DexImage { id: image - height: 12 - x: 8 + 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 diff --git a/atomic_defi_design/Dex/Components/DexMacosHeaderControl.qml b/atomic_defi_design/Dex/Components/DexMacosHeaderControl.qml index 8886236630..190d60301c 100644 --- a/atomic_defi_design/Dex/Components/DexMacosHeaderControl.qml +++ b/atomic_defi_design/Dex/Components/DexMacosHeaderControl.qml @@ -4,6 +4,9 @@ import QtQuick.Controls.Universal 2.15 import QtQuick.Layouts 1.12 import Qaterial 1.0 as Qaterial +import ModelHelper 0.1 + +import "../Constants" Row { @@ -11,6 +14,7 @@ Row 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 @@ -40,10 +44,9 @@ Row id: closeButton hoverEnabled: true anchors.fill: parent - onClicked: - { - Qt.quit() - console.log("Window.visibility: " + window.visibility) + onClicked: { + if (orders.count === 0 || !API.app.wallet_mgr.log_status()) Qt.quit() + else app.logout_confirm_modal.open() } } } diff --git a/atomic_defi_design/Dex/Components/DexWindowHeaderControl.qml b/atomic_defi_design/Dex/Components/DexWindowHeaderControl.qml index dca30634f5..f84d8c9013 100644 --- a/atomic_defi_design/Dex/Components/DexWindowHeaderControl.qml +++ b/atomic_defi_design/Dex/Components/DexWindowHeaderControl.qml @@ -2,13 +2,17 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Controls.Universal 2.15 import QtQuick.Layouts 1.12 +import ModelHelper 0.1 import Qaterial 1.0 as Qaterial +import "../Constants" import Dex.Themes 1.0 as Dex RowLayout { + property var orders: API.app.orders_mdl.orders_proxy_mdl.ModelHelper + width: 120 anchors.right: parent.right height: 30 @@ -68,6 +72,10 @@ RowLayout foregroundColor: Dex.CurrentTheme.foregroundColor icon.source: Qaterial.Icons.windowClose - onClicked: Qt.quit() + onClicked: + { + if (orders.count === 0 || !API.app.wallet_mgr.log_status()) Qt.quit() + else app.logout_confirm_modal.open() + } } } diff --git a/atomic_defi_design/Dex/Components/GasInfoModal.qml b/atomic_defi_design/Dex/Components/GasInfoModal.qml new file mode 100644 index 0000000000..be86f0dd52 --- /dev/null +++ b/atomic_defi_design/Dex/Components/GasInfoModal.qml @@ -0,0 +1,42 @@ +// 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("How do I calculate gas?") + + DefaultText { + Layout.fillWidth: true + + text: qsTr('Gas is measured in gwei. Gwei is just a unit of Ether, and is equal to 0.000000001 ETH (or the equivalent platform coin such as AVAX or BNB). The gas price varies over time depending on network congestion.') + } + DefaultText { + Layout.fillWidth: true + + text: qsTr('The gas limit is how many units of gas (maximum) you allocate to pay for a transaction. The gas required depending on the size of the transaction & data being transmitted.') + } + DefaultText { + Layout.fillWidth: true + + text: qsTr('A standard transaction not involving contracts uses 21,000 gas units, with any of the limit remaining returned to the source address.') + } + DefaultText { + Layout.fillWidth: true + + text: qsTr('Transactions involving contracts may result in the whole limit being consumed, so be careful not to set it too high.') + } + DefaultText { + Layout.fillWidth: true + + text: qsTr('For more information, read the article at https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use') + } + } +} diff --git a/atomic_defi_design/Dex/Components/LogoutModal.qml b/atomic_defi_design/Dex/Components/LogoutModal.qml new file mode 100644 index 0000000000..f205e15293 --- /dev/null +++ b/atomic_defi_design/Dex/Components/LogoutModal.qml @@ -0,0 +1,72 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import ModelHelper 0.1 + +import App 1.0 +import Dex.Themes 1.0 as Dex +import "../Constants" +import "../Components" + +MultipageModal { + id: root + + property var orders: API.app.orders_mdl.orders_proxy_mdl.ModelHelper + + MultipageModalContent { + id: modal_content + topMarginAfterTitle: 15 + titleText: qsTr("Exit %1 or go to login menu?").arg(API.app_name) + + // Swap in progress warning + DefaultText + { + visible: orders + font.pixelSize: 14 + Layout.alignment: Qt.AlignHCenter + horizontalAlignment: Text.AlignHCenter + Layout.fillWidth: true + color: Dex.CurrentTheme.noColor + text_value: + { + for (let i = 0; i < orders.count; i++) + { + let status = orders.data(i).order_status + switch (status) { + case "matched": + case "ongoing": + return qsTr("Warning: You currently have a swap in progress.\nLogging out may result in a failed swap.") + case "successful": + case "refunding": + case "failed": + break + default: + return qsTr("Warning: You currently have open maker orders.\nThey will be removed from the orderbook until you log in again.") + } + } + return "" + } + } + + // Buttons + footer: [ + DefaultButton { + text: qsTr("Login menu") + Layout.fillWidth: true + onClicked: + { + return_to_login() + } + }, + DefaultButton { + text: qsTr("Exit") + Layout.fillWidth: true + onClicked: Qt.quit() + }, + DefaultButton { + text: qsTr("Cancel") + Layout.fillWidth: true + onClicked: root.close() + } + ] + } +} diff --git a/atomic_defi_design/Dex/Components/MultipageModalContent.qml b/atomic_defi_design/Dex/Components/MultipageModalContent.qml index 31f4d6233d..fa900230ff 100644 --- a/atomic_defi_design/Dex/Components/MultipageModalContent.qml +++ b/atomic_defi_design/Dex/Components/MultipageModalContent.qml @@ -3,6 +3,7 @@ import QtQuick.Layouts 1.15 import "../Constants" import App 1.0 +import Dex.Themes 1.0 as Dex ColumnLayout { @@ -10,7 +11,10 @@ ColumnLayout property alias title: _title property alias titleText: _title.text + property alias subtitle: _subtitle + property alias subtitleText: _subtitle.text property var titleAlignment: Qt.AlignLeft + property var subtitleAlignment: Qt.AlignLeft property int titleTopMargin: 20 property int topMarginAfterTitle: 30 @@ -35,6 +39,16 @@ ColumnLayout visible: text != '' } + DefaultText + { + id: _subtitle + Layout.topMargin: 5 + Layout.alignment: root.subtitleAlignment + color: Dex.CurrentTheme.foregroundColor2 + font.pixelSize: 13 + visible: text != '' + } + // Header ColumnLayout diff --git a/atomic_defi_design/Dex/Components/PairItemBadge.qml b/atomic_defi_design/Dex/Components/PairItemBadge.qml index d109a7dd23..98da7d1197 100644 --- a/atomic_defi_design/Dex/Components/PairItemBadge.qml +++ b/atomic_defi_design/Dex/Components/PairItemBadge.qml @@ -1,13 +1,15 @@ import QtQuick 2.15 import QtQuick.Layouts 1.15 +import bignumberjs 1.0 + DefaultRectangle { id: root - property alias source: icon.source - property alias ticker: ticker.text - property alias fullname: fullname.text - property alias amount: amount.text + property alias source: icon.source + property alias ticker: ticker.text + property alias fullname: fullname.text + property string amount width: 260 height: 66 @@ -51,11 +53,15 @@ DefaultRectangle DefaultText { - id: amount Layout.fillWidth: true font.pixelSize: 11 horizontalAlignment: Text.AlignLeft wrapMode: Text.NoWrap + text: + { + BigNumber.config({ DECIMAL_PLACES: 6 }) + return new BigNumber(root.amount).toString(10) + } } } @@ -91,4 +97,4 @@ DefaultRectangle Item { Layout.fillWidth: true } } -} \ No newline at end of file +} diff --git a/atomic_defi_design/Dex/Components/PasswordField.qml b/atomic_defi_design/Dex/Components/PasswordField.qml index a1cc503c18..163d44ac01 100644 --- a/atomic_defi_design/Dex/Components/PasswordField.qml +++ b/atomic_defi_design/Dex/Components/PasswordField.qml @@ -7,6 +7,7 @@ import App 1.0 ColumnLayout { property alias title: pw.title property alias field: pw.field + property int max_pw_len: General.max_std_pw_length property bool hide_hint: false property bool new_password: true property string match_password @@ -58,6 +59,7 @@ ColumnLayout { title: qsTr("Password") field.placeholderText: qsTr("Enter your wallet password") field.validator: RegExpValidator { regExp: General.reg_pass_input } + max_length: max_pw_len } ColumnLayout { @@ -92,7 +94,7 @@ ColumnLayout { } DefaultText { font.pixelSize: Style.textSizeSmall3 - 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()) } DefaultText { diff --git a/atomic_defi_design/Dex/Components/PopupManager.qml b/atomic_defi_design/Dex/Components/PopupManager.qml index 314dbf1406..8d2a3d7f66 100644 --- a/atomic_defi_design/Dex/Components/PopupManager.qml +++ b/atomic_defi_design/Dex/Components/PopupManager.qml @@ -4,6 +4,7 @@ import Qaterial 1.0 as Qaterial import QtQuick.Layouts 1.12 import App 1.0 import Dex.Themes 1.0 as Dex +import "../Constants" Popup { @@ -11,7 +12,7 @@ Popup id: dialog width: 420 - height: _insideColumn.height > dialog.height ? _insideColumn.height + 82 : dialog.height + height: _insideColumn.height > dialog.height ? _insideColumn.height + 82 : dialog.height dim: true modal: true anchors.centerIn: Overlay.overlay @@ -54,6 +55,7 @@ Popup property int standardButtons: Dialog.NoButton property string yesButtonText: "" property string cancelButtonText: "" + property bool showCancelBtn: true property bool getText: false property bool isPassword: false property bool centerAlign: false @@ -160,6 +162,7 @@ Popup placeholderText: dialog.placeholderText field.placeholderText: "" field.forceFocus: forceFocus + max_length: dialog.isPassword ? General.max_std_pw_length : 40 field.rightPadding: dialog.isPassword ? 55 : 20 field.leftPadding: dialog.isPassword ? 70 : 20 field.echoMode: dialog.isPassword ? TextField.Password : TextField.Normal @@ -254,6 +257,7 @@ Popup DexAppButton { id: cancelBtn + visible: showCancelBtn text: dialog.cancelButtonText !== "" ? dialog.cancelButtonText : "Cancel" height: 40 leftPadding: 20 @@ -273,7 +277,7 @@ Popup { text: dialog.yesButtonText !== "" ? dialog.yesButtonText : "Yes" height: 40 - width: cancelBtn.width + width: showCancelBtn ? cancelBtn.width : 90 leftPadding: 20 rightPadding: 20 radius: 18 diff --git a/atomic_defi_design/Dex/Components/TextEditWithCopy.qml b/atomic_defi_design/Dex/Components/TextEditWithCopy.qml new file mode 100644 index 0000000000..859be3bc4b --- /dev/null +++ b/atomic_defi_design/Dex/Components/TextEditWithCopy.qml @@ -0,0 +1,84 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import "../Constants" +import "../Components" +import App 1.0 +import Dex.Themes 1.0 as Dex +import Dex.Components 1.0 as Dex + +RowLayout +{ + id: control + property string text_value: "" + property int font_size: Style.textSize + property int text_box_width: 500 + property bool privacy: false + property bool align_left: false + property string linkURL: "" + property string onCopyNotificationTitle: "" + property string onCopyNotificationMsg: qsTr("copied to clipboard") + Layout.fillWidth: true + + Item { Layout.fillWidth: !align_left } + + Dex.Rectangle + { + width: text_box_width + height: 30 + color: Dex.CurrentTheme.buttonColorEnabled + + RowLayout + { + spacing: 4 + anchors.fill: parent + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: !align_left ? parent.horizontalCenter : undefined + + Item { width: 6 } + + TextEdit + { + font.family: Style.font_family + font.pixelSize: font_size + 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 + } + + Item { Layout.fillWidth: true } + + DefaultCopyIcon + { + id: copy_icon + visible: control.onCopyNotificationTitle !== "" + copyText: control.text_value + notifyTitle: control.onCopyNotificationTitle + notifyMsg: control.onCopyNotificationMsg + iconSize: font_size + } + + DefaultLinkIcon + { + visible: control.linkURL !== "" + linkURL: control.linkURL + iconSize: font_size + } + + Item { width: 6 } + } + + DefaultMouseArea + { + anchors.fill: parent + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + acceptedButtons: Qt.NoButton + } + } + + Item { Layout.fillWidth: true } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Components/TextEditWithTitle.qml b/atomic_defi_design/Dex/Components/TextEditWithTitle.qml index 463992a3b8..93a0eba3c6 100644 --- a/atomic_defi_design/Dex/Components/TextEditWithTitle.qml +++ b/atomic_defi_design/Dex/Components/TextEditWithTitle.qml @@ -36,7 +36,7 @@ ComponentWithTitle opacity: show_content ? 1 : 0 wrapMode: Text.WordWrap monospace: control.monospace - + rightPadding: 5 Behavior on opacity { SmoothedAnimation { duration: expand_animation.duration; velocity: -1 } } Behavior on Layout.preferredHeight { SmoothedAnimation { id: expand_animation; duration: Constants.Style.animationDuration * 2; velocity: -1 } } } @@ -48,7 +48,6 @@ ComponentWithTitle copyText: control.text notifyTitle: control.onCopyNotificationTitle notifyMsg: control.onCopyNotificationMsg - x: _text.width + 10 iconSize: 14 } @@ -56,7 +55,7 @@ ComponentWithTitle { visible: control.linkURL !== "" linkURL: control.linkURL - x: copyIcon.visible ? _text.width + 10 : _text.width + 16 + x: copyIcon.visible ? _text.width + 18 : _text.width + 28 iconSize: 14 } diff --git a/atomic_defi_design/Dex/Components/TextFieldWithTitle.qml b/atomic_defi_design/Dex/Components/TextFieldWithTitle.qml index 0ee1d04381..e0bd8aae3f 100644 --- a/atomic_defi_design/Dex/Components/TextFieldWithTitle.qml +++ b/atomic_defi_design/Dex/Components/TextFieldWithTitle.qml @@ -19,6 +19,8 @@ ColumnLayout property alias title: title_text.text property alias field: input_field + property alias max_length: input_field.maximumLength + property alias hide_button: hide_button property alias hide_button_area: hide_button.mouseArea diff --git a/atomic_defi_design/Dex/Components/Widget.qml b/atomic_defi_design/Dex/Components/Widget.qml index 034855730c..6b6c01c908 100644 --- a/atomic_defi_design/Dex/Components/Widget.qml +++ b/atomic_defi_design/Dex/Components/Widget.qml @@ -14,7 +14,9 @@ Item property string title: "Widget" property bool collapsable: true - property bool collapsedAtConstruction: false + property bool collapsed: false + + property bool resizable: true property alias header: headerLoader.sourceComponent property alias background: backgroundLoader.sourceComponent @@ -23,11 +25,16 @@ Item property int spacing: 10 property int contentSpacing: 10 + property int collapsedHeight: 70 + property int minHeight: collapsedHeight + property int maxHeight: -1 + property int _previousHeight + default property alias contentData: content.data - property bool _collapsed: collapsable && collapsedAtConstruction + function isCollapsed() { return collapsed } - function isCollapsed() { return _collapsed } + clip: true // Background Loader @@ -37,8 +44,11 @@ Item sourceComponent: defaultBackground } + // Header + Content Column { + id: column + anchors.fill: parent anchors.margins: root.margins @@ -57,7 +67,7 @@ Item { id: content - visible: !root._collapsed + visible: !root.collapsed width: parent.width height: parent.height - y @@ -66,6 +76,37 @@ Item } } + // Resize area + MouseArea + { + enabled: resizable && !collapsed + visible: enabled + + anchors.bottom: root.bottom + width: root.width + height: 5 + + cursorShape: Qt.SizeVerCursor + + onMouseYChanged: + { + if (root.parent.objectName === "widgetContainer") + { + if (root.parent.availableHeight === 0 && mouseY > 0) + return + if (root.parent.availableHeight && root.parent.availableHeight < mouseY) + root.height += root.parent.availableHeight + else + root.height += mouseY + } + + if (root.maxHeight >= 0 && root.height > root.maxHeight) + root.height = root.maxHeight + else if (root.minHeight >= 0 && root.height < root.minHeight) + root.height = root.minHeight + } + } + // Header Component Component { @@ -81,14 +122,42 @@ Item width: 20 height: 20 color: collapseButMouseArea.containsMouse ? Dex.CurrentTheme.foregroundColor2 : Dex.CurrentTheme.foregroundColor - icon: root._collapsed ? Qaterial.Icons.chevronUp : Qaterial.Icons.chevronDown + icon: root.collapsed ? Qaterial.Icons.chevronUp : Qaterial.Icons.chevronDown DefaultMouseArea { id: collapseButMouseArea anchors.fill: parent hoverEnabled: true - onClicked: root._collapsed = !root._collapsed + onClicked: + { + let oldHeight = root.height + root.collapsed = !root.collapsed + if (root.collapsed) + { + root._previousHeight = root.height + root.height = root.collapsedHeight + } + else + { + if (root.parent.objectName === "widgetContainer" && root.parent.availableHeight < root._previousHeight) + { + if (root.height + root.parent.availableHeight < minHeight) + { + root.parent.resetSizes() + } + else + { + root.height += root.parent.availableHeight + } + } + else + { + root.height = root._previousHeight + } + root._previousHeight = root.collapsedHeight + } + } } } } diff --git a/atomic_defi_design/Dex/Components/WidgetContainer.qml b/atomic_defi_design/Dex/Components/WidgetContainer.qml new file mode 100644 index 0000000000..98326b427f --- /dev/null +++ b/atomic_defi_design/Dex/Components/WidgetContainer.qml @@ -0,0 +1,24 @@ +import QtQuick 2.12 + +Column +{ + readonly property string componentName: "widgetContainer" + readonly property int availableHeight: height - (childrenRect.height + (children.length - 1) * spacing) + + function getHeight(ratio) + { + return (height - (children.length - 1) * spacing) * ratio + } + + function resetSizes() + { + for (let i = 0; i < children.length; i++) + { + let child = children[i] + child.height = child.minHeight + } + } + + spacing: 4 + objectName: componentName +} diff --git a/atomic_defi_design/Dex/Components/ZcashParamsModal.qml b/atomic_defi_design/Dex/Components/ZcashParamsModal.qml new file mode 100644 index 0000000000..c32d414c4c --- /dev/null +++ b/atomic_defi_design/Dex/Components/ZcashParamsModal.qml @@ -0,0 +1,125 @@ +// 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 + +Dex.MultipageModal +{ + id: root + readonly property var coins: API.app.zcash_params.get_enable_after_download() + width: 750 + closePolicy: Popup.NoAutoClose + + // Inside modal + Dex.MultipageModalContent + { + titleText: qsTr("%1 Activation Failed!").arg(coins.join(' / ')) + + Dex.DefaultText + { + Layout.fillWidth: true + text: qsTr("To activate ZHTLC coins, you need to download the Zcash Params.\nThis might take a few minutes...") + } + + HorizontalLine + { + Layout.topMargin: 8 + Layout.bottomMargin: 8 + Layout.fillWidth: true + } + + ColumnLayout + { + Dex.DefaultProgressBar + { + id: sapling_output_params + label.text: "sapling-output.params" + bar_width_pct: 0 + pct_value.text: "0.00 %" + } + Dex.DefaultProgressBar + { + id: sapling_spend_params + label.text: "sapling-spend.params" + bar_width_pct: 0 + pct_value.text: "0.00 %" + } + } + + HorizontalLine + { + Layout.topMargin: 8 + Layout.bottomMargin: 8 + Layout.fillWidth: true + } + + footer: + [ + Item { Layout.fillWidth: true }, + Dex.DefaultButton + { + id: download_button + text: qsTr("Download params & enable coins") + enabled: !sapling_output_params.bar_width_pct > 0 || !sapling_spend_params.bar_width_pct > 0 + onClicked: { + download_button.enabled = false + Dex.API.app.zcash_params.download_zcash_params() + } + }, + Item { Layout.fillWidth: true }, + Dex.DefaultButton + { + text: qsTr("More Info") + onClicked: Qt.openUrlExternally("https://www.coinbureau.com/education/zcash-ceremony/") + }, + Item { Layout.fillWidth: true }, + Dex.DefaultButton + { + text: qsTr("Close") + onClicked: close() + }, + Item { Layout.fillWidth: true } + ] + + Connections + { + target: Dex.API.app.zcash_params + + // todo: can be improved. + // put it maybe in the backend ? + function onCombinedDownloadStatusChanged() + { + let combined_progress = 0 + let data = JSON.parse(Dex.API.app.zcash_params.get_combined_download_progress()) + for (let k in data) + { + let v = data[k]; + let pct = Dex.General.formatDouble(v * 100, 2) + combined_progress += parseFloat(v)/Object.keys(data).length + switch(k) + { + case "sapling-output.params": + sapling_output_params.bar_width_pct = pct + sapling_output_params.pct_value.text = pct + "%" + break + case "sapling-spend.params": + sapling_spend_params.bar_width_pct = pct + sapling_spend_params.pct_value.text = pct + "%" + break + } + console.log(combined_progress) + if (combined_progress == 1) + { + console.log("closing") + root.close() + } + } + } + } + } +} diff --git a/atomic_defi_design/Dex/Constants/DexTypo.qml b/atomic_defi_design/Dex/Constants/DexTypo.qml index b96093de35..55f4e4c55e 100644 --- a/atomic_defi_design/Dex/Constants/DexTypo.qml +++ b/atomic_defi_design/Dex/Constants/DexTypo.qml @@ -99,6 +99,25 @@ QtObject { family: fontFamily, weight: Font.Normal }) + property font body3: Qt.font({ + pixelSize: 12 * fontDensity, + letterSpacing: 0.25, + family: fontFamily, + weight: Font.Normal + }) + property font body4: Qt.font({ + pixelSize: 11 * fontDensity, + letterSpacing: 0.2, + family: fontFamily, + weight: Font.Normal + }) + property font underline14: Qt.font({ + pixelSize: 14 * fontDensity, + letterSpacing: 0.25, + family: fontFamily, + weight: Font.Normal, + underline: true + }) property font button: Qt.font({ pixelSize: 16 * fontDensity, letterSpacing: 1.25, diff --git a/atomic_defi_design/Dex/Constants/General.qml b/atomic_defi_design/Dex/Constants/General.qml index c75cc53bad..feabbc00bb 100644 --- a/atomic_defi_design/Dex/Constants/General.qml +++ b/atomic_defi_design/Dex/Constants/General.qml @@ -8,6 +8,9 @@ QtObject { readonly property int height: 800 readonly property int minimumWidth: 1280 readonly property int minimumHeight: 800 + readonly property int max_camo_pw_length: 256 + readonly property int max_std_pw_length: 256 + readonly property int max_pw_length: max_std_pw_length + max_camo_pw_length readonly property double delta_time: 1000/60 readonly property string os_file_prefix: Qt.platform.os == "windows" ? "file:///" : "file://" @@ -19,7 +22,7 @@ QtObject { function coinIcon(ticker) { - if (ticker === "" || ticker === "All" || ticker===undefined ) + if (ticker === "" || ticker === "All" || ticker===undefined) { return "" } @@ -43,6 +46,70 @@ QtObject { } } + function canSend(ticker, progress=100) + { + if (!API.app.wallet_pg.send_available) return false + if (isZhtlc(ticker) && progress < 100) return false + return true + } + + function isWalletOnly(ticker) + { + return API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker).is_wallet_only + } + + function isZhtlc(ticker) + { + const coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) + return coin_info.is_zhtlc_family + } + + function isZhtlcReady(ticker, progress=100) + { + if (progress == 100) return true + const coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) + if (!coin_info.is_zhtlc_family) return true + console.log("Progress: " + progress) + return false + } + + function zhtlcActivationProgress(activation_status, coin='ARRR') + { + let progress = 100 + if (!activation_status.hasOwnProperty("result")) return progress + let status = activation_status.result.status + let details = activation_status.result.details + + let block_offset = 0 + if (coin == 'ARRR') block_offset = 1900000 + + // use range from checkpoint block to present + if (status == "Ready") + { + if (details.hasOwnProperty("error")) + console.log("[zhtlcActivationProgress] Error enabling: " + JSON.stringify(details.error)) + } + else if (status == "InProgress") + { + if (details.hasOwnProperty("UpdatingBlocksCache")) + { + let n = details.UpdatingBlocksCache.current_scanned_block - block_offset + let d = details.UpdatingBlocksCache.latest_block - block_offset + progress = 5 + parseInt(n/d*15) + } + else if (details.hasOwnProperty("BuildingWalletDb")) + { + let n = details.BuildingWalletDb.current_scanned_block - block_offset + let d = details.BuildingWalletDb.latest_block - block_offset + progress = 20 + parseInt(n/d*80) + } + else if (details.hasOwnProperty("RequestingBalance")) progress = 98 + else progress = 5 + } + else console.log("[zhtlcActivationProgress] Unexpected status: " + status) + return progress + } + function getNomicsId(ticker) { if(ticker === "" || ticker === "All" || ticker===undefined) { return "" @@ -284,6 +351,19 @@ QtObject { return obj } + function getCustomFeeType(ticker_infos) + { + if (["SLP", "ZHTLC", "Moonbeam", "QRC-20"].includes(ticker_infos.type)) return "" + if (!General.isSpecialToken(ticker_infos) && !General.isParentCoin(ticker_infos.ticker) || ["KMD"].includes(ticker_infos.ticker)) + { + return "UTXO" + } + else + { + return "Gas" + } + } + function getFeesDetail(fees) { return [ {"label": qsTr("Taker tx fee: "), "fee": fees.base_transaction_fees, "ticker": fees.base_transaction_fees_ticker}, @@ -325,18 +405,28 @@ QtObject { return JSON.stringify(j_obj, null, 4) } + function addressTxUri(coin_info) { + if (coin_info.tx_uri == "") return "address/" + return coin_info.address_uri + } + + function getTxUri(coin_info) { + if (coin_info.tx_uri == "") return "tx/" + return coin_info.tx_uri + } + function getTxExplorerURL(ticker, txid, add_0x=true) { if(txid !== '') { const coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) const txid_prefix = (add_0x && coin_info.is_erc_family) ? '0x' : '' - return coin_info.explorer_url + coin_info.tx_uri + txid_prefix + txid + return coin_info.explorer_url + getTxUri(coin_info) + txid_prefix + txid } } function getAddressExplorerURL(ticker, address) { if(address !== '') { const coin_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(ticker) - return coin_info.explorer_url + coin_info.address_uri + address + return coin_info.explorer_url + addressTxUri(coin_info) + address } return "" } @@ -505,32 +595,62 @@ QtObject { return exists(v) && v !== "" } - function isParentCoinNeeded(ticker, type) { - for(const c of API.app.portfolio_pg.get_all_enabled_coins()) - if(c.type === type && c.ticker !== ticker) return true - + function isParentCoinNeeded(ticker, coin_type) + { + let enabled_coins = API.app.portfolio_pg.get_all_enabled_coins() + for (const coin of enabled_coins) + { + let c_info = API.app.portfolio_pg.global_cfg_mdl.get_coin_info(coin) + if(c_info.type === coin_type && c_info.ticker !== ticker) return true + } return false } property Timer prevent_coin_disabling: Timer { interval: 5000 } function canDisable(ticker) { - if(prevent_coin_disabling.running) - return false - - if(ticker === atomic_app_primary_coin || ticker === atomic_app_secondary_coin) return false - else if(ticker === "ETH") return !General.isParentCoinNeeded("ETH", "ERC-20") - else if(ticker === "QTUM") return !General.isParentCoinNeeded("QTUM", "QRC-20") + if (prevent_coin_disabling.running) return false + if (ticker === atomic_app_primary_coin || ticker === atomic_app_secondary_coin) return false + if (ticker === "ETH") return !General.isParentCoinNeeded("ETH", "ERC-20") + if (ticker === "MATIC") return !General.isParentCoinNeeded("MATIC", "Matic") + if (ticker === "FTM") return !General.isParentCoinNeeded("FTM", "FTM-20") + if (ticker === "AVAX") return !General.isParentCoinNeeded("AVAX", "AVX-20") + if (ticker === "BNB") return !General.isParentCoinNeeded("BNB", "BEP-20") + if (ticker === "ONE") return !General.isParentCoinNeeded("ONE", "HRC-20") + if (ticker === "QTUM") return !General.isParentCoinNeeded("QTUM", "QRC-20") + if (ticker === "KCS") return !General.isParentCoinNeeded("KCS", "KRC-20") + if (ticker === "HT") return !General.isParentCoinNeeded("HT", "HecoChain") + if (ticker === "BCH") return !General.isParentCoinNeeded("BCH", "SLP") + if (ticker === "UBQ") return !General.isParentCoinNeeded("UBQ", "Ubiq") + if (ticker === "MOVR") return !General.isParentCoinNeeded("MOVR", "Moonriver") + if (ticker === "GLMR") return !General.isParentCoinNeeded("GLMR", "Moonbeam") + if (General.isZhtlc(ticker)) + { + let progress = General.zhtlcActivationProgress(API.app.wallet_pg.ticker_infos.activation_status, ticker) + if (progress != 100) return false + } return true } - function tokenUnitName(type) { + function tokenUnitName(type) + { return type === "QRC-20" ? "Satoshi" : "Gwei" } + function isSpecialToken(current_ticker_infos) + { + if (current_ticker_infos.hasOwnProperty("has_parent_fees_ticker")) + return current_ticker_infos.has_parent_fees_ticker + return false + } + + function isERC20(current_ticker_infos) { + return current_ticker_infos.type === "ERC-20" || current_ticker_infos.type === "BEP-20" || current_ticker_infos.type == "Matic" + } + function isParentCoin(ticker) { - return ["KMD", "ETH", "MATIC", "AVAX", "FTM", "QTUM"].includes(ticker) + return ["KMD", "ETH", "MATIC", "AVAX", "FTM", "QTUM", "BNB", "ONE", "KCS"].includes(ticker) } function isTokenType(type) { @@ -544,6 +664,9 @@ QtObject { function getParentCoin(type) { if(type === "ERC-20") return "ETH" + else if(type === "PLG-20") return "MATIC" + else if(type === "AVX-20") return "AVAX" + else if(type === "FTM-20") return "FTM" else if(type === "QRC-20") return "QTUM" else if(type === "Smart Chain") return "KMD" return "?" @@ -577,6 +700,15 @@ QtObject { return tx_fee + "\n" + trading_fee +"
"+minimum_amount } + function is_swap_safe(checkbox) + { + if (checkbox.checked == true || checkbox.visible == false) + { + return (!API.app.trading_pg.buy_sell_rpc_busy && API.app.trading_pg.last_trading_error == TradingError.None) + } + return false + } + function validateWallet(wallet_name) { if (wallet_name.length >= 25) return "Wallet name must 25 chars or less" return checkIfWalletExists(wallet_name) @@ -643,7 +775,8 @@ QtObject { +")") } - function checkIfWalletExists(name) { + function checkIfWalletExists(name) + { if(API.app.wallet_mgr.get_wallets().indexOf(name) !== -1) return qsTr("Wallet %1 already exists", "WALLETNAME").arg(name) return "" @@ -661,6 +794,10 @@ QtObject { return qsTr("Please fill the price field") case TradingError.VolumeFieldNotFilled: return qsTr("Please fill the volume field") + case TradingError.LeftZhtlcChainNotEnabled: + return qsTr("Please wait for %1 to fully activate").arg(left_ticker) + case TradingError.RightZhtlcChainNotEnabled: + return qsTr("Please wait for %1 to fully activate").arg(right_ticker) case TradingError.VolumeIsLowerThanTheMinimum: return qsTr("%1 volume is lower than minimum trade amount").arg(API.app.trading_pg.market_pairs_mdl.left_selected_coin) + " : " + General.getMinTradeAmount() case TradingError.ReceiveVolumeIsLowerThanTheMinimum: @@ -678,6 +815,11 @@ QtObject { } } + readonly property var zcash_params_filesize: ({ + "sapling-output.params": 3592860, + "sapling-spend.params": 47958396 + }) + readonly property var supported_pairs: ({ "1INCH/BTC": "BINANCE:1INCHBTC", "1INCH/ETH": "HUOBI:1INCHETH", diff --git a/atomic_defi_design/Dex/Constants/Style.qml b/atomic_defi_design/Dex/Constants/Style.qml index a99678c496..993f701f67 100644 --- a/atomic_defi_design/Dex/Constants/Style.qml +++ b/atomic_defi_design/Dex/Constants/Style.qml @@ -185,6 +185,7 @@ QtObject { switch (type) { case 'ERC-20': return getCoinColor("ETH") + case 'ZHTLC': return getCoinColor("ARRR") case 'QRC-20': return getCoinColor("QTUM") case 'Smart Chain': return getCoinColor("KMD") case 'WALLET ONLY': return "#4D4D4D" @@ -237,6 +238,7 @@ QtObject { "AUR": "#0A6C5E", "AVA": "#5B567F", "AVAX": "#E84142", + "AVN": "#33E0CE", "AXS": "#0055D5", "BAL": "#4D4D4D", "BNB": "#F9D987", @@ -267,13 +269,17 @@ QtObject { "GALA": "#011B36", "GLEEC": "#8C41FF", "GRMS": "#12B690", + "GLM": "#0050E6", "GMS": "#0BFBE2", "GMT": "#E9CB7B", + "GMX": "#07A9E6", "GRS": "#377E96", "GRT": "#6E54DB", "GST": "#D7D7D7", "IOTA": "#404040", + "ILNF": "#28873b", "IC": "#72009D", + "JST": "#B41514", "JSTR": "#627EEA", "DOGE": "#C3A634", "ETC": "#328432", @@ -297,6 +303,8 @@ QtObject { "FLUX": "#2B61D1", "FIRO": "#BB2100", "LBC": "#00775C", + "LDO": "#F69988", + "LOOM": "#48BEFF", "LTC": "#BFBBBB", "LUNA": "#FFD83D", "LYNX": "#0071BA", @@ -320,6 +328,7 @@ QtObject { "CRYPTO": "#F58736", "LABS": "#C1F6E1", "LCC": "#068210", + "LNC": "#C3A635", "MESH": "#0098DA", "MGW": "#854F2F", "MONA": "#DEC799", @@ -329,7 +338,9 @@ QtObject { "NZDS": "#1B3044", "RFOX": "#D83331", "BOTS": "#F69B57", + "MC": "#E16428", "MCL": "#EA0000", + "ILNSW": "#28873B", "MM": "#F5B700", "CCL": "#FFE400", "BET": "#F69B57", @@ -379,6 +390,7 @@ QtObject { "CEL": "#4055A6", "CELR": "#595959", "CENNZ": "#2E87F1", + "CHTA": "#C3A634", "COMP": "#00DBA3", "CRO": "#243565", "CVC": "#3AB03E", @@ -408,6 +420,7 @@ QtObject { "MKR": "#1BAF9F", "MINDS": "#687DE3", "NEAR": "#595959", + "NENG": "#BFBBBB", "NEXO": "#A3B3D6", "NVC": "#FCF96D", "NYAN": "#008CE7", @@ -441,6 +454,7 @@ QtObject { "SYS": "#0084C7", "TEL": "#1BD8FF", "TKL": "#536E93", + "TON": "#0088CC", "TRC": "#096432", "TRX": "#F30031", "TSL": "#64B082", @@ -451,10 +465,12 @@ QtObject { "VET": "#18C6FF", "VITE": "#007AFF", "VRM": "#586A7A", + "VTC": "#049161", "WSB": "#FEBB84", "WAVES": "#016BFF", "WBTC": "#CCCCCC", "WHIVE": "#FFCC00", + "WOO": "#595959", "XEC": "#273498", "XEP": "#0277E5", "XLM": "#737373", @@ -468,6 +484,7 @@ QtObject { "YFII": "#FF2A79", "ZET": "#155169", "ZIL": "#42BBB9", + "ZOMBIE": "#72B001", "ZRX": "#302C2C", "UNI": "#FF007A", "VOTE2022": "#7490AA", diff --git a/atomic_defi_design/Dex/Dashboard/NotificationsModal.qml b/atomic_defi_design/Dex/Dashboard/NotificationsModal.qml index 0473fda9ed..014c27d9ad 100644 --- a/atomic_defi_design/Dex/Dashboard/NotificationsModal.qml +++ b/atomic_defi_design/Dex/Dashboard/NotificationsModal.qml @@ -3,6 +3,7 @@ import QtQuick.Layouts 1.15 import QtQuick.Controls 2.15 import Qt.labs.platform 1.0 import Qaterial 1.0 as Qaterial +import ModelHelper 0.1 import Dex.Themes 1.0 as Dex @@ -14,6 +15,7 @@ import "../Screens" DexPopup { id: root + property var orders: API.app.orders_mdl.orders_proxy_mdl.ModelHelper width: 406 height: 526 @@ -240,6 +242,8 @@ DexPopup const change = General.formatFullCrypto("", amount, ticker, "", "", true) if (!app.segwit_on) { + if (amount != 0) + { newNotification("onBalanceUpdateStatus", { am_i_sender, @@ -253,6 +257,7 @@ DexPopup qsTr("Your wallet balance changed"), human_date, "open_wallet_page") + } } else { @@ -260,6 +265,32 @@ DexPopup } } + function onEnablingZCoinStatus(coin, msg, human_date, timestamp) + { + // Ignore if coin already enabled (e.g. parent chain in batch) + if (msg.search("already initialized") > -1) + { + console.trace() + return + } + + // Display the notification + const title = qsTr(" %1 Enable status", "TICKER").arg(coin) + + newNotification("onEnablingZCoinStatus", + { + coin, + human_date, + timestamp + }, + timestamp, + title, + msg, + human_date, + "open_log_modal", + msg) + } + readonly property string check_internet_connection_text: qsTr("Please check your internet connection (e.g. VPN service or firewall might block it).") function onEnablingCoinFailedStatus(coin, error, human_date, timestamp) { @@ -302,6 +333,25 @@ DexPopup toast.show(title, General.time_toast_important_error, error) } + function onDisablingCoinFailedStatus(coin, error, human_date, timestamp) + { + const title = qsTr("Failed to disable %1", "TICKER").arg(coin) + + newNotification("onDisablingCoinFailedStatus", + { + coin, + error, + human_date, + timestamp + }, + timestamp, + title, + human_date, + "open_log_modal", + error) + toast.show(title, General.time_toast_important_error, error) + } + function onEndpointNonReacheableStatus(base_uri, human_date, timestamp) { const title = qsTr("Endpoint not reachable") @@ -364,7 +414,9 @@ DexPopup { API.app.notification_mgr.updateSwapStatus.connect(onUpdateSwapStatus) API.app.notification_mgr.balanceUpdateStatus.connect(onBalanceUpdateStatus) + API.app.notification_mgr.enablingZCoinStatus.connect(onEnablingZCoinStatus) API.app.notification_mgr.enablingCoinFailedStatus.connect(onEnablingCoinFailedStatus) + API.app.notification_mgr.disablingCoinFailedStatus.connect(onDisablingCoinFailedStatus) API.app.notification_mgr.endpointNonReacheableStatus.connect(onEndpointNonReacheableStatus) API.app.notification_mgr.mismatchCustomCoinConfiguration.connect(onMismatchCustomCoinConfiguration) API.app.notification_mgr.batchFailed.connect(onBatchFailed) @@ -373,7 +425,9 @@ DexPopup { API.app.notification_mgr.updateSwapStatus.disconnect(onUpdateSwapStatus) API.app.notification_mgr.balanceUpdateStatus.disconnect(onBalanceUpdateStatus) + API.app.notification_mgr.enablingZCoinStatus.disconnect(onEnablingZCoinStatus) API.app.notification_mgr.enablingCoinFailedStatus.disconnect(onEnablingCoinFailedStatus) + API.app.notification_mgr.disablingCoinFailedStatus.disconnect(onDisablingCoinFailedStatus) API.app.notification_mgr.endpointNonReacheableStatus.disconnect(onEndpointNonReacheableStatus) API.app.notification_mgr.mismatchCustomCoinConfiguration.disconnect(onMismatchCustomCoinConfiguration) API.app.notification_mgr.batchFailed.disconnect(onBatchFailed) @@ -417,7 +471,11 @@ DexPopup MenuItem { text: qsTr("Quit") - onTriggered: Qt.quit() + onTriggered: + { + if (orders.count != 0) logout_modal.open() + else return_to_login() + } } } } @@ -437,7 +495,7 @@ DexPopup pixelSize: 20 weight: Font.Normal } - text: "Notifications" + text: qsTr("Notifications") } Item @@ -655,6 +713,7 @@ DexPopup { text: qsTr('Mark all as read') height: 40 + width: 260 Layout.alignment: Qt.AlignHCenter onClicked: root.reset() } diff --git a/atomic_defi_design/Dex/Exchange/ProView/Chart.qml b/atomic_defi_design/Dex/Exchange/ProView/Chart.qml index 890898328e..4dbc9dc49d 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/Chart.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/Chart.qml @@ -6,6 +6,7 @@ import QtWebEngine 1.8 import "../../Components" import "../../Constants" import Dex.Themes 1.0 as Dex +import AtomicDEX.MarketMode 1.0 Item { @@ -182,9 +183,16 @@ Item Connections { target: app - function onPairChanged() + function onPairChanged(left, right) { - root.loadChart(left_ticker, right_ticker) + if (API.app.trading_pg.market_mode == MarketMode.Sell) + { + root.loadChart(left, right) + } + else + { + root.loadChart(right, left) + } } } diff --git a/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml b/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml index 0839d50ab2..368bce3c3c 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/DexComboBoxLine.qml @@ -4,9 +4,11 @@ import QtQuick.Controls 2.15 import QtGraphicalEffects 1.0 import QtQuick.Controls.Universal 2.15 +import "../../Constants" as Dex import "../../Components" import App 1.0 import Dex.Themes 1.0 as Dex +import Dex.Components 1.0 as Dex RowLayout { @@ -16,10 +18,11 @@ RowLayout property var details property color color: !details ? "white" : Style.getCoinColor(details.ticker) property alias bottom_text: bottom_line.text_value + property int activation_progress: Dex.General.zhtlcActivationProgress(details.activation_status, details.ticker) Behavior on color { ColorAnimation { duration: Style.animationDuration } } - DexImage + Dex.Image { id: icon source: General.coinIcon(details.ticker) @@ -30,6 +33,30 @@ RowLayout Layout.topMargin: Layout.leftMargin Layout.bottomMargin: Layout.leftMargin + DexRectangle + { + anchors.centerIn: parent + anchors.fill: parent + radius: 15 + enabled: Dex.General.isZhtlc(details.ticker) ? activation_progress != 100 : false + visible: enabled + opacity: .9 + color: Dex.DexTheme.backgroundColor + } + + DexLabel + { + anchors.centerIn: parent + anchors.fill: parent + enabled: Dex.General.isZhtlc(details.ticker) ? activation_progress != 100 : false + visible: enabled + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: activation_progress + "%" + font: Dex.DexTypo.body2 + color: Dex.DexTheme.greenColor + } + ColumnLayout { anchors.left: parent.right @@ -37,7 +64,7 @@ RowLayout anchors.verticalCenter: parent.verticalCenter width: root.width - 40 - DexText + Dex.Text { Layout.preferredWidth: parent.width - 15 @@ -48,7 +75,7 @@ RowLayout wrapMode: Text.NoWrap } - DexText + Dex.Text { id: bottom_line @@ -58,7 +85,7 @@ RowLayout text: real_value Layout.fillWidth: true elide: Text.ElideRight - color: DexTheme.foregroundColor + color: Dex.CurrentTheme.foregroundColor font: DexTypo.body2 wrapMode: Label.NoWrap ToolTip.text: real_value diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/Main.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/Main.qml index 37cd5249d1..cd2a8cff33 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/Main.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/Main.qml @@ -7,6 +7,7 @@ import Qaterial 1.0 as Qaterial import "../../../Components" import "../../../Constants" import Dex.Themes 1.0 as Dex +import Dex.Components 1.0 as Dex import AtomicDEX.MarketMode 1.0 Widget @@ -17,19 +18,95 @@ Widget margins: 15 collapsable: false + // Market mode selector + RowLayout + { + Layout.topMargin: 5 + Layout.bottomMargin: 2 + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: parent.width + height: 40 + + MarketModeSelector + { + Layout.alignment: Qt.AlignLeft + Layout.preferredWidth: (parent.width / 100) * 46 + Layout.preferredHeight: 40 + marketMode: MarketMode.Buy + ticker: atomic_qt_utilities.retrieve_main_ticker(left_ticker) + } + + Item { Layout.fillWidth: true } + + MarketModeSelector + { + Layout.alignment: Qt.AlignRight + Layout.preferredWidth: (parent.width / 100) * 46 + Layout.preferredHeight: 40 + ticker: atomic_qt_utilities.retrieve_main_ticker(left_ticker) + } + } + + // Protocol text for platform tokens + Item + { + height: 40 + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: parent.width + visible: protocolIcon != "" + + ColumnLayout + { + spacing: 2 + anchors.fill: parent + anchors.centerIn: parent + + Dex.Text + { + id: protocolTitle + Layout.preferredWidth: parent.width + text_value: "Protocol:" + font.pixelSize: Style.textSizeSmall1 + horizontalAlignment: Text.AlignHCenter + color: Style.colorText2 + } + + RowLayout + { + id: protocol + Layout.alignment: Qt.AlignHCenter + + DefaultImage + { + id: protocolImg + source: protocolIcon + Layout.preferredHeight: 16 + Layout.preferredWidth: Layout.preferredHeight + } + + DexLabel + { + id: protocolText + text_value: General.getProtocolText(left_ticker) + wrapMode: DexLabel.NoWrap + font.pixelSize: Style.textSizeSmall1 + color: Style.colorText2 + } + } + } + } // Order selected indicator Item { - Layout.topMargin: 5 Layout.alignment: Qt.AlignHCenter Layout.preferredWidth: parent.width - Layout.preferredHeight: 40 - visible: API.app.trading_pg.preffered_order.price !== undefined + height: 40 RowLayout { id: orderSelection + visible: API.app.trading_pg.preffered_order.price !== undefined anchors.fill: parent anchors.verticalCenter: parent.verticalCenter @@ -62,6 +139,7 @@ Widget Rectangle { + visible: API.app.trading_pg.preffered_order.price !== undefined anchors.fill: parent radius: 8 color: 'transparent' @@ -69,104 +147,51 @@ Widget } } - // Market mode selector - RowLayout + OrderForm { - Layout.topMargin: 5 + id: formBase + width: parent.width + height: 340 Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: parent.width - Layout.fillHeight: true - - MarketModeSelector - { - Layout.alignment: Qt.AlignLeft - Layout.preferredWidth: (parent.width / 100) * 46 - Layout.preferredHeight: 50 - marketMode: MarketMode.Buy - ticker: atomic_qt_utilities.retrieve_main_ticker(left_ticker) - } - - Item { Layout.fillWidth: true } - - MarketModeSelector - { - Layout.alignment: Qt.AlignRight - Layout.preferredWidth: (parent.width / 100) * 46 - Layout.preferredHeight: 50 - ticker: atomic_qt_utilities.retrieve_main_ticker(left_ticker) - } } - HorizontalLine - { - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: parent.width - visible: protocolIcon != "" - color: Dex.CurrentTheme.backgroundColorDeep - } + Item { Layout.fillHeight: true } - ColumnLayout + // Error messages + Item { - spacing: 3 - Layout.alignment: Qt.AlignHCenter + height: 60 Layout.preferredWidth: parent.width - visible: protocolIcon != "" - DexLabel + // Show errors + Dex.Text { - id: protocolTitle - Layout.preferredWidth: parent.width - text_value: "Protocol:" - font.pixelSize: Style.textSizeSmall1 + id: errors + visible: errors.text_value !== "" + anchors.fill: parent + anchors.centerIn: parent horizontalAlignment: Text.AlignHCenter - color: Style.colorText2 - } - - RowLayout - { - id: protocol - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: parent.width - - Item { Layout.fillWidth: true } - - DefaultImage - { - id: protocolImg - source: protocolIcon - Layout.preferredHeight: 16 - Layout.preferredWidth: Layout.preferredHeight - } - - DexLabel - { - id: protocolText - text_value: General.getProtocolText(left_ticker) - wrapMode: DexLabel.NoWrap - font.pixelSize: Style.textSizeSmall1 - color: Style.colorText2 - } - - Item { Layout.fillWidth: true } + font.pixelSize: Style.textSizeSmall4 + color: Dex.CurrentTheme.noColor + text_value: General.getTradingError( + last_trading_error, + curr_fee_info, + base_ticker, + rel_ticker, left_ticker, right_ticker) + elide: Text.ElideRight } } - OrderForm - { - id: formBase - Layout.preferredWidth: parent.width - Layout.alignment: Qt.AlignHCenter - } - TotalView { + height: 80 Layout.preferredWidth: parent.width Layout.alignment: Qt.AlignHCenter } DexGradientAppButton { - Layout.preferredHeight: 40 + height: 40 Layout.preferredWidth: parent.width - 20 Layout.alignment: Qt.AlignHCenter @@ -176,34 +201,4 @@ Widget enabled: formBase.can_submit_trade onClicked: confirm_trade_modal.open() } - - ColumnLayout - { - spacing: parent.spacing - visible: errors.text_value !== "" - Layout.preferredWidth: parent.width - - HorizontalLine - { - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: parent.width - } - - // Show errors - DefaultText - { - id: errors - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: parent.width - horizontalAlignment: Text.AlignHCenter - font.pixelSize: Style.textSizeSmall4 - color: Dex.CurrentTheme.noColor - text_value: General.getTradingError( - last_trading_error, - curr_fee_info, - base_ticker, - rel_ticker, left_ticker, right_ticker) - elide: Text.ElideRight - } - } } diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/MarketModeSelector.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/MarketModeSelector.qml index bae4940e62..6eb535000b 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/MarketModeSelector.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/MarketModeSelector.qml @@ -58,7 +58,11 @@ Rectangle { anchors.centerIn: parent color: API.app.trading_pg.market_mode == marketMode ? Dex.CurrentTheme.gradientButtonTextEnabledColor : Dex.CurrentTheme.foregroundColor - text: (marketMode == Dex.MarketMode.Sell ? qsTr("Sell") : qsTr("Buy")) + ` ${ticker}` + text: + { + if (marketMode == Dex.MarketMode.Sell) qsTr("Sell %1", "TICKER").arg(ticker) + else qsTr("Buy %1", "TICKER").arg(ticker) + } } DefaultMouseArea diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml index 6f6f6fcd4a..bf74c7183d 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml @@ -12,6 +12,7 @@ import Dex.Themes 1.0 as Dex ColumnLayout { id: root + spacing: 8 function focusVolumeField() { @@ -19,6 +20,8 @@ ColumnLayout } readonly property string total_amount: API.app.trading_pg.total_amount + readonly property int input_height: 70 + readonly property int subfield_margin: 5 readonly property bool can_submit_trade: last_trading_error === TradingError.None @@ -56,7 +59,7 @@ ColumnLayout Item { Layout.preferredWidth: parent.width - Layout.preferredHeight: input_price.height + price_usd_value.height + price_usd_value.anchors.topMargin + Layout.preferredHeight: input_height AmountField { @@ -65,35 +68,54 @@ ColumnLayout left_text: qsTr("Price") right_text: right_ticker enabled: !(API.app.trading_pg.preffered_order.price !== undefined) - text: backend_price + color: enabled ? Dex.CurrentTheme.foregroundColor : Dex.CurrentTheme.foregroundColor2 + text: backend_price ? backend_price : General.formatDouble(API.app.trading_pg.cex_price) width: parent.width height: 41 radius: 18 onTextChanged: setPrice(text) + Component.onCompleted: text = General.formatDouble(API.app.trading_pg.cex_price) ? General.formatDouble(API.app.trading_pg.cex_price) : 1 } - DefaultText + OrderFormSubfield { id: price_usd_value - anchors.right: input_price.right anchors.top: input_price.bottom - anchors.topMargin: 7 - - text_value: General.getFiatText(non_null_price, right_ticker) - font.pixelSize: input_price.font.pixelSize - color: Dex.CurrentTheme.foregroundColor2 - - CexInfoTrigger {} + anchors.left: input_price.left + anchors.topMargin: subfield_margin + visible: !API.app.trading_pg.invalid_cex_price + left_btn.onClicked: + { + let price = General.formatDouble(parseFloat(input_price.text) - (General.formatDouble(API.app.trading_pg.cex_price)*0.01)) + if (price < 0) price = 0 + setPrice(String(price)) + } + right_btn.onClicked: + { + let price = General.formatDouble(parseFloat(input_price.text) + (General.formatDouble(API.app.trading_pg.cex_price)*0.01)) + setPrice(String(price)) + } + middle_btn.onClicked: + { + if (input_price.text == "0") setPrice("1") + let price = General.formatDouble(API.app.trading_pg.cex_price) + setPrice(String(price)) + } + fiat_value: General.getFiatText(non_null_price, right_ticker) + left_label: "-1%" + middle_label: "0%" + right_label: "+1%" + left_tooltip_text: qsTr("Reduce 1% relative to CEX market price.") + middle_tooltip_text: qsTr("Use CEX market price.") + right_tooltip_text: qsTr("Increase 1% relative to CEX market price.") } } - Item { Layout.preferredWidth: parent.width - Layout.topMargin: 10 - Layout.preferredHeight: input_volume.height + inputVolumePrice.height + inputVolumePrice.anchors.topMargin + Layout.preferredHeight: input_height AmountField { @@ -108,93 +130,108 @@ ColumnLayout onTextChanged: setVolume(text) } - DefaultText + OrderFormSubfield { - id: inputVolumePrice - anchors.right: input_volume.right + id: volume_usd_value anchors.top: input_volume.bottom - anchors.topMargin: price_usd_value.anchors.topMargin - - text_value: General.getFiatText(non_null_volume, left_ticker) - font.pixelSize: input_volume.font.pixelSize - color: Dex.CurrentTheme.foregroundColor2 - - CexInfoTrigger {} + anchors.left: input_volume.left + anchors.topMargin: subfield_margin + left_btn.onClicked: + { + let volume = General.formatDouble(API.app.trading_pg.max_volume * 0.25) + setVolume(String(volume)) + } + middle_btn.onClicked: + { + let volume = General.formatDouble(API.app.trading_pg.max_volume * 0.5) + setVolume(String(volume)) + } + right_btn.onClicked: + { + let volume = General.formatDouble(API.app.trading_pg.max_volume) + setVolume(String(volume)) + } + fiat_value: General.getFiatText(non_null_volume, left_ticker) + left_label: "25%" + middle_label: "50%" + right_label: qsTr("Max") + left_tooltip_text: qsTr("Swap 25% of your tradable balance.") + middle_tooltip_text: qsTr("Swap 50% of your tradable balance.") + right_tooltip_text: qsTr("Swap 100% of your tradable balance.") } } Item { + visible: _useCustomMinTradeAmountCheckbox.checked Layout.preferredWidth: parent.width - Layout.preferredHeight: minVolLabel.height - Layout.topMargin: 6 + Layout.preferredHeight: input_height - DefaultText + AmountField { - id: minVolLabel - anchors.horizontalCenter: parent.horizontalCenter - font.pixelSize: 13 - text: qsTr("Min volume: ") + API.app.trading_pg.min_trade_vol + id: input_minvolume + width: parent.width + height: 41 + radius: 18 + left_text: qsTr("Min Volume") + right_text: left_ticker + placeholderText: sell_mode ? qsTr("Min amount to sell") : qsTr("Min amount to receive") + text: API.app.trading_pg.min_trade_vol + onTextChanged: if (API.app.trading_pg.min_trade_vol != text) setMinimumAmount(text) } - DefaultText + OrderFormSubfield { - anchors.left: minVolLabel.right - anchors.leftMargin: 8 - anchors.verticalCenter: minVolLabel.verticalCenter - - text: General.cex_icon - color: Dex.CurrentTheme.foregroundColor3 - - DefaultMouseArea + id: minvolume_usd_value + anchors.top: input_minvolume.bottom + anchors.left: input_minvolume.left + anchors.topMargin: subfield_margin + left_btn.onClicked: { - anchors.fill: parent - onClicked: _sliderHelpModal.open() + let volume = input_volume.text * 0.10 + setMinimumAmount(General.formatDouble(volume)) } - - ModalLoader + middle_btn.onClicked: { - id: _sliderHelpModal - sourceComponent: HelpModal - { - title: qsTr("How to use the pro-view slider ?") - helpSentence: qsTr("This slider is used to setup the order requirements you need.\nLeft slider: Sets the minimum amount required to process a trade.\nRight slider: Sets the volume you want to trade.") - } + let volume = input_volume.text * 0.25 + setMinimumAmount(General.formatDouble(volume)) } + right_btn.onClicked: + { + let volume = input_volume.text * 0.50 + setMinimumAmount(General.formatDouble(volume)) + } + fiat_value: General.getFiatText(API.app.trading_pg.min_trade_vol, left_ticker) + left_label: "10%" + middle_label: "25%" + right_label: "50%" + left_tooltip_text: qsTr("Minimum accepted trade equals 10% of order volume.") + middle_tooltip_text: qsTr("Minimum accepted trade equals 25% of order volume.") + right_tooltip_text: qsTr("Minimum accepted trade equals 50% of order volume.") } } - DefaultRangeSlider + Item { - id: _volumeRange - - function getRealValue() { return first.position * (first.to - first.from); } - function getRealValue2() { return second.position * (second.to - second.from); } - - enabled: input_volume.enabled && !(!sell_mode && General.isZero(non_null_price)) && to > 0 - - Layout.alignment: Qt.AlignHCenter Layout.preferredWidth: parent.width + Layout.preferredHeight: 30 + visible: !_useCustomMinTradeAmountCheckbox.checked - from: API.app.trading_pg.orderbook.current_min_taker_vol - to: Math.max(0, parseFloat(max_volume)) - - first.value: parseFloat(API.app.trading_pg.min_trade_vol) - - firstDisabled: !_useCustomMinTradeAmountCheckbox.checked - - second.value: parseFloat(non_null_volume) - - first.onValueChanged: if (first.pressed) setMinimumAmount(General.formatDouble(first.value)) - second.onValueChanged: if (second.pressed) setVolume(General.formatDouble(second.value)) + DefaultText + { + id: minVolLabel + anchors.horizontalCenter: parent.horizontalCenter + font.pixelSize: 13 + text: qsTr("Min volume: ") + API.app.trading_pg.min_trade_vol + } } RowLayout { - Layout.topMargin: 15 Layout.rightMargin: 2 Layout.leftMargin: 2 - Layout.fillWidth: true + Layout.preferredWidth: parent.width + Layout.preferredHeight: 30 spacing: 5 DefaultCheckBox @@ -203,9 +240,11 @@ ColumnLayout boxWidth: 20 boxHeight: 20 labelWidth: 0 + onToggled: setMinimumAmount(0) } - DefaultText { + DefaultText + { Layout.fillWidth: true height: _useCustomMinTradeAmountCheckbox.height horizontalAlignment: Text.AlignLeft @@ -216,4 +255,4 @@ ColumnLayout font.pixelSize: 13 } } -} +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderFormSubfield.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderFormSubfield.qml new file mode 100644 index 0000000000..1370518b6a --- /dev/null +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/OrderFormSubfield.qml @@ -0,0 +1,224 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtGraphicalEffects 1.0 + +import "../../../Constants" as Dex +import "../../../Components" +import App 1.0 +import Dex.Themes 1.0 as Dex + +// todo: coding style is wrong, use camelCase. +RowLayout +{ + id: control + property alias fiat_value: _fiat_label.text_value + property alias left_label: _left_label.text + property alias middle_label: _middle_label.text + property alias right_label: _right_label.text + property string left_tooltip_text: "" + property string middle_tooltip_text: "" + property string right_tooltip_text: "" + property alias left_btn: _left_btn + property alias middle_btn: _middle_btn + property alias right_btn: _right_btn + property int pixel_size: 12 + property int btn_width: 33 + spacing: 2 + height: 20 + width: parent.width + + Item + { + width: btn_width + height: parent.height + + // Background when market mode is different + DefaultRectangle + { + anchors.centerIn: parent + width: parent.width + height: parent.height + color: Dex.CurrentTheme.tradeMarketModeSelectorNotSelectedBackgroundColor + } + + DefaultText + { + id: _left_label + anchors.centerIn: parent + font.pixelSize: pixel_size + color: Dex.CurrentTheme.foregroundColor2 + text: "-1%" + } + + DexTooltip + { + id: _left_tooltip + visible: _left_btn.containsMouse && left_tooltip_text != "" + + contentItem: FloatingBackground + { + anchors.top: parent.bottom + anchors.topMargin: 30 + color: Dex.CurrentTheme.accentColor + + DefaultText + { + text: left_tooltip_text + font: Dex.DexTypo.caption + leftPadding: 10 + rightPadding: 10 + topPadding: 6 + bottomPadding: 6 + } + } + + background: Rectangle { + width: 0 + height: 0 + color: "transparent" + } + } + + DefaultMouseArea + { + id: _left_btn + anchors.fill: parent + hoverEnabled: true + } + } + + Item + { + + width: btn_width + height: parent.height + + // Background when market mode is different + DefaultRectangle + { + anchors.centerIn: parent + width: parent.width + height: parent.height + color: Dex.CurrentTheme.tradeMarketModeSelectorNotSelectedBackgroundColor + + DefaultMouseArea + { + id: _middle_btn + anchors.fill: parent + hoverEnabled: true + } + + DefaultText + { + id: _middle_label + anchors.centerIn: parent + font.pixelSize: pixel_size + color: Dex.CurrentTheme.foregroundColor2 + text: "0%" + } + + DexTooltip + { + id: _middle_tooltip + visible: _middle_btn.containsMouse && middle_tooltip_text != "" + + contentItem: FloatingBackground + { + anchors.top: parent.bottom + anchors.topMargin: 30 + color: Dex.CurrentTheme.accentColor + + DefaultText + { + text: middle_tooltip_text + font: Dex.DexTypo.caption + leftPadding: 10 + rightPadding: 10 + topPadding: 6 + bottomPadding: 6 + } + } + + background: Rectangle { + width: 0 + height: 0 + color: "transparent" + } + } + } + } + + Item + { + + width: btn_width + height: parent.height + + // Background when market mode is different + DefaultRectangle + { + id: right_rect + anchors.centerIn: parent + width: parent.width + height: parent.height + color: Dex.CurrentTheme.tradeMarketModeSelectorNotSelectedBackgroundColor + } + + DefaultText + { + id: _right_label + anchors.centerIn: parent + font.pixelSize: pixel_size + color: Dex.CurrentTheme.foregroundColor2 + text: "+1%" + } + + DexTooltip + { + id: _right_tooltip + visible: _right_btn.containsMouse && right_tooltip_text != "" + + + contentItem: FloatingBackground + { + anchors.top: parent.bottom + anchors.topMargin: 30 + color: Dex.CurrentTheme.accentColor + + DefaultText + { + text: right_tooltip_text + font: Dex.DexTypo.caption + leftPadding: 10 + rightPadding: 10 + topPadding: 6 + bottomPadding: 6 + } + } + + background: Rectangle { + width: 0 + height: 0 + color: "transparent" + } + } + + DefaultMouseArea + { + id: _right_btn + anchors.fill: parent + hoverEnabled: true + } + } + + Item { Layout.fillWidth: true } + + DefaultText + { + id: _fiat_label + font.pixelSize: pixel_size + color: Dex.CurrentTheme.foregroundColor2 + DefaultInfoTrigger { triggerModal: cex_info_modal } + } +} \ No newline at end of file diff --git a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/TotalView.qml b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/TotalView.qml index 5c03c8df73..588c1a054b 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/TotalView.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/PlaceOrderForm/TotalView.qml @@ -12,7 +12,7 @@ import Dex.Themes 1.0 as Dex ColumnLayout { - spacing: 5 + spacing: 3 RowLayout { @@ -28,7 +28,7 @@ ColumnLayout font.pixelSize: 14 font.weight: Font.Normal opacity: .6 - CexInfoTrigger {} + DefaultInfoTrigger { triggerModal: cex_info_modal } } DefaultText diff --git a/atomic_defi_design/Dex/Exchange/ProView/SearchableTickerSelector.qml b/atomic_defi_design/Dex/Exchange/ProView/SearchableTickerSelector.qml index 0ce9b4ec88..de90ed3f2d 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/SearchableTickerSelector.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/SearchableTickerSelector.qml @@ -12,16 +12,15 @@ import "../../Constants" as Dex Dex.ComboBoxWithSearchBar { id: control + property var currentItem: model.index(currentIndex, 0) property bool left_side: false - property var ticker_list property string ticker - property bool index_changed: false + property bool index_changed: false height: 60 enabled: !block_everything - model: control.ticker_list textRole: "ticker" valueRole: "ticker" @@ -29,13 +28,11 @@ Dex.ComboBoxWithSearchBar popupForceMaxHeight: true searchBar.visible: true - searchBar.searchModel: control.ticker_list + searchBar.searchModel: model delegate: ItemDelegate { id: _delegate - z: 5 - visible: model.ticker !== "All" width: control.width height: visible ? 60 : 0 highlighted: control.highlightedIndex === index @@ -66,14 +63,15 @@ Dex.ComboBoxWithSearchBar details: { const idx = currentIndex - if(idx === -1) return prev_details + if (idx === -1) return prev_details const new_details = { update_count: _contentRow.update_count, ticker: model.data(model.index(idx, 0), 257), name: model.data(model.index(idx, 0), 259), balance: model.data(model.index(idx, 0), 260), - main_currency_balance: model.data(model.index(idx, 0), 261) + main_currency_balance: model.data(model.index(idx, 0), 261), + activation_status: model.data(model.index(idx, 0), 266) } prev_details = new_details @@ -83,26 +81,25 @@ Dex.ComboBoxWithSearchBar Component.onDestruction: portfolio_mdl.portfolioItemDataChanged.disconnect(forceUpdateDetails) } - onCurrentIndexChanged: { - control.index_changed = true - } + onCurrentIndexChanged: control.index_changed = true onCurrentValueChanged: { - if(control.index_changed) { + if (control.index_changed) + { control.index_changed = false - if(currentValue !== undefined) + if (currentValue !== undefined) setPair(left_side, currentValue) } - else { - if(currentText.indexOf(ticker) === -1) { + else + { + if (currentText.indexOf(ticker) === -1) + { const target_index = indexOfValue(ticker) - if(currentIndex !== target_index) + if (currentIndex !== target_index) currentIndex = target_index } } } - searchBar.onVisibleChanged: if (!visible) { searchBar.textField.text = ""; } - searchBar.textField.onTextChanged: { - control.ticker_list.setFilterFixedString(searchBar.textField.text) - } + searchBar.onVisibleChanged: if (!visible) { searchBar.textField.text = "" } + searchBar.textField.onTextChanged: control.model.setFilterFixedString(searchBar.textField.text) } diff --git a/atomic_defi_design/Dex/Exchange/ProView/SweetDexComboBox.qml b/atomic_defi_design/Dex/Exchange/ProView/SweetDexComboBox.qml deleted file mode 100644 index 4ee25501e9..0000000000 --- a/atomic_defi_design/Dex/Exchange/ProView/SweetDexComboBox.qml +++ /dev/null @@ -1,217 +0,0 @@ -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 "../../Components" -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 - - height: 80 - - - // Combobox Dropdown Button Background - background: DexRectangle - { - id: bg_rect - color: comboBoxBackgroundColor - radius: 20 - } - - contentItem: DexComboBoxLine - { - id: line - - property int update_count: 0 - property var prev_details - - padding: 10 - - function forceUpdateDetails() - { - console.log("Portfolio item data changed, force-updating the selected ticker details!") - ++update_count - } - - details: - { - const idx = combo.currentIndex - - if(idx === -1) return prev_details - - // Update count triggers the change for auto-update - const new_details = - { - update_count: line.update_count, - ticker: model.data(model.index(idx, 0), 257), - name: model.data(model.index(idx, 0), 259), - balance: model.data(model.index(idx, 0), 260), - main_currency_balance: model.data(model.index(idx, 0), 261) - } - - prev_details = new_details - - return new_details - } - - Component.onCompleted: portfolio_mdl.portfolioItemDataChanged.connect(forceUpdateDetails) - Component.onDestruction: portfolio_mdl.portfolioItemDataChanged.disconnect(forceUpdateDetails) - } - - // Each dropdown item - delegate: ItemDelegate - { - id: combo_item - width: control.width - highlighted: control.highlightedIndex === index - - contentItem: DexComboBoxLine { details: model } - z: 5 - - // Dropdown Item background - background: DexRectangle { - anchors.fill: combo_item - color: combo_item.highlighted ? highlightedBackgroundColor : mainBackgroundColor - } - } - - indicator: Column - { - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: 8 - spacing: -12 - - Qaterial.Icon - { - width: 30 - height: 30 - color: Dex.CurrentTheme.comboBoxArrowsColor - 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 - - z: 4 - y: control.height - 1 - topMargin: 40 - bottomMargin: 10 - rightMargin: 5 - padding: 1 - - contentItem: ColumnLayout - { - anchors.rightMargin: 5 - - // Search input - DexTextField - { - id: input_coin_filter - placeholderText: qsTr("Search") - - font.pixelSize: 16 - Layout.fillWidth: true - Layout.leftMargin: 5 - Layout.rightMargin: 5 - Layout.preferredHeight: 40 - Layout.topMargin: Layout.leftMargin - - // Search Field Background - background: DexRectangle - { - color: control.comboBoxBackgroundColor - anchors.fill: parent - radius: control.radius - } - - onTextChanged: - { - ticker_list.setFilterFixedString(text) - renewIndex() - } - - function reset() - { - text = "" - renewIndex() - } - - Keys.onDownPressed: control.incrementCurrentIndex() - Keys.onUpPressed: control.decrementCurrentIndex() - Keys.onPressed: - { - if (event.key === Qt.Key_Return) - { - if (control.count > 0) control.currentIndex = 0; - popup.close(); - event.accepted = true; - } - } - - Connections - { - target: popup - function onOpened() - { - input_coin_filter.reset(); - input_coin_filter.forceActiveFocus(); - } - function onClosed() { input_coin_filter.reset() } - } - } - - Item - { - Layout.maximumHeight: popup.max_height - 100 - Layout.fillWidth: true - implicitHeight: popup_list_view.contentHeight + 5 - - DexListView - { - id: popup_list_view - // Scrollbar appears if this extra space is not added - model: control.popup.visible ? control.delegateModel : null - currentIndex: control.highlightedIndex - anchors.fill: parent - - DexMouseArea - { - anchors.fill: parent - acceptedButtons: Qt.NoButton - } - } - } - } - - // Popup Background - background: DexRectangle - { - width: parent.width - height: parent.height - radius: control.radius - color: control.popupBackgroundColor - colorAnimation: false - border.width: 1 - } - } -} diff --git a/atomic_defi_design/Dex/Exchange/ProView/TickerSelector.qml b/atomic_defi_design/Dex/Exchange/ProView/TickerSelector.qml deleted file mode 100644 index 4978fa75ee..0000000000 --- a/atomic_defi_design/Dex/Exchange/ProView/TickerSelector.qml +++ /dev/null @@ -1,53 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import QtQuick.Controls 2.15 -import QtGraphicalEffects 1.0 - -import "../../Components" -import "../../Constants" - -SweetDexComboBox -{ - id: combo - - function renewIndex() - { - combo.currentIndex = combo.indexOfValue(ticker) - } - - property bool left_side: false - property var ticker_list - property string ticker - - // Indicates user input, when list changes, index stays the same so we know it's not user input - property bool index_changed: false - - enabled: !block_everything - - model: ticker_list - valueRole: "ticker" - - onTickerChanged: renewIndex() - Component.onCompleted: renewIndex() - - onCurrentIndexChanged: combo.index_changed = true - onCurrentValueChanged: - { - // User input - if(combo.index_changed) { - combo.index_changed = false - // Set the ticker - if(currentValue !== undefined) - setPair(left_side, currentValue) - } - // List change - else { - // Correct the index - if(currentText.indexOf(ticker) === -1) { - const target_index = indexOfValue(ticker) - if(currentIndex !== target_index) - currentIndex = target_index - } - } - } -} diff --git a/atomic_defi_design/Dex/Exchange/ProView/TickerSelectors.qml b/atomic_defi_design/Dex/Exchange/ProView/TickerSelectors.qml index 765730f839..86df283110 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TickerSelectors.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TickerSelectors.qml @@ -14,8 +14,8 @@ Row { selectorLeft.currentIndex = selectorLeft.indexOfValue(selectorLeft.ticker) selectorRight.currentIndex = selectorRight.indexOfValue(selectorRight.ticker) - selectorLeft.searchBar.textField.text = ""; - selectorRight.searchBar.textField.text = ""; + selectorLeft.searchBar.textField.text = "" + selectorRight.searchBar.textField.text = "" } SearchableTickerSelector @@ -26,11 +26,16 @@ Row height: parent.height left_side: true - ticker_list: API.app.trading_pg.market_pairs_mdl.left_selection_box + model: API.app.trading_pg.market_pairs_mdl.left_selection_box ticker: left_ticker onTickerChanged: renewIndex() Component.onCompleted: renewIndex() - Component.onDestruction: searchBar.textField.text = ""; + Component.onDestruction: searchBar.textField.text = "" + onVisibleChanged: + { + renewIndex() + model.with_balance = false + } } SwapIcon @@ -62,10 +67,15 @@ Row height: parent.height left_side: false - ticker_list: API.app.trading_pg.market_pairs_mdl.right_selection_box + model: API.app.trading_pg.market_pairs_mdl.right_selection_box ticker: right_ticker onTickerChanged: renewIndex() Component.onCompleted: renewIndex() - Component.onDestruction: searchBar.textField.text = ""; + Component.onDestruction: searchBar.textField.text = "" + onVisibleChanged: + { + renewIndex() + model.with_balance = false + } } } diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml index 4dadd1fe8d..fc880aa0ea 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrderLine.qml @@ -5,6 +5,8 @@ import Qaterial 1.0 as Qaterial import QtGraphicalEffects 1.0 +import bignumberjs 1.0 + import App 1.0 import "../../../Components" @@ -52,7 +54,7 @@ FloatingBackground id: statusText anchors.centerIn: parent - visible: clickable ? ! details ? false : (details.is_swap || !details.is_maker) : false + visible: clickable ? !details ? false : (details.is_swap || !details.is_maker) : false font.pixelSize: getStatusFontSize(details.order_status) color: !details ? Dex.CurrentTheme.foregroundColor : getStatusColor(details.order_status) text_value: !details ? "" : visible ? getStatusStep(details.order_status) : '' @@ -91,7 +93,13 @@ FloatingBackground anchors.verticalCenter: parent.verticalCenter font.pixelSize: 12 - text: !details ? "" : details.base_amount + text: + { + if (!details) return + + BigNumber.config({ DECIMAL_PLACES: 6 }) + return new BigNumber(details.base_amount).toString(10) + } privacy: is_placed_order elide: Text.ElideRight maximumLineCount: 1 @@ -127,7 +135,14 @@ FloatingBackground anchors.verticalCenter: parent.verticalCenter font.pixelSize: 12 - text: !details ? "" : details.rel_amount + text: + { + if (!details) return + + BigNumber.config({ DECIMAL_PLACES: 6 }) + return new BigNumber(details.rel_amount).toString(10) + } + privacy: is_placed_order elide: Text.ElideRight maximumLineCount: 1 diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml index da30d26932..5ff799eda8 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/OrdersPage.qml @@ -7,6 +7,7 @@ import Qaterial 1.0 as Qaterial import App 1.0 import "../../../Components" +import "../../../Constants" import "../../.." import Dex.Themes 1.0 as Dex @@ -92,10 +93,9 @@ Item { spacing: 10 DefaultButton { - Layout.preferredWidth: 86 Layout.preferredHeight: 29 radius: 7 - label.font.pixelSize: 14 + label.font: DexTypo.body2 text: qsTr("Filter") iconSource: Qaterial.Icons.filter onClicked: settings.visible = !settings.visible @@ -104,10 +104,9 @@ Item { DefaultButton { visible: root.is_history - Layout.preferredWidth: 86 Layout.preferredHeight: 29 radius: 7 - label.font.pixelSize: 14 + label.font: DexTypo.body2 text: qsTr("Export CSV") onClicked: { @@ -119,6 +118,7 @@ Item { DefaultText { color: Dex.CurrentTheme.foregroundColor2 + font: DexTypo.caption visible: !settings.visible text: qsTr("Filter") + ": %1 / %2
%3: %4 - %5".arg(combo_base.currentTicker).arg(combo_rel.currentTicker).arg(qsTr("Date")).arg(min_date.selectedDate.toLocaleDateString(Locale.ShortFormat, "yyyy-MM-dd")).arg(max_date.selectedDate.toLocaleDateString(Locale.ShortFormat, "yyyy-MM-dd")) } @@ -137,10 +137,9 @@ Item { { visible: root.is_history enabled: list_model_proxy.can_i_apply_filtering - Layout.preferredWidth: 86 Layout.preferredHeight: 29 radius: 7 - label.font.pixelSize: 14 + label.font: DexTypo.body2 text: qsTr("Apply Filter") onClicked: list_model_proxy.apply_all_filtering() } @@ -149,10 +148,9 @@ Item { { visible: !root.is_history enabled: API.app.orders_mdl.length > 0 - Layout.preferredWidth: 86 Layout.preferredHeight: 29 radius: 7 - label.font.pixelSize: 14 + label.font: DexTypo.body2 text: qsTr("Cancel All") iconSource: Qaterial.Icons.close onClicked: API.app.trading_pg.orders.cancel_order(list_model_proxy.get_filtered_ids()) diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/PriceLine.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/PriceLine.qml index 9ebe7892b8..63cbdaf723 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/PriceLine.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/PriceLine.qml @@ -121,8 +121,7 @@ ColumnLayout Layout.alignment: Qt.AlignHCenter text_value: General.cex_icon + " " + qsTr("CEXchange rate") font.pixelSize: fontSize - - CexInfoTrigger {} + DefaultInfoTrigger { triggerModal: cex_info_modal } } // Price reversed diff --git a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/SwapProgress.qml b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/SwapProgress.qml index 68b534cf99..ad019be3da 100644 --- a/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/SwapProgress.qml +++ b/atomic_defi_design/Dex/Exchange/ProView/TradingInfo/SwapProgress.qml @@ -6,6 +6,7 @@ import Dex.Themes 1.0 as Dex import App 1.0 import "../../../Components" +import "../../../Constants" // Content ColumnLayout @@ -15,8 +16,9 @@ ColumnLayout property var details property var lastEvent - readonly property - var all_events: !details ? [] : has_error_event ? details.events.map(e => e.state) : details.success_events + readonly property var all_events: !details + ? [] : has_error_event + ? details.events.map(e => e.state) : details.success_events // Is there error in swap json? readonly property bool has_error_event: diff --git a/atomic_defi_design/Dex/Exchange/Trade/BestOrder/List.qml b/atomic_defi_design/Dex/Exchange/Trade/BestOrder/List.qml index f6870c6335..695385521e 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/BestOrder/List.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/BestOrder/List.qml @@ -18,13 +18,36 @@ Widget margins: 20 spacing: 20 - Header {} + Header + { + visible: !warning_text.visible + } + + Item + { + id: warning_text + visible: API.app.trading_pg.volume == 0 + Layout.preferredWidth: parent.width + Layout.preferredHeight: parent.height + + DefaultText + { + text_value: qsTr("Enter volume to see best orders.") + anchors.fill: parent + anchors.centerIn: parent + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + font.pixelSize: Style.textSizeSmall4 + color: Dex.CurrentTheme.foregroundColor2 + } + } Dex.ListView { id: _listView Layout.fillWidth: true Layout.fillHeight: true + visible: !warning_text.visible spacing: 6 model: API.app.trading_pg.orderbook.best_orders.proxy_mdl diff --git a/atomic_defi_design/Dex/Exchange/Trade/BestOrder/ListDelegate.qml b/atomic_defi_design/Dex/Exchange/Trade/BestOrder/ListDelegate.qml index 5834c977af..08cccfba5a 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/BestOrder/ListDelegate.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/BestOrder/ListDelegate.qml @@ -170,7 +170,7 @@ Item placeOrderForm.visible = General.flipFalse(placeOrderForm.visible) if (API.app.trading_pg.market_mode == MarketMode.Buy) { - app.pairChanged(rel_ticker, coin) + app.pairChanged(coin, rel_ticker) } else { diff --git a/atomic_defi_design/Dex/Exchange/Trade/ConfirmTradeModal.qml b/atomic_defi_design/Dex/Exchange/Trade/ConfirmTradeModal.qml index 937940c3ee..1bc9e6e007 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/ConfirmTradeModal.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/ConfirmTradeModal.qml @@ -11,22 +11,23 @@ import "Orders/" import App 1.0 import Dex.Themes 1.0 as Dex + MultipageModal { id: root readonly property var fees: API.app.trading_pg.fees - + width: 720 horizontalPadding: 30 - verticalPadding: 40 + verticalPadding: 30 MultipageModalContent { titleText: qsTr("Confirm Exchange Details") title.font.pixelSize: Style.textSize2 titleAlignment: Qt.AlignHCenter - titleTopMargin: 10 - topMarginAfterTitle: 0 - flickMax: window.height - 450 + titleTopMargin: 0 + topMarginAfterTitle: 10 + flickMax: window.height - 480 header: [ RowLayout @@ -71,6 +72,39 @@ MultipageModal Layout.fillWidth: true Layout.alignment: Qt.AlignHCenter + // Large margin Warning + FloatingBackground + { + Layout.alignment: Qt.AlignCenter + width: 425 + height: 30 + color: Style.colorRed2 + visible: Math.abs(parseFloat(API.app.trading_pg.cex_price_diff)) >= 50 + + RowLayout + { + Layout.fillWidth: true + + Item { width: 3 } + + DefaultCheckBox + { + id: allow_bad_trade + Layout.alignment: Qt.AlignCenter + textColor: Style.colorWhite0 + visible: Math.abs(parseFloat(API.app.trading_pg.cex_price_diff)) >= 50 + spacing: 2 + boxWidth: 20 + boxHeight: 20 + labelWidth: 400 + label.wrapMode: Label.NoWrap + text: qsTr("Trade price is more than 50% different to CEX! Confirm?") + } + + Item { width: 3 } + } + } + DefaultText { Layout.alignment: Qt.AlignHCenter @@ -247,7 +281,7 @@ MultipageModal text_value: "✅ " + ( config_section.is_dpow_configurable ? '' - + qsTr("dPoW protected") + General.cex_icon + '' + + qsTr("dPoW protected ") + General.cex_icon + '' : qsTr("%1 confirmations for incoming %2 transactions") .arg(config_section.default_config.required_confirmations || 1).arg(rel_ticker) ) @@ -291,7 +325,7 @@ MultipageModal DefaultSlider { id: required_confirmation_count - height: 30 + height: 24 Layout.alignment: Qt.AlignCenter @@ -310,8 +344,8 @@ MultipageModal FloatingBackground { Layout.alignment: Qt.AlignCenter - width: 360 - height: 30 + width: dpow_off_warning.implicitWidth + 30 + height: dpow_off_warning.implicitHeight + 10 color: Style.colorRed2 visible: { enable_custom_config.checked && (config_section.is_dpow_configurable && !enable_dpow_confs.checked) @@ -321,6 +355,7 @@ MultipageModal { id: dpow_off_warning anchors.fill: parent + font: DexTypo.body2 color: Style.colorWhite0 horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter @@ -368,7 +403,7 @@ MultipageModal leftPadding: 45 rightPadding: 45 radius: 10 - enabled: !buy_sell_rpc_busy && last_trading_error === TradingError.None + enabled: General.is_swap_safe(allow_bad_trade) onClicked: { trade({ enable_custom_config: enable_custom_config.checked, diff --git a/atomic_defi_design/Dex/Exchange/Trade/OrderBook/Vertical.qml b/atomic_defi_design/Dex/Exchange/Trade/OrderBook/Vertical.qml index 2ccc364e2a..9c5e4c9d74 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/OrderBook/Vertical.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/OrderBook/Vertical.qml @@ -49,4 +49,4 @@ Widget Layout.fillHeight: true Layout.fillWidth: true } -} \ No newline at end of file +} diff --git a/atomic_defi_design/Dex/Exchange/Trade/PriceLineSimplified.qml b/atomic_defi_design/Dex/Exchange/Trade/PriceLineSimplified.qml index 978ffe7533..a9c257204d 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/PriceLineSimplified.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/PriceLineSimplified.qml @@ -72,8 +72,7 @@ ColumnLayout horizontalAlignment: Text.AlignRight text_value: General.cex_icon + " " + qsTr("CEXchange rate") font.pixelSize: fontSize - - CexInfoTrigger {} + DefaultInfoTrigger { triggerModal: cex_info_modal } } // Price reversed diff --git a/atomic_defi_design/Dex/Exchange/Trade/ProView.qml b/atomic_defi_design/Dex/Exchange/Trade/ProView.qml index 0d61f90c02..82261e5005 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/ProView.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/ProView.qml @@ -132,27 +132,35 @@ RowLayout id: tradingInfo Layout.fillWidth: true - Layout.minimumHeight: isCollapsed() ? 60 : 610 - Layout.fillHeight: !isCollapsed() + Layout.fillHeight: true + + resizable: false } } - ColumnLayout + WidgetContainer { + property real _orderBookHeightRatio: 0.65 + property real _bestOrdersHeightRatio: 0.35 + Layout.minimumWidth: orderBook.visible || bestOrders.visible ? 353 : -1 Layout.fillWidth: true Layout.fillHeight: true Layout.alignment: Qt.AlignTop + spacing: 4 + + onHeightChanged: + { + orderBook.height = getHeight(_orderBookHeightRatio); + bestOrders.height = getHeight(_bestOrdersHeightRatio); + } OrderBook.Vertical { id: orderBook - Layout.fillWidth: true - - Layout.minimumHeight: isCollapsed() ? 70 : 365 - Layout.maximumHeight: bestOrders.visible && !bestOrders.isCollapsed() ? 536 : -1 - Layout.fillHeight: !isCollapsed() + width: parent.width + minHeight: 320 } // Best Orders @@ -160,10 +168,8 @@ RowLayout { id: bestOrders - Layout.fillWidth: true - - Layout.minimumHeight: isCollapsed() ? 70 : 196 - Layout.fillHeight: !isCollapsed() + width: parent.width + minHeight: 140 } } @@ -175,9 +181,9 @@ RowLayout Layout.minimumWidth: visible ? 302 : -1 Layout.maximumWidth: 350 Layout.fillWidth: true - - Layout.minimumHeight: 571 Layout.fillHeight: true + + resizable: false } ModalLoader diff --git a/atomic_defi_design/Dex/Exchange/Trade/Trading/Items/FeeInfo.qml b/atomic_defi_design/Dex/Exchange/Trade/Trading/Items/FeeInfo.qml index 0f34b35cfb..f8ce4d8bc7 100644 --- a/atomic_defi_design/Dex/Exchange/Trade/Trading/Items/FeeInfo.qml +++ b/atomic_defi_design/Dex/Exchange/Trade/Trading/Items/FeeInfo.qml @@ -40,7 +40,7 @@ Column font.pixelSize: Style.textSizeSmall1 width: parent.width wrapMode: Text.Wrap - CexInfoTrigger {} + DefaultInfoTrigger { triggerModal: cex_info_modal } } } diff --git a/atomic_defi_design/Dex/NewUpdateModal.qml b/atomic_defi_design/Dex/NewUpdateModal.qml index c479b78ed1..4f9d7e3907 100644 --- a/atomic_defi_design/Dex/NewUpdateModal.qml +++ b/atomic_defi_design/Dex/NewUpdateModal.qml @@ -69,7 +69,7 @@ Dex.MultipageModal Dex.DefaultText { - text: qsTr("Could not check new updates because of the following reason: \n%1").arg(Dex.API.app.updateCheckerService.updateInfo.status) + text: qsTr("Could not check new updates for the following reason: \n%1").arg(Dex.API.app.updateCheckerService.updateInfo.status) } footer: @@ -157,7 +157,7 @@ Dex.MultipageModal } else { - console.error(Dex.API.app.updateCheckerService.udpateInfo.status) + console.error(Dex.API.app.updateCheckerService.updateInfo.status) } } } diff --git a/atomic_defi_design/Dex/Portfolio/AssetsList.qml b/atomic_defi_design/Dex/Portfolio/AssetsList.qml index 7617e18cac..ded8fd3eda 100644 --- a/atomic_defi_design/Dex/Portfolio/AssetsList.qml +++ b/atomic_defi_design/Dex/Portfolio/AssetsList.qml @@ -97,6 +97,7 @@ Dex.DexListView delegate: Rectangle { property color _idleColor: index % 2 === 1 ? Dex.CurrentTheme.backgroundColor : Dex.CurrentTheme.innerBackgroundColor + property int activation_progress: Dex.General.zhtlcActivationProgress(activation_status, ticker) width: list.width height: _assetRowHeight @@ -119,6 +120,30 @@ Dex.DexListView source: Dex.General.coinIcon(ticker) width: 30 height: 30 + + Dex.DexRectangle + { + anchors.centerIn: parent + anchors.fill: parent + radius: 15 + enabled: Dex.General.isZhtlc(ticker) ? activation_progress != 100 : false + visible: enabled + opacity: .9 + color: Dex.DexTheme.backgroundColor + } + + Dex.DexLabel + { + anchors.centerIn: parent + anchors.fill: parent + enabled: Dex.General.isZhtlc(ticker) ? activation_progress != 100 : false + visible: enabled + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: activation_progress + "%" + font: Dex.DexTypo.head8 + color: Dex.DexTheme.greenColor + } } Dex.DexLabel @@ -155,7 +180,6 @@ Dex.DexListView color: Dex.DexTheme.redColor } } - } Dex.DexLabel // Balance Column. @@ -167,9 +191,19 @@ Dex.DexListView verticalAlignment: Text.AlignVCenter font: Dex.DexTypo.body2 - text_value: parseFloat(balance).toFixed(8) + text_value: + { + if (Dex.General.isZhtlc(ticker)) + { + if (activation_progress != 100) + { + return qsTr("Activating: ") + activation_progress + "%" + } + } + return parseFloat(balance).toFixed(8) + } - color: Qt.darker(Dex.DexTheme.foregroundColor, 0.8) + color: text_value == parseFloat(balance).toFixed(8) ? Qt.darker(Dex.DexTheme.foregroundColor, 0.8) : Dex.DexTheme.redColor privacy: true } @@ -270,7 +304,10 @@ Dex.DexListView if (!can_change_ticker) return if (mouse.button === Qt.RightButton) + { + contextMenu.can_disable = Dex.General.canDisable(ticker) contextMenu.popup() + } else { api_wallet_page.ticker = ticker @@ -280,10 +317,10 @@ Dex.DexListView onPressAndHold: { - if (!can_change_ticker) - return + if (!can_change_ticker) return if (mouse.source === Qt.MouseEventNotSynthesized) + contextMenu.can_disable = Dex.General.canDisable(ticker) contextMenu.popup() } } diff --git a/atomic_defi_design/Dex/Portfolio/Portfolio.qml b/atomic_defi_design/Dex/Portfolio/Portfolio.qml index f947d84570..de0ea3394b 100644 --- a/atomic_defi_design/Dex/Portfolio/Portfolio.qml +++ b/atomic_defi_design/Dex/Portfolio/Portfolio.qml @@ -143,11 +143,11 @@ Item { DexGradientAppButton { - width: 150 height: 40 iconSource: Qaterial.Icons.plus radius: 15 - padding: 5 + padding: 25 + font: DexTypo.body2 text: qsTr("ADD ASSET") onClicked: enable_coin_modal.open() } diff --git a/atomic_defi_design/Dex/Screens/Dashboard.qml b/atomic_defi_design/Dex/Screens/Dashboard.qml index f19241b433..bc64287689 100644 --- a/atomic_defi_design/Dex/Screens/Dashboard.qml +++ b/atomic_defi_design/Dex/Screens/Dashboard.qml @@ -148,16 +148,6 @@ Item Addressbook.Main { } } - Component - { - id: settings - - Settings - { - Layout.alignment: Qt.AlignCenter - } - } - WebEngineView { id: webEngineView @@ -187,6 +177,78 @@ Item running: !loader.visible } } + + // Status bar + DefaultRectangle + { + id: status_bar + visible: API.app.zcash_params.is_downloading() + width: parent.width + height: 24 + anchors.bottom: parent.bottom + color: 'transparent' + + DefaultRectangle + { + color: Dex.CurrentTheme.accentColor + width: 380 + height: parent.height + anchors.right: parent.right + radius: 0 + + DefaultProgressBar + { + id: download_progress + anchors.fill: parent + anchors.centerIn: parent + width: parent.width - 10 + height: parent.height + bar_width_pct: 0 + label.text: "Zcash params downloading:" + label.font.family: 'Montserrat' + label.font.pixelSize: 11 + label_width: 180 + pct_value.text: "0.00 %" + pct_value.font.family: 'lato' + pct_value.font.pixelSize: 11 + } + + DexMouseArea + { + id: download_mouse_area + anchors.fill: parent + hoverEnabled: true + onClicked: zcash_params_modal.open() + } + } + Connections + { + target: API.app.zcash_params + function onCombinedDownloadStatusChanged() + { + const filesizes = General.zcash_params_filesize + let combined_sum = Object.values(filesizes).reduce((total, v) => total + v, 0); + + let donwloaded_sum = 0 + let data = JSON.parse(API.app.zcash_params.get_combined_download_progress()) + for (let k in data) { + let v = data[k]; + donwloaded_sum += v * filesizes[k] + } + + let pct = General.formatDouble(donwloaded_sum / combined_sum * 100, 2) + if (pct == 100) + { + API.app.enable_coins(API.app.zcash_params.get_enable_after_download()) + status_bar.visible = false + API.app.zcash_params.clear_enable_after_download() + } + else status_bar.visible = true + download_progress.bar_width_pct = pct + download_progress.pct_value.text = pct + "%" + } + } + } } // Sidebar, left side @@ -210,9 +272,16 @@ Item // CEX Rates info ModalLoader { - id: cex_rates_modal + id: cex_info_modal sourceComponent: CexInfoModal {} } + + ModalLoader + { + id: gas_info_modal + sourceComponent: GasInfoModal {} + } + ModalLoader { id: min_trade_modal @@ -225,35 +294,66 @@ Item sourceComponent: RestartModal {} } - function getStatusColor(status) + // Download Zcash Params + property alias zcash_params: zcash_params_modal.item + ModalLoader + { + id: zcash_params_modal + sourceComponent: ZcashParamsModal + { + } + } + + function onEnablingZCoinStatus(coin, msg, human_date, timestamp) + { + // Ignore if coin already enabled (e.g. parent chain in batch) + console.log(msg) + if (msg.search("ZCashParamsNotFound") > -1) + { + console.log(coin) + API.app.zcash_params.enable_after_download(coin) + zcash_params_modal.open() + } + } + + Component.onCompleted: + { + API.app.notification_mgr.enablingZCoinStatus.connect(onEnablingZCoinStatus) + } + Component.onDestruction: + { + API.app.notification_mgr.enablingZCoinStatus.disconnect(onEnablingZCoinStatus) + } + + function isSwapDone(status) { switch (status) { case "matching": - return Style.colorYellow case "matched": case "ongoing": - case "refunding": - return Style.colorOrange + return false case "successful": - return Dex.CurrentTheme.sidebarLineTextHovered + case "refunding": case "failed": default: - return DexTheme.redColor + return true } } - function isSwapDone(status) + function getStatusColor(status) { switch (status) { case "matching": + return Style.colorYellow case "matched": case "ongoing": - return false - case "successful": case "refunding": + return Style.colorOrange + case "successful": + return Dex.CurrentTheme.sidebarLineTextHovered case "failed": default: - return true + return DexTheme.redColor } } @@ -280,18 +380,15 @@ Item function getStatusFontSize(status) { switch (status) { - case "matching": - return 9 - case "matched": - return 9 - case "ongoing": - return 9 case "successful": return 16 case "refunding": return 16 case "failed": return 12 + case "matching": + case "matched": + case "ongoing": default: return 9 } diff --git a/atomic_defi_design/Dex/Screens/Startup/ImportWallet.qml b/atomic_defi_design/Dex/Screens/Startup/ImportWallet.qml index c30161277b..acb83d2be4 100644 --- a/atomic_defi_design/Dex/Screens/Startup/ImportWallet.qml +++ b/atomic_defi_design/Dex/Screens/Startup/ImportWallet.qml @@ -182,6 +182,7 @@ SetupPage { id: _seedField Layout.fillWidth: true + max_length: General.max_pw_length Layout.preferredHeight: 50 leftIcon: Qaterial.Icons.fileKey field.font: DexTypo.body2 @@ -236,7 +237,7 @@ SetupPage standardButtons: Dialog.Yes | Dialog.Cancel, validator: (text) => { - if (text.toLowerCase() === qsTr("i understand")) + if ([qsTr("i understand"), qsTr("я согласен"), qsTr("je comprends"), qsTr("entiendo"), qsTr("anladım"), qsTr("ich verstehe"), ].includes(text.toLowerCase())) { allow_custom_seed.checked = true; } @@ -244,7 +245,7 @@ SetupPage { allow_custom_seed.checked = false; } - return text.toLowerCase() === qsTr("i understand") + return [qsTr("i understand"), qsTr("я согласен"), qsTr("je comprends"), qsTr("entiendo"), qsTr("anladım"), qsTr("ich verstehe"), ].includes(text.toLowerCase()) }, yesButtonText: qsTr("Ok") }) diff --git a/atomic_defi_design/Dex/Screens/Startup/Login.qml b/atomic_defi_design/Dex/Screens/Startup/Login.qml index 1f716a1c7d..299c505ea2 100644 --- a/atomic_defi_design/Dex/Screens/Startup/Login.qml +++ b/atomic_defi_design/Dex/Screens/Startup/Login.qml @@ -64,6 +64,7 @@ SetupPage { id: _inputPassword Layout.alignment: Qt.AlignHCenter + max_length: General.max_pw_length height: 50 width: 300 background.color: Dex.CurrentTheme.floatingBackgroundColor @@ -113,6 +114,7 @@ SetupPage { Layout.alignment: Qt.AlignHCenter id: _keyChecker + max_pw_len: General.max_pw_length field: _inputPassword.field visible: false } diff --git a/atomic_defi_design/Dex/Screens/Startup/NewWallet.qml b/atomic_defi_design/Dex/Screens/Startup/NewWallet.qml index dbc85f892d..2a2f30e59a 100644 --- a/atomic_defi_design/Dex/Screens/Startup/NewWallet.qml +++ b/atomic_defi_design/Dex/Screens/Startup/NewWallet.qml @@ -8,6 +8,7 @@ import "../../Components" import "../../Constants" import App 1.0 import Dex.Themes 1.0 as Dex +import Dex.Components 1.0 as Dex SetupPage { @@ -158,7 +159,7 @@ SetupPage image_scale: 0.7 - content: DexRectangle + content: Dex.Rectangle { color: Dex.CurrentTheme.floatingBackgroundColor width: column_layout.width + 50 @@ -210,6 +211,7 @@ SetupPage } mmo.model = getRandomWords(4) } + ColumnLayout { id: column_layout @@ -249,7 +251,7 @@ SetupPage } } - DexLabel + Dex.Text { font: DexTypo.head6 text_value: if (currentStep === 0) @@ -274,8 +276,6 @@ SetupPage Layout.fillWidth: true } - - ModalLoader { id: eula_modal @@ -293,6 +293,7 @@ SetupPage ColumnLayout { visible: currentStep === 0 + enabled: visible Layout.preferredWidth: 450 spacing: Style.rowSpacing @@ -311,7 +312,7 @@ SetupPage field.onTextChanged: text_error = General.validateWallet(input_wallet_name.field.text) field.forceFocus: true - DexRectangle + Dex.Rectangle { x: 5 height: 40 @@ -367,6 +368,7 @@ SetupPage } } } + TextField { id: input_generated_seed @@ -497,11 +499,11 @@ SetupPage } } - // Second page, write the seed word ColumnLayout { visible: currentStep === 1 + enabled: visible DefaultRectangle { @@ -673,6 +675,8 @@ SetupPage ColumnLayout { visible: currentStep === 2 + enabled: visible + Layout.preferredWidth: 450 spacing: Style.rowSpacing diff --git a/atomic_defi_design/Dex/Screens/Startup/WalletsView.qml b/atomic_defi_design/Dex/Screens/Startup/WalletsView.qml index 2663b405ca..6d21be4af2 100644 --- a/atomic_defi_design/Dex/Screens/Startup/WalletsView.qml +++ b/atomic_defi_design/Dex/Screens/Startup/WalletsView.qml @@ -257,6 +257,7 @@ SetupPage title: qsTr("Wallet status"), text: "%1 ".arg(wallet_name) + qsTr("wallet deleted successfully"), yesButtonText: qsTr("Ok"), titleBold: true, + showCancelBtn: false, standardButtons: Dialog.Ok }) wallets = API.app.wallet_mgr.get_wallets() @@ -269,6 +270,7 @@ SetupPage text: "%1 ".arg(wallet_name) + qsTr("wallet password is incorrect"), warning: true, standardButtons: Dialog.Ok, titleBold: true, + showCancelBtn: false, yesButtonText: qsTr("Ok"), }) } diff --git a/atomic_defi_design/Dex/Settings/Languages.qml b/atomic_defi_design/Dex/Settings/Languages.qml index 99ccfac6e3..d90a521f49 100644 --- a/atomic_defi_design/Dex/Settings/Languages.qml +++ b/atomic_defi_design/Dex/Settings/Languages.qml @@ -5,6 +5,7 @@ import QtQuick.Controls 2.15 import QtGraphicalEffects 1.0 import "../Components" import "../Constants" +import "../Screens" import App 1.0 @@ -49,6 +50,9 @@ Grid { API.app.settings_pg.lang = model.modelData; console.info("Switched language to %1".arg(API.app.settings_pg.lang)); + menu_list.update() + app.update() + app.pageLoader.item.switchPage(Dashboard.PageType.Portfolio) } } } diff --git a/atomic_defi_design/Dex/Settings/RecoverSeedModal.qml b/atomic_defi_design/Dex/Settings/RecoverSeedModal.qml index 288de4af12..dfa997fa03 100644 --- a/atomic_defi_design/Dex/Settings/RecoverSeedModal.qml +++ b/atomic_defi_design/Dex/Settings/RecoverSeedModal.qml @@ -16,34 +16,36 @@ MultipageModal property var portfolio_model: API.app.portfolio_pg.portfolio_mdl property var settings_page: API.app.settings_pg - property bool wrongPassword: false + property bool _isPasswordWrong: false function tryViewKeysAndSeed() { if (!submitButton.enabled) return - const result = API.app.settings_pg.retrieve_seed(API.app.wallet_mgr.wallet_default_name, inputPassword.field.text) + const result = API.app.settings_pg.retrieve_seed(API.app.wallet_mgr.wallet_default_name, _inputPassword.field.text) if (result.length === 2) { seedLabel.text = result[0] rpcPwLabel.text = result[1] - wrongPassword = false + _isPasswordWrong = false root.nextPage() loading.running = true } else { - wrongPassword = true + _inputPassword.error = true; + _isPasswordWrong = true; + return false; } } - width: 820 + width: 900 onClosed: { - wrongPassword = false - inputPassword.reset() + _isPasswordWrong = false + _inputPassword.reset() seedLabel.text = "" rpcPwLabel.text = "" portfolio_model.clean_priv_keys() @@ -61,15 +63,26 @@ MultipageModal DexAppPasswordField { - id: inputPassword - Layout.fillWidth: true + id: _inputPassword forceFocus: true + Layout.fillWidth: true + Layout.margins: 20 + Layout.alignment: Qt.AlignHCenter field.onAccepted: tryViewKeysAndSeed() - background.color: Dex.CurrentTheme.floatingBackgroundColor leftIconColor: Dex.CurrentTheme.foregroundColor + field.onTextChanged: { _isPasswordWrong = false } + background.color: Dex.CurrentTheme.accentColor hideFieldButton.icon.color: Dex.CurrentTheme.foregroundColor } + DexLabel + { + Layout.alignment: Qt.AlignHCenter + height: 14 + text: _isPasswordWrong ? qsTr("Incorrect Password") : "" + color: Dex.CurrentTheme.noColor + } + // Footer RowLayout { @@ -86,7 +99,7 @@ MultipageModal { id: submitButton Layout.preferredWidth: parent.width / 100 * 48 - enabled: inputPassword.field.length > 0 + enabled: _inputPassword.field.length > 0 text: qsTr("View") onClicked: tryViewKeysAndSeed() } @@ -96,6 +109,8 @@ MultipageModal MultipageModalContent { titleText: qsTr("View seed and private keys") + titleTopMargin: 15 + topMarginAfterTitle: 15 Timer { @@ -124,23 +139,22 @@ MultipageModal id: seedContainer visible: false enabled: false - spacing: 10 + spacing: 5 + width: parent.width + height: 150 // Logo - ColumnLayout + DefaultImage { - DefaultImage - { - source: Dex.CurrentTheme.bigLogoPath - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: 144 - Layout.preferredHeight: 144 - } + source: Dex.CurrentTheme.bigLogoPath + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: 144 + Layout.preferredHeight: 144 } ColumnLayout { - spacing: 10 + spacing: 5 // Seed RowLayout @@ -149,11 +163,11 @@ MultipageModal Qaterial.RawMaterialButton { - backgroundImplicitWidth: 40 + backgroundImplicitWidth: 30 backgroundImplicitHeight: 30 backgroundColor: "transparent" icon.source: Qaterial.Icons.qrcodeScan - icon.color: Dex.CurrentTheme.foregroundColor + icon.color: Dex.CurrentTheme.foregroundColor2 onClicked: { qrcodeModal.qrcodeSvg = API.qt_utilities.get_qrcode_svg_from_string(seedLabel.text) @@ -163,11 +177,11 @@ MultipageModal Qaterial.RawMaterialButton { - backgroundImplicitWidth: 40 + backgroundImplicitWidth: 30 backgroundImplicitHeight: 30 backgroundColor: "transparent" icon.source: Qaterial.Icons.contentCopy - icon.color: Dex.CurrentTheme.foregroundColor + icon.color: Dex.CurrentTheme.foregroundColor2 onClicked: { API.qt_utilities.copy_text_to_clipboard(seedLabel.text) @@ -177,8 +191,21 @@ MultipageModal ColumnLayout { - DefaultText { text: qsTr("Backup Seed"); font.pixelSize: Style.textSizeSmall2 } - DefaultText { id: seedLabel; Layout.fillWidth: true; font.pixelSize: Style.textSizeSmall1; maximumLineCount: 4; wrapMode: Text.Wrap } + DefaultText + { + text: qsTr("Backup Seed") + font.pixelSize: Style.textSizeSmall2 + color: Dex.CurrentTheme.foregroundColor2 + } + + DefaultText + { + id: seedLabel + Layout.fillWidth: true + font.pixelSize: Style.textSizeSmall2 + maximumLineCount: 4 + wrapMode: Text.Wrap + } } } @@ -189,11 +216,11 @@ MultipageModal Qaterial.RawMaterialButton { - backgroundImplicitWidth: 40 + backgroundImplicitWidth: 30 backgroundImplicitHeight: 30 backgroundColor: "transparent" icon.source: Qaterial.Icons.qrcodeScan - icon.color: Dex.CurrentTheme.foregroundColor + icon.color: Dex.CurrentTheme.foregroundColor2 onClicked: { qrcodeModal.qrcodeSvg = API.qt_utilities.get_qrcode_svg_from_string(rpcPwLabel.text) @@ -203,11 +230,11 @@ MultipageModal Qaterial.RawMaterialButton { - backgroundImplicitWidth: 40 + backgroundImplicitWidth: 30 backgroundImplicitHeight: 30 backgroundColor: "transparent" icon.source: Qaterial.Icons.contentCopy - icon.color: Dex.CurrentTheme.foregroundColor + icon.color: Dex.CurrentTheme.foregroundColor2 onClicked: { API.qt_utilities.copy_text_to_clipboard(rpcPwLabel.text) @@ -217,20 +244,33 @@ MultipageModal ColumnLayout { - DefaultText { text: qsTr("RPC Password"); font.pixelSize: Style.textSizeSmall2 } - DefaultText { id: rpcPwLabel; Layout.fillWidth: true; font.pixelSize: Style.textSizeSmall1; maximumLineCount: 4; wrapMode: Text.WrapAnywhere } + DefaultText + { + text: qsTr("RPC Password") + font.pixelSize: Style.textSizeSmall2 + color: Dex.CurrentTheme.foregroundColor2 + } + DefaultText + { + id: rpcPwLabel + Layout.fillWidth: true + font.pixelSize: Style.textSizeSmall2 + maximumLineCount: 4 + wrapMode: Text.WrapAnywhere + } } } } } - HorizontalLine { Layout.topMargin: 10; Layout.fillWidth: true } + HorizontalLine { Layout.fillWidth: true } DefaultTextField { visible: coinsList.visible enabled: coinsList.enabled - Layout.topMargin: 10 + Layout.topMargin: 5 + Layout.bottomMargin: 5 Layout.preferredWidth: parent.width / 3 placeholderText: qsTr("Search a coin.") onTextChanged: portfolio_model.portfolio_proxy_mdl.setFilterFixedString(text) @@ -242,7 +282,6 @@ MultipageModal id: coinsList visible: false enabled: false - Layout.topMargin: 10 Layout.preferredWidth: parent.width Layout.preferredHeight: 300 Layout.alignment: Qt.AlignHCenter @@ -261,32 +300,36 @@ MultipageModal RowLayout { + spacing: 5 Layout.fillWidth: true Layout.leftMargin: 5 ColumnLayout { + spacing: 5 Layout.fillWidth: true DefaultImage { source: General.coinIcon(model.ticker) - Layout.preferredWidth: 30 - Layout.preferredHeight: 30 + Layout.preferredWidth: 40 + Layout.preferredHeight: 40 Layout.alignment: Qt.AlignCenter } DefaultText { text: model.name - font.pixelSize: Style.textSizeSmall5 + font.pixelSize: Style.textSizeSmall4 + color: Dex.CurrentTheme.foregroundColor2 horizontalAlignment: Text.AlignHCenter - Layout.preferredWidth: 100 + Layout.preferredWidth: 90 } } ColumnLayout { + spacing: 5 // Public Address RowLayout { @@ -296,7 +339,7 @@ MultipageModal backgroundImplicitHeight: 30 backgroundColor: "transparent" icon.source: Qaterial.Icons.qrcodeScan - icon.color: Dex.CurrentTheme.foregroundColor + icon.color: Dex.CurrentTheme.foregroundColor2 onClicked: { qrcodeModal.qrcodeSvg = API.qt_utilities.get_qrcode_svg_from_string(publicAddress.text) @@ -310,7 +353,7 @@ MultipageModal backgroundImplicitHeight: 30 backgroundColor: "transparent" icon.source: Qaterial.Icons.contentCopy - icon.color: Dex.CurrentTheme.foregroundColor + icon.color: Dex.CurrentTheme.foregroundColor2 onClicked: { API.qt_utilities.copy_text_to_clipboard(publicAddress.text) @@ -320,20 +363,20 @@ MultipageModal ColumnLayout { + spacing: 5 Layout.fillWidth: true - DefaultText { text: qsTr("Public Address") font.pixelSize: Style.textSizeSmall2 + color: Dex.CurrentTheme.foregroundColor2 } DefaultText { id: publicAddress text: model.public_address - font.pixelSize: Style.textSizeSmall1 - maximumLineCount: 4; wrapMode: Text.WrapAnywhere + font: model.public_address.length > 70 ? DexTypo.body4 : DexTypo.body3 } } } @@ -341,13 +384,14 @@ MultipageModal // Private Key RowLayout { + spacing: 5 Qaterial.RawMaterialButton { backgroundImplicitWidth: 40 backgroundImplicitHeight: 30 backgroundColor: "transparent" icon.source: Qaterial.Icons.qrcodeScan - icon.color: Dex.CurrentTheme.foregroundColor + icon.color: Dex.CurrentTheme.foregroundColor2 onClicked: { qrcodeModal.qrcodeSvg = API.qt_utilities.get_qrcode_svg_from_string(privateKey.text) @@ -361,30 +405,38 @@ MultipageModal backgroundImplicitHeight: 30 backgroundColor: "transparent" icon.source: Qaterial.Icons.contentCopy - icon.color: Dex.CurrentTheme.foregroundColor + icon.color: Dex.CurrentTheme.foregroundColor2 onClicked: { - API.qt_utilities.copy_text_to_clipboard(privateKey.text) + API.qt_utilities.copy_text_to_clipboard(model.priv_key) app.notifyCopy(model.name, qsTr("Private Key copied to clipboard")) } } ColumnLayout { + spacing: 5 Layout.fillWidth: true DefaultText { text: qsTr("Private Key") font.pixelSize: Style.textSizeSmall2 + color: Dex.CurrentTheme.foregroundColor2 } DefaultText { id: privateKey + font: DexTypo.body3 + text: textMetrics.elidedText + } + TextMetrics { + id: textMetrics + elide: Text.ElideMiddle + font.family: DexTypo.fontFamily + elideWidth: 560 text: model.priv_key - font.pixelSize: Style.textSizeSmall1 - maximumLineCount: 4; wrapMode: Text.WrapAnywhere } } } diff --git a/atomic_defi_design/Dex/Settings/SettingModal.qml b/atomic_defi_design/Dex/Settings/SettingModal.qml index dad8a8ce29..b278a3ff74 100644 --- a/atomic_defi_design/Dex/Settings/SettingModal.qml +++ b/atomic_defi_design/Dex/Settings/SettingModal.qml @@ -8,6 +8,7 @@ import QtQuick.Window 2.12 import QtQuick.Controls.Universal 2.12 import Qaterial 1.0 as Qaterial +import ModelHelper 0.1 import "../Components" import "../Constants" @@ -23,6 +24,7 @@ Qaterial.Dialog property var recommended_fiats: API.app.settings_pg.get_recommended_fiats() property var fiats: API.app.settings_pg.get_available_fiats() property var enableable_coins_count: enableable_coins_count_combo_box.currentValue + property var orders: API.app.orders_mdl.orders_proxy_mdl.ModelHelper width: 950 height: 650 @@ -35,30 +37,6 @@ Qaterial.Dialog modal: true title: "Settings" - function disconnect() - { - let dialog = app.showDialog( - { - "title": qsTr("Confirm Logout"), - text: qsTr("Are you sure you want to log out?"), - standardButtons: Dialog.Yes | Dialog.Cancel, - warning: true, - yesButtonText: qsTr("Yes"), - cancelButtonText: qsTr("Cancel"), - onAccepted: function(text) - { - app.notifications_list = [] - app.currentWalletName = "" - API.app.disconnect() - onDisconnect() - window.logged = false - dialog.close() - dialog.destroy() - } - }) - - } - header: Item {} @@ -302,7 +280,7 @@ Qaterial.Dialog onClicked: { - dialog = app.showDialog( + reset_dialog = app.showDialog( { title: qsTr("Reset wallet configuration"), text: qsTr("This will restart your wallet with default settings"), @@ -318,7 +296,7 @@ Qaterial.Dialog } } }) - dialog.close() + reset_dialog.close() } } } @@ -503,6 +481,7 @@ Qaterial.Dialog text: qsTr("2FA disabled successfully"), yesButtonText: qsTr("Ok"), titleBold: true, + showCancelBtn: false, standardButtons: Dialog.Ok }) atomic_settings2.setValue("2FA", 0) @@ -517,6 +496,7 @@ Qaterial.Dialog warning: true, standardButtons: Dialog.Ok, titleBold: true, + showCancelBtn: false, yesButtonText: qsTr("Ok"), }) checked = true @@ -692,8 +672,9 @@ Qaterial.Dialog iconSource: Qaterial.Icons.logout onClicked: { - disconnect() setting_modal.close() + if (orders.count != 0) logout_modal.open() + else return_to_login() } } } diff --git a/atomic_defi_design/Dex/Settings/Settings.qml b/atomic_defi_design/Dex/Settings/Settings.qml deleted file mode 100644 index 297ff957e9..0000000000 --- a/atomic_defi_design/Dex/Settings/Settings.qml +++ /dev/null @@ -1,265 +0,0 @@ -// Qt Imports -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import QtQuick.Controls 2.15 -import QtGraphicalEffects 1.0 -import Qt.labs.settings 1.0 - - -// Project Imports -import "../Components" -import "../Constants" -import App 1.0 - -// TODO: confirm deprecated; delete. - -Item { - id: root - function disconnect() { - API.app.disconnect() - onDisconnect() - } - - readonly property string mm2_version: API.app.settings_pg.get_mm2_version() - property var recommended_fiats: API.app.settings_pg.get_recommended_fiats() - property var fiats: API.app.settings_pg.get_available_fiats() - - - - InnerBackground { - id: layout_background - anchors.centerIn: parent - Layout.alignment: Qt.AlignHCenter - - width: 650 - height: 750 - - content: ColumnLayout { - width: layout_background.width - height: layout_background.height - - ComboBoxWithTitle - { - id: combo_fiat - - property bool initialized: false - - title: qsTr("Fiat") - Layout.fillWidth: true - Layout.leftMargin: 30 - Layout.rightMargin: Layout.leftMargin - - model: fiats - - onCurrentIndexChanged: - { - if (initialized) - { - const new_fiat = fiats[currentIndex] - API.app.settings_pg.current_fiat = new_fiat - API.app.settings_pg.current_currency = new_fiat - } - } - Component.onCompleted: - { - currentIndex = model.indexOf(API.app.settings_pg.current_fiat) - initialized = true - } - - RowLayout { - Layout.topMargin: 5 - Layout.fillWidth: true - Layout.leftMargin: 2 - Layout.rightMargin: Layout.leftMargin - - DefaultText { - text: qsTr("Recommended: ") - font.pixelSize: Style.textSizeSmall4 - } - - Grid { - Layout.leftMargin: 30 - Layout.alignment: Qt.AlignVCenter - - clip: true - - columns: 6 - spacing: 25 - - layoutDirection: Qt.LeftToRight - - Repeater { - model: recommended_fiats - - delegate: DefaultText { - text: modelData - color: fiats_mouse_area.containsMouse ? Style.colorText : Style.colorText2 - - DefaultMouseArea { - id: fiats_mouse_area - anchors.fill: parent - hoverEnabled: true - onClicked: { - API.app.settings_pg.current_fiat = modelData - API.app.settings_pg.current_currency = modelData - combo_fiat.currentIndex = combo_fiat.model.indexOf(API.app.settings_pg.current_fiat) - } - } - } - } - } - } - } - - HorizontalLine { - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - Layout.topMargin: 10 - } - - Languages { - Layout.alignment: Qt.AlignHCenter - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - } - - HorizontalLine { - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - Layout.topMargin: 10 - } - - DefaultSwitch { - Layout.alignment: Qt.AlignHCenter - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - text: qsTr("Enable Desktop Notifications") - Component.onCompleted: checked = API.app.settings_pg.notification_enabled - onCheckedChanged: API.app.settings_pg.notification_enabled = checked - } - DefaultSwitch { - property bool firstTime: true - Layout.alignment: Qt.AlignHCenter - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - checked: parseInt(atomic_settings2.value("FontMode")) === 1 - text: qsTr("Use QtTextRendering Or NativeTextRendering") - onCheckedChanged: { - if(checked){ - atomic_settings2.setValue("FontMode", 1) - }else { - atomic_settings2.setValue("FontMode", 0) - } - if(firstTime) { - firstTime = false - }else { - restart_modal.open() - } - - } - } - - DefaultButton { - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - text: qsTr("Open Logs Folder") - onClicked: openLogsFolder() - } - - DefaultButton { - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - text: qsTr("View seed and private keys") - onClicked: view_seed_modal.open() - } - - - - HorizontalLine { - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - } - - DefaultButton { - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - text: qsTr("Disclaimer and ToS") - onClicked: eula_modal.open() - } - - ModalLoader { - id: eula_modal - sourceComponent: EulaModal { - close_only: true - } - } - - HorizontalLine { - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - } - - DefaultButton { - visible: !API.app.is_pin_cfg_enabled() - text: qsTr("Setup Camouflage Password") - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - onClicked: camouflage_password_modal.open() - } - - ModalLoader { - id: camouflage_password_modal - sourceComponent: CamouflagePasswordModal {} - } - - DangerButton { - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - text: qsTr("Reset wallet configuration") - onClicked: { - restart_modal.open() - restart_modal.item.onTimerEnded = () => { API.app.settings_pg.reset_coin_cfg() } - } - } - - DangerButton { - text: qsTr("Delete Wallet") - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - onClicked: delete_wallet_modal.open() - } - - ModalLoader { - id: delete_wallet_modal - sourceComponent: DeleteWalletModal {} - } - - DefaultButton { - Layout.fillWidth: true - Layout.leftMargin: combo_fiat.Layout.leftMargin - Layout.rightMargin: Layout.leftMargin - text: qsTr("Log out") - onClicked: disconnect() - } - } - } - - DefaultText { - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.bottomMargin: 10 - anchors.rightMargin: anchors.bottomMargin - text_value: qsTr("mm2 version") + ": " + mm2_version - font.pixelSize: Style.textSizeSmall - } -} diff --git a/atomic_defi_design/Dex/Settings/SettingsButton.qml b/atomic_defi_design/Dex/Settings/SettingsButton.qml index fda2caea48..8e53b8cb1d 100644 --- a/atomic_defi_design/Dex/Settings/SettingsButton.qml +++ b/atomic_defi_design/Dex/Settings/SettingsButton.qml @@ -20,38 +20,46 @@ RowLayout { Layout.alignment: Qt.AlignVCenter font: DexTypo.subtitle1 - text: control.title // qsTr("Logs") + text: control.title } Item { Layout.fillWidth: true } - DexAppButton - { - visible: control.noBackground - Layout.alignment: Qt.AlignVCenter - text: control.buttonText - color: containsMouse ? DexTheme.buttonColorHovered : 'transparent' - height: 48 - radius: 20 - font: Qt.font({ - pixelSize: 19 , - letterSpacing: 0.15, - family: DexTypo.fontFamily, - underline: true, - weight: Font.Normal - }) - iconSource: Qaterial.Icons.logout - onClicked: control.clicked() - } - DexAppOutlineButton + Item { + width: 120 Layout.alignment: Qt.AlignVCenter - leftPadding: 20 - rightPadding: 20 - radius: 20 - visible: !control.noBackground - text: control.buttonText //qsTr("Open Folder") - onClicked: control.clicked() + Layout.preferredWidth: 200 + + Row + { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + + DexAppButton + { + visible: control.noBackground + text: control.buttonText + color: containsMouse ? DexTheme.buttonColorHovered : 'transparent' + height: 40 + radius: 20 + padding: 20 + font: DexTypo.body1 + iconSource: Qaterial.Icons.logout + onClicked: control.clicked() + } + + DexAppOutlineButton + { + height: 40 + padding: 20 + radius: 20 + font: DexTypo.body1 + visible: !control.noBackground + text: control.buttonText + onClicked: control.clicked() + } + } } } diff --git a/atomic_defi_design/Dex/Sidebar/Bottom.qml b/atomic_defi_design/Dex/Sidebar/Bottom.qml index a20c1d6bbb..18067aba60 100644 --- a/atomic_defi_design/Dex/Sidebar/Bottom.qml +++ b/atomic_defi_design/Dex/Sidebar/Bottom.qml @@ -116,6 +116,7 @@ MouseArea title: qsTr("Privacy status"), text: qsTr("Privacy mode disabled successfully"), yesButtonText: qsTr("Ok"), titleBold: true, + showCancelBtn: false, standardButtons: Dialog.Ok }) } @@ -126,6 +127,7 @@ MouseArea title: qsTr("Wrong password!"), text: "%1 ".arg(wallet_name) + qsTr("wallet password is incorrect"), warning: true, + showCancelBtn: false, standardButtons: Dialog.Ok, titleBold: true, yesButtonText: qsTr("Ok"), }) diff --git a/atomic_defi_design/Dex/Support/SupportModal.qml b/atomic_defi_design/Dex/Support/SupportModal.qml index de230590af..3c197c9b4f 100644 --- a/atomic_defi_design/Dex/Support/SupportModal.qml +++ b/atomic_defi_design/Dex/Support/SupportModal.qml @@ -241,6 +241,7 @@ Network fees can vary greatly depending on your selected trading pair.").arg(API DexAppButton { id: logs_btn + width: 200 text: qsTr("Open Logs Folder") onClicked: openLogsFolder() } diff --git a/atomic_defi_design/Dex/Wallet/AddressList.qml b/atomic_defi_design/Dex/Wallet/AddressList.qml index c8aa9f6692..d272ba604e 100644 --- a/atomic_defi_design/Dex/Wallet/AddressList.qml +++ b/atomic_defi_design/Dex/Wallet/AddressList.qml @@ -31,12 +31,14 @@ ColumnLayout clip: true - delegate: DefaultTextEdit + delegate: TextEditWithCopy { id: address_text text_value: model.modelData privacy: true - font.pixelSize: root.addressFontSize + font_size: 13 + align_left: true + text_box_width: 600 linkURL: root.linkURL onCopyNotificationTitle: root.onCopyNotificationTitle } diff --git a/atomic_defi_design/Dex/Wallet/ClaimFaucetResultModal.qml b/atomic_defi_design/Dex/Wallet/ClaimFaucetResultModal.qml index fd01e04aaf..7e74f78fd2 100644 --- a/atomic_defi_design/Dex/Wallet/ClaimFaucetResultModal.qml +++ b/atomic_defi_design/Dex/Wallet/ClaimFaucetResultModal.qml @@ -20,7 +20,7 @@ MultipageModal { DefaultText { id: message - + width: parent.width text_value: claiming_faucet_rpc_result && claiming_faucet_rpc_result.message ? claiming_faucet_rpc_result.message : "" } diff --git a/atomic_defi_design/Dex/Wallet/ClaimRewardsModal.qml b/atomic_defi_design/Dex/Wallet/ClaimRewardsModal.qml index 6a61033487..4222e0189f 100644 --- a/atomic_defi_design/Dex/Wallet/ClaimRewardsModal.qml +++ b/atomic_defi_design/Dex/Wallet/ClaimRewardsModal.qml @@ -86,9 +86,12 @@ MultipageModal if(root.visible && broadcast_result !== "") { root.currentIndex = 1 postClaim() + root.width = 750 } } + Behavior on width { NumberAnimation { duration: 300 } } + function prepareClaimRewards() { if(!can_claim) return @@ -441,9 +444,9 @@ MultipageModal // Result Page SendResult { + address: current_ticker_infos.address result: prepare_claim_rewards_result tx_hash: broadcast_result - function onClose() { root.close() } } } diff --git a/atomic_defi_design/Dex/Wallet/EnableCoinModal.qml b/atomic_defi_design/Dex/Wallet/EnableCoinModal.qml index 55753e5d8c..332f7049b0 100644 --- a/atomic_defi_design/Dex/Wallet/EnableCoinModal.qml +++ b/atomic_defi_design/Dex/Wallet/EnableCoinModal.qml @@ -266,7 +266,7 @@ MultipageModal DefaultButton { Layout.preferredWidth: 199 - text: qsTr("Close") + text: qsTr("Cancel") radius: 20 onClicked: root.close() }, diff --git a/atomic_defi_design/Dex/Wallet/Main.qml b/atomic_defi_design/Dex/Wallet/Main.qml index 21d8c7bce4..eb6bba59cd 100644 --- a/atomic_defi_design/Dex/Wallet/Main.qml +++ b/atomic_defi_design/Dex/Wallet/Main.qml @@ -20,20 +20,24 @@ Item { id: root property alias send_modal: send_modal - readonly property int layout_margin: 20 - readonly property string headerTitleColor: Style.colorText2 - readonly property string headerTitleFont: Style.textSizeMid1 - readonly property string headerTextColor: Dex.CurrentTheme.foregroundColor - readonly property string headerTextFont: Style.textSize - readonly property string headerSmallTitleFont: Style.textSizeSmall4 - readonly property string headerSmallFont: Style.textSizeSmall2 - readonly property string addressURL: General.getAddressExplorerURL(api_wallet_page.ticker, current_ticker_infos.address) - - function loadingPercentage(remaining) { + + readonly property int layout_margin: 20 + readonly property string headerTitleColor: Style.colorText2 + readonly property string headerTitleFont: Style.textSizeMid1 + readonly property string headerTextColor: Dex.CurrentTheme.foregroundColor + readonly property string headerTextFont: Style.textSize + readonly property string headerSmallTitleFont: Style.textSizeSmall4 + readonly property string headerSmallFont: Style.textSizeSmall2 + readonly property string addressURL: General.getAddressExplorerURL(api_wallet_page.ticker, current_ticker_infos.address) + + function loadingPercentage(remaining) + { return General.formatPercent((100 * (1 - parseFloat(remaining)/parseFloat(current_ticker_infos.current_block))).toFixed(3), false) } readonly property var transactions_mdl: api_wallet_page.transactions_mdl + readonly property var activation_status: current_ticker_infos.activation_status + readonly property var activation_progress: General.isZhtlc(api_wallet_page.ticker) ? General.zhtlcActivationProgress(current_ticker_infos.activation_status, api_wallet_page.ticker) : 100 Layout.fillHeight: true Layout.fillWidth: true @@ -86,6 +90,30 @@ Item Layout.preferredHeight: 60 Layout.preferredWidth: Layout.preferredHeight Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + + DexRectangle + { + anchors.centerIn: parent + anchors.fill: parent + radius: 30 + enabled: activation_progress != 100 + visible: enabled + opacity: .9 + color: DexTheme.backgroundColor + } + + DexLabel + { + anchors.centerIn: parent + anchors.fill: parent + enabled: activation_progress != 100 + visible: enabled + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: activation_progress + "%" + font: DexTypo.head8 + color: DexTheme.greenColor + } } DefaultText @@ -401,8 +429,7 @@ Item // Send Button DefaultButton { - enabled: API.app.wallet_pg.send_available - + enabled: General.canSend(api_wallet_page.ticker, activation_progress) anchors.fill: parent radius: 18 @@ -430,8 +457,10 @@ Item // Send button error icon DefaultAlertIcon { - visible: API.app.wallet_pg.send_availability_state !== "" - tooltipText: API.app.wallet_pg.send_availability_state + visible: activation_progress != 100 || api_wallet_page.send_availability_state !== "" + tooltipText: General.isZhtlc(api_wallet_page.ticker) && activation_progress != 100 + ? api_wallet_page.ticker + qsTr(" Activation: " + activation_progress + "%") + : api_wallet_page.send_availability_state } } @@ -495,26 +524,40 @@ Item sourceComponent: CannotEnableCoinModal { coin_to_enable_ticker: API.app.wallet_pg.ticker_infos.fee_ticker } } - // Receive Button - DefaultButton + Item { Layout.preferredWidth: 180 Layout.preferredHeight: 48 - radius: 18 - label.text: qsTr("Receive") - label.font.pixelSize: 16 - content.anchors.left: content.parent.left - content.anchors.leftMargin: 23 + // Receive Button + DefaultButton + { + // Address wont display until activated + enabled: General.isZhtlcReady(api_wallet_page.ticker, activation_progress) + anchors.fill: parent + radius: 18 + + label.text: qsTr("Receive") + label.font.pixelSize: 16 + content.anchors.left: content.parent.left + content.anchors.leftMargin: enabled ? 23 : 48 - onClicked: receive_modal.open() + onClicked: receive_modal.open() - TransactionArrow + TransactionArrow + { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 19 + amISender: false + } + } + + // Receive button error icon + DefaultAlertIcon { - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: arrow_send.anchors.rightMargin - amISender: false + visible: !General.isZhtlcReady(api_wallet_page.ticker, activation_progress) + tooltipText: api_wallet_page.ticker + qsTr(" Activation: " + activation_progress + "%") } } @@ -533,7 +576,7 @@ Item DefaultButton { - enabled: !API.app.portfolio_pg.global_cfg_mdl.get_coin_info(api_wallet_page.ticker).is_wallet_only + enabled: !General.isWalletOnly(api_wallet_page.ticker) && activation_progress == 100 anchors.fill: parent radius: 18 @@ -569,8 +612,10 @@ Item // Swap button error icon DefaultAlertIcon { - visible: API.app.portfolio_pg.global_cfg_mdl.get_coin_info(api_wallet_page.ticker).is_wallet_only - tooltipText: api_wallet_page.ticker + qsTr(" is wallet only") + visible: General.isWalletOnly(api_wallet_page.ticker) || activation_progress != 100 + tooltipText: General.isWalletOnly(api_wallet_page.ticker) + ? api_wallet_page.ticker + qsTr(" is wallet only") + : api_wallet_page.ticker + qsTr(" Activation: " + activation_progress + "%") } } @@ -611,15 +656,51 @@ Item { Layout.preferredWidth: 180 Layout.preferredHeight: 48 - visible: enabled && current_ticker_infos.is_smartchain_test_coin + visible: current_ticker_infos.is_smartchain_test_coin DefaultButton { - text: qsTr("Faucet") - radius: 18 - font.pixelSize: 16 + enabled: activation_progress == 100 anchors.fill: parent + radius: 18 + label.text: qsTr("Faucet") + label.font.pixelSize: 16 + content.anchors.left: content.parent.left + content.anchors.leftMargin: enabled ? 23 : 48 + content.anchors.rightMargin: 23 + onClicked: api_wallet_page.claim_faucet() + + Row + { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: arrow_send.anchors.rightMargin + + Qaterial.Icon + { + icon: Qaterial.Icons.water + size: 24 + anchors.right: parent.right + anchors.leftMargin: iconSize / 2 + anchors.rightMargin: iconSize / 2 + anchors.verticalCenter: parent.verticalCenter + color: "cyan" + + DefaultTooltip + { + visible: alertArea.containsMouse && tooltipText != "" + text: "" + } + } + } + } + + // Faucet button error icon + DefaultAlertIcon + { + visible: activation_progress != 100 + tooltipText: api_wallet_page.ticker + qsTr(" Activation: " + activation_progress + "%") } } @@ -894,12 +975,10 @@ Item { width: parent.width height: parent.height - model: transactions_mdl.proxy_mdl } ColumnLayout { - visible: current_ticker_infos.tx_state !== "InProgress" && transactions_mdl.length === 0 anchors.fill: parent anchors.centerIn: parent @@ -910,8 +989,16 @@ Item id: fetching_text_row Layout.topMargin: 24 Layout.alignment: Qt.AlignHCenter - text_value: api_wallet_page.tx_fetching_busy ? qsTr("Fetching transactions...") : qsTr('No transactions available') font.pixelSize: Style.textSize + text_value: + { + if (api_wallet_page.tx_fetching_busy) return qsTr("Fetching transactions...") + if (General.isZhtlc(api_wallet_page.ticker)) + { + if (activation_progress != 100) return qsTr("Please wait, %1 is %2").arg(api_wallet_page.ticker).arg(activation_progress) + qsTr("% activated...") + } + return qsTr('No transactions available') + } } DefaultBusyIndicator @@ -931,7 +1018,7 @@ Item Layout.alignment: Qt.AlignHCenter visible: { - if (addressURL) console.log("addressURL: " + addressURL) + if (activation_progress != 100) return false return api_wallet_page.tx_fetching_busy ? false : addressURL == "" ? false : api_wallet_page.tx_fetching_failed } text_value: qsTr("Click to view your address on %1 (%2) block explorer").arg(current_ticker_infos.name).arg(api_wallet_page.ticker) @@ -944,10 +1031,7 @@ Item cursorShape: Qt.PointingHandCursor anchors.fill: parent hoverEnabled: true - onClicked: { - console.log(addressURL) - Qt.openUrlExternally(addressURL) - } + onClicked: Qt.openUrlExternally(addressURL) } } diff --git a/atomic_defi_design/Dex/Wallet/ReceiveModal.qml b/atomic_defi_design/Dex/Wallet/ReceiveModal.qml index 71a1fb38a0..cb91aded2d 100644 --- a/atomic_defi_design/Dex/Wallet/ReceiveModal.qml +++ b/atomic_defi_design/Dex/Wallet/ReceiveModal.qml @@ -12,32 +12,43 @@ MultipageModal function reset() { } - width: 600 + width: 800 MultipageModalContent { - titleText: qsTr("Receive") + titleText: qsTr("Receive %1", "TICKER").arg(api_wallet_page.ticker) + subtitleText: qsTr("Only send %1 to this address", "TICKER").arg(api_wallet_page.ticker) + titleAlignment: Qt.AlignHCenter + subtitleAlignment: Qt.AlignHCenter + topMarginAfterTitle: 15 - TextEditWithTitle + TextEditWithCopy { - title: qsTr("Only send %1 to this address:", "TICKER").arg(api_wallet_page.ticker) - text: current_ticker_infos.address - label.font.pixelSize: 13 - copy: true - privacy: true - onCopyNotificationTitle: qsTr("%1 address".arg(api_wallet_page.ticker)) + text_value: current_ticker_infos.address + font_size: 13 + text_box_width: + { + let char_len = current_ticker_infos.address.length + if (char_len > 70) return 560 + if (char_len > 50) return 450 + if (char_len > 40) return 400 + return 300 + } + onCopyNotificationTitle: qsTr("%1 address", "TICKER").arg(api_wallet_page.ticker) onCopyNotificationMsg: qsTr("copied to clipboard.") + privacy: true } DefaultImage { - Layout.topMargin: 20 + Layout.topMargin: 15 + Layout.bottomMargin: 15 Layout.alignment: Qt.AlignHCenter source: current_ticker_infos.qrcode_address - sourceSize.width: 300 - sourceSize.height: 300 + sourceSize.width: 350 + sourceSize.height: 350 } // Buttons diff --git a/atomic_defi_design/Dex/Wallet/SendModal.qml b/atomic_defi_design/Dex/Wallet/SendModal.qml index 718c59f857..e48aefb716 100644 --- a/atomic_defi_design/Dex/Wallet/SendModal.qml +++ b/atomic_defi_design/Dex/Wallet/SendModal.qml @@ -35,6 +35,7 @@ MultipageModal readonly property bool is_validate_address_busy: api_wallet_page.validate_address_busy readonly property bool is_convert_address_busy: api_wallet_page.convert_address_busy readonly property string address: api_wallet_page.converted_address + readonly property string withdraw_status: api_wallet_page.withdraw_status readonly property bool auth_succeeded: api_wallet_page.auth_succeeded @@ -68,18 +69,9 @@ MultipageModal api_wallet_page.broadcast(send_result.withdraw_answer.tx_hex, false, send_result.withdraw_answer.max, input_amount.text) } - function isSpecialToken() { - if (current_ticker_infos.hasOwnProperty("has_parent_fees_ticker")) - return current_ticker_infos.has_parent_fees_ticker - return false - } - - function isERC20() { - return current_ticker_infos.type === "ERC-20" || current_ticker_infos.type === "BEP-20" || current_ticker_infos.type == "Matic" - } function hasErc20CaseIssue(addr) { - if(!isERC20()) return false + if(!General.isERC20(current_ticker_infos)) return false if(addr.length <= 2) return false addr = addr.substring(2) // Remove 0x @@ -99,11 +91,13 @@ MultipageModal function feeIsHigherThanAmount() { - if(!custom_fees_switch.checked) return false + if (!custom_fees_switch.checked) return false + + if (input_amount.text === "") return false const amount = parseFloat(getCryptoAmount()) - if(isSpecialToken()) { + if (General.isSpecialToken(current_ticker_infos)) { const parent_ticker = General.getFeesTicker(current_ticker_infos) const gas_limit = parseFloat(input_custom_fees_gas.text) const gas_price = parseFloat(input_custom_fees_gas_price.text) @@ -137,8 +131,8 @@ MultipageModal function feesAreFilled() { return (!custom_fees_switch.checked || ( - (!isSpecialToken() && input_custom_fees.acceptableInput) || - (isSpecialToken() && input_custom_fees_gas.acceptableInput && input_custom_fees_gas_price.acceptableInput && + (!General.isSpecialToken(current_ticker_infos) && input_custom_fees.acceptableInput) || + (General.isSpecialToken(current_ticker_infos) && input_custom_fees_gas.acceptableInput && input_custom_fees_gas_price.acceptableInput && parseFloat(input_custom_fees_gas.text) > 0 && parseFloat(input_custom_fees_gas_price.text) > 0) ) ) @@ -154,7 +148,7 @@ MultipageModal input_amount.text = current_ticker_infos.balance } - width: 650 + width: 750 closePolicy: Popup.NoAutoClose @@ -211,7 +205,7 @@ MultipageModal if(root.visible && broadcast_result !== "") { if(broadcast_result.indexOf("error") !== -1) { reset() - showError(qsTr("Failed to Send"), General.prettifyJSON(broadcast_result)) + showError(qsTr("Failed to Broadcast"), General.prettifyJSON(broadcast_result)) } else { root.currentIndex = 2 @@ -268,7 +262,7 @@ MultipageModal { enabled: !root.segwit && !root.is_send_busy - Layout.preferredWidth: 420 + Layout.preferredWidth: 500 Layout.preferredHeight: 44 Layout.alignment: Qt.AlignHCenter @@ -279,11 +273,16 @@ MultipageModal { id: input_address - width: 390 + width: 470 height: 44 placeholderText: qsTr("Address of the recipient") forceFocus: true - onTextChanged: api_wallet_page.validate_address(text) + font: General.isZhtlc(api_wallet_page.ticker) ? DexTypo.body3 : DexTypo.body2 + onTextChanged: + { + text = text.replace(/(\r\n|\n|\r)/gm,"").replace(" ", "") + api_wallet_page.validate_address(text) + } } Rectangle @@ -370,7 +369,7 @@ MultipageModal enabled: !root.is_send_busy Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: 420 + Layout.preferredWidth: 500 Layout.preferredHeight: 44 Layout.topMargin: 32 @@ -563,6 +562,7 @@ MultipageModal ColumnLayout { + visible: General.getCustomFeeType(current_ticker_infos) Layout.preferredWidth: 380 Layout.alignment: Qt.AlignHCenter Layout.topMargin: 32 @@ -571,6 +571,7 @@ MultipageModal DefaultSwitch { id: custom_fees_switch + visible: !General.isZhtlc(api_wallet_page.ticker) enabled: !root.is_send_busy Layout.preferredWidth: 260 onCheckedChanged: input_custom_fees.text = "" @@ -579,15 +580,38 @@ MultipageModal label.wrapMode: Label.NoWrap } - // Custom fees warning - DefaultText + RowLayout { visible: custom_fees_switch.checked - font.pixelSize: 14 - Layout.alignment: Qt.AlignHCenter - horizontalAlignment: DefaultText.AlignHCenter - color: Dex.CurrentTheme.noColor - text_value: qsTr("Only use custom fees if you know what you are doing!") + // Custom fees warning + DefaultText + { + font.pixelSize: 14 + Layout.alignment: Qt.AlignHCenter + horizontalAlignment: DefaultText.AlignHCenter + color: Dex.CurrentTheme.noColor + } + + DefaultText + { + visible: input_custom_fees.visible + font.pixelSize: 14 + Layout.alignment: Qt.AlignHCenter + horizontalAlignment: DefaultText.AlignHCenter + color: Dex.CurrentTheme.noColor + text_value: qsTr("Only use custom fees if you know what you are doing! ") + } + + DefaultText + { + visible: input_custom_fees_gas.visible + font.pixelSize: 14 + Layout.alignment: Qt.AlignHCenter + horizontalAlignment: DefaultText.AlignHCenter + color: Dex.CurrentTheme.noColor + text_value: qsTr("Only use custom fees if you know what you are doing! ") + General.cex_icon + DefaultInfoTrigger { triggerModal: gas_info_modal } + } } } @@ -603,7 +627,7 @@ MultipageModal // Normal coins, Custom fees input AmountField { - visible: !isSpecialToken() && !isParentCoin(api_wallet_page.ticker) + visible: General.getCustomFeeType(current_ticker_infos) == "UTXO" id: input_custom_fees @@ -619,7 +643,8 @@ MultipageModal // Token coins ColumnLayout { - visible: isSpecialToken() + visible: General.getCustomFeeType(current_ticker_infos) == "Gas" + Layout.alignment: Qt.AlignHCenter // Gas input @@ -632,7 +657,7 @@ MultipageModal Layout.preferredWidth: 380 Layout.preferredHeight: 38 - placeholderText: qsTr("Gas Limit") + " [" + General.tokenUnitName(current_ticker_infos.type) + "]" + placeholderText: qsTr("Gas Limit") } // Gas price input @@ -689,6 +714,18 @@ MultipageModal visible: root.is_send_busy } + // Withdraw status + DefaultText + { + Layout.topMargin: 16 + Layout.alignment: Qt.AlignHCenter + horizontalAlignment: DefaultText.AlignHCenter + wrapMode: Label.Wrap + visible: General.isZhtlc(api_wallet_page.ticker) && withdraw_status != "Complete" + color: Dex.CurrentTheme.foregroundColor + text_value: withdraw_status + } + // Footer RowLayout @@ -698,7 +735,7 @@ MultipageModal DefaultButton { - text: qsTr("Close") + text: qsTr("Cancel") Layout.alignment: Qt.AlignLeft Layout.preferredWidth: parent.width / 100 * 48 @@ -722,7 +759,7 @@ MultipageModal text: qsTr("Prepare") onClicked: prepareSendCoin(input_address.text, getCryptoAmount(), custom_fees_switch.checked, input_custom_fees.text, - isSpecialToken(), input_custom_fees_gas.text, input_custom_fees_gas_price.text) + General.isSpecialToken(current_ticker_infos), input_custom_fees_gas.text, input_custom_fees_gas_price.text) } } @@ -747,12 +784,32 @@ MultipageModal MultipageModalContent { titleText: qsTr("Send") + titleAlignment: Qt.AlignHCenter // Address - TextEditWithTitle + TitleText { - title: qsTr("Recipient's address") - text: input_address.text + text: qsTr("Recipient's address") + Layout.fillWidth: true + color: Dex.CurrentTheme.foregroundColor2 + } + + TextEditWithCopy + { + text_value: input_address.text + font_size: 13 + align_left: true + text_box_width: + { + let char_len = current_ticker_infos.address.length + if (char_len > 70) return 560 + if (char_len > 50) return 450 + if (char_len > 40) return 400 + return 300 + } + onCopyNotificationTitle: qsTr("%1 address", "TICKER").arg(api_wallet_page.ticker) + onCopyNotificationMsg: qsTr("copied to clipboard.") + privacy: true } // Amount diff --git a/atomic_defi_design/Dex/Wallet/SendResult.qml b/atomic_defi_design/Dex/Wallet/SendResult.qml index 0c7e070d10..41b06be0cb 100644 --- a/atomic_defi_design/Dex/Wallet/SendResult.qml +++ b/atomic_defi_design/Dex/Wallet/SendResult.qml @@ -5,24 +5,57 @@ import QtQuick.Controls 2.15 import "../Components" import "../Constants" import App 1.0 +import Dex.Themes 1.0 as Dex MultipageModalContent { id: root property var result - property alias address: address.text + property alias address: address.text_value property string custom_amount - property alias tx_hash: tx_hash.text + property alias tx_hash: tx_hash.text_value titleText: qsTr("Transaction Complete!") + // Transaction Hash + TitleText + { + text: qsTr("Transaction Hash") + Layout.fillWidth: true + visible: text !== "" + color: Dex.CurrentTheme.foregroundColor2 + } + + TextEditWithCopy + { + id: tx_hash + font_size: 13 + align_left: true + text_box_width: 560 + onCopyNotificationTitle: qsTr("%1 txid", "TICKER").arg(api_wallet_page.ticker) + onCopyNotificationMsg: qsTr("copied to clipboard.") + privacy: true + } + // Address - TextEditWithTitle + TitleText { - id: address - title: qsTr("Recipient's address") + text: qsTr("Recipient's address") + Layout.fillWidth: true visible: text !== "" + color: Dex.CurrentTheme.foregroundColor2 + } + + TextEditWithCopy + { + id: address + font_size: 13 + align_left: true + text_box_width: 560 + onCopyNotificationTitle: qsTr("%1 address", "TICKER").arg(api_wallet_page.ticker) + onCopyNotificationMsg: qsTr("copied to clipboard.") + privacy: true } // Amount @@ -68,13 +101,6 @@ MultipageModalContent text: result.withdraw_answer.date } - // Transaction Hash - TextEditWithTitle - { - id: tx_hash - Layout.fillWidth: true - title: qsTr("Transaction Hash") - } // Buttons footer: @@ -91,7 +117,7 @@ MultipageModalContent Layout.fillWidth: true text: qsTr("View on Explorer") radius: 18 - onClicked: General.viewTxAtExplorer(api_wallet_page.ticker, tx_hash.text) + onClicked: General.viewTxAtExplorer(api_wallet_page.ticker, tx_hash.text_value) } ] } diff --git a/atomic_defi_design/Dex/Wallet/Sidebar.qml b/atomic_defi_design/Dex/Wallet/Sidebar.qml index 4b54ce976d..aca26235ad 100644 --- a/atomic_defi_design/Dex/Wallet/Sidebar.qml +++ b/atomic_defi_design/Dex/Wallet/Sidebar.qml @@ -9,6 +9,7 @@ import "../Components" import "../Constants" as Constants import App 1.0 import Dex.Themes 1.0 as Dex +import Dex.Components 1.0 as Dex // Coins bar at left side Item @@ -59,7 +60,7 @@ Item Layout.preferredHeight: 38 textField.placeholderText: qsTr("Search") - forceFocus: true + //forceFocus: true searchModel: portfolio_coins } @@ -71,14 +72,21 @@ Item Layout.fillHeight: true Layout.alignment: Qt.AlignHCenter color: 'transparent' - content: DexListView { + content: Dex.ListView + { id: list height: list_bg.height model: portfolio_coins topMargin: 5 bottomMargin: 5 scrollbar_visible: false - DexRectangle { + + reuseItems: true + + delegate: SidebarItemDelegate { } + + Dex.Rectangle + { anchors.bottom: parent.bottom anchors.horizontalCenter: parent.horizontalCenter width: parent.width + 4 @@ -94,23 +102,21 @@ Item } } - DexRectangle { + Dex.Rectangle + { anchors.horizontalCenter: parent.horizontalCenter width: parent.width + 4 height: 30 radius: 8 opacity: .5 visible: list.position > 0 ? true : false - Qaterial.Icon { + Qaterial.Icon + { anchors.centerIn: parent - color: DexTheme.foregroundColor + color: Dex.CurrentTheme.foregroundColor icon: Qaterial.Icons.arrowUpCircleOutline } } - - reuseItems: true - - delegate: SidebarItemDelegate { } } } diff --git a/atomic_defi_design/Dex/Wallet/SidebarItemDelegate.qml b/atomic_defi_design/Dex/Wallet/SidebarItemDelegate.qml index 408a48545d..8d3a1ad757 100644 --- a/atomic_defi_design/Dex/Wallet/SidebarItemDelegate.qml +++ b/atomic_defi_design/Dex/Wallet/SidebarItemDelegate.qml @@ -6,15 +6,18 @@ import Qaterial 1.0 as Qaterial import QtGraphicalEffects 1.0 import "../Components" -import "../Constants" as Constants +import "../Constants" as Dex import App 1.0 -GradientRectangle { +GradientRectangle +{ + property int activation_progress: Dex.General.zhtlcActivationProgress(activation_status, ticker) + width: list_bg.width - list_bg.border.width*2 - 6 height: 44 - radius: Constants.Style.rectangleCornerRadius + 4 + radius: Dex.Style.rectangleCornerRadius + 4 - start_color: api_wallet_page.ticker === ticker ? DexTheme.buttonColorEnabled : mouse_area.containsMouse ? DexTheme.buttonColorHovered : 'transparent' + start_color: api_wallet_page.ticker === ticker ? Dex.DexTheme.buttonColorEnabled : mouse_area.containsMouse ? Dex.DexTheme.buttonColorHovered : 'transparent' end_color: 'transparent' // Click area @@ -24,23 +27,23 @@ GradientRectangle { hoverEnabled: true acceptedButtons: Qt.LeftButton | Qt.RightButton - onClicked: { - if(!can_change_ticker) return - - if (mouse.button === Qt.RightButton) context_menu.popup() - else api_wallet_page.ticker = ticker - } - onPressAndHold: { - if(!can_change_ticker) return - - if (mouse.source === Qt.MouseEventNotSynthesized) context_menu.popup() + onClicked: + { + if (mouse.button === Qt.RightButton) + { + context_menu.can_disable = General.canDisable(ticker) + context_menu.popup() + } + else + { + api_wallet_page.ticker = ticker + } } + onPressAndHold: if (mouse.source === Qt.MouseEventNotSynthesized) context_menu.popup() } // Right click menu - CoinMenu { - id: context_menu - } + CoinMenu { id: context_menu } readonly property double side_margin: 16 @@ -50,9 +53,33 @@ GradientRectangle { anchors.left: parent.left anchors.leftMargin: side_margin - scrollbar_margin - source: Constants.General.coinIcon(ticker) - width: Constants.Style.textSizeSmall4*2 + source: Dex.General.coinIcon(ticker) + width: Dex.Style.textSizeSmall4*2 anchors.verticalCenter: parent.verticalCenter + + DexRectangle + { + anchors.centerIn: parent + anchors.fill: parent + radius: 15 + enabled: Dex.General.isZhtlc(ticker) ? activation_progress != 100 : false + visible: enabled + opacity: .9 + color: Dex.DexTheme.backgroundColor + } + + DexLabel + { + anchors.centerIn: parent + anchors.fill: parent + enabled: Dex.General.isZhtlc(ticker) ? activation_progress != 100 : false + visible: enabled + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: activation_progress + "%" + font: Dex.DexTypo.head8 + color: Dex.DexTheme.greenColor + } } ColumnLayout { @@ -64,10 +91,10 @@ GradientRectangle { DexLabel { Layout.alignment: Qt.AlignLeft Layout.preferredWidth: 80 - font: DexTypo.caption - wrapMode: DexLabel.WordWrap + font: Dex.DexTypo.caption + wrapMode: Text.WordWrap text_value: mouse_area.containsMouse ? name.replace(" (TESTCOIN)", "") : ticker - color: DexTheme.foregroundColor + color: Dex.DexTheme.foregroundColor } } } diff --git a/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml b/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml index 92bb7866b3..25380f302a 100644 --- a/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml +++ b/atomic_defi_design/Dex/Wallet/TransactionDetailsModal.qml @@ -13,6 +13,7 @@ import Dex.Themes 1.0 as Dex MultipageModal { id: root + width: 780 function reset() { } @@ -28,6 +29,28 @@ MultipageModal { titleText: qsTr("Transaction Details") + // Transaction Hash + TitleText + { + text: qsTr("Transaction Hash") + Layout.fillWidth: true + visible: text !== "" + color: Dex.CurrentTheme.foregroundColor2 + } + + TextEditWithCopy + { + id: tx_hash + font_size: 13 + align_left: true + text_box_width: 600 + text_value: !details ? "" : details.tx_hash + linkURL: !details ? "" :General.getTxExplorerURL(api_wallet_page.ticker, details.tx_hash, false) + onCopyNotificationTitle: qsTr("%1 txid", "TICKER").arg(api_wallet_page.ticker) + onCopyNotificationMsg: qsTr("copied to clipboard.") + privacy: true + } + // Amount TextEditWithTitle { @@ -48,6 +71,30 @@ MultipageModal label.font.pixelSize: 13 } + AddressList + { + width: parent.width + title: qsTr("From") + model: !details ? [] : + details.from + linkURL: !details ? "" :General.getAddressExplorerURL(api_wallet_page.ticker, details.from) + onCopyNotificationTitle: qsTr("From address") + } + + AddressList + { + width: parent.width + title: qsTr("To") + model: !details ? + [] : details.to.length > 1 ? + General.arrayExclude(details.to, details.from[0]) : details.to + linkURL: !details ? "" + : details.to.length > 1 + ? General.getAddressExplorerURL(api_wallet_page.ticker, General.arrayExclude(details.to, details.from[0])) + : General.getAddressExplorerURL(api_wallet_page.ticker, details.to) + onCopyNotificationTitle: qsTr("To address") + } + // Date TextEditWithTitle { @@ -56,20 +103,6 @@ MultipageModal label.font.pixelSize: 13 } - // Transaction Hash - TextEditWithTitle - { - id: txHash - title: qsTr("Transaction Hash") - text: !details ? "" : details.tx_hash - label.font.pixelSize: 11 - privacy: true - linkURL: !details ? "" :General.getTxExplorerURL(api_wallet_page.ticker, details.tx_hash, false) - copy: true - - onCopyNotificationTitle: qsTr("Transactions") - onCopyNotificationMsg: qsTr("txid copied to clipboard") - } // Confirmations TextEditWithTitle @@ -87,39 +120,6 @@ MultipageModal label.font.pixelSize: 13 } - DefaultRectangle { - Layout.fillWidth: true - Layout.preferredHeight: addressColumn.height + 10 - color: DexTheme.contentColorTop - - Column { - id: addressColumn - width: parent.width - 10 - anchors.centerIn: parent - - AddressList { - width: parent.width - title: qsTr("From") - model: !details ? [] : - details.from - linkURL: !details ? "" :General.getAddressExplorerURL(api_wallet_page.ticker, details.from) - onCopyNotificationTitle: qsTr("From address") - } - - AddressList { - width: parent.width - title: qsTr("To") - model: !details ? - [] : details.to.length > 1 ? - General.arrayExclude(details.to, details.from[0]) : details.to - linkURL: !details ? "" - : details.to.length > 1 - ? General.getAddressExplorerURL(api_wallet_page.ticker, General.arrayExclude(details.to, details.from[0])) - : General.getAddressExplorerURL(api_wallet_page.ticker, details.to) - onCopyNotificationTitle: qsTr("To address") - } - } - } // Notes TextAreaWithTitle @@ -132,6 +132,7 @@ MultipageModal titleColor: Dex.CurrentTheme.foregroundColor2 remove_newline: false field.text: !details ? "" : details.transaction_note + field.rightPadding: 0 saveable: true field.onTextChanged: diff --git a/atomic_defi_design/Dex/Wallet/Transactions.qml b/atomic_defi_design/Dex/Wallet/Transactions.qml index a195fc610b..30e94fa2b8 100644 --- a/atomic_defi_design/Dex/Wallet/Transactions.qml +++ b/atomic_defi_design/Dex/Wallet/Transactions.qml @@ -5,8 +5,9 @@ import QtQuick.Controls 2.15 import "../Components" import "../Constants" import Dex.Themes 1.0 as Dex +import Dex.Components 1.0 as Dex -DefaultListView +Dex.ListView { id: list @@ -18,14 +19,10 @@ DefaultListView property real _feeColumnWidth: 225 property real _dateColumnWidth: 170 - ModalLoader - { - id: tx_details_modal - sourceComponent: TransactionDetailsModal {} - } + model: transactions_mdl.proxy_mdl // Row - delegate: DexRectangle + delegate: Dex.Rectangle { id: rectangle width: list.width @@ -35,7 +32,7 @@ DefaultListView colorAnimation: false color: mouse_area.containsMouse ? Dex.CurrentTheme.buttonColorHovered : 'transparent' - DexMouseArea + Dex.MouseArea { id: mouse_area anchors.fill: parent @@ -47,14 +44,17 @@ DefaultListView } } - RowLayout { + RowLayout + { id: tx_row anchors.fill: parent anchors.margins: 15 - RowLayout { + RowLayout + { spacing: 3 Layout.preferredWidth: _categoryColumnWidth + Circle { id: note_tag @@ -70,7 +70,7 @@ DefaultListView } // Description - DexLabel + Dex.Text { id: description horizontalAlignment: Qt.AlignLeft @@ -80,7 +80,7 @@ DefaultListView } // Crypto - DexLabel + Dex.Text { id: crypto_amount Layout.preferredWidth: _cryptoColumnWidth @@ -98,7 +98,7 @@ DefaultListView } // Fiat - DexLabel + Dex.Text { Layout.preferredWidth: _fiatColumnWidth horizontalAlignment: Text.AlignRight @@ -109,7 +109,7 @@ DefaultListView } // Fee - DexLabel + Dex.Text { Layout.preferredWidth: _feeColumnWidth horizontalAlignment: Text.AlignRight @@ -120,7 +120,7 @@ DefaultListView } // Date - DexLabel + Dex.Text { Layout.preferredWidth: _dateColumnWidth horizontalAlignment: Text.AlignRight @@ -130,4 +130,10 @@ DefaultListView } } } + + ModalLoader + { + id: tx_details_modal + sourceComponent: TransactionDetailsModal {} + } } diff --git a/atomic_defi_design/Dex/main.qml b/atomic_defi_design/Dex/main.qml index e5da681944..546f406a79 100644 --- a/atomic_defi_design/Dex/main.qml +++ b/atomic_defi_design/Dex/main.qml @@ -1,14 +1,12 @@ -//! Qt Imports import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Controls.Universal 2.15 import QtQuick.Layouts 1.12 import Qt.labs.settings 1.0 +import ModelHelper 0.1 -//! 3rdParty Imports import Qaterial 1.0 as Qaterial -//! Project Imports import App 1.0 import "Components" import Dex.Themes 1.0 as Dex @@ -17,11 +15,12 @@ DexWindow { id: window - property int previousX: 0 - property int previousY: 0 - property int real_visibility + property int previousX: 0 + property int previousY: 0 + property int real_visibility property bool isOsx: Qt.platform.os == "osx" property bool logged: false + property var orders: API.app.orders_mdl.orders_proxy_mdl.ModelHelper title: API.app_name visible: true @@ -108,32 +107,8 @@ DexWindow anchors.fill: parent onClicked: { - let dialog = app.showDialog( - { - "title": qsTr("Confirm Logout"), - text: qsTr("Are you sure you want to log out?"), - standardButtons: Dialog.Yes | Dialog.Cancel, - warning: true, - height: 230, - centerAlign: true, - yesButtonText: qsTr("Yes"), - cancelButtonText: qsTr("Cancel"), - onAccepted: function(text) - { - app.notifications_list = [] - userMenu.close() - app.currentWalletName = "" - API.app.disconnect() - app.onDisconnect() - window.logged = false - dialog.close() - dialog.destroy() - }, - onRejected: function() - { - userMenu.close() - } - }) + if (orders.count != 0) app.logout_confirm_modal.open() + else app.return_to_login() } } } @@ -199,11 +174,14 @@ DexWindow anchors.verticalCenter: parent.verticalCenter layoutDirection: Qt.RightToLeft spacing: 6 + Item { width: 15 height: 1 } + + // User / logout Rectangle { width: __row.width + 10 @@ -211,6 +189,7 @@ DexWindow anchors.verticalCenter: parent.verticalCenter radius: 3 color: _area.containsMouse ? Dex.CurrentTheme.floatingBackgroundColor : "transparent" + Row { id: __row @@ -247,6 +226,7 @@ DexWindow anchors.verticalCenter: parent.verticalCenter } } + DexMouseArea { id: _area @@ -264,11 +244,14 @@ DexWindow } } } + Item { width: 10 height: 1 } + + // Wallet Balance Row { anchors.verticalCenter: parent.verticalCenter @@ -283,6 +266,7 @@ DexWindow visible: _label.visible anchors.verticalCenter: parent.verticalCenter } + DexLabel { text_value: General.formatFiat("", API.app.portfolio_pg.balance_fiat_all, API.app.settings_pg.current_currency) @@ -315,6 +299,7 @@ DexWindow height: 1 } + // Notifications DexIconButton { color: containsMouse ? Dex.CurrentTheme.gradientButtonPressedStartColor : Dex.CurrentTheme.foregroundColor @@ -357,6 +342,7 @@ DexWindow fileName: atomic_cfg_file } + // Theme toggle DexIconButton { id: themeSwitchBut diff --git a/atomic_defi_design/assets/images/coins/1inch.png b/atomic_defi_design/assets/images/coins/1inch.png index 53aada0629..c2b9d20a1a 100644 Binary files a/atomic_defi_design/assets/images/coins/1inch.png and b/atomic_defi_design/assets/images/coins/1inch.png differ diff --git a/atomic_defi_design/assets/images/coins/actn.png b/atomic_defi_design/assets/images/coins/actn.png index 2160891678..740e6b6d85 100644 Binary files a/atomic_defi_design/assets/images/coins/actn.png and b/atomic_defi_design/assets/images/coins/actn.png differ diff --git a/atomic_defi_design/assets/images/coins/ape.png b/atomic_defi_design/assets/images/coins/ape.png index 81e7165e46..70eea410b6 100644 Binary files a/atomic_defi_design/assets/images/coins/ape.png and b/atomic_defi_design/assets/images/coins/ape.png differ diff --git a/atomic_defi_design/assets/images/coins/aslp.png b/atomic_defi_design/assets/images/coins/aslp.png new file mode 100644 index 0000000000..4514883847 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/aslp.png differ diff --git a/atomic_defi_design/assets/images/coins/avax.png b/atomic_defi_design/assets/images/coins/avax.png index ab5ed4d8db..d32406c5cd 100644 Binary files a/atomic_defi_design/assets/images/coins/avax.png and b/atomic_defi_design/assets/images/coins/avax.png differ diff --git a/atomic_defi_design/assets/images/coins/avn.png b/atomic_defi_design/assets/images/coins/avn.png new file mode 100644 index 0000000000..a22e149551 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/avn.png differ diff --git a/atomic_defi_design/assets/images/coins/aya.png b/atomic_defi_design/assets/images/coins/aya.png new file mode 100644 index 0000000000..819e34c0ed Binary files /dev/null and b/atomic_defi_design/assets/images/coins/aya.png differ diff --git a/atomic_defi_design/assets/images/coins/chta.png b/atomic_defi_design/assets/images/coins/chta.png new file mode 100755 index 0000000000..250081362e Binary files /dev/null and b/atomic_defi_design/assets/images/coins/chta.png differ diff --git a/atomic_defi_design/assets/images/coins/chz.png b/atomic_defi_design/assets/images/coins/chz.png index 400df28631..fde9fa6c9c 100644 Binary files a/atomic_defi_design/assets/images/coins/chz.png and b/atomic_defi_design/assets/images/coins/chz.png differ diff --git a/atomic_defi_design/assets/images/coins/ddd.png b/atomic_defi_design/assets/images/coins/ddd.png new file mode 100644 index 0000000000..ea14603798 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/ddd.png differ diff --git a/atomic_defi_design/assets/images/coins/dent.png b/atomic_defi_design/assets/images/coins/dent.png new file mode 100644 index 0000000000..575c580646 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/dent.png differ diff --git a/atomic_defi_design/assets/images/coins/flexusd.png b/atomic_defi_design/assets/images/coins/flexusd.png new file mode 100644 index 0000000000..09467ef0af Binary files /dev/null and b/atomic_defi_design/assets/images/coins/flexusd.png differ diff --git a/atomic_defi_design/assets/images/coins/glm.png b/atomic_defi_design/assets/images/coins/glm.png new file mode 100644 index 0000000000..2596892e04 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/glm.png differ diff --git a/atomic_defi_design/assets/images/coins/gmt.png b/atomic_defi_design/assets/images/coins/gmt.png index 1f5027659f..36c961c52f 100644 Binary files a/atomic_defi_design/assets/images/coins/gmt.png and b/atomic_defi_design/assets/images/coins/gmt.png differ diff --git a/atomic_defi_design/assets/images/coins/gmx.png b/atomic_defi_design/assets/images/coins/gmx.png new file mode 100644 index 0000000000..b84f2f58c3 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/gmx.png differ diff --git a/atomic_defi_design/assets/images/coins/gtu.png b/atomic_defi_design/assets/images/coins/gtu.png new file mode 100644 index 0000000000..3ef5e1c590 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/gtu.png differ diff --git a/atomic_defi_design/assets/images/coins/honk.png b/atomic_defi_design/assets/images/coins/honk.png new file mode 100644 index 0000000000..dbd5c3114f Binary files /dev/null and b/atomic_defi_design/assets/images/coins/honk.png differ diff --git a/atomic_defi_design/assets/images/coins/ilnf.png b/atomic_defi_design/assets/images/coins/ilnf.png new file mode 100644 index 0000000000..7205de78b6 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/ilnf.png differ diff --git a/atomic_defi_design/assets/images/coins/ilnsw.png b/atomic_defi_design/assets/images/coins/ilnsw.png new file mode 100644 index 0000000000..3e93caf84c Binary files /dev/null and b/atomic_defi_design/assets/images/coins/ilnsw.png differ diff --git a/atomic_defi_design/assets/images/coins/jdb.png b/atomic_defi_design/assets/images/coins/jdb.png new file mode 100644 index 0000000000..e05f13b2e6 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/jdb.png differ diff --git a/atomic_defi_design/assets/images/coins/joy.png b/atomic_defi_design/assets/images/coins/joy.png new file mode 100644 index 0000000000..efd41707a5 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/joy.png differ diff --git a/atomic_defi_design/assets/images/coins/jst.png b/atomic_defi_design/assets/images/coins/jst.png new file mode 100644 index 0000000000..10361f179c Binary files /dev/null and b/atomic_defi_design/assets/images/coins/jst.png differ diff --git a/atomic_defi_design/assets/images/coins/ldo.png b/atomic_defi_design/assets/images/coins/ldo.png new file mode 100644 index 0000000000..f608e53381 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/ldo.png differ diff --git a/atomic_defi_design/assets/images/coins/lnc.png b/atomic_defi_design/assets/images/coins/lnc.png new file mode 100644 index 0000000000..c71ff557db Binary files /dev/null and b/atomic_defi_design/assets/images/coins/lnc.png differ diff --git a/atomic_defi_design/assets/images/coins/loom.png b/atomic_defi_design/assets/images/coins/loom.png new file mode 100644 index 0000000000..defb6fac46 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/loom.png differ diff --git a/atomic_defi_design/assets/images/coins/loop.png b/atomic_defi_design/assets/images/coins/loop.png new file mode 100644 index 0000000000..f637259f01 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/loop.png differ diff --git a/atomic_defi_design/assets/images/coins/lrc.png b/atomic_defi_design/assets/images/coins/lrc.png index 02c8686e55..c982e9b616 100644 Binary files a/atomic_defi_design/assets/images/coins/lrc.png and b/atomic_defi_design/assets/images/coins/lrc.png differ diff --git a/atomic_defi_design/assets/images/coins/maze.png b/atomic_defi_design/assets/images/coins/maze.png new file mode 100644 index 0000000000..f3e98bf0da Binary files /dev/null and b/atomic_defi_design/assets/images/coins/maze.png differ diff --git a/atomic_defi_design/assets/images/coins/mc.png b/atomic_defi_design/assets/images/coins/mc.png new file mode 100644 index 0000000000..ee0a7dabd3 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/mc.png differ diff --git a/atomic_defi_design/assets/images/coins/med.png b/atomic_defi_design/assets/images/coins/med.png new file mode 100644 index 0000000000..5f06199fc9 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/med.png differ diff --git a/atomic_defi_design/assets/images/coins/nav.png b/atomic_defi_design/assets/images/coins/nav.png index 088c43607e..3837c3257a 100644 Binary files a/atomic_defi_design/assets/images/coins/nav.png and b/atomic_defi_design/assets/images/coins/nav.png differ diff --git a/atomic_defi_design/assets/images/coins/neng.png b/atomic_defi_design/assets/images/coins/neng.png new file mode 100755 index 0000000000..d21debfa2e Binary files /dev/null and b/atomic_defi_design/assets/images/coins/neng.png differ diff --git a/atomic_defi_design/assets/images/coins/ninja.png b/atomic_defi_design/assets/images/coins/ninja.png new file mode 100644 index 0000000000..9d0c512155 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/ninja.png differ diff --git a/atomic_defi_design/assets/images/coins/psf.png b/atomic_defi_design/assets/images/coins/psf.png new file mode 100644 index 0000000000..8a16d160b7 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/psf.png differ diff --git a/atomic_defi_design/assets/images/coins/qnt.png b/atomic_defi_design/assets/images/coins/qnt.png index e795e58f96..dd84529e5d 100644 Binary files a/atomic_defi_design/assets/images/coins/qnt.png and b/atomic_defi_design/assets/images/coins/qnt.png differ diff --git a/atomic_defi_design/assets/images/coins/rbtc.png b/atomic_defi_design/assets/images/coins/rbtc.png index 01ce3898f8..cfea17b093 100644 Binary files a/atomic_defi_design/assets/images/coins/rbtc.png and b/atomic_defi_design/assets/images/coins/rbtc.png differ diff --git a/atomic_defi_design/assets/images/coins/scrt.png b/atomic_defi_design/assets/images/coins/scrt.png new file mode 100644 index 0000000000..03f3b5cf63 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/scrt.png differ diff --git a/atomic_defi_design/assets/images/coins/seele.png b/atomic_defi_design/assets/images/coins/seele.png new file mode 100644 index 0000000000..82b69a10e2 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/seele.png differ diff --git a/atomic_defi_design/assets/images/coins/slp.png b/atomic_defi_design/assets/images/coins/slp.png new file mode 100644 index 0000000000..4514883847 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/slp.png differ diff --git a/atomic_defi_design/assets/images/coins/solve.png b/atomic_defi_design/assets/images/coins/solve.png new file mode 100644 index 0000000000..e255a2cec3 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/solve.png differ diff --git a/atomic_defi_design/assets/images/coins/sour.png b/atomic_defi_design/assets/images/coins/sour.png new file mode 100644 index 0000000000..3f8d943baf Binary files /dev/null and b/atomic_defi_design/assets/images/coins/sour.png differ diff --git a/atomic_defi_design/assets/images/coins/spice.png b/atomic_defi_design/assets/images/coins/spice.png new file mode 100644 index 0000000000..3c0ca974ca Binary files /dev/null and b/atomic_defi_design/assets/images/coins/spice.png differ diff --git a/atomic_defi_design/assets/images/coins/stst.png b/atomic_defi_design/assets/images/coins/stst.png new file mode 100644 index 0000000000..4514883847 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/stst.png differ diff --git a/atomic_defi_design/assets/images/coins/swap.png b/atomic_defi_design/assets/images/coins/swap.png new file mode 100644 index 0000000000..8b9322d98d Binary files /dev/null and b/atomic_defi_design/assets/images/coins/swap.png differ diff --git a/atomic_defi_design/assets/images/coins/tama.png b/atomic_defi_design/assets/images/coins/tama.png new file mode 100644 index 0000000000..25d9e1a766 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/tama.png differ diff --git a/atomic_defi_design/assets/images/coins/tbch.png b/atomic_defi_design/assets/images/coins/tbch.png new file mode 100644 index 0000000000..c0e65ffd61 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/tbch.png differ diff --git a/atomic_defi_design/assets/images/coins/ton.png b/atomic_defi_design/assets/images/coins/ton.png new file mode 100644 index 0000000000..e51df480b5 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/ton.png differ diff --git a/atomic_defi_design/assets/images/coins/ttt.png b/atomic_defi_design/assets/images/coins/ttt.png index 3bddf690ce..e9077a4b28 100644 Binary files a/atomic_defi_design/assets/images/coins/ttt.png and b/atomic_defi_design/assets/images/coins/ttt.png differ diff --git a/atomic_defi_design/assets/images/coins/usdf.png b/atomic_defi_design/assets/images/coins/usdf.png new file mode 100644 index 0000000000..4514883847 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/usdf.png differ diff --git a/atomic_defi_design/assets/images/coins/vtc.png b/atomic_defi_design/assets/images/coins/vtc.png new file mode 100644 index 0000000000..7255699eb6 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/vtc.png differ diff --git a/atomic_defi_design/assets/images/coins/woo.png b/atomic_defi_design/assets/images/coins/woo.png new file mode 100644 index 0000000000..2a00e447cc Binary files /dev/null and b/atomic_defi_design/assets/images/coins/woo.png differ diff --git a/atomic_defi_design/assets/images/coins/zapt.png b/atomic_defi_design/assets/images/coins/zapt.png new file mode 100644 index 0000000000..fe593de5f9 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/zapt.png differ diff --git a/atomic_defi_design/assets/images/coins/zombie.png b/atomic_defi_design/assets/images/coins/zombie.png new file mode 100644 index 0000000000..6a1bbc8df9 Binary files /dev/null and b/atomic_defi_design/assets/images/coins/zombie.png differ diff --git a/atomic_defi_design/assets/images/lang/de.png b/atomic_defi_design/assets/images/lang/de.png new file mode 100644 index 0000000000..c4b7c4335b Binary files /dev/null and b/atomic_defi_design/assets/images/lang/de.png differ diff --git a/atomic_defi_design/assets/images/lang/es.png b/atomic_defi_design/assets/images/lang/es.png new file mode 100755 index 0000000000..5fdf39bb75 Binary files /dev/null and b/atomic_defi_design/assets/images/lang/es.png differ diff --git a/atomic_defi_design/assets/languages/atomic_defi_de.ts b/atomic_defi_design/assets/languages/atomic_defi_de.ts new file mode 100644 index 0000000000..8ee90d8381 --- /dev/null +++ b/atomic_defi_design/assets/languages/atomic_defi_de.ts @@ -0,0 +1,4573 @@ + + + + + AddAddressForm + + + Use standard network address + Standard-Netzwerkadresse verwenden + + + + Label + Bezeichnung + + + + This key already exists. + Dieser Schlüssel existiert bereits. + + + + Address + Adresse + + + + + Cancel + Abbrechen + + + + Convert + Umwandeln + + + + Edit + Bearbeiten + + + + Add + Hinzufügen + + + + You need to enable %1 before adding this kind of address. + Sie müssen %1 aktivieren, bevor Sie diese Art von Adresse hinzufügen. + + + + Enable + Aktivieren + + + + AddCustomCoinModal + + + Get the contract address from + Erhalten Sie die Vertragsadresse von + + + + Choose the asset type + Wählen Sie den Asset-Typ aus + + + + Cancel + Abbrechen + + + + + + Next + Weiter + + + + Contract address + Vertragsadresse + + + + Enter the contract address + Geben Sie die Vertragsadresse ein + + + + Choose the asset ticker + Wählen Sie den Asset-Ticker + + + + Ticker + Ticker + + + + Enter the ticker + Geben Sie den Ticker ein + + + + Get the contract address from + Erhalten Sie die Vertragsadresse von + + + + + + + Previous + Vorherige + + + + Choose the asset logo + Wählen Sie ein Logo für das Asset aus + + + + Browse + Durchsuchen + + + + Please choose the asset logo + Bitte wählen Sie für das Asset ein Logo aus + + + + Configuration + Konfiguration + + + + All configuration fields will be fetched using the contract address you provided. + Alle Konfigurationsfelder werden mit der von Ihnen angegebenen Vertragsadresse abgerufen. + + + + Name + Name + + + + Enter the name + Geben Sie den Namen ein + + + + Coingecko ID + Coingecko ID + + + + Enter the Coingecko ID + Geben Sie die Coingecko-ID ein + + + + Get the Coingecko ID + Coingecko-ID erhalten + + + + Active + Aktiv + + + + + Preview + Vorschau + + + + WARNING: Application will restart immidiately to apply the changes! + WARNUNG: Die Anwendung wird sofort neu gestartet, um die Änderungen zu übernehmen! + + + + Asset not found, please go back and make sure Contract Address is correct + Asset nicht gefunden, bitte gehen Sie zurück und stellen Sie sicher, dass die Vertragsadresse korrekt ist + + + + Config Fields + Konfigurationsfelder + + + + Fetched Data + Abgerufene Daten + + + + Submit & Restart + Bestätigen und Neu starten + + + + AddTagPopup + + + Tag name + Schlagwort + + + + Contact already has this tag. + Der Kontakt hat bereits dieses Schlagwort. + + + + + ADD + + HINZUFÜGEN + + + + AmountChart + + + Work in progress + In Arbeit + + + + App + + + Recover Funds Result + Ergebnis der Rückerstattung der Geldmittel + + + + AssetFromStandardSelector + + + Choose a valid + Wählen Sie eine gültige + + + + asset + Asset + + + + Search an asset + Asset suchen + + + + Disabled + Deaktiviert + + + + AssetPieChart + + + Assets + Assets + + + + AssetsList + + + Asset + Asset + + + + Balance + Balance + + + + Fiat Balance + Fiat Balance + + + + Change 24h + 24h Veränderung + + + + Price + Preis + + + + Source + Quelle + + + + Activating: + + + + + Price provider is: %1 + Preisanbieter ist: %1 + + + + Bottom + + + Settings + Einstellungen + + + + Support + Support + + + + Privacy + Datenschutz + + + + Disable Privacy? + Datenschutz deaktivieren? + + + + Enter wallet password to confirm + Geben Sie zur Bestätigung das Kennwort der Brieftasche ein + + + + Type password + Kennwort eingeben + + + + Confirm + Bestätigen + + + + Cancel + Abbrechen + + + + Privacy status + Status Datenschutz + + + + Privacy mode disabled successfully + Der Datenschutzmodus wurde erfolgreich deaktiviert + + + + + Ok + Ok + + + + Wrong password! + Falsches Kennwort! + + + + wallet password is incorrect + Kennwort der Brieftasche ist falsch + + + + CamouflagePasswordModal + + + Setup Camouflage Password + Tarnkennwort einrichten + + + + Camouflage Password is a secret password for emergency situations. + Das Tarnkennwort (Camouflage Password) ist ein geheimes Passwort für Notsituationen. + + + + Using it to login will display your balance lower than it actually is. + Wenn Sie sich damit anmelden, wird Ihr Guthaben niedriger angezeigt, als es tatsächlich ist. + + + + Here you enter the suffix and at login you need to enter {real_password}{suffix} + Hier geben Sie den Zusatz ein und beim Einloggen benötigen Sie {echtes Kennwort}{suffix} +Beispiel: Kennwort = 1234 Suffix=56 Eingabe beim Login=123456 + + + + Password suffix + Kennwort-Zusatz + + + + Confirm pasword suffix + Kennwort-Zusatz bestätigen + + + + Enter a password suffix + Geben Sie einen Kennwort-Zusatz ein + + + + Enter the same password suffix to confirm + Geben Sie zur Bestätigung denselben Kennwort-Zusatz ein + + + + Cancel + Abbrechen + + + + Save + Speichern + + + + CannotEnableCoinModal + + + Failed to enable %1 + Aktivierung von %1 fehlgeschlagen + + + + Enabling %1 did not succeed. Limit of enabled coins might have been reached. + Das Aktivieren von %1 war nicht erfolgreich. Das Limit der aktivierten Coins wurde möglicherweise erreicht. + + + + Change limit in settings + Limit in den Einstellungen ändern + + + + Cancel + Abbrechen + + + + Center + + + Portfolio + Portfolio + + + + Wallet + Brieftasche + + + + DEX + DEX + + + + Address Book + Adressbuch + + + + Fiat + Fiat + + + + CexInfoModal + + + Market Data + Marktdaten + + + + Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> + Mit dem Symbol ⓘ gekennzeichnete Marktdaten (Kurse, Charts etc.) stammen aus Drittquellen.<br><br>Die Daten stammen von <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> und <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle unterstützte Paare:</b><br>%1<br><br><b>Letzte Referenz (Band Oracle):</b><br><a href="%2">%2</a> + + + + Chart + + + Loading market data + Laden von Marktdaten + + + + There is no chart data for this pair yet + Für dieses Paar liegen noch keine Chartdaten vor + + + + ClaimRewardsModal + + + Failed to prepare to claim rewards + Vorbereitung zum Einfordern von Belohnungen fehlgeschlagen + + + + Claim your %1 reward? + TICKER + %1 Belohnung beantragen? + + + + No UTXOs eligible for claiming + Keine beanspruchungsberechtigten UTXOs vorhanden + + + + Transaction fee is higher than the reward! + Die Transaktionsgebühr ist höher als die Belohnung! + + + + You will receive + Sie erhalten + + + + Refresh + Aktualisieren + + + + Read more about KMD active users rewards + Lesen Sie mehr über die Belohnungen für aktive KMD-Benutzer + + + + UTXO + UTXO + + + + Amount + Menge + + + + Reward + Belohnung + + + + Accruing Start + Anfallender Start + + + + Accruing Stop + Anfallender Stopp + + + + Time Left + Verbleibende Zeit + + + + Error + Fehler + + + + Locktime is not set + Die Sperrzeit ist nicht eingestellt + + + + Locktime is less than the threshold + Die Sperrzeit liegt unter dem Schwellenwert + + + + UTXO height is greater than end of the era + UTXO-Höhe ist größer als Ende der Ära + + + + UTXO amount is less than 10 + UTXO-Menge ist kleiner als 10 + + + + One hour did not pass yet + Eine Stunde ist noch nicht vergangen + + + + Transaction is in mempool + Die Transaktion befindet sich in Mempool + + + + Unknown problem + Unbekanntes Problem + + + + Cancel + Abbrechen + + + + Confirm + Bestätigen + + + + CoinMenu + + + Disable %1 + TICKER + %1 deaktivieren + + + + Disable and Delete %1 + TICKER + %1 deaktivieren und löschen + + + + Disable all %1 assets + Alle %1 Assets deaktivieren + + + + Disable all assets + Alle Assets deaktivieren + + + + Disable 0 balance assets + Alle Assets mit der Balance 0 deaktivieren + + + + ComboBoxWithSearchBar + + + Search + Suchen + + + + Combo_fiat + + + Language + Sprache + + + + Fiat + Fiat + + + + Recommended: + Empfohlen: + + + + ConfirmMultiOrderTradeModal + + + Confirm Multi Order Details + Bestätigen Sie die Details des Mehrfachauftrags + + + + These swaps requests can not be undone and this is the final event! + Diese Tauschanfragen können nicht rückgängig gemacht werden und dies ist das endgültige Ereignis! + + + + These transactions can take up to 60 mins - DO NOT close this application! + Diese Transaktionen können bis zu 60 Minuten dauern - schließen Sie diese Anwendung NICHT! + + + + Same funds will be used until an order matches. + Die gleichen Geldmittel werden verwendet, bis eine Bestellung übereinstimmt. + + + + Note that if one order is filled other will not be cancelled. + Beachten Sie, dass, wenn eine Bestellung ausgeführt wird, andere nicht storniert werden. + + + + Cancel + Abbrechen + + + + Confirm + Bestätigen + + + + Placed multiple orders + Mehrere Aufrtäge aufgegeben + + + + ConfirmTradeModal + + + Confirm Exchange Details + Bestätigen Sie die Austausch-Details + + + + Trade price is more than 50% different to CEX! Confirm? + + + + + This swap request can not be undone and is a final event! + Diese Tauschanfrage kann nicht rückgängig gemacht werden und ist ein endgültiges Ereignis! + + + + This transaction can take up to 60 mins - DO NOT close this application! + Diese Transaktion kann bis zu 60 Minuten dauern - schließen Sie diese Anwendung NICHT! + + + + Loading fees... + Lade Gebühren... + + + + <b>Total %1 fees:</b> + <b>Gesamt %1 Gebühren:</b> + + + + Security configuration + Sicherheitskonfiguration + + + + %1 confirmations for incoming %2 transactions + %1 Bestätigungen für eingehende %2 Transaktionen + + + + Read more about dPoW + Lesen Sie mehr über dPoW + + + + Use custom protection settings for incoming %1 transactions + TICKER + Benutzerdefinierte Schutzeinstellungen für eingehende %1 Transaktionen verwenden + + + + Enable Komodo dPoW security + Komodo dPoW-Sicherheit aktivieren + + + + dPoW protected + + + + + Required Confirmations + Erforderliche Bestätigungen + + + + Warning, this atomic swap is not dPoW protected! + Achtung, dieser Atomic Swap ist nicht dPoW-geschützt! + + + + Cancel + Abbrechen + + + + Confirm + Bestätigen + + + + CopyFieldButton + + + Copied to Clipboard + In die Zwischenablage kopiert + + + + Dashboard + + + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. + Die aktuelle Anzahl aktivierter Coins stimmt nicht mit Ihrer Konfigurationsvorgabe überein. Die Konfiguration der Assets wird zurückgesetzt. + + + + Matching + Zusammenführung + + + + Order Matching + Auftrag wird zusammengeführt + + + + Matched + Zusammengeführt + + + + Order Matched + Auftrag wurde zusammengeführt + + + + Ongoing + Laufend + + + + Swap Ongoing + Austausch läuft + + + + Successful + Erfolgreich + + + + Swap Successful + Tausch erfolgreich + + + + Refunding + Rückzahlung + + + + Failed + Fehlgeschlagen + + + + Swap Failed + Tausch fehlgeschlagen + + + + Unknown + Unbekannt + + + + Unknown State + Unbekannter Status + + + + Started + Gestartet + + + + Negotiated + Ausgehandelt + + + + Taker fee sent + Taker-Gebühr gesendet + + + + Maker payment received + Maker-Zahlung erhalten + + + + Maker payment wait confirm started + Warten auf die Zahlungsbestätigung des Makers gestartet + + + + Maker payment validated and confirmed + Maker-Zahlung validiert und bestätigt + + + + Taker payment sent + Taker-Zahlung gesendet + + + + Taker payment spent + Taker-Zahlung ausgegeben + + + + Maker payment spent + Maker-Zahlung ausgegeben + + + + Finished + Fertig + + + + Start failed + Start fehlgeschlagen + + + + Negotiate failed + Verhandeln fehlgeschlagen + + + + Taker fee validate failed + Validierung der Abnehmergebühr fehlgeschlagen + + + + Maker payment transaction failed + Maker-Zahlungstransaktion fehlgeschlagen + + + + Maker payment Data send failed + Fehler beim Senden der Maker-Zahlungsdaten + + + + Maker payment wait confirm failed + Warten auf die Zahlungsbestätigung des Makers fehlgeschlagen + + + + Taker payment validate failed + Validierung der Taker-Zahlung fehlgeschlagen + + + + Taker payment wait confirm failed + Warten auf die Zahlungsbestätigung des Takers fehlgeschlagen + + + + Taker payment spend failed + Zahlungsausgabe des Takers fehlgeschlagen + + + + Maker payment wait refund started + Countdown für die Rückerstattung der Maker-Zahlung hat begonnen + + + + Maker payment refunded + Maker-Zahlung zurückerstattet + + + + Maker payment refund failed + Rückerstattung der Maker-Zahlung fehlgeschlagen + + + + DatePicker + + + Date + Datum + + + + DefaultCopyIcon + + + copied to clipboard + In die Zwischenablage kopiert + + + + DefaultRangeSlider + + + Min + Min + + + + Max + Max + + + + DefaultTextEdit + + + copied to clipboard + In die Zwischenablage kopiert + + + + DeleteWalletModal + + + Delete Wallet + Brieftasche löschen + + + + Are you sure you want to delete %1 wallet? + WALLET_NAME + Sind Sie sicher, dass Sie die %1 Brieftasche löschen möchten? + + + + If so, make sure you record your seed phrase in order to restore your wallet in the future. + Wenn ja, stellen Sie sicher, dass Sie Ihre Seed-Phrase notieren, um Ihre Brieftasche in Zukunft wiederherzustellen. + + + + Enter your wallet password + Geben Sie das Kennwort für ihre Brieftasche ein + + + + Wrong Password + Falsches Kennwort + + + + Cancel + Abbrechen + + + + Delete + Löschen + + + + DexAppPasswordField + + + Type password + Kennwort eingeben + + + + DexKeyChecker + + + At least 1 lowercase alphabetical character + Mindestens 1 Kleinbuchstabe + + + + At least 1 uppercase alphabetical character + Mindestens 1 Großbuchstabe + + + + At least 1 numeric character + Mindestens 1 Ziffer + + + + At least 1 special character (eg. !@#$%) + Mindestens 1 Sonderzeichen (z. B. ! @ # $ %) + + + + Between %1 and %2 character(s) + + + + + Password and Confirm Password have to be same + Kennwort und Kennwortbestätigung müssen identisch sein + + + + DexPaginator + + + items per page + Elemente pro Seite + + + + DexRangeSlider + + + Min + Min + + + + Half + Halb + + + + Max + Max + + + + DexSweetComboBox + + + Search + Suchen + + + + EditContactModal + + + Edit contact + Kontakt bearbeiten + + + + Contact name + Kontaktname + + + + Enter a contact name + Geben Sie einen Kontaktnamen ein + + + + Address list + Adressliste + + + + Address Book + Adressbuch + + + + address copied to clipboard + Adresse in die Zwischenablage kopiert + + + + Edit + Bearbeiten + + + + + Add + + Hinzufügen + + + + Tags + Schlagworte + + + + Add tag + Schlagwort hinzufügen + + + + Cancel + Abbrechen + + + + Confirm + Bestätigen + + + + EnableAssetModal + + + The selected address belongs to a disabled asset, you need to enabled it before sending. + Die ausgewählte Adresse gehört zu einem deaktivierten Asset, Sie müssen es vor dem Senden aktivieren. + + + + Enable + Aktivieren + + + + Cancel + Abbrechen + + + + EnableCoinModal + + + Enable assets + Assets aktivieren + + + + Select all assets + Alle Assets auswählen + + + + All assets are already enabled! + Alle Assets sind bereits aktiviert! + + + + You can still enable %1 assets. Selected: %2. + Sie können weiterhin %1 Assets aktivieren. Ausgewählt: %2. + + + + Search asset + Asset suchen + + + + Change assets limit + Asset-Limit ändern + + + + Add a custom asset + Benutzerdefiniertes Asset hinzufügen + + + + Close + Schließen + + + + Enable + Aktivieren + + + + EulaModal + + + Disclaimer & Terms of Service + Haftungsausschluss & Nutzungsbedingungen + + + + Accept EULA + EULA akzeptieren + + + + Accept Terms and Conditions + Allgemeine Geschäftsbedingungen akzeptieren + + + + Close + Schließen + + + + Cancel + Abbrechen + + + + Confirm + Bestätigen + + + + FatalErrorModal + + + Fatal Error + Schwerwiegender Fehler + + + + Connection has been lost. You have been disconnected. + Die Verbindung wurde unterbrochen. Ihre Verbindung wurde getrennt. + + + + Close + Schließen + + + + FeeInfo + + + Minimum fee + Mindestgebühr + + + + Fees will be calculated + Gebühren werden berechnet + + + + GasInfoModal + + + How do I calculate gas? + + + + + Gas is measured in gwei. Gwei is just a unit of Ether, and is equal to 0.000000001 ETH (or the equivalent platform coin such as AVAX or BNB). The gas price varies over time depending on network congestion. + + + + + The gas limit is how many units of gas (maximum) you allocate to pay for a transaction. The gas required depending on the size of the transaction & data being transmitted. + + + + + A standard transaction not involving contracts uses 21,000 gas units, with any of the limit remaining returned to the source address. + + + + + Transactions involving contracts may result in the whole limit being consumed, so be careful not to set it too high. + + + + + For more information, read the article at <a href="https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use">https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use</a> + + + + + General + + + %n day(s) + + %n Tag + %n Tage + + + + + %nd + day + + + + + + + + %nh + hours + + + + + + + + %nm + minutes + + + + + + + + %ns + seconds + + + + + + + + %nms + milliseconds + + + + + + + + - + - + + + + <b>Taker tx fee:</b> + <b>Taker tx Gebühren:</b> + + + + <b>Dex tx fee:</b> + <b>Dex tx Gebühren:</b> + + + + <b>Dex fee:</b> + <b>Dex Gebühren:</b> + + + + <b>Maker tx fee:</b> + <b>Maker tx Gebühren:</b> + + + + %1 %2 %3 (%4) + %1 %2 %3 (%4) + + + + Trading Fee + Handelsgebühr + + + + Minimum Trading Amount + Mindesthandelsbetrag + + + + Wallet %1 already exists + WALLETNAME + Brieftasche %1 existiert bereits + + + + %1 balance is lower than the fees amount: %2 %3 + Das %1 Guthaben ist niedriger als der Gebührenbetrag: %2 %3 + + + + Tradable (after fees) %1 balance is lower than minimum trade amount + Handelbares %1 Guthaben (nach Gebühren) ist niedriger als der Mindesthandelsbetrag + + + + Please fill the price field + Bitte füllen Sie das Preisfeld aus + + + + Please fill the volume field + + + + + + Please wait for %1 to fully activate + + + + + + %1 volume is lower than minimum trade amount + %1 Volumen ist niedriger als der minimale Handelsbetrag + + + + + %1 needs to be enabled in order to use %2 + %1 muss aktiviert werden, um %2 verwenden zu können + + + + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions + Das %1 Guthaben muss finanziert werden, ein Guthaben größer Null ist erforderlich, um das Benzin von %2 Transaktionen zu bezahlen + + + + Unknown Error + Unbekannter Fehler + + + + Header + + + You get + Du erhältst + + + + You send + Sie senden + + + + Fiat Price + Fiat Preis + + + + CEX rate + CEX-Kurs + + + + Price + Preis + + + + Quantity + Menge + + + + Total + Gesamt + + + + ImportWallet + + + Failed to Import the wallet + Fehler beim Importieren der Brieftasche + + + + Import wallet - Setup + Brieftasche importieren - Einrichtung + + + + Import wallet - Choose password + Brieftasche importieren - Kennwort wählen + + + + Wallet Name + Name der Brieftasche + + + + Enter seed + Geben Sie den Seed ein + + + + Your seed is not BIP39 compliant. +Try again or select 'Allow custom seed' to continue. + Ihr Seed ist nicht BIP39-konform. Versuchen Sie es erneut oder wählen Sie "benutzerdefinierten Seed erlauben" um fortzufahren + + + + + i understand + Ich verstehe + + + + + я согласен + + + + + + je comprends + + + + + + entiendo + + + + + + anladım + + + + + + ich verstehe + + + + + Ok + Ok + + + + Allow custom seed + Benutzerdefinierten Seed zulassen + + + + <strong>Allow custom seed</strong> + <strong>Benutzerdefinierten Seed zulassen</strong> + + + + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. + Benutzerdefinierte Seed-Phrasen sind möglicherweise weniger sicher und leichter zu knacken als eine generierte BIP39-konforme Seed-Phrase oder ein privater Schlüssel (WIF).<br><br>Um zu bestätigen, dass Sie das Risiko verstehen und wissen, was Sie tun, geben Sie bitte <strong>'Ich verstehe'</strong> in das Feld unten ein. + + + + I understand + Ich verstehe + + + + Next + Weiter + + + + Enter the same password to confirm + Geben Sie zur Bestätigung dasselbe Kennwort ein + + + + Continue + Fortsetzen + + + + LinksRow + + + Join our Discord server + Tritt unserem Discord-Server bei + + + + Follow us on Twitter + Folge uns auf Twitter + + + + Go to Support Guides + Zu den Support-Leitfäden + + + + List + + + Funds are recoverable + Geldmittel sind erstattungsfähig + + + + Best Orders + Die günstigsten Aufträge + + + + Enter volume to see best orders. + + + + + ListDelegate + + + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + %1 ist nicht aktiviert - Möchten Sie es aktivieren, um die günstigsten Aufträge von %2 auswählen zu können? <br><a href='#'>Ja</a> - <a href='#no'>Nein</a> + + + + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 + Für diesen Auftrag ist ein Mindestbetrag von %1 %2 erforderlich. <br>Ihr Guthaben reicht nicht aus.<br> %3 + + + + LogModal + + + Close + Schließen + + + + Logging + + + Loading, please wait + Lädt, bitte warten + + + + Initializing MM2 + MM2 initialisieren + + + + Enabling assets + Assets ermöglichen + + + + Getting ready + Fertig werden + + + + Login + + + Incorrect Password + Falsches Kennwort + + + + Log In + Anmelden + + + + Cancel + Abbrechen + + + + LogoutModal + + + Exit %1 or go to login menu? + + + + + Warning: You currently have a swap in progress. +Logging out may result in a failed swap. + + + + + Warning: You currently have open maker orders. +They will be removed from the orderbook until you log in again. + + + + + Login menu + + + + + Exit + + + + + Cancel + Abbrechen + + + + Main + + + Segwit + Segwit + + + + Confirmation + Bestätigung + + + + Do you want to send your %1 funds to %2 wallet first? + Möchten Sie Ihr %1-Guthaben zuerst an die %2-Brieftasche senden? + + + + Success + Erfolg + + + + Your transaction is send, may take some time to arrive + Ihre Transaktion wird gesendet, es kann einige Zeit dauern, bis sie ankommt + + + + Price + Preis + + + + Change 24hr + 24h Veränderung + + + + Porfolio + Portfolio + + + + Contract Address + Vertragsadresse + + + + Send + Senden + + + + Enable %1 ? + %1 aktivieren? + + + + Yes + Ja + + + + No + Nein + + + + Receive + Empfangen + + + + Swap + Tausch + + + + is wallet only + nur Brieftasche (kein DEX möglich) + + + + Rewards + Belohnungen + + + + Faucet + Faucet + + + + + + Public Key + Öffentlicher Schlüssel + + + + Copied to Clipboard + In die Zwischenablage kopiert + + + + Loading market data + Laden von Marktdaten + + + + There is no chart data for this ticker yet + Für diesen Ticker liegen noch keine Chartdaten vor + + + + Fetching transactions... + Transaktionen werden abgerufen... + + + + Please wait, %1 is %2 + + + + + % activated... + + + + + No transactions available + Keine Transaktionen verfügbar + + + + Click to view your address on %1 (%2) block explorer + Klicken Sie hier, um Ihre Adresse im %1 (%2) Block-Explorer anzuzeigen + + + + Trade + Handeln + + + + Trading Information + Handelsinformationen + + + + Chart + Chart + + + + + Orders + Auftrag + + + + + History + Historie + + + + Place Order + Auftrag platzieren + + + + Order Selected + Auftrag ausgewählt + + + + START SWAP + TAUSCH STARTEN + + + + + Address Book + Adressbuch + + + + Search contact + Kontakt suchen + + + + + NEW CONTACT + + Neuer Kontakt + + + + Name + Name + + + + Tags + Schlagworte + + + + Edit + Bearbeiten + + + + Delete + Löschen + + + + address copied to clipboard + Adresse in die Zwischenablage kopiert + + + + This contact does not have any registered address. + Dieser Kontakt hat keine registrierte Adresse. + + + + MarketModeSelector + + + Sell %1 + TICKER + %1 Verkaufen + + + + Buy %1 + TICKER + %1 Kaufen + + + + MinTradeModal + + + Minimum Trading Amount + Mindesthandelsbetrag + + + + the minimum amount of %1 coin available for the order; the min_volume must be greater than or equal to %2; it must be also less or equal than volume param; default is %3 + die Mindestmenge von %1 Coin, die für die Bestellung verfügbar ist; das min_volume muss größer oder gleich %2 sein; es muss auch kleiner oder gleich als volume param sein; Standard ist %3 + + + + MultiOrder + + + %1 price is zero! + TICKER + %1 Preis ist null! + + + + %1 receive volume is lower than minimum trade amount + TICKER + %1 Empfangsvolumen ist niedriger als der Mindesthandelsbetrag + + + + Error: + Fehler: + + + + You'll receive %1 + AMOUNT TICKER + Sie erhalten %1 + + + + Price + Preis + + + + NewContactPopup + + + Contact name + Kontaktname + + + + This contact name already exists. + Dieser Kontaktname existiert bereits. + + + + + ADD + + HINZUFÜGEN + + + + NewUpdateModal + + + + + Searching new updates + Suche nach neuen Updates + + + + Fetching... + Abrufen… + + + + + + + Close + Schließen + + + + Could not check new updates for the following reason: +%1 + Neue Updates konnten aus folgendem Grund nicht überprüft werden: %1 + + + + New version found + Neue Version gefunden + + + + Mandatory version found + Zwingend notwendige Version gefunden + + + + %1 %2 is available ! + %1 %2 ist verfügbar ! + + + + This update is mandatory to continue using the application + Dieses Update ist zwingend erforderlich, um die Anwendung weiterhin verwenden zu können + + + + Close Dex + Dex schließen + + + + Your application is updated. + Ihre Anwendung ist auf dem neuesten Stand. + + + + Download + Herunterladen + + + + NewWallet + + + Wrong word, please check again + Falsches Wort, bitte überprüfen Sie es erneut + + + + st + . + + + + nd + . + + + + rd + . + + + + th + . + + + + Failed to create a wallet + Anlegen einer Brieftasche ist fehlgeschlagen + + + + New Wallet + Neue Brieftasche + + + + Confirm Seed + Seed bestätigen + + + + Choose Password + Wählen sie ein Kennwort + + + + Important: Back up your seed phrase before proceeding! + Wichtig: Sichern Sie Ihre Seed-Phrase, bevor Sie fortfahren! + + + + We recommend storing it offline. + Wir empfehlen, sie offline zu speichern. + + + + Generated Seed + Generierter Seed + + + + Seed phrase + Seed Phrase + + + + copied to clipboard + In die Zwischenablage kopiert + + + + Next + Weiter + + + + Let's double check your seed phrase + Lassen Sie uns Ihre Seed-Phrase noch einmal überprüfen + + + + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. + Ihre Seed-Phrase ist wichtig – deshalb stellen wir gerne sicher, dass sie korrekt ist. Wir stellen Ihnen drei verschiedene Fragen zu Ihrer Seed-Phrase, um sicherzustellen, dass Sie Ihre Wallet jederzeit problemlos wiederherstellen können. + + + + Enter the + Geben Sie das + + + + word + Wort ein + + + + Check + Prüfen + + + + Enter the same password to confirm + Geben Sie zur Bestätigung dasselbe Kennwort ein + + + + Continue + Fortsetzen + + + + NoConnection + + + No connection + Keine Verbindung + + + + Please make sure you are connected to the internet + Bitte stellen Sie sicher, dass Sie mit dem Internet verbunden sind + + + + Will automatically retry in %1 seconds + Wird in %1 Sekunde(n) automatisch erneut versucht + + + + Retry + Wiederholen + + + + NotificationsModal + + + Matching + Zusammenführung + + + + Order Matching + Auftrag wird abgeglichen + + + + Matched + Abgestimmt + + + + Order Matched + Auftrag wurde abgestimmt + + + + Ongoing + Läuft + + + + Swap Ongoing + Austausch läuft + + + + Successful + Erfolgreich + + + + Swap Successful + Tausch erfolgreich + + + + Refunding + Rückzahlung + + + + Failed + Fehlgeschlagen + + + + Swap Failed + Tausch fehlgeschlagen + + + + Unknown + Unbekannt + + + + Unknown State + Unbekannter Status + + + + Swap status updated + Austausch-Status aktualisiert + + + + You sent %1 + Sie %1 haben gesendet + + + + You received %1 + Sie %1 haben erhalten + + + + Your wallet balance changed + Ihr Guthaben hat sich geändert + + + + %1 Enable status + TICKER + + + + + Please check your internet connection (e.g. VPN service or firewall might block it). + Bitte überprüfen Sie Ihre Internetverbindung (z. B. könnte VPN-Dienst oder Firewall sie blockieren). + + + + Failed to enable %1 + TICKER + Aktivierung von %1 fehlgeschlagen + + + + Failed to disable %1 + TICKER + + + + + Endpoint not reachable + Endpunkt nicht erreichbar + + + + Could not reach to endpoint + Endpunkt konnte nicht erreicht werden + + + + Mismatch at %1 custom asset configuration + TICKER + Nichtübereinstimmung bei benutzerdefinierter Konfiguration des %1 Asset + + + + Application needs to be restarted for %1 custom asset. + TICKER + Die Anwendung muss für benutzerdefiniertes Asset %1 neu gestartet werden. + + + + Batch %1 failed. Reason: %2 + Batch %1 fehlgeschlagen. Grund: %2 + + + + Show + Zeigen + + + + Restart + Neustart + + + + Quit + Beenden + + + + Notifications + Benachrichtigungen + + + + There aren't any notifications + Es gibt keine Benachrichtigungen + + + + Mark all as read + Alle als gelesen makieren + + + + OrderForm + + + Price + Preis + + + + Reduce 1% relative to CEX market price. + + + + + Use CEX market price. + + + + + Increase 1% relative to CEX market price. + + + + + Volume + Volumen + + + + Amount to sell + Zu verkaufender Betrag + + + + Amount to receive + Zu erhaltender Betrag + + + + Max + Max + + + + Swap 25% of your tradable balance. + + + + + Swap 50% of your tradable balance. + + + + + Swap 100% of your tradable balance. + + + + + Min Volume + + + + + Min amount to sell + + + + + Min amount to receive + + + + + Minimum accepted trade equals 10% of order volume. + + + + + Minimum accepted trade equals 25% of order volume. + + + + + Minimum accepted trade equals 50% of order volume. + + + + + Min volume: + Mindestvolumen: + + + + Use custom minimum trade amount + Benutzerdefinierten Mindesthandelsbetrag verwenden + + + + OrderLine + + + Funds are recoverable + Geldmittel sind erstattungsfähig + + + + OrderList + + + No results found + Keine Ergebnisse gefunden + + + + OrderModal + + + Swap Details + Tauschdetails + + + + Order Details + Auftragsdetails + + + + Order Type + Auftragsart + + + + Maker Order + Maker-Auftrag + + + + Taker Order + Taker-Auftrag + + + + Refund State + Rückerstattungsstatus + + + + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back + Ihr Umtausch ist fehlgeschlagen, aber der automatische Rückerstattungsprozess für Ihre Zahlung hat bereits begonnen. Bitte warten Sie und lassen Sie die Anwendung geöffnet, bis Sie Ihre Zahlung zurückerhalten + + + + Date + Datum + + + + Error ID + Fehler-ID + + + + + Error Log + Fehlerprotokoll + + + + Close + Schließen + + + + Cancel Order + Auftrag Abbrechen + + + + + Swap ID + Swap ID + + + + Maker Payment Sent Transaction ID + Maker-Zahlung gesendet: Transaktions-ID + + + + Maker Payment Spent Transaction ID + Maker-Zahlung ausgegeben: Transaktions-ID + + + + Maker Payment TXID + Maker-Zahlung: TXID + + + + Taker Payment Spent Transaction ID + Taker-Zahlung ausgegeben: Transaktions-ID + + + + Taker Payment Sent Transaction ID + Taker-Zahlung gesendet: Transaktions-ID + + + + Taker Payment TXID + Taker-Zahlung: TXID + + + + Recover Funds + Rückerstattung der Geldmittel + + + + Refunding... + Rückzahlung… + + + + View on Explorer + Ansicht im Explorer + + + + OrderRemovedModal + + + Selected Order Removed + Ausgewählten Auftrag entfernt + + + + The selected order does not exist anymore, it might have been matched or canceled, and no order with a better price is available. +Please select a new order. + Der ausgewählte Auftrag existiert nicht mehr! Er wurde möglicherweise zugeordnet oder storniert und es ist kein Auftrag mit einem besseren Preis verfügbar. +Bitte wählen Sie einen neuen Auftrag aus. + + + + OK + OK + + + + OrdersPage + + + + Filter + Filter + + + + Date + Datum + + + + Export CSV + CSV exportieren + + + + Apply Filter + Filter anwenden + + + + Cancel All + Alles stornieren + + + + From + Von + + + + To + Bis + + + + Please choose the CSV export name and location + Bitte wählen Sie den CSV-Exportnamen und den Speicherort aus + + + + Pagination + + + items per page + Elemente pro Seite + + + + PasswordField + + + Password + Kennwort + + + + Enter your wallet password + Geben Sie das Kennwort für ihre Brieftasche ein + + + + At least 1 lowercase alphabetical character + Mindestens 1 Kleinbuchstabe + + + + At least 1 uppercase alphabetical character + Mindestens 1 Großbuchstabe + + + + At least 1 numeric character + Mindestens 1 Ziffer + + + + At least 1 special character (eg. !@#$%) + Mindestens 1 Sonderzeichen (z. B. ! @ # $ %) + + + + Between %1 and %2 character(s) + + + + + PasswordForm + + + Password + Kennwort + + + + Confirm Password + Kennwort bestätigen + + + + Enter the same password to confirm + Geben Sie zur Bestätigung dasselbe Kennwort ein + + + + Portfolio + + + ADD ASSET + ASSET HINZUFÜGEN + + + + Search asset + Asset suchen + + + + Show only coins with balance + Nur Coins mit Guthaben anzeigen + + + + (%1/%2) + (%1/%2) + + + + Portfolio + Portfolio + + + + PriceLine + + + Set swap price for evaluation + Legen Sie den Tausch-Preis für die Bewertung fest + + + + Exchange rate + Wechselkurs + + + + Selected + Ausgewählt + + + + Expensive + Teuer + + + + Expedient + Sinnvoll + + + + %1 compared to CEX + PRICE_DIFF% + %1 im Vergleich zu CEX + + + + CEXchange rate + CEX-Wechselkurs + + + + PriceLineSimplified + + + Exchange rate + Wechselkurs + + + + Selected + Ausgewählt + + + + CEXchange rate + CEX-Wechselkurs + + + + Expensive + Teuer + + + + Expedient + Sinnvoll + + + + %1 compared to CEX + PRICE_DIFF% + %1 im Vergleich zu CEX + + + + ProView + + + Failed to place the order + Der Auftrag konnte nicht platziert werden + + + + Placed the order + Auftrag platziert + + + + QObject + + + Cannot reach the endpoint: + Der Endpunkt kann nicht erreicht werden: + + + + ReceiveModal + + + Receive %1 + TICKER + + + + + Only send %1 to this address + TICKER + + + + + %1 address + TICKER + + + + + copied to clipboard. + In die Zwischenablage kopiert + + + + Close + Schließen + + + + RecoverSeedModal + + + + View seed and private keys + Seed- und privaten Schlüsseln anzeigen + + + + Please enter your password to view the seed. + Bitte geben Sie Ihr Kennwort ein, um den Seed anzuzeigen. + + + + Seed + Seed + + + + Backup Seed + Seed Sicherung + + + + Public Address copied to clipboard + Öffentliche Adresse in die Zwischenablage kopiert + + + + Cancel + Abbrechen + + + + Incorrect Password + Falsches Kennwort + + + + View + Ansehen + + + + + copied to clipboard + In die Zwischenablage kopiert + + + + + RPC Password + RPC Kennwort + + + + Search a coin. + Coin suchen. + + + + Public Address + Öffentliche Adresse + + + + Private Key copied to clipboard + Privater Schlüssel in die Zwischenablage kopiert + + + + Private Key + Privater Schlüssel + + + + RemoveContactPopup + + + Do you want to remove this contact ? + Möchten Sie diesen Kontakt entfernen? + + + + Yes + Ja + + + + No + Nein + + + + RestartModal + + + Applying the changes... + Übernehmen der Änderungen... + + + + Restarting the application. %1 + Neustart der Anwendung. %1 + + + + Restarting the application... + Neustart der Anwendung... + + + + RightClickMenu + + + Cut + Ausschneiden + + + + Copy + Kopieren + + + + Paste + Einfügen + + + + SearchField + + + Search + Suchen + + + + SendModal + + + Failed to send + Fehler beim Senden + + + + Prepare to send + Versandvorbereitung von + + + + Address of the recipient + Adresse des Empfängers + + + + Amount to send + Zu sendender Betrag + + + + Gas price + Gas Preis + + + + Recipient's address + Empfängeradresse + + + + The address has to be mixed case. + Die Adresse muss Groß-/Kleinschreibung sein. + + + + Failed to Broadcast + + + + + Fix + Korrigieren + + + + MAX + MAX + + + + Fiat amount: Unavailable + Fiat-Betrag: Nicht verfügbar + + + + Fiat amount: %1 + Fiat-Betrag: %1 + + + + %1 amount: %2 + %1 Betrag: %2 + + + + Specify in Fiat + In Fiat angeben + + + + Specify in Crypto + In Krypto angeben + + + + Enable Custom Fees + Benutzerdefinierte Gebühren + + + + Enter the custom fee + Geben Sie die benutzerdefinierte Gebühr ein + + + + Gas Limit + Gas Limit + + + + Custom Fee can't be higher than the amount + Die benutzerdefinierten Gebühren dürfen nicht höher sein als der Betrag + + + + Not enough funds. + Nicht genug Geldmittel. + + + + + You have %1 + AMT TICKER + Sie haben %1 + + + + + Only use custom fees if you know what you are doing! + + + + + Close + Schließen + + + + Prepare + Vorbereiten + + + + + Send + Senden + + + + %1 address + TICKER + + + + + copied to clipboard. + In die Zwischenablage kopiert + + + + Amount + Menge + + + + Fees + Gebühren + + + + Date + Datum + + + + Back + Zurück + + + + SendModalContactList + + + Select a contact with an %1 address + Wählen Sie einen Kontakt mit einer %1-Adresse aus + + + + Search for contacts... + Kontakte suchen... + + + + %1 addresses + %1 Adressen + + + + 1 address + 1 Adresse + + + + + Back + Zurück + + + + Choose an %1 address of %2 + Wählen Sie eine %1-Adresse von %2 + + + + Name + Name + + + + Address + Adresse + + + + SendResult + + + Transaction Complete! + Transaktion abgeschlossen! + + + + %1 txid + TICKER + + + + + + copied to clipboard. + In die Zwischenablage kopiert + + + + Recipient's address + Empfängeradresse + + + + %1 address + TICKER + + + + + Amount + Menge + + + + Fees + Gebühren + + + + Date + Datum + + + + Transaction Hash + Transaktions-Hash + + + + Close + Schließen + + + + View on Explorer + Ansicht im Explorer + + + + SettingModal + + + + Cancel + Abbrechen + + + + Settings + Einstellungen + + + + General + Allgemein + + + + Language + Sprache + + + + User Interface + Benutzeroberfläche + + + + Security + Sicherheit + + + + Enable Desktop Notifications + Desktop-Benachrichtigungen aktivieren + + + + Maximum number of enabled coins + Maximale Anzahl aktivierter Coins + + + + Logs + Protokolle + + + + Open Folder + Ordner öffnen + + + + Reset + Zurücksetzen + + + + Current Font + Aktuelle Schriftart + + + + Current font changed to %1. + Aktuelle Schriftart in %1 geändert. + + + + Theme + Thema + + + + Changing theme to %1 + Design zu %1 geändert + + + + Disable 2FA? + 2FA deaktivieren? + + + + Enter your wallet password to confirm + Geben Sie zur Bestätigung das Kennwort ihrer Brieftasche ein + + + + Type password + Kennwort eingeben + + + + 2FA status + 2FA Status + + + + 2FA disabled successfully + 2FA erfolgreich deaktiviert + + + + + Ok + Ok + + + + Wrong password! + Falsches Kennwort! + + + + Wallet password is incorrect + Kennwort der Brieftasche ist falsch + + + + Application Version + Anwendungsversion + + + + copied to clipboard + In die Zwischenablage kopiert + + + + About & Version + Über & Version + + + + + Reset wallet configuration + Konfiguration der Brieftasche zurücksetzen + + + + This will restart your wallet with default settings + Dadurch wird Ihre Brieftasche mit den Standardeinstellungen neu gestartet + + + + + Confirm + Bestätigen + + + + Ask system's password before sending coins ? (2FA) + Vor dem Senden von Coins nach dem Kennwort des Systems fragen? (2FA) + + + + View seed and private keys + Seed- und privaten Schlüsseln anzeigen + + + + + Show + Zeigen + + + + Setup Camouflage Password + Tarnkennwort einrichten + + + + Open + Öffnen + + + + Disclaimer and ToS + Haftungsausschluss und Nutzungsbedingungen + + + + Application version + Anwendungsversion + + + + MM2 version + MM2 Version + + + + MM2 Version + MM2 Version + + + + MM2 Version copied to clipboard. + MM2 Version in die Zwischenablage kopiert. + + + + Qt version + Qt Version + + + + Qt Version + Qt Version + + + + Qt Version copied to clipboard. + Qt Version in die Zwischenablage kopiert. + + + + Search Update + Update suchen + + + + Logout + Abmelden + + + + Sidebar + + + Search + Suchen + + + + Add asset + Asset hinzufügen + + + + SmartChartView + + + Loading market data + Laden von Marktdaten + + + + There is no chart data for this ticker yet + Für diesen Ticker liegen noch keine Chartdaten vor + + + + SubBestOrder + + + Token + Token + + + + Available Quantity + Verfügbare Menge + + + + Available Quantity (in %1) + Verfügbare Menge (in %1) + + + + Fiat Volume + Fiat Volumen + + + + CEX Rate + CEX-Kurs + + + + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + %1 ist nicht aktiviert - Möchten Sie es aktivieren, um die günstigsten Aufträge von %2 auswählen zu können? <br><a href='#'>Ja</a> - <a href='#no'>Nein</a> + + + + SubCoinSelector + + + Token + Token + + + + Balance + Balance + + + + Balance Fiat + Fiat Balance + + + + No Selectable coin. + Kein wählbarer Coin. + + + + SubHistory + + + History + Historie + + + + Filter + Filter + + + + Date + Datum + + + + Close filtering options. + Filteroptionen schließen. + + + + Open filtering options. + Filteroptionen öffnen. + + + + Filter settings + Filtereinstellungen + + + + From + Von + + + + To + Bis + + + + Cancel + Abbrechen + + + + Apply filter + Filter anwenden + + + + Export + Exportieren + + + + Please choose the CSV export name and location + Bitte wählen Sie den CSV-Exportnamen und den Speicherort aus + + + + No results found + Keine Ergebnisse gefunden + + + + SubOrders + + + + Orders + Auftrag + + + + Close filtering options. + Filteroptionen schließen. + + + + Filter + Filter + + + + Date + Datum + + + + Open filtering options. + Filteroptionen öffnen. + + + + Filter settings + Filtereinstellungen + + + + From + Von + + + + To + Bis + + + + Cancel + Abbrechen + + + + Apply filter + Filter anwenden + + + + No results found + Keine Ergebnisse gefunden + + + + SupportModal + + + Frequently Asked Questions + Häufig gestellte Fragen + + + + Do you store my private keys? + Speichern Sie meine privaten Schlüssel? + + + + No! %1 is non-custodial. We never store any sensitive data, including your private keys, seed phrases, or PIN. This data is only stored on the user’s device and never leaves it. You are in full control of your assets. + Nein! %1 hat keine Vormundschaft. Wir speichern niemals sensible Daten, einschließlich Ihrer privaten Schlüssel, Seed-Phrasen oder PINs. Diese Daten werden nur auf dem Gerät des Benutzers gespeichert und verlassen es nie. Sie haben die volle Kontrolle über Ihr Vermögen. + + + + How is trading on %1 different from trading on other DEXs? + Wie unterscheidet sich der Handel auf %1 vom Handel auf anderen DEXs? + + + + Other DEXs generally only allow you to trade assets that are based on a single blockchain network, use proxy tokens, and only allow placing a single order with the same funds. + +%1 enables you to natively trade across two different blockchain networks without proxy tokens. You can also place multiple orders with the same funds. For example, you can sell 0.1 BTC for KMD, QTUM, or VRSC — the first order that fills automatically cancels all other orders. + Bei anderen DEXs können Sie im Allgemeinen nur Assets handeln, die auf einem einzigen Blockchain-Netzwerk basieren, Proxy-Token verwenden und nur einen einzigen Auftrag mit denselben Geldmitteln aufgeben. + +%1 ermöglicht Ihnen den nativen Handel über zwei verschiedene Blockchain-Netzwerke ohne Proxy-Token. Sie können auch mehrere Aufträge mit demselben Guthaben aufgeben. Sie können beispielsweise 0,1 BTC für KMD, QTUM oder VRSC verkaufen – die erste Order, die automatisch ausgeführt wird, storniert alle anderen Orders. + + + + How long does each atomic swap take? + Wie lange dauert ein Atomic Swap? + + + + Several factors determine the processing time for each swap. The block time of the traded assets depends on each network (Bitcoin typically being the slowest) Additionally, the user can customize security preferences. For example, (you can ask %1 to consider a KMD transaction as final after just 3 confirmations which makes the swap time shorter compared to waiting for a <a href="https://komodoplatform.com/security-delayed-proof-of-work-dpow/">notarization</a>. + Mehrere Faktoren bestimmen die Bearbeitungszeit für einen Swap. Die Blockzeit der gehandelten Assets hängt vom jeweiligen Netzwerk ab (Bitcoin ist normalerweise das langsamste). Außerdem kann der Benutzer die Sicherheitseinstellungen anpassen. Zum Beispiel (können Sie %1 bitten, eine KMD-Transaktion nach nur 3 Bestätigungen als endgültig zu betrachten, wodurch die Tauschzeit kürzer wird als beim Warten auf eine <a href="https://komodoplatform.com/security-delayed-proof-of-work-dpow/">Beglaubigung </a>). + + + + Do I need to be online for the duration of the swap? + Muss ich für die Dauer des Austauschs online sein? + + + + Yes. You must remain connected to the internet and have your app running to successfully complete each atomic swap (very short breaks in connectivity are usually fine). Otherwise, there is risk of trade cancellation if you are a maker, and risk of loss of funds if you are a taker. + +The atomic swap protocol requires both participants to stay online and monitor the involved blockchains for the process to stay atomic. + +If you go offline, so will your orders, and any that are in progress will fail, leading to potential loss of trade / transaction fees, and a wait for the swap to timeout and issue a refund. It may also negatively affect your wallet's reputation score for future trade matching. + +When you come back online, your orders will begin to broadcast again at the price you set before you went offline. If there has been significant price movement in the meantime, you might unintentionally offer someone a bargain! + +For this reason, we recommend cancelling orders before closing %1, or reviewing and revising your prices when restarting %1. + Ja. Sie müssen mit dem Internet verbunden bleiben und die App ausführen, um jeden Atomic Swap erfolgreich abzuschließen (sehr kurze Verbindungsunterbrechungen sind normalerweise in Ordnung). Andernfalls besteht das Risiko einer Auftragsstornierung, wenn Sie ein Maker sind, und das Risiko eines Geldverlusts, wenn Sie ein Taker sind. + +Das Atomic-Swap-Protokoll erfordert, dass beide Teilnehmer online bleiben und die beteiligten Blockchains überwachen, damit der Prozess atomar bleibt. + +Wenn Sie offline gehen, werden Ihre offenen und laufenden Aufträge fehlschlagen, was zu einem potenziellen Verlust von Handels-/Transaktionsgebühren und einem Warten auf das Timeout des Swaps und die Ausstellung einer Rückerstattung führen kann. Es kann sich auch negativ auf den Reputationswert Ihrer Brieftasche für zukünftige Handelsabgleiche auswirken. + +Wenn Sie wieder online gehen, werden Ihre Aufträge wieder zu dem Preis übertragen, den Sie festgelegt haben, bevor Sie offline gegangen sind. Wenn es in der Zwischenzeit zu erheblichen Preisbewegungen gekommen ist, könnten Sie jemandem unbeabsichtigt ein Schnäppchen anbieten! + +Aus diesem Grund empfehlen wir,Aufträge vor dem Schließen von %1 zu stornieren oder Ihre Preise zu überprüfen und zu überarbeiten, wenn Sie %1 neu starten. + + + + How are the fees on %1 calculated? + Wie werden die Gebühren für %1 berechnet? + + + + There are two fee categories to consider when trading on %1. + +1. %1 charges approximately 0.13% (1/777 of trading volume but not lower than 0.0001) as the trading fee for taker orders, and maker orders have zero fees. + +2. Both makers and takers will need to pay normal network fees to the involved blockchains when making atomic swap transactions. + +Network fees can vary greatly depending on your selected trading pair. + Beim Handel von %1 sind zwei Gebührenkategorien zu berücksichtigen. + +1. %1 berechnet ungefähr 0,13 % (1/777 des Handelsvolumens, aber nicht weniger als 0,0001) als Handelsgebühr für Taker-Orders, Maker-Orders haben keine Gebühren. + +2. Sowohl Maker als auch Taker müssen normale Netzwerkgebühren an die beteiligten Blockchains zahlen, wenn sie Atomic-Swap-Transaktionen durchführen. + +Die Netzwerkgebühren können je nach ausgewähltem Handelspaar stark variieren. + + + + Do you provide user support? + Bieten Sie Benutzerunterstützung an? + + + + Yes! %1 offers support through the <a href="%2">%1 Discord server</a>. The team and the community are always happy to help! + Ja! %1 bietet Support über den <a href="%2">%1 Discord server</a>. Das Team und die Community helfen Euch gerne weiter! + + + + Who is behind %1? + Wer steckt hinter %1? + + + + %1 is developed by the Komodo team. Komodo is one of the most established blockchain projects working on innovative solutions like atomic swaps, Delayed Proof of Work, and an interoperable multi-chain architecture. + %1 wird vom Komodo-Team entwickelt. Komodo ist eines der etabliertesten Blockchain-Projekte, das an innovativen Lösungen wie Atomic Swaps, Delayed Proof of Work und einer interoperablen Multi-Chain-Architektur arbeitet. + + + + Is it possible to develop my own white-label exchange on %1? + Ist es möglich, meine eigene White-Label-Börse auf %1 zu entwickeln? + + + + Absolutely! You can read our developer documentation for more details or contact us with your partnership inquiries. Have a specific technical question? The %1 developer community is always ready to help! + Auf jeden Fall! Sie können unsere Entwicklerdokumentation für weitere Details lesen oder uns mit Ihren Partnerschaftsanfragen kontaktieren. Haben Sie eine spezielle technische Frage? Die %1-Entwicklercommunity ist immer bereit zu helfen! + + + + Which devices can I use %1 on? + Auf welchen Geräten kann ich %1 verwenden? + + + + %1 is available for mobile on both <a href="%2">Android and iPhone, and for desktop on Windows, Mac, and Linux</a> operating systems. + %1 ist auf Mobilgeräte für <a href="%2">Android und iPhone sowie auf dem Desktop für Windows, Mac und Linux</a> Betriebssystemen erhältlich. + + + + Compliance Info + Compliance-Informationen + + + + Due to regulatory and legal circumstances the citizens of certain jurisdictions including, but not limited to, the United States of America, Canada, Hong Kong, Israel, Singapore, Sudan, Austria, Iran and any other state, country or other jurisdiction that is embargoed by the United States of America or the European Union are not allowed to use this application. + Aufgrund regulatorischer und rechtlicher Umstände sind die Bürger bestimmter Gerichtsbarkeiten, einschließlich, aber nicht beschränkt auf, der Vereinigten Staaten von Amerika, Kanada, Hongkong, Israel, Singapur, Sudan, Österreich, Iran und alle anderen Staaten, Länder oder anderen Gerichtsbarkeiten, die mit einem Embargo von den Vereinigten Staaten von Amerika oder der Europäischen Union belegt sind, dürfen diese Anwendung nicht verwenden. + + + + Changelog + Änderungsprotokoll + + + + Open Logs Folder + Protokollordner öffnen + + + + SwapProgress + + + act + SHORT FOR ACTUAL TIME + tatsächlich + + + + est + SHORT FOR ESTIMATED + geschätzt + + + + Progress details + Fortschrittsdetails + + + + TextAreaWithTitle + + + Save + Speichern + + + + Edit + Bearbeiten + + + + TextEditWithCopy + + + copied to clipboard + In die Zwischenablage kopiert + + + + TextEditWithTitle + + + copied to clipboard + In die Zwischenablage kopiert + + + + TextFieldWithTitle + + + Required + Erforderlich + + + + Toast + + + Click here to see the details + Klicken Sie hier, um die Details anzuzeigen + + + + Trade + + + Swap + Tauschen + + + + Instant trading with best orders + Sofortiger Handel mit den besten Aufträgen + + + + Reset form + Formular zurücksetzen + + + + You have no tradable assets + Keine handelbaren Assets vorhanden + + + + From + Von + + + + Enter an amount + Betrag eingeben + + + + MAX + MAX + + + + To + Nach + + + + Pick an order + Auftrag auswählen + + + + Price + Preis + + + + Better price found: %1. Updating forms. + Besseren Preis gefunden: %1. Formulare aktualisieren. + + + + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. + Besseren Preis (%1) gefunden, aber erhaltene Menge (%2) ist niedriger als Ihre aktuelle (%3). Klicken Sie hier, um den ausgewählten Auftrag zu aktualisieren. + + + + %1 + %1 + + + + Tradable: + Handelbar: + + + + Min: %1 + Minimum: %1 + + + + Pick a coin + Wählen Sie einen Coin + + + + SWAP NOW + JETZT TAUSCHEN + + + + Failed to place the order + Der Auftrag konnte nicht platziert werden + + + + Placed the order + Auftrag platziert + + + + Entered amount must be superior than 0. + Der eingegebene Betrag muss größer als 0 sein. + + + + You must select an order. + Sie müssen einen Auftrag auswählen. + + + + Entered amount is below the minimum required by this order: %1 + Der eingegebene Betrag liegt unter dem für diesen Auftrag erforderlichen Mindestbetrag: %1 + + + + + %1 needs to be enabled in order to use %2 + %1 muss aktiviert werden, um %2 verwenden zu können + + + + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions + Das %1 Guthaben muss finanziert werden, ein Guthaben größer Null ist erforderlich, um das Benzin von %2 Transaktionen zu bezahlen + + + + %1 balance does not have enough funds to pay the gas of %2 transactions + Das Guthaben von %1 reicht nicht aus, um das Gas von %2 Transaktionen zu bezahlen + + + + No buy orders found for %1. + Keine Kaufaufträge für %1 gefunden. + + + + You can check later or try to sell a different coin. + Sie können später nachsehen oder versuchen, einen anderen Coin zu verkaufen. + + + + Calculating fee estimate... + Geschätzten Gebühren werden berechnet... + + + + Total %1 fees: + %1 Gesamtgebühren: + + + + %2 (%3) + %2 (%3) + + + + TradeViewHeader + + + Pro View Settings + Pro-Ansicht Einstellungen + + + + Display Settings + Bildschirmeinstellungen + + + + Ticker Selectors + Ticker Selektoren + + + + Trading Information + Handelsinformationen + + + + Order Book + Auftragsbuch + + + + Best Orders + Besten Aufträge + + + + Place Order + Auftrag platzieren + + + + TransactionDetailsModal + + + Transaction Details + Transaktionsdetails + + + + Amount + Menge + + + + Fees + Gebühren + + + + Date + Datum + + + + Unconfirmed + Unbestätigt + + + + Transaction Hash + Transaktions-Hash + + + + Confirmations + Bestätigungen + + + + Block Height + Blockhöhe + + + + From + Von + + + + %1 txid + TICKER + + + + + copied to clipboard. + In die Zwischenablage kopiert + + + + From address + Von Adresse + + + + To + Nach + + + + To address + Nach Adresse + + + + Notes + Anmerkungen + + + + Close + Schließen + + + + View on Explorer + Ansicht im Explorer + + + + Transactions + + + Sent + Gesendet + + + + Received + Erhalten + + + + fees + Gebühren + + + + Unconfirmed + Unbestätigt + + + + UpdateInvalidChecksum + + + The downloaded update archive is corrupted ! + Das heruntergeladene Update-Archiv ist beschädigt! + + + + Vertical + + + Order Book + Auftragsbuch + + + + WalletsView + + + Welcome + Herzlich Willkommen + + + + New wallet + Neue Brieftasche + + + + Import wallet + Brieftasche importieren + + + + Search your wallets... + Brieftaschen durchsuchen ... + + + + My Wallets + Meine Brieftaschen + + + + No wallets found! + Keine Brieftaschen gefunden! + + + + + Delete + Löschen + + + + Enter password to confirm deletion of + Geben Sie das Kennwort ein, um das Löschen zu bestätigen + + + + wallet + Brieftasche + + + + Type password + Kennwort eingeben + + + + Cancel + Abbrechen + + + + + Wallet status + Status der Brieftasche + + + + wallet deleted successfully + Brieftasche erfolgreich gelöscht + + + + + Ok + Ok + + + + wallet password is incorrect + Kennwort der Brieftasche ist falsch + + + + ZcashParamsModal + + + %1 Activation Failed! + + + + + To activate ZHTLC coins, you need to download the Zcash Params. +This might take a few minutes... + + + + + Download params & enable coins + + + + + More Info + + + + + Close + Schließen + + + + atomic_dex::settings_page + + + An error has occurred. + + + + + atomic_dex::wallet_page + + + You do not have enough funds. + Sie haben nicht genügend Kapital. + + + + %1 is not activated: click on the button to enable it or enable it manually + %1 ist nicht aktiviert: Klicken Sie auf die Schaltfläche, um es zu aktivieren, oder aktivieren Sie es manuell + + + + You need to have %1 to pay the gas for %2 transactions. + Sie benötigen %1, um das Benzin für %2 Transaktionen zu bezahlen. + + + + Checksum verification failed for %1. + Überprüfung der Prüfsumme für %1 fehlgeschlagen. + + + + Invalid checksum for %1. Click the button to convert to mixed case address. + Ungültige Prüfsumme für %1. Klicken Sie auf die Schaltfläche, um die Adresse in Groß-/Kleinschreibung umzuwandeln. + + + + Legacy address used for %1. Click the button to convert to a Cashaddress. + Legacy-Adresse für %1 verwendet. Klicken Sie auf die Schaltfläche, um sie in eine Cashadresse umzuwandeln. + + + + %1 address must be prefixed with 0x + %1 Adresse muss 0x vorangestellt werden + + + + %1 address length is invalid, please use a valid address. + Länge der %1 Adresse ist ungültig, bitte verwenden Sie eine gültige Adresse. + + + + %1 address is invalid. + %1 Adresse ist ungültig. + + + + Invalid checksum. + Ungültige Prüfsumme. + + + + %1 address has invalid prefixes. + %1 Adresse hat ungültige Vorsilben. + + + + Backend error: %1 + Backend Fehler: %1 + + + + main + + + Logout + Abmelden + + + + Balance + Balance + + + diff --git a/atomic_defi_design/assets/languages/atomic_defi_en.ts b/atomic_defi_design/assets/languages/atomic_defi_en.ts index 57724f7f93..980e1d8be6 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_en.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_en.ts @@ -1,6 +1,60 @@ + + AddAddressForm + + + Use standard network address + + + + + Label + + + + + This key already exists. + + + + + Address + + + + + + Cancel + Cancel + + + + Convert + + + + + Edit + + + + + Add + + + + + You need to enable %1 before adding this kind of address. + + + + + Enable + + + AddCustomCoinModal @@ -9,539 +63,321 @@ - + Choose the asset type - + Cancel Cancel - - - + + + Next - + Contract address - + Enter the contract address - + Choose the asset ticker - + Ticker - + Enter the ticker - + Get the contract address from - - - - + + + + Previous - + Choose the asset logo - + Browse - + Please choose the asset logo - + Configuration - + All configuration fields will be fetched using the contract address you provided. - + Name - + Enter the name - + Coingecko ID - + Enter the Coingecko ID - + Get the Coingecko ID - + Active - - + + Preview - + WARNING: Application will restart immidiately to apply the changes! - + Asset not found, please go back and make sure Contract Address is correct - + Config Fields - + Fetched Data - + Submit & Restart - AddressBook + AddTagPopup - - Address Book - - - - - Search a contact by name or tags - - - - - New Contact - - - - - Name - - - - - Tags (first 6) - - - - - Actions - - - - - Edit + + Tag name - - Remove + + Contact already has this tag. - - Do you want to remove this contact ? - - - - - Yes - Yes - - - - No + + + ADD - AddressBookAddContactAddressModal - - - Edit address entry - - - - - Create a new address - - - - - Selected wallet: %1 - - - - - NONE - - - - - Enter a name - - - - - This key already exists. - - - - - Enter the address - - - - - Validate - - - - - Cancel - Cancel - + AmountChart - - Convert + + Work in progress - AddressBookEditContactModal - - - Edit contact - - - - - Contact Name - - - - - Enter a contact name - - - - - Address List - - - - - Search for an address entry. - - - - - Type - - - - - Key - - - - - Address - - - - - Actions - - - - - Add Address - - - - - Tags - - - - - + - - - - - Confirm - - - - - - Cancel - Cancel - - - - The selected address belongs to a disabled coin, you need to enabled it before sending. - - - - - Enable - - - - - Cannot send to this address - - - - - Your balance is empty - - - - - Ok - - - - - Remove address ? - - - - - Yes - Yes - + App - - No + + Recover Funds Result - AddressBookNewContactCategoryModal + AssetFromStandardSelector - - Add a new tag + + Choose a valid - - Enter the tag name + + asset - - This contact already has this tag + + Search an asset - - Add + + Disabled - - - Cancel - Cancel - - AddressBookNewContactModal + AssetPieChart - - Create a new contact + + Assets + + + AssetsList - - Enter the contact name + + Asset - - This contact name already exists. + + Balance - - Confirm + + Fiat Balance - - Cancel - Cancel - - - - AddressBookSendWalletSelector - - - Choose a valid + + Change 24h - - coin + + Price - - - AddressBookWalletTypeList - - %1 is not enabled - You need to enable it before adding an address. Enable it ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + + Source - - - AddressBookWalletTypeListModal - - Select wallet type + + Activating: - - Search + + Price provider is: %1 - AmountChart + Bottom - - Work in progress + + Settings - - - App - - Recover Funds Result + + Support - - - AssetPieChart - - Assets + + Privacy - - - AssetsList - - Asset + + Disable Privacy? - - Balance + + Enter wallet password to confirm - - Fiat Balance + + Type password - - Change 24h + + Confirm - - Price - + + Cancel + Cancel - - Source + + Privacy status - - Price provider is: %1 + + Privacy mode disabled successfully - - - Bottom - - Settings + + + Ok - - Support + + Wrong password! - - Privacy + + wallet password is incorrect @@ -553,47 +389,47 @@ - + Camouflage Password is a secret password for emergency situations. - + Using it to login will display your balance lower than it actually is. - + Here you enter the suffix and at login you need to enter {real_password}{suffix} - + Password suffix - + Confirm pasword suffix - + Enter a password suffix - + Enter the same password suffix to confirm - + Cancel Cancel - + Save @@ -665,17 +501,12 @@ Chart - - Chart - - - - + Loading market data - + There is no chart data for this pair yet @@ -683,118 +514,118 @@ ClaimRewardsModal - + Failed to prepare to claim rewards - + Claim your %1 reward? TICKER - + No UTXOs eligible for claiming - + Transaction fee is higher than the reward! - + You will receive - + Refresh - + Read more about KMD active users rewards - + UTXO - + Amount - + Reward - + Accruing Start - + Accruing Stop - + Time Left - + Error - + Locktime is not set - + Locktime is less than the threshold - + UTXO height is greater than end of the era - + UTXO amount is less than 10 - + One hour did not pass yet - + Transaction is in mempool - + Unknown problem - + Cancel Cancel - + Confirm @@ -802,33 +633,41 @@ CoinMenu - + Disable %1 TICKER - + Disable and Delete %1 TICKER - + Disable all %1 assets - + Disable all assets - + Disable 0 balance assets + + ComboBoxWithSearchBar + + + Search + + + Combo_fiat @@ -893,74 +732,83 @@ ConfirmTradeModal - + Confirm Exchange Details - + + Trade price is more than 50% different to CEX! Confirm? + + + + This swap request can not be undone and is a final event! - + This transaction can take up to 60 mins - DO NOT close this application! - - <b>Total %1 fees:</b> + + Loading fees... - - Security configuration + + <b>Total %1 fees:</b> - - dPoW protected + + Security configuration - + %1 confirmations for incoming %2 transactions - - + Read more about dPoW - + Use custom protection settings for incoming %1 transactions TICKER - + Enable Komodo dPoW security - + + dPoW protected + + + + Required Confirmations - + Warning, this atomic swap is not dPoW protected! - + Cancel Cancel - + Confirm @@ -976,186 +824,202 @@ Dashboard - + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. - + Matching - + Order Matching - + Matched - + Order Matched - + Ongoing - + Swap Ongoing - + Successful - + Swap Successful - + Refunding - + Failed - + Swap Failed - + Unknown - + Unknown State - + Started - + Negotiated - + Taker fee sent - + Maker payment received - + Maker payment wait confirm started - + Maker payment validated and confirmed - + Taker payment sent - + Taker payment spent - + Maker payment spent - + Finished - + Start failed - + Negotiate failed - + Taker fee validate failed - + Maker payment transaction failed - + Maker payment Data send failed - + Maker payment wait confirm failed - + Taker payment validate failed - + Taker payment wait confirm failed - + Taker payment spend failed - + Maker payment wait refund started - + Maker payment refunded - + Maker payment refund failed + + DatePicker + + + Date + + + + + DefaultCopyIcon + + + copied to clipboard + + + DefaultRangeSlider @@ -1169,6 +1033,14 @@ + + DefaultTextEdit + + + copied to clipboard + + + DeleteWalletModal @@ -1211,125 +1083,203 @@ DexAppPasswordField - + Type password - - - DexKeyChecker + + + DexKeyChecker + + + At least 1 lowercase alphabetical character + + + + + At least 1 uppercase alphabetical character + + + + + At least 1 numeric character + + + + + At least 1 special character (eg. !@#$%) + + + + + Between %1 and %2 character(s) + + + + + Password and Confirm Password have to be same + + + + + DexPaginator + + + items per page + + + + + DexRangeSlider + + + Min + + + + + Half + + + + + Max + + + + + DexSweetComboBox + + + Search + + + + + EditContactModal + + + Edit contact + + - - At least 1 lowercase alphabetical character + + Contact name - - At least 1 uppercase alphabetical character + + Enter a contact name - - At least 1 numeric character + + Address list - - At least 1 special character (eg. !@#$%) + + Address Book - - - At least %n character(s) - - - - + + + address copied to clipboard + - - Password and Confirm Password have to be same + + Edit - - - DexPaginator - - items per page + + + Add - - - DexRangeSlider - - Min + + Tags - - Half + + Add tag - - Max + + Cancel + Cancel + + + + Confirm - DexSweetComboBox + EnableAssetModal - - Search + + The selected address belongs to a disabled asset, you need to enabled it before sending. + + + + + Enable + + + Cancel + Cancel + EnableCoinModal - + Enable assets - + Select all assets - + All assets are already enabled! - + You can still enable %1 assets. Selected: %2. - + Search asset - + Change assets limit - + Add a custom asset - + Close - + Enable @@ -1342,27 +1292,27 @@ - + Accept EULA - + Accept Terms and Conditions - + Close - + Cancel Cancel - + Confirm @@ -1398,10 +1348,43 @@ + + GasInfoModal + + + How do I calculate gas? + + + + + Gas is measured in gwei. Gwei is just a unit of Ether, and is equal to 0.000000001 ETH (or the equivalent platform coin such as AVAX or BNB). The gas price varies over time depending on network congestion. + + + + + The gas limit is how many units of gas (maximum) you allocate to pay for a transaction. The gas required depending on the size of the transaction & data being transmitted. + + + + + A standard transaction not involving contracts uses 21,000 gas units, with any of the limit remaining returned to the source address. + + + + + Transactions involving contracts may result in the whole limit being consumed, so be careful not to set it too high. + + + + + For more information, read the article at <a href="https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use">https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use</a> + + + General - + %n day(s) @@ -1409,7 +1392,7 @@ - + %nd day @@ -1418,7 +1401,7 @@ - + %nh hours @@ -1427,7 +1410,7 @@ - + %nm minutes @@ -1436,7 +1419,7 @@ - + %ns seconds @@ -1445,7 +1428,7 @@ - + %nms milliseconds @@ -1454,91 +1437,97 @@ - + - - + <b>Taker tx fee:</b> - + <b>Dex tx fee:</b> - + <b>Dex fee:</b> - + <b>Maker tx fee:</b> - + %1 %2 %3 (%4) - + Trading Fee - + Minimum Trading Amount - + Wallet %1 already exists WALLETNAME - + %1 balance is lower than the fees amount: %2 %3 - + Tradable (after fees) %1 balance is lower than minimum trade amount - + Please fill the price field - + Please fill the volume field - - + + + Please wait for %1 to fully activate + + + + + %1 volume is lower than minimum trade amount - - + + %1 needs to be enabled in order to use %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - + Unknown Error @@ -1566,17 +1555,17 @@ - + Price - + Quantity - + Total @@ -1584,17 +1573,17 @@ ImportWallet - + Failed to Import the wallet - + Import wallet - Setup - + Import wallet - Choose password @@ -1604,59 +1593,89 @@ - + Enter seed - + Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue. - - + + i understand - + + + я согласен + + + + + + je comprends + + + + + + entiendo + + + + + + anladım + + + + + + ich verstehe + + + + Ok - + Allow custom seed - + <strong>Allow custom seed</strong> - + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. - + I understand - + Next - + Enter the same password to confirm - + Continue @@ -1691,16 +1710,21 @@ Try again or select 'Allow custom seed' to continue. Best Orders + + + Enter volume to see best orders. + + ListDelegate - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> - + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 @@ -1739,17 +1763,52 @@ Try again or select 'Allow custom seed' to continue. Login - + Incorrect Password - + Log In - + + Cancel + Cancel + + + + LogoutModal + + + Exit %1 or go to login menu? + + + + + Warning: You currently have a swap in progress. +Logging out may result in a failed swap. + + + + + Warning: You currently have open maker orders. +They will be removed from the orderbook until you log in again. + + + + + Login menu + + + + + Exit + + + + Cancel Cancel @@ -1757,130 +1816,140 @@ Try again or select 'Allow custom seed' to continue. Main - + Segwit - + Confirmation - + Do you want to send your %1 funds to %2 wallet first? - + Success - + Your transaction is send, may take some time to arrive - + Price - + Change 24hr - + Porfolio - + Contract Address - + Send - + Enable %1 ? - + Yes Yes - + No - + Receive - + Swap - + is wallet only - + Rewards - + Faucet - - - + + + Public Key - + Copied to Clipboard - + Loading market data - + There is no chart data for this ticker yet - - Refreshing + + Fetching transactions... + + + + + Please wait, %1 is %2 + + + + + % activated... - - No transactions + + No transactions available - - Fetching transactions + + Click to view your address on %1 (%2) block explorer @@ -1889,53 +1958,101 @@ Try again or select 'Allow custom seed' to continue. - + Trading Information - - Exchange Rates + + Chart - + Orders - + History - + Place Order - + Order Selected - + START SWAP + + + + Address Book + + + + + Search contact + + + + + + NEW CONTACT + + + + + Name + + + + + Tags + + + + + Edit + + + + + Delete + + + + + address copied to clipboard + + + + + This contact does not have any registered address. + + MarketModeSelector - - Sell + + Sell %1 + TICKER - - Buy + + Buy %1 + TICKER @@ -1983,51 +2100,84 @@ Try again or select 'Allow custom seed' to continue. + + NewContactPopup + + + Contact name + + + + + This contact name already exists. + + + + + + ADD + + + NewUpdateModal - - - + + + Searching new updates - + Fetching... - - - + + + Close - - Could not check new updates because of the following reason: + + Could not check new updates for the following reason: %1 - + New version found - + + Mandatory version found + + + + %1 %2 is available ! - + + This update is mandatory to continue using the application + + + + + Close Dex + + + + Your application is updated. - + Download @@ -2035,112 +2185,112 @@ Try again or select 'Allow custom seed' to continue. NewWallet - + Wrong word, please check again - + st - + nd - + rd - + th - + Failed to create a wallet - + New Wallet - + Confirm Seed - + Choose Password - + Important: Back up your seed phrase before proceeding! - + We recommend storing it offline. - + Generated Seed - + Seed phrase - + copied to clipboard - + Next - + Let's double check your seed phrase - + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. - + Enter the - + word - + Check - + Enter the same password to confirm - + Continue @@ -2171,150 +2321,167 @@ Try again or select 'Allow custom seed' to continue. NotificationsModal - + Matching - + Order Matching - + Matched - + Order Matched - + Ongoing - + Swap Ongoing - + Successful - + Swap Successful - + Refunding - + Failed - + Swap Failed - + Unknown - + Unknown State - + Swap status updated - + You sent %1 - + You received %1 - + Your wallet balance changed - + + %1 Enable status + TICKER + + + + Please check your internet connection (e.g. VPN service or firewall might block it). - + Failed to enable %1 TICKER - + + Failed to disable %1 + TICKER + + + + Endpoint not reachable - + Could not reach to endpoint - + Mismatch at %1 custom asset configuration TICKER - + Application needs to be restarted for %1 custom asset. TICKER - + Batch %1 failed. Reason: %2 - + Show - + Restart - + Quit - - There isn't any notification + + Notifications + + + + + There aren't any notifications - + Mark all as read @@ -2322,44 +2489,97 @@ Try again or select 'Allow custom seed' to continue. OrderForm - + Price - + + Reduce 1% relative to CEX market price. + + + + + Use CEX market price. + + + + + Increase 1% relative to CEX market price. + + + + Volume - + Amount to sell - + Amount to receive - - Min volume: + + Max + + + + + Swap 25% of your tradable balance. + + + + + Swap 50% of your tradable balance. - How to use the pro-view slider ? + Swap 100% of your tradable balance. + + + + + Min Volume + + + + + Min amount to sell + + + + + Min amount to receive + + + + + Minimum accepted trade equals 10% of order volume. + + + + + Minimum accepted trade equals 25% of order volume. + + + + + Minimum accepted trade equals 50% of order volume. - - This slider is used to setup the order requirements you need. -Left slider: Sets the minimum amount required to process a trade. -Right slider: Sets the volume you want to trade. + + Min volume: - + Use custom minimum trade amount @@ -2367,7 +2587,7 @@ Right slider: Sets the volume you want to trade. OrderLine - + Funds are recoverable @@ -2383,103 +2603,114 @@ Right slider: Sets the volume you want to trade. OrderModal - + Swap Details - + Order Details - + Order Type - + Maker Order - + Taker Order - + Refund State - + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back - + Date - - ID + + Error ID - - Maker Payment Sent ID + + + Error Log - - Maker Payment Spent ID + + Close - - Taker Payment Spent ID + + Cancel Order - - Taker Payment Sent ID + + + Swap ID - - Error ID + + Maker Payment Sent Transaction ID - - - Error Log + + Maker Payment Spent Transaction ID - - Close + + Maker Payment TXID - - Cancel Order + + Taker Payment Spent Transaction ID + + + + + Taker Payment Sent Transaction ID - + + Taker Payment TXID + + + + Recover Funds - + Refunding... - + View on Explorer @@ -2517,32 +2748,32 @@ Please select a new order. - + Export CSV - + Apply Filter - + Cancel All - + From - + To - + Please choose the CSV export name and location @@ -2558,42 +2789,39 @@ Please select a new order. PasswordField - + Password - + Enter your wallet password - + At least 1 lowercase alphabetical character - + At least 1 uppercase alphabetical character - + At least 1 numeric character - + At least 1 special character (eg. !@#$%) - - - At least %n character(s) - - - - + + + Between %1 and %2 character(s) + @@ -2627,12 +2855,12 @@ Please select a new order. - + Show only coins with balance - + (%1/%2) @@ -2645,38 +2873,38 @@ Please select a new order. PriceLine - + Set swap price for evaluation - + Exchange rate - + Selected - + Expensive - + Expedient - + %1 compared to CEX PRICE_DIFF% - + CEXchange rate @@ -2685,36 +2913,31 @@ Please select a new order. PriceLineSimplified - Set swap price for evaluation - - - - Exchange rate - + Selected - + CEXchange rate - + Expensive - + Expedient - + %1 compared to CEX PRICE_DIFF% @@ -2723,12 +2946,12 @@ Please select a new order. ProView - + Failed to place the order - + Placed the order @@ -2745,22 +2968,29 @@ Please select a new order. ReceiveModal - Receive + Receive %1 + TICKER + + + + + Only send %1 to this address + TICKER - - Only send %1 to this address: + + %1 address TICKER - + copied to clipboard. - + Close @@ -2768,74 +2998,97 @@ Please select a new order. RecoverSeedModal - - + + View seed and private keys - + Please enter your password to view the seed. - + Seed - + Backup Seed - + Public Address copied to clipboard - + Cancel Cancel - + + Incorrect Password + + + + View - - + + copied to clipboard - - + + RPC Password - + Search a coin. - + Public Address - + Private Key copied to clipboard - + Private Key + + RemoveContactPopup + + + Do you want to remove this contact ? + + + + + Yes + Yes + + + + No + + + RestartModal @@ -2875,7 +3128,7 @@ Please select a new order. SearchField - + Search @@ -2883,149 +3136,162 @@ Please select a new order. SendModal - + Failed to send - - Failed to Send - - - - + Prepare to send - + Address of the recipient - + Amount to send - + Gas price - + Recipient's address - + The address has to be mixed case. - + + Failed to Broadcast + + + + Fix - + MAX - + Fiat amount: Unavailable - + Fiat amount: %1 - + %1 amount: %2 - + Specify in Fiat - + Specify in Crypto - + Enable Custom Fees - - Only use custom fees if you know what you are doing! - - - - + Enter the custom fee - + Gas Limit - + Custom Fee can't be higher than the amount - + Not enough funds. - + + You have %1 AMT TICKER - + + + Only use custom fees if you know what you are doing! + + + + Close - + Prepare - - + + Send - + + %1 address + TICKER + + + + + copied to clipboard. + + + + Amount - + Fees - + Date - + Back @@ -3033,22 +3299,22 @@ Please select a new order. SendModalContactList - + Select a contact with an %1 address - + Search for contacts... - + %1 addresses - + 1 address @@ -3077,42 +3343,60 @@ Please select a new order. SendResult - + Transaction Complete! - + + %1 txid + TICKER + + + + + + copied to clipboard. + + + + Recipient's address - + + %1 address + TICKER + + + + Amount - + Fees - + Date - + Transaction Hash - + Close - + View on Explorer @@ -3120,281 +3404,240 @@ Please select a new order. SettingModal - - Confirm Logout - - - - - Are you sure you want to log out? - - - - - Yes - Yes - - - - + + Cancel Cancel - + Settings - + General - + Language - + User Interface - + Security - + Enable Desktop Notifications - + Maximum number of enabled coins - + Logs - + Open Folder - + Reset - + Current Font - + Current font changed to %1. - + Theme - + Changing theme to %1 - + Application Version - + copied to clipboard - - - - - - + About & Version - - + + Reset wallet configuration - + This will restart your wallet with default settings - + + Confirm - + Ask system's password before sending coins ? (2FA) - - View seed and private keys - - - - - - Show - - - - - Setup Camouflage Password - - - - - Open - - - - - Disclaimer and ToS + + Disable 2FA? - - Application version + + Enter your wallet password to confirm - - MM2 version + + Type password - - MM2 Version + + 2FA status - - MM2 Version copied to clipboard. + + 2FA disabled successfully - - Qt version + + + Ok - - Qt Version + + Wrong password! - - Qt Version copied to clipboard. + + Wallet password is incorrect - - Search Update + + View seed and private keys - - Logout + + + Show - - - Settings - - Fiat + + Setup Camouflage Password - - Recommended: + + Open - - Enable Desktop Notifications + + Disclaimer and ToS - - Use QtTextRendering Or NativeTextRendering + + Application version - - Open Logs Folder + + MM2 version - - View seed and private keys + + MM2 Version - - Disclaimer and ToS + + MM2 Version copied to clipboard. - - Setup Camouflage Password + + Qt version - - Reset wallet configuration + + Qt Version - - Delete Wallet + + Qt Version copied to clipboard. - - Log out + + Search Update - - mm2 version + + Logout Sidebar - - Search coin + + Search - + Add asset @@ -3506,32 +3749,32 @@ Please select a new order. - + To - + Cancel Cancel - + Apply filter - + Export - + Please choose the CSV export name and location - + No results found @@ -3540,57 +3783,57 @@ Please select a new order. SubOrders - + Orders - + Close filtering options. - + Filter - + Date - + Open filtering options. - + Filter settings - + From - + To - + Cancel Cancel - + Apply filter - + No results found @@ -3724,7 +3967,7 @@ Network fees can vary greatly depending on your selected trading pair. - + Open Logs Folder @@ -3732,31 +3975,23 @@ Network fees can vary greatly depending on your selected trading pair. SwapProgress - + act SHORT FOR ACTUAL TIME - + est SHORT FOR ESTIMATED - + Progress details - - SweetDexComboBox - - - Search - - - TextAreaWithTitle @@ -3771,14 +4006,17 @@ Network fees can vary greatly depending on your selected trading pair. - TextEditWithTitle + TextEditWithCopy - - Swap ID + + copied to clipboard + + + TextEditWithTitle - + copied to clipboard @@ -3786,7 +4024,7 @@ Network fees can vary greatly depending on your selected trading pair. TextFieldWithTitle - + Required @@ -3802,22 +4040,32 @@ Network fees can vary greatly depending on your selected trading pair. Trade - + Swap - + Instant trading with best orders - + + Reset form + + + + + You have no tradable assets + + + + From - + Enter an amount @@ -3837,119 +4085,109 @@ Network fees can vary greatly depending on your selected trading pair. - + Price - + Better price found: %1. Updating forms. - + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. - - Reset form. - - - - - You have no tradable assets. - - - - + %1 - + Tradable: - + Min: %1 - + Pick a coin - + SWAP NOW - + Failed to place the order - + Placed the order - + Entered amount must be superior than 0. - + You must select an order. - + Entered amount is below the minimum required by this order: %1 - - + + %1 needs to be enabled in order to use %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - + %1 balance does not have enough funds to pay the gas of %2 transactions - + No buy orders found for %1. - + You can check later or try to sell a different coin. - + Calculating fee estimate... - + Total %1 fees: - + %2 (%3) @@ -3968,31 +4206,26 @@ Network fees can vary greatly depending on your selected trading pair. - Chart - - - - Ticker Selectors - + Trading Information - + Order Book - + Best Orders - + Place Order @@ -4000,77 +4233,88 @@ Network fees can vary greatly depending on your selected trading pair. TransactionDetailsModal - + Transaction Details - + + %1 txid + TICKER + + + + + copied to clipboard. + + + + Amount - + Fees - - Date + + From address - - Unconfirmed + + To address - - Transaction Hash + + Date - - Transactions + + Unconfirmed - - txid copied to clipboard + + Transaction Hash - + Confirmations - + Block Height - + From - + To - + Notes - + Close - + View on Explorer @@ -4078,22 +4322,22 @@ Network fees can vary greatly depending on your selected trading pair. Transactions - + Sent - + Received - + fees - + Unconfirmed @@ -4114,19 +4358,6 @@ Network fees can vary greatly depending on your selected trading pair. - - WalletNameField - - - Wallet Name - - - - - Enter the name of your wallet here - - - WalletsView @@ -4150,123 +4381,160 @@ Network fees can vary greatly depending on your selected trading pair. - + My Wallets - + No wallets found! - - + + Delete - + Enter password to confirm deletion of - + wallet - + Type password - + Cancel Cancel - - + + Wallet status - + wallet deleted successfully - - + + Ok - + wallet password is incorrect + + ZcashParamsModal + + + %1 Activation Failed! + + + + + To activate ZHTLC coins, you need to download the Zcash Params. +This might take a few minutes... + + + + + Download params & enable coins + + + + + More Info + + + + + Close + + + + + atomic_dex::settings_page + + + An error has occurred. + + + atomic_dex::wallet_page - + You do not have enough funds. - + %1 is not activated: click on the button to enable it or enable it manually - + You need to have %1 to pay the gas for %2 transactions. - + Checksum verification failed for %1. - + Invalid checksum for %1. Click the button to convert to mixed case address. - + Legacy address used for %1. Click the button to convert to a Cashaddress. - + %1 address must be prefixed with 0x - + %1 address length is invalid, please use a valid address. - + %1 address is invalid. - + Invalid checksum. - + %1 address has invalid prefixes. - + Backend error: %1 @@ -4274,32 +4542,12 @@ Network fees can vary greatly depending on your selected trading pair. main - + Logout - - Confirm Logout - - - - - Are you sure you want to log out? - - - - - Yes - Yes - - - - Cancel - Cancel - - - + Balance diff --git a/atomic_defi_design/assets/languages/atomic_defi_es.ts b/atomic_defi_design/assets/languages/atomic_defi_es.ts new file mode 100644 index 0000000000..c5ef6a286e --- /dev/null +++ b/atomic_defi_design/assets/languages/atomic_defi_es.ts @@ -0,0 +1,4576 @@ + + + + + AddAddressForm + + + Use standard network address + Utilice la dirección de red + + + + Label + Etiqueta + + + + This key already exists. + Esta clave ya existe. + + + + Address + Dirección + + + + + Cancel + Cancelar + + + + Convert + Convertir + + + + Edit + Editar + + + + Add + Agregar + + + + You need to enable %1 before adding this kind of address. + Debe habilitar %1 antes de agregar este tipo de dirección. + + + + Enable + Habilitar + + + + AddCustomCoinModal + + + Get the contract address from + Obtener la dirección del contrato de + + + + Choose the asset type + Elija el tipo de activo + + + + Cancel + Cancelar + + + + + + Next + Siguiente + + + + Contract address + Dirección del contrato + + + + Enter the contract address + Ingrese la dirección del contrato + + + + Choose the asset ticker + Elija el ticker del activo + + + + Ticker + Ticker + + + + Enter the ticker + Ingrese el ticker + + + + Get the contract address from + Obtener la dirección del contrato de + + + + + + + Previous + Anterior + + + + Choose the asset logo + Elija el logotipo del activo + + + + Browse + Navegar + + + + Please choose the asset logo + Elija el logotipo del activo + + + + Configuration + Configuración + + + + All configuration fields will be fetched using the contract address you provided. + Todos los campos de configuración se obtendrán usando la dirección del contrato que proporcionó. + + + + Name + Nombre + + + + Enter the name + Ingrese el nombre + + + + Coingecko ID + Coingecko ID + + + + Enter the Coingecko ID + Ingrese el Coingecko ID + + + + Get the Coingecko ID + Obtener el Coingecko ID + + + + Active + Activo + + + + + Preview + Vista previa + + + + WARNING: Application will restart immidiately to apply the changes! + ADVERTENCIA: ¡La aplicación se reiniciará inmediatamente para aplicar los cambios! + + + + Asset not found, please go back and make sure Contract Address is correct + Activo no encontrado, regrese y asegúrese de que la dirección del contrato sea correcta + + + + Config Fields + Campos de configuracion + + + + Fetched Data + Datos obtenidos + + + + Submit & Restart + Enviar & Reiniciar + + + + AddTagPopup + + + Tag name + Nombre de la etiqueta + + + + Contact already has this tag. + El contacto ya tiene esta etiqueta. + + + + + ADD + + Añadir + + + + AmountChart + + + Work in progress + Trabajo en proceso + + + + App + + + Recover Funds Result + Resultados de Recuperar Fondos + + + + AssetFromStandardSelector + + + Choose a valid + Elija un + + + + asset + activo + + + + Search an asset + Buscar un activo + + + + Disabled + deshabilitados + + + + AssetPieChart + + + Assets + Activos + + + + AssetsList + + + Asset + Activo + + + + Balance + Saldo + + + + Fiat Balance + Saldo Fiat + + + + Change 24h + Cambio en 24h + + + + Price + Precio + + + + Source + Fuente + + + + Activating: + Activando: + + + + Price provider is: %1 + El proveedor de precios es: %1 + + + + Bottom + + + Settings + Configuración + + + + Support + Soporte + + + + Privacy + Privacidad + + + + Disable Privacy? + ¿Deshabilitar privacidad? + + + + Enter wallet password to confirm + Ingrese la contraseña de la billetera para confirmar + + + + Type password + Escriba la contraseña + + + + Confirm + Confirmar + + + + Cancel + Cancelar + + + + Privacy status + Estado de privacidad + + + + Privacy mode disabled successfully + Modo de privacidad deshabilitado correctamente + + + + + Ok + Ok + + + + Wrong password! + ¡Contraseña incorrecta! + + + + wallet password is incorrect + la contraseña de la billetera es incorrecta + + + + CamouflagePasswordModal + + + Setup Camouflage Password + Configuración de Contraseña Camuflaje + + + + Camouflage Password is a secret password for emergency situations. + Contraseña Camuflaje es una contraseña secreta para situaciones de emergencia. + + + + Using it to login will display your balance lower than it actually is. + Usarlo para iniciar sesión mostrará su saldo más bajo de lo que realmente es. + + + + Here you enter the suffix and at login you need to enter {real_password}{suffix} + Aquí ingresa el sufijo y al iniciar sesión debe ingresar {real_password}{suffix} + + + + Password suffix + Sufijo de contraseña + + + + Confirm pasword suffix + Confirmar sufijo + + + + Enter a password suffix + Ingrese un sufijo de contraseña + + + + Enter the same password suffix to confirm + Ingrese el mismo sufijo de contraseña para confirmar + + + + Cancel + Cancelar + + + + Save + Guardar + + + + CannotEnableCoinModal + + + Failed to enable %1 + No se pudo habilitar %1 + + + + Enabling %1 did not succeed. Limit of enabled coins might have been reached. + No se pudo habilitar %1. Es posible que se haya alcanzado el límite de monedas habilitadas. + + + + Change limit in settings + Cambiar el límite en la configuración + + + + Cancel + Cancelar + + + + Center + + + Portfolio + Cartera + + + + Wallet + Monedero + + + + DEX + DEX + + + + Address Book + Directorio + + + + Fiat + Fiat + + + + CexInfoModal + + + Market Data + Data de Mercado + + + + Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> + Datos de mercado (precios, estadisticas, etc.) marcados con ⓘ se obtienen a través de fuentes terceras.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> + + + + Chart + + + Loading market data + Cargando datos de mercado + + + + There is no chart data for this pair yet + Todavía no hay datos de gráficos para este par + + + + ClaimRewardsModal + + + Failed to prepare to claim rewards + No se pudo preparar para reclamar recompensas + + + + Claim your %1 reward? + TICKER + ¿Reclamar su %1 de recompensa? + + + + No UTXOs eligible for claiming + Ningún UTXO elegible para reclamar + + + + Transaction fee is higher than the reward! + ¡La tarifa de transacción es más alta que la recompensa! + + + + You will receive + Recibirá + + + + Refresh + Actualizar + + + + Read more about KMD active users rewards + Lea más sobre las recompensas de los usuarios activos de KMD + + + + UTXO + UTXO + + + + Amount + Cantidad + + + + Reward + Recompensa + + + + Accruing Start + Inicio de Acumulación + + + + Accruing Stop + Detener Acumulación + + + + Time Left + Tiempo Restante + + + + Error + Error + + + + Locktime is not set + Locktime no está configurado + + + + Locktime is less than the threshold + Locktime es inferior al umbral + + + + UTXO height is greater than end of the era + La altura de UTXO es mayor que el final de la era + + + + UTXO amount is less than 10 + La cantidad de UTXO es inferior a 10 + + + + One hour did not pass yet + Una hora no pasa aún + + + + Transaction is in mempool + La transacción está en el mempool + + + + Unknown problem + Problema desconocido + + + + Cancel + Cancelar + + + + Confirm + Confirmar + + + + CoinMenu + + + Disable %1 + TICKER + Deshabilitar %1 + + + + Disable and Delete %1 + TICKER + Deshabilitar y eliminar %1 + + + + Disable all %1 assets + Deshabilitar todos los activos de %1 + + + + Disable all assets + Deshabilitar todos los activos + + + + Disable 0 balance assets + Deshabilitar 0 balancear activos + + + + ComboBoxWithSearchBar + + + Search + Buscar + + + + Combo_fiat + + + Language + Idioma + + + + Fiat + Fiat + + + + Recommended: + Recomendado: + + + + ConfirmMultiOrderTradeModal + + + Confirm Multi Order Details + Confirmar detalles de Multi Order + + + + These swaps requests can not be undone and this is the final event! + Estas solicitudes de intercambio no se pueden deshacer y este es el evento final! + + + + These transactions can take up to 60 mins - DO NOT close this application! + Estas transacciones pueden demorar hasta 60 minutos. ¡NO cierre esta aplicación! + + + + Same funds will be used until an order matches. + Se utilizarán los mismos fondos hasta que coincida un pedido. + + + + Note that if one order is filled other will not be cancelled. + Tenga en cuenta que si se completa un pedido, el otro no se cancelará. + + + + Cancel + Cancelar + + + + Confirm + Confirmar + + + + Placed multiple orders + Pedidos múltiples realizados + + + + ConfirmTradeModal + + + Confirm Exchange Details + Confirmar Detalles de Intercambio + + + + Trade price is more than 50% different to CEX! Confirm? + ¡El precio comercial es más del 50% diferente al de CEX! ¿Confirmar? + + + + This swap request can not be undone and is a final event! + ¡Esta solicitud de intercambio no se puede deshacer y es un evento final! + + + + This transaction can take up to 60 mins - DO NOT close this application! + Esta transacción puede demorar hasta 60 minutos. ¡NO cierre esta aplicación! + + + + Loading fees... + Cargando tarifas... + + + + <b>Total %1 fees:</b> + <b>Total de %1 fees:</b> + + + + Security configuration + Configuración de seguridad + + + + %1 confirmations for incoming %2 transactions + %1 confirmaciones para %2 transacciones entrantes + + + + Read more about dPoW + Obtenga más información sobre dPoW + + + + Use custom protection settings for incoming %1 transactions + TICKER + Utilice configuraciones de protección personalizadas para %1 transacciones entrantes + + + + Enable Komodo dPoW security + Habilite la seguridad dPoW de Komodo + + + + dPoW protected + dPoW protegida + + + + Required Confirmations + Confirmaciones Requeridas + + + + Warning, this atomic swap is not dPoW protected! + Advertencia, este intercambio atómico no está protegido por dPoW! + + + + Cancel + Cancelar + + + + Confirm + Confirmar + + + + CopyFieldButton + + + Copied to Clipboard + Copiada en el Portapapeles + + + + Dashboard + + + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. + El número actual de monedas habilitadas no coincide con su especificación de configuración. Se restablecerá la configuración de sus activos. + + + + Matching + Emparejando + + + + Order Matching + Emparejando Orden + + + + Matched + Emparejado + + + + Order Matched + Orden Emparejada + + + + Ongoing + En Curso + + + + Swap Ongoing + Intercambio En Curso + + + + Successful + Exitoso + + + + Swap Successful + Intercambio exitoso + + + + Refunding + Reembolso + + + + Failed + Fallo + + + + Swap Failed + Intercambio fallido + + + + Unknown + Desconocido + + + + Unknown State + Estado Desconocido + + + + Started + Iniciado + + + + Negotiated + Negociado + + + + Taker fee sent + Tarifa taker enviada + + + + Maker payment received + Pago de maker recibido + + + + Maker payment wait confirm started + Inicio de espera de confirmacion de pago de maker + + + + Maker payment validated and confirmed + Validacion y confirmacion de pago de maker + + + + Taker payment sent + Pago de taker enviado + + + + Taker payment spent + Pago del taker gastado + + + + Maker payment spent + Pago del maker gastado + + + + Finished + Terminado + + + + Start failed + Inicio fallido + + + + Negotiate failed + Negociacion fallida + + + + Taker fee validate failed + Validación de tarifa del taker fallida + + + + Maker payment transaction failed + Transacción de pago de maker fallo + + + + Maker payment Data send failed + Envio de data de pago de maker fallo + + + + Maker payment wait confirm failed + Espera de confirmacion de pago de maker fallo + + + + Taker payment validate failed + Validacion de pago de taker fallo + + + + Taker payment wait confirm failed + Espera de confirmacion de pago de taker fallo + + + + Taker payment spend failed + Gasto de pago de taker fallo + + + + Maker payment wait refund started + Reembolso de espera de pago de maker iniciado + + + + Maker payment refunded + Pago de maker reembolsado + + + + Maker payment refund failed + Reembolso del pago de maker fallo + + + + DatePicker + + + Date + Fecha + + + + DefaultCopyIcon + + + copied to clipboard + copiado al portapapeles + + + + DefaultRangeSlider + + + Min + Min + + + + Max + Max + + + + DefaultTextEdit + + + copied to clipboard + copiado al portapapeles + + + + DeleteWalletModal + + + Delete Wallet + Eliminar billetera + + + + Are you sure you want to delete %1 wallet? + WALLET_NAME + ¿Está seguro de que desea eliminar %1 billetera? + + + + If so, make sure you record your seed phrase in order to restore your wallet in the future. + Si es así, asegúrese de registrar su frase inicial para restaurar su billetera en el futuro. + + + + Enter your wallet password + Ingrese la contraseña de su billetera + + + + Wrong Password + Contraseña incorrecta + + + + Cancel + Cancelar + + + + Delete + Eliminar + + + + DexAppPasswordField + + + Type password + Escriba la contraseña + + + + DexKeyChecker + + + At least 1 lowercase alphabetical character + Al menos 1 carácter alfabético en minúsculas + + + + At least 1 uppercase alphabetical character + Al menos 1 carácter alfabético en mayúsculas + + + + At least 1 numeric character + Al menos 1 carácter numérico + + + + At least 1 special character (eg. !@#$%) + Al menos 1 carácter especial ( ej., !@#$%) + + + + Between %1 and %2 character(s) + Entre %1 y %2 carácter(es) + + + + Password and Confirm Password have to be same + Contraseña y Confirmar Contraseña tienen que ser los mismos + + + + DexPaginator + + + items per page + elementos por página + + + + DexRangeSlider + + + Min + Min + + + + Half + Mitad + + + + Max + Max + + + + DexSweetComboBox + + + Search + Buscar + + + + EditContactModal + + + Edit contact + Editar contacto + + + + Contact name + Nombre + + + + Enter a contact name + Ingresar un nombre de contacto + + + + Address list + Lista de direcciónes + + + + Address Book + Libreta de direcciones + + + + address copied to clipboard + dirección copiada al portapapeles + + + + Edit + Editar + + + + + Add + + Añadir + + + + Tags + Etiquetas + + + + Add tag + Agregar etiqueta + + + + Cancel + Cancelar + + + + Confirm + Confirmar + + + + EnableAssetModal + + + The selected address belongs to a disabled asset, you need to enabled it before sending. + La dirección seleccionada pertenece a un activo deshabilitado, debe habilitó antes de enviar. + + + + Enable + Habilitar + + + + Cancel + Cancelar + + + + EnableCoinModal + + + Enable assets + Habilitar activos + + + + Select all assets + Seleccionar todos los activos + + + + All assets are already enabled! + ¡Todos los activos ya están habilitados! + + + + You can still enable %1 assets. Selected: %2. + Todavía puede habilitar activos %1. Seleccionado: %2. + + + + Search asset + Buscar activo + + + + Change assets limit + Cambiar el límite de activos + + + + Add a custom asset + Agregar un activo personalizado + + + + Close + Cerrar + + + + Enable + Habilitar + + + + EulaModal + + + Disclaimer & Terms of Service + Descargo de Responsabilidad & Términos de servicio + + + + Accept EULA + Aceptar EULA + + + + Accept Terms and Conditions + Aceptar términos y condiciones + + + + Close + Cerrar + + + + Cancel + Cancelar + + + + Confirm + Confirmar + + + + FatalErrorModal + + + Fatal Error + Error Fatal + + + + Connection has been lost. You have been disconnected. + Ha perdido la conexión. Has sido desconectado. + + + + Close + Cerrar + + + + FeeInfo + + + Minimum fee + Tarifa mínima + + + + Fees will be calculated + Las tarifas se calcularán + + + + GasInfoModal + + + How do I calculate gas? + ¿Cómo calculo la gasolina? + + + + Gas is measured in gwei. Gwei is just a unit of Ether, and is equal to 0.000000001 ETH (or the equivalent platform coin such as AVAX or BNB). The gas price varies over time depending on network congestion. + El gas se mide en gwei. Gwei es solo una unidad de Ether y es igual a 0.000000001 ETH (o la moneda de plataforma equivalente como AVAX o BNB). El precio del gas varía con el tiempo dependiendo de la congestión de la red. + + + + The gas limit is how many units of gas (maximum) you allocate to pay for a transaction. The gas required depending on the size of the transaction & data being transmitted. + + + + + A standard transaction not involving contracts uses 21,000 gas units, with any of the limit remaining returned to the source address. + Una transacción estándar que no implica contratos utiliza 21.000 unidades de gas, y el límite restante se devuelve a la dirección de origen. + + + + Transactions involving contracts may result in the whole limit being consumed, so be careful not to set it too high. + Las transacciones que involucran contratos pueden resultar en que se consuma todo el límite, así que tenga cuidado de no establecerlo demasiado alto. + + + + For more information, read the article at <a href="https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use">https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use</a> + Para obtener más información, lea el artículo en <a href="https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use">https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use</a> + + + + General + + + %n day(s) + + %n día + %n días + + + + + %nd + day + + + + + + + + %nh + hours + + + + + + + + %nm + minutes + + + + + + + + %ns + seconds + + + + + + + + %nms + milliseconds + + + + + + + + - + - + + + + <b>Taker tx fee:</b> + <b>Taker tx fee:</b> + + + + <b>Dex tx fee:</b> + <b>Dex tx fee:</b> + + + + <b>Dex fee:</b> + <b>Dex fee:</b> + + + + <b>Maker tx fee:</b> + <b>Maker tx fee:</b> + + + + %1 %2 %3 (%4) + %1 %2 %3 (%4) + + + + Trading Fee + Tarifa de Intercambio + + + + Minimum Trading Amount + Cantidad Mínima de Intercambio + + + + Wallet %1 already exists + WALLETNAME + Monedero %1 ya existe + + + + %1 balance is lower than the fees amount: %2 %3 + El saldo de %1 es inferior al monto de las tarifas: %2 %3 + + + + Tradable (after fees) %1 balance is lower than minimum trade amount + El saldo de %1 (después de las tarifas) es inferior al monto mínimo de intercambio + + + + Please fill the price field + Por favor complete el campo de precio + + + + Please fill the volume field + Complete el campo de volumen + + + + + Please wait for %1 to fully activate + Espere a que %1 se active por completo + + + + + %1 volume is lower than minimum trade amount + El volumen de %1 es inferior al monto mínimo de intercambio + + + + + %1 needs to be enabled in order to use %2 + %1 debe habilitarse para usar %2 + + + + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions + se debe rellenar el saldo de %1, se requiere un saldo distinto de cero para pagar el gas de %2 transacciones + + + + Unknown Error + Error Desconocido + + + + Header + + + You get + Obtienes + + + + You send + Envía + + + + Fiat Price + Precio Fiat + + + + CEX rate + Tasa CEX + + + + Price + Precio + + + + Quantity + Cantidad + + + + Total + Total + + + + ImportWallet + + + Failed to Import the wallet + No se pudo importar la billetera + + + + Import wallet - Setup + Importar billetera - Configurar + + + + Import wallet - Choose password + Importar billetera - Elegir contraseña + + + + Wallet Name + Nombre de billetera + + + + Enter seed + Ingresar semilla + + + + Your seed is not BIP39 compliant. +Try again or select 'Allow custom seed' to continue. + Su semilla no cumple con BIP39. +Vuelva a intentarlo o seleccione 'Permitir semilla personalizada' personalizada continúe. + + + + + i understand + entiendo + + + + + я согласен + + + + + + je comprends + + + + + + entiendo + + + + + + anladım + + + + + + ich verstehe + + + + + Ok + Ok + + + + Allow custom seed + Permitir semilla personalizada + + + + <strong>Allow custom seed</strong> + <strong>Permitir semilla personalizada</strong> + + + + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. + Las frases semilla personalizadas pueden ser menos seguras y más fáciles de descifrar que una frase semilla o clave privada (WIF) compatible con BIP39.<br><br>Para confirmar que comprende el riesgo y sabe lo que está haciendo, escriba <strong> 'Entiendo'</strong> en el cuadro de abajo. + + + + I understand + Entiendo + + + + Next + Siguiente + + + + Enter the same password to confirm + Ingrese la misma contraseña para confirmar + + + + Continue + Continuar + + + + LinksRow + + + Join our Discord server + Únase a nuestro servidor de Discord + + + + Follow us on Twitter + Síganos en Twitter + + + + Go to Support Guides + Ir a Guías de soporte + + + + List + + + Funds are recoverable + Los fondos son recuperables + + + + Best Orders + Mejores Ordenes + + + + Enter volume to see best orders. + Introduce el volumen para ver los mejores ordenes + + + + ListDelegate + + + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + %1 no está habilitado. ¿Desea habilitarlo para poder seleccionar %2 mejores ordenes?<br><a href='#'>Sí</a> - <a href='#no'>No</a> + + + + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 + Este pedido requiere una cantidad mínima de %1 %2 <br>No tiene fondos suficientes.<br> %3 + + + + LogModal + + + Close + Cerrar + + + + Logging + + + Loading, please wait + Cargando, por favor espere + + + + Initializing MM2 + Inicializando MM2 + + + + Enabling assets + Habilitando activos + + + + Getting ready + Preparándose + + + + Login + + + Incorrect Password + Contraseña incorrecta + + + + Log In + Iniciar sesión + + + + Cancel + Cancelar + + + + LogoutModal + + + Exit %1 or go to login menu? + Salga de %1 o vaya al menú de inicio de sesión + + + + Warning: You currently have a swap in progress. +Logging out may result in a failed swap. + Advertencia: actualmente tiene una operación en curso. +Cerrar sesión puede resultar en una transacción fallida. + + + + Warning: You currently have open maker orders. +They will be removed from the orderbook until you log in again. + Advertencia: actualmente tiene órdenes abiertas. +Se eliminarán del libro de pedidos hasta que vuelva a iniciar sesión. + + + + Login menu + Menú de inicio de sesión + + + + Exit + Dejar + + + + Cancel + Cancelar + + + + Main + + + Segwit + Segwit + + + + Confirmation + Confirmación + + + + Do you want to send your %1 funds to %2 wallet first? + ¿Desea enviar sus fondos de %1 a la billetera %2 primero? + + + + Success + Éxito + + + + Your transaction is send, may take some time to arrive + Su transacción se envió, puede demorar algún tiempo en llegar + + + + Price + Precio + + + + Change 24hr + Cambio + + + + Porfolio + Cartera + + + + Contract Address + Dirección del Contrato + + + + Send + Enviar + + + + Enable %1 ? + ¿Habilitar %1? + + + + Yes + + + + + No + No + + + + Receive + Recibir + + + + Swap + Intercambiar + + + + is wallet only + es solo billetera + + + + Rewards + Recompensas + + + + Faucet + Grifo + + + + + + Public Key + Clave Pública + + + + Copied to Clipboard + Copiada en el Portapapeles + + + + Loading market data + Cargando datos de mercado + + + + There is no chart data for this ticker yet + No hay datos de gráficos para este ticker aún + + + + Fetching transactions... + Obteniendo transacciones... + + + + Please wait, %1 is %2 + Por favor espera %1 es %2 + + + + % activated... + % activado... + + + + No transactions available + No hay transacciones disponibles + + + + Click to view your address on %1 (%2) block explorer + Haga clic para ver su dirección en %1 (%2) explorador de bloques + + + + Trade + Intercambio + + + + Trading Information + Información de Intercambios + + + + Chart + Gráfico + + + + + Orders + Pedidos + + + + + History + Historial + + + + Place Order + Realizar pedido + + + + Order Selected + Pedido seleccionado + + + + START SWAP + INICIO INTERCAMBIAR + + + + + Address Book + Libreta de direcciones + + + + Search contact + Buscar contacto + + + + + NEW CONTACT + + Nuevo contacto + + + + Name + Nombre + + + + Tags + Etiquetas + + + + Edit + Editar + + + + Delete + Eliminar + + + + address copied to clipboard + dirección copiada al portapapeles + + + + This contact does not have any registered address. + Este contacto no tiene ninguna dirección registrada. + + + + MarketModeSelector + + + Sell %1 + TICKER + Vender %1 + + + + Buy %1 + TICKER + Comprar %1 + + + + MinTradeModal + + + Minimum Trading Amount + Cantidad Mínima de Intercambio + + + + the minimum amount of %1 coin available for the order; the min_volume must be greater than or equal to %2; it must be also less or equal than volume param; default is %3 + la cantidad mínima de la moneda %1 disponible para la orden; el min_volume debe ser mayor o igual a %2; debe ser también menor o igual que volumen param; el valor predeterminado es %3 + + + + MultiOrder + + + %1 price is zero! + TICKER + el precio de %1 es cero! + + + + %1 receive volume is lower than minimum trade amount + TICKER + volumen de recepción de %1 es inferior al monto mínimo de transacción + + + + Error: + Error: + + + + You'll receive %1 + AMOUNT TICKER + Tu'll recibes %1 + + + + Price + Precio + + + + NewContactPopup + + + Contact name + Nombre + + + + This contact name already exists. + Este nombre de contacto ya existe. + + + + + ADD + + Añadir + + + + NewUpdateModal + + + + + Searching new updates + Buscando nuevas actualizaciones + + + + Fetching... + Buscando... + + + + + + + Close + Cerrar + + + + Could not check new updates for the following reason: +%1 + No se pudieron comprobar las nuevas actualizaciones por el siguiente motivo: %1 + + + + New version found + Nueva versión encontrada + + + + Mandatory version found + Versión obligatoria encontrada + + + + %1 %2 is available ! + %1 ¡%2 está disponible! + + + + This update is mandatory to continue using the application + Esta actualización es obligatoria para seguir usando la aplicación + + + + Close Dex + Cerrar Dex + + + + Your application is updated. + Tu aplicación está actualizada. + + + + Download + Descargar + + + + NewWallet + + + Wrong word, please check again + Palabra incorrecta, verifique nuevamente + + + + st + st + + + + nd + nd + + + + rd + rd + + + + th + th + + + + Failed to create a wallet + No se pudo crear una billetera + + + + New Wallet + Nueva billetera + + + + Confirm Seed + Confirmar semilla + + + + Choose Password + Elegir contraseña + + + + Important: Back up your seed phrase before proceeding! + Importante: ¡Haga una copia de seguridad de su frase semilla antes de continuar! + + + + We recommend storing it offline. + Recomendamos almacenarlo fuera de línea. + + + + Generated Seed + Semilla Generada + + + + Seed phrase + Frase semilla + + + + copied to clipboard + copiado al portapapeles + + + + Next + Siguiente + + + + Let's double check your seed phrase + Verifiquemos dos veces su frase semilla + + + + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. + Su frase semilla es importante, por eso nos gusta asegurarnos de que sea correcta. Le haremos tres preguntas diferentes sobre su frase semilla para asegurarnos de que podrá restaurar fácilmente su billetera cuando lo desee. + + + + Enter the + Ingresa la + + + + word + palabra + + + + Check + Verificar + + + + Enter the same password to confirm + Ingrese la misma contraseña para confirmar + + + + Continue + Continuar + + + + NoConnection + + + No connection + Sin conexión + + + + Please make sure you are connected to the internet + Asegúrate de que estás conectado a Internet + + + + Will automatically retry in %1 seconds + Intentará de nuevo automáticamente en %1 segundos + + + + Retry + Reintentar + + + + NotificationsModal + + + Matching + Emparejando + + + + Order Matching + Emparejando Orden + + + + Matched + Emparejado + + + + Order Matched + Orden Emparejada + + + + Ongoing + En Curso + + + + Swap Ongoing + Intercambio En Curso + + + + Successful + Exitoso + + + + Swap Successful + Intercambio exitoso + + + + Refunding + Reembolso + + + + Failed + Fallo + + + + Swap Failed + Intercambio fallido + + + + Unknown + Desconocido + + + + Unknown State + Estado Desconocido + + + + Swap status updated + Estado de Intercambio Actualizado + + + + You sent %1 + Enviaste %1 + + + + You received %1 + Recibiste %1 + + + + Your wallet balance changed + El saldo de tu billetera cambió + + + + %1 Enable status + TICKER + %1 habilitar el estado + + + + Please check your internet connection (e.g. VPN service or firewall might block it). + Verifica tu conexión a Internet (por ejemplo, el servicio VPN o el firewall pueden bloquearlo). + + + + Failed to enable %1 + TICKER + No se pudo habilitar %1 + + + + Failed to disable %1 + TICKER + Error al deshabilitar %1 + + + + Endpoint not reachable + Punto final no accesible + + + + Could not reach to endpoint + No se pudo llegar al punto final + + + + Mismatch at %1 custom asset configuration + TICKER + Falta de emparejamiento en %1 configuración de recurso personalizado + + + + Application needs to be restarted for %1 custom asset. + TICKER + Es necesario reiniciar la aplicación para %1 recurso personalizado. + + + + Batch %1 failed. Reason: %2 + El lote %1 falló. Razón: %2 + + + + Show + Mostrar + + + + Restart + Reiniciar + + + + Quit + Salir + + + + Notifications + Notificaciones + + + + There aren't any notifications + No hay ' notificaciones + + + + Mark all as read + Marcar todo como leído + + + + OrderForm + + + Price + Precio + + + + Reduce 1% relative to CEX market price. + Reducción del 1% en relación con el precio de mercado CEX. + + + + Use CEX market price. + Utilice el precio de mercado CEX. + + + + Increase 1% relative to CEX market price. + Aumento del 1% en relación con el precio de mercado de CEX. + + + + Volume + Volumen + + + + Amount to sell + Importe para vender + + + + Amount to receive + Importe para recibir + + + + Max + Max + + + + Swap 25% of your tradable balance. + Usar el 25% de su saldo comercial. + + + + Swap 50% of your tradable balance. + Usar el 50% de su saldo comercial. + + + + Swap 100% of your tradable balance. + Usar el 100% de su saldo comercial. + + + + Min Volume + Volumen Mínimo + + + + Min amount to sell + Cantidad mínima para vender + + + + Min amount to receive + Cantidad mínimo para recibir + + + + Minimum accepted trade equals 10% of order volume. + El comercio mínimo aceptado es igual al 10% del volumen del pedido. + + + + Minimum accepted trade equals 25% of order volume. + El comercio mínimo aceptado es igual al 25% del volumen del pedido. + + + + Minimum accepted trade equals 50% of order volume. + El comercio mínimo aceptado es igual al 50% del volumen del pedido. + + + + Min volume: + Volumen mínimo: + + + + Use custom minimum trade amount + Utilizar una cantidad personalizada de intercambio mínima + + + + OrderLine + + + Funds are recoverable + Los fondos son recuperables + + + + OrderList + + + No results found + No se encontraron resultados + + + + OrderModal + + + Swap Details + Detalles de Intercambio + + + + Order Details + Detalles de Orden + + + + Order Type + Tipo de Orden + + + + Maker Order + Orden de Maker + + + + Taker Order + Orden de Taker + + + + Refund State + Estado del Reembolso + + + + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back + Su intercambio falló, pero el proceso de reembolso automático para su pago ya comenzó. Espere y mantenga la aplicación abierta hasta que reciba su pago + + + + Date + Fecha + + + + Error ID + ID de Error + + + + + Error Log + Registro de Error + + + + Close + Cerrar + + + + Cancel Order + Cancelar Pedido + + + + + Swap ID + ID de Intercambio + + + + Maker Payment Sent Transaction ID + ID de la transacción pago enviada de Maker + + + + Maker Payment Spent Transaction ID + ID de la transacción pago gastado de Maker + + + + Maker Payment TXID + TXID del pago de Maker + + + + Taker Payment Spent Transaction ID + ID de la transacción pago gastado de Taker + + + + Taker Payment Sent Transaction ID + ID de la transacción pago enviada de Taker + + + + Taker Payment TXID + TXID del pago de Taker + + + + Recover Funds + Recuperar fondos + + + + Refunding... + Reembolso... + + + + View on Explorer + Ver en Explorer + + + + OrderRemovedModal + + + Selected Order Removed + Pedido Seleccionado Eliminado + + + + The selected order does not exist anymore, it might have been matched or canceled, and no order with a better price is available. +Please select a new order. + El pedido seleccionado ya no existe, puede haber sido igualado o cancelado, y no hay un pedido con mejor precio disponible. +Seleccione un nuevo pedido. + + + + OK + Aceptar + + + + OrdersPage + + + + Filter + Filtrar + + + + Date + Fecha + + + + Export CSV + Exportar CSV + + + + Apply Filter + Aplicar Filtro + + + + Cancel All + Cancelar Todo + + + + From + Desde + + + + To + A + + + + Please choose the CSV export name and location + Por favor, elija el nombre y la ubicación de exportación CSV + + + + Pagination + + + items per page + elementos por página + + + + PasswordField + + + Password + Contraseña + + + + Enter your wallet password + Ingrese la contraseña de su billetera + + + + At least 1 lowercase alphabetical character + Al menos 1 carácter alfabético en minúsculas + + + + At least 1 uppercase alphabetical character + Al menos 1 carácter alfabético en mayúsculas + + + + At least 1 numeric character + Al menos 1 carácter numérico + + + + At least 1 special character (eg. !@#$%) + Al menos 1 carácter especial ( ej., !@#$%) + + + + Between %1 and %2 character(s) + Entre %1 y %2 carácter(es) + + + + PasswordForm + + + Password + Contraseña + + + + Confirm Password + Confirmar contraseña + + + + Enter the same password to confirm + Ingrese la misma contraseña para confirmar + + + + Portfolio + + + ADD ASSET + AGREGAR ACTIVO + + + + Search asset + Buscar activo + + + + Show only coins with balance + Mostrar solo monedas con saldo + + + + (%1/%2) + (%1/%2) + + + + Portfolio + Cartera + + + + PriceLine + + + Set swap price for evaluation + Establecer precio de intercambio para evaluación + + + + Exchange rate + Tasa de cambio + + + + Selected + Seleccionada + + + + Expensive + Caro + + + + Expedient + Expediente + + + + %1 compared to CEX + PRICE_DIFF% + %1 en comparación con CEX + + + + CEXchange rate + Tasa de cambio CEX + + + + PriceLineSimplified + + + Exchange rate + Tasa de cambio + + + + Selected + Seleccionada + + + + CEXchange rate + Tasa de cambio CEX + + + + Expensive + Caro + + + + Expedient + Expediente + + + + %1 compared to CEX + PRICE_DIFF% + %1 en comparación con CEX + + + + ProView + + + Failed to place the order + Error al realizar el pedido + + + + Placed the order + Realizó el pedido El + + + + QObject + + + Cannot reach the endpoint: + No se puede llegar al punto final: + + + + ReceiveModal + + + Receive %1 + TICKER + Recibir %1 + + + + Only send %1 to this address + TICKER + Enviar solo %1 a esta dirección + + + + %1 address + TICKER + %1 dirección + + + + copied to clipboard. + copiado al portapapeles. + + + + Close + Cerrar + + + + RecoverSeedModal + + + + View seed and private keys + Ver semilla y claves privadas + + + + Please enter your password to view the seed. + Por favor ingrese su contraseña para ver la semilla. + + + + Seed + Semilla + + + + Backup Seed + Copia de seguridad de semilla + + + + Public Address copied to clipboard + Direccion publica copiada en el portapapeles + + + + Cancel + Cancelar + + + + Incorrect Password + Contraseña incorrecta + + + + View + Ver + + + + + copied to clipboard + copiado al portapapeles + + + + + RPC Password + Contraseña RPC + + + + Search a coin. + Buscar una moneda. + + + + Public Address + Dirección Pública + + + + Private Key copied to clipboard + Clave Privada copiada en el portapapeles + + + + Private Key + Clave Privada + + + + RemoveContactPopup + + + Do you want to remove this contact ? + ¿Desea eliminar este contacto? + + + + Yes + + + + + No + No + + + + RestartModal + + + Applying the changes... + Aplicando los cambios... + + + + Restarting the application. %1 + Reiniciando la aplicación. %1 + + + + Restarting the application... + Reiniciando la aplicación... + + + + RightClickMenu + + + Cut + Cortar + + + + Copy + Copiar + + + + Paste + Pegar + + + + SearchField + + + Search + Buscar + + + + SendModal + + + Failed to send + Error al enviar + + + + Prepare to send + Preparar para enviar + + + + Address of the recipient + Dirección del destinatario + + + + Amount to send + Cantidad a enviar + + + + Gas price + Precio del gas + + + + Recipient's address + Dirección del destinatario + + + + The address has to be mixed case. + La dirección debe estar en mayúsculas y minúsculas. + + + + Failed to Broadcast + Error al transmitir + + + + Fix + Arreglar + + + + MAX + MAX + + + + Fiat amount: Unavailable + Cantidad en Fiat: No disponible + + + + Fiat amount: %1 + Cantidad de Fiat: %1 + + + + %1 amount: %2 + Cantidad de %1: %2 + + + + Specify in Fiat + Especificar en Fiat + + + + Specify in Crypto + Especificar en Crypto + + + + Enable Custom Fees + Habilitar Tarifas Personalizadas + + + + Enter the custom fee + Ingrese la tarifa personalizada + + + + Gas Limit + Límite de gas + + + + Custom Fee can't be higher than the amount + Tarifa personalizada no puede ser mayor que la cantidad + + + + Not enough funds. + No hay suficientes fondos. + + + + + You have %1 + AMT TICKER + Tiene %1 + + + + + Only use custom fees if you know what you are doing! + ¡Solo use tarifas personalizadas si sabe lo que está haciendo! + + + + Close + Cerrar + + + + Prepare + Preparar + + + + + Send + Enviar + + + + %1 address + TICKER + %1 dirección + + + + copied to clipboard. + copiado al portapapeles. + + + + Amount + Cantidad + + + + Fees + Tarifas + + + + Date + Fecha + + + + Back + Atrás + + + + SendModalContactList + + + Select a contact with an %1 address + Seleccione un contacto con %1 dirección + + + + Search for contacts... + Buscar contactos... + + + + %1 addresses + direcciones %1 + + + + 1 address + 1 dirección + + + + + Back + Atrás + + + + Choose an %1 address of %2 + Elija una direccion %1 de %2 + + + + Name + Nombre + + + + Address + Dirección + + + + SendResult + + + Transaction Complete! + ¡Transacción completa! + + + + %1 txid + TICKER + %1 txid + + + + + copied to clipboard. + copiado al portapapeles. + + + + Recipient's address + Dirección del destinatario + + + + %1 address + TICKER + %1 dirección + + + + Amount + Cantidad + + + + Fees + Tarifas + + + + Date + Fecha + + + + Transaction Hash + Hash de Transaccion + + + + Close + Cerrar + + + + View on Explorer + Ver en Explorer + + + + SettingModal + + + + Cancel + Cancelar + + + + Settings + Configuración + + + + General + General + + + + Language + Idioma + + + + User Interface + Interfaz + + + + Security + Seguridad + + + + Enable Desktop Notifications + Habilitar notificaciones de escritorio + + + + Maximum number of enabled coins + Número máximo de monedas habilitadas + + + + Logs + Registros + + + + Open Folder + Carpeta Abierta + + + + Reset + Restablecer + + + + Current Font + Fuente Actual + + + + Current font changed to %1. + La fuente actual cambió a %1. + + + + Theme + Tema + + + + Changing theme to %1 + Cambiando el tema a %1 + + + + Application Version + La versión de la aplicación + + + + copied to clipboard + copiado al portapapeles + + + + About & Version + Acerca de & Versión + + + + + Reset wallet configuration + Restablecer configuración de billetera + + + + This will restart your wallet with default settings + Esto reiniciará su billetera con la configuración predeterminada + + + + + Confirm + Confirmar + + + + Ask system's password before sending coins ? (2FA) + ¿Preguntar la contraseña del sistema antes de enviar monedas? (2FA) + + + + Disable 2FA? + ¿Deshabilitar 2FA? + + + + Enter your wallet password to confirm + Ingrese la contraseña de su billetera para confirmar + + + + Type password + Escriba la contraseña + + + + 2FA status + Estado 2FA + + + + 2FA disabled successfully + 2FA deshabilitado correctamente + + + + + Ok + Ok + + + + Wrong password! + ¡Contraseña incorrecta! + + + + Wallet password is incorrect + Contraseña de la billetera es incorrecta + + + + View seed and private keys + Ver semilla y claves privadas + + + + + Show + Mostrar + + + + Setup Camouflage Password + Configuración de Contraseña Camuflaje + + + + Open + Abrir + + + + Disclaimer and ToS + Descargo de Responsabilidad y Terminos de Servicio + + + + Application version + Versión de Aplicación + + + + MM2 version + Versión MM2 + + + + MM2 Version + Versión MM2 + + + + MM2 Version copied to clipboard. + Versión MM2 copiada al portapapeles. + + + + Qt version + Versión Qt + + + + Qt Version + Versión Qt + + + + Qt Version copied to clipboard. + Versión de Qt copiada al portapapeles. + + + + Search Update + Buscar Actualizacion + + + + Logout + Cerrar sesión + + + + Sidebar + + + Search + Buscar + + + + Add asset + Agregar activo + + + + SmartChartView + + + Loading market data + Cargando datos de mercado + + + + There is no chart data for this ticker yet + No hay datos de gráficos para este ticker aún + + + + SubBestOrder + + + Token + Token + + + + Available Quantity + Cantidad Disponible + + + + Available Quantity (in %1) + Cantidad Disponible (en %1) + + + + Fiat Volume + Volumen en Fiat + + + + CEX Rate + Tasa CEX + + + + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + %1 no está habilitado. ¿Desea habilitarlo para poder seleccionar %2 mejores ordenes?<br><a href='#'>Sí</a> - <a href='#no'>No</a> + + + + SubCoinSelector + + + Token + Token + + + + Balance + Saldo + + + + Balance Fiat + Saldo Fiat + + + + No Selectable coin. + No Moneda seleccionable. + + + + SubHistory + + + History + Historial + + + + Filter + Filtrar + + + + Date + Fecha + + + + Close filtering options. + Cerrar opciones de filtrado. + + + + Open filtering options. + Abrir opciones de filtrado. + + + + Filter settings + Configuración de filtros + + + + From + Desde + + + + To + A + + + + Cancel + Cancelar + + + + Apply filter + Aplicar filtro + + + + Export + Exportar + + + + Please choose the CSV export name and location + Por favor, elija el nombre y la ubicación de exportación CSV + + + + No results found + No se encontraron resultados + + + + SubOrders + + + + Orders + Pedidos + + + + Close filtering options. + Cerrar opciones de filtrado. + + + + Filter + Filtrar + + + + Date + Fecha + + + + Open filtering options. + Abrir opciones de filtrado. + + + + Filter settings + Configuración de filtros + + + + From + Desde + + + + To + A + + + + Cancel + Cancelar + + + + Apply filter + Aplicar filtro + + + + No results found + No se encontraron resultados + + + + SupportModal + + + Frequently Asked Questions + Preguntas frecuentes + + + + Do you store my private keys? + ¿Almacenan mis claves privadas? + + + + No! %1 is non-custodial. We never store any sensitive data, including your private keys, seed phrases, or PIN. This data is only stored on the user’s device and never leaves it. You are in full control of your assets. + ¡No! %1 no tiene custodia. Nunca almacenamos datos confidenciales, incluidas sus claves privadas, frases iniciales o PIN. Estos datos solo se almacenan en el dispositivo del usuario y nunca lo abandonan. Usted tiene el control total de sus activos. + + + + How is trading on %1 different from trading on other DEXs? + ¿En qué se diferencia el intercambio en %1 del comercio en otros DEX? + + + + Other DEXs generally only allow you to trade assets that are based on a single blockchain network, use proxy tokens, and only allow placing a single order with the same funds. + +%1 enables you to natively trade across two different blockchain networks without proxy tokens. You can also place multiple orders with the same funds. For example, you can sell 0.1 BTC for KMD, QTUM, or VRSC — the first order that fills automatically cancels all other orders. + Otros DEX generalmente solo le permiten intercambiar activos que se basan en una sola red de cadena de bloques, usar tokens de proxy y solo permiten realizar un solo pedido con los mismos fondos. + +%1 le permite comerciar de forma nativa en dos redes de cadena de bloques diferentes sin tokens de proxy. También puede realizar varios pedidos con los mismos fondos. Por ejemplo, puede vender 0,1 BTC por KMD, QTUM o VRSC: el primer pedido que se completa automáticamente cancela todos los demás pedidos. + + + + How long does each atomic swap take? + ¿Cuánto tiempo toma cada intercambio atómico? + + + + Several factors determine the processing time for each swap. The block time of the traded assets depends on each network (Bitcoin typically being the slowest) Additionally, the user can customize security preferences. For example, (you can ask %1 to consider a KMD transaction as final after just 3 confirmations which makes the swap time shorter compared to waiting for a <a href="https://komodoplatform.com/security-delayed-proof-of-work-dpow/">notarization</a>. + Varios factores determinan el tiempo de procesamiento de cada intercambio. El tiempo de bloqueo de los activos negociados depende de cada red (Bitcoin suele ser la más lenta). Además, el usuario puede personalizar las preferencias de seguridad. Por ejemplo, (puede pedirle a %1 que considere una transacción KMD como final después de solo 3 confirmaciones, lo que hace que el tiempo de intercambio sea más corto en comparación con esperar un <a href="https://komodoplatform.com/security-delayed- prueba de trabajo-dpow/">certificación notarial</a>. + + + + Do I need to be online for the duration of the swap? + ¿Necesito estar en línea durante la duración del intercambio? + + + + Yes. You must remain connected to the internet and have your app running to successfully complete each atomic swap (very short breaks in connectivity are usually fine). Otherwise, there is risk of trade cancellation if you are a maker, and risk of loss of funds if you are a taker. + +The atomic swap protocol requires both participants to stay online and monitor the involved blockchains for the process to stay atomic. + +If you go offline, so will your orders, and any that are in progress will fail, leading to potential loss of trade / transaction fees, and a wait for the swap to timeout and issue a refund. It may also negatively affect your wallet's reputation score for future trade matching. + +When you come back online, your orders will begin to broadcast again at the price you set before you went offline. If there has been significant price movement in the meantime, you might unintentionally offer someone a bargain! + +For this reason, we recommend cancelling orders before closing %1, or reviewing and revising your prices when restarting %1. + Sí. Debe permanecer conectado a Internet y tener su aplicación ejecutándose para completar con éxito cada intercambio atómico (las interrupciones muy breves en la conectividad generalmente están bien). De lo contrario, existe el riesgo de cancelación de la operación si es un creador y el riesgo de pérdida de fondos si es un tomador. + +El protocolo de intercambio atómico requiere que ambos participantes permanezcan en línea y monitoreen las cadenas de bloques involucradas para que el proceso permanezca atómico. + +Si se desconecta, también lo harán sus pedidos, y cualquiera que esté en curso fallará, lo que provocará una posible pérdida de tarifas comerciales / de transacción, y una espera para que el intercambio se agote y emita un reembolso. También puede afectar negativamente el puntaje de reputación de su billetera para futuras coincidencias comerciales. + +Cuando vuelva a estar en línea, sus pedidos comenzarán a transmitirse nuevamente al precio que estableció antes de desconectarse. Si ha habido un movimiento de precios significativo en el ínterin, ¡es posible que involuntariamente le ofrezcas a alguien una ganga! + +Por este motivo, recomendamos cancelar los pedidos antes de cerrar %1 o revisar y revisar sus precios al reiniciar %1. + + + + How are the fees on %1 calculated? + ¿Cómo se calculan las tarifas de %1? + + + + There are two fee categories to consider when trading on %1. + +1. %1 charges approximately 0.13% (1/777 of trading volume but not lower than 0.0001) as the trading fee for taker orders, and maker orders have zero fees. + +2. Both makers and takers will need to pay normal network fees to the involved blockchains when making atomic swap transactions. + +Network fees can vary greatly depending on your selected trading pair. + Hay dos categorías de tarifas a tener en cuenta al operar en %1. + +1. %1 cobra aproximadamente el 0,13 % (1/777 del volumen de negociación pero no menos de 0,0001) como tarifa de negociación para las órdenes del tomador, y las órdenes del fabricante no tienen tarifas. + +2. Tanto los creadores como los tomadores deberán pagar tarifas de red normales a las cadenas de bloques involucradas al realizar transacciones de intercambio atómico. + +Las tarifas de la red pueden variar mucho según el par comercial seleccionado. + + + + Do you provide user support? + ¿Ofrecen soporte al usuario? + + + + Yes! %1 offers support through the <a href="%2">%1 Discord server</a>. The team and the community are always happy to help! + ¡Sí! %1 ofrece soporte a través del <a href="%2">%1 servidor Discord</a>. ¡El equipo y la comunidad siempre están dispuestos a ayudar! + + + + Who is behind %1? + ¿Quién está detrás de %1? + + + + %1 is developed by the Komodo team. Komodo is one of the most established blockchain projects working on innovative solutions like atomic swaps, Delayed Proof of Work, and an interoperable multi-chain architecture. + %1 está desarrollado por el equipo de Komodo. Komodo es uno de los proyectos de cadena de bloques más establecidos que trabaja en soluciones innovadoras como intercambios atómicos, prueba de trabajo retrasada y una arquitectura multicadena interoperable. + + + + Is it possible to develop my own white-label exchange on %1? + ¿Es posible desarrollar mi propio intercambio de marca blanca en %1? + + + + Absolutely! You can read our developer documentation for more details or contact us with your partnership inquiries. Have a specific technical question? The %1 developer community is always ready to help! + ¡Absolutamente! Puede leer nuestra documentación para desarrolladores para obtener más detalles o ponerse en contacto con nosotros con sus consultas de asociación. ¿Tiene una pregunta técnica específica? ¡La comunidad de desarrolladores de %1 siempre está lista para ayudar! + + + + Which devices can I use %1 on? + ¿En qué dispositivos puedo usar %1? + + + + %1 is available for mobile on both <a href="%2">Android and iPhone, and for desktop on Windows, Mac, and Linux</a> operating systems. + %1 está disponible para dispositivos móviles en <a href="%2">Android y iPhone, y para escritorio en Windows, Mac y Linux</a> sistemas operativos. + + + + Compliance Info + Información de cumplimiento + + + + Due to regulatory and legal circumstances the citizens of certain jurisdictions including, but not limited to, the United States of America, Canada, Hong Kong, Israel, Singapore, Sudan, Austria, Iran and any other state, country or other jurisdiction that is embargoed by the United States of America or the European Union are not allowed to use this application. + Debido a circunstancias reglamentarias y legales, los ciudadanos de ciertas jurisdicciones, incluidos, entre otros, los Estados Unidos de América, Canadá, Hong Kong, Israel, Singapur, Sudán, Austria, Irán y cualquier otro estado, país u otra jurisdicción que está embargado por los Estados Unidos de América o la Unión Europea no se les permite utilizar esta aplicación. + + + + Changelog + Cambios + + + + Open Logs Folder + Abrir Carpeta de Registros + + + + SwapProgress + + + act + SHORT FOR ACTUAL TIME + act + + + + est + SHORT FOR ESTIMATED + est + + + + Progress details + Detalles del Progreso + + + + TextAreaWithTitle + + + Save + Guardar + + + + Edit + Editar + + + + TextEditWithCopy + + + copied to clipboard + copiado al portapapeles + + + + TextEditWithTitle + + + copied to clipboard + copiado al portapapeles + + + + TextFieldWithTitle + + + Required + Requerido + + + + Toast + + + Click here to see the details + Haga clic aquí para ver los detalles + + + + Trade + + + Swap + Intercambiar + + + + Instant trading with best orders + Comercio instantáneo con las mejores órdenes + + + + Reset form + Restablecer formulario + + + + You have no tradable assets + No tiene activos intercambiables + + + + From + Desde + + + + Enter an amount + Ingrese una cantidad + + + + MAX + MAX + + + + To + A + + + + Pick an order + Elegir una orden + + + + Price + Precio + + + + Better price found: %1. Updating forms. + Mejor precio encontrado: %1. Actualización de formularios. + + + + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. + Mejor precio (%1) encontrado pero la cantidad recibida (%2) es más baja que la actual (%3). Haga clic aquí para actualizar el pedido seleccionado. + + + + %1 + %1 + + + + Tradable: + Negociable: + + + + Min: %1 + Mín.: %1 + + + + Pick a coin + Elija una moneda + + + + SWAP NOW + CAMBIE AHORA + + + + Failed to place the order + Error al realizar el pedido + + + + Placed the order + Realizó el pedido El + + + + Entered amount must be superior than 0. + monto ingresado debe ser superior a 0. + + + + You must select an order. + Debe seleccionar un pedido. + + + + Entered amount is below the minimum required by this order: %1 + El monto ingresado está por debajo del mínimo requerido por esta orden: %1 + + + + + %1 needs to be enabled in order to use %2 + %1 debe habilitarse para usar %2 + + + + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions + se debe rellenar el saldo de %1, se requiere un saldo distinto de cero para pagar el gas de %2 transacciones + + + + %1 balance does not have enough funds to pay the gas of %2 transactions + %1 el saldo no tiene fondos suficientes para pagar el gas de %2 transacciones + + + + No buy orders found for %1. + No se encontraron órdenes de compra para %1. + + + + You can check later or try to sell a different coin. + Puede verificar más tarde o intentar vender una moneda diferente. + + + + Calculating fee estimate... + Calculando tarifa estimada... + + + + Total %1 fees: + Total de %1 tarifas: + + + + %2 (%3) + %2 (%3) + + + + TradeViewHeader + + + Pro View Settings + Vista de Configuración Pro + + + + Display Settings + Configuracion de Vista + + + + Ticker Selectors + Selectores + + + + Trading Information + Información de Intercambios + + + + Order Book + Libro de Ordenes + + + + Best Orders + Mejores Ordenes + + + + Place Order + Realizar pedido + + + + TransactionDetailsModal + + + Transaction Details + Detalles de Transacción + + + + %1 txid + TICKER + %1 txid + + + + copied to clipboard. + copiado al portapapeles. + + + + Amount + Cantidad + + + + Fees + Tarifas + + + + From address + Desde dirección + + + + To address + Para dirección + + + + Date + Fecha + + + + Unconfirmed + Sin confirmar + + + + Transaction Hash + Hash de Transaccion + + + + Confirmations + Confirmaciones + + + + Block Height + Altura del Bloque + + + + From + Desde + + + + To + A + + + + Notes + Notas + + + + Close + Cerrar + + + + View on Explorer + Ver en Explorer + + + + Transactions + + + Sent + Enviado + + + + Received + Recibido + + + + fees + tarifas + + + + Unconfirmed + Sin confirmar + + + + UpdateInvalidChecksum + + + The downloaded update archive is corrupted ! + ¡El archivo de actualización descargado está dañado! + + + + Vertical + + + Order Book + Libro de Ordenes + + + + WalletsView + + + Welcome + Bienvenido + + + + New wallet + Nuevo monedero + + + + Import wallet + Importar monedero + + + + Search your wallets... + Buscar en sus monederos... + + + + My Wallets + Mis Monederos + + + + No wallets found! + ¡No se han encontrado monederos! + + + + + Delete + Eliminar + + + + Enter password to confirm deletion of + Ingrese la contraseña para confirmar la eliminación de + + + + wallet + billetera + + + + Type password + Escriba la contraseña + + + + Cancel + Cancelar + + + + + Wallet status + Estado + + + + wallet deleted successfully + billetera eliminada con éxito + + + + + Ok + Ok + + + + wallet password is incorrect + la contraseña de la billetera es incorrecta + + + + ZcashParamsModal + + + %1 Activation Failed! + ¡Error en la activación de %1! + + + + To activate ZHTLC coins, you need to download the Zcash Params. +This might take a few minutes... + Para activar las monedas ZHTLC, debe descargar Zcash Params. +Esto puede tardar unos minutos... + + + + Download params & enable coins + Descargar parámetros & habilitar monedas + + + + More Info + Más información + + + + Close + Cerrar + + + + atomic_dex::settings_page + + + An error has occurred. + Se ha producido un error. + + + + atomic_dex::wallet_page + + + You do not have enough funds. + No tiene fondos suficientes. + + + + %1 is not activated: click on the button to enable it or enable it manually + %1 no está activado: haga clic en el botón para habilitarlo o habilítelo manualmente + + + + You need to have %1 to pay the gas for %2 transactions. + Necesita tener %1 para pagar la gasolina de %2 transacciones. + + + + Checksum verification failed for %1. + La verificación de la suma de comprobación falló para %1. + + + + Invalid checksum for %1. Click the button to convert to mixed case address. + Suma de comprobación no válida para %1. Haga clic en el botón para convertir a dirección de mayúsculas y minúsculas. + + + + Legacy address used for %1. Click the button to convert to a Cashaddress. + Dirección heredada utilizada para %1. Haga clic en el botón para convertir a una dirección de efectivo. + + + + %1 address must be prefixed with 0x + La dirección %1 debe tener el prefijo 0x + + + + %1 address length is invalid, please use a valid address. + La longitud de la dirección %1 no es válida, utilice una dirección válida. + + + + %1 address is invalid. + La dirección %1 no es válida. + + + + Invalid checksum. + Suma de comprobación no válida. + + + + %1 address has invalid prefixes. + La dirección %1 tiene prefijos no válidos. + + + + Backend error: %1 + Error de backend: %1 + + + + main + + + Logout + Cerrar sesión + + + + Balance + Saldo + + + diff --git a/atomic_defi_design/assets/languages/atomic_defi_fr.ts b/atomic_defi_design/assets/languages/atomic_defi_fr.ts index 0fedd91a97..8fb7f616ca 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_fr.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_fr.ts @@ -1,42 +1,96 @@ + + AddAddressForm + + + Use standard network address + + + + + Label + + + + + This key already exists. + Cette clé existe déjà. + + + + Address + Adresse + + + + + Cancel + Annuler + + + + Convert + + + + + Edit + Éditer + + + + Add + Ajouter + + + + You need to enable %1 before adding this kind of address. + + + + + Enable + Activer + + AddCustomCoinModal - + Choose the asset type Choisir le type d'actif - + Cancel Annuler - - - + + + Next Suivant - + Enter the contract address Entrer l'adresse du contrat - + Choose the asset ticker Choisissez le symbole de l'actif - + Ticker Symbole - + Enter the ticker Entrez le symbole @@ -46,439 +100,165 @@ Obtenez l'adresse du contrat de - + Contract address - + Get the contract address from Obtenez l'adresse du contrat de - - - - + + + + Previous Précedent - + Choose the asset logo Choisissez le logo de l'actif - + Browse Naviguer - + Please choose the asset logo S'il-vous-plaît choissisez le logo de l'actif - + Configuration Configuration - + All configuration fields will be fetched using the contract address you provided. Tous les champs de configuration vont être récupérés à partir de l'adresse du contrat que vous avez fournis. - + Name Nom - + Enter the name Entrez le nom - + Coingecko ID Coingecko ID - + Enter the Coingecko ID Entrer l'identifiant coingecko - + Get the Coingecko ID Récupérer l'identifiant coingecko - + Active Actif - - + + Preview Pré-visualisation - + WARNING: Application will restart immidiately to apply the changes! AVERTISSEMENT: l'application redémarrera immédiatement pour appliquer les modifications! - + Asset not found, please go back and make sure Contract Address is correct Actif introuvable, veuillez revenir en arrière et vous assurer que l'adresse du contrat est correcte - + Config Fields Champs de configuration - + Fetched Data Données récupérées - + Submit & Restart Soumettre et redémarrer - AddressBook - - - Address Book - Carnet d'adresses - - - - New Contact - Nouveau contact - - - - Search a contact by name or tags - Rechercher un contact par nom ou par tags - - - - Name - Nom - - - - Tags (first 6) - Tags (Les 6 premiers) - - - - Actions - Actions - - - - Edit - Éditer - - - - Remove - Retirer - - - - Do you want to remove this contact ? - Voulez-vous supprimer ce contact ? - - - - Yes - Oui - - - - No - Non - - - - AddressBookAddContactAddressModal - - - Create a new address - Créer une nouvelle adresse - - - - Edit address entry - Edition de l'entrée pour l'addresse - - - - Selected wallet: %1 - Portefeuille sélectionné : %1 - - - - NONE - RIEN - - - - Enter a name - Entrez un nom - + AddTagPopup - - This key already exists. - Cette clé existe déjà. - - - - Enter the address - Entrez l'adresse - - - - Validate - Valider - - - - Cancel - Annuler - - - - Convert + + Tag name - - - AddressBookEditContactModal - - - Edit contact - Modifier le contact - - - - Contact Name - Nom du contact - - - - Enter a contact name - Entrez un nom de contact - - - Address List - Liste d'addresse - - - - Search for an address entry. - Rechercher une addresse. - - - - Type - Type - - - - Key - Clef - - - - Address - Addresse - - - - Actions - Actions - - - - Add Address + + Contact already has this tag. - - Tags - Tags - - - - + - + - - - - Confirm - Confirmer - - - - - Cancel - Annuler - - - - The selected address belongs to a disabled coin, you need to enabled it before sending. - L'adresse sélectionnée appartient à un actif désactivée, vous devez l'activer avant l'envoi. - - - - Enable - Activer - - - - Cannot send to this address - Impossible d'envoyer à cette adresse - - - - Your balance is empty - Votre solde est vide - - - - Ok - Ok - - - - Remove address ? + + + ADD - - - Yes - Oui - - - - No - Non - - AddressBookNewContactCategoryModal - - - Add a new tag - Ajouter un nouveau tag - - - - Enter the tag name - Entrer le nom du tag - - - - This contact already has this tag - Ce contact possède déjà ce tag - - - - Add - Ajouter - + AmountChart - - Cancel - Annuler + + Work in progress + Travail en cours - AddressBookNewContactModal - - - Create a new contact - Créer un nouveau contact - - - - Enter the contact name - Entrez le nom du contact - - - - This contact name already exists. - Ce nom de contact existe déjà. - - - - Confirm - Confirmer - + App - - Cancel - Annuler + + Recover Funds Result + Le résultat de la récupération des fonds - AddressBookSendWalletSelector + AssetFromStandardSelector - + Choose a valid - Choisissez un actif + Choisissez un actif - - coin - valide - - - - AddressBookWalletTypeList - - - %1 is not enabled - You need to enable it before adding an address. Enable it ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + + asset - - - AddressBookWalletTypeListModal - - Select wallet type - Sélectionnez le type de portefeuille - - - - Search - Rechercher - - - - AmountChart - - - Work in progress - Travail en cours + + Search an asset + - - - App - - Recover Funds Result - Le résultat de la récupération des fonds + + Disabled + @@ -522,7 +302,12 @@ Source - + + Activating: + + + + Price provider is: %1 Fournisseur de prix : %1 @@ -530,20 +315,71 @@ Bottom - + Settings Réglages - + Support Support - + Privacy Intimité + + + Disable Privacy? + + + + + Enter wallet password to confirm + + + + + Type password + Tapez votre mot de passe + + + + Confirm + Confirmer + + + + Cancel + Annuler + + + + Privacy status + + + + + Privacy mode disabled successfully + + + + + + Ok + Ok + + + + Wrong password! + + + + + wallet password is incorrect + le mot de passe du portefeuille est incorrect + CamouflagePasswordModal @@ -553,47 +389,47 @@ Configurer le mot de passe de camouflage - + Camouflage Password is a secret password for emergency situations. Le mot de passe de camouflage est un mot de passe secret pour les situations d'urgence. - + Using it to login will display your balance lower than it actually is. Son utilisation pour vous connecter affichera votre solde inférieur à ce qu'il est réellement. - + Here you enter the suffix and at login you need to enter {real_password}{suffix} Ici, vous entrez le suffixe et lors de la connexion, vous devez entrer {mot de passe réel}{suffixe} - + Password suffix Suffixe du mot de passe - + Confirm pasword suffix Confirmer le suffixe du mot de passe - + Enter a password suffix Entrez un suffixe de mot de passe - + Enter the same password suffix to confirm Entrez le même suffixe de mot de passe pour confirmer - + Cancel Annuler - + Save Sauvegarder @@ -665,17 +501,12 @@ Chart - - Chart - Chart - - - + Loading market data Chargement des données de marché - + There is no chart data for this pair yet Il n'y a pas encore de données graphiques pour cette paire @@ -683,118 +514,118 @@ ClaimRewardsModal - + Failed to prepare to claim rewards Échec de la préparation de la réclamation des récompenses - + Claim your %1 reward? TICKER Réclamer votre %1 récompense ? - + No UTXOs eligible for claiming Aucun UTXO éligible pour réclamer - + Transaction fee is higher than the reward! Les frais de transaction sont plus élevés que la récompense ! - + You will receive - + Refresh Actualiser - + Read more about KMD active users rewards En savoir plus sur les récompenses des utilisateurs actifs de KMD - + UTXO UTXO - + Amount Montant - + Reward Récompense - + Accruing Start Début accumulation - + Accruing Stop Fin accumulation - + Time Left Temps restant - + Error Erreur - + Locktime is not set L'heure de verrouillage n'est pas définie - + Locktime is less than the threshold Le temps de verrouillage est inférieur au seuil - + UTXO height is greater than end of the era La hauteur UTXO est supérieure à la fin de l'ère - + UTXO amount is less than 10 Le montant UTXO est inférieur à 10 - + One hour did not pass yet Une heure ne s'est pas encore écoulée - + Transaction is in mempool La transaction est en mempool - + Unknown problem Problème inconnu - + Cancel Annuler - + Confirm Confirmer @@ -802,33 +633,41 @@ CoinMenu - + Disable %1 TICKER Désactiver %1 - + Disable and Delete %1 TICKER Désactiver et Supprimer %1 - + Disable all %1 assets Désactiver tous les actifs %1 - + Disable all assets Désactiver tous les actifs - + Disable 0 balance assets + + ComboBoxWithSearchBar + + + Search + Rechercher + + Combo_fiat @@ -893,74 +732,83 @@ ConfirmTradeModal - + Confirm Exchange Details Détails de la confirmation de l'échange - + This swap request can not be undone and is a final event! La requête de ce swap ne peut pas être annulé, c'est irréversible ! - + Security configuration Configuration de la sécurité - - dPoW protected - dPoW protégé - - - - + Read more about dPoW En savoir plus sur dPoW - + Use custom protection settings for incoming %1 transactions TICKER Utiliser les paramètres de protection personnalisés pour les transactions%1 entrantes - + Enable Komodo dPoW security Activer la sécurité de Komodo dPoW - + %1 confirmations for incoming %2 transactions Il y a %1 confirmations pour les transactions entrantes du ticker %2 - + This transaction can take up to 60 mins - DO NOT close this application! Cette transaction peut prendre jusqu'à 60 minutes - NE fermez PAS cette application ! - + + Trade price is more than 50% different to CEX! Confirm? + + + + + Loading fees... + + + + <b>Total %1 fees:</b> - + + dPoW protected + + + + Required Confirmations Confirmations requises - + Warning, this atomic swap is not dPoW protected! Attention, ce swap atomique n'est pas protégé par dPoW ! - + Cancel Annuler - + Confirm Confirmer @@ -976,186 +824,202 @@ Dashboard - + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. Le nombre actuel d'actifs activées ne correspond pas à vos spécifications de configuration. La configuration de vos actifs sera réinitialisée. - + Matching Recherche en cours - + Order Matching Recherche d'un ordre - + Matched Trouvé - + Order Matched Ordre trouvé - + Ongoing En cours - + Swap Ongoing Échange en cours - + Successful Réussi - + Swap Successful Échange terminé - + Refunding En cours de remboursement - + Failed Échoué - + Swap Failed Erreur lors de l'échange - + Unknown Inconnue - + Unknown State État inconnu - + Started Commencé - + Negotiated Négocié - + Taker fee sent Frais de preneur envoyés - + Maker payment received Paiement de l'envoyeur reçu - + Maker payment wait confirm started La confirmation d'attente de paiement de l'envoyeur a commencé - + Maker payment validated and confirmed Paiement de l'envoyeur validé et confirmé - + Taker payment sent Paiement du preneur envoyé - + Taker payment spent Paiement du preneur dépensé - + Maker payment spent Paiement de l'envoyeur dépensé - + Finished Fini - + Start failed Le démarrage a échoué - + Negotiate failed La négociation a échoué - + Taker fee validate failed Échec de la validation des frais du preneur - + Maker payment transaction failed La transaction de paiement du créateur a échoué - + Maker payment Data send failed Échec de l'envoi des données de paiement du créateur - + Maker payment wait confirm failed La confirmation de l'attente de paiement du créateur a échoué - + Taker payment validate failed La validation du paiement du preneur a échoué - + Taker payment wait confirm failed La confirmation de l'attente de paiement du preneur a échoué - + Taker payment spend failed Échec des dépenses de paiement du preneur - + Maker payment wait refund started attente de paiement du créateur, remboursement commencé - + Maker payment refunded Paiement du créateur remboursé - + Maker payment refund failed échec du remboursement du paiement du créateur + + DatePicker + + + Date + Date + + + + DefaultCopyIcon + + + copied to clipboard + copié dans le presse-papier + + DefaultRangeSlider @@ -1169,6 +1033,14 @@ Max + + DefaultTextEdit + + + copied to clipboard + copié dans le presse-papier + + DeleteWalletModal @@ -1211,7 +1083,7 @@ DexAppPasswordField - + Type password Tapez votre mot de passe @@ -1219,35 +1091,32 @@ DexKeyChecker - + At least 1 lowercase alphabetical character Au moins 1 caractère alphabétique en minuscule - + At least 1 uppercase alphabetical character Au moins 1 caractère alphabétique en majuscule - + At least 1 numeric character Au moins 1 caractère numérique - + At least 1 special character (eg. !@#$%) Au moins 1 caractère spécial (ex: ! @ # $%) - - - At least %n character(s) - - Au moins %n caractère - Au moins %n caractères - + + + Between %1 and %2 character(s) + - + Password and Confirm Password have to be same Le mot de passe et la confirmation du mot de passe doivent être identiques @@ -1259,77 +1128,158 @@ items per page Nombres d'éléments par page - - - DexRangeSlider + + + DexRangeSlider + + + Min + Min + + + + Half + Moitié + + + + Max + Max + + + + DexSweetComboBox + + + Search + Rechercher + + + + EditContactModal + + + Edit contact + Modifier le contact + + + + Contact name + + + + + Enter a contact name + Entrez un nom de contact + + + + Address list + + + + + Address Book + Carnet d'adresses + + + + address copied to clipboard + + + + + Edit + Éditer + + + + + Add + + + + + Tags + Tags + - - Min - Min + + Add tag + - - Half - Moitié + + Cancel + Annuler - - Max - Max + + Confirm + Confirmer - DexSweetComboBox + EnableAssetModal - - Search - Rechercher + + The selected address belongs to a disabled asset, you need to enabled it before sending. + + + + + Enable + Activer + + + + Cancel + Annuler EnableCoinModal - + Enable assets Activer les actifs - + Search asset Rechercher un actif - + All assets are already enabled! Tous les actifs sont déjà activés ! - + Change assets limit Limiter le nombre d'actifs - + Select all assets Sélectionnez tous les actifs - + You can still enable %1 assets. Selected: %2. Vous pouvez toujours activer %1 actifs. Sélectionnés: %2. - + Add a custom asset - + Close Fermer - + Enable Activer @@ -1342,27 +1292,27 @@ Clause de non-responsabilité et conditions d'utilisation - + Accept EULA Acceptez l'EULA - + Accept Terms and Conditions Accepter les termes et conditions - + Close Fermer - + Cancel Annuler - + Confirm Confirmer @@ -1398,10 +1348,43 @@ Les frais seront calculés + + GasInfoModal + + + How do I calculate gas? + + + + + Gas is measured in gwei. Gwei is just a unit of Ether, and is equal to 0.000000001 ETH (or the equivalent platform coin such as AVAX or BNB). The gas price varies over time depending on network congestion. + + + + + The gas limit is how many units of gas (maximum) you allocate to pay for a transaction. The gas required depending on the size of the transaction & data being transmitted. + + + + + A standard transaction not involving contracts uses 21,000 gas units, with any of the limit remaining returned to the source address. + + + + + Transactions involving contracts may result in the whole limit being consumed, so be careful not to set it too high. + + + + + For more information, read the article at <a href="https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use">https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use</a> + + + General - + %n day(s) %n jour(s) @@ -1409,7 +1392,7 @@ - + %nd day @@ -1418,7 +1401,7 @@ - + %nh hours @@ -1427,7 +1410,7 @@ - + %nm minutes @@ -1436,7 +1419,7 @@ - + %ns seconds @@ -1445,7 +1428,7 @@ - + %nms milliseconds @@ -1454,91 +1437,97 @@ - + - - - + <b>Taker tx fee:</b> - + <b>Dex tx fee:</b> - + <b>Dex fee:</b> - + <b>Maker tx fee:</b> - + %1 %2 %3 (%4) - + Trading Fee Frais d'échanges - + Minimum Trading Amount Frais d'échange minimum - + Wallet %1 already exists WALLETNAME Le portefeuille %1 existe déjà - + %1 balance is lower than the fees amount: %2 %3 La %1 balance est inférieur aux frais: %2 %3 - + Tradable (after fees) %1 balance is lower than minimum trade amount Le solde négociable (après frais) %1 est inférieur au montant minimum de la transaction - + Please fill the price field Veuillez remplir le champ de prix - + Please fill the volume field - Veuillez remplir le champ de volume + + + + + + Please wait for %1 to fully activate + - - + + %1 volume is lower than minimum trade amount Le volume de %1 est inférieur au montant minimum de la transaction - - + + %1 needs to be enabled in order to use %2 %1 doit être activé pour utiliser %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions Le solde %1 doit être financé, un solde différent de zéro est requis pour payer les frais de transactions de %2 - + Unknown Error Erreur inconnue @@ -1566,17 +1555,17 @@ Taux CEX - + Price Prix - + Quantity Quantité - + Total Total @@ -1584,17 +1573,17 @@ ImportWallet - + Failed to Import the wallet Échec de l'importation du portefeuille - + Import wallet - Setup Importer le portefeuille - Configuration - + Import wallet - Choose password Importer le portefeuille - Choisir le mot de passe @@ -1604,59 +1593,89 @@ Nom du portefeuille - + Enter seed Entrez la phrase de récupération - + Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue. - - + + i understand + je comprends + + + + + я согласен + + + + + + je comprends + + + + + + entiendo + + + + + + anladım + + + + + + ich verstehe - + Ok Ok - + Allow custom seed Autoriser les phrases de récupération personnalisées - + <strong>Allow custom seed</strong> <strong>Autoriser les phrases personnalisées</strong> - + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. Les phrases de départ personnalisées peuvent être moins sécurisées et plus faciles à déchiffrer qu'une phrase de départ ou une clé privée (WIF) conforme à BIP39 générée.<br><br>Pour confirmer que vous comprenez le risque et savez ce que vous faites, tapez <strong>'Je comprends'</strong> dans la case ci-dessous. - + I understand Je comprends - + Next Suivant - + Enter the same password to confirm Entrez le même mot de passe pour confirmer - + Continue Continuer @@ -1691,16 +1710,21 @@ Try again or select 'Allow custom seed' to continue. Best Orders Meilleurs offres + + + Enter volume to see best orders. + + ListDelegate - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 n'est pas activé - Souhaitez vous l'activer pour pouvoir selectionnez les meilleurs offres %2 ?<br><a href='#'>Oui</a> - <a href='#no'>Non</a> - + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 Cette commande nécessite un montant minimum de %1 %2 <br>Vous n'avez pas assez de fonds.<br> %3 @@ -1739,149 +1763,194 @@ Try again or select 'Allow custom seed' to continue. Login - + Incorrect Password Mot de passe incorrect - + Log In - + Cancel Annuler + + LogoutModal + + + Exit %1 or go to login menu? + + + + + Warning: You currently have a swap in progress. +Logging out may result in a failed swap. + + + + + Warning: You currently have open maker orders. +They will be removed from the orderbook until you log in again. + + + + + Login menu + + + + + Exit + + + + + Cancel + Annuler + + Main - + Segwit Segwit - + Confirmation Confirmation - + Do you want to send your %1 funds to %2 wallet first? Voulez-vous d'abord envoyer vos fonds %1 vers le portefeuille %2 ? - + Success Succès - + Your transaction is send, may take some time to arrive Votre transaction est envoyée, peut prendre un certain temps pour arriver - + Price Prix - + Change 24hr - + Porfolio - + Contract Address - + Send Envoyez - + Enable %1 ? Activer %1 ? - + Yes Oui - + No Non - + Receive Recevoir - + Swap Échange - + is wallet only - + Rewards Récompenses - + Faucet Robinet - - - + + + Public Key - + Copied to Clipboard Copier dans le presse-papier - + Loading market data Chargement des données de marché - + There is no chart data for this ticker yet Il n'y a pas encore de données graphiques pour ce ticker - - No transactions - Pas de transactions + + Fetching transactions... + + + + + Please wait, %1 is %2 + - - Refreshing - Actualiser + + % activated... + + + + + No transactions available + - - Fetching transactions - Récupération des transactions + + Click to view your address on %1 (%2) block explorer + @@ -1889,54 +1958,102 @@ Try again or select 'Allow custom seed' to continue. Échanger - + Trading Information Informations de Trading - - Exchange Rates - Taux d'échanges + + Chart + Chart - + Orders Ordres - + History Historique - + Place Order Placer l'ordre - + Order Selected Ordre séléctionné - + START SWAP COMMENCER L'ÉCHANGE + + + + Address Book + Carnet d'adresses + + + + Search contact + + + + + + NEW CONTACT + + + + + Name + Nom + + + + Tags + Tags + + + + Edit + Éditer + + + + Delete + Supprimez + + + + address copied to clipboard + + + + + This contact does not have any registered address. + + MarketModeSelector - - Sell - Vendre + + Sell %1 + TICKER + - - Buy - Acheter + + Buy %1 + TICKER + @@ -1983,51 +2100,84 @@ Try again or select 'Allow custom seed' to continue. Prix + + NewContactPopup + + + Contact name + + + + + This contact name already exists. + Ce nom de contact existe déjà. + + + + + ADD + + + NewUpdateModal - - - + + + Searching new updates - + Fetching... - - - + + + Close Fermer - - Could not check new updates because of the following reason: + + Could not check new updates for the following reason: %1 - + New version found - + + Mandatory version found + + + + %1 %2 is available ! - + + This update is mandatory to continue using the application + + + + + Close Dex + + + + Your application is updated. - + Download Téléchargement @@ -2035,112 +2185,112 @@ Try again or select 'Allow custom seed' to continue. NewWallet - + Wrong word, please check again Mauvais mot, veuillez vérifier à nouveau - + st - + nd - + rd - + th - + Failed to create a wallet Impossible de créer un portefeuille - + New Wallet Nouveau portefeuille - + Confirm Seed Confirmer la phrase de récupération - + Choose Password Choisissez un mot de passe - + Important: Back up your seed phrase before proceeding! Important: sauvegardez votre phrase de recupération avant de continuer ! - + We recommend storing it offline. Nous vous recommandons de le stocker hors ligne. - + Generated Seed Générer un Seed - + Seed phrase Phrase de récupération - + copied to clipboard copié dans le presse-papier - + Next Suivant - + Let's double check your seed phrase Vérifions à nouveau votre phrase de récupération - + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. Votre phrase de récupération est importante - c'est pourquoi nous aimons nous assurer qu'elle est correcte. Nous vous poserons trois questions différentes au sujet de votre phrase source pour vous assurer que vous pourrez facilement restaurer votre portefeuille à tout moment. - + Enter the - + word - + Check Vérifier - + Enter the same password to confirm Entrez le même mot de passe pour confirmer - + Continue Continuer @@ -2171,150 +2321,167 @@ Try again or select 'Allow custom seed' to continue. NotificationsModal - + Matching Recherche en cours - + Order Matching Recherche d'un ordre - + Matched Trouvé - + Order Matched Ordre trouvé - + Ongoing En cours - + Swap Ongoing Échange en cours - + Successful Réussi - + Swap Successful Échange terminé - + Refunding En cours de remboursement - + Failed Échoué - + Swap Failed Erreur lors de l'échange - + Unknown Inconnue - + Unknown State État inconnu - + Swap status updated État du swap mis à jour - + You sent %1 Vous avez envoyé %1 - + You received %1 Vous avez reçu %1 - + Your wallet balance changed Le solde de votre portefeuille a changé - + + %1 Enable status + TICKER + + + + Please check your internet connection (e.g. VPN service or firewall might block it). Veuillez vérifier votre connexion Internet (par exemple, le service VPN ou le pare-feu peut la bloquer). - + Failed to enable %1 TICKER Échec de l'activation de %1 - + + Failed to disable %1 + TICKER + + + + Endpoint not reachable Point final non accessible - + Could not reach to endpoint Impossible d'atteindre le point de terminaison - + Mismatch at %1 custom asset configuration TICKER Non-correspondance à la configuration de l'asset personnalisé %1 - + Application needs to be restarted for %1 custom asset. TICKER L'application doit être redémarrée pour l'asset personnalisé %1. - + Batch %1 failed. Reason: %2 Le lot %1 a échoué. Raison :%2 - + Show Montrer - + Restart Redémarrer - + Quit Quitter - - There isn't any notification - Il n'y a aucune notification + + Notifications + + + + + There aren't any notifications + - + Mark all as read Tout marquer comme lu @@ -2322,46 +2489,97 @@ Try again or select 'Allow custom seed' to continue. OrderForm - + Amount to sell Montant à vendre - + Amount to receive Montant à recevoir - - Min volume: - Min volume : + + Max + Max + + + + Swap 25% of your tradable balance. + + + + + Swap 50% of your tradable balance. + - How to use the pro-view slider ? - Comment utiliser le slider pro-view ? + Swap 100% of your tradable balance. + + + + + Min Volume + + + + + Min amount to sell + + + + + Min amount to receive + + + + + Minimum accepted trade equals 10% of order volume. + + + + + Minimum accepted trade equals 25% of order volume. + + + + + Minimum accepted trade equals 50% of order volume. + - - This slider is used to setup the order requirements you need. -Left slider: Sets the minimum amount required to process a trade. -Right slider: Sets the volume you want to trade. - Ce curseur est utilisé pour configurer les exigences de commande dont vous avez besoin. -Curseur de gauche : définit le montant minimum requis pour traiter une transaction. -Curseur droit : définit le volume que vous souhaitez trader. + + Min volume: + Min volume : - + Use custom minimum trade amount Utiliser le montant d'échange minimum personnalisé - + Price Prix - + + Reduce 1% relative to CEX market price. + + + + + Use CEX market price. + + + + + Increase 1% relative to CEX market price. + + + + Volume Volume @@ -2369,7 +2587,7 @@ Curseur droit : définit le volume que vous souhaitez trader. OrderLine - + Funds are recoverable Les fonds sont récupérables @@ -2385,103 +2603,114 @@ Curseur droit : définit le volume que vous souhaitez trader. OrderModal - + Swap Details Détails de l'échange - + Order Details Détails de l'ordre - + Order Type - + Maker Order Ordre de vente - + Taker Order Ordre d'achat - + Refund State État de remboursement - + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back Votre échange a échoué, mais le processus de remboursement automatique de votre paiement a déjà commencé. Veuillez patienter et garder l'application ouverte jusqu'à ce que vous receviez votre remboursement - + Date Date - - ID - ID - - - + Recover Funds Récupérer des fonds - + Refunding... Remboursement... - + View on Explorer Voir dans l'explorateur - - Maker Payment Sent ID - Identifiant d'envoi du paiement du créateur + + Cancel Order + Annuler l'ordre - - Maker Payment Spent ID - Identifiant de paiement du créateur + + Error ID + ID de l'erreur - - Taker Payment Spent ID - Identifiant de paiement du preneur d'achat + + + Swap ID + ID du Swap - - Taker Payment Sent ID - Identifiant d'envoi du paiement du preneur + + Maker Payment Sent Transaction ID + - - Cancel Order - Annuler l'ordre + + Maker Payment Spent Transaction ID + - - Error ID - ID de l'erreur + + Maker Payment TXID + + + + + Taker Payment Spent Transaction ID + + + + + Taker Payment Sent Transaction ID + - - + + Taker Payment TXID + + + + + Error Log Journal des erreurs - + Close Fermer @@ -2508,17 +2737,17 @@ Please select a new order. OrdersPage - + From De - + To Vers - + Apply Filter Appliquer les changements @@ -2534,17 +2763,17 @@ Please select a new order. Date - + Export CSV Exporter CSV - + Cancel All - + Please choose the CSV export name and location Veuillez choisir le nom et l'emplacement de l'exportation CSV @@ -2560,42 +2789,39 @@ Please select a new order. PasswordField - + Password Mot de passe - + Enter your wallet password Entrez le mot de passe de votre portefeuille - + At least 1 lowercase alphabetical character Au moins 1 caractère alphabétique en minuscule - + At least 1 uppercase alphabetical character Au moins 1 caractère alphabétique en majuscule - + At least 1 numeric character Au moins 1 caractère numérique - + At least 1 special character (eg. !@#$%) Au moins 1 caractère spécial (ex: ! @ # $%) - - - At least %n character(s) - - Au moins %n caractère - Au moins %n caractères - + + + Between %1 and %2 character(s) + @@ -2629,12 +2855,12 @@ Please select a new order. Rechercher un actif - + Show only coins with balance Afficher uniquement les assets avec solde - + (%1/%2) (%1/%2) @@ -2647,38 +2873,38 @@ Please select a new order. PriceLine - + Set swap price for evaluation Définir le prix d'échange pour l'évaluation - + Exchange rate Taux de l'échange - + Selected Choisi - + Expensive Coûteuse - + Expedient Abordable - + %1 compared to CEX PRICE_DIFF% %1 par rapport aux CEX - + CEXchange rate Taux du CEX @@ -2687,36 +2913,31 @@ Please select a new order. PriceLineSimplified - Set swap price for evaluation - Définir le prix d'échange pour l'évaluation - - - Exchange rate Taux de l'échange - + Selected Choisi - + CEXchange rate Taux du CEX - + Expensive Coûteuse - + Expedient Abordable - + %1 compared to CEX PRICE_DIFF% %1 par rapport aux CEX @@ -2725,12 +2946,12 @@ Please select a new order. ProView - + Failed to place the order Échec lors du placement de l'ordre - + Placed the order L'ordre a été placé avec succès @@ -2747,22 +2968,29 @@ Please select a new order. ReceiveModal - Receive - Recevoir + Receive %1 + TICKER + + + + + Only send %1 to this address + TICKER + - - Only send %1 to this address: + + %1 address TICKER - + copied to clipboard. - + Close Fermer @@ -2770,74 +2998,97 @@ Please select a new order. RecoverSeedModal - - + + View seed and private keys Afficher le seed et les clefs privées - + Please enter your password to view the seed. Veuillez entrer votre mot de passe pour voir la phrase de récupération. - + Seed - + Backup Seed - + Public Address copied to clipboard - + Cancel Annuler - - + + Incorrect Password + Mot de passe incorrect + + + + copied to clipboard copié dans le presse-papier - - + + RPC Password Mot de passe RPC - + Search a coin. Rechercher une asset. - + Public Address Adresse publique - + Private Key copied to clipboard - + Private Key Clé privée - + View Voir + + RemoveContactPopup + + + Do you want to remove this contact ? + Voulez-vous supprimer ce contact ? + + + + Yes + Oui + + + + No + Non + + RestartModal @@ -2877,7 +3128,7 @@ Please select a new order. SearchField - + Search Rechercher @@ -2885,149 +3136,162 @@ Please select a new order. SendModal - + Failed to send Échec de l'envoi - - Failed to Send - Échec de l'envoi - - - + Prepare to send Préparez à envoyer du - + Address of the recipient Adresse du destinataire - + Amount to send Montant à envoyer - + Gas price Prix ​​du gaz - + Recipient's address Adresse du destinataire - + The address has to be mixed case. L'adresse doit être mixte (case). - + + Failed to Broadcast + + + + Fix Réparer - + MAX MAX - + Fiat amount: Unavailable - + Fiat amount: %1 - + %1 amount: %2 - + Specify in Fiat - + Specify in Crypto - + Enable Custom Fees Activer les frais personnalisés - - Only use custom fees if you know what you are doing! - N'utilisez des frais personnalisés que si vous savez ce que vous faites ! - - - + Enter the custom fee Entrez les frais personnalisées - + Gas Limit Limite de gaz - + Custom Fee can't be higher than the amount Les frais personnalisées ne peuvent pas être supérieurs au montant - + Not enough funds. Pas assez de fonds. - + + You have %1 AMT TICKER Vous avez %1 - + + + Only use custom fees if you know what you are doing! + + + + Close Fermer - + Prepare Préparer - - + + Send Envoyez - + + %1 address + TICKER + + + + + copied to clipboard. + + + + Amount Montant - + Fees Frais - + Date Date - + Back Retour @@ -3035,22 +3299,22 @@ Please select a new order. SendModalContactList - + Select a contact with an %1 address Sélectionnez un contact avec une adresse %1 - + Search for contacts... Rechercher des contacts... - + %1 addresses %1 adresses - + 1 address 1 adresse @@ -3079,42 +3343,60 @@ Please select a new order. SendResult - + Transaction Complete! Transaction terminée ! - + + %1 txid + TICKER + + + + + + copied to clipboard. + + + + Recipient's address Adresse du destinataire - + + %1 address + TICKER + + + + Amount Montant - + Fees Frais - + Date Date - + Transaction Hash Hachage de la transaction - + Close Fermer - + View on Explorer Voir dans l'explorateur @@ -3122,281 +3404,240 @@ Please select a new order. SettingModal - - Confirm Logout - Confirmer la déconnexion - - - - Are you sure you want to log out? - Êtes-vous sûr de vouloir vous déconnecter ? - - - - Yes - Oui - - - - + + Cancel Annuler - + Settings Réglages - + Language Langue - + User Interface Interface utilsateur - + Security Sécurité - + General Général - + About & Version À propos & version - + Enable Desktop Notifications Activer les notifications - + Maximum number of enabled coins Nombre maximum d'actifs activés - + Logs Journaux - + Open Folder Ouvrir le dossier - - + + Reset wallet configuration Réinitialiser la configuration du portefeuille - + This will restart your wallet with default settings Cela redémarrera votre portefeuille avec les paramètres par défaut - + + Confirm Confirmer - + Changing theme to %1 Changer le thème en %1 - + + Disable 2FA? + + + + + Enter your wallet password to confirm + + + + + Type password + Tapez votre mot de passe + + + + 2FA status + + + + + 2FA disabled successfully + + + + + + Ok + Ok + + + + Wrong password! + + + + + Wallet password is incorrect + + + + Application Version - + copied to clipboard copié dans le presse-papier - + Reset Réinitialiser - + Current Font Police actuelle - + Current font changed to %1. La police actuelle est passée à %1. - + Theme Thème - + Ask system's password before sending coins ? (2FA) Demander le mot de passe du système avant d'envoyer des actifs ? (2FA) - + Application version Version de l'application - + MM2 version Version de MM2 - + MM2 Version MM2 Version - + MM2 Version copied to clipboard. MM2 Version copiée dans le presse-papiers. - + Qt version Version de Qt - + Qt Version Qt Version - + Qt Version copied to clipboard. Version Qt copiée dans le presse-papiers. - + Search Update Rechercher une mise à jour - + Logout Se déconnecter - - - - - - + View seed and private keys Afficher la phrase de récupération et les clefs privées - - + + Show Montrer - + Setup Camouflage Password Configurer le mot de passe de camouflage - + Open Ouvrir - - Disclaimer and ToS - Clause de non-responsabilité et conditions d'utilisation - - - - Settings - - - Fiat - Monnaie fiduciaire - - - - Recommended: - Conseillé : - - - - Enable Desktop Notifications - Activer les notifications - - - - Use QtTextRendering Or NativeTextRendering - Utilisez QtTextRendering ou NativeTextRendering - - - - Open Logs Folder - Ouvrir le répertoire de logs - - - - View seed and private keys - Voir le seed et les clefs privées - - - + Disclaimer and ToS Clause de non-responsabilité et conditions d'utilisation - - - Setup Camouflage Password - Configurez un mot de passe de camouflage - - - - Reset wallet configuration - Réinitialiser la configuration du portefeuille - - - - Delete Wallet - Supprimez le portefeuille - - - - Log out - Déconnexion - - - - mm2 version - Version de mm2 - Sidebar - - Search coin - Rechercher un actif + + Search + Rechercher - + Add asset Ajouter un actif @@ -3508,32 +3749,32 @@ Please select a new order. De - + To Vers - + Cancel Annuler - + Apply filter Appliquer changement - + Export Exportation - + Please choose the CSV export name and location Veuillez choisir le nom et l'emplacement de l'exportation CSV - + No results found Aucun résultat trouvé @@ -3542,57 +3783,57 @@ Please select a new order. SubOrders - + Orders Ordres - + Close filtering options. Fermez les options de filtrage. - + Filter Filtrer - + Date Date - + Open filtering options. Ouvrir les options de filtrage. - + Filter settings Paramètres de filtre - + From De - + To Vers - + Cancel Annuler - + Apply filter Appliquer changement - + No results found Aucun résultat trouvé @@ -3728,7 +3969,7 @@ Network fees can vary greatly depending on your selected trading pair. Changelog - + Open Logs Folder Ouvrir le répertoire de logs @@ -3736,31 +3977,23 @@ Network fees can vary greatly depending on your selected trading pair. SwapProgress - + act SHORT FOR ACTUAL TIME act - + est SHORT FOR ESTIMATED est - + Progress details Détails de la progression - - SweetDexComboBox - - - Search - Rechercher - - TextAreaWithTitle @@ -3775,14 +4008,17 @@ Network fees can vary greatly depending on your selected trading pair. - TextEditWithTitle + TextEditWithCopy - - Swap ID - ID du Swap + + copied to clipboard + copié dans le presse-papier + + + TextEditWithTitle - + copied to clipboard copié dans le presse-papier @@ -3790,7 +4026,7 @@ Network fees can vary greatly depending on your selected trading pair. TextFieldWithTitle - + Required Requis @@ -3806,22 +4042,32 @@ Network fees can vary greatly depending on your selected trading pair. Trade - + Swap Échange - + Instant trading with best orders Trading instantané avec les meilleurs ordres - + + Reset form + + + + + You have no tradable assets + + + + From De - + Enter an amount Entrez un montant @@ -3841,119 +4087,109 @@ Network fees can vary greatly depending on your selected trading pair. Choisir une commande - + Price Prix - + Better price found: %1. Updating forms. Meilleur prix trouvé : %1. Mise à jour du formulaire. - + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. Meilleur prix (%1) trouvé mais la quantité reçue (%2) est inférieure à votre montant de réception (%3). Cliquez ici pour mettre à jour la commande sélectionnée. - - Reset form. - Réinitialiser le formulaire. - - - - You have no tradable assets. - - - - + %1 - + Tradable: Disponible: - + Min: %1 - + Pick a coin Choisissez un actif - + SWAP NOW ÉCHANGER MAINTENANT - + Failed to place the order Échec lors du placement de l'ordre - + Placed the order L'ordre a été placé - + Entered amount must be superior than 0. Le montant saisi doit être supérieur à 0. - + You must select an order. Vous devez sélectionner une commande. - + Entered amount is below the minimum required by this order: %1 Le montant saisi est inférieur au minimum requis par cette commande : %1 - - + + %1 needs to be enabled in order to use %2 %1 doit être activé pour utiliser %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions Le solde %1 doit être financé, un solde différent de zéro est requis pour payer les frais de transactions de %2 - + %1 balance does not have enough funds to pay the gas of %2 transactions - + No buy orders found for %1. Aucun ordre d'achat trouvé pour %1. - + You can check later or try to sell a different coin. Vous pouvez vérifier plus tard ou essayer de vendre un actif différent. - + Calculating fee estimate... - + Total %1 fees: Frais totaux %1 : - + %2 (%3) @@ -3972,31 +4208,26 @@ Network fees can vary greatly depending on your selected trading pair. - Chart - Chart - - - Ticker Selectors - + Trading Information Informations de Trading - + Order Book Carnet d'ordres - + Best Orders Meilleurs offres - + Place Order Placer l'ordre @@ -4004,77 +4235,88 @@ Network fees can vary greatly depending on your selected trading pair. TransactionDetailsModal - + Transaction Details Détails de la transaction - + + %1 txid + TICKER + + + + + copied to clipboard. + + + + Amount Montant - + Fees Frais - + + From address + + + + + To address + + + + Date Date - + Unconfirmed Non confirmé - + Transaction Hash Hachage de la transaction - - Transactions - - - - - txid copied to clipboard - - - - + Confirmations Confirmations - + Block Height Hauteur de bloc - + From De - + To Vers - + Notes Remarques - + Close Fermer - + View on Explorer Voir dans l'explorateur @@ -4082,22 +4324,22 @@ Network fees can vary greatly depending on your selected trading pair. Transactions - + Received Reçue - + Sent Envoyé - + fees frais - + Unconfirmed Non confirmé @@ -4118,19 +4360,6 @@ Network fees can vary greatly depending on your selected trading pair. Carnet d'ordres - - WalletNameField - - - Wallet Name - Nom du portefeuille - - - - Enter the name of your wallet here - Entrez le nom du portefeuille ici - - WalletsView @@ -4154,123 +4383,160 @@ Network fees can vary greatly depending on your selected trading pair. - + My Wallets Mes portefeuilles - + No wallets found! - - + + Delete Supprimez - + Enter password to confirm deletion of Entrez le mot de passe pour confirmer la suppression de - + wallet portefeuille - + Type password Tapez votre mot de passe - + Cancel Annuler - - + + Wallet status État du portefeuille - + wallet deleted successfully portefeuille supprimé avec succès - - + + Ok Ok - + wallet password is incorrect le mot de passe du portefeuille est incorrect + + ZcashParamsModal + + + %1 Activation Failed! + + + + + To activate ZHTLC coins, you need to download the Zcash Params. +This might take a few minutes... + + + + + Download params & enable coins + + + + + More Info + + + + + Close + Fermer + + + + atomic_dex::settings_page + + + An error has occurred. + + + atomic_dex::wallet_page - + You do not have enough funds. Vous n'avez pas assez de fonds. - + %1 is not activated: click on the button to enable it or enable it manually %1 n'est pas activé : cliquez sur le bouton pour l'activer ou l'activer manuellement - + You need to have %1 to pay the gas for %2 transactions. Vous devez avoir %1 activée pour payer les frais de transactions de %2. - + Checksum verification failed for %1. Échec de la vérification du checksum de contrôle pour %1. - + Invalid checksum for %1. Click the button to convert to mixed case address. - + Legacy address used for %1. Click the button to convert to a Cashaddress. - + %1 address must be prefixed with 0x L'adresse %1 doit être précédée de 0x - + %1 address length is invalid, please use a valid address. La longueur de l'adresse %1 n'est pas valide, veuillez utiliser une adresse valide. - + %1 address is invalid. L'adresse %1 n'est pas valide. - + Invalid checksum. Somme de contrôle invalide. - + %1 address has invalid prefixes. L'adresse %1 a des préfixes non valides. - + Backend error: %1 Erreur de backend : %1 @@ -4278,32 +4544,12 @@ Network fees can vary greatly depending on your selected trading pair. main - + Logout Se déconnecter - - Confirm Logout - Confirmer la déconnexion - - - - Are you sure you want to log out? - Êtes-vous sûr de vouloir vous déconnecter ? - - - - Yes - Oui - - - - Cancel - Annuler - - - + Balance Balance diff --git a/atomic_defi_design/assets/languages/atomic_defi_lang_template.ts b/atomic_defi_design/assets/languages/atomic_defi_lang_template.ts new file mode 100644 index 0000000000..5836a5dfc1 --- /dev/null +++ b/atomic_defi_design/assets/languages/atomic_defi_lang_template.ts @@ -0,0 +1,3713 @@ + + + + + AddAddressForm + + + Use standard network address + + + + Label + + + + This key already exists. + + + + Address + + + + + Cancel + + + + Convert + + + + Edit + + + + Add + + + + You need to enable %1 before adding this kind of address. + + + + Enable + + + + AddCustomCoinModal + + + Get the contract address from + + + + Choose the asset type + + + + Cancel + + + + + + Next + + + + Contract address + + + + Enter the contract address + + + + Choose the asset ticker + + + + Ticker + + + + Enter the ticker + + + + Get the contract address from + + + + + + + Previous + + + + Choose the asset logo + + + + Browse + + + + Please choose the asset logo + + + + Configuration + + + + All configuration fields will be fetched using the contract address you provided. + + + + Name + + + + Enter the name + + + + Coingecko ID + + + + Enter the Coingecko ID + + + + Get the Coingecko ID + + + + Active + + + + + Preview + + + + WARNING: Application will restart immidiately to apply the changes! + + + + Asset not found, please go back and make sure Contract Address is correct + + + + Config Fields + + + + Fetched Data + + + + Submit & Restart + + + + AddTagPopup + + + Tag name + + + + Contact already has this tag. + + + + + ADD + + + + AmountChart + + + Work in progress + + + + App + + + Recover Funds Result + + + + AssetFromStandardSelector + + + Choose a valid + + + + asset + + + + Search an asset + + + + Disabled + + + + AssetPieChart + + + Assets + + + + AssetsList + + + Asset + + + + Balance + + + + Fiat Balance + + + + Change 24h + + + + Price + + + + Source + + + + Activating: + + + + Price provider is: %1 + + + + Bottom + + + Settings + + + + Support + + + + Privacy + + + + Disable Privacy? + + + + Enter wallet password to confirm + + + + Type password + + + + Confirm + + + + Cancel + + + + Privacy status + + + + Privacy mode disabled successfully + + + + + Ok + + + + Wrong password! + + + + wallet password is incorrect + + + + CamouflagePasswordModal + + + Setup Camouflage Password + + + + Camouflage Password is a secret password for emergency situations. + + + + Using it to login will display your balance lower than it actually is. + + + + Here you enter the suffix and at login you need to enter {real_password}{suffix} + + + + Password suffix + + + + Confirm pasword suffix + + + + Enter a password suffix + + + + Enter the same password suffix to confirm + + + + Cancel + + + + Save + + + + CannotEnableCoinModal + + + Failed to enable %1 + + + + Enabling %1 did not succeed. Limit of enabled coins might have been reached. + + + + Change limit in settings + + + + Cancel + + + + Center + + + Portfolio + + + + Wallet + + + + DEX + + + + Address Book + + + + Fiat + + + + CexInfoModal + + + Market Data + + + + Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a> + + + + Chart + + + Loading market data + + + + There is no chart data for this pair yet + + + + ClaimRewardsModal + + + Failed to prepare to claim rewards + + + + Claim your %1 reward? + TICKER + + + + No UTXOs eligible for claiming + + + + Transaction fee is higher than the reward! + + + + You will receive + + + + Refresh + + + + Read more about KMD active users rewards + + + + UTXO + + + + Amount + + + + Reward + + + + Accruing Start + + + + Accruing Stop + + + + Time Left + + + + Error + + + + Locktime is not set + + + + Locktime is less than the threshold + + + + UTXO height is greater than end of the era + + + + UTXO amount is less than 10 + + + + One hour did not pass yet + + + + Transaction is in mempool + + + + Unknown problem + + + + Cancel + + + + Confirm + + + + CoinMenu + + + Disable %1 + TICKER + + + + Disable and Delete %1 + TICKER + + + + Disable all %1 assets + + + + Disable all assets + + + + Disable 0 balance assets + + + + ComboBoxWithSearchBar + + + Search + + + + Combo_fiat + + + Language + + + + Fiat + + + + Recommended: + + + + ConfirmMultiOrderTradeModal + + + Confirm Multi Order Details + + + + These swaps requests can not be undone and this is the final event! + + + + These transactions can take up to 60 mins - DO NOT close this application! + + + + Same funds will be used until an order matches. + + + + Note that if one order is filled other will not be cancelled. + + + + Cancel + + + + Confirm + + + + Placed multiple orders + + + + ConfirmTradeModal + + + Confirm Exchange Details + + + + Trade price is more than 50% different to CEX! Confirm? + + + + This swap request can not be undone and is a final event! + + + + This transaction can take up to 60 mins - DO NOT close this application! + + + + Loading fees... + + + + <b>Total %1 fees:</b> + + + + Security configuration + + + + dPoW protected + + + + %1 confirmations for incoming %2 transactions + + + + Read more about dPoW + + + + Use custom protection settings for incoming %1 transactions + TICKER + + + + Enable Komodo dPoW security + + + + Required Confirmations + + + + Warning, this atomic swap is not dPoW protected! + + + + Cancel + + + + Confirm + + + + CopyFieldButton + + + Copied to Clipboard + + + + Dashboard + + + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. + + + + Matching + + + + Order Matching + + + + Matched + + + + Order Matched + + + + Ongoing + + + + Swap Ongoing + + + + Successful + + + + Swap Successful + + + + Refunding + + + + Failed + + + + Swap Failed + + + + Unknown + + + + Unknown State + + + + Started + + + + Negotiated + + + + Taker fee sent + + + + Maker payment received + + + + Maker payment wait confirm started + + + + Maker payment validated and confirmed + + + + Taker payment sent + + + + Taker payment spent + + + + Maker payment spent + + + + Finished + + + + Start failed + + + + Negotiate failed + + + + Taker fee validate failed + + + + Maker payment transaction failed + + + + Maker payment Data send failed + + + + Maker payment wait confirm failed + + + + Taker payment validate failed + + + + Taker payment wait confirm failed + + + + Taker payment spend failed + + + + Maker payment wait refund started + + + + Maker payment refunded + + + + Maker payment refund failed + + + + DatePicker + + + Date + + + + DefaultCopyIcon + + + copied to clipboard + + + + DefaultRangeSlider + + + Min + + + + Max + + + + DefaultTextEdit + + + copied to clipboard + + + + DeleteWalletModal + + + Delete Wallet + + + + Are you sure you want to delete %1 wallet? + WALLET_NAME + + + + If so, make sure you record your seed phrase in order to restore your wallet in the future. + + + + Enter your wallet password + + + + Wrong Password + + + + Cancel + + + + Delete + + + + DexAppPasswordField + + + Type password + + + + DexKeyChecker + + + At least 1 lowercase alphabetical character + + + + At least 1 uppercase alphabetical character + + + + At least 1 numeric character + + + + At least 1 special character (eg. !@#$%) + + + + At least %n character(s) + + + + Password and Confirm Password have to be same + + + + DexPaginator + + + items per page + + + + DexRangeSlider + + + Min + + + + Half + + + + Max + + + + DexSweetComboBox + + + Search + + + + EditContactModal + + + Edit contact + + + + Contact name + + + + Enter a contact name + + + + Address list + + + + Address Book + + + + address copied to clipboard + + + + Edit + + + + + Add + + + + Tags + + + + Add tag + + + + Close + + + + Confirm + + + + EnableAssetModal + + + The selected address belongs to a disabled asset, you need to enabled it before sending. + + + + Enable + + + + Cancel + + + + EnableCoinModal + + + Enable assets + + + + Select all assets + + + + All assets are already enabled! + + + + You can still enable %1 assets. Selected: %2. + + + + Search asset + + + + Change assets limit + + + + Add a custom asset + + + + Close + + + + Enable + + + + EulaModal + + + Disclaimer & Terms of Service + + + + Accept EULA + + + + Accept Terms and Conditions + + + + Close + + + + Cancel + + + + Confirm + + + + FatalErrorModal + + + Fatal Error + + + + Connection has been lost. You have been disconnected. + + + + Close + + + + FeeInfo + + + Minimum fee + + + + Fees will be calculated + + + + General + + + %n day(s) + + + + %nd + day + + + + %nh + hours + + + + %nm + minutes + + + + %ns + seconds + + + + %nms + milliseconds + + + + - + + + + <b>Taker tx fee:</b> + + + + <b>Dex tx fee:</b> + + + + <b>Dex fee:</b> + + + + <b>Maker tx fee:</b> + + + + %1 %2 %3 (%4) + + + + Trading Fee + + + + Minimum Trading Amount + + + + Wallet %1 already exists + WALLETNAME + + + + %1 balance is lower than the fees amount: %2 %3 + + + + Tradable (after fees) %1 balance is lower than minimum trade amount + + + + Please fill the price field + + + + Please fill the volume field + + + + + Please wait for %1 to fully activate + + + + + %1 volume is lower than minimum trade amount + + + + + %1 needs to be enabled in order to use %2 + + + + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions + + + + Unknown Error + + + + Header + + + You get + + + + You send + + + + Fiat Price + + + + CEX rate + + + + Price + + + + Quantity + + + + Total + + + + ImportWallet + + + Failed to Import the wallet + + + + Import wallet - Setup + + + + Import wallet - Choose password + + + + Wallet Name + + + + Enter seed + + + + Your seed is not BIP39 compliant. +Try again or select 'Allow custom seed' to continue. + + + + + i understand + + + + Ok + + + + Allow custom seed + + + + <strong>Allow custom seed</strong> + + + + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. + + + + I understand + + + + Next + + + + Enter the same password to confirm + + + + Continue + + + + LinksRow + + + Join our Discord server + + + + Follow us on Twitter + + + + Go to Support Guides + + + + List + + + Funds are recoverable + + + + Best Orders + + + + Enter volume to see best orders. + + + + ListDelegate + + + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + + + + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 + + + + LogModal + + + Close + + + + Logging + + + Loading, please wait + + + + Initializing MM2 + + + + Enabling assets + + + + Getting ready + + + + Login + + + Incorrect Password + + + + Log In + + + + Cancel + + + + LogoutModal + + + Exit %1 or go to login menu? + + + + Warning: You currently have a swap in progress. +Logging out may result in a failed swap. + + + + Warning: You currently have open maker orders. +They will be removed from the orderbook until you log in again. + + + + Login menu + + + + Exit + + + + Cancel + + + + Main + + + Segwit + + + + Confirmation + + + + Do you want to send your %1 funds to %2 wallet first? + + + + Success + + + + Your transaction is send, may take some time to arrive + + + + Price + + + + Change 24hr + + + + Porfolio + + + + Contract Address + + + + Send + + + + Enable %1 ? + + + + Yes + + + + No + + + + Receive + + + + Swap + + + + is wallet only + + + + Rewards + + + + Faucet + + + + + + Public Key + + + + Copied to Clipboard + + + + Loading market data + + + + There is no chart data for this ticker yet + + + + Fetching transactions... + + + + Please wait, %1 is %2 + + + + % activated... + + + + No transactions available + + + + Click to view your address on %1 (%2) block explorer + + + + Trade + + + + Trading Information + + + + Chart + + + + + Orders + + + + + History + + + + Place Order + + + + Order Selected + + + + START SWAP + + + + + Address Book + + + + Search contact + + + + + NEW CONTACT + + + + Name + + + + Tags + + + + Edit + + + + Delete + + + + address copied to clipboard + + + + This contact does not have any registered address. + + + + MarketModeSelector + + + Sell %1 + TICKER + + + + Buy %1 + TICKER + + + + MinTradeModal + + + Minimum Trading Amount + + + + the minimum amount of %1 coin available for the order; the min_volume must be greater than or equal to %2; it must be also less or equal than volume param; default is %3 + + + + MultiOrder + + + %1 price is zero! + TICKER + + + + %1 receive volume is lower than minimum trade amount + TICKER + + + + Error: + + + + You'll receive %1 + AMOUNT TICKER + + + + Price + + + + NewContactPopup + + + Contact name + + + + This contact name already exists. + + + + + ADD + + + + NewUpdateModal + + + + + Searching new updates + + + + Fetching... + + + + + + + Close + + + + Could not check new updates for the following reason: +%1 + + + + New version found + + + + Mandatory version found + + + + %1 %2 is available ! + + + + This update is mandatory to continue using the application + + + + Close Dex + + + + Your application is updated. + + + + Download + + + + NewWallet + + + Wrong word, please check again + + + + st + + + + nd + + + + rd + + + + th + + + + Failed to create a wallet + + + + New Wallet + + + + Confirm Seed + + + + Choose Password + + + + Important: Back up your seed phrase before proceeding! + + + + We recommend storing it offline. + + + + Generated Seed + + + + Seed phrase + + + + copied to clipboard + + + + Next + + + + Let's double check your seed phrase + + + + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. + + + + Enter the + + + + word + + + + Check + + + + Enter the same password to confirm + + + + Continue + + + + NoConnection + + + No connection + + + + Please make sure you are connected to the internet + + + + Will automatically retry in %1 seconds + + + + Retry + + + + NotificationsModal + + + Matching + + + + Order Matching + + + + Matched + + + + Order Matched + + + + Ongoing + + + + Swap Ongoing + + + + Successful + + + + Swap Successful + + + + Refunding + + + + Failed + + + + Swap Failed + + + + Unknown + + + + Unknown State + + + + Swap status updated + + + + You sent %1 + + + + You received %1 + + + + Your wallet balance changed + + + + %1 Enable status + TICKER + + + + Please check your internet connection (e.g. VPN service or firewall might block it). + + + + Failed to enable %1 + TICKER + + + + Failed to disable %1 + TICKER + + + + Endpoint not reachable + + + + Could not reach to endpoint + + + + Mismatch at %1 custom asset configuration + TICKER + + + + Application needs to be restarted for %1 custom asset. + TICKER + + + + Batch %1 failed. Reason: %2 + + + + Show + + + + Restart + + + + Quit + + + + Notifications + + + + There aren't any notifications + + + + Mark all as read + + + + OrderForm + + + Price + + + + Reduce 1% relative to CEX market price. + + + + Use CEX market price. + + + + Increase 1% relative to CEX market price. + + + + Volume + + + + Amount to sell + + + + Amount to receive + + + + Max + + + + Swap 25% of your tradable balance. + + + + Swap 50% of your tradable balance. + + + + Swap 100% of your tradable balance. + + + + Min Volume + + + + Min amount to sell + + + + Min amount to receive + + + + Minimum accepted trade equals 10% of order volume. + + + + Minimum accepted trade equals 25% of order volume. + + + + Minimum accepted trade equals 50% of order volume. + + + + Min volume: + + + + Use custom minimum trade amount + + + + OrderLine + + + Funds are recoverable + + + + OrderList + + + No results found + + + + OrderModal + + + Swap Details + + + + Order Details + + + + Order Type + + + + Maker Order + + + + Taker Order + + + + Refund State + + + + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back + + + + Date + + + + Error ID + + + + + Error Log + + + + Close + + + + Cancel Order + + + + + Swap ID + + + + Maker Payment Sent Transaction ID + + + + Maker Payment Spent Transaction ID + + + + Maker Payment TXID + + + + Taker Payment Spent Transaction ID + + + + Taker Payment Sent Transaction ID + + + + Taker Payment TXID + + + + Recover Funds + + + + Refunding... + + + + View on Explorer + + + + OrderRemovedModal + + + Selected Order Removed + + + + The selected order does not exist anymore, it might have been matched or canceled, and no order with a better price is available. +Please select a new order. + + + + OK + + + + OrdersPage + + + + Filter + + + + Date + + + + Export CSV + + + + Apply Filter + + + + Cancel All + + + + From + + + + To + + + + Please choose the CSV export name and location + + + + Pagination + + + items per page + + + + PasswordField + + + Password + + + + Enter your wallet password + + + + At least 1 lowercase alphabetical character + + + + At least 1 uppercase alphabetical character + + + + At least 1 numeric character + + + + At least 1 special character (eg. !@#$%) + + + + At least %n character(s) + + + + PasswordForm + + + Password + + + + Confirm Password + + + + Enter the same password to confirm + + + + Portfolio + + + ADD ASSET + + + + Search asset + + + + Show only coins with balance + + + + (%1/%2) + + + + Portfolio + + + + PriceLine + + + Set swap price for evaluation + + + + Exchange rate + + + + Selected + + + + Expensive + + + + Expedient + + + + %1 compared to CEX + PRICE_DIFF% + + + + CEXchange rate + + + + PriceLineSimplified + + + Exchange rate + + + + Selected + + + + CEXchange rate + + + + Expensive + + + + Expedient + + + + %1 compared to CEX + PRICE_DIFF% + + + + ProView + + + Failed to place the order + + + + Placed the order + + + + QObject + + + Cannot reach the endpoint: + + + + ReceiveModal + + + Receive %1 + TICKER + + + + Only send %1 to this address + TICKER + + + + %1 address + TICKER + + + + copied to clipboard. + + + + Close + + + + RecoverSeedModal + + + + View seed and private keys + + + + Please enter your password to view the seed. + + + + Seed + + + + Backup Seed + + + + Public Address copied to clipboard + + + + Cancel + + + + View + + + + + copied to clipboard + + + + + RPC Password + + + + Search a coin. + + + + Public Address + + + + Private Key copied to clipboard + + + + Private Key + + + + RemoveContactPopup + + + Do you want to remove this contact ? + + + + Yes + + + + No + + + + RestartModal + + + Applying the changes... + + + + Restarting the application. %1 + + + + Restarting the application... + + + + RightClickMenu + + + Cut + + + + Copy + + + + Paste + + + + SearchField + + + Search + + + + SendModal + + + Failed to send + + + + Prepare to send + + + + Address of the recipient + + + + Amount to send + + + + Gas price + + + + Recipient's address + + + + The address has to be mixed case. + + + + Taproot not supported + + + + Failed to Broadcast + + + + Fix + + + + MAX + + + + Fiat amount: Unavailable + + + + Fiat amount: %1 + + + + %1 amount: %2 + + + + Specify in Fiat + + + + Specify in Crypto + + + + Enable Custom Fees + + + + Only use custom fees if you know what you are doing! + + + + Enter the custom fee + + + + Gas Limit + + + + Custom Fee can't be higher than the amount + + + + Not enough funds. + + + + + You have %1 + AMT TICKER + + + + Close + + + + Prepare + + + + + Send + + + + %1 address + TICKER + + + + copied to clipboard. + + + + Amount + + + + Fees + + + + Date + + + + Back + + + + SendModalContactList + + + Select a contact with an %1 address + + + + Search for contacts... + + + + %1 addresses + + + + 1 address + + + + + Back + + + + Choose an %1 address of %2 + + + + Name + + + + Address + + + + SendResult + + + Transaction Complete! + + + + %1 txid + TICKER + + + + + copied to clipboard. + + + + Recipient's address + + + + %1 address + TICKER + + + + Amount + + + + Fees + + + + Date + + + + Transaction Hash + + + + Close + + + + View on Explorer + + + + SettingModal + + + + Cancel + + + + Settings + + + + General + + + + Language + + + + User Interface + + + + Security + + + + Enable Desktop Notifications + + + + Maximum number of enabled coins + + + + Logs + + + + Open Folder + + + + Reset + + + + Current Font + + + + Current font changed to %1. + + + + Theme + + + + Changing theme to %1 + + + + Application Version + + + + copied to clipboard + + + + About & Version + + + + + Reset wallet configuration + + + + This will restart your wallet with default settings + + + + + Confirm + + + + Ask system's password before sending coins ? (2FA) + + + + Disable 2FA? + + + + Enter your wallet password to confirm + + + + Type password + + + + 2FA status + + + + 2FA disabled successfully + + + + + Ok + + + + Wrong password! + + + + Wallet password is incorrect + + + + View seed and private keys + + + + + Show + + + + Setup Camouflage Password + + + + Open + + + + Disclaimer and ToS + + + + Application version + + + + MM2 version + + + + MM2 Version + + + + MM2 Version copied to clipboard. + + + + Qt version + + + + Qt Version + + + + Qt Version copied to clipboard. + + + + Search Update + + + + Logout + + + + Settings + + + Fiat + + + + Recommended: + + + + Enable Desktop Notifications + + + + Use QtTextRendering Or NativeTextRendering + + + + Open Logs Folder + + + + View seed and private keys + + + + Disclaimer and ToS + + + + Setup Camouflage Password + + + + Reset wallet configuration + + + + Delete Wallet + + + + Log out + + + + mm2 version + + + + Sidebar + + + Search + + + + Add asset + + + + SmartChartView + + + Loading market data + + + + There is no chart data for this ticker yet + + + + SubBestOrder + + + Token + + + + Available Quantity + + + + Available Quantity (in %1) + + + + Fiat Volume + + + + CEX Rate + + + + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + + + + SubCoinSelector + + + Token + + + + Balance + + + + Balance Fiat + + + + No Selectable coin. + + + + SubHistory + + + History + + + + Filter + + + + Date + + + + Close filtering options. + + + + Open filtering options. + + + + Filter settings + + + + From + + + + To + + + + Cancel + + + + Apply filter + + + + Export + + + + Please choose the CSV export name and location + + + + No results found + + + + SubOrders + + + + Orders + + + + Close filtering options. + + + + Filter + + + + Date + + + + Open filtering options. + + + + Filter settings + + + + From + + + + To + + + + Cancel + + + + Apply filter + + + + No results found + + + + SupportModal + + + Frequently Asked Questions + + + + Do you store my private keys? + + + + No! %1 is non-custodial. We never store any sensitive data, including your private keys, seed phrases, or PIN. This data is only stored on the user’s device and never leaves it. You are in full control of your assets. + + + + How is trading on %1 different from trading on other DEXs? + + + + Other DEXs generally only allow you to trade assets that are based on a single blockchain network, use proxy tokens, and only allow placing a single order with the same funds. + +%1 enables you to natively trade across two different blockchain networks without proxy tokens. You can also place multiple orders with the same funds. For example, you can sell 0.1 BTC for KMD, QTUM, or VRSC — the first order that fills automatically cancels all other orders. + + + + How long does each atomic swap take? + + + + Several factors determine the processing time for each swap. The block time of the traded assets depends on each network (Bitcoin typically being the slowest) Additionally, the user can customize security preferences. For example, (you can ask %1 to consider a KMD transaction as final after just 3 confirmations which makes the swap time shorter compared to waiting for a <a href="https://komodoplatform.com/security-delayed-proof-of-work-dpow/">notarization</a>. + + + + Do I need to be online for the duration of the swap? + + + + Yes. You must remain connected to the internet and have your app running to successfully complete each atomic swap (very short breaks in connectivity are usually fine). Otherwise, there is risk of trade cancellation if you are a maker, and risk of loss of funds if you are a taker. + +The atomic swap protocol requires both participants to stay online and monitor the involved blockchains for the process to stay atomic. + +If you go offline, so will your orders, and any that are in progress will fail, leading to potential loss of trade / transaction fees, and a wait for the swap to timeout and issue a refund. It may also negatively affect your wallet's reputation score for future trade matching. + +When you come back online, your orders will begin to broadcast again at the price you set before you went offline. If there has been significant price movement in the meantime, you might unintentionally offer someone a bargain! + +For this reason, we recommend cancelling orders before closing %1, or reviewing and revising your prices when restarting %1. + + + + How are the fees on %1 calculated? + + + + There are two fee categories to consider when trading on %1. + +1. %1 charges approximately 0.13% (1/777 of trading volume but not lower than 0.0001) as the trading fee for taker orders, and maker orders have zero fees. + +2. Both makers and takers will need to pay normal network fees to the involved blockchains when making atomic swap transactions. + +Network fees can vary greatly depending on your selected trading pair. + + + + Do you provide user support? + + + + Yes! %1 offers support through the <a href="%2">%1 Discord server</a>. The team and the community are always happy to help! + + + + Who is behind %1? + + + + %1 is developed by the Komodo team. Komodo is one of the most established blockchain projects working on innovative solutions like atomic swaps, Delayed Proof of Work, and an interoperable multi-chain architecture. + + + + Is it possible to develop my own white-label exchange on %1? + + + + Absolutely! You can read our developer documentation for more details or contact us with your partnership inquiries. Have a specific technical question? The %1 developer community is always ready to help! + + + + Which devices can I use %1 on? + + + + %1 is available for mobile on both <a href="%2">Android and iPhone, and for desktop on Windows, Mac, and Linux</a> operating systems. + + + + Compliance Info + + + + Due to regulatory and legal circumstances the citizens of certain jurisdictions including, but not limited to, the United States of America, Canada, Hong Kong, Israel, Singapore, Sudan, Austria, Iran and any other state, country or other jurisdiction that is embargoed by the United States of America or the European Union are not allowed to use this application. + + + + Changelog + + + + Open Logs Folder + + + + SwapProgress + + + act + SHORT FOR ACTUAL TIME + + + + est + SHORT FOR ESTIMATED + + + + Progress details + + + + TextAreaWithTitle + + + Save + + + + Edit + + + + TextEditWithCopy + + + copied to clipboard + + + + TextEditWithTitle + + + copied to clipboard + + + + TextFieldWithTitle + + + Required + + + + Toast + + + Click here to see the details + + + + Trade + + + Swap + + + + Instant trading with best orders + + + + Reset form + + + + You have no tradable assets + + + + From + + + + Enter an amount + + + + MAX + + + + To + + + + Pick an order + + + + Price + + + + Better price found: %1. Updating forms. + + + + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. + + + + %1 + + + + Tradable: + + + + Min: %1 + + + + Pick a coin + + + + SWAP NOW + + + + Failed to place the order + + + + Placed the order + + + + Entered amount must be superior than 0. + + + + You must select an order. + + + + Entered amount is below the minimum required by this order: %1 + + + + + %1 needs to be enabled in order to use %2 + + + + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions + + + + %1 balance does not have enough funds to pay the gas of %2 transactions + + + + No buy orders found for %1. + + + + You can check later or try to sell a different coin. + + + + Calculating fee estimate... + + + + Total %1 fees: + + + + %2 (%3) + + + + TradeViewHeader + + + Pro View Settings + + + + Display Settings + + + + Ticker Selectors + + + + Trading Information + + + + Order Book + + + + Best Orders + + + + Place Order + + + + TransactionDetailsModal + + + Transaction Details + + + + %1 txid + TICKER + + + + copied to clipboard. + + + + Amount + + + + Fees + + + + From address + + + + To address + + + + Date + + + + Unconfirmed + + + + Transaction Hash + + + + Confirmations + + + + Block Height + + + + From + + + + To + + + + Notes + + + + Close + + + + View on Explorer + + + + Transactions + + + Sent + + + + Received + + + + fees + + + + Unconfirmed + + + + UpdateInvalidChecksum + + + The downloaded update archive is corrupted ! + + + + Vertical + + + Order Book + + + + WalletsView + + + Welcome + + + + New wallet + + + + Import wallet + + + + Search your wallets... + + + + My Wallets + + + + No wallets found! + + + + + Delete + + + + Enter password to confirm deletion of + + + + wallet + + + + Type password + + + + Cancel + + + + + Wallet status + + + + wallet deleted successfully + + + + + Ok + + + + wallet password is incorrect + + + + ZcashParamsModal + + + %1 Activation Failed! + + + + To activate ZHTLC coins, you need to download the Zcash Params. +This might take a few minutes... + + + + Download params & enable coins + + + + More Info + + + + Close + + + + atomic_dex::settings_page + + + An error has occurred. + + + + atomic_dex::wallet_page + + + You do not have enough funds. + + + + %1 is not activated: click on the button to enable it or enable it manually + + + + You need to have %1 to pay the gas for %2 transactions. + + + + Checksum verification failed for %1. + + + + Invalid checksum for %1. Click the button to convert to mixed case address. + + + + Legacy address used for %1. Click the button to convert to a Cashaddress. + + + + %1 address must be prefixed with 0x + + + + %1 address length is invalid, please use a valid address. + + + + %1 address is invalid. + + + + Invalid checksum. + + + + %1 address has invalid prefixes. + + + + Backend error: %1 + + + + main + + + Logout + + + + Balance + + + diff --git a/atomic_defi_design/assets/languages/atomic_defi_ru.ts b/atomic_defi_design/assets/languages/atomic_defi_ru.ts index f2380b9740..29f2549db9 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_ru.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_ru.ts @@ -1,42 +1,96 @@ + + AddAddressForm + + + Use standard network address + + + + + Label + + + + + This key already exists. + Этот ключ уже существует. + + + + Address + Адрес + + + + + Cancel + + + + + Convert + Преобразовать + + + + Edit + Редактировать + + + + Add + Добавить + + + + You need to enable %1 before adding this kind of address. + + + + + Enable + Добавить + + AddCustomCoinModal - + Choose the asset type Выберите тип монеты - + Cancel Отменить - - - + + + Next Далее - + Enter the contract address Введите адрес контракта - + Choose the asset ticker Введите тикер монеты - + Ticker Тикер - + Enter the ticker Введите тикер @@ -46,439 +100,165 @@ Получить адрес контракта от - + Contract address - + Get the contract address from Получить адрес контракта от - - - - + + + + Previous Назад - + Choose the asset logo Загрузите логотип монеты - + Browse Выбрать - + Please choose the asset logo Выберите логотип монеты - + Configuration Конфигурация - + All configuration fields will be fetched using the contract address you provided. Все параметры конфигурации будут получены с помощью адреса контракта. - + Name Название - + Enter the name Введите название - + Coingecko ID Coingecko ID - + Enter the Coingecko ID Введите Coingecko ID - + Get the Coingecko ID Получить Coingecko ID - + Active Активно - - + + Preview Превью - + WARNING: Application will restart immidiately to apply the changes! ПРЕДУПРЕЖДЕНИЕ: Приложение будет немедленно перезапущено для применения изменений! - + Asset not found, please go back and make sure Contract Address is correct Токен не найден, убедитесь, что адрес контракта указан верно - + Config Fields Параметры конфигурации - + Fetched Data Полученные данные - + Submit & Restart Отправить и перезапустить - AddressBook - - - Address Book - Адресная книга - - - - New Contact - Новый контакт - - - - Search a contact by name or tags - Поиск контакта по имени или тегам - - - - Name - Имя - - - - Tags (first 6) - Теги (первые 6) - - - - Actions - Действия - - - - Edit - Редактировать - - - - Remove - Удалить - - - - Do you want to remove this contact ? - Вы действительно хотите удалить этот контакт? - - - - Yes - Да - - - - No - Нет - - - - AddressBookAddContactAddressModal - - - Create a new address - Добавить новый адрес - - - - Edit address entry - Внести изменения в адрес - - - - Selected wallet: %1 - Выбранный кошелек: %1 - - - - NONE - НИ ОДИН - - - - Enter a name - Введите имя - - - - This key already exists. - Этот ключ уже существует. - - - - Enter the address - Введите адрес - - - - Validate - Валидировать - - - - Cancel - Отменить - - - - Convert - Преобразовать - - - - AddressBookEditContactModal + AddTagPopup - - Edit contact - Редактировать контакт - - - - Contact Name - Имя контакта - - - - Enter a contact name - Введите имя - - - - Address List - Список адресов - - - - Search for an address entry. - Поиск адреса. - - - - Type - Тип - - - - Key - Ключ - - - - Address - Адрес - - - - Actions - Действия - - - - Add Address + + Tag name - - Tags - Теги - - - - + - + - - - - Confirm - Подтвердить - - - - - Cancel - Отменить - - - - The selected address belongs to a disabled coin, you need to enabled it before sending. - Вы выбрали адрес отключенной монеты, ее необходимо включить перед отправкой. - - - - Enable - Добавить - - - - Cannot send to this address - Отправка на этот адрес невозможна - - - - Your balance is empty - Баланс отсутствует - - - - Ok - ОК - - - - Remove address ? - Удалить адрес ? - - - - Yes - Да + + Contact already has this tag. + - - No - Нет + + + ADD + - AddressBookNewContactCategoryModal - - - Add a new tag - Добавить новый тег - - - - Enter the tag name - Добавить имя тега - - - - This contact already has this tag - У этого контакта уже есть этот тег - - - - Add - Добавить - + AmountChart - - Cancel - Отменить + + Work in progress + Разработка в процессе - AddressBookNewContactModal - - - Create a new contact - Добавить новый контакт - - - - Enter the contact name - Введите имя контакта - - - - This contact name already exists. - Контакт с таким именем уже существует. - - - - Confirm - Подтвердить - + App - - Cancel - Отменить + + Recover Funds Result + Результат восстановления средств - AddressBookSendWalletSelector + AssetFromStandardSelector - + Choose a valid - Выберите валидную - - - - coin - монету + Выберите валидную - - - AddressBookWalletTypeList - - %1 is not enabled - You need to enable it before adding an address. Enable it ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + + asset - - - AddressBookWalletTypeListModal - - - Select wallet type - Выберите тип кошелька - - - - Search - Поиск - - - - AmountChart - - Work in progress - Разработка в процессе + + Search an asset + - - - App - - Recover Funds Result - Результат восстановления средств + + Disabled + @@ -522,7 +302,12 @@ Источник - + + Activating: + + + + Price provider is: %1 Провайдер цены: %1 @@ -530,20 +315,71 @@ Bottom - + Settings Настройки - + Support Поддержка - + Privacy Скрыть баланс + + + Disable Privacy? + + + + + Enter wallet password to confirm + + + + + Type password + Введите пароль + + + + Confirm + + + + + Cancel + + + + + Privacy status + + + + + Privacy mode disabled successfully + + + + + + Ok + Ок + + + + Wrong password! + + + + + wallet password is incorrect + введен неправильный пароль + CamouflagePasswordModal @@ -553,47 +389,47 @@ Установить камуфляжный пароль - + Camouflage Password is a secret password for emergency situations. Камуфляжный пароль - секретный пароль для чрезвычайных ситуаций. - + Using it to login will display your balance lower than it actually is. Используйте его во время входа, чтобы ваш баланс не отображался полностью. - + Here you enter the suffix and at login you need to enter {real_password}{suffix} Здесь вы можете ввести окончание пароля. Во время входа в приложения необходимо будет ввести {ваш пароль}{окончание} - + Password suffix Суффикс пароля - + Confirm pasword suffix Подтвердите суффикс пароля - + Enter a password suffix Задайте суффикс пароля - + Enter the same password suffix to confirm Подтвердите суффикс пароля - + Cancel Отменить - + Save Сохранить @@ -665,17 +501,12 @@ Chart - - Chart - График - - - + Loading market data - + Загрузка рыночных данных - + There is no chart data for this pair yet Нет данных для построения графика для этой торговой пары @@ -683,118 +514,118 @@ ClaimRewardsModal - + Failed to prepare to claim rewards Ошибка при создании транзакции для получения вознаграждения - + Claim your %1 reward? TICKER Получить %1 вознаграждение? - + No UTXOs eligible for claiming Нет UTXO, для которых доступны вознаграждения - + Transaction fee is higher than the reward! Комиссия за транзакцию превышает сумму вознаграждений! - + You will receive - + Refresh Обновить - + Read more about KMD active users rewards Подробнее о вознаграждениях для активных пользователей KMD - + UTXO UTXO - + Amount Сумма - + Reward Вознаграждения - + Accruing Start Начало начисления - + Accruing Stop Прекращение начисления - + Time Left Осталось - + Error Ошибка - + Locktime is not set Время блокировки не установлено - + Locktime is less than the threshold Время блокировки меньше минимального - + UTXO height is greater than end of the era Высота UTXO больше, чем конец эпохи - + UTXO amount is less than 10 UTXO меньше 10 - + One hour did not pass yet 1 час еще не прошел - + Transaction is in mempool Транзакция находится в мемпуле - + Unknown problem Неизвестная проблема - + Cancel Отменить - + Confirm Подтвердить @@ -802,33 +633,41 @@ CoinMenu - + Disable %1 TICKER Удалить %1 - + Disable and Delete %1 TICKER Удалить токен %1 из AtomicDex - + Disable all %1 assets Отключить все %1 ассеты - + Disable all assets Отключить все ассеты - + Disable 0 balance assets + + ComboBoxWithSearchBar + + + Search + Поиск + + Combo_fiat @@ -893,74 +732,83 @@ ConfirmTradeModal - + Confirm Exchange Details Подтвердить данные обмена - + + Trade price is more than 50% different to CEX! Confirm? + + + + This swap request can not be undone and is a final event! Этот запрос на своп не может быть отменен и является окончательным! - + This transaction can take up to 60 mins - DO NOT close this application! Эта транзакция может занять до 60 минут - НЕ закрывайте приложение! - + + Loading fees... + + + + <b>Total %1 fees:</b> - + Security configuration Настройки безопасности - - dPoW protected - защищено dPoW - - - + %1 confirmations for incoming %2 transactions %1 подтверждений для входящих %2 транзакций - - + Read more about dPoW Узнать больше о dPoW - + Use custom protection settings for incoming %1 transactions TICKER Использовать пользовательские настройки защиты для входящих транзакций %1 - + Enable Komodo dPoW security Включить Komodo dPoW - + + dPoW protected + + + + Required Confirmations Необходимое количество подтверждений - + Warning, this atomic swap is not dPoW protected! Предупреждение, этот атомарный своп не защищен dPoW! - + Cancel Отменить - + Confirm Подтверждение @@ -976,186 +824,202 @@ Dashboard - + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. Текущее количество включенных монет не совпадает с конфигурацией. Ваша конфигурация активов будет сброшена. - + Matching Матчинг - + Order Matching Матчинг ордеров - + Matched Сматчен - + Order Matched Ордер сматчен - + Ongoing В процессе - + Swap Ongoing Своп продолжается - + Successful Успешно - + Swap Successful Своп успешно завершен - + Refunding Проводится возврат - + Failed Не завершено - + Swap Failed Своп не был завершен - + Unknown Неизвестно - + Unknown State Статус неизвестен - + Started Начат - + Negotiated Согласован - + Taker fee sent Комиссия тейкера отправлена - + Maker payment received Платеж мейкера получен - + Maker payment wait confirm started Ожидание платежа мейкера - + Maker payment validated and confirmed Платеж мейкера валидирован и подтвержден - + Taker payment sent Платеж тейкера отправлен - + Taker payment spent Платеж тейкера потрачен - + Maker payment spent Платеж мейкера потрачен - + Finished Завершено - + Start failed Не удалось начать - + Negotiate failed Согласование не прошло - + Taker fee validate failed Валидация комиссии тейкера не прошла - + Maker payment transaction failed Платежная транзакция мейкера не прошла - + Maker payment Data send failed Отправка платежных данных мейкера не прошла - + Maker payment wait confirm failed Платежная транзакция мейкера не была подтверждена - + Taker payment validate failed Не прошла валидация платежа тейкера - + Taker payment wait confirm failed Платежная транзакция тейкера не была подтверждена - + Taker payment spend failed Spend платежа тейкера не прошел - + Maker payment wait refund started Ожидание возврата платежа мейкера - + Maker payment refunded Платеж мейкера возвращен - + Maker payment refund failed Возврат платежа мейкера не выполнен + + DatePicker + + + Date + Дата + + + + DefaultCopyIcon + + + copied to clipboard + скопировано в буфер + + DefaultRangeSlider @@ -1169,6 +1033,14 @@ Макс + + DefaultTextEdit + + + copied to clipboard + скопировано в буфер + + DeleteWalletModal @@ -1211,7 +1083,7 @@ DexAppPasswordField - + Type password Введите пароль @@ -1219,36 +1091,32 @@ DexKeyChecker - + At least 1 lowercase alphabetical character Как минимум 1 строчная буква - + At least 1 uppercase alphabetical character Как минимум 1 заглавная буква - + At least 1 numeric character Как минимум 1 цифра - + At least 1 special character (eg. !@#$%) Как минимум 1 специальный символ (!@#$%) - - - At least %n character(s) - - Не менее %n символов - Не менее %n символов - Не менее %n символов - + + + Between %1 and %2 character(s) + - + Password and Confirm Password have to be same Пароль и подтверждение пароля должны совпадать @@ -1269,68 +1137,149 @@ Мин - - Half - Половина + + Half + Половина + + + + Max + Макс + + + + DexSweetComboBox + + + Search + Поиск + + + + EditContactModal + + + Edit contact + Редактировать контакт + + + + Contact name + + + + + Enter a contact name + Введите имя + + + + Address list + + + + + Address Book + Адресная книга + + + + address copied to clipboard + + + + + Edit + Редактировать + + + + + Add + + + + + Tags + Теги + + + + Add tag + + + + + Cancel + Отменить - - Max - Макс + + Confirm + - DexSweetComboBox + EnableAssetModal - - Search - Поиск + + The selected address belongs to a disabled asset, you need to enabled it before sending. + + + + + Enable + Добавить + + + + Cancel + Отменить EnableCoinModal - + Enable assets Подключить активы - + Search asset Поиск актива - + All assets are already enabled! Все ассеты уже добавлены! - + Change assets limit Изменить лимит - + Select all assets Выбрать все ассеты - + You can still enable %1 assets. Selected: %2. Вы можете активировать еще %1 активов. Активно: %2. - + Add a custom asset - + Close Закрыть - + Enable Добавить @@ -1343,27 +1292,27 @@ Дисклеймер и условия использования - + Accept EULA Принять EULA - + Accept Terms and Conditions Принять Terms of Service - + Close Закрыть - + Cancel Отменить - + Confirm Подтвердить @@ -1399,10 +1348,43 @@ Комиссия будет рассчитана + + GasInfoModal + + + How do I calculate gas? + + + + + Gas is measured in gwei. Gwei is just a unit of Ether, and is equal to 0.000000001 ETH (or the equivalent platform coin such as AVAX or BNB). The gas price varies over time depending on network congestion. + + + + + The gas limit is how many units of gas (maximum) you allocate to pay for a transaction. The gas required depending on the size of the transaction & data being transmitted. + + + + + A standard transaction not involving contracts uses 21,000 gas units, with any of the limit remaining returned to the source address. + + + + + Transactions involving contracts may result in the whole limit being consumed, so be careful not to set it too high. + + + + + For more information, read the article at <a href="https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use">https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use</a> + + + General - + %n day(s) %n день @@ -1411,7 +1393,7 @@ - + %nd day @@ -1421,7 +1403,7 @@ - + %nh hours @@ -1431,7 +1413,7 @@ - + %nm minutes @@ -1441,7 +1423,7 @@ - + %ns seconds @@ -1451,7 +1433,7 @@ - + %nms milliseconds @@ -1461,91 +1443,97 @@ - + - - - + <b>Taker tx fee:</b> - + <b>Dex tx fee:</b> - + <b>Dex fee:</b> - + <b>Maker tx fee:</b> - + %1 %2 %3 (%4) - + %2 (%3) {1 %2 %3 ?} {4)?} - + Trading Fee Торговая комиссия - + Minimum Trading Amount Минимальный объем сделки - + Wallet %1 already exists WALLETNAME Кошелек %1 уже существует - + %1 balance is lower than the fees amount: %2 %3 %1 баланс менее чем размер комиссий: %2 %3 - + Tradable (after fees) %1 balance is lower than minimum trade amount Торгуемый (после комиссий) баланс %1 - меньше минимальной суммы сделки - + Please fill the price field Пожалуйста, укажите цену - + Please fill the volume field - Пожалуйста, укажите сумму + + + + + + Please wait for %1 to fully activate + - - + + %1 volume is lower than minimum trade amount Сумма %1 меньше минимальной суммы сделки - - + + %1 needs to be enabled in order to use %2 %1 должен быть активным для использования %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions нужно пополнить баланс %1 для оплаты газа %2 транзакций - + Unknown Error Неизвестная ошибка @@ -1573,17 +1561,17 @@ Цена на CEX - + Price Цена - + Quantity Количество - + Total Всего @@ -1591,17 +1579,17 @@ ImportWallet - + Failed to Import the wallet Не удалось импортировать кошелек - + Import wallet - Setup Импорт кошелька - Введите данные - + Import wallet - Choose password Импорт кошелька - Задайте пароль @@ -1611,59 +1599,89 @@ Название кошелька - + Enter seed Введите сид-фразу - + Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue. - - + + i understand + Я согласен + + + + + я согласен - - Ok + + + je comprends + + + + + + entiendo + + + + + + anladım - + + + ich verstehe + + + + + Ok + Ок + + + Allow custom seed Разрешить пользовательский формат сид-фразы - + <strong>Allow custom seed</strong> <strong>Разрешить произвольный seed</strong> - + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. - Пользовательские seed фразы могут быть менее безопасными и подверженными взлому, в сравнении с фразой сгенерированной в соответствии со стандартом BIP39 или приватным ключом (WIF).<br><br>Для подтверждения того, что вы понимаете что делаете введите <strong>'I understand'</strong> в поле ниже. + Пользовательские исходные фразы могут быть менее безопасными и их легче взломать, чем сгенерированные исходные фразы или закрытый ключ (WIF), совместимые с BIP39.<br><br>Чтобы подтвердить, что вы понимаете риск и знаете, что делаете, введите <strong>'Я согласен'</strong> в поле ниже. - + I understand - + Я согласен - + Next Далее - + Enter the same password to confirm Введите тот же пароль для подтверждения - + Continue Продолжить @@ -1698,16 +1716,21 @@ Try again or select 'Allow custom seed' to continue. Best Orders Лучшие ордеры + + + Enter volume to see best orders. + + ListDelegate - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 не активирован -Вы хотите активировать этот %2 актив чтобы видеть лучшие ордеры для него ?<br><a href='#'>Да</a> - <a href='#no'>Нет</a> - + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 @@ -1746,204 +1769,297 @@ Try again or select 'Allow custom seed' to continue. Login - + Incorrect Password Неправильный пароль - + Log In - + Cancel Отменить + + LogoutModal + + + Exit %1 or go to login menu? + + + + + Warning: You currently have a swap in progress. +Logging out may result in a failed swap. + + + + + Warning: You currently have open maker orders. +They will be removed from the orderbook until you log in again. + + + + + Login menu + + + + + Exit + + + + + Cancel + + + Main - + Segwit Segwit - + Confirmation Подтверждение - + Do you want to send your %1 funds to %2 wallet first? Хотели бы вы сначала отправить ваши %1 средства на кошелек %2? - + Success Успех - + Your transaction is send, may take some time to arrive Ваша транзакция была отправлена, получение может занять какое-то время - + Price Цена - + Change 24hr - + Porfolio - + Contract Address - + Send Отправить - + Enable %1 ? Активировать %1 ? - + Yes Да - + No Нет - + Receive Получить - + Swap Обменять - + is wallet only - + Rewards Награды - + Faucet Фаусет - - - + + + Public Key - + Copied to Clipboard Скопировано в буфер обмена - + Loading market data Загрузка рыночных данных - + There is no chart data for this ticker yet Для данного актива пока еще нет графиков данных - - No transactions - Нет транзакций + + Fetching transactions... + + + + + Please wait, %1 is %2 + - - Refreshing - Обновление данных + + % activated... + + + + + No transactions available + - - Fetching transactions - Получение данных о транзакциях + + Click to view your address on %1 (%2) block explorer + Trade - + торговля - + Trading Information Торговая информация - - Exchange Rates - Курс обмена + + Chart + График - + Orders Ордеры - + History История - + Place Order Разместить ордер - + Order Selected Ордер выбран - + START SWAP НАЧАТЬ ОБМЕН + + + + Address Book + Адресная книга + + + + Search contact + поиск контактов + + + + + NEW CONTACT + новый контакт + + + + Name + Название + + + + Tags + Теги + + + + Edit + Редактировать + + + + Delete + Удалить + + + + address copied to clipboard + + + + + This contact does not have any registered address. + + MarketModeSelector - - Sell - Продать + + Sell %1 + TICKER + - - Buy - Купить + + Buy %1 + TICKER + @@ -1990,51 +2106,84 @@ Try again or select 'Allow custom seed' to continue. Цена + + NewContactPopup + + + Contact name + + + + + This contact name already exists. + Контакт с таким именем уже существует. + + + + + ADD + + + NewUpdateModal - - - + + + Searching new updates - + Fetching... - - - + + + Close Закрыть - - Could not check new updates because of the following reason: + + Could not check new updates for the following reason: %1 - + New version found - + + Mandatory version found + + + + %1 %2 is available ! - + + This update is mandatory to continue using the application + + + + + Close Dex + + + + Your application is updated. - + Download Скачать @@ -2042,112 +2191,112 @@ Try again or select 'Allow custom seed' to continue. NewWallet - + Wrong word, please check again Неверное слово. Пожалуйста, попробуйте еще раз - + st - + nd - + rd - + th - + Failed to create a wallet Ошибка при создании кошелька - + New Wallet Новый кошелек - + Confirm Seed Подтвердить seed ключ - + Choose Password Задайте пароль - + Important: Back up your seed phrase before proceeding! Важно: убедитесь, что вы сохранили ваш seed ключ, прежде чем продолжить! - + We recommend storing it offline. Мы рекумендуем хранить его офлайн. - + Generated Seed Сгенерированный seed ключ - + Seed phrase Seed фраза - + copied to clipboard скопировано в буфер - + Next Далее - + Let's double check your seed phrase Давайте перепроверим ваш seed ключ - + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. Ваш seed ключ важен, и поэтому мы хотим убедиться, что вы его сохранили. Мы зададим вам три разных вопроса о вашем seed ключе, чтобы убедиться, что вы сможете легко восстановить свой кошелек, когда захотите. - + Enter the - + word - + Check Проверить - + Enter the same password to confirm Введите тот же пароль для подтверждения - + Continue Продолжить @@ -2178,150 +2327,167 @@ Try again or select 'Allow custom seed' to continue. NotificationsModal - + Matching Матчинг - + Order Matching Матчинг ордеров - + Matched Сматчен - + Order Matched Ордер сматчен - + Ongoing В процессе - + Swap Ongoing Обмен продолжается - + Successful Успешно - + Swap Successful Обмен успешно завершен - + Refunding Проводится возврат - + Failed Не завершено - + Swap Failed Обмен не был завершен - + Unknown Неизвестно - + Unknown State Статус неизвестен - + Swap status updated Обновление статуса Свопа - + You sent %1 Вы отправили %1 - + You received %1 Вы получили %1 - + Your wallet balance changed Баланс вашего кошелька изменился - + + %1 Enable status + TICKER + + + + Please check your internet connection (e.g. VPN service or firewall might block it). Пожалуйста, проверьте ваше интернет-соединение (например, служба VPN или брандмауэр могут блокировать подключение). - + Failed to enable %1 TICKER Не получается включить %1 - + + Failed to disable %1 + TICKER + + + + Endpoint not reachable Эндпоинт не доступен - + Could not reach to endpoint Не удалось подключиться - + Mismatch at %1 custom asset configuration TICKER Несоответствие в конфигурации актива %1 - + Application needs to be restarted for %1 custom asset. TICKER Необходимо перезапустить приложение для %1. - + Batch %1 failed. Reason: %2 Группа %1 .не удалась. Причина: %2 - + Show Показать - + Restart Перезапустить - + Quit Выйти - - There isn't any notification - Нет новых уведомлений + + Notifications + + + + + There aren't any notifications + - + Mark all as read Отметить все как прочитанные @@ -2329,46 +2495,97 @@ Try again or select 'Allow custom seed' to continue. OrderForm - + Price Цена - + + Reduce 1% relative to CEX market price. + + + + + Use CEX market price. + + + + + Increase 1% relative to CEX market price. + + + + Volume Объем - + Amount to sell Сумма для продажи - + Amount to receive Получаемая сумма - - Min volume: - Мин. объем: + + Max + Макс + + + + Swap 25% of your tradable balance. + + + + + Swap 50% of your tradable balance. + - How to use the pro-view slider ? - Как использовать pro-view слайдер? + Swap 100% of your tradable balance. + + + + + Min Volume + + + + + Min amount to sell + + + + + Min amount to receive + + + + + Minimum accepted trade equals 10% of order volume. + + + + + Minimum accepted trade equals 25% of order volume. + - - This slider is used to setup the order requirements you need. -Left slider: Sets the minimum amount required to process a trade. -Right slider: Sets the volume you want to trade. - Этот слайдер используется для настройки желаемых параметров сделки. -Левый слайдер: Задает минимальный объем для начала обмена. -Правый слайдер: Задает объем который вы хотите обменять. + + Minimum accepted trade equals 50% of order volume. + + + + + Min volume: + Мин. объем: - + Use custom minimum trade amount Задать минимальный объем сделки @@ -2376,7 +2593,7 @@ Right slider: Sets the volume you want to trade. OrderLine - + Funds are recoverable Средства могут быть восстановлены @@ -2392,103 +2609,114 @@ Right slider: Sets the volume you want to trade. OrderModal - + Swap Details Детали свопа - + Order Details Детали ордера - + Order Type - + Maker Order Мейкер ордер - + Taker Order Тейкер ордер - + Refund State Статус рефанда - + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back Обмен не был завершен, но процесс автоматического рефанда уже начался. Пожалуйста, подождите, оставляя приложение открытым, пока вы не получите свои средства - + Date Дата - - ID - ID + + Error ID + ID ошибки - - Maker Payment Sent ID - ID отправки платежа мейкера + + + Error Log + Лог ошибки - - Maker Payment Spent ID - ID spend платежа мейкера + + Close + Закрыть - - Taker Payment Spent ID - ID spend платежа тейкера + + Cancel Order + Отменить ордер - - Taker Payment Sent ID - ID отправки платежа тейкера + + + Swap ID + ID обмена - - Error ID - ID ошибки + + Maker Payment Sent Transaction ID + - - - Error Log - Лог ошибки + + Maker Payment Spent Transaction ID + - - Close - Закрыть + + Maker Payment TXID + - - Cancel Order - Отменить ордер + + Taker Payment Spent Transaction ID + + + + + Taker Payment Sent Transaction ID + + + + + Taker Payment TXID + - + Recover Funds Восстановить средства - + Refunding... Возмещается... - + View on Explorer Показать в эксплорере @@ -2509,23 +2737,23 @@ Please select a new order. OK - + OK OrdersPage - + From От - + To Кому - + Export CSV Скачать CSV @@ -2541,17 +2769,17 @@ Please select a new order. Дата - + Apply Filter Применить фильтр - + Cancel All - + Please choose the CSV export name and location Выберите название и расположение загружаемого файла @@ -2567,43 +2795,39 @@ Please select a new order. PasswordField - + Password Пароль - + Enter your wallet password Введите пароль вашего кошелька - + At least 1 lowercase alphabetical character Как минимум 1 строчная буква - + At least 1 uppercase alphabetical character Как минимум 1 заглавная буква - + At least 1 numeric character Как минимум 1 цифра - + At least 1 special character (eg. !@#$%) Как минимум 1 специальный символ (!@#$%) - - - At least %n character(s) - - Не менее %n символов - Не менее %n символов - Не менее %n символов - + + + Between %1 and %2 character(s) + @@ -2637,14 +2861,14 @@ Please select a new order. Поиск актива - + Show only coins with balance Показывать только монеты с балансом - + (%1/%2) - + (%1/%2) @@ -2655,38 +2879,38 @@ Please select a new order. PriceLine - + Set swap price for evaluation Установите цену для оценки - + Exchange rate Обменный курс - + Selected Выбрано - + Expensive Невыгодный курс - + Expedient Выгодный курс - + %1 compared to CEX PRICE_DIFF% %1 по сравнению с CEX - + CEXchange rate CEXchange Цена @@ -2695,36 +2919,31 @@ Please select a new order. PriceLineSimplified - Set swap price for evaluation - Установите цену для оценки - - - Exchange rate Обменный курс - + Selected Выбрано - + CEXchange rate CEXchange Цена - + Expensive Невыгодный курс - + Expedient Выгодный курс - + %1 compared to CEX PRICE_DIFF% %1 по сравнению с CEX @@ -2733,12 +2952,12 @@ Please select a new order. ProView - + Failed to place the order Не удалось разместить ордер - + Placed the order Ордер размещен @@ -2755,22 +2974,29 @@ Please select a new order. ReceiveModal - Receive - Получить + Receive %1 + TICKER + + + + + Only send %1 to this address + TICKER + - - Only send %1 to this address: + + %1 address TICKER - + copied to clipboard. - + Close Закрыть @@ -2778,74 +3004,97 @@ Please select a new order. RecoverSeedModal - - + + View seed and private keys Показать seed-фразу и приватные ключи - + Please enter your password to view the seed. Введите пароль для отображения seed ключа. - + Seed - + Backup Seed - + Public Address copied to clipboard - + Cancel Отменить - - + + Incorrect Password + Неправильный пароль + + + + copied to clipboard скопировано в буфер - - + + RPC Password RPC Пароль - + Search a coin. Поиск актива. - + Public Address Публичный адрес - + Private Key copied to clipboard - + Private Key Приватный ключ - + View Показать + + RemoveContactPopup + + + Do you want to remove this contact ? + Вы действительно хотите удалить этот контакт? + + + + Yes + Да + + + + No + Нет + + RestartModal @@ -2885,7 +3134,7 @@ Please select a new order. SearchField - + Search Поиск @@ -2893,149 +3142,162 @@ Please select a new order. SendModal - + Failed to send Ошибка отправки - - Failed to Send - Отправка не прошла - - - + Prepare to send Подготовить к отправке - + Address of the recipient Адрес получателя - + Amount to send Сумма для отправки - + Gas price Цена газа - + Recipient's address Адрес получателя - + The address has to be mixed case. Адрес должен быть написан в смешанном регистре. - + + Failed to Broadcast + + + + Fix Фикс - + MAX МАКС - + Fiat amount: Unavailable - + Fiat amount: %1 - + %1 amount: %2 - + Specify in Fiat - + Specify in Crypto - + Enable Custom Fees Включить настройку комиссий - - Only use custom fees if you know what you are doing! - Используйте настраиваемые комиссии только если знаете, что делаете! - - - + Enter the custom fee Введите комиссию сети - + Gas Limit Gas лимит - + Custom Fee can't be higher than the amount Комиссия не может больше общей суммы транзакции - + Not enough funds. Недостаточно средств. - + + You have %1 AMT TICKER У вас %1 - + + + Only use custom fees if you know what you are doing! + + + + Close Закрыть - + Prepare Подготовка - - + + Send Отправить - + + %1 address + TICKER + + + + + copied to clipboard. + + + + Amount Сумма - + Fees Комиссия - + Date Дата - + Back Назад @@ -3043,22 +3305,22 @@ Please select a new order. SendModalContactList - + Select a contact with an %1 address Выберите контакт с %1 адресом - + Search for contacts... Поиск по контактам... - + %1 addresses %1 адреса - + 1 address 1 адрес @@ -3087,42 +3349,60 @@ Please select a new order. SendResult - + Transaction Complete! Транзакция завершена! - + + %1 txid + TICKER + + + + + + copied to clipboard. + + + + Recipient's address Адрес получателя - + + %1 address + TICKER + + + + Amount Общая сумма транзакции - + Fees Комиссия сети - + Date Дата - + Transaction Hash Хэш транзакции - + Close Закрыть - + View on Explorer Смотреть в эксплорере @@ -3130,281 +3410,240 @@ Please select a new order. SettingModal - - Confirm Logout - Подтвердите выход - - - - Are you sure you want to log out? - Вы действительно хотите выйти? - - - - Yes - Да - - - - + + Cancel Отмена - + Settings Настройки - + Language Язык - + User Interface Интерфейс - + Security Приватность - + General Общие - + About & Version О программе - + Enable Desktop Notifications Включить уведомления для рабочего стола - + Maximum number of enabled coins Макс. количество активированных монет - + Logs Логи - + Open Folder Открыть папку с логами - - + + Reset wallet configuration Сбросить конфигурацию кошелька - + This will restart your wallet with default settings Эта опция перезапустит ваш кошелек с настройками по умолчанию - + + Confirm Подтвердить - + Changing theme to %1 Изменить тему на %1 - + + Disable 2FA? + + + + + Enter your wallet password to confirm + + + + + Type password + Введите пароль + + + + 2FA status + + + + + 2FA disabled successfully + + + + + + Ok + Ок + + + + Wrong password! + + + + + Wallet password is incorrect + + + + Application Version - + copied to clipboard скопировано в буфер - + Reset Сбросить - + Current Font Текущий шрифт - + Current font changed to %1. Текущий шрифт изменен на %1. - + Theme Тема - + Ask system's password before sending coins ? (2FA) Спрашивать системный пароль перед отправкой монет? (2FA) - + Application version Версия приложения - + MM2 version Версия MM2 - + MM2 Version Версия MM2 - + MM2 Version copied to clipboard. Версия MM2 скопирована в буфер обмена. - + Qt version Версия Qt - + Qt Version Версия Qt - + Qt Version copied to clipboard. Версия Qt скопирована в буфер обмена. - + Search Update Проверить на обновления - + Logout Выход - - - - - - + View seed and private keys Показать seed-фразу и приватные ключи - - + + Show Показать - + Setup Camouflage Password Установить камуфляжный пароль - + Open Установить - + Disclaimer and ToS Дисклеймер и Условия Использования - - Settings - - - Fiat - Фиат - - - - Recommended: - Рекомендации: - - - - Enable Desktop Notifications - Включить уведомления для рабочего стола - - - - Use QtTextRendering Or NativeTextRendering - Использовать QtTextRendering или NativeTextRendering - - - - Open Logs Folder - Открыть папку с логами - - - - View seed and private keys - Показать seed-фразу и приватные ключи - - - - Disclaimer and ToS - Дисклеймер и TOS - - - - Setup Camouflage Password - Установить камуфляжный пароль - - - - Reset wallet configuration - Сбросить конфигурацию кошелька - - - - Delete Wallet - Удалить кошелек - - - - Log out - Выйти - - - - mm2 version - версия MM2 - - Sidebar - - Search coin - Поиск монеты + + Search + Поиск - + Add asset Добавить крипто актив @@ -3460,7 +3699,7 @@ Please select a new order. Token - + Токен @@ -3516,32 +3755,32 @@ Please select a new order. От - + To Кому - + Cancel Отменить - + Apply filter Применить фильтр - + Export Экспорт - + Please choose the CSV export name and location Выберите название и расположение экспортируемого CSV файла - + No results found Ничего не найдено @@ -3550,57 +3789,57 @@ Please select a new order. SubOrders - + Orders Ордеры - + Close filtering options. Закрыть настройки фильтра. - + Filter Фильтр - + Date Дата - + Open filtering options. Открыть настройки фильтра. - + Filter settings - + Настройки фильтра - + From От - + To Кому - + Cancel Отменить - + Apply filter Применить фильтр - + No results found Не найдено результатов @@ -3734,7 +3973,7 @@ Network fees can vary greatly depending on your selected trading pair. Журнал изменений - + Open Logs Folder Открыть папку с логами @@ -3742,31 +3981,23 @@ Network fees can vary greatly depending on your selected trading pair. SwapProgress - + act SHORT FOR ACTUAL TIME фактич - + est SHORT FOR ESTIMATED прибл - + Progress details Прогресс - - SweetDexComboBox - - - Search - Поиск - - TextAreaWithTitle @@ -3781,14 +4012,17 @@ Network fees can vary greatly depending on your selected trading pair. - TextEditWithTitle + TextEditWithCopy - - Swap ID - ID обмена + + copied to clipboard + скопировано в буфер + + + TextEditWithTitle - + copied to clipboard скопировано в буфер @@ -3796,7 +4030,7 @@ Network fees can vary greatly depending on your selected trading pair. TextFieldWithTitle - + Required Обязательное поле @@ -3812,22 +4046,32 @@ Network fees can vary greatly depending on your selected trading pair. Trade - + Swap Обменять - + Instant trading with best orders Быстрая торговля с лучшими ордерами - + + Reset form + + + + + You have no tradable assets + + + + From От - + Enter an amount Введите количество @@ -3847,121 +4091,111 @@ Network fees can vary greatly depending on your selected trading pair. Выберите ордер - + Price Цена - + Better price found: %1. Updating forms. Найдена цена лучше: %1.Обновляю форму. - + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. Лучшая цена (%1) была обнаружена но количество (%2) меньше чем в вашем текущем ордере (%3).Нажмите чтобы обновить выбранный ордер. - - Reset form. - Сбросить форму. - - - - You have no tradable assets. - - - - + %1 - + %1 - + Tradable: Доступно: - + Min: %1 Мин: %1 - + Pick a coin Выберите монету - + SWAP NOW - + Failed to place the order Не удалось разместить ордер - + Placed the order Ордер размещен - + Entered amount must be superior than 0. Введенная сумма должна быть больше 0. - + You must select an order. Вы должны выбрать ордер. - + Entered amount is below the minimum required by this order: %1 Введнная сумма меньше минимальной для этого ордера: %1 - - + + %1 needs to be enabled in order to use %2 %1 должен быть активным для использования %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions нужно пополнить баланс %1 для оплаты газа %2 транзакций - + %1 balance does not have enough funds to pay the gas of %2 transactions - + No buy orders found for %1. Не найдено ордеров на покупку дл] %1. - + You can check later or try to sell a different coin. Вы можете попробовать позже или попробовать продать другой актив. - + Calculating fee estimate... - + Total %1 fees: Всего %1 комиссий: - + %2 (%3) - + %2 (%3) @@ -3978,31 +4212,26 @@ Network fees can vary greatly depending on your selected trading pair. - Chart - График - - - Ticker Selectors - + Trading Information Торговая информация - + Order Book Ордербук - + Best Orders Лучшие ордеры - + Place Order Разместить ордер @@ -4010,77 +4239,88 @@ Network fees can vary greatly depending on your selected trading pair. TransactionDetailsModal - + Transaction Details Детали транзакции - + + %1 txid + TICKER + + + + + copied to clipboard. + + + + Amount Сумма - + Fees Комиссия сети - + + From address + + + + + To address + + + + Date Дата - + Unconfirmed Не подтверждена - + Transaction Hash Хэш транзакции - - Transactions - - - - - txid copied to clipboard - - - - + Confirmations Подтверждения - + Block Height Блок - + From От - + To Получатель - + Notes Заметки - + Close Закрыть - + View on Explorer Смотреть в эксплорере @@ -4088,22 +4328,22 @@ Network fees can vary greatly depending on your selected trading pair. Transactions - + Received Получено - + Sent Отправлено - + fees комиссии - + Unconfirmed Не подтверждена @@ -4124,20 +4364,6 @@ Network fees can vary greatly depending on your selected trading pair. Ордербук - - WalletNameField - - - Wallet Name - Название кошелька - - - - Enter the name of your wallet here - Введите название для вашего кошелька - Название кошелька - - WalletsView @@ -4161,123 +4387,160 @@ Network fees can vary greatly depending on your selected trading pair. - + My Wallets Мои кошельки - + No wallets found! - - + + Delete Удалить - + Enter password to confirm deletion of Введите пароль чтобы подтвердить удаление - + wallet кошелек - + Type password Введите пароль - + Cancel Отменить - - + + Wallet status Статус кошелька - + wallet deleted successfully кошелек успешно удален - - + + Ok Ок - + wallet password is incorrect введен неправильный пароль + + ZcashParamsModal + + + %1 Activation Failed! + + + + + To activate ZHTLC coins, you need to download the Zcash Params. +This might take a few minutes... + + + + + Download params & enable coins + + + + + More Info + + + + + Close + Закрыть + + + + atomic_dex::settings_page + + + An error has occurred. + + + atomic_dex::wallet_page - + You do not have enough funds. У вас не достаточно средств. - + %1 is not activated: click on the button to enable it or enable it manually %1 не активирован: нажмите на кнопку чтобы активировать или сделайте это вручную - + You need to have %1 to pay the gas for %2 transactions. Вам нужен %1 для оплаты газа за %2 транзакции. - + Checksum verification failed for %1. Checksum верфикация неуспешна для %1. - + Invalid checksum for %1. Click the button to convert to mixed case address. - + Legacy address used for %1. Click the button to convert to a Cashaddress. - + %1 address must be prefixed with 0x %1 адрес должен начинаться с 0x - + %1 address length is invalid, please use a valid address. %1 длина адреса не валидна, пожалуйста используйте валидный адрес. - + %1 address is invalid. некорректный адрес %1. - + Invalid checksum. Неверная чек-сумма. - + %1 address has invalid prefixes. у адреса %1 неверный префикс. - + Backend error: %1 Ошибка бэкенда: %1 @@ -4285,32 +4548,12 @@ Network fees can vary greatly depending on your selected trading pair. main - + Logout Выход - - Confirm Logout - Подтверждение выхода - - - - Are you sure you want to log out? - Вы действительно хотите выйти? - - - - Yes - Да - - - - Cancel - Отменить - - - + Balance Баланс diff --git a/atomic_defi_design/assets/languages/atomic_defi_tr.ts b/atomic_defi_design/assets/languages/atomic_defi_tr.ts index 0fb96a72fb..d688587fed 100644 --- a/atomic_defi_design/assets/languages/atomic_defi_tr.ts +++ b/atomic_defi_design/assets/languages/atomic_defi_tr.ts @@ -1,42 +1,96 @@ + + AddAddressForm + + + Use standard network address + + + + + Label + + + + + This key already exists. + Bu anahtar zaten mevcut. + + + + Address + Adres + + + + + Cancel + İptal + + + + Convert + + + + + Edit + Düzenle + + + + Add + Ekle + + + + You need to enable %1 before adding this kind of address. + + + + + Enable + Etkinleştir + + AddCustomCoinModal - + Choose the asset type Varlık türünü seçin - + Cancel İptal - - - + + + Next İleri - + Enter the contract address Kontrat adresini girin - + Choose the asset ticker Varlık kodunu girin - + Ticker Varlık Kodu - + Enter the ticker Varlık kodunu girin @@ -46,439 +100,165 @@ Kontrat adresini şuradan alın - + Contract address - + Get the contract address from Kontrat adresini şuradan alın - - - - + + + + Previous Geri - + Choose the asset logo Varlık logosunu seçin - + Browse Göz at - + Please choose the asset logo Lütfen varlık logosunu seçin - + Configuration Konfigürasyon - + All configuration fields will be fetched using the contract address you provided. Tüm konfigürasyon bilgileri verdiğiniz kontrat adresinden edinilip doldurulacak. - + Name İsim - + Enter the name İsmi girin - + Coingecko ID Coingecko ID - + Enter the Coingecko ID Coingecko ID'sini girin - + Get the Coingecko ID Coingecko ID'si al - + Active Aktif - - + + Preview Görüntüle - + WARNING: Application will restart immidiately to apply the changes! DİKKAT: Program değişiklikleri uygulamak için yeniden başlatılacak! - + Asset not found, please go back and make sure Contract Address is correct Varlık bulunamadı, lütfen geri dönün ve Kontrat Adresi'nin doğruluğundan emin olun - + Config Fields Konfig Alanları - + Fetched Data Çekilen Veri - + Submit & Restart Yolla ve Yeniden Başlat - AddressBook - - - Address Book - Adres Defteri - - - - New Contact - Yeni Kişi - - - - Search a contact by name or tags - İsim ya da etiket ile kişi ara - - - - Name - İsim - - - - Tags (first 6) - Etiket - - - - Actions - Eylemler - - - - Edit - Düzenle - - - - Remove - Kaldır - - - - Do you want to remove this contact ? - Bu kişiyi kaldırmak istiyor musunuz ? - - - - Yes - Evet - - - - No - Hayır - - - - AddressBookAddContactAddressModal - - - Create a new address - Yeni bir adres oluştur - - - - Edit address entry - Adres girdisini düzenleyin - + AddTagPopup - - Selected wallet: %1 + + Tag name - - NONE + + Contact already has this tag. - - Enter a name - Bir ad girin - - - - This key already exists. - Bu anahtar zaten mevcut. - - - - Enter the address - Adresi girin - - - - Validate - Geçerle - - - - Cancel - İptal - - - - Convert + + + ADD - AddressBookEditContactModal - - - Edit contact - Kişiyi düzenle - - - - Contact Name - Kişi Adı - - - - Enter a contact name - Bir kişi adı girin - - - - Address List - Adres Listesi - - - - Search for an address entry. - Bir adres girdisi arayın. - - - - Type - Tür - - - - Key - Anahtar - - - - Address - Adres - - - - Actions - Eylemler - - - - Add Address - - - - - Tags - Etiketler - - - - + - + - - - - Confirm - Onayla - - - - - Cancel - İptal - - - - The selected address belongs to a disabled coin, you need to enabled it before sending. - Seçilen adres devre dışı bırakılmış bir koine aittir, göndermeden önce etkinleştirmeniz gerekir. - - - - Enable - Etkinleştir - - - - Cannot send to this address - Bu adrese gönderilemiyor - - - - Your balance is empty - Bakiyeniz boş - - - - Ok - Tamam - - - - Remove address ? - - - - - Yes - Evet - - - - No - Hayır - - - - AddressBookNewContactCategoryModal - - - Add a new tag - Yeni etiket ekle - - - - Enter the tag name - Etiket adı girin - - - - This contact already has this tag - Bu kişi zaten bu etikete sahip - - - - Add - Ekle - + AmountChart - - Cancel - İptal + + Work in progress + İş devam ediyor - AddressBookNewContactModal - - - Create a new contact - Yeni bir kişi ekle - - - - Enter the contact name - Kişi adını girin - - - - This contact name already exists. - Bu kişi adı zaten mevcut. - - - - Confirm - Onayla - + App - - Cancel - İptal + + Recover Funds Result + Fon Kurtarma Sonucu - AddressBookSendWalletSelector + AssetFromStandardSelector - + Choose a valid - Geçerli bir + Geçerli bir - - coin - koin seçin - - - - AddressBookWalletTypeList - - - %1 is not enabled - You need to enable it before adding an address. Enable it ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> + + asset - - - AddressBookWalletTypeListModal - - - Select wallet type - Cüzdan türünü seçin - - - Search - Ara - - - - AmountChart - - - Work in progress - İş devam ediyor + + Search an asset + - - - App - - Recover Funds Result - Fon Kurtarma Sonucu + + Disabled + @@ -522,7 +302,12 @@ - + + Activating: + + + + Price provider is: %1 @@ -530,20 +315,71 @@ Bottom - + Settings Ayarlar - + Support Destek - + Privacy Gizlilik + + + Disable Privacy? + + + + + Enter wallet password to confirm + + + + + Type password + + + + + Confirm + Onayla + + + + Cancel + İptal + + + + Privacy status + + + + + Privacy mode disabled successfully + + + + + + Ok + Tamam + + + + Wrong password! + + + + + wallet password is incorrect + + CamouflagePasswordModal @@ -553,47 +389,47 @@ Kamuflaj Parolasını Ayarla - + Camouflage Password is a secret password for emergency situations. Kamuflaj Parolası acil durumlar için olan gizli bir paroladır. - + Using it to login will display your balance lower than it actually is. Bu parolayla giriş yapınca bakiyeniz normalinden daha az görünecektir. - + Here you enter the suffix and at login you need to enter {real_password}{suffix} Buraya son eki gireceksiniz, giriş yaparken ise {gerçek_şifre}{son ek} şeklinde giriş yapacaksınız - + Password suffix - + Confirm pasword suffix - + Enter a password suffix - + Enter the same password suffix to confirm - + Cancel İptal - + Save Kaydet @@ -665,17 +501,12 @@ Chart - - Chart - Grafik - - - + Loading market data - + Piyasa bilgisi yükleniyor - + There is no chart data for this pair yet Bu parite için henüz grafik verisi yok @@ -683,118 +514,118 @@ ClaimRewardsModal - + Failed to prepare to claim rewards Ödül alımı hazırlığı başarısız sonuçlandı - + Claim your %1 reward? TICKER %1 ödülünüzü alacak mısınız? - + No UTXOs eligible for claiming Ödül alımı için uygun UTXO yok - + Transaction fee is higher than the reward! İşlem ücreti ödülden daha yüksek! - + You will receive - + Refresh Yenile - + Read more about KMD active users rewards KMD aktif kullanıcı ödülleri hakkında daha fazla bilgi - + UTXO UTXO - + Amount Miktar - + Reward Ödül - + Accruing Start Tahakkuk Başlangıcı - + Accruing Stop Tahakkuk Bitişi - + Time Left Kalan Zaman - + Error Hata - + Locktime is not set Kilit süresi ayarlanmamış - + Locktime is less than the threshold Kilit süresi limitin altında - + UTXO height is greater than end of the era UTXO uzunluğu dönem sonundan daha büyük - + UTXO amount is less than 10 UTXO miktarı 10'dan az - + One hour did not pass yet Henüz bir saat geçmedi - + Transaction is in mempool İşlem mempool'da - + Unknown problem Bilinmeyen hata - + Cancel İptal - + Confirm Onayla @@ -802,33 +633,41 @@ CoinMenu - + Disable %1 TICKER %1'i Etkisizleştir - + Disable and Delete %1 TICKER %1'i Etkisizleştir ve Sil - + Disable all %1 assets Tüm %1 türü varlıkları etkisizleştir - + Disable all assets Tüm varlıkları etkisizleştir - + Disable 0 balance assets + + ComboBoxWithSearchBar + + + Search + Ara + + Combo_fiat @@ -893,74 +732,83 @@ ConfirmTradeModal - + Confirm Exchange Details Al-Sat Detaylarını Onayla - + This swap request can not be undone and is a final event! Bu takas isteği geri döndürülemez! - + Security configuration Güvenlik yapılandırması - - dPoW protected - dPoW korumalı - - - - + Read more about dPoW dPoW hakkında daha fazla bilgi - + Use custom protection settings for incoming %1 transactions TICKER %1 işlemleri için özel güvenlik ayarları kullan - + Enable Komodo dPoW security Komodo dPoW güvenliğini etkinleştir - + %1 confirmations for incoming %2 transactions Gelen %2 işlemleri için %1 onay - + This transaction can take up to 60 mins - DO NOT close this application! Bu işlem 60 dakikayı bulabilir - Programı KAPATMAYINIZ! - + + Trade price is more than 50% different to CEX! Confirm? + + + + + Loading fees... + + + + <b>Total %1 fees:</b> - + + dPoW protected + + + + Required Confirmations Gereken Onaylar - + Warning, this atomic swap is not dPoW protected! Uyarı, bu atomik takas dPoW korumalı değil! - + Cancel İptal - + Confirm Onayla @@ -976,186 +824,202 @@ Dashboard - + The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset. Etkinleştirilmiş koinlerin mevcut sayısı yapılandırma ayarlarınızla eşleşmiyor. Varlık yapılandırmanız sıfırlanacak. - + Matching Eşleşiyor - + Order Matching Emir Eşleşiyor - + Matched Eşleşti - + Order Matched Emir Eşleşti - + Ongoing Devam ediyor - + Swap Ongoing Takas Devam Ediyor - + Successful Başarılı - + Swap Successful Takas Başarılı - + Refunding Geri ödeniyor - + Failed Başarısız - + Swap Failed Takas Başarısız - + Unknown Bilinmiyor - + Unknown State Bilinmeyen durum - + Started Başlatıldı - + Negotiated Pazarlık yapıldı - + Taker fee sent Alıcı ücreti gönderildi - + Maker payment received Yapıcı ödemesi alındı - + Maker payment wait confirm started Yapıcı ödemesi bekleme onayı başladı - + Maker payment validated and confirmed Yapıcı ödemesi doğrulandı ve onaylandı - + Taker payment sent Alıcı ödemesi gönderildi - + Taker payment spent Alıcı ödemesi harcandı - + Maker payment spent Yapıcı ödemesi harcandı - + Finished Tamamlandı - + Start failed Başlatılamadı - + Negotiate failed Pazarlık başarısız - + Taker fee validate failed Alıcı ücreti doğrulanamadı - + Maker payment transaction failed Yapıcı ödeme işlemi başarısız - + Maker payment Data send failed Yapıcı ödeme verileri gönderilemedi - + Maker payment wait confirm failed Yapıcı ödemesi bekleme onayı başarısız - + Taker payment validate failed Alıcı ödemesi doğrulanamadı - + Taker payment wait confirm failed Alıcı ödemesi bekleme onayı başarısız oldu - + Taker payment spend failed Alıcı ödeme harcaması başarısız oldu - + Maker payment wait refund started Yapıcı ödemesi bekleme iadesi başladı - + Maker payment refunded Yapıcı ödemesi iade edildi - + Maker payment refund failed Yapıcı ödeme iadesi başarısız + + DatePicker + + + Date + Tarih + + + + DefaultCopyIcon + + + copied to clipboard + + + DefaultRangeSlider @@ -1169,6 +1033,14 @@ Maks + + DefaultTextEdit + + + copied to clipboard + + + DeleteWalletModal @@ -1211,7 +1083,7 @@ DexAppPasswordField - + Type password @@ -1219,34 +1091,32 @@ DexKeyChecker - + At least 1 lowercase alphabetical character En az 1 küçük harf - + At least 1 uppercase alphabetical character En az 1 büyük harf - + At least 1 numeric character En az 1 sayı - + At least 1 special character (eg. !@#$%) En az 1 özel karakter (ör. !@#$%) - - - At least %n character(s) - - En az %n karakter - + + + Between %1 and %2 character(s) + - + Password and Confirm Password have to be same Parola ve Parola Doğrulaması aynı olmalıdır @@ -1267,68 +1137,149 @@ Min - - Half - Yarısı + + Half + Yarısı + + + + Max + Maks + + + + DexSweetComboBox + + + Search + Ara + + + + EditContactModal + + + Edit contact + Kişiyi düzenle + + + + Contact name + + + + + Enter a contact name + Bir kişi adı girin + + + + Address list + + + + + Address Book + Adres Defteri + + + + address copied to clipboard + + + + + Edit + Düzenle + + + + + Add + + + + + Tags + Etiketler + + + + Add tag + + + + + Cancel + İptal + + + + Confirm + Onayla + + + + EnableAssetModal + + + The selected address belongs to a disabled asset, you need to enabled it before sending. + - - Max - Maks + + Enable + Etkinleştir - - - DexSweetComboBox - - Search - Ara + + Cancel + İptal EnableCoinModal - + Enable assets Varlıkları etkineştir - + Search asset - + All assets are already enabled! Bütün varlıklar zaten etkinleştirildi! - + Change assets limit Varlıkların limitini değiştirin - + Select all assets Tüm varlıkları seç - + You can still enable %1 assets. Selected: %2. Hala %1 varlık etkinleştirebilirsiniz. Seçilen: %2. - + Add a custom asset - + Close Kapat - + Enable Etkinleştir @@ -1341,27 +1292,27 @@ Sorumluluk Reddi & Kullanım Şartları - + Accept EULA Son Kullanıcı Lisans Sözleşmesi (EULA) 'ni kabul ediyorum - + Accept Terms and Conditions Şartları ve koşulları kabul ediyorum - + Close Kapat - + Cancel İptal - + Confirm Onayla @@ -1397,17 +1348,50 @@ Ücretler hesaplanacak + + GasInfoModal + + + How do I calculate gas? + + + + + Gas is measured in gwei. Gwei is just a unit of Ether, and is equal to 0.000000001 ETH (or the equivalent platform coin such as AVAX or BNB). The gas price varies over time depending on network congestion. + + + + + The gas limit is how many units of gas (maximum) you allocate to pay for a transaction. The gas required depending on the size of the transaction & data being transmitted. + + + + + A standard transaction not involving contracts uses 21,000 gas units, with any of the limit remaining returned to the source address. + + + + + Transactions involving contracts may result in the whole limit being consumed, so be careful not to set it too high. + + + + + For more information, read the article at <a href="https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use">https://support.mycrypto.com/how-to/sending/how-to-know-what-gas-limit-to-use</a> + + + General - + %n day(s) %n gün - + %nd day @@ -1415,7 +1399,7 @@ - + %nh hours @@ -1423,7 +1407,7 @@ - + %nm minutes @@ -1431,7 +1415,7 @@ - + %ns seconds @@ -1439,7 +1423,7 @@ - + %nms milliseconds @@ -1447,91 +1431,97 @@ - + - - - + <b>Taker tx fee:</b> - + <b>Dex tx fee:</b> - + <b>Dex fee:</b> - + <b>Maker tx fee:</b> - + %1 %2 %3 (%4) %2 (%3) {1 %2 %3 ?} {4)?} - + Trading Fee Takas Ücreti - + Minimum Trading Amount Minimum Takas Hacmi - + Wallet %1 already exists WALLETNAME %1 cüzdanı zaten mevcut - + %1 balance is lower than the fees amount: %2 %3 %1 bakiye ücret tutarının altında: %2 %3 - + Tradable (after fees) %1 balance is lower than minimum trade amount Takas edilebilir (ücretlerden sonra)%1 bakiyesi minimum işlem ücretinden düşük - + Please fill the price field Lütfen fiyat alanını doldurun - + Please fill the volume field - Lütfen hacim alanını doldurunuz + + + + + + Please wait for %1 to fully activate + - - + + %1 volume is lower than minimum trade amount %1 hacmi, minimum işlem ücretinden düşük - - + + %1 needs to be enabled in order to use %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - + Unknown Error Bilinmeyen Hata @@ -1559,17 +1549,17 @@ CEX oranı - + Price Fiyat - + Quantity Miktar - + Total Toplam @@ -1577,17 +1567,17 @@ ImportWallet - + Failed to Import the wallet - + Import wallet - Setup - + Import wallet - Choose password @@ -1597,59 +1587,89 @@ Cüzdan Adı - + Enter seed - + Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue. - - + + i understand + Anladım + + + + + я согласен + + + + + + je comprends + + + + + + entiendo + + + + + + anladım + + + + + + ich verstehe - + Ok Tamam - + Allow custom seed Özel Seed'e izin ver - + <strong>Allow custom seed</strong> - + Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below. - + Özel çekirdek tümceler, oluşturulmuş bir BIP39 uyumlu çekirdek sözcük grubu veya özel anahtara (WIF).<br><br> Riski anladığınızı ve ne yaptığınızı bildiğinizi doğrulamak için lütfen aşağıdaki kutuya <strong>'Anladım'</strong> yazın. - + I understand - + Anladım - + Next İleri - + Enter the same password to confirm Doğrulamak için aynı parolayı giriniz - + Continue Devam @@ -1684,16 +1704,21 @@ Try again or select 'Allow custom seed' to continue. Best Orders En İyi Emirler + + + Enter volume to see best orders. + + ListDelegate - + %1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a> %1 etkin değil - En iyi %2 siparişini seçebilmesi için etkinleştirmek istiyor musunuz ? <br><a href='#'>Evet</a> - <a href='#no'>Hayır</a> - + This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3 @@ -1732,17 +1757,52 @@ Try again or select 'Allow custom seed' to continue. Login - + Incorrect Password Yanlış Parola - + Log In - + + Cancel + İptal + + + + LogoutModal + + + Exit %1 or go to login menu? + + + + + Warning: You currently have a swap in progress. +Logging out may result in a failed swap. + + + + + Warning: You currently have open maker orders. +They will be removed from the orderbook until you log in again. + + + + + Login menu + + + + + Exit + + + + Cancel İptal @@ -1750,131 +1810,141 @@ Try again or select 'Allow custom seed' to continue. Main - + Segwit - + Confirmation - + Do you want to send your %1 funds to %2 wallet first? - + Success - + Your transaction is send, may take some time to arrive - + Price Fiyat - + Change 24hr - + Porfolio - + Contract Address - + Send Gönder - + Enable %1 ? %1 Etkinleştirilsin mi ? - + Yes Evet - + No Hayır - + Receive Al - + Swap Takasla - + is wallet only - + Rewards - + Faucet Musluk - - - + + + Public Key - + Copied to Clipboard Panoya Kopyalandı - + Loading market data Piyasa bilgisi yükleniyor - + There is no chart data for this ticker yet Henüz bu hisse senedi için grafik verisi yok - - No transactions - İşlem yok + + Fetching transactions... + + + + + Please wait, %1 is %2 + + + + + % activated... + - - Refreshing - Yenileniyor + + No transactions available + - - Fetching transactions - İşlemler alınıyor + + Click to view your address on %1 (%2) block explorer + @@ -1882,54 +1952,102 @@ Try again or select 'Allow custom seed' to continue. Al Sat - + Trading Information Al Sat Bilgisi - - Exchange Rates - Döviz kurları + + Chart + Grafik - + Orders Emirler - + History Tarihçe - + Place Order Emir Ver - + Order Selected Emir Seçildi - + START SWAP + Takası başlat + + + + + Address Book + Adres Defteri + + + + Search contact + Kişileri ara + + + + + NEW CONTACT + Yeni bağlantı + + + + Name + İsim + + + + Tags + Etiketler + + + + Edit + Düzenle + + + + Delete + Sil + + + + address copied to clipboard + + + + + This contact does not have any registered address. MarketModeSelector - - Sell - Sat + + Sell %1 + TICKER + - - Buy - Satın Al + + Buy %1 + TICKER + @@ -1976,51 +2094,84 @@ Try again or select 'Allow custom seed' to continue. Fiyat + + NewContactPopup + + + Contact name + + + + + This contact name already exists. + Bu kişi adı zaten mevcut. + + + + + ADD + + + NewUpdateModal - - - + + + Searching new updates - + Fetching... - - - + + + Close Kapat - - Could not check new updates because of the following reason: + + Could not check new updates for the following reason: %1 - + New version found - + + Mandatory version found + + + + %1 %2 is available ! - + + This update is mandatory to continue using the application + + + + + Close Dex + + + + Your application is updated. - + Download İndir @@ -2028,112 +2179,112 @@ Try again or select 'Allow custom seed' to continue. NewWallet - + Wrong word, please check again Hatalı kelime, lütfen kontrol ediniz - + st - + nd - + rd - + th - + Failed to create a wallet Cüzdan oluşturulamadı - + New Wallet Yeni Cüzdan - + Confirm Seed Seed'i Onayla - + Choose Password - + Important: Back up your seed phrase before proceeding! Önemli: Devam etmeden önce seed kelimelerinizi yedekleyin! - + We recommend storing it offline. Çevrimdışı saklamanızı öneririz. - + Generated Seed Seed Oluştur - + Seed phrase - + copied to clipboard - + Next İleri - + Let's double check your seed phrase Seed kelimelerinizi tekrar kontrol edelim - + Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want. Seed kelimeleriniz önemlidir - bu yüzden doğru olduğundan emin olmak istiyoruz. Cüzdanınızı istediğiniz zaman kolayca kurtarabileceğinizden emin olmak için seed kelimeleriniz hakkında üç farklı soru soracağız. - + Enter the - + word - + Check - + Enter the same password to confirm Doğrulamak için aynı parolayı giriniz - + Continue Devam @@ -2164,150 +2315,167 @@ Try again or select 'Allow custom seed' to continue. NotificationsModal - + Matching Eşleşiyor - + Order Matching Emir Eşleşiyor - + Matched Eşleşti - + Order Matched Emir Eşleşti - + Ongoing Devam ediyor - + Swap Ongoing Takas Devam Ediyor - + Successful Başarılı - + Swap Successful Takas Başarılı - + Refunding Geri ödeniyor - + Failed Başarısız - + Swap Failed Takas Başarısız - + Unknown Bilinmiyor - + Unknown State Bilinmeyen durum - + Swap status updated Takas durumu güncellendi - + You sent %1 %1 gönderdiniz - + You received %1 %1 aldınız - + Your wallet balance changed Cüzdan bakiyeniz değişti - + + %1 Enable status + TICKER + + + + Please check your internet connection (e.g. VPN service or firewall might block it). Lütfen internet bağlantınızı kontrol edin (ör. VPN hizmeti veya güvenlik duvarı bağlantıyı engelliyor olabilir). - + Failed to enable %1 TICKER %1 etkinleştirilemedi - + + Failed to disable %1 + TICKER + + + + Endpoint not reachable Uç nokta ulaşılabilir değil - + Could not reach to endpoint Uç noktaya ulaşılamadı - + Mismatch at %1 custom asset configuration TICKER %1 özel varlık yapılandırmasında uyuşmazlık - + Application needs to be restarted for %1 custom asset. TICKER %1 özel varlığı için uygulamanın yeniden başlatılması gerekiyor. - + Batch %1 failed. Reason: %2 %1 toplu işlemi başarısız oldu. Sebep: %2 - + Show Göster - + Restart Yeniden Başlat - + Quit Çık - - There isn't any notification - Bildirim yok + + Notifications + + + + + There aren't any notifications + - + Mark all as read @@ -2315,44 +2483,97 @@ Try again or select 'Allow custom seed' to continue. OrderForm - + Amount to sell Satılacak miktar - + Amount to receive Alınacak miktar - - Min volume: + + Max + Maks + + + + Swap 25% of your tradable balance. + + + + + Swap 50% of your tradable balance. - How to use the pro-view slider ? + Swap 100% of your tradable balance. + + + + + Min Volume + + + + + Min amount to sell - - This slider is used to setup the order requirements you need. -Left slider: Sets the minimum amount required to process a trade. -Right slider: Sets the volume you want to trade. + + Min amount to receive - + + Minimum accepted trade equals 10% of order volume. + + + + + Minimum accepted trade equals 25% of order volume. + + + + + Minimum accepted trade equals 50% of order volume. + + + + + Min volume: + + + + Use custom minimum trade amount - + Price Fiyat - + + Reduce 1% relative to CEX market price. + + + + + Use CEX market price. + + + + + Increase 1% relative to CEX market price. + + + + Volume Hacim @@ -2360,7 +2581,7 @@ Right slider: Sets the volume you want to trade. OrderLine - + Funds are recoverable Fonlar kurtarılabilir @@ -2376,103 +2597,114 @@ Right slider: Sets the volume you want to trade. OrderModal - + Swap Details Takas Detayları - + Order Details Emir Detayları - + Order Type - + Maker Order Yapıcı Emri - + Taker Order Alıcı Emri - + Refund State Geri Ödeme Durumu - + Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back Takas işlemi başarısız oldu, ancak otomatik geri ödeme süreci başladı. Lütfen bekleyin ve ödemenizi geri alana kadar uygulamayı açık tutun - + Date Tarih - - ID - ID - - - + Recover Funds Fon Kurtar - + Refunding... - + View on Explorer Explorer'da Göster - - Maker Payment Sent ID - Yapıcı Ödemesi Gönderilen Kimliği + + Cancel Order + Emri İptal Et + + + + Error ID + Hata ID + + + + + Swap ID + - - Maker Payment Spent ID - Yapıcı Ödemesi Harcanan Kimliği + + Maker Payment Sent Transaction ID + - - Taker Payment Spent ID - Alıcı Ödemesi Harcanan Kimliği + + Maker Payment Spent Transaction ID + - - Taker Payment Sent ID - Alıcı Ödemesi Gönderilen Kimliği + + Maker Payment TXID + - - Cancel Order - Emri İptal Et + + Taker Payment Spent Transaction ID + - - Error ID - Hata ID + + Taker Payment Sent Transaction ID + - - + + Taker Payment TXID + + + + + Error Log Hata Kaydı - + Close Kapat @@ -2499,17 +2731,17 @@ Please select a new order. OrdersPage - + From Gönderen - + To Alan - + Apply Filter Filtreyi Uygula @@ -2525,17 +2757,17 @@ Please select a new order. Tarih - + Export CSV CSV'yi dışa aktar - + Cancel All - + Please choose the CSV export name and location Lütfen CSV dışa aktarma adını ve konumunu seçin @@ -2551,41 +2783,39 @@ Please select a new order. PasswordField - + Password Parola - + Enter your wallet password Cüzdan parolanızı girin - + At least 1 lowercase alphabetical character En az 1 küçük harf - + At least 1 uppercase alphabetical character En az 1 büyük harf - + At least 1 numeric character En az 1 sayı - + At least 1 special character (eg. !@#$%) En az 1 özel karakter (ör. !@#$%) - - - At least %n character(s) - - En az %n karakter - + + + Between %1 and %2 character(s) + @@ -2619,12 +2849,12 @@ Please select a new order. - + Show only coins with balance Sadece bakiyesi olan koinleri göster - + (%1/%2) @@ -2637,38 +2867,38 @@ Please select a new order. PriceLine - + Set swap price for evaluation Değerlendirme için takas fiyatı belirleyin - + Exchange rate Döviz kuru - + Selected Seçili - + Expensive Pahalı - + Expedient Uygun - + %1 compared to CEX PRICE_DIFF% CEX ile karşılaştırıldığında %1 - + CEXchange rate CEXchange kuru @@ -2677,36 +2907,31 @@ Please select a new order. PriceLineSimplified - Set swap price for evaluation - Değerlendirme için takas fiyatı belirleyin - - - Exchange rate Döviz kuru - + Selected Seçili - + CEXchange rate CEXchange kuru - + Expensive Pahalı - + Expedient Uygun - + %1 compared to CEX PRICE_DIFF% CEX ile karşılaştırıldığında %1 @@ -2715,12 +2940,12 @@ Please select a new order. ProView - + Failed to place the order Emir başarısız oldu - + Placed the order Emir başarılı @@ -2737,22 +2962,29 @@ Please select a new order. ReceiveModal - Receive - Al + Receive %1 + TICKER + + + + + Only send %1 to this address + TICKER + - - Only send %1 to this address: + + %1 address TICKER - + copied to clipboard. - + Close Kapat @@ -2760,72 +2992,95 @@ Please select a new order. RecoverSeedModal - - + + View seed and private keys Seed ve özel anahtarları görüntüle - + Please enter your password to view the seed. Seed'i görmek için lütfen parolanızı giriniz. - + Seed - + Backup Seed - + Public Address copied to clipboard - + Cancel İptal - - + + Incorrect Password + Yanlış Parola + + + + copied to clipboard - - + + RPC Password RPC Parolası - + Search a coin. Koin ara. - + Public Address Public Adres - + Private Key copied to clipboard - + Private Key Private Key - - View - Görüntüle + + View + Görüntüle + + + + RemoveContactPopup + + + Do you want to remove this contact ? + Bu kişiyi kaldırmak istiyor musunuz ? + + + + Yes + Evet + + + + No + Hayır @@ -2867,7 +3122,7 @@ Please select a new order. SearchField - + Search Ara @@ -2875,149 +3130,162 @@ Please select a new order. SendModal - + Failed to send Gönderilemedi - - Failed to Send - Gönderilemedi - - - + Prepare to send Göndermeye hazırlanıyor - + Address of the recipient - + Amount to send - + Gas price - + Recipient's address Alıcı adresi - + The address has to be mixed case. Adres, büyük-küçük harf karışık olmalıdır. - + + Failed to Broadcast + + + + Fix Düzelt - + MAX MAKS - + Fiat amount: Unavailable - + Fiat amount: %1 - + %1 amount: %2 - + Specify in Fiat - + Specify in Crypto - + Enable Custom Fees Özel İşlem Ücretlerini Etkinleştir - - Only use custom fees if you know what you are doing! - Özel işlem ücretleri hakkında bilginiz yoksa kullanmayınız! - - - + Enter the custom fee Özel ücreti giriniz - + Gas Limit Gas Limiti - + Custom Fee can't be higher than the amount Özel İşlem Ücreti takas miktarından daha yüksek olamaz - + Not enough funds. Yetersiz bakiye. - + + You have %1 AMT TICKER %1'niz var - + + + Only use custom fees if you know what you are doing! + + + + Close Kapat - + Prepare Hazırla - - + + Send Gönder - + + %1 address + TICKER + + + + + copied to clipboard. + + + + Amount Miktar - + Fees İşlem Ücreti - + Date Tarih - + Back Geri @@ -3025,22 +3293,22 @@ Please select a new order. SendModalContactList - + Select a contact with an %1 address %1 adresi olan bir kişi seçin - + Search for contacts... Kişi ara... - + %1 addresses %1 adresleri - + 1 address 1 adres @@ -3069,42 +3337,60 @@ Please select a new order. SendResult - + Transaction Complete! İşlem Tamamlandı! - + + %1 txid + TICKER + + + + + + copied to clipboard. + + + + Recipient's address Alıcının adresi - + + %1 address + TICKER + + + + Amount Miktar - + Fees İşlem Ücreti - + Date Tarih - + Transaction Hash İşlem Hash'i - + Close Kapat - + View on Explorer Explorer'da göster @@ -3112,281 +3398,240 @@ Please select a new order. SettingModal - - Confirm Logout - - - - - Are you sure you want to log out? - - - - - Yes - Evet - - - - + + Cancel İptal - + Settings Ayarlar - + Language Dil - + User Interface Kullanıcı Arayüzü - + Security Güvenlik - + General Genel - + About & Version - + Enable Desktop Notifications Masaüstü Bildirimlerini Aktif Et - + Maximum number of enabled coins Maksimum etkin koin sayısı - + Logs Günlük Kaydı - + Open Folder Klasörü Aç - - + + Reset wallet configuration - + This will restart your wallet with default settings - + + Confirm Onayla - + Changing theme to %1 - + + Disable 2FA? + + + + + Enter your wallet password to confirm + + + + + Type password + + + + + 2FA status + + + + + 2FA disabled successfully + + + + + + Ok + Tamam + + + + Wrong password! + + + + + Wallet password is incorrect + + + + Application Version - + copied to clipboard - + Reset Sıfırla - + Current Font Geçerli Yazı Tipi - + Current font changed to %1. - + Theme Tema - + Ask system's password before sending coins ? (2FA) Para göndermeden önce sistem parolası sorulsun mu ? (2FA) - + Application version Uygulama sürümü - + MM2 version MM2 sürümü - + MM2 Version - + MM2 Version copied to clipboard. - + Qt version Qt sürümü - + Qt Version - + Qt Version copied to clipboard. - + Search Update Güncelleme Ara - + Logout Çıkış - - - - - - + View seed and private keys Seed ve özel anahtarları görüntüle - - + + Show Göster - + Setup Camouflage Password Kamuflaj Parolasını Ayarla - + Open - - Disclaimer and ToS - Sorumluluk Reddi ve K.Ş. - - - - Settings - - - Fiat - Döviz - - - - Recommended: - Önerilen: - - - - Enable Desktop Notifications - Masaüstü Bildirimlerini Aktif Et - - - - Use QtTextRendering Or NativeTextRendering - QtTextRendering veya NativeTextRendering Kullan - - - - Open Logs Folder - Günlük Kaydı Klasörünü Aç - - - + Disclaimer and ToS Sorumluluk Reddi ve K.Ş. - - - Setup Camouflage Password - Kamuflaj Parolasını Ayarla - - - - mm2 version - mm2 versiyonu - - - - Delete Wallet - Cüzdanı Sil - - - - View seed and private keys - Seed ve özel anahtarları görüntüle - - - - Reset wallet configuration - - - - - Log out - Çıkış yap - Sidebar - - Search coin - + + Search + Ara - + Add asset Varlık ekle @@ -3498,32 +3743,32 @@ Please select a new order. Gönderen - + To Alan - + Cancel İptal - + Apply filter Filtreyi uygula - + Export Dışarı al - + Please choose the CSV export name and location Lütfen CSV dışa aktarma adını ve konumunu seçin - + No results found @@ -3532,57 +3777,57 @@ Please select a new order. SubOrders - + Orders Emirler - + Filter - + Date Tarih - + Close filtering options. - + Open filtering options. - + Filter settings Ayarları filtrele - + From Gönderen - + To Alan - + Cancel İptal - + Apply filter Filtreyi uygula - + No results found @@ -3716,7 +3961,7 @@ Network fees can vary greatly depending on your selected trading pair. Değişim günlüğü - + Open Logs Folder Günlük Kaydı Klasörünü Aç @@ -3724,31 +3969,23 @@ Network fees can vary greatly depending on your selected trading pair. SwapProgress - + act SHORT FOR ACTUAL TIME gerçek - + est SHORT FOR ESTIMATED tahmini - + Progress details İlerleme ayrıntıları - - SweetDexComboBox - - - Search - Ara - - TextAreaWithTitle @@ -3763,14 +4000,17 @@ Network fees can vary greatly depending on your selected trading pair. - TextEditWithTitle + TextEditWithCopy - - Swap ID + + copied to clipboard + + + TextEditWithTitle - + copied to clipboard @@ -3778,7 +4018,7 @@ Network fees can vary greatly depending on your selected trading pair. TextFieldWithTitle - + Required Gerekli @@ -3794,22 +4034,32 @@ Network fees can vary greatly depending on your selected trading pair. Trade - + Swap Takasla - + Instant trading with best orders En iyi emirlerle anında alım satım - + + Reset form + + + + + You have no tradable assets + + + + From Gönderen - + Enter an amount Bir miktar gir @@ -3829,119 +4079,109 @@ Network fees can vary greatly depending on your selected trading pair. Emri seç - + Price Fiyat - + Better price found: %1. Updating forms. Daha iyi fiyat bulundu: %1. Formları güncelliyor. - + Better price (%1) found but received quantity (%2) is lower than your current one (%3). Click here to update the selected order. Daha iyi fiyat (%1) bulundu, ancak alınan miktar (%2) mevcut fiyattan (%3) daha düşük. Seçilen emri güncellemek için buraya tıklayın. - - Reset form. - Formu sıfırla - - - - You have no tradable assets. - - - - + %1 %1 - + Tradable: Al sat yapılabilir: - + Min: %1 - + Pick a coin - + SWAP NOW - + Failed to place the order Emir başarısız oldu - + Placed the order Emir başarılı - + Entered amount must be superior than 0. Girilen tutar 0'dan büyük olmalıdır. - + You must select an order. Bir emir seçmelisiniz. - + Entered amount is below the minimum required by this order: %1 Girilen miktar, bu emrin gerektirdiği minimum %1 tutarının altında - - + + %1 needs to be enabled in order to use %2 - - + + %1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions - + %1 balance does not have enough funds to pay the gas of %2 transactions - + No buy orders found for %1. - + You can check later or try to sell a different coin. - + Calculating fee estimate... - + Total %1 fees: Toplam %1 işlem giderleri: - + %2 (%3) %2 (%3) @@ -3960,31 +4200,26 @@ Network fees can vary greatly depending on your selected trading pair. - Chart - Grafik - - - Ticker Selectors - + Trading Information Al Sat Bilgisi - + Order Book Emir Defteri - + Best Orders En İyi Emirler - + Place Order Emir Ver @@ -3992,77 +4227,88 @@ Network fees can vary greatly depending on your selected trading pair. TransactionDetailsModal - + Transaction Details İşlem Detayları - + + %1 txid + TICKER + + + + + copied to clipboard. + + + + Amount Miktar - + Fees İşlem Ücreti - + + From address + + + + + To address + + + + Date Tarih - + Unconfirmed Onaylanmamış - + Transaction Hash İşlem Hash'i - - Transactions - - - - - txid copied to clipboard - - - - + Confirmations Onay Sayısı - + Block Height Blok Uzunluğu - + From Gönderen - + To Alan - + Notes Notlar - + Close Kapat - + View on Explorer Explorer'da göster @@ -4070,22 +4316,22 @@ Network fees can vary greatly depending on your selected trading pair. Transactions - + Received Alınan - + Sent Gönderilen - + fees işlem ücretleri - + Unconfirmed Onaylanmamış @@ -4106,19 +4352,6 @@ Network fees can vary greatly depending on your selected trading pair. Emir Defteri - - WalletNameField - - - Wallet Name - Cüzdan Adı - - - - Enter the name of your wallet here - Cüzdanınızın adını giriniz - - WalletsView @@ -4142,123 +4375,160 @@ Network fees can vary greatly depending on your selected trading pair. - + My Wallets Cüzdanlarım - + No wallets found! - - + + Delete Sil - + Enter password to confirm deletion of - + wallet - + Type password - + Cancel İptal - - + + Wallet status - + wallet deleted successfully - - + + Ok Tamam - + wallet password is incorrect + + ZcashParamsModal + + + %1 Activation Failed! + + + + + To activate ZHTLC coins, you need to download the Zcash Params. +This might take a few minutes... + + + + + Download params & enable coins + + + + + More Info + + + + + Close + Kapat + + + + atomic_dex::settings_page + + + An error has occurred. + + + atomic_dex::wallet_page - + You do not have enough funds. Bakiye yetersiz. - + %1 is not activated: click on the button to enable it or enable it manually %1 etkinleştirilmedi: etkinleştirmek için düğmeye tıklayın veya manuel olarak etkinleştirin - + You need to have %1 to pay the gas for %2 transactions. %2 işlemi için gaz ödemek üzere %1'e sahip olmanız gerekir. - + Checksum verification failed for %1. %1 için sağlama toplamı doğrulaması başarısız oldu. - + Invalid checksum for %1. Click the button to convert to mixed case address. - + Legacy address used for %1. Click the button to convert to a Cashaddress. - + %1 address must be prefixed with 0x %1 adresinin önüne 0x konulmalı - + %1 address length is invalid, please use a valid address. %1 adres uzunluğu geçersiz, lütfen geçerli bir adres kullanın. - + %1 address is invalid. - + Invalid checksum. - + %1 address has invalid prefixes. - + Backend error: %1 @@ -4266,32 +4536,12 @@ Network fees can vary greatly depending on your selected trading pair. main - + Logout Çıkış - - Confirm Logout - - - - - Are you sure you want to log out? - - - - - Yes - Evet - - - - Cancel - İptal - - - + Balance Bakiye diff --git a/atomic_defi_design/assets/languages/gen_translation.py b/atomic_defi_design/assets/languages/gen_translation.py new file mode 100755 index 0000000000..a401e547fd --- /dev/null +++ b/atomic_defi_design/assets/languages/gen_translation.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +import os +import csv + +''' +NOTE: This script takes a CSV file as input, then generates a .ts file using the english file as a template. +There may be some postprocessing required to manually fix bad csv input and numerusform values. +''' + + +def get_lang_dict(): + with open('translations_matrix.csv') as f: + csv_reader = csv.reader(f, delimiter=',') + lang_dict = {} + line_count = 0 + for row in csv_reader: + if line_count == 0: + en = row.index("English") + es = row.index("Spanish") + de = row.index("German") + line_count += 1 + else: + lang_dict.update({ + row[en]: { + "es": row[es], + "de": row[de] + } + }) + line_count += 1 + return lang_dict + +def remove_existing_translations(): + with open(f"atomic_defi_en.ts", "r") as f: + ts_file = f.readlines() + + with open(f"atomic_defi_lang_template.ts", "w") as f: + lines = [] + ignoring = False + for l in ts_file: + if l.find(" -1 or ignoring: + ignoring = True + if l.find("translation>") > -1: + ignoring = False + else: + lines.append(l) + f.writelines(lines) + + +def generate_translation(lang='en'): + lang_dict = get_lang_dict() + remove_existing_translations() + + with open(f"atomic_defi_lang_template.ts", "r") as f: + lang_file = f.read() + + multiline = False + multiline_data = [] + untranslated_count = 0 + for i in lang_dict: + try: + # TODO: handle numerusform translations + if f"{i}" in lang_file: + lang_file = lang_file.replace(f"{i}", f"{i}\n {lang_dict[i][lang]}") + if f" {i}" in lang_file: + lang_file = lang_file.replace(f"{i}", f"{i}\n {lang_dict[i][lang]}") + elif f"{i}" in lang_file: + multiline = True + multiline_data.append(f"{lang_dict[i][lang]}") + elif multiline: + multiline_data.append(f"{lang_dict[i][lang]}") + elif f"{i}" in lang_file: + multiline_data.append(f"{lang_dict[i][lang]}") + translation = '\n'.join(multiline_data) + lang_file = lang_file.replace(f"{i}", f"{i}\n {translation}") + multiline = False + elif f"{i}" not in lang_file: + print(f"{i} ---> {lang_dict[i][lang]}") + print(f">>>>>>>>>>>>>>>>>>>>>>>>>> '{i}' not found!") + untranslated_count += 1 + else: + #print(lang_dict[i][lang]) + untranslated_count += 1 + pass + except Exception as e: + untranslated_count += 1 + print(f">>>>>>>>>>>>>>>>>>>>>>>>>> 'Error: {e} | source: {i}") + print(f"{untranslated_count} lines untranslated") + + with open(f"atomic_defi_{lang}.ts", 'w') as f: + f.write(lang_file) + + +if __name__ == '__main__': + generate_translation('es') + + \ No newline at end of file diff --git a/atomic_defi_design/assets/languages/translations_matrix.csv b/atomic_defi_design/assets/languages/translations_matrix.csv new file mode 100644 index 0000000000..37a934e80a --- /dev/null +++ b/atomic_defi_design/assets/languages/translations_matrix.csv @@ -0,0 +1,807 @@ +"Location/Area line +(German lang. file)",Location/Area,comment,"Source Line +(German lang. file)",English,"Translation Line +(German lang. file)",German,Spanish,Mandarin,… +7,Dex/Addressbook/AddAddressForm.qml,,8,Use standard network address,9,Standard-Netzwerkadresse verwenden,Utilice la dirección de red,, +12,Dex/Addressbook/AddAddressForm.qml,,13,Label,14,Bezeichnung,Etiqueta,, +17,Dex/Addressbook/AddAddressForm.qml,,18,This key already exists.,19,Dieser Schlüssel existiert bereits.,Esta clave ya existe.,, +22,Dex/Addressbook/AddAddressForm.qml,,23,Address,24,Adresse,Dirección,, +27,Dex/Addressbook/AddAddressForm.qml,,29,Cancel,30,Abbrechen,Cancelar,, +33,Dex/Addressbook/AddAddressForm.qml,,34,Convert,35,Umwandeln,Convertir,, +38,Dex/Addressbook/AddAddressForm.qml,,39,Edit,40,Bearbeiten,Editar,, +43,Dex/Addressbook/AddAddressForm.qml,,44,Add,45,Hinzufügen,Agregar,, +48,Dex/Addressbook/AddAddressForm.qml,,49,You need to enable %1 before adding this kind of address.,50,"Sie müssen %1 aktivieren, bevor Sie diese Art von Adresse hinzufügen.",Debe habilitar %1 antes de agregar este tipo de dirección.,, +53,Dex/Addressbook/AddAddressForm.qml,,54,Enable,55,Aktivieren,Habilitar,, +61,Dex/Settings/AddCustomCoinModal.qml,,62,Get the contract address from,63,Erhalten Sie die Vertragsadresse von,Obtener la dirección del contrato de,, +66,Dex/Settings/AddCustomCoinModal.qml,,67,Choose the asset type,68,Wählen Sie den Asset-Typ aus,Elija el tipo de activo,, +71,Dex/Settings/AddCustomCoinModal.qml,,72,Cancel,73,Abbrechen,Cancelar,, +78,Dex/Settings/AddCustomCoinModal.qml,,79,Next,80,Weiter,Siguiente,, +83,Dex/Settings/AddCustomCoinModal.qml,,84,Contract address,85,Vertragsadresse,Dirección del contrato,, +88,Dex/Settings/AddCustomCoinModal.qml,,89,Enter the contract address,90,Geben Sie die Vertragsadresse ein,Ingrese la dirección del contrato,, +93,Dex/Settings/AddCustomCoinModal.qml,,94,Choose the asset ticker,95,Wählen Sie den Asset-Ticker,Elija el ticker del activo,, +98,Dex/Settings/AddCustomCoinModal.qml,,99,Ticker,100,Ticker,Ticker,, +103,Dex/Settings/AddCustomCoinModal.qml,,104,Enter the ticker,105,Geben Sie den Ticker ein,Ingrese el ticker,, +108,Dex/Settings/AddCustomCoinModal.qml,,109,Get the contract address from ,110,Erhalten Sie die Vertragsadresse von,Obtener la dirección del contrato de,, +116,Dex/Settings/AddCustomCoinModal.qml,,117,Previous,118,Vorherige,Anterior,, +121,Dex/Settings/AddCustomCoinModal.qml,,122,Choose the asset logo,123,Wählen Sie ein Logo für das Asset aus,Elija el logotipo del activo,, +126,Dex/Settings/AddCustomCoinModal.qml,,127,Browse,128,Durchsuchen,Navegar,, +131,Dex/Settings/AddCustomCoinModal.qml,,132,Please choose the asset logo,133,Bitte wählen Sie für das Asset ein Logo aus,Elija el logotipo del activo,, +136,Dex/Settings/AddCustomCoinModal.qml,,137,Configuration,138,Konfiguration,Configuración,, +141,Dex/Settings/AddCustomCoinModal.qml,,142,All configuration fields will be fetched using the contract address you provided.,143,Alle Konfigurationsfelder werden mit der von Ihnen angegebenen Vertragsadresse abgerufen.,Todos los campos de configuración se obtendrán usando la dirección del contrato que proporcionó.,, +146,Dex/Settings/AddCustomCoinModal.qml,,147,Name,148,Name,Nombre,, +151,Dex/Settings/AddCustomCoinModal.qml,,152,Enter the name,153,Geben Sie den Namen ein,Ingrese el nombre,, +156,Dex/Settings/AddCustomCoinModal.qml,,157,Coingecko ID,158,Coingecko ID,Coingecko ID,, +161,Dex/Settings/AddCustomCoinModal.qml,,162,Enter the Coingecko ID,163,Geben Sie die Coingecko-ID ein,Ingrese el Coingecko ID,, +166,Dex/Settings/AddCustomCoinModal.qml,,167,Get the Coingecko ID,168,Coingecko-ID erhalten,Obtener el Coingecko ID,, +171,Dex/Settings/AddCustomCoinModal.qml,,172,Active,173,Aktiv,Activo,, +177,Dex/Settings/AddCustomCoinModal.qml,,178,Preview,179,Vorschau,Vista previa,, +182,Dex/Settings/AddCustomCoinModal.qml,,183,WARNING: Application will restart immidiately to apply the changes!,184,"WARNUNG: Die Anwendung wird sofort neu gestartet, um die Änderungen zu übernehmen!",ADVERTENCIA: ¡La aplicación se reiniciará inmediatamente para aplicar los cambios!,, +187,Dex/Settings/AddCustomCoinModal.qml,,188,"Asset not found, please go back and make sure Contract Address is correct",189,"Asset nicht gefunden, bitte gehen Sie zurück und stellen Sie sicher, dass die Vertragsadresse korrekt ist","Activo no encontrado, regrese y asegúrese de que la dirección del contrato sea correcta",, +192,Dex/Settings/AddCustomCoinModal.qml,,193,Config Fields,194,Konfigurationsfelder,Campos de configuracion,, +197,Dex/Settings/AddCustomCoinModal.qml,,198,Fetched Data,199,Abgerufene Daten,Datos obtenidos,, +202,Dex/Settings/AddCustomCoinModal.qml,,203,Submit & Restart,204,Bestätigen und Neu starten,Enviar & Reiniciar,, +210,Dex/Addressbook/AddTagPopup.qml,,211,Tag name,212,Schlagwort,Nombre de la etiqueta,, +215,Dex/Addressbook/AddTagPopup.qml,,216,Contact already has this tag.,217,Der Kontakt hat bereits dieses Schlagwort.,El contacto ya tiene esta etiqueta.,, +220,Dex/Addressbook/AddTagPopup.qml,,221,+ ADD,222,+ HINZUFÜGEN,#NAME?,, +228,Dex/Portfolio/AmountChart.qml,,229,Work in progress,230,In Arbeit,Trabajo en proceso,, +236,Dex/App.qml,,237,Recover Funds Result,238,Ergebnis der Rückerstattung der Geldmittel,Resultados de Recuperar Fondos,, +244,Dex/Addressbook/AssetFromStandardSelector.qml,,245,Choose a valid ,246,Wählen Sie eine gültige,Elija un,, +249,Dex/Addressbook/AssetFromStandardSelector.qml,,250,asset,251,Asset,activo,, +254,Dex/Addressbook/AssetFromStandardSelector.qml,,255,Search an asset,256,Asset suchen,Buscar un activo,, +259,Dex/Addressbook/AssetFromStandardSelector.qml,,260,Disabled,261,Deaktiviert,deshabilitados,, +267,Dex/Portfolio/AssetPieChart.qml,,268,Assets,269,Assets,Activos,, +275,Dex/Portfolio/AssetsList.qml,,276,Asset,277,Asset,Activo,, +280,Dex/Portfolio/AssetsList.qml,,281,Balance,282,Balance,Saldo,, +285,Dex/Portfolio/AssetsList.qml,,286,Fiat Balance,287,Fiat Balance,Saldo Fiat,, +290,Dex/Portfolio/AssetsList.qml,,291,Change 24h,292,24h Veränderung,Cambio en 24h,, +295,Dex/Portfolio/AssetsList.qml,,296,Price,297,Preis,Precio,, +300,Dex/Portfolio/AssetsList.qml,,301,Source,302,Quelle,Fuente,, +305,Dex/Portfolio/AssetsList.qml,,306,Price provider is: %1,307,Preisanbieter ist: %1,El proveedor de precios es: %1,, +313,Dex/Sidebar/Bottom.qml,,314,Settings,315,Einstellungen,Configuración,, +318,Dex/Sidebar/Bottom.qml,,319,Support,320,Support,Soporte,, +323,Dex/Sidebar/Bottom.qml,,324,Privacy,325,Datenschutz,Privacidad,, +328,Dex/Sidebar/Bottom.qml,,329,Disable Privacy?,330,Datenschutz deaktivieren?,¿Deshabilitar privacidad?,, +333,Dex/Sidebar/Bottom.qml,,334,Enter wallet password to confirm,335,Geben Sie zur Bestätigung das Kennwort der Brieftasche ein,Ingrese la contraseña de la billetera para confirmar,, +338,Dex/Sidebar/Bottom.qml,,339,Type password,340,Kennwort eingeben,Escriba la contraseña,, +343,Dex/Sidebar/Bottom.qml,,344,Confirm,345,Bestätigen,Confirmar,, +348,Dex/Sidebar/Bottom.qml,,349,Cancel,350,Abbrechen,Cancelar,, +353,Dex/Sidebar/Bottom.qml,,354,Privacy status,355,Status Datenschutz,Estado de privacidad,, +358,Dex/Sidebar/Bottom.qml,,359,Privacy mode disabled successfully,360,Der Datenschutzmodus wurde erfolgreich deaktiviert,Modo de privacidad deshabilitado correctamente,, +364,Dex/Sidebar/Bottom.qml,,365,Ok,366,Ok,Ok,, +369,Dex/Sidebar/Bottom.qml,,370,Wrong password!,371,Falsches Kennwort!,¡Contraseña incorrecta!,, +374,Dex/Sidebar/Bottom.qml,,375,wallet password is incorrect,376,Kennwort der Brieftasche ist falsch,la contraseña de la billetera es incorrecta,, +382,Dex/Settings/CamouflagePasswordModal.qml,,383,Setup Camouflage Password,384,Tarnkennwort einrichten,Configurar Contraseña Camuflaje,, +387,Dex/Settings/CamouflagePasswordModal.qml,,388,Camouflage Password is a secret password for emergency situations.,389,Das Tarnkennwort (Camouflage Password) ist ein geheimes Passwort für Notsituationen.,Contraseña Camuflaje es una contraseña secreta para situaciones de emergencia.,, +392,Dex/Settings/CamouflagePasswordModal.qml,,393,Using it to login will display your balance lower than it actually is.,394,"Wenn Sie sich damit anmelden, wird Ihr Guthaben niedriger angezeigt, als es tatsächlich ist.",Usarlo para iniciar sesión mostrará su saldo más bajo de lo que realmente es.,, +397,Dex/Settings/CamouflagePasswordModal.qml,,398,Here you enter the suffix and at login you need to enter {real_password}{suffix},399,Hier geben Sie den Zusatz ein und beim Einloggen benötigen Sie {echtes Kennwort}{suffix},Aquí ingresa el sufijo y al iniciar sesión debe ingresar {real_password}{suffix},, +403,Dex/Settings/CamouflagePasswordModal.qml,,404,Password suffix,405,Kennwort-Zusatz,Sufijo de contraseña,, +408,Dex/Settings/CamouflagePasswordModal.qml,,409,Confirm pasword suffix,410,Kennwort-Zusatz bestätigen,Confirmar sufijo,, +413,Dex/Settings/CamouflagePasswordModal.qml,,414,Enter a password suffix,415,Geben Sie einen Kennwort-Zusatz ein,Ingrese un sufijo de contraseña,, +418,Dex/Settings/CamouflagePasswordModal.qml,,419,Enter the same password suffix to confirm,420,Geben Sie zur Bestätigung denselben Kennwort-Zusatz ein,Ingrese el mismo sufijo de contraseña para confirmar,, +423,Dex/Settings/CamouflagePasswordModal.qml,,424,Cancel,425,Abbrechen,Cancelar,, +428,Dex/Settings/CamouflagePasswordModal.qml,,429,Save,430,Speichern,Guardar,, +436,Dex/Components/CannotEnableCoinModal.qml,,437,Failed to enable %1,438,Aktivierung von %1 fehlgeschlagen,No se pudo habilitar %1,, +441,Dex/Components/CannotEnableCoinModal.qml,,442,Enabling %1 did not succeed. Limit of enabled coins might have been reached.,443,Das Aktivieren von %1 war nicht erfolgreich. Das Limit der aktivierten Coins wurde möglicherweise erreicht.,No se pudo habilitar %1. Es posible que se haya alcanzado el límite de monedas habilitadas.,, +446,Dex/Components/CannotEnableCoinModal.qml,,447,Change limit in settings,448,Limit in den Einstellungen ändern,Cambiar el límite en la configuración,, +451,Dex/Components/CannotEnableCoinModal.qml,,452,Cancel,453,Abbrechen,Cancelar,, +459,Dex/Sidebar/Center.qml,,460,Portfolio,461,Portfolio,Portafolio,, +464,Dex/Sidebar/Center.qml,,465,Wallet,466,Brieftasche,Monedero,, +469,Dex/Sidebar/Center.qml,,470,DEX,471,DEX,DEX,, +474,Dex/Sidebar/Center.qml,,475,Address Book,476,Adressbuch,Libreta de direcciones,, +479,Dex/Sidebar/Center.qml,,480,Fiat,481,Fiat,Fiat,, +487,Dex/Components/CexInfoModal.qml,,488,Market Data,489,Marktdaten,Data de Mercado,, +492,Dex/Components/CexInfoModal.qml,,493,"Market data (prices, charts, etc.) marked with the ⓘ icon originates from third-party sources.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a>",494,"Mit dem Symbol ⓘ gekennzeichnete Marktdaten (Kurse, Charts etc.) stammen aus Drittquellen.<br><br>Die Daten stammen von <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> und <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle unterstützte Paare:</b><br>%1<br><br><b>Letzte Referenz (Band Oracle):</b><br><a href="%2">%2</a>","Datos de mercado (precios, estadisticas, etc.) marcados con ⓘ se obtienen a través de fuentes terceras.<br><br>Data is sourced via <a href="https://bandprotocol.com/">Band Decentralized Oracle</a> and <a href="https://coingecko.com">CoinGecko</a>.<br><br><b>Oracle Supported Pairs:</b><br>%1<br><br><b>Last reference (Band Oracle):</b><br><a href="%2">%2</a>",, +500,Dex/Exchange/ProView/Chart.qml,,501,Loading market data,502,Laden von Marktdaten,Cargando datos de mercado,, +505,Dex/Exchange/ProView/Chart.qml,,506,There is no chart data for this pair yet,507,Für dieses Paar liegen noch keine Chartdaten vor,Todavía no hay datos de gráficos para este par,, +513,Dex/Wallet/ClaimRewardsModal.qml,,514,Failed to prepare to claim rewards,515,Vorbereitung zum Einfordern von Belohnungen fehlgeschlagen,No se pudo preparar para reclamar recompensas,, +518,Dex/Wallet/ClaimRewardsModal.qml,TICKER,519,Claim your %1 reward?,521,%1 Belohnung beantragen?,¿Reclamar su %1 de recompensa?,, +524,Dex/Wallet/ClaimRewardsModal.qml,,525,No UTXOs eligible for claiming,526,Keine beanspruchungsberechtigten UTXOs vorhanden,Ningún UTXO elegible para reclamar,, +529,Dex/Wallet/ClaimRewardsModal.qml,,530,Transaction fee is higher than the reward!,531,Die Transaktionsgebühr ist höher als die Belohnung!,¡La tarifa de transacción es más alta que la recompensa!,, +534,Dex/Wallet/ClaimRewardsModal.qml,,535,You will receive ,536,Sie erhalten,Recibirá,, +539,Dex/Wallet/ClaimRewardsModal.qml,,540,Refresh,541,Aktualisieren,Actualizar,, +544,Dex/Wallet/ClaimRewardsModal.qml,,545,Read more about KMD active users rewards,546,Lesen Sie mehr über die Belohnungen für aktive KMD-Benutzer,Lea más sobre las recompensas de los usuarios activos de KMD,, +549,Dex/Wallet/ClaimRewardsModal.qml,,550,UTXO,551,UTXO,UTXO,, +554,Dex/Wallet/ClaimRewardsModal.qml,,555,Amount,556,Menge,Monto,, +559,Dex/Wallet/ClaimRewardsModal.qml,,560,Reward,561,Belohnung,Recompensa,, +564,Dex/Wallet/ClaimRewardsModal.qml,,565,Accruing Start,566,Anfallender Start,Inicio de Acumulación,, +569,Dex/Wallet/ClaimRewardsModal.qml,,570,Accruing Stop,571,Anfallender Stopp,Detener Acumulación,, +574,Dex/Wallet/ClaimRewardsModal.qml,,575,Time Left,576,Verbleibende Zeit,Tiempo Restante,, +579,Dex/Wallet/ClaimRewardsModal.qml,,580,Error,581,Fehler,Error,, +584,Dex/Wallet/ClaimRewardsModal.qml,,585,Locktime is not set,586,Die Sperrzeit ist nicht eingestellt,Locktime no está configurado,, +589,Dex/Wallet/ClaimRewardsModal.qml,,590,Locktime is less than the threshold,591,Die Sperrzeit liegt unter dem Schwellenwert,Locktime es inferior al umbral,, +594,Dex/Wallet/ClaimRewardsModal.qml,,595,UTXO height is greater than end of the era,596,UTXO-Höhe ist größer als Ende der Ära,La altura de UTXO es mayor que el final de la era,, +599,Dex/Wallet/ClaimRewardsModal.qml,,600,UTXO amount is less than 10,601,UTXO-Menge ist kleiner als 10,La cantidad de UTXO es inferior a 10,, +604,Dex/Wallet/ClaimRewardsModal.qml,,605,One hour did not pass yet,606,Eine Stunde ist noch nicht vergangen,Una hora no pasa aún,, +609,Dex/Wallet/ClaimRewardsModal.qml,,610,Transaction is in mempool,611,Die Transaktion befindet sich in Mempool,La transacción está en el mempool,, +614,Dex/Wallet/ClaimRewardsModal.qml,,615,Unknown problem,616,Unbekanntes Problem,Problema desconocido,, +619,Dex/Wallet/ClaimRewardsModal.qml,,620,Cancel,621,Abbrechen,Cancelar,, +624,Dex/Wallet/ClaimRewardsModal.qml,,625,Confirm,626,Bestätigen,Confirmar,, +632,Dex/Components/CoinMenu.qml,TICKER,633,Disable %1,635,%1 deaktivieren,Deshabilitar %1,, +638,Dex/Components/CoinMenu.qml,TICKER,639,Disable and Delete %1,641,%1 deaktivieren und löschen,Deshabilitar y eliminar %1,, +644,Dex/Components/CoinMenu.qml,,645,Disable all %1 assets,646,Alle %1 Assets deaktivieren,Deshabilitar todos los activos de %1,, +649,Dex/Components/CoinMenu.qml,,650,Disable all assets,651,Alle Assets deaktivieren,Deshabilitar todos los activos,, +654,Dex/Components/CoinMenu.qml,,655,Disable 0 balance assets,656,Alle Assets mit der Balance 0 deaktivieren,Deshabilitar 0 balancear activos,, +662,Dex/Components/ComboBoxWithSearchBar.qml,,663,Search,664,Suchen,Búsqueda,, +670,Dex/Settings/Combo_fiat.qml,,671,Language,672,Sprache,Idioma,, +675,Dex/Settings/Combo_fiat.qml,,676,Fiat,677,Fiat,Fiat,, +680,Dex/Settings/Combo_fiat.qml,,681,Recommended: ,682,Empfohlen:,Recomendado:,, +688,Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml,,689,Confirm Multi Order Details,690,Bestätigen Sie die Details des Mehrfachauftrags,Confirmar detalles de Multi Order,, +693,Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml,,694,These swaps requests can not be undone and this is the final event!,695,Diese Tauschanfragen können nicht rückgängig gemacht werden und dies ist das endgültige Ereignis!,Estas solicitudes de intercambio no se pueden deshacer y este es el evento final!,, +698,Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml,,699,These transactions can take up to 60 mins - DO NOT close this application!,700,Diese Transaktionen können bis zu 60 Minuten dauern - schließen Sie diese Anwendung NICHT!,Estas transacciones pueden demorar hasta 60 minutos. ¡NO cierre esta aplicación!,, +703,Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml,,704,Same funds will be used until an order matches.,705,"Die gleichen Geldmittel werden verwendet, bis eine Bestellung übereinstimmt.",Se utilizarán los mismos fondos hasta que coincida un pedido.,, +708,Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml,,709,Note that if one order is filled other will not be cancelled.,710,"Beachten Sie, dass, wenn eine Bestellung ausgeführt wird, andere nicht storniert werden.","Tenga en cuenta que si se completa un pedido, el otro no se cancelará.",, +713,Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml,,714,Cancel,715,Abbrechen,Cancelar,, +718,Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml,,719,Confirm,720,Bestätigen,Confirmar,, +723,Dex/Exchange/Trade/ConfirmMultiOrderTradeModal.qml,,724,Placed multiple orders,725,Mehrere Aufrtäge aufgegeben,Pedidos múltiples realizados,, +731,Dex/Exchange/Trade/ConfirmTradeModal.qml,,732,Confirm Exchange Details,733,Bestätigen Sie die Austausch-Details,Confirmar Detalles de Intercambio,, +736,Dex/Exchange/Trade/ConfirmTradeModal.qml,,737,Trade price is more than 50% different to CEX! Confirm?,738,Der Handelspreis unterscheidet sich um mehr als 50 % vom CEX-Preis! Bestätigen?,¡El precio comercial es más del 50% diferente al de CEX! ¿Confirmar?,, +741,Dex/Exchange/Trade/ConfirmTradeModal.qml,,742,This swap request can not be undone and is a final event!,743,Diese Tauschanfrage kann nicht rückgängig gemacht werden und ist ein endgültiges Ereignis!,¡Esta solicitud de intercambio no se puede deshacer y es un evento final!,, +746,Dex/Exchange/Trade/ConfirmTradeModal.qml,,747,This transaction can take up to 60 mins - DO NOT close this application!,748,Diese Transaktion kann bis zu 60 Minuten dauern - schließen Sie diese Anwendung NICHT!,Esta transacción puede demorar hasta 60 minutos. ¡NO cierre esta aplicación!,, +751,Dex/Exchange/Trade/ConfirmTradeModal.qml,,752,Loading fees...,753,Lade Gebühren...,Cargando tarifas...,, +756,Dex/Exchange/Trade/ConfirmTradeModal.qml,,757,<b>Total %1 fees:</b>,758,<b>Gesamt %1 Gebühren:</b>,<b>Total de %1 fees:</b>,, +761,Dex/Exchange/Trade/ConfirmTradeModal.qml,,762,Security configuration,763,Sicherheitskonfiguration,Configuración de seguridad,, +766,Dex/Exchange/Trade/ConfirmTradeModal.qml,,767,dPoW protected,768,dPoW-geschützt,Protegido por dPoW,, +771,Dex/Exchange/Trade/ConfirmTradeModal.qml,,772,%1 confirmations for incoming %2 transactions,773,%1 Bestätigungen für eingehende %2 Transaktionen,%1 confirmaciones para %2 transacciones entrantes,, +776,Dex/Exchange/Trade/ConfirmTradeModal.qml,,777,Read more about dPoW,778,Lesen Sie mehr über dPoW,Obtenga más información sobre dPoW,, +781,Dex/Exchange/Trade/ConfirmTradeModal.qml,TICKER,782,Use custom protection settings for incoming %1 transactions,784,Benutzerdefinierte Schutzeinstellungen für eingehende %1 Transaktionen verwenden,Utilice configuraciones de protección personalizadas para %1 transacciones entrantes,, +787,Dex/Exchange/Trade/ConfirmTradeModal.qml,,788,Enable Komodo dPoW security,789,Komodo dPoW-Sicherheit aktivieren,Habilite la seguridad dPoW de Komodo,, +792,Dex/Exchange/Trade/ConfirmTradeModal.qml,,793,Required Confirmations,794,Erforderliche Bestätigungen,Confirmaciones Requeridas,, +797,Dex/Exchange/Trade/ConfirmTradeModal.qml,,798,"Warning, this atomic swap is not dPoW protected!",799,"Achtung, dieser Atomic Swap ist nicht dPoW-geschützt!","Advertencia, este intercambio atómico no está protegido por dPoW!",, +802,Dex/Exchange/Trade/ConfirmTradeModal.qml,,803,Cancel,804,Abbrechen,Cancelar,, +807,Dex/Exchange/Trade/ConfirmTradeModal.qml,,808,Confirm,809,Bestätigen,Confirmar,, +815,Dex/Components/CopyFieldButton.qml,,816,Copied to Clipboard,817,In die Zwischenablage kopiert,Copiado al Portapapeles,, +823,Dex/Screens/Dashboard.qml,,824,The current number of enabled coins does not match your configuration specification. Your assets configuration will be reset.,825,Die aktuelle Anzahl aktivierter Coins stimmt nicht mit Ihrer Konfigurationsvorgabe überein. Die Konfiguration der Assets wird zurückgesetzt.,El número actual de monedas habilitadas no coincide con su especificación de configuración. Se restablecerá la configuración de sus activos.,, +828,Dex/Screens/Dashboard.qml,,829,Matching,830,"Zusammenführung",Emparejamiento,, +833,Dex/Screens/Dashboard.qml,,834,Order Matching,835,"Auftrag wird zusammengeführt",Emparejamiento de Ordenes,, +838,Dex/Screens/Dashboard.qml,,839,Matched,840,"Zusammengeführt",Emparejamiento Completo,, +843,Dex/Screens/Dashboard.qml,,844,Order Matched,845,"Auftrag wurde zusammengeführt",Orden Emparejada,, +848,Dex/Screens/Dashboard.qml,,849,Ongoing,850,"Laufend",En curso,, +853,Dex/Screens/Dashboard.qml,,854,Swap Ongoing,855,Austausch läuft,Intercambio en Curso,, +858,Dex/Screens/Dashboard.qml,,859,Successful,860,Erfolgreich,Exitoso,, +863,Dex/Screens/Dashboard.qml,,864,Swap Successful,865,Tausch erfolgreich,Intercambio Exitoso,, +868,Dex/Screens/Dashboard.qml,,869,Refunding,870,Rückzahlung,Reembolso,, +873,Dex/Screens/Dashboard.qml,,874,Failed,875,Fehlgeschlagen,Fallido,, +878,Dex/Screens/Dashboard.qml,,879,Swap Failed,880,Tausch fehlgeschlagen,Intercambio Fallido,, +883,Dex/Screens/Dashboard.qml,,884,Unknown,885,Unbekannt,Desconocido,, +888,Dex/Screens/Dashboard.qml,,889,Unknown State,890,Unbekannter Status,Estado Desconocido,, +893,Dex/Screens/Dashboard.qml,,894,Started,895,Gestartet,Iniciado,, +898,Dex/Screens/Dashboard.qml,,899,Negotiated,900,"Ausgehandelt",Negociado,, +903,Dex/Screens/Dashboard.qml,,904,Taker fee sent,905,Taker-Gebühr gesendet,Tarifa taker enviada,, +908,Dex/Screens/Dashboard.qml,,909,Maker payment received,910,Maker-Zahlung erhalten,Pago de maker recibido,, +913,Dex/Screens/Dashboard.qml,,914,Maker payment wait confirm started,915,Warten auf die Zahlungsbestätigung des Makers gestartet,Inicio de espera de confirmacion de pago de maker,, +918,Dex/Screens/Dashboard.qml,,919,Maker payment validated and confirmed,920,Maker-Zahlung validiert und bestätigt,Validacion y confirmacion de pago de maker,, +923,Dex/Screens/Dashboard.qml,,924,Taker payment sent,925,Taker-Zahlung gesendet,Pago de taker enviado,, +928,Dex/Screens/Dashboard.qml,,929,Taker payment spent,930,Taker-Zahlung ausgegeben,Pago del taker gastado,, +933,Dex/Screens/Dashboard.qml,,934,Maker payment spent,935,Maker-Zahlung ausgegeben,Pago del maker gastado,, +938,Dex/Screens/Dashboard.qml,,939,Finished,940,Fertig,Terminado,, +943,Dex/Screens/Dashboard.qml,,944,Start failed,945,Start fehlgeschlagen,Inicio fallido,, +948,Dex/Screens/Dashboard.qml,,949,Negotiate failed,950,Verhandeln fehlgeschlagen,Negociacion fallida,, +953,Dex/Screens/Dashboard.qml,,954,Taker fee validate failed,955,Validierung der Abnehmergebühr fehlgeschlagen,Validación de tarifa del taker fallida,, +958,Dex/Screens/Dashboard.qml,,959,Maker payment transaction failed,960,Maker-Zahlungstransaktion fehlgeschlagen,Transacción de pago de maker fallo,, +963,Dex/Screens/Dashboard.qml,,964,Maker payment Data send failed,965,Fehler beim Senden der Maker-Zahlungsdaten,Envio de data de pago de maker fallo,, +968,Dex/Screens/Dashboard.qml,,969,Maker payment wait confirm failed,970,Warten auf die Zahlungsbestätigung des Makers fehlgeschlagen,Espera de confirmacion de pago de maker fallo,, +973,Dex/Screens/Dashboard.qml,,974,Taker payment validate failed,975,Validierung der Taker-Zahlung fehlgeschlagen,Validacion de pago de taker fallo,, +978,Dex/Screens/Dashboard.qml,,979,Taker payment wait confirm failed,980,Warten auf die Zahlungsbestätigung des Takers fehlgeschlagen,Espera de confirmacion de pago de taker fallo,, +983,Dex/Screens/Dashboard.qml,,984,Taker payment spend failed,985,Zahlungsausgabe des Takers fehlgeschlagen,Gasto de pago de taker fallo,, +988,Dex/Screens/Dashboard.qml,,989,Maker payment wait refund started,990,Countdown für die Rückerstattung der Maker-Zahlung hat begonnen,Reembolso de espera de pago de maker iniciado,, +993,Dex/Screens/Dashboard.qml,,994,Maker payment refunded,995,Maker-Zahlung zurückerstattet,Pago de maker reembolsado,, +998,Dex/Screens/Dashboard.qml,,999,Maker payment refund failed,1000,Rückerstattung der Maker-Zahlung fehlgeschlagen,Reembolso del pago de maker fallo,, +1006,Dex/Components/DatePicker.qml,,1007,Date,1008,Datum,Fecha,, +1014,Dex/Components/DefaultCopyIcon.qml,,1015,copied to clipboard,1016,In die Zwischenablage kopiert,copiada al portapapeles,, +1022,Dex/Components/DefaultRangeSlider.qml,,1023,Min,1024,Min,Min,, +1027,Dex/Components/DefaultRangeSlider.qml,,1028,Max,1029,Max,Max,, +1035,Dex/Components/DefaultTextEdit.qml,,1036,copied to clipboard,1037,In die Zwischenablage kopiert,copiado al portapapeles,, +1043,Dex/Settings/DeleteWalletModal.qml,,1044,Delete Wallet,1045,Brieftasche löschen,Eliminar billetera,, +1048,Dex/Settings/DeleteWalletModal.qml,WALLET_NAME,1049,Are you sure you want to delete %1 wallet?,1051,"Sind Sie sicher, dass Sie die %1 Brieftasche löschen möchten?",¿Está seguro de que desea eliminar %1 billetera?,, +1054,Dex/Settings/DeleteWalletModal.qml,,1055,"If so, make sure you record your seed phrase in order to restore your wallet in the future.",1056,"Wenn ja, stellen Sie sicher, dass Sie Ihre Seed-Phrase notieren, um Ihre Brieftasche in Zukunft wiederherzustellen.","Si es así, asegúrese de registrar su frase inicial para restaurar su billetera en el futuro.",, +1059,Dex/Settings/DeleteWalletModal.qml,,1060,Enter your wallet password,1061,Geben Sie das Kennwort für ihre Brieftasche ein,Ingrese la contraseña de su billetera,, +1064,Dex/Settings/DeleteWalletModal.qml,,1065,Wrong Password,1066,Falsches Kennwort,Contraseña incorrecta,, +1069,Dex/Settings/DeleteWalletModal.qml,,1070,Cancel,1071,Abbrechen,Cancelar,, +1074,Dex/Settings/DeleteWalletModal.qml,,1075,Delete,1076,Löschen,Eliminar,, +1082,Dex/Components/DexAppPasswordField.qml,,1083,Type password,1084,Kennwort eingeben,Escriba la contraseña,, +1090,Dex/Components/DexKeyChecker.qml,,1091,At least 1 lowercase alphabetical character,1092,Mindestens 1 Kleinbuchstabe,Al menos 1 carácter alfabético en minúscula,, +1095,Dex/Components/DexKeyChecker.qml,,1096,At least 1 uppercase alphabetical character,1097,Mindestens 1 Großbuchstabe,Al menos 1 carácter alfabético en mayúscula,, +1100,Dex/Components/DexKeyChecker.qml,,1101,At least 1 numeric character,1102,Mindestens 1 Ziffer,Al menos 1 carácter numérico,, +1105,Dex/Components/DexKeyChecker.qml,,1106,At least 1 special character (eg. !@#$%),1107,Mindestens 1 Sonderzeichen (z. B. ! @ # $ %),"Al menos 1 carácter especial (p. ej., !@#$%)",, +1110,Dex/Components/DexKeyChecker.qml,,1111,At least %n character(s),1112,,Al menos %n carácter(es),, +1118,Dex/Components/DexKeyChecker.qml,,1119,Password and Confirm Password have to be same,1120,Kennwort und Kennwortbestätigung müssen identisch sein,Contraseña y Confirmar Contraseña tienen que ser los mismos,, +1126,Dex/Components/DexPaginator.qml,,1127,items per page,1128,Elemente pro Seite,elementos por página,, +1134,Dex/Components/DexRangeSlider.qml,,1135,Min,1136,Min,Min,, +1139,Dex/Components/DexRangeSlider.qml,,1140,Half,1141,Halb,Mitad,, +1144,Dex/Components/DexRangeSlider.qml,,1145,Max,1146,Max,Max,, +1152,Dex/Components/DexSweetComboBox.qml,,1153,Search,1154,Suchen,Buscar,, +1160,Dex/Addressbook/EditContactModal.qml,,1161,Edit contact,1162,Kontakt bearbeiten,Editar contacto,, +1165,Dex/Addressbook/EditContactModal.qml,,1166,Contact name,1167,Kontaktname,Nombre,, +1170,Dex/Addressbook/EditContactModal.qml,,1171,Enter a contact name,1172,Geben Sie einen Kontaktnamen ein,Ingresar un nombre de contacto,, +1175,Dex/Addressbook/EditContactModal.qml,,1176,Address list,1177,Adressliste,Lista de direcciónes,, +1180,Dex/Addressbook/EditContactModal.qml,,1181,Address Book,1182,Adressbuch,Libreta de direcciónes,, +1185,Dex/Addressbook/EditContactModal.qml,,1186,address copied to clipboard,1187,Adresse in die Zwischenablage kopiert,direccion copiada al portapapeles,, +1190,Dex/Addressbook/EditContactModal.qml,,1191,Edit,1192,Bearbeiten,Editar,, +1195,Dex/Addressbook/EditContactModal.qml,,1196,+ Add,1197,+ Hinzufügen,#NAME?,, +1200,Dex/Addressbook/EditContactModal.qml,,1201,Tags,1202,Schlagworte,Etiquetas,, +1205,Dex/Addressbook/EditContactModal.qml,,1206,Add tag,1207,Schlagwort hinzufügen,Agregar etiqueta,, +1210,Dex/Addressbook/EditContactModal.qml,,1211,Close,1212,Schließen,Cerrar,, +1215,Dex/Addressbook/EditContactModal.qml,,1216,Confirm,1217,Bestätigen,Confirmar,, +1223,Dex/Addressbook/EnableAssetModal.qml,,1224,"The selected address belongs to a disabled asset, you need to enabled it before sending.",1225,"Die ausgewählte Adresse gehört zu einem deaktivierten Asset, Sie müssen es vor dem Senden aktivieren.","La dirección seleccionada pertenece a un activo deshabilitado, debe habilitó antes de enviar.",, +1228,Dex/Addressbook/EnableAssetModal.qml,,1229,Enable,1230,Aktivieren,Habilitar,, +1233,Dex/Addressbook/EnableAssetModal.qml,,1234,Cancel,1235,Abbrechen,Cancelar,, +1241,Dex/Wallet/EnableCoinModal.qml,,1242,Enable assets,1243,Assets aktivieren,Habilitar activos,, +1246,Dex/Wallet/EnableCoinModal.qml,,1247,Select all assets,1248,Alle Assets auswählen,Seleccionar todos los activos,, +1251,Dex/Wallet/EnableCoinModal.qml,,1252,All assets are already enabled!,1253,Alle Assets sind bereits aktiviert!,¡Todos los activos ya están habilitados!,, +1256,Dex/Wallet/EnableCoinModal.qml,,1257,You can still enable %1 assets. Selected: %2.,1258,Sie können weiterhin %1 Assets aktivieren. Ausgewählt: %2.,Todavía puede habilitar activos %1. Seleccionado: %2.,, +1261,Dex/Wallet/EnableCoinModal.qml,,1262,Search asset,1263,Asset suchen,Buscar activo,, +1266,Dex/Wallet/EnableCoinModal.qml,,1267,Change assets limit,1268,Asset-Limit ändern,Cambiar el límite de activos,, +1271,Dex/Wallet/EnableCoinModal.qml,,1272,Add a custom asset,1273,Benutzerdefiniertes Asset hinzufügen,Agregar un activo personalizado,, +1276,Dex/Wallet/EnableCoinModal.qml,,1277,Close,1278,Schließen,Cerrar,, +1281,Dex/Wallet/EnableCoinModal.qml,,1282,Enable,1283,Aktivieren,Habilitar,, +1289,Dex/Components/EulaModal.qml,,1290,Disclaimer & Terms of Service,1291,Haftungsausschluss & Nutzungsbedingungen,Descargo de Responsabilidad & Términos de servicio,, +1294,Dex/Components/EulaModal.qml,,1295,Accept EULA,1296,EULA akzeptieren,Aceptar EULA,, +1299,Dex/Components/EulaModal.qml,,1300,Accept Terms and Conditions,1301,Allgemeine Geschäftsbedingungen akzeptieren,Aceptar términos y condiciones,, +1304,Dex/Components/EulaModal.qml,,1305,Close,1306,Schließen,Cerrar,, +1309,Dex/Components/EulaModal.qml,,1310,Cancel,1311,Abbrechen,Cancelar,, +1314,Dex/Components/EulaModal.qml,,1315,Confirm,1316,Bestätigen,Confirmar,, +1322,Dex/Dashboard/FatalErrorModal.qml,,1323,Fatal Error,1324,Schwerwiegender Fehler,Error Fatal,, +1327,Dex/Dashboard/FatalErrorModal.qml,,1328,Connection has been lost. You have been disconnected.,1329,Die Verbindung wurde unterbrochen. Ihre Verbindung wurde getrennt.,Ha perdido la conexión. Has sido desconectado.,, +1332,Dex/Dashboard/FatalErrorModal.qml,,1333,Close,1334,Schließen,Cerrar,, +1340,Dex/Exchange/Trade/Trading/Items/FeeInfo.qml,,1341,Minimum fee,1342,Mindestgebühr,Tarifa mínima,, +1345,Dex/Exchange/Trade/Trading/Items/FeeInfo.qml,,1346,Fees will be calculated,1347,Gebühren werden berechnet,Las tarifas se calcularán,, +1353,Dex/Constants/General.qml,,1354,%n day(s),1355,,%n día(s),, +1361,Dex/Constants/General.qml,day,1362,%nd,1364,,%nd,, +1370,Dex/Constants/General.qml,hours,1371,%nh,1373,,%nh,, +1379,Dex/Constants/General.qml,minutes,1380,%nm,1382,,%nm,, +1388,Dex/Constants/General.qml,seconds,1389,%ns,1391,,%ns,, +1397,Dex/Constants/General.qml,milliseconds,1398,%nms,1400,,%nms,, +1406,Dex/Constants/General.qml,,1407,-,1408,-,-,, +1411,Dex/Constants/General.qml,,1412,<b>Taker tx fee:</b> ,1413,<b>Taker tx Gebühren:</b> ,<b>Taker tx fee:</b>,, +1416,Dex/Constants/General.qml,,1417,<b>Dex tx fee:</b> ,1418,<b>Dex tx Gebühren:</b> ,<b>Dex tx fee:</b>,, +1421,Dex/Constants/General.qml,,1422,<b>Dex fee:</b> ,1423,<b>Dex Gebühren:</b> ,<b>Dex fee:</b>,, +1426,Dex/Constants/General.qml,,1427,<b>Maker tx fee:</b> ,1428,<b>Maker tx Gebühren:</b> ,<b>Maker tx fee:</b>,, +1431,Dex/Constants/General.qml,,1432,%1 %2 %3 (%4),1433,%1 %2 %3 (%4),%1 %2 %3 (%4),, +1436,Dex/Constants/General.qml,,1437,Trading Fee,1438,Handelsgebühr,Tarifa de Intercambio,, +1441,Dex/Constants/General.qml,,1442,Minimum Trading Amount,1443,Mindesthandelsbetrag,Minimo Monto de Intercambio,, +1446,Dex/Constants/General.qml,WALLETNAME,1447,Wallet %1 already exists,1449,Brieftasche %1 existiert bereits,Monedero %1 ya existe,, +1452,Dex/Constants/General.qml,,1453,%1 balance is lower than the fees amount: %2 %3,1454,Das %1 Guthaben ist niedriger als der Gebührenbetrag: %2 %3,El saldo de %1 es inferior al monto de las tarifas: %2 %3,, +1457,Dex/Constants/General.qml,,1458,Tradable (after fees) %1 balance is lower than minimum trade amount,1459,Handelbares %1 Guthaben (nach Gebühren) ist niedriger als der Mindesthandelsbetrag,El saldo de %1 (después de las tarifas) es inferior al monto mínimo de intercambio,, +1462,Dex/Constants/General.qml,,1463,Please fill the price field,1464,Bitte füllen Sie das Preisfeld aus,Por favor complete el campo de precio,, +1467,Dex/Constants/General.qml,,1468,Please fill the volume field,1469,Bitte füllen Sie das Volumenfeld aus,Complete el campo de volumen,, +1473,Dex/Constants/General.qml,,1474,%1 volume is lower than minimum trade amount,1475,%1 Volumen ist niedriger als der minimale Handelsbetrag,El volumen de %1 es inferior al monto mínimo de intercambio,, +1479,Dex/Constants/General.qml,,1480,%1 needs to be enabled in order to use %2,1481,"%1 muss aktiviert werden, um %2 verwenden zu können",%1 debe habilitarse para usar %2,, +1485,Dex/Constants/General.qml,,1486,"%1 balance needs to be funded, a non-zero balance is required to pay the gas of %2 transactions",1487,"Das %1 Guthaben muss finanziert werden, ein Guthaben größer Null ist erforderlich, um das Benzin von %2 Transaktionen zu bezahlen","el saldo de %1 esta en cero, se requiere un saldo minimo para pagar el gas de transacciones de % 2",, +1490,Dex/Constants/General.qml,,1491,Unknown Error,1492,Unbekannter Fehler,Error Desconocido,, +1498,Dex/Exchange/Trade/BestOrder/Header.qml,,1499,You get,1500,Du erhältst,Obtienes,, +1503,Dex/Exchange/Trade/BestOrder/Header.qml,,1504,You send,1505,Sie senden,Envía,, +1508,Dex/Exchange/Trade/BestOrder/Header.qml,,1509,Fiat Price,1510,Fiat Preis,Precio Fiat,, +1513,Dex/Exchange/Trade/BestOrder/Header.qml,,1514,CEX rate,1515,CEX-Kurs,Tasa CEX,, +1518,Dex/Exchange/Trade/OrderBook/Header.qml,,1519,Price,1520,Preis,Precio,, +1523,Dex/Exchange/Trade/OrderBook/Header.qml,,1524,Quantity,1525,Menge,Cantidad,, +1528,Dex/Exchange/Trade/OrderBook/Header.qml,,1529,Total,1530,Gesamt,Total,, +1536,Dex/Screens/Startup/ImportWallet.qml,,1537,Failed to Import the wallet,1538,Fehler beim Importieren der Brieftasche,No se pudo importar la billetera,, +1541,Dex/Screens/Startup/ImportWallet.qml,,1542,Import wallet - Setup,1543,Brieftasche importieren - Einrichtung,Importar billetera - Configurar,, +1546,Dex/Screens/Startup/ImportWallet.qml,,1547,Import wallet - Choose password,1548,Brieftasche importieren - Kennwort wählen,Importar billetera - Elegir contraseña,, +1551,Dex/Screens/Startup/ImportWallet.qml,,1552,Wallet Name,1553,Name der Brieftasche,Nombre de billetera,, +1556,Dex/Screens/Startup/ImportWallet.qml,,1557,Enter seed,1558,Geben Sie den Seed ein,Ingresar semilla,, +1561,Dex/Screens/Startup/ImportWallet.qml,,1562,Your seed is not BIP39 compliant. Try again or select 'Allow custom seed' to continue.,1564,Ihr Seed ist nicht BIP39-konform. Versuchen Sie es erneut oder wählen Sie "benutzerdefinierten Seed erlauben" um fortzufahren,Su semilla no es compatible con BIP39. Vuelva a intentarlo o seleccione 'Permitir semilla personalizada' continuar.,, +1568,Dex/Screens/Startup/ImportWallet.qml,,1569,i understand,1570,Ich verstehe,entiendo,, +1573,Dex/Screens/Startup/ImportWallet.qml,,1574,Ok,1575,Ok,Ok,, +1578,Dex/Screens/Startup/ImportWallet.qml,,1579,Allow custom seed,1580,Benutzerdefinierten Seed zulassen,Permitir semilla personalizada,, +1583,Dex/Screens/Startup/ImportWallet.qml,,1584,<strong>Allow custom seed</strong>,1585,<strong>Benutzerdefinierten Seed zulassen</strong>,<strong>Permitir semilla personalizada</strong>,, +1588,Dex/Screens/Startup/ImportWallet.qml,,1589,"Custom seed phrases might be less secure and easier to crack than a generated BIP39 compliant seed phrase or private key (WIF).<br><br>To confirm you understand the risk and know what you are doing, type <strong>'I understand'</strong> in the box below.",1590,"Benutzerdefinierte Seed-Phrasen sind möglicherweise weniger sicher und leichter zu knacken als eine generierte BIP39-konforme Seed-Phrase oder ein privater Schlüssel (WIF).<br><br>Um zu bestätigen, dass Sie das Risiko verstehen und wissen, was Sie tun, geben Sie <strong>'Ich verstehe'</strong> im Kasten unten.","Las frases semilla personalizadas pueden ser menos seguras y más fáciles de descifrar que una frase semilla o clave privada (WIF) compatible con BIP39.<br><br>Para confirmar que comprende el riesgo y sabe lo que está haciendo, escriba <strong> 'Entiendo'</strong> en el cuadro de abajo.",, +1593,Dex/Screens/Startup/ImportWallet.qml,,1594,I understand,1595,Ich verstehe,Entiendo,, +1598,Dex/Screens/Startup/ImportWallet.qml,,1599,Next,1600,Weiter,Siguiente,, +1603,Dex/Screens/Startup/ImportWallet.qml,,1604,Enter the same password to confirm,1605,Geben Sie zur Bestätigung dasselbe Kennwort ein,Ingrese la misma contraseña para confirmar,, +1608,Dex/Screens/Startup/ImportWallet.qml,,1609,Continue,1610,Fortsetzen,Continuar,, +1616,Dex/Components/LinksRow.qml,,1617,Join our Discord server,1618,Tritt unserem Discord-Server bei,Únase a nuestro servidor de Discord,, +1621,Dex/Components/LinksRow.qml,,1622,Follow us on Twitter,1623,Folge uns auf Twitter,Síganos en Twitter,, +1626,Dex/Components/LinksRow.qml,,1627,Go to Support Guides,1628,Zu den Support-Leitfäden,Ir a Guías de soporte,, +1634,Dex/Exchange/Trade/SimpleView/List.qml,,1635,Funds are recoverable,1636,Geldmittel sind erstattungsfähig,Los fondos son recuperables,, +1639,Dex/Exchange/Trade/BestOrder/List.qml,,1640,Best Orders,1641,Die günstigsten Aufträge,Mejores Ordenes,, +1647,Dex/Exchange/Trade/BestOrder/ListDelegate.qml,,1648,%1 is not enabled - Do you want to enable it to be able to select %2 best orders ?<br><a href='#'>Yes</a> - <a href='#no'>No</a>,1649,"%1 ist nicht aktiviert - Möchten Sie es aktivieren, um die günstigsten Aufträge von %2 auswählen zu können? <br><a href='#'>Ja</a> - <a href='#no'>Nein</a>",%1 no está habilitado. ¿Desea habilitarlo para poder seleccionar las mejores ordenes de %2 ?< br><a href='#'>Sí</a> - <a href='#no'>No</a>,, +1652,Dex/Exchange/Trade/OrderBook/ListDelegate.qml,,1653,This order requires a minimum amount of %1 %2 <br>You don't have enough funds.<br> %3,1654,Für diesen Auftrag ist ein Mindestbetrag von %1 %2 erforderlich. <br>Ihr Guthaben reicht nicht aus.<br> %3,Este pedido requiere una cantidad mínima de %1 %2 <br>No tiene fondos suficientes.<br> %3,, +1660,Dex/Components/LogModal.qml,,1661,Close,1662,Schließen,Cerrar,, +1668,Dex/Screens/Startup/Logging.qml,,1669,"Loading, please wait",1670,"Lädt, bitte warten","Cargando, por favor espere",, +1673,Dex/Screens/Startup/Logging.qml,,1674,Initializing MM2,1675,MM2 initialisieren,Inicializando MM2,, +1678,Dex/Screens/Startup/Logging.qml,,1679,Enabling assets,1680,Assets ermöglichen,Habilitando activos,, +1683,Dex/Screens/Startup/Logging.qml,,1684,Getting ready,1685,Fertig werden,Preparándose,, +1691,Dex/Screens/Startup/Login.qml,,1692,Incorrect Password,1693,Falsches Kennwort,Contraseña incorrecta,, +1696,Dex/Screens/Startup/Login.qml,,1697,Log In,1698,Anmelden,Iniciar sesión,, +1701,Dex/Screens/Startup/Login.qml,,1702,Cancel,1703,Abbrechen,Cancelar,, +1709,Dex/Wallet/Main.qml,,1710,Segwit,1711,Segwit,Segwit,, +1714,Dex/Wallet/Main.qml,,1715,Confirmation,1716,Bestätigung,Confirmación,, +1719,Dex/Wallet/Main.qml,,1720,Do you want to send your %1 funds to %2 wallet first?,1721,Möchten Sie Ihr %1-Guthaben zuerst an die %2-Brieftasche senden?,¿Desea enviar sus fondos de %1 a la billetera %2 primero?,, +1724,Dex/Wallet/Main.qml,,1725,Success,1726,Erfolg,Éxito,, +1729,Dex/Wallet/Main.qml,,1730,"Your transaction is send, may take some time to arrive",1731,"Ihre Transaktion wird gesendet, es kann einige Zeit dauern, bis sie ankommt","Su transacción se envió, puede demorar algún tiempo en llegar",, +1734,Dex/Wallet/Main.qml,,1735,Price,1736,Preis,Precio,, +1739,Dex/Wallet/Main.qml,,1740,Change 24hr,1741,24h Veränderung,Cambio,, +1744,Dex/Wallet/Main.qml,,1745,Porfolio,1746,Portfolio,Cartera,, +1749,Dex/Wallet/Main.qml,,1750,Contract Address,1751,Vertragsadresse,Dirección del Contrato,, +1754,Dex/Wallet/Main.qml,,1755,Send,1756,Senden,Enviar,, +1759,Dex/Wallet/Main.qml,,1760,Enable %1 ?,1761,%1 aktivieren?,¿Habilitar %1?,, +1764,Dex/Wallet/Main.qml,,1765,Yes,1766,Ja,Sí,, +1769,Dex/Wallet/Main.qml,,1770,No,1771,Nein,No,, +1774,Dex/Wallet/Main.qml,,1775,Receive,1776,Empfangen,Recibir,, +1779,Dex/Wallet/Main.qml,,1780,Swap,1781,Tausch,Swap,, +1784,Dex/Wallet/Main.qml,,1785,is wallet only,1786,nur Brieftasche (kein DEX möglich),es solo monedero,, +1789,Dex/Wallet/Main.qml,,1790,Rewards,1791,Belohnungen,Recompensas,, +1794,Dex/Wallet/Main.qml,,1795,Faucet,1796,Faucet,Grifo,, +1801,Dex/Wallet/Main.qml,,1802,Public Key,1803,Öffentlicher Schlüssel,Clave Pública,, +1806,Dex/Wallet/Main.qml,,1807,Copied to Clipboard,1808,In die Zwischenablage kopiert,Copiada en el Portapapeles,, +1811,Dex/Wallet/Main.qml,,1812,Loading market data,1813,Laden von Marktdaten,Cargando datos de mercado,, +1816,Dex/Wallet/Main.qml,,1817,There is no chart data for this ticker yet,1818,Für diesen Ticker liegen noch keine Chartdaten vor,Todavía no hay datos de gráfico para este ticker,, +1821,Dex/Wallet/Main.qml,,1822,Fetching transactions...,1823,Transaktionen werden abgerufen...,Obteniendo transacciones...,, +1826,Dex/Wallet/Main.qml,,1827,No transactions available,1828,Keine Transaktionen verfügbar,No hay transacciones disponibles,, +1831,Dex/Wallet/Main.qml,,1832,Click to view your address on %1 (%2) block explorer,1833,"Klicken Sie hier, um Ihre Adresse im %1 (%2) Block-Explorer anzuzeigen",Haga clic para ver su dirección en %1 (%2) explorador de bloques,, +1836,Dex/Exchange/Trade/SimpleView/Main.qml,,1837,Trade,1838,Handeln,Intercambio,, +1841,Dex/Exchange/ProView/TradingInfo/Main.qml,,1842,Trading Information,1843,Handelsinformationen,Informacion de Intercambio,, +1846,Dex/Exchange/ProView/TradingInfo/Main.qml,,1847,Chart,1848,Chart,Gráfico,, +1852,Dex/Exchange/Trade/SimpleView/Main.qml,,1853,Orders,1854,Aufträge,Ordenes,, +1858,Dex/Exchange/Trade/SimpleView/Main.qml,,1859,History,1860,Historie,Historial,, +1863,Dex/Exchange/ProView/PlaceOrderForm/Main.qml,,1864,Place Order,1865,Auftrag platzieren,Realizar pedido,, +1868,Dex/Exchange/ProView/PlaceOrderForm/Main.qml,,1869,Order Selected,1870,Auftrag ausgewählt,Pedido seleccionado,, +1873,Dex/Exchange/ProView/PlaceOrderForm/Main.qml,,1874,START SWAP,1875,TAUSCH STARTEN,INICIO INTERCAMBIAR,, +1879,Dex/Addressbook/Main.qml,,1880,Address Book,1881,Adressbuch,Libreta de direcciones,, +1884,Dex/Addressbook/Main.qml,,1885,Search contact,1886,Kontakt suchen,Buscar contacto,, +1889,Dex/Addressbook/Main.qml,,1890,+ NEW CONTACT,1891,+ Neuer Kontakt,Nuevo contacto,, +1894,Dex/Addressbook/Main.qml,,1895,Name,1896,Name,Nombre,, +1899,Dex/Addressbook/Main.qml,,1900,Tags,1901,Schlagwörter,Etiquetas,, +1904,Dex/Addressbook/Main.qml,,1905,Edit,1906,Bearbeiten,Editar,, +1909,Dex/Addressbook/Main.qml,,1910,Delete,1911,Löschen,Eliminar,, +1914,Dex/Addressbook/Main.qml,,1915,address copied to clipboard,1916,Adresse in die Zwischenablage kopiert,dirección copiada al portapapeles,, +1919,Dex/Addressbook/Main.qml,,1920,This contact does not have any registered address.,1921,Dieser Kontakt hat keine registrierte Adresse.,Este contacto no tiene ninguna dirección registrada.,, +1927,Dex/Exchange/ProView/PlaceOrderForm/MarketModeSelector.qml,TICKER,1928,Sell %1,1930,%1 Verkaufen,Vender %1,, +1933,Dex/Exchange/ProView/PlaceOrderForm/MarketModeSelector.qml,TICKER,1934,Buy %1,1936,%1 Kaufen,Comprar %1,, +1942,Dex/Components/MinTradeModal.qml,,1943,Minimum Trading Amount,1944,Mindesthandelsbetrag,Cantidad Mínima de Intercambio,, +1947,Dex/Components/MinTradeModal.qml,,1948,the minimum amount of %1 coin available for the order; the min_volume must be greater than or equal to %2; it must be also less or equal than volume param; default is %3,1949,"die Mindestmenge von %1 Coin, die für die Bestellung verfügbar ist; das min_volume muss größer oder gleich %2 sein; es muss auch kleiner oder gleich als volume param sein; Standard ist %3",la cantidad mínima de la moneda %1 disponible para la orden; el min_volume debe ser mayor o igual a %2; debe ser también menor o igual que volumen param; el valor predeterminado es %3,, +1955,Dex/Exchange/Trade/MultiOrder.qml,TICKER,1956,%1 price is zero!,1958,%1 Preis ist null!,el precio de %1 es cero!,, +1961,Dex/Exchange/Trade/MultiOrder.qml,TICKER,1962,%1 receive volume is lower than minimum trade amount,1964,%1 Empfangsvolumen ist niedriger als der Mindesthandelsbetrag,volumen de recepción de %1 es inferior al monto mínimo de transacción,, +1967,Dex/Exchange/Trade/MultiOrder.qml,,1968,Error:,1969,Fehler:,Error:,, +1972,Dex/Exchange/Trade/MultiOrder.qml,AMOUNT TICKER,1973,You'll receive %1,1975,Sie erhalten %1,Tu'll recibes %1,, +1978,Dex/Exchange/Trade/MultiOrder.qml,,1979,Price,1980,Preis,Precio,, +1986,Dex/Addressbook/NewContactPopup.qml,,1987,Contact name,1988,Kontaktname,Nombre,, +1991,Dex/Addressbook/NewContactPopup.qml,,1992,This contact name already exists.,1993,Dieser Kontaktname existiert bereits.,Este nombre de contacto ya existe.,, +1996,Dex/Addressbook/NewContactPopup.qml,,1997,+ ADD,1998,+ HINZUFÜGEN,#NAME?,, +2006,Dex/NewUpdateModal.qml,,2007,Searching new updates,2008,Suche nach neuen Updates,Buscando nuevas actualizaciones,, +2011,Dex/NewUpdateModal.qml,,2012,Fetching...,2013,Abrufen…,Buscando...,, +2019,Dex/NewUpdateModal.qml,,2020,Close,2021,Schließen,Cerrar,, +2024,Dex/NewUpdateModal.qml,,2025,Could not check new updates for the following reason: %1,2027,Neue Updates konnten aus folgendem Grund nicht überprüft werden: %1,No se pudieron comprobar nuevas actualizaciones por el siguiente motivo: %1,, +2030,Dex/NewUpdateModal.qml,,2031,New version found,2032,Neue Version gefunden,Nueva versión encontrada,, +2035,Dex/NewUpdateModal.qml,,2036,Mandatory version found,2037,Zwingend notwendige Version gefunden,Versión obligatoria encontrada,, +2040,Dex/NewUpdateModal.qml,,2041,%1 %2 is available !,2042,%1 %2 ist verfügbar !,%1 ¡%2 está disponible!,, +2045,Dex/NewUpdateModal.qml,,2046,This update is mandatory to continue using the application,2047,"Dieses Update ist zwingend erforderlich, um die Anwendung weiterhin verwenden zu können",Esta actualización es obligatoria para seguir usando la aplicación,, +2050,Dex/NewUpdateModal.qml,,2051,Close Dex,2052,Dex schließen,Cerrar Dex,, +2055,Dex/NewUpdateModal.qml,,2056,Your application is updated.,2057,Ihre Anwendung ist auf dem neuesten Stand.,Tu aplicación está actualizada.,, +2060,Dex/NewUpdateModal.qml,,2061,Download,2062,Herunterladen,Descargar,, +2068,Dex/Screens/Startup/NewWallet.qml,,2069,"Wrong word, please check again",2070,"Falsches Wort, bitte überprüfen Sie es erneut","Palabra incorrecta, verifique nuevamente",, +2073,Dex/Screens/Startup/NewWallet.qml,,2074,st,2075,.,st,, +2078,Dex/Screens/Startup/NewWallet.qml,,2079,nd,2080,.,nd,, +2083,Dex/Screens/Startup/NewWallet.qml,,2084,rd,2085,.,rd,, +2088,Dex/Screens/Startup/NewWallet.qml,,2089,th,2090,.,th,, +2093,Dex/Screens/Startup/NewWallet.qml,,2094,Failed to create a wallet,2095,Anlegen einer Brieftasche ist fehlgeschlagen,No se pudo crear una billetera,, +2098,Dex/Screens/Startup/NewWallet.qml,,2099,New Wallet,2100,Neue Brieftasche,Nueva billetera,, +2103,Dex/Screens/Startup/NewWallet.qml,,2104,Confirm Seed,2105,Seed bestätigen,Confirmar semilla,, +2108,Dex/Screens/Startup/NewWallet.qml,,2109,Choose Password,2110,Wählen sie ein Kennwort,Elegir contraseña,, +2113,Dex/Screens/Startup/NewWallet.qml,,2114,Important: Back up your seed phrase before proceeding!,2115,"Wichtig: Sichern Sie Ihre Seed-Phrase, bevor Sie fortfahren!",Importante: ¡Haga una copia de seguridad de su frase semilla antes de continuar!,, +2118,Dex/Screens/Startup/NewWallet.qml,,2119,We recommend storing it offline.,2120,"Wir empfehlen, sie offline zu speichern.",Recomendamos almacenarlo fuera de línea.,, +2123,Dex/Screens/Startup/NewWallet.qml,,2124,Generated Seed,2125,Generierter Seed,Semilla Generada,, +2128,Dex/Screens/Startup/NewWallet.qml,,2129,Seed phrase,2130,Seed Phrase,Frase semilla,, +2133,Dex/Screens/Startup/NewWallet.qml,,2134,copied to clipboard,2135,In die Zwischenablage kopiert,copiada al portapapeles,, +2138,Dex/Screens/Startup/NewWallet.qml,,2139,Next,2140,Weiter,Siguiente,, +2143,Dex/Screens/Startup/NewWallet.qml,,2144,Let's double check your seed phrase,2145,Lassen Sie uns Ihre Seed-Phrase noch einmal überprüfen,Verifiquemos dos veces su frase semilla,, +2148,Dex/Screens/Startup/NewWallet.qml,,2149,Your seed phrase is important - that's why we like to make sure it's correct. We'll ask you three different questions about your seed phrase to make sure you'll be able to easily restore your wallet whenever you want.,2150,"Ihre Seed-Phrase ist wichtig – deshalb stellen wir gerne sicher, dass sie korrekt ist. Wir stellen Ihnen drei verschiedene Fragen zu Ihrer Seed-Phrase, um sicherzustellen, dass Sie Ihre Wallet jederzeit problemlos wiederherstellen können.","Su frase semilla es importante, por eso nos gusta asegurarnos de que sea correcta. Le haremos tres preguntas diferentes sobre su frase semilla para asegurarnos de que podrá restaurar fácilmente su billetera cuando lo desee.",, +2153,Dex/Screens/Startup/NewWallet.qml,,2154,Enter the ,2155,Geben Sie das,Ingresa la,, +2158,Dex/Screens/Startup/NewWallet.qml,,2159,word,2160,Wort ein,palabra,, +2163,Dex/Screens/Startup/NewWallet.qml,,2164,Check,2165,Prüfen,Verificar,, +2168,Dex/Screens/Startup/NewWallet.qml,,2169,Enter the same password to confirm,2170,Geben Sie zur Bestätigung dasselbe Kennwort ein,Ingresa la misma contraseña para confirmar,, +2173,Dex/Screens/Startup/NewWallet.qml,,2174,Continue,2175,Fortsetzen,Continuar,, +2181,Dex/NoConnection.qml,,2182,No connection,2183,Keine Verbindung,Sin conexión,, +2186,Dex/NoConnection.qml,,2187,Please make sure you are connected to the internet,2188,"Bitte stellen Sie sicher, dass Sie mit dem Internet verbunden sind",Asegúrate de que estás conectado a Internet,, +2191,Dex/NoConnection.qml,,2192,Will automatically retry in %1 seconds,2193,Wird in %1 Sekunde(n) automatisch erneut versucht,Intentará de nuevo automáticamente en %1 segundos,, +2196,Dex/NoConnection.qml,,2197,Retry,2198,Wiederholen,Reintentar,, +2204,Dex/Dashboard/NotificationsModal.qml,,2205,Matching,2206,"Zusammenführung",Emparejando,, +2209,Dex/Dashboard/NotificationsModal.qml,,2210,Order Matching,2211,Auftrag wird abgeglichen,Emparejando Orden,, +2214,Dex/Dashboard/NotificationsModal.qml,,2215,Matched,2216,Abgestimmt,Emparejado,, +2219,Dex/Dashboard/NotificationsModal.qml,,2220,Order Matched,2221,Auftrag wurde abgestimmt,Orden Emparejada,, +2224,Dex/Dashboard/NotificationsModal.qml,,2225,Ongoing,2226,"Läuft",En Curso,, +2229,Dex/Dashboard/NotificationsModal.qml,,2230,Swap Ongoing,2231,Austausch läuft,Intercambio En Curso,, +2234,Dex/Dashboard/NotificationsModal.qml,,2235,Successful,2236,Erfolgreich,Exitoso,, +2239,Dex/Dashboard/NotificationsModal.qml,,2240,Swap Successful,2241,Tausch erfolgreich,Intercambio exitoso,, +2244,Dex/Dashboard/NotificationsModal.qml,,2245,Refunding,2246,Rückzahlung,Reembolso,, +2249,Dex/Dashboard/NotificationsModal.qml,,2250,Failed,2251,Fehlgeschlagen,Fallo,, +2254,Dex/Dashboard/NotificationsModal.qml,,2255,Swap Failed,2256,Tausch fehlgeschlagen,Intercambio fallido,, +2259,Dex/Dashboard/NotificationsModal.qml,,2260,Unknown,2261,Unbekannt,Desconocido,, +2264,Dex/Dashboard/NotificationsModal.qml,,2265,Unknown State,2266,Unbekannter Status,Estado Desconocido,, +2269,Dex/Dashboard/NotificationsModal.qml,,2270,Swap status updated,2271,Austausch-Status aktualisiert,Estado de Intercambio Actualizado,, +2274,Dex/Dashboard/NotificationsModal.qml,,2275,You sent %1,2276,Sie %1 haben gesendet,Enviaste %1,, +2279,Dex/Dashboard/NotificationsModal.qml,,2280,You received %1,2281,Sie %1 haben erhalten,Recibiste %1,, +2284,Dex/Dashboard/NotificationsModal.qml,,2285,Your wallet balance changed,2286,Ihr Guthaben hat sich geändert,El saldo de tu billetera cambió,, +2289,Dex/Dashboard/NotificationsModal.qml,,2290,Please check your internet connection (e.g. VPN service or firewall might block it).,2291,Bitte überprüfen Sie Ihre Internetverbindung (z. B. könnte VPN-Dienst oder Firewall sie blockieren).,"Verifica tu conexión a Internet (por ejemplo, el servicio VPN o el firewall pueden bloquearlo).",, +2294,Dex/Dashboard/NotificationsModal.qml,TICKER,2295,Failed to enable %1,2297,Aktivierung von %1 fehlgeschlagen,No se pudo habilitar %1,, +2300,Dex/Dashboard/NotificationsModal.qml,,2301,Endpoint not reachable,2302,Endpunkt nicht erreichbar,Punto final no accesible,, +2305,Dex/Dashboard/NotificationsModal.qml,,2306,Could not reach to endpoint,2307,Endpunkt konnte nicht erreicht werden,No se pudo llegar al punto final,, +2310,Dex/Dashboard/NotificationsModal.qml,TICKER,2311,Mismatch at %1 custom asset configuration,2313,Nichtübereinstimmung bei benutzerdefinierter Konfiguration des %1 Asset,Falta de emparejamiento en %1 configuración de recurso personalizado,, +2316,Dex/Dashboard/NotificationsModal.qml,TICKER,2317,Application needs to be restarted for %1 custom asset.,2319,Die Anwendung muss für benutzerdefiniertes Asset %1 neu gestartet werden.,Es necesario reiniciar la aplicación para %1 recurso personalizado.,, +2322,Dex/Dashboard/NotificationsModal.qml,,2323,Batch %1 failed. Reason: %2,2324,Batch %1 fehlgeschlagen. Grund: %2,El lote %1 falló. Razón: %2,, +2327,Dex/Dashboard/NotificationsModal.qml,,2328,Show,2329,Zeigen,Mostrar,, +2332,Dex/Dashboard/NotificationsModal.qml,,2333,Restart,2334,Neustart,Reiniciar,, +2337,Dex/Dashboard/NotificationsModal.qml,,2338,Quit,2339,Beenden,Salir,, +2342,Dex/Dashboard/NotificationsModal.qml,,2343,Notifications,2344,Benachrichtigungen,Notificaciones,, +2347,Dex/Dashboard/NotificationsModal.qml,,2348,There aren't any notifications,2349,Es gibt keine Benachrichtigungen,No hay ' notificaciones,, +2352,Dex/Dashboard/NotificationsModal.qml,,2353,Mark all as read,2354,Alle als gelesen makieren,Marcar todo como leído,, +2360,Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml,,2361,Price,2362,Preis,Precio,, +2365,Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml,,2366,Volume,2367,Volumen,Volumen,, +2370,Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml,,2371,Amount to sell,2372,Zu verkaufender Betrag,Importe para vender,, +2375,Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml,,2376,Amount to receive,2377,Zu erhaltender Betrag,Importe para recibir,, +2380,Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml,,2381,Min Volume,2382,Min Volumen,Volumen Mínimo,, +2385,Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml,,2386,Min amount to sell,2387,Min Verkaufsmenge,Cantidad mínima para vender,, +2390,Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml,,2391,Min amount to receive,2392,Min zu erhaltende Menge,Cantidad mínimo para recibir,, +2395,Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml,,2396,Min volume: ,2397,Mindestvolumen:,Volumen mínimo:,, +2400,Dex/Exchange/ProView/PlaceOrderForm/OrderForm.qml,,2401,Use custom minimum trade amount,2402,Benutzerdefinierten Mindesthandelsbetrag verwenden,Utilizar una cantidad personalizada de intercambio mínima,, +2408,Dex/Exchange/ProView/TradingInfo/OrderLine.qml,,2409,Funds are recoverable,2410,Geldmittel sind erstattungsfähig,Los fondos son recuperables,, +2416,Dex/Exchange/ProView/TradingInfo/OrderList.qml,,2417,No results found,2418,Keine Ergebnisse gefunden,No se han encontrado resultados,, +2424,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2425,Swap Details,2426,Tauschdetails,Detalles de Intercambio,, +2429,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2430,Order Details,2431,Auftragsdetails,Detalles de Orden,, +2434,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2435,Order Type,2436,Auftragsart,Tipo de Orden,, +2439,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2440,Maker Order,2441,Maker-Auftrag,Orden de Maker,, +2444,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2445,Taker Order,2446,Taker-Auftrag,Orden de Taker,, +2449,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2450,Refund State,2451,Rückerstattungsstatus,Estado del Reembolso,, +2454,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2455,Your swap failed but the auto-refund process for your payment started already. Please wait and keep application opened until you receive your payment back,2456,"Ihr Umtausch ist fehlgeschlagen, aber der automatische Rückerstattungsprozess für Ihre Zahlung hat bereits begonnen. Bitte warten Sie und lassen Sie die Anwendung geöffnet, bis Sie Ihre Zahlung zurückerhalten","Su intercambio falló, pero el proceso de reembolso automático para su pago ya comenzó. Espere y mantenga la aplicación abierta hasta que reciba su pago",, +2459,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2460,Date,2461,Datum,Fecha,, +2464,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2465,Error ID,2466,Fehler-ID,ID de Error,, +2470,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2471,Error Log,2472,Fehlerprotokoll,Registro de Error,, +2475,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2476,Close,2477,Schließen,Cerrar,, +2480,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2481,Cancel Order,2482,Auftrag Abbrechen,Cancelar Pedido,, +2486,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2487,Swap ID,2488,Swap ID,ID de Intercambio,, +2491,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2492,Maker Payment Sent Transaction ID,2493,Maker-Zahlung gesendet: Transaktions-ID,ID de la transacción pago enviada de Maker,, +2496,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2497,Maker Payment Spent Transaction ID,2498,Maker-Zahlung ausgegeben: Transaktions-ID,ID de la transacción pago gastado de Maker,, +2501,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2502,Maker Payment TXID,2503,Maker-Zahlung: TXID,TXID del pago de Maker,, +2506,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2507,Taker Payment Spent Transaction ID,2508,Taker-Zahlung ausgegeben: Transaktions-ID,ID de la transacción pago gastado de Taker,, +2511,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2512,Taker Payment Sent Transaction ID,2513,Taker-Zahlung gesendet: Transaktions-ID,ID de la transacción pago enviada de Taker,, +2516,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2517,Taker Payment TXID,2518,Taker-Zahlung: TXID,TXID del pago de Taker,, +2521,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2522,Recover Funds,2523,Rückerstattung der Geldmittel,Recuperar fondos,, +2526,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2527,Refunding...,2528,Rückzahlung…,Reembolso...,, +2531,Dex/Exchange/ProView/TradingInfo/OrderModal.qml,,2532,View on Explorer,2533,Ansicht im Explorer,Ver en Explorer,, +2539,Dex/Exchange/Trade/SimpleView/OrderRemovedModal.qml,,2540,Selected Order Removed,2541,Ausgewählten Auftrag entfernt,Pedido Seleccionado Eliminado,, +2544,Dex/Exchange/Trade/SimpleView/OrderRemovedModal.qml,,2545,"The selected order does not exist anymore, it might have been matched or canceled, and no order with a better price is available.",2547,Der ausgewählte Auftrag existiert nicht mehr! Er wurde möglicherweise zugeordnet oder storniert und es ist kein Auftrag mit einem besseren Preis verfügbar.,"El pedido seleccionado ya no existe, es posible que haya sido igualado o cancelado, y no hay ningún pedido disponible con un mejor precio.",, +2544,Dex/Exchange/Trade/SimpleView/OrderRemovedModal.qml,,2545,Please select a new order.,2548,Bitte wählen Sie einen neuen Auftrag aus.,Seleccione un nuevo pedido.,, +2551,Dex/Exchange/Trade/SimpleView/OrderRemovedModal.qml,,2552,OK,2553,OK,Aceptar,, +2560,Dex/Exchange/ProView/TradingInfo/OrdersPage.qml,,2561,Filter,2562,Filter,Filtrar,, +2565,Dex/Exchange/ProView/TradingInfo/OrdersPage.qml,,2566,Date,2567,Datum,Fecha,, +2570,Dex/Exchange/ProView/TradingInfo/OrdersPage.qml,,2571,Export CSV,2572,CSV exportieren,Exportar CSV,, +2575,Dex/Exchange/ProView/TradingInfo/OrdersPage.qml,,2576,Apply Filter,2577,Filter anwenden,Aplicar Filtro,, +2580,Dex/Exchange/ProView/TradingInfo/OrdersPage.qml,,2581,Cancel All,2582,Alles stornieren,Cancelar Todo,, +2585,Dex/Exchange/ProView/TradingInfo/OrdersPage.qml,,2586,From,2587,Von,De,, +2590,Dex/Exchange/ProView/TradingInfo/OrdersPage.qml,,2591,To,2592,Bis,A,, +2595,Dex/Exchange/ProView/TradingInfo/OrdersPage.qml,,2596,Please choose the CSV export name and location,2597,Bitte wählen Sie den CSV-Exportnamen und den Speicherort aus,Elija el nombre y la ubicación de exportación CSV,, +2603,Dex/Components/Pagination.qml,,2604,items per page,2605,Elemente pro Seite,elementos por página,, +2611,Dex/Components/PasswordField.qml,,2612,Password,2613,Kennwort,Contraseña,, +2616,Dex/Components/PasswordField.qml,,2617,Enter your wallet password,2618,Geben Sie das Kennwort für ihre Brieftasche ein,Ingrese la contraseña de su billetera,, +2621,Dex/Components/PasswordField.qml,,2622,At least 1 lowercase alphabetical character,2623,Mindestens 1 Kleinbuchstabe,Al menos 1 carácter alfabético en minúsculas,, +2626,Dex/Components/PasswordField.qml,,2627,At least 1 uppercase alphabetical character,2628,Mindestens 1 Großbuchstabe,Al menos 1 carácter alfabético en mayúsculas,, +2631,Dex/Components/PasswordField.qml,,2632,At least 1 numeric character,2633,Mindestens 1 Ziffer,Al menos 1 carácter numérico,, +2636,Dex/Components/PasswordField.qml,,2637,At least 1 special character (eg. !@#$%),2638,Mindestens 1 Sonderzeichen (z. B. ! @ # $ %),"Al menos 1 carácter especial ( ej., !@#$%)",, +2641,Dex/Components/PasswordField.qml,,2642,At least %n character(s),2643,,Al menos %n carácter(es),, +2652,Dex/Components/PasswordForm.qml,,2653,Password,2654,Kennwort,Contraseña,, +2657,Dex/Components/PasswordForm.qml,,2658,Confirm Password,2659,Kennwort bestätigen,Confirmar contraseña,, +2662,Dex/Components/PasswordForm.qml,,2663,Enter the same password to confirm,2664,Geben Sie zur Bestätigung dasselbe Kennwort ein,Ingrese la misma contraseña para confirmar,, +2670,Dex/Portfolio/Portfolio.qml,,2671,ADD ASSET,2672,ASSET HINZUFÜGEN,AGREGAR ACTIVO,, +2675,Dex/Portfolio/Portfolio.qml,,2676,Search asset,2677,Asset suchen,Buscar activo,, +2680,Dex/Portfolio/Portfolio.qml,,2681,Show only coins with balance,2682,Nur Coins mit Guthaben anzeigen,Mostrar solo monedas con saldo,, +2685,Dex/Portfolio/Portfolio.qml,,2686,(%1/%2),2687,(%1/%2),(%1/%2),, +2690,Dex/Portfolio/Portfolio.qml,,2691,Portfolio,2692,Portfolio,Cartera,, +2698,Dex/Exchange/ProView/TradingInfo/PriceLine.qml,,2699,Set swap price for evaluation,2700,Legen Sie den Tausch-Preis für die Bewertung fest,Establecer precio de intercambio para evaluación,, +2703,Dex/Exchange/ProView/TradingInfo/PriceLine.qml,,2704,Exchange rate,2705,Wechselkurs,Tipo de cambio,, +2708,Dex/Exchange/ProView/TradingInfo/PriceLine.qml,,2709,Selected,2710,Ausgewählt,seleccionado,, +2713,Dex/Exchange/ProView/TradingInfo/PriceLine.qml,,2714,Expensive,2715,Teuer,Expensive,, +2718,Dex/Exchange/ProView/TradingInfo/PriceLine.qml,,2719,Expedient,2720,Sinnvoll,Expedient,, +2723,Dex/Exchange/ProView/TradingInfo/PriceLine.qml,PRICE_DIFF%,2724,%1 compared to CEX,2726,%1 im Vergleich zu CEX,%1 en comparación con CEX,, +2729,Dex/Exchange/ProView/TradingInfo/PriceLine.qml,,2730,CEXchange rate,2731,CEX-Wechselkurs,Tasa de cambio CEX,, +2737,Dex/Exchange/Trade/PriceLineSimplified.qml,,2738,Exchange rate,2739,Wechselkurs,Tasa de cambio,, +2742,Dex/Exchange/Trade/PriceLineSimplified.qml,,2743,Selected,2744,Ausgewählt,Seleccionada,, +2747,Dex/Exchange/Trade/PriceLineSimplified.qml,,2748,CEXchange rate,2749,CEX-Wechselkurs,Tasa de cambio CEX,, +2752,Dex/Exchange/Trade/PriceLineSimplified.qml,,2753,Expensive,2754,Teuer,Caro,, +2757,Dex/Exchange/Trade/PriceLineSimplified.qml,,2758,Expedient,2759,Sinnvoll,Expediente,, +2762,Dex/Exchange/Trade/PriceLineSimplified.qml,PRICE_DIFF%,2763,%1 compared to CEX,2765,%1 im Vergleich zu CEX,%1 en comparación con CEX,, +2771,Dex/Exchange/Trade/ProView.qml,,2772,Failed to place the order,2773,Der Auftrag konnte nicht platziert werden,No se pudo realizar la orden,, +2776,Dex/Exchange/Trade/ProView.qml,,2777,Placed the order,2778,Auftrag platziert,Orden emitida,, +2784,../src/core/atomicdex/services/update/update.checker.service.cpp,,2785,Cannot reach the endpoint: ,2786,Der Endpunkt kann nicht erreicht werden:,No se puede llegar al punto final:,, +2792,Dex/Wallet/ReceiveModal.qml,,2793,Receive,2794,Empfangen,Recibir,, +2797,Dex/Wallet/ReceiveModal.qml,TICKER,2798,Only send %1 to this address:,2800,Sende nur %1 an diese Adresse:,Enviar solo %1 a esta dirección:,, +2803,Dex/Wallet/ReceiveModal.qml,,2804,copied to clipboard.,2805,In die Zwischenablage kopiert,copiado al portapapeles.,, +2808,Dex/Wallet/ReceiveModal.qml,,2809,Close,2810,Schließen,Cerrar,, +2817,Dex/Settings/RecoverSeedModal.qml,,2818,View seed and private keys,2819,Seed- und privaten Schlüsseln anzeigen,Ver semilla y claves privadas,, +2822,Dex/Settings/RecoverSeedModal.qml,,2823,Please enter your password to view the seed.,2824,"Bitte geben Sie Ihr Kennwort ein, um den Seed anzuzeigen.",Por favor ingrese su contraseña para ver la semilla.,, +2827,Dex/Settings/RecoverSeedModal.qml,,2828,Seed,2829,Seed,Semilla,, +2832,Dex/Settings/RecoverSeedModal.qml,,2833,Backup Seed,2834,Seed Sicherung,Copia de seguridad de semilla,, +2837,Dex/Settings/RecoverSeedModal.qml,,2838,Public Address copied to clipboard,2839,Öffentliche Adresse in die Zwischenablage kopiert,Direccion publica copiada en el portapapeles,, +2842,Dex/Settings/RecoverSeedModal.qml,,2843,Cancel,2844,Abbrechen,Cancelar,, +2847,Dex/Settings/RecoverSeedModal.qml,,2848,View,2849,Ansehen,Ver,, +2853,Dex/Settings/RecoverSeedModal.qml,,2854,copied to clipboard,2855,In die Zwischenablage kopiert,copiada en el portapapeles,, +2859,Dex/Settings/RecoverSeedModal.qml,,2860,RPC Password,2861,RPC Kennwort,Contraseña RPC,, +2864,Dex/Settings/RecoverSeedModal.qml,,2865,Search a coin.,2866,Coin suchen.,Buscar una moneda.,, +2869,Dex/Settings/RecoverSeedModal.qml,,2870,Public Address,2871,Öffentliche Adresse,Dirección Pública,, +2874,Dex/Settings/RecoverSeedModal.qml,,2875,Private Key copied to clipboard,2876,Privater Schlüssel in die Zwischenablage kopiert,Clave Privada copiada en el portapapeles,, +2879,Dex/Settings/RecoverSeedModal.qml,,2880,Private Key,2881,Privater Schlüssel,Clave Privada,, +2887,Dex/Addressbook/RemoveContactPopup.qml,,2888,Do you want to remove this contact ?,2889,Möchten Sie diesen Kontakt entfernen?,¿Desea eliminar este contacto?,, +2892,Dex/Addressbook/RemoveContactPopup.qml,,2893,Yes,2894,Ja,Sí,, +2897,Dex/Addressbook/RemoveContactPopup.qml,,2898,No,2899,Nein,No,, +2905,Dex/Components/RestartModal.qml,,2906,Applying the changes...,2907,Übernehmen der Änderungen...,Aplicando los cambios...,, +2910,Dex/Components/RestartModal.qml,,2911,Restarting the application. %1,2912,Neustart der Anwendung. %1,Reiniciando la aplicación. %1,, +2915,Dex/Components/RestartModal.qml,,2916,Restarting the application...,2917,Neustart der Anwendung...,Reiniciando la aplicación...,, +2923,Dex/Components/RightClickMenu.qml,,2924,Cut,2925,Ausschneiden,Cortar,, +2928,Dex/Components/RightClickMenu.qml,,2929,Copy,2930,Kopieren,Copiar,, +2933,Dex/Components/RightClickMenu.qml,,2934,Paste,2935,Einfügen,Pegar,, +2941,Dex/Components/SearchField.qml,,2942,Search,2943,Suchen,Buscar,, +2949,Dex/Wallet/SendModal.qml,,2950,Failed to send,2951,Fehler beim Senden,Error al enviar,, +2954,Dex/Wallet/SendModal.qml,,2955,Failed to Send,2956,Fehler beim Senden,Error al enviar,, +2959,Dex/Wallet/SendModal.qml,,2960,Prepare to send ,2961,Versandvorbereitung von ,Preparar para enviar,, +2964,Dex/Wallet/SendModal.qml,,2965,Address of the recipient,2966,Adresse des Empfängers,Dirección del destinatario,, +2969,Dex/Wallet/SendModal.qml,,2970,Amount to send,2971,Zu sendender Betrag,Cantidad a enviar,, +2974,Dex/Wallet/SendModal.qml,,2975,Gas price,2976,Gas Preis,Precio del gas,, +2979,Dex/Wallet/SendModal.qml,,2980,Recipient's address,2981,Empfängeradresse,Direccion's recipiente,, +2984,Dex/Wallet/SendModal.qml,,2985,The address has to be mixed case.,2986,Die Adresse muss Groß-/Kleinschreibung sein.,La dirección debe estar en mayúsculas y minúsculas.,, +2989,Dex/Wallet/SendModal.qml,,2990,Fix,2991,Korrigieren,Arreglar,, +2994,Dex/Wallet/SendModal.qml,,2995,MAX,2996,MAX,MAX,, +2999,Dex/Wallet/SendModal.qml,,3000,Fiat amount: Unavailable,3001,Fiat-Betrag: Nicht verfügbar,Cantidad en Fiat: No disponible,, +3004,Dex/Wallet/SendModal.qml,,3005,Fiat amount: %1,3006,Fiat-Betrag: %1,Cantidad de Fiat: %1,, +3009,Dex/Wallet/SendModal.qml,,3010,%1 amount: %2,3011,%1 Betrag: %2,Cantidad de %1: %2,, +3014,Dex/Wallet/SendModal.qml,,3015,Specify in Fiat,3016,In Fiat angeben,Especificar en Fiat,, +3019,Dex/Wallet/SendModal.qml,,3020,Specify in Crypto,3021,In Krypto angeben,Especificar en Crypto,, +3024,Dex/Wallet/SendModal.qml,,3025,Enable Custom Fees,3026,Benutzerdefinierte Gebühren,Habilitar Tarifas Personalizadas,, +3029,Dex/Wallet/SendModal.qml,,3030,Only use custom fees if you know what you are doing!,3031,"Benutzerdefinierte Gebühren nur verwenden, wenn Sie wissen, was Sie tun!",¡Solo use tarifas personalizadas si sabe lo que está haciendo!,, +3034,Dex/Wallet/SendModal.qml,,3035,Enter the custom fee,3036,Geben Sie die benutzerdefinierte Gebühr ein,Ingrese la tarifa personalizada,, +3039,Dex/Wallet/SendModal.qml,,3040,Gas Limit,3041,Gas Limit,Límite de gas,, +3044,Dex/Wallet/SendModal.qml,,3045,Custom Fee can't be higher than the amount,3046,Die benutzerdefinierten Gebühren dürfen nicht höher sein als der Betrag,Tarifa personalizada no puede ser mayor que la cantidad,, +3049,Dex/Wallet/SendModal.qml,,3050,Not enough funds.,3051,Nicht genug Geldmittel.,No hay suficientes fondos.,, +3055,Dex/Wallet/SendModal.qml,AMT TICKER,3056,You have %1,3058,Sie haben %1,Tiene %1,, +3061,Dex/Wallet/SendModal.qml,,3062,Close,3063,Schließen,Cerrar,, +3066,Dex/Wallet/SendModal.qml,,3067,Prepare,3068,Vorbereiten,Preparar,, +3072,Dex/Wallet/SendModal.qml,,3073,Send,3074,Senden,Enviar,, +3077,Dex/Wallet/SendModal.qml,,3078,Amount,3079,Menge,Cantidad,, +3082,Dex/Wallet/SendModal.qml,,3083,Fees,3084,Gebühren,Tarifas,, +3087,Dex/Wallet/SendModal.qml,,3088,Date,3089,Datum,Fecha,, +3092,Dex/Wallet/SendModal.qml,,3093,Back,3094,Zurück,Atrás,, +3100,Dex/Wallet/SendModalContactList.qml,,3101,Select a contact with an %1 address,3102,Wählen Sie einen Kontakt mit einer %1-Adresse aus,Seleccione un contacto con %1 dirección,, +3105,Dex/Wallet/SendModalContactList.qml,,3106,Search for contacts...,3107,Kontakte suchen...,Buscar contactos...,, +3110,Dex/Wallet/SendModalContactList.qml,,3111,%1 addresses,3112,%1 Adressen,direcciones %1,, +3115,Dex/Wallet/SendModalContactList.qml,,3116,1 address,3117,1 Adresse,1 dirección,, +3121,Dex/Wallet/SendModalContactList.qml,,3122,Back,3123,Zurück,Atrás,, +3126,Dex/Wallet/SendModalContactList.qml,,3127,Choose an %1 address of %2,3128,Wählen Sie eine %1-Adresse von %2,Elija una direccion %1 de %2,, +3131,Dex/Wallet/SendModalContactList.qml,,3132,Name,3133,Name,Nombre,, +3136,Dex/Wallet/SendModalContactList.qml,,3137,Address,3138,Adresse,Dirección,, +3144,Dex/Wallet/SendResult.qml,,3145,Transaction Complete!,3146,Transaktion abgeschlossen!,¡Transacción completa!,, +3149,Dex/Wallet/SendResult.qml,,3150,Recipient's address,3151,Empfängeradresse,Dirección del destinatario,, +3154,Dex/Wallet/SendResult.qml,,3155,Amount,3156,Menge,Importe,, +3159,Dex/Wallet/SendResult.qml,,3160,Fees,3161,Gebühren,Tarifas,, +3164,Dex/Wallet/SendResult.qml,,3165,Date,3166,Datum,Fecha,, +3169,Dex/Wallet/SendResult.qml,,3170,Transaction Hash,3171,Transaktions-Hash,Hash de Transacción,, +3174,Dex/Wallet/SendResult.qml,,3175,Close,3176,Schließen,Cerrar,, +3179,Dex/Wallet/SendResult.qml,,3180,View on Explorer,3181,Ansicht im Explorer,Ver en Explorer,, +3187,Dex/Settings/SettingModal.qml,,3188,Confirm Logout,3189,Abmelden bestätigen,Confirmar Cerrar Sesión,, +3192,Dex/Settings/SettingModal.qml,,3193,Are you sure you want to log out?,3194,Wollen Sie sich wirklich abmelden?,¿Está seguro de que desea cerrar sesión?,, +3197,Dex/Settings/SettingModal.qml,,3198,Yes,3199,Ja,Sí,, +3204,Dex/Settings/SettingModal.qml,,3205,Cancel,3206,Abbrechen,Cancelar,, +3209,Dex/Settings/SettingModal.qml,,3210,Settings,3211,Einstellungen,Configuración,, +3214,Dex/Settings/SettingModal.qml,,3215,General,3216,Allgemein,General,, +3219,Dex/Settings/SettingModal.qml,,3220,Language,3221,Sprache,Idioma,, +3224,Dex/Settings/SettingModal.qml,,3225,User Interface,3226,Benutzeroberfläche,Interfaz,, +3229,Dex/Settings/SettingModal.qml,,3230,Security,3231,Sicherheit,Seguridad,, +3234,Dex/Settings/SettingModal.qml,,3235,Enable Desktop Notifications,3236,Desktop-Benachrichtigungen aktivieren,Habilitar Notificaciones de Escritorio,, +3239,Dex/Settings/SettingModal.qml,,3240,Maximum number of enabled coins,3241,Maximale Anzahl aktivierter Coins,Número máximo de monedas habilitadas,, +3244,Dex/Settings/SettingModal.qml,,3245,Logs,3246,Protokolle,Registros,, +3249,Dex/Settings/SettingModal.qml,,3250,Open Folder,3251,Ordner öffnen,Carpeta Abierta,, +3254,Dex/Settings/SettingModal.qml,,3255,Reset,3256,Zurücksetzen,Restablecer,, +3259,Dex/Settings/SettingModal.qml,,3260,Current Font,3261,Aktuelle Schriftart,Fuente Actual,, +3264,Dex/Settings/SettingModal.qml,,3265,Current font changed to %1.,3266,Aktuelle Schriftart in %1 geändert.,La fuente actual cambió a %1.,, +3269,Dex/Settings/SettingModal.qml,,3270,Theme,3271,Thema,Tema,, +3274,Dex/Settings/SettingModal.qml,,3275,Changing theme to %1,3276,Design zu %1 geändert,Cambiando el tema a %1,, +3279,Dex/Settings/SettingModal.qml,,3280,Disable 2FA?,3281,2FA deaktivieren?,¿Deshabilitar 2FA?,, +3284,Dex/Settings/SettingModal.qml,,3285,Enter your wallet password to confirm,3286,Geben Sie zur Bestätigung das Kennwort ihrer Brieftasche ein,Ingrese la contraseña de su billetera para confirmar,, +3289,Dex/Settings/SettingModal.qml,,3290,Type password,3291,Kennwort eingeben,Escriba la contraseña,, +3294,Dex/Settings/SettingModal.qml,,3295,2FA status,3296,2FA Status,Estado 2FA,, +3299,Dex/Settings/SettingModal.qml,,3300,2FA disabled successfully,3301,2FA erfolgreich deaktiviert,2FA deshabilitado correctamente,, +3305,Dex/Settings/SettingModal.qml,,3306,Ok,3307,Ok,Ok,, +3310,Dex/Settings/SettingModal.qml,,3311,Wrong password!,3312,Falsches Kennwort!,¡Contraseña incorrecta!,, +3315,Dex/Settings/SettingModal.qml,,3316,Wallet password is incorrect,3317,Kennwort der Brieftasche ist falsch,Contraseña de la billetera es incorrecta,, +3320,Dex/Settings/SettingModal.qml,,3321,Application Version,3322,Anwendungsversion,La versión de la aplicación,, +3325,Dex/Settings/SettingModal.qml,,3326,copied to clipboard,3327,In die Zwischenablage kopiert,copió en el portapapeles,, +3330, ${DEX_DISPLAY_NAME} - 0.5.6 + 0.5.7 ${DEX_DISPLAY_NAME} Installer ${DEX_WEBSITE} ${DEX_COMPANY} diff --git a/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/meta/package.xml.in b/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/meta/package.xml.in index 89c8e81c29..06109f6ba9 100644 --- a/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/meta/package.xml.in +++ b/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/meta/package.xml.in @@ -2,8 +2,8 @@ ${DEX_DISPLAY_NAME} Install ${DEX_DISPLAY_NAME}. - 0.5.6 - 2022-07-12 + 0.5.7 + 2022-11-09 diff --git a/ci_tools_atomic_dex/installer/windows/config/config.xml.in b/ci_tools_atomic_dex/installer/windows/config/config.xml.in index 3ea5ee7723..2a33ec7019 100644 --- a/ci_tools_atomic_dex/installer/windows/config/config.xml.in +++ b/ci_tools_atomic_dex/installer/windows/config/config.xml.in @@ -1,7 +1,7 @@ @DEX_DISPLAY_NAME@ - 0.5.6 + 0.5.7 @DEX_DISPLAY_NAME@ Installer @DEX_WEBSITE@ @DEX_COMPANY@ diff --git a/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/package.xml.in b/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/package.xml.in index 89c8e81c29..1a0b0bc1c3 100644 --- a/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/package.xml.in +++ b/ci_tools_atomic_dex/installer/windows/packages/com.komodoplatform.atomicdex/meta/package.xml.in @@ -2,8 +2,8 @@ ${DEX_DISPLAY_NAME} Install ${DEX_DISPLAY_NAME}. - 0.5.6 - 2022-07-12 + 0.5.7 + 2022-10-24 diff --git a/ci_tools_atomic_dex/src/ci_tools_atomic_dex.nim b/ci_tools_atomic_dex/src/ci_tools_atomic_dex.nim index feb24df7e3..ab8425ffa5 100644 --- a/ci_tools_atomic_dex/src/ci_tools_atomic_dex.nim +++ b/ci_tools_atomic_dex/src/ci_tools_atomic_dex.nim @@ -16,11 +16,11 @@ Atomic Dex CI Tools. Usage: ci_tools_atomic_dex --install_vcpkg ci_tools_atomic_dex --install_dependencies - ci_tools_atomic_dex build (release|debug) [--osx_sdk=] [--compiler=] + ci_tools_atomic_dex build (Release|Debug) [--osx_sdk=] [--compiler=] ci_tools_atomic_dex clean (full|dependencies|build_dir) - ci_tools_atomic_dex generate (release|debug) [--osx_sdk=] [--compiler=] - ci_tools_atomic_dex bundle (release|debug) [--osx_sdk=] [--compiler=] - ci_tools_atomic_dex tests (release|debug) [--osx_sdk=] [--compiler=] + ci_tools_atomic_dex generate (Release|Debug) [--osx_sdk=] [--compiler=] + ci_tools_atomic_dex bundle (Release|Debug) [--osx_sdk=] [--compiler=] + ci_tools_atomic_dex tests (Release|Debug) [--osx_sdk=] [--compiler=] ci_tools_atomic_dex --version ci_tools_atomic_dex (-h | --help) @@ -32,30 +32,37 @@ Options: proc main() = let args = docopt(doc, version = "Atomic Dex CI Tools 0.0.1") vcpkg_prepare() + if args["--install_vcpkg"]: install_vcpkg() + elif args["--install_dependencies"]: download_packages() + elif args["generate"]: - if args["release"]: + if args["Release"]: generate_solution("Release", $args["--osx_sdk"], $args["--compiler"]) - elif args["debug"]: + elif args["Debug"]: generate_solution("Debug", $args["--osx_sdk"], $args["--compiler"]) + elif args["build"]: - if args["release"]: + if args["Release"]: build_atomic_qt("Release", $args["--osx_sdk"], $args["--compiler"]) - elif args["debug"]: + elif args["Debug"]: build_atomic_qt("Debug", $args["--osx_sdk"], $args["--compiler"]) + elif args["bundle"]: - if args["release"]: + if args["Release"]: bundle("Release", $args["--osx_sdk"], $args["--compiler"]) - elif args["debug"]: + elif args["Debug"]: bundle("Debug", $args["--osx_sdk"], $args["--compiler"]) + elif args["tests"]: - if args["release"]: + if args["Release"]: run_tests("Release", $args["--osx_sdk"], $args["--compiler"]) - elif args["debug"]: + elif args["Debug"]: run_tests("Debug", $args["--osx_sdk"], $args["--compiler"]) + elif args["clean"]: if args["full"]: clean("full") diff --git a/ci_tools_atomic_dex/src/tests.nim b/ci_tools_atomic_dex/src/tests.nim index 0b8240610a..78ee2980ff 100644 --- a/ci_tools_atomic_dex/src/tests.nim +++ b/ci_tools_atomic_dex/src/tests.nim @@ -12,8 +12,26 @@ proc run_tests*(build_type: string, osx_sdk_path: string, compiler_path: string) generate_solution(build_type, osx_sdk_path, compiler_path) when defined(osx): + echo "CURRENT OSX FOLDER" echo os.getCurrentDir() - os.setCurrentDir(os.getCurrentDir().joinPath("bin").joinPath(os.getEnv("DEX_PROJECT_NAME") & "_tests.app").joinPath("Contents").joinPath("MacOS")) + discard osproc.execCmd("ls") + os.setCurrentDir(os.getCurrentDir().joinPath("bin")) + echo "CURRENT OSX FOLDER" + echo os.getCurrentDir() + discard osproc.execCmd("ls") + os.setCurrentDir(os.getCurrentDir().joinPath(os.getEnv("DEX_PROJECT_NAME") & "_tests.app")) + echo "CURRENT OSX FOLDER" + echo os.getCurrentDir() + discard osproc.execCmd("ls") + os.setCurrentDir(os.getCurrentDir().joinPath("Contents")) + echo "CURRENT OSX FOLDER" + echo os.getCurrentDir() + discard osproc.execCmd("ls") + os.setCurrentDir(os.getCurrentDir().joinPath("MacOS")) + echo "CURRENT OSX FOLDER" + echo os.getCurrentDir() + discard osproc.execCmd("ls") + # os.setCurrentDir(os.getCurrentDir().joinPath("bin").joinPath(os.getEnv("DEX_PROJECT_NAME") & "_tests.app").joinPath("Contents").joinPath("MacOS")) echo "Running AtomicDex Pro Unit tests" discard osproc.execCmd("./" & os.getEnv("DEX_PROJECT_NAME") & "_tests --reporters=xml --out=" & os.getEnv("DEX_PROJECT_NAME") & "-tests-result.xml -s") echo "Successfully Generated", os.getEnv("DEX_PROJECT_NAME"), "-tests-result.xml" diff --git a/ci_tools_atomic_dex/util/compare_themes.py b/ci_tools_atomic_dex/util/compare_themes.py new file mode 100755 index 0000000000..40b5f097cd --- /dev/null +++ b/ci_tools_atomic_dex/util/compare_themes.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +import json +import requests + +''' +Purpose: Scans the light and dark theme json files for a list of whitelabel + branches, and compares them with the dev branch to identify theme + selectors which are obsolete or not present in the whitelabel branch. + +Usage: `./compare_themes.py` +''' + +REPO_URL = "https://raw.githubusercontent.com/KomodoPlatform/atomicDEX-Desktop" +BRANCHES = ['smartdex', 'GleecDEX', 'shibadex'] + + +def get_theme_url(branch, theme): + '''Returns a github url for a branch theme.''' + path = f"assets/themes/Default%20-%20{theme.title()}" + return f"{REPO_URL}/{branch}/{path}/colors.json" + + +def get_themes_data(branches): + '''Returns a dict of dark/light theme data for each branch.''' + themes = {} + for branch in branches+['dev']: + themes.update({branch: {}}) + for theme in ['light', 'dark']: + url = get_theme_url(branch, theme) + themes[branch].update({ + theme: requests.get(url).json() + }) + return themes + + +def get_selectors(themes, branch='dev'): + '''Returns a list of selectors within each theme for a branch.''' + return { + 'light': set(themes[branch]['light'].keys()), + 'dark': set(themes[branch]['dark'].keys()) + } + + +def compare_branch_themes(branches, show_results=True): + '''Scans whitelabel theme data to identify missing/obsolete selectors.''' + themes = get_themes_data(branches) + dev_selectors = get_selectors(themes, 'dev') + + for branch in branches: + for theme in ['light', 'dark']: + selectors = set(themes[branch][theme].keys()) + missing = dev_selectors[theme].difference(selectors) + themes[branch].update({ + f"missing_{theme}": missing, + f"obsolete_{theme}": selectors.difference(dev_selectors[theme]) + }) + if show_results: + output_results(themes, branch, theme) + + +def output_results(themes, branch, theme): + '''Outputs results for a branch to the console.''' + print(f"\n#### {branch} {theme} ####") + if len(themes[branch][f"obsolete_{theme}"]) == 0: + print(f"No obsolete selectors") + else: + for i in themes[branch][f"obsolete_{theme}"]: + print(f"Obsolete selector: {i}...") + + if len(themes[branch][f"missing_{theme}"]) == 0: + print(f"No obsolete selectors") + else: + for i in themes[branch][f"missing_{theme}"]: + dev_color = themes['dev'][theme][i] + for j in themes['dev'][theme]: + if dev_color == themes['dev'][theme][j]: + if j in themes[branch][theme]: + print(f"Missing {i}... Try {themes[branch][theme][j]}") + break + + +if __name__ == '__main__': + compare_branch_themes(BRANCHES, True) diff --git a/cmake/compiler_targets.cmake b/cmake/compiler_targets.cmake index 2793d91d09..ecbe4a273b 100644 --- a/cmake/compiler_targets.cmake +++ b/cmake/compiler_targets.cmake @@ -52,7 +52,7 @@ target_compile_definitions(antara_optimize_settings INTERFACE $<$,$,$>:NDEBUG> $<$,$,$>:DEBUG> $<$,$,$>:NDEBUG> - $<$,$,$>:-DEBUG> + $<$,$,$>:DEBUG> $<$,$,$>:NDEBUG> $<$,$,$>:DEBUG> ) diff --git a/cmake/install/linux/linux_post_install.cmake b/cmake/install/linux/linux_post_install.cmake index 246a03f62e..23eae65e00 100644 --- a/cmake/install/linux/linux_post_install.cmake +++ b/cmake/install/linux/linux_post_install.cmake @@ -5,20 +5,26 @@ execute_process(COMMAND bash -c "echo -n `git rev-parse --short HEAD`" OUTPUT_VARIABLE VERSION_ID ) +message(STATUS "PROJECT_ROOT_DIR (before readjusting) -> ${PROJECT_ROOT_DIR}") + get_filename_component(PROJECT_ROOT_DIR ${CMAKE_SOURCE_DIR} DIRECTORY) -if (EXISTS ${PROJECT_ROOT_DIR}/build-Release) +if (EXISTS ${PROJECT_ROOT_DIR}/build-Release OR EXISTS ${PROJECT_ROOT_DIR}/build-Debug) message(STATUS "from ci tools, readjusting") get_filename_component(PROJECT_ROOT_DIR ${PROJECT_ROOT_DIR} DIRECTORY) endif () -message(STATUS "PROJECT_ROOT_DIR -> ${PROJECT_ROOT_DIR}") set(PROJECT_QML_DIR ${PROJECT_ROOT_DIR}/atomic_defi_design/Dex) -message(STATUS "PROJECT_QML_DIR -> ${PROJECT_QML_DIR}") set(PROJECT_APP_DIR AntaraAtomicDexAppDir) set(PROJECT_APP_PATH ${CMAKE_SOURCE_DIR}/bin/${PROJECT_APP_DIR}) set(PROJECT_BIN_PATH ${PROJECT_APP_PATH}/usr/bin/${DEX_PROJECT_NAME}) set(PROJECT_LIB_PATH ${PROJECT_APP_PATH}/usr/lib) set(TARGET_APP_PATH ${PROJECT_ROOT_DIR}/bundled/linux) + +message(STATUS "VCPKG package manager enabled") +message(STATUS "PROJECT_ROOT_DIR (after readjusting) -> ${PROJECT_ROOT_DIR}") +message(STATUS "PROJECT_QML_DIR -> ${PROJECT_QML_DIR}") +message(STATUS "VERSION_ID -> ${VERSION_ID}") + if (EXISTS ${PROJECT_APP_PATH}) message(STATUS "PROJECT_APP_PATH path is -> ${PROJECT_APP_PATH}") message(STATUS "PROJECT_BIN_PATH path is -> ${PROJECT_BIN_PATH}") @@ -28,16 +34,13 @@ else () message(FATAL_ERROR "Didn't find ${PROJECT_APP_PATH}") endif () -message(STATUS "VCPKG package manager enabled") set(LINUX_DEPLOY_PATH ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/linux_misc/linuxdeployqt-7-x86_64.AppImage) - if (EXISTS ${LINUX_DEPLOY_PATH}) message(STATUS "linuxdeployqt path is -> ${LINUX_DEPLOY_PATH}") else () message(FATAL_ERROR "Didn't find ${LINUX_DEPLOY_PATH}") endif () - message(STATUS "Copying required libraries for QtWebEngine") list(APPEND LIST_LIBS "/usr/lib/x86_64-linux-gnu/libsmime3.so" @@ -49,26 +52,35 @@ list(APPEND LIST_LIBS "/usr/lib/x86_64-linux-gnu/nss/libnssdbm3.so" "/usr/lib/x86_64-linux-gnu/nss/libsoftokn3.chk" "/usr/lib/x86_64-linux-gnu/nss/libsoftokn3.so") + file(COPY ${PROJECT_APP_PATH}/usr/share/icons/default/64x64/apps/dex-logo-64.png DESTINATION ${PROJECT_APP_PATH}) file(COPY ${PROJECT_APP_PATH}/usr/share/applications/dex.desktop DESTINATION ${PROJECT_APP_PATH}) + foreach (current_lib ${LIST_LIBS}) message(STATUS "copying ${current_lib} to ${PROJECT_LIB_PATH}") file(COPY ${current_lib} DESTINATION ${PROJECT_LIB_PATH}) endforeach () + message(STATUS "Executing linuxdeployqt to fix dependencies") message(STATUS "Executing cmd: [${LINUX_DEPLOY_PATH} ${PROJECT_BIN_PATH} -qmldir=${PROJECT_QML_DIR} -bundle-non-qt-libs -exclude-libs='libnss3.so,libnssutil3.so' -unsupported-allow-new-glibc -no-copy-copyright-files -verbose=1 -extra-plugins=iconengines,platformthemes/libqgtk3.so -appimage]") execute_process(COMMAND ${LINUX_DEPLOY_PATH} ${PROJECT_BIN_PATH} -qmldir=${PROJECT_QML_DIR} -bundle-non-qt-libs -exclude-libs='libnss3.so,libnssutil3.so' -unsupported-allow-new-glibc -no-copy-copyright-files -verbose=1 -extra-plugins=iconengines,platformthemes/libqgtk3.so -appimage WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE) + +message(STATUS "Renaming ${CMAKE_SOURCE_DIR}/${DEX_PROJECT_NAME}-${VERSION_ID}-x86_64.AppImage to ${CMAKE_SOURCE_DIR}/${DEX_PROJECT_NAME}-linux-${VERSION_ID}-x86_64.AppImage") +file(RENAME ${CMAKE_SOURCE_DIR}/${DEX_PROJECT_NAME}-${VERSION_ID}-x86_64.AppImage ${CMAKE_SOURCE_DIR}/${DEX_PROJECT_NAME}-linux-${VERSION_ID}-x86_64.AppImage) + message(STATUS "Copying ${PROJECT_APP_PATH} to ${TARGET_APP_PATH}/${PROJECT_APP_DIR}") file(COPY ${PROJECT_APP_PATH} DESTINATION ${TARGET_APP_PATH}) execute_process(COMMAND zip -r ${DEX_PROJECT_NAME}-linux-${VERSION_ID}.zip AntaraAtomicDexAppDir WORKING_DIRECTORY ${TARGET_APP_PATH} ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE) + execute_process(COMMAND tar --zstd -cf ${DEX_PROJECT_NAME}-linux-${VERSION_ID}.tar.zst AntaraAtomicDexAppDir WORKING_DIRECTORY ${TARGET_APP_PATH} ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE) -file(COPY ${CMAKE_SOURCE_DIR}/${DEX_PROJECT_NAME}-${VERSION_ID}-x86_64.AppImage DESTINATION ${TARGET_APP_PATH}) \ No newline at end of file + +file(COPY ${CMAKE_SOURCE_DIR}/${DEX_PROJECT_NAME}-linux-${VERSION_ID}-x86_64.AppImage DESTINATION ${TARGET_APP_PATH}) diff --git a/cmake/install/macos/dex_install.cmake b/cmake/install/macos/dex_install.cmake index 96f48384a4..c472d7684d 100644 --- a/cmake/install/macos/dex_install.cmake +++ b/cmake/install/macos/dex_install.cmake @@ -4,8 +4,8 @@ if (APPLE) MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}" RESOURCE ${ICON} MACOSX_BUNDLE_ICON_FILE dex-logo - MACOSX_BUNDLE_SHORT_VERSION_STRING 0.5.6 - MACOSX_BUNDLE_LONG_VERSION_STRING 0.5.6 + MACOSX_BUNDLE_SHORT_VERSION_STRING 0.5.7 + MACOSX_BUNDLE_LONG_VERSION_STRING 0.5.7 MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/cmake/MacOSXBundleInfo.plist.in") add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND diff --git a/cmake/install/macos/osx_post_install.cmake b/cmake/install/macos/osx_post_install.cmake index fb53e69b4f..4aa629b58e 100644 --- a/cmake/install/macos/osx_post_install.cmake +++ b/cmake/install/macos/osx_post_install.cmake @@ -1,38 +1,43 @@ include(${CMAKE_CURRENT_LIST_DIR}/../../project.metadata.cmake) +message(STATUS "OSX POST INSTALL CMAKE") +message(STATUS "PROJECT_ROOT_DIR (before readjusting) -> ${PROJECT_ROOT_DIR}") + get_filename_component(PROJECT_ROOT_DIR ${CMAKE_SOURCE_DIR} DIRECTORY) if (EXISTS ${PROJECT_ROOT_DIR}/build-Release OR EXISTS ${PROJECT_ROOT_DIR}/build-Debug) message(STATUS "from ci tools, readjusting") get_filename_component(PROJECT_ROOT_DIR ${PROJECT_ROOT_DIR} DIRECTORY) endif () -message(STATUS "PROJECT_ROOT_DIR -> ${PROJECT_ROOT_DIR}") -set(PROJECT_QML_DIR ${PROJECT_ROOT_DIR}/atomic_defi_design/Dex) -message(STATUS "PROJECT_QML_DIR -> ${PROJECT_QML_DIR}") -message(STATUS "bin dir -> ${CMAKE_CURRENT_SOURCE_DIR}/bin") +set(BIN_DIR ${CMAKE_CURRENT_SOURCE_DIR}/bin) set(TARGET_APP_PATH ${PROJECT_ROOT_DIR}/bundled/osx/) set(PROJECT_APP_DIR ${DEX_PROJECT_NAME}.app) -set(PROJECT_APP_PATH ${CMAKE_SOURCE_DIR}/bin/${PROJECT_APP_DIR}) -if (EXISTS ${PROJECT_APP_PATH}) - message(STATUS "PROJECT_APP_PATH path is -> ${PROJECT_APP_PATH}") -else () - message(FATAL_ERROR "Didn't find PROJECT_APP_PATH -> ${PROJECT_APP_PATH}") -endif () - +set(PROJECT_APP_PATH ${BIN_DIR}/${PROJECT_APP_DIR}) +set(PROJECT_QML_DIR ${PROJECT_ROOT_DIR}/atomic_defi_design/Dex) +set(MAC_DEPLOY_PATH $ENV{QT_ROOT}/clang_64/bin/macdeployqt) message(STATUS "VCPKG package manager enabled") +message(STATUS "QT_ROOT -> ${QT_ROOT}") +message(STATUS "BIN_DIR -> ${BIN_DIR}") +message(STATUS "TARGET_APP_PATH -> ${TARGET_APP_PATH}") +message(STATUS "PROJECT_APP_DIR -> ${PROJECT_APP_DIR}") +message(STATUS "PROJECT_QML_DIR -> ${PROJECT_QML_DIR}") +message(STATUS "PROJECT_ROOT_DIR (after readjusting) -> ${PROJECT_ROOT_DIR}") -message(STATUS "Using QT tools from $HOME/QT") -set(MAC_DEPLOY_PATH $ENV{QT_ROOT}/clang_64/bin/macdeployqt) +if (EXISTS ${PROJECT_APP_PATH}) + message(STATUS "PROJECT_APP_PATH -> ${PROJECT_APP_PATH}") +else () + message(FATAL_ERROR "Didn't find PROJECT_APP_PATH") +endif () if (EXISTS ${MAC_DEPLOY_PATH}) - message(STATUS "macdeployqt path is -> ${MAC_DEPLOY_PATH}") + message(STATUS "MAC_DEPLOY_PATH -> ${MAC_DEPLOY_PATH}") else () - message(FATAL_ERROR "Didn't find macdeployqt") + message(FATAL_ERROR "Didn't find MAC_DEPLOY_PATH") endif () +message(STATUS "CREATING DMG") if (NOT EXISTS ${CMAKE_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.dmg) - ##------------------------------------------- message(STATUS "${MAC_DEPLOY_PATH} ${PROJECT_APP_PATH} -qmldir=${PROJECT_QML_DIR} -always-overwrite -sign-for-notarization=$ENV{MAC_SIGN_IDENTITY} -verbose=3") execute_process( COMMAND @@ -41,9 +46,6 @@ if (NOT EXISTS ${CMAKE_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.dmg) ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE ) - ##------------------------------------------- - - ##------------------------------------------- message(STATUS "Fixing QTWebengineProcess") set(QTWEBENGINE_BUNDLED_PATH ${PROJECT_APP_PATH}/Contents/Frameworks/QtWebEngineCore.framework/Helpers/QtWebEngineProcess.app/Contents/MacOS/QtWebEngineProcess) message(STATUS "Executing: [install_name_tool -add_rpath @executable_path/../../../../../../Frameworks ${QTWEBENGINE_BUNDLED_PATH}]") @@ -52,7 +54,7 @@ if (NOT EXISTS ${CMAKE_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.dmg) ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE) - execute_process(COMMAND codesign --deep --force -v -s "$ENV{MAC_SIGN_IDENTITY}" -o runtime --timestamp ${PROJECT_APP_PATH}/Contents/Resources/assets/tools/mm2/mm2 + execute_process(COMMAND codesign --deep --force -v -s "$ENV{MAC_SIGN_IDENTITY}" -o runtime --timestamp ${PROJECT_APP_PATH}/Contents/Resources/assets/tools/mm2/${DEX_API} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE) @@ -68,7 +70,6 @@ if (NOT EXISTS ${CMAKE_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.dmg) ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE) - ##------------------------------------------- message(STATUS "Packaging the DMG") set(PACKAGER_PATH ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/dmg-packager/package.sh) if (EXISTS ${PACKAGER_PATH}) @@ -97,13 +98,14 @@ endif () file(COPY ${CMAKE_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.dmg DESTINATION ${TARGET_APP_PATH}) -get_filename_component(QT_ROOT_DIR $ENV{QT_ROOT} DIRECTORY) -set(IFW_BINDIR ${QT_ROOT_DIR}/Tools/QtInstallerFramework/4.4/bin) +get_filename_component(QT_ROOT_DIR $ENV{QT_ROOT} DIRECTORY) +set(IFW_BINDIR ${QT_ROOT_DIR}/Tools/QtInstallerFramework/4.5/bin) message(STATUS "IFW_BIN PATH IS ${IFW_BINDIR}") if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.7z) + execute_process(COMMAND ls WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) message(STATUS "Generating ${DEX_PROJECT_NAME}.7z with [${IFW_BINDIR}/archivegen ${DEX_PROJECT_NAME}.7z ${DEX_PROJECT_NAME}.app] from directory: ${CMAKE_CURRENT_SOURCE_DIR}/bin") execute_process(COMMAND - ${IFW_BINDIR}/archivegen ${DEX_PROJECT_NAME}.7z ${DEX_PROJECT_NAME}.app + ${IFW_BINDIR}/archivegen ${DEX_PROJECT_NAME}.7z ${PROJECT_APP_PATH} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE) @@ -111,9 +113,11 @@ else() message(STATUS "${DEX_PROJECT_NAME}.7z already created - skipping") endif() +message(STATUS "Copying ${CMAKE_CURRENT_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.7z TO ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/data") + file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.7z DESTINATION ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/installer/osx/packages/com.komodoplatform.atomicdex/data) -execute_process(COMMAND ${IFW_BINDIR}/binarycreator -c ./config/config.xml -p ./packages/ ${DEX_PROJECT_NAME}_installer -s $ENV{MAC_SIGN_IDENTITY} +execute_process(COMMAND ${IFW_BINDIR}/binarycreator -c ./config/config.xml -p ./packages/ ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/installer/osx/${DEX_PROJECT_NAME}_installer -s $ENV{MAC_SIGN_IDENTITY} WORKING_DIRECTORY ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/installer/osx ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE) @@ -130,7 +134,10 @@ execute_process(COMMAND ${PROJECT_ROOT_DIR}/cmake/install/macos/macos_notarize.s file(COPY ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/installer/osx/${DEX_PROJECT_NAME}_installer.app DESTINATION ${TARGET_APP_PATH}) -execute_process(COMMAND ${IFW_BINDIR}/archivegen ${DEX_PROJECT_NAME}_installer.7z ${DEX_PROJECT_NAME}_installer.app + +execute_process(COMMAND ${IFW_BINDIR}/archivegen ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/installer/osx/${DEX_PROJECT_NAME}_installer.7z ${DEX_PROJECT_NAME}_installer.app WORKING_DIRECTORY ${TARGET_APP_PATH} ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE) + +file(COPY ${PROJECT_ROOT_DIR}/ci_tools_atomic_dex/installer/osx/${DEX_PROJECT_NAME}_installer.7z DESTINATION ${TARGET_APP_PATH}) diff --git a/cmake/install/windows/windows_post_install.cmake b/cmake/install/windows/windows_post_install.cmake index 6867250ad1..ecdf78ae12 100644 --- a/cmake/install/windows/windows_post_install.cmake +++ b/cmake/install/windows/windows_post_install.cmake @@ -1,17 +1,21 @@ include(${CMAKE_CURRENT_LIST_DIR}/../../project.metadata.cmake) +message(STATUS "PROJECT_ROOT_DIR (before readjusting) -> ${PROJECT_ROOT_DIR}") + get_filename_component(PROJECT_ROOT_DIR ${CMAKE_SOURCE_DIR} DIRECTORY) -if (EXISTS ${PROJECT_ROOT_DIR}/build-Release) +if (EXISTS ${PROJECT_ROOT_DIR}/build-Release OR EXISTS ${PROJECT_ROOT_DIR}/build-Debug) message(STATUS "from ci tools, readjusting") get_filename_component(PROJECT_ROOT_DIR ${PROJECT_ROOT_DIR} DIRECTORY) endif () -message(STATUS "PROJECT_ROOT_DIR -> ${PROJECT_ROOT_DIR}") - set(PROJECT_APP_DIR bin) set(PROJECT_APP_PATH ${CMAKE_SOURCE_DIR}/${PROJECT_APP_DIR}) set(TARGET_APP_PATH ${PROJECT_ROOT_DIR}/bundled/windows) +message(STATUS "VCPKG package manager enabled") +message(STATUS "PROJECT_ROOT_DIR (after readjusting) -> ${PROJECT_ROOT_DIR}") +message(STATUS "PROJECT_QML_DIR -> ${PROJECT_QML_DIR}") + if (EXISTS ${PROJECT_APP_PATH}) message(STATUS "PROJECT_APP_PATH path is -> ${PROJECT_APP_PATH}") message(STATUS "TARGET_APP_PATH path is -> ${TARGET_APP_PATH}") @@ -58,7 +62,7 @@ execute_process(COMMAND powershell.exe -File ${PROJECT_ROOT_DIR}/ci_tools_atomic message(STATUS "manifest output: ${MANIFEST_RESULT} ${MANIFEST_OUTPUT} ${MANIFEST_ERROR}") message(STATUS "Creating Installer") -set(IFW_BINDIR $ENV{QT_ROOT}/Tools/QtInstallerFramework/4.4/bin) +set(IFW_BINDIR $ENV{QT_ROOT}/Tools/QtInstallerFramework/4.5/bin) message(STATUS "IFW_BIN PATH IS ${IFW_BINDIR}") if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${DEX_PROJECT_NAME}.7z) message(STATUS "command is: [${IFW_BINDIR}/archivegen.exe ${DEX_PROJECT_NAME}.7z .]") diff --git a/cmake/project.metadata.cmake b/cmake/project.metadata.cmake index 0c30aab815..2dc37ab350 100644 --- a/cmake/project.metadata.cmake +++ b/cmake/project.metadata.cmake @@ -1,4 +1,7 @@ # Default project values +set(DEX_API "mm2") +set(DEX_RPCPORT 7783) +set(DEX_RPC "http://127.0.0.1:7783") set(DEX_PROJECT_NAME "atomicdex-desktop-ce") set(DEX_DISPLAY_NAME "AtomicDEX Desktop-CE") set(DEX_MAINTENANCE_TOOL_NAME "AtomicDEX Maintenance Tool") @@ -8,7 +11,7 @@ set(DEX_SUPPORT_PAGE "https://support.komodoplatform.com/support/home") set(DEX_DISCORD "https://discord.gg/euuHtKfJEu") set(DEX_TWITTER "https://twitter.com/KomodianOrg") set(DEX_PRIMARY_COIN "KMD") ## Main coin of the DEX, will be enabled by default and will be the default left ticker for trading -set(DEX_SECOND_PRIMARY_COIN "LTC") ## Second main coin of the DEX, will be enabled by default and will be the default right ticker for trading +set(DEX_SECOND_PRIMARY_COIN "ARRR") ## Second main coin of the DEX, will be enabled by default and will be the default right ticker for trading option(DISABLE_GEOBLOCKING "Enable to disable geoblocking (for dev purpose)" ON) set(DEX_REPOSITORY_OWNER ${DEX_COMPANY}) set(DEX_REPOSITORY_NAME "atomicDEX-Desktop-CE") @@ -18,13 +21,20 @@ if (APPLE) else () set(DEX_APPDATA_FOLDER "atomic_qt") endif () -message(STATUS "APPDATA folder is ${DEX_APPDATA_FOLDER}") - if (UNIX AND NOT APPLE) set(DEX_LINUX_APP_ID "dex-ce.desktop") endif () # Erases default project values with environment variables if they exist. +if (DEFINED ENV{DEX_API}) + set(DEX_API $ENV{DEX_API}) +endif () +if (DEFINED ENV{DEX_RPCPORT}) + set(DEX_RPCPORT $ENV{DEX_RPCPORT}) +endif () +if (DEFINED ENV{DEX_RPC}) + set(DEX_RPC $ENV{DEX_RPC}) +endif () if (DEFINED ENV{DEX_PROJECT_NAME}) set(DEX_PROJECT_NAME $ENV{DEX_PROJECT_NAME}) endif () @@ -37,9 +47,25 @@ endif () if (DEFINED ENV{DEX_WEBSITE}) set(DEX_WEBSITE $ENV{DEX_WEBSITE}) endif () +if (DEFINED ENV{PROJECT_ROOT}) + set(PROJECT_ROOT $ENV{PROJECT_ROOT}) +else () + set(PROJECT_ROOT ${CMAKE_SOURCE_DIR}) +endif () + # Shows project metadata -message(STATUS "Project Metadata: ${DEX_PROJECT_NAME}.${DEX_DISPLAY_NAME}.${DEX_COMPANY}.${DEX_WEBSITE}") +message(STATUS "Project Metadata:") +message(STATUS "DEX_APPDATA_FOLDER --> ${DEX_APPDATA_FOLDER}") +message(STATUS "CMAKE_BUILD_TYPE --> ${CMAKE_BUILD_TYPE}") +message(STATUS "DEX_PROJECT_NAME --> ${DEX_PROJECT_NAME}") +message(STATUS "DEX_DISPLAY_NAME --> ${DEX_DISPLAY_NAME}") +message(STATUS "DEX_COMPANY --> ${DEX_COMPANY}") +message(STATUS "DEX_WEBSITE --> ${DEX_WEBSITE}") +message(STATUS "CMAKE_SOURCE_DIR --> ${CMAKE_SOURCE_DIR}") +message(STATUS "PROJECT_ROOT --> ${PROJECT_ROOT}") + + # Generates files which need to be configured with custom variables from env/CMake. macro(generate_dex_project_metafiles) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 417e52afc7..531c27e8d6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,7 +14,7 @@ DEX_NEW_LIB(core INTERFACE $<$:NOMINMAX> $<$:SPDLOG_WCHAR_TO_UTF8_SUPPORT> _TURN_OFF_PLATFORM_STRING - DEX_NAME="${DEX_DISPLAY_NAME}" DEX_WEBSITE_URL="${DEX_WEBSITE}" + DEX_API="${DEX_API}" DEX_RPC="${DEX_RPC}" DEX_RPCPORT="${DEX_RPCPORT}" DEX_NAME="${DEX_DISPLAY_NAME}" DEX_WEBSITE_URL="${DEX_WEBSITE}" DEX_SUPPORT_URL="${DEX_SUPPORT_PAGE}" DEX_DISCORD_URL="${DEX_DISCORD}" DEX_TWITTER_URL="${DEX_TWITTER}" DEX_PRIMARY_COIN="${DEX_PRIMARY_COIN}" DEX_SECOND_PRIMARY_COIN="${DEX_SECOND_PRIMARY_COIN}" #DEX_COMMON_DATA_FOLDER="${DEX_COMMON_DATA_FOLDER}" DEX_PROJECT_NAME="${DEX_PROJECT_NAME}" DEX_COMPANY_NAME="${DEX_COMPANY_NAME}" @@ -53,6 +53,8 @@ set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM TRUE) set(TS_FILES ${CMAKE_SOURCE_DIR}/atomic_defi_design/assets/languages/atomic_defi_en.ts ${CMAKE_SOURCE_DIR}/atomic_defi_design/assets/languages/atomic_defi_fr.ts + ${CMAKE_SOURCE_DIR}/atomic_defi_design/assets/languages/atomic_defi_de.ts + ${CMAKE_SOURCE_DIR}/atomic_defi_design/assets/languages/atomic_defi_es.ts ${CMAKE_SOURCE_DIR}/atomic_defi_design/assets/languages/atomic_defi_tr.ts ${CMAKE_SOURCE_DIR}/atomic_defi_design/assets/languages/atomic_defi_ru.ts) set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION ${CMAKE_SOURCE_DIR}/atomic_defi_design/assets/languages) @@ -73,7 +75,7 @@ dex_generate_qrc(${CMAKE_SOURCE_DIR}/atomic_defi_design/Dex qml_qrc dex_generate_qrc(${CMAKE_SOURCE_DIR}/atomic_defi_design/assets assets_qrc PATH_PREFIX "assets" FILES_TO_EXCLUDE ".gitignore;.DS_Store;CONTRIBUTING.txt;FONTLOG.txt;LICENCE-FAQ.txt;LICENCE.txt;README.txt;TRADEMARKS.txt;.ts;.qm;.qrc" - FILES "languages/atomic_defi_en.qm;languages/atomic_defi_fr.qm;languages/atomic_defi_ru.qm;languages/atomic_defi_tr.qm") + FILES "languages/atomic_defi_en.qm;languages/atomic_defi_es.qm;languages/atomic_defi_de.qm;languages/atomic_defi_fr.qm;languages/atomic_defi_ru.qm;languages/atomic_defi_tr.qm") # Main executable add_executable(${PROJECT_NAME} @@ -106,17 +108,30 @@ endif () # Testing executable add_executable(${PROJECT_NAME}_tests MACOSX_BUNDLE ${ICON} + tests/atomic.dex.qt.utilities.tests.cpp + tests/atomic.dex.provider.cex.prices.api.tests.cpp + tests/atomic.dex.provider.cex.prices.tests.cpp tests/atomic.dex.tests.cpp tests/atomic.dex.wallet.config.tests.cpp - tests/atomic.dex.provider.cex.prices.tests.cpp - tests/atomic.dex.qt.utilities.tests.cpp + ##! API + tests/api/coingecko/coingecko.tests.cpp + tests/api/komodo_prices/komodo.prices.tests.cpp + tests/api/mm2/mm2.api.format.address.tests.cpp + tests/api/mm2/mm2.api.utxo.merge.params.tests.cpp + tests/api/mm2/mm2.api.balance.infos.tests.cpp + tests/api/mm2/mm2.fraction.tests.cpp + tests/api/mm2/mm2.rpc.trade.preimage.tests.cpp + + ##! CFG tests/config/coins.cfg.tests.cpp + ##! API tests/api/coingecko/coingecko.tests.cpp tests/api/komodo_prices/komodo.prices.tests.cpp tests/api/mm2/mm2.rpc.trade.preimage.tests.cpp tests/api/mm2/mm2.fraction.tests.cpp + tests/api/mm2/enable_bch_with_tokens_rpc_tests.cpp ##! Utilities tests/utilities/qt.utilities.tests.cpp @@ -128,7 +143,10 @@ add_executable(${PROJECT_NAME}_tests MACOSX_BUNDLE ${ICON} ##! Models tests/models/qt.addressbook.contact.model.tests.cpp - tests/atomic.dex.provider.cex.prices.api.tests.cpp) + ##! Utilities + tests/utilities/qt.utilities.tests.cpp + tests/utilities/global.utilities.tests.cpp) + target_link_libraries(${PROJECT_NAME}_tests PUBLIC ${PROJECT_NAME}::core diff --git a/src/app/app.cpp b/src/app/app.cpp index 07922b0fcc..cc0e164b4f 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -76,25 +76,32 @@ namespace atomic_dex coins_std.reserve(coins.size()); atomic_dex::mm2_service& mm2 = get_mm2(); std::unordered_set extra_coins; - for (auto&& coin: coins) { + for (auto&& coin : coins) + { auto coin_info = mm2.get_coin_info(coin.toStdString()); - if (coin_info.has_parent_fees_ticker && coin_info.ticker != coin_info.fees_ticker) + + if (coin_info.has_parent_fees_ticker && + coin_info.ticker != coin_info.fees_ticker && + !coins.contains(QString::fromStdString(coin_info.fees_ticker))) { auto coin_parent_info = mm2.get_coin_info(coin_info.fees_ticker); - if (!coin_parent_info.currently_enabled && !coin_parent_info.active && extra_coins.insert(coin_parent_info.ticker).second) + // todo: why can it be empty when it has been found ? + // refactor coins enabling logic!!! + if (coin_parent_info.ticker != "") { - SPDLOG_INFO("Adding extra coin: {} to enable", coin_parent_info.ticker); + if (!coin_parent_info.currently_enabled && !coin_parent_info.active && extra_coins.insert(coin_parent_info.ticker).second) + { + SPDLOG_INFO("Adding extra coin: {} to enable", coin_parent_info.ticker); + } } } coins_std.push_back(coin.toStdString()); } - for (auto&& extra_coin : extra_coins) { coins_std.push_back(extra_coin); } - mm2.enable_multiple_coins(coins_std); - + mm2.enable_coins(coins_std); return true; } @@ -109,19 +116,26 @@ namespace atomic_dex QString secondary_coin = QString::fromStdString(g_second_primary_dex_coin); QStringList coins_copy; const auto& mm2 = system_manager_.get_system(); - for (auto&& coin: coins) + for (auto&& coin : coins) { const auto coin_info = mm2.get_coin_info(coin.toStdString()); bool has_parent_fees = coin_info.has_parent_fees_ticker; if (not get_orders()->swap_is_in_progress(coin) && coin != primary_coin && coin != secondary_coin) { - if (has_parent_fees) + if (!get_mm2().is_zhtlc_coin_ready(coin.toStdString())) { - coins_copy.push_front(coin); + this->dispatcher_.trigger(coin.toStdString(), "Can't disable until fully activated."); } else { - coins_copy.push_back(coin); + if (has_parent_fees) + { + coins_copy.push_front(coin); + } + else + { + coins_copy.push_back(coin); + } } } } @@ -132,7 +146,7 @@ namespace atomic_dex system_manager_.get_system().disable_coins(coins_copy); system_manager_.get_system().disable_coins(coins_copy); coins_std.reserve(coins_copy.size()); - for (auto&& coin: coins_copy) + for (auto&& coin : coins_copy) { if (QString::fromStdString(get_mm2().get_current_ticker()) == coin && m_primary_coin_fully_enabled) { @@ -220,6 +234,7 @@ namespace atomic_dex while (not m_portfolio_queue.empty()) { const char* ticker_cstr = nullptr; + bool add_to_init(true); m_portfolio_queue.pop(ticker_cstr); std::string ticker(ticker_cstr); if (ticker == g_primary_dex_coin) @@ -230,7 +245,17 @@ namespace atomic_dex { this->m_secondary_coin_fully_enabled = true; } - to_init.push_back(ticker); + //! TODO: figure out why sometimes ZHTLC coins end up in here twice. When they do, without this check it crashes. + if (std::find(to_init.begin(), to_init.end(), ticker) != to_init.end()) { + SPDLOG_DEBUG("Ticker {} is already in vector", ticker); + add_to_init = false; + } + else { + SPDLOG_DEBUG("Ticker {} is not already in vector", ticker); + } + if (add_to_init) { + to_init.push_back(ticker); + } std::free((void*)ticker_cstr); } @@ -363,6 +388,9 @@ namespace atomic_dex system_manager_.create_system( system_manager_, m_event_actions.at(events_action::about_to_exit_app), portfolio_system.get_portfolio(), this); + + system_manager_.create_system(system_manager_, this->dispatcher_, this); + connect_signals(); if (qt_wallet_manager::is_there_a_default_wallet()) { @@ -473,8 +501,8 @@ namespace atomic_dex auto& wallet_manager = this->system_manager_.get_system(); wallet_manager.just_set_wallet_name(""); - this->m_secondary_coin_fully_enabled = false; this->m_primary_coin_fully_enabled = false; + this->m_secondary_coin_fully_enabled = false; system_manager_.get_system().set_status("None"); return fs::remove(utils::get_atomic_dex_config_folder() / "default.wallet"); } @@ -507,7 +535,7 @@ namespace atomic_dex { QString result; - ::mm2::api::recover_funds_of_swap_request request{.swap_uuid = uuid.toStdString()}; + mm2::recover_funds_of_swap_request request{.swap_uuid = uuid.toStdString()}; auto res = get_mm2().get_mm2_client().rpc_recover_funds(std::move(request)); result = QString::fromStdString(res.raw_result); @@ -739,6 +767,17 @@ namespace atomic_dex } } // namespace atomic_dex +//! update checker +namespace atomic_dex +{ + zcash_params_service* application::get_zcash_params_service() const + { + auto ptr = const_cast(std::addressof(system_manager_.get_system())); + assert(ptr != nullptr); + return ptr; + } +} // namespace atomic_dex + //! IP checker namespace atomic_dex { diff --git a/src/app/app.hpp b/src/app/app.hpp index 5ad906ff54..dd18115804 100644 --- a/src/app/app.hpp +++ b/src/app/app.hpp @@ -49,6 +49,7 @@ #include "atomicdex/services/mm2/mm2.service.hpp" #include "atomicdex/services/price/global.provider.hpp" #include "atomicdex/services/update/update.checker.service.hpp" +#include "atomicdex/services/update/zcash.params.service.hpp" namespace ag = antara::gaming; @@ -74,6 +75,7 @@ namespace atomic_dex Q_PROPERTY(settings_page* settings_pg READ get_settings_page NOTIFY settingsPageChanged) Q_PROPERTY(qt_wallet_manager* wallet_mgr READ get_wallet_mgr NOTIFY walletMgrChanged) Q_PROPERTY(update_checker_service* updateCheckerService READ get_update_checker_service NOTIFY updateCheckerServiceChanged) + Q_PROPERTY(zcash_params_service* zcash_params READ get_zcash_params_service NOTIFY zcashParamsServiceChanged) //! Private function void connect_signals(); @@ -118,23 +120,24 @@ namespace atomic_dex void on_mm2_initialized_event(const mm2_initialized&); void on_process_orders_and_swaps_finished_event(const process_swaps_and_orders_finished&); - mm2_service& get_mm2(); - [[nodiscard]] const mm2_service& get_mm2() const; - entt::dispatcher& get_dispatcher(); - const entt::registry& get_registry() const; - entt::registry& get_registry(); - [[nodiscard]] addressbook_page* get_addressbook_page() const; - [[nodiscard]] portfolio_page* get_portfolio_page() const; - [[nodiscard]] wallet_page* get_wallet_page() const; - orders_model* get_orders() const; - notification_manager* get_notification_manager() const; - trading_page* get_trading_page() const; - settings_page* get_settings_page() const; - qt_wallet_manager* get_wallet_mgr() const; - internet_service_checker* get_internet_checker() const; - ip_service_checker* get_ip_checker() const; - update_checker_service* get_update_checker_service() const; - exporter_service* get_exporter_service() const; + mm2_service& get_mm2(); + [[nodiscard]] const mm2_service& get_mm2() const; + entt::dispatcher& get_dispatcher(); + const entt::registry& get_registry() const; + entt::registry& get_registry(); + [[nodiscard]] addressbook_page* get_addressbook_page() const; + [[nodiscard]] portfolio_page* get_portfolio_page() const; + [[nodiscard]] wallet_page* get_wallet_page() const; + orders_model* get_orders() const; + notification_manager* get_notification_manager() const; + trading_page* get_trading_page() const; + settings_page* get_settings_page() const; + qt_wallet_manager* get_wallet_mgr() const; + internet_service_checker* get_internet_checker() const; + ip_service_checker* get_ip_checker() const; + update_checker_service* get_update_checker_service() const; + [[nodiscard]] zcash_params_service* get_zcash_params_service() const; + exporter_service* get_exporter_service() const; void set_qt_app(std::shared_ptr app, QQmlApplicationEngine* qml_engine); @@ -174,6 +177,7 @@ namespace atomic_dex void walletPageChanged(); void ordersChanged(); void updateCheckerServiceChanged(); + void zcashParamsServiceChanged(); void tradingPageChanged(); void settingsPageChanged(); void internetCheckerChanged(); diff --git a/src/app/main.prerequisites.hpp b/src/app/main.prerequisites.hpp index 90d8f88f79..d843e2e6e2 100644 --- a/src/app/main.prerequisites.hpp +++ b/src/app/main.prerequisites.hpp @@ -57,6 +57,7 @@ //! Project Headers #include "app.hpp" #include "atomicdex/constants/qt.wallet.enums.hpp" +#include "atomicdex/constants/dex.constants.hpp" #include "atomicdex/models/qt.portfolio.model.hpp" #include "atomicdex/utilities/kill.hpp" #include "atomicdex/utilities/qt.utilities.hpp" @@ -104,7 +105,7 @@ static void signal_handler(int signal) { SPDLOG_ERROR("sigabort received, cleaning mm2"); - atomic_dex::kill_executable("mm2"); + atomic_dex::kill_executable(atomic_dex::g_dex_api); #if defined(linux) || defined(__APPLE__) boost::stacktrace::safe_dump_to("./backtrace.dump"); std::ifstream ifs("./backtrace.dump"); @@ -158,20 +159,37 @@ static void clean_previous_run() { SPDLOG_INFO("cleaning previous mm2 instance"); - atomic_dex::kill_executable("mm2"); + atomic_dex::kill_executable(atomic_dex::g_dex_api); } -static void -init_logging() +static void init_logging() { - auto logger = atomic_dex::utils::register_logger(); - if (spdlog::get("log_mt") == nullptr) - { - spdlog::register_logger(logger); - spdlog::set_default_logger(logger); - spdlog::set_level(spdlog::level::trace); - spdlog::set_pattern("[%T] [%^%l%$] [%s:%#] [%t]: %v"); - } + constexpr size_t qsize_spdlog = 10240; + constexpr size_t spdlog_thread_count = 2; + constexpr size_t spdlog_max_file_size = 7777777; + constexpr size_t spdlog_max_file_rotation = 3; + + fs::path path = atomic_dex::utils::get_atomic_dex_current_log_file(); + spdlog::init_thread_pool(qsize_spdlog, spdlog_thread_count); + auto tp = spdlog::thread_pool(); + auto stdout_sink = std::make_shared(); + +#if defined(_WIN32) || defined(WIN32) + auto rotating_sink = std::make_shared(path.wstring(), spdlog_max_file_size, spdlog_max_file_rotation); +#else + auto rotating_sink = std::make_shared(path.string(), spdlog_max_file_size, spdlog_max_file_rotation); +#endif + + std::vector sinks{stdout_sink, rotating_sink}; + auto logger = std::make_shared("log_mt", sinks.begin(), sinks.end(), tp, spdlog::async_overflow_policy::block); + spdlog::register_logger(logger); + spdlog::set_default_logger(logger); +#ifdef DEBUG + spdlog::set_level(spdlog::level::trace); +#else + spdlog::set_level(spdlog::level::info); +#endif + spdlog::set_pattern("[%T] [%^%l%$] [%s:%#] [%t]: %v"); } static void @@ -322,7 +340,7 @@ handle_settings(QSettings& settings) #endif create_settings_functor("AutomaticUpdateOrderBot", QVariant(false)); create_settings_functor("WalletChartsCategory", qint32(WalletChartsCategories::OneMonth)); - create_settings_functor("AvailableLang", QStringList{"en", "fr", "tr", "ru"}); + create_settings_functor("AvailableLang", QStringList{"en", "es", "fr", "de", "tr", "ru"}); create_settings_functor("CurrentLang", QString("en")); create_settings_functor("2FA", 0); create_settings_functor("MaximumNbCoinsEnabled", 50); diff --git a/src/core/atomicdex/api/komodo_prices/komodo.prices.cpp b/src/core/atomicdex/api/komodo_prices/komodo.prices.cpp index c403ee2966..65ca7505bb 100644 --- a/src/core/atomicdex/api/komodo_prices/komodo.prices.cpp +++ b/src/core/atomicdex/api/komodo_prices/komodo.prices.cpp @@ -79,8 +79,8 @@ namespace atomic_dex::komodo_prices::api { web::http::http_request req; req.set_method(web::http::methods::GET); - SPDLOG_INFO("url: {}", TO_STD_STR(g_komodo_prices_client->base_uri().to_string()) + "api/v2/tickers?expire_at=600"); - req.set_request_uri(FROM_STD_STR("/api/v2/tickers?expire_at=600")); + SPDLOG_INFO("url: {}", TO_STD_STR(g_komodo_prices_client->base_uri().to_string()) + "api/v2/tickers?expire_at=21600"); + req.set_request_uri(FROM_STD_STR("/api/v2/tickers?expire_at=21600")); return fallback ? g_komodo_prices_client_fallback->request(req) : g_komodo_prices_client->request(req); } } // namespace atomic_dex::komodo_prices::api diff --git a/src/core/atomicdex/api/mm2/balance.infos.cpp b/src/core/atomicdex/api/mm2/balance.infos.cpp new file mode 100644 index 0000000000..73c1c8753c --- /dev/null +++ b/src/core/atomicdex/api/mm2/balance.infos.cpp @@ -0,0 +1,31 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +//! Dependencies Headers +#include + +// Project Headers +#include "balance.infos.hpp" + +namespace atomic_dex::mm2 +{ + void + from_json(const nlohmann::json& j, balance_infos& answer) + { + answer.spendable = j.at("spendable").get(); + answer.unspendable = j.at("unspendable").get(); + } +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/balance.infos.hpp b/src/core/atomicdex/api/mm2/balance.infos.hpp new file mode 100644 index 0000000000..5173db0f8a --- /dev/null +++ b/src/core/atomicdex/api/mm2/balance.infos.hpp @@ -0,0 +1,31 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +#include +#include + +namespace atomic_dex::mm2 +{ + struct balance_infos + { + std::string spendable; + std::string unspendable; + }; + + void from_json(const nlohmann::json& j, balance_infos& answer); +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/balance_info.cpp b/src/core/atomicdex/api/mm2/balance_info.cpp new file mode 100644 index 0000000000..dde88b26a0 --- /dev/null +++ b/src/core/atomicdex/api/mm2/balance_info.cpp @@ -0,0 +1,12 @@ +#include + +#include "balance_info.hpp" + +namespace atomic_dex::mm2 +{ + void from_json(const nlohmann::json& j, balance_info& in) + { + j.at("spendable").get_to(in.spendable); + j.at("unspendable").get_to(in.unspendable); + } +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/balance_info.hpp b/src/core/atomicdex/api/mm2/balance_info.hpp new file mode 100644 index 0000000000..f40047c368 --- /dev/null +++ b/src/core/atomicdex/api/mm2/balance_info.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include + +#include //> nlohmann::json + +namespace atomic_dex::mm2 +{ + struct balance_info + { + std::string spendable; + std::string unspendable; + }; + + void from_json(const nlohmann::json& j, balance_info& in); +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/enable_bch_with_tokens_rpc.cpp b/src/core/atomicdex/api/mm2/enable_bch_with_tokens_rpc.cpp new file mode 100644 index 0000000000..26b248f4a1 --- /dev/null +++ b/src/core/atomicdex/api/mm2/enable_bch_with_tokens_rpc.cpp @@ -0,0 +1,81 @@ +#include + +#include "enable_bch_with_tokens_rpc.hpp" + +namespace atomic_dex::mm2 +{ + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc& in) + { + j["ticker"] = in.ticker; + j["bchd_urls"] = in.bchd_urls; + j["tx_history"] = in.tx_history; + j["allow_slp_unsafe_conf"] = in.allow_slp_unsafe_conf.value_or(false); + j["mode"] = in.mode; + j["slp_tokens_requests"] = in.slp_tokens_requests; + if (in.required_confirmations.has_value()) + j["required_confirmations"] = in.required_confirmations.value(); + if (in.requires_notarization.has_value()) + j["requires_notarization"] = in.requires_notarization.value(); + if (in.address_format.has_value()) + j["address_format"] = in.address_format.value(); + if (in.utxo_merge_params.has_value()) + j["utxo_merge_params"] = in.utxo_merge_params.value(); + } + + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc::mode_t& in) + { + j["rpc"] = in.rpc; + j["rpc_data"] = in.rpc_data; + } + + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc::mode_t::data& in) + { + j["servers"] = in.servers; + } + + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc::address_format_t& in) + { + j["format"] = in.format; + j["network"] = in.network; + } + + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc::slp_token_request_t& in) + { + j["ticker"] = in.ticker; + if (in.required_confirmations) + j["required_confirmations"] = in.required_confirmations.value(); + } + + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc::utxo_merge_params_t& in) + { + j["merge_at"] = in.merge_at; + j["check_every"] = in.check_every; + j["max_merge_at_once"] = in.max_merge_at_once; + } + + void from_json(const nlohmann::json& json, enable_bch_with_tokens_result_rpc& out) + { + out.current_block = json["current_block"]; + out.bch_addresses_infos = json["bch_addresses_infos"].get(); + out.slp_addresses_infos = json["slp_addresses_infos"].get(); + } + + void from_json(const nlohmann::json& json, enable_bch_with_tokens_result_rpc::derivation_method_t& out) + { + out.type = json["type"]; + } + + void from_json(const nlohmann::json& json, enable_bch_with_tokens_result_rpc::bch_address_infos_t& out) + { + out.derivation_method = json["derivation_method"]; + out.pubkey = json["pubkey"]; + out.balances = json["balances"]; + } + + void from_json(const nlohmann::json& json, enable_bch_with_tokens_result_rpc::slp_address_infos_t& out) + { + out.derivation_method = json["derivation_method"]; + out.pubkey = json["pubkey"]; + out.balances = json["balances"].get(); + } +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/enable_bch_with_tokens_rpc.hpp b/src/core/atomicdex/api/mm2/enable_bch_with_tokens_rpc.hpp new file mode 100644 index 0000000000..88f8f66cd7 --- /dev/null +++ b/src/core/atomicdex/api/mm2/enable_bch_with_tokens_rpc.hpp @@ -0,0 +1,96 @@ +#pragma once + +#include + +#include "rpc.hpp" +#include "balance_info.hpp" +#include "atomicdex/config/electrum.cfg.hpp" + +namespace atomic_dex::mm2 +{ + struct enable_bch_with_tokens_rpc + { + static constexpr auto endpoint = "enable_bch_with_tokens"; + static constexpr bool is_v2 = true; + + struct expected_request_type + { + struct mode_t + { + struct data { std::vector servers; }; + + std::string rpc{"Electrum"}; + data rpc_data; + }; + struct slp_token_request_t + { + std::string ticker; + std::optional required_confirmations; + }; + struct address_format_t + { + std::string format; + std::string network; + }; + struct utxo_merge_params_t + { + int merge_at; + int check_every; + int max_merge_at_once; + }; + + std::string ticker; + std::optional allow_slp_unsafe_conf{false}; + std::vector bchd_urls; + mode_t mode; + bool tx_history{true}; + std::vector slp_tokens_requests; + std::optional required_confirmations; + std::optional requires_notarization; + std::optional address_format; + std::optional utxo_merge_params; + }; + + struct expected_result_type + { + struct derivation_method_t { std::string type; }; + struct bch_address_infos_t + { + derivation_method_t derivation_method; + std::string pubkey; + balance_info balances; + }; + struct slp_address_infos_t + { + derivation_method_t derivation_method; + std::string pubkey; + std::unordered_map balances; + }; + + std::size_t current_block; + std::unordered_map bch_addresses_infos; + std::unordered_map slp_addresses_infos; + }; + + using expected_error_type = rpc_basic_error_type; + + expected_request_type request; + std::optional result; + std::optional error; + }; + + using enable_bch_with_tokens_request_rpc = enable_bch_with_tokens_rpc::expected_request_type; + using enable_bch_with_tokens_result_rpc = enable_bch_with_tokens_rpc::expected_result_type; + using enable_bch_with_tokens_error_rpc = enable_bch_with_tokens_rpc::expected_error_type; + + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc& in); + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc::mode_t& in); + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc::mode_t::data& in); + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc::address_format_t& in); + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc::slp_token_request_t& in); + void to_json(nlohmann::json& j, const enable_bch_with_tokens_request_rpc::utxo_merge_params_t& in); + void from_json(const nlohmann::json& json, enable_bch_with_tokens_result_rpc& out); + void from_json(const nlohmann::json& json, enable_bch_with_tokens_result_rpc::derivation_method_t& out); + void from_json(const nlohmann::json& json, enable_bch_with_tokens_result_rpc::bch_address_infos_t& out); + void from_json(const nlohmann::json& json, enable_bch_with_tokens_result_rpc::slp_address_infos_t& out); +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/enable_slp_rpc.cpp b/src/core/atomicdex/api/mm2/enable_slp_rpc.cpp new file mode 100644 index 0000000000..314005d743 --- /dev/null +++ b/src/core/atomicdex/api/mm2/enable_slp_rpc.cpp @@ -0,0 +1,28 @@ +#include + +#include "enable_slp_rpc.hpp" + +namespace atomic_dex::mm2 +{ + void to_json(nlohmann::json& j, const enable_slp_rpc_request& request) + { + j["ticker"] = request.ticker; + if (request.activation_params.required_confirmations) + { + j["activation_params"]["required_confirmations"] = *request.activation_params.required_confirmations; + } + else + { + j["activation_params"] = nlohmann::json::object(); + } + } + + void from_json(const nlohmann::json& j, enable_slp_rpc_result& in) + { + j.at("token_id").get_to(in.token_id); + j.at("platform_coin").get_to(in.platform_coin); + j.at("required_confirmations").get_to(in.required_confirmations); + j.at("token_id").get_to(in.token_id); + j.at("balances").get_to>(in.balances); + } +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/enable_slp_rpc.hpp b/src/core/atomicdex/api/mm2/enable_slp_rpc.hpp new file mode 100644 index 0000000000..f06ce0dfb0 --- /dev/null +++ b/src/core/atomicdex/api/mm2/enable_slp_rpc.hpp @@ -0,0 +1,60 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +#include + +#include //> nlohmann::json + +#include "rpc.hpp" +#include "balance_info.hpp" + +namespace atomic_dex::mm2 +{ + struct enable_slp_rpc + { + static constexpr auto endpoint = "enable_slp"; + static constexpr bool is_v2 = true; + + struct expected_request_type + { + std::string ticker; + struct { std::optional required_confirmations; } activation_params; + }; + + struct expected_result_type + { + std::string token_id; + std::string platform_coin; + int required_confirmations; + std::unordered_map balances; + }; + + using expected_error_type = rpc_basic_error_type; + + expected_request_type request; + std::optional result; + std::optional error; + }; + + using enable_slp_rpc_request = enable_slp_rpc::expected_request_type; + using enable_slp_rpc_result = enable_slp_rpc::expected_result_type; + using enable_slp_rpc_error = enable_slp_rpc::expected_error_type; + + void to_json(nlohmann::json& j, const enable_slp_rpc_request& request); + void from_json(const nlohmann::json& j, enable_slp_rpc_result& in); +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/format.address.cpp b/src/core/atomicdex/api/mm2/format.address.cpp new file mode 100644 index 0000000000..e860019e11 --- /dev/null +++ b/src/core/atomicdex/api/mm2/format.address.cpp @@ -0,0 +1,31 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +//! Dependencies Headers +#include + +//! Project Headers +#include "format.address.hpp" + +namespace atomic_dex::mm2 +{ + void + to_json(nlohmann::json& j, const format_address& cfg) + { + j["format"] = cfg.format; + j["network"] = cfg.network; + } +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/format.address.hpp b/src/core/atomicdex/api/mm2/format.address.hpp new file mode 100644 index 0000000000..c6f9db230c --- /dev/null +++ b/src/core/atomicdex/api/mm2/format.address.hpp @@ -0,0 +1,31 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +#include +#include + +namespace atomic_dex::mm2 +{ + struct format_address + { + std::string format; + std::string network; + }; + + void to_json(nlohmann::json& j, const format_address& cfg); +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/fraction.cpp b/src/core/atomicdex/api/mm2/fraction.cpp index 705e82e620..0bcdc944fc 100644 --- a/src/core/atomicdex/api/mm2/fraction.cpp +++ b/src/core/atomicdex/api/mm2/fraction.cpp @@ -1,19 +1,12 @@ -// -// Created by Roman Szterg on 13/02/2021. -// - -//! Deps #include -//! Project Headers #include "atomicdex/api/mm2/fraction.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { - void - from_json(const nlohmann::json& j, fraction& fraction) + void from_json(const nlohmann::json& j, mm2::fraction& fraction) { j.at("denom").get_to(fraction.denom); j.at("numer").get_to(fraction.numer); } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/fraction.fwd.hpp b/src/core/atomicdex/api/mm2/fraction.fwd.hpp index 751790ad4a..8b0b7bb20c 100644 --- a/src/core/atomicdex/api/mm2/fraction.fwd.hpp +++ b/src/core/atomicdex/api/mm2/fraction.fwd.hpp @@ -1,6 +1,6 @@ #pragma once -namespace mm2::api +namespace atomic_dex::mm2 { struct fraction; } \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/fraction.hpp b/src/core/atomicdex/api/mm2/fraction.hpp index c1a8895e2d..c197c8a478 100644 --- a/src/core/atomicdex/api/mm2/fraction.hpp +++ b/src/core/atomicdex/api/mm2/fraction.hpp @@ -1,13 +1,11 @@ #pragma once -//! STD #include -//! Deps #include #include -namespace mm2::api +namespace atomic_dex::mm2 { struct fraction { @@ -15,5 +13,5 @@ namespace mm2::api std::string numer; }; - ENTT_API void from_json(const nlohmann::json& j, fraction& fraction); + ENTT_API void from_json(const nlohmann::json& j, mm2::fraction& fraction); } \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/generic.error.cpp b/src/core/atomicdex/api/mm2/generic.error.cpp index 4c0f6ab146..85943adcf6 100644 --- a/src/core/atomicdex/api/mm2/generic.error.cpp +++ b/src/core/atomicdex/api/mm2/generic.error.cpp @@ -1,13 +1,8 @@ -// -// Created by Sztergbaum Roman on 08/06/2021. -// - #include "atomicdex/api/mm2/generic.error.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { - void - from_json(const nlohmann::json& j, generic_answer_error& res) + void from_json(const nlohmann::json& j, generic_answer_error& res) { j.at("error").get_to(res.error); j.at("error_path").get_to(res.error_path); @@ -15,4 +10,4 @@ namespace mm2::api j.at("error_type").get_to(res.error_type); j.at("error_data").get_to(res.error_data); } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/generic.error.hpp b/src/core/atomicdex/api/mm2/generic.error.hpp index a7de90b803..7be792aae5 100644 --- a/src/core/atomicdex/api/mm2/generic.error.hpp +++ b/src/core/atomicdex/api/mm2/generic.error.hpp @@ -6,7 +6,7 @@ //! Deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct generic_answer_error { @@ -18,4 +18,4 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, generic_answer_error& res); -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/generics.cpp b/src/core/atomicdex/api/mm2/generics.cpp index 6920b12069..58ec61a052 100644 --- a/src/core/atomicdex/api/mm2/generics.cpp +++ b/src/core/atomicdex/api/mm2/generics.cpp @@ -30,7 +30,7 @@ #include "atomicdex/api/mm2/rpc.validate.address.hpp" #include "atomicdex/api/mm2/rpc.recover.funds.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { template void @@ -56,4 +56,4 @@ namespace mm2::api template void extract_rpc_json_answer(const nlohmann::json& j, validate_address_answer& answer); template void extract_rpc_json_answer(const nlohmann::json& j, convert_address_answer& answer); template void extract_rpc_json_answer(const nlohmann::json& j, recover_funds_of_swap_answer& answer); -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/generics.hpp b/src/core/atomicdex/api/mm2/generics.hpp index 5c40f63053..f8dc01c009 100644 --- a/src/core/atomicdex/api/mm2/generics.hpp +++ b/src/core/atomicdex/api/mm2/generics.hpp @@ -18,7 +18,7 @@ #include -namespace mm2::api +namespace atomic_dex::mm2 { template void diff --git a/src/core/atomicdex/api/mm2/rpc.get.public.key.cpp b/src/core/atomicdex/api/mm2/get_public_key_rpc.cpp similarity index 86% rename from src/core/atomicdex/api/mm2/rpc.get.public.key.cpp rename to src/core/atomicdex/api/mm2/get_public_key_rpc.cpp index 966f4d911a..fe8559710b 100644 --- a/src/core/atomicdex/api/mm2/rpc.get.public.key.cpp +++ b/src/core/atomicdex/api/mm2/get_public_key_rpc.cpp @@ -14,15 +14,18 @@ * * ******************************************************************************/ -// Deps Headers #include -// Project Headers -#include "rpc.get.public.key.hpp" +#include "get_public_key_rpc.hpp" namespace atomic_dex::mm2 { - void from_json(const nlohmann::json& json, get_public_key_answer& in) + void to_json(nlohmann::json& j, const get_public_key_rpc_request& request) + { + + } + + void from_json(const nlohmann::json& json, get_public_key_rpc_result& in) { json.at("public_key").get_to(in.public_key); } diff --git a/src/core/atomicdex/api/mm2/get_public_key_rpc.hpp b/src/core/atomicdex/api/mm2/get_public_key_rpc.hpp new file mode 100644 index 0000000000..609ae0261e --- /dev/null +++ b/src/core/atomicdex/api/mm2/get_public_key_rpc.hpp @@ -0,0 +1,52 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +#include + +#include + +#include "rpc.hpp" + +namespace atomic_dex::mm2 +{ + struct get_public_key_rpc + { + static constexpr auto endpoint = "get_public_key"; + static constexpr bool is_v2 = true; + + struct expected_request_type{}; + + struct expected_result_type + { + std::string public_key; + }; + + using expected_error_type = rpc_basic_error_type; + + expected_request_type request; + std::optional result; + std::optional error; + }; + + using get_public_key_rpc_request = get_public_key_rpc::expected_request_type; + using get_public_key_rpc_result = get_public_key_rpc::expected_result_type; + using get_public_key_rpc_error = get_public_key_rpc::expected_error_type; + + void to_json([[maybe_unused]] nlohmann::json& j, const get_public_key_rpc_request&); + void from_json(const nlohmann::json& json, get_public_key_rpc_result& in); +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/mm2.client.cpp b/src/core/atomicdex/api/mm2/mm2.client.cpp index 0b51757b58..635e190a91 100644 --- a/src/core/atomicdex/api/mm2/mm2.client.cpp +++ b/src/core/atomicdex/api/mm2/mm2.client.cpp @@ -14,15 +14,18 @@ * * ******************************************************************************/ -// Deps Headers #include -// Project Headers -#include "atomicdex/api/mm2/mm2.client.hpp" -#include "atomicdex/api/mm2/mm2.hpp" -#include "atomicdex/api/mm2/rpc.tx.history.hpp" -#include "rpc.get.public.key.hpp" +#include "enable_slp_rpc.hpp" +#include "get_public_key_rpc.hpp" +#include "enable_bch_with_tokens_rpc.hpp" +#include "my_tx_history_rpc.hpp" +#include "my_tx_history_v1_rpc.hpp" +#include "mm2.client.hpp" +#include "mm2.hpp" +#include "atomicdex/constants/dex.constants.hpp" #include "rpc.hpp" +#include "rpc.tx.history.hpp" namespace { @@ -31,49 +34,60 @@ namespace t_http_client generate_client() { - web::http::client::http_client_config cfg; using namespace std::chrono_literals; - cfg.set_timeout(30s); - return web::http::client::http_client(FROM_STD_STR(::mm2::api::g_endpoint), cfg); + + constexpr auto client_timeout = 30s; + web::http::client::http_client_config cfg; + + cfg.set_timeout(client_timeout); + return {FROM_STD_STR(atomic_dex::g_dex_rpc), cfg}; } - template + template web::http::http_request make_request(typename Rpc::expected_request_type data_req = {}) { web::http::http_request request; - nlohmann::json json_req = {{"method", Rpc::endpoint}, {"userpass", mm2::api::get_rpc_password()}}; + nlohmann::json json_req = {{"method", Rpc::endpoint}, {"userpass", atomic_dex::mm2::get_rpc_password()}}; + nlohmann::json json_data; + nlohmann::to_json(json_data, data_req); request.set_method(web::http::methods::POST); if (Rpc::is_v2) { json_req["mmrpc"] = "2.0"; - json_req.push_back({"params", data_req}); + json_req.push_back({"params", json_data}); } else { - json_req.insert(json_req.end(), nlohmann::json(data_req)); + json_req.insert(json_req.end(), json_data); } request.set_body(json_req.dump()); return request; } - template - typename Rpc::expected_answer_type make_answer(const web::http::http_response& answer) + template + Rpc process_rpc_answer(const web::http::http_response& answer) { + Rpc rpc; auto json_answer = nlohmann::json::parse(TO_STD_STR(answer.extract_string(true).get())); + if (Rpc::is_v2) { - return json_answer.at("result").get(); + if (answer.status_code() == 200) + rpc.result = json_answer.at("result").get(); + else + rpc.error = json_answer.get(); } - return json_answer.get(); + else + rpc.result = json_answer.get(); + return rpc; } } // namespace -namespace atomic_dex +namespace atomic_dex::mm2 { template - RpcReturnType - mm2_client::rpc_process_answer(const web::http::http_response& resp, const std::string& rpc_command) + RpcReturnType mm2_client::rpc_process_answer(const web::http::http_response& resp, const std::string& rpc_command) { std::string body = TO_STD_STR(resp.extract_string(true).get()); SPDLOG_INFO("resp code for rpc_command {} is {}", rpc_command, resp.status_code()); @@ -135,18 +149,31 @@ namespace atomic_dex return resp; } - template <::mm2::api::rpc ApiCallType> - void mm2_client::process_rpc_async(const std::function& on_rpc_processed) + template + void mm2_client::process_rpc_async(const std::function& on_rpc_processed) { - auto request = make_request(); + using request_type = typename Rpc::expected_request_type; + process_rpc_async(request_type{}, on_rpc_processed); + } + template void mm2_client::process_rpc_async(const std::function&); + template void mm2_client::process_rpc_async(const std::function&); + template void mm2_client::process_rpc_async(const std::function&); + template void mm2_client::process_rpc_async(const std::function&); + template void mm2_client::process_rpc_async(const std::function&); + + template + void mm2_client::process_rpc_async(typename Rpc::expected_request_type request, const std::function& on_rpc_processed) + { + auto http_request = make_request(request); generate_client() - .request(request, m_token_source.get_token()) - .template then([on_rpc_processed](const web::http::http_response& resp) + .request(http_request, m_token_source.get_token()) + .template then([on_rpc_processed, request](const web::http::http_response& resp) { try { - auto answer = make_answer(resp); - on_rpc_processed(answer); + auto rpc = process_rpc_answer(resp); + rpc.request = request; + on_rpc_processed(rpc); } catch (const std::exception& ex) { @@ -155,8 +182,6 @@ namespace atomic_dex }); } - template void mm2_client::process_rpc_async(const std::function&); - void mm2_client::stop() { @@ -167,11 +192,11 @@ namespace atomic_dex TAnswer mm2_client::process_rpc(TRequest&& request, std::string rpc_command) { - SPDLOG_INFO("Processing rpc call: {}", rpc_command); + SPDLOG_DEBUG("Processing rpc call: {}", rpc_command); - nlohmann::json json_data = ::mm2::api::template_request(rpc_command); + nlohmann::json json_data = mm2::template_request(rpc_command); - ::mm2::api::to_json(json_data, request); + mm2::to_json(json_data, request); auto json_copy = json_data; json_copy["userpass"] = "*******"; @@ -198,5 +223,5 @@ namespace atomic_dex } } // namespace atomic_dex -template mm2::api::tx_history_answer atomic_dex::mm2_client::rpc_process_answer(const web::http::http_response& resp, const std::string& rpc_command); -template mm2::api::disable_coin_answer atomic_dex::mm2_client::rpc_process_answer(const web::http::http_response& resp, const std::string& rpc_command); \ No newline at end of file +template atomic_dex::mm2::tx_history_answer atomic_dex::mm2::mm2_client::rpc_process_answer(const web::http::http_response& resp, const std::string& rpc_command); +template atomic_dex::mm2::disable_coin_answer atomic_dex::mm2::mm2_client::rpc_process_answer(const web::http::http_response& resp, const std::string& rpc_command); \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/mm2.client.hpp b/src/core/atomicdex/api/mm2/mm2.client.hpp index fb86964b2f..22f9a94c89 100644 --- a/src/core/atomicdex/api/mm2/mm2.client.hpp +++ b/src/core/atomicdex/api/mm2/mm2.client.hpp @@ -12,7 +12,7 @@ #include "rpc.recover.funds.hpp" #include "rpc.hpp" -namespace atomic_dex +namespace atomic_dex::mm2 { class ENTT_API mm2_client { @@ -28,8 +28,10 @@ namespace atomic_dex //! API pplx::task async_rpc_batch_standalone(nlohmann::json batch_array); - template - void process_rpc_async(const std::function& on_rpc_processed); + template + void process_rpc_async(const std::function& on_rpc_processed); + template + void process_rpc_async(typename Rpc::expected_request_type request, const std::function& on_rpc_processed); //! Synced template diff --git a/src/core/atomicdex/api/mm2/mm2.cpp b/src/core/atomicdex/api/mm2/mm2.cpp index c35bee2154..d889bd07d1 100644 --- a/src/core/atomicdex/api/mm2/mm2.cpp +++ b/src/core/atomicdex/api/mm2/mm2.cpp @@ -23,9 +23,11 @@ #include "atomicdex/api/mm2/rpc.convertaddress.hpp" #include "atomicdex/api/mm2/rpc.min.volume.hpp" #include "atomicdex/api/mm2/rpc.orderbook.hpp" +#include "atomicdex/api/mm2/rpc.recover.funds.hpp" #include "atomicdex/api/mm2/rpc.trade.preimage.hpp" #include "atomicdex/api/mm2/rpc.validate.address.hpp" #include "atomicdex/api/mm2/rpc.withdraw.hpp" +#include "atomicdex/api/mm2/rpc2.withdraw_status.hpp" #include "atomicdex/api/mm2/rpc.recover.funds.hpp" #include "atomicdex/pages/qt.settings.page.hpp" #include "atomicdex/services/price/global.provider.hpp" @@ -167,7 +169,7 @@ namespace } } // namespace -namespace mm2::api +namespace atomic_dex::mm2 { void to_json(nlohmann::json& j, const send_raw_transaction_request& cfg) @@ -593,7 +595,7 @@ namespace mm2::api nlohmann::json json_data = template_request("version"); try { - auto client = std::make_unique(FROM_STD_STR("http://127.0.0.1:7783")); + auto client = std::make_unique(FROM_STD_STR(atomic_dex::g_dex_rpc)); web::http::http_request request; request.set_method(web::http::methods::POST); request.set_body(json_data.dump()); @@ -706,24 +708,25 @@ namespace mm2::api return answer; } - template mm2::api::withdraw_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::my_orders_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::orderbook_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::trade_fee_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::max_taker_vol_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::min_volume_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::my_recent_swaps_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::active_swaps_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::show_priv_key_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::trade_preimage_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::best_orders_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::validate_address_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::convert_address_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); - template mm2::api::recover_funds_of_swap_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::withdraw_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::withdraw_status_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::my_orders_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::orderbook_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::trade_fee_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::max_taker_vol_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::min_volume_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::my_recent_swaps_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::active_swaps_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::show_priv_key_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::trade_preimage_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::best_orders_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::validate_address_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::convert_address_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); + template mm2::recover_funds_of_swap_answer rpc_process_answer_batch(nlohmann::json& json_answer, const std::string& rpc_command); void set_system_manager(ag::ecs::system_manager& system_manager) { g_system_mgr = std::addressof(system_manager); } -} // namespace mm2::api +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/mm2.hpp b/src/core/atomicdex/api/mm2/mm2.hpp index 57b15785fd..ae8c9f170d 100644 --- a/src/core/atomicdex/api/mm2/mm2.hpp +++ b/src/core/atomicdex/api/mm2/mm2.hpp @@ -32,9 +32,8 @@ namespace ag = antara::gaming; -namespace mm2::api +namespace atomic_dex::mm2 { - inline constexpr const char* g_endpoint = "http://127.0.0.1:7783"; inline constexpr const char* g_etherscan_proxy_endpoint = "https://komodo.live:3334"; inline std::unique_ptr g_etherscan_proxy_http_client{ std::make_unique(FROM_STD_STR(g_etherscan_proxy_endpoint))}; @@ -239,16 +238,16 @@ namespace mm2::api void set_rpc_password(std::string rpc_password) ; const std::string& get_rpc_password() ; void set_system_manager(ag::ecs::system_manager& system_manager); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_my_orders_answer = ::mm2::api::my_orders_answer; - using t_broadcast_request = ::mm2::api::send_raw_transaction_request; - using t_my_recent_swaps_answer = ::mm2::api::my_recent_swaps_answer; - using t_my_recent_swaps_request = ::mm2::api::my_recent_swaps_request; - using t_active_swaps_request = ::mm2::api::active_swaps_request; - using t_active_swaps_answer = ::mm2::api::active_swaps_answer; - using t_get_trade_fee_request = ::mm2::api::trade_fee_request; - using t_get_trade_fee_answer = ::mm2::api::trade_fee_answer; + using t_my_orders_answer = mm2::my_orders_answer; + using t_broadcast_request = mm2::send_raw_transaction_request; + using t_my_recent_swaps_answer = mm2::my_recent_swaps_answer; + using t_my_recent_swaps_request = mm2::my_recent_swaps_request; + using t_active_swaps_request = mm2::active_swaps_request; + using t_active_swaps_answer = mm2::active_swaps_answer; + using t_get_trade_fee_request = mm2::trade_fee_request; + using t_get_trade_fee_answer = mm2::trade_fee_answer; } // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/my_tx_history_rpc.cpp b/src/core/atomicdex/api/mm2/my_tx_history_rpc.cpp new file mode 100644 index 0000000000..6a0c86ef95 --- /dev/null +++ b/src/core/atomicdex/api/mm2/my_tx_history_rpc.cpp @@ -0,0 +1,31 @@ +// atomicdex-desktop +// Author(s): syl + +#include + +#include "my_tx_history_rpc.hpp" + +namespace atomic_dex::mm2 +{ + void to_json(nlohmann::json& j, const my_tx_history_request_rpc& in) + { + j["coin"] = in.coin; + j["limit"] = in.limit; + j["paging_options"] = nlohmann::json::object(); + if (in.paging_options.from_id) + { + j["paging_options"]["FromId"] = *in.paging_options.from_id; + } + if (in.paging_options.page_number) + { + j["paging_options"]["PageNumber"] = *in.paging_options.page_number; + } + } + + void from_json(const nlohmann::json& json, my_tx_history_result_rpc& out) + { + out.coin = json["coin"]; + out.current_block = json["current_block"]; + out.transactions = json["transactions"].get>(); + } +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/my_tx_history_rpc.hpp b/src/core/atomicdex/api/mm2/my_tx_history_rpc.hpp new file mode 100644 index 0000000000..ea308b14b6 --- /dev/null +++ b/src/core/atomicdex/api/mm2/my_tx_history_rpc.hpp @@ -0,0 +1,46 @@ +// atomicdex-desktop +// Author(s): syl + +#include + +#include "paging_options.hpp" +#include "transaction.data.hpp" +#include "rpc.hpp" + +#pragma once + +namespace atomic_dex::mm2 +{ + struct my_tx_history_rpc + { + static constexpr auto endpoint = "my_tx_history"; + static constexpr bool is_v2 = true; + + struct expected_request_type + { + std::string coin; + int limit; + paging_options paging_options; + }; + + struct expected_result_type + { + std::string coin; + std::size_t current_block; + std::vector transactions; + }; + + using expected_error_type = rpc_basic_error_type; + + expected_request_type request; + std::optional result; + std::optional error; + }; + + using my_tx_history_request_rpc = my_tx_history_rpc::expected_request_type; + using my_tx_history_result_rpc = my_tx_history_rpc::expected_result_type; + using my_tx_history_error_rpc = my_tx_history_rpc::expected_error_type; + + void to_json(nlohmann::json& j, const my_tx_history_request_rpc& in); + void from_json(const nlohmann::json& json, my_tx_history_result_rpc& out); +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/my_tx_history_v1_rpc.hpp b/src/core/atomicdex/api/mm2/my_tx_history_v1_rpc.hpp new file mode 100644 index 0000000000..8b85d28cc5 --- /dev/null +++ b/src/core/atomicdex/api/mm2/my_tx_history_v1_rpc.hpp @@ -0,0 +1,30 @@ +// atomicdex-desktop +// Author(s): syl + +#pragma once + +#include "rpc.hpp" +#include "rpc.tx.history.hpp" + +namespace atomic_dex::mm2 +{ + struct my_tx_history_v1_rpc + { + static constexpr auto endpoint = "my_tx_history"; + static constexpr bool is_v2 = false; + + using expected_request_type = tx_history_request; + + using expected_result_type = tx_history_answer_success; + + using expected_error_type = rpc_basic_error_type; + + expected_request_type request; + std::optional result; + std::optional error; + }; + + using my_tx_history_request_v1_rpc = my_tx_history_v1_rpc::expected_request_type; + using my_tx_history_result_v1_rpc = my_tx_history_v1_rpc::expected_result_type; + using my_tx_history_error_v1_rpc = my_tx_history_v1_rpc::expected_error_type; +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/orderbook.order.contents.cpp b/src/core/atomicdex/api/mm2/orderbook.order.contents.cpp index 2e0cb2f910..d33c7aeed3 100644 --- a/src/core/atomicdex/api/mm2/orderbook.order.contents.cpp +++ b/src/core/atomicdex/api/mm2/orderbook.order.contents.cpp @@ -21,54 +21,51 @@ //! Project Headers #include "atomicdex/api/mm2/orderbook.order.contents.hpp" #include "atomicdex/utilities/global.utilities.hpp" +#include "atomicdex/pages/qt.trading.page.hpp" +#include "atomicdex/services/mm2/mm2.service.hpp" +#include "atomicdex/services/price/orderbook.scanner.service.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void from_json(const nlohmann::json& j, order_contents& contents) { - //SPDLOG_INFO("contents: {}", j.dump(4)); - j.at("coin").get_to(contents.coin); - j.at("address").get_to(contents.address); - j.at("price").get_to(contents.price); - // contents.price = t_float_50(contents.price).str(8, std::ios_base::fixed); - j.at("price_fraction").at("numer").get_to(contents.price_fraction_numer); - j.at("price_fraction").at("denom").get_to(contents.price_fraction_denom); - j.at("max_volume_fraction").at("numer").get_to(contents.max_volume_fraction_numer); - j.at("max_volume_fraction").at("denom").get_to(contents.max_volume_fraction_denom); - j.at("base_min_volume_fraction").at("numer").get_to(contents.base_min_volume_numer); - j.at("base_min_volume_fraction").at("denom").get_to(contents.base_min_volume_denom); - j.at("base_max_volume_fraction").at("numer").get_to(contents.base_max_volume_numer); - j.at("base_max_volume_fraction").at("denom").get_to(contents.base_max_volume_denom); - j.at("rel_min_volume_fraction").at("numer").get_to(contents.rel_min_volume_numer); - j.at("rel_min_volume_fraction").at("denom").get_to(contents.rel_min_volume_denom); - j.at("rel_max_volume_fraction").at("numer").get_to(contents.rel_max_volume_numer); - j.at("rel_max_volume_fraction").at("denom").get_to(contents.rel_max_volume_denom); + j.at("coin").get_to(contents.coin); + if (j.at("address").contains("address_data")) + { + j.at("address").at("address_data").get_to(contents.address); + } + else + { + contents.address = "Shielded"; + } - j.at("maxvolume").get_to(contents.maxvolume); j.at("pubkey").get_to(contents.pubkey); - j.at("age").get_to(contents.age); - j.at("zcredits").get_to(contents.zcredits); j.at("uuid").get_to(contents.uuid); j.at("is_mine").get_to(contents.is_mine); - if (j.contains("min_volume")) - { - contents.min_volume = j.at("min_volume").get(); - } - if (contents.price.find('.') != std::string::npos) - { - boost::trim_right_if(contents.price, boost::is_any_of("0")); - contents.price = contents.price; - } - j.at("base_max_volume").get_to(contents.base_max_volume); - j.at("base_min_volume").get_to(contents.base_min_volume); - j.at("rel_max_volume").get_to(contents.rel_max_volume); - j.at("rel_min_volume").get_to(contents.rel_min_volume); - contents.maxvolume = atomic_dex::utils::adjust_precision(contents.maxvolume); - t_float_50 total_f = safe_float(contents.price) * safe_float(contents.maxvolume); - contents.total = atomic_dex::utils::adjust_precision(total_f.str()); + j.at("price").at("decimal").get_to(contents.price); + j.at("price").at("fraction").at("numer").get_to(contents.price_fraction_numer); + j.at("price").at("fraction").at("denom").get_to(contents.price_fraction_denom); + + j.at("base_min_volume").at("decimal").get_to(contents.base_min_volume); + j.at("base_min_volume").at("fraction").at("numer").get_to(contents.base_min_volume_numer); + j.at("base_min_volume").at("fraction").at("denom").get_to(contents.base_min_volume_denom); + j.at("base_max_volume").at("decimal").get_to(contents.base_max_volume); + j.at("base_max_volume").at("fraction").at("numer").get_to(contents.base_max_volume_numer); + j.at("base_max_volume").at("fraction").at("denom").get_to(contents.base_max_volume_denom); + + j.at("rel_min_volume").at("decimal").get_to(contents.rel_min_volume); + j.at("rel_min_volume").at("fraction").at("numer").get_to(contents.rel_min_volume_numer); + j.at("rel_min_volume").at("fraction").at("denom").get_to(contents.rel_min_volume_denom); + j.at("rel_max_volume").at("decimal").get_to(contents.rel_max_volume); + j.at("rel_max_volume").at("fraction").at("numer").get_to(contents.rel_max_volume_numer); + j.at("rel_max_volume").at("fraction").at("denom").get_to(contents.rel_max_volume_denom); + + // Not in v2 RPC + // j.at("age").get_to(contents.age); + // j.at("zcredits").get_to(contents.zcredits); } std::string @@ -86,4 +83,4 @@ namespace mm2::api ss << "rel_min_volume: " << rel_min_volume << " "; return ss.str(); } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/orderbook.order.contents.hpp b/src/core/atomicdex/api/mm2/orderbook.order.contents.hpp index a97609de26..7fd2bd47a2 100644 --- a/src/core/atomicdex/api/mm2/orderbook.order.contents.hpp +++ b/src/core/atomicdex/api/mm2/orderbook.order.contents.hpp @@ -21,7 +21,7 @@ //! Deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct order_contents { @@ -30,9 +30,12 @@ namespace mm2::api std::string price; std::string price_fraction_numer; std::string price_fraction_denom; + std::string min_volume; + std::string min_volume_fraction_numer; + std::string min_volume_fraction_denom; + std::string maxvolume; std::string max_volume_fraction_numer; std::string max_volume_fraction_denom; - std::string maxvolume; std::string base_min_volume; std::string base_min_volume_denom; std::string base_min_volume_numer; @@ -46,23 +49,22 @@ namespace mm2::api std::string rel_max_volume_denom; std::string rel_max_volume_numer; std::string pubkey; - std::size_t age; - std::size_t zcredits; + //std::size_t age; + //std::size_t zcredits; std::string total; std::string uuid; std::string depth_percent; bool is_mine; - std::string min_volume{"0"}; std::optional rel_coin{std::nullopt}; std::string to_string() const noexcept; }; void from_json(const nlohmann::json& j, order_contents& contents); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_order_contents = ::mm2::api::order_contents; + using t_order_contents = mm2::order_contents; using t_orders_contents = std::vector; -} // namespace atomic_dex \ No newline at end of file +} // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/paging_options.cpp b/src/core/atomicdex/api/mm2/paging_options.cpp new file mode 100644 index 0000000000..a0f95fc001 --- /dev/null +++ b/src/core/atomicdex/api/mm2/paging_options.cpp @@ -0,0 +1,21 @@ +// atomicdex-desktop +// Author(s): syl + +#include + +#include "paging_options.hpp" + +namespace atomic_dex::mm2 +{ + void to_json(nlohmann::json& j, const paging_options& in) + { + if (in.from_id) + { + j["FromId"] = *in.from_id; + } + if (in.page_number) + { + j["PageNumber"] = *in.page_number; + } + } +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/paging_options.hpp b/src/core/atomicdex/api/mm2/paging_options.hpp new file mode 100644 index 0000000000..df3ba02200 --- /dev/null +++ b/src/core/atomicdex/api/mm2/paging_options.hpp @@ -0,0 +1,19 @@ +// atomicdex-desktop +// Author(s): syl + +#pragma once + +#include + +#include + +namespace atomic_dex::mm2 +{ + struct paging_options + { + std::optional from_id; + std::optional page_number; + }; + + void to_json(nlohmann::json& j, const paging_options& in); +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.balance.cpp b/src/core/atomicdex/api/mm2/rpc.balance.cpp index 47cb997823..02e85451e4 100644 --- a/src/core/atomicdex/api/mm2/rpc.balance.cpp +++ b/src/core/atomicdex/api/mm2/rpc.balance.cpp @@ -21,7 +21,7 @@ #include "atomicdex/api/mm2/rpc.balance.hpp" #include "atomicdex/utilities/global.utilities.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void to_json(nlohmann::json& j, const balance_request& cfg) @@ -36,9 +36,5 @@ namespace mm2::api j.at("balance").get_to(cfg.balance); cfg.balance = atomic_dex::utils::adjust_precision(cfg.balance); j.at("coin").get_to(cfg.coin); - if (cfg.coin == "BCH") - { - cfg.address = cfg.address.substr(sizeof("bitcoincash")); - } } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.balance.hpp b/src/core/atomicdex/api/mm2/rpc.balance.hpp index f4268b5f25..10c403fc12 100644 --- a/src/core/atomicdex/api/mm2/rpc.balance.hpp +++ b/src/core/atomicdex/api/mm2/rpc.balance.hpp @@ -18,7 +18,7 @@ #include -namespace mm2::api +namespace atomic_dex::mm2 { struct balance_request { @@ -37,10 +37,10 @@ namespace mm2::api void to_json(nlohmann::json& j, const balance_request& cfg); void from_json(const nlohmann::json& j, balance_answer& cfg); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_balance_request = ::mm2::api::balance_request; - using t_balance_answer = ::mm2::api::balance_answer; + using t_balance_request = mm2::balance_request; + using t_balance_answer = mm2::balance_answer; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.best.orders.cpp b/src/core/atomicdex/api/mm2/rpc.best.orders.cpp index cab39abea5..05c0027bb6 100644 --- a/src/core/atomicdex/api/mm2/rpc.best.orders.cpp +++ b/src/core/atomicdex/api/mm2/rpc.best.orders.cpp @@ -26,14 +26,16 @@ #include "atomicdex/api/mm2/rpc.best.orders.hpp" //! Implementation RPC [best_orders] -namespace mm2::api +namespace atomic_dex::mm2 { void to_json(nlohmann::json& j, const best_orders_request& req) { - j["coin"] = req.coin; - j["action"] = req.action; - j["volume"] = req.volume; + SPDLOG_INFO("getting bestorders data..."); + j["params"]["coin"] = req.coin; + j["params"]["action"] = req.action; + j["params"]["request_by"]["type"] = "volume"; + j["params"]["request_by"]["value"] = req.volume; } void @@ -45,15 +47,15 @@ namespace mm2::api } else { - for (auto&& [key, value]: j.items()) + for (auto&& [key, value]: j["orders"].items()) { - // SPDLOG_INFO("{} best orders size: {}", key, value.size()); //bool hit = false; std::unordered_set uuid_visited; for (auto&& cur_order: value) { order_contents contents; contents.rel_coin = key; + from_json(cur_order, contents); if (uuid_visited.emplace(contents.uuid).second) { @@ -61,15 +63,9 @@ namespace mm2::api } else { - //hit = true; SPDLOG_WARN("Order with uuid: {} already added - skipping", contents.uuid); } } - /*if (hit) - { - SPDLOG_WARN("mm2 answer duplicated: {}", value.dump()); - hit = false; - }*/ } } } @@ -80,4 +76,4 @@ namespace mm2::api extract_rpc_json_answer(j, answer); } -} // namespace mm2::api +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc.best.orders.hpp b/src/core/atomicdex/api/mm2/rpc.best.orders.hpp index c062e68e1a..a89e0729ee 100644 --- a/src/core/atomicdex/api/mm2/rpc.best.orders.hpp +++ b/src/core/atomicdex/api/mm2/rpc.best.orders.hpp @@ -25,7 +25,7 @@ //! Project Headers #include "atomicdex/api/mm2/orderbook.order.contents.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { struct best_orders_request { @@ -52,11 +52,11 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, best_orders_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_best_orders_request = ::mm2::api::best_orders_request; - using t_best_orders_answer = ::mm2::api::best_orders_answer; - using t_best_orders_answer_success = ::mm2::api::best_orders_answer_success; + using t_best_orders_request = mm2::best_orders_request; + using t_best_orders_answer = mm2::best_orders_answer; + using t_best_orders_answer_success = mm2::best_orders_answer_success; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.buy.cpp b/src/core/atomicdex/api/mm2/rpc.buy.cpp index 4813ca1e75..09002a24f6 100644 --- a/src/core/atomicdex/api/mm2/rpc.buy.cpp +++ b/src/core/atomicdex/api/mm2/rpc.buy.cpp @@ -22,7 +22,7 @@ #include "atomicdex/api/mm2/generics.hpp" #include "atomicdex/api/mm2/rpc.buy.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void from_json(const nlohmann::json& j, buy_answer_success& contents) @@ -76,4 +76,4 @@ namespace mm2::api SPDLOG_INFO("The order is not picked from orderbook we create it from volume = {}, price = {}", j.at("volume").dump(4), request.price); } } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.buy.hpp b/src/core/atomicdex/api/mm2/rpc.buy.hpp index 0063c6315b..7475510754 100644 --- a/src/core/atomicdex/api/mm2/rpc.buy.hpp +++ b/src/core/atomicdex/api/mm2/rpc.buy.hpp @@ -26,7 +26,7 @@ //! Project Header #include -namespace mm2::api +namespace atomic_dex::mm2 { struct buy_request { @@ -64,11 +64,11 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, buy_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_buy_request = ::mm2::api::buy_request; - using t_buy_answer = ::mm2::api::buy_answer; - using t_buy_answer_success = ::mm2::api::buy_answer_success; + using t_buy_request = mm2::buy_request; + using t_buy_answer = mm2::buy_answer; + using t_buy_answer_success = mm2::buy_answer_success; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.convertaddress.cpp b/src/core/atomicdex/api/mm2/rpc.convertaddress.cpp index 32f3f8fbf3..02dd0b5b71 100644 --- a/src/core/atomicdex/api/mm2/rpc.convertaddress.cpp +++ b/src/core/atomicdex/api/mm2/rpc.convertaddress.cpp @@ -9,10 +9,10 @@ #include "atomicdex/api/mm2/rpc.convertaddress.hpp" #include "atomicdex/api/mm2/generics.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void - to_json(nlohmann::json& j, const mm2::api::convert_address_request& req) + to_json(nlohmann::json& j, const convert_address_request& req) { j["coin"] = req.coin; j["from"] = req.from; @@ -30,4 +30,4 @@ namespace mm2::api { extract_rpc_json_answer(j, answer); } -} // namespace mm2::api +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc.convertaddress.hpp b/src/core/atomicdex/api/mm2/rpc.convertaddress.hpp index 31e599d4bf..02f1553000 100644 --- a/src/core/atomicdex/api/mm2/rpc.convertaddress.hpp +++ b/src/core/atomicdex/api/mm2/rpc.convertaddress.hpp @@ -6,7 +6,7 @@ //! Deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct convert_address_request { @@ -33,11 +33,11 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, convert_address_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_convert_address_request = ::mm2::api::convert_address_request; - using t_convert_address_answer = ::mm2::api::convert_address_answer; - using t_convert_address_answer_success = ::mm2::api::convert_address_answer_success; + using t_convert_address_request = mm2::convert_address_request; + using t_convert_address_answer = mm2::convert_address_answer; + using t_convert_address_answer_success = mm2::convert_address_answer_success; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.cpp b/src/core/atomicdex/api/mm2/rpc.cpp new file mode 100644 index 0000000000..af7f8abae3 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc.cpp @@ -0,0 +1,15 @@ +#include + +#include "rpc.hpp" + +namespace atomic_dex::mm2 +{ + void from_json(const nlohmann::json& j, rpc_basic_error_type& in) + { + j.at("error").get_to(in.error); + j.at("error_path").get_to(in.error_path); + j.at("error_trace").get_to(in.error_trace); + j.at("error_type").get_to(in.error_type); + j.at("error_data").get_to(in.error_data); + } +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.disable.cpp b/src/core/atomicdex/api/mm2/rpc.disable.cpp index 7e193c196f..2317bcfb77 100644 --- a/src/core/atomicdex/api/mm2/rpc.disable.cpp +++ b/src/core/atomicdex/api/mm2/rpc.disable.cpp @@ -8,7 +8,7 @@ #include "atomicdex/api/mm2/generics.hpp" #include "atomicdex/api/mm2/rpc.disable.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { //! Serialization void @@ -29,4 +29,4 @@ namespace mm2::api { extract_rpc_json_answer(j, resp); } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.disable.hpp b/src/core/atomicdex/api/mm2/rpc.disable.hpp index a845f71b09..10159e9b77 100644 --- a/src/core/atomicdex/api/mm2/rpc.disable.hpp +++ b/src/core/atomicdex/api/mm2/rpc.disable.hpp @@ -6,7 +6,7 @@ //! JSON FWD #include -namespace mm2::api +namespace atomic_dex::mm2 { struct disable_coin_request { @@ -31,10 +31,10 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, disable_coin_answer& resp); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_disable_coin_request = ::mm2::api::disable_coin_request; - using t_disable_coin_answer = ::mm2::api::disable_coin_answer; -} \ No newline at end of file + using t_disable_coin_request = mm2::disable_coin_request; + using t_disable_coin_answer = mm2::disable_coin_answer; +} diff --git a/src/core/atomicdex/api/mm2/rpc.electrum.cpp b/src/core/atomicdex/api/mm2/rpc.electrum.cpp index 86d90c695d..dfea39b95b 100644 --- a/src/core/atomicdex/api/mm2/rpc.electrum.cpp +++ b/src/core/atomicdex/api/mm2/rpc.electrum.cpp @@ -21,24 +21,39 @@ #include "atomicdex/api/mm2/rpc.electrum.hpp" //! Implementation RPC [electrum] -namespace mm2::api +namespace atomic_dex::mm2 { //! Serialization void to_json(nlohmann::json& j, const electrum_request& cfg) { j["coin"] = cfg.coin_name; - j["servers"] = cfg.servers; j["tx_history"] = cfg.with_tx_history; + + if (!cfg.servers.empty()) + { + j["servers"] = cfg.servers; + } + if (cfg.coin_type == CoinType::QRC20) { j["swap_contract_address"] = cfg.is_testnet ? cfg.testnet_qrc_swap_contract_address : cfg.mainnet_qrc_swap_contract_address; j["fallback_swap_contract"] = cfg.is_testnet ? cfg.testnet_fallback_qrc_swap_contract_address : cfg.mainnet_fallback_qrc_swap_contract_address; } - if (cfg.address_format.has_value()) { + + if (cfg.bchd_urls.has_value()) { + j["bchd_urls"] = cfg.bchd_urls.value(); + j["allow_slp_unsafe_conf"] = cfg.allow_slp_unsafe_conf.value_or(false); + } + + if (cfg.address_format.has_value()) + { j["address_format"] = cfg.address_format.value(); } - //SPDLOG_INFO("electrum: {}", j.dump()); + if (cfg.merge_params.has_value()) + { + j["utxo_merge_params"] = cfg.merge_params.value(); + } } //! Deserialization @@ -49,4 +64,4 @@ namespace mm2::api j.at("balance").get_to(cfg.balance); j.at("result").get_to(cfg.result); } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.electrum.hpp b/src/core/atomicdex/api/mm2/rpc.electrum.hpp index 4c206a9d91..1960e56ec3 100644 --- a/src/core/atomicdex/api/mm2/rpc.electrum.hpp +++ b/src/core/atomicdex/api/mm2/rpc.electrum.hpp @@ -23,20 +23,23 @@ #include "atomicdex/config/electrum.cfg.hpp" #include "atomicdex/constants/qt.coins.enums.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { struct electrum_request { - std::string coin_name; - std::vector servers; - CoinType coin_type; - bool is_testnet{false}; - bool with_tx_history{true}; - const std::string testnet_qrc_swap_contract_address{"0xba8b71f3544b93e2f681f996da519a98ace0107a"}; - const std::string testnet_fallback_qrc_swap_contract_address{testnet_qrc_swap_contract_address}; - const std::string mainnet_qrc_swap_contract_address{"0x2f754733acd6d753731c00fee32cb484551cc15d"}; - const std::string mainnet_fallback_qrc_swap_contract_address{mainnet_qrc_swap_contract_address}; - std::optional address_format; + std::string coin_name; + std::vector servers; + CoinType coin_type; + bool is_testnet{false}; + bool with_tx_history{true}; + const std::string testnet_qrc_swap_contract_address{"0xba8b71f3544b93e2f681f996da519a98ace0107a"}; + const std::string testnet_fallback_qrc_swap_contract_address{testnet_qrc_swap_contract_address}; + const std::string mainnet_qrc_swap_contract_address{"0x2f754733acd6d753731c00fee32cb484551cc15d"}; + const std::string mainnet_fallback_qrc_swap_contract_address{mainnet_qrc_swap_contract_address}; + std::optional address_format; + std::optional merge_params; + std::optional> bchd_urls; + std::optional allow_slp_unsafe_conf; }; struct electrum_answer @@ -51,10 +54,10 @@ namespace mm2::api void to_json(nlohmann::json& j, const electrum_request& cfg); void from_json(const nlohmann::json& j, electrum_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_electrum_request = ::mm2::api::electrum_request; - using t_electrum_answer = ::mm2::api::electrum_answer; + using t_electrum_request = mm2::electrum_request; + using t_electrum_answer = mm2::electrum_answer; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.enable.cpp b/src/core/atomicdex/api/mm2/rpc.enable.cpp index 73d56ead26..0722bb9c23 100644 --- a/src/core/atomicdex/api/mm2/rpc.enable.cpp +++ b/src/core/atomicdex/api/mm2/rpc.enable.cpp @@ -21,7 +21,7 @@ #include "atomicdex/api/mm2/rpc.enable.hpp" //! Implementation RPC [enable] -namespace mm2::api +namespace atomic_dex::mm2 { //! Serialization void @@ -51,17 +51,15 @@ namespace mm2::api case CoinType::Optimism: { j["urls"] = cfg.urls; - j["swap_contract_address"] = cfg.is_testnet ? cfg.optimism_erc_testnet_swap_contract_address : cfg.optimism_erc_swap_contract_address; - j["fallback_swap_contract"] = - cfg.is_testnet ? cfg.optimism_erc_testnet_fallback_swap_contract_address : cfg.optimism_erc_fallback_swap_contract_address; + j["swap_contract_address"] = cfg.optimism_erc_swap_contract_address; + j["fallback_swap_contract"] = cfg.optimism_erc_fallback_swap_contract_address; break; } case CoinType::Arbitrum: { j["urls"] = cfg.urls; - j["swap_contract_address"] = cfg.is_testnet ? cfg.arbitrum_erc_testnet_swap_contract_address : cfg.arbitrum_erc_swap_contract_address; - j["fallback_swap_contract"] = - cfg.is_testnet ? cfg.arbitrum_erc_testnet_fallback_swap_contract_address : cfg.arbitrum_erc_fallback_swap_contract_address; + j["swap_contract_address"] = cfg.arbitrum_erc_swap_contract_address; + j["fallback_swap_contract"] = cfg.arbitrum_erc_fallback_swap_contract_address; break; } case CoinType::BEP20: @@ -164,4 +162,4 @@ namespace mm2::api j.at("result").get_to(cfg.result); // SPDLOG_INFO("balance for {} is {}", cfg.address, cfg.balance); } -} // namespace mm2::api +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc.enable.hpp b/src/core/atomicdex/api/mm2/rpc.enable.hpp index a4616317a1..2b7d3274e3 100644 --- a/src/core/atomicdex/api/mm2/rpc.enable.hpp +++ b/src/core/atomicdex/api/mm2/rpc.enable.hpp @@ -22,7 +22,7 @@ //! Project Headers #include "atomicdex/constants/qt.coins.enums.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { //! Only for erc 20 struct enable_request @@ -77,12 +77,8 @@ namespace mm2::api const std::string matic_erc_testnet_fallback_swap_contract_address{"0x73c1Dd989218c3A154C71Fc08Eb55A24Bd2B3A10"}; const std::string optimism_erc_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; const std::string optimism_erc_fallback_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; - const std::string optimism_erc_testnet_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; - const std::string optimism_erc_testnet_fallback_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; const std::string arbitrum_erc_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; const std::string arbitrum_erc_fallback_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; - const std::string arbitrum_erc_testnet_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; - const std::string arbitrum_erc_testnet_fallback_swap_contract_address{"0x9130b257d37a52e52f21054c4da3450c72f595ce"}; const std::string sbch_erc_swap_contract_address{"0x25bF2AAB8749AD2e4360b3e0B738f3Cd700C4D68"}; const std::string sbch_erc_fallback_swap_contract_address{"0x25bF2AAB8749AD2e4360b3e0B738f3Cd700C4D68"}; const std::string sbch_erc_testnet_swap_contract_address{"0x25bF2AAB8749AD2e4360b3e0B738f3Cd700C4D68"}; @@ -115,10 +111,10 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, const enable_answer& cfg); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_enable_request = ::mm2::api::enable_request; - using t_enable_answer = ::mm2::api::enable_answer; + using t_enable_request = mm2::enable_request; + using t_enable_answer = mm2::enable_answer; } // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/rpc.hpp b/src/core/atomicdex/api/mm2/rpc.hpp index 517420762b..4573ed74fb 100644 --- a/src/core/atomicdex/api/mm2/rpc.hpp +++ b/src/core/atomicdex/api/mm2/rpc.hpp @@ -16,17 +16,31 @@ #pragma once -// Std Headers #include -// Project Headers +#include //> nlohmann::json + #include "../api.call.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { template concept rpc = requires(Rpc rpc) { - atomic_dex::api_call && Rpc::is_v2 && std::is_same_v; + atomic_dex::api_call && std::is_same_v; + rpc.request; + rpc.result; + rpc.error; }; + + struct rpc_basic_error_type + { + std::string error; + std::string error_path; + std::string error_trace; + std::string error_type; + std::string error_data; + }; + + void from_json(const nlohmann::json& j, rpc_basic_error_type& in); } diff --git a/src/core/atomicdex/api/mm2/rpc.max.taker.vol.cpp b/src/core/atomicdex/api/mm2/rpc.max.taker.vol.cpp index 554fafc374..c5f666a061 100644 --- a/src/core/atomicdex/api/mm2/rpc.max.taker.vol.cpp +++ b/src/core/atomicdex/api/mm2/rpc.max.taker.vol.cpp @@ -23,7 +23,7 @@ #include "atomicdex/utilities/global.utilities.hpp" //! Implementation RPC [max_taker_vol] -namespace mm2::api +namespace atomic_dex::mm2 { //! Serialization void @@ -42,7 +42,8 @@ namespace mm2::api { j.at("denom").get_to(cfg.denom); j.at("numer").get_to(cfg.numer); - //SPDLOG_INFO("max: {}", j.dump(4)); + // SPDLOG_INFO("max: {}", j.dump(4)); + t_rational rat(boost::multiprecision::cpp_int(cfg.numer), boost::multiprecision::cpp_int(cfg.denom)); t_float_50 res = rat.convert_to(); cfg.decimal = atomic_dex::utils::extract_large_float(res.str(50)); @@ -63,4 +64,4 @@ namespace mm2::api answer.result.value().coin = j.at("coin").get(); } } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.max.taker.vol.hpp b/src/core/atomicdex/api/mm2/rpc.max.taker.vol.hpp index cb90104a9a..1f59d4a99f 100644 --- a/src/core/atomicdex/api/mm2/rpc.max.taker.vol.hpp +++ b/src/core/atomicdex/api/mm2/rpc.max.taker.vol.hpp @@ -23,7 +23,7 @@ //! Deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct max_taker_vol_request { @@ -52,11 +52,11 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, max_taker_vol_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_max_taker_vol_request = ::mm2::api::max_taker_vol_request; - using t_max_taker_vol_answer = ::mm2::api::max_taker_vol_answer; - using t_max_taker_vol_answer_success = ::mm2::api::max_taker_vol_answer_success; + using t_max_taker_vol_request = mm2::max_taker_vol_request; + using t_max_taker_vol_answer = mm2::max_taker_vol_answer; + using t_max_taker_vol_answer_success = mm2::max_taker_vol_answer_success; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.min.volume.cpp b/src/core/atomicdex/api/mm2/rpc.min.volume.cpp index 25695efdf3..392813a3c8 100644 --- a/src/core/atomicdex/api/mm2/rpc.min.volume.cpp +++ b/src/core/atomicdex/api/mm2/rpc.min.volume.cpp @@ -5,7 +5,7 @@ #include "atomicdex/api/mm2/generics.hpp" #include "atomicdex/api/mm2/rpc.min.volume.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void to_json(nlohmann::json& j, const min_volume_request& cfg) @@ -27,4 +27,4 @@ namespace mm2::api { extract_rpc_json_answer(j, answer); } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.min.volume.hpp b/src/core/atomicdex/api/mm2/rpc.min.volume.hpp index d832f19910..3909384cd5 100644 --- a/src/core/atomicdex/api/mm2/rpc.min.volume.hpp +++ b/src/core/atomicdex/api/mm2/rpc.min.volume.hpp @@ -13,7 +13,7 @@ #include "atomicdex/api/mm2/rpc.min.volume.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { struct min_volume_request { @@ -39,11 +39,11 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, min_volume_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_min_volume_request = ::mm2::api::min_volume_request; - using t_min_volume_answer = ::mm2::api::min_volume_answer; - using t_min_volume_answer_success = ::mm2::api::min_volume_answer_success; + using t_min_volume_request = mm2::min_volume_request; + using t_min_volume_answer = mm2::min_volume_answer; + using t_min_volume_answer_success = mm2::min_volume_answer_success; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.orderbook.cpp b/src/core/atomicdex/api/mm2/rpc.orderbook.cpp index 4c2f62bb61..7dc053145c 100644 --- a/src/core/atomicdex/api/mm2/rpc.orderbook.cpp +++ b/src/core/atomicdex/api/mm2/rpc.orderbook.cpp @@ -21,60 +21,88 @@ #include "atomicdex/api/mm2/rpc.orderbook.hpp" #include "atomicdex/utilities/global.utilities.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void from_json(const nlohmann::json& j, orderbook_answer& answer) { using namespace date; + // SPDLOG_INFO("got orderbook data..."); - j.at("base").get_to(answer.base); - j.at("rel").get_to(answer.rel); - j.at("askdepth").get_to(answer.askdepth); - j.at("biddepth").get_to(answer.biddepth); - j.at("bids").get_to(answer.bids); - j.at("asks").get_to(answer.asks); - j.at("numasks").get_to(answer.numasks); - j.at("numbids").get_to(answer.numbids); - j.at("netid").get_to(answer.netid); - j.at("timestamp").get_to(answer.timestamp); + j.at("result").at("base").get_to(answer.base); + j.at("result").at("rel").get_to(answer.rel); + j.at("result").at("num_asks").get_to(answer.numasks); + j.at("result").at("num_bids").get_to(answer.numbids); + j.at("result").at("net_id").get_to(answer.netid); + j.at("result").at("timestamp").get_to(answer.timestamp); + j.at("result").at("bids").get_to(answer.bids); + j.at("result").at("asks").get_to(answer.asks); answer.human_timestamp = atomic_dex::utils::to_human_date(answer.timestamp, "%Y-%m-%d %I:%M:%S"); t_float_50 result_asks_f(0); - for (auto&& cur_asks: answer.asks) { result_asks_f = result_asks_f + safe_float(cur_asks.maxvolume); } + for (auto&& cur_asks: answer.asks) { + cur_asks.min_volume = cur_asks.base_min_volume; + cur_asks.min_volume_fraction_numer = cur_asks.base_min_volume_numer; + cur_asks.min_volume_fraction_denom = cur_asks.base_min_volume_denom; + cur_asks.maxvolume = cur_asks.base_max_volume; + cur_asks.max_volume_fraction_numer = cur_asks.base_max_volume_numer; + cur_asks.max_volume_fraction_denom = cur_asks.base_max_volume_denom; + if (cur_asks.price.find('.') != std::string::npos) + { + boost::trim_right_if(cur_asks.price, boost::is_any_of("0")); + cur_asks.price = cur_asks.price; + } + cur_asks.maxvolume = atomic_dex::utils::adjust_precision(cur_asks.maxvolume); + t_float_50 total_f = safe_float(cur_asks.price) * safe_float(cur_asks.maxvolume); + cur_asks.total = atomic_dex::utils::adjust_precision(total_f.str()); + result_asks_f = result_asks_f + safe_float(cur_asks.maxvolume); + } answer.asks_total_volume = result_asks_f.str(); t_float_50 result_bids_f(0); for (auto& cur_bids: answer.bids) { - cur_bids.total = cur_bids.maxvolume; - t_float_50 new_volume = safe_float(cur_bids.maxvolume) / safe_float(cur_bids.price); - cur_bids.maxvolume = atomic_dex::utils::adjust_precision(new_volume.str()); - result_bids_f = result_bids_f + safe_float(cur_bids.maxvolume); - } + cur_bids.min_volume = cur_bids.base_min_volume; + cur_bids.min_volume_fraction_numer = cur_bids.base_min_volume_numer; + cur_bids.min_volume_fraction_denom = cur_bids.base_min_volume_denom; + cur_bids.maxvolume = cur_bids.base_max_volume; + cur_bids.max_volume_fraction_numer = cur_bids.base_max_volume_numer; + cur_bids.max_volume_fraction_denom = cur_bids.base_max_volume_denom; + cur_bids.total = cur_bids.maxvolume; + if (cur_bids.price.find('.') != std::string::npos) + { + boost::trim_right_if(cur_bids.price, boost::is_any_of("0")); + cur_bids.price = cur_bids.price; + } + cur_bids.maxvolume = atomic_dex::utils::adjust_precision(cur_bids.maxvolume); + t_float_50 total_f = safe_float(cur_bids.price) * safe_float(cur_bids.maxvolume); + cur_bids.total = atomic_dex::utils::adjust_precision(total_f.str()); + result_bids_f = result_bids_f + safe_float(cur_bids.maxvolume); + } answer.bids_total_volume = result_bids_f.str(); + for (auto&& cur_asks: answer.asks) { t_float_50 percent_f = safe_float(cur_asks.maxvolume) / result_asks_f; cur_asks.depth_percent = atomic_dex::utils::adjust_precision(percent_f.str()); - //SPDLOG_INFO("cur_asks: {}", cur_asks.to_string()); + // SPDLOG_INFO("cur_asks: {}", cur_asks.to_string()); } for (auto&& cur_bids: answer.bids) { t_float_50 percent_f = safe_float(cur_bids.maxvolume) / result_bids_f; cur_bids.depth_percent = atomic_dex::utils::adjust_precision(percent_f.str()); - //SPDLOG_INFO("cur_bids: {}", cur_bids.to_string()); + // SPDLOG_INFO("cur_bids: {}", cur_bids.to_string()); } } void to_json(nlohmann::json& j, const orderbook_request& request) { - j["base"] = request.base; - j["rel"] = request.rel; + j["params"]["base"] = request.base; + j["params"]["rel"] = request.rel; } -} // namespace mm2::api +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc.orderbook.hpp b/src/core/atomicdex/api/mm2/rpc.orderbook.hpp index b12e1f46f1..8cd508c801 100644 --- a/src/core/atomicdex/api/mm2/rpc.orderbook.hpp +++ b/src/core/atomicdex/api/mm2/rpc.orderbook.hpp @@ -22,7 +22,7 @@ //! Project Headers #include "atomicdex/api/mm2/orderbook.order.contents.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { struct orderbook_request { @@ -34,8 +34,8 @@ namespace mm2::api struct orderbook_answer { - std::size_t askdepth; - std::size_t biddepth; + std::size_t askdepth{0}; + std::size_t biddepth{0}; std::vector asks; std::vector bids; std::string base; @@ -58,6 +58,6 @@ namespace mm2::api namespace atomic_dex { - using t_orderbook_request = ::mm2::api::orderbook_request; - using t_orderbook_answer = ::mm2::api::orderbook_answer; + using t_orderbook_request = mm2::orderbook_request; + using t_orderbook_answer = mm2::orderbook_answer; } \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.recover.funds.cpp b/src/core/atomicdex/api/mm2/rpc.recover.funds.cpp index 99df8d3009..e2a69f41fd 100644 --- a/src/core/atomicdex/api/mm2/rpc.recover.funds.cpp +++ b/src/core/atomicdex/api/mm2/rpc.recover.funds.cpp @@ -8,7 +8,7 @@ //! Project Headers #include "atomicdex/api/mm2/rpc.recover.funds.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void to_json(nlohmann::json& j, const recover_funds_of_swap_request& cfg) diff --git a/src/core/atomicdex/api/mm2/rpc.recover.funds.hpp b/src/core/atomicdex/api/mm2/rpc.recover.funds.hpp index a79c431c34..d9e2daae9f 100644 --- a/src/core/atomicdex/api/mm2/rpc.recover.funds.hpp +++ b/src/core/atomicdex/api/mm2/rpc.recover.funds.hpp @@ -6,7 +6,7 @@ //! Deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct recover_funds_of_swap_request { @@ -34,10 +34,10 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, recover_funds_of_swap_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_recover_funds_of_swap_request = ::mm2::api::recover_funds_of_swap_request; - using t_recover_funds_of_swap_answer = ::mm2::api::recover_funds_of_swap_answer; + using t_recover_funds_of_swap_request = mm2::recover_funds_of_swap_request; + using t_recover_funds_of_swap_answer = mm2::recover_funds_of_swap_answer; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.sell.cpp b/src/core/atomicdex/api/mm2/rpc.sell.cpp index 6546f5a018..8784dd5a1f 100644 --- a/src/core/atomicdex/api/mm2/rpc.sell.cpp +++ b/src/core/atomicdex/api/mm2/rpc.sell.cpp @@ -22,7 +22,7 @@ #include "atomicdex/api/mm2/generics.hpp" #include "atomicdex/api/mm2/rpc.sell.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void to_json(nlohmann::json& j, const sell_request& request) @@ -91,4 +91,4 @@ namespace mm2::api { extract_rpc_json_answer(j, answer); } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.sell.hpp b/src/core/atomicdex/api/mm2/rpc.sell.hpp index 3847d8052f..8c5e3d66b1 100644 --- a/src/core/atomicdex/api/mm2/rpc.sell.hpp +++ b/src/core/atomicdex/api/mm2/rpc.sell.hpp @@ -26,7 +26,7 @@ //! Project Headers #include "atomicdex/api/mm2/trading.order.contents.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { struct sell_request { @@ -66,11 +66,11 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, sell_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_sell_request = ::mm2::api::sell_request; - using t_sell_answer = ::mm2::api::sell_answer; - using t_sell_answer_success = ::mm2::api::sell_answer_success; + using t_sell_request = mm2::sell_request; + using t_sell_answer = mm2::sell_answer; + using t_sell_answer_success = mm2::sell_answer_success; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.setprice.cpp b/src/core/atomicdex/api/mm2/rpc.setprice.cpp index f1a271e5f8..2b300d28dd 100644 --- a/src/core/atomicdex/api/mm2/rpc.setprice.cpp +++ b/src/core/atomicdex/api/mm2/rpc.setprice.cpp @@ -19,7 +19,7 @@ //! Project Headers #include "atomicdex/api/mm2/rpc.setprice.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void to_json(nlohmann::json& j, const setprice_request& request) diff --git a/src/core/atomicdex/api/mm2/rpc.setprice.hpp b/src/core/atomicdex/api/mm2/rpc.setprice.hpp index c89898c5f3..fbf1964d6f 100644 --- a/src/core/atomicdex/api/mm2/rpc.setprice.hpp +++ b/src/core/atomicdex/api/mm2/rpc.setprice.hpp @@ -23,7 +23,7 @@ //! Deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct setprice_request { @@ -45,5 +45,5 @@ namespace mm2::api namespace atomic_dex { - using t_setprice_request = ::mm2::api::setprice_request; + using t_setprice_request = mm2::setprice_request; } \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.trade.preimage.cpp b/src/core/atomicdex/api/mm2/rpc.trade.preimage.cpp index 52c6abf987..b771be7a0d 100644 --- a/src/core/atomicdex/api/mm2/rpc.trade.preimage.cpp +++ b/src/core/atomicdex/api/mm2/rpc.trade.preimage.cpp @@ -21,7 +21,7 @@ #include "atomicdex/api/mm2/generics.hpp" #include "atomicdex/api/mm2/rpc.trade.preimage.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { //! Serialization void @@ -74,4 +74,4 @@ namespace mm2::api { extract_rpc_json_answer(j, answer); } -} // namespace mm2::api +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc.trade.preimage.fwd.hpp b/src/core/atomicdex/api/mm2/rpc.trade.preimage.fwd.hpp index 0e856976f5..1272653f43 100644 --- a/src/core/atomicdex/api/mm2/rpc.trade.preimage.fwd.hpp +++ b/src/core/atomicdex/api/mm2/rpc.trade.preimage.fwd.hpp @@ -16,13 +16,13 @@ #pragma once -namespace mm2::api +namespace atomic_dex::mm2 { struct trade_preimage_request; struct trade_preimage_answer; -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_trade_preimage_answer = ::mm2::api::trade_preimage_answer; + using t_trade_preimage_answer = mm2::trade_preimage_answer; } \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.trade.preimage.hpp b/src/core/atomicdex/api/mm2/rpc.trade.preimage.hpp index d83ed6d288..9f7b114934 100644 --- a/src/core/atomicdex/api/mm2/rpc.trade.preimage.hpp +++ b/src/core/atomicdex/api/mm2/rpc.trade.preimage.hpp @@ -27,7 +27,7 @@ //! Project Headers #include "atomicdex/api/mm2/fraction.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { struct trade_preimage_request { @@ -43,9 +43,9 @@ namespace mm2::api struct coin_fee { - std::string coin; - std::string amount; - fraction amount_fraction; + std::string coin; + std::string amount; + mm2::fraction amount_fraction; }; ENTT_API void from_json(const nlohmann::json& j, coin_fee& fee); @@ -71,11 +71,11 @@ namespace mm2::api }; ENTT_API void from_json(const nlohmann::json& j, trade_preimage_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_trade_preimage_request = ::mm2::api::trade_preimage_request; - using t_trade_preimage_answer = ::mm2::api::trade_preimage_answer; - using t_trade_preimage_answer_success = ::mm2::api::trade_preimage_answer_success; + using t_trade_preimage_request = mm2::trade_preimage_request; + using t_trade_preimage_answer = mm2::trade_preimage_answer; + using t_trade_preimage_answer_success = mm2::trade_preimage_answer_success; } // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/rpc.tx.history.cpp b/src/core/atomicdex/api/mm2/rpc.tx.history.cpp index 42c6e4b378..246eb0750f 100644 --- a/src/core/atomicdex/api/mm2/rpc.tx.history.cpp +++ b/src/core/atomicdex/api/mm2/rpc.tx.history.cpp @@ -4,25 +4,36 @@ //! Project Headers #include "rpc.tx.history.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { - void - to_json(nlohmann::json& j, const tx_history_request& cfg) + void to_json(nlohmann::json& j, const tx_history_request& cfg) { - j["coin"] = cfg.coin; - j["limit"] = cfg.limit; + nlohmann::json obj = nlohmann::json::object(); + + obj["coin"] = cfg.coin; + obj["limit"] = cfg.limit; + if (cfg.paging_options.has_value() && j.contains("mmrpc") && j.at("mmrpc").get() == "2.0") + { + obj["paging_options"] = cfg.paging_options.value(); + } + if (j.contains("mmrpc") && j.at("mmrpc").get() == "2.0") + { + j["params"] = obj; + } + else + { + j.update(obj); + } } - void - from_json(const nlohmann::json& j, sync_status_additional_error& answer) + void from_json(const nlohmann::json& j, sync_status_additional_error& answer) { j.at("code").get_to(answer.code); j.at("message").get_to(answer.message); } - void - from_json(const nlohmann::json& j, sync_status_eth_erc_20_coins& answer) + void from_json(const nlohmann::json& j, sync_status_eth_erc_20_coins& answer) { j.at("blocks_left").get_to(answer.blocks_left); } @@ -94,4 +105,4 @@ namespace mm2::api answer.result = j.at("result").get(); } } -} \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.tx.history.hpp b/src/core/atomicdex/api/mm2/rpc.tx.history.hpp index b81f23b624..6d287258aa 100644 --- a/src/core/atomicdex/api/mm2/rpc.tx.history.hpp +++ b/src/core/atomicdex/api/mm2/rpc.tx.history.hpp @@ -3,18 +3,18 @@ #include #include -//! Deps #include -//! Our Headers #include "transaction.data.hpp" +#include "paging_options.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { struct tx_history_request { - std::string coin; - std::size_t limit; + std::string coin; + std::size_t limit; + std::optional paging_options; }; void to_json(nlohmann::json& j, const tx_history_request& cfg); @@ -80,9 +80,9 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, tx_history_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_tx_history_request = ::mm2::api::tx_history_request; + using t_tx_history_request = mm2::tx_history_request; } \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.update.maker.order.cpp b/src/core/atomicdex/api/mm2/rpc.update.maker.order.cpp index 12d8b83d46..cd90e60f70 100644 --- a/src/core/atomicdex/api/mm2/rpc.update.maker.order.cpp +++ b/src/core/atomicdex/api/mm2/rpc.update.maker.order.cpp @@ -8,10 +8,10 @@ //! Project Headers #include -namespace mm2::api +namespace atomic_dex::mm2 { void - to_json(nlohmann::json& j, const mm2::api::update_maker_order_request& request) + to_json(nlohmann::json& j, const mm2::update_maker_order_request& request) { j["uuid"] = request.uuid; j["new_price"] = request.new_price; @@ -41,4 +41,4 @@ namespace mm2::api j["rel_nota"] = request.rel_nota.value(); } } -} // namespace mm2::api +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc.update.maker.order.hpp b/src/core/atomicdex/api/mm2/rpc.update.maker.order.hpp index 8b9f27b0da..d1249a8b29 100644 --- a/src/core/atomicdex/api/mm2/rpc.update.maker.order.hpp +++ b/src/core/atomicdex/api/mm2/rpc.update.maker.order.hpp @@ -7,7 +7,7 @@ //! Deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct update_maker_order_request { @@ -23,9 +23,9 @@ namespace mm2::api }; void to_json(nlohmann::json& j, const update_maker_order_request& request); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_update_maker_order_request = ::mm2::api::update_maker_order_request; + using t_update_maker_order_request = mm2::update_maker_order_request; } \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.validate.address.cpp b/src/core/atomicdex/api/mm2/rpc.validate.address.cpp index da74be26b9..52a888967b 100644 --- a/src/core/atomicdex/api/mm2/rpc.validate.address.cpp +++ b/src/core/atomicdex/api/mm2/rpc.validate.address.cpp @@ -1,16 +1,12 @@ -// -// Created by Sztergbaum Roman on 22/05/2021. -// - #include #include "atomicdex/api/mm2/rpc.validate.address.hpp" #include "atomicdex/api/mm2/generics.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void - to_json(nlohmann::json& j, const mm2::api::validate_address_request& req) + to_json(nlohmann::json& j, const mm2::validate_address_request& req) { j["coin"] = req.coin; j["address"] = req.address; @@ -30,4 +26,4 @@ namespace mm2::api { extract_rpc_json_answer(j, answer); } -} // namespace mm2::api +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc.validate.address.hpp b/src/core/atomicdex/api/mm2/rpc.validate.address.hpp index 00d6bd5221..9ca7fbc43f 100644 --- a/src/core/atomicdex/api/mm2/rpc.validate.address.hpp +++ b/src/core/atomicdex/api/mm2/rpc.validate.address.hpp @@ -6,7 +6,7 @@ //! Deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct validate_address_request { @@ -33,11 +33,11 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, validate_address_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_validate_address_request = ::mm2::api::validate_address_request; - using t_validate_address_answer = ::mm2::api::validate_address_answer; - using t_validate_address_answer_success = ::mm2::api::validate_address_answer_success; + using t_validate_address_request = mm2::validate_address_request; + using t_validate_address_answer = mm2::validate_address_answer; + using t_validate_address_answer_success = mm2::validate_address_answer_success; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.withdraw.cpp b/src/core/atomicdex/api/mm2/rpc.withdraw.cpp index dd4b51b052..a37bd5c91d 100644 --- a/src/core/atomicdex/api/mm2/rpc.withdraw.cpp +++ b/src/core/atomicdex/api/mm2/rpc.withdraw.cpp @@ -8,7 +8,7 @@ //! Our Headers #include "rpc.withdraw.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { void to_json(nlohmann::json& j, const withdraw_fees& cfg) @@ -78,4 +78,4 @@ namespace mm2::api } } } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc.withdraw.hpp b/src/core/atomicdex/api/mm2/rpc.withdraw.hpp index 6dcf08c575..d424c7c825 100644 --- a/src/core/atomicdex/api/mm2/rpc.withdraw.hpp +++ b/src/core/atomicdex/api/mm2/rpc.withdraw.hpp @@ -10,7 +10,7 @@ #include "atomicdex/api/mm2/generic.error.hpp" #include "atomicdex/api/mm2/transaction.data.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { struct withdraw_fees { @@ -42,11 +42,11 @@ namespace mm2::api }; void from_json(const nlohmann::json& j, withdraw_answer& answer); -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_withdraw_request = ::mm2::api::withdraw_request; - using t_withdraw_fees = ::mm2::api::withdraw_fees; - using t_withdraw_answer = ::mm2::api::withdraw_answer; + using t_withdraw_request = mm2::withdraw_request; + using t_withdraw_fees = mm2::withdraw_fees; + using t_withdraw_answer = mm2::withdraw_answer; } // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/rpc2.init_withdraw.cpp b/src/core/atomicdex/api/mm2/rpc2.init_withdraw.cpp new file mode 100644 index 0000000000..b42ca76fb2 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.init_withdraw.cpp @@ -0,0 +1,55 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +//! Deps +#include + +//! Project Headers +#include "atomicdex/api/mm2/rpc2.init_withdraw.hpp" + +//! Implementation 2.0 RPC [init_withdraw] +namespace atomic_dex::mm2 +{ + void + to_json(nlohmann::json& j, const init_withdraw_fees& request) + { + j["type"] = request.type; + j["amount"] = request.amount.value(); + } + + //! Serialization + void to_json(nlohmann::json& j, const init_withdraw_request& request) + { + nlohmann::json obj = nlohmann::json::object(); + + obj["params"]["coin"] = request.coin; + obj["params"]["to"] = request.to; + obj["params"]["amount"] = request.amount; + obj["params"]["max"] = request.max; + + if (request.fees.has_value()) + { + obj["params"]["fee"] = request.fees.value(); + } + j.update(obj); + } + + //! Deserialization + void from_json(const nlohmann::json& j, init_withdraw_answer& answer) + { + j.at("task_id").get_to(answer.task_id); + } +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc2.init_withdraw.hpp b/src/core/atomicdex/api/mm2/rpc2.init_withdraw.hpp new file mode 100644 index 0000000000..2f214f6de9 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.init_withdraw.hpp @@ -0,0 +1,56 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +#include +#include + +//! Deps +#include + +namespace atomic_dex::mm2 +{ + struct init_withdraw_fees + { + std::string type; ///< UtxoFixed, UtxoPerKbyte, EthGas, Qrc20Gas + std::optional amount; ///< Utxo only + }; + + struct init_withdraw_request + { + std::string coin; + std::string to; + std::string amount; + std::optional fees{std::nullopt}; ///< ignored if std::nullopt + bool max{false}; + }; + + struct init_withdraw_answer + { + int task_id; + }; + + void to_json(nlohmann::json& j, const init_withdraw_request& request); + void from_json(const nlohmann::json& j, init_withdraw_answer& answer); +} + +namespace atomic_dex +{ + using t_init_withdraw_request = mm2::init_withdraw_request; + using t_init_withdraw_fees = mm2::init_withdraw_fees; + using t_init_withdraw_answer = mm2::init_withdraw_answer; +} // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/rpc2.init_z_coin.cpp b/src/core/atomicdex/api/mm2/rpc2.init_z_coin.cpp new file mode 100644 index 0000000000..6c61b672eb --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.init_z_coin.cpp @@ -0,0 +1,41 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +//! Deps +#include + +//! Project Headers +#include "atomicdex/api/mm2/rpc2.init_z_coin.hpp" + +//! Implementation 2.0 RPC [init_z_coin] +namespace atomic_dex::mm2 +{ + //! Serialization + void to_json(nlohmann::json& j, const init_z_coin_request& request) + { + j["params"]["ticker"] = request.coin_name; + j["params"]["activation_params"]["mode"]["rpc"] = "Light"; + j["params"]["activation_params"]["mode"]["rpc_data"]["electrum_servers"] = request.servers; + j["params"]["activation_params"]["mode"]["rpc_data"]["light_wallet_d_servers"] = request.z_urls; + j["params"]["tx_history"] = request.with_tx_history; + } + + //! Deserialization + void from_json(const nlohmann::json& j, init_z_coin_answer& answer) + { + j.at("task_id").get_to(answer.task_id); + } +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc2.init_z_coin.hpp b/src/core/atomicdex/api/mm2/rpc2.init_z_coin.hpp new file mode 100644 index 0000000000..d7fe101369 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.init_z_coin.hpp @@ -0,0 +1,54 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +// Std Headers +#include + +// Deps Headers +#include + +//! Project Headers +#include "atomicdex/config/electrum.cfg.hpp" +#include "atomicdex/constants/qt.coins.enums.hpp" + +namespace atomic_dex::mm2 +{ + struct init_z_coin_request + { + std::string coin_name; + std::vector servers; + std::vector z_urls; + CoinType coin_type; + bool is_testnet{false}; + bool with_tx_history{false}; // Not yet in API + }; + + struct init_z_coin_answer + { + int task_id; + }; + + void to_json(nlohmann::json& j, const init_z_coin_request& request); + void from_json(const nlohmann::json& j, init_z_coin_answer& answer); +} + +namespace atomic_dex +{ + using t_init_z_coin_request = mm2::init_z_coin_request; + using t_init_z_coin_answer = mm2::init_z_coin_answer; +} // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.cpp b/src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.cpp new file mode 100644 index 0000000000..ded987e419 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.cpp @@ -0,0 +1,80 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +//! Deps +#include + +//! Project Headers +#include "atomicdex/api/mm2/rpc2.init_z_coin_status.hpp" + +//! Implementation 2.0 RPC [init_z_coin_status] +namespace atomic_dex::mm2 +{ + //! Serialization + void to_json(nlohmann::json& j, const init_z_coin_status_request& request) + { + j["params"]["task_id"] = request.task_id; + } + + //! Deserialization + void from_json(const nlohmann::json& j, init_z_coin_status_answer_success& answer) + { + j.at("result").at("status").get_to(answer.status); // [InProgress, Ready] + j.at("result").at("details").get_to(answer.details); + + if (j.at("result").at("details").contains("UpdatingBlocksCache")) + { + answer.current_scanned_block = j.at("result").at("details").at("UpdatingBlocksCache").at("current_scanned_block").get(); + answer.latest_block = j.at("result").at("details").at("UpdatingBlocksCache").at("latest_block").get(); + } + else if (j.at("result").at("details").contains("BuildingWalletDb")) + { + answer.current_scanned_block = j.at("result").at("details").at("BuildingWalletDb").at("current_scanned_block").get(); + answer.latest_block = j.at("result").at("details").at("BuildingWalletDb").at("latest_block").get(); + } + + if (j.at("result").at("details").contains("result")) + { + answer.coin = j.at("result").at("details").at("result").at("ticker").get(); + answer.current_block = j.at("result").at("details").at("result").at("current_block").get(); + + if (j.at("result").at("details").at("result").contains("wallet_balance")) + { + answer.wallet_type = j.at("result").at("details").at("result").at("wallet_balance").at("wallet_type").get(); + answer.address = j.at("result").at("details").at("result").at("wallet_balance").at("address").get(); + answer.spendable_balance = j.at("result").at("details").at("result").at("wallet_balance").at("balance").at("spendable").get(); + answer.unspendable_balance = j.at("result").at("details").at("result").at("wallet_balance").at("balance").at("unspendable").get(); + } + } + } + + void + from_json(const nlohmann::json& j, init_z_coin_status_answer& answer) + { + if (j.count("error") >= 1) + { + answer.error = j; + } + else + { + if (j.contains("result") && j.contains("mmrpc") && j.at("mmrpc").get() == "2.0") + { + answer.result = j.at("result").get(); + } + } + } +} // namespace atomic_dex::mm2 + diff --git a/src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.hpp b/src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.hpp new file mode 100644 index 0000000000..845c5e6356 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.init_z_coin_status.hpp @@ -0,0 +1,69 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +// Std Headers +#include + +// Deps Headers +#include + +//! Project Headers +#include "generic.error.hpp" + +namespace atomic_dex::mm2 +{ + struct init_z_coin_status_request + { + int task_id; + }; + + void to_json(nlohmann::json& j, const init_z_coin_status_request& request); + + struct init_z_coin_status_answer_success + { + std::string status{"disabled"}; + std::string details{"N/A"}; + std::optional coin; + std::optional address; + std::optional current_scanned_block; + std::optional latest_block; + std::optional current_block; + std::optional wallet_type; + std::optional spendable_balance; + std::optional unspendable_balance; + }; + + void from_json(const nlohmann::json& j, init_z_coin_status_answer_success& answer); + + struct init_z_coin_status_answer + { + std::optional result; + std::optional error; + std::string raw_result; ///< internal + int rpc_result_code; ///< internal + }; + + void from_json(const nlohmann::json& j, init_z_coin_status_answer& answer); +} + +namespace atomic_dex +{ + using t_init_z_coin_status_request = mm2::init_z_coin_status_request; + using t_init_z_coin_status_answer = mm2::init_z_coin_status_answer; + using t_init_z_coin_status_answer_success = mm2::init_z_coin_status_answer_success; +} // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/rpc2.withdraw_status.cpp b/src/core/atomicdex/api/mm2/rpc2.withdraw_status.cpp new file mode 100644 index 0000000000..c38d5cfbe0 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.withdraw_status.cpp @@ -0,0 +1,44 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +//! Deps +#include + +//! Project Headers +#include "atomicdex/api/mm2/rpc2.withdraw_status.hpp" + +//! Implementation 2.0 RPC [withdraw_status] +namespace atomic_dex::mm2 +{ + //! Serialization + void to_json(nlohmann::json& j, const withdraw_status_request& request) + { + j["params"]["task_id"] = request.task_id; + } + + //! Deserialization + void from_json(const nlohmann::json& j, withdraw_status_answer& answer) + { + if (j.count("error") >= 1) + { + answer.error = j; + } + else + { + answer.result = j.at("result").at("details").at("result").get(); + } + } +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc2.withdraw_status.hpp b/src/core/atomicdex/api/mm2/rpc2.withdraw_status.hpp new file mode 100644 index 0000000000..a5cb3f356c --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.withdraw_status.hpp @@ -0,0 +1,52 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +#include +#include + +//! Deps +#include + +//! Our Headers +#include "atomicdex/api/mm2/generic.error.hpp" +#include "atomicdex/api/mm2/transaction.data.hpp" + +namespace atomic_dex::mm2 +{ + struct withdraw_status_request + { + int task_id; + }; + + struct withdraw_status_answer + { + std::optional result; + std::optional error; + std::string raw_result; ///< internal + int rpc_result_code; ///< internal + }; + + void to_json(nlohmann::json& j, const withdraw_status_request& request); + void from_json(const nlohmann::json& j, withdraw_status_answer& answer); +} + +namespace atomic_dex +{ + using t_withdraw_status_request = mm2::withdraw_status_request; + using t_withdraw_status_answer = mm2::withdraw_status_answer; +} // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/rpc2.z_coin_tx_history.cpp b/src/core/atomicdex/api/mm2/rpc2.z_coin_tx_history.cpp new file mode 100644 index 0000000000..0ae2232e10 --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.z_coin_tx_history.cpp @@ -0,0 +1,106 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +//! Deps +#include + +//! Project Headers +#include "atomicdex/api/mm2/rpc2.z_coin_tx_history.hpp" + +//! Implementation 2.0 RPC [z_coin_tx_history] +namespace atomic_dex::mm2 +{ + //! Serialization + void to_json(nlohmann::json& j, const z_tx_history_request& request) + { + j["params"]["coin"] = request.coin; + j["params"]["limit"] = request.limit; + //j["params"]["paging_options"]["PageNumber"] = request.page_number; + //j["params"]["paging_options"]["FromId"] = request.from_id; + } + + //! Deserialization + void + from_json(const nlohmann::json& j, sync_status_z_error& answer) + { // TODO: confirm the v2 error output uses this structure + j.at("code").get_to(answer.code); + j.at("message").get_to(answer.message); + } + + void + from_json(const nlohmann::json& j, sync_status_z_coins& answer) + { + j.at("transactions_left").get_to(answer.transactions_left); + } + + void + from_json(const nlohmann::json& j, sync_status_z_additional_infos& answer) + { + if (j.count("error") == 1) + { + answer.error = j.get(); + } // TODO check if 'blocks_left' or 'transactions_left' + else if (j.count("transactions_left") == 1) + { + answer.z_infos = j.get(); + } + } + + void + from_json(const nlohmann::json& j, t_z_sync_status& answer) + { + j.at("state").get_to(answer.state); + if (j.count("additional_info") == 1) + { + answer.additional_info = j.at("additional_info").get(); + } + } + + void + from_json(const nlohmann::json& j, z_tx_history_answer_success& answer) + { + if (j.contains("from_id")) + { + if (not j.at("from_id").is_null()) + j.at("from_id").get_to(answer.from_id); + } + if (j.contains("current_block")) + { + j.at("current_block").get_to(answer.current_block); + } + j.at("limit").get_to(answer.limit); + j.at("skipped").get_to(answer.skipped); + if (j.contains("sync_status")) + { + j.at("sync_status").get_to(answer.sync_status); + } + j.at("total").get_to(answer.total); + j.at("transactions").get_to(answer.transactions); + } + + void + from_json(const nlohmann::json& j, z_tx_history_answer& answer) + { + if (j.contains("error")) + { + answer.error = j.at("error").get(); + } + else + { + answer.result = j.at("result").get(); + } + } +} // namespace atomic_dex::mm2 diff --git a/src/core/atomicdex/api/mm2/rpc2.z_coin_tx_history.hpp b/src/core/atomicdex/api/mm2/rpc2.z_coin_tx_history.hpp new file mode 100644 index 0000000000..60c07671de --- /dev/null +++ b/src/core/atomicdex/api/mm2/rpc2.z_coin_tx_history.hpp @@ -0,0 +1,103 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +// Std Headers +#include +#include + +// Deps Headers +#include + +//! Our Headers +#include "transaction.data.hpp" + +namespace atomic_dex::mm2 +{ + struct z_tx_history_request + { + std::string coin; + std::size_t limit; + //std::string from_id{''}; + //std::size_t page_number{1}; + }; + + void to_json(nlohmann::json& j, const z_tx_history_request& request); + + //"coin","current_block","transactions","sync_status","sync_status","id" + struct sync_status_z_error + { + std::string message; + int code; + }; + + void from_json(const nlohmann::json& j, sync_status_z_error& answer); + + struct sync_status_z_coins + { + std::size_t transactions_left; + }; + + void from_json(const nlohmann::json& j, sync_status_z_coins& answer); + + struct sync_status_z_additional_infos + { + std::optional error; + std::optional z_infos; + }; + + void from_json(const nlohmann::json& j, sync_status_z_additional_infos& answer); + + struct t_z_sync_status + { + std::string state; ///< NotEnabled, NotStarted, InProgress, Error, Finished + std::optional additional_info; + }; + + void from_json(const nlohmann::json& j, t_z_sync_status& answer); + + struct z_tx_history_answer_success + { + std::string from_id; // optional? + std::size_t skipped; + std::size_t limit; + std::size_t current_block; + std::size_t total_pages; + std::size_t page_number; + std::size_t total; + std::vector transactions; + t_z_sync_status sync_status; + }; + + void from_json(const nlohmann::json& j, z_tx_history_answer_success& answer); + + struct z_tx_history_answer + { + std::optional error; + std::optional result; + std::string raw_result; ///< internal + int rpc_result_code; ///< internal + }; + + void from_json(const nlohmann::json& j, z_tx_history_answer& answer); +} // namespace atomic_dex::mm2 + +namespace atomic_dex +{ + using t_z_tx_history_request = mm2::z_tx_history_request; + using t_z_tx_history_answer = mm2::z_tx_history_answer; +} // namespace atomic_dex diff --git a/src/core/atomicdex/api/mm2/trading.order.contents.cpp b/src/core/atomicdex/api/mm2/trading.order.contents.cpp index c371eba26a..3259863300 100644 --- a/src/core/atomicdex/api/mm2/trading.order.contents.cpp +++ b/src/core/atomicdex/api/mm2/trading.order.contents.cpp @@ -20,7 +20,7 @@ //! Project Headers #include -namespace mm2::api +namespace atomic_dex::mm2 { void from_json(const nlohmann::json& j, trading_order_contents& contents) diff --git a/src/core/atomicdex/api/mm2/trading.order.contents.hpp b/src/core/atomicdex/api/mm2/trading.order.contents.hpp index 917dbfb2f8..076b5923eb 100644 --- a/src/core/atomicdex/api/mm2/trading.order.contents.hpp +++ b/src/core/atomicdex/api/mm2/trading.order.contents.hpp @@ -22,7 +22,7 @@ //! Deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct trading_order_contents { diff --git a/src/core/atomicdex/api/mm2/transaction.data.cpp b/src/core/atomicdex/api/mm2/transaction.data.cpp index 4a67af8c21..54dbf4b2e8 100644 --- a/src/core/atomicdex/api/mm2/transaction.data.cpp +++ b/src/core/atomicdex/api/mm2/transaction.data.cpp @@ -1,24 +1,16 @@ -// -// Created by Sztergbaum Roman on 08/06/2021. -// - -//! Deps #include -//! Our Headers #include "atomicdex/api/mm2/transaction.data.hpp" #include "atomicdex/utilities/global.utilities.hpp" -namespace mm2::api +namespace atomic_dex::mm2 { - void - from_json(const nlohmann::json& j, fee_regular_coin& cfg) + void from_json(const nlohmann::json& j, fee_regular_coin& cfg) { j.at("amount").get_to(cfg.amount); } - void - from_json(const nlohmann::json& j, fee_erc_coin& cfg) + void from_json(const nlohmann::json& j, fee_erc_coin& cfg) { j.at("coin").get_to(cfg.coin); j.at("gas").get_to(cfg.gas); @@ -26,8 +18,7 @@ namespace mm2::api j.at("total_fee").get_to(cfg.total_fee); } - void - from_json(const nlohmann::json& j, fee_qrc_coin& cfg) + void from_json(const nlohmann::json& j, fee_qrc_coin& cfg) { j.at("coin").get_to(cfg.coin); j.at("gas_limit").get_to(cfg.gas_limit); @@ -36,8 +27,7 @@ namespace mm2::api j.at("total_gas_fee").get_to(cfg.total_gas_fee); } - void - from_json(const nlohmann::json& j, fees_data& cfg) + void from_json(const nlohmann::json& j, fees_data& cfg) { if (j.count("amount") == 1) { @@ -56,32 +46,73 @@ namespace mm2::api } } - void - from_json(const nlohmann::json& j, transaction_data& cfg) + void from_json(const nlohmann::json& j, transaction_data& cfg) { j.at("block_height").get_to(cfg.block_height); j.at("coin").get_to(cfg.coin); + j.at("from").get_to(cfg.from); + j.at("to").get_to(cfg.to); + j.at("tx_hash").get_to(cfg.tx_hash); + j.at("my_balance_change").get_to(cfg.my_balance_change); + j.at("received_by_me").get_to(cfg.received_by_me); + j.at("spent_by_me").get_to(cfg.spent_by_me); + j.at("timestamp").get_to(cfg.timestamp); + + // internal_id is numeric for ZHTLC - needs conversion + //if (j.contains("internal_id")) + //{ + // cfg.internal_id = j.at("internal_id").get(); + //} + if (j.at("timestamp").get() != 0) + { + cfg.timestamp = j.at("timestamp").get(); + } + else + { + using namespace std::chrono; + cfg.timestamp = duration_cast(system_clock::now().time_since_epoch()).count(); + } + if (j.contains("confirmations")) { cfg.confirmations = j.at("confirmations").get(); } - j.at("fee_details").get_to(cfg.fee_details); - j.at("from").get_to(cfg.from); - if (cfg.from.empty() && cfg.coin == "FIRO") + + if (cfg.from.empty()) { - cfg.from.emplace_back("Lelantusjsplit (Hidden)"); + if (cfg.coin == "FIRO") + { + cfg.from.emplace_back("Lelantusjsplit (Hidden)"); + } + else + { + cfg.from.emplace_back("Shielded"); + } + } + + // transaction_fee only in ZHTLC response + if (j.contains("transaction_fee")) + { + cfg.transaction_fee = j.at("transaction_fee").get(); + } + else if (j.contains("fee_details")) + { + j.at("fee_details").get_to(cfg.fee_details); + } + + // total_amount not in ZHTLC response + if (j.contains("total_amount")) + { + j.at("total_amount").get_to(cfg.total_amount); + } + + // tx_hex not in ZHTLC response + if (j.contains("tx_hex")) + { + j.at("tx_hex").get_to(cfg.tx_hex); } - j.at("internal_id").get_to(cfg.internal_id); - j.at("my_balance_change").get_to(cfg.my_balance_change); - j.at("received_by_me").get_to(cfg.received_by_me); - j.at("spent_by_me").get_to(cfg.spent_by_me); - j.at("timestamp").get_to(cfg.timestamp); - j.at("to").get_to(cfg.to); - j.at("total_amount").get_to(cfg.total_amount); - j.at("tx_hash").get_to(cfg.tx_hash); - j.at("tx_hex").get_to(cfg.tx_hex); std::string s = atomic_dex::utils::to_human_date(cfg.timestamp, "%e %b %Y, %H:%M"); cfg.timestamp_as_date = std::move(s); } -} // namespace mm2::api \ No newline at end of file +} // namespace atomic_dex::mm2 \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/transaction.data.hpp b/src/core/atomicdex/api/mm2/transaction.data.hpp index dfb844ceaa..9882c9a532 100644 --- a/src/core/atomicdex/api/mm2/transaction.data.hpp +++ b/src/core/atomicdex/api/mm2/transaction.data.hpp @@ -6,7 +6,7 @@ //! Deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct fee_regular_coin { @@ -38,9 +38,9 @@ namespace mm2::api struct fees_data { - std::optional normal_fees; ///< btc, kmd based coins - std::optional erc_fees; ///< eth based coins - std::optional qrc_fees; // Qtum based coin + std::optional normal_fees; ///< btc, kmd based coins + std::optional erc_fees; ///< eth based coins + std::optional qrc_fees; // Qtum based coin }; void from_json(const nlohmann::json& j, fees_data& cfg); @@ -51,17 +51,18 @@ namespace mm2::api std::vector from; std::vector to; fees_data fee_details; - std::optional confirmations; - std::string coin; std::size_t block_height; - std::string internal_id; + std::string coin; std::string spent_by_me; std::string received_by_me; std::string my_balance_change; - std::string total_amount; + std::string total_amount{"0"}; std::string tx_hash; std::string tx_hex; std::string timestamp_as_date; ///< human readeable timestamp + std::optional transaction_fee; + std::optional internal_id; + std::optional confirmations; }; void from_json(const nlohmann::json& j, transaction_data& cfg); diff --git a/src/core/atomicdex/api/mm2/utxo.merge.params.cpp b/src/core/atomicdex/api/mm2/utxo.merge.params.cpp new file mode 100644 index 0000000000..040ec7f473 --- /dev/null +++ b/src/core/atomicdex/api/mm2/utxo.merge.params.cpp @@ -0,0 +1,29 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#include + +#include "utxo.merge.params.hpp" + +namespace atomic_dex::mm2 +{ + void to_json(nlohmann::json& j, const utxo_merge_params& cfg) + { + j["merge_at"] = cfg.merge_at; + j["check_every"] = cfg.check_every; + j["max_merge_at_once"] = cfg.max_merge_at_once; + } +} \ No newline at end of file diff --git a/src/core/atomicdex/api/mm2/utxo.merge.params.hpp b/src/core/atomicdex/api/mm2/utxo.merge.params.hpp new file mode 100644 index 0000000000..5c74faaa15 --- /dev/null +++ b/src/core/atomicdex/api/mm2/utxo.merge.params.hpp @@ -0,0 +1,31 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +#include + +namespace atomic_dex::mm2 +{ + struct utxo_merge_params + { + std::size_t merge_at; + std::size_t check_every; + std::size_t max_merge_at_once; + }; + + void to_json(nlohmann::json& j, const utxo_merge_params& cfg); +} \ No newline at end of file diff --git a/src/core/atomicdex/config/coins.cfg.cpp b/src/core/atomicdex/config/coins.cfg.cpp index 7fd94b9c98..b74b08a035 100644 --- a/src/core/atomicdex/config/coins.cfg.cpp +++ b/src/core/atomicdex/config/coins.cfg.cpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -14,178 +14,208 @@ * * ******************************************************************************/ -//! Deps +#include + #include +#include -//! Project Headers -#include "atomicdex/config/coins.cfg.hpp" +#include "coins.cfg.hpp" -namespace atomic_dex +namespace { - void - from_json(const nlohmann::json& j, coin_config& cfg) + CoinType get_coin_type_from_str(const std::string& coin_type) { - j.at("coin").get_to(cfg.ticker); - cfg.gui_ticker = j.contains("gui_coin") ? j.at("gui_coin").get() : cfg.ticker; - j.at("name").get_to(cfg.name); - j.at("type").get_to(cfg.type); - if (j.contains("mm2_backup")) + if (coin_type == "QRC-20") { - cfg.custom_backup = j.at("mm2_backup"); + return CoinType::QRC20; } - if (j.contains("electrum")) + if (coin_type == "ERC-20") { - cfg.electrum_urls = j.at("electrum").get>(); + return CoinType::ERC20; } - if (j.contains("nodes")) - { - cfg.urls = j.at("nodes").get>(); - } - cfg.is_claimable = j.count("is_claimable") > 0; - cfg.minimal_claim_amount = cfg.is_claimable ? j.at("minimal_claim_amount").get() : "0"; - j.at("active").get_to(cfg.active); - j.at("currently_enabled").get_to(cfg.currently_enabled); - - if (j.contains("coinpaprika_id")) + if (coin_type == "UTXO") { - j.at("coinpaprika_id").get_to(cfg.coinpaprika_id); + return CoinType::UTXO; } - else - { - cfg.coinpaprika_id = "test-coin"; - } - - if (j.contains("nomics_id")) + if (coin_type == "Smart Chain") { - j.at("nomics_id").get_to(cfg.nomics_id); + return CoinType::SmartChain; } - else + if (coin_type == "BEP-20") { - cfg.nomics_id = "test-coin"; + return CoinType::BEP20; } - - if (j.contains("coingecko_id")) + if (coin_type == "SLP") { - j.at("coingecko_id").get_to(cfg.coingecko_id); + return CoinType::SLP; } - else + if (coin_type == "Matic") { - cfg.coingecko_id = "test-coin"; + return CoinType::Matic; } - - if (j.contains("is_custom_coin")) + if (coin_type == "Optimism") { - cfg.is_custom_coin = true; + return CoinType::Optimism; } - - if (j.contains("is_segwit_on")) + if (coin_type == "Arbitrum") { - cfg.segwit = true; - j.at("is_segwit_on").get_to(cfg.is_segwit_on); - SPDLOG_INFO("coin: {} support segwit with current_segwit mode: {}", cfg.ticker, cfg.is_segwit_on); + return CoinType::Arbitrum; } - - if (j.contains("alias_ticker")) + if (coin_type == "AVX-20") { - cfg.alias_ticker = j.at("alias_ticker").get(); + return CoinType::AVX20; } - - j.at("explorer_url").get_to(cfg.explorer_url); - if (j.contains("explorer_tx_url")) + if (coin_type == "FTM-20") { - j.at("explorer_tx_url").get_to(cfg.tx_uri); + return CoinType::FTM20; } - if (j.contains("explorer_address_url")) + if (coin_type == "HRC-20") { - j.at("explorer_address_url").get_to(cfg.address_url); + return CoinType::HRC20; } - if (j.contains("is_testnet")) + if (coin_type == "Ubiq") { - cfg.is_testnet = j.at("is_testnet").get(); + return CoinType::Ubiq; } - if (cfg.type == "QRC-20") + if (coin_type == "KRC-20") { - cfg.coin_type = CoinType::QRC20; + return CoinType::KRC20; } - else if (cfg.type == "ERC-20") + if (coin_type == "Moonriver") { - cfg.coin_type = CoinType::ERC20; + return CoinType::Moonriver; } - else if (cfg.type == "UTXO") + if (coin_type == "Moonbeam") { - cfg.coin_type = CoinType::UTXO; + return CoinType::Moonbeam; } - else if (cfg.type == "Smart Chain") + if (coin_type == "HecoChain") { - cfg.coin_type = CoinType::SmartChain; + return CoinType::HecoChain; } - else if (cfg.type == "BEP-20") + if (coin_type == "SmartBCH") { - cfg.coin_type = CoinType::BEP20; + return CoinType::SmartBCH; } - else if (cfg.type == "SLP") + if (coin_type == "Ethereum Classic") { - cfg.coin_type = CoinType::SLP; + return CoinType::EthereumClassic; } - else if (cfg.type == "Matic") + if (coin_type == "RSK Smart Bitcoin") { - cfg.coin_type = CoinType::Matic; + return CoinType::RSK; } - else if (cfg.type == "Optimism") + if (coin_type == "ZHTLC") { - cfg.coin_type = CoinType::Optimism; + return CoinType::ZHTLC; } - else if (cfg.type == "Arbitrum") + SPDLOG_INFO("Invalid coin type: {}", coin_type); + return CoinType::Invalid; + // throw std::invalid_argument{"Undefined given coin type."}; + } +} + +namespace atomic_dex +{ + bool is_wallet_only(std::string ticker) + { + return std::any_of(g_wallet_only_coins.begin(), g_wallet_only_coins.end(), [ticker](std::string x) { return ticker == x; }); + } + bool is_default_coin(std::string ticker) + { + return std::any_of(g_default_coins.begin(), g_default_coins.end(), [ticker](std::string x) { return ticker == x; }); + } + + void + from_json(const nlohmann::json& j, coin_config& cfg) + { + j.at("coin").get_to(cfg.ticker); + j.at("name").get_to(cfg.name); + j.at("type").get_to(cfg.type); + cfg.coin_type = get_coin_type_from_str(cfg.type); + j.at("active").get_to(cfg.active); + j.at("explorer_url").get_to(cfg.explorer_url); + + cfg.gui_ticker = j.contains("gui_coin") ? j.at("gui_coin").get() : cfg.ticker; + cfg.minimal_claim_amount = cfg.is_claimable ? j.at("minimal_claim_amount").get() : "0"; + cfg.coinpaprika_id = j.contains("coinpaprika_id") ? j.at("coinpaprika_id").get() : "test-coin"; + cfg.coingecko_id = j.contains("coingecko_id") ? j.at("coingecko_id").get() : "test-coin"; + cfg.nomics_id = j.contains("nomics_id") ? j.at("nomics_id").get() : "test-coin"; + cfg.is_claimable = j.count("is_claimable") > 0; + cfg.is_custom_coin = j.contains("is_custom_coin") ? j.at("is_custom_coin").get() : false; + cfg.is_testnet = j.contains("is_testnet") ? j.at("is_testnet").get() : false; + cfg.wallet_only = is_wallet_only(cfg.ticker) ? is_wallet_only(cfg.ticker) : j.contains("wallet_only") ? j.at("wallet_only").get() : false; + cfg.default_coin = is_default_coin(cfg.ticker); + + if (j.contains("other_types")) { - cfg.coin_type = CoinType::Arbitrum; + std::vector other_types; + + j.at("other_types").get_to(other_types); + cfg.other_types = std::set(); + for (const auto& other_type : other_types) + { + cfg.other_types->emplace(get_coin_type_from_str(other_type)); + } } - else if (cfg.type == "AVX-20") + if (j.contains("utxo_merge")) { - cfg.coin_type = CoinType::AVX20; + cfg.utxo_merge = j.at("utxo_merge"); } - else if (cfg.type == "FTM-20") + if (j.contains("mm2_backup")) { - cfg.coin_type = CoinType::FTM20; + cfg.custom_backup = j.at("mm2_backup"); } - else if (cfg.type == "HRC-20") + if (j.contains("activation_status")) { - cfg.coin_type = CoinType::HRC20; + cfg.activation_status = j.at("activation_status").get(); } - else if (cfg.type == "Ubiq") + if (j.contains("electrum")) { - cfg.coin_type = CoinType::Ubiq; + cfg.electrum_urls = j.at("electrum").get>(); } - else if (cfg.type == "KRC-20") + // Used for SLP coins + if (j.contains("bchd_urls")) { - cfg.coin_type = CoinType::KRC20; + cfg.bchd_urls = j.at("bchd_urls").get>(); } - else if (cfg.type == "Moonriver") + if (j.contains("nodes")) { - cfg.coin_type = CoinType::Moonriver; + // Todo: this is bad, we are using 2 times the required memory. Something can be improved here. + cfg.urls = j.at("nodes").get>(); + cfg.eth_family_urls = std::vector(); + cfg.eth_family_urls.value().reserve(cfg.urls.value().size()); + for (const auto& url : cfg.urls.value()) + { + cfg.eth_family_urls->push_back(url.url); + } } - else if (cfg.type == "Moonbeam") + if (j.contains("allow_slp_unsafe_conf")) { - cfg.coin_type = CoinType::Moonbeam; + cfg.allow_slp_unsafe_conf = j.at("allow_slp_unsafe_conf").get(); } - else if (cfg.type == "HecoChain") + // Used for ZHTLC coins + if (j.contains("light_wallet_d_servers")) { - cfg.coin_type = CoinType::HecoChain; + cfg.z_urls = j.at("light_wallet_d_servers").get>(); } - else if (cfg.type == "SmartBCH") + if (j.contains("is_segwit_on")) { - cfg.coin_type = CoinType::SmartBCH; + cfg.segwit = true; + j.at("is_segwit_on").get_to(cfg.is_segwit_on); + SPDLOG_INFO("coin: {} support segwit with current_segwit mode: {}", cfg.ticker, cfg.is_segwit_on); } - else if (cfg.type == "Ethereum Classic") + if (j.contains("alias_ticker")) { - cfg.coin_type = CoinType::EthereumClassic; + cfg.alias_ticker = j.at("alias_ticker").get(); } - else if (cfg.type == "RSK Smart Bitcoin") + if (j.contains("explorer_tx_url")) { - cfg.coin_type = CoinType::RSK; + j.at("explorer_tx_url").get_to(cfg.tx_uri); } - if (j.contains("wallet_only")) + if (j.contains("explorer_address_url")) { - cfg.wallet_only = j.at("wallet_only").get(); + j.at("explorer_address_url").get_to(cfg.address_url); } switch (cfg.coin_type) @@ -211,12 +241,12 @@ namespace atomic_dex break; case CoinType::Optimism: cfg.has_parent_fees_ticker = true; - cfg.fees_ticker = cfg.is_testnet.value() ? "ETHK-OPT20" : "ETH-OPT20"; + cfg.fees_ticker = "ETH-OPT20"; cfg.is_erc_family = true; break; case CoinType::Arbitrum: cfg.has_parent_fees_ticker = true; - cfg.fees_ticker = cfg.is_testnet.value() ? "ETHR-ARB20" : "ETH-ARB20"; + cfg.fees_ticker = "ETH-ARB20"; cfg.is_erc_family = true; break; case CoinType::AVX20: @@ -276,7 +306,16 @@ namespace atomic_dex break; case CoinType::SLP: cfg.has_parent_fees_ticker = true; - cfg.fees_ticker = "BCH"; + cfg.fees_ticker = cfg.is_testnet.value() ? "tBCH" : "BCH"; + break; + case CoinType::ZHTLC: + cfg.has_parent_fees_ticker = false; + cfg.is_zhtlc_family = true; + cfg.fees_ticker = cfg.ticker; + break; + case CoinType::Invalid: + cfg.has_parent_fees_ticker = false; + cfg.fees_ticker = cfg.ticker; break; default: cfg.has_parent_fees_ticker = false; @@ -284,4 +323,15 @@ namespace atomic_dex break; } } + + void print_coins(std::vector coins) + { + std::stringstream ss; + ss << "["; + for (auto&& coin: coins) { + ss << coin.ticker << " "; + } + ss << "]"; + SPDLOG_INFO("{}", ss.str()); + } } // namespace atomic_dex diff --git a/src/core/atomicdex/config/coins.cfg.hpp b/src/core/atomicdex/config/coins.cfg.hpp index 3c2d7f7033..b612e2684e 100644 --- a/src/core/atomicdex/config/coins.cfg.hpp +++ b/src/core/atomicdex/config/coins.cfg.hpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -16,48 +16,55 @@ #pragma once -//! QT -#include - -//! STD #include +#include -//! Deps #include -//! Project #include "atomicdex/api/mm2/mm2.constants.hpp" +#include "atomicdex/api/mm2/utxo.merge.params.hpp" #include "atomicdex/config/electrum.cfg.hpp" +#include "atomicdex/config/enable.cfg.hpp" #include "atomicdex/constants/qt.coins.enums.hpp" +#include "atomicdex/constants/dex.constants.hpp" namespace atomic_dex { struct coin_config { - public: static constexpr const char* erc_gas_stations = "https://ethgasstation.info/json/ethgasAPI.json"; static constexpr const char* matic_gas_stations = "https://gasstation-mainnet.matic.network/"; using electrum_servers = std::vector; - using nodes = std::vector; - std::string ticker; - std::optional alias_ticker{std::nullopt}; - std::string gui_ticker; ///< Ticker displayed in the gui - std::string name; ///< nice name - std::optional electrum_urls; - std::optional urls; - bool is_claimable{false}; - std::string minimal_claim_amount{"0"}; - bool currently_enabled{false}; - bool active{false}; - std::string coinpaprika_id{"test-coin"}; - std::string coingecko_id{"test-coin"}; - std::string nomics_id{"test-coin"}; - bool is_custom_coin{false}; - std::string type; - std::vector explorer_url; ///< usefull for transaction, take this url and append transaction id + using nodes = std::vector; + using eth_family_url_list = std::vector; + using bchd_url_list = std::vector; + using light_wallet_d_servers = std::vector; ///< For ZHTLC + std::string ticker; + std::optional alias_ticker{std::nullopt}; + std::string gui_ticker; ///< Ticker displayed in the gui + std::string name; ///< nice name + std::optional utxo_merge{false}; + std::optional allow_slp_unsafe_conf; + std::optional urls; + std::optional eth_family_urls; + std::optional bchd_urls; + std::optional electrum_urls; + std::optional z_urls; + bool is_claimable{false}; + std::string minimal_claim_amount{"0"}; + bool currently_enabled{false}; + bool active{false}; + std::string coinpaprika_id{"test-coin"}; + std::string coingecko_id{"test-coin"}; + std::string nomics_id{"test-coin"}; + bool is_custom_coin{false}; + std::string type; + std::optional> other_types; + std::string explorer_url; ///< usefull for transaction, take this url and append transaction id std::string tx_uri{"tx/"}; std::string address_url{"address/"}; std::optional custom_backup; + nlohmann::json activation_status; std::optional is_testnet{false}; ///< True if testnet (tBTC, tQTUM, QRC-20 on testnet, tETH) CoinType coin_type; bool checked{false}; @@ -67,7 +74,13 @@ namespace atomic_dex bool segwit{false}; bool is_segwit_on{false}; bool is_erc_family{false}; + bool is_zhtlc_family{false}; + bool default_coin{false}; }; void from_json(const nlohmann::json& j, coin_config& cfg); + + void print_coins(std::vector coins); + bool is_wallet_only(std::string ticker); + bool is_default_coin(std::string ticker); } // namespace atomic_dex diff --git a/src/core/atomicdex/config/electrum.cfg.hpp b/src/core/atomicdex/config/electrum.cfg.hpp index cf587c418b..77e873c25d 100644 --- a/src/core/atomicdex/config/electrum.cfg.hpp +++ b/src/core/atomicdex/config/electrum.cfg.hpp @@ -27,6 +27,7 @@ namespace atomic_dex { std::string url; std::optional protocol{"TCP"}; + std::optional ws_url; std::optional disable_cert_verification{false}; }; diff --git a/src/core/atomicdex/config/enable.cfg.cpp b/src/core/atomicdex/config/enable.cfg.cpp new file mode 100644 index 0000000000..5e918c417c --- /dev/null +++ b/src/core/atomicdex/config/enable.cfg.cpp @@ -0,0 +1,45 @@ +/****************************************************************************** + * Copyright © 2013-2021 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + + +//! Deps +#include + +//! Project Headers +#include "atomicdex/config/enable.cfg.hpp" + +namespace atomic_dex +{ + void + to_json(nlohmann::json& j, const node& cfg) + { + j["url"] = cfg.url; + if (cfg.gui_auth.has_value()) + { + j["gui_auth"] = cfg.gui_auth.value(); + } + } + + void + from_json(const nlohmann::json& j, node& cfg) + { + j.at("url").get_to(cfg.url); + if (j.count("gui_auth") == 1) + { + cfg.gui_auth = j.at("gui_auth").get(); + } + } +} // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/config/enable.cfg.hpp b/src/core/atomicdex/config/enable.cfg.hpp new file mode 100644 index 0000000000..7a56d35685 --- /dev/null +++ b/src/core/atomicdex/config/enable.cfg.hpp @@ -0,0 +1,34 @@ +/****************************************************************************** + * Copyright © 2013-2021 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + + +#pragma once + +//! STD +#include +#include + +namespace atomic_dex +{ + struct node + { + std::string url; + std::optional gui_auth{false}; + }; + + void to_json(nlohmann::json& j, const node& cfg); + void from_json(const nlohmann::json& j, node& cfg); +} \ No newline at end of file diff --git a/src/core/atomicdex/config/mm2.cfg.hpp b/src/core/atomicdex/config/mm2.cfg.hpp index 0213830ba8..08fe25cbd3 100644 --- a/src/core/atomicdex/config/mm2.cfg.hpp +++ b/src/core/atomicdex/config/mm2.cfg.hpp @@ -22,6 +22,7 @@ //! Headers #include "atomicdex/utilities/global.utilities.hpp" #include "atomicdex/version/version.hpp" +#include "atomicdex/constants/dex.constants.hpp" namespace atomic_dex { @@ -32,6 +33,7 @@ namespace atomic_dex { std::string gui{std::string(DEX_NAME) + " "s + atomic_dex::get_version()}; int64_t netid{7777}; + int64_t rpcport{atomic_dex::g_dex_rpcport}; std::vector seednodes{}; //std::vector seednodes{"195.201.91.96", "195.201.91.53", "168.119.174.126", "46.4.78.11", "46.4.87.18"}; //std::vector seednodes{"46.4.78.11", "46.4.87.18"}; @@ -54,6 +56,7 @@ namespace atomic_dex { cfg.gui = j.at("gui").get(); cfg.netid = j.at("netid").get(); + cfg.rpcport = j.at("rpcport").get(); cfg.userhome = j.at("userhome").get(); cfg.passphrase = j.at("passphrase").get(); cfg.rpc_password = j.at("rpc_password").get(); @@ -66,6 +69,7 @@ namespace atomic_dex j = json::object(); j["gui"] = cfg.gui; j["netid"] = cfg.netid; + j["rpcport"] = cfg.rpcport; j["userhome"] = cfg.userhome; j["passphrase"] = cfg.passphrase; j["rpc_password"] = cfg.rpc_password; diff --git a/src/core/atomicdex/constants/dex.constants.hpp b/src/core/atomicdex/constants/dex.constants.hpp index 11f1a3e031..ed88a42e23 100644 --- a/src/core/atomicdex/constants/dex.constants.hpp +++ b/src/core/atomicdex/constants/dex.constants.hpp @@ -2,7 +2,23 @@ namespace atomic_dex { + inline const char* g_dex_api{DEX_API}; + inline const std::string g_dex_rpc{DEX_RPC}; + inline const int64_t g_dex_rpcport{std::stoi(DEX_RPCPORT)}; inline const std::string g_primary_dex_coin{DEX_PRIMARY_COIN}; inline const std::string g_second_primary_dex_coin{DEX_SECOND_PRIMARY_COIN}; - inline const std::vector g_default_coins{g_primary_dex_coin, g_second_primary_dex_coin}; -} \ No newline at end of file + inline const std::vector g_default_coins{ + g_primary_dex_coin, + g_second_primary_dex_coin, + "BTC" + }; + inline const std::vector g_wallet_only_coins{ + "ARRR-BEP20", + "RBTC", + "NVC", + "PAXG-ERC20", + "USDT-ERC20", + "XPM", + "ATOM" + }; +} diff --git a/src/core/atomicdex/constants/qt.coins.enums.cpp b/src/core/atomicdex/constants/qt.coins.enums.cpp index 4e757d51ad..593777550d 100644 --- a/src/core/atomicdex/constants/qt.coins.enums.cpp +++ b/src/core/atomicdex/constants/qt.coins.enums.cpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * diff --git a/src/core/atomicdex/constants/qt.coins.enums.hpp b/src/core/atomicdex/constants/qt.coins.enums.hpp index 19e07af208..83f70bcc5e 100644 --- a/src/core/atomicdex/constants/qt.coins.enums.hpp +++ b/src/core/atomicdex/constants/qt.coins.enums.hpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -51,9 +51,11 @@ namespace atomic_dex SmartBCH = 17, EthereumClassic = 18, RSK = 19, - Disabled = 20, - All = 21, - Size = 22 + ZHTLC = 20, + Disabled = 21, + Invalid = 22, + All = 23, + Size = 24 }; Q_ENUM(CoinTypeEnum) diff --git a/src/core/atomicdex/constants/qt.trading.enums.hpp b/src/core/atomicdex/constants/qt.trading.enums.hpp index 01efb63d21..8a5b9303d7 100644 --- a/src/core/atomicdex/constants/qt.trading.enums.hpp +++ b/src/core/atomicdex/constants/qt.trading.enums.hpp @@ -61,6 +61,8 @@ namespace atomic_dex LeftParentChainNotEnoughBalance = 8, RightParentChainNotEnoughBalance = 9, RightParentChainNotEnabled = 10, + LeftZhtlcChainNotEnabled = 11, + RightZhtlcChainNotEnabled = 12, }; Q_ENUM(TradingErrorEnum) diff --git a/src/core/atomicdex/data/dex/orders.and.swaps.data.hpp b/src/core/atomicdex/data/dex/orders.and.swaps.data.hpp index c0d6ed535a..0cd153feb4 100644 --- a/src/core/atomicdex/data/dex/orders.and.swaps.data.hpp +++ b/src/core/atomicdex/data/dex/orders.and.swaps.data.hpp @@ -16,6 +16,8 @@ namespace atomic_dex using t_filtering_infos = filtering_infos; + // todo: please change the logic of this and its usage in mm2 service and other places. + // not happy with the current implementation we can do better struct orders_and_swaps { //! Registries diff --git a/src/core/atomicdex/data/dex/qt.orders.data.hpp b/src/core/atomicdex/data/dex/qt.orders.data.hpp index f8348c6d6b..27f0859ed2 100644 --- a/src/core/atomicdex/data/dex/qt.orders.data.hpp +++ b/src/core/atomicdex/data/dex/qt.orders.data.hpp @@ -9,7 +9,7 @@ //! deps #include -namespace mm2::api +namespace atomic_dex::mm2 { struct order_swaps_data { @@ -88,9 +88,9 @@ namespace mm2::api std::optional min_volume{std::nullopt}; std::optional conf_settings{std::nullopt}; }; -} // namespace mm2::api +} // namespace atomic_dex::mm2 namespace atomic_dex { - using t_order_swaps_data = mm2::api::order_swaps_data; + using t_order_swaps_data = mm2::order_swaps_data; } \ No newline at end of file diff --git a/src/core/atomicdex/data/wallet/qt.portfolio.data.hpp b/src/core/atomicdex/data/wallet/qt.portfolio.data.hpp index 766683ce0f..7cd0e32c8a 100644 --- a/src/core/atomicdex/data/wallet/qt.portfolio.data.hpp +++ b/src/core/atomicdex/data/wallet/qt.portfolio.data.hpp @@ -60,6 +60,9 @@ namespace atomic_dex //! eg: Komodo data rates QJsonArray trend_7d; + //! eg: Komodo data rates + QJsonObject activation_status; + //! Price provider QString price_provider; diff --git a/src/core/atomicdex/events/events.hpp b/src/core/atomicdex/events/events.hpp index 7e3bd704ce..9f19cd0f7f 100644 --- a/src/core/atomicdex/events/events.hpp +++ b/src/core/atomicdex/events/events.hpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -20,7 +20,6 @@ #include #include -//! Project Headers #include namespace atomic_dex @@ -30,17 +29,20 @@ namespace atomic_dex using gui_enter_trading = entt::tag<"gui_enter_trading"_hs>; using gui_leave_trading = entt::tag<"gui_leave_trading"_hs>; using mm2_initialized = entt::tag<"mm2_running_and_enabling"_hs>; - //using tx_fetch_finished = entt::tag<"gui_tx_fetch_finished"_hs>; using default_coins_enabled = entt::tag<"default_coins_enabled"_hs>; - // using process_swaps_and_orders_finished = entt::tag<"process_swaps_and_orders_finished"_hs>; + using zhtlc_enter_enabling = entt::tag<"zhtlc_enter_enabling"_hs>; + using zhtlc_leave_enabling = entt::tag<"zhtlc_leave_enabling"_hs>; using band_oracle_refreshed = entt::tag<"band_oracle_refreshed"_hs>; using current_currency_changed = entt::tag<"update_orders_and_swap_values"_hs>; using force_update_providers = entt::tag<"force_update_providers"_hs>; - using download_release_finished = entt::tag<"download_release_finished"_hs>; + using download_started = entt::tag<"download_started"_hs>; + using download_complete = entt::tag<"download_complete"_hs>; + using download_failed = entt::tag<"download_failed"_hs>; struct tx_fetch_finished { - bool with_error{false}; + bool with_error{false}; + std::string ticker; }; struct process_swaps_and_orders_finished @@ -48,12 +50,24 @@ namespace atomic_dex bool after_manual_reset{false}; }; + struct enabling_z_coin_status + { + std::string coin; + std::string reason; + }; + struct enabling_coin_failed { std::string coin; std::string reason; }; + struct disabling_coin_failed + { + std::string coin; + std::string reason; + }; + struct batch_failed { std::string from; diff --git a/src/core/atomicdex/managers/notification.manager.cpp b/src/core/atomicdex/managers/notification.manager.cpp index 48cb8de054..b39c71c857 100644 --- a/src/core/atomicdex/managers/notification.manager.cpp +++ b/src/core/atomicdex/managers/notification.manager.cpp @@ -40,7 +40,9 @@ namespace atomic_dex m_dispatcher.sink().connect<¬ification_manager::on_batch_failed>(*this); m_dispatcher.sink().connect<¬ification_manager::on_swap_status_notification>(*this); m_dispatcher.sink().connect<¬ification_manager::on_balance_update_notification>(*this); + m_dispatcher.sink().connect<¬ification_manager::on_enabling_z_coin_status>(*this); m_dispatcher.sink().connect<¬ification_manager::on_enabling_coin_failed>(*this); + m_dispatcher.sink().connect<¬ification_manager::on_disabling_coin_failed>(*this); m_dispatcher.sink().connect<¬ification_manager::on_endpoint_nonreacheable>(*this); m_dispatcher.sink().connect<¬ification_manager::on_mismatch_custom_coins_configuration>(*this); m_dispatcher.sink().connect<¬ification_manager::on_fatal_notification>(*this); @@ -53,6 +55,8 @@ namespace atomic_dex m_dispatcher.sink().disconnect<¬ification_manager::on_swap_status_notification>(*this); m_dispatcher.sink().disconnect<¬ification_manager::on_balance_update_notification>(*this); m_dispatcher.sink().disconnect<¬ification_manager::on_enabling_coin_failed>(*this); + m_dispatcher.sink().disconnect<¬ification_manager::on_disabling_coin_failed>(*this); + m_dispatcher.sink().disconnect<¬ification_manager::on_enabling_z_coin_status>(*this); m_dispatcher.sink().disconnect<¬ification_manager::on_endpoint_nonreacheable>(*this); m_dispatcher.sink().disconnect<¬ification_manager::on_mismatch_custom_coins_configuration>(*this); m_dispatcher.sink().disconnect<¬ification_manager::on_fatal_notification>(*this); @@ -67,6 +71,15 @@ namespace atomic_dex emit balanceUpdateStatus(evt.am_i_sender, evt.amount, evt.ticker, evt.human_date, evt.timestamp); } + void + notification_manager::on_enabling_z_coin_status(const enabling_z_coin_status& evt) + { + using namespace std::chrono; + qint64 timestamp = duration_cast(system_clock::now().time_since_epoch()).count(); + QString human_date = QString::fromStdString(utils::to_human_date(timestamp, "%e %b %Y, %H:%M")); + emit enablingZCoinStatus(QString::fromStdString(evt.coin), QString::fromStdString(evt.reason), human_date, timestamp); + } + void notification_manager::on_enabling_coin_failed(const enabling_coin_failed& evt) { @@ -76,6 +89,15 @@ namespace atomic_dex emit enablingCoinFailedStatus(QString::fromStdString(evt.coin), QString::fromStdString(evt.reason), human_date, timestamp); } + void + notification_manager::on_disabling_coin_failed(const disabling_coin_failed& evt) + { + using namespace std::chrono; + qint64 timestamp = duration_cast(system_clock::now().time_since_epoch()).count(); + QString human_date = QString::fromStdString(utils::to_human_date(timestamp, "%e %b %Y, %H:%M")); + emit disablingCoinFailedStatus(QString::fromStdString(evt.coin), QString::fromStdString(evt.reason), human_date, timestamp); + } + void notification_manager::on_endpoint_nonreacheable(const endpoint_nonreacheable& evt) { diff --git a/src/core/atomicdex/managers/notification.manager.hpp b/src/core/atomicdex/managers/notification.manager.hpp index 494fea2255..a9c01ecd87 100644 --- a/src/core/atomicdex/managers/notification.manager.hpp +++ b/src/core/atomicdex/managers/notification.manager.hpp @@ -42,7 +42,9 @@ namespace atomic_dex //! Callbacks void on_batch_failed(const batch_failed& evt);; void on_swap_status_notification(const swap_status_notification& evt); + void on_enabling_z_coin_status(const enabling_z_coin_status& evt); void on_enabling_coin_failed(const enabling_coin_failed& evt); + void on_disabling_coin_failed(const disabling_coin_failed& evt); void on_balance_update_notification(const balance_update_notification& evt); void on_endpoint_nonreacheable(const endpoint_nonreacheable& evt); void on_mismatch_custom_coins_configuration(const mismatch_configuration_custom_coin& evt); @@ -51,7 +53,9 @@ namespace atomic_dex signals: void updateSwapStatus(QString old_swap_status, QString new_swap_status, QString swap_uuid, QString base_coin, QString rel_coin, QString human_date); void balanceUpdateStatus(bool am_i_sender, QString amount, QString ticker, QString human_date, qint64 timestamp); + void enablingZCoinStatus(QString coin, QString error, QString human_date, qint64 timestamp); void enablingCoinFailedStatus(QString coin, QString error, QString human_date, qint64 timestamp); + void disablingCoinFailedStatus(QString coin, QString error, QString human_date, qint64 timestamp); void endpointNonReacheableStatus(QString base_uri, QString human_date, qint64 timestamp); void mismatchCustomCoinConfiguration(QString asset, QString human_date, qint64 timestamp); void fatalNotification(QString message); diff --git a/src/core/atomicdex/managers/qt.wallet.manager.cpp b/src/core/atomicdex/managers/qt.wallet.manager.cpp index 51725b12e2..15b0f23c6d 100644 --- a/src/core/atomicdex/managers/qt.wallet.manager.cpp +++ b/src/core/atomicdex/managers/qt.wallet.manager.cpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -299,13 +299,24 @@ namespace atomic_dex const std::string wallet_cfg_file = std::string(atomic_dex::get_raw_version()) + "-coins"s + "."s + wallet_name.toStdString() + ".json"s; const fs::path wallet_cfg_path = utils::get_atomic_dex_config_folder() / wallet_cfg_file; + bool valid_json = false; + if (fs::exists(wallet_cfg_path)) + { + QFile ifs; + ifs.setFileName(std_path_to_qstring(wallet_cfg_path)); + ifs.open(QIODevice::ReadOnly | QIODevice::Text); + std::string json_data = QString(ifs.readAll()).toUtf8().constData(); + valid_json = nlohmann::json::accept(json_data); - if (not fs::exists(wallet_cfg_path)) + ifs.close(); + } + + if (!valid_json) { const auto cfg_path = ag::core::assets_real_path() / "config"; std::string filename = std::string(atomic_dex::get_raw_version()) + "-coins.json"; - fs::copy(cfg_path / filename, wallet_cfg_path); + fs::copy(cfg_path / filename, wallet_cfg_path, fs::copy_options::overwrite_existing); } const fs::path seed_path = utils::get_atomic_dex_config_folder() / (wallet_name.toStdString() + ".seed"s); diff --git a/src/core/atomicdex/models/qt.global.coins.cfg.model.cpp b/src/core/atomicdex/models/qt.global.coins.cfg.model.cpp index 79205dafc3..6acc6c482d 100644 --- a/src/core/atomicdex/models/qt.global.coins.cfg.model.cpp +++ b/src/core/atomicdex/models/qt.global.coins.cfg.model.cpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -30,13 +30,14 @@ namespace { QJsonObject j{ {"active", coin.active}, + {"activation_status", atomic_dex::nlohmann_json_object_to_qt_json_object(coin.activation_status)}, {"is_claimable", coin.is_claimable}, {"minimal_balance_for_asking_rewards", QString::fromStdString(coin.minimal_claim_amount)}, {"ticker", QString::fromStdString(coin.ticker)}, {"name", QString::fromStdString(coin.name)}, {"type", QString::fromStdString(coin.type)}, {"nomics_id", QString::fromStdString(coin.nomics_id)}, - {"explorer_url", QJsonArray::fromStringList(atomic_dex::vector_std_string_to_qt_string_list(coin.explorer_url))}, + {"explorer_url", QString::fromStdString(coin.explorer_url)}, {"tx_uri", QString::fromStdString(coin.tx_uri)}, {"address_uri", QString::fromStdString(coin.address_url)}, {"is_custom_coin", coin.is_custom_coin}, @@ -44,6 +45,7 @@ namespace {"has_parent_fees_ticker", coin.has_parent_fees_ticker}, {"is_testnet", coin.is_testnet.value_or(false)}, {"is_erc_family", coin.is_erc_family}, + {"is_zhtlc_family", coin.is_zhtlc_family}, {"is_wallet_only", coin.wallet_only}, {"fees_ticker", QString::fromStdString(coin.fees_ticker)}}; return j; @@ -96,6 +98,8 @@ namespace atomic_dex return item.currently_enabled; case Active: return item.active; + case ActivationStatus: + return atomic_dex::nlohmann_json_object_to_qt_json_object(item.activation_status); case IsCustomCoin: return item.is_custom_coin; case Type: @@ -213,8 +217,7 @@ namespace atomic_dex } template - void - global_coins_cfg_model::update_status(const TArray& tickers, bool status) + void global_coins_cfg_model::update_status(const TArray& tickers, bool status) { auto update_functor = [this, status](QModelIndexList res, [[maybe_unused]] const QString& ticker) { // SPDLOG_INFO("Changing Active/CurrentlyEnabled status to {} for ticker {}", status, ticker.toStdString()); @@ -323,6 +326,19 @@ namespace atomic_dex return m_proxies[CoinType::UTXO]; } + + global_coins_cfg_proxy_model* + global_coins_cfg_model::get_all_slp_proxy() const + { + return m_proxies[CoinType::SLP]; + } + + global_coins_cfg_proxy_model* + global_coins_cfg_model::get_all_zhtlc_proxy() const + { + return m_proxies[CoinType::ZHTLC]; + } + int global_coins_cfg_model::get_length() const { diff --git a/src/core/atomicdex/models/qt.global.coins.cfg.model.hpp b/src/core/atomicdex/models/qt.global.coins.cfg.model.hpp index 94587cd6f5..f64b244322 100644 --- a/src/core/atomicdex/models/qt.global.coins.cfg.model.hpp +++ b/src/core/atomicdex/models/qt.global.coins.cfg.model.hpp @@ -55,7 +55,8 @@ namespace atomic_dex IsCustomCoin, Type, CoinType, - Checked + Checked, + ActivationStatus }; Q_ENUMS(CoinsRoles) @@ -85,16 +86,18 @@ namespace atomic_dex [[nodiscard]] global_coins_cfg_proxy_model* get_all_bep20_proxy() const; [[nodiscard]] global_coins_cfg_proxy_model* get_all_smartchains_proxy() const; [[nodiscard]] global_coins_cfg_proxy_model* get_all_utxo_proxy() const; + [[nodiscard]] global_coins_cfg_proxy_model* get_all_slp_proxy() const; + [[nodiscard]] global_coins_cfg_proxy_model* get_all_zhtlc_proxy() const; [[nodiscard]] int get_length() const; [[nodiscard]] int get_checked_nb() const; void set_checked_nb(int value); [[nodiscard]] const QStringList& get_all_coin_types() const; // QML API functions - Q_INVOKABLE QStringList get_checked_coins() const; - Q_INVOKABLE QVariant get_coin_info(const QString& ticker) const; - Q_INVOKABLE QString get_parent_coin(const QString& ticker) const; - Q_INVOKABLE bool is_coin_type(const QString& ticker) const; // Tells if the given string is a valid coin type (e.g. QRC-20) + [[nodiscard]] Q_INVOKABLE QStringList get_checked_coins() const; + [[nodiscard]] Q_INVOKABLE QVariant get_coin_info(const QString& ticker) const; + [[nodiscard]] Q_INVOKABLE QString get_parent_coin(const QString& ticker) const; + [[nodiscard]] Q_INVOKABLE bool is_coin_type(const QString& ticker) const; // Tells if the given string is a valid coin type (e.g. QRC-20) // QML API properties Q_PROPERTY(global_coins_cfg_proxy_model* all_disabled_proxy READ get_all_disabled_proxy NOTIFY all_disabled_proxyChanged) @@ -104,6 +107,8 @@ namespace atomic_dex Q_PROPERTY(global_coins_cfg_proxy_model* all_bep20_proxy READ get_all_bep20_proxy NOTIFY all_bep20_proxyChanged) Q_PROPERTY(global_coins_cfg_proxy_model* all_smartchains_proxy READ get_all_smartchains_proxy NOTIFY all_smartchains_proxyChanged) Q_PROPERTY(global_coins_cfg_proxy_model* all_utxo_proxy READ get_all_utxo_proxy NOTIFY all_utxo_proxyChanged) + Q_PROPERTY(global_coins_cfg_proxy_model* all_slp_proxy READ get_all_slp_proxy NOTIFY all_slp_proxyChanged) + Q_PROPERTY(global_coins_cfg_proxy_model* all_zhtlc_proxy READ get_all_zhtlc_proxy NOTIFY all_zhtlc_proxyChanged) Q_PROPERTY(int length READ get_length NOTIFY lengthChanged) Q_PROPERTY(int checked_nb READ get_checked_nb WRITE set_checked_nb NOTIFY checked_nbChanged) Q_PROPERTY(QStringList all_coin_types READ get_all_coin_types) @@ -117,6 +122,8 @@ namespace atomic_dex void all_bep20_proxyChanged(); void all_smartchains_proxyChanged(); void all_utxo_proxyChanged(); + void all_slp_proxyChanged(); + void all_zhtlc_proxyChanged(); void lengthChanged(); void checked_nbChanged(); diff --git a/src/core/atomicdex/models/qt.global.coins.cfg.proxy.filter.model.cpp b/src/core/atomicdex/models/qt.global.coins.cfg.proxy.filter.model.cpp index 5599adb226..b72dc71f48 100644 --- a/src/core/atomicdex/models/qt.global.coins.cfg.proxy.filter.model.cpp +++ b/src/core/atomicdex/models/qt.global.coins.cfg.proxy.filter.model.cpp @@ -38,7 +38,12 @@ namespace atomic_dex [[maybe_unused]] QModelIndex idx = this->sourceModel()->index(source_row, 0, source_parent); assert(this->sourceModel()->hasIndex(idx.row(), 0)); - if (m_type < CoinType::Disabled) + if (this->sourceModel()->data(idx, global_coins_cfg_model::CoinType) == static_cast(CoinType::Invalid)) + { + return false; + } + + else if (m_type < CoinType::Disabled) { if (this->sourceModel()->data(idx, global_coins_cfg_model::CoinType) != static_cast(m_type)) { diff --git a/src/core/atomicdex/models/qt.orderbook.model.cpp b/src/core/atomicdex/models/qt.orderbook.model.cpp index 65e4958a73..9f6b9344c5 100644 --- a/src/core/atomicdex/models/qt.orderbook.model.cpp +++ b/src/core/atomicdex/models/qt.orderbook.model.cpp @@ -254,7 +254,7 @@ namespace atomic_dex { return false; } - ::mm2::api::order_contents& order = m_model_data.at(index.row()); + mm2::order_contents& order = m_model_data.at(index.row()); switch (static_cast(role)) { case PriceRole: @@ -411,7 +411,7 @@ namespace atomic_dex void - orderbook_model::initialize_order(const ::mm2::api::order_contents& order) + orderbook_model::initialize_order(const mm2::order_contents& order) { if (m_orders_id_registry.contains(order.uuid)) { @@ -450,7 +450,7 @@ namespace atomic_dex } void - orderbook_model::update_order(const ::mm2::api::order_contents& order) + orderbook_model::update_order(const mm2::order_contents& order) { if (const auto res = this->match(index(0, 0), UUIDRole, QString::fromStdString(order.uuid)); not res.isEmpty()) { @@ -541,19 +541,16 @@ namespace atomic_dex void orderbook_model::refresh_orderbook(const t_orders_contents& orderbook) { - auto refresh_functor = [this](const std::vector<::mm2::api::order_contents>& contents) + auto refresh_functor = [this](const std::vector& contents) { - // SPDLOG_INFO("refresh orderbook of size: {}", contents.size()); for (auto&& current_order: contents) { if (this->m_orders_id_registry.find(current_order.uuid) != this->m_orders_id_registry.end()) { - //! Update this->update_order(current_order); } else { - //! Insertion this->initialize_order(current_order); } } @@ -569,10 +566,6 @@ namespace atomic_dex auto res_list = this->match(index(0, 0), UUIDRole, QString::fromStdString(id)); if (not res_list.empty()) { - if (this->m_current_orderbook_kind == kind::best_orders) - { - // SPDLOG_INFO("Removing order with UUID: {}", id); - } this->removeRow(res_list.at(0).row()); to_remove.emplace(id); } @@ -626,7 +619,7 @@ namespace atomic_dex void orderbook_model::clear_orderbook() { - SPDLOG_INFO("clear orderbook"); + // SPDLOG_INFO("clear orderbook"); this->beginResetModel(); m_model_data = t_orders_contents{}; m_orders_id_registry.clear(); diff --git a/src/core/atomicdex/models/qt.orderbook.model.hpp b/src/core/atomicdex/models/qt.orderbook.model.hpp index a9289ff937..6b84565e20 100644 --- a/src/core/atomicdex/models/qt.orderbook.model.hpp +++ b/src/core/atomicdex/models/qt.orderbook.model.hpp @@ -105,8 +105,8 @@ namespace atomic_dex void betterOrderDetected(QVariantMap order_object); private: - void initialize_order(const ::mm2::api::order_contents& order); - void update_order(const ::mm2::api::order_contents& order); + void initialize_order(const mm2::order_contents& order); + void update_order(const mm2::order_contents& order); QVariantMap get_order_from_uuid(QString uuid); void check_for_better_order(trading_page& trading_pg, const QVariantMap& preferred_order, std::string uuid); diff --git a/src/core/atomicdex/models/qt.orders.model.cpp b/src/core/atomicdex/models/qt.orders.model.cpp index 64ab7c072f..8a74a41fed 100644 --- a/src/core/atomicdex/models/qt.orders.model.cpp +++ b/src/core/atomicdex/models/qt.orders.model.cpp @@ -711,9 +711,9 @@ namespace atomic_dex this->set_recover_fund_busy(true); auto& mm2_system = m_system_manager.get_system(); nlohmann::json batch = nlohmann::json::array(); - nlohmann::json json_data = ::mm2::api::template_request("recover_funds_of_swap"); - mm2::api::recover_funds_of_swap_request req{.swap_uuid = uuid.toStdString()}; - ::mm2::api::to_json(json_data, req); + nlohmann::json json_data = mm2::template_request("recover_funds_of_swap"); + mm2::recover_funds_of_swap_request req{.swap_uuid = uuid.toStdString()}; + mm2::to_json(json_data, req); batch.push_back(json_data); SPDLOG_DEBUG("recover_funds_of_swap request: {}", json_data.dump(-1)); @@ -728,7 +728,7 @@ namespace atomic_dex if (resp.status_code() == web::http::status_codes::OK) { auto answers = nlohmann::json::parse(body); - auto recover_answer = ::mm2::api::rpc_process_answer_batch(answers[0], "recover_funds_of_swap"); + auto recover_answer = mm2::rpc_process_answer_batch(answers[0], "recover_funds_of_swap"); if (recover_answer.result.has_value()) { auto answer = recover_answer.result.value(); diff --git a/src/core/atomicdex/models/qt.portfolio.model.cpp b/src/core/atomicdex/models/qt.portfolio.model.cpp index 6cb81c3cc0..6fce77b3ca 100644 --- a/src/core/atomicdex/models/qt.portfolio.model.cpp +++ b/src/core/atomicdex/models/qt.portfolio.model.cpp @@ -79,6 +79,7 @@ namespace atomic_dex .main_currency_price_for_one_unit = QString::fromStdString(price_service.get_rate_conversion(m_config->current_currency, coin.ticker, true)), .main_fiat_price_for_one_unit = QString::fromStdString(price_service.get_rate_conversion(m_config->current_fiat, coin.ticker)), .trend_7d = nlohmann_json_array_to_qt_json_array(provider.get_ticker_historical(coin.ticker)), + .activation_status = nlohmann_json_object_to_qt_json_object(coin.activation_status), .price_provider = QString::fromStdString(provider.get_price_provider(coin.ticker)), .price_last_timestamp = static_cast(provider.get_last_price_timestamp(coin.ticker)), .is_excluded = false, @@ -102,15 +103,13 @@ namespace atomic_dex bool portfolio_model::update_currency_values() { - SPDLOG_INFO("update_currency_values"); const auto& mm2_system = this->m_system_manager.get_system(); const auto& price_service = this->m_system_manager.get_system(); const auto& provider = this->m_system_manager.get_system(); const auto coins = this->m_system_manager.get_system().get_global_cfg()->get_enabled_coins(); const std::string& currency = m_config->current_currency; const std::string& fiat = m_config->current_fiat; - tf::Executor executor; - tf::Taskflow taskflow; + for (auto&& [_, coin]: coins) { if (m_ticker_registry.find(coin.ticker) == m_ticker_registry.end()) @@ -118,43 +117,42 @@ namespace atomic_dex SPDLOG_WARN("ticker: {} not inserted yet in the model, skipping", coin.ticker); return false; } - auto update_functor = [coin = std::move(coin), &provider, &mm2_system, &price_service, currency, fiat, this]() + const std::string& ticker = coin.ticker; + if (const auto res = this->match(this->index(0, 0), TickerRole, QString::fromStdString(ticker), 1, Qt::MatchFlag::MatchExactly); + not res.isEmpty()) { - const std::string& ticker = coin.ticker; - if (const auto res = this->match(this->index(0, 0), TickerRole, QString::fromStdString(ticker), 1, Qt::MatchFlag::MatchExactly); - not res.isEmpty()) + std::error_code ec; + const QModelIndex& idx = res.at(0); + const QString main_currency_balance_value = QString::fromStdString(price_service.get_price_in_fiat(currency, ticker, ec)); + update_value(MainCurrencyBalanceRole, main_currency_balance_value, idx, *this); + const QString currency_price_for_one_unit = QString::fromStdString(price_service.get_rate_conversion(currency, ticker, true)); + update_value(MainCurrencyPriceForOneUnit, currency_price_for_one_unit, idx, *this); + const QString currency_fiat_for_one_unit = QString::fromStdString(price_service.get_rate_conversion(fiat, ticker, false)); + update_value(MainFiatPriceForOneUnit, currency_fiat_for_one_unit, idx, *this); + const QString price_provider = QString::fromStdString(provider.get_price_provider(ticker)); + update_value(PriceProvider, price_provider, idx, *this); + int last_price_timestamp = static_cast(provider.get_last_price_timestamp(ticker)); + update_value(LastPriceTimestamp, last_price_timestamp, idx, *this); + QString change24_h = retrieve_change_24h(provider, coin, *m_config, m_system_manager); + update_value(Change24H, change24_h, idx, *this); + const QString balance = QString::fromStdString(mm2_system.my_balance(coin.ticker, ec)); + auto&& [prev_balance, new_balance, is_change_b] = update_value(BalanceRole, balance, idx, *this); + const QString display = QString::fromStdString(coin.ticker) + " (" + balance + ")"; + update_value(Display, display, idx, *this); + // Not a good way to trigger notification, use websocket instead in the future. New was of enabling coins is not compatible. + if (is_change_b) { - std::error_code ec; - const QModelIndex& idx = res.at(0); - const QString main_currency_balance_value = QString::fromStdString(price_service.get_price_in_fiat(currency, ticker, ec)); - update_value(MainCurrencyBalanceRole, main_currency_balance_value, idx, *this); - const QString currency_price_for_one_unit = QString::fromStdString(price_service.get_rate_conversion(currency, ticker, true)); - update_value(MainCurrencyPriceForOneUnit, currency_price_for_one_unit, idx, *this); - const QString currency_fiat_for_one_unit = QString::fromStdString(price_service.get_rate_conversion(fiat, ticker, false)); - update_value(MainFiatPriceForOneUnit, currency_fiat_for_one_unit, idx, *this); - const QString price_provider = QString::fromStdString(provider.get_price_provider(ticker)); - update_value(PriceProvider, price_provider, idx, *this); - int last_price_timestamp = static_cast(provider.get_last_price_timestamp(ticker)); - update_value(LastPriceTimestamp, last_price_timestamp, idx, *this); - QString change24_h = retrieve_change_24h(provider, coin, *m_config, m_system_manager); - update_value(Change24H, change24_h, idx, *this); - const QString balance = QString::fromStdString(mm2_system.my_balance(coin.ticker, ec)); - auto&& [prev_balance, new_balance, is_change_b] = update_value(BalanceRole, balance, idx, *this); - const QString display = QString::fromStdString(coin.ticker) + " (" + balance + ")"; - update_value(Display, display, idx, *this); - // Not a good way to trigger notification, use websocket instead in the future. New was of enabling coins is not compatible. - if (is_change_b) - { - balance_update_handler(prev_balance.toString(), new_balance.toString(), QString::fromStdString(ticker)); - } - QJsonArray trend = nlohmann_json_array_to_qt_json_array(provider.get_ticker_historical(ticker)); - update_value(Trend7D, trend, idx, *this); - // SPDLOG_DEBUG("updated currency values of: {}", ticker); + balance_update_handler(prev_balance.toString(), new_balance.toString(), QString::fromStdString(ticker)); } - }; - taskflow.emplace(update_functor); + QJsonArray trend = nlohmann_json_array_to_qt_json_array(provider.get_ticker_historical(ticker)); + update_value(Trend7D, trend, idx, *this); + + auto coin_info = mm2_system.get_coin_info(ticker); + QJsonObject status = nlohmann_json_object_to_qt_json_object(coin_info.activation_status); + update_value(ActivationStatus, status, idx, *this); + SPDLOG_DEBUG("updated currency values of: {}", ticker); + } } - executor.run(taskflow).wait(); return true; } @@ -207,6 +205,9 @@ namespace atomic_dex } QJsonArray trend = nlohmann_json_array_to_qt_json_array(provider.get_ticker_historical(ticker)); update_value(Trend7D, trend, idx, *this); + auto coin_info = mm2_system.get_coin_info(ticker); + QJsonObject status = nlohmann_json_object_to_qt_json_object(coin_info.activation_status); + update_value(ActivationStatus, status, idx, *this); if (ticker == mm2_system.get_current_ticker() && (is_change_b || is_change_mc || is_change_mcpfo)) { m_system_manager.get_system().refresh_ticker_infos(); @@ -243,6 +244,8 @@ namespace atomic_dex return item.main_fiat_price_for_one_unit; case NameRole: return item.name; + case ActivationStatus: + return item.activation_status; case Trend7D: return item.trend_7d; case Excluded: @@ -313,6 +316,9 @@ namespace atomic_dex case Trend7D: item.trend_7d = value.toJsonArray(); break; + case ActivationStatus: + item.activation_status = value.toJsonObject(); + break; case Excluded: item.is_excluded = value.toBool(); break; @@ -427,6 +433,7 @@ namespace atomic_dex {MainCurrencyPriceForOneUnit, "main_currency_price_for_one_unit"}, {MainFiatPriceForOneUnit, "main_fiat_price_for_one_unit"}, {Trend7D, "trend_7d"}, + {ActivationStatus, "activation_status"}, {Excluded, "excluded"}, {Display, "display"}, {NameAndTicker, "name_and_ticker"}, diff --git a/src/core/atomicdex/models/qt.portfolio.model.hpp b/src/core/atomicdex/models/qt.portfolio.model.hpp index ebec95b815..9ed6e57ff1 100644 --- a/src/core/atomicdex/models/qt.portfolio.model.hpp +++ b/src/core/atomicdex/models/qt.portfolio.model.hpp @@ -55,6 +55,7 @@ namespace atomic_dex MainCurrencyPriceForOneUnit, MainFiatPriceForOneUnit, Trend7D, + ActivationStatus, Excluded, Display, NameAndTicker, diff --git a/src/core/atomicdex/models/qt.portfolio.proxy.filter.model.cpp b/src/core/atomicdex/models/qt.portfolio.proxy.filter.model.cpp index 2e8a2c7bff..ad39cc4b49 100644 --- a/src/core/atomicdex/models/qt.portfolio.proxy.filter.model.cpp +++ b/src/core/atomicdex/models/qt.portfolio.proxy.filter.model.cpp @@ -56,6 +56,7 @@ namespace atomic_dex return safe_float(left_data.toString().toStdString()) < safe_float(right_data.toString().toStdString()); case portfolio_model::MainFiatPriceForOneUnit: case portfolio_model::Trend7D: + case portfolio_model::ActivationStatus: case portfolio_model::Excluded: case portfolio_model::Display: case portfolio_model::NameAndTicker: @@ -78,10 +79,10 @@ namespace atomic_dex bool portfolio_proxy_model::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { - QModelIndex idx = this->sourceModel()->index(source_row, 0, source_parent); + QModelIndex idx = this->sourceModel()->index(source_row, 0, source_parent); assert(this->sourceModel()->hasIndex(idx.row(), 0)); - QString ticker = this->sourceModel()->data(idx, atomic_dex::portfolio_model::TickerRole).toString(); - QString type = this->sourceModel()->data(idx, atomic_dex::portfolio_model::CoinType).toString(); + QString ticker = this->sourceModel()->data(idx, atomic_dex::portfolio_model::TickerRole).toString(); + QString type = this->sourceModel()->data(idx, atomic_dex::portfolio_model::CoinType).toString(); if (this->filterRole() == atomic_dex::portfolio_model::MultiTickerCurrentlyEnabled) { @@ -201,7 +202,11 @@ namespace atomic_dex void portfolio_proxy_model::set_with_fiat_balance(bool value) { - m_with_fiat_balance = value; + if (value != m_with_fiat_balance) + { + m_with_fiat_balance = value; + this->invalidateFilter(); + } } void diff --git a/src/core/atomicdex/models/qt.wallet.transactions.model.cpp b/src/core/atomicdex/models/transactions_model.cpp similarity index 88% rename from src/core/atomicdex/models/qt.wallet.transactions.model.cpp rename to src/core/atomicdex/models/transactions_model.cpp index 8b464b7229..26245134a0 100644 --- a/src/core/atomicdex/models/qt.wallet.transactions.model.cpp +++ b/src/core/atomicdex/models/transactions_model.cpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -14,8 +14,7 @@ * * ******************************************************************************/ -//! Project Headers -#include "atomicdex/models/qt.wallet.transactions.model.hpp" +#include "transactions_model.hpp" #include "atomicdex/managers/qt.wallet.manager.hpp" #include "atomicdex/pages/qt.settings.page.hpp" #include "atomicdex/services/price/global.provider.hpp" @@ -38,10 +37,10 @@ namespace atomic_dex this->m_model_proxy->sort(0); } - QHash - transactions_model::roleNames() const + QHash transactions_model::roleNames() const { - return { + return + { {AmountRole, "amount"}, {AmISenderRole, "am_i_sender"}, {DateRole, "date"}, @@ -55,18 +54,16 @@ namespace atomic_dex {BlockheightRole, "blockheight"}, {ConfirmationsRole, "confirmations"}, {UnconfirmedRole, "unconfirmed"}, - {TransactionNoteRole, "transaction_note"}}; + {TransactionNoteRole, "transaction_note"} + }; } - int - transactions_model::rowCount([[maybe_unused]] const QModelIndex& parent) const + int transactions_model::rowCount([[maybe_unused]] const QModelIndex& parent) const { - // return m_model_data.size(); return static_cast(m_file_count); } - bool - atomic_dex::transactions_model::setData(const QModelIndex& index, const QVariant& value, int role) + bool atomic_dex::transactions_model::setData(const QModelIndex& index, const QVariant& value, int role) { if (!hasIndex(index.row(), index.column(), index.parent()) || !value.isValid()) { @@ -119,8 +116,7 @@ namespace atomic_dex return true; } - QVariant - transactions_model::data(const QModelIndex& index, int role) const + QVariant transactions_model::data(const QModelIndex& index, int role) const { if (!hasIndex(index.row(), index.column(), index.parent())) { @@ -182,8 +178,7 @@ namespace atomic_dex return {}; } - void - atomic_dex::transactions_model::reset() + void atomic_dex::transactions_model::reset() { this->m_file_count = 0; this->beginResetModel(); @@ -192,13 +187,11 @@ namespace atomic_dex emit lengthChanged(); } - void - transactions_model::init_transactions(const t_transactions& transactions) + void transactions_model::init_transactions(const t_transactions& transactions) { if (m_model_data.size() == 0) { SPDLOG_DEBUG("first time initialization, inserting {} transactions", transactions.size()); - //! First time insertion beginResetModel(); m_model_data = transactions; m_file_count = transactions.size() < g_file_count_limit ? transactions.size() : g_file_count_limit; @@ -228,13 +221,13 @@ namespace atomic_dex emit lengthChanged(); } - void - atomic_dex::transactions_model::update_transaction(const tx_infos& tx) + void atomic_dex::transactions_model::update_transaction(const tx_infos& tx) { if (const auto res = this->match(this->index(0, 0), TxHashRole, QString::fromStdString(tx.tx_hash)); not res.isEmpty()) { - const QModelIndex& idx = res.at(0); - quint64 timestamp = tx.timestamp; + const QModelIndex& idx = res.at(0); + quint64 timestamp = tx.timestamp; + update_value(TimestampRole, timestamp, idx, *this); update_value(DateRole, QString::fromStdString(tx.date), idx, *this); update_value(ConfirmationsRole, static_cast(tx.confirmations), idx, *this); @@ -242,8 +235,7 @@ namespace atomic_dex } } - void - atomic_dex::transactions_model::update_or_insert_transactions(const t_transactions& transactions) + void atomic_dex::transactions_model::update_or_insert_transactions(const t_transactions& transactions) { if (m_model_data.size() > transactions.size()) { @@ -285,20 +277,17 @@ namespace atomic_dex } } - int - transactions_model::get_length() const + int transactions_model::get_length() const { return rowCount(); } - transactions_proxy_model* - transactions_model::get_transactions_proxy() const + transactions_proxy_model* transactions_model::get_transactions_proxy() const { return m_model_proxy; } - void - atomic_dex::transactions_model::fetchMore(const QModelIndex& parent) + void atomic_dex::transactions_model::fetchMore(const QModelIndex& parent) { if (parent.isValid()) { @@ -317,10 +306,8 @@ namespace atomic_dex emit lengthChanged(); } - bool - atomic_dex::transactions_model::canFetchMore([[maybe_unused]] const QModelIndex& parent) const + bool atomic_dex::transactions_model::canFetchMore([[maybe_unused]] const QModelIndex& parent) const { return (m_file_count < m_model_data.size()); } - } // namespace atomic_dex diff --git a/src/core/atomicdex/models/qt.wallet.transactions.model.hpp b/src/core/atomicdex/models/transactions_model.hpp similarity index 90% rename from src/core/atomicdex/models/qt.wallet.transactions.model.hpp rename to src/core/atomicdex/models/transactions_model.hpp index ef9c453851..b76b85a8fd 100644 --- a/src/core/atomicdex/models/qt.wallet.transactions.model.hpp +++ b/src/core/atomicdex/models/transactions_model.hpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -16,12 +16,10 @@ #pragma once -//! QT Headers #include #include -//! Project Headers -#include "atomicdex/models/qt.wallet.transactions.proxy.filter.model.hpp" +#include "transactions_proxy_model.hpp" #include "atomicdex/services/mm2/mm2.service.hpp" namespace atomic_dex @@ -29,6 +27,7 @@ namespace atomic_dex class transactions_model final : public QAbstractListModel { Q_OBJECT + Q_PROPERTY(int length READ get_length NOTIFY lengthChanged); Q_PROPERTY(transactions_proxy_model* proxy_mdl READ get_transactions_proxy NOTIFY transactionsProxyMdlChanged) @@ -37,7 +36,7 @@ namespace atomic_dex t_transactions m_model_data; std::size_t m_file_count{0}; - public: + public: enum TransactionsRoles { AmountRole = Qt::UserRole + 1, @@ -56,15 +55,15 @@ namespace atomic_dex TransactionNoteRole }; - transactions_model(ag::ecs::system_manager& system_manager, QObject* parent = nullptr) ; - ~transactions_model() final = default; + transactions_model(ag::ecs::system_manager& system_manager, QObject* parent = nullptr); + ~transactions_model() final = default; void reset(); void init_transactions(const t_transactions& transactions); void update_or_insert_transactions(const t_transactions& transactions); void update_transaction(const tx_infos& tx); - //! Override + // Override [[nodiscard]] QHash roleNames() const final; [[nodiscard]] QVariant data(const QModelIndex& index, int role) const final; [[nodiscard]] int rowCount(const QModelIndex& parent = QModelIndex()) const final; @@ -72,11 +71,11 @@ namespace atomic_dex void fetchMore(const QModelIndex& parent) final; bool canFetchMore(const QModelIndex& parent) const final; - //! Props - [[nodiscard]] int get_length() const ; - [[nodiscard]] transactions_proxy_model* get_transactions_proxy() const ; + // Getters + [[nodiscard]] int get_length() const; + [[nodiscard]] transactions_proxy_model* get_transactions_proxy() const; - signals: + signals: void lengthChanged(); void transactionsProxyMdlChanged(); }; diff --git a/src/core/atomicdex/models/qt.wallet.transactions.proxy.filter.model.cpp b/src/core/atomicdex/models/transactions_proxy_model.cpp similarity index 88% rename from src/core/atomicdex/models/qt.wallet.transactions.proxy.filter.model.cpp rename to src/core/atomicdex/models/transactions_proxy_model.cpp index d58b6da5e0..fcbc68ecbc 100644 --- a/src/core/atomicdex/models/qt.wallet.transactions.proxy.filter.model.cpp +++ b/src/core/atomicdex/models/transactions_proxy_model.cpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -14,9 +14,8 @@ * * ******************************************************************************/ -//! Project Headers -#include "atomicdex/models/qt.wallet.transactions.proxy.filter.model.hpp" -#include "atomicdex/models/qt.wallet.transactions.model.hpp" +#include "transactions_proxy_model.hpp" +#include "transactions_model.hpp" namespace atomic_dex { @@ -24,8 +23,7 @@ namespace atomic_dex { } - bool - transactions_proxy_model::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const + bool transactions_proxy_model::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const { int role = this->sortRole(); QVariant left_data = sourceModel()->data(source_left, role); diff --git a/src/core/atomicdex/models/qt.wallet.transactions.proxy.filter.model.hpp b/src/core/atomicdex/models/transactions_proxy_model.hpp similarity index 85% rename from src/core/atomicdex/models/qt.wallet.transactions.proxy.filter.model.hpp rename to src/core/atomicdex/models/transactions_proxy_model.hpp index a27cf8705f..ff6cdf9a54 100644 --- a/src/core/atomicdex/models/qt.wallet.transactions.proxy.filter.model.hpp +++ b/src/core/atomicdex/models/transactions_proxy_model.hpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -22,17 +22,14 @@ namespace atomic_dex { class transactions_proxy_model final : public QSortFilterProxyModel { - Q_OBJECT + Q_OBJECT - public: - //! Constructor + public: transactions_proxy_model(QObject* parent); + ~transactions_proxy_model() final = default; - //! Destructor - ~transactions_proxy_model() final = default; - - protected: - //! Override member functions + protected: + // Override [[nodiscard]] bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const final; }; } diff --git a/src/core/atomicdex/pages/qt.settings.page.cpp b/src/core/atomicdex/pages/qt.settings.page.cpp index 116335890d..9cf5249712 100644 --- a/src/core/atomicdex/pages/qt.settings.page.cpp +++ b/src/core/atomicdex/pages/qt.settings.page.cpp @@ -25,6 +25,8 @@ #include // Project Headers +#include "atomicdex/api/mm2/get_public_key_rpc.hpp" +#include "atomicdex/config/enable.cfg.hpp" #include "atomicdex/events/events.hpp" #include "atomicdex/managers/qt.wallet.manager.hpp" #include "atomicdex/models/qt.global.coins.cfg.model.hpp" @@ -35,7 +37,6 @@ #include "atomicdex/services/price/global.provider.hpp" #include "atomicdex/utilities/global.utilities.hpp" #include "atomicdex/utilities/qt.utilities.hpp" -#include "atomicdex/api/mm2/rpc.get.public.key.hpp" namespace { @@ -100,6 +101,14 @@ namespace atomic_dex { return QLocale::Language::English; } + else if (current_lang == "es") + { + return QLocale::Language::Spanish; + } + else if (current_lang == "de") + { + return QLocale::Language::German; + } else if (current_lang == "fr") { return QLocale::Language::French; @@ -390,7 +399,7 @@ namespace atomic_dex out["adex_cfg"][ticker]["gui_coin"] = ticker; out["adex_cfg"][ticker]["name"] = body_json.at("qrc20").at("name").get(); out["adex_cfg"][ticker]["coingecko_id"] = coingecko_id.toStdString(); - out["adex_cfg"][ticker]["explorer_url"] = nlohmann::json::array({"https://explorer.qtum.org/"}); + out["adex_cfg"][ticker]["explorer_url"] = "https://explorer.qtum.org/"; out["adex_cfg"][ticker]["type"] = "QRC-20"; out["adex_cfg"][ticker]["active"] = true; out["adex_cfg"][ticker]["currently_enabled"] = false; @@ -419,7 +428,7 @@ namespace atomic_dex this->set_custom_token_data(nlohmann_json_object_to_qt_json_object(out)); this->set_fetching_custom_token_data_busy(false); }; - ::mm2::api::async_process_rpc_get(::mm2::api::g_qtum_proxy_http_client, "qrc_infos", url).then(answer_functor).then(&handle_exception_pplx_task); + mm2::async_process_rpc_get(mm2::g_qtum_proxy_http_client, "qrc_infos", url).then(answer_functor).then(&handle_exception_pplx_task); } void settings_page::process_token_add(const QString& contract_address, const QString& coingecko_id, const QString& icon_filepath, CoinType coin_type) @@ -433,17 +442,17 @@ namespace atomic_dex { case CoinTypeGadget::QRC20: return std::make_tuple( - &::mm2::api::g_qtum_proxy_http_client, "/contract/"s + contract_address.toStdString(), "QRC20"s, "QTUM"s, "QRC-20"s, "QTUM"s, "QRC20"s); + &mm2::g_qtum_proxy_http_client, "/contract/"s + contract_address.toStdString(), "QRC20"s, "QTUM"s, "QRC-20"s, "QTUM"s, "QRC20"s); case CoinTypeGadget::ERC20: return std::make_tuple( - &::mm2::api::g_etherscan_proxy_http_client, "/api/v1/token_infos/erc20/"s + contract_address.toStdString(), "ERC20"s, "ETH"s, "ERC-20"s, + &mm2::g_etherscan_proxy_http_client, "/api/v1/token_infos/erc20/"s + contract_address.toStdString(), "ERC20"s, "ETH"s, "ERC-20"s, "ETH"s, "ERC20"s); case CoinTypeGadget::BEP20: return std::make_tuple( - &::mm2::api::g_etherscan_proxy_http_client, "/api/v1/token_infos/bep20/"s + contract_address.toStdString(), "BEP20"s, "BNB"s, "BEP-20"s, + &mm2::g_etherscan_proxy_http_client, "/api/v1/token_infos/bep20/"s + contract_address.toStdString(), "BEP20"s, "BNB"s, "BEP-20"s, "BNB"s, "ERC20"s); default: - return std::make_tuple(&::mm2::api::g_etherscan_proxy_http_client, ""s, ""s, ""s, ""s, ""s, ""s); + return std::make_tuple(&mm2::g_etherscan_proxy_http_client, ""s, ""s, ""s, ""s, ""s, ""s); } }; auto&& [endpoint, url, type, platform, adex_platform, parent_chain, parent_type] = retrieve_functor_url(); @@ -498,7 +507,7 @@ namespace atomic_dex out["adex_cfg"][ticker]["name"] = name_lowercase; out["adex_cfg"][ticker]["coingecko_id"] = coingecko_id.toStdString(); const auto& coin_info = mm2.get_coin_info(parent_chain); - out["adex_cfg"][ticker]["nodes"] = coin_info.urls.value_or(std::vector()); + out["adex_cfg"][ticker]["nodes"] = coin_info.urls.value_or(std::vector()); out["adex_cfg"][ticker]["explorer_url"] = coin_info.explorer_url; out["adex_cfg"][ticker]["type"] = adex_platform; out["adex_cfg"][ticker]["active"] = true; @@ -516,7 +525,7 @@ namespace atomic_dex this->set_custom_token_data(nlohmann_json_object_to_qt_json_object(out)); this->set_fetching_custom_token_data_busy(false); }; - ::mm2::api::async_process_rpc_get(*endpoint, "token_infos", url).then(answer_functor).then(&handle_exception_pplx_task); + mm2::async_process_rpc_get(*endpoint, "token_infos", url).then(answer_functor).then(&handle_exception_pplx_task); } void settings_page::submit() @@ -637,8 +646,8 @@ namespace atomic_dex const auto coins = cfg_mdl->get_enabled_coins(); for (auto&& [coin, coin_cfg]: coins) { - ::mm2::api::show_priv_key_request req{.coin = coin}; - nlohmann::json req_json = ::mm2::api::template_request("show_priv_key"); + mm2::show_priv_key_request req{.coin = coin}; + nlohmann::json req_json = mm2::template_request("show_priv_key"); to_json(req_json, req); batch.push_back(req_json); } @@ -653,7 +662,7 @@ namespace atomic_dex SPDLOG_WARN("Priv keys fetched, those are sensitive data."); for (auto&& answer: answers) { - auto show_priv_key_answer = ::mm2::api::rpc_process_answer_batch<::mm2::api::show_priv_key_answer>(answer, "show_priv_key"); + auto show_priv_key_answer = mm2::rpc_process_answer_batch(answer, "show_priv_key"); auto* portfolio_mdl = this->m_system_manager.get_system().get_portfolio(); const auto idx = portfolio_mdl->match( portfolio_mdl->index(0, 0), portfolio_model::TickerRole, QString::fromStdString(show_priv_key_answer.coin), 1, @@ -661,6 +670,9 @@ namespace atomic_dex if (not idx.empty()) { update_value(portfolio_model::PrivKey, QString::fromStdString(show_priv_key_answer.priv_key), idx.at(0), *portfolio_mdl); + std::error_code ec; + QString public_address = QString::fromStdString(m_system_manager.get_system().address(show_priv_key_answer.coin, ec)); + update_value(portfolio_model::Address, public_address, idx.at(0), *portfolio_mdl); } } } @@ -668,7 +680,7 @@ namespace atomic_dex }; mm2_system.get_mm2_client().async_rpc_batch_standalone(batch).then(answer_functor); } - return {QString::fromStdString(seed), QString::fromStdString(::mm2::api::get_rpc_password())}; + return {QString::fromStdString(seed), QString::fromStdString(mm2::get_rpc_password())}; } QString settings_page::get_version() @@ -683,7 +695,7 @@ namespace atomic_dex QString settings_page::get_mm2_version() { - return QString::fromStdString(::mm2::api::rpc_version()); + return QString::fromStdString(mm2::rpc_version()); } QString settings_page::get_export_folder() @@ -694,9 +706,12 @@ namespace atomic_dex void settings_page::fetchPublicKey() { auto& mm2_system = m_system_manager.get_system(); - auto get_pub_key_rpc_callback = [this](auto pub_key_answ) + auto get_pub_key_rpc_callback = [this](auto pub_key_rpc) { - public_key = QString::fromStdString(pub_key_answ.public_key); + if (pub_key_rpc.error) + public_key = tr("An error has occurred."); + else + public_key = QString::fromStdString(pub_key_rpc.result->public_key); fetching_public_key = false; emit publicKeyChanged(); emit fetchingPublicKeyChanged(); @@ -705,6 +720,6 @@ namespace atomic_dex fetching_public_key = true; emit fetchingPublicKeyChanged(); - mm2_system.get_mm2_client().process_rpc_async(get_pub_key_rpc_callback); + mm2_system.get_mm2_client().process_rpc_async(get_pub_key_rpc_callback); } } // namespace atomic_dex diff --git a/src/core/atomicdex/pages/qt.trading.page.cpp b/src/core/atomicdex/pages/qt.trading.page.cpp index 380f0d6b11..22bfe71ccc 100644 --- a/src/core/atomicdex/pages/qt.trading.page.cpp +++ b/src/core/atomicdex/pages/qt.trading.page.cpp @@ -28,6 +28,7 @@ #include "atomicdex/services/mm2/mm2.service.hpp" #include "atomicdex/services/price/global.provider.hpp" #include "atomicdex/utilities/qt.utilities.hpp" +#include "atomicdex/utilities/qt.download.manager.hpp" //! Constructor / Destructor namespace atomic_dex @@ -75,12 +76,16 @@ namespace atomic_dex void trading_page::set_current_orderbook(const QString& base, const QString& rel) { + if (base.toStdString() == "" || rel.toStdString() == "") + { + return; + } if (bool is_wallet_only = m_system_manager.get_system().get_coin_info(base.toStdString()).wallet_only; is_wallet_only) { SPDLOG_WARN("{} is wallet only - skipping", base.toStdString()); return; } - SPDLOG_INFO("Setting current orderbook: {} / {}", base.toStdString(), rel.toStdString()); + SPDLOG_DEBUG("Setting current orderbook: {} / {}", base.toStdString(), rel.toStdString()); auto* market_selector_mdl = get_market_pairs_mdl(); const bool to_change = base != market_selector_mdl->get_left_selected_coin() || rel != market_selector_mdl->get_right_selected_coin(); @@ -91,6 +96,7 @@ namespace atomic_dex if (to_change) { + SPDLOG_DEBUG("set_current_orderbook"); this->get_orderbook_wrapper()->clear_orderbook(); this->clear_forms("set_current_orderbook"); } @@ -109,7 +115,7 @@ namespace atomic_dex void trading_page::on_gui_enter_dex() { - SPDLOG_INFO("Enter DEX"); + SPDLOG_DEBUG("Enter DEX"); dispatcher_.trigger(); if (this->m_system_manager.has_system() && m_system_manager.get_system().is_orderbook_thread_active()) { @@ -143,7 +149,7 @@ namespace atomic_dex t_float_50 rel_min_volume_f = safe_float(get_min_trade_vol().toStdString()); if (is_selected_order) { - SPDLOG_INFO( + SPDLOG_DEBUG( "max_volume: {} volume: {} order_volume: {}, order_volume_8_digit: {}, order_volume_8_digit_extracted: {}", m_max_volume.toStdString(), m_volume.toStdString(), m_preferred_order->at("base_max_volume").get(), utils::adjust_precision(m_preferred_order->at("base_max_volume").get()), @@ -175,7 +181,7 @@ namespace atomic_dex if (req.is_exact_selected_order_volume) { //! Selected order and we keep the exact volume (Basically swallow the order) - SPDLOG_INFO("swallowing the order from the orderbook"); + SPDLOG_DEBUG("swallowing the order from the orderbook"); req.volume_numer = m_preferred_order->at("base_max_volume_numer").get(); req.volume_denom = m_preferred_order->at("base_max_volume_denom").get(); } @@ -183,25 +189,25 @@ namespace atomic_dex is_max && !req.is_exact_selected_order_volume && m_preferred_order->contains("max_volume_numer") && m_preferred_order->contains("max_volume_denom")) { - SPDLOG_INFO("cannot swallow the selected order from the orderbook, use our theoretical max_volume for it"); + SPDLOG_DEBUG("cannot swallow the selected order from the orderbook, use our theoretical max_volume for it"); //! Selected order but we cannot swallow (not enough funds) set our theoretical max_volume_numer and max_volume_denom req.volume_numer = m_preferred_order->at("max_volume_numer").get(); req.volume_denom = m_preferred_order->at("max_volume_denom").get(); } else { - SPDLOG_INFO("Selected order, but changing manually the volume, use input_volume"); + SPDLOG_DEBUG("Selected order, but changing manually the volume, use input_volume"); req.selected_order_use_input_volume = true; } } nlohmann::json batch; - nlohmann::json buy_request = ::mm2::api::template_request("buy"); - ::mm2::api::to_json(buy_request, req); + nlohmann::json buy_request = mm2::template_request("buy"); + mm2::to_json(buy_request, req); batch.push_back(buy_request); buy_request["userpass"] = "*******"; //! Answer - SPDLOG_INFO("buy_request is : {}", buy_request.dump(4)); + SPDLOG_DEBUG("buy_request is : {}", buy_request.dump(4)); auto answer_functor = [this](const web::http::http_response& resp) { std::string body = TO_STD_STR(resp.extract_string(true).get()); @@ -273,8 +279,8 @@ namespace atomic_dex t_float_50 base_min_trade = safe_float(get_orderbook_wrapper()->get_base_min_taker_vol().toStdString()); t_float_50 cur_min_trade = safe_float(get_min_trade_vol().toStdString()); - SPDLOG_INFO("base_min_trade: {}, cur_min_trade: {}", base_min_trade.str(), cur_min_trade.str()); - SPDLOG_INFO( + SPDLOG_DEBUG("base_min_trade: {}, cur_min_trade: {}", base_min_trade.str(), cur_min_trade.str()); + SPDLOG_DEBUG( "volume: {}, orderbook_available_quantity: {}, is_selected_max: {}", m_volume.toStdString(), orderbook_available_quantity.toStdString(), is_selected_max); t_sell_request req{ @@ -295,7 +301,7 @@ namespace atomic_dex if (m_current_trading_mode == TradingModeGadget::Simple) { - SPDLOG_INFO("Simple trading mode, using FillOrKill order"); + SPDLOG_DEBUG("Simple trading mode, using FillOrKill order"); req.order_type = nlohmann::json::object(); req.order_type.value()["type"] = "FillOrKill"; req.min_volume = std::optional{std::nullopt}; @@ -309,7 +315,7 @@ namespace atomic_dex auto max_taker_vol_json_obj = get_orderbook_wrapper()->get_base_max_taker_vol().toJsonObject(); if (is_selected_order) { - SPDLOG_INFO( + SPDLOG_DEBUG( "The order is a selected order, treating it, input_vol: {} orderbook_max_vol {}", m_volume.toStdString(), orderbook_available_quantity.toStdString()); @@ -317,14 +323,14 @@ namespace atomic_dex if (t_float_50 base_min_vol_orderbook_f = safe_float(base_min_vol_orderbook); cur_min_trade <= base_min_vol_orderbook_f) { - SPDLOG_INFO("The selected order min_vol input is too low, using null field instead"); + SPDLOG_DEBUG("The selected order min_vol input is too low, using null field instead"); req.min_volume = std::optional{std::nullopt}; } if (req.is_exact_selected_order_volume) { //! Selected order and we keep the exact volume (Basically swallow the order) - SPDLOG_INFO("swallowing the order from the orderbook"); + SPDLOG_DEBUG("swallowing the order from the orderbook"); req.volume_numer = m_preferred_order->at("base_max_volume_numer").get(); req.volume_denom = m_preferred_order->at("base_max_volume_denom").get(); } @@ -332,13 +338,13 @@ namespace atomic_dex ///< let's forbid it in simple ///< view { - SPDLOG_INFO("cannot swallow the selected order from the orderbook, use max_taker_volume for it"); + SPDLOG_DEBUG("cannot swallow the selected order from the orderbook, use max_taker_volume for it"); req.volume_denom = max_taker_vol_json_obj["denom"].toString().toStdString(); req.volume_numer = max_taker_vol_json_obj["numer"].toString().toStdString(); } else { - SPDLOG_INFO("Selected order, but changing manually the volume, use input_volume"); + SPDLOG_DEBUG("Selected order, but changing manually the volume, use input_volume"); req.selected_order_use_input_volume = true; } } @@ -352,12 +358,12 @@ namespace atomic_dex } nlohmann::json batch; - nlohmann::json sell_request = ::mm2::api::template_request("sell"); - ::mm2::api::to_json(sell_request, req); + nlohmann::json sell_request = mm2::template_request("sell"); + mm2::to_json(sell_request, req); batch.push_back(sell_request); sell_request["userpass"] = "******"; - SPDLOG_INFO("sell request: {}", sell_request.dump(4)); + SPDLOG_DEBUG("sell request: {}", sell_request.dump(4)); //! Answer auto answer_functor = [this](web::http::http_response resp) { @@ -589,7 +595,7 @@ namespace atomic_dex if (this->m_market_mode != market_mode) { this->m_market_mode = market_mode; - SPDLOG_INFO("switching market_mode, new mode: {}", m_market_mode == MarketMode::Buy ? "buy" : "sell"); + SPDLOG_DEBUG("switching market_mode, new mode: {}", m_market_mode == MarketMode::Buy ? "buy" : "sell"); this->clear_forms("set_market_mode"); const auto* market_selector_mdl = get_market_pairs_mdl(); set_current_orderbook(market_selector_mdl->get_left_selected_coin(), market_selector_mdl->get_right_selected_coin()); @@ -656,12 +662,12 @@ namespace atomic_dex SPDLOG_WARN("MM2 service not available, required to clear forms - skipping"); return; } - SPDLOG_INFO("clearing forms : {}", from.toStdString()); + SPDLOG_DEBUG("clearing forms : {}", from.toStdString()); if (m_preferred_order.has_value() && m_current_trading_mode == TradingModeGadget::Simple && m_selected_order_status == SelectedOrderGadget::OrderNotExistingAnymore) { - SPDLOG_INFO("Simple view cancel order, keeping important data"); + SPDLOG_DEBUG("Simple view cancel order, keeping important data"); this->set_volume(QString::fromStdString(m_preferred_order->at("initial_input_volume").get())); const auto max_taker_vol = get_orderbook_wrapper()->get_base_max_taker_vol().toJsonObject()["decimal"].toString(); this->set_max_volume(max_taker_vol); @@ -683,11 +689,14 @@ namespace atomic_dex this->m_post_clear_forms = true; this->set_selected_order_status(SelectedOrderStatus::None); this->reset_fees(); + this->determine_cex_rates(); emit cexPriceChanged(); emit invalidCexPriceChanged(); emit cexPriceReversedChanged(); emit feesChanged(); emit prefferedOrderChanged(); + emit priceChanged(); + emit priceReversedChanged(); } QString @@ -706,7 +715,7 @@ namespace atomic_dex volume = "0"; } m_volume = std::move(volume); - SPDLOG_INFO("volume is : [{}]", m_volume.toStdString()); + SPDLOG_DEBUG("volume is : [{}]", m_volume.toStdString()); this->determine_total_amount(); emit volumeChanged(); @@ -763,7 +772,7 @@ namespace atomic_dex { auto available_quantity = m_preferred_order->at("base_max_volume").get(); t_float_50 available_quantity_order = safe_float(available_quantity); - SPDLOG_INFO( + SPDLOG_DEBUG( "available_quantity_order: {}, max_volume: {}, max_taker_vol: {}", utils::format_float(safe_float(available_quantity)), get_max_volume().toStdString(), max_taker_vol); if (available_quantity_order < safe_float(max_taker_vol) && !m_preferred_order->at("capped").get()) @@ -776,7 +785,7 @@ namespace atomic_dex { if (!m_preferred_order->at("capped").get()) { - SPDLOG_INFO("Selected order capping to max_taker_vol because our max_taker_volume is < base_max_volume"); + SPDLOG_DEBUG("Selected order capping to max_taker_vol because our max_taker_volume is < base_max_volume"); m_preferred_order.value()["capped"] = true; this->set_max_volume(QString::fromStdString(max_vol_str)); } @@ -869,7 +878,7 @@ namespace atomic_dex auto max_volume = this->get_max_volume(); if (!max_volume.isEmpty() && max_volume != "0") { - SPDLOG_INFO("capping volume because {} (volume) > {} (max_volume)", std_volume, max_volume.toStdString()); + SPDLOG_DEBUG("capping volume because {} (volume) > {} (max_volume)", std_volume, max_volume.toStdString()); this->set_volume(get_max_volume()); } } @@ -922,6 +931,12 @@ namespace atomic_dex case TradingErrorGadget::RightParentChainNotEnabled: SPDLOG_WARN("last_trading_error is RightParentChainNotEnabled"); break; + case TradingErrorGadget::LeftZhtlcChainNotEnabled: + SPDLOG_WARN("last_trading_error is LeftZhtlcChainNotEnabled"); + break; + case TradingErrorGadget::RightZhtlcChainNotEnabled: + SPDLOG_WARN("last_trading_error is RightZhtlcChainNotEnabled"); + break; default: break; } @@ -1011,6 +1026,9 @@ namespace atomic_dex set_current_orderbook(base, rel); } } + this->determine_cex_rates(); + emit priceChanged(); + emit priceReversedChanged(); return true; } @@ -1031,7 +1049,7 @@ namespace atomic_dex if (auto preferred_order = nlohmann::json::parse(QString(QJsonDocument(QJsonObject::fromVariantMap(price_object)).toJson()).toStdString()); preferred_order != m_preferred_order) { - SPDLOG_INFO("preferred_order: {}", preferred_order.dump(-1)); + SPDLOG_DEBUG("preferred_order: {}", preferred_order.dump(-1)); m_preferred_order = std::move(preferred_order); emit prefferedOrderChanged(); if (!m_preferred_order->empty() && m_preferred_order->contains("price")) @@ -1048,7 +1066,7 @@ namespace atomic_dex } else if (this->m_current_trading_mode == TradingModeGadget::Simple && m_preferred_order->contains("initial_input_volume")) { - SPDLOG_INFO("From simple view, using initial_input_volume from selection to use."); + SPDLOG_DEBUG("From simple view, using initial_input_volume from selection to use."); this->set_volume(QString::fromStdString(m_preferred_order->at("initial_input_volume").get())); } this->get_orderbook_wrapper()->refresh_best_orders(); @@ -1131,33 +1149,50 @@ namespace atomic_dex SPDLOG_WARN("MM2 Service not available, cannot determine fees - skipping"); return; } - using namespace std::string_literals; const auto* market_pair = get_market_pairs_mdl(); + using namespace std::string_literals; auto& mm2 = this->m_system_manager.get_system(); + // TODO: there is a race condition that sometimes results in base == rel after switching base/rel tickers const auto base = market_pair->get_left_selected_coin().toStdString(); const auto rel = market_pair->get_right_selected_coin().toStdString(); const auto swap_method = m_market_mode == MarketMode::Sell ? "sell"s : "buy"s; + std::string volume = get_volume().toStdString(); + if (base == rel) + { + return; + } + if (volume == "0") + { + volume = "0.0001"; + } + + SPDLOG_DEBUG("get_volume().toStdString(): {}", get_volume().toStdString()); t_trade_preimage_request req{ - .base_coin = base, .rel_coin = rel, .swap_method = swap_method, .volume = get_volume().toStdString(), .price = get_price().toStdString()}; + .base_coin = base, + .rel_coin = rel, + .swap_method = swap_method, + .volume = volume, + .price = get_price().toStdString() + }; nlohmann::json batch; - nlohmann::json preimage_request = ::mm2::api::template_request("trade_preimage"); - ::mm2::api::to_json(preimage_request, req); + nlohmann::json preimage_request = mm2::template_request("trade_preimage"); + mm2::to_json(preimage_request, req); batch.push_back(preimage_request); preimage_request["userpass"] = "******"; - SPDLOG_INFO("request: {}", preimage_request.dump(-1)); + SPDLOG_DEBUG("trade_preimage request: {}", preimage_request.dump(-1)); this->set_preimage_busy(true); auto answer_functor = [this, &mm2](web::http::http_response resp) { std::string body = TO_STD_STR(resp.extract_string(true).get()); - SPDLOG_INFO("preimage answer received: {}", body); + SPDLOG_DEBUG("trade_preimage answer received: {}", body); if (resp.status_code() == web::http::status_codes::OK) { auto answers = nlohmann::json::parse(body); nlohmann::json answer = answers[0]; - auto trade_preimage_answer = ::mm2::api::rpc_process_answer_batch(answer, "trade_preimage"); + auto trade_preimage_answer = mm2::rpc_process_answer_batch(answer, "trade_preimage"); if (trade_preimage_answer.error.has_value()) { auto error_answer = trade_preimage_answer.error.value(); @@ -1250,6 +1285,15 @@ namespace atomic_dex current_trading_error = TradingError::RightParentChainNotEnoughBalance; } } + else if (!mm2.is_zhtlc_coin_ready(left)) + { + current_trading_error = TradingError::LeftZhtlcChainNotEnabled; + } + else if (!mm2.is_zhtlc_coin_ready(right)) + { + current_trading_error = TradingError::RightZhtlcChainNotEnabled; + } + if (current_trading_error == TradingError::None) { if (max_balance_without_dust < safe_float(regular_min_taker_vol)) //get_current_min_taker_vol().toStdString()) > safe_float(min_trade_vol.toStdString())) { - SPDLOG_WARN("Spurious min_diff detected - overriding immediately"); - min_trade_vol = get_orderbook_wrapper()->get_current_min_taker_vol(); + SPDLOG_WARN("Spurious min_diff detected - (not) overriding immediately (using get_orderbook_wrapper()->get_current_min_taker_vol())"); + // TODO: Sometimes this ends up returning a higher value than expected. + // Commenting out as it might be better to not update if this is the case. + // If not associated bugs appear as a result, we can delete this. + // min_trade_vol = get_orderbook_wrapper()->get_current_min_taker_vol(); } if (min_trade_vol != m_minimal_trading_amount) @@ -1459,7 +1506,7 @@ namespace atomic_dex void trading_page::reset_fees() { - SPDLOG_INFO("reset_fees"); + SPDLOG_DEBUG("reset_fees"); this->set_fees(QVariantMap()); this->determine_error_cases(); } diff --git a/src/core/atomicdex/pages/qt.trading.page.hpp b/src/core/atomicdex/pages/qt.trading.page.hpp index 2cf51f4a3c..0e8af4be11 100644 --- a/src/core/atomicdex/pages/qt.trading.page.hpp +++ b/src/core/atomicdex/pages/qt.trading.page.hpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -16,13 +16,10 @@ #pragma once -//! Deps #include -//! QT #include -//! Project Headers #include "atomicdex/constants/qt.actions.hpp" #include "atomicdex/constants/qt.trading.enums.hpp" #include "atomicdex/events/events.hpp" @@ -36,11 +33,9 @@ namespace atomic_dex { class trading_page final : public QObject, public ag::ecs::pre_update_system { - private: - //! Q_Object definition Q_OBJECT - //! Q Properties definitions + // Q Properties definitions Q_PROPERTY(qt_orderbook_wrapper* orderbook READ get_orderbook_wrapper NOTIFY orderbookChanged) Q_PROPERTY(market_pairs* market_pairs_mdl READ get_market_pairs_mdl NOTIFY marketPairsChanged) Q_PROPERTY(qt_orders_widget* orders READ get_orders_widget NOTIFY ordersWidgetChanged) @@ -48,7 +43,7 @@ namespace atomic_dex Q_PROPERTY(bool buy_sell_rpc_busy READ is_buy_sell_rpc_busy WRITE set_buy_sell_rpc_busy NOTIFY buySellRpcStatusChanged) Q_PROPERTY(bool preimage_rpc_busy READ is_preimage_busy WRITE set_preimage_busy NOTIFY preImageRpcStatusChanged) - //! Trading logic + // Trading logic Q properties Q_PROPERTY(MarketMode market_mode READ get_market_mode WRITE set_market_mode NOTIFY marketModeChanged) Q_PROPERTY(TradingError last_trading_error READ get_trading_error WRITE set_trading_error NOTIFY tradingErrorChanged) Q_PROPERTY(TradingMode current_trading_mode READ get_current_trading_mode WRITE set_current_trading_mode NOTIFY tradingModeChanged) @@ -65,7 +60,6 @@ namespace atomic_dex Q_PROPERTY(QString cex_price READ get_cex_price NOTIFY cexPriceChanged) Q_PROPERTY(QString cex_price_reversed READ get_cex_price_reversed NOTIFY cexPriceReversedChanged) Q_PROPERTY(QString cex_price_diff READ get_cex_price_diff NOTIFY cexPriceDiffChanged) - // Q_PROPERTY(QString mm2_min_trade_vol READ get_mm2_min_trade_vol NOTIFY mm2MinTradeVolChanged) Q_PROPERTY(QString min_trade_vol READ get_min_trade_vol WRITE set_min_trade_vol NOTIFY minTradeVolChanged) Q_PROPERTY(bool invalid_cex_price READ get_invalid_cex_price NOTIFY invalidCexPriceChanged) Q_PROPERTY(bool skip_taker READ get_skip_taker WRITE set_skip_taker NOTIFY skipTakerChanged) diff --git a/src/core/atomicdex/pages/qt.wallet.page.cpp b/src/core/atomicdex/pages/qt.wallet.page.cpp index c40047d4b0..ec0fd4e477 100644 --- a/src/core/atomicdex/pages/qt.wallet.page.cpp +++ b/src/core/atomicdex/pages/qt.wallet.page.cpp @@ -15,6 +15,8 @@ #include "atomicdex/api/mm2/rpc.electrum.hpp" #include "atomicdex/api/mm2/rpc.validate.address.hpp" #include "atomicdex/api/mm2/rpc.withdraw.hpp" +#include "atomicdex/api/mm2/rpc2.init_withdraw.hpp" +#include "atomicdex/api/mm2/rpc2.withdraw_status.hpp" #include "atomicdex/services/mm2/mm2.service.hpp" #include "atomicdex/services/price/global.provider.hpp" #include "atomicdex/services/price/komodo_prices/komodo.prices.provider.hpp" @@ -99,22 +101,21 @@ namespace atomic_dex //! Getters/Setters namespace atomic_dex { - QString - wallet_page::get_current_ticker() const + QString wallet_page::get_current_ticker() const { const auto& mm2_system = m_system_manager.get_system(); return QString::fromStdString(mm2_system.get_current_ticker()); } - void - wallet_page::set_current_ticker(const QString& ticker) + void wallet_page::set_current_ticker(const QString& ticker) { auto& mm2_system = m_system_manager.get_system(); + auto coin_info = mm2_system.get_coin_info(ticker.toStdString()); if (mm2_system.set_current_ticker(ticker.toStdString())) { SPDLOG_INFO("new ticker: {}", ticker.toStdString()); - this->set_tx_fetching_busy(true); m_transactions_mdl->reset(); + this->set_tx_fetching_busy(true); mm2_system.fetch_infos_thread(true, true); emit currentTickerChanged(); refresh_ticker_infos(); @@ -218,14 +219,12 @@ namespace atomic_dex } } - bool - atomic_dex::wallet_page::is_tx_fetching_busy() const + bool atomic_dex::wallet_page::is_tx_fetching_busy() const { return m_tx_fetching_busy; } - void - atomic_dex::wallet_page::set_tx_fetching_busy(bool status) + void atomic_dex::wallet_page::set_tx_fetching_busy(bool status) { if (m_tx_fetching_busy != status) { @@ -234,14 +233,12 @@ namespace atomic_dex } } - bool - atomic_dex::wallet_page::is_tx_fetching_failed() const + bool atomic_dex::wallet_page::is_tx_fetching_failed() const { return m_tx_fetching_failed; } - void - atomic_dex::wallet_page::set_tx_fetching_failed(bool status) + void atomic_dex::wallet_page::set_tx_fetching_failed(bool status) { if (m_tx_fetching_failed != status) { @@ -250,12 +247,8 @@ namespace atomic_dex } } - - - QVariant - wallet_page::get_ticker_infos() const + QVariant wallet_page::get_ticker_infos() const { - // SPDLOG_DEBUG("get_ticker_infos"); QJsonObject obj{ {"balance", "0"}, {"name", "Komodo"}, @@ -269,6 +262,7 @@ namespace atomic_dex {"tx_state", "InProgress"}, {"fiat_amount", "0.00"}, {"trend_7d", QJsonArray()}, + {"activation_status", QJsonObject()}, {"fee_ticker", DEX_PRIMARY_COIN}, {"blocks_left", 1}, {"transactions_left", 0}, @@ -297,24 +291,23 @@ namespace atomic_dex obj["is_claimable"] = coin_info.is_claimable; obj["address"] = QString::fromStdString(mm2_system.address(ticker, ec)); obj["minimal_balance_for_asking_rewards"] = QString::fromStdString(coin_info.minimal_claim_amount); - obj["explorer_url"] = QString::fromStdString(coin_info.explorer_url[0]); + obj["explorer_url"] = QString::fromStdString(coin_info.explorer_url); obj["current_currency_ticker_price"] = QString::fromStdString(price_service.get_rate_conversion(config.current_currency, ticker, true)); obj["change_24h"] = retrieve_change_24h(provider, coin_info, config, m_system_manager); const auto& tx_state = mm2_system.get_tx_state(ec); obj["tx_state"] = QString::fromStdString(tx_state.state); obj["fiat_amount"] = QString::fromStdString(price_service.get_price_in_fiat(config.current_currency, ticker, ec)); + obj["activation_status"] = nlohmann_json_object_to_qt_json_object(coin_info.activation_status); obj["trend_7d"] = nlohmann_json_array_to_qt_json_array(provider.get_ticker_historical(ticker)); - // SPDLOG_INFO("fee_ticker of ticker :{} is {}", ticker, coin_info.fees_ticker); obj["fee_ticker"] = QString::fromStdString(coin_info.fees_ticker); obj["blocks_left"] = static_cast(tx_state.blocks_left); obj["transactions_left"] = static_cast(tx_state.transactions_left); obj["current_block"] = static_cast(tx_state.current_block); - obj["is_smartchain_test_coin"] = coin_info.ticker == "RICK" || coin_info.ticker == "MORTY"; + obj["is_smartchain_test_coin"] = coin_info.ticker == "RICK" || coin_info.ticker == "MORTY" || coin_info.ticker == "ZOMBIE"; std::error_code ec; qrcodegen::QrCode qr0 = qrcodegen::QrCode::encodeText(mm2_system.address(ticker, ec).c_str(), qrcodegen::QrCode::Ecc::MEDIUM); std::string svg = qr0.toSvgString(2); obj["qrcode_address"] = QString::fromStdString("data:image/svg+xml;base64,") + QString::fromStdString(svg).toLocal8Bit().toBase64(); - // SPDLOG_DEBUG("is_segwit_on {} segwit: {}", coin_info.is_segwit_on, coin_info.segwit); } return obj; } @@ -373,7 +366,7 @@ namespace atomic_dex reason = tr("Invalid checksum."); json_result["convertible"] = false; } - else if (reason.contains("has invalid prefixes")) + else if (reason.contains("has invalid prefixes") or reason.contains("Expected a valid P2PKH or P2SH prefix")) { reason = tr("%1 address has invalid prefixes.").arg(json_result["ticker"].toString()); } @@ -389,6 +382,19 @@ namespace atomic_dex emit validateAddressDataChanged(); } + QVariant + wallet_page::get_coin_enabling_status() const + { + return m_coin_enabling_status.get(); + } + + void + wallet_page::set_coin_enabling_status(QVariant rpc_data) + { + m_coin_enabling_status = rpc_data.toJsonObject(); + emit coinEnablingStatusChanged(); + } + QVariant wallet_page::get_rpc_claiming_data() const { @@ -497,116 +503,291 @@ namespace atomic_dex nlohmann::json batch = nlohmann::json::array(); auto& mm2_system = m_system_manager.get_system(); const auto& ticker = mm2_system.get_current_ticker(); - t_withdraw_request withdraw_req{.coin = ticker, .to = address.toStdString(), .amount = max ? "0" : amount.toStdString(), .max = max}; auto coin_info = mm2_system.get_coin_info(ticker); - if (with_fees) + + if (coin_info.is_zhtlc_family) { - qDebug() << fees_data; - auto json_fees = nlohmann::json::parse(QString(QJsonDocument(QVariant(fees_data).toJsonObject()).toJson()).toStdString()); - withdraw_req.fees = t_withdraw_fees{ - .type = "UtxoFixed", - .amount = json_fees.at("fees_amount").get(), - .gas_price = json_fees.at("gas_price").get(), - .gas_limit = json_fees.at("gas_limit").get()}; - if (coin_info.coin_type == CoinType::ERC20) - { - withdraw_req.fees->type = "EthGas"; - } - else if (coin_info.coin_type == CoinType::QRC20) + t_init_withdraw_request init_withdraw_req{.coin = ticker, .to = address.toStdString(), .amount = max ? "0" : amount.toStdString(), .max = max}; + + if (with_fees) { - withdraw_req.fees->type = "Qrc20Gas"; + qDebug() << fees_data; + auto json_fees = nlohmann::json::parse(QString(QJsonDocument(QVariant(fees_data).toJsonObject()).toJson()).toStdString()); + init_withdraw_req.fees = t_init_withdraw_fees{ + .type = "UtxoFixed", + .amount = json_fees.at("fees_amount").get() + }; } - else if (coin_info.has_parent_fees_ticker) + nlohmann::json json_data = mm2::template_request("init_withdraw", true); + + mm2::to_json(json_data, init_withdraw_req); + + batch.push_back(json_data); + std::string amount_std = amount.toStdString(); + + if (max) { - withdraw_req.fees->type = "otherGas"; + std::error_code ec; + amount_std = mm2_system.my_balance(ticker, ec); } - } - nlohmann::json json_data = ::mm2::api::template_request("withdraw", true); - ::mm2::api::to_json(json_data, withdraw_req); - // SPDLOG_DEBUG("final json: {}", json_data.dump(4)); - batch.push_back(json_data); - std::string amount_std = amount.toStdString(); - if (max) - { - std::error_code ec; - amount_std = mm2_system.my_balance(ticker, ec); - } - //! Answer - auto answer_functor = [this, coin_info, ticker, amount_std](web::http::http_response resp) - { - const auto& settings_system = m_system_manager.get_system(); - const auto& global_price_system = m_system_manager.get_system(); - const auto& current_fiat = settings_system.get_current_fiat().toStdString(); - std::string body = TO_STD_STR(resp.extract_string(true).get()); - SPDLOG_DEBUG("resp: {}", body); - if (resp.status_code() == 200 && body.find("error") == std::string::npos) + auto answer_functor = [this, coin_info, ticker, amount_std](web::http::http_response resp) { - auto answers = nlohmann::json::parse(body); - auto withdraw_answer = ::mm2::api::rpc_process_answer_batch(answers[0], "withdraw"); - nlohmann::json j_out = nlohmann::json::object(); - j_out["withdraw_answer"] = answers[0]["result"]; - j_out.at("withdraw_answer")["date"] = withdraw_answer.result.value().timestamp_as_date; + const auto& settings_system = m_system_manager.get_system(); + const auto& global_price_system = m_system_manager.get_system(); + const auto& current_fiat = settings_system.get_current_fiat().toStdString(); + auto answers = mm2::basic_batch_answer(resp); - // Add total amount in fiat currency. - if (coin_info.coinpaprika_id == "test-coin") + if (answers[0].contains("result")) { - j_out["withdraw_answer"]["total_amount_fiat"] = "0"; + if (answers[0]["result"].contains("task_id")) + { + auto task_id = answers[0].at("result").at("task_id").get(); + { + SPDLOG_DEBUG("Task ID: {}", task_id); + using namespace std::chrono_literals; + auto& mm2_system = m_system_manager.get_system(); + static std::size_t z_nb_try = 1; + nlohmann::json z_error = nlohmann::json::array(); + nlohmann::json z_batch_array = nlohmann::json::array(); + QString z_status; + t_withdraw_status_request z_request{.task_id = task_id}; + + nlohmann::json j = mm2::template_request("withdraw_status", true); + mm2::to_json(j, z_request); + z_batch_array.push_back(j); + + do { + pplx::task z_resp_task = mm2_system.get_mm2_client().async_rpc_batch_standalone(z_batch_array); + web::http::http_response z_resp = z_resp_task.get(); + auto z_answers = mm2::basic_batch_answer(z_resp); + z_error = z_answers; + z_status = QString::fromStdString(z_answers[0].at("result").at("status").get()); + + SPDLOG_DEBUG("[{}/120] Waiting for {} withdraw status [{}]...", z_nb_try, ticker, z_status.toUtf8().constData()); + if (z_status == "Ready") + { + break; + } + else + { + set_withdraw_status("Generating transaction... "); + } + std::this_thread::sleep_for(2s); + z_nb_try += 1; + + } while (z_nb_try < 120); + + try { + if (z_error[0].at("result").at("details").contains("error")) + { + SPDLOG_DEBUG("Error zhtlc withdraw_status {}: {} ", ticker, z_status.toUtf8().constData()); + z_status = QString::fromStdString(z_error[0].at("result").at("details").at("error").get()); + set_withdraw_status(z_status); + } + else if (z_nb_try == 120) + { + // TODO: Handle this case. + // There could be no error message if scanning takes too long. + // Either we force disable here, or schedule to check on it later + SPDLOG_DEBUG("Exited zhtlc withdraw loop after 120 tries"); + SPDLOG_DEBUG("Bad answer for [{}] zhtlc withdraw_status: {}", ticker, z_error[0].dump(4)); + set_withdraw_status("Timed out"); + } + else + { + auto withdraw_answer = mm2::rpc_process_answer_batch(z_error[0], "withdraw_status"); + nlohmann::json j_out = nlohmann::json::object(); + j_out["withdraw_answer"] = z_error[0]["result"]["details"]["result"]; + j_out.at("withdraw_answer")["date"] = withdraw_answer.result.value().timestamp_as_date; + + // Add total amount in fiat currency. + if (coin_info.coinpaprika_id == "test-coin") + { + j_out["withdraw_answer"]["total_amount_fiat"] = "0"; + } + else + { + j_out["withdraw_answer"]["total_amount_fiat"] = global_price_system.get_price_as_currency_from_amount(current_fiat, ticker, amount_std); + } + + // Add fees amount. + if (j_out.at("withdraw_answer").at("fee_details").contains("total_fee") && !j_out.at("withdraw_answer").at("fee_details").contains("amount")) + { + j_out["withdraw_answer"]["fee_details"]["amount"] = j_out["withdraw_answer"]["fee_details"]["total_fee"]; + } + if (j_out.at("withdraw_answer").at("fee_details").contains("miner_fee") && !j_out.at("withdraw_answer").at("fee_details").contains("amount")) + { + j_out["withdraw_answer"]["fee_details"]["amount"] = j_out["withdraw_answer"]["fee_details"]["miner_fee"]; + } + + // Add fees amount in fiat currency. + auto fee = j_out["withdraw_answer"]["fee_details"]["amount"].get(); + if (coin_info.coinpaprika_id == "test-coin") + { + j_out["withdraw_answer"]["fee_details"]["amount_fiat"] = "0"; + } + else + { + j_out["withdraw_answer"]["fee_details"]["amount_fiat"] = + global_price_system.get_price_as_currency_from_amount(current_fiat, coin_info.fees_ticker, fee); + } + SPDLOG_DEBUG("zhtlc set_rpc_send_data (else)"); + this->set_rpc_send_data(nlohmann_json_object_to_qt_json_object(j_out)); + set_withdraw_status("Complete"); + } + z_nb_try = 0; + } + catch (const std::exception& error) + { + set_withdraw_status(QString::fromStdString(error.what())); + SPDLOG_ERROR("exception caught in zhtlc withdraw_status: {}", error.what()); + } + } + } } else { - j_out["withdraw_answer"]["total_amount_fiat"] = global_price_system.get_price_as_currency_from_amount(current_fiat, ticker, amount_std); + std::string body = TO_STD_STR(resp.extract_string(true).get()); + auto error_json = QJsonObject({{"error_code", resp.status_code()}, {"error_message", QString::fromStdString(body)}}); + this->set_rpc_send_data(error_json); } + this->set_send_busy(false); + }; - // Add fees amount. - if (j_out.at("withdraw_answer").at("fee_details").contains("total_fee") && !j_out.at("withdraw_answer").at("fee_details").contains("amount")) + auto error_functor = [this](pplx::task previous_task) + { + try { - j_out["withdraw_answer"]["fee_details"]["amount"] = j_out["withdraw_answer"]["fee_details"]["total_fee"]; + previous_task.wait(); } - if (j_out.at("withdraw_answer").at("fee_details").contains("miner_fee") && !j_out.at("withdraw_answer").at("fee_details").contains("amount")) + catch (const std::exception& e) { - j_out["withdraw_answer"]["fee_details"]["amount"] = j_out["withdraw_answer"]["fee_details"]["miner_fee"]; + SPDLOG_ERROR("error caught in send: {}", e.what()); + auto error_json = QJsonObject({{"error_code", 500}, {"error_message", QString::fromStdString(e.what())}}); + this->set_rpc_send_data(error_json); + this->set_send_busy(false); } + }; + + //! Process + mm2_system.get_mm2_client().async_rpc_batch_standalone(batch).then(answer_functor).then(error_functor); + + } + else + { + t_withdraw_request withdraw_req{.coin = ticker, .to = address.toStdString(), .amount = max ? "0" : amount.toStdString(), .max = max}; - // Add fees amount in fiat currency. - auto fee = j_out["withdraw_answer"]["fee_details"]["amount"].get(); - if (coin_info.coinpaprika_id == "test-coin") + if (with_fees) + { + qDebug() << fees_data; + auto json_fees = nlohmann::json::parse(QString(QJsonDocument(QVariant(fees_data).toJsonObject()).toJson()).toStdString()); + withdraw_req.fees = t_withdraw_fees{ + .type = "UtxoFixed", + .amount = json_fees.at("fees_amount").get(), + .gas_price = json_fees.at("gas_price").get(), + .gas_limit = json_fees.at("gas_limit").get()}; + if (coin_info.coin_type == CoinType::ERC20) { - j_out["withdraw_answer"]["fee_details"]["amount_fiat"] = "0"; + withdraw_req.fees->type = "EthGas"; } - else + else if (coin_info.coin_type == CoinType::QRC20) { - j_out["withdraw_answer"]["fee_details"]["amount_fiat"] = - global_price_system.get_price_as_currency_from_amount(current_fiat, coin_info.fees_ticker, fee); + withdraw_req.fees->type = "Qrc20Gas"; + } + else if (coin_info.has_parent_fees_ticker) + { + withdraw_req.fees->type = "otherGas"; } - - this->set_rpc_send_data(nlohmann_json_object_to_qt_json_object(j_out)); - } - else - { - auto error_json = QJsonObject({{"error_code", resp.status_code()}, {"error_message", QString::fromStdString(body)}}); - this->set_rpc_send_data(error_json); } - this->set_send_busy(false); - }; + nlohmann::json json_data = mm2::template_request("withdraw", true); + mm2::to_json(json_data, withdraw_req); + // SPDLOG_DEBUG("final json: {}", json_data.dump(4)); + batch.push_back(json_data); - auto error_functor = [this](pplx::task previous_task) - { - try + std::string amount_std = amount.toStdString(); + if (max) { - previous_task.wait(); + std::error_code ec; + amount_std = mm2_system.my_balance(ticker, ec); } - catch (const std::exception& e) + + //! Answer + auto answer_functor = [this, coin_info, ticker, amount_std](web::http::http_response resp) { - SPDLOG_ERROR("error caught in send: {}", e.what()); - auto error_json = QJsonObject({{"error_code", 500}, {"error_message", QString::fromStdString(e.what())}}); - this->set_rpc_send_data(error_json); + const auto& settings_system = m_system_manager.get_system(); + const auto& global_price_system = m_system_manager.get_system(); + const auto& current_fiat = settings_system.get_current_fiat().toStdString(); + std::string body = TO_STD_STR(resp.extract_string(true).get()); + + if (resp.status_code() == 200 && body.find("error") == std::string::npos) + { + auto answers = nlohmann::json::parse(body); + auto withdraw_answer = mm2::rpc_process_answer_batch(answers[0], "withdraw"); + nlohmann::json j_out = nlohmann::json::object(); + j_out["withdraw_answer"] = answers[0]["result"]; + j_out.at("withdraw_answer")["date"] = withdraw_answer.result.value().timestamp_as_date; + + // Add total amount in fiat currency. + if (coin_info.coinpaprika_id == "test-coin") + { + j_out["withdraw_answer"]["total_amount_fiat"] = "0"; + } + else + { + j_out["withdraw_answer"]["total_amount_fiat"] = global_price_system.get_price_as_currency_from_amount(current_fiat, ticker, amount_std); + } + + // Add fees amount. + if (j_out.at("withdraw_answer").at("fee_details").contains("total_fee") && !j_out.at("withdraw_answer").at("fee_details").contains("amount")) + { + j_out["withdraw_answer"]["fee_details"]["amount"] = j_out["withdraw_answer"]["fee_details"]["total_fee"]; + } + if (j_out.at("withdraw_answer").at("fee_details").contains("miner_fee") && !j_out.at("withdraw_answer").at("fee_details").contains("amount")) + { + j_out["withdraw_answer"]["fee_details"]["amount"] = j_out["withdraw_answer"]["fee_details"]["miner_fee"]; + } + + // Add fees amount in fiat currency. + auto fee = j_out["withdraw_answer"]["fee_details"]["amount"].get(); + if (coin_info.coinpaprika_id == "test-coin") + { + j_out["withdraw_answer"]["fee_details"]["amount_fiat"] = "0"; + } + else + { + j_out["withdraw_answer"]["fee_details"]["amount_fiat"] = + global_price_system.get_price_as_currency_from_amount(current_fiat, coin_info.fees_ticker, fee); + } + + this->set_rpc_send_data(nlohmann_json_object_to_qt_json_object(j_out)); + } + else + { + auto error_json = QJsonObject({{"error_code", resp.status_code()}, {"error_message", QString::fromStdString(body)}}); + this->set_rpc_send_data(error_json); + } this->set_send_busy(false); - } - }; + }; - //! Process - mm2_system.get_mm2_client().async_rpc_batch_standalone(batch).then(answer_functor).then(error_functor); + auto error_functor = [this](pplx::task previous_task) + { + try + { + previous_task.wait(); + } + catch (const std::exception& e) + { + SPDLOG_ERROR("error caught in send: {}", e.what()); + auto error_json = QJsonObject({{"error_code", 500}, {"error_message", QString::fromStdString(e.what())}}); + this->set_rpc_send_data(error_json); + this->set_send_busy(false); + } + }; + + //! Process + mm2_system.get_mm2_client().async_rpc_batch_standalone(batch).then(answer_functor).then(error_functor); + } } void @@ -645,8 +826,8 @@ namespace atomic_dex const auto& ticker = mm2_system.get_current_ticker(); nlohmann::json batch = nlohmann::json::array(); t_broadcast_request broadcast_request{.tx_hex = tx_hex.toStdString(), .coin = ticker}; - nlohmann::json json_data = ::mm2::api::template_request("send_raw_transaction"); - ::mm2::api::to_json(json_data, broadcast_request); + nlohmann::json json_data = mm2::template_request("send_raw_transaction"); + mm2::to_json(json_data, broadcast_request); batch.push_back(json_data); //! Answer @@ -709,10 +890,10 @@ namespace atomic_dex auto& mm2_system = m_system_manager.get_system(); std::error_code ec; t_withdraw_request withdraw_req{.coin = "KMD", .to = mm2_system.address("KMD", ec), .amount = "0", .max = true}; - nlohmann::json json_data = ::mm2::api::template_request("withdraw", true); - ::mm2::api::to_json(json_data, withdraw_req); + nlohmann::json json_data = mm2::template_request("withdraw", true); + mm2::to_json(json_data, withdraw_req); batch.push_back(json_data); - json_data = ::mm2::api::template_request("kmd_rewards_info"); + json_data = mm2::template_request("kmd_rewards_info"); batch.push_back(json_data); auto answer_functor = [this](web::http::http_response resp) @@ -722,11 +903,11 @@ namespace atomic_dex if (resp.status_code() == static_cast(antara::app::http_code::ok) && body.find("error") == std::string::npos) { auto answers = nlohmann::json::parse(body); - auto withdraw_answer = ::mm2::api::rpc_process_answer_batch(answers[0], "withdraw"); + auto withdraw_answer = mm2::rpc_process_answer_batch(answers[0], "withdraw"); nlohmann::json j_out = nlohmann::json::object(); j_out["withdraw_answer"] = answers[0]["result"]; j_out.at("withdraw_answer")["date"] = withdraw_answer.result.value().timestamp_as_date; - auto kmd_rewards_answer = ::mm2::api::process_kmd_rewards_answer(answers[1]); + auto kmd_rewards_answer = mm2::process_kmd_rewards_answer(answers[1]); j_out["kmd_rewards_info"] = kmd_rewards_answer.result; this->set_rpc_claiming_data(nlohmann_json_object_to_qt_json_object(j_out)); } @@ -793,11 +974,10 @@ namespace atomic_dex void wallet_page::on_tx_fetch_finished(const tx_fetch_finished& evt) { - if (!evt.with_error) + if (!evt.with_error && QString::fromStdString(evt.ticker) == get_current_ticker()) { std::error_code ec; t_transactions transactions = m_system_manager.get_system().get_tx_history(ec); - // SPDLOG_INFO("transaction size: {}", transactions.size()); if (m_transactions_mdl->rowCount() == 0) { //! insert all transactions @@ -806,7 +986,6 @@ namespace atomic_dex else { //! Update tx (only unconfirmed) or insert (new tx) - // SPDLOG_DEBUG("updating / insert tx"); m_transactions_mdl->update_or_insert_transactions(transactions); } if (ec) @@ -839,7 +1018,7 @@ namespace atomic_dex void wallet_page::validate_address(QString address, QString ticker) { - SPDLOG_INFO("validate_address: {} - ticker: {}", address.toStdString(), ticker.toStdString()); + // SPDLOG_INFO("validate_address: {} - ticker: {}", address.toStdString(), ticker.toStdString()); auto& mm2_system = m_system_manager.get_system(); if (mm2_system.is_mm2_running()) { @@ -847,19 +1026,19 @@ namespace atomic_dex t_validate_address_request req{.coin = ticker.toStdString(), .address = address.toStdString()}; this->set_validate_address_busy(true); nlohmann::json batch = nlohmann::json::array(); - nlohmann::json json_data = ::mm2::api::template_request("validateaddress"); - ::mm2::api::to_json(json_data, req); + nlohmann::json json_data = mm2::template_request("validateaddress"); + mm2::to_json(json_data, req); batch.push_back(json_data); auto answer_functor = [this, ticker](web::http::http_response resp) { std::string body = TO_STD_STR(resp.extract_string(true).get()); - SPDLOG_DEBUG("resp validateaddress: {}", body); + // SPDLOG_DEBUG("resp validateaddress: {}", body); nlohmann::json j_out = nlohmann::json::object(); j_out["ticker"] = ticker.toStdString(); if (resp.status_code() == static_cast(antara::app::http_code::ok)) { auto answers = nlohmann::json::parse(body); - auto validate_answer = ::mm2::api::rpc_process_answer_batch(answers[0], "validateaddress"); + auto validate_answer = mm2::rpc_process_answer_batch(answers[0], "validateaddress"); if (validate_answer.result.has_value()) { auto res = validate_answer.result.value(); @@ -868,14 +1047,22 @@ namespace atomic_dex } else { + if (!m_system_manager.get_system().is_zhtlc_coin_ready(ticker.toStdString())) + { + j_out["reason"] = "Validation error: Coin not fully enabled"; + } + else + { + j_out["reason"] = "Validation error: Unknown"; + } + j_out["is_valid"] = false; - j_out["reason"] = "valideaddress unknown error"; } } else { j_out["is_valid"] = false; - j_out["reason"] = "valideaddress unknown error"; + j_out["reason"] = "Validation error: Problem with connection"; } this->set_validate_address_data(nlohmann_json_object_to_qt_json_object(j_out)); this->set_validate_address_busy(false); @@ -906,8 +1093,8 @@ namespace atomic_dex t_convert_address_request req{.coin = ticker.toStdString(), .from = from.toStdString(), .to_address_format = address_fmt}; this->set_convert_address_busy(true); nlohmann::json batch = nlohmann::json::array(); - nlohmann::json json_data = ::mm2::api::template_request("convertaddress"); - ::mm2::api::to_json(json_data, req); + nlohmann::json json_data = mm2::template_request("convertaddress"); + mm2::to_json(json_data, req); batch.push_back(json_data); auto answer_functor = [this](web::http::http_response resp) { @@ -916,7 +1103,7 @@ namespace atomic_dex if (resp.status_code() == static_cast(antara::app::http_code::ok)) { auto answers = nlohmann::json::parse(body); - auto convert_answer = ::mm2::api::rpc_process_answer_batch(answers[0], "convertaddress"); + auto convert_answer = mm2::rpc_process_answer_batch(answers[0], "convertaddress"); if (convert_answer.result.has_value()) { auto res = QString::fromStdString(convert_answer.result.value().address); @@ -929,6 +1116,19 @@ namespace atomic_dex } } + QString + wallet_page::get_withdraw_status() const + { + return m_withdraw_status.get(); + } + + void + wallet_page::set_withdraw_status(QString status) + { + m_withdraw_status = status; + emit withdrawStatusChanged(); + } + QString wallet_page::get_converted_address() const { @@ -973,8 +1173,8 @@ namespace atomic_dex address = mm2_system.address(ticker, ec); t_convert_address_request req{.coin = ticker, .from = address, .to_address_format = address_format}; nlohmann::json batch = nlohmann::json::array(); - nlohmann::json json_data = ::mm2::api::template_request("convertaddress"); - ::mm2::api::to_json(json_data, req); + nlohmann::json json_data = mm2::template_request("convertaddress"); + mm2::to_json(json_data, req); batch.push_back(json_data); json_data["userpass"] = "******"; SPDLOG_INFO("convertaddress request: {}", json_data.dump()); @@ -984,7 +1184,7 @@ namespace atomic_dex if (resp.status_code() == static_cast(antara::app::http_code::ok)) { auto answers = nlohmann::json::parse(body); - auto convert_answer = ::mm2::api::rpc_process_answer_batch(answers[0], "convertaddress"); + auto convert_answer = mm2::rpc_process_answer_batch(answers[0], "convertaddress"); if (convert_answer.result.has_value()) { return QString::fromStdString(convert_answer.result.value().address); @@ -1005,9 +1205,9 @@ namespace atomic_dex //! Need disable + enable + refresh balance + refresh current coin info (address) + change segwit in cfg const auto ticker = get_current_ticker().toStdString(); nlohmann::json batch = nlohmann::json::array(); - nlohmann::json json_data = ::mm2::api::template_request("disable_coin"); + nlohmann::json json_data = mm2::template_request("disable_coin"); t_disable_coin_request req{.coin = ticker}; - ::mm2::api::to_json(json_data, req); + mm2::to_json(json_data, req); batch.push_back(json_data); //! Disable is in the batch @@ -1020,8 +1220,8 @@ namespace atomic_dex electrum_req.address_format = nlohmann::json::object(); electrum_req.address_format.value()["format"] = "segwit"; } - nlohmann::json electrum_data = ::mm2::api::template_request("electrum"); - ::mm2::api::to_json(electrum_data, electrum_req); + nlohmann::json electrum_data = mm2::template_request("electrum"); + mm2::to_json(electrum_data, electrum_req); batch.push_back(electrum_data); electrum_data["userpass"] = "*******"; SPDLOG_INFO("electrum_req: {}", electrum_data.dump(-1)); @@ -1044,4 +1244,4 @@ namespace atomic_dex mm2_system.get_mm2_client().async_rpc_batch_standalone(batch).then(answer_functor).then(&handle_exception_pplx_task); } } -} // namespace atomic_dex +} // namespace atomic_dex \ No newline at end of file diff --git a/src/core/atomicdex/pages/qt.wallet.page.hpp b/src/core/atomicdex/pages/qt.wallet.page.hpp index 50e4e50c55..033699279b 100644 --- a/src/core/atomicdex/pages/qt.wallet.page.hpp +++ b/src/core/atomicdex/pages/qt.wallet.page.hpp @@ -5,7 +5,7 @@ #include #include -#include "atomicdex/models/qt.wallet.transactions.model.hpp" +#include "atomicdex/models/transactions_model.hpp" namespace atomic_dex { @@ -48,6 +48,8 @@ namespace atomic_dex void set_rpc_broadcast_data(QString rpc_data); [[nodiscard]] QVariant get_rpc_send_data() const; void set_rpc_send_data(QVariant rpc_data); + [[nodiscard]] QVariant get_coin_enabling_status() const; + void set_coin_enabling_status(QVariant rpc_data); [[nodiscard]] bool is_tx_fetching_failed() const; void set_tx_fetching_failed(bool status); [[nodiscard]] bool is_tx_fetching_busy() const; @@ -56,6 +58,8 @@ namespace atomic_dex void set_convert_address_busy(bool status); [[nodiscard]] bool is_validate_address_busy() const; void set_validate_address_busy(bool status); + [[nodiscard]] QString get_withdraw_status() const; + void set_withdraw_status(QString status); [[nodiscard]] QString get_converted_address() const; void set_converted_address(QString converted_address); [[nodiscard]] QVariant get_validate_address_data() const; @@ -94,6 +98,7 @@ namespace atomic_dex Q_PROPERTY(QVariant ticker_infos READ get_ticker_infos NOTIFY tickerInfosChanged) Q_PROPERTY(bool is_claiming_busy READ is_rpc_claiming_busy WRITE set_claiming_is_busy NOTIFY rpcClaimingStatusChanged) Q_PROPERTY(QVariant claiming_rpc_data READ get_rpc_claiming_data WRITE set_rpc_claiming_data NOTIFY claimingRpcDataChanged) + Q_PROPERTY(QVariant enable_status_rpc_data READ get_coin_enabling_status WRITE set_coin_enabling_status NOTIFY coinEnablingStatusChanged) Q_PROPERTY(bool is_claiming_faucet_busy READ is_claiming_faucet_busy WRITE set_claiming_faucet_is_busy NOTIFY claimingFaucetStatusChanged) Q_PROPERTY(QVariant claiming_faucet_rpc_data READ get_rpc_claiming_faucet_data WRITE set_rpc_claiming_faucet_data NOTIFY claimingFaucetRpcDataChanged) Q_PROPERTY(bool is_broadcast_busy READ is_broadcast_busy WRITE set_broadcast_busy NOTIFY broadCastStatusChanged) @@ -111,6 +116,7 @@ namespace atomic_dex Q_PROPERTY(QVariant validate_address_data READ get_validate_address_data WRITE set_validate_address_data NOTIFY validateAddressDataChanged) Q_PROPERTY(bool convert_address_busy READ is_convert_address_busy WRITE set_convert_address_busy NOTIFY convertAddressBusyChanged) Q_PROPERTY(QString converted_address READ get_converted_address WRITE set_converted_address NOTIFY convertedAddressChanged) + Q_PROPERTY(QString withdraw_status READ get_withdraw_status WRITE set_withdraw_status NOTIFY withdrawStatusChanged) // QML API Properties Signals signals: @@ -118,6 +124,7 @@ namespace atomic_dex void tickerInfosChanged(); void rpcClaimingStatusChanged(); void claimingRpcDataChanged(); + void coinEnablingStatusChanged(); void claimingFaucetStatusChanged(); void claimingFaucetRpcDataChanged(); void broadCastStatusChanged(); @@ -136,6 +143,7 @@ namespace atomic_dex void validateAddressDataChanged(); void convertAddressBusyChanged(); void convertedAddressChanged(); + void withdrawStatusChanged(); private: ag::ecs::system_manager& m_system_manager; @@ -149,12 +157,14 @@ namespace atomic_dex std::atomic_bool m_validate_address_busy{false}; std::atomic_bool m_convert_address_busy{false}; + t_qt_synchronized_json m_coin_enabling_status; t_qt_synchronized_json m_claiming_rpc_result; t_qt_synchronized_json m_claiming_rpc_faucet_result; t_qt_synchronized_json m_send_rpc_result; t_qt_synchronized_string m_broadcast_rpc_result; t_qt_synchronized_json m_validate_address_result; t_qt_synchronized_string m_converted_address; + t_qt_synchronized_string m_withdraw_status; bool m_auth_succeeded; bool m_send_available{true}; QString m_send_availability_state; diff --git a/src/core/atomicdex/pages/widgets/dex/qt.orderbook.cpp b/src/core/atomicdex/pages/widgets/dex/qt.orderbook.cpp index 6c064b8143..9721138a9b 100644 --- a/src/core/atomicdex/pages/widgets/dex/qt.orderbook.cpp +++ b/src/core/atomicdex/pages/widgets/dex/qt.orderbook.cpp @@ -91,10 +91,12 @@ namespace atomic_dex } else if (m_best_orders->rowCount() == 0) { + // SPDLOG_INFO("[qt_orderbook_wrapper::refresh_orderbook] : reset_best_orders"); m_best_orders->reset_orderbook(data); } else { + // SPDLOG_INFO("[qt_orderbook_wrapper::refresh_orderbook] : refresh_best_orders"); m_best_orders->refresh_orderbook(data); } this->set_both_taker_vol(); @@ -171,12 +173,10 @@ namespace atomic_dex { if (safe_float(m_system_manager.get_system().get_volume().toStdString()) > 0) { - // SPDLOG_INFO("refresh best orders"); this->m_system_manager.get_system().process_best_orders(); } else { - SPDLOG_INFO("clear best orders"); get_best_orders()->clear_orderbook(); } } diff --git a/src/core/atomicdex/pages/widgets/dex/qt.orders.widget.cpp b/src/core/atomicdex/pages/widgets/dex/qt.orders.widget.cpp index 878a3c627b..c4181ada48 100644 --- a/src/core/atomicdex/pages/widgets/dex/qt.orders.widget.cpp +++ b/src/core/atomicdex/pages/widgets/dex/qt.orders.widget.cpp @@ -42,20 +42,20 @@ namespace atomic_dex qt_orders_widget::common_cancel_all_orders(bool by_coin, const QString& ticker) { nlohmann::json batch = nlohmann::json::array(); - nlohmann::json cancel_request = ::mm2::api::template_request("cancel_all_orders"); + nlohmann::json cancel_request = mm2::template_request("cancel_all_orders"); if (by_coin && not ticker.isEmpty()) { - ::mm2::api::cancel_data cd; + mm2::cancel_data cd; cd.ticker = ticker.toStdString(); - ::mm2::api::cancel_all_orders_request req{{"Coin", cd}}; - ::mm2::api::to_json(cancel_request, req); + mm2::cancel_all_orders_request req{{"Coin", cd}}; + mm2::to_json(cancel_request, req); } else { - ::mm2::api::cancel_data cd; + mm2::cancel_data cd; cd.ticker = ticker.toStdString(); - ::mm2::api::cancel_all_orders_request req_all; - ::mm2::api::to_json(cancel_request, req_all); + mm2::cancel_all_orders_request req_all; + mm2::to_json(cancel_request, req_all); } batch.push_back(cancel_request); @@ -81,9 +81,9 @@ namespace atomic_dex nlohmann::json batch = nlohmann::json::array(); for (auto&& order_id: orders_id) { - ::mm2::api::cancel_all_orders_request req; - nlohmann::json cancel_request = ::mm2::api::template_request("cancel_order"); - ::mm2::api::cancel_order_request cancel_req{order_id.toStdString()}; + mm2::cancel_all_orders_request req; + nlohmann::json cancel_request = mm2::template_request("cancel_order"); + mm2::cancel_order_request cancel_req{order_id.toStdString()}; to_json(cancel_request, cancel_req); batch.push_back(cancel_request); } diff --git a/src/core/atomicdex/services/exporter/exporter.service.cpp b/src/core/atomicdex/services/exporter/exporter.service.cpp index 46461044ba..2d6076f49e 100644 --- a/src/core/atomicdex/services/exporter/exporter.service.cpp +++ b/src/core/atomicdex/services/exporter/exporter.service.cpp @@ -66,7 +66,7 @@ namespace atomic_dex LOG_PATH("new csv path is: {}", csv_path); } nlohmann::json batch = nlohmann::json::array(); - nlohmann::json my_recent_swaps = ::mm2::api::template_request("my_recent_swaps"); + nlohmann::json my_recent_swaps = mm2::template_request("my_recent_swaps"); auto& mm2 = m_system_manager.get_system(); const auto swaps_data = mm2.get_orders_and_swaps(); t_my_recent_swaps_request request{ @@ -80,8 +80,8 @@ namespace atomic_dex batch.push_back(my_recent_swaps); auto answer_functor = [csv_path](web::http::http_response resp) { - auto answers = ::mm2::api::basic_batch_answer(resp); - const auto swap_answer = ::mm2::api::rpc_process_answer_batch(answers[0], "my_recent_swaps"); + auto answers = mm2::basic_batch_answer(resp); + const auto swap_answer = mm2::rpc_process_answer_batch(answers[0], "my_recent_swaps"); if (swap_answer.result.has_value()) { const auto result = swap_answer.result.value(); diff --git a/src/core/atomicdex/services/internet/internet.checker.service.cpp b/src/core/atomicdex/services/internet/internet.checker.service.cpp index 498dde173c..548cf80071 100644 --- a/src/core/atomicdex/services/internet/internet.checker.service.cpp +++ b/src/core/atomicdex/services/internet/internet.checker.service.cpp @@ -18,7 +18,6 @@ #include //! Our project -#include "atomicdex/constants/dex.constants.hpp" #include "atomicdex/services/internet/internet.checker.service.hpp" #include "atomicdex/services/mm2/mm2.service.hpp" #include "atomicdex/utilities/cpprestsdk.utilities.hpp" @@ -173,12 +172,12 @@ namespace atomic_dex { SPDLOG_INFO("mm2 is alive, checking if ware able to fetch a simple orderbook"); nlohmann::json batch = nlohmann::json::array(); - nlohmann::json current_request = ::mm2::api::template_request("orderbook"); + nlohmann::json current_request = mm2::template_request("orderbook", true); t_orderbook_request req_orderbook{.base = g_primary_dex_coin, .rel = g_second_primary_dex_coin}; - ::mm2::api::to_json(current_request, req_orderbook); + mm2::to_json(current_request, req_orderbook); batch.push_back(current_request); auto async_answer = mm2.get_mm2_client().async_rpc_batch_standalone(batch); - generic_treat_answer(async_answer, "http://127.0.0.1:7783", &internet_service_checker::is_mm2_endpoint_alive); + generic_treat_answer(async_answer, TO_STD_STR(atomic_dex::g_dex_rpc), &internet_service_checker::is_mm2_endpoint_alive); } else { diff --git a/src/core/atomicdex/services/internet/internet.checker.service.hpp b/src/core/atomicdex/services/internet/internet.checker.service.hpp index e22f4df1c8..12fd00ec49 100644 --- a/src/core/atomicdex/services/internet/internet.checker.service.hpp +++ b/src/core/atomicdex/services/internet/internet.checker.service.hpp @@ -58,7 +58,9 @@ namespace atomic_dex public: //! Constructor - explicit internet_service_checker(entt::registry& registry, ag::ecs::system_manager& system_manager, entt::dispatcher& dispatcher, QObject* parent = nullptr); + explicit internet_service_checker( + entt::registry& registry, ag::ecs::system_manager& system_manager, + entt::dispatcher& dispatcher, QObject* parent = nullptr); ~internet_service_checker() final = default; //! Public override diff --git a/src/core/atomicdex/services/mm2/auto.update.maker.order.service.cpp b/src/core/atomicdex/services/mm2/auto.update.maker.order.service.cpp index 9dc84e6aa0..eea078ba52 100644 --- a/src/core/atomicdex/services/mm2/auto.update.maker.order.service.cpp +++ b/src/core/atomicdex/services/mm2/auto.update.maker.order.service.cpp @@ -81,7 +81,7 @@ namespace atomic_dex nlohmann::json batch = nlohmann::json::array(); std::string new_price = get_new_price_from_order(data, spread); nlohmann::json conf_settings = data.conf_settings.value_or(nlohmann::json()); - nlohmann::json update_maker_order_json = ::mm2::api::template_request("update_maker_order"); + nlohmann::json update_maker_order_json = mm2::template_request("update_maker_order"); t_float_50 volume = safe_float(data.base_amount.toStdString()); t_float_50 min_volume = volume * min_volume_percent; t_update_maker_order_request request{ @@ -96,7 +96,7 @@ namespace atomic_dex request.base_confs = conf_settings.at("base_confs").get(); request.rel_confs = conf_settings.at("rel_confs").get(); } - ::mm2::api::to_json(update_maker_order_json, request); + mm2::to_json(update_maker_order_json, request); batch.push_back(update_maker_order_json); update_maker_order_json["userpass"] = ""; SPDLOG_INFO("request: {}", update_maker_order_json.dump(1)); @@ -106,15 +106,10 @@ namespace atomic_dex .then( []([[maybe_unused]] web::http::http_response resp) { - std::string body = TO_STD_STR(resp.extract_string(true).get()); - SPDLOG_INFO("status_code: {}", resp.status_code()); - if (resp.status_code() == 200) + if (resp.status_code() != 200) { - SPDLOG_INFO("order resp: {}", body); - } - else - { - SPDLOG_WARN("An error occured during update_maker_order: {}", body); + std::string body = TO_STD_STR(resp.extract_string(true).get()); + SPDLOG_ERROR("An error occured during update_maker_order (code: {}): {}", resp.status_code(), body); } }) .then(&handle_exception_pplx_task); @@ -124,16 +119,16 @@ namespace atomic_dex void auto_update_maker_order_service::internal_update() { - SPDLOG_INFO("update maker orders"); + SPDLOG_DEBUG("update maker orders"); const auto& mm2 = this->m_system_manager.get_system(); orders_and_swaps data = mm2.get_orders_and_swaps(); - auto cur = data.orders_and_swaps.cbegin(); - auto end = data.orders_and_swaps.cbegin() + data.nb_orders; - for (; cur != end; ++cur) + auto cur = data.orders_and_swaps.begin(); + auto end = data.orders_and_swaps.begin() + data.nb_orders; + for (; cur != end && cur != data.orders_and_swaps.end(); ++cur) { if (cur->is_maker) { - SPDLOG_INFO("Updating order: {}", cur->order_id.toStdString()); + SPDLOG_DEBUG("Updating order: {}", cur->order_id.toStdString()); this->update_order(*cur); } } diff --git a/src/core/atomicdex/services/mm2/auto.update.maker.order.service.hpp b/src/core/atomicdex/services/mm2/auto.update.maker.order.service.hpp index 9a50d68ead..b2fc78ae7a 100644 --- a/src/core/atomicdex/services/mm2/auto.update.maker.order.service.hpp +++ b/src/core/atomicdex/services/mm2/auto.update.maker.order.service.hpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * diff --git a/src/core/atomicdex/services/mm2/mm2.service.cpp b/src/core/atomicdex/services/mm2/mm2.service.cpp index d3f0265a8a..087c206c1f 100644 --- a/src/core/atomicdex/services/mm2/mm2.service.cpp +++ b/src/core/atomicdex/services/mm2/mm2.service.cpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -14,36 +14,39 @@ * * ******************************************************************************/ -//! STD +#include #include +#include +#include -///! Qt +#include +#include #include #include #include -//! Project Headers -#include "atomicdex/api/mm2/mm2.constants.hpp" +#include "atomicdex/api/mm2/utxo.merge.params.hpp" #include "atomicdex/api/mm2/rpc.electrum.hpp" #include "atomicdex/api/mm2/rpc.enable.hpp" #include "atomicdex/api/mm2/rpc.min.volume.hpp" #include "atomicdex/api/mm2/rpc.tx.history.hpp" +#include "atomicdex/api/mm2/rpc2.z_coin_tx_history.hpp" +#include "atomicdex/api/mm2/rpc2.init_z_coin.hpp" +#include "atomicdex/api/mm2/rpc2.init_z_coin_status.hpp" #include "atomicdex/config/mm2.cfg.hpp" +#include "atomicdex/config/coins.cfg.hpp" +#include "atomicdex/constants/dex.constants.hpp" #include "atomicdex/managers/qt.wallet.manager.hpp" -#include "atomicdex/pages/qt.portfolio.page.hpp" #include "atomicdex/services/internet/internet.checker.service.hpp" #include "atomicdex/services/mm2/mm2.service.hpp" -#include "atomicdex/utilities/kill.hpp" ///< no delete #include "atomicdex/utilities/qt.utilities.hpp" -#include "atomicdex/utilities/stacktrace.prerequisites.hpp" +#include "atomicdex/utilities/kill.hpp" + +namespace ag = antara::gaming; -//! Anonymous functions namespace { - namespace ag = antara::gaming; - - void - check_for_reconfiguration(const std::string& wallet_name) + void check_for_reconfiguration(const std::string& wallet_name) { try { @@ -123,11 +126,18 @@ namespace } } - void - update_coin_status( - const std::string& wallet_name, const std::vector& tickers, bool status, atomic_dex::t_coins_registry& registry, - std::shared_mutex& registry_mtx, std::string field_name = "active") + void update_coin_status(const std::string& wallet_name, const std::vector& tickers, bool status, + atomic_dex::t_coins_registry& registry, std::shared_mutex& registry_mtx, std::string field_name = "active") { + if (wallet_name == "") + { + return; + } + if (tickers.empty()) + { + SPDLOG_DEBUG("Tickers list empty, skipping update_coin_status"); + return; + } SPDLOG_INFO("Update coins status to: {} - field_name: {} - tickers: {}", status, field_name, fmt::join(tickers, ", ")); fs::path cfg_path = atomic_dex::utils::get_atomic_dex_config_folder(); std::string filename = std::string(atomic_dex::get_raw_version()) + "-coins." + wallet_name + ".json"; @@ -184,7 +194,6 @@ namespace ofs.write(QString::fromStdString(config_json_data.dump()).toUtf8()); ofs.close(); - //! Write contents if (!custom_cfg_data.empty()) { @@ -195,13 +204,13 @@ namespace ofs_custom.write(QString::fromStdString(custom_cfg_data.dump()).toUtf8()); ofs_custom.close(); } + SPDLOG_DEBUG("Coins file updated to set {}: {} | tickers: [{}]", field_name, status, fmt::join(tickers, ", ")); } -} // namespace +} namespace atomic_dex { - std::vector - mm2_service::retrieve_coins_informations() + std::vector mm2_service::retrieve_coins_informations() { std::vector cfg; SPDLOG_DEBUG("retrieve_coins_informations"); @@ -210,20 +219,38 @@ namespace atomic_dex const auto cfg_path = atomic_dex::utils::get_atomic_dex_config_folder(); std::string filename = std::string(atomic_dex::get_raw_version()) + "-coins." + m_current_wallet_name + ".json"; std::string custom_tokens_filename = "custom-tokens." + m_current_wallet_name + ".json"; - // SPDLOG_INFO("Retrieving Wallet information of {}", (cfg_path / filename).string()); LOG_PATH("Retrieving Wallet information of {}", (cfg_path / filename)); auto retrieve_cfg_functor = [](fs::path path) -> std::unordered_map { if (exists(path)) { - QFile ifs; - ifs.setFileName(atomic_dex::std_path_to_qstring(path)); - ifs.open(QIODevice::ReadOnly | QIODevice::Text); - nlohmann::json config_json_data = nlohmann::json::parse(QString(ifs.readAll()).toStdString()); - auto res = config_json_data.get>(); - return res; + try + { + QFile ifs; + ifs.setFileName(atomic_dex::std_path_to_qstring(path)); + ifs.open(QIODevice::ReadOnly | QIODevice::Text); + nlohmann::json config_json_data = nlohmann::json::parse(QString(ifs.readAll()).toStdString()); + + //! Iterate through config + for (auto& [key, value]: config_json_data.items()) + { + //! Ensure default coin are marked as active + if (is_default_coin(key)) + { + config_json_data.at(key)["active"] = true; + } + } + + auto res = config_json_data.get>(); + return res; + } + catch (const std::exception& error) + { + SPDLOG_ERROR("exception caught: {}", error.what()); + } } + SPDLOG_DEBUG("Coins file does not exist!"); return {}; }; @@ -256,14 +283,15 @@ namespace atomic_dex { m_orderbook_clock = std::chrono::high_resolution_clock::now(); m_info_clock = std::chrono::high_resolution_clock::now(); + dispatcher_.sink().connect<&mm2_service::on_zhtlc_enter_enabling>(*this); + dispatcher_.sink().connect<&mm2_service::on_zhtlc_leave_enabling>(*this); dispatcher_.sink().connect<&mm2_service::on_gui_enter_trading>(*this); dispatcher_.sink().connect<&mm2_service::on_gui_leave_trading>(*this); dispatcher_.sink().connect<&mm2_service::on_refresh_orderbook>(*this); SPDLOG_INFO("mm2_service created"); } - void - mm2_service::update() + void mm2_service::update() { using namespace std::chrono_literals; @@ -278,6 +306,24 @@ namespace atomic_dex if (s >= 5s) { + if (m_nb_update_required > 0) + { + auto coins = this->get_enabled_coins(); + std::vector tickers; + for (auto&& coin: coins) + { + if (!coin.active) + { + tickers.push_back(coin.ticker); + } + } + if (!tickers.empty()) + { + SPDLOG_INFO("coin_status_update required, {}", m_nb_update_required); + update_coin_status(this->m_current_wallet_name, tickers, true, m_coins_informations, m_coin_cfg_mutex); + } + m_nb_update_required -= 1; + } fetch_current_orderbook_thread(false); batch_fetch_orders_and_swap(); m_orderbook_clock = std::chrono::high_resolution_clock::now(); @@ -296,19 +342,21 @@ namespace atomic_dex dispatcher_.sink().disconnect<&mm2_service::on_gui_enter_trading>(*this); dispatcher_.sink().disconnect<&mm2_service::on_gui_leave_trading>(*this); dispatcher_.sink().disconnect<&mm2_service::on_refresh_orderbook>(*this); + dispatcher_.sink().disconnect<&mm2_service::on_zhtlc_enter_enabling>(*this); + dispatcher_.sink().disconnect<&mm2_service::on_zhtlc_leave_enabling>(*this); SPDLOG_INFO("mm2 signals successfully disconnected"); bool mm2_stopped = false; if (m_mm2_running) { SPDLOG_INFO("preparing mm2 stop batch request"); - nlohmann::json stop_request = ::mm2::api::template_request("stop"); + nlohmann::json stop_request = mm2::template_request("stop"); nlohmann::json batch = nlohmann::json::array(); batch.push_back(stop_request); SPDLOG_INFO("processing mm2 stop batch request"); pplx::task resp_task = m_mm2_client.async_rpc_batch_standalone(batch); web::http::http_response resp = resp_task.get(); SPDLOG_INFO("mm2 stop batch answer received"); - auto answers = ::mm2::api::basic_batch_answer(resp); + auto answers = mm2::basic_batch_answer(resp); if (answers[0].contains("result")) { mm2_stopped = answers[0].at("result").get() == "success"; @@ -323,7 +371,7 @@ namespace atomic_dex { SPDLOG_INFO("mm2 didn't stop yet with rpc stop, stopping process manually"); #if defined(_WIN32) || defined(WIN32) - atomic_dex::kill_executable("mm2"); + atomic_dex::kill_executable(atomic_dex::g_dex_api); #else /*const reproc::stop_actions stop_actions = { {reproc::stop::terminate, reproc::milliseconds(2000)}, @@ -348,14 +396,12 @@ namespace atomic_dex SPDLOG_INFO("mm2 service fully destroyed"); } - const std::atomic_bool& - mm2_service::is_mm2_running() const + const std::atomic_bool& mm2_service::is_mm2_running() const { return m_mm2_running; } - t_coins - mm2_service::get_enabled_coins() const + t_coins mm2_service::get_enabled_coins() const { t_coins destination; @@ -371,8 +417,7 @@ namespace atomic_dex return destination; } - t_coins - mm2_service::get_active_coins() const + t_coins mm2_service::get_active_coins() const { t_coins destination; @@ -388,17 +433,19 @@ namespace atomic_dex return destination; } - bool - mm2_service::disable_coin(const std::string& ticker, std::error_code& ec) + bool mm2_service::disable_coin(const std::string& ticker, std::error_code& ec) { coin_config coin_info = get_coin_info(ticker); if (not coin_info.currently_enabled) { + SPDLOG_DEBUG("[mm2_service::disable_coin]: {} not currently_enabled", ticker); return true; } t_disable_coin_request request{.coin = ticker}; + auto answer = m_mm2_client.rpc_disable_coin(std::move(request)); + SPDLOG_DEBUG("mm2_service::disable_coin: {} result: {}", ticker, answer.raw_result); if (answer.error.has_value()) { @@ -418,44 +465,572 @@ namespace atomic_dex ec = dextop_error::order_is_matched_at_the_moment; return false; } + return false; } - coin_info.currently_enabled = false; - { std::unique_lock lock(m_coin_cfg_mutex); m_coins_informations[ticker].currently_enabled = false; } - dispatcher_.trigger(ticker); return true; } - bool - mm2_service::enable_default_coins() + bool mm2_service::enable_default_coins() { std::atomic result{1}; auto coins = get_active_coins(); + + enable_coins(coins); + batch_fetch_orders_and_swap(); + this->dispatcher_.trigger(); + return result.load() == 1; + } + + void mm2_service::enable_coin(const std::string& ticker) + { + enable_coin(get_coin_info(ticker)); + } - std::vector tickers; - tickers.reserve(coins.size()); - for (auto&& current_coin: coins) + void mm2_service::enable_coin(const coin_config& coin_config) + { + enable_coins(t_coins{coin_config}); + } + + void mm2_service::enable_coins(const std::vector& tickers) + { + t_coins coins{}; + + for (const auto& ticker : tickers) { - SPDLOG_INFO("current_coin: {} is a default coin", current_coin.ticker); - tickers.push_back(current_coin.ticker); + coins.push_back(get_coin_info(ticker)); } + coins.erase(std::unique(coins.begin(), coins.end(), [](auto left, auto right) { return left.ticker == right.ticker; }), coins.end()); // Remove duplicates + enable_coins(coins); + } - batch_enable_coins(tickers, true); + void mm2_service::enable_coins(const t_coins& coins) + { + t_coins other_coins; + t_coins erc_family_coins; + t_coins slp_coins; + t_coins slp_testnet_coins; + t_coins zhtlc_coins; + + for (const auto& coin_config : coins) + { + if (coin_config.currently_enabled) + { + SPDLOG_WARN("{} cannot be enabled because it already is or being enabled.", coin_config.ticker); + } + else if (coin_config.coin_type == CoinType::SLP || (coin_config.other_types && coin_config.other_types->contains(CoinType::SLP))) + { + if (coin_config.is_testnet.value_or(false)) + { + slp_testnet_coins.push_back(coin_config); + } + else + { + slp_coins.push_back(coin_config); + } + } + else if (coin_config.coin_type == CoinType::ZHTLC) + { + zhtlc_coins.push_back(coin_config); + } + else if (coin_config.is_erc_family) + { + erc_family_coins.push_back(coin_config); + } + else + { + other_coins.push_back(coin_config); + } + } + if (other_coins.size() > 0) + { + enable_utxo_qrc20_coins(other_coins); + } + if (erc_family_coins.size() > 0) + { + enable_erc_family_coins(erc_family_coins); + } + if (slp_coins.size() > 0) + { + enable_slp_coins(slp_coins); + } + if (slp_testnet_coins.size() > 0) + { + enable_slp_testnet_coins(slp_testnet_coins); + } + if (zhtlc_coins.size() > 0) + { + enable_zhtlc(zhtlc_coins); + } + } - batch_fetch_orders_and_swap(); + void mm2_service::enable_erc_family_coin(const coin_config& coin_config) + { + enable_erc_family_coins(t_coins{coin_config}); + } - return result.load() == 1; + void mm2_service::enable_erc_family_coins(const t_coins& coins) + { + nlohmann::json batch_array = nlohmann::json::array(); + auto callback = [this, coins](const web::http::http_response& resp) + { + try + { + auto answers = mm2::basic_batch_answer(resp); + + if (answers.count("error") == 0) + { + std::size_t idx = 0; + t_coins activated_coins; + t_coins failed_coins; + + for (auto&& answer : answers) + { + auto [res, error] = this->process_batch_enable_answer(answer); + if (!res) + { + SPDLOG_DEBUG( + "bad answer for: [{}] -> removing it from enabling, idx: {}, tickers size: {}, answers size: {}", coins[idx].ticker, idx, + coins.size(), answers.size()); + if (error.find("already initialized") != std::string::npos) + { + SPDLOG_INFO("{} {}: ", coins[idx].ticker, error); + activated_coins.push_back(std::move(coins[idx])); + } + else + { + failed_coins.push_back(std::move(coins[idx])); + this->dispatcher_.trigger(coins[idx].ticker, error); + SPDLOG_ERROR(error); + } + } + else + { + activated_coins.push_back(std::move(coins[idx])); + this->process_balance_answer(answer); + } + idx += 1; + } + std::vector tickers; + for (auto&& coin: activated_coins) + { + m_coins_informations[coin.ticker].currently_enabled = true; + tickers.push_back(coin.ticker); + fetch_single_balance(coin); + } + dispatcher_.trigger(tickers); + + std::vector failed_tickers; + for (auto&& coin: failed_coins) + { + m_coins_informations[coin.ticker].currently_enabled = false; + failed_tickers.push_back(coin.ticker); + } + update_coin_active(failed_tickers, false); + fetch_infos_thread(false, false); + } + } + catch (const std::exception& error) + { + SPDLOG_ERROR(error.what()); + } + this->m_nb_update_required += 1; + }; + + for (const auto& coin_config : coins) + { + t_enable_request request + { + .coin_name = coin_config.ticker, + .urls = coin_config.eth_family_urls.value_or(std::vector{}), + .coin_type = coin_config.coin_type, + .is_testnet = coin_config.is_testnet.value_or(false), + .with_tx_history = false + }; + nlohmann::json j = mm2::template_request("enable"); + + mm2::to_json(j, request); + batch_array.push_back(j); + } + m_mm2_client.async_rpc_batch_standalone(batch_array) + .then(callback) + .then([this, batch_array](pplx::task previous_task) { this->handle_exception_pplx_task(previous_task, "enable_common_coins", batch_array); }); + } + + void mm2_service::enable_utxo_qrc20_coin(coin_config coin_config) + { + enable_utxo_qrc20_coins(t_coins{std::move(coin_config)}); + } + + void mm2_service::update_coin_active(const std::vector& tickers, bool status) + { + update_coin_status(this->m_current_wallet_name, tickers, status, m_coins_informations, m_coin_cfg_mutex); + } + + void mm2_service::enable_utxo_qrc20_coins(const t_coins& coins) + { + auto batch_array = nlohmann::json::array(); + auto callback = [this, coins](const web::http::http_response& resp) + { + try + { + auto answers = mm2::basic_batch_answer(resp); + + if (answers.count("error") == 0) + { + std::size_t idx = 0; + t_coins activated_coins; + t_coins failed_coins; + + for (auto&& answer : answers) + { + auto [res, error] = this->process_batch_enable_answer(answer); + if (!res) + { + SPDLOG_DEBUG( + "bad answer for: [{}] -> removing it from enabling, idx: {}, tickers size: {}, answers size: {}", coins[idx].ticker, idx, + coins.size(), answers.size()); + if (error.find("already initialized") != std::string::npos) + { + SPDLOG_INFO("{} {}: ", coins[idx].ticker, error); + activated_coins.push_back(std::move(coins[idx])); + } + else + { + failed_coins.push_back(std::move(coins[idx])); + this->dispatcher_.trigger(coins[idx].ticker, error); + SPDLOG_ERROR(error); + } + } + else + { + this->process_balance_answer(answer); + activated_coins.push_back(std::move(coins[idx])); + } + idx += 1; + } + + std::vector tickers; + for (auto&& coin: activated_coins) + { + m_coins_informations[coin.ticker].currently_enabled = true; + tickers.push_back(coin.ticker); + fetch_single_balance(coin); + } + dispatcher_.trigger(tickers); + + std::vector failed_tickers; + for (auto&& coin: failed_coins) + { + m_coins_informations[coin.ticker].currently_enabled = false; + failed_tickers.push_back(coin.ticker); + } + update_coin_active(failed_tickers, false); + fetch_infos_thread(false, false); + } + } + catch (const std::exception& error) + { + SPDLOG_ERROR(error.what()); + } + this->m_nb_update_required += 1; + }; + + for (const auto& coin_config : coins) + { + nlohmann::json j = mm2::template_request("electrum"); + t_electrum_request request + { + .coin_name = coin_config.ticker, + .servers = coin_config.electrum_urls.value_or(get_electrum_server_from_token(coin_config.ticker)), + .coin_type = coin_config.coin_type, + .is_testnet = coin_config.is_testnet.value_or(false), + .with_tx_history = true + }; + + if (coin_config.segwit && coin_config.is_segwit_on) + { + request.address_format = nlohmann::json::object(); + request.address_format.value()["format"] = "segwit"; + } + if (coin_config.utxo_merge.value_or(false)) + { + mm2::utxo_merge_params merge_params{.merge_at = 250, .check_every = 300, .max_merge_at_once = 125}; + nlohmann::json json_merge_params; + + mm2::to_json(json_merge_params, merge_params); + request.merge_params = json_merge_params; + } + mm2::to_json(j, request); + batch_array.push_back(j); + } + m_mm2_client.async_rpc_batch_standalone(batch_array) + .then(callback) + .then([this, batch_array](pplx::task previous_task) { this->handle_exception_pplx_task(previous_task, "enable_qrc_family_coins", batch_array); }); } + void mm2_service::enable_slp_coin(coin_config coin_config) + { + enable_slp_coins(t_coins{std::move(coin_config)}); + } + + void mm2_service::enable_slp_coins(const t_coins& coins) + { + constexpr auto bch_ticker = "BCH"; + auto callback = [this](RpcRequest rpc) + { + if (rpc.error) + { + if (rpc.error->error_type.find("PlatformIsAlreadyActivated") != std::string::npos || rpc.error->error_type.find("TokenIsAlreadyActivated") != std::string::npos) + { + SPDLOG_ERROR("{} {}: ", rpc.request.ticker, rpc.error->error_type); + fetch_single_balance(get_coin_info(rpc.request.ticker)); + m_coins_informations[rpc.request.ticker].currently_enabled = true; + dispatcher_.trigger(coin_fully_initialized{.tickers = {rpc.request.ticker}}); + if constexpr (std::is_same_v) + { + for (const auto& slp_coin_info : rpc.request.slp_tokens_requests) + { + SPDLOG_ERROR("{} {}: ", slp_coin_info.ticker, rpc.error->error_type); + fetch_single_balance(get_coin_info(slp_coin_info.ticker)); + m_coins_informations[slp_coin_info.ticker].currently_enabled = true; + dispatcher_.trigger(coin_fully_initialized{.tickers = {slp_coin_info.ticker}}); + } + } + } + else + { + m_coins_informations[rpc.request.ticker].currently_enabled = false; + update_coin_active({rpc.request.ticker}, false); + this->dispatcher_.trigger(rpc.request.ticker, rpc.error->error); + } + } + else + { + dispatcher_.trigger(coin_fully_initialized{.tickers = {rpc.request.ticker}}); + fetch_single_balance(get_coin_info(rpc.request.ticker)); + m_coins_informations[rpc.request.ticker].currently_enabled = true; + if constexpr (std::is_same_v) + { + for (const auto& slp_address_info : rpc.result->slp_addresses_infos) + { + for (const auto& balance : slp_address_info.second.balances) + { + dispatcher_.trigger(coin_fully_initialized{.tickers = {balance.first}}); + process_balance_answer(rpc); + m_coins_informations[balance.first].currently_enabled = true; + } + } + } + process_balance_answer(rpc); + } + this->m_nb_update_required += 1; + }; + + if (!has_coin(bch_ticker)) + { + static constexpr auto error = "{} is not present in the config. Cannot enable SLP tokens."; + + SPDLOG_ERROR(error); + this->dispatcher_.trigger(bch_ticker, fmt::format(error, bch_ticker)); + return; + } + + auto bch_info = get_coin_info(bch_ticker); + + if (bch_info.currently_enabled) + { + for (const auto& coin_config : coins) + { + mm2::enable_slp_rpc rpc{.request={.ticker = coin_config.ticker}}; + + if (coin_config.ticker == bch_info.ticker) + { + continue; + } + m_mm2_client.process_rpc_async(rpc.request, callback); + } + } + else + { + mm2::enable_bch_with_tokens_rpc rpc; + + rpc.request.ticker = bch_info.ticker; + rpc.request.allow_slp_unsafe_conf = bch_info.allow_slp_unsafe_conf.has_value() && bch_info.allow_slp_unsafe_conf.value(); + rpc.request.bchd_urls = bch_info.bchd_urls.value_or(std::vector{}); + rpc.request.mode.rpc_data.servers = bch_info.electrum_urls.value_or(std::vector{}); + for (const auto& coin_config : coins) + { + if (coin_config.ticker == bch_info.ticker) + { + continue; + } + rpc.request.slp_tokens_requests.push_back({.ticker = coin_config.ticker}); + } + m_mm2_client.process_rpc_async(rpc.request, callback); + } + } + + + void mm2_service::enable_slp_testnet_coin(coin_config coin_config) + { + enable_slp_testnet_coins(t_coins{std::move(coin_config)}); + } + + void mm2_service::enable_slp_testnet_coins(const t_coins& coins) + { + constexpr auto bch_ticker = "tBCH"; + auto callback = [this](RpcRequest rpc) + { + if (rpc.error) + { + if (rpc.error->error_type.find("PlatformIsAlreadyActivated") != std::string::npos || rpc.error->error_type.find("TokenIsAlreadyActivated") != std::string::npos) + { + SPDLOG_ERROR("{} {}: ", rpc.request.ticker, rpc.error->error_type); + fetch_single_balance(get_coin_info(rpc.request.ticker)); + m_coins_informations[rpc.request.ticker].currently_enabled = true; + dispatcher_.trigger(coin_fully_initialized{.tickers = {rpc.request.ticker}}); + if constexpr (std::is_same_v) + { + for (const auto& slp_coin_info : rpc.request.slp_tokens_requests) + { + SPDLOG_ERROR("{} {}: ", slp_coin_info.ticker, rpc.error->error_type); + fetch_single_balance(get_coin_info(slp_coin_info.ticker)); + m_coins_informations[slp_coin_info.ticker].currently_enabled = true; + dispatcher_.trigger(coin_fully_initialized{.tickers = {slp_coin_info.ticker}}); + } + } + } + else + { + m_coins_informations[rpc.request.ticker].currently_enabled = false; + update_coin_active({rpc.request.ticker}, false); + this->dispatcher_.trigger(rpc.request.ticker, rpc.error->error); + } + } + else + { + dispatcher_.trigger(coin_fully_initialized{.tickers = {rpc.request.ticker}}); + fetch_single_balance(get_coin_info(rpc.request.ticker)); + m_coins_informations[rpc.request.ticker].currently_enabled = true; + if constexpr (std::is_same_v) + { + for (const auto& slp_address_info : rpc.result->slp_addresses_infos) + { + for (const auto& balance : slp_address_info.second.balances) + { + dispatcher_.trigger(coin_fully_initialized{.tickers = {balance.first}}); + process_balance_answer(rpc); + m_coins_informations[balance.first].currently_enabled = true; + } + } + } + process_balance_answer(rpc); + } + this->m_nb_update_required += 1; + }; + + if (!has_coin(bch_ticker)) + { + static constexpr auto error = "tBCH is not present in the config. Cannot enable SLP tokens."; + + SPDLOG_ERROR(error); + this->dispatcher_.trigger("SLP tokens", error); + return; + } + + auto bch_info = get_coin_info(bch_ticker); + + if (bch_info.currently_enabled) + { + for (const auto& coin_config : coins) + { + mm2::enable_slp_rpc rpc{.request={.ticker = coin_config.ticker}}; + + if (coin_config.ticker == bch_info.ticker) + { + continue; + } + m_mm2_client.process_rpc_async(rpc.request, callback); + } + } + else + { + mm2::enable_bch_with_tokens_rpc rpc; + + rpc.request.ticker = bch_info.ticker; + rpc.request.allow_slp_unsafe_conf = bch_info.allow_slp_unsafe_conf.has_value() && bch_info.allow_slp_unsafe_conf.value(); + rpc.request.bchd_urls = bch_info.bchd_urls.value_or(std::vector{}); + rpc.request.mode.rpc_data.servers = bch_info.electrum_urls.value_or(std::vector{}); + for (const auto& coin_config : coins) + { + if (coin_config.ticker == bch_info.ticker) + { + continue; + } + rpc.request.slp_tokens_requests.push_back({.ticker = coin_config.ticker}); + } + m_mm2_client.process_rpc_async(rpc.request, callback); + } + } + + void mm2_service::process_balance_answer(const mm2::enable_slp_rpc& rpc) + { + const auto& answer = rpc.result.value(); + mm2::balance_answer balance_answer; + + balance_answer.address = answer.balances.begin()->first; + balance_answer.balance = answer.balances.begin()->second.spendable; + balance_answer.coin = answer.platform_coin; + + { + std::unique_lock lock(m_balance_mutex); + m_balance_informations[balance_answer.coin] = std::move(balance_answer); + } + } + + void mm2_service::process_balance_answer(const mm2::enable_bch_with_tokens_rpc& rpc) + { + const auto& answer = rpc.result.value(); + { + mm2::balance_answer balance_answer; + + balance_answer.coin = rpc.request.ticker; + balance_answer.balance = answer.bch_addresses_infos.begin()->second.balances.spendable; + balance_answer.address = answer.bch_addresses_infos.begin()->first; + { + std::unique_lock lock(m_balance_mutex); + m_balance_informations[balance_answer.coin] = std::move(balance_answer); + } + } + for (auto [address, data] : answer.slp_addresses_infos) + { + if (data.balances.empty()) + { + continue; + } + + mm2::balance_answer balance_answer; + + balance_answer.coin = data.balances.begin()->first; + balance_answer.address = address; + balance_answer.balance = data.balances.begin()->second.spendable; + + { + std::unique_lock lock(m_balance_mutex); + m_balance_informations[balance_answer.coin] = std::move(balance_answer); + } + } + } + void mm2_service::disable_multiple_coins(const std::vector& tickers) { - SPDLOG_DEBUG("disable_multiple_coins"); for (const auto& ticker: tickers) { std::error_code ec; @@ -472,28 +1047,39 @@ namespace atomic_dex auto mm2_service::batch_balance_and_tx(bool is_a_reset, std::vector tickers, bool is_during_enabling, bool only_tx) { - // SPDLOG_INFO("batch_balance_and_tx"); (void)tickers; (void)is_during_enabling; auto&& [batch_array, tickers_idx, tokens_to_fetch] = prepare_batch_balance_and_tx(only_tx); return m_mm2_client.async_rpc_batch_standalone(batch_array) .then( - [this, tokens_to_fetch = tokens_to_fetch, is_a_reset, tickers](web::http::http_response resp) + [this, tokens_to_fetch = tokens_to_fetch, is_a_reset, tickers, batch_array = batch_array](web::http::http_response resp) { try { - auto answers = ::mm2::api::basic_batch_answer(resp); + auto answers = mm2::basic_batch_answer(resp); if (not answers.contains("error")) { - for (auto&& answer: answers) + for (auto i = 0ul; i < answers.size(); i++) { + auto& answer = answers[i]; + std::string ticker; + + if (batch_array[i].contains("mmrpc") && batch_array[i].at("mmrpc") == "2.0") + { + ticker = batch_array[i].at("params").at("coin"); + } + else + { + ticker = batch_array[i].at("coin"); + } + if (answer.contains("balance")) { this->process_balance_answer(answer); } else if (answer.contains("result")) { - this->process_tx_answer(answer); + this->process_tx_answer(answer, ticker); } else { @@ -530,20 +1116,36 @@ namespace atomic_dex std::vector tokens_to_fetch; const auto& ticker = get_current_ticker(); auto coin_info = get_coin_info(ticker); - if (!coin_info.is_erc_family) + + if (coin_info.is_erc_family) { - t_tx_history_request request{.coin = ticker, .limit = 5000}; - nlohmann::json j = ::mm2::api::template_request("my_tx_history"); - ::mm2::api::to_json(j, request); - batch_array.push_back(j); + tokens_to_fetch.push_back(ticker); } else { - tokens_to_fetch.push_back(ticker); + std::string method = "my_tx_history"; + std::size_t limit = 5000; + bool requires_v2 = false; + if (coin_info.is_zhtlc_family) + { + requires_v2 = true; + limit = 50; + method = "z_coin_tx_history"; + } + else if (coin_info.coin_type == CoinTypeGadget::SLP || coin_info.ticker == "tBCH" || coin_info.ticker == "BCH") + { + requires_v2 = true; + } + + t_tx_history_request request{.coin = ticker, .limit = limit}; + nlohmann::json j = mm2::template_request(method, requires_v2); + mm2::to_json(j, request); + batch_array.push_back(j); } + if (not only_tx) { - for (auto&& coin: enabled_coins) + for (auto&& coin : enabled_coins) { if (is_pin_cfg_enabled()) { @@ -553,9 +1155,10 @@ namespace atomic_dex continue; } } + SPDLOG_WARN("Getting balance for {} ", coin.ticker); t_balance_request balance_request{.coin = coin.ticker}; - nlohmann::json j = ::mm2::api::template_request("my_balance"); - ::mm2::api::to_json(j, balance_request); + nlohmann::json j = mm2::template_request("my_balance"); + mm2::to_json(j, balance_request); batch_array.push_back(j); tickers_idx.push_back(coin.ticker); } @@ -567,10 +1170,11 @@ namespace atomic_dex mm2_service::process_batch_enable_answer(const json& answer) { std::string error = answer.dump(4); + std::string data = answer.dump(); if (answer.contains("error") || answer.contains("Error") || error.find("error") != std::string::npos || error.find("Error") != std::string::npos) { - SPDLOG_DEBUG("bad answer json for enable/electrum details: {}", error); + SPDLOG_DEBUG("error: bad answer json for enable/electrum details: {}", error); return {false, error}; } @@ -584,104 +1188,47 @@ namespace atomic_dex return {true, ""}; } - SPDLOG_DEBUG("bad answer json for enable/electrum details: {}", error); - return {false, error}; - } - - void - mm2_service::batch_enable_coins(const std::vector& tickers, bool first_time) - { - nlohmann::json btc_kmd_batch = nlohmann::json::array(); - if (first_time) + if (answer.contains("result")) { - coin_config coin_info = get_coin_info(g_second_primary_dex_coin); - t_electrum_request request{.coin_name = coin_info.ticker, .servers = coin_info.electrum_urls.value(), .with_tx_history = true}; - if (coin_info.segwit && coin_info.is_segwit_on) + if (answer["result"].contains("task_id")) { - request.address_format = nlohmann::json::object(); - request.address_format.value()["format"] = "segwit"; + return {true, ""}; } - nlohmann::json j = ::mm2::api::template_request("electrum"); - ::mm2::api::to_json(j, request); - btc_kmd_batch.push_back(j); - coin_info = get_coin_info(g_primary_dex_coin); - t_electrum_request request_kmd{.coin_name = coin_info.ticker, .servers = coin_info.electrum_urls.value(), .with_tx_history = true}; - j = ::mm2::api::template_request("electrum"); - ::mm2::api::to_json(j, request_kmd); - btc_kmd_batch.push_back(j); } + SPDLOG_DEBUG("bad answer json for enable/electrum details: {}", error); - nlohmann::json batch_array = nlohmann::json::array(); - - std::vector copy_tickers; - - for (const auto& ticker: tickers) - { - if (ticker == g_primary_dex_coin || ticker == g_second_primary_dex_coin) - continue; - copy_tickers.push_back(ticker); - coin_config coin_info = get_coin_info(ticker); - - if (coin_info.currently_enabled) - { - continue; - } + return {false, error}; + } - if (!coin_info.is_erc_family) - { - t_electrum_request request{ - .coin_name = coin_info.ticker, - .servers = coin_info.electrum_urls.value_or(get_electrum_server_from_token(coin_info.ticker)), - .coin_type = coin_info.coin_type, - .is_testnet = coin_info.is_testnet.value_or(false), - .with_tx_history = true}; - if (coin_info.segwit && coin_info.is_segwit_on) - { - request.address_format = nlohmann::json::object(); - request.address_format.value()["format"] = "segwit"; - } - nlohmann::json j = ::mm2::api::template_request("electrum"); - ::mm2::api::to_json(j, request); - batch_array.push_back(j); - } - else - { - t_enable_request request{ - .coin_name = coin_info.ticker, - .urls = coin_info.urls.value_or(std::vector{}), - .coin_type = coin_info.coin_type, - .is_testnet = coin_info.is_testnet.value_or(false), - .with_tx_history = false}; - nlohmann::json j = ::mm2::api::template_request("enable"); - ::mm2::api::to_json(j, request); - // SPDLOG_INFO("enable request: {}", j.dump(4)); - batch_array.push_back(j); - } - //! If the coin is a custom coin and not present, then we have a config mismatch, we re-add it to the mm2 coins cfg but this need a app restart. - if (coin_info.is_custom_coin && !this->is_this_ticker_present_in_raw_cfg(coin_info.ticker)) - { - nlohmann::json empty = "{}"_json; - if (coin_info.custom_backup.has_value()) - { - SPDLOG_WARN("Configuration mismatch between mm2 cfg and coin cfg for ticker {}, readjusting...", coin_info.ticker); - this->add_new_coin(empty, coin_info.custom_backup.value()); - this->dispatcher_.trigger(coin_info.ticker); - } - } - } + void mm2_service::enable_zhtlc(const t_coins& coins) + { + dispatcher_.trigger(); + auto request_functor = [this](coin_config coin_info) -> std::pair> + { + t_init_z_coin_request request{ + .coin_name = coin_info.ticker, + .servers = coin_info.electrum_urls.value_or(get_electrum_server_from_token(coin_info.ticker)), + .z_urls = coin_info.z_urls.value_or(std::vector{}), + .coin_type = coin_info.coin_type, + .is_testnet = coin_info.is_testnet.value_or(false), + .with_tx_history = false}; // Tx history not yet ready for ZHTLC + + nlohmann::json j = mm2::template_request("init_z_coin", true); + mm2::to_json(j, request); + nlohmann::json batch = nlohmann::json::array(); + batch.push_back(j); + return {batch, {coin_info.ticker}}; + }; - // SPDLOG_DEBUG("{}", batch_array.dump(4)); - auto functor = [this](nlohmann::json batch_array, std::vector tickers) + auto answer_functor = [this](nlohmann::json batch, std::vector tickers) { - m_mm2_client.async_rpc_batch_standalone(batch_array) + m_mm2_client.async_rpc_batch_standalone(batch) .then( [this, tickers](web::http::http_response resp) mutable { try { - SPDLOG_DEBUG("Enabling coin finished"); - auto answers = ::mm2::api::basic_batch_answer(resp); - SPDLOG_DEBUG("Enabling coin parsed"); + auto answers = mm2::basic_batch_answer(resp); if (answers.count("error") == 0) { @@ -690,87 +1237,244 @@ namespace atomic_dex for (auto&& answer: answers) { auto [res, error] = this->process_batch_enable_answer(answer); + if (!res) { SPDLOG_DEBUG( "bad answer for: [{}] -> removing it from enabling, idx: {}, tickers size: {}, answers size: {}", tickers[idx], idx, tickers.size(), answers.size()); - this->dispatcher_.trigger(tickers[idx], error); - to_remove.emplace(tickers[idx]); - if (error.find("already initialized") == std::string::npos) + if (error.find("CoinIsAlreadyActivated") != std::string::npos) + { + SPDLOG_ERROR(error); + SPDLOG_DEBUG("{} activation complete!", tickers[idx]); + std::unique_lock lock(m_coin_cfg_mutex); + m_coins_informations[tickers[idx]].currently_enabled = true; + this->m_nb_update_required += 1; + this->dispatcher_.trigger(coin_fully_initialized{.tickers = {tickers[idx]}}); + this->dispatcher_.trigger(tickers[idx], "Complete!"); + } + else { - SPDLOG_WARN("Should set to false the active field in cfg for: {} - reason: {}", tickers[idx], error); + SPDLOG_ERROR(error); + to_remove.emplace(tickers[idx]); + this->dispatcher_.trigger(tickers[idx], error); } } - idx += 1; - if (res) + else if (answer.contains("result")) { - this->process_balance_answer(answer); + if (answer["result"].contains("task_id")) + { + auto task_id = answer.at("result").at("task_id").get(); + { + using namespace std::chrono_literals; + + static std::size_t z_nb_try = 0; + nlohmann::json z_error = nlohmann::json::array(); + nlohmann::json z_batch_array = nlohmann::json::array(); + t_init_z_coin_status_request z_request{.task_id = task_id}; + + SPDLOG_DEBUG("{} init_z_coin Task ID: {}", tickers[idx], task_id); + + nlohmann::json j = mm2::template_request("init_z_coin_status", true); + mm2::to_json(j, z_request); + z_batch_array.push_back(j); + std::string last_event = "none"; + std::string event = "none"; + + do { + pplx::task z_resp_task = m_mm2_client.async_rpc_batch_standalone(z_batch_array); + web::http::http_response z_resp = z_resp_task.get(); + auto z_answers = mm2::basic_batch_answer(z_resp); + z_error = z_answers; + + std::string status = z_answers[0].at("result").at("status").get(); + + if (status == "Ready") + { + m_coins_informations[tickers[idx]].activation_status = z_answers[0]; + if (z_answers[0].at("result").at("details").contains("error")) + { + if (z_answers[0].at("result").at("details").at("error").contains("error_type")) + { + if (z_answers[0].at("result").at("details").at("error").at("error_type") == "CoinIsAlreadyActivated") + { + continue; + } + } + event = z_answers[0].at("result").at("details").at("error").get(); + SPDLOG_DEBUG("Enabling [{}] error: {}", tickers[idx], event); + break; + } + SPDLOG_DEBUG("{} activation complete!", tickers[idx]); + std::unique_lock lock(m_coin_cfg_mutex); + m_coins_informations[tickers[idx]].currently_enabled = true; + + dispatcher_.trigger(coin_fully_initialized{.tickers = {tickers[idx]}}); + this->m_nb_update_required += 1; + break; + } + else + { + // todo(syl): many unused variables. + // fix that + if (z_answers[0].at("result").at("details").contains("UpdatingBlocksCache")) + { + event = "UpdatingBlocksCache"; + std::size_t current_scanned_block = z_answers[0].at("result").at("details").at("UpdatingBlocksCache").at("current_scanned_block"); + std::size_t latest_block = z_answers[0].at("result").at("details").at("UpdatingBlocksCache").at("latest_block"); + // SPDLOG_DEBUG("Waiting for {} to enable [{}: {}] {}/{} blocks scanned", tickers[idx], status, event, current_scanned_block, latest_block); + } + else if (z_answers[0].at("result").at("details").contains("BuildingWalletDb")) + { + event = "BuildingWalletDb"; + std::size_t current_scanned_block = z_answers[0].at("result").at("details").at("BuildingWalletDb").at("current_scanned_block"); + std::size_t latest_block = z_answers[0].at("result").at("details").at("BuildingWalletDb").at("latest_block"); + // SPDLOG_DEBUG("Waiting for {} to enable [{}: {}] {}/{} blocks scanned", tickers[idx], status, event, current_scanned_block, latest_block); + } + else + { + event = z_answers[0].at("result").at("details").get(); + // SPDLOG_DEBUG("Waiting for {} to enable [{}: {}]...", tickers[idx], status, event); + // Do we need to handle this? Happens when running init_zcoin_enable twice + // {"mmrpc":"2.0","result":{"status":"InProgress","details":{"TemporaryError":"z_rpc:387] UNIQUE constraint failed: blocks.height"}},"id":null} + } + + if (event != last_event) + { + SPDLOG_DEBUG("Waiting for {} to enable [{}: {}]...", tickers[idx], status, event); + // After an event change, full activation is just a matter of time (earlier it might fail). + // We tag it as activated, so it shows up in portfolio and not enable list. + if (!m_coins_informations[tickers[idx]].currently_enabled && event != "ActivatingCoin") + { + std::unique_lock lock(m_coin_cfg_mutex); + m_coins_informations[tickers[idx]].currently_enabled = true; + + dispatcher_.trigger(coin_fully_initialized{.tickers = {tickers[idx]}}); + this->m_nb_update_required += 1; + } + this->dispatcher_.trigger(tickers[idx], event); + last_event = event; + } + + // todo(syl): refactor to a background task + std::this_thread::sleep_for(2s); + } + m_coins_informations[tickers[idx]].activation_status = z_answers[0]; + z_nb_try += 1; + + } while (z_nb_try < 1000); + + try { + if (z_error[0].at("result").at("details").contains("error")) + { + std::string zhtlc_error = z_error[0].at("result").at("details").at("error").get(); + SPDLOG_DEBUG("Error enabling {}: {} ", tickers[idx], zhtlc_error); + SPDLOG_DEBUG( + "Removing zhtlc from enabling, idx: {}, tickers size: {}, answers size: {}", + tickers[idx], idx, tickers.size(), answers.size() + ); + + this->dispatcher_.trigger(tickers[idx], event); + this->dispatcher_.trigger(tickers[idx], z_error[0].dump(4)); + to_remove.emplace(tickers[idx]); + } + else if (z_nb_try == 1000) + { + // TODO: Handle this case. + // There could be no error message if scanning takes too long. + // Either we force disable here, or schedule to check on it later + // If this happens, address will be "Invalid" and balance will be zero. + // We could save this ticker in a list to try `init_z_coin_status` again on it periodically until complete. + + SPDLOG_DEBUG("Exited zhtlc enable loop after 1000 tries"); + SPDLOG_DEBUG( + "Bad answer for zhtlc_error: [{}] -> idx: {}, tickers size: {}, answers size: {}", tickers[idx], idx, + tickers.size(), answers.size() + ); + this->dispatcher_.trigger(tickers[idx], z_error[0].dump(4)); + update_coin_status(this->m_current_wallet_name, tickers, false, m_coins_informations, m_coin_cfg_mutex); + to_remove.emplace(tickers[idx]); + } + else + { + this->dispatcher_.trigger(tickers[idx], "Complete!"); + } + } + catch (const std::exception& error) + { + SPDLOG_ERROR("exception caught in zhtlc batch_enable_coins: {}", error.what()); + } + } + } } + idx += 1; } for (auto&& t: to_remove) { tickers.erase(std::remove(tickers.begin(), tickers.end(), t), tickers.end()); } if (!tickers.empty()) { - if (tickers == g_default_coins) - { - SPDLOG_INFO("Trigger default_coins_enabled"); - this->dispatcher_.trigger(); - batch_balance_and_tx(false, tickers, true); - } dispatcher_.trigger(tickers); if (tickers.size() == 1) { fetch_single_balance(get_coin_info(tickers[0])); } - // batch_balance_and_tx(false, tickers, true); + this->m_nb_update_required += 1; } } } catch (const std::exception& error) { SPDLOG_ERROR("exception caught in batch_enable_coins: {}", error.what()); - // update_coin_status(this->m_current_wallet_name, tickers, false, m_coins_informations, m_coin_cfg_mutex); + update_coin_status(this->m_current_wallet_name, tickers, false, m_coins_informations, m_coin_cfg_mutex); //! Emit event here } }) .then( - [this, tickers, batch_array](pplx::task previous_task) + [this, tickers, batch](pplx::task previous_task) { - this->handle_exception_pplx_task(previous_task, "batch_enable_coins", batch_array); - // update_coin_status(this->m_current_wallet_name, tickers, false, m_coins_informations, m_coin_cfg_mutex); + this->handle_exception_pplx_task(previous_task, "batch_enable_coins", batch); + update_coin_status(this->m_current_wallet_name, tickers, false, m_coins_informations, m_coin_cfg_mutex); }); + dispatcher_.trigger(); + this->m_nb_update_required += 1; }; - SPDLOG_DEBUG("starting async enabling coin"); - - if (not btc_kmd_batch.empty() && first_time) + for (auto&& coin: coins) { - functor(btc_kmd_batch, g_default_coins); + auto&& [request, coins_to_enable] = request_functor(coin); + // SPDLOG_INFO("{} {}", request.dump(4), coins_to_enable[0]); + answer_functor(request, coins_to_enable); } + } - if (!batch_array.empty()) + bool mm2_service::is_zhtlc_coin_ready(const std::string coin) const + { + const auto coin_info = get_coin_info(coin); + if (coin_info.is_zhtlc_family) { - for (std::size_t idx = 0; idx < batch_array.size(); ++idx) + if (coin_info.activation_status.contains("result")) { - nlohmann::json single_batch = nlohmann::json::array(); - single_batch.push_back(batch_array.at(idx)); - functor(single_batch, {copy_tickers[idx]}); + if (coin_info.activation_status.at("result").contains("status")) + { + if (coin_info.activation_status.at("result").at("status") == "Ready") + { + if (coin_info.activation_status.at("result").contains("details")) + { + if (!coin_info.activation_status.at("result").at("details").contains("error")) + { + return true; + } + } + } + } } - // functor(batch_array, copy_tickers); + return false; } + return true; } - void - mm2_service::enable_multiple_coins(const std::vector& tickers) - { - batch_enable_coins(tickers); - update_coin_status(this->m_current_wallet_name, tickers, true, m_coins_informations, m_coin_cfg_mutex); - } - - coin_config - mm2_service::get_coin_info(const std::string& ticker) const + coin_config mm2_service::get_coin_info(const std::string& ticker) const { std::shared_lock lock(m_coin_cfg_mutex); if (m_coins_informations.find(ticker) == m_coins_informations.cend()) @@ -779,9 +1483,18 @@ namespace atomic_dex } return m_coins_informations.at(ticker); } + + bool mm2_service::is_coin_enabled(const std::string& ticker) const + { + return m_coins_informations[ticker].currently_enabled; + } + + bool mm2_service::has_coin(const std::string& ticker) const + { + return m_coins_informations.contains(ticker); + } - t_orderbook_answer - mm2_service::get_orderbook(t_mm2_ec& ec) const + t_orderbook_answer mm2_service::get_orderbook(t_mm2_ec& ec) const { auto&& [base, rel] = this->m_synchronized_ticker_pair.get(); const std::string pair = base + "/" + rel; @@ -799,8 +1512,7 @@ namespace atomic_dex return orderbook; } - nlohmann::json - mm2_service::prepare_batch_orderbook(bool is_a_reset) + nlohmann::json mm2_service::prepare_batch_orderbook(bool is_a_reset) { // SPDLOG_INFO("is_a_reset: {}", is_a_reset); auto&& [base, rel] = m_synchronized_ticker_pair.get(); @@ -808,18 +1520,18 @@ namespace atomic_dex return nlohmann::json::array(); nlohmann::json batch = nlohmann::json::array(); - auto generate_req = [&batch](std::string request_name, auto request) + auto generate_req = [&batch](std::string request_name, auto request, bool is_v2=false) { - nlohmann::json current_request = ::mm2::api::template_request(std::move(request_name)); - ::mm2::api::to_json(current_request, request); + nlohmann::json current_request = mm2::template_request(std::move(request_name), is_v2); + mm2::to_json(current_request, request); batch.push_back(current_request); }; - generate_req("orderbook", t_orderbook_request{.base = base, .rel = rel}); + generate_req("orderbook", t_orderbook_request{.base = base, .rel = rel}, true); if (is_a_reset) { - generate_req("max_taker_vol", ::mm2::api::max_taker_vol_request{.coin = base}); - generate_req("max_taker_vol", ::mm2::api::max_taker_vol_request{.coin = rel}); + generate_req("max_taker_vol", mm2::max_taker_vol_request{.coin = base}); + generate_req("max_taker_vol", mm2::max_taker_vol_request{.coin = rel}); generate_req("min_trading_vol", t_min_volume_request{.coin = base}); generate_req("min_trading_vol", t_min_volume_request{.coin = rel}); } @@ -827,55 +1539,60 @@ namespace atomic_dex return batch; } - void - mm2_service::process_orderbook(bool is_a_reset) + void mm2_service::process_orderbook(bool is_a_reset) { auto batch = prepare_batch_orderbook(is_a_reset); if (batch.empty()) return; - // SPDLOG_DEBUG("batch request: {}", batch.dump(4)); - // auto&& [base, rel] = m_synchronized_ticker_pair.get(); auto answer_functor = [this, is_a_reset](web::http::http_response resp) { auto&& [base, rel] = m_synchronized_ticker_pair.get(); - auto answer = ::mm2::api::basic_batch_answer(resp); + auto answer = mm2::basic_batch_answer(resp); if (answer.is_array()) { - auto orderbook_answer = ::mm2::api::rpc_process_answer_batch(answer[0], "orderbook"); + if (answer.size() < 1) + { + SPDLOG_ERROR("Answer array did not contain enough elements"); + return; + } + + auto orderbook_answer = mm2::rpc_process_answer_batch(answer[0], "orderbook"); if (is_a_reset) { - auto base_max_taker_vol_answer = ::mm2::api::rpc_process_answer_batch<::mm2::api::max_taker_vol_answer>(answer[1], "max_taker_vol"); + if (answer.size() < 5) + { + SPDLOG_ERROR("Answer array did not contain enough elements"); + return; + } + + auto base_max_taker_vol_answer = mm2::rpc_process_answer_batch(answer[1], "max_taker_vol"); if (base_max_taker_vol_answer.rpc_result_code == 200) { if (base == base_max_taker_vol_answer.result->coin) { this->m_synchronized_max_taker_vol->first = base_max_taker_vol_answer.result.value(); } - // t_float_50 base_res = t_float_50(this->m_synchronized_max_taker_vol->first.decimal) * m_balance_factor; - // this->m_synchronized_max_taker_vol->first.decimal = base_res.str(8); - // SPDLOG_INFO("max_taker_vol: {}", answer[1].dump(4)); } - auto rel_max_taker_vol_answer = ::mm2::api::rpc_process_answer_batch<::mm2::api::max_taker_vol_answer>(answer[2], "max_taker_vol"); + auto rel_max_taker_vol_answer = mm2::rpc_process_answer_batch(answer[2], "max_taker_vol"); if (rel_max_taker_vol_answer.rpc_result_code == 200) { if (rel == rel_max_taker_vol_answer.result->coin) { this->m_synchronized_max_taker_vol->second = rel_max_taker_vol_answer.result.value(); } - // t_float_50 rel_res = t_float_50(this->m_synchronized_max_taker_vol->second.decimal) * - // m_balance_factor; this->m_synchronized_max_taker_vol->second.decimal = rel_res.str(8); } - auto base_min_taker_vol_answer = ::mm2::api::rpc_process_answer_batch(answer[3], "min_trading_vol"); + auto base_min_taker_vol_answer = mm2::rpc_process_answer_batch(answer[3], "min_trading_vol"); if (base_min_taker_vol_answer.rpc_result_code == 200) { m_synchronized_min_taker_vol->first = base_min_taker_vol_answer.result.value(); + } - auto rel_min_taker_vol_answer = ::mm2::api::rpc_process_answer_batch(answer[4], "min_trading_vol"); + auto rel_min_taker_vol_answer = mm2::rpc_process_answer_batch(answer[4], "min_trading_vol"); if (rel_min_taker_vol_answer.rpc_result_code == 200) { m_synchronized_min_taker_vol->second = rel_min_taker_vol_answer.result.value(); @@ -895,8 +1612,7 @@ namespace atomic_dex .then([this, batch](pplx::task previous_task) { this->handle_exception_pplx_task(previous_task, "process_orderbook", batch); }); } - void - mm2_service::fetch_current_orderbook_thread(bool is_a_reset) + void mm2_service::fetch_current_orderbook_thread(bool is_a_reset) { //! m_orderbook_thread_active ? SPDLOG_WARN("Nothing to achieve, sleeping") : SPDLOG_INFO("Fetch current orderbook"); @@ -909,8 +1625,7 @@ namespace atomic_dex process_orderbook(is_a_reset); } - void - mm2_service::fetch_single_balance(const coin_config& cfg_infos) + void mm2_service::fetch_single_balance(const coin_config& cfg_infos) { nlohmann::json batch_array = nlohmann::json::array(); if (is_pin_cfg_enabled()) @@ -921,15 +1636,17 @@ namespace atomic_dex return; } } + t_balance_request balance_request{.coin = cfg_infos.ticker}; - nlohmann::json j = ::mm2::api::template_request("my_balance"); - ::mm2::api::to_json(j, balance_request); + nlohmann::json j = mm2::template_request("my_balance"); + mm2::to_json(j, balance_request); batch_array.push_back(j); + auto answer_functor = [this](web::http::http_response resp) { try { - auto answers = ::mm2::api::basic_batch_answer(resp); + auto answers = mm2::basic_batch_answer(resp); if (!answers.contains("error") && !answers[0].contains("error")) { this->process_balance_answer(answers[0]); @@ -940,6 +1657,7 @@ namespace atomic_dex SPDLOG_ERROR("exception in fetch_single_balance: {}", error.what()); } }; + auto error_functor = [this, batch = batch_array](pplx::task previous_task) { this->handle_exception_pplx_task(previous_task, "fetch_single_balance", batch); }; m_mm2_client.async_rpc_batch_standalone(batch_array).then(answer_functor).then(error_functor); @@ -948,7 +1666,6 @@ namespace atomic_dex void mm2_service::fetch_infos_thread(bool is_a_refresh, bool only_tx) { - SPDLOG_INFO("fetch_infos_thread"); if (only_tx) { batch_balance_and_tx(is_a_refresh, {}, false, only_tx); @@ -961,8 +1678,7 @@ namespace atomic_dex } } - void - mm2_service::spawn_mm2_instance(std::string wallet_name, std::string passphrase, bool with_pin_cfg) + void mm2_service::spawn_mm2_instance(std::string wallet_name, std::string passphrase, bool with_pin_cfg) { this->m_balance_factor = utils::determine_balance_factor(with_pin_cfg); SPDLOG_DEBUG("balance factor is: {}", m_balance_factor); @@ -971,8 +1687,8 @@ namespace atomic_dex this->dispatcher_.trigger(this->retrieve_coins_informations()); this->dispatcher_.trigger(); mm2_config cfg{.passphrase = std::move(passphrase), .rpc_password = atomic_dex::gen_random_password()}; - ::mm2::api::set_system_manager(m_system_manager); - ::mm2::api::set_rpc_password(cfg.rpc_password); + mm2::set_system_manager(m_system_manager); + mm2::set_rpc_password(cfg.rpc_password); json json_cfg; const auto tools_path = ag::core::assets_real_path() / "tools/mm2/"; @@ -990,7 +1706,7 @@ namespace atomic_dex env.insert("MM_LOG", std_path_to_qstring(utils::get_mm2_atomic_dex_current_log_file())); env.insert("MM_COINS_PATH", std_path_to_qstring((utils::get_current_configs_path() / "coins.json"))); QProcess mm2_instance; - mm2_instance.setProgram(std_path_to_qstring((tools_path / "mm2"))); + mm2_instance.setProgram(std_path_to_qstring((tools_path / atomic_dex::g_dex_api))); mm2_instance.setWorkingDirectory(std_path_to_qstring(tools_path)); mm2_instance.setProcessEnvironment(env); bool started = mm2_instance.startDetached(); @@ -1006,7 +1722,7 @@ namespace atomic_dex { // std::this_thread:: using namespace std::chrono_literals; - auto check_mm2_alive = []() { return ::mm2::api::rpc_version() != "error occured during rpc_version"; }; + auto check_mm2_alive = []() { return mm2::rpc_version() != "error occured during rpc_version"; }; static std::size_t nb_try = 0; while (not check_mm2_alive()) @@ -1086,7 +1802,7 @@ namespace atomic_dex mm2_service::batch_fetch_orders_and_swap(bool after_manual_reset) { nlohmann::json batch = nlohmann::json::array(); - nlohmann::json my_orders_request = ::mm2::api::template_request("my_orders"); + nlohmann::json my_orders_request = mm2::template_request("my_orders"); batch.push_back(my_orders_request); @@ -1106,7 +1822,7 @@ namespace atomic_dex } //! First time fetch or current page - nlohmann::json my_swaps = ::mm2::api::template_request("my_recent_swaps"); + nlohmann::json my_swaps = mm2::template_request("my_recent_swaps"); t_my_recent_swaps_request request{ .limit = limit, .page_number = current_page, @@ -1119,7 +1835,7 @@ namespace atomic_dex batch.push_back(my_swaps); //! Active swaps - nlohmann::json active_swaps = ::mm2::api::template_request("active_swaps"); + nlohmann::json active_swaps = mm2::template_request("active_swaps"); t_active_swaps_request active_swaps_request{.statuses = true}; to_json(active_swaps, active_swaps_request); batch.push_back(active_swaps); @@ -1130,12 +1846,12 @@ namespace atomic_dex //! Parsing Resp orders_and_swaps result; - auto answers = ::mm2::api::basic_batch_answer(resp); + auto answers = mm2::basic_batch_answer(resp); //! Extract - const auto orders_answers = ::mm2::api::rpc_process_answer_batch(answers[0], "my_orders"); - const auto swap_answer = ::mm2::api::rpc_process_answer_batch(answers[1], "my_recent_swaps"); - const auto active_swaps_answer = ::mm2::api::rpc_process_answer_batch(answers[2], "active_swaps"); + const auto orders_answers = mm2::rpc_process_answer_batch(answers[0], "my_orders"); + const auto swap_answer = mm2::rpc_process_answer_batch(answers[1], "my_recent_swaps"); + const auto active_swaps_answer = mm2::rpc_process_answer_batch(answers[2], "active_swaps"); result.orders_and_swaps.reserve(orders_answers.orders.size() + limit); result.nb_orders = orders_answers.orders.size(); @@ -1196,10 +1912,9 @@ namespace atomic_dex .then([this, batch](pplx::task previous_task) { this->handle_exception_pplx_task(previous_task, "batch_fetch_orders_and_swap", batch); }); } - void - mm2_service::process_tx_tokenscan(const std::string& ticker, [[maybe_unused]] bool is_a_refresh) + void mm2_service::process_tx_tokenscan(const std::string& ticker, [[maybe_unused]] bool is_a_refresh) { - SPDLOG_DEBUG("process_tx ticker: {}", ticker); + SPDLOG_DEBUG("Process transactions of ticker: {}", ticker); std::error_code ec; using namespace std::string_literals; auto construct_url_functor = [this]( @@ -1271,16 +1986,16 @@ namespace atomic_dex }; std::string url = retrieve_api_functor(ticker, address(ticker, ec)); SPDLOG_INFO("url scan: {}", url); - ::mm2::api::async_process_rpc_get(::mm2::api::g_etherscan_proxy_http_client, "tx_history", url) + mm2::async_process_rpc_get(mm2::g_etherscan_proxy_http_client, "tx_history", url) .then( - [this, ticker](web::http::http_response resp) + [this, ticker](const web::http::http_response& resp) { - auto answer = m_mm2_client.rpc_process_answer<::mm2::api::tx_history_answer>(resp, "tx_history"); + auto answer = m_mm2_client.rpc_process_answer(resp, "tx_history"); if (answer.rpc_result_code != 200) { SPDLOG_ERROR("{}", answer.raw_result); - this->dispatcher_.trigger(); + this->dispatcher_.trigger(true, ticker); } else if (answer.rpc_result_code not_eq -1 and answer.result.has_value()) { @@ -1319,6 +2034,8 @@ namespace atomic_dex .timestamp = current.timestamp, .tx_hash = current.tx_hash, .fees = current.fee_details.normal_fees.has_value() ? current.fee_details.normal_fees.value().amount + : current.fee_details.qrc_fees.has_value() + ? current.fee_details.qrc_fees.value().miner_fee : current.fee_details.erc_fees.value().total_fee, .my_balance_change = current.my_balance_change, .total_amount = current.total_amount, @@ -1336,13 +2053,12 @@ namespace atomic_dex m_tx_informations->insert_or_assign(ticker, std::make_pair(out, state)); //! Dispatch - this->dispatcher_.trigger(); + this->dispatcher_.trigger(false, ticker); } }) .then( [this](pplx::task previous_task) { - this->dispatcher_.trigger(); this->handle_exception_pplx_task(previous_task, "process_tx_tokenscan", {}); }); } @@ -1357,11 +2073,27 @@ namespace atomic_dex if (this->m_mm2_running) { - SPDLOG_INFO("process_orderbook(true)"); + SPDLOG_DEBUG("process_orderbook(true)"); process_orderbook(true); } } + void + mm2_service::on_zhtlc_enter_enabling([[maybe_unused]] const zhtlc_enter_enabling& evt) + { + SPDLOG_DEBUG("{} l{} f[{}]", __FUNCTION__, __LINE__, fs::path(__FILE__).filename().string()); + + m_zhtlc_enable_thread_active = true; + } + + void + mm2_service::on_zhtlc_leave_enabling([[maybe_unused]] const zhtlc_leave_enabling& evt) + { + SPDLOG_DEBUG("{} l{} f[{}]", __FUNCTION__, __LINE__, fs::path(__FILE__).filename().string()); + + m_zhtlc_enable_thread_active = false; + } + void mm2_service::on_gui_enter_trading([[maybe_unused]] const gui_enter_trading& evt) { @@ -1393,7 +2125,8 @@ namespace atomic_dex if (it == m_balance_informations.cend()) { ec = dextop_error::unknown_ticker; - return "Invalid"; + SPDLOG_INFO("Invalid Ticker {}", ticker); + return "Invalid Ticker"; } return it->second.address; @@ -1405,6 +2138,12 @@ namespace atomic_dex return this->m_orderbook_thread_active.load(); } + bool + mm2_service::is_zhtlc_enable_thread_active() const + { + return this->m_zhtlc_enable_thread_active.load(); + } + nlohmann::json mm2_service::get_raw_mm2_ticker_cfg(const std::string& ticker) const { @@ -1472,10 +2211,10 @@ namespace atomic_dex } void - mm2_service::process_tx_answer(const nlohmann::json& answer_json) + mm2_service::process_tx_answer(const nlohmann::json& answer_json, std::string ticker) { - ::mm2::api::tx_history_answer answer; - ::mm2::api::from_json(answer_json, answer); + mm2::tx_history_answer answer; + mm2::from_json(answer_json, answer); t_tx_state state; state.state = answer.result.value().sync_status.state; state.current_block = answer.result.value().current_block; @@ -1493,7 +2232,6 @@ namespace atomic_dex state.transactions_left = answer.result.value().sync_status.additional_info.value().regular_infos.value().transactions_left; } } - t_transactions out; out.reserve(answer.result.value().transactions.size()); @@ -1525,7 +2263,10 @@ namespace atomic_dex { current_info.fees = current.fee_details.qrc_fees->miner_fee; } - + else if (current.transaction_fee.has_value()) + { + current_info.fees = current.transaction_fee.value(); + } if (current_info.timestamp == 0) { using namespace std::chrono; @@ -1540,18 +2281,18 @@ namespace atomic_dex out.push_back(std::move(current_info)); } - //! History m_tx_informations->insert_or_assign("result", std::make_pair(out, state)); - this->dispatcher_.trigger(); + this->dispatcher_.trigger(false, std::move(ticker)); } + void mm2_service::process_balance_answer(const nlohmann::json& answer) { t_balance_answer answer_r; - ::mm2::api::from_json(answer, answer_r); - // SPDLOG_INFO("Successfully fetched ticker: {} balance: {} address: {}", answer_r.coin, answer_r.balance, answer_r.address); + + mm2::from_json(answer, answer_r); if (is_pin_cfg_enabled()) { std::shared_lock lock(m_balance_mutex); @@ -1561,19 +2302,16 @@ namespace atomic_dex return; } } - t_float_50 result = t_float_50(answer_r.balance) * m_balance_factor; answer_r.balance = result.str(8, std::ios_base::fixed); - // auto copy_coin = answer_r.coin; + { std::unique_lock lock(m_balance_mutex); m_balance_informations[answer_r.coin] = std::move(answer_r); } - // m_system_manager.get_system().get_portfolio()->update_balance_values({copy_coin}); } - mm2_client& - mm2_service::get_mm2_client() + mm2::mm2_client& mm2_service::get_mm2_client() { return m_mm2_client; } @@ -1789,11 +2527,7 @@ namespace atomic_dex } for (auto&& cur: request) cur["userpass"] = ""; SPDLOG_ERROR("pplx task error: {} from: {}, request: {}", e.what(), from, request.dump(4)); - // this->dispatcher_.trigger(from, e.what()); - //#if defined(linux) || defined(__APPLE__) - // SPDLOG_ERROR("stacktrace: {}", boost::stacktrace::to_string(boost::stacktrace::stacktrace())); - //#endif if (std::string(e.what()).find("Failed to read HTTP status line") != std::string::npos || std::string(e.what()).find("WinHttpReceiveResponse: 12002: The operation timed out") != std::string::npos) { @@ -1807,8 +2541,7 @@ namespace atomic_dex } } - void - mm2_service::change_segwit_status(std::string ticker, bool status) + void mm2_service::change_segwit_status(std::string ticker, bool status) { update_coin_status(this->m_current_wallet_name, {ticker}, status, m_coins_informations, m_coin_cfg_mutex, "is_segwit_on"); } diff --git a/src/core/atomicdex/services/mm2/mm2.service.hpp b/src/core/atomicdex/services/mm2/mm2.service.hpp index 654a4b7fbd..e991955d45 100644 --- a/src/core/atomicdex/services/mm2/mm2.service.hpp +++ b/src/core/atomicdex/services/mm2/mm2.service.hpp @@ -1,36 +1,32 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * - * * - * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * - * the top-level directory of this distribution for the individual copyright * - * holder information and the developer policies on copyright and licensing. * - * * - * Unless otherwise agreed in a custom licensing agreement, no part of the * - * Komodo Platform software, including this file may be copied, modified, * - * propagated or distributed except according to the terms contained in the * - * LICENSE file * - * * - * Removal or modification of this copyright notice is prohibited. * - * * - ******************************************************************************/ +* Copyright © 2013-2022 The Komodo Platform Developers. * +* * +* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * +* the top-level directory of this distribution for the individual copyright * +* holder information and the developer policies on copyright and licensing. * +* * +* Unless otherwise agreed in a custom licensing agreement, no part of the * +* Komodo Platform software, including this file may be copied, modified, * +* propagated or distributed except according to the terms contained in the * +* LICENSE file * +* * +* Removal or modification of this copyright notice is prohibited. * +* * +******************************************************************************/ #pragma once -//! Qt -#include - #include #include #include +#include -//! Deps +#include #include #include #include #include -//#include -//! Project Headers #include "atomicdex/api/mm2/mm2.client.hpp" #include "atomicdex/api/mm2/mm2.constants.hpp" #include "atomicdex/api/mm2/mm2.error.code.hpp" @@ -39,7 +35,8 @@ #include "atomicdex/api/mm2/rpc.max.taker.vol.hpp" #include "atomicdex/api/mm2/rpc.min.volume.hpp" #include "atomicdex/api/mm2/rpc.orderbook.hpp" -#include "atomicdex/config/coins.cfg.hpp" +#include "atomicdex/api/mm2/enable_bch_with_tokens_rpc.hpp" +#include "atomicdex/api/mm2/enable_slp_rpc.hpp" #include "atomicdex/config/raw.mm2.coins.cfg.hpp" #include "atomicdex/constants/dex.constants.hpp" #include "atomicdex/data/dex/orders.and.swaps.data.hpp" @@ -49,220 +46,236 @@ namespace atomic_dex { - namespace bm = boost::multiprecision; - namespace ag = antara::gaming; - - template - using t_shared_synchronized_value = boost::synchronized_value; - - using t_ticker = std::string; - using t_coins_registry = std::unordered_map; - using t_coins = std::vector; - - //! Constants - inline constexpr const std::size_t g_tx_max_limit{50}; - - class ENTT_API mm2_service final : public ag::ecs::pre_update_system - { - public: - using t_pair_max_vol = std::pair; - using t_pair_min_vol = std::pair; - - private: - //! Private typedefs - using t_mm2_time_point = std::chrono::high_resolution_clock::time_point; - using t_balance_registry = std::unordered_map; - using t_tx_registry = t_shared_synchronized_value>>; - using t_orderbook = boost::synchronized_value; - using t_orders_and_swaps = boost::synchronized_value; - using t_synchronized_ticker_pair = boost::synchronized_value>; - using t_synchronized_max_taker_vol = boost::synchronized_value; - using t_synchronized_min_taker_vol = boost::synchronized_value; - using t_synchronized_ticker = boost::synchronized_value; - - ag::ecs::system_manager& m_system_manager; - - //! Client - // std::shared_ptr m_mm2_client{nullptr}; - // pplx::cancellation_token_source m_token_source; - mm2_client m_mm2_client; - - //! Process - //reproc::process m_mm2_instance; - - //! Current ticker - t_synchronized_ticker m_current_ticker{g_primary_dex_coin}; - - //! Current orderbook - t_synchronized_ticker_pair m_synchronized_ticker_pair{std::make_pair(g_primary_dex_coin, g_second_primary_dex_coin)}; - t_synchronized_max_taker_vol m_synchronized_max_taker_vol; - t_synchronized_min_taker_vol m_synchronized_min_taker_vol; - - //! Timers - t_mm2_time_point m_orderbook_clock; - t_mm2_time_point m_info_clock; - - //! Atomicity / Threads - std::atomic_bool m_mm2_running{false}; - std::atomic_bool m_orderbook_thread_active{false}; - std::thread m_mm2_init_thread; - - //! Current wallet name - std::string m_current_wallet_name; - - //! Mutex - mutable std::shared_mutex m_balance_mutex; - mutable std::shared_mutex m_coin_cfg_mutex; - mutable std::shared_mutex m_raw_coin_cfg_mutex; - - //! Concurrent Registry. - t_coins_registry& m_coins_informations{entity_registry_.set()}; - t_balance_registry m_balance_informations; - t_tx_registry m_tx_informations; - t_orderbook m_orderbook{t_orderbook_answer{}}; - t_orders_and_swaps m_orders_and_swaps{orders_and_swaps{}}; - t_mm2_raw_coins_registry m_mm2_raw_coins_cfg{parse_raw_mm2_coins_file()}; - - //! Balance factor - double m_balance_factor{1.0}; - - //! Refresh the orderbook registry (internal) - nlohmann::json prepare_batch_orderbook(bool is_a_reset); - - //! Batch balance / tx - std::tuple, std::vector> prepare_batch_balance_and_tx(bool only_tx = false) const; - auto batch_balance_and_tx(bool is_a_reset, std::vector tickers = {}, bool is_during_enabling = false, bool only_tx = false); - void process_balance_answer(const nlohmann::json& answer); - void process_tx_answer(const nlohmann::json& answer_json); - void process_tx_tokenscan(const std::string& ticker, bool is_a_refresh); - void fetch_single_balance(const coin_config& cfg_infos); - - //! - std::pair process_batch_enable_answer(const nlohmann::json& answer); - [[nodiscard]] std::pair get_tx(t_mm2_ec& ec) const; - std::vector get_electrum_server_from_token(const std::string& ticker); - std::vector retrieve_coins_informations(); - - void handle_exception_pplx_task(pplx::task previous_task, const std::string& from, nlohmann::json batch); - - public: - //! Constructor - explicit mm2_service(entt::registry& registry, ag::ecs::system_manager& system_manager); - - //! Delete useless operator - mm2_service(const mm2_service& other) = delete; - mm2_service(const mm2_service&& other) = delete; - mm2_service& operator=(const mm2_service& other) = delete; - mm2_service& operator=(const mm2_service&& other) = delete; - - //! Destructor - ~mm2_service() final; - - //! Events - void on_refresh_orderbook(const orderbook_refresh& evt); - - void on_gui_enter_trading(const gui_enter_trading& evt); - - void on_gui_leave_trading(const gui_leave_trading& evt); - - //! Spawn mm2 instance with given seed - void spawn_mm2_instance(std::string wallet_name, std::string passphrase, bool with_pin_cfg = false); - - //! Refresh the current info (internally call process_balance and process_tx) - void fetch_infos_thread(bool is_a_fresh = true, bool only_tx = false); - - //! Enable coins - bool enable_default_coins(); - - //! Batch Enable coins - void batch_enable_coins(const std::vector& tickers, bool first_time = false); - - //! Enable multiple coins - void enable_multiple_coins(const std::vector& tickers); - - //! Add a new coin in the coin_info cfg add_new_coin(normal_cfg, mm2_cfg) - void add_new_coin(const nlohmann::json& coin_cfg_json, const nlohmann::json& raw_coin_cfg_json); - void remove_custom_coin(const std::string& ticker); - [[nodiscard]] bool is_this_ticker_present_in_raw_cfg(const std::string& ticker) const; - [[nodiscard]] bool is_this_ticker_present_in_normal_cfg(const std::string& ticker) const; - - //! Disable a single coin - bool disable_coin(const std::string& ticker, std::error_code& ec); - - //! Disable multiple coins, prefer this function if you want persistent disabling - void disable_multiple_coins(const std::vector& tickers); - - //! Called every ticks, and execute tasks if the timer expire. - void update() final; - - //! Retrieve public address of the given ticker - std::string address(const std::string& ticker, t_mm2_ec& ec) const; + namespace bm = boost::multiprecision; + namespace ag = antara::gaming; + + template + using t_shared_synchronized_value = boost::synchronized_value; + + using t_ticker = std::string; + using t_coins_registry = std::unordered_map; + using t_coins = std::vector; + + class ENTT_API mm2_service final : public ag::ecs::pre_update_system + { + public: + using t_pair_max_vol = std::pair; + using t_pair_min_vol = std::pair; + + private: + using t_mm2_time_point = std::chrono::high_resolution_clock::time_point; + using t_balance_registry = std::unordered_map; + using t_tx_registry = t_shared_synchronized_value>>; + using t_orderbook = boost::synchronized_value; + using t_orders_and_swaps = boost::synchronized_value; + using t_synchronized_ticker_pair = boost::synchronized_value>; + using t_synchronized_max_taker_vol = boost::synchronized_value; + using t_synchronized_min_taker_vol = boost::synchronized_value; + using t_synchronized_ticker = boost::synchronized_value; + + ag::ecs::system_manager& m_system_manager; + + mm2::mm2_client m_mm2_client; + + //! Current ticker + t_synchronized_ticker m_current_ticker{g_primary_dex_coin}; + + //! Current orderbook + t_synchronized_ticker_pair m_synchronized_ticker_pair{std::make_pair(g_primary_dex_coin, g_second_primary_dex_coin)}; + t_synchronized_max_taker_vol m_synchronized_max_taker_vol; + t_synchronized_min_taker_vol m_synchronized_min_taker_vol; + + //! Timers + t_mm2_time_point m_orderbook_clock; + t_mm2_time_point m_info_clock; + + //! Atomicity / Threads + std::atomic_bool m_mm2_running{false}; + std::atomic_bool m_orderbook_thread_active{false}; + std::atomic_bool m_zhtlc_enable_thread_active{false}; + std::atomic_size_t m_nb_update_required{0}; + std::thread m_mm2_init_thread; + + //! Current wallet name + std::string m_current_wallet_name; + + //! Mutex + mutable std::shared_mutex m_balance_mutex; + mutable std::shared_mutex m_coin_cfg_mutex; + mutable std::shared_mutex m_raw_coin_cfg_mutex; + + //! Concurrent Registry. + t_coins_registry& m_coins_informations{entity_registry_.set()}; + t_balance_registry m_balance_informations; + t_tx_registry m_tx_informations; + t_orderbook m_orderbook{t_orderbook_answer{}}; + t_orders_and_swaps m_orders_and_swaps{orders_and_swaps{}}; + t_mm2_raw_coins_registry m_mm2_raw_coins_cfg{parse_raw_mm2_coins_file()}; + + //! Balance factor + double m_balance_factor{1.0}; + + //! Refresh the orderbook registry (internal) + nlohmann::json prepare_batch_orderbook(bool is_a_reset); + + //! Batch balance / tx + std::tuple, std::vector> prepare_batch_balance_and_tx(bool only_tx = false) const; + auto batch_balance_and_tx(bool is_a_reset, std::vector tickers = {}, bool is_during_enabling = false, bool only_tx = false); + void process_balance_answer(const nlohmann::json& answer); + void process_tx_answer(const nlohmann::json& answer_json, std::string ticker); + void process_tx_tokenscan(const std::string& ticker, bool is_a_refresh); + void fetch_single_balance(const coin_config& cfg_infos); + + //! + std::pair process_batch_enable_answer(const nlohmann::json& answer); + [[nodiscard]] std::pair get_tx(t_mm2_ec& ec) const; + std::vector get_electrum_server_from_token(const std::string& ticker); + std::vector retrieve_coins_informations(); + + void handle_exception_pplx_task(pplx::task previous_task, const std::string& from, nlohmann::json batch); + + public: + //! Constructor + explicit mm2_service(entt::registry& registry, ag::ecs::system_manager& system_manager); + + //! Delete useless operator + mm2_service(const mm2_service& other) = delete; + mm2_service(const mm2_service&& other) = delete; + mm2_service& operator=(const mm2_service& other) = delete; + mm2_service& operator=(const mm2_service&& other) = delete; + + //! Destructor + ~mm2_service() final; + + //! Events + void on_refresh_orderbook(const orderbook_refresh& evt); + + void on_gui_enter_trading(const gui_enter_trading& evt); + + void on_gui_leave_trading(const gui_leave_trading& evt); + + void on_zhtlc_enter_enabling(const zhtlc_enter_enabling& evt); + + void on_zhtlc_leave_enabling(const zhtlc_leave_enabling& evt); + + //! Spawn mm2 instance with given seed + void spawn_mm2_instance(std::string wallet_name, std::string passphrase, bool with_pin_cfg = false); + + //! Refresh the current info (internally call process_balance and process_tx) + void fetch_infos_thread(bool is_a_fresh = true, bool only_tx = false); + + // Coins enabling functions + bool enable_default_coins(); // Enables required coins + coins enabled in the config + void enable_coins(const std::vector& tickers); + void enable_coins(const t_coins& coins); + void enable_coin(const std::string& ticker); + void enable_coin(const coin_config& coin_config); + private: + void update_coin_active(const std::vector& tickers, bool status); + void enable_erc_family_coin(const coin_config& coin_config); + void enable_erc_family_coins(const t_coins& coins); + void enable_utxo_qrc20_coin(coin_config coin_config); + void enable_utxo_qrc20_coins(const t_coins& coins); + void enable_slp_coin(coin_config coin_config); + void enable_slp_coins(const t_coins& coins); + void enable_slp_testnet_coin(coin_config coin_config); + void enable_slp_testnet_coins(const t_coins& coins); + void enable_zhtlc(const t_coins& coins); + + // Balances processing functions + void process_balance_answer(const mm2::enable_bch_with_tokens_rpc& rpc); // Called after enabling SLP coins along tBCH/BCH. + void process_balance_answer(const mm2::enable_slp_rpc& rpc); // Called after enabling an SLP coin. + + public: + //! Add a new coin in the coin_info cfg add_new_coin(normal_cfg, mm2_cfg) + void add_new_coin(const nlohmann::json& coin_cfg_json, const nlohmann::json& raw_coin_cfg_json); + void remove_custom_coin(const std::string& ticker); + [[nodiscard]] bool is_this_ticker_present_in_raw_cfg(const std::string& ticker) const; + [[nodiscard]] bool is_this_ticker_present_in_normal_cfg(const std::string& ticker) const; + [[nodiscard]] bool is_zhtlc_coin_ready(const std::string coin) const; - //! Is MM2 Process correctly running ? - [[nodiscard]] const std::atomic_bool& is_mm2_running() const; + //! Disable a single coin + bool disable_coin(const std::string& ticker, std::error_code& ec); + + //! Disable multiple coins, prefer this function if you want persistent disabling + void disable_multiple_coins(const std::vector& tickers); + + //! Called every ticks, and execute tasks if the timer expire. + void update() final; - //! Retrieve my balance for a given ticker as a string. - [[nodiscard]] std::string my_balance(const std::string& ticker, t_mm2_ec& ec) const; + //! Retrieve public address of the given ticker + std::string address(const std::string& ticker, t_mm2_ec& ec) const; - //! Refresh the current orderbook (internally call process_orderbook) - void fetch_current_orderbook_thread(bool is_a_reset = false); + //! Is MM2 Process correctly running ? + [[nodiscard]] const std::atomic_bool& is_mm2_running() const; - void process_orderbook(bool is_a_reset = false); + //! Retrieve my balance for a given ticker as a string. + [[nodiscard]] std::string my_balance(const std::string& ticker, t_mm2_ec& ec) const; - //! Last 50 transactions maximum - [[nodiscard]] t_transactions get_tx_history(t_mm2_ec& ec) const; + //! Refresh the current orderbook (internally call process_orderbook) + void fetch_current_orderbook_thread(bool is_a_reset = false); - //! Last 50 transactions maximum - [[nodiscard]] t_tx_state get_tx_state(t_mm2_ec& ec) const; + void process_orderbook(bool is_a_reset = false); - //! Get coins that are currently enabled - [[nodiscard]] t_coins get_enabled_coins() const; + //! Last 50 transactions maximum + [[nodiscard]] t_transactions get_tx_history(t_mm2_ec& ec) const; - //! Get coins that are active, but may be not enabled - [[nodiscard]] t_coins get_active_coins() const; + //! Last 50 transactions maximum + [[nodiscard]] t_tx_state get_tx_state(t_mm2_ec& ec) const; - //! Get Specific info about one coin - [[nodiscard]] coin_config get_coin_info(const std::string& ticker) const; + //! Get coins that are currently enabled + [[nodiscard]] t_coins get_enabled_coins() const; - //! Get Current orderbook - [[nodiscard]] t_orderbook_answer get_orderbook(t_mm2_ec& ec) const; + //! Get coins that are active, but may be not enabled + [[nodiscard]] t_coins get_active_coins() const; - //! Get Swaps - [[nodiscard]] orders_and_swaps get_orders_and_swaps() const; + //! Get Specific info about one coin + [[nodiscard]] coin_config get_coin_info(const std::string& ticker) const; + + // Tells if the given coin is enabled. + [[nodiscard]] bool is_coin_enabled(const std::string& ticker) const; + + // Tells if the given is coin is present inside the config. + [[nodiscard]] bool has_coin(const std::string& ticker) const; - //! Get balance with locked funds for a given ticker as a boost::multiprecision::cpp_dec_float_50. - [[nodiscard]] t_float_50 get_balance(const std::string& ticker) const; + //! Get Current orderbook + [[nodiscard]] t_orderbook_answer get_orderbook(t_mm2_ec& ec) const; - //! Return true if we the balance of the `ticker` > amount, false otherwise. - [[nodiscard]] bool do_i_have_enough_funds(const std::string& ticker, const t_float_50& amount) const; + //! Get Swaps + [[nodiscard]] orders_and_swaps get_orders_and_swaps() const; - [[nodiscard]] bool is_orderbook_thread_active() const; + //! Get balance with locked funds for a given ticker as a boost::multiprecision::cpp_dec_float_50. + [[nodiscard]] t_float_50 get_balance(const std::string& ticker) const; - [[nodiscard]] nlohmann::json get_raw_mm2_ticker_cfg(const std::string& ticker) const; + //! Return true if we the balance of the `ticker` > amount, false otherwise. + [[nodiscard]] bool do_i_have_enough_funds(const std::string& ticker, const t_float_50& amount) const; - [[nodiscard]] t_pair_max_vol get_taker_vol() const; - [[nodiscard]] t_pair_min_vol get_min_vol() const; + [[nodiscard]] bool is_orderbook_thread_active() const; + [[nodiscard]] bool is_zhtlc_enable_thread_active() const; - //! Pin cfg api - [[nodiscard]] bool is_pin_cfg_enabled() const; - void reset_fake_balance_to_zero(const std::string& ticker); - void decrease_fake_balance(const std::string& ticker, const std::string& amount); - void batch_fetch_orders_and_swap(bool after_manual_reset = false); - void add_orders_answer(t_my_orders_answer answer); + [[nodiscard]] nlohmann::json get_raw_mm2_ticker_cfg(const std::string& ticker) const; - //! Async API - mm2_client& get_mm2_client(); - //[[nodiscard]] pplx::cancellation_token get_cancellation_token() const; + [[nodiscard]] t_pair_max_vol get_taker_vol() const; + [[nodiscard]] t_pair_min_vol get_min_vol() const; - //! Wallet api - [[nodiscard]] std::string get_current_ticker() const; - bool set_current_ticker(const std::string& ticker); + //! Pin cfg api + [[nodiscard]] bool is_pin_cfg_enabled() const; + void reset_fake_balance_to_zero(const std::string& ticker); + void decrease_fake_balance(const std::string& ticker, const std::string& amount); + void batch_fetch_orders_and_swap(bool after_manual_reset = false); + + //! Async API + mm2::mm2_client& get_mm2_client(); + + //! Wallet api + [[nodiscard]] std::string get_current_ticker() const; + bool set_current_ticker(const std::string& ticker); - //! Pagination - void set_orders_and_swaps_pagination_infos(std::size_t current_page = 1, std::size_t limit = 50, t_filtering_infos infos = {}); + //! Pagination + void set_orders_and_swaps_pagination_infos(std::size_t current_page = 1, std::size_t limit = 50, t_filtering_infos infos = {}); - void change_segwit_status(std::string ticker, bool status); - }; + void change_segwit_status(std::string ticker, bool status); + }; } // namespace atomic_dex REFL_AUTO(type(atomic_dex::mm2_service)) diff --git a/src/core/atomicdex/services/mm2/mm2_events.hpp b/src/core/atomicdex/services/mm2/mm2_events.hpp new file mode 100644 index 0000000000..2329a147f9 --- /dev/null +++ b/src/core/atomicdex/services/mm2/mm2_events.hpp @@ -0,0 +1,19 @@ +// atomicdex-desktop +// Author(s): syl + +#pragma once + +#include + +#include "atomicdex/api/mm2/transaction.data.hpp" + +namespace atomic_dex::mm2 +{ + struct transactions_fetched_event + { + std::string ticker; + std::vector transactions; + bool has_error; + std::string error_msg; + }; +} \ No newline at end of file diff --git a/src/core/atomicdex/services/price/global.provider.cpp b/src/core/atomicdex/services/price/global.provider.cpp index 4f3d8110db..966b67dd48 100644 --- a/src/core/atomicdex/services/price/global.provider.cpp +++ b/src/core/atomicdex/services/price/global.provider.cpp @@ -210,16 +210,22 @@ namespace atomic_dex { t_float_50 rate(1); { - std::shared_lock lock(m_coin_rate_mutex); - rate = t_float_50(m_coin_rate_providers.at(fiat)); ///< Retrieve BTC or KMD rate let's say for USD + if (m_coin_rate_providers.contains(fiat)) + { + std::shared_lock lock(m_coin_rate_mutex); + rate = t_float_50(m_coin_rate_providers.at(fiat)); ///< Retrieve BTC or KMD rate let's say for USD + } } t_float_50 tmp_current_price = t_float_50(current_price) * rate; current_price = tmp_current_price.str(); } else if (fiat != "USD") { - t_float_50 tmp_current_price = t_float_50(current_price) * m_other_fiats_rates->at("rates").at(fiat).get(); - current_price = tmp_current_price.str(); + if (m_other_fiats_rates->contains("rates")) + { + t_float_50 tmp_current_price = t_float_50(current_price) * m_other_fiats_rates->at("rates").at(fiat).get(); + current_price = tmp_current_price.str(); + } } } else @@ -227,8 +233,11 @@ namespace atomic_dex //! We use oracle if (is_this_currency_a_fiat(m_cfg, fiat) && fiat != "USD") { - t_float_50 tmp_current_price = t_float_50(current_price) * m_other_fiats_rates->at("rates").at(fiat).get(); - current_price = tmp_current_price.str(); + if (m_other_fiats_rates->contains("rates")) + { + t_float_50 tmp_current_price = t_float_50(current_price) * m_other_fiats_rates->at("rates").at(fiat).get(); + current_price = tmp_current_price.str(); + } } else if (!is_this_currency_a_fiat(m_cfg, fiat) && is_oracle_ready) @@ -264,6 +273,7 @@ namespace atomic_dex SPDLOG_ERROR("Exception caught in get_rate_conversion: {} - fiat: {} - ticker: {}", error.what(), fiat, ticker); return "0.00"; } + return "0.00"; } std::string diff --git a/src/core/atomicdex/services/price/orderbook.scanner.service.cpp b/src/core/atomicdex/services/price/orderbook.scanner.service.cpp index ee724bd698..ca6fbce557 100644 --- a/src/core/atomicdex/services/price/orderbook.scanner.service.cpp +++ b/src/core/atomicdex/services/price/orderbook.scanner.service.cpp @@ -40,16 +40,17 @@ namespace atomic_dex { if (m_rpc_busy) { - //SPDLOG_INFO("process_best_orders is busy - skipping"); + // SPDLOG_INFO("process_best_orders is busy - skipping"); return; } - //SPDLOG_INFO("process_best_orders processing"); + + // SPDLOG_INFO("process_best_orders processing"); if (m_system_manager.has_system()) { auto& mm2_system = m_system_manager.get_system(); if (mm2_system.is_mm2_running() && mm2_system.is_orderbook_thread_active()) { - //SPDLOG_INFO("process_best_orders"); + // SPDLOG_INFO("process_best_orders"); using namespace std::string_literals; const auto& trading_pg = m_system_manager.get_system(); auto volume = trading_pg.get_volume().toStdString(); @@ -59,12 +60,12 @@ namespace atomic_dex //! Prepare request nlohmann::json batch = nlohmann::json::array(); - nlohmann::json best_orders_req_json = ::mm2::api::template_request("best_orders"); + nlohmann::json best_orders_req_json = mm2::template_request("best_orders", true); to_json(best_orders_req_json, req); batch.push_back(best_orders_req_json); - best_orders_req_json["userpass"] = "*****"; - //SPDLOG_INFO("best_orders request: {}", best_orders_req_json.dump(4)); + // best_orders_req_json["userpass"] = "*****"; + // SPDLOG_INFO("best_orders request: {}", best_orders_req_json.dump(4)); this->m_rpc_busy = true; emit trading_pg.get_orderbook_wrapper()->bestOrdersBusyChanged(); @@ -74,7 +75,7 @@ namespace atomic_dex if (resp.status_code() == 200) { auto answers = nlohmann::json::parse(body); - auto best_order_answer = ::mm2::api::rpc_process_answer_batch(answers[0], "best_orders"); + auto best_order_answer = mm2::rpc_process_answer_batch(answers[0], "best_orders"); if (best_order_answer.result.has_value()) { this->m_best_orders_infos = best_order_answer.result.value(); diff --git a/src/core/atomicdex/services/update/zcash.params.service.cpp b/src/core/atomicdex/services/update/zcash.params.service.cpp new file mode 100644 index 0000000000..c82681614b --- /dev/null +++ b/src/core/atomicdex/services/update/zcash.params.service.cpp @@ -0,0 +1,151 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + + +#include +#include + +#include +#include +#include + +#include "atomicdex/pch.hpp" +#include "atomicdex/services/update/zcash.params.service.hpp" +#include "atomicdex/utilities/global.utilities.hpp" +#include "atomicdex/utilities/qt.download.manager.hpp" + +namespace atomic_dex +{ + zcash_params_service::zcash_params_service( + entt::registry& registry, ag::ecs::system_manager& system_manager, + entt::dispatcher& dispatcher, QObject* parent) : + QObject(parent), system(registry), + m_system_manager(system_manager), m_dispatcher(dispatcher) + { + m_update_clock = std::chrono::high_resolution_clock::now(); + m_update_info = nlohmann::json::object(); + } + + void zcash_params_service::update() + { + using namespace std::chrono_literals; + + const auto now = std::chrono::high_resolution_clock::now(); + const auto s = std::chrono::duration_cast(now - m_update_clock); + if (s >= 1s) + { + // TODO: We could use this for an ETA + } + } + + fs::path zcash_params_service::get_zcash_params_folder() + { + fs::path zcash_params_path; +#if defined(_WIN32) || defined(WIN32) + std::wstring out = _wgetenv(L"APPDATA"); + zcash_params_path = fs::path(out) / "ZcashParams"; +#elif defined(__APPLE__) + zcash_params_path = fs::path(std::getenv("HOME")) / "Library" / "Application Support" / "ZcashParams"; +#else + zcash_params_path = fs::path(std::getenv("HOME")) / (std::string(".zcash-params")); +#endif + return zcash_params_path; + } + + void zcash_params_service::download_zcash_params() + { + m_is_downloading = true; + using namespace std::chrono_literals; + const fs::path folder = this->get_zcash_params_folder(); + + if (not fs::exists(folder)) + { + fs::create_directories(folder); + } + + std::string zcash_params[2] = { + "https://z.cash/downloads/sapling-spend.params", + "https://z.cash/downloads/sapling-output.params" + }; + + for(const std::string &url: zcash_params) + { + std::string filename = atomic_dex::utils::u8string(fs::path(url).filename()); + if (filename.find("deprecated-sworn-elves") > -1) + { + filename = "sprout-proving.key"; + } + SPDLOG_INFO("Downloading {}...", filename); + qt_downloader* downloader = new qt_downloader(m_dispatcher); + downloader->do_download(QUrl(QString::fromStdString(url)), filename, folder); + connect(downloader, &qt_downloader::downloadStatusChanged, this, &zcash_params_service::set_combined_download_status); + } + } + + bool + zcash_params_service::is_downloading() + { + return m_is_downloading; + } + + void + zcash_params_service::enable_after_download(const QString& coin) + { + m_enable_after_download.append(coin); + } + + void + zcash_params_service::clear_enable_after_download() + { + m_enable_after_download.clear(); + } + + QStringList + zcash_params_service::get_enable_after_download() + { + return m_enable_after_download; + } + + QString + zcash_params_service::get_combined_download_progress() + { + foreach(const QString& key, m_combined_download_status.keys()) { + double val = m_combined_download_status.value(key).toDouble(); + if (val < 1) + { + break; + } + m_is_downloading = false; + } + return QString(QJsonDocument(m_combined_download_status).toJson()); + } + + QJsonObject + zcash_params_service::get_combined_download_status() const + { + return m_combined_download_status; + } + + void + zcash_params_service::set_combined_download_status(QJsonObject& status) + { + QString filename = status.value("filename").toString(); + m_combined_download_status.insert(filename, status.value("progress")); + // SPDLOG_INFO("Filename: {} {}%", filename.toUtf8().constData(), std::to_string(status.value("progress").toDouble())); + emit combinedDownloadStatusChanged(); + } + +} // namespace atomic_dex diff --git a/src/core/atomicdex/services/update/zcash.params.service.hpp b/src/core/atomicdex/services/update/zcash.params.service.hpp new file mode 100644 index 0000000000..da6a1d095d --- /dev/null +++ b/src/core/atomicdex/services/update/zcash.params.service.hpp @@ -0,0 +1,76 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#pragma once + +#include +#include + +#include +#include +#include +#include + +#include "atomicdex/pch.hpp" + + +namespace atomic_dex +{ + class zcash_params_service final : public QObject, public ag::ecs::pre_update_system + { + Q_OBJECT + + Q_PROPERTY(QJsonObject m_combined_download_status READ get_combined_download_status NOTIFY combinedDownloadStatusChanged) + + using t_update_time_point = std::chrono::high_resolution_clock::time_point; + using t_json_synchronized = boost::synchronized_value; + + ag::ecs::system_manager& m_system_manager; + entt::dispatcher& m_dispatcher; + t_json_synchronized m_update_info; + t_update_time_point m_update_clock; + QJsonObject m_combined_download_status; + bool m_is_downloading{false}; + QStringList m_enable_after_download; + + void fetch_update_info(); + + public: + explicit zcash_params_service( + entt::registry& registry, ag::ecs::system_manager& system_manager, + entt::dispatcher& dispatcher, QObject* parent = nullptr); + ~zcash_params_service() final = default; + + void update() final; + + Q_INVOKABLE void enable_after_download(const QString& coin); + Q_INVOKABLE QStringList get_enable_after_download(); + Q_INVOKABLE void clear_enable_after_download(); + Q_INVOKABLE void download_zcash_params(); + Q_INVOKABLE bool is_downloading(); + Q_INVOKABLE QString get_combined_download_progress(); + [[nodiscard]] QJsonObject get_combined_download_status() const; + [[nodiscard]] fs::path get_zcash_params_folder(); + + signals: + void combinedDownloadStatusChanged(); + + public slots: + void set_combined_download_status(QJsonObject& status); + }; +} // namespace atomic_dex + +REFL_AUTO(type(atomic_dex::zcash_params_service)) diff --git a/src/core/atomicdex/utilities/global.utilities.cpp b/src/core/atomicdex/utilities/global.utilities.cpp index 85d078a04b..85e5df8adb 100644 --- a/src/core/atomicdex/utilities/global.utilities.cpp +++ b/src/core/atomicdex/utilities/global.utilities.cpp @@ -17,11 +17,6 @@ namespace { - constexpr size_t g_qsize_spdlog = 10240; - constexpr size_t g_spdlog_thread_count = 2; - constexpr size_t g_spdlog_max_file_size = 7777777; - constexpr size_t g_spdlog_max_file_rotation = 3; - std::string dex_sha256(const std::string& str) { @@ -232,32 +227,6 @@ namespace atomic_dex::utils return fs_raw_mm2_shared_folder; } - std::shared_ptr - register_logger() - { - //! Log Initialization - fs::path path = atomic_dex::utils::get_atomic_dex_current_log_file(); - spdlog::init_thread_pool(g_qsize_spdlog, g_spdlog_thread_count); - auto tp = spdlog::thread_pool(); - auto stdout_sink = std::make_shared(); - -#if defined(_WIN32) || defined(WIN32) - auto rotating_sink = std::make_shared(path.wstring(), g_spdlog_max_file_size, g_spdlog_max_file_rotation); -#else - auto rotating_sink = std::make_shared(path.string(), g_spdlog_max_file_size, g_spdlog_max_file_rotation); -#endif - - std::vector sinks{stdout_sink, rotating_sink}; - auto logger = std::make_shared("log_mt", sinks.begin(), sinks.end(), tp, spdlog::async_overflow_policy::block); - spdlog::register_logger(logger); - spdlog::set_default_logger(logger); - spdlog::set_level(spdlog::level::trace); - spdlog::set_pattern("[%T] [%^%l%$] [%s:%#] [%t]: %v"); - SPDLOG_INFO("Logger successfully initialized"); - - return logger; - } - std::string extract_large_float(const std::string& current) { diff --git a/src/core/atomicdex/utilities/global.utilities.hpp b/src/core/atomicdex/utilities/global.utilities.hpp index 185fcfea12..5e9908df4a 100644 --- a/src/core/atomicdex/utilities/global.utilities.hpp +++ b/src/core/atomicdex/utilities/global.utilities.hpp @@ -76,7 +76,6 @@ namespace atomic_dex::utils fs::path get_atomic_dex_logs_folder() ; ENTT_API fs::path get_atomic_dex_current_log_file(); - ENTT_API std::shared_ptr register_logger(); ENTT_API fs::path get_current_configs_path(); diff --git a/src/core/atomicdex/utilities/log.prerequisites.hpp b/src/core/atomicdex/utilities/log.prerequisites.hpp index e15c7883db..c9d4db54e8 100644 --- a/src/core/atomicdex/utilities/log.prerequisites.hpp +++ b/src/core/atomicdex/utilities/log.prerequisites.hpp @@ -22,7 +22,11 @@ #endif #endif -#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE +#ifdef DEBUG + #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE +#else + #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO +#endif #include #include #include @@ -34,9 +38,9 @@ #endif #if defined(_WIN32) || defined(WIN32) -#define LOG_PATH(message, p) SPDLOG_INFO(L"" message, p.wstring()); -#define LOG_PATH_CMP(message, from, to) SPDLOG_INFO(L"" message, from.wstring(), to.wstring()); + #define LOG_PATH(message, p) SPDLOG_INFO(L"" message, p.wstring()); + #define LOG_PATH_CMP(message, from, to) SPDLOG_INFO(L"" message, from.wstring(), to.wstring()); #else -#define LOG_PATH(message, p) SPDLOG_INFO(message, p.string()); -#define LOG_PATH_CMP(message, from, to) SPDLOG_INFO(message, from.string(), to.string()); + #define LOG_PATH(message, p) SPDLOG_INFO(message, p.string()); + #define LOG_PATH_CMP(message, from, to) SPDLOG_INFO(message, from.string(), to.string()); #endif diff --git a/src/core/atomicdex/utilities/qt.download.manager.cpp b/src/core/atomicdex/utilities/qt.download.manager.cpp index 102aaaf00d..6f9fdf773e 100644 --- a/src/core/atomicdex/utilities/qt.download.manager.cpp +++ b/src/core/atomicdex/utilities/qt.download.manager.cpp @@ -1,50 +1,69 @@ -// -// Created by Sztergbaum Roman on 04/04/2021. -// +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ #include //! Project #include "atomicdex/events/events.hpp" +#include "atomicdex/services/update/zcash.params.service.hpp" #include "atomicdex/utilities/global.utilities.hpp" -#include "qt.download.manager.hpp" +#include "atomicdex/utilities/qt.download.manager.hpp" namespace atomic_dex { - qt_download_manager::qt_download_manager(entt::dispatcher& dispatcher) : m_dispatcher(dispatcher) + qt_downloader::qt_downloader(entt::dispatcher& dispatcher) : m_dispatcher(dispatcher) { - SPDLOG_INFO("qt_download_manager created"); - connect(&m_manager, &QNetworkAccessManager::finished, this, &qt_download_manager::download_finished); + connect(&m_manager, &QNetworkAccessManager::finished, this, &qt_downloader::download_finished); } void - qt_download_manager::do_download(const QUrl& url) + qt_downloader::do_download(const QUrl& url, std::string filename, fs::path folder) { - m_current_filename = atomic_dex::utils::u8string(fs::path(url.toString().toStdString()).filename()); - m_last_downloaded_path = fs::temp_directory_path() / m_current_filename; + m_download_filename = filename; + m_download_status.insert("filename", QString::fromStdString(filename)); + m_download_path = folder / m_download_filename; QNetworkRequest request(url); request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::RedirectPolicy::NoLessSafeRedirectPolicy); QNetworkReply* reply = m_manager.get(request); - connect(reply, &QNetworkReply::downloadProgress, this, &qt_download_manager::download_progress); + connect(reply, &QNetworkReply::downloadProgress, this, &qt_downloader::download_progress); + m_download_reply = reply; m_current_downloads.append(reply); + m_dispatcher.trigger(); } void - qt_download_manager::download_progress(qint64 bytes_received, qint64 bytes_total) + qt_downloader::download_progress(qint64 bytes_received, qint64 bytes_total) { - m_current_progress = float(bytes_received) / float(bytes_total); - m_dispatcher.trigger(qt_download_progressed{m_current_progress}); - SPDLOG_INFO("bytes_received : {}, bytes_total: {}, percent {}%", bytes_received, bytes_total, m_current_progress * 100); + m_download_progress = float(bytes_received) / float(bytes_total); + m_download_status.insert("progress", m_download_progress); + emit downloadStatusChanged(m_download_status); + m_dispatcher.trigger(m_download_status); + // SPDLOG_INFO("{} bytes_received : {}, bytes_total: {}, percent {}%", m_download_filename, bytes_received, bytes_total, m_download_progress * 100); } void - qt_download_manager::download_finished(QNetworkReply* reply) + qt_downloader::download_finished(QNetworkReply* reply) { auto save_disk_functor = [this](QIODevice* data) { - QFile file(utils::u8string(m_last_downloaded_path).c_str()); + // Todo: handle download fail on front end + QFile file(utils::u8string(m_download_path).c_str()); if (!file.open(QIODevice::WriteOnly)) { - SPDLOG_ERROR("Could not open {} for writing: {}", utils::u8string(m_last_downloaded_path), file.errorString().toStdString()); + SPDLOG_ERROR("Could not open {} for writing: {}", utils::u8string(m_download_path), file.errorString().toStdString()); + m_dispatcher.trigger(); return false; } @@ -60,11 +79,11 @@ namespace atomic_dex } else { - SPDLOG_INFO("Successfully downloaded: {}", m_current_filename); + SPDLOG_INFO("Successfully downloaded: {}", m_download_filename); if (save_disk_functor(reply)) { - SPDLOG_INFO("Successfully saved {} to {}", url.toString().toStdString(), utils::u8string(m_last_downloaded_path)); - m_dispatcher.trigger(); + SPDLOG_INFO("Successfully saved {} to {}", url.toString().toStdString(), utils::u8string(m_download_path)); + m_dispatcher.trigger(); } } @@ -72,11 +91,23 @@ namespace atomic_dex reply->deleteLater(); } + QNetworkReply* + qt_downloader::get_reply() const + { + return m_download_reply; + } + fs::path - qt_download_manager::get_last_download_path() const + qt_downloader::get_last_download_path() const + { + return m_download_path; + } + + QJsonObject + qt_downloader::get_download_status() const { - return m_last_downloaded_path; + return m_download_status; } - qt_download_manager::~qt_download_manager() {} -} // namespace atomic_dex \ No newline at end of file + qt_downloader::~qt_downloader() {} +} // namespace atomic_dex diff --git a/src/core/atomicdex/utilities/qt.download.manager.hpp b/src/core/atomicdex/utilities/qt.download.manager.hpp index 5705fdf589..78eb4a4958 100644 --- a/src/core/atomicdex/utilities/qt.download.manager.hpp +++ b/src/core/atomicdex/utilities/qt.download.manager.hpp @@ -1,5 +1,22 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + #pragma once +#include #include #include #include @@ -10,31 +27,37 @@ namespace atomic_dex { - class qt_download_manager : public QObject + class qt_downloader : public QObject { Q_OBJECT + Q_PROPERTY(QJsonObject download_status READ get_download_status NOTIFY downloadStatusChanged) + entt::dispatcher& m_dispatcher; QNetworkAccessManager m_manager; - std::string m_current_filename; - fs::path m_last_downloaded_path; + std::string m_download_filename; + fs::path m_download_path; QVector m_current_downloads; - float m_current_progress; + float m_download_progress; + QJsonObject m_download_status; + QNetworkReply* m_download_reply; public: - qt_download_manager(entt::dispatcher& dispatcher); - ~qt_download_manager(); + qt_downloader(entt::dispatcher& dispatcher); + ~qt_downloader(); + + void do_download(const QUrl& url, std::string filename, fs::path folder); + [[nodiscard]] fs::path get_last_download_path() const; + [[nodiscard]] QJsonObject get_download_status() const; + [[nodiscard]] QJsonObject get_combined_download_status() const; + [[nodiscard]] QNetworkReply* get_reply() const; - void do_download(const QUrl& url); - [[nodiscard]] fs::path get_last_download_path() const; + signals: + void downloadStatusChanged(QJsonObject &status); public slots: void download_finished(QNetworkReply* reply); void download_progress(qint64 bytes_received, qint64 bytes_total); }; - struct qt_download_progressed - { - float progress; - }; -} // namespace atomic_dex \ No newline at end of file +} // namespace atomic_dex diff --git a/src/core/atomicdex/utilities/qt.utilities.hpp b/src/core/atomicdex/utilities/qt.utilities.hpp index 036c8c0df7..ab760bc71d 100644 --- a/src/core/atomicdex/utilities/qt.utilities.hpp +++ b/src/core/atomicdex/utilities/qt.utilities.hpp @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2013-2021 The Komodo Platform Developers. * + * Copyright © 2013-2022 The Komodo Platform Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -16,7 +16,6 @@ #pragma once -//! QT Headers #include #include #include @@ -25,7 +24,6 @@ #include #include //> QCryptographicHash::hash, QCryptographicHash::Keccak_256 -//! Project Headers #include "atomicdex/config/app.cfg.hpp" #include "atomicdex/config/coins.cfg.hpp" #include "atomicdex/config/wallet.cfg.hpp" @@ -33,9 +31,8 @@ namespace atomic_dex { - template - auto - update_value(int role, const QVariant& value, const QModelIndex& idx, TModel& model) + template + inline auto update_value(int role, const QVariant& value, const QModelIndex& idx, QtModel& model) { if (auto prev_value = model.data(idx, role); value != prev_value) { @@ -54,8 +51,7 @@ namespace atomic_dex const atomic_dex::komodo_prices_provider& provider, const atomic_dex::coin_config& coin, const atomic_dex::cfg& config, const ag::ecs::system_manager& system_manager); - [[nodiscard]] QString - inline sha256_qstring_from_qt_byte_array(const QByteArray& byte_array) + [[nodiscard]] QString inline sha256_qstring_from_qt_byte_array(const QByteArray& byte_array) { return QLatin1String(QCryptographicHash::hash(byte_array, QCryptographicHash::Sha256).toHex()); } diff --git a/src/core/atomicdex/version/version.hpp b/src/core/atomicdex/version/version.hpp index 1e1dfe9a44..4947939a04 100644 --- a/src/core/atomicdex/version/version.hpp +++ b/src/core/atomicdex/version/version.hpp @@ -21,24 +21,24 @@ namespace atomic_dex constexpr const char* get_version() { - return "0.5.6-beta"; + return "0.5.7-beta"; } constexpr int get_num_version() noexcept { - return 56; + return 57; } constexpr const char* get_raw_version() { - return "0.5.6"; + return "0.5.7"; } constexpr const char* get_precedent_raw_version() { - return "0.5.5.1"; + return "0.5.6.1"; } } // namespace atomic_dex diff --git a/src/tests/api/mm2/enable_bch_with_tokens_rpc_tests.cpp b/src/tests/api/mm2/enable_bch_with_tokens_rpc_tests.cpp new file mode 100644 index 0000000000..e11678a5c8 --- /dev/null +++ b/src/tests/api/mm2/enable_bch_with_tokens_rpc_tests.cpp @@ -0,0 +1,103 @@ +#include + +#include "atomicdex/api/mm2/enable_bch_with_tokens_rpc.hpp" + +TEST_CASE("enable_bch_with_tokens_request_rpc serialization") +{ + using namespace atomic_dex::mm2; + + nlohmann::json result; + enable_bch_with_tokens_request_rpc data + { + .ticker = "BCH", + .allow_slp_unsafe_conf = false, + .bchd_urls = {"https://bchd.imaginary.cash:8335/"}, + .mode = + { + .rpc = "Electrum", + .rpc_data = + { + .servers = { { .url = "electrum1.cipig.net:10055" }, { .url = "electrum1.cipig.net:20055", .protocol = "SSL" } } + } + }, + .tx_history = true, + .slp_tokens_requests = { { .ticker = "ASLP", .required_confirmations = 4 } }, + .required_confirmations = 5, + .requires_notarization = false, + .address_format = enable_bch_with_tokens_request_rpc::address_format_t{ .format = "cashaddress", .network = "bitcoincash" }, + .utxo_merge_params = enable_bch_with_tokens_request_rpc::utxo_merge_params_t{ .merge_at = 50, .check_every = 10, .max_merge_at_once = 25 } + }; + + nlohmann::to_json(result, data); + + CHECK_EQ(result["ticker"], "BCH"); + CHECK_FALSE(result["allow_slp_unsafe_conf"]); + CHECK_EQ(result["bchd_urls"].size(), 1); + CHECK_EQ(result["bchd_urls"][0].get(), "https://bchd.imaginary.cash:8335/"); + CHECK(result["tx_history"]); + CHECK_EQ(result["slp_tokens_requests"].size(), 1); + CHECK_EQ(result["slp_tokens_requests"][0]["ticker"], "ASLP"); + CHECK_EQ(result["slp_tokens_requests"][0]["required_confirmations"], 4); + CHECK_EQ(result["required_confirmations"], 5); + CHECK_FALSE(result["requires_notarization"]); + CHECK_EQ(result["address_format"]["format"], "cashaddress"); + CHECK_EQ(result["address_format"]["network"], "bitcoincash"); + CHECK_EQ(result["utxo_merge_params"]["merge_at"], 50); + CHECK_EQ(result["utxo_merge_params"]["check_every"], 10); + CHECK_EQ(result["utxo_merge_params"]["max_merge_at_once"], 25); +} + +TEST_CASE("enable_bch_with_tokens_result_rpc deserialization") +{ + using namespace atomic_dex::mm2; + + enable_bch_with_tokens_result_rpc result; + nlohmann::json json = nlohmann::json::parse(R"( + { + "current_block":1480481, + "bch_addresses_infos": { + "bitcoincash:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5qx64fztj": { + "derivation_method": { + "type":"Iguana" + }, + "pubkey":"036879df230663db4cd083c8eeb0f293f46abc460ad3c299b0089b72e6d472202c", + "balances": { + "spendable":"0.11398301", + "unspendable":"0.00001" + } + } + }, + "slp_addresses_infos": { + "simpleledger:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5va3wuz4v":{ + "derivation_method": { + "type":"Iguana" + }, + "pubkey":"036879df230663db4cd083c8eeb0f293f46abc460ad3c299b0089b72e6d472202c", + "balances": { + "ASLP":{ + "spendable":"5.2974", + "unspendable":"0" + } + } + } + } + })"); + + nlohmann::from_json(json, result); + + CHECK_EQ(result.current_block, 1480481); + CHECK_EQ(result.bch_addresses_infos.size(), 1); + CHECK(result.bch_addresses_infos.contains("bitcoincash:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5qx64fztj")); + CHECK_EQ(result.bch_addresses_infos["bitcoincash:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5qx64fztj"].derivation_method.type, "Iguana"); + CHECK_EQ(result.bch_addresses_infos["bitcoincash:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5qx64fztj"].pubkey, "036879df230663db4cd083c8eeb0f293f46abc460ad3c299b0089b72e6d472202c"); + CHECK_EQ(result.bch_addresses_infos["bitcoincash:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5qx64fztj"].balances.spendable, "0.11398301"); + CHECK_EQ(result.bch_addresses_infos["bitcoincash:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5qx64fztj"].balances.unspendable, "0.00001"); + CHECK_EQ(result.slp_addresses_infos.size(), 1); + CHECK(result.slp_addresses_infos.contains("simpleledger:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5va3wuz4v")); + CHECK_EQ(result.slp_addresses_infos["simpleledger:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5va3wuz4v"].derivation_method.type, "Iguana"); + CHECK_EQ(result.slp_addresses_infos["simpleledger:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5va3wuz4v"].pubkey, "036879df230663db4cd083c8eeb0f293f46abc460ad3c299b0089b72e6d472202c"); + CHECK_EQ(result.slp_addresses_infos["simpleledger:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5va3wuz4v"].balances.size(), 1); + CHECK(result.slp_addresses_infos["simpleledger:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5va3wuz4v"].balances.contains("ASLP")); + CHECK_EQ(result.slp_addresses_infos["simpleledger:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5va3wuz4v"].balances["ASLP"].spendable, "5.2974"); + CHECK_EQ(result.slp_addresses_infos["simpleledger:qrf5vpn78s7rjexrjhlwyzzeg7gw98k7t5va3wuz4v"].balances["ASLP"].unspendable, "0"); +} \ No newline at end of file diff --git a/src/tests/api/mm2/mm2.api.balance.infos.tests.cpp b/src/tests/api/mm2/mm2.api.balance.infos.tests.cpp new file mode 100644 index 0000000000..358a240cdc --- /dev/null +++ b/src/tests/api/mm2/mm2.api.balance.infos.tests.cpp @@ -0,0 +1,36 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +//! Deps +#include "doctest/doctest.h" +#include + +#include "atomicdex/api/mm2/balance.infos.hpp" + +TEST_CASE("mm2::balance_infos deserialization") +{ + const nlohmann::json json = R"( + { + "balances":{ + "spendable":"0.11398301", + "unspendable":"0.00001" + } + })"_json; + atomic_dex::mm2::balance_infos infos; + atomic_dex::mm2::from_json(json.at("balances"), infos); + CHECK_EQ(infos.spendable, "0.11398301"); + CHECK_EQ(infos.unspendable, "0.00001"); +} \ No newline at end of file diff --git a/src/tests/api/mm2/mm2.api.format.address.tests.cpp b/src/tests/api/mm2/mm2.api.format.address.tests.cpp new file mode 100644 index 0000000000..0866934bad --- /dev/null +++ b/src/tests/api/mm2/mm2.api.format.address.tests.cpp @@ -0,0 +1,36 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +//! Deps +#include "doctest/doctest.h" +#include + +#include "atomicdex/api/mm2/format.address.hpp" + +TEST_CASE("mm2::address_format serialisation") +{ + const nlohmann::json expected_json = R"( + { + "format":"cashaddress", + "network":"bchtest" + } + )"_json; + atomic_dex::mm2::format_address request{.format = "cashaddress", .network = "bchtest"}; + nlohmann::json j; + + atomic_dex::mm2::to_json(j, request); + CHECK_EQ(j, expected_json); +} \ No newline at end of file diff --git a/src/tests/api/mm2/mm2.api.utxo.merge.params.tests.cpp b/src/tests/api/mm2/mm2.api.utxo.merge.params.tests.cpp new file mode 100644 index 0000000000..383a45183f --- /dev/null +++ b/src/tests/api/mm2/mm2.api.utxo.merge.params.tests.cpp @@ -0,0 +1,36 @@ +/****************************************************************************** + * Copyright © 2013-2022 The Komodo Platform Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * Komodo Platform software, including this file may be copied, modified, * + * propagated or distributed except according to the terms contained in the * + * LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +//! Deps +#include "doctest/doctest.h" +#include + +#include "atomicdex/api/mm2/utxo.merge.params.hpp" + +TEST_CASE("mm2::utxo_merge_params serialisation") +{ + const nlohmann::json expected_json = R"( + { + "merge_at":50, + "check_every":10, + "max_merge_at_once":25 + } + )"_json; + atomic_dex::mm2::utxo_merge_params request{.merge_at = 50, .check_every = 10, .max_merge_at_once = 25}; + nlohmann::json j; + atomic_dex::mm2::to_json(j, request); + CHECK_EQ(j, expected_json); +} \ No newline at end of file diff --git a/src/tests/api/mm2/mm2.fraction.tests.cpp b/src/tests/api/mm2/mm2.fraction.tests.cpp index 2b5400574b..148edf607e 100644 --- a/src/tests/api/mm2/mm2.fraction.tests.cpp +++ b/src/tests/api/mm2/mm2.fraction.tests.cpp @@ -14,7 +14,7 @@ //! Project Headers #include "atomicdex/api/mm2/fraction.hpp" -TEST_CASE("mm2::api::fraction deserialisation") +TEST_CASE("atomic_dex::mm2::fraction deserialisation") { nlohmann::json fraction_json = R"( { @@ -22,8 +22,8 @@ TEST_CASE("mm2::api::fraction deserialisation") "numer": "333" } )"_json; - mm2::api::fraction fraction; - mm2::api::from_json(fraction_json, fraction); + atomic_dex::mm2::fraction fraction; + atomic_dex::mm2::from_json(fraction_json, fraction); CHECK_EQ(fraction.numer, "333"); CHECK_EQ(fraction.denom, "777"); diff --git a/src/tests/api/mm2/mm2.rpc.trade.preimage.tests.cpp b/src/tests/api/mm2/mm2.rpc.trade.preimage.tests.cpp index 97f6485368..1dce6caf12 100644 --- a/src/tests/api/mm2/mm2.rpc.trade.preimage.tests.cpp +++ b/src/tests/api/mm2/mm2.rpc.trade.preimage.tests.cpp @@ -234,37 +234,37 @@ namespace })"_json; } // namespace -TEST_CASE("mm2::api::preimage_request serialisation") +TEST_CASE("atomic_dex::mm2::preimage_request serialisation") { atomic_dex::t_trade_preimage_request request{.base_coin = "KMD", .rel_coin = "BTC", .swap_method = "buy", .volume = "10"}; nlohmann::json j; - mm2::api::to_json(j, request); + atomic_dex::mm2::to_json(j, request); CHECK_EQ(j, g_preimage_request_buy_kmd_btc); } -TEST_CASE("mm2::api::coin_fee deserialization") +TEST_CASE("atomic_dex::mm2::coin_fee deserialization") { - mm2::api::coin_fee answer; - mm2::api::from_json(g_coin_fee_answer, answer); + atomic_dex::mm2::coin_fee answer; + atomic_dex::mm2::from_json(g_coin_fee_answer, answer); CHECK_EQ("0.00042049", answer.amount); CHECK_EQ("BTC", answer.coin); CHECK_EQ("100000000", answer.amount_fraction.denom); } -TEST_CASE("mm2::api::preimage_answer_success deserialization from buy") +TEST_CASE("atomic_dex::mm2::preimage_answer_success deserialization from buy") { - mm2::api::trade_preimage_answer_success answer; - mm2::api::from_json(g_preimage_answer_success_buy, answer); + atomic_dex::mm2::trade_preimage_answer_success answer; + atomic_dex::mm2::from_json(g_preimage_answer_success_buy, answer); CHECK(answer.taker_fee.has_value()); CHECK(answer.fee_to_send_taker_fee.has_value()); } -TEST_SUITE("mm2::api::preimage_answer deserialization test suites") +TEST_SUITE("atomic_dex::mm2::preimage_answer deserialization test suites") { TEST_CASE("setprice BTC/RICK") { atomic_dex::t_trade_preimage_answer answer; - mm2::api::from_json(g_preimage_answer_setprice, answer); + atomic_dex::mm2::from_json(g_preimage_answer_setprice, answer); CHECK(answer.result.has_value()); CHECK_FALSE(answer.error.has_value()); CHECK_FALSE(answer.result.value().fee_to_send_taker_fee.has_value()); @@ -273,7 +273,7 @@ TEST_SUITE("mm2::api::preimage_answer deserialization test suites") TEST_CASE("buy BTC/RICK") { atomic_dex::t_trade_preimage_answer answer; - mm2::api::from_json(g_preimage_answer_buy, answer); + atomic_dex::mm2::from_json(g_preimage_answer_buy, answer); CHECK(answer.result.has_value()); CHECK_FALSE(answer.error.has_value()); CHECK(answer.result.value().fee_to_send_taker_fee.has_value()); @@ -282,7 +282,7 @@ TEST_SUITE("mm2::api::preimage_answer deserialization test suites") TEST_CASE("sell max BTC/RICK") { atomic_dex::t_trade_preimage_answer answer; - mm2::api::from_json(g_preimage_answer_sell_max, answer); + atomic_dex::mm2::from_json(g_preimage_answer_sell_max, answer); CHECK(answer.result.has_value()); CHECK_FALSE(answer.error.has_value()); CHECK(answer.result.value().fee_to_send_taker_fee.has_value()); @@ -291,7 +291,7 @@ TEST_SUITE("mm2::api::preimage_answer deserialization test suites") TEST_CASE("setprice ERC20 BAT/RICK") { atomic_dex::t_trade_preimage_answer answer; - mm2::api::from_json(g_preimage_answer_setprice_erc, answer); + atomic_dex::mm2::from_json(g_preimage_answer_setprice_erc, answer); CHECK(answer.result.has_value()); CHECK_FALSE(answer.error.has_value()); CHECK_FALSE(answer.result.value().fee_to_send_taker_fee.has_value()); @@ -323,7 +323,7 @@ TEST_SUITE("mm2::api::preimage_answer deserialization test suites") #include "atomicdex/api/mm2/mm2.hpp" #include "atomicdex/api/mm2/rpc.trade.preimage.hpp" ///< replace this one by your current rpc file */ -SCENARIO("mm2::api::preimage scenario") +SCENARIO("atomic_dex::mm2::preimage scenario") { /** * Checking that the test context is valid @@ -335,7 +335,7 @@ SCENARIO("mm2::api::preimage scenario") CHECK(batch.is_array()); //! Prepare request template - nlohmann::json request_json = ::mm2::api::template_request("trade_preimage"); + nlohmann::json request_json = atomic_dex::mm2::template_request("trade_preimage"); //! Retrieve mm2 service auto& mm2 = g_context->system_manager().get_system(); @@ -368,7 +368,7 @@ SCENARIO("mm2::api::preimage scenario") CHECK(batch.empty()); //! Give the concrete C++ type - here it's atomic_dex::t_trade_preimage_answer - return ::mm2::api::rpc_process_answer_batch(answers[0], "trade_preimage"); + return atomic_dex::mm2::rpc_process_answer_batch(answers[0], "trade_preimage"); }; //! A test with RICK/MORTY @@ -378,7 +378,7 @@ SCENARIO("mm2::api::preimage scenario") atomic_dex::t_trade_preimage_request request{.base_coin = "RICK", .rel_coin = "MORTY", .swap_method = "buy", .volume = "1", .price = "1"}; //! Transform request into json - ::mm2::api::to_json(request_json, request); + atomic_dex::mm2::to_json(request_json, request); //! Add it to the batch request batch.push_back(request_json); @@ -406,7 +406,7 @@ SCENARIO("mm2::api::preimage scenario") GIVEN("Preparing a wrong request RICK/NONEXISTENT coin") { atomic_dex::t_trade_preimage_request request{.base_coin = "RICK", .rel_coin = "NONEXISTENT", .swap_method = "buy", .volume = "1"}; - ::mm2::api::to_json(request_json, request); + atomic_dex::mm2::to_json(request_json, request); batch.push_back(request_json); auto copy_request = request_json; copy_request["userpass"] = ""; diff --git a/src/tests/atomic.dex.tests.cpp b/src/tests/atomic.dex.tests.cpp index 38b1f9bc22..936f62e1a8 100644 --- a/src/tests/atomic.dex.tests.cpp +++ b/src/tests/atomic.dex.tests.cpp @@ -34,7 +34,7 @@ main(int argc, char** argv) context.applyCommandLine(argc, argv); - atomic_dex::kill_executable("mm2"); + atomic_dex::kill_executable(atomic_dex::g_dex_api); QStringList args; const int ac = argc; diff --git a/src/tests/atomic.dex.tests.hpp b/src/tests/atomic.dex.tests.hpp index 17ae488894..93b3611a39 100644 --- a/src/tests/atomic.dex.tests.hpp +++ b/src/tests/atomic.dex.tests.hpp @@ -100,7 +100,7 @@ struct tests_context : public antara::gaming::world::app if (!found) { SPDLOG_INFO("Extra coins not enabled yet, enabling now"); - mm2.enable_multiple_coins(m_extra_coins); + mm2.enable_coins(m_extra_coins); } while (!m_extra_coins_ready) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); } //! At this point BTC/KMD are enabled but we need ERC20 and QRC20 too / change login behaviour ? diff --git a/src/tests/config/coins.cfg.tests.cpp b/src/tests/config/coins.cfg.tests.cpp index 84f736f3d6..b005eca9b9 100644 --- a/src/tests/config/coins.cfg.tests.cpp +++ b/src/tests/config/coins.cfg.tests.cpp @@ -21,7 +21,7 @@ t_http_client_ptr g_komodolive_client{std::make_unique(FROM_S TEST_CASE("generate all coinpaprika possibilities") { #if defined(__APPLE__) - const auto resp = ::mm2::api::async_process_rpc_get(g_komodolive_client, "tickers", "/ticker").get(); + const auto resp = atomic_dex::mm2::async_process_rpc_get(g_komodolive_client, "tickers", "/ticker").get(); std::string body = TO_STD_STR(resp.extract_string(true).get()); nlohmann::json j_metrics = nlohmann::json::parse(body); nlohmann::json metrics = nlohmann::json::object(); diff --git a/src/tests/utilities/global.utilities.tests.cpp b/src/tests/utilities/global.utilities.tests.cpp index f257470229..131c2805f4 100644 --- a/src/tests/utilities/global.utilities.tests.cpp +++ b/src/tests/utilities/global.utilities.tests.cpp @@ -91,8 +91,6 @@ TEST_CASE("atomic_dex::utils::get_runtime_coins_path()") CHECK(fs::exists(result)); } -TEST_CASE("atomic_dex::utils::register_logger()") { CHECK_NE(register_logger(), nullptr); } - TEST_CASE("atomic_dex::utils::get_current_configs_path()") { auto result = get_current_configs_path(); diff --git a/tools/linux/.gitignore b/tools/linux/.gitignore new file mode 100644 index 0000000000..18d999ecf4 --- /dev/null +++ b/tools/linux/.gitignore @@ -0,0 +1,2 @@ +linuxdeploy-x86_64.AppImage + diff --git a/vcpkg.json b/vcpkg.json index f19d064d78..c2dc3d1870 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "atomicdex-desktop", - "version-string": "0.5.5.1", + "version-string": "0.5.6.1", "dependencies": [ "entt", "boost-multiprecision", diff --git a/wally/wally.dll b/wally/wally.dll deleted file mode 100644 index 0f90ef5249..0000000000 Binary files a/wally/wally.dll and /dev/null differ