Compare commits

...

101 Commits

Author SHA1 Message Date
tobtoht
49c3e498c7 Merge pull request #4575
e2a8efc installer: move p2pool to LocalAppData (selsta)
2026-03-28 20:17:49 +00:00
selsta
e2a8efca86 installer: move p2pool to LocalAppData 2026-03-21 22:36:04 +01:00
luigi1111
541c895d71 Merge pull request #4572
e4bd8c4 build: prepare v0.18.4.7 (selsta)
2026-03-02 19:19:59 -05:00
luigi1111
4eb77491eb Merge pull request #4571
eb25d4c WizardController: set password before storing wallet (selsta)
2026-03-02 19:19:33 -05:00
luigi1111
57f6ae2761 Merge pull request #4570
edb42af p2pool v4.14 (SChernykh)
2026-03-02 19:18:52 -05:00
selsta
e4bd8c4708 build: prepare v0.18.4.7 2026-03-02 20:36:47 +01:00
selsta
eb25d4cafa WizardController: set password before storing wallet 2026-03-02 19:58:44 +01:00
SChernykh
edb42af463 p2pool v4.14 2026-03-01 10:32:34 +01:00
luigi1111
b74815e8b3 Merge pull request #4568
8d68c12 build: prepare v0.18.4.6 (selsta)
2026-02-23 20:59:11 -05:00
selsta
8d68c12120 build: prepare v0.18.4.6 2026-02-23 17:23:04 +01:00
tobtoht
e5606fcf73 Merge pull request #4565
fe363d4 docker: update Qt to 5.15.18 (selsta)
2026-02-02 12:05:07 +00:00
selsta
fe363d4dd8 docker: update Qt to 5.15.18 2026-01-31 16:54:29 +01:00
tobtoht
475d4311e0 Merge pull request #4563
c3eb3c6 cmake: drop comment (selsta)
a255c5d Revert "cmake: drop unnecessary package" (selsta)
2026-01-29 20:56:03 +00:00
selsta
c3eb3c6f51 cmake: drop comment
Removing this code caused build failures with Qt 5.15.
2026-01-29 20:15:35 +01:00
selsta
a255c5dc42 Revert "cmake: drop unnecessary package"
This reverts commit 077ab3d58e.
2026-01-29 18:52:29 +01:00
tobtoht
88c0237cad Merge pull request #4558
80e209d filter: intercept quit event to avoid deadlock (selsta)
2026-01-29 15:40:40 +00:00
tobtoht
4bb527b200 Merge pull request #4556
2ddb550 WizardController: set password for temp wallet (selsta)
2026-01-29 15:40:14 +00:00
tobtoht
bbd4a0055b Merge pull request #4554
7182eb6 utils: replace rand with QRandomGenerator (selsta)
077ab3d cmake: drop unnecessary package (selsta)
2026-01-29 15:39:11 +00:00
tobtoht
dbc7c69a2d Merge pull request #4553
053a6d4 cmake: set Qt 5.12 as minimum (selsta)
2026-01-29 15:38:43 +00:00
tobtoht
98ed779e18 Merge pull request #4552
765982c main: update blockchain size estimate (selsta)
172e346 DaemonManager: use accurate blockchain size estimate (selsta)
2026-01-29 15:38:23 +00:00
tobtoht
d3559a40ba Merge pull request #4551
dfe7f30 cmake: warn if qmake has -qt5 suffix during deploy (selsta)
2026-01-29 15:37:52 +00:00
selsta
80e209df42 filter: intercept quit event to avoid deadlock 2026-01-20 20:53:20 +01:00
selsta
765982c7a1 main: update blockchain size estimate 2026-01-20 17:51:10 +01:00
selsta
172e346612 DaemonManager: use accurate blockchain size estimate 2026-01-20 16:21:34 +01:00
selsta
2ddb550591 WizardController: set password for temp wallet 2026-01-19 21:24:31 +01:00
selsta
7182eb6b93 utils: replace rand with QRandomGenerator
Also change how the list is allocated, does not really
matter for this code but can't hurt.
2026-01-19 18:37:08 +01:00
selsta
077ab3d58e cmake: drop unnecessary package 2026-01-19 18:33:56 +01:00
selsta
053a6d4388 cmake: set Qt 5.12 as minimum 2026-01-19 18:24:56 +01:00
tobtoht
c5e0680bdf Merge pull request #4549
2f3e9ab PasswordDialog: fix lack of focus on window change (selsta)
2026-01-17 03:48:26 +00:00
selsta
dfe7f302d4 cmake: warn if qmake has -qt5 suffix during deploy
Also make sure that windeployqt only runs when make deploy
is executed.
2026-01-15 20:29:04 +01:00
selsta
2f3e9abe14 PasswordDialog: fix lack of focus on window change 2026-01-14 18:50:31 +01:00
luigi1111
e984c28faf Merge pull request #4545
7db5136 build: prepare v0.18.4.5 (selsta)
2026-01-05 12:06:43 -05:00
selsta
7db5136143 build: prepare v0.18.4.5 2026-01-05 01:23:12 +01:00
tobtoht
8b78bb08ed Merge pull request #4543
9384dc9 p2pool v4.13 (SChernykh)
2025-12-29 22:28:52 +00:00
SChernykh
9384dc9d7d p2pool v4.13 2025-12-18 12:57:58 +01:00
tobtoht
36e4312a05 Merge pull request #4539
c3b984e wallet: add new ledger nano gen5 (plowsof)
2025-12-09 17:45:41 +00:00
tobtoht
e50c830b10 Merge pull request #4537
ef40662 macOS: support dark mode again (selsta)
2025-12-09 17:45:01 +00:00
plowsof
c3b984e1c2 wallet: add new ledger nano gen5 2025-12-03 10:07:38 +00:00
selsta
ef406624b9 macOS: support dark mode again 2025-12-01 23:49:44 +01:00
tobtoht
b13e2012d8 Merge pull request #4534
d7a3a61 Dockerfile.linux: bump hidapi to 0.15.0 (tobtoht)
2025-11-24 18:24:17 +00:00
tobtoht
d7a3a61bf4 Dockerfile.linux: bump hidapi to 0.15.0 2025-11-22 23:52:40 +01:00
tobtoht
c957058860 Merge pull request #4525
1cce66f Don't try negative numbers when translating "%n second(s) ago"-style strings (наб)
2025-11-20 10:09:36 +00:00
наб
1cce66f866 Don't try negative numbers when translating "%n second(s) ago"-style strings
When the local clock is running behind,
transactions may appear to have been confirmed in the future,
which seems to leave the %n in "%n second(s) ago" unreplaced,
so round negative times ago to 0

Ref: #3284
2025-11-15 21:41:22 +01:00
tobtoht
b9eea25e52 Merge pull request #4521
2ae9d3f build: prepare v0.18.4.4 (selsta)
2025-11-13 00:32:17 +00:00
tobtoht
39522ab549 Merge pull request #4522
aa5b20e cmake: update deploy icu version (selsta)
2025-11-13 00:31:51 +00:00
selsta
aa5b20ef62 cmake: update deploy icu version 2025-11-13 00:27:25 +01:00
selsta
2ae9d3f6b6 build: prepare v0.18.4.4 2025-11-12 23:43:42 +01:00
tobtoht
061a256df7 Merge pull request #4519
7c6138e p2pool v4.12 (SChernykh)
2025-11-05 18:12:47 +00:00
SChernykh
7c6138eae1 p2pool v4.12 2025-11-05 17:44:46 +01:00
luigi1111
e34c83d7aa Merge pull request #4507
c285879 build: prepare v0.18.4.3 (selsta)
2025-10-07 19:19:50 -04:00
selsta
c28587931f build: prepare v0.18.4.3 2025-10-07 23:36:02 +02:00
tobtoht
1de4a65f90 Merge pull request #4505
c31cdaa p2pool v4.11 (SChernykh)
2025-09-28 18:40:11 +00:00
SChernykh
c31cdaad9e p2pool v4.11 2025-09-27 13:06:57 +02:00
tobtoht
440012b454 Merge pull request #4503
4bd21db p2pool v4.10.1 (sech1)
2025-09-24 20:55:23 +00:00
sech1
4bd21db202 p2pool v4.10.1 2025-09-10 09:59:56 +02:00
tobtoht
25807060a7 Merge pull request #4502
ff9558d p2pool v4.10 (sech1)
2025-09-09 18:06:27 +00:00
sech1
ff9558db09 p2pool v4.10 2025-09-09 10:35:51 +02:00
tobtoht
f3f1dfc020 Merge pull request #4498
0764fba docker: update Qt to 5.15.17 (selsta)
2025-09-08 18:18:06 +00:00
selsta
0764fbad33 docker: update Qt to 5.15.17 2025-09-03 20:31:33 +02:00
tobtoht
792130a7e6 Merge pull request #4496
5ee0484 workflows: fix macOS bundle (selsta)
2025-09-02 20:02:20 +00:00
tobtoht
3f0edae3a7 Merge pull request #4497
76416d9 workflows: remove unmaintained docker caching action (selsta)
2025-09-02 19:59:51 +00:00
selsta
76416d9133 workflows: remove unmaintained docker caching action
Does not work anymore. Action hasn't been updated since 2020.
There's a fork but it also appears unmaintained.
2025-09-02 00:14:10 +02:00
selsta
5ee04841f0 workflows: fix macOS bundle 2025-09-02 00:01:53 +02:00
tobtoht
1d09876323 Merge pull request #4494
dce481a wizard: add new Ledger Flex (selsta)
2025-08-31 12:32:37 +00:00
selsta
dce481a3d9 wizard: add new Ledger Flex 2025-08-31 00:11:23 +02:00
tobtoht
28c698375c Merge pull request #4492
cabbbaf cmake: update macOS deploy for newer boost (selsta)
2025-08-29 18:26:32 +00:00
selsta
cabbbaf172 cmake: update macOS deploy for newer boost 2025-08-25 19:29:36 +02:00
luigi1111
c89f8eca91 Merge pull request #4491
16da754 build: prepare v0.18.4.2 (selsta)
2025-08-24 22:34:18 -04:00
selsta
16da754c79 build: prepare v0.18.4.2 2025-08-24 19:31:12 +02:00
tobtoht
346d962837 Merge pull request #4476
9e37b21 chore: remove redundant words in comment (xihuwenhua)
2025-08-22 07:48:08 +00:00
xihuwenhua
9e37b219b9 chore: remove redundant words in comment
Signed-off-by: xihuwenhua <xihuwenhua@outlook.com>
2025-08-22 15:14:32 +08:00
tobtoht
b8b556f289 Merge pull request #4490
881206d p2pool: update to v4.9.1 (sech1)
2025-08-21 16:34:00 +00:00
sech1
881206db99 p2pool: update to v4.9.1 2025-08-21 12:03:32 +02:00
tobtoht
f8ad672c44 Merge pull request #4482
614b81f p2pool: add nano sidechain (nahuhh)
2025-08-04 11:54:17 +00:00
tobtoht
8a85221f95 Merge pull request #4050
5332495 Implement background sync when locked (j-berman)
2025-08-04 11:51:24 +00:00
j-berman
5332495c24 Implement background sync when locked 2025-08-03 10:26:11 -07:00
nahuhh
614b81fd23 p2pool: add nano sidechain 2025-07-24 20:17:37 +00:00
tobtoht
10a184db8b Merge pull request #4477
7c4ddf7 p2pool: update to v4.9 (SChernykh)
2025-07-22 14:15:44 +00:00
SChernykh
7c4ddf7bc4 p2pool: update to v4.9 2025-07-20 22:27:30 +02:00
tobtoht
0149f946b9 Merge pull request #4471
1afc8e6 build: prepare v0.18.4.1 (selsta)
2025-07-17 14:42:45 +00:00
tobtoht
e3620f39dc Merge pull request #4472
fdfb963 docker: fix android build (tobtoht)
2025-07-17 13:48:20 +00:00
tobtoht
5592ff5f28 Merge pull request #4473
fcec418 cmake: bump CXX standard to 14 (tobtoht)
2025-07-17 13:47:58 +00:00
tobtoht
fcec4187b6 cmake: bump CXX standard to 14 2025-07-17 13:01:24 +02:00
tobtoht
fdfb9634d3 docker: fix android build 2025-07-17 12:59:13 +02:00
selsta
1afc8e69c6 build: prepare v0.18.4.1 2025-07-17 01:25:59 +02:00
tobtoht
fb3b4e44da Merge pull request #4462
5a61c7c p2pool: update to v4.8.1 (SChernykh)
2025-06-26 09:23:35 +00:00
SChernykh
5a61c7c941 p2pool: update to v4.8.1 2025-06-25 12:01:46 +02:00
tobtoht
4e9b0ae000 Merge pull request #4446
a56d4d0f main: Update blockchain size (Collin Bartlam)
2025-05-09 19:35:30 +00:00
Collin Bartlam
a56d4d0f4b main: Update blockchain size 2025-05-09 01:20:47 -04:00
tobtoht
2b0e7d0dee Merge pull request #4441
0fd48a1e cmake: fix deploy icu version (selsta)
2025-05-04 14:18:32 +00:00
tobtoht
e17e238ee9 Merge pull request #4440
d4eafa1d p2pool: update to v4.5 (SChernykh)
2025-05-04 03:02:45 +00:00
selsta
0fd48a1e56 cmake: fix deploy icu version 2025-05-03 18:56:01 +02:00
SChernykh
d4eafa1d95 p2pool: update to v4.5 2025-05-03 17:13:28 +02:00
tobtoht
675f68ca17 Merge pull request #4434
30ee14fc PasswordDialog: fix spelling in warning message (spetterman66)
2025-04-24 18:04:08 +00:00
spetterman66
30ee14fca1 PasswordDialog: fix spelling in warning message 2025-04-23 23:12:58 +02:00
tobtoht
c4ae40223c Merge pull request #4384
0e9069af lang: rename esperanto.png to eo.png using ISO 639-1 code (Baksi)
2025-04-18 16:38:49 +00:00
Baksi
0e9069af80 lang: rename esperanto.png to eo.png using ISO 639-1 code 2025-04-17 19:02:34 +00:00
tobtoht
1db66c9698 Merge pull request #4433
b409e9fc workflows: update Ubuntu version (selsta)
2025-04-16 01:07:52 +00:00
selsta
b409e9fc7d workflows: update Ubuntu version 2025-04-15 21:09:26 +02:00
tobtoht
ecb76b8414 Merge pull request #4418
da71a00b Remove unused JS variables (b4n6-b4n6)
2025-04-06 09:39:39 +00:00
b4n6-b4n6
da71a00be2 Remove unused JS variables 2025-03-03 09:45:44 +07:00
40 changed files with 510 additions and 332 deletions

107
.github/qt_helper.py vendored
View File

@@ -1,107 +0,0 @@
#!/usr/bin/env python3
import defusedxml.ElementTree
import hashlib
import mmap
import pathlib
import subprocess
import sys
import urllib.parse
import urllib.request
import xml.etree.ElementTree as ET
MAX_TRIES = 32
def fetch_links_to_archives(os, target, major, minor, patch, toolchain):
MAX_XML_SIZE = 1024 * 1024 * 1024
MIRROR = 'download.qt.io'
base_url = f'https://{MIRROR}/online/qtsdkrepository/{os}/{target}/qt{major}_{major}{minor}{patch}'
url = f'{base_url}/Updates.xml'
for _ in range(MAX_TRIES):
try:
resp = urllib.request.urlopen(url).read(MAX_XML_SIZE)
update_xml = defusedxml.ElementTree.fromstring(resp)
break
except KeyboardInterrupt:
raise
except BaseException as e:
print('error', e, flush=True)
else:
return
for pkg in update_xml.findall('./PackageUpdate'):
name = pkg.find('.//Name')
if name == None:
continue
if name.text != f'qt.qt{major}.{major}{minor}{patch}.{toolchain}':
continue
version = pkg.find('.//Version')
if version == None:
continue
archives = pkg.find('.//DownloadableArchives')
if archives == None or archives.text == None:
continue
for archive in archives.text.split(', '):
url = f'{base_url}/{name.text}/{version.text}{archive}'
file_name = pathlib.Path(urllib.parse.urlparse(url).path).name
yield {'name': file_name, 'url': url}
def download(links):
metalink = ET.Element('metalink', xmlns = "urn:ietf:params:xml:ns:metalink")
for link in links:
file = ET.SubElement(metalink, 'file', name = link['name'])
ET.SubElement(file, 'url').text = link['url']
data = ET.tostring(metalink, encoding='UTF-8', xml_declaration=True)
for _ in range(MAX_TRIES):
with subprocess.Popen([
'aria2c',
'--connect-timeout=8',
'--console-log-level=warn',
'--continue',
'--follow-metalink=mem',
'--max-concurrent-downloads=100',
'--max-connection-per-server=16',
'--max-file-not-found=100',
'--max-tries=100',
'--min-split-size=1MB',
'--retry-wait=1',
'--split=100',
'--summary-interval=0',
'--timeout=8',
'--user-agent=',
'--metalink-file=-',
], stdin=subprocess.PIPE) as aria:
aria.communicate(data)
if aria.wait() == 0:
return True
return False
def calc_hash_sum(files):
obj = hashlib.new('sha256')
for path in files:
with open(path, 'rb') as f:
with mmap.mmap(f.fileno(), 0, mmap.MAP_SHARED, mmap.PROT_READ) as m:
file_hash = hashlib.new('sha256', m).digest()
obj.update(file_hash)
return obj.digest().hex()
def extract_archives(files, out='.', targets=[]):
for path in files:
if subprocess.Popen(['7z', 'x', '-bd', '-y', '-aoa', f'-o{out}', path] + targets,
stdout=subprocess.DEVNULL,
).wait() != 0:
return False
return True
def main():
os, target, version, toolchain, expect = sys.argv[1:]
major, minor, patch = version.split('.')
links = [*fetch_links_to_archives(os, target, major, minor, patch, toolchain)]
print(*[l['url'].encode() for l in links], sep='\n', flush=True)
assert download(links)
result = calc_hash_sum([l['name'] for l in links])
print('result', result, 'expect', expect, flush=True)
assert result == expect
assert extract_archives([l['name'] for l in links], '.', ['{}.{}.{}'.format(major, minor, patch)])
[pathlib.Path(l['name']).unlink() for l in links]
if __name__ == '__main__':
main()

View File

@@ -5,6 +5,8 @@ on: [push, pull_request]
env:
FREE_DISKSPACE: |
sudo rm -rf /usr/local/.ghcup /usr/share/dotnet /usr/share/swift /usr/share/miniconda
QT_TAG: v5.15.17-lts-lgpl
QT_PREFIX: ${{ github.workspace }}/qt-install
jobs:
build-macos:
@@ -57,6 +59,10 @@ jobs:
with:
update: true
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 mingw-w64-x86_64-angleproject
- name: add qmake.exe and windeployqt.exe
run: |
cp -f "$MSYSTEM_PREFIX/bin/qmake-qt5.exe" "$MSYSTEM_PREFIX/bin/qmake.exe"
cp -f "$MSYSTEM_PREFIX/bin/windeployqt-qt5.exe" "$MSYSTEM_PREFIX/bin/windeployqt.exe"
- name: build
run: DEV_MODE=ON make release-win64 -j2
- name: deploy
@@ -66,25 +72,35 @@ jobs:
run: build/release/bin/monero-wallet-gui --test-qml
macos-bundle:
runs-on: macos-13
runs-on: macos-15
steps:
- uses: actions/checkout@v1
with:
submodules: recursive
- name: install dependencies
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm miniupnpc expat libunwind-headers protobuf pkg-config pyenv p7zip aria2
- name: install dependencies
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm miniupnpc expat libunwind-headers protobuf pkg-config
- name: clone qt repo
run: git clone -b "${QT_TAG}" --recursive --depth 1 --shallow-submodules https://github.com/qt/qt5
- name: build qt from source
run: |
pyenv install 3.12.0
pip install defusedxml
- name: download qt
run: python monero-gui/.github/qt_helper.py mac_x64 desktop 5.15.2 clang_64 c384008156fe63cc183bade0316828c598ff3e5074397c0c9ccc588d6cdc5aca
working-directory: ../
- name: build
cd qt5
mkdir build && cd build
../configure -prefix "${QT_PREFIX}" -opensource -confirm-license -release -nomake examples -nomake tests -no-rpath -skip qtwebengine -skip qt3d -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtlocation -skip qtnetworkauth -skip qtpurchasing -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qttools -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebsockets -skip qtwebview -skip qtwinextras -skip qtx11extras -skip gamepad -skip serialbus -skip location -skip webengine
make -j"$(sysctl -n hw.ncpu)"
make install
cd ../qttools/src/linguist/lrelease
../../../../build/qtbase/bin/qmake
make -j"$(sysctl -n hw.ncpu)"
make install
cd ../../../../qttools/src/macdeployqt/macdeployqt/
../../../../build/qtbase/bin/qmake
make -j"$(sysctl -n hw.ncpu)"
make install
- name: build monero-gui
run: |
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D ARCH=default -D CMAKE_PREFIX_PATH=/Users/runner/work/monero-gui/5.15.2/clang_64 ..
make
cmake -D CMAKE_BUILD_TYPE=Release -D ARCH=default -D CMAKE_PREFIX_PATH="${QT_PREFIX}" ..
make -j"$(sysctl -n hw.ncpu)"
- name: deploy
run: make deploy
working-directory: build
@@ -99,18 +115,11 @@ jobs:
path: build/bin/monero-wallet-gui.tar
docker-linux-static:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v1
with:
submodules: recursive
- uses: satackey/action-docker-layer-caching@v0.0.11
if: "!startsWith(github.ref, 'refs/tags/v')"
continue-on-error: true
with:
key: docker-linux-static-{hash}
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 libxcb-shape0 libxkbcommon-x11-0
- name: free up diskspace
@@ -131,18 +140,11 @@ jobs:
/home/runner/work/monero-gui/monero-gui/build/release/bin/monerod
docker-windows-static:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v1
with:
submodules: recursive
- uses: satackey/action-docker-layer-caching@v0.0.11
if: "!startsWith(github.ref, 'refs/tags/v')"
continue-on-error: true
with:
key: docker-windows-static-{hash}
restore-keys: |
docker-windows-static-
- name: free up diskspace
run: ${{env.FREE_DISKSPACE}}
- name: prepare build environment
@@ -159,33 +161,24 @@ jobs:
/home/runner/work/monero-gui/monero-gui/build/x86_64-w64-mingw32/release/bin/monerod.exe
docker-android:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v1
with:
submodules: recursive
- uses: satackey/action-docker-layer-caching@v0.0.11
if: "!startsWith(github.ref, 'refs/tags/v')"
continue-on-error: true
with:
key: docker-android-static-{hash}
restore-keys: |
docker-android-static-
- name: free up diskspace
run: ${{env.FREE_DISKSPACE}}
- name: prepare build environment
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@v4
with:
name: ${{ github.job }}
path: /home/runner/work/monero-gui/monero-gui/build/Android/release/android-build/monero-gui.apk
source-archive:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v1
with:

View File

@@ -5,7 +5,7 @@ message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}")
set(VERSION_MAJOR "18")
set(VERSION_MINOR "4")
set(VERSION_REVISION "0")
set(VERSION_REVISION "7")
set(VERSION "0.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}")
option(STATIC "Link libraries statically, requires static Qt")
@@ -20,7 +20,7 @@ if(DEV_MODE)
# DEV_MODE checks out the monero submodule to master, which requires C++17.
set(CMAKE_CXX_STANDARD 17)
else()
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -150,6 +150,8 @@ if(UNIX)
endif()
endif()
set(QT_MIN_VERSION "5.12")
find_package(PkgConfig REQUIRED)
# TODO: drop this once we switch to Qt 5.14+
@@ -158,14 +160,13 @@ if(Qt5QmlModels_PKG_CONFIG_FOUND)
list(APPEND QT5_LIBRARIES Qt5QmlModels)
endif()
# TODO: drop this once we switch to Qt 5.12+
find_package(Qt5XmlPatterns QUIET)
if(Qt5XmlPatterns_FOUND)
list(APPEND QT5_LIBRARIES Qt5XmlPatterns)
endif()
foreach(QT5_MODULE ${QT5_LIBRARIES})
find_package(${QT5_MODULE} REQUIRED)
find_package(${QT5_MODULE} ${QT_MIN_VERSION} REQUIRED)
include_directories(${${QT5_MODULE}_INCLUDE_DIRS})
endforeach()

View File

@@ -1,11 +1,11 @@
FROM debian:buster
FROM ubuntu:20.04
ARG THREADS=1
ARG ANDROID_NDK_REVISION=23c
ARG ANDROID_NDK_HASH=e5053c126a47e84726d9f7173a04686a71f9a67a
ARG ANDROID_SDK_REVISION=7302050_latest
ARG ANDROID_SDK_HASH=7a00faadc0864f78edd8f4908a629a46d622375cbe2e5814e82934aebecdb622
ARG QT_VERSION=v5.15.16-lts-lgpl
ARG QT_VERSION=v5.15.18-lts-lgpl
WORKDIR /opt/android
ENV WORKDIR=/opt/android
@@ -20,6 +20,7 @@ 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
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y ant automake build-essential ca-certificates-java file gettext git libc6 libncurses5 \

View File

@@ -1,7 +1,7 @@
FROM ubuntu:18.04
ARG THREADS=1
ARG QT_VERSION=v5.15.16-lts-lgpl
ARG QT_VERSION=v5.15.18-lts-lgpl
ENV CFLAGS="-fPIC"
ENV CPPFLAGS="-fPIC"
@@ -233,9 +233,9 @@ RUN git clone -b v1.0.26 --depth 1 https://github.com/libusb/libusb && \
make -j$THREADS install && \
rm -rf $(pwd)
RUN git clone -b hidapi-0.13.1 --depth 1 https://github.com/libusb/hidapi && \
RUN git clone -b hidapi-0.15.0 --depth 1 https://github.com/libusb/hidapi && \
cd hidapi && \
git reset --hard 4ebce6b5059b086d05ca7e091ce04a5fd08ac3ac && \
git reset --hard d6b2a974608dec3b76fb1e36c189f22b9cf3650c && \
./bootstrap && \
./configure --disable-shared --enable-static && \
make -j$THREADS && \

View File

@@ -1,7 +1,7 @@
FROM ubuntu:20.04
ARG THREADS=1
ARG QT_VERSION=v5.15.16-lts-lgpl
ARG QT_VERSION=v5.15.18-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.18.4.0 --depth 1 https://github.com/monero-project/monero && \
RUN git clone -b v0.18.4.6 --depth 1 https://github.com/monero-project/monero && \
cd monero && \
git reset --hard f1311d4237404ab7da76241dbf10e92a65132cc4 && \
git reset --hard dbcc7d212c094bd1a45f7291dbb99a4b4627a96d && \
cp -a contrib/depends / && \
cd .. && \
rm -rf monero

View File

@@ -94,7 +94,7 @@ Packaging for your favorite distribution would be a welcome contribution!
## Compiling the Monero GUI from source
*Note*: Qt 5.9.7 is the minimum version required to build the GUI.
*Note*: Qt 5.12 is the minimum version required to build the GUI.
*Note*: Official GUI releases use monero-wallet-gui from this process alongside the supporting binaries (monerod, etc) from the [CLI deterministic builds](https://github.com/monero-project/monero/blob/release-v0.18/contrib/gitian/README.md).
@@ -105,7 +105,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.18.4.0`) to build the release binaries.
\* `master` - replace with the desired version tag (e.g. `v0.18.4.7`) to build the release binaries.
3. Prepare build environment
```
cd monero-gui
@@ -128,7 +128,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.18.4.0`) to build the release binaries.
\* `master` - replace with the desired version tag (e.g. `v0.18.4.7`) to build the release binaries.
3. Prepare build environment
```
cd monero-gui

View File

@@ -26,16 +26,19 @@ if(APPLE OR (WIN32 AND NOT STATIC))
)
endif()
# libbost_filesyste-mt.dylib has a dependency on libboost_atomic-mt.dylib, maydeployqt does not copy it by itself
find_package(Boost COMPONENTS atomic)
get_target_property(BOOST_ATOMIC_LIB_PATH Boost::atomic LOCATION)
if(EXISTS ${BOOST_ATOMIC_LIB_PATH})
add_custom_command(TARGET deploy
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy "${BOOST_ATOMIC_LIB_PATH}" "$<TARGET_FILE_DIR:monero-wallet-gui>/../Frameworks/"
COMMENT "Copying libboost_atomic-mt.dylib"
)
endif()
# Copy Boost dylibs that macdeployqt doesn't pick up
find_package(Boost QUIET COMPONENTS atomic container date_time)
set(_boost_extras Boost::atomic Boost::container Boost::date_time)
foreach(_tgt IN LISTS _boost_extras)
if(TARGET ${_tgt})
add_custom_command(TARGET deploy POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"$<TARGET_FILE:${_tgt}>"
"$<TARGET_FILE_DIR:monero-wallet-gui>/../Frameworks/"
COMMENT "Copying $<TARGET_FILE_NAME:${_tgt}>"
)
endif()
endforeach()
# Apple Silicon requires all binaries to be codesigned
find_program(CODESIGN_EXECUTABLE NAMES codesign)
@@ -48,8 +51,12 @@ if(APPLE OR (WIN32 AND NOT STATIC))
endif()
elseif(WIN32)
find_program(QMAKE_EXECUTABLE qmake HINTS "${_qt_bin_dir}")
find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}")
add_custom_command(TARGET monero-wallet-gui POST_BUILD
if(NOT QMAKE_EXECUTABLE OR NOT WINDEPLOYQT_EXECUTABLE)
message(WARNING "Deploy requires qmake.exe and windeployqt.exe (no -qt5 suffix) in ${_qt_bin_dir}")
endif()
add_custom_command(TARGET deploy POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E env PATH="${_qt_bin_dir}" "${WINDEPLOYQT_EXECUTABLE}" "$<TARGET_FILE:monero-wallet-gui>" -no-translations -qmldir="${CMAKE_SOURCE_DIR}"
COMMENT "Running windeployqt..."
)
@@ -96,11 +103,11 @@ if(APPLE OR (WIN32 AND NOT STATIC))
libssl-3-x64.dll
libcrypto-3-x64.dll
#icu
libicudt76.dll
libicuin76.dll
libicuio76.dll
libicutu76.dll
libicuuc76.dll
libicudt78.dll
libicuin78.dll
libicuio78.dll
libicutu78.dll
libicuuc78.dll
)
# Boost Regex is header-only since 1.77

View File

@@ -38,7 +38,7 @@ import "." as MoneroComponents
import "effects/" as MoneroEffects
import "../js/Utils.js" as Utils
Item {
FocusScope {
id: root
visible: false
@@ -50,6 +50,7 @@ Item {
property bool passwordDialogMode
property bool passphraseDialogMode
property bool newPasswordDialogMode
property bool backgroundSyncing
// same signals as Dialog has
signal accepted()
@@ -64,8 +65,6 @@ Item {
capsLockTextLabel.visible = oshelper.isCapsLock();
passwordInput1.reset();
passwordInput2.reset();
if(!appWindow.currentWallet || appWindow.active)
passwordInput1.input.forceActiveFocus();
root.walletName = walletName ? walletName : ""
errorTextLabel.text = errorText ? errorText : "";
leftPanel.enabled = false
@@ -75,12 +74,14 @@ Item {
root.visible = true;
appWindow.hideBalanceForced = true;
appWindow.updateBalance();
Qt.callLater(() => passwordInput1.input.forceActiveFocus())
}
function open(walletName, errorText, okButtonText, okButtonIcon) {
function open(walletName, errorText, okButtonText, okButtonIcon, backgroundSyncOn) {
passwordDialogMode = true;
passphraseDialogMode = false;
newPasswordDialogMode = false;
backgroundSyncing = backgroundSyncOn || false;
root.okButtonText = okButtonText;
root.okButtonIcon = okButtonIcon ? okButtonIcon : "";
_openInit(walletName, errorText);
@@ -90,6 +91,7 @@ Item {
passwordDialogMode = false;
passphraseDialogMode = true;
newPasswordDialogMode = false;
backgroundSyncing = false;
_openInit("", "");
}
@@ -97,6 +99,7 @@ Item {
passwordDialogMode = false;
passphraseDialogMode = false;
newPasswordDialogMode = true;
backgroundSyncing = false;
_openInit("", "");
}
@@ -204,12 +207,13 @@ Item {
font.family: MoneroComponents.Style.fontLight.name
Layout.fillWidth: true
wrapMode: Text.Wrap
text: qsTr("CAPSLOCKS IS ON.") + translationManager.emptyString;
text: qsTr("CAPS LOCK IS ON.") + translationManager.emptyString;
}
MoneroComponents.LineEdit {
id: passwordInput1
password: true
input.focus: root.visible && (appWindow.active || Qt.application.state === Qt.ApplicationActive)
Layout.topMargin: 6
Layout.fillWidth: true
KeyNavigation.tab: {
@@ -300,6 +304,18 @@ Item {
onClicked: onOk()
}
}
Label {
visible: backgroundSyncing
text: qsTr("Syncing in the background...") + translationManager.emptyString;
Layout.fillWidth: true
font.pixelSize: 14
font.family: MoneroComponents.Style.fontLight.name
font.italic: true
color: MoneroComponents.Style.defaultFontColor
}
}
}
}

BIN
images/ledgerFlex.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
images/ledgerNanoGen5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 KiB

View File

@@ -23,7 +23,7 @@ You would think timestamp preservation is no problem when unpacking the zip arch
In any case, after unpacking, check the file dates in the `bin` directory where the installer script looks for them with the dates of the files in the zip file: They must be identical.
Note that the the following line in `Monero.iss` is also important regarding file timestamps:
Note that the following line in `Monero.iss` is also important regarding file timestamps:
TimeStampsInUTC=yes

View File

@@ -56,7 +56,6 @@ Name: "en"; MessagesFile: "compiler:Default.isl"
[Dirs]
Name: "{app}";
Name: "{app}\p2pool"; Permissions: users-full
[Files]
; The use of the flag "ignoreversion" for the following entries leads to the following behaviour:
@@ -138,6 +137,7 @@ Type: filesandordirs; Name: "{app}\QtQuick.2"
Type: filesandordirs; Name: "{app}\Material"
Type: filesandordirs; Name: "{app}\Universal"
Type: filesandordirs; Name: "{app}\scenegraph"
Type: filesandordirs; Name: "{localappdata}\monero-core\p2pool"
Type: filesandordirs; Name: "{app}\p2pool"
Type: files; Name: "{app}\D3Dcompiler_47.dll"
Type: files; Name: "{app}\libbz2-1.dll"
@@ -173,6 +173,8 @@ Type: files; Name: "{app}\ssleay32.dll"
Type: files; Name: "{app}\start-high-dpi.bat"
Type: files; Name: "{group}\Utilities\x (Check Blockchain Folder).lnk"
[UninstallDelete]
Type: filesandordirs; Name: "{localappdata}\monero-core\p2pool"
[Tasks]
Name: desktopicon; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:";

View File

@@ -21,7 +21,6 @@ function addressTruncatePretty(address, blocks){
if(typeof(address) === "undefined") return "";
if(typeof(blocks) === "undefined") blocks = 2;
blocks = blocks <= 1 ? 1 : blocks >= 23 ? 23 : blocks;
var ret = "";
return address.substring(0, 4 * blocks).match(/.{1,4}/g).join(' ') + " .. " + address.substring(address.length - 4 * blocks).match(/.{1,4}/g).join(' ');
}

View File

@@ -53,7 +53,7 @@ function ago(epoch) {
// Returns '<delta> [seconds|minutes|hours|days] ago' string given an epoch
var now = new Date().getTime() / 1000;
var delta = now - epoch;
var delta = Math.max(now - epoch, 0);
if(delta < 60)
return qsTr("%n second(s) ago", "0", Math.floor(delta))

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -22,7 +22,7 @@ Lojban
<!-- <language display_name="English (ZA)" locale="en_SA" wallet_language="English" flag="/lang/flags/za.png" qs="none"/> -->
<!-- <language display_name="العربية (PS)" locale="ar_PS" wallet_language="English" flag="/lang/flags/ps.png" qs="none"/> -->
<language display_name="Deutsch" locale="de_DE" wallet_language="Deutsch" flag="/lang/flags/de.png" qs="none"/>
<language display_name="Esperanto" locale="eo" wallet_language="Esperanto" flag="/lang/flags/esperanto.png" qs="none"/>
<language display_name="Esperanto" locale="eo_EO" wallet_language="Esperanto" flag="/lang/flags/eo.png" qs="none"/>
<language display_name="Español" locale="es_ES" wallet_language="Español" flag="/lang/flags/es.png" qs="none"/>
<language display_name="Français" locale="fr_FR" wallet_language="Français" flag="/lang/flags/fr.png" qs="none"/>
<language display_name="Svenska" locale="sv_SE" wallet_language="English" flag="/lang/flags/se.png" qs="none"/>

122
main.qml
View File

@@ -94,11 +94,13 @@ ApplicationWindow {
readonly property string localDaemonAddress : "localhost:" + getDefaultDaemonRpcPort(persistentSettings.nettype)
property string currentDaemonAddress;
property int disconnectedEpoch: 0
property int estimatedBlockchainSize: persistentSettings.pruneBlockchain ? 55 : 150 // GB
property int estimatedBlockchainSize: persistentSettings.pruneBlockchain ? 110 : 270 // GB
property alias viewState: rootItem.state
property string prevSplashText;
property bool splashDisplayedBeforeButtonRequest;
property bool themeTransition: false
property int backgroundSyncType: Wallet.BackgroundSync_Off;
property bool isQuitting: false
// fiat price conversion
property real fiatPrice: 0
@@ -133,6 +135,12 @@ ApplicationWindow {
}
function lock() {
if (currentWallet && currentWallet.getBackgroundSyncType() != Wallet.BackgroundSync_Off) {
appWindow.showProcessingSplash(qsTr("Locking..."));
currentWallet.startBackgroundSync()
return;
}
passwordDialog.onRejectedCallback = function() { appWindow.showWizard(); }
passwordDialog.onAcceptedCallback = function() {
if(walletPassword === passwordDialog.password)
@@ -275,6 +283,15 @@ ApplicationWindow {
persistentSettings.kdfRounds);
}
function gracefulQuit() {
if (isQuitting)
return;
isQuitting = true;
closeWallet(function() {
Qt.quit();
})
}
function closeWallet(callback) {
// Disconnect all listeners
@@ -288,6 +305,9 @@ ApplicationWindow {
currentWallet.heightRefreshed.disconnect(onHeightRefreshed);
currentWallet.refreshed.disconnect(onWalletRefresh)
currentWallet.updated.disconnect(onWalletUpdate)
currentWallet.backgroundSyncSetup.disconnect(onBackgroundSyncSetup)
currentWallet.backgroundSyncStarted.disconnect(onBackgroundSyncStarted)
currentWallet.backgroundSyncStopped.disconnect(onBackgroundSyncStopped)
currentWallet.newBlock.disconnect(onWalletNewBlock)
currentWallet.moneySpent.disconnect(onWalletMoneySent)
currentWallet.moneyReceived.disconnect(onWalletMoneyReceived)
@@ -324,6 +344,7 @@ ApplicationWindow {
walletName = usefulName(wallet.path)
viewOnly = currentWallet.viewOnly;
backgroundSyncType = currentWallet.getBackgroundSyncType();
// New wallets saves the testnet flag in keys file.
if(persistentSettings.nettype != currentWallet.nettype) {
@@ -335,6 +356,9 @@ ApplicationWindow {
currentWallet.heightRefreshed.connect(onHeightRefreshed);
currentWallet.refreshed.connect(onWalletRefresh)
currentWallet.updated.connect(onWalletUpdate)
currentWallet.backgroundSyncSetup.connect(onBackgroundSyncSetup)
currentWallet.backgroundSyncStarted.connect(onBackgroundSyncStarted)
currentWallet.backgroundSyncStopped.connect(onBackgroundSyncStopped)
currentWallet.newBlock.connect(onWalletNewBlock)
currentWallet.moneySpent.connect(onWalletMoneySent)
currentWallet.moneyReceived.connect(onWalletMoneyReceived)
@@ -544,6 +568,15 @@ ApplicationWindow {
}
}
// Don't allow opening background wallets in the GUI
if (wallet.isBackgroundWallet()) {
passwordDialog.onCancel();
appWindow.showStatusMessage(qsTr("Can't open background wallets in the GUI"),6);
console.log("closing background wallet");
closeWallet();
return;
}
// wallet opened successfully, subscribing for wallet updates
connectWallet(wallet)
@@ -585,16 +618,17 @@ ApplicationWindow {
devicePassphraseDialog.open(on_device)
}
function onWalletUpdate() {
function onWalletUpdate(stoppedBackgroundSync) {
if (!currentWallet)
return;
console.log(">>> wallet updated")
updateBalance();
// Update history if new block found since last update
if(foundNewBlock) {
// Update history if new block found since last update or background sync was just stopped
if(foundNewBlock || stoppedBackgroundSync) {
if (foundNewBlock)
console.log("New block found - updating history")
foundNewBlock = false;
console.log("New block found - updating history")
currentWallet.history.refresh(currentWallet.currentSubaddressAccount)
if(middlePanel.state == "History")
@@ -602,6 +636,61 @@ ApplicationWindow {
}
}
function onBackgroundSyncSetup() {
console.log(">>> background sync setup");
hideProcessingSplash();
if (currentWallet.status !== Wallet.Status_Ok) {
console.error("Error setting up background sync: ", currentWallet.errorString);
appWindow.showStatusMessage(currentWallet.errorString, 5);
return;
}
appWindow.backgroundSyncType = currentWallet.getBackgroundSyncType();
}
function onBackgroundSyncStarted() {
console.log(">>> background sync started");
hideProcessingSplash();
var started = currentWallet.status === Wallet.Status_Ok;
if (!started) {
console.error("Error starting background sync: ", currentWallet.errorString);
appWindow.showStatusMessage(currentWallet.errorString, 5);
}
passwordDialog.onRejectedCallback = function() { appWindow.showWizard(); }
passwordDialog.onAcceptedCallback = function() {
if(walletPassword === passwordDialog.password) {
if (currentWallet && started) {
appWindow.showProcessingSplash(qsTr("Unlocking..."));
currentWallet.stopBackgroundSync(walletPassword);
} else {
passwordDialog.close();
}
} else {
passwordDialog.showError(qsTr("Wrong password") + translationManager.emptyString);
}
}
passwordDialog.open(usefulName(persistentSettings.wallet_path), "", "", "", started);
}
function onBackgroundSyncStopped() {
console.log(">>> background sync stopped");
var stopped = currentWallet.status === Wallet.Status_Ok;
if (!stopped) {
hideProcessingSplash();
console.error("Error stopping background sync: ", currentWallet.errorString);
// If there is an error stopping background sync, the spend key
// won't be loaded and the wallet will be in a broken state. Don't
// let the user continue normal wallet operations in this state.
passwordDialog.showError(qsTr("Error stopping background sync: ") + currentWallet.errorString);
return;
}
onWalletUpdate(stopped);
hideProcessingSplash();
passwordDialog.close();
}
function connectRemoteNode() {
console.log("connecting remote node");
@@ -1658,7 +1747,7 @@ ApplicationWindow {
onRejected: console.log("data dir selection canceled")
onAccepted: {
var dataDir = walletManager.urlToLocalPath(blockchainFileDialog.fileUrl)
var validator = daemonManager.validateDataDir(dataDir);
var validator = daemonManager.validateDataDir(dataDir, estimatedBlockchainSize);
if(validator.valid) {
persistentSettings.blockchainDataDir = dataDir;
} else {
@@ -2258,6 +2347,20 @@ ApplicationWindow {
var inactivity = Utils.epoch() - appWindow.userLastActive;
if(inactivity < (persistentSettings.lockOnUserInActivityInterval * 60)) return;
if (inputDialogVisible) inputDialog.close()
remoteNodeDialog.close();
informationPopup.close()
txConfirmationPopup.close()
txConfirmationPopup.clearFields()
txConfirmationPopup.rejected()
successfulTxPopup.close();
if (currentWallet && currentWallet.getBackgroundSyncType() != Wallet.BackgroundSync_Off) {
appWindow.showProcessingSplash(qsTr("Locking..."));
currentWallet.startBackgroundSync()
return;
}
passwordDialog.onAcceptedCallback = function() {
if(walletPassword === passwordDialog.password){
passwordDialog.close();
@@ -2270,13 +2373,6 @@ ApplicationWindow {
}
passwordDialog.onRejectedCallback = function() { appWindow.showWizard(); }
if (inputDialogVisible) inputDialog.close()
remoteNodeDialog.close();
informationPopup.close()
txConfirmationPopup.close()
txConfirmationPopup.clearFields()
txConfirmationPopup.rejected()
successfulTxPopup.close();
passwordDialog.open();
}

2
monero

Submodule monero updated: f1311d4237...dbcc7d212c

View File

@@ -1447,7 +1447,6 @@ Rectangle {
var txs = [];
for (var i = 0; i < root.txData.length; i++){
var item = root.txData[i];
var matched = "";
// daterange filtering
if(item.timestamp < fromDate || item.timestamp > toDate){
@@ -1543,6 +1542,7 @@ Rectangle {
function updateTransactionsFromModel() {
// This function copies the items of `appWindow.currentWallet.historyModel` to `root.txModelData`, as a list of javascript objects
if(currentWallet == null || typeof currentWallet.history === "undefined" ) return;
if(currentWallet.isBackgroundSyncing()) return;
var _model = root.model;
var total = 0

View File

@@ -384,6 +384,7 @@ Rectangle {
ListElement { column1: qsTr("Mini") ; column2: ""; priority: 0}
ListElement { column1: qsTr("Main") ; column2: ""; priority: 1}
ListElement { column1: qsTr("Nano") ; column2: ""; priority: 2}
}
ColumnLayout {
@@ -400,7 +401,7 @@ Rectangle {
MoneroComponents.Tooltip {
id: chainsHelpTooltip
text: qsTr("Use the mini chain if you have a low hashrate.") + translationManager.emptyString
text: qsTr("Use the mini or nano chains if you have a low hashrate.") + translationManager.emptyString
}
MouseArea {
@@ -448,26 +449,43 @@ Rectangle {
id: flagsHelpTooltip
text: "
Usage:<br>
--wallet Wallet address to mine to. Subaddresses and integrated addresses are not supported!<br>
--host IP address of your Monero node, default is 127.0.0.1<br>
--rpc-port monerod RPC API port number, default is 18081<br>
--zmq-port monerod ZMQ pub port number, default is 18083 (same port as in monerod\'s \"--zmq-pub\" command line parameter)<br>
--stratum Comma-separated list of IP:port for stratum server to listen on<br>
--p2p Comma-separated list of IP:port for p2p server to listen on<br>
--addpeers Comma-separated list of IP:port of other p2pool nodes to connect to<br>
--light-mode Don't allocate RandomX dataset, saves 2GB of RAM<br>
--loglevel Verbosity of the log, integer number between 0 and 6<br>
--config Name of the p2pool config file<br>
--data-api Path to the p2pool JSON data (use it in tandem with an external web-server)<br>
--local-api Enable /local/ path in api path for Stratum Server and built-in miner statistics<br>
--stratum-api An alias for --local-api<br>
--no-cache Disable p2pool.cache<br>
--no-color Disable colors in console output<br>
--no-randomx Disable internal RandomX hasher: p2pool will use RPC calls to monerod to check PoW hashes<br>
--out-peers N Maximum number of outgoing connections for p2p server (any value between 10 and 1000)<br>
--in-peers N Maximum number of incoming connections for p2p server (any value between 10 and 1000)<br>
--start-mining N Start built-in miner using N threads (any value between 1 and 64)<br>
--help Show this help message
--wallet Wallet address to mine to. Subaddresses and integrated addresses are not supported!<br>
--host IP address of your Monero node, default is 127.0.0.1<br>
--rpc-port monerod RPC API port number, default is 18081<br>
--zmq-port monerod ZMQ pub port number, default is 18083 (same port as in monerod\'s \"--zmq-pub\" command line parameter)<br>
--stratum Comma-separated list of IP:port for stratum server to listen on<br>
--p2p Comma-separated list of IP:port for p2p server to listen on<br>
--addpeers Comma-separated list of IP:port of other p2pool nodes to connect to<br>
--stratum-ban-time N Number of seconds to ban misbehaving stratum client, default is 600<br>
--light-mode Don't allocate RandomX dataset, saves 2GB of RAM<br>
--loglevel Verbosity of the log, integer number between 0 and 6<br>
--data-dir Path to store general p2pool files (log, cache, peer data, etc.), default is current directory<br>
--sidechain-config Name of the p2pool sidechain parameters file (only use it if you run your own sidechain)<br>
--data-api Path to the p2pool JSON data (use it in tandem with an external web-server)<br>
--local-api Enable /local/ path in api path for Stratum Server and built-in miner statistics<br>
--stratum-api An alias for --local-api<br>
--no-cache Disable p2pool.cache<br>
--no-color Disable colors in console output<br>
--no-randomx Disable internal RandomX hasher: p2pool will use RPC calls to monerod to check PoW hashes<br>
--out-peers N Maximum number of outgoing connections for p2p server (any value between 10 and 1000)<br>
--in-peers N Maximum number of incoming connections for p2p server (any value between 10 and 1000)<br>
--start-mining N Start built-in miner using N threads (any value between 1 and 64)<br>
--no-autodiff Disable automatic difficulty adjustment for miners connected to stratum (WARNING: incompatible with Nicehash and MRR)<br>
--rpc-login Specify username[:password] required for Monero RPC server<br>
--socks5 Specify IP:port of a SOCKS5 proxy to use for outgoing connections<br>
--no-dns Disable DNS queries, use only IP addresses to connect to peers (seed node DNS will be unavailable too)<br>
--p2p-external-port Port number that your router uses for mapping to your local p2p port. Use it if you are behind a NAT and still want to accept incoming connections<br>
--no-upnp Disable UPnP port forwarding<br>
--no-igd An alias for --no-upnp<br>
--upnp-stratum Port forward Stratum port (it's not forwarded by default)<br>
--merge-mine IP:port and wallet address for another blockchain to merge mine with<br>
--version Print p2pool's version and build details<br>
--tls-cert file Load TLS certificate chain from \"file\" in the PEM format<br>
--tls-cert-key file Load TLS certificate private key from \"file\" in the PEM format<br>
--rpc-ssl Enable SSL on RPC connections to the Monero node<br>
--rpc-ssl-fingerprint base64-encoded fingerprint of the Monero node's certificate (optional, use it for certificate pinning)<br>
--no-stratum-http Disable HTTP on Stratum ports<br>
--help Show this help message
"
}
@@ -630,6 +648,9 @@ allArgs = allArgs.filter( ( el ) => !defaultArgs.includes( el.split(" ")[0] ) )
if (chainDropdown.currentIndex === 1) {
chain = "main"
}
if (chainDropdown.currentIndex === 2) {
chain = "nano"
}
var p2poolArgs = persistentSettings.p2poolFlags;
var success = p2poolManager.start(p2poolArgs, address, chain, threads);
if (success)

View File

@@ -31,6 +31,8 @@ import QtQuick.Layouts 1.1
import QtQuick.Controls 2.0
import QtQuick.Dialogs 1.2
import moneroComponents.Wallet 1.0
import "../../js/Utils.js" as Utils
import "../../js/Windows.js" as Windows
import "../../components" as MoneroComponents
@@ -155,6 +157,28 @@ Rectangle {
onMoved: persistentSettings.lockOnUserInActivityInterval = value
}
MoneroComponents.CheckBox {
id: backgroundSyncCheckbox
visible: !!currentWallet && !currentWallet.isHwBacked() && !appWindow.viewOnly
checked: appWindow.backgroundSyncType != Wallet.BackgroundSync_Off
text: qsTr("Sync in the background when locked") + translationManager.emptyString
toggleOnClick: false
onClicked: {
if (currentWallet && appWindow) {
appWindow.showProcessingSplash(qsTr("Updating settings..."))
// TODO: add support for custom background password option
var newBackgroundSyncType = Wallet.BackgroundSync_Off
if (currentWallet.getBackgroundSyncType() === Wallet.BackgroundSync_Off)
newBackgroundSyncType = Wallet.BackgroundSync_ReusePassword
// TODO: don't keep the wallet password in memory on the appWindow
// https://github.com/monero-project/monero-gui/issues/1537#issuecomment-410055329
currentWallet.setupBackgroundSync(newBackgroundSyncType, appWindow.walletPassword)
}
}
}
MoneroComponents.CheckBox {
checked: persistentSettings.askStopLocalNode
onClicked: persistentSettings.askStopLocalNode = !persistentSettings.askStopLocalNode

View File

@@ -64,7 +64,7 @@
<file>lang/flags/cz.png</file>
<file>lang/flags/dk.png</file>
<file>lang/flags/eg.png</file>
<file>lang/flags/esperanto.png</file>
<file>lang/flags/eo.png</file>
<file>lang/flags/fi.png</file>
<file>lang/flags/fr.png</file>
<file>lang/flags/de.png</file>
@@ -281,7 +281,9 @@
<file>images/ledgerNanoS.png</file>
<file>images/ledgerNanoSPlus.png</file>
<file>images/ledgerNanoX.png</file>
<file>images/ledgerNanoGen5.png</file>
<file>images/ledgerStax.png</file>
<file>images/ledgerFlex.png</file>
<file>images/trezor3.png</file>
<file>images/trezor5.png</file>
<file>images/trezorT.png</file>

View File

@@ -38,9 +38,6 @@
<key>NSSupportsAutomaticGraphicsSwitching</key>
<true/>
<key>NSRequiresAquaSystemAppearance</key>
<string>True</string>
<key>CFBundleURLTypes</key>
<array>
<dict>

View File

@@ -297,7 +297,7 @@ void DaemonManager::exit()
m_app_exit = true;
}
QVariantMap DaemonManager::validateDataDir(const QString &dataDir) const
QVariantMap DaemonManager::validateDataDir(const QString &dataDir, const int estimatedBlockchainSize) const
{
QVariantMap result;
bool valid = true;
@@ -312,9 +312,8 @@ QVariantMap DaemonManager::validateDataDir(const QString &dataDir) const
valid = false;
}
// Make sure there is 75GB storage available
storageAvailable = storage.bytesAvailable()/1000/1000/1000;
if (storageAvailable < 75) {
if (storageAvailable < estimatedBlockchainSize) {
valid = false;
}
} else {
@@ -339,7 +338,7 @@ bool DaemonManager::checkLmdbExists(QString datadir) {
if (datadir.isEmpty() || datadir.isNull()) {
datadir = QString::fromStdString(tools::get_default_data_dir());
}
return validateDataDir(datadir).value("lmdbExists").value<bool>();
return QDir(datadir + "/lmdb").exists();
}
QString DaemonManager::getArgs(const QString &dataDir) {

View File

@@ -56,7 +56,7 @@ public:
// Send daemon command from qml and prints output in console window.
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 QVariantMap validateDataDir(const QString &dataDir, const int estimatedBlockchainSizeGb) const;
Q_INVOKABLE bool checkLmdbExists(QString datadir);
Q_INVOKABLE QString getArgs(const QString &dataDir);

View File

@@ -529,6 +529,69 @@ bool Wallet::scanTransactions(const QVector<QString> &txids)
return m_walletImpl->scanTransactions(c);
}
void Wallet::setupBackgroundSync(const Wallet::BackgroundSyncType background_sync_type, const QString &wallet_password)
{
qDebug() << "Setting up background sync";
bool refreshEnabled = m_refreshEnabled;
pauseRefresh();
// run inside scheduler because of lag when stopping/starting refresh
m_scheduler.run([this, refreshEnabled, background_sync_type, &wallet_password] {
m_walletImpl->setupBackgroundSync(
static_cast<Monero::Wallet::BackgroundSyncType>(background_sync_type),
wallet_password.toStdString(),
Monero::optional<std::string>());
if (refreshEnabled)
startRefresh();
emit backgroundSyncSetup();
});
}
Wallet::BackgroundSyncType Wallet::getBackgroundSyncType() const
{
return static_cast<BackgroundSyncType>(m_walletImpl->getBackgroundSyncType());
}
bool Wallet::isBackgroundWallet() const
{
return m_walletImpl->isBackgroundWallet();
}
bool Wallet::isBackgroundSyncing() const
{
return m_walletImpl->isBackgroundSyncing();
}
void Wallet::startBackgroundSync()
{
qDebug() << "Starting background sync";
bool refreshEnabled = m_refreshEnabled;
pauseRefresh();
// run inside scheduler because of lag when stopping/starting refresh
m_scheduler.run([this, refreshEnabled] {
m_walletImpl->startBackgroundSync();
if (refreshEnabled)
startRefresh();
emit backgroundSyncStarted();
});
}
void Wallet::stopBackgroundSync(const QString &password)
{
qDebug() << "Stopping background sync";
bool refreshEnabled = m_refreshEnabled;
pauseRefresh();
// run inside scheduler because of lag when stopping/starting refresh
m_scheduler.run([this, password, refreshEnabled] {
m_walletImpl->stopBackgroundSync(password.toStdString());
if (refreshEnabled)
startRefresh();
emit backgroundSyncStopped();
});
}
bool Wallet::refresh(bool historyAndSubaddresses /* = true */)
{
refreshingSet(true);

View File

@@ -112,6 +112,14 @@ public:
Q_ENUM(ConnectionStatus)
enum BackgroundSyncType {
BackgroundSync_Off = Monero::Wallet::BackgroundSync_Off,
BackgroundSync_ReusePassword = Monero::Wallet::BackgroundSync_ReusePassword,
BackgroundSync_CustomPassword = Monero::Wallet::BackgroundSync_CustomPassword
};
Q_ENUM(BackgroundSyncType)
//! returns mnemonic seed
QString getSeed() const;
@@ -215,6 +223,17 @@ public:
//! scan transactions
Q_INVOKABLE bool scanTransactions(const QVector<QString> &txids);
Q_INVOKABLE void setupBackgroundSync(const BackgroundSyncType background_sync_type, const QString &wallet_password);
Q_INVOKABLE BackgroundSyncType getBackgroundSyncType() const;
Q_INVOKABLE bool isBackgroundWallet() const;
Q_INVOKABLE bool isBackgroundSyncing() const;
//! scan in the background with just the view key (wipe the spend key)
Q_INVOKABLE void startBackgroundSync();
//! bring the spend key back and process background synced txs
Q_INVOKABLE void stopBackgroundSync(const QString &password);
//! refreshes the wallet
Q_INVOKABLE bool refresh(bool historyAndSubaddresses = true);
@@ -369,6 +388,9 @@ signals:
void moneyReceived(const QString &txId, quint64 amount);
void unconfirmedMoneyReceived(const QString &txId, quint64 amount);
void newBlock(quint64 height, quint64 targetHeight);
void backgroundSyncSetup() const;
void backgroundSyncStarted() const;
void backgroundSyncStopped() const;
void addressBookChanged() const;
void historyModelChanged() const;
void walletCreationHeightChanged();

View File

@@ -38,6 +38,11 @@ filter::filter(QObject *parent) :
}
bool filter::eventFilter(QObject *obj, QEvent *ev) {
if (ev->type() == QEvent::Quit) {
emit quitRequested();
return true;
}
// macOS sends fileopen signal for incoming uri handlers
if (ev->type() == QEvent::FileOpen) {
QFileOpenEvent *openEvent = static_cast<QFileOpenEvent *>(ev);

View File

@@ -44,6 +44,7 @@ protected:
bool eventFilter(QObject *obj, QEvent *ev);
signals:
void quitRequested();
void sequencePressed(const QVariant &o, const QVariant &seq);
void sequenceReleased(const QVariant &o, const QVariant &seq);
void mousePressed(const QVariant &o, const QVariant &x, const QVariant &y);

View File

@@ -562,6 +562,7 @@ Verify update binary using 'shasum'-compatible (SHA256 algo) output signed by tw
qCritical() << "QrCodeScanner : something went wrong !";
#endif
QObject::connect(eventFilter, &filter::quitRequested, rootObject, [rootObject]{ QMetaObject::invokeMethod(rootObject, "gracefulQuit", Qt::QueuedConnection); });
QObject::connect(eventFilter, SIGNAL(sequencePressed(QVariant,QVariant)), rootObject, SLOT(sequencePressed(QVariant,QVariant)));
QObject::connect(eventFilter, SIGNAL(sequenceReleased(QVariant,QVariant)), rootObject, SLOT(sequenceReleased(QVariant,QVariant)));
QObject::connect(eventFilter, SIGNAL(mousePressed(QVariant,QVariant,QVariant)), rootObject, SLOT(mousePressed(QVariant,QVariant,QVariant)));

View File

@@ -43,6 +43,8 @@
#include <QFileInfo>
#include <QString>
#include <QUrl>
#include <QByteArray>
#include <QRandomGenerator>
#ifdef Q_OS_MAC
#include "qt/macoshelper.h"
#endif
@@ -246,6 +248,18 @@ QString OSHelper::temporaryPath() const
return QDir::tempPath();
}
QString OSHelper::randomPassword(int numBytes) const
{
numBytes = qBound(16, numBytes, 128);
QByteArray buf(numBytes, Qt::Uninitialized);
auto *rng = QRandomGenerator::system();
for (int i = 0; i < numBytes; ++i)
buf[i] = char(rng->generate() & 0xFF);
return QString::fromLatin1(buf.toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals));
}
bool OSHelper::installed() const
{
#ifdef Q_OS_WIN

View File

@@ -51,14 +51,15 @@ public:
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 QString randomPassword(int numBytes = 32) 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;
bool installed() const;
static std::pair<quint8, QString> getNetworkTypeAndAddressFromFile(const QString &wallet);
private:
bool installed() const;
signals:

View File

@@ -29,6 +29,7 @@
#include "P2PoolManager.h"
#include "net/http_client.h"
#include "common/util.h"
#include "main/oshelper.h"
#include "qt/utils.h"
#include <QElapsedTimer>
#include <QFile>
@@ -41,6 +42,7 @@
#include <QApplication>
#include <QProcess>
#include <QMap>
#include <QStandardPaths>
#include <QCryptographicHash>
#if defined(Q_OS_MACOS) && defined(__aarch64__) && !defined(Q_OS_MACOS_AARCH64)
@@ -53,21 +55,21 @@ void P2PoolManager::download() {
QString fileName;
QString validHash;
#ifdef Q_OS_WIN
url = "https://github.com/SChernykh/p2pool/releases/download/v4.4/p2pool-v4.4-windows-x64.zip";
fileName = m_p2poolPath + "/p2pool-v4.4-windows-x64.zip";
validHash = "2f04ec3f4b28edf6f70bfc369b6ffba8d38af53d7a787d9ef5d630e5925e51de";
url = "https://github.com/SChernykh/p2pool/releases/download/v4.14/p2pool-v4.14-windows-x64.zip";
fileName = m_p2poolPath + "/p2pool-v4.14-windows-x64.zip";
validHash = "9c7f0476c441fc0c021fae7d01264b4ec61dc3301ed73b65931555550becf396";
#elif defined(Q_OS_LINUX)
url = "https://github.com/SChernykh/p2pool/releases/download/v4.4/p2pool-v4.4-linux-x64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.4-linux-x64.tar.gz";
validHash = "a3495e19b2587a38ac9afdb73de8e2eadc90f21e2c348cb972a3ece678cad5f1";
url = "https://github.com/SChernykh/p2pool/releases/download/v4.14/p2pool-v4.14-linux-x64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.14-linux-x64.tar.gz";
validHash = "e64f6f774dc35352b8ae4397ccdb92ce0cc935cdfb100eac58d44e49f8796a01";
#elif defined(Q_OS_MACOS_AARCH64)
url = "https://github.com/SChernykh/p2pool/releases/download/v4.4/p2pool-v4.4-macos-aarch64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.4-macos-aarch64.tar.gz";
validHash = "b8496fe1c5312fa3678e3d0e5ba0cfb7b498b1358dc7ed76a20a38574fef35d4";
url = "https://github.com/SChernykh/p2pool/releases/download/v4.14/p2pool-v4.14-macos-aarch64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.14-macos-aarch64.tar.gz";
validHash = "7cc780af6115ef8d9d6b7f3c1336f57dab25745b6208b6e97dca8729782e155b";
#elif defined(Q_OS_MACOS)
url = "https://github.com/SChernykh/p2pool/releases/download/v4.4/p2pool-v4.4-macos-x64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.4-macos-x64.tar.gz";
validHash = "8ab40faf7d1032835a3b3319b193ad2e14901e0b01e1e802c6b8333c8b75dfad";
url = "https://github.com/SChernykh/p2pool/releases/download/v4.14/p2pool-v4.14-macos-x64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.14-macos-x64.tar.gz";
validHash = "7df3be2ae15eda4260d2665e4a2c3c7dc2f1dba26a2a643e46a2b1283097a60a";
#endif
QFile file(fileName);
epee::net_utils::http::http_simple_client http_client;
@@ -182,6 +184,10 @@ bool P2PoolManager::start(const QString &flags, const QString &address, const QS
arguments << "--start-mining" << threads;
}
if (chain == "nano") {
arguments << "--nano";
}
if (chain == "mini") {
arguments << "--mini";
}
@@ -237,9 +243,14 @@ P2PoolManager::P2PoolManager(QObject *parent)
started = false;
// Platform dependent path to p2pool
#ifdef Q_OS_WIN
m_p2poolPath = QApplication::applicationDirPath() + "/p2pool";
if (OSHelper().installed()) {
m_p2poolPath = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/p2pool";
} else {
m_p2poolPath = QApplication::applicationDirPath() + "/p2pool";
}
if (!QDir(m_p2poolPath).exists()) {
QDir().mkdir(m_p2poolPath);
QDir().mkpath(m_p2poolPath);
}
m_p2pool = m_p2poolPath + "/p2pool.exe";
#elif defined(Q_OS_UNIX)

View File

@@ -29,6 +29,8 @@
#include <QtCore>
#include <QCoreApplication>
#include <QtGlobal>
#include <QRandomGenerator>
#include <QStringList>
#include "TailsOS.h"
#include "utils.h"
@@ -134,83 +136,87 @@ void registerXdgMime(){
}
#endif
QString randomUserAgent(){
QStringList urand;
urand << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
<< "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0"
<< "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0"
<< "Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0"
<< "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0"
<< "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0"
<< "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0"
<< "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0"
<< "Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0"
<< "Mozilla/5.0 (X11; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0"
<< "Mozilla/5.0 (Windows NT 6.1; rv:27.3) Gecko/20130101 Firefox/27.3"
<< "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:27.0) Gecko/20121011 Firefox/27.0"
<< "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0"
<< "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0"
<< "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
<< "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0"
<< "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0"
<< "Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0"
<< "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0"
<< "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0"
<< "Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/22.0"
<< "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0"
<< "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0"
<< "Mozilla/5.0 (Microsoft Windows NT 6.2.9200.0); rv:22.0) Gecko/20130405 Firefox/22.0"
<< "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1"
<< "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1"
<< "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0"
<< "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0"
<< "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0"
<< "Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20130514 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20130326 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130401 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130331 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130330 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130328 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130401 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130331 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 5.0; rv:21.0) Gecko/20100101 Firefox/21.0"
<< "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0"
<< "Mozilla/5.0 (Windows NT 6.2; Win64; x64;) Gecko/20100101 Firefox/20.0"
<< "Mozilla/5.0 (Windows x86; rv:19.0) Gecko/20100101 Firefox/19.0"
<< "Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/19.0"
<< "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/18.0.1"
<< "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"
<< "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6"
<< "Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0"
<< "Mozilla/6.0 (Windows NT 6.2; WOW64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1"
<< "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1"
<< "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1"
<< "Mozilla/5.0 (X11; NetBSD amd64; rv:16.0) Gecko/20121102 Firefox/16.0"
<< "Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2"
<< "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20120427 Firefox/15.0a1"
<< "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1"
<< "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:15.0) Gecko/20120910144328 Firefox/15.0.2"
<< "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1"
<< "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:15.0) Gecko/20121011 Firefox/15.0.1"
<< "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:14.0) Gecko/20120405 Firefox/14.0a1"
<< "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20120405 Firefox/14.0a1"
<< "Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20120405 Firefox/14.0a1"
<< "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1"
<< "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1"
<< "Mozilla/5.0 (Windows; U; Windows NT 6.1; WOW64; en-US; rv:2.0.4) Gecko/20120718 AskTbAVR-IDW/3.12.5.17700 Firefox/14.0.1"
<< "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/14.0.1"
<< "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/ 20120405 Firefox/14.0.1"
<< "Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1"
<< "Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/13.0.1"
<< "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0"
<< "Mozilla/5.0 (Windows NT 6.1; de;rv:12.0) Gecko/20120403211507 Firefox/12.0";
QString randomUserAgent()
{
const QStringList userAgents = {
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1",
"Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0",
"Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0",
"Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0",
"Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0",
"Mozilla/5.0 (X11; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0",
"Mozilla/5.0 (Windows NT 6.1; rv:27.3) Gecko/20130101 Firefox/27.3",
"Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:27.0) Gecko/20121011 Firefox/27.0",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0",
"Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0",
"Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0",
"Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/22.0",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0",
"Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0",
"Mozilla/5.0 (Microsoft Windows NT 6.2.9200.0); rv:22.0) Gecko/20130405 Firefox/22.0",
"Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1",
"Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0",
"Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0",
"Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20130514 Firefox/21.0",
"Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20130326 Firefox/21.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130401 Firefox/21.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130331 Firefox/21.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130330 Firefox/21.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0",
"Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0",
"Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130328 Firefox/21.0",
"Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0",
"Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130401 Firefox/21.0",
"Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130331 Firefox/21.0",
"Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0",
"Mozilla/5.0 (Windows NT 5.0; rv:21.0) Gecko/20100101 Firefox/21.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0",
"Mozilla/5.0 (Windows NT 6.2; Win64; x64;) Gecko/20100101 Firefox/20.0",
"Mozilla/5.0 (Windows x86; rv:19.0) Gecko/20100101 Firefox/19.0",
"Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/19.0",
"Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/18.0.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6",
"Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0",
"Mozilla/6.0 (Windows NT 6.2; WOW64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1",
"Mozilla/5.0 (Windows NT 6.2; WOW64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1",
"Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1",
"Mozilla/5.0 (X11; NetBSD amd64; rv:16.0) Gecko/20121102 Firefox/16.0",
"Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20120427 Firefox/15.0a1",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1",
"Mozilla/5.0 (Windows NT 6.2; WOW64; rv:15.0) Gecko/20120910144328 Firefox/15.0.2",
"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:15.0) Gecko/20121011 Firefox/15.0.1",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:14.0) Gecko/20120405 Firefox/14.0a1",
"Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20120405 Firefox/14.0a1",
"Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20120405 Firefox/14.0a1",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1",
"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; WOW64; en-US; rv:2.0.4) Gecko/20120718 AskTbAVR-IDW/3.12.5.17700 Firefox/14.0.1",
"Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/14.0.1",
"Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/ 20120405 Firefox/14.0.1",
"Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1",
"Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/13.0.1",
"Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0",
"Mozilla/5.0 (Windows NT 6.1; de;rv:12.0) Gecko/20120403211507 Firefox/12.0"
};
// @TODO: Qt 5.10 - QRandomGenerator
int irand = rand() % urand.length();
return urand.at(irand);
if (userAgents.isEmpty())
return {};
const int idx = QRandomGenerator::global()->bounded(userAgents.size());
return userAgents.at(idx);
}

View File

@@ -47,7 +47,7 @@ ColumnLayout {
return passwordInput.text === passwordInputConfirm.text;
}
function calcPasswordStrength(inp) {
function calcPasswordStrength() {
if(!progressLayout.visible) return;
if(passwordInput.text.length <= 1){
root.passwordFill = 0;

View File

@@ -345,7 +345,7 @@ Rectangle {
console.log("Creating temporary wallet", tmp_wallet_filename)
var nettype = appWindow.persistentSettings.nettype;
var kdfRounds = appWindow.persistentSettings.kdfRounds;
var wallet = walletManager.createWallet(tmp_wallet_filename, "", persistentSettings.language_wallet, nettype, kdfRounds)
var wallet = walletManager.createWallet(tmp_wallet_filename, oshelper.randomPassword(), persistentSettings.language_wallet, nettype, kdfRounds)
wizardController.walletOptionsSeed = wallet.seed
@@ -378,9 +378,6 @@ Rectangle {
console.log("Removing temporary wallet: " + wizardController.tmpWalletFilename)
oshelper.removeTemporaryWallet(wizardController.tmpWalletFilename)
// protecting wallet with password
wizardController.m_wallet.setPassword(wizardController.walletOptionsPassword);
// save to persistent settings
persistentSettings.account_name = wizardController.walletOptionsName
persistentSettings.wallet_path = wizardController.m_wallet.path;
@@ -399,6 +396,7 @@ Rectangle {
new_wallet_filename = appWindow.accountsDir + new_wallet_filename;
}
console.log("saving new wallet to", new_wallet_filename);
wizardController.m_wallet.setPassword(wizardController.walletOptionsPassword);
wizardController.m_wallet.storeAsync(handler, new_wallet_filename);
}
@@ -479,7 +477,7 @@ Rectangle {
var deviceName = wizardController.walletOptionsDeviceName;
connect();
walletManager.createWalletFromDeviceAsync(tmpWalletFilename, "", nettype, deviceName, restoreHeight, subaddressLookahead, kdfRounds);
walletManager.createWalletFromDeviceAsync(tmpWalletFilename, oshelper.randomPassword(), nettype, deviceName, restoreHeight, subaddressLookahead, kdfRounds);
creatingWalletDeviceSplash();
}

View File

@@ -55,7 +55,9 @@ Rectangle {
ListElement { column1: "Ledger Nano S"; column2: "Ledger";}
ListElement { column1: "Ledger Nano S Plus"; column2: "Ledger";}
ListElement { column1: "Ledger Nano X"; column2: "Ledger";}
ListElement { column1: "Ledger Nano Gen5"; column2: "Ledger";}
ListElement { column1: "Ledger Stax"; column2: "Ledger";}
ListElement { column1: "Ledger Flex"; column2: "Ledger";}
ListElement { column1: "Trezor Model T"; column2: "Trezor";}
ListElement { column1: "Trezor Safe 3"; column2: "Trezor";}
ListElement { column1: "Trezor Safe 5"; column2: "Trezor";}
@@ -180,8 +182,12 @@ Rectangle {
return "qrc:///images/ledgerNanoSPlus.png";
} else if (ledgerType == "Ledger Nano X") {
return "qrc:///images/ledgerNanoX.png";
} else if (ledgerType == "Ledger Nano Gen5") {
return "qrc:///images/ledgerNanoGen5.png";
} else if (ledgerType == "Ledger Stax") {
return "qrc:///images/ledgerStax.png";
} else if (ledgerType == "Ledger Flex") {
return "qrc:///images/ledgerFlex.png";
}
}
return "";

View File

@@ -86,7 +86,7 @@ Rectangle {
visible: false
text: qsTr("Print this paper, fill it out, and keep it in a safe location. Never share your recovery phrase with anybody, especially with strangers offering technical support.") +
qsTr("Recovery phrase (mnemonic seed)") +
qsTr("These words are are a backup of your wallet. They are the only thing needed to access your funds and restore your Monero wallet, so keep this paper in a safe place and do not disclose it to anybody! It is strongly not recommended to store your recovery phrase digitally (in an email, online service, screenshot, photo, or any other type of computer file).") +
qsTr("These words are a backup of your wallet. They are the only thing needed to access your funds and restore your Monero wallet, so keep this paper in a safe place and do not disclose it to anybody! It is strongly not recommended to store your recovery phrase digitally (in an email, online service, screenshot, photo, or any other type of computer file).") +
qsTr("Wallet creation date") +
qsTr("Wallet restore height") +
qsTr("For instructions on how to restore this wallet, visit www.getmonero.org and go to Resources > User Guides > \"How to restore a wallet from mnemonic seed\". Use only Monero wallets that are trusted and recommended by the Monero community (see a list of them in www.getmonero.org/downloads).") + translationManager.emptyString

View File

@@ -46,7 +46,6 @@ Rectangle {
return false;
}
var valid = false;
if(wizardController.walletRestoreMode === "keys") {
return wizardWalletInput.verify() && wizardRestoreWallet1.verifyFromKeys();
} else if(wizardController.walletRestoreMode === "seed") {