Merge branch 'monero-project:master' into https/github.com/Asylum4You/monero-core#
103
.github/verify_p2pool.py
vendored
Normal file
|
@ -0,0 +1,103 @@
|
|||
import requests
|
||||
import subprocess
|
||||
from urllib.request import urlretrieve
|
||||
import difflib
|
||||
|
||||
sech_key = "https://p2pool.io/SChernykh.asc"
|
||||
sech_key_backup = "https://raw.githubusercontent.com/monero-project/gitian.sigs/master/gitian-pubkeys/SChernykh.asc"
|
||||
sech_key_fp = "1FCA AB4D 3DC3 310D 16CB D508 C47F 82B5 4DA8 7ADF"
|
||||
|
||||
p2pool_files = [{
|
||||
"os": "WIN",
|
||||
"filename": "windows-x64.zip",
|
||||
},
|
||||
{
|
||||
"os": "LINUX",
|
||||
"filename": "linux-x64.tar.gz"
|
||||
},
|
||||
{
|
||||
"os": "MACOS",
|
||||
"filename": "macos-x64.tar.gz",
|
||||
}]
|
||||
|
||||
def get_hash(fname):
|
||||
fhash = subprocess.check_output(["sha256sum", fname]).decode("utf-8")
|
||||
print(fhash.strip())
|
||||
return fhash.split()[0]
|
||||
|
||||
def main():
|
||||
global p2pool_files, sech_key, sech_key_backup, sech_key_fp
|
||||
p2pool_tag_api = "https://api.github.com/repos/SChernykh/p2pool/releases/latest"
|
||||
data = requests.get(p2pool_tag_api).json()
|
||||
tag = data["tag_name"]
|
||||
head = f"p2pool-{tag}-"
|
||||
url = f"https://github.com/SChernykh/p2pool/releases/download/{tag}/"
|
||||
|
||||
try:
|
||||
urlretrieve(sech_key,"SChernykh.asc")
|
||||
except:
|
||||
urlretrieve(sech_key_backup,"SChernykh.asc")
|
||||
|
||||
urlretrieve(f"{url}sha256sums.txt.asc","sha256sums.txt.asc")
|
||||
|
||||
subprocess.check_call(["gpg", "--import", "SChernykh.asc"])
|
||||
subprocess.check_call(["gpg", "--verify", "sha256sums.txt.asc"])
|
||||
fingerprint = subprocess.check_output(["gpg","--fingerprint", "SChernykh"]).decode("utf-8").splitlines()[1].strip()
|
||||
|
||||
assert fingerprint == sech_key_fp
|
||||
|
||||
with open("sha256sums.txt.asc","r") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
signed_hashes = {}
|
||||
for line in lines:
|
||||
if "Name:" in line:
|
||||
signed_fname = line.split()[1]
|
||||
if "SHA256:" in line:
|
||||
signed_hashes[signed_fname] = line.split()[1].lower()
|
||||
|
||||
expected = ""
|
||||
for i in range(len(p2pool_files)):
|
||||
fname = p2pool_files[i]["filename"]
|
||||
str_os =p2pool_files[i]["os"]
|
||||
dl = f"{url}{head}{fname}"
|
||||
urlretrieve(dl,f"{head}{fname}")
|
||||
fhash = get_hash(f"{head}{fname}")
|
||||
assert signed_hashes[f"{head}{fname}"] == fhash
|
||||
if i == 0:
|
||||
expected += f" #ifdef Q_OS_{str_os}\n"
|
||||
else:
|
||||
expected += f" #elif defined(Q_OS_{str_os})\n"
|
||||
expected += f" url = \"https://github.com/SChernykh/p2pool/releases/download/{tag}/{head}{fname}\";\n"
|
||||
expected += f" fileName = m_p2poolPath + \"/{head}{fname}\";\n"
|
||||
expected += f" validHash = \"{fhash}\";\n"
|
||||
expected += " #endif\n"
|
||||
|
||||
print(f"Expected:\n{expected}")
|
||||
|
||||
with open("src/p2pool/P2PoolManager.cpp","r") as f:
|
||||
p2pool_lines = f.readlines()
|
||||
|
||||
unexpected = ""
|
||||
ignore = 1
|
||||
for line in p2pool_lines:
|
||||
if ignore == 0:
|
||||
unexpected += line
|
||||
if "QString validHash;" in line:
|
||||
ignore = 0
|
||||
if "#endif" in line and ignore == 0:
|
||||
break
|
||||
|
||||
d = difflib.Differ()
|
||||
diff = d.compare(str(unexpected).splitlines(True),str(expected).splitlines(True))
|
||||
|
||||
print("Unexpected:")
|
||||
for i in diff:
|
||||
if i.startswith("?"):
|
||||
continue
|
||||
print(i.replace("\n",""))
|
||||
|
||||
assert unexpected == expected
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
12
.github/workflows/build.yml
vendored
|
@ -10,7 +10,7 @@ jobs:
|
|||
with:
|
||||
submodules: recursive
|
||||
- name: install dependencies
|
||||
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm libsodium miniupnpc ldns expat libunwind-headers protobuf qt5 pkg-config
|
||||
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm libsodium miniupnpc expat libunwind-headers protobuf qt5 pkg-config
|
||||
- name: build
|
||||
run: DEV_MODE=ON make release -j3
|
||||
- name: test qml
|
||||
|
@ -34,7 +34,7 @@ jobs:
|
|||
- name: install monero dependencies
|
||||
run: sudo apt -y install build-essential cmake libboost-all-dev miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev libzmq3-dev libsodium-dev libhidapi-dev libnorm-dev libusb-1.0-0-dev libpgm-dev libprotobuf-dev protobuf-compiler
|
||||
- name: install monero gui dependencies
|
||||
run: sudo apt -y install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtqml-models2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-platform qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev libgcrypt20-dev xvfb
|
||||
run: sudo apt -y install qtbase5-dev qtdeclarative5-dev qml-module-qtqml-models2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-platform qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev libgcrypt20-dev xvfb
|
||||
- name: build
|
||||
run: DEV_MODE=ON make release -j3
|
||||
- name: test qml
|
||||
|
@ -52,7 +52,7 @@ jobs:
|
|||
- uses: eine/setup-msys2@v2
|
||||
with:
|
||||
update: true
|
||||
install: mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-protobuf-c mingw-w64-x86_64-libusb mingw-w64-x86_64-unbound git mingw-w64-x86_64-qt5 mingw-w64-x86_64-libgcrypt
|
||||
install: mingw-w64-x86_64-toolchain make mingw-w64-x86_64-pcre mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-protobuf-c mingw-w64-x86_64-libusb mingw-w64-x86_64-unbound git mingw-w64-x86_64-qt5 mingw-w64-x86_64-libgcrypt
|
||||
- name: build
|
||||
run: DEV_MODE=ON make release-win64 -j2
|
||||
- name: deploy
|
||||
|
@ -68,7 +68,7 @@ jobs:
|
|||
with:
|
||||
submodules: recursive
|
||||
- name: install dependencies
|
||||
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm miniupnpc ldns expat libunwind-headers protobuf pkg-config python3 p7zip aria2
|
||||
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm miniupnpc expat libunwind-headers protobuf pkg-config python3 p7zip aria2
|
||||
- name: install dependencies
|
||||
run: pip3 install defusedxml
|
||||
- name: download qt
|
||||
|
@ -103,7 +103,7 @@ jobs:
|
|||
restore-keys: |
|
||||
docker-linux-static-
|
||||
- name: install dependencies
|
||||
run: sudo apt -y install xvfb libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xkb1 libxkbcommon-x11-0
|
||||
run: sudo apt -y install xvfb libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xkb1 libxcb-shape0 libxkbcommon-x11-0
|
||||
- name: prepare build environment
|
||||
run: docker build --tag monero:build-env-linux --build-arg THREADS=3 --file Dockerfile.linux .
|
||||
- name: build
|
||||
|
@ -162,6 +162,8 @@ jobs:
|
|||
run: docker build --tag monero:build-env-android --build-arg THREADS=3 --file Dockerfile.android .
|
||||
- name: build
|
||||
run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -e THREADS=3 monero:build-env-android
|
||||
- name: Remove obsolete docker layers
|
||||
run: docker images -a | grep none | awk '{ print $3; }' | xargs docker rmi || true
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ github.job }}
|
||||
|
|
16
.github/workflows/verify_p2pool.yml
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
name: ci/gh-actions/verify
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- 'src/p2pool/P2PoolManager.cpp'
|
||||
pull_request:
|
||||
paths:
|
||||
- 'src/p2pool/P2PoolManager.cpp'
|
||||
jobs:
|
||||
p2pool-hashes:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Verify Hashes
|
||||
run: |
|
||||
python3 .github/verify_p2pool.py
|
|
@ -3,9 +3,9 @@ project(monero-gui)
|
|||
|
||||
message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}")
|
||||
|
||||
set(VERSION_MAJOR "17")
|
||||
set(VERSION_MINOR "3")
|
||||
set(VERSION_REVISION "2")
|
||||
set(VERSION_MAJOR "18")
|
||||
set(VERSION_MINOR "2")
|
||||
set(VERSION_REVISION "0")
|
||||
set(VERSION "0.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}")
|
||||
|
||||
option(STATIC "Link libraries statically, requires static Qt")
|
||||
|
|
|
@ -1,47 +1,50 @@
|
|||
FROM debian:stretch
|
||||
FROM debian:buster
|
||||
|
||||
ARG THREADS=1
|
||||
ARG ANDROID_NDK_REVISION=21d
|
||||
ARG ANDROID_NDK_HASH=bcf4023eb8cb6976a4c7cff0a8a8f145f162bf4d
|
||||
ARG ANDROID_SDK_REVISION=4333796
|
||||
ARG ANDROID_SDK_HASH=92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
|
||||
ARG QT_VERSION=5.15.2
|
||||
ARG ANDROID_NDK_REVISION=21e
|
||||
ARG ANDROID_NDK_HASH=c3ebc83c96a4d7f539bd72c241b2be9dcd29bda9
|
||||
ARG ANDROID_SDK_REVISION=7302050_latest
|
||||
ARG ANDROID_SDK_HASH=7a00faadc0864f78edd8f4908a629a46d622375cbe2e5814e82934aebecdb622
|
||||
ARG QT_VERSION=v5.15.7-lts-lgpl
|
||||
|
||||
WORKDIR /opt/android
|
||||
ENV WORKDIR=/opt/android
|
||||
|
||||
ENV ANDROID_NATIVE_API_LEVEL=28
|
||||
ENV ANDROID_NATIVE_API_LEVEL=30
|
||||
ENV ANDROID_API=android-${ANDROID_NATIVE_API_LEVEL}
|
||||
ENV ANDROID_CLANG=aarch64-linux-android${ANDROID_NATIVE_API_LEVEL}-clang
|
||||
ENV ANDROID_CLANGPP=aarch64-linux-android${ANDROID_NATIVE_API_LEVEL}-clang++
|
||||
ENV ANDROID_NDK_ROOT=${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION}
|
||||
ENV ANDROID_SDK_ROOT=${WORKDIR}/tools
|
||||
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
|
||||
ENV ANDROID_SDK_ROOT=${WORKDIR}/cmdline-tools
|
||||
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
|
||||
ENV PATH=${JAVA_HOME}/bin:${PATH}
|
||||
ENV PREFIX=${WORKDIR}/prefix
|
||||
ENV TOOLCHAIN_DIR=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y ant automake build-essential ca-certificates-java file gettext git libc6 libncurses5 \
|
||||
libssl-dev libstdc++6 libtinfo5 libtool libz1 openjdk-8-jdk-headless openjdk-8-jre-headless pkg-config python3 \
|
||||
libssl-dev libstdc++6 libtinfo5 libtool libz1 openjdk-11-jdk-headless openjdk-11-jre-headless pkg-config python3 \
|
||||
unzip wget
|
||||
|
||||
RUN wget -q https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
|
||||
&& unzip -q sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
|
||||
&& rm -f sdk-tools-linux-${ANDROID_SDK_REVISION}.zip
|
||||
RUN PACKAGE_NAME=commandlinetools-linux-${ANDROID_SDK_REVISION}.zip \
|
||||
&& wget -q https://dl.google.com/android/repository/${PACKAGE_NAME} \
|
||||
&& echo "${ANDROID_SDK_HASH} ${PACKAGE_NAME}" | sha256sum -c \
|
||||
&& unzip -q ${PACKAGE_NAME} \
|
||||
&& rm -f ${PACKAGE_NAME}
|
||||
|
||||
RUN wget -q https://dl.google.com/android/repository/android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
|
||||
&& unzip -q android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
|
||||
&& rm -f android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip
|
||||
RUN PACKAGE_NAME=android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
|
||||
&& wget -q https://dl.google.com/android/repository/${PACKAGE_NAME} \
|
||||
&& echo "${ANDROID_NDK_HASH} ${PACKAGE_NAME}" | sha1sum -c \
|
||||
&& unzip -q ${PACKAGE_NAME} \
|
||||
&& rm -f ${PACKAGE_NAME}
|
||||
|
||||
RUN cd ${ANDROID_SDK_ROOT} && echo y | ./bin/sdkmanager "platform-tools" "platforms;${ANDROID_API}" "tools" > /dev/null
|
||||
RUN cp -r ${WORKDIR}/platforms ${WORKDIR}/platform-tools ${ANDROID_SDK_ROOT}
|
||||
RUN echo y | ${ANDROID_SDK_ROOT}/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "build-tools;28.0.3" "platforms;${ANDROID_API}" "tools" > /dev/null
|
||||
|
||||
ENV HOST_PATH=${PATH}
|
||||
ENV PATH=${TOOLCHAIN_DIR}/aarch64-linux-android/bin:${TOOLCHAIN_DIR}/bin:${PATH}
|
||||
|
||||
ARG ZLIB_VERSION=1.2.12
|
||||
ARG ZLIB_HASH=91844808532e5ce316b3c010929493c0244f3d37593afd6de04f71821d5136d9
|
||||
ARG ZLIB_VERSION=1.2.13
|
||||
ARG ZLIB_HASH=b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30
|
||||
RUN wget -q https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \
|
||||
&& echo "${ZLIB_HASH} zlib-${ZLIB_VERSION}.tar.gz" | sha256sum -c \
|
||||
&& tar -xzf zlib-${ZLIB_VERSION}.tar.gz \
|
||||
|
@ -76,7 +79,6 @@ RUN git clone git://code.qt.io/qt/qt5.git -b ${QT_VERSION} --depth 1 \
|
|||
-skip qtpurchasing \
|
||||
-skip qtgamepad -skip qtscript -skip qtdoc \
|
||||
-no-warnings-are-errors \
|
||||
&& sed -i '213,215d' qtbase/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h \
|
||||
&& PATH=${HOST_PATH} make -j${THREADS} \
|
||||
&& PATH=${HOST_PATH} make -j${THREADS} install \
|
||||
&& cd qttools/src/linguist/lrelease \
|
||||
|
@ -99,7 +101,7 @@ RUN wget -q http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz
|
|||
ARG BOOST_VERSION=1_74_0
|
||||
ARG BOOST_VERSION_DOT=1.74.0
|
||||
ARG BOOST_HASH=83bfc1507731a0906e387fc28b7ef5417d591429e51e788417fe9ff025e116b1
|
||||
RUN wget -q https://downloads.sourceforge.net/project/boost/boost/${BOOST_VERSION_DOT}/boost_${BOOST_VERSION}.tar.bz2 \
|
||||
RUN wget -q https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION_DOT}/source/boost_${BOOST_VERSION}.tar.bz2 \
|
||||
&& echo "${BOOST_HASH} boost_${BOOST_VERSION}.tar.bz2" | sha256sum -c \
|
||||
&& tar -xf boost_${BOOST_VERSION}.tar.bz2 \
|
||||
&& rm -f boost_${BOOST_VERSION}.tar.bz2 \
|
||||
|
@ -115,8 +117,8 @@ RUN wget -q https://downloads.sourceforge.net/project/boost/boost/${BOOST_VERSIO
|
|||
install -j${THREADS} \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
ARG OPENSSL_VERSION=1.1.1g
|
||||
ARG OPENSSL_HASH=ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46
|
||||
ARG OPENSSL_VERSION=1.1.1q
|
||||
ARG OPENSSL_HASH=d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca
|
||||
RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \
|
||||
&& echo "${OPENSSL_HASH} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c \
|
||||
&& tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \
|
||||
|
@ -143,8 +145,8 @@ RUN wget https://github.com/libexpat/libexpat/releases/download/R_2_4_1/expat-${
|
|||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
ARG UNBOUND_VERSION=1.13.2
|
||||
ARG UNBOUND_HASH=0a13b547f3b92a026b5ebd0423f54c991e5718037fd9f72445817f6a040e1a83
|
||||
ARG UNBOUND_VERSION=1.16.2
|
||||
ARG UNBOUND_HASH=2e32f283820c24c51ca1dd8afecfdb747c7385a137abe865c99db4b257403581
|
||||
RUN wget https://www.nlnetlabs.nl/downloads/unbound/unbound-${UNBOUND_VERSION}.tar.gz && \
|
||||
echo "${UNBOUND_HASH} unbound-${UNBOUND_VERSION}.tar.gz" | sha256sum -c && \
|
||||
tar -xzf unbound-${UNBOUND_VERSION}.tar.gz && \
|
||||
|
@ -155,8 +157,8 @@ RUN wget https://www.nlnetlabs.nl/downloads/unbound/unbound-${UNBOUND_VERSION}.t
|
|||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
ARG ZMQ_VERSION=v4.3.3
|
||||
ARG ZMQ_HASH=04f5bbedee58c538934374dc45182d8fc5926fa3
|
||||
ARG ZMQ_VERSION=v4.3.4
|
||||
ARG ZMQ_HASH=4097855ddaaa65ed7b5e8cb86d143842a594eebd
|
||||
RUN git clone https://github.com/zeromq/libzmq.git -b ${ZMQ_VERSION} --depth 1 \
|
||||
&& cd libzmq \
|
||||
&& git checkout ${ZMQ_HASH} \
|
||||
|
@ -178,38 +180,42 @@ RUN set -ex \
|
|||
&& make -j${THREADS} install \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgpg-error-1.38 --depth 1 git://git.gnupg.org/libgpg-error.git \
|
||||
RUN git clone -b libgpg-error-1.41 --depth 1 git://git.gnupg.org/libgpg-error.git \
|
||||
&& cd libgpg-error \
|
||||
&& git reset --hard 71d278824c5fe61865f7927a2ed1aa3115f9e439 \
|
||||
&& git reset --hard 98032624ae89a67ee6fe3b1db5d95032e681d163 \
|
||||
&& ./autogen.sh \
|
||||
&& CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --host=aarch64-linux-android --prefix=${PREFIX} --disable-rpath --disable-shared --enable-static --disable-doc --disable-tests \
|
||||
&& PATH=${TOOLCHAIN_DIR}/bin:${HOST_PATH} make -j${THREADS} \
|
||||
&& make -j${THREADS} install \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgcrypt-1.8.5 --depth 1 git://git.gnupg.org/libgcrypt.git \
|
||||
RUN git clone -b libgcrypt-1.10.1 --depth 1 git://git.gnupg.org/libgcrypt.git \
|
||||
&& cd libgcrypt \
|
||||
&& git reset --hard 56606331bc2a80536db9fc11ad53695126007298 \
|
||||
&& git reset --hard ae0e567820c37f9640440b3cff77d7c185aa6742 \
|
||||
&& ./autogen.sh \
|
||||
&& CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --host=aarch64-linux-android --prefix=${PREFIX} --with-gpg-error-prefix=${PREFIX} --disable-shared --enable-static --disable-doc --disable-tests \
|
||||
&& PATH=${TOOLCHAIN_DIR}/bin:${HOST_PATH} make -j${THREADS} \
|
||||
&& make -j${THREADS} install \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
RUN cd tools \
|
||||
&& wget -q http://dl-ssl.google.com/android/repository/tools_r25.2.5-linux.zip \
|
||||
&& unzip -q tools_r25.2.5-linux.zip \
|
||||
&& rm -f tools_r25.2.5-linux.zip \
|
||||
&& echo y | ${ANDROID_SDK_ROOT}/tools/android update sdk --no-ui --all --filter build-tools-28.0.3
|
||||
|
||||
RUN git clone -b v3.19.7 --depth 1 https://github.com/Kitware/CMake \
|
||||
RUN git clone -b v3.24.2 --depth 1 https://github.com/Kitware/CMake \
|
||||
&& cd CMake \
|
||||
&& git reset --hard 22612dd53a46c7f9b4c3f4b7dbe5c78f9afd9581 \
|
||||
&& git reset --hard 31f835410efeea50acd43512eb9e5646a26ea177 \
|
||||
&& PATH=${HOST_PATH} ./bootstrap \
|
||||
&& PATH=${HOST_PATH} make -j${THREADS} \
|
||||
&& PATH=${HOST_PATH} make -j${THREADS} install \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
RUN GRADLE_VERSION=5.6.4 \
|
||||
&& GRADLE_HASH=1f3067073041bc44554d0efe5d402a33bc3d3c93cc39ab684f308586d732a80d \
|
||||
&& wget -q https\://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip \
|
||||
&& echo "${GRADLE_HASH} gradle-${GRADLE_VERSION}-bin.zip" | sha256sum -c \
|
||||
&& GRADLE_LOCAL_PATH=gradle/wrapper/dists/gradle-${GRADLE_VERSION}-bin/bxirm19lnfz6nurbatndyydux \
|
||||
&& mkdir -p ${GRADLE_LOCAL_PATH} \
|
||||
&& mv gradle-${GRADLE_VERSION}-bin.zip ${GRADLE_LOCAL_PATH}
|
||||
|
||||
ENV GRADLE_USER_HOME=${WORKDIR}/gradle
|
||||
|
||||
CMD set -ex \
|
||||
&& cd /monero-gui \
|
||||
&& mkdir -p build/Android/release \
|
||||
|
@ -226,7 +232,9 @@ CMD set -ex \
|
|||
-DBoost_USE_STATIC_RUNTIME=ON \
|
||||
-DLRELEASE_PATH="${PREFIX}/bin" \
|
||||
-DQT_ANDROID_APPLICATION_BINARY="monero-wallet-gui" \
|
||||
-DANDROID_SDK="${ANDROID_SDK_ROOT}" \
|
||||
-DWITH_SCANNER=ON \
|
||||
-DWITH_DESKTOP_ENTRY=OFF \
|
||||
../../.. \
|
||||
&& PATH=${HOST_PATH} make generate_translations_header \
|
||||
&& make -j${THREADS} -C src \
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
FROM ubuntu:16.04
|
||||
|
||||
ARG THREADS=1
|
||||
ARG QT_VERSION=v5.15.4-lts-lgpl
|
||||
ARG QT_VERSION=v5.15.8-lts-lgpl
|
||||
|
||||
ENV CFLAGS="-fPIC"
|
||||
ENV CPPFLAGS="-fPIC"
|
||||
|
@ -55,7 +55,7 @@ RUN git clone -b 0.4.0 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-
|
|||
git reset --hard acf790d7752f36e450d476ad79807d4012ec863b && \
|
||||
git submodule init && \
|
||||
git clone --depth 1 https://gitlab.freedesktop.org/xorg/util/xcb-util-m4 m4 && \
|
||||
git -C m4 reset --hard f662e3a93ebdec3d1c9374382dcc070093a42fed && \
|
||||
git -C m4 reset --hard c617eee22ae5c285e79e81ec39ce96862fd3262f && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
|
@ -66,7 +66,7 @@ RUN git clone -b 0.4.0 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-
|
|||
git reset --hard d882052fb2ce439c6483fce944ba8f16f7294639 && \
|
||||
git submodule init && \
|
||||
git clone --depth 1 https://gitlab.freedesktop.org/xorg/util/xcb-util-m4 m4 && \
|
||||
git -C m4 reset --hard f662e3a93ebdec3d1c9374382dcc070093a42fed && \
|
||||
git -C m4 reset --hard c617eee22ae5c285e79e81ec39ce96862fd3262f && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
|
@ -77,7 +77,7 @@ RUN git clone -b 0.4.0 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-
|
|||
git reset --hard 0e51ee5570a6a80bdf98770b975dfe8a57f4eeb1 && \
|
||||
git submodule init && \
|
||||
git clone --depth 1 https://gitlab.freedesktop.org/xorg/util/xcb-util-m4 m4 && \
|
||||
git -C m4 reset --hard f662e3a93ebdec3d1c9374382dcc070093a42fed && \
|
||||
git -C m4 reset --hard c617eee22ae5c285e79e81ec39ce96862fd3262f && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
|
@ -88,7 +88,7 @@ RUN git clone -b 0.3.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-
|
|||
git reset --hard 0317caf63de532fd7a0493ed6afa871a67253747 && \
|
||||
git submodule init && \
|
||||
git clone --depth 1 https://gitlab.freedesktop.org/xorg/util/xcb-util-m4 m4 && \
|
||||
git -C m4 reset --hard f662e3a93ebdec3d1c9374382dcc070093a42fed && \
|
||||
git -C m4 reset --hard c617eee22ae5c285e79e81ec39ce96862fd3262f && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
|
@ -99,7 +99,7 @@ RUN git clone -b 0.4.1 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-
|
|||
git reset --hard 24eb17df2e1245885e72c9d4bbb0a0f69f0700f2 && \
|
||||
git submodule init && \
|
||||
git clone --depth 1 https://gitlab.freedesktop.org/xorg/util/xcb-util-m4 m4 && \
|
||||
git -C m4 reset --hard f662e3a93ebdec3d1c9374382dcc070093a42fed && \
|
||||
git -C m4 reset --hard c617eee22ae5c285e79e81ec39ce96862fd3262f && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
|
@ -155,40 +155,40 @@ RUN git clone -b release-64-2 --depth 1 https://github.com/unicode-org/icu && \
|
|||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN wget https://downloads.sourceforge.net/project/boost/boost/1.73.0/boost_1_73_0.tar.gz && \
|
||||
echo "9995e192e68528793755692917f9eb6422f3052a53c5e13ba278a228af6c7acf boost_1_73_0.tar.gz" | sha256sum -c && \
|
||||
tar -xzf boost_1_73_0.tar.gz && \
|
||||
rm boost_1_73_0.tar.gz && \
|
||||
cd boost_1_73_0 && \
|
||||
RUN wget https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.gz && \
|
||||
echo "4b2136f98bdd1f5857f1c3dea9ac2018effe65286cf251534b6ae20cc45e1847 boost_1_80_0.tar.gz" | sha256sum -c && \
|
||||
tar -xzf boost_1_80_0.tar.gz && \
|
||||
rm boost_1_80_0.tar.gz && \
|
||||
cd boost_1_80_0 && \
|
||||
./bootstrap.sh && \
|
||||
./b2 --with-atomic --with-system --with-filesystem --with-thread --with-date_time --with-chrono --with-regex --with-serialization --with-program_options --with-locale variant=release link=static runtime-link=static cflags="${CFLAGS}" cxxflags="${CXXFLAGS}" install -a --prefix=/usr && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz && \
|
||||
echo "ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46 openssl-1.1.1g.tar.gz" | sha256sum -c && \
|
||||
tar -xzf openssl-1.1.1g.tar.gz && \
|
||||
rm openssl-1.1.1g.tar.gz && \
|
||||
cd openssl-1.1.1g && \
|
||||
RUN wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz && \
|
||||
echo "d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca openssl-1.1.1q.tar.gz" | sha256sum -c && \
|
||||
tar -xzf openssl-1.1.1q.tar.gz && \
|
||||
rm openssl-1.1.1q.tar.gz && \
|
||||
cd openssl-1.1.1q && \
|
||||
./config no-asm no-shared no-zlib-dynamic --prefix=/usr --openssldir=/usr && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN wget https://github.com/libexpat/libexpat/releases/download/R_2_4_1/expat-2.4.1.tar.bz2 && \
|
||||
echo "2f9b6a580b94577b150a7d5617ad4643a4301a6616ff459307df3e225bcfbf40 expat-2.4.1.tar.bz2" | sha256sum -c && \
|
||||
tar -xf expat-2.4.1.tar.bz2 && \
|
||||
rm expat-2.4.1.tar.bz2 && \
|
||||
cd expat-2.4.1 && \
|
||||
RUN wget https://github.com/libexpat/libexpat/releases/download/R_2_4_8/expat-2.4.8.tar.bz2 && \
|
||||
echo "a247a7f6bbb21cf2ca81ea4cbb916bfb9717ca523631675f99b3d4a5678dcd16 expat-2.4.8.tar.bz2" | sha256sum -c && \
|
||||
tar -xf expat-2.4.8.tar.bz2 && \
|
||||
rm expat-2.4.8.tar.bz2 && \
|
||||
cd expat-2.4.8 && \
|
||||
./configure --enable-static --disable-shared --prefix=/usr && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN wget https://www.nlnetlabs.nl/downloads/unbound/unbound-1.13.2.tar.gz && \
|
||||
echo "0a13b547f3b92a026b5ebd0423f54c991e5718037fd9f72445817f6a040e1a83 unbound-1.13.2.tar.gz" | sha256sum -c && \
|
||||
tar -xzf unbound-1.13.2.tar.gz && \
|
||||
rm unbound-1.13.2.tar.gz && \
|
||||
cd unbound-1.13.2 && \
|
||||
RUN wget https://www.nlnetlabs.nl/downloads/unbound/unbound-1.16.2.tar.gz && \
|
||||
echo "2e32f283820c24c51ca1dd8afecfdb747c7385a137abe865c99db4b257403581 unbound-1.16.2.tar.gz" | sha256sum -c && \
|
||||
tar -xzf unbound-1.16.2.tar.gz && \
|
||||
rm unbound-1.16.2.tar.gz && \
|
||||
cd unbound-1.16.2 && \
|
||||
./configure --disable-shared --enable-static --without-pyunbound --with-libexpat=/usr --with-ssl=/usr --with-libevent=no --without-pythonmodule --disable-flto --with-pthreads --with-libunbound-only --with-pic && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
|
@ -234,62 +234,62 @@ RUN rm /usr/lib/x86_64-linux-gnu/libX11.a && \
|
|||
cd ../../../.. && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v1.0.23 --depth 1 https://github.com/libusb/libusb && \
|
||||
RUN git clone -b v1.0.26 --depth 1 https://github.com/libusb/libusb && \
|
||||
cd libusb && \
|
||||
git reset --hard e782eeb2514266f6738e242cdcb18e3ae1ed06fa && \
|
||||
git reset --hard 4239bc3a50014b8e6a5a2a59df1fff3b7469543b && \
|
||||
./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b hidapi-0.11.0 --depth 1 https://github.com/libusb/hidapi && \
|
||||
RUN git clone -b hidapi-0.13.1 --depth 1 https://github.com/libusb/hidapi && \
|
||||
cd hidapi && \
|
||||
git reset --hard 0ec60c03cbe87cdbfb9fb199c7536fdcbc0a94b8 && \
|
||||
git reset --hard 4ebce6b5059b086d05ca7e091ce04a5fd08ac3ac && \
|
||||
./bootstrap && \
|
||||
./configure --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v4.3.2 --depth 1 https://github.com/zeromq/libzmq && \
|
||||
RUN git clone -b v4.3.4 --depth 1 https://github.com/zeromq/libzmq && \
|
||||
cd libzmq && \
|
||||
git reset --hard a84ffa12b2eb3569ced199660bac5ad128bff1f0 && \
|
||||
git reset --hard 4097855ddaaa65ed7b5e8cb86d143842a594eebd && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --disable-libunwind --with-libsodium && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgpg-error-1.38 --depth 1 git://git.gnupg.org/libgpg-error.git && \
|
||||
RUN git clone -b libgpg-error-1.45 --depth 1 git://git.gnupg.org/libgpg-error.git && \
|
||||
cd libgpg-error && \
|
||||
git reset --hard 71d278824c5fe61865f7927a2ed1aa3115f9e439 && \
|
||||
git reset --hard dbac537e5e865fb6f3aa8596d213aa8c47a9dea1 && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --disable-doc --disable-tests && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgcrypt-1.8.5 --depth 1 git://git.gnupg.org/libgcrypt.git && \
|
||||
RUN git clone -b libgcrypt-1.10.1 --depth 1 git://git.gnupg.org/libgcrypt.git && \
|
||||
cd libgcrypt && \
|
||||
git reset --hard 56606331bc2a80536db9fc11ad53695126007298 && \
|
||||
git reset --hard ae0e567820c37f9640440b3cff77d7c185aa6742 && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --disable-doc && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v3.10.0 --depth 1 https://github.com/protocolbuffers/protobuf && \
|
||||
RUN git clone -b v21.5 --depth 1 https://github.com/protocolbuffers/protobuf && \
|
||||
cd protobuf && \
|
||||
git reset --hard 6d4e7fd7966c989e38024a8ea693db83758944f1 && \
|
||||
git reset --hard ab840345966d0fa8e7100d771c92a73bfbadd25c && \
|
||||
./autogen.sh && \
|
||||
./configure --enable-static --disable-shared && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v3.18.4 --depth 1 https://github.com/Kitware/CMake && \
|
||||
RUN git clone -b v3.24.0 --depth 1 https://github.com/Kitware/CMake && \
|
||||
cd CMake && \
|
||||
git reset --hard 3cc3d42aba879fff5e85b363ae8f21386a3f9f9b && \
|
||||
git reset --hard 4be24f031a4829db75b85062cc67125035d8831e && \
|
||||
./bootstrap && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
FROM ubuntu:20.04
|
||||
|
||||
ARG THREADS=1
|
||||
ARG QT_VERSION=v5.15.4-lts-lgpl
|
||||
ARG QT_VERSION=v5.15.8-lts-lgpl
|
||||
ENV SOURCE_DATE_EPOCH=1397818193
|
||||
|
||||
RUN apt update && \
|
||||
|
@ -12,9 +12,9 @@ RUN apt update && \
|
|||
RUN update-alternatives --set x86_64-w64-mingw32-g++ $(which x86_64-w64-mingw32-g++-posix) && \
|
||||
update-alternatives --set x86_64-w64-mingw32-gcc $(which x86_64-w64-mingw32-gcc-posix)
|
||||
|
||||
RUN git clone -b v0.17.3.0 --depth 1 https://github.com/monero-project/monero && \
|
||||
RUN git clone -b v0.18.2.0 --depth 1 https://github.com/monero-project/monero && \
|
||||
cd monero && \
|
||||
git reset --hard ab18fea3500841fc312630d49ed6840b3aedb34d && \
|
||||
git reset --hard 99be9a044f3854f339548e2d99c539c18d7b1b01 && \
|
||||
cp -a contrib/depends / && \
|
||||
cd .. && \
|
||||
rm -rf monero
|
||||
|
|
|
@ -120,7 +120,7 @@ Rectangle {
|
|||
width: 260
|
||||
height: 135
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: MoneroComponents.Style.blackTheme ? "qrc:///images/card-background-black.png" : "qrc:///images/card-background-white.png"
|
||||
source: MoneroComponents.Style.blackTheme ? "qrc:///images/card-background-black" + (currentAccountIndex % MoneroComponents.Style.accountColors.length) + ".png" : "qrc:///images/card-background-white.png"
|
||||
}
|
||||
|
||||
DropShadow {
|
||||
|
|
20
README.md
|
@ -1,6 +1,6 @@
|
|||
# Monero GUI
|
||||
|
||||
Copyright (c) 2014-2019, The Monero Project
|
||||
Copyright (c) 2014-2022, The Monero Project
|
||||
|
||||
## Table of Contents
|
||||
* [Development resources](#development-resources)
|
||||
|
@ -108,7 +108,7 @@ Packaging for your favorite distribution would be a welcome contribution!
|
|||
```
|
||||
git clone --branch master --recursive https://github.com/monero-project/monero-gui.git
|
||||
```
|
||||
\* `master` - replace with the desired version tag (e.g. `v0.17.1.9`) to build the release binaries.
|
||||
\* `master` - replace with the desired version tag (e.g. `v0.18.2.0`) to build the release binaries.
|
||||
3. Prepare build environment
|
||||
```
|
||||
cd monero-gui
|
||||
|
@ -131,7 +131,7 @@ Packaging for your favorite distribution would be a welcome contribution!
|
|||
```
|
||||
git clone --branch master --recursive https://github.com/monero-project/monero-gui.git
|
||||
```
|
||||
\* `master` - replace with the desired version tag (e.g. `v0.17.1.9`) to build the release binaries.
|
||||
\* `master` - replace with the desired version tag (e.g. `v0.18.2.0`) to build the release binaries.
|
||||
3. Prepare build environment
|
||||
```
|
||||
cd monero-gui
|
||||
|
@ -213,7 +213,7 @@ Packaging for your favorite distribution would be a welcome contribution!
|
|||
|
||||
- For Gentoo
|
||||
|
||||
`sudo emerge app-arch/xz-utils app-doc/doxygen dev-cpp/gtest dev-libs/boost dev-libs/expat dev-libs/openssl dev-util/cmake media-gfx/graphviz net-dns/unbound net-libs/ldns net-libs/miniupnpc net-libs/zeromq sys-libs/libunwind dev-libs/libsodium dev-libs/hidapi dev-libs/libgcrypt`
|
||||
`sudo emerge app-arch/xz-utils app-doc/doxygen dev-cpp/gtest dev-libs/boost dev-libs/expat dev-libs/openssl dev-util/cmake media-gfx/graphviz net-dns/unbound net-libs/miniupnpc net-libs/zeromq sys-libs/libunwind dev-libs/libsodium dev-libs/hidapi dev-libs/libgcrypt`
|
||||
|
||||
- For Fedora
|
||||
|
||||
|
@ -221,15 +221,15 @@ Packaging for your favorite distribution would be a welcome contribution!
|
|||
|
||||
2. Install Qt:
|
||||
|
||||
*Note*: The Qt 5.9.7 or newer requirement makes **some** distributions (mostly based on debian, like Ubuntu 16.x or Linux Mint 18.x) obsolete due to their repositories containing an older Qt version.
|
||||
*Note*: The Qt 5.9.7 or newer requirement makes **some** distributions (mostly based on Debian, like Ubuntu 16.x or Linux Mint 18.x) obsolete due to their repositories containing an older Qt version.
|
||||
|
||||
The recommended way is to install 5.9.7 from the [official Qt installer](https://www.qt.io/download-qt-installer) or [compiling it yourself](https://wiki.qt.io/Install_Qt_5_on_Ubuntu). This ensures you have the correct version. Higher versions *can* work but as it differs from our production build target, slight differences may occur.
|
||||
|
||||
The following instructions will fetch Qt from your distribution's repositories instead. Take note of what version it installs. Your mileage may vary.
|
||||
|
||||
- For Ubuntu 17.10+
|
||||
- For Debian distributions (Debian, Ubuntu, Mint, Tails...)
|
||||
|
||||
`sudo apt install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtqml-models2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-platform qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev`
|
||||
`sudo apt install qtbase5-dev qtdeclarative5-dev qml-module-qtqml-models2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-platform qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev`
|
||||
|
||||
- For Gentoo
|
||||
|
||||
|
@ -240,7 +240,7 @@ The following instructions will fetch Qt from your distribution's repositories i
|
|||
|
||||
- Optional : To build the flag `WITH_SCANNER`
|
||||
|
||||
- For Ubuntu
|
||||
- For Debian distributions (Debian, Ubuntu, Mint, Tails...)
|
||||
|
||||
`sudo apt install qtmultimedia5-dev qml-module-qtmultimedia`
|
||||
|
||||
|
@ -283,7 +283,7 @@ The executable can be found in the build/release/bin folder.
|
|||
|
||||
3. Install [monero](https://github.com/monero-project/monero) dependencies:
|
||||
|
||||
`brew install cmake pkg-config openssl boost unbound hidapi zmq libpgm libsodium miniupnpc ldns expat libunwind-headers protobuf libgcrypt`
|
||||
`brew install cmake pkg-config openssl boost unbound hidapi zmq libpgm libsodium miniupnpc expat libunwind-headers protobuf libgcrypt`
|
||||
|
||||
4. Install Qt:
|
||||
|
||||
|
@ -319,7 +319,7 @@ The Monero GUI on Windows is 64 bits only; 32-bit Windows GUI builds are not off
|
|||
3. Install MSYS2 packages for Monero dependencies; the needed 64-bit packages have `x86_64` in their names
|
||||
|
||||
```
|
||||
pacman -S mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-protobuf-c mingw-w64-x86_64-libusb mingw-w64-x86_64-libgcrypt
|
||||
pacman -S mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-protobuf-c mingw-w64-x86_64-libusb mingw-w64-x86_64-libgcrypt mingw-w64-x86_64-unbound
|
||||
```
|
||||
|
||||
You find more details about those dependencies in the [Monero documentation](https://github.com/monero-project/monero). Note that that there is no more need to compile Boost from source; like everything else, you can install it now with a MSYS2 package.
|
||||
|
|
|
@ -42,7 +42,7 @@ if(APPLE OR (WIN32 AND NOT STATIC))
|
|||
zlib1.dll
|
||||
libzstd.dll
|
||||
libwinpthread-1.dll
|
||||
libtiff-5.dll
|
||||
libtiff-6.dll
|
||||
libstdc++-6.dll
|
||||
libpng16-16.dll
|
||||
libpcre16-0.dll
|
||||
|
@ -69,24 +69,24 @@ if(APPLE OR (WIN32 AND NOT STATIC))
|
|||
#platform files
|
||||
libgcc_s_seh-1.dll
|
||||
#openssl files
|
||||
libssl-1_1-x64.dll
|
||||
libcrypto-1_1-x64.dll
|
||||
libssl-3-x64.dll
|
||||
libcrypto-3-x64.dll
|
||||
)
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
list(APPEND WIN_DEPLOY_DLLS
|
||||
libicudtd69.dll
|
||||
libicuind69.dll
|
||||
libicuiod69.dll
|
||||
libicutud69.dll
|
||||
libicuucd69.dll
|
||||
libicudtd72.dll
|
||||
libicuind72.dll
|
||||
libicuiod72.dll
|
||||
libicutud72.dll
|
||||
libicuucd72.dll
|
||||
)
|
||||
else() # assume release
|
||||
list(APPEND WIN_DEPLOY_DLLS
|
||||
libicudt69.dll
|
||||
libicuin69.dll
|
||||
libicuio69.dll
|
||||
libicutu69.dll
|
||||
libicuuc69.dll
|
||||
libicudt72.dll
|
||||
libicuin72.dll
|
||||
libicuio72.dll
|
||||
libicutu72.dll
|
||||
libicuuc72.dll
|
||||
)
|
||||
endif()
|
||||
list(TRANSFORM WIN_DEPLOY_DLLS PREPEND "$ENV{MSYSTEM_PREFIX}/bin/")
|
||||
|
|
|
@ -32,6 +32,7 @@ import QtQuick.Dialogs 1.2
|
|||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
import QtQuick.Window 2.0
|
||||
import moneroComponents.Wallet 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
|
@ -79,6 +80,10 @@ Window {
|
|||
running: false;
|
||||
repeat: true
|
||||
onTriggered: {
|
||||
if (currentWallet.connected() == Wallet.ConnectionStatus_Connected) {
|
||||
running = false;
|
||||
root.close();
|
||||
}
|
||||
countDown--;
|
||||
if(countDown < 0){
|
||||
running = false;
|
||||
|
|
|
@ -66,7 +66,7 @@ Item {
|
|||
anchors.fill: parent
|
||||
color: buttonArea.containsMouse ? MoneroComponents.Style.buttonInlineBackgroundColorHover : MoneroComponents.Style.buttonInlineBackgroundColor
|
||||
radius: 4
|
||||
|
||||
border.width: parent.focus && parent.enabled ? 1 : 0
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: inlineText
|
||||
|
|
|
@ -40,6 +40,8 @@ ColumnLayout {
|
|||
default property alias content: inlineButtons.children
|
||||
|
||||
property alias input: input
|
||||
property bool inputHasFocus: input.activeFocus
|
||||
property bool tabNavigationEnabled: true
|
||||
property alias text: input.text
|
||||
|
||||
property int inputPaddingLeft: 10
|
||||
|
@ -109,6 +111,8 @@ ColumnLayout {
|
|||
signal editingFinished();
|
||||
signal accepted();
|
||||
signal textUpdated();
|
||||
signal backtabPressed();
|
||||
signal tabPressed();
|
||||
|
||||
onActiveFocusChanged: activeFocus && input.forceActiveFocus()
|
||||
onTextUpdated: {
|
||||
|
@ -212,8 +216,18 @@ ColumnLayout {
|
|||
|
||||
MoneroComponents.Input {
|
||||
id: input
|
||||
KeyNavigation.backtab: item.KeyNavigation.backtab
|
||||
KeyNavigation.tab: item.KeyNavigation.tab
|
||||
Keys.onBacktabPressed: {
|
||||
item.backtabPressed();
|
||||
if (item.KeyNavigation.backtab) {
|
||||
item.KeyNavigation.backtab.forceActiveFocus()
|
||||
}
|
||||
}
|
||||
Keys.onTabPressed: {
|
||||
item.tabPressed();
|
||||
if (item.KeyNavigation.tab) {
|
||||
item.KeyNavigation.tab.forceActiveFocus()
|
||||
}
|
||||
}
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: inputHeight
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ Rectangle {
|
|||
anchors.leftMargin: 20
|
||||
height: parent.height
|
||||
width: 2
|
||||
color: button.checked ? MoneroComponents.Style.buttonBackgroundColor : "transparent"
|
||||
color: button.checked ? MoneroComponents.Style.accountColors[currentAccountIndex % MoneroComponents.Style.accountColors.length] : "transparent"
|
||||
|
||||
// button text
|
||||
MoneroComponents.TextPlain {
|
||||
|
|
|
@ -201,6 +201,7 @@ Rectangle {
|
|||
daemonManager.sendCommandAsync(
|
||||
["set_bootstrap_daemon", "auto"],
|
||||
appWindow.currentWallet.nettype,
|
||||
persistentSettings.blockchainDataDir,
|
||||
callback);
|
||||
|
||||
refreshMouseArea.visible = false;
|
||||
|
|
|
@ -81,6 +81,7 @@ QtObject {
|
|||
property string leftPanelBackgroundGradientStart: blackTheme ? _b_leftPanelBackgroundGradientStart : _w_leftPanelBackgroundGradientStart
|
||||
property string leftPanelBackgroundGradientStop: blackTheme ? _b_leftPanelBackgroundGradientStop : _w_leftPanelBackgroundGradientStop
|
||||
property string historyHeaderTextColor: blackTheme ? _b_historyHeaderTextColor : _w_historyHeaderTextColor
|
||||
property var accountColors: blackTheme ? _b_accountColors : _w_accountColors
|
||||
|
||||
property string _b_defaultFontColor: "white"
|
||||
property string _b_dimmedFontColor: "#BBBBBB"
|
||||
|
@ -142,6 +143,7 @@ QtObject {
|
|||
property string _b_leftPanelBackgroundGradientStart: "#222222"
|
||||
property string _b_leftPanelBackgroundGradientStop: "#1a1a1a"
|
||||
property string _b_historyHeaderTextColor: "#C0C0C0"
|
||||
property var _b_accountColors: ["#6E513C", "#842129", "#458421", "#742184", "#291DBE", "#846F21", "#217F84", "#696969"]
|
||||
|
||||
property string _w_defaultFontColor: "black"
|
||||
property string _w_dimmedFontColor: "#3f3f3f"
|
||||
|
@ -203,4 +205,5 @@ QtObject {
|
|||
property string _w_leftPanelBackgroundGradientStart: "white"
|
||||
property string _w_leftPanelBackgroundGradientStop: "#f5f5f5"
|
||||
property string _w_historyHeaderTextColor: "#515151"
|
||||
property var _w_accountColors: ["#6E513C", "#6E513C", "#842129", "#458421", "#742184", "#291DBE", "#846F21", "#217F84", "#696969"]
|
||||
}
|
||||
|
|
|
@ -21,6 +21,14 @@ Text {
|
|||
font.pixelSize: 14
|
||||
textFormat: Text.PlainText
|
||||
|
||||
Rectangle {
|
||||
width: root.contentWidth
|
||||
height: root.height
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
color: root.focus ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
|
||||
}
|
||||
|
||||
MoneroEffects.ColorTransition {
|
||||
enabled: root.themeTransition
|
||||
themeTransition: root.themeTransition
|
||||
|
|
|
@ -54,6 +54,7 @@ Object {
|
|||
property string key : "\uf084"
|
||||
property string language : "\uf1ab"
|
||||
property string lock : "\uf023"
|
||||
property string magnifyingGlass : "\uf002"
|
||||
property string minus : "\uf068"
|
||||
property string minusCircle : "\uf056"
|
||||
property string moonO : "\uf186"
|
||||
|
|
0
images/card-background-black.png → images/card-background-black0.png
Executable file → Normal file
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
0
images/card-background-black@2x.png → images/card-background-black0@2x.png
Executable file → Normal file
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
BIN
images/card-background-black1.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
images/card-background-black1@2x.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
images/card-background-black2.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
images/card-background-black2@2x.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
images/card-background-black3.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
images/card-background-black3@2x.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
images/card-background-black4.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
images/card-background-black4@2x.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
images/card-background-black5.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
images/card-background-black5@2x.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
images/card-background-black6.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
images/card-background-black6@2x.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
images/card-background-black7.png
Normal file
After Width: | Height: | Size: 7 KiB |
BIN
images/card-background-black7@2x.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
images/verify-white.png
Normal file
After Width: | Height: | Size: 956 B |
BIN
images/verify-white@2x.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
images/verify.png
Normal file
After Width: | Height: | Size: 854 B |
BIN
images/verify@2x.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
images/write-down-white.png
Normal file
After Width: | Height: | Size: 779 B |
BIN
images/write-down-white@2x.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
images/write-down.png
Normal file
After Width: | Height: | Size: 728 B |
BIN
images/write-down@2x.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
|
@ -1,4 +1,4 @@
|
|||
; Monero Oxygen Orion GUI Wallet Installer for Windows
|
||||
; Monero Fluorine Fermi GUI Wallet Installer for Windows
|
||||
; Copyright (c) 2017-2020, The Monero Project
|
||||
; See LICENSE
|
||||
#define GuiVersion GetFileVersion("bin\monero-wallet-gui.exe")
|
||||
|
@ -16,7 +16,7 @@ DefaultGroupName=Monero GUI Wallet
|
|||
UninstallDisplayIcon={app}\monero-wallet-gui.exe
|
||||
PrivilegesRequired=admin
|
||||
ArchitecturesInstallIn64BitMode=x64
|
||||
ArchitecturesAllowed=x64
|
||||
ArchitecturesAllowed=x64 arm64
|
||||
WizardSmallImageFile=WizardSmallImage.bmp
|
||||
WizardImageFile=WelcomeImage.bmp
|
||||
DisableWelcomePage=no
|
||||
|
|
|
@ -6,7 +6,7 @@ Copyright (c) 2017-2020, The Monero Project
|
|||
|
||||
This is a *Inno Setup* script `Monero.iss` plus some related files
|
||||
that allows you to build a standalone Windows installer (.exe) for
|
||||
the GUI wallet that comes with the Oxygen Orion release of Monero.
|
||||
the GUI wallet that comes with the Fluorine Fermi release of Monero.
|
||||
|
||||
This turns the GUI wallet into a more or less standard Windows program,
|
||||
by default installed into a subdirectory of `C:\Program Files`, a
|
||||
|
@ -18,7 +18,7 @@ Monero.
|
|||
As the setup script in file [Monero.iss](Monero.iss) has to list many
|
||||
files and directories of the GUI wallet package to install by name,
|
||||
this version of the script only works with exactly the GUI wallet
|
||||
for Monero release *Oxygen Orion* that you find on
|
||||
for Monero release *Fluorine Fermi* that you find on
|
||||
[the official download page](https://getmonero.org/downloads/).
|
||||
|
||||
It should however be easy to modify the script for future
|
||||
|
@ -39,8 +39,8 @@ Note that the installer build process is now reproducible / deterministic. For d
|
|||
The build steps in detail:
|
||||
|
||||
1. Install *Inno Setup*. You can get it from [here](http://www.jrsoftware.org/isdl.php)
|
||||
2. Get the Inno Setup script plus related files by cloning the whole [monero-gui GitHub repository](https://github.com/monero-project/monero-gui); you will only need the files in the installer directory `installers\windows` however. Depending on development state, additionally instead of simply using `master` you may have to checkout a specific branch, like `release-v0.17`.
|
||||
3. The setup script is written to take the GUI wallet files from a subdirectory named `bin`; so create `installers\windows\bin`, get the zip file of the GUI wallet from [here](https://getmonero.org/downloads/), unpack it somewhere, and copy all the files and subdirectories in the single subdirectory there (currently named `monero-gui-0.17.0.0`) to this `bin` subdirectory
|
||||
2. Get the Inno Setup script plus related files by cloning the whole [monero-gui GitHub repository](https://github.com/monero-project/monero-gui); you will only need the files in the installer directory `installers\windows` however.
|
||||
3. The setup script is written to take the GUI wallet files from a subdirectory named `bin`; so create `installers\windows\bin`, get the zip file of the GUI wallet from [here](https://getmonero.org/downloads/), unpack it somewhere, and copy all the files and subdirectories in the single subdirectory there (currently named `monero-gui-0.18.0.0`) to this `bin` subdirectory
|
||||
4. Start Inno Setup, load `Monero.iss` and compile it
|
||||
5. The result i.e. the finished installer will be the file `mysetup.exe` in the `installers\windows\Output` subdirectory
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Monero Oxygen Orion GUI Wallet</title>
|
||||
<title>Monero Fluorine Fermi GUI Wallet</title>
|
||||
</head>
|
||||
|
||||
<body style="font-family: Arial, Helvetica, sans-serif">
|
||||
<h1>Monero Oxygen Orion GUI Wallet</h1>
|
||||
<h1>Monero Fluorine Fermi GUI Wallet</h1>
|
||||
|
||||
<p>Copyright (c) 2014-2020, The Monero Project</p>
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
|||
|
||||
<h2>Content of the Package</h2>
|
||||
|
||||
<p>You just installed the <i>Monero GUI wallet</i> for Windows, release Oxygen Orion, version {#GuiVersion}.
|
||||
<p>You just installed the <i>Monero GUI wallet</i> for Windows, release Fluorine Fermi, version {#GuiVersion}.
|
||||
The wallet enables you to send and receive Moneroj in a secure and very private way.
|
||||
</p>
|
||||
|
||||
|
|
Before Width: | Height: | Size: 440 KiB After Width: | Height: | Size: 440 KiB |
|
@ -71,9 +71,8 @@ function checkSignature(signature) {
|
|||
|
||||
function isValidOpenAliasAddress(address) {
|
||||
address = address.trim()
|
||||
var dot = address.indexOf('.')
|
||||
if (dot < 0)
|
||||
return false
|
||||
// we can get an awful lot of valid domains, including non ASCII chars... accept anything
|
||||
return true
|
||||
// there should be something after the .
|
||||
// make sure it is not some kind of floating number
|
||||
return address.length > 2 && isNaN(parseFloat(address)) && address.indexOf('.') >= 0
|
||||
}
|
||||
|
|
10
js/Utils.js
|
@ -57,12 +57,12 @@ function ago(epoch) {
|
|||
|
||||
if(delta < 60)
|
||||
return qsTr("%n second(s) ago", "0", Math.floor(delta))
|
||||
else if (delta >= 60 && delta <= 3600)
|
||||
else if (delta < 3600)
|
||||
return qsTr("%n minute(s) ago", "0", Math.floor(delta / 60))
|
||||
else if (delta >= 3600 && delta <= 86400)
|
||||
return qsTr("%n hour(s) ago", "0", Math.floor(delta / 60 / 60))
|
||||
else if (delta >= 86400)
|
||||
return qsTr("%n day(s) ago", "0", Math.floor(delta / 24 / 60 / 60))
|
||||
else if (delta < 86400)
|
||||
return qsTr("%n hour(s) ago", "0", Math.floor(delta / 3600))
|
||||
else
|
||||
return qsTr("%n day(s) ago", "0", Math.floor(delta / 86400))
|
||||
}
|
||||
|
||||
function netTypeToString(){
|
||||
|
|
47
main.qml
|
@ -94,7 +94,7 @@ ApplicationWindow {
|
|||
readonly property string localDaemonAddress : "localhost:" + getDefaultDaemonRpcPort(persistentSettings.nettype)
|
||||
property string currentDaemonAddress;
|
||||
property int disconnectedEpoch: 0
|
||||
property int estimatedBlockchainSize: persistentSettings.pruneBlockchain ? 40 : 105 // GB
|
||||
property int estimatedBlockchainSize: persistentSettings.pruneBlockchain ? 55 : 150 // GB
|
||||
property alias viewState: rootItem.state
|
||||
property string prevSplashText;
|
||||
property bool splashDisplayedBeforeButtonRequest;
|
||||
|
@ -469,7 +469,7 @@ ApplicationWindow {
|
|||
|
||||
// If wallet isnt connected, advanced wallet mode and no daemon is running - Ask
|
||||
if (appWindow.walletMode >= 2 && !persistentSettings.useRemoteNode && !walletInitialized && disconnected) {
|
||||
daemonManager.runningAsync(persistentSettings.nettype, function(running) {
|
||||
daemonManager.runningAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, function(running) {
|
||||
if (!running) {
|
||||
daemonManagerDialog.open();
|
||||
}
|
||||
|
@ -481,7 +481,9 @@ ApplicationWindow {
|
|||
walletInitialized = true
|
||||
|
||||
// check if daemon was already mining and add mining logo if true
|
||||
middlePanel.advancedView.miningView.update();
|
||||
if (!persistentSettings.useRemoteNode || persistentSettings.allowRemoteNodeMining) {
|
||||
middlePanel.advancedView.miningView.update();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -600,6 +602,9 @@ ApplicationWindow {
|
|||
function connectRemoteNode() {
|
||||
console.log("connecting remote node");
|
||||
|
||||
p2poolManager.exit();
|
||||
p2poolManager.getStatus();
|
||||
|
||||
const callback = function() {
|
||||
persistentSettings.useRemoteNode = true;
|
||||
const remoteNode = remoteNodesModel.currentRemoteNode();
|
||||
|
@ -628,6 +633,10 @@ ApplicationWindow {
|
|||
return;
|
||||
|
||||
console.log("disconnecting remote node");
|
||||
|
||||
p2poolManager.exit();
|
||||
p2poolManager.getStatus();
|
||||
|
||||
persistentSettings.useRemoteNode = false;
|
||||
currentDaemonAddress = localDaemonAddress
|
||||
currentWallet.setDaemonLogin("", "");
|
||||
|
@ -692,7 +701,8 @@ ApplicationWindow {
|
|||
// Daemon connected
|
||||
leftPanel.networkStatus.connected = currentWallet ? currentWallet.connected() : Wallet.ConnectionStatus_Disconnected
|
||||
|
||||
currentWallet.refreshHeightAsync();
|
||||
if (currentWallet)
|
||||
currentWallet.refreshHeightAsync();
|
||||
}
|
||||
|
||||
function startDaemon(flags){
|
||||
|
@ -712,7 +722,7 @@ ApplicationWindow {
|
|||
appWindow.showProcessingSplash(qsTr("Waiting for daemon to stop..."));
|
||||
}
|
||||
p2poolManager.exit()
|
||||
daemonManager.stopAsync(persistentSettings.nettype, function(result) {
|
||||
daemonManager.stopAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, function(result) {
|
||||
daemonStartStopInProgress = 0;
|
||||
if (splash) {
|
||||
hideProcessingSplash();
|
||||
|
@ -745,6 +755,12 @@ ApplicationWindow {
|
|||
currentWallet.startRefresh();
|
||||
informationPopup.title = qsTr("Daemon failed to start") + translationManager.emptyString;
|
||||
informationPopup.text = error + ".\n\n" + qsTr("Please check your wallet and daemon log for errors. You can also try to start %1 manually.").arg((isWindows)? "monerod.exe" : "monerod")
|
||||
if (middlePanel.advancedView.miningView.stopMiningEnabled == true) {
|
||||
walletManager.stopMining()
|
||||
p2poolManager.exit()
|
||||
middlePanel.advancedView.miningView.update()
|
||||
informationPopup.text += qsTr("\n\nExiting p2pool. Please check that port 18083 is available.") + translationManager.emptyString;
|
||||
}
|
||||
informationPopup.icon = StandardIcon.Critical
|
||||
informationPopup.onCloseCallback = null
|
||||
informationPopup.open();
|
||||
|
@ -1116,6 +1132,7 @@ ApplicationWindow {
|
|||
middlePanel.transferView.clearFields();
|
||||
middlePanel.receiveView.clearFields();
|
||||
middlePanel.historyView.clearFields();
|
||||
middlePanel.advancedView.clearFields();
|
||||
// disable timers
|
||||
userInActivityTimer.running = false;
|
||||
});
|
||||
|
@ -1364,6 +1381,7 @@ ApplicationWindow {
|
|||
}
|
||||
|
||||
property bool askDesktopShortcut: isLinux
|
||||
property bool askStopLocalNode: true
|
||||
property string language: 'English (US)'
|
||||
property string language_wallet: 'English'
|
||||
property string locale: 'en_US'
|
||||
|
@ -1392,7 +1410,7 @@ ApplicationWindow {
|
|||
property bool historyShowAdvanced: false
|
||||
property bool historyHumanDates: true
|
||||
property string blockchainDataDir: ""
|
||||
property bool useRemoteNode: false
|
||||
property bool useRemoteNode: isAndroid
|
||||
property string remoteNodeAddress: "" // TODO: drop after v0.17.2.0 release
|
||||
property string remoteNodesSerialized: JSON.stringify({
|
||||
selected: 0,
|
||||
|
@ -1442,8 +1460,15 @@ ApplicationWindow {
|
|||
function getWalletProxyAddress() {
|
||||
if (!useRemoteNode) {
|
||||
return "";
|
||||
} else {
|
||||
const remoteAddress = remoteNodesModel.currentRemoteNode().address;
|
||||
// skip proxy when using localhost remote node
|
||||
if (remoteAddress.startsWith("127.0.0.1:") || remoteAddress.startsWith("localhost:")) {
|
||||
return "";
|
||||
} else {
|
||||
return getProxyAddress();
|
||||
}
|
||||
}
|
||||
return getProxyAddress();
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
|
@ -2031,7 +2056,7 @@ ApplicationWindow {
|
|||
return;
|
||||
}
|
||||
|
||||
const simpleModeFlags = "--enable-dns-blocklist --out-peers 16";
|
||||
const simpleModeFlags = "--enable-dns-blocklist --out-peers 16 --no-igd";
|
||||
if (appWindow.daemonRunning) {
|
||||
appWindow.stopDaemon(function() {
|
||||
appWindow.startDaemon(simpleModeFlags)
|
||||
|
@ -2128,7 +2153,7 @@ ApplicationWindow {
|
|||
showProcessingSplash(qsTr("Checking local node status..."));
|
||||
const handler = function(running) {
|
||||
hideProcessingSplash();
|
||||
if (running) {
|
||||
if (running && persistentSettings.askStopLocalNode) {
|
||||
showDaemonIsRunningDialog(closeAccepted);
|
||||
} else {
|
||||
closeAccepted();
|
||||
|
@ -2138,7 +2163,7 @@ ApplicationWindow {
|
|||
if (currentWallet) {
|
||||
handler(!currentWallet.disconnected);
|
||||
} else {
|
||||
daemonManager.runningAsync(persistentSettings.nettype, handler);
|
||||
daemonManager.runningAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2253,7 +2278,7 @@ ApplicationWindow {
|
|||
}
|
||||
|
||||
function getDefaultDaemonRpcPort(networkType) {
|
||||
switch (networkType) {
|
||||
switch (parseInt(networkType)) {
|
||||
case NetworkType.STAGENET:
|
||||
return 38081;
|
||||
case NetworkType.TESTNET:
|
||||
|
|
2
monero
|
@ -1 +1 @@
|
|||
Subproject commit 424e4de16b98506170db7b0d7d87a79ccf541744
|
||||
Subproject commit 99be9a044f3854f339548e2d99c539c18d7b1b01
|
|
@ -238,7 +238,7 @@ Rectangle {
|
|||
Layout.fillHeight: true
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
color: "darkgrey"
|
||||
color: MoneroComponents.Style.accountColors[currentAccountIndex % MoneroComponents.Style.accountColors.length]
|
||||
width: 2
|
||||
}
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@ ColumnLayout {
|
|||
spacing: 0
|
||||
property int panelHeight: 900
|
||||
property alias miningView: stateView.miningView
|
||||
property alias signView: stateView.signView
|
||||
property alias state: stateView.state
|
||||
|
||||
MoneroComponents.Navbar {
|
||||
|
@ -52,6 +53,7 @@ ColumnLayout {
|
|||
active: state == "Mining"
|
||||
text: qsTr("Mining") + translationManager.emptyString
|
||||
onSelected: state = "Mining"
|
||||
visible: !isAndroid
|
||||
}
|
||||
MoneroComponents.NavbarItem {
|
||||
active: state == "Prove"
|
||||
|
@ -81,7 +83,7 @@ ColumnLayout {
|
|||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: panelHeight
|
||||
color: "transparent"
|
||||
state: "Mining"
|
||||
state: isAndroid ? "Prove" : "Mining"
|
||||
|
||||
onCurrentViewChanged: {
|
||||
if (previousView) {
|
||||
|
@ -120,7 +122,7 @@ ColumnLayout {
|
|||
|
||||
StackView {
|
||||
id: stackView
|
||||
initialItem: stateView.miningView
|
||||
initialItem: isAndroid ? stateView.prooveView : stateView.miningView
|
||||
anchors.fill: parent
|
||||
clip: false // otherwise animation will affect left panel
|
||||
|
||||
|
@ -146,4 +148,9 @@ ColumnLayout {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
function clearFields() {
|
||||
signView.clearFields();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1765,18 +1765,25 @@ Rectangle {
|
|||
var written = currentWallet.history.writeCSV(currentWallet.currentSubaddressAccount, dataDir);
|
||||
|
||||
if(written !== ""){
|
||||
informationPopup.title = qsTr("Success") + translationManager.emptyString;
|
||||
confirmationDialog.title = qsTr("Success") + translationManager.emptyString;
|
||||
var text = qsTr("CSV file written to: %1").arg(written) + "\n\n"
|
||||
text += qsTr("Tip: Use your favorite spreadsheet software to sort on blockheight.") + "\n\n" + translationManager.emptyString;
|
||||
informationPopup.text = text;
|
||||
informationPopup.icon = StandardIcon.Information;
|
||||
confirmationDialog.text = text;
|
||||
confirmationDialog.icon = StandardIcon.Information;
|
||||
confirmationDialog.cancelText = qsTr("Open folder") + translationManager.emptyString;
|
||||
confirmationDialog.onAcceptedCallback = null;
|
||||
confirmationDialog.onRejectedCallback = function() {
|
||||
oshelper.openContainingFolder(written);
|
||||
}
|
||||
confirmationDialog.open();
|
||||
} else {
|
||||
informationPopup.title = qsTr("Error") + translationManager.emptyString;
|
||||
informationPopup.text = qsTr("Error exporting transaction data.") + "\n\n" + translationManager.emptyString;
|
||||
informationPopup.icon = StandardIcon.Critical;
|
||||
informationPopup.onCloseCallback = null;
|
||||
informationPopup.open();
|
||||
|
||||
}
|
||||
informationPopup.onCloseCallback = null;
|
||||
informationPopup.open();
|
||||
}
|
||||
Component.onCompleted: {
|
||||
var _folder = 'file://' + appWindow.accountsDir;
|
||||
|
|
|
@ -41,7 +41,8 @@ Rectangle {
|
|||
property alias miningHeight: mainLayout.height
|
||||
property double currentHashRate: 0
|
||||
property int threads: idealThreadCount / 2
|
||||
|
||||
property alias stopMiningEnabled: stopSoloMinerButton.enabled
|
||||
property string args: ""
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
Layout.fillWidth: true
|
||||
|
@ -293,11 +294,12 @@ Rectangle {
|
|||
var success;
|
||||
if (persistentSettings.allow_p2pool_mining) {
|
||||
if (p2poolManager.isInstalled()) {
|
||||
if (persistentSettings.allowRemoteNodeMining) {
|
||||
args = daemonManager.getArgs(persistentSettings.blockchainDataDir) //updates arguments
|
||||
if (persistentSettings.allowRemoteNodeMining || (args.includes("--zmq-pub tcp://127.0.0.1:18083") || args.includes("--zmq-pub=tcp://127.0.0.1:18083")) && !args.includes("--no-zmq")) {
|
||||
startP2Pool()
|
||||
}
|
||||
else {
|
||||
daemonManager.stopAsync(persistentSettings.nettype, startP2PoolLocal)
|
||||
daemonManager.stopAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, startP2PoolLocal)
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -585,12 +587,35 @@ Rectangle {
|
|||
|
||||
function startP2PoolLocal() {
|
||||
var noSync = false;
|
||||
var customDaemonArgs = persistentSettings.daemonFlags.toLowerCase();
|
||||
var daemonArgs = "--zmq-pub " + "tcp://127.0.0.1:18083 " + "--disable-dns-checkpoints "
|
||||
if (!customDaemonArgs.includes("--zmq-pub") && !customDaemonArgs.includes("--disable-dns-checkpoints") && !customDaemonArgs.includes("--no-zmq")) {
|
||||
daemonArgs = daemonArgs + customDaemonArgs;
|
||||
//these args will be deleted because DaemonManager::start will re-add them later.
|
||||
//--no-zmq must be deleted. removing '--zmq-pub=tcp...' lets us blindly add '--zmq-pub tcp...' later without risking duplication.
|
||||
var defaultArgs = ["--detach","--data-dir","--bootstrap-daemon-address","--prune-blockchain","--no-sync","--check-updates","--non-interactive","--max-concurrency","--no-zmq","--zmq-pub=tcp://127.0.0.1:18083"]
|
||||
var customDaemonArgsArray = args.split(' ');
|
||||
var flag = "";
|
||||
var allArgs = [];
|
||||
var p2poolArgs = ["--zmq-pub tcp://127.0.0.1:18083"];
|
||||
//create an array (allArgs) of ['--arg value','--arg2','--arg3']
|
||||
for (let i = 0; i < customDaemonArgsArray.length; i++) {
|
||||
if(!customDaemonArgsArray[i].startsWith("--")) {
|
||||
flag += " " + customDaemonArgsArray[i]
|
||||
} else {
|
||||
if(flag){
|
||||
allArgs.push(flag)
|
||||
}
|
||||
flag = customDaemonArgsArray[i]
|
||||
}
|
||||
}
|
||||
var success = daemonManager.start(daemonArgs, persistentSettings.nettype, persistentSettings.blockchainDataDir, persistentSettings.bootstrapNodeAddress, noSync, persistentSettings.pruneBlockchain)
|
||||
allArgs.push(flag)
|
||||
//pop from allArgs if value is inside the deleteme array (defaultArgs)
|
||||
allArgs = allArgs.filter( ( el ) => !defaultArgs.includes( el.split(" ")[0] ) )
|
||||
//append required p2pool flags
|
||||
for (let i = 0; i < p2poolArgs.length; i++) {
|
||||
if(!allArgs.includes(p2poolArgs[i])) {
|
||||
allArgs.push(p2poolArgs[i])
|
||||
continue
|
||||
}
|
||||
}
|
||||
var success = daemonManager.start(allArgs.join(" "), persistentSettings.nettype, persistentSettings.blockchainDataDir, persistentSettings.bootstrapNodeAddress, noSync, persistentSettings.pruneBlockchain)
|
||||
if (success) {
|
||||
startP2Pool()
|
||||
}
|
||||
|
@ -619,7 +644,7 @@ Rectangle {
|
|||
function p2poolDownloadFailed() {
|
||||
statusMessage.visible = false
|
||||
errorPopup.title = qsTr("P2Pool Installation Failed") + translationManager.emptyString;
|
||||
errorPopup.text = "P2Pool installation failed."
|
||||
errorPopup.text = qsTr("P2Pool installation failed.") + isWindows ? (" " + qsTr("Try starting the program with administrator privileges.")) : ""
|
||||
errorPopup.icon = StandardIcon.Critical
|
||||
errorPopup.open()
|
||||
update()
|
||||
|
|
|
@ -580,7 +580,8 @@ Rectangle {
|
|||
Layout.fillHeight: true
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
color: "darkgrey"
|
||||
property int currentAccountIndex: currentWallet ? currentWallet.currentSubaddressAccount : 0
|
||||
color: MoneroComponents.Style.accountColors[currentAccountIndex % MoneroComponents.Style.accountColors.length]
|
||||
width: 2
|
||||
}
|
||||
|
||||
|
|
|
@ -421,6 +421,16 @@ Rectangle {
|
|||
}
|
||||
}
|
||||
|
||||
function clearFields() {
|
||||
verifyMessageLine.text = ""
|
||||
signMessageLine.text = ""
|
||||
signSignatureLine.text = ""
|
||||
verifyAddressLine.text = ""
|
||||
verifySignatureLine.text = ""
|
||||
signFileLine.text = ""
|
||||
verifyFileLine.text = ""
|
||||
}
|
||||
|
||||
function onPageCompleted() {
|
||||
console.log("Sign/verify page loaded");
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ Rectangle {
|
|||
color: "transparent"
|
||||
property alias transferHeight1: pageRoot.height
|
||||
property alias transferHeight2: advancedLayout.height
|
||||
property int mixin: 10 // (ring size 11)
|
||||
property int mixin: 15 // (ring size 16)
|
||||
property string warningContent: ""
|
||||
property string sendButtonWarning: {
|
||||
// Currently opened wallet is not view-only
|
||||
|
@ -957,7 +957,7 @@ Rectangle {
|
|||
visible: persistentSettings.transferShowAdvanced && appWindow.walletMode >= 2
|
||||
title: qsTr("Offline transaction signing") + translationManager.emptyString
|
||||
button1.text: qsTr("Create") + translationManager.emptyString
|
||||
button1.enabled: appWindow.viewOnly && pageRoot.checkInformation()
|
||||
button1.enabled: appWindow.viewOnly && pageRoot.checkInformation() && appWindow.daemonSynced
|
||||
button1.onClicked: {
|
||||
console.log("Transfer: saveTx Clicked")
|
||||
var priority = priorityModelV5.get(priorityDropdown.currentIndex).priority
|
||||
|
|
|
@ -74,6 +74,7 @@ ColumnLayout {
|
|||
active: settingsStateView.state == "Log"
|
||||
text: qsTr("Log") + translationManager.emptyString
|
||||
onSelected: settingsStateView.state = "Log"
|
||||
visible: !isAndroid
|
||||
}
|
||||
MoneroComponents.NavbarItem {
|
||||
active: settingsStateView.state == "Info"
|
||||
|
|
|
@ -191,7 +191,7 @@ Rectangle {
|
|||
inputDialog.onAcceptedCallback = function() {
|
||||
var _restoreHeight;
|
||||
if (inputDialog.inputText) {
|
||||
_restoreHeight = Utils.parseDateStringOrRestoreHeightAsInteger(inputDialog.inputText);
|
||||
_restoreHeight = Utils.parseDateStringOrRestoreHeightAsInteger(inputDialog.inputText.trim());
|
||||
}
|
||||
if (!isNaN(_restoreHeight)) {
|
||||
if(_restoreHeight >= 0) {
|
||||
|
|
|
@ -155,6 +155,12 @@ Rectangle {
|
|||
onMoved: persistentSettings.lockOnUserInActivityInterval = value
|
||||
}
|
||||
|
||||
MoneroComponents.CheckBox {
|
||||
checked: persistentSettings.askStopLocalNode
|
||||
onClicked: persistentSettings.askStopLocalNode = !persistentSettings.askStopLocalNode
|
||||
text: qsTr("Ask to stop local node during program exit") + translationManager.emptyString
|
||||
}
|
||||
|
||||
//! Manage pricing
|
||||
RowLayout {
|
||||
MoneroComponents.CheckBox {
|
||||
|
|
|
@ -254,7 +254,7 @@ Rectangle {
|
|||
onAccepted: {
|
||||
if(text.length > 0) {
|
||||
consoleArea.logCommand(">>> " + text)
|
||||
daemonManager.sendCommandAsync(text.split(" "), currentWallet.nettype, function(result) {
|
||||
daemonManager.sendCommandAsync(text.split(" "), currentWallet.nettype, persistentSettings.blockchainDataDir, function(result) {
|
||||
if (!result) {
|
||||
appWindow.showStatusMessage(qsTr("Failed to send command"), 3);
|
||||
}
|
||||
|
|
|
@ -55,6 +55,7 @@ Rectangle{
|
|||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 90
|
||||
color: "transparent"
|
||||
visible: !isAndroid
|
||||
|
||||
Rectangle {
|
||||
id: localNodeDivider
|
||||
|
|
|
@ -127,6 +127,27 @@ Rectangle {
|
|||
}
|
||||
}
|
||||
|
||||
MoneroComponents.SettingsListItem {
|
||||
enabled: leftPanel.progressBar.fillLevel == 100
|
||||
iconText: FontAwesome.magnifyingGlass
|
||||
description: qsTr("Use this feature if a transaction is missing in your wallet history. This will expose the transaction ID to the remote node, which can harm your privacy.") + translationManager.emptyString
|
||||
title: qsTr("Scan transaction") + translationManager.emptyString
|
||||
|
||||
onClicked: {
|
||||
inputDialog.labelText = qsTr("Enter a transaction ID:") + translationManager.emptyString;
|
||||
inputDialog.onAcceptedCallback = function() {
|
||||
var txid = inputDialog.inputText.trim();
|
||||
if (currentWallet.scanTransactions([txid])) {
|
||||
appWindow.showStatusMessage(qsTr("Transaction successfully scanned"), 3);
|
||||
} else {
|
||||
appWindow.showStatusMessage(qsTr("Failed to scan transaction") + ": " + currentWallet.errorString, 5);
|
||||
}
|
||||
}
|
||||
inputDialog.onRejectedCallback = null;
|
||||
inputDialog.open()
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.SettingsListItem {
|
||||
iconText: FontAwesome.ellipsisH
|
||||
description: qsTr("Change the password of your wallet.") + translationManager.emptyString
|
||||
|
|
31
qml.qrc
|
@ -119,8 +119,22 @@
|
|||
<file>components/RemoteNodeEdit.qml</file>
|
||||
<file>pages/Keys.qml</file>
|
||||
<file>images/appicon.ico</file>
|
||||
<file>images/card-background-black.png</file>
|
||||
<file>images/card-background-black@2x.png</file>
|
||||
<file>images/card-background-black0.png</file>
|
||||
<file>images/card-background-black1.png</file>
|
||||
<file>images/card-background-black2.png</file>
|
||||
<file>images/card-background-black3.png</file>
|
||||
<file>images/card-background-black4.png</file>
|
||||
<file>images/card-background-black5.png</file>
|
||||
<file>images/card-background-black6.png</file>
|
||||
<file>images/card-background-black7.png</file>
|
||||
<file>images/card-background-black0@2x.png</file>
|
||||
<file>images/card-background-black1@2x.png</file>
|
||||
<file>images/card-background-black2@2x.png</file>
|
||||
<file>images/card-background-black3@2x.png</file>
|
||||
<file>images/card-background-black4@2x.png</file>
|
||||
<file>images/card-background-black5@2x.png</file>
|
||||
<file>images/card-background-black6@2x.png</file>
|
||||
<file>images/card-background-black7@2x.png</file>
|
||||
<file>images/card-background-white.png</file>
|
||||
<file>images/card-background-white@2x.png</file>
|
||||
<file>images/moneroLogo_white.png</file>
|
||||
|
@ -192,6 +206,7 @@
|
|||
<file>wizard/WizardCreateWallet2.qml</file>
|
||||
<file>wizard/WizardCreateWallet3.qml</file>
|
||||
<file>wizard/WizardCreateWallet4.qml</file>
|
||||
<file>wizard/WizardCreateWallet5.qml</file>
|
||||
<file>wizard/WizardCreateDevice1.qml</file>
|
||||
<file>wizard/WizardDaemonSettings.qml</file>
|
||||
<file>wizard/WizardHeader.qml</file>
|
||||
|
@ -268,5 +283,17 @@
|
|||
<file>images/ledgerNanoX.png</file>
|
||||
<file>images/trezor.png</file>
|
||||
<file>images/trezor@2x.png</file>
|
||||
<file>qtquickcontrols2.conf</file>
|
||||
<file>images/write-down.png</file>
|
||||
<file>images/write-down-white.png</file>
|
||||
<file>images/write-down@2x.png</file>
|
||||
<file>images/write-down-white@2x.png</file>
|
||||
<file>images/verify.png</file>
|
||||
<file>images/verify-white.png</file>
|
||||
<file>images/verify@2x.png</file>
|
||||
<file>images/verify-white@2x.png</file>
|
||||
<file>wizard/SeedListItem.qml</file>
|
||||
<file>wizard/SeedListGrid.qml</file>
|
||||
<file>wizard/template.pdf</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
2
qtquickcontrols2.conf
Normal file
|
@ -0,0 +1,2 @@
|
|||
[Controls]
|
||||
Style=Desktop
|
|
@ -130,8 +130,8 @@ bool DaemonManager::start(const QString &flags, NetworkType::Type nettype, const
|
|||
}
|
||||
|
||||
// Start start watcher
|
||||
m_scheduler.run([this, nettype, noSync] {
|
||||
if (startWatcher(nettype)) {
|
||||
m_scheduler.run([this, nettype, dataDir, noSync] {
|
||||
if (startWatcher(nettype, dataDir)) {
|
||||
emit daemonStarted();
|
||||
m_noSync = noSync;
|
||||
} else {
|
||||
|
@ -142,13 +142,13 @@ bool DaemonManager::start(const QString &flags, NetworkType::Type nettype, const
|
|||
return true;
|
||||
}
|
||||
|
||||
void DaemonManager::stopAsync(NetworkType::Type nettype, const QJSValue& callback)
|
||||
void DaemonManager::stopAsync(NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback)
|
||||
{
|
||||
const auto feature = m_scheduler.run([this, nettype] {
|
||||
const auto feature = m_scheduler.run([this, nettype, dataDir] {
|
||||
QString message;
|
||||
sendCommand({"exit"}, nettype, message);
|
||||
sendCommand({"exit"}, nettype, dataDir, message);
|
||||
|
||||
return QJSValueList({stopWatcher(nettype)});
|
||||
return QJSValueList({stopWatcher(nettype, dataDir)});
|
||||
}, callback);
|
||||
|
||||
if (!feature.first)
|
||||
|
@ -157,14 +157,14 @@ void DaemonManager::stopAsync(NetworkType::Type nettype, const QJSValue& callbac
|
|||
}
|
||||
}
|
||||
|
||||
bool DaemonManager::startWatcher(NetworkType::Type nettype) const
|
||||
bool DaemonManager::startWatcher(NetworkType::Type nettype, const QString &dataDir) const
|
||||
{
|
||||
// Check if daemon is started every 2 seconds
|
||||
QElapsedTimer timer;
|
||||
timer.start();
|
||||
while(true && !m_app_exit && timer.elapsed() / 1000 < DAEMON_START_TIMEOUT_SECONDS ) {
|
||||
QThread::sleep(2);
|
||||
if(!running(nettype)) {
|
||||
if(!running(nettype, dataDir)) {
|
||||
qDebug() << "daemon not running. checking again in 2 seconds.";
|
||||
} else {
|
||||
qDebug() << "daemon is started. Waiting 5 seconds to let daemon catch up";
|
||||
|
@ -175,14 +175,14 @@ bool DaemonManager::startWatcher(NetworkType::Type nettype) const
|
|||
return false;
|
||||
}
|
||||
|
||||
bool DaemonManager::stopWatcher(NetworkType::Type nettype) const
|
||||
bool DaemonManager::stopWatcher(NetworkType::Type nettype, const QString &dataDir) const
|
||||
{
|
||||
// Check if daemon is running every 2 seconds. Kill if still running after 10 seconds
|
||||
int counter = 0;
|
||||
while(true && !m_app_exit) {
|
||||
QThread::sleep(2);
|
||||
counter++;
|
||||
if(running(nettype)) {
|
||||
if(running(nettype, dataDir)) {
|
||||
qDebug() << "Daemon still running. " << counter;
|
||||
if(counter >= 5) {
|
||||
qDebug() << "Killing it! ";
|
||||
|
@ -236,10 +236,10 @@ void DaemonManager::printError()
|
|||
}
|
||||
}
|
||||
|
||||
bool DaemonManager::running(NetworkType::Type nettype) const
|
||||
bool DaemonManager::running(NetworkType::Type nettype, const QString &dataDir) const
|
||||
{
|
||||
QString status;
|
||||
sendCommand({"sync_info"}, nettype, status);
|
||||
sendCommand({"sync_info"}, nettype, dataDir, status);
|
||||
qDebug() << status;
|
||||
return status.contains("Height:");
|
||||
}
|
||||
|
@ -249,14 +249,14 @@ bool DaemonManager::noSync() const noexcept
|
|||
return m_noSync;
|
||||
}
|
||||
|
||||
void DaemonManager::runningAsync(NetworkType::Type nettype, const QJSValue& callback) const
|
||||
void DaemonManager::runningAsync(NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback) const
|
||||
{
|
||||
m_scheduler.run([this, nettype] {
|
||||
return QJSValueList({running(nettype)});
|
||||
m_scheduler.run([this, nettype, dataDir] {
|
||||
return QJSValueList({running(nettype, dataDir)});
|
||||
}, callback);
|
||||
}
|
||||
|
||||
bool DaemonManager::sendCommand(const QStringList &cmd, NetworkType::Type nettype, QString &message) const
|
||||
bool DaemonManager::sendCommand(const QStringList &cmd, NetworkType::Type nettype, const QString &dataDir, QString &message) const
|
||||
{
|
||||
QProcess p;
|
||||
QStringList external_cmd(cmd);
|
||||
|
@ -267,6 +267,11 @@ bool DaemonManager::sendCommand(const QStringList &cmd, NetworkType::Type nettyp
|
|||
else if (nettype == NetworkType::STAGENET)
|
||||
external_cmd << "--stagenet";
|
||||
|
||||
// Custom data-dir
|
||||
if (!dataDir.isEmpty()) {
|
||||
external_cmd << "--data-dir" << dataDir;
|
||||
}
|
||||
|
||||
qDebug() << "sending external cmd: " << external_cmd;
|
||||
|
||||
|
||||
|
@ -278,11 +283,11 @@ bool DaemonManager::sendCommand(const QStringList &cmd, NetworkType::Type nettyp
|
|||
return started;
|
||||
}
|
||||
|
||||
void DaemonManager::sendCommandAsync(const QStringList &cmd, NetworkType::Type nettype, const QJSValue& callback) const
|
||||
void DaemonManager::sendCommandAsync(const QStringList &cmd, NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback) const
|
||||
{
|
||||
m_scheduler.run([this, cmd, nettype] {
|
||||
m_scheduler.run([this, cmd, nettype, dataDir] {
|
||||
QString message;
|
||||
return QJSValueList({sendCommand(cmd, nettype, message)});
|
||||
return QJSValueList({sendCommand(cmd, nettype, dataDir, message)});
|
||||
}, callback);
|
||||
}
|
||||
|
||||
|
@ -337,6 +342,57 @@ bool DaemonManager::checkLmdbExists(QString datadir) {
|
|||
return validateDataDir(datadir).value("lmdbExists").value<bool>();
|
||||
}
|
||||
|
||||
QString DaemonManager::getArgs(const QString &dataDir) {
|
||||
if (!running(NetworkType::MAINNET, dataDir)) {
|
||||
return args;
|
||||
}
|
||||
QProcess p;
|
||||
QStringList tempArgs;
|
||||
#ifdef Q_OS_WIN
|
||||
//powershell
|
||||
tempArgs << "Get-CimInstance Win32_Process -Filter \"name = 'monerod.exe'\" | select -ExpandProperty CommandLine ";
|
||||
p.setProgram("powershell");
|
||||
p.setArguments(tempArgs);
|
||||
p.start();
|
||||
p.waitForFinished();
|
||||
args = p.readAllStandardOutput().simplified().trimmed();
|
||||
|
||||
#elif defined(Q_OS_UNIX)
|
||||
//pgrep
|
||||
tempArgs << "monerod";
|
||||
p.setProgram("pgrep");
|
||||
p.setArguments(tempArgs);
|
||||
p.start();
|
||||
p.waitForFinished();
|
||||
QString pid = p.readAllStandardOutput().trimmed();
|
||||
if (pid.isEmpty()) {
|
||||
return args;
|
||||
}
|
||||
|
||||
tempArgs.clear();
|
||||
|
||||
//ps
|
||||
tempArgs << "-o";
|
||||
tempArgs << "args=";
|
||||
tempArgs << "-fp";
|
||||
tempArgs << pid;
|
||||
p.setProgram("ps");
|
||||
p.setArguments(tempArgs);
|
||||
p.start();
|
||||
p.waitForFinished();
|
||||
args = p.readAllStandardOutput().trimmed();
|
||||
|
||||
#endif
|
||||
if (args.contains("--")) {
|
||||
int index = args.indexOf("--");
|
||||
args.remove(0, index);
|
||||
}
|
||||
else {
|
||||
args = "";
|
||||
}
|
||||
return args;
|
||||
}
|
||||
|
||||
DaemonManager::DaemonManager(QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_scheduler(this)
|
||||
|
|
|
@ -48,23 +48,24 @@ public:
|
|||
~DaemonManager();
|
||||
|
||||
Q_INVOKABLE bool start(const QString &flags, NetworkType::Type nettype, const QString &dataDir = "", const QString &bootstrapNodeAddress = "", bool noSync = false, bool pruneBlockchain = false);
|
||||
Q_INVOKABLE void stopAsync(NetworkType::Type nettype, const QJSValue& callback);
|
||||
Q_INVOKABLE void stopAsync(NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback);
|
||||
|
||||
Q_INVOKABLE bool noSync() const noexcept;
|
||||
// return true if daemon process is started
|
||||
Q_INVOKABLE void runningAsync(NetworkType::Type nettype, const QJSValue& callback) const;
|
||||
Q_INVOKABLE void runningAsync(NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback) const;
|
||||
// Send daemon command from qml and prints output in console window.
|
||||
Q_INVOKABLE void sendCommandAsync(const QStringList &cmd, NetworkType::Type nettype, const QJSValue& callback) const;
|
||||
Q_INVOKABLE void sendCommandAsync(const QStringList &cmd, NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback) const;
|
||||
Q_INVOKABLE void exit();
|
||||
Q_INVOKABLE QVariantMap validateDataDir(const QString &dataDir) const;
|
||||
Q_INVOKABLE bool checkLmdbExists(QString datadir);
|
||||
Q_INVOKABLE QString getArgs(const QString &dataDir);
|
||||
|
||||
private:
|
||||
|
||||
bool running(NetworkType::Type nettype) const;
|
||||
bool sendCommand(const QStringList &cmd, NetworkType::Type nettype, QString &message) const;
|
||||
bool startWatcher(NetworkType::Type nettype) const;
|
||||
bool stopWatcher(NetworkType::Type nettype) const;
|
||||
bool running(NetworkType::Type nettype, const QString &dataDir) const;
|
||||
bool sendCommand(const QStringList &cmd, NetworkType::Type nettype, const QString &dataDir, QString &message) const;
|
||||
bool startWatcher(NetworkType::Type nettype, const QString &dataDir) const;
|
||||
bool stopWatcher(NetworkType::Type nettype, const QString &dataDir) const;
|
||||
signals:
|
||||
void daemonStarted() const;
|
||||
void daemonStopped() const;
|
||||
|
@ -82,6 +83,7 @@ private:
|
|||
QString m_monerod;
|
||||
bool m_app_exit = false;
|
||||
bool m_noSync = false;
|
||||
QString args = "";
|
||||
|
||||
mutable FutureScheduler m_scheduler;
|
||||
};
|
||||
|
|
|
@ -30,7 +30,9 @@
|
|||
|
||||
#include <chrono>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
||||
#include "PendingTransaction.h"
|
||||
#include "UnsignedTransaction.h"
|
||||
|
@ -99,20 +101,30 @@ NetworkType::Type Wallet::nettype() const
|
|||
void Wallet::updateConnectionStatusAsync()
|
||||
{
|
||||
m_scheduler.run([this] {
|
||||
qDebug() << "updateConnectionStatusAsync current status:" << m_connectionStatus;
|
||||
if (m_connectionStatus == Wallet::ConnectionStatus_Disconnected)
|
||||
{
|
||||
setConnectionStatus(ConnectionStatus_Connecting);
|
||||
}
|
||||
ConnectionStatus newStatus = static_cast<ConnectionStatus>(m_walletImpl->connected());
|
||||
setConnectionStatus(newStatus);
|
||||
qDebug() << "Newest wallet status:" << newStatus;
|
||||
if (m_connectionStatus != newStatus)
|
||||
{
|
||||
setConnectionStatus(newStatus);
|
||||
if (newStatus == ConnectionStatus_Connected)
|
||||
{
|
||||
startRefresh();
|
||||
}
|
||||
}
|
||||
// Release lock
|
||||
m_connectionStatusRunning = false;
|
||||
m_connectionStatusTime.restart();
|
||||
});
|
||||
}
|
||||
|
||||
Wallet::ConnectionStatus Wallet::connected(bool forceCheck)
|
||||
{
|
||||
if (!m_initialized)
|
||||
if (!m_initialized || m_initializing)
|
||||
{
|
||||
return ConnectionStatus_Connecting;
|
||||
}
|
||||
|
@ -121,7 +133,6 @@ Wallet::ConnectionStatus Wallet::connected(bool forceCheck)
|
|||
if (forceCheck || (m_connectionStatusTime.elapsed() / 1000 > m_connectionStatusTtl && !m_connectionStatusRunning) || m_connectionStatusTime.elapsed() > 30000) {
|
||||
qDebug() << "Checking connection status";
|
||||
m_connectionStatusRunning = true;
|
||||
m_connectionStatusTime.restart();
|
||||
updateConnectionStatusAsync();
|
||||
}
|
||||
|
||||
|
@ -154,10 +165,9 @@ void Wallet::setConnectionStatus(ConnectionStatus value)
|
|||
}
|
||||
|
||||
m_connectionStatus = value;
|
||||
emit connectionStatusChanged(m_connectionStatus);
|
||||
emit connectionStatusChanged(value);
|
||||
|
||||
bool disconnected = m_connectionStatus == Wallet::ConnectionStatus_Connecting ||
|
||||
m_connectionStatus == Wallet::ConnectionStatus_Disconnected;
|
||||
bool disconnected = value != Wallet::ConnectionStatus_Connected;
|
||||
|
||||
if (m_disconnected != disconnected)
|
||||
{
|
||||
|
@ -278,6 +288,8 @@ void Wallet::initAsync(
|
|||
const QString &proxyAddress /* = "" */)
|
||||
{
|
||||
qDebug() << "initAsync: " + daemonAddress;
|
||||
m_initializing = true;
|
||||
pauseRefresh();
|
||||
const auto future = m_scheduler.run([this, daemonAddress, trustedDaemon, upperTransactionLimit, isRecovering, isRecoveringFromDevice, restoreHeight, proxyAddress] {
|
||||
m_initialized = init(
|
||||
daemonAddress,
|
||||
|
@ -287,12 +299,12 @@ void Wallet::initAsync(
|
|||
isRecoveringFromDevice,
|
||||
restoreHeight,
|
||||
proxyAddress);
|
||||
m_initializing = false;
|
||||
if (m_initialized)
|
||||
{
|
||||
emit walletCreationHeightChanged();
|
||||
qDebug() << "init async finished - starting refresh";
|
||||
qDebug() << "init async finished: " + daemonAddress;
|
||||
connected(true);
|
||||
startRefresh();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -507,6 +519,16 @@ bool Wallet::importOutputs(const QString& path) {
|
|||
return m_walletImpl->importOutputs(path.toStdString());
|
||||
}
|
||||
|
||||
bool Wallet::scanTransactions(const QVector<QString> &txids)
|
||||
{
|
||||
std::vector<std::string> c;
|
||||
for (const auto &v : txids)
|
||||
{
|
||||
c.push_back(v.toStdString());
|
||||
}
|
||||
return m_walletImpl->scanTransactions(c);
|
||||
}
|
||||
|
||||
bool Wallet::refresh(bool historyAndSubaddresses /* = true */)
|
||||
{
|
||||
refreshingSet(true);
|
||||
|
@ -532,11 +554,14 @@ bool Wallet::refresh(bool historyAndSubaddresses /* = true */)
|
|||
|
||||
void Wallet::startRefresh()
|
||||
{
|
||||
qDebug() << "Starting refresh";
|
||||
m_refreshEnabled = true;
|
||||
m_refreshNow = true;
|
||||
}
|
||||
|
||||
void Wallet::pauseRefresh()
|
||||
{
|
||||
qDebug() << "Pausing refresh";
|
||||
m_refreshEnabled = false;
|
||||
}
|
||||
|
||||
|
@ -1125,11 +1150,13 @@ Wallet::Wallet(Monero::Wallet *w, QObject *parent)
|
|||
, m_connectionStatusTtl(WALLET_CONNECTION_STATUS_CACHE_TTL_SECONDS)
|
||||
, m_disconnected(true)
|
||||
, m_initialized(false)
|
||||
, m_initializing(false)
|
||||
, m_currentSubaddressAccount(0)
|
||||
, m_subaddress(new Subaddress(m_walletImpl->subaddress(), this))
|
||||
, m_subaddressModel(nullptr)
|
||||
, m_subaddressAccount(new SubaddressAccount(m_walletImpl->subaddressAccount(), this))
|
||||
, m_subaddressAccountModel(nullptr)
|
||||
, m_refreshNow(false)
|
||||
, m_refreshEnabled(false)
|
||||
, m_refreshing(false)
|
||||
, m_scheduler(this)
|
||||
|
@ -1183,10 +1210,11 @@ void Wallet::startRefreshThread()
|
|||
{
|
||||
const auto now = std::chrono::steady_clock::now();
|
||||
const auto elapsed = now - last;
|
||||
if (elapsed >= refreshInterval)
|
||||
if (elapsed >= refreshInterval || m_refreshNow)
|
||||
{
|
||||
refresh(false);
|
||||
last = std::chrono::steady_clock::now();
|
||||
m_refreshNow = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -212,6 +212,9 @@ public:
|
|||
Q_INVOKABLE bool exportOutputs(const QString& path, bool all = false);
|
||||
Q_INVOKABLE bool importOutputs(const QString& path);
|
||||
|
||||
//! scan transactions
|
||||
Q_INVOKABLE bool scanTransactions(const QVector<QString> &txids);
|
||||
|
||||
//! refreshes the wallet
|
||||
Q_INVOKABLE bool refresh(bool historyAndSubaddresses = true);
|
||||
|
||||
|
@ -458,6 +461,7 @@ private:
|
|||
mutable QElapsedTimer m_connectionStatusTime;
|
||||
bool m_disconnected;
|
||||
std::atomic<bool> m_initialized;
|
||||
std::atomic<bool> m_initializing;
|
||||
uint32_t m_currentSubaddressAccount;
|
||||
Subaddress * m_subaddress;
|
||||
mutable SubaddressModel * m_subaddressModel;
|
||||
|
@ -470,6 +474,7 @@ private:
|
|||
QString m_daemonPassword;
|
||||
QString m_proxyAddress;
|
||||
mutable QMutex m_proxyMutex;
|
||||
std::atomic<bool> m_refreshNow;
|
||||
std::atomic<bool> m_refreshEnabled;
|
||||
std::atomic<bool> m_refreshing;
|
||||
WalletListenerImpl *m_walletListener;
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
|
||||
#include "QR-Code-scanner/Decoder.h"
|
||||
#include "qt/ScopeGuard.h"
|
||||
#include "NetworkType.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
|
@ -159,6 +160,18 @@ QList<QString> OSHelper::grabQrCodesFromScreen() const
|
|||
return codes;
|
||||
}
|
||||
|
||||
bool OSHelper::openFile(const QString &filePath) const
|
||||
{
|
||||
QString canonicalFilePath = QFileInfo(filePath).canonicalFilePath();
|
||||
QUrl url = QUrl::fromLocalFile(canonicalFilePath);
|
||||
if (!url.isValid())
|
||||
{
|
||||
qWarning() << "Malformed file path" << canonicalFilePath << url.errorString();
|
||||
return false;
|
||||
}
|
||||
return QDesktopServices::openUrl(url);
|
||||
}
|
||||
|
||||
bool OSHelper::openContainingFolder(const QString &filePath) const
|
||||
{
|
||||
QString canonicalFilePath = QFileInfo(filePath).canonicalFilePath();
|
||||
|
@ -174,7 +187,7 @@ bool OSHelper::openContainingFolder(const QString &filePath) const
|
|||
}
|
||||
#endif
|
||||
|
||||
QUrl url = QUrl::fromLocalFile(canonicalFilePath);
|
||||
QUrl url = QUrl::fromLocalFile(QFileInfo(filePath).canonicalPath());
|
||||
if (!url.isValid())
|
||||
{
|
||||
qWarning() << "Malformed file path" << canonicalFilePath << url.errorString();
|
||||
|
@ -280,3 +293,41 @@ bool OSHelper::installed() const
|
|||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
std::pair<quint8, QString> OSHelper::getNetworkTypeAndAddressFromFile(const QString &wallet)
|
||||
{
|
||||
quint8 networkType = NetworkType::MAINNET;
|
||||
QString address = QString("");
|
||||
// attempt to retreive wallet address
|
||||
if(QFile::exists(wallet + ".address.txt")){
|
||||
QFile file(wallet + ".address.txt");
|
||||
file.open(QFile::ReadOnly | QFile::Text);
|
||||
QString _address = QString(file.readAll());
|
||||
if(!_address.isEmpty()){
|
||||
address = _address;
|
||||
if(address.startsWith("5") || address.startsWith("7")){
|
||||
networkType = NetworkType::STAGENET;
|
||||
} else if(address.startsWith("9") || address.startsWith("B")){
|
||||
networkType = NetworkType::TESTNET;
|
||||
}
|
||||
}
|
||||
|
||||
file.close();
|
||||
}
|
||||
return std::make_pair(networkType, address);
|
||||
}
|
||||
|
||||
quint8 OSHelper::getNetworkTypeFromFile(const QString &keysPath) const
|
||||
{
|
||||
QString walletPath = keysPath;
|
||||
if(keysPath.endsWith(".keys")){
|
||||
walletPath = keysPath.mid(0,keysPath.length()-5);
|
||||
}
|
||||
return getNetworkTypeAndAddressFromFile(walletPath).first;
|
||||
}
|
||||
|
||||
void OSHelper::openSeedTemplate() const
|
||||
{
|
||||
QFile::copy(":/wizard/template.pdf", QDir::tempPath() + "/seed_template.pdf");
|
||||
openFile(QDir::tempPath() + "/seed_template.pdf");
|
||||
}
|
||||
|
|
|
@ -46,13 +46,17 @@ public:
|
|||
Q_INVOKABLE void createDesktopEntry() const;
|
||||
Q_INVOKABLE QString downloadLocation() const;
|
||||
Q_INVOKABLE QList<QString> grabQrCodesFromScreen() const;
|
||||
Q_INVOKABLE bool openFile(const QString &filePath) const;
|
||||
Q_INVOKABLE bool openContainingFolder(const QString &filePath) const;
|
||||
Q_INVOKABLE QString openSaveFileDialog(const QString &title, const QString &folder, const QString &filename) const;
|
||||
Q_INVOKABLE QString temporaryFilename() const;
|
||||
Q_INVOKABLE QString temporaryPath() const;
|
||||
Q_INVOKABLE bool removeTemporaryWallet(const QString &walletName) const;
|
||||
Q_INVOKABLE bool isCapsLock() const;
|
||||
Q_INVOKABLE quint8 getNetworkTypeFromFile(const QString &keysPath) const;
|
||||
Q_INVOKABLE void openSeedTemplate() const;
|
||||
|
||||
static std::pair<quint8, QString> getNetworkTypeAndAddressFromFile(const QString &wallet);
|
||||
private:
|
||||
bool installed() const;
|
||||
|
||||
|
|
|
@ -49,17 +49,17 @@ void P2PoolManager::download() {
|
|||
QString fileName;
|
||||
QString validHash;
|
||||
#ifdef Q_OS_WIN
|
||||
url = "https://github.com/SChernykh/p2pool/releases/download/v1.9/p2pool-v1.9-windows-x64.zip";
|
||||
fileName = m_p2poolPath + "/p2pool-v1.9-windows-x64.zip";
|
||||
validHash = "2587903dc04a4879dca2b6f5c5b584e869928e716274a7660e24b219c9f18839";
|
||||
url = "https://github.com/SChernykh/p2pool/releases/download/v3.0/p2pool-v3.0-windows-x64.zip";
|
||||
fileName = m_p2poolPath + "/p2pool-v3.0-windows-x64.zip";
|
||||
validHash = "102390ca812ede79f26f6a9b7c0ff7cf57b1c37523bee223e8ee10d6bc890e1b";
|
||||
#elif defined(Q_OS_LINUX)
|
||||
url = "https://github.com/SChernykh/p2pool/releases/download/v1.9/p2pool-v1.9-linux-x64.tar.gz";
|
||||
fileName = m_p2poolPath + "/p2pool-v1.9-linux-x64.tar.gz";
|
||||
validHash = "0cd85d933ac4a76708d326698d9db3155bb29d0be82984c735fabd9e9a351b8e";
|
||||
url = "https://github.com/SChernykh/p2pool/releases/download/v3.0/p2pool-v3.0-linux-x64.tar.gz";
|
||||
fileName = m_p2poolPath + "/p2pool-v3.0-linux-x64.tar.gz";
|
||||
validHash = "a7a0fdd19a0c413cbb2beb7f767cc3f706e26cd0cf3a08c104e312fd7ebd882e";
|
||||
#elif defined(Q_OS_MACOS)
|
||||
url = "https://github.com/SChernykh/p2pool/releases/download/v1.9/p2pool-v1.9-macos-x64.tar.gz";
|
||||
fileName = m_p2poolPath + "/p2pool-v1.9-macos-x64.tar.gz";
|
||||
validHash = "47fbdd69d719da80597dd5487f109b61e30b540499cced7b93de1ee01344351e";
|
||||
url = "https://github.com/SChernykh/p2pool/releases/download/v3.0/p2pool-v3.0-macos-x64.tar.gz";
|
||||
fileName = m_p2poolPath + "/p2pool-v3.0-macos-x64.tar.gz";
|
||||
validHash = "b648fef621891c16713bf42504677c1def205c4e63c7c51d91f850e57f4a97d6";
|
||||
#endif
|
||||
QFile file(fileName);
|
||||
epee::net_utils::http::http_simple_client http_client;
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "libwalletqt/WalletManager.h"
|
||||
#include "NetworkType.h"
|
||||
#include "qt/utils.h"
|
||||
#include "main/oshelper.h"
|
||||
|
||||
#include "KeysFiles.h"
|
||||
|
||||
|
@ -115,32 +116,15 @@ void WalletKeysFilesModel::findWallets(const QString &moneroAccountsDir)
|
|||
QFileInfo keysFileinfo = it.fileInfo();
|
||||
|
||||
constexpr const char keysFileExtension[] = "keys";
|
||||
if (!keysFileinfo.isFile() || keysFileinfo.completeSuffix() != keysFileExtension)
|
||||
if (!keysFileinfo.isFile() || keysFileinfo.suffix() != keysFileExtension)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
QString wallet(keysFileinfo.path() + QDir::separator() + keysFileinfo.baseName());
|
||||
quint8 networkType = NetworkType::MAINNET;
|
||||
QString address = QString("");
|
||||
|
||||
// attempt to retreive wallet address
|
||||
if(fileExists(wallet + ".address.txt")){
|
||||
QFile file(wallet + ".address.txt");
|
||||
file.open(QFile::ReadOnly | QFile::Text);
|
||||
QString _address = QString(file.readAll());
|
||||
|
||||
if(!_address.isEmpty()){
|
||||
address = _address;
|
||||
if(address.startsWith("5") || address.startsWith("7")){
|
||||
networkType = NetworkType::STAGENET;
|
||||
} else if(address.startsWith("9") || address.startsWith("B")){
|
||||
networkType = NetworkType::TESTNET;
|
||||
}
|
||||
}
|
||||
|
||||
file.close();
|
||||
}
|
||||
QString wallet(keysFileinfo.path() + QDir::separator() + keysFileinfo.completeBaseName());
|
||||
auto networkTypeAndAddress = OSHelper::getNetworkTypeAndAddressFromFile(wallet);
|
||||
quint8 networkType = networkTypeAndAddress.first;
|
||||
QString address = networkTypeAndAddress.second;
|
||||
|
||||
this->addWalletKeysFile(WalletKeysFiles(wallet, networkType, std::move(address)));
|
||||
}
|
||||
|
|