Compare commits

...

283 Commits

Author SHA1 Message Date
luigi1111
710e3f6948 Merge pull request #4109
56a91b2 docker: update hidapi to 0.13.1 on linux (selsta)
2023-02-25 14:54:37 -05:00
luigi1111
6ec9e24f2f Merge pull request #4120
a50491d build: prepare v0.18.2.0 (selsta)
2023-02-25 13:56:09 -05:00
luigi1111
cb9af349cd Merge pull request #4124
8a910ad DaemonManager: remove systemd check (plowsof)
2023-02-25 13:55:42 -05:00
luigi1111
c8687a961c Merge pull request #4121
e8020c8 cmake: fix windows deploy (selsta)
2023-02-25 13:55:14 -05:00
plowsof
8a910ad4c7 DaemonManager: remove systemd check 2023-02-21 00:53:48 +00:00
selsta
e8020c86df cmake: fix windows deploy 2023-02-19 01:29:17 +01:00
selsta
a50491d0b2 build: prepare v0.18.2.0 2023-02-18 21:49:51 +01:00
luigi1111
bdd91b053d Merge pull request #4113
7d2f2ca Utils.js simplify ago func (backfire-monism-net)
2023-02-15 10:53:13 -05:00
luigi1111
4b23148e68 Merge pull request #4112
500dc57 p2pool: update to v3.0 (SChernykh)
2023-02-15 10:52:48 -05:00
luigi1111
e167bbce20 Merge pull request #4103
c437dab docker: update Windows and Linux Qt to 5.15.8 (selsta)
2023-02-15 10:52:02 -05:00
luigi1111
3338bc3741 Merge pull request #4092
587ea68 p2pool: Stop p2pool mining on node switch (devhyper)
2023-02-15 10:51:37 -05:00
luigi1111
af368c93ce Merge pull request #3936
757bc7d p2pool: Restart monerod only when needed and with proper args (devhyper)
2023-02-15 10:51:05 -05:00
luigi1111
5ced4ef547 Merge pull request #3878
198dfb3 wizard: redesign seed page (rating89us)
2023-02-15 10:50:11 -05:00
rating89us
198dfb338c wizard: redesign seed page
- move mnemonic seed
- restore height into a separate page
- pdf template
- seed verification
- responsive UI
- accessibility
2023-02-12 23:25:49 +01:00
devhyper
587ea68a99 p2pool: Stop p2pool mining on node switch 2023-02-02 17:32:06 -08:00
backfire-monism-net
7d2f2cacbf Utils.js simplify ago func 2023-02-01 00:35:13 -08:00
devhyper
757bc7d7b9 p2pool: Restart monerod only when needed and with proper args 2023-01-31 18:23:20 -08:00
SChernykh
500dc573e4 p2pool: update to v3.0 2023-01-31 19:16:24 +01:00
selsta
56a91b2d1b docker: update hidapi to 0.13.1 on linux 2023-01-25 20:09:55 +01:00
selsta
c437dab90f docker: update Windows and Linux Qt to 5.15.8 2023-01-16 17:56:15 +01:00
luigi1111
b7ba9437d8 Merge pull request #4095
7095061 p2pool: update to v2.7 (SChernykh)
2023-01-11 12:18:46 -05:00
luigi1111
76fa06ceab Merge pull request #4091
a3b54a9 Override desktop theming (devhyper)
2023-01-11 12:17:33 -05:00
luigi1111
4487471ada Merge pull request #4088
a01dc06 open-wallet: set network type when using file browser (plowsof)
2023-01-11 12:16:55 -05:00
luigi1111
55a0bc46e4 Merge pull request #4085
c8127f6 main: skip proxy when setting localhost remote node (selsta)
2023-01-11 12:16:27 -05:00
luigi1111
3e17445a4d Merge pull request #4082
4cc6bcb README: add unbound for Windows (selsta)
2023-01-11 12:15:55 -05:00
luigi1111
fc077fa54e Merge pull request #4079
8b682fb workflows: remove unnecessary dependency (selsta)
2023-01-11 12:15:30 -05:00
SChernykh
70950619b8 p2pool: update to v2.7 2023-01-03 21:35:19 +01:00
plowsof
a01dc06a54 open-wallet: set network type when using file browser
Co-authored-by: selsta <selsta@users.noreply.github.com>
2022-12-28 18:46:22 +00:00
devhyper
a3b54a942c Override desktop theming 2022-12-26 11:24:23 +01:00
selsta
c8127f651d main: skip proxy when setting localhost remote node 2022-12-18 17:51:19 +01:00
selsta
4cc6bcbd7d README: add unbound for Windows 2022-12-03 23:22:29 +01:00
selsta
8b682fbd2b workflows: remove unnecessary dependency 2022-12-03 04:35:53 +01:00
luigi1111
48393db2c7 Merge pull request #4078
a9b52f6 Sign/Verify: clear text fields on wallet close (plowsof)
2022-12-01 23:49:50 -06:00
luigi1111
faa4473b17 Merge pull request #4077
7faec48 History: add open folder button after CSV export (selsta)
2022-12-01 23:49:25 -06:00
luigi1111
9924dfe8af Merge pull request #4066
6984bb8 docker: update Qt to 5.15.7 (selsta)
2022-12-01 23:48:54 -06:00
luigi1111
47f336bf33 Merge pull request #4065
c0a739c Transfer: update mixin, silence warning (selsta)
2022-12-01 23:48:33 -06:00
luigi1111
07b75fb692 Merge pull request #4064
2d25454 docker: update zlib on android (selsta)
2022-12-01 23:48:05 -06:00
luigi1111
6c39e82519 Merge pull request #4062
2fa79c6 workflows: verify p2pool hashes (plowsof)
2022-12-01 23:45:58 -06:00
luigi1111
f8178f2e54 Merge pull request #4061
4743e44 deploy: update libicu to 72 (selsta)
2022-12-01 23:45:24 -06:00
luigi1111
75290d2454 Merge pull request #4060
9e2ae68 p2pool: update to 2.6 (selsta)
2022-12-01 23:45:02 -06:00
luigi1111
b180ac8cab Merge pull request #4059
43cc666 README: update Debian dependencies (2l47)
2022-12-01 23:44:28 -06:00
luigi1111
58c7c9ab76 Merge pull request #4055
c390afd main: fix a potential warning (selsta)
2022-12-01 23:43:46 -06:00
luigi1111
b8e6cb221b Merge pull request #4048
83921a4 main: update blockchain size (selsta)
2022-12-01 23:42:49 -06:00
luigi1111
ef2e711e15 Merge pull request #4047
80ade41 DaemonManager: take dataDir into account when sending cmd (selsta)
2022-12-01 23:42:04 -06:00
luigi1111
2ade733867 Merge pull request #4043
7954661 Android: disable simple mode (malinero)
22a1509 Android: hide local node settings (malinero)
499eeee Android: hide log tab (malinero)
8cf76cf Android: hide mining tab (malinero)
6441d99 Android: useRemoteNode default to true (malinero)
2022-12-01 23:40:39 -06:00
luigi1111
1735154b81 Merge pull request #3616
acf876f Docker android: avoid gradle auto download (malinero)
2022-12-01 23:39:28 -06:00
plowsof
a9b52f6752 Sign/Verify: clear text fields on wallet close 2022-12-02 05:32:25 +00:00
selsta
7faec48c0a History: add open folder button after CSV export 2022-12-02 05:56:51 +01:00
selsta
9e2ae684ed p2pool: update to 2.6 2022-11-30 05:30:00 +01:00
selsta
6984bb8113 docker: update Qt to 5.15.7 2022-11-13 02:57:50 +01:00
selsta
c0a739c9fa Transfer: update mixin, silence warning 2022-11-11 01:59:28 +01:00
selsta
2d254542f3 docker: update zlib on android 2022-11-07 06:16:38 +01:00
plowsof
2fa79c670e workflows: verify p2pool hashes 2022-11-04 00:45:35 +00:00
selsta
4743e443dc deploy: update libicu to 72 2022-11-01 00:11:42 +01:00
2l47
43cc666e77 README: update Debian dependencies 2022-10-31 17:07:26 -05:00
selsta
c390afd258 main: fix a potential warning 2022-10-29 04:55:01 +02:00
selsta
80ade41905 DaemonManager: take dataDir into account when sending cmd 2022-10-07 02:28:44 +02:00
selsta
83921a4bc8 main: update blockchain size 2022-10-07 02:00:28 +02:00
malinero
acf876f4b2 Docker android: avoid gradle auto download 2022-10-02 11:06:57 +02:00
malinero
7954661100 Android: disable simple mode 2022-10-02 10:40:07 +02:00
malinero
22a1509316 Android: hide local node settings 2022-10-02 10:40:07 +02:00
malinero
499eeee59a Android: hide log tab 2022-10-02 10:40:07 +02:00
malinero
8cf76cf7c2 Android: hide mining tab 2022-10-02 10:40:07 +02:00
malinero
6441d99279 Android: useRemoteNode default to true 2022-10-02 10:39:48 +02:00
luigi1111
aef4a982dc Merge pull request #4042
df9b35e build: prepare v0.18.1.2 (selsta)
2022-09-28 14:22:34 -05:00
luigi1111
f93c67740c Merge pull request #4041
ff0c068 Android: disable asking for desktop entry (malinero)
2022-09-28 14:22:14 -05:00
luigi1111
4b8e0f36ab Merge pull request #4040
b801ef5 Use different colors for different subaccounts (rating89us)
2022-09-28 14:21:49 -05:00
luigi1111
c247b96c4a Merge pull request #4039
6a8a123 workflows: fix windows ci deploy (selsta)
2022-09-28 14:21:22 -05:00
luigi1111
085f4af1dc Merge pull request #4036
6f2aafd Fix behavior when switching nodes (j-berman)
2022-09-28 14:20:56 -05:00
luigi1111
49a6c8ba9c Merge pull request #3615
96b6e59 Github workflow android: remove obsolete docker layers (malinero)
1b119eb Docker android: update Qt to 5.15.6 (and API level to 29) (malinero)
64a6ca7 Docker android: upgrade base image (malinero)
8b35660 Docker android: bump libraries (malinero)
131154b Docker android: update SDK and NDK (malinero)
2022-09-28 14:20:22 -05:00
selsta
df9b35e947 build: prepare v0.18.1.2 2022-09-28 01:15:03 +02:00
malinero
96b6e5972f Github workflow android: remove obsolete docker layers 2022-09-27 21:06:16 +02:00
rating89us
b801ef594b Use different colors for different subaccounts 2022-09-26 10:18:46 +02:00
malinero
ff0c068cb8 Android: disable asking for desktop entry 2022-09-25 11:33:23 +02:00
malinero
1b119eb8f5 Docker android: update Qt to 5.15.6 (and API level to 29) 2022-09-25 10:32:33 +02:00
selsta
6a8a123da8 workflows: fix windows ci deploy 2022-09-22 13:08:42 +02:00
j-berman
6f2aafdd6c Fix behavior when switching nodes
- Improved synchronization when switching nodes
- Avoid infinite "Connecting" loop
- Pause refresh loop while switching, don't start until connected
2022-09-21 21:56:55 -06:00
luigi1111
57fefba386 Merge pull request #4030
b1f1080 build: prepare v0.18.1.1 (selsta)
2022-09-18 17:40:22 -05:00
malinero
64a6ca7fc7 Docker android: upgrade base image 2022-09-18 11:34:41 +02:00
malinero
8b356605b4 Docker android: bump libraries 2022-09-18 11:34:41 +02:00
malinero
131154ba80 Docker android: update SDK and NDK 2022-09-18 08:16:54 +02:00
luigi1111
fa55575973 Merge pull request #4031
0851609 translations from webalte (netrik182)
2022-09-18 00:36:27 -05:00
netrik182
0851609840 translations from webalte
Author: Monero-Weblate <translate@getmonero.org>

Indonesian

Currently translated at 49.0% (406 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/id/
Author: Kareem <kareem.lukitomo@gmail.com>

Co-authored-by: Kareem <kareem.lukitomo@gmail.com>

Russian

Currently translated at 100.0% (827 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ru/
Author: v1docq47 <chiptune@protonmail.ch>

Russian

Currently translated at 100.0% (827 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ru/
Author: v1docq47 <chiptune@protonmail.ch>

Russian

Currently translated at 100.0% (827 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ru/
Author: v1docq47 <chiptune@protonmail.ch>

Russian

Currently translated at 99.3% (822 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ru/
Author: v1docq47 <chiptune@protonmail.ch>

Russian

Currently translated at 95.8% (793 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ru/
Author: v1docq47 <chiptune@protonmail.ch>

Co-authored-by: v1docq47 <chiptune@protonmail.ch>

Korean

Currently translated at 21.6% (179 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ko/
Author: John Lee <john3374@gmail.com>

Korean

Currently translated at 21.5% (178 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ko/
Author: John Lee <john3374@gmail.com>

Co-authored-by: John Lee <john3374@gmail.com>

Spanish

Currently translated at 84.1% (696 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/es/
Author: Miguel Medina <michaelizergit@gmail.com>

Spanish

Currently translated at 82.8% (685 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/es/
Author: Miguel Medina <michaelizergit@gmail.com>

Co-authored-by: Miguel Medina <michaelizergit@gmail.com>

Ukrainian

Currently translated at 68.3% (565 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/uk/
Author: 12 <symphonicnightcore@gmail.com>

Co-authored-by: 12 <symphonicnightcore@gmail.com>

Ukrainian

Currently translated at 68.3% (565 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/uk/
Author: foresle <foresle@tutanota.com>

Co-authored-by: foresle <foresle@tutanota.com>

Ukrainian

Currently translated at 68.3% (565 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/uk/
Author: castorp <masimov@me.com>

Co-authored-by: castorp <masimov@me.com>

Greek

Currently translated at 85.0% (703 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/el/
Author: ZeoZ <zeoz_olikis@proton.me>

German

Currently translated at 95.8% (794 of 828 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: ZeoZ <zeoz_olikis@proton.me>

Greek

Currently translated at 84.4% (698 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/el/
Author: ZeoZ <zeoz_olikis@proton.me>

Co-authored-by: ZeoZ <zeoz_olikis@proton.me>

Spanish

Currently translated at 84.1% (696 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/es/
Author: juanda-097 <juanda097@protonmail.ch>

Co-authored-by: juanda-097 <juanda097@protonmail.ch>

French

Currently translated at 83.0% (688 of 828 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: tedtei <tedtei@pm.me>

Co-authored-by: tedtei <tedtei@pm.me>

Chinese (Traditional)

Currently translated at 93.4% (774 of 828 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hant/
Author: awdfffr <awdfffr@gmail.com>

Chinese (Traditional)

Currently translated at 92.7% (768 of 828 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hant/
Author: awdfffr <awdfffr@gmail.com>

Co-authored-by: awdfffr <awdfffr@gmail.com>

Chinese (Traditional)

Currently translated at 92.7% (768 of 828 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hant/
Author: Lafudoci <chunhsi.tso@gmail.com>

Co-authored-by: Lafudoci <chunhsi.tso@gmail.com>

Chinese (Traditional)

Currently translated at 92.7% (768 of 828 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hant/
Author: cryptoouob <cryptoouob@gmail.com>

Co-authored-by: cryptoouob <cryptoouob@gmail.com>

Spanish

Currently translated at 84.2% (697 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/es/
Author: W4ikiky <12raimon@gmail.com>

Co-authored-by: W4ikiky <12raimon@gmail.com>

Finnish

Currently translated at 90.8% (751 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fi/
Author: Jiri <crypto@nakola.fi>

Co-authored-by: Jiri <crypto@nakola.fi>

Finnish

Currently translated at 96.2% (796 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fi/
Author: vaa red <vaa.red@protonmail.com>

Finnish

Currently translated at 90.8% (751 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fi/
Author: vaa red <vaa.red@protonmail.com>

Co-authored-by: vaa red <vaa.red@protonmail.com>

Finnish

Currently translated at 96.3% (797 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fi/
Author: MahtiAnkka <mrkujansuu@gmail.com>

Finnish

Currently translated at 96.2% (796 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fi/
Author: MahtiAnkka <mrkujansuu@gmail.com>

Co-authored-by: MahtiAnkka <mrkujansuu@gmail.com>

Vietnamese

Currently translated at 22.7% (188 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/vi/
Author: Tony Nguyen <tony.d.nguyen@protonmail.com>

Co-authored-by: Tony Nguyen <tony.d.nguyen@protonmail.com>

Vietnamese

Currently translated at 22.9% (190 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/vi/
Author: Tabula Rasa <klpohuy@gmail.com>

Vietnamese

Currently translated at 22.7% (188 of 827 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/vi/
Author: Tabula Rasa <klpohuy@gmail.com>

Co-authored-by: Tabula Rasa <klpohuy@gmail.com>

translations from weblate
2022-09-17 10:44:14 +02:00
selsta
b1f1080111 build: prepare v0.18.1.1 2022-09-15 23:53:39 +02:00
luigi1111
6c3b1c56f8 Merge pull request #4026
0f43fbe installer: allow to install on arm64 (selsta)
2022-09-15 00:38:54 -05:00
luigi1111
210f3e301b Merge pull request #4025
10e28c5 docker: update qt to 5.15.6 (tobtoht)
2022-09-15 00:38:25 -05:00
luigi1111
c73bc32f8e Merge pull request #4013
a3c25af cmake: update libicu dll version (selsta)
2022-09-15 00:38:02 -05:00
luigi1111
62878a042c Merge pull request #4011
21831c9 main: add --no-igd to simple mode flags (selsta)
2022-09-15 00:37:38 -05:00
luigi1111
84c6d35634 Merge pull request #4003
d1f9b0e docker: update linux dependencies (selsta)
2022-09-15 00:37:14 -05:00
luigi1111
0f94f1b416 Merge pull request #4000
b0d5584 repo: remove ldns leftovers (selsta)
2022-09-15 00:36:08 -05:00
selsta
0f43fbe6d4 installer: allow to install on arm64 2022-09-09 22:20:09 +02:00
tobtoht
10e28c5ba4 docker: update qt to 5.15.6 2022-09-09 13:29:51 +02:00
selsta
a3c25afb66 cmake: update libicu dll version 2022-08-21 23:29:30 +02:00
selsta
21831c9b24 main: add --no-igd to simple mode flags
Should solve issues with monerod taking a while to exit.
Simple mode nodes aren't beneficial to the network anyway,
so having no incoming connections in some cases should be
fine.
2022-08-21 02:42:07 +02:00
selsta
d1f9b0eaf0 docker: update linux dependencies 2022-08-12 00:53:49 +02:00
selsta
b0d5584d53 repo: remove ldns leftovers 2022-08-11 00:28:00 +02:00
luigi1111
bbe4fe3763 Merge pull request #3999
87f9d28 Dockerfile: fix hash (selsta)
2022-08-10 14:20:04 -05:00
selsta
87f9d28fea Dockerfile: fix hash 2022-08-10 19:47:56 +02:00
luigi1111
58ddd8c2bc Merge pull request #3998
91959d3 build: prepare v0.18.1.0 (selsta)
2022-08-10 12:21:43 -05:00
luigi1111
264d3694c5 Merge pull request #3995
7184c45 main: only check mining status when using local node (selsta)
2022-08-10 12:19:48 -05:00
luigi1111
79d56af921 Merge pull request #3994
fc26150 libwalletqt: refresh once on wallet opening (selsta)
2022-08-10 12:19:26 -05:00
luigi1111
e668995673 Merge pull request #3988
f796be3 trim restore height at info -> change height input (plowsof)
2022-08-10 12:19:05 -05:00
luigi1111
8b2fe88824 Merge pull request #3985
fa3b49c Windows installer: Welcome image for 0.18 (rbrunner7)
2022-08-10 12:18:43 -05:00
luigi1111
80830584d1 Merge pull request #3978
9e6f116 TxUtils: don't show resolve for float (reemuru)
2022-08-10 12:18:08 -05:00
luigi1111
ae21f79040 Merge pull request #3973
b70a984 README: Update copyright to 2022 (garth-xmr)
2022-08-10 12:17:33 -05:00
luigi1111
b7ab50759a Merge pull request #3734
0ded8dc Settings: option to skip stop local node screen (selsta)
2022-08-10 12:17:06 -05:00
selsta
91959d3e2e build: prepare v0.18.1.0 2022-08-10 19:15:20 +02:00
selsta
7184c45043 main: only check mining status when using local node 2022-08-06 23:32:11 +02:00
selsta
fc261502d1 libwalletqt: refresh once on wallet opening
Co-authored-by: tobtoht <thotbot@protonmail.com>
2022-08-06 21:58:21 +02:00
plowsof
f796be37ce trim restore height at info -> change height input
If you accidentally copy and paste a date with a new line character 
```
2022-01-01

```
The gui will restore from 2022. I ran into this problem when helping someone just now, after giving them the correct date to copy and paste so they can restore quicker xD caused some confusion.

the reg exp method used here 064c145aa8/wizard/WizardRestoreWallet1.qml (L277) prevents you from copy and pasting the 'wrong' string which might be annoying
2022-07-28 01:57:41 +01:00
rbrunner7
fa3b49ca91 Windows installer: Welcome image for 0.18 2022-07-25 20:28:20 +02:00
reemuru
9e6f116bc9 TxUtils: don't show resolve for float
Add parseFloat() checks so that the 'Resolve' button
for OpenAlias remains hidden. Also add a length check
for one character with a dot. IP addresses will not be
respected, but the whole point of domain names and OA is
for facilitating human readable / user friendly information.

Co-authored-by: selsta <selsta@users.noreply.github.com>
2022-07-22 10:21:29 -04:00
garth-xmr
b70a9842f5 README: Update copyright to 2022 2022-07-17 19:10:50 +00:00
luigi1111
064c145aa8 Merge pull request #3972
e197544 build: prepare v0.18.0.0 (selsta)
2022-07-15 22:34:59 -04:00
selsta
e197544903 build: prepare v0.18.0.0 2022-07-15 22:22:01 +02:00
luigi1111
ca1e66453e Merge pull request #3970
2a9c6c6 docker: update linux and android openssl (selsta)
2022-07-14 13:02:09 -04:00
luigi1111
c795d4b2f1 Merge pull request #3969
bd30c3b docker: fix linux build (selsta)
2022-07-14 13:01:36 -04:00
luigi1111
cb28263cb1 Merge pull request #3968
aac43e8 display wallet files with . in name (plowsof)
2022-07-14 13:00:44 -04:00
luigi1111
d2768a4f6b Merge pull request #3966
b576b9e Updated to p2pool v2.2.1 (SChernykh)
2022-07-14 12:59:39 -04:00
luigi1111
c6af02353e Merge pull request #3965
8199ef0 convert nettype to int to return correct rpc port (plowsof)
2022-07-14 12:58:35 -04:00
luigi1111
425623d6d3 Merge pull request #3932
5591061 SettingsWallet: add scan transaction option (selsta)
6e0b5e2 libwallet: add scanTransactions function (selsta)
2022-07-14 12:58:01 -04:00
selsta
2a9c6c662f docker: update linux and android openssl 2022-07-14 06:05:53 +02:00
selsta
bd30c3babb docker: fix linux build 2022-07-14 00:14:13 +02:00
plowsof
aac43e8a1a display wallet files with "." in name 2022-07-13 02:12:33 +01:00
SChernykh
b576b9e4f6 Updated to p2pool v2.2.1 2022-07-09 19:19:28 +02:00
plowsof
8199ef004d convert nettype to int to return correct rpc port 2022-07-09 17:41:06 +01:00
luigi1111
b26f38d37e Merge pull request #3959
b951338 Updated to p2pool v2.2 (SChernykh)
2022-07-08 13:56:18 -04:00
luigi1111
87f25c49ad Merge pull request #3958
0184c3a WizardRestoreWallet1: trim whitespaces from seed (selsta)
2022-07-08 13:55:47 -04:00
luigi1111
160eb8e074 Merge pull request #3957
d514845 DaemonManagerDialog: close dialog when GUI is connected (selsta)
2022-07-08 13:55:24 -04:00
luigi1111
39f0323a81 Merge pull request #3955
9bed455 oshelper: fix openContainingFolder on Linux (selsta)
2022-07-08 13:54:27 -04:00
luigi1111
e9a8b042ab Merge pull request #3954
a10d416 Transfer: don't create offline tx before wallet is synced (selsta)
2022-07-08 13:53:58 -04:00
luigi1111
07e7628182 Merge pull request #3949
c0b3789 docker: update Qt to 5.15.5 (selsta)
2022-07-08 13:53:18 -04:00
luigi1111
3d07d80648 Merge pull request #3947
85d0c75 translations from weblate (netrik182)
2022-07-08 13:51:10 -04:00
luigi1111
887688f092 Merge pull request #3946
d4de529 Mining: add info to start gui as admin for p2pool installation (selsta)
2022-07-08 13:48:04 -04:00
selsta
0184c3a314 WizardRestoreWallet1: trim whitespaces from seed 2022-07-04 03:45:25 +02:00
SChernykh
b951338642 Updated to p2pool v2.2
p2pool v2.2 has full support for the coming Monero network upgrade
2022-07-01 10:51:28 +02:00
selsta
d514845e4a DaemonManagerDialog: close dialog when GUI is connected 2022-06-28 23:38:06 +02:00
selsta
9bed4554eb oshelper: fix openContainingFolder on Linux 2022-06-27 00:41:56 +02:00
selsta
a10d41642a Transfer: don't create offline tx before wallet is synced 2022-06-26 21:59:26 +02:00
selsta
c0b3789fda docker: update Qt to 5.15.5 2022-06-21 19:26:34 +02:00
netrik182
85d0c7575c translations from weblate
Portuguese (Brazil)

Currently translated at 95.1% (761 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/pt_BR/
Author: netrik182 <netrik@tuta.io>

Co-authored-by: netrik182 <netrik@tuta.io>

Slovak

Currently translated at 96.2% (770 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/sk/
Author: Boris Sipos <siposboris@protonmail.ch>

Slovak

Currently translated at 73.2% (586 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/sk/
Author: Boris Sipos <siposboris@protonmail.ch>

Slovak

Currently translated at 58.3% (467 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/sk/
Author: Boris Sipos <siposboris@protonmail.ch>

Slovak

Currently translated at 58.2% (466 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/sk/
Author: Boris Sipos <siposboris@protonmail.ch>

Co-authored-by: Boris Sipos <siposboris@protonmail.ch>

Chinese (Simplified)

Currently translated at 74.7% (598 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: Lekton Zhang <takato3000@gmail.com>

Chinese (Simplified)

Currently translated at 74.2% (594 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: Lekton Zhang <takato3000@gmail.com>

Chinese (Simplified)

Currently translated at 74.1% (593 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: Lekton Zhang <takato3000@gmail.com>

Co-authored-by: Lekton Zhang <takato3000@gmail.com>

Chinese (Simplified)

Currently translated at 74.1% (593 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: TaoHuachen <iamthc@sina.cn>

Co-authored-by: TaoHuachen <iamthc@sina.cn>

French

Currently translated at 86.2% (691 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: Casimir <bgfd5u8tds454g@dispostable.com>

French

Currently translated at 86.2% (691 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: Casimir <bgfd5u8tds454g@dispostable.com>

French

Currently translated at 84.3% (676 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: Casimir <bgfd5u8tds454g@dispostable.com>

Co-authored-by: Casimir <bgfd5u8tds454g@dispostable.com>

Chinese (Simplified)

Currently translated at 74.2% (594 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: jindouyunz <492906398@qq.com>

Co-authored-by: jindouyunz <492906398@qq.com>

Russian

Currently translated at 100.0% (800 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ru/
Author: v1docq47 <chiptune@protonmail.ch>

Russian

Currently translated at 99.0% (792 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ru/
Author: v1docq47 <chiptune@protonmail.ch>

Co-authored-by: v1docq47 <chiptune@protonmail.ch>

Hungarian

Currently translated at 79.6% (637 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/hu/
Author: Pozsonyi Péter <ck7ii8h3sx@bestparadize.com>

Co-authored-by: Pozsonyi Péter <ck7ii8h3sx@bestparadize.com>

Ukrainian

Currently translated at 70.3% (563 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/uk/
Author: foresle <foresle@tutanota.com>

Co-authored-by: foresle <foresle@tutanota.com>

Ukrainian

Currently translated at 70.3% (563 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/uk/
Author: reketen <reketen@gmail.com>

Co-authored-by: reketen <reketen@gmail.com>

Ukrainian

Currently translated at 70.3% (563 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/uk/
Author: TheFuzzStone <thefuzzstone@protonmail.com>

Co-authored-by: TheFuzzStone <thefuzzstone@protonmail.com>

Ukrainian

Currently translated at 70.3% (563 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/uk/
Author: Agent LvM <agent.lvm@gmail.com>

Co-authored-by: Agent LvM <agent.lvm@gmail.com>

Spanish

Currently translated at 85.7% (686 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/es/
Author: Miguel Medina <michaelizergit@gmail.com>

Co-authored-by: Miguel Medina <michaelizergit@gmail.com>

Turkish

Currently translated at 64.0% (512 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/tr/
Author: xmoreee <sskacarfun@gmail.com>

Co-authored-by: xmoreee <sskacarfun@gmail.com>

Turkish

Currently translated at 64.0% (512 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/tr/
Author: snipeTR <snipetr@gmail.com>

Co-authored-by: snipeTR <snipetr@gmail.com>

German

Currently translated at 100.0% (801 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Lennard Merten <cb39@fn.de>

German

Currently translated at 94.1% (754 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Lennard Merten <cb39@fn.de>

Co-authored-by: Lennard Merten <cb39@fn.de>

Chinese (Simplified)

Currently translated at 75.5% (604 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: WinslowEric <i@winsloweric.cn>

Chinese (Simplified)

Currently translated at 74.7% (598 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: WinslowEric <i@winsloweric.cn>

Co-authored-by: WinslowEric <i@winsloweric.cn>

Chinese (Simplified)

Currently translated at 74.7% (598 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: Muge Niu <mugeniu12138@gmail.com>

Co-authored-by: Muge Niu <mugeniu12138@gmail.com>

German

Currently translated at 100.0% (801 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Paul Janowitz <janowitz@gmail.com>

Polish

Currently translated at 100.0% (800 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/pl/
Author: Paul Janowitz <janowitz@gmail.com>

German

Currently translated at 100.0% (801 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Paul Janowitz <janowitz@gmail.com>

Co-authored-by: Paul Janowitz <janowitz@gmail.com>

German

Currently translated at 100.0% (801 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Crusty <trepoleth@protonmail.com>

Co-authored-by: Crusty <trepoleth@protonmail.com>

German

Currently translated at 100.0% (801 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: GreenPiece <villa@posteo.net>

Co-authored-by: GreenPiece <villa@posteo.net>

German

Currently translated at 100.0% (801 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Wobole <wobole@throwaway.io>

Co-authored-by: Wobole <wobole@throwaway.io>

German

Currently translated at 100.0% (801 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: PauleBertt <paulebertt@googlemail.com>

Co-authored-by: PauleBertt <paulebertt@googlemail.com>

German

Currently translated at 100.0% (801 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Marta Kozera <martusia1984@gmail.com>

Co-authored-by: Marta Kozera <martusia1984@gmail.com>

Indonesian

Currently translated at 51.0% (408 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/id/
Author: I. Musthafa <i.musthafa66@gmail.com>

Co-authored-by: I. Musthafa <i.musthafa66@gmail.com>

Indonesian

Currently translated at 51.0% (408 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/id/
Author: liimee <alt3753.7@gmail.com>

Co-authored-by: liimee <alt3753.7@gmail.com>

Indonesian

Currently translated at 51.0% (408 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/id/
Author: siptruk <siptruks@gmail.com>

Co-authored-by: siptruk <siptruks@gmail.com>

Chinese (Simplified)

Currently translated at 75.7% (606 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: MaxQiu0108 <maxqqqq@hotmail.com>

Chinese (Simplified)

Currently translated at 75.6% (605 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: MaxQiu0108 <maxqqqq@hotmail.com>

Co-authored-by: MaxQiu0108 <maxqqqq@hotmail.com>

German

Currently translated at 100.0% (801 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Paul Janowitz <janowitz@gmail.com>

German

Currently translated at 100.0% (801 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Paul Janowitz <janowitz@gmail.com>

Co-authored-by: Paul Janowitz <janowitz@gmail.com>

Esperanto

Currently translated at 70.0% (560 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/eo/
Author: Gilberto F da Silva <gfs1989@gmx.net>

Co-authored-by: Gilberto F da Silva <gfs1989@gmx.net>

Esperanto

Currently translated at 70.0% (560 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/eo/
Author: Gregg S <ph0enixd0wn@protonmail.com>

Co-authored-by: Gregg S <ph0enixd0wn@protonmail.com>

Italian

Currently translated at 77.5% (620 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/it/
Author: alreadyburnt <alreadyburnt@mailbox.org>

Italian

Currently translated at 77.3% (619 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/it/
Author: alreadyburnt <alreadyburnt@mailbox.org>

Italian

Currently translated at 77.3% (619 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/it/
Author: alreadyburnt <alreadyburnt@mailbox.org>

Co-authored-by: alreadyburnt <alreadyburnt@mailbox.org>

Spanish

Currently translated at 86.3% (691 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/es/
Author: Josep Mengual <josepmengual@protonmail.com>

Co-authored-by: Josep Mengual <josepmengual@protonmail.com>

Esperanto

Currently translated at 70.2% (562 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/eo/
Author: MasFlam <masflam@masflam.com>

Co-authored-by: MasFlam <masflam@masflam.com>

Hindi

Currently translated at 53.8% (431 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/hi/
Author: CryptoMonero <cryptocake7@outlook.com>

Co-authored-by: CryptoMonero <cryptocake7@outlook.com>

Tamil

Currently translated at 88.7% (710 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ta/
Author: kingoflove <morpheus3542@tutanota.com>

Co-authored-by: kingoflove <morpheus3542@tutanota.com>

Persian

Currently translated at 13.2% (106 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fa/
Author: Parsa Abbasi <parsa.abbasi1996@gmail.com>

Co-authored-by: Parsa Abbasi <parsa.abbasi1996@gmail.com>

Persian

Currently translated at 13.2% (106 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fa/
Author: E-Moji <mnz1988@aol.com>

Co-authored-by: E-Moji <mnz1988@aol.com>

Persian

Currently translated at 13.2% (106 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fa/
Author: Nima Ghotbi <ghotbi.nima@gmail.com>

Co-authored-by: Nima Ghotbi <ghotbi.nima@gmail.com>

French

Currently translated at 86.2% (691 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: darckme <darck9me@protonmail.com>

Co-authored-by: darckme <darck9me@protonmail.com>

French

Currently translated at 86.7% (695 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: tedtei <tedtei@pm.me>

French

Currently translated at 86.2% (691 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: tedtei <tedtei@pm.me>

Co-authored-by: tedtei <tedtei@pm.me>

French

Currently translated at 86.7% (695 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: nightwolf3 <georgesbattikha_123@hotmail.com>

French

Currently translated at 86.2% (691 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: nightwolf3 <georgesbattikha_123@hotmail.com>

French

Currently translated at 86.2% (691 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: nightwolf3 <georgesbattikha_123@hotmail.com>

Co-authored-by: nightwolf3 <georgesbattikha_123@hotmail.com>

Slovak

Currently translated at 96.2% (770 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/sk/
Author: tomas <tvanco.reg@gmail.com>

Slovak

Currently translated at 73.2% (586 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/sk/
Author: tomas <tvanco.reg@gmail.com>

Co-authored-by: tomas <tvanco.reg@gmail.com>

Slovak

Currently translated at 73.2% (586 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/sk/
Author: Peter Liska <liska.peto@gmail.com>

Co-authored-by: Peter Liska <liska.peto@gmail.com>

French

Currently translated at 86.2% (691 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: Julian Fouquet <Truitosse@protonmail.com>

Co-authored-by: Julian Fouquet <Truitosse@protonmail.com>

French

Currently translated at 86.7% (695 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: Casimir <bgfd5u8tds454g@dispostable.com>

Co-authored-by: Casimir <bgfd5u8tds454g@dispostable.com>

French

Currently translated at 86.7% (695 of 801 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/fr/
Author: Simon Fouilleul <sfouilleulb@gmail.com>

Co-authored-by: Simon Fouilleul <sfouilleulb@gmail.com>

Slovak

Currently translated at 96.2% (770 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/sk/
Author: Carlo <getmonero.2u0ah@slmail.me>

Co-authored-by: Carlo <getmonero.2u0ah@slmail.me>

Slovak

Currently translated at 96.2% (770 of 800 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/sk/
Author: Júlia Forgáčová <marek.forgi@protonmail.com>

Co-authored-by: Júlia Forgáčová <marek.forgi@protonmail.com>

update languagues from weblate
2022-06-12 20:01:13 +02:00
selsta
d4de52974b Mining: add info to start gui as admin for p2pool installation 2022-06-11 18:19:08 +02:00
luigi1111
96cca79b70 Merge pull request #3933
4326500 Use p2pool folder for p2pool on Windows (SChernykh)
2022-06-09 16:30:45 -05:00
SChernykh
432650008c Use p2pool folder for p2pool on Windows
And set the correct file permissions on it so it can be run without administrator privileges.
2022-06-09 23:22:30 +02:00
luigi1111
3f3eb643e4 Merge pull request #3942
8229979 Mining: save selected dropdown index (selsta)
2022-06-09 14:00:23 -05:00
luigi1111
6ba617d84f Merge pull request #3920
e16f8c8 docker: qt 5.15.4 (selsta)
2022-06-09 13:59:29 -05:00
luigi1111
1c23ca3a76 Merge pull request #3917
c87482d Only kill p2pool if we started it (ComputeryPony)
2022-06-09 13:59:06 -05:00
luigi1111
17f657673f Merge pull request #3916
5977e61 qt: remove QTextCodec (selsta)
2022-06-09 13:58:23 -05:00
luigi1111
35d1546110 Merge pull request #3915
7b729fc qt: replace QRegExp with QRegularExpression (selsta)
2022-06-09 13:57:57 -05:00
luigi1111
c4bebbf173 Merge pull request #3914
372a591 main: disable setting -platformpluginpath (selsta)
2022-06-09 13:57:36 -05:00
luigi1111
a67865b969 Merge pull request #3910
cddf3c3 History: fix payment proof button (reemuru)
2022-06-09 13:57:12 -05:00
luigi1111
38a63ddcdb Merge pull request #3908
20c4516 workflows: add caching for docker android (selsta)
2022-06-09 13:56:46 -05:00
luigi1111
17dfd2e9ed Merge pull request #3906
9b7bca6 main: add compile time option to disable updates (selsta)
2022-06-09 13:56:25 -05:00
luigi1111
49d8a6b91d Merge pull request #3905
3ba9766 js: minimize frameless window when clicking on taskbar icon (selsta)
2022-06-09 13:55:40 -05:00
luigi1111
953cb8d302 Merge pull request #3903
434ac21 WizardCreateDevice1: add Ledger Nano S Plus (selsta)
2022-06-09 13:54:42 -05:00
luigi1111
e1d3cf1b98 Merge pull request #3902
1f5b221 WizardCreateDevice1: set default restore height to 1 (selsta)
2022-06-09 13:54:17 -05:00
luigi1111
b1ee39cd28 Merge pull request #3883
bcaf9ba Makefile: set CMAKE_BUILD_TYPE to debug for debug target (selsta)
2022-06-09 13:53:52 -05:00
luigi1111
3031e7c37f Merge pull request #3846
ef56194 Wizard: fix stagenet approx blockheight (selsta)
2022-06-09 13:53:20 -05:00
luigi1111
ab69b9c9b2 Merge pull request #3688
841f061 main: remove outdated code (selsta)
2022-06-09 13:52:52 -05:00
luigi1111
837f332ac9 Merge pull request #3560
214ba8a images: update mac icon (selsta)
2022-06-09 13:52:15 -05:00
luigi1111
59f189d264 Merge pull request #3483
04c2d84 WizardModeSelection: disable simple mode on Tails (selsta)
2022-06-09 13:51:20 -05:00
selsta
8229979cec Mining: save selected dropdown index 2022-06-07 20:15:03 +02:00
selsta
559106174e SettingsWallet: add scan transaction option 2022-05-28 03:15:23 +02:00
selsta
6e0b5e2be5 libwallet: add scanTransactions function 2022-05-28 03:15:18 +02:00
selsta
e16f8c8d07 docker: qt 5.15.4 2022-05-12 01:16:03 +02:00
ComputeryPony
c87482db9c Only kill p2pool if we started it 2022-05-10 00:56:06 -05:00
selsta
7b729fc885 qt: replace QRegExp with QRegularExpression
QRegExp is removed in Qt6
2022-05-07 18:36:16 +02:00
selsta
5977e61a02 qt: remove QTextCodec
QTextCodec is removed in Qt6
2022-05-07 18:26:32 +02:00
selsta
372a591ac7 main: disable setting -platformpluginpath 2022-05-07 17:40:31 +02:00
reemuru
cddf3c3cdb History: fix payment proof button
Adding support for reserve proof added an additional
argument to the getProofClicked signal. The payment
proof button on the transaction list from history.qml
does not pass this argument and fails with insufficient
argument error.

Fixes: 0f67580e ("Advanced: ReserveProof: Add support for reserve proof")
2022-05-05 10:18:15 -05:00
selsta
20c4516c8e workflows: add caching for docker android 2022-05-02 12:46:32 +02:00
selsta
3ba976638f js: minimize frameless window when clicking on taskbar icon
Co-authored-by: rating89us <45968869+rating89us@users.noreply.github.com>
2022-05-02 05:19:53 +02:00
selsta
9b7bca6116 main: add compile time option to disable updates 2022-05-01 06:09:29 +02:00
selsta
04c2d8437e WizardModeSelection: disable simple mode on Tails 2022-04-30 13:41:01 +02:00
selsta
bcaf9ba61d Makefile: set CMAKE_BUILD_TYPE to debug for debug target 2022-04-30 13:30:05 +02:00
selsta
214ba8a34d images: update mac icon 2022-04-30 09:18:14 +02:00
selsta
434ac2182a WizardCreateDevice1: add Ledger Nano S Plus 2022-04-30 09:05:40 +02:00
selsta
1f5b22149c WizardCreateDevice1: set default restore height to 1
Due to API reasons height 0 means to approximate the current
block height during hardware device restore. That's not what
we want by default. Until this gets changed upstream we will
set the default to 1.
2022-04-30 08:36:09 +02:00
luigi1111
2e2ae5c88f Merge pull request #3897
2021d61 TxConfirmationDialog: warn high fees (selsta)
2022-04-27 21:55:34 -05:00
selsta
2021d61d91 TxConfirmationDialog: warn high fees 2022-04-27 17:40:58 +02:00
luigi1111
46d0b6b0ff Merge pull request #3894
8ae8019 build: prepare v0.17.3.2 (selsta)
2022-04-26 23:47:12 -05:00
selsta
8ae8019f5a build: prepare v0.17.3.2 2022-04-26 19:52:15 +02:00
luigi1111
1a6ea3302c Merge pull request #3890
37a5bdc main: only update fiat price with open wallet (selsta)
2022-04-25 11:04:51 -05:00
luigi1111
4de4e82ee6 Merge pull request #3889
cc4815a Mining: only update mining status when page is open (selsta)
2022-04-25 11:04:26 -05:00
luigi1111
5da0d5768a Merge pull request #3888
1cc9e8a FutureScheduler: delete unused function declarations (selsta)
2022-04-25 11:04:04 -05:00
luigi1111
58586ce2dc Merge pull request #3887
46eba83 workflows: action-docker-layer-caching v0.0.11 (selsta)
2022-04-25 11:03:36 -05:00
selsta
1cc9e8af49 FutureScheduler: delete unused function declarations 2022-04-23 08:36:08 +02:00
selsta
37a5bdc331 main: only update fiat price with open wallet 2022-04-23 07:26:52 +02:00
selsta
cc4815a3db Mining: only update mining status when page is open 2022-04-23 07:13:17 +02:00
selsta
46eba838f5 workflows: action-docker-layer-caching v0.0.11 2022-04-22 05:19:30 +02:00
luigi1111
b31cc36de2 Merge pull request #3879
85dff32 cmake: bump windows deploy lib versions (selsta)
0468e0e workflows: deploy on windows (selsta)
2022-04-19 22:30:59 -05:00
luigi1111
76dd4fee2f Merge pull request #3875
2cc3ebd Docker: Update zlib for android (devhyper)
2022-04-19 22:30:01 -05:00
luigi1111
55a4b67880 Merge pull request #3871
877f822 Docker: update Qt 5.15.2 -> 5.15.3 (selsta)
2022-04-19 22:29:37 -05:00
luigi1111
97fb3d4982 Merge pull request #3869
0feef22 TitleBar: Remove lock icon on essentials display (reemuru)
2022-04-19 22:29:12 -05:00
luigi1111
28f0645d9e Merge pull request #3829
377a1a9 Integrate P2Pool (devhyper)
2022-04-19 22:27:27 -05:00
selsta
85dff323c8 cmake: bump windows deploy lib versions 2022-04-06 04:43:57 +02:00
selsta
0468e0e43a workflows: deploy on windows 2022-04-06 04:43:13 +02:00
devhyper
2cc3ebd315 Docker: Update zlib for android 2022-04-01 10:41:48 -07:00
devhyper
377a1a9680 Integrate P2Pool 2022-04-01 10:27:35 -07:00
selsta
877f822de0 Docker: update Qt 5.15.2 -> 5.15.3 2022-03-25 17:16:21 +01:00
reemuru
0feef2268d TitleBar: Remove lock icon on essentials display
The lock functionality is shown on the initial welcome screen
and the WizardHome. Remove the lock icon until the wallet is
actually open, similar to the "Close this wallet" logic.

Fixes 346913f: ("SettingsWallet: lock wallet on demand")
2022-03-20 06:06:15 -05:00
luigi1111
002fe8eefa Merge pull request #3865
62748b6 AddressBook: fix adding new entry (selsta)
2022-03-18 16:22:57 -05:00
luigi1111
1dba06a7ff Merge pull request #3862
8bbf2bf Transfer: fix offline signing (reemuru)
2022-03-18 16:22:24 -05:00
luigi1111
838b0179e5 Merge pull request #3860
de81af0 RemoteNodeDialog: bind ok to return key (reemuru)
2022-03-18 16:21:57 -05:00
luigi1111
b12ad939ad Merge pull request #3859
346913f SettingsWallet: lock wallet on demand (reemuru)
2022-03-18 16:21:27 -05:00
luigi1111
74fbf77f62 Merge pull request #3851
4ef5ca5 Doc: Minimize boost deps in README.md (mj-xmr)
2022-03-18 16:21:04 -05:00
luigi1111
211ef24d18 Merge pull request #3720
06fe68b cmake: remove including non-existent directory (selsta)
2022-03-18 16:20:38 -05:00
luigi1111
a2e0ea4faf Merge pull request #3719
b811d6a cmake: don't print verbose make (selsta)
2022-03-18 16:19:41 -05:00
luigi1111
6ab104ead7 Merge pull request #3470
2057904 cmake: remove unneeded monero_gui_add_library() (selsta)
2022-03-18 16:18:58 -05:00
selsta
62748b6121 AddressBook: fix adding new entry 2022-03-16 13:43:26 +01:00
reemuru
8bbf2bfcbb Transfer: fix offline signing
Remove logic for processing an array to derive the confirmation.
Use confirmation from the transaction object.
2022-03-16 06:30:22 -05:00
reemuru
de81af0e8d RemoteNodeDialog: bind ok to return key
This commit binds the enter / return key on the remote
node dialog. If cursor is in the host, port or password
input fields the keyboard can be used to continue. It is not
bound to the username field because ideally a user would
enter password or port last.
2022-03-13 15:02:11 -04:00
reemuru
346913f3db SettingsWallet: lock wallet on demand
This commit adds the ability to lock the wallet on demand instead
of waiting for the user inactivity time out. It is binded to the
hot keys Ctrl+L. Pressing cancel or the esc key will send the user
back to the wizard home for wallet selection. Incorrect password
returns the error message. Correct password will remove the
PasswordDialog allowing access. Add lock functionality in the
wallet settings section and title bar.
2022-03-13 12:37:43 -04:00
luigi1111
fd8983a7ff Merge pull request #3849
119deb4 libwalletqt: fix typo in type (selsta)
2022-03-07 23:31:50 -05:00
mj-xmr
4ef5ca5721 Doc: Minimize boost deps in README.md 2022-03-07 19:07:53 +01:00
selsta
119deb4e82 libwalletqt: fix typo in type 2022-03-04 01:55:04 +01:00
luigi1111
ea92f3f272 Merge pull request #3841
da63ab2 workflows: fix windows build error (reemuru)
2022-03-02 19:06:28 -05:00
luigi1111
9c383bcc24 Merge pull request #3838
ddd95f7 settings: bind return key after password change (reemuru)
2022-03-02 19:05:53 -05:00
luigi1111
4fba8e654d Merge pull request #3832
08e386f update languages from weblate and add flags (Paul Janowitz)
2022-03-02 19:05:01 -05:00
luigi1111
14383a1922 Merge pull request #3831
bf324ec bug: reset wallet path on network change (reemuru)
2022-03-02 19:04:08 -05:00
luigi1111
1610b93975 Merge pull request #3828
2bf0dd8 Advanced: ReserveProof: Resolve review by selsta (reemuru)
0f67580 Advanced: ReserveProof: Add support for reserve proof (reemuru)
2022-03-02 19:03:14 -05:00
luigi1111
8ece450f18 Merge pull request #3825
5990338 WizardRestoreWallet4, WizardCreateWallet4: disable double-click on 'Create wallet' button (rating89us)
2022-03-02 18:59:24 -05:00
luigi1111
ced654707d Merge pull request #3781
817b015 Docker: bump hidapi on Linux (selsta)
2022-03-02 18:58:50 -05:00
selsta
ef561949ca Wizard: fix stagenet approx blockheight 2022-03-01 00:18:09 +01:00
reemuru
da63ab2e05 workflows: fix windows build error
Windows build log has an error message for including
winsock2.h and the build fails at the updater.cpp file.
Use the MONERO_GUI_STATIC definition for driving the import
logic since it is already defined for the docker static build.

Co-authored-by: jeffro256 <jeffro256@users.noreply.github.com>
2022-02-19 15:38:08 -05:00
reemuru
ddd95f73b4 settings: bind return key after password change
The enter / return key is not bound to the information
popup that appears after a successful password change.
The functionality exists on the previous menu. Make it
possible to use the return key on this popup as well.

Co-authored-by: selsta <selsta@users.noreply.github.com>
2022-02-18 19:35:04 -05:00
Paul Janowitz
08e386f63f update languages from weblate and add flags 2022-02-05 16:08:29 +01:00
reemuru
bf324ec2d9 bug: reset wallet path on network change
When changing network type without changing
wallet path the gui will attempt to open the
most recently used wallet path and network type
even if they don't match. This commit forces the
user back to wallet setup under this condition.
As long as network type and wallet path are both
updated before closing the issue will no longer occur.
2022-01-31 23:34:24 -05:00
luigi1111
e9afaa9cc8 Merge pull request #3822
de49ddc WizardRestoreWallet3: remove unused code (rating89us)
2022-01-24 15:25:19 -05:00
luigi1111
78e3b947d1 Merge pull request #3817
d752117 WizardHome: restore binding of networkTypeDropdown.currentIndex when selecting an item; display networkTypeDropdown if stagenet or testnet is selected (rating89us)
2022-01-24 15:24:45 -05:00
luigi1111
05b4a3dd6b Merge pull request #3815
11a1695 LeftPanel: use correct shortcut modifier for Mac (selsta)
2022-01-24 15:23:22 -05:00
luigi1111
c2f706a28a Merge pull request #3808
621c119 main: add compile time option to disable desktop entry dialog (selsta)
2022-01-24 15:22:57 -05:00
luigi1111
4df925e8a8 Merge pull request #3799
f7792b7 RemoteNodeList: fix qml warning (selsta)
2022-01-24 15:22:33 -05:00
luigi1111
adf88c63ec Merge pull request #3791
6b926b3 History: disable payment proof for hardware wallets (selsta)
2022-01-24 15:22:11 -05:00
luigi1111
c2545e226b Merge pull request #3776
fa9285a SettingsInfo: translate tx description of 'Donate to Monero' button (rating89us)
2022-01-24 15:21:29 -05:00
luigi1111
5c7c4dde14 Merge pull request #3764
23b74a3 WizardSummary: use 'Mnemonic seed language' instead of 'Language' (rating89us)
2022-01-24 15:20:50 -05:00
luigi1111
2bbb6adb4f Merge pull request #3763
9194522 Wizard: display selected network (testnet/stagenet) on 'Create a new wallet' header (rating89us)
2022-01-24 15:19:58 -05:00
luigi1111
493105b457 Merge pull request #3680
f30570d Makefile: fix release-linux-armv8 (selsta)
2022-01-24 15:19:21 -05:00
reemuru
2bf0dd840f Advanced: ReserveProof: Resolve review by selsta
Fixes: 0f67580e
This commit updates qsTr() to avoid breaking previous
translations. Also removes an erroneous whitespace.
2022-01-21 01:21:17 -05:00
reemuru
0f67580e8f Advanced: ReserveProof: Add support for reserve proof
This change adds the ability to prove and check a reserve proof
to this existing "Prove/check" advanced menu. If the amount line has
a valid amount less than that of the current account index this input
will drive the logic for generating a reserve proof. Checking a reserve
proof is accomplished by validating the address and verifying that
signature.indexOf("ReserveProofV") === 0. The result displays the total
and spent amount of the proof.
2022-01-20 20:21:11 -05:00
rating89us
599033815a WizardRestoreWallet4, WizardCreateWallet4: disable double-click on "Create wallet" button 2022-01-17 21:58:38 +01:00
rating89us
de49ddcf5b WizardRestoreWallet3: remove unused code 2022-01-16 19:01:51 +01:00
rating89us
d752117ed3 WizardHome: restore binding of networkTypeDropdown.currentIndex when selecting an item; display networkTypeDropdown if stagenet or testnet is selected 2022-01-13 23:39:53 +01:00
rating89us
fa9285a108 SettingsInfo: translate tx description of "Donate to Monero" button 2022-01-13 21:20:29 +01:00
rating89us
9194522b56 Wizard: display selected network (testnet/stagenet) on "Create a new wallet" header 2022-01-13 20:56:00 +01:00
selsta
11a16952c5 LeftPanel: use correct shortcut modifier for Mac 2022-01-07 22:05:28 +01:00
luigi1111
a959919b8a Merge pull request #3813
6f88ad0 Fixed English mistake in Mining.qml (Igor Voytov)
2022-01-02 14:50:40 -05:00
Igor Voytov
6f88ad0a13 Fixed English mistake in Mining.qml 2022-01-02 19:23:12 +03:00
luigi1111
cb169f11d4 Merge pull request #3811
9199f95 update translations (netrik182)
2022-01-01 12:55:09 -05:00
luigi1111
98b81fa1ee Merge pull request #3810
f2b4e1e README: add more missing macOS dependencies (selsta)
2022-01-01 12:54:49 -05:00
luigi1111
a6fadd2140 Merge pull request #3804
a4cc91c DEPLOY: use correct ARCH (selsta)
2022-01-01 12:54:25 -05:00
luigi1111
09bf4a1e71 Merge pull request #3803
db4123c build: prepare v0.17.3.1 (selsta)
2022-01-01 12:53:55 -05:00
luigi1111
f44fcb4459 Merge pull request #3802
98f8f19 SettingsWallet: improve and translate trusted remote node error message (rating89us)
2022-01-01 12:53:32 -05:00
luigi1111
c5d598f401 Merge pull request #3800
f8a3a26 RemoteNodeList: fix trusted daemon icon margin (selsta)
2022-01-01 12:52:55 -05:00
luigi1111
9476a9880c Merge pull request #3798
d160828 SettingsWallet, SettingsListItem: disable 'Rescan wallet balance' buton if wallet is not synced (rating89us)
2022-01-01 12:51:03 -05:00
luigi1111
487f2ceecb Merge pull request #3797
e85b51e RemoteNodeList: reconnect after editing remote node (rating89us)
2022-01-01 12:50:17 -05:00
luigi1111
d0950499da Merge pull request #3795
2566f44 wizard: clear password field after wallet creation (selsta)
2022-01-01 12:49:38 -05:00
luigi1111
56df20ba27 Merge pull request #3788
008a38a main: verify if currentWallet is loaded before calling it (rating89us)
2022-01-01 12:48:17 -05:00
luigi1111
41b827b65d Merge pull request #3783
70e3c2d Settings, Advanced: mirror stack transition when clicking on a button on the left (rating89us)
2022-01-01 12:47:25 -05:00
luigi1111
0b6ceab25b Merge pull request #3769
3e159e0 WizardCreateDevice1: Use 'Restore wallet' instead of 'Create wallet' on Next button when restoring (rating89us)
2022-01-01 12:46:27 -05:00
selsta
2566f445b2 wizard: clear password field after wallet creation 2021-12-26 02:15:07 +01:00
netrik182
9199f95af5 update translations
Afrikaans

Currently translated at 100.0% (724 of 724 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/af/
Author: netrik182 <netrik@tuta.io>

Romanian

Currently translated at 99.4% (720 of 724 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ro/
Author: netrik182 <netrik@tuta.io>

Dutch

Currently translated at 83.7% (642 of 767 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/nl/
Author: netrik182 <netrik@tuta.io>

Japanese

Currently translated at 97.5% (706 of 724 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ja/
Author: netrik182 <netrik@tuta.io>

Hungarian

Currently translated at 94.3% (683 of 724 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/hu/
Author: netrik182 <netrik@tuta.io>

Hebrew

Currently translated at 42.5% (326 of 767 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/he/
Author: netrik182 <netrik@tuta.io>

Co-authored-by: netrik182 <netrik@tuta.io>

Dutch

Currently translated at 83.7% (642 of 767 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/nl/
Author: Snowden <edwardissexy.uninteresting@aleeas.com>

Co-authored-by: Snowden <edwardissexy.uninteresting@aleeas.com>

Polish

Currently translated at 90.0% (691 of 767 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/pl/
Author: Paul Janowitz <janowitz@gmail.com>

Co-authored-by: Paul Janowitz <janowitz@gmail.com>

Chinese (Simplified)

Currently translated at 77.7% (596 of 767 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: Lekton Zhang <takato3000@gmail.com>

Co-authored-by: Lekton Zhang <takato3000@gmail.com>

German

Currently translated at 90.2% (693 of 768 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Wobole <wobole@throwaway.io>

Co-authored-by: Wobole <wobole@throwaway.io>
2021-12-22 09:08:40 +01:00
selsta
f2b4e1ea3e README: add more missing macOS dependencies 2021-12-18 21:35:03 +01:00
selsta
621c11925b main: add compile time option to disable desktop entry dialog 2021-12-17 16:43:00 +01:00
selsta
a4cc91cca2 DEPLOY: use correct ARCH 2021-12-15 10:03:28 +01:00
selsta
db4123ccb5 build: prepare v0.17.3.1 2021-12-14 07:02:43 +01:00
rating89us
98f8f194cd SettingsWallet: improve and translate trusted remote node error message 2021-12-13 15:30:24 +01:00
selsta
f8a3a26e0d RemoteNodeList: fix trusted daemon icon margin 2021-12-13 04:44:44 +01:00
selsta
f7792b72bf RemoteNodeList: fix qml warning 2021-12-13 04:33:32 +01:00
rating89us
d160828cda SettingsWallet, SettingsListItem: disable "Rescan wallet balance" buton if wallet is not synced 2021-12-12 18:26:44 +01:00
rating89us
e85b51e1c2 RemoteNodeList: reconnect after editing remote node 2021-12-12 16:32:45 +01:00
selsta
6b926b3199 History: disable payment proof for hardware wallets 2021-12-11 04:02:35 +01:00
rating89us
008a38aae2 main: verify if currentWallet is loaded before calling it 2021-12-10 11:03:37 +01:00
rating89us
70e3c2d3ad Settings, Advanced: mirror stack transition when clicking on a button on the left 2021-12-08 13:00:10 +01:00
selsta
817b015335 Docker: bump hidapi on Linux 2021-12-07 15:50:27 +01:00
rating89us
3e159e0ed6 WizardCreateDevice1: Use "Restore wallet" instead of "Create wallet" on Next button when restoring 2021-12-01 21:50:55 +01:00
rating89us
23b74a3412 WizardSummary: use "Mnemonic seed language" instead of "Language" 2021-11-30 23:14:38 +01:00
selsta
0ded8dcf25 Settings: option to skip stop local node screen 2021-11-15 06:31:34 +01:00
selsta
06fe68b56c cmake: remove including non-existent directory 2021-10-28 14:27:53 +02:00
selsta
b811d6a84f cmake: don't print verbose make
If someone wants verbose make they can set the env var.
This is now in line with monero's behaviour.
2021-10-27 18:45:55 +02:00
selsta
841f061520 main: remove outdated code 2021-09-05 06:18:49 +02:00
selsta
f30570d54b Makefile: fix release-linux-armv8 2021-08-31 21:51:24 +02:00
selsta
20579049fa cmake: remove unneeded monero_gui_add_library() 2021-08-31 05:51:20 +02:00
170 changed files with 73867 additions and 30976 deletions

103
.github/verify_p2pool.py vendored Normal file
View 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()

View File

@@ -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,9 +52,12 @@ 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
run: make deploy
working-directory: build/release
- name: test qml
run: build/release/bin/monero-wallet-gui --test-qml
@@ -65,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
@@ -92,7 +95,7 @@ jobs:
- uses: actions/checkout@v1
with:
submodules: recursive
- uses: satackey/action-docker-layer-caching@v0.0.10
- uses: satackey/action-docker-layer-caching@v0.0.11
if: "!startsWith(github.ref, 'refs/tags/v')"
continue-on-error: true
with:
@@ -100,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
@@ -122,7 +125,7 @@ jobs:
- uses: actions/checkout@v1
with:
submodules: recursive
- uses: satackey/action-docker-layer-caching@v0.0.10
- uses: satackey/action-docker-layer-caching@v0.0.11
if: "!startsWith(github.ref, 'refs/tags/v')"
continue-on-error: true
with:
@@ -148,10 +151,19 @@ jobs:
- 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: 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@v2
with:
name: ${{ github.job }}

16
.github/workflows/verify_p2pool.yml vendored Normal file
View 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

View File

@@ -3,8 +3,8 @@ project(monero-gui)
message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}")
set(VERSION_MAJOR "17")
set(VERSION_MINOR "3")
set(VERSION_MAJOR "18")
set(VERSION_MINOR "2")
set(VERSION_REVISION "0")
set(VERSION "0.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}")
@@ -12,6 +12,8 @@ option(STATIC "Link libraries statically, requires static Qt")
option(USE_DEVICE_TREZOR "Trezor support compilation" ON)
option(WITH_SCANNER "Enable webcam QR scanner" OFF)
option(WITH_DESKTOP_ENTRY "Ask to install desktop entry on first startup" ON)
option(WITH_UPDATER "Regularly check for new updates" ON)
option(DEV_MODE "Checkout latest monero master on build" OFF)
list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/cmake")
@@ -19,10 +21,6 @@ include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include(CheckLinkerFlag)
if(DEBUG)
set(CMAKE_VERBOSE_MAKEFILE ON)
endif()
set(BUILD_GUI_DEPS ON)
set(BUILD_64 ON CACHE BOOL "Build 64-bit binaries")
@@ -75,36 +73,10 @@ endif()
include(CMakePackageConfigHelpers)
# force version update
function (monero_gui_add_library_with_deps)
cmake_parse_arguments(MONERO_ADD_LIBRARY "" "NAME" "DEPENDS;SOURCES" ${ARGN})
source_group("${MONERO_ADD_LIBRARY_NAME}" FILES ${MONERO_ADD_LIBRARY_SOURCES})
# Define a ("virtual") object library and an actual library that links those
# objects together. The virtual libraries can be arbitrarily combined to link
# any subset of objects into one library archive. This is used for releasing
# libwallet, which combines multiple components.
set(objlib obj_${MONERO_ADD_LIBRARY_NAME})
add_library(${objlib} OBJECT ${MONERO_ADD_LIBRARY_SOURCES})
add_library("${MONERO_ADD_LIBRARY_NAME}" $<TARGET_OBJECTS:${objlib}>)
if (MONERO_ADD_LIBRARY_DEPENDS)
add_dependencies(${objlib} ${MONERO_ADD_LIBRARY_DEPENDS})
endif()
set_property(TARGET "${MONERO_ADD_LIBRARY_NAME}" PROPERTY FOLDER "libs")
target_compile_definitions(${objlib}
PRIVATE $<TARGET_PROPERTY:${MONERO_ADD_LIBRARY_NAME},INTERFACE_COMPILE_DEFINITIONS>)
endfunction ()
function (monero_gui_add_library name)
monero_gui_add_library_with_deps(NAME "${name}" SOURCES ${ARGN})
endfunction()
include_directories(${EASYLOGGING_INCLUDE})
link_directories(${EASYLOGGING_LIBRARY_DIRS})
include(VersionGui)
monero_gui_add_library(gui_version SOURCES version.js DEPENDS genversiongui)
message(STATUS "${CMAKE_MODULE_PATH}")
@@ -112,6 +84,14 @@ if(WITH_SCANNER)
add_definitions(-DWITH_SCANNER)
endif()
if(WITH_DESKTOP_ENTRY)
add_definitions(-DWITH_DESKTOP_ENTRY)
endif()
if(WITH_UPDATER)
add_definitions(-DWITH_UPDATER)
endif()
# Sodium
find_library(SODIUM_LIBRARY sodium)
message(STATUS "libsodium: libraries at ${SODIUM_LIBRARY}")
@@ -372,10 +352,7 @@ endif()
list(APPEND EXTRA_LIBRARIES ${CMAKE_DL_LIBS})
if(APPLE)
include_directories(SYSTEM /usr/include/malloc)
if(POLICY CMP0042)
cmake_policy(SET CMP0042 NEW)
endif()
cmake_policy(SET CMP0042 NEW)
endif()
if (APPLE AND NOT IOS)

View File

@@ -8,11 +8,16 @@ Use macOS 10.12 - 10.13 for better backwards compability.
3. `git clone --recursive -b v0.X.Y.Z --depth 1 https://github.com/monero-project/monero-gui`
4. `CMAKE_PREFIX_PATH=~/Qt5.12.8/5.12.8/clang_64 make release`
4. Compile `monero-wallet-gui.app`
5. `cd build/release && make deploy`
```
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D ARCH=default -D CMAKE_PREFIX_PATH=~/Qt5.12.8/5.12.8/clang_64 ..
make
make deploy
```
6. Replace the `monerod` binary inside `monero-wallet-gui.app/Contents/MacOS/` with one built using deterministic builds / gitian.
5. Replace the `monerod` binary inside `monero-wallet-gui.app/Contents/MacOS/` with one built using deterministic builds / gitian.
## Codesigning and notarizing

View File

@@ -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.11
ARG ZLIB_HASH=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
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 \

View File

@@ -1,7 +1,7 @@
FROM ubuntu:16.04
ARG THREADS=1
ARG QT_VERSION=5.15.2
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.9.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 7da5cc91fc0d2dbe4df4f08cd31f6ca1a262418f && \
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 && \

View File

@@ -1,7 +1,7 @@
FROM ubuntu:20.04
ARG THREADS=1
ARG QT_VERSION=5.15.2
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

View File

@@ -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 {
@@ -360,7 +360,7 @@ Rectangle {
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Account") + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "T" + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "T" + translationManager.emptyString
onClicked: {
parent.previousButton.checked = false
@@ -382,7 +382,7 @@ Rectangle {
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Send") + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "S" + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "S" + translationManager.emptyString
onClicked: {
parent.previousButton.checked = false
parent.previousButton = transferButton
@@ -404,7 +404,7 @@ Rectangle {
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Address book") + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "B" + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "B" + translationManager.emptyString
under: transferButton
onClicked: {
parent.previousButton.checked = false
@@ -426,7 +426,7 @@ Rectangle {
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Receive") + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "R" + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "R" + translationManager.emptyString
onClicked: {
parent.previousButton.checked = false
parent.previousButton = receiveButton
@@ -448,7 +448,7 @@ Rectangle {
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Transactions") + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "H" + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "H" + translationManager.emptyString
onClicked: {
parent.previousButton.checked = false
parent.previousButton = historyButton
@@ -470,7 +470,7 @@ Rectangle {
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Advanced") + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "D" + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "D" + translationManager.emptyString
onClicked: {
parent.previousButton.checked = false
parent.previousButton = advancedButton
@@ -491,7 +491,7 @@ Rectangle {
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Settings") + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "E" + translationManager.emptyString
symbol: (isMac ? "" : qsTr("Ctrl+")) + "E" + translationManager.emptyString
onClicked: {
parent.previousButton.checked = false
parent.previousButton = settingsButton

View File

@@ -48,9 +48,7 @@ release:
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D CMAKE_BUILD_TYPE=Release $(topdir) && $(MAKE)
release-linux-armv8:
mkdir -p $(builddir)/release
cd $(builddir)/release
cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -D ARCH="armv8-a" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release -D BUILD_TAG="linux-armv8" $(topdir) && $(MAKE)
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -D ARCH="armv8-a" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release -D BUILD_TAG="linux-armv8" $(topdir) && $(MAKE)
release-linux-ppc64le:
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="ppc64le" -D CMAKE_BUILD_TYPE=Release $(topdir) && $(MAKE)
@@ -63,7 +61,7 @@ debug-static-win64:
debug-static-mac64:
mkdir -p $(builddir)/debug
cd $(builddir)/debug && cmake -D STATIC=ON -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=release -D BUILD_TAG="mac-x64" $(topdir) && $(MAKE)
cd $(builddir)/debug && cmake -D STATIC=ON -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Debug -D BUILD_TAG="mac-x64" $(topdir) && $(MAKE)
release-static-win64:
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D STATIC=ON -G "MSYS Makefiles" -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release -D BUILD_TAG="win-x64" -D CMAKE_TOOLCHAIN_FILE=$(topdir)/cmake/64-bit-toolchain.cmake -D MSYS2_FOLDER=$(shell cd ${MINGW_PREFIX}/.. && pwd -W) -D MINGW=ON $(topdir) && $(MAKE)

View File

@@ -66,7 +66,7 @@ Rectangle {
signal paymentClicked(var recipients, string paymentId, int mixinCount, int priority, string description)
signal sweepUnmixableClicked()
signal generatePaymentIdInvoked()
signal getProofClicked(string txid, string address, string message);
signal getProofClicked(string txid, string address, string message, string amount);
signal checkProofClicked(string txid, string address, string message, string signature);
Rectangle {

View File

@@ -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
@@ -209,11 +209,11 @@ Packaging for your favorite distribution would be a welcome contribution!
- For Debian distributions (Debian, Ubuntu, Mint, Tails...)
`sudo apt 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 libgcrypt20-dev`
`sudo apt install build-essential cmake 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 libgcrypt20-dev libboost-chrono-dev libboost-date-time-dev libboost-filesystem-dev libboost-locale-dev libboost-program-options-dev libboost-regex-dev libboost-serialization-dev libboost-system-dev libboost-thread-dev`
- 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 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.

View File

@@ -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
libicudtd68.dll
libicuind68.dll
libicuiod68.dll
libicutud68.dll
libicuucd68.dll
libicudtd72.dll
libicuind72.dll
libicuiod72.dll
libicutud72.dll
libicuucd72.dll
)
else() # assume release
list(APPEND WIN_DEPLOY_DLLS
libicudt68.dll
libicuin68.dll
libicuio68.dll
libicutu68.dll
libicuuc68.dll
libicudt72.dll
libicuin72.dll
libicuio72.dll
libicutu72.dll
libicuuc72.dll
)
endif()
list(TRANSFORM WIN_DEPLOY_DLLS PREPEND "$ENV{MSYSTEM_PREFIX}/bin/")

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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 {

View File

@@ -32,6 +32,8 @@ import "." as MoneroComponents
Rectangle {
default property list<MoneroComponents.NavbarItem> items
property alias currentIndex: repeater.currentIndex
property alias previousIndex: repeater.previousIndex
color: "transparent"
height: grid.height
@@ -100,7 +102,10 @@ Rectangle {
}
Repeater {
id: repeater
model: items.length
property int currentIndex: 0
property int previousIndex: 0
RowLayout {
spacing: 0
@@ -149,7 +154,11 @@ Rectangle {
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: items[index].selected()
onClicked: {
repeater.previousIndex = repeater.currentIndex;
repeater.currentIndex = index;
items[index].selected()
}
}
}

View File

@@ -52,6 +52,8 @@ Rectangle {
case Wallet.ConnectionStatus_Connected:
if (!appWindow.daemonSynced)
return qsTr("Synchronizing");
if (persistentSettings.useRemoteNode && persistentSettings.allowRemoteNodeMining && appWindow.isMining)
return qsTr("Remote node") + " + " + qsTr("Mining");
if (persistentSettings.useRemoteNode)
return qsTr("Remote node");
return appWindow.isMining ? qsTr("Connected") + " + " + qsTr("Mining"): qsTr("Connected");
@@ -199,6 +201,7 @@ Rectangle {
daemonManager.sendCommandAsync(
["set_bootstrap_daemon", "auto"],
appWindow.currentWallet.nettype,
persistentSettings.blockchainDataDir,
callback);
refreshMouseArea.visible = false;

View File

@@ -42,6 +42,13 @@ MoneroComponents.Dialog {
onActiveFocusChanged: activeFocus && remoteNodeAddress.forceActiveFocus()
function onOk() {
root.success = true;
root.close();
}
function onCancel() { root.close(); }
function add(callbackOnSuccess) {
root.editMode = false;
root.callbackOnSuccess = callbackOnSuccess;
@@ -89,6 +96,11 @@ MoneroComponents.Dialog {
daemonAddrLabelText: qsTr("Address") + translationManager.emptyString
daemonPortLabelText: qsTr("Port") + translationManager.emptyString
Keys.enabled: root.visible
Keys.onEnterPressed: root.onOk()
Keys.onReturnPressed: root.onOk()
Keys.onEscapePressed: root.onCancel()
}
RowLayout {
@@ -116,6 +128,11 @@ MoneroComponents.Dialog {
placeholderFontSize: 15
labelFontSize: 14
fontSize: 15
Keys.enabled: root.visible
Keys.onEnterPressed: root.onOk()
Keys.onReturnPressed: root.onOk()
Keys.onEscapePressed: root.onCancel()
}
}

View File

@@ -89,7 +89,7 @@ ColumnLayout {
anchors.fill: parent
anchors.rightMargin: 80
color: "transparent"
property var trusted: remoteNodesModel.get(index).trusted
property var trusted: remoteNodesModel.get(index) ? remoteNodesModel.get(index).trusted : false
MoneroComponents.TextPlain {
id: addressText
@@ -107,8 +107,9 @@ ColumnLayout {
MoneroComponents.Label {
id: trustedDaemonCheckMark
anchors.left: addressText.right
anchors.leftMargin: 6
anchors.leftMargin: 3
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: 2
z: itemMouseArea.z + 1
fontSize: 16
fontFamily: FontAwesome.fontFamilySolid
@@ -144,6 +145,9 @@ ColumnLayout {
tooltipLeft: true
onClicked: remoteNodeDialog.edit(remoteNodesModel.get(index), function (remoteNode) {
remoteNodesModel.set(index, remoteNode)
if (index === remoteNodesModel.selected) {
remoteNodesModel.applyRemoteNode(index)
}
})
}

View File

@@ -7,9 +7,11 @@ import "../components" as MoneroComponents
ColumnLayout {
id: settingsListItem
property alias iconText: iconLabel.text
property alias symbol: symbolText.text
property alias description: area.text
property alias title: header.text
property bool isLast: false
property bool enabled: true
signal clicked()
Layout.fillWidth: true
@@ -37,6 +39,7 @@ ColumnLayout {
width: parent.width
height: header.height + area.contentHeight
color: "transparent";
opacity: settingsListItem.enabled ? 1 : 0.25
anchors.left: parent.left
anchors.bottomMargin: 4
anchors.topMargin: 4
@@ -102,6 +105,7 @@ ColumnLayout {
}
MouseArea {
visible: settingsListItem.enabled
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
hoverEnabled: true
@@ -111,5 +115,17 @@ ColumnLayout {
settingsListItem.clicked()
}
}
MoneroComponents.TextPlain {
id: symbolText
anchors.right: parent.right
anchors.rightMargin: 44
anchors.verticalCenter: parent.verticalCenter
font.pixelSize: 12
font.bold: true
color: MoneroComponents.Style.menuButtonTextColor
visible: appWindow.ctrlPressed
themeTransition: false
}
}
}

View File

@@ -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"]
}

View File

@@ -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

View File

@@ -57,17 +57,20 @@ Rectangle {
signal minimizeClicked
signal languageClicked
signal closeWalletClicked
signal lockWalletClicked
state: "default"
states: [
State {
name: "default";
PropertyChanges { target: btnCloseWallet; visible: true}
PropertyChanges { target: btnLockWallet; visible: true}
PropertyChanges { target: btnLanguageToggle; visible: true}
}, State {
// show only theme switcher and window controls
name: "essentials";
PropertyChanges { target: btnCloseWallet; visible: false}
PropertyChanges { target: btnLockWallet; visible: false}
PropertyChanges { target: btnLanguageToggle; visible: false}
}
]
@@ -91,6 +94,46 @@ Rectangle {
spacing: 0
anchors.fill: parent
// lock wallet
Rectangle {
id: btnLockWallet
color: "transparent"
Layout.preferredWidth: parent.height
Layout.preferredHeight: parent.height
Text {
text: FontAwesome.lock
font.family: FontAwesome.fontFamilySolid
font.pixelSize: 16
color: MoneroComponents.Style.defaultFontColor
font.styleName: "Solid"
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
opacity: 0.75
}
MoneroComponents.Tooltip {
id: btnLockWalletTooltip
anchors.fill: parent
text: qsTr("Lock this wallet") + translationManager.emptyString
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onEntered: {
parent.color = MoneroComponents.Style.titleBarButtonHoverColor
btnLockWalletTooltip.tooltipPopup.open()
}
onExited: {
parent.color = "transparent"
btnLockWalletTooltip.tooltipPopup.close()
}
onClicked: root.lockWalletClicked(leftPanel.visible)
}
}
// collapse sidebar
Rectangle {
id: btnCloseWallet

View File

@@ -338,8 +338,9 @@ Rectangle {
spacing: 16
Text {
color: MoneroComponents.Style.defaultFontColor
font.pixelSize: 15
property bool maliciousTxFee: parseFloat(root.transactionFee) > 0.01
color: maliciousTxFee ? "red" : MoneroComponents.Style.defaultFontColor
font.pixelSize: maliciousTxFee ? 20 : 15
text: {
if (currentWallet) {
if (!root.transactionFee) {
@@ -349,7 +350,7 @@ Rectangle {
return qsTr("Calculating fee") + "..." + translationManager.emptyString;
}
} else {
return root.transactionFee + " XMR"
return root.transactionFee + " XMR" + (maliciousTxFee ? " (HIGH FEE)" : "")
}
} else {
return "";

View File

@@ -53,6 +53,8 @@ Object {
property string info : "\uf129"
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"

BIN
images/appicon.icns Executable file → Normal file

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
images/ledgerNanoSPlus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
images/verify-white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 956 B

BIN
images/verify-white@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
images/verify.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 854 B

BIN
images/verify@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
images/write-down-white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 779 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
images/write-down.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 728 B

BIN
images/write-down@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -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
@@ -54,6 +54,9 @@ Name: "en"; MessagesFile: "compiler:Default.isl"
; Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl"
; Name: "pt"; MessagesFile: "compiler:Languages\Portuguese.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:
@@ -135,6 +138,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: "{app}\p2pool"
Type: files; Name: "{app}\D3Dcompiler_47.dll"
Type: files; Name: "{app}\libbz2-1.dll"
Type: files; Name: "{app}\libEGL.dll"

View File

@@ -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

View File

@@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 440 KiB

After

Width:  |  Height:  |  Size: 440 KiB

View File

@@ -61,15 +61,18 @@ function checkSignature(signature) {
if ((signature.length - 12) % 88 != 0)
return false;
return check256(signature, signature.length);
} else if (signature.indexOf("ReserveProofV") === 0) {
if ((signature.length - 14) % 447 != 0)
return false;
return check256(signature, signature.length);
}
return false;
}
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
}

View File

@@ -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(){

View File

@@ -1,4 +1,5 @@
var flagsCustomDecorations = (Qt.FramelessWindowHint | Qt.CustomizeWindowHint | Qt.WindowSystemMenuHint | Qt.Window);
var flagsCustomDecorationsBase = (Qt.FramelessWindowHint | Qt.CustomizeWindowHint | Qt.WindowSystemMenuHint | Qt.Window);
var flagsCustomDecorations = isWindows ? (flagsCustomDecorationsBase | Qt.WindowMinimizeButtonHint) : flagsCustomDecorationsBase;
var flags = (Qt.WindowSystemMenuHint | Qt.Window | Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint | Qt.WindowMaximizeButtonHint | Qt.WindowFullscreenButtonHint);
/**

View File

@@ -164,9 +164,9 @@ function getApproximateBlockchainHeight(_date, _nettype){
secondsPerBlock = secondsPerBlockV2;
}
if(_nettype == "Testnet"){
if(_nettype == "Testnet" || _nettype == "Stagenet"){
// testnet got some huge rollbacks, so the estimation is way off
var approximateTestnetRolledBackBlocks = 342100;
var approximateTestnetRolledBackBlocks = _nettype == "Testnet" ? 342100 : 30000;
if(approxBlockchainHeight > approximateTestnetRolledBackBlocks)
approxBlockchainHeight -= approximateTestnetRolledBackBlocks
}

BIN
lang/flags/el.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
lang/flags/is.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
lang/flags/vi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@@ -61,4 +61,9 @@ Lojban
<!-- <language display_name="کورمانجی" locale="kmr_KMR" wallet_language="English" flag="/lang/flags/ku.png" qs="none"/> -->
<!-- <language display_name="বাংলা" locale="bn_BN" wallet_language="English" flag="/lang/flags/bd.png" qs="none"/> -->
<!-- <language display_name="Gaeilge" locale="ga_GA" wallet_language="English" flag="/lang/flags/irl.png" qs="none"/> -->
<language display_name="Afrikaans" locale="af_AF" wallet_language="English" flag="/lang/flags/za.png" qs="none"/>
<language display_name="Ελληνικά" locale="el_GR" wallet_language="English" flag="/lang/flags/el.png" qs="none"/>
<language display_name="தமிழ்" locale="ta_IN" wallet_language="English" flag="/lang/flags/in.png" qs="none"/>
<language display_name="Tiếng Việt" locale="vi_VN" wallet_language="English" flag="/lang/flags/vi.png" qs="none"/>
<language display_name="Íslenska" locale="is_IS" wallet_language="English" flag="/lang/flags/is.png" qs="none"/>
</languages>

185
main.qml
View File

@@ -42,6 +42,7 @@ import moneroComponents.WalletManager 1.0
import moneroComponents.PendingTransaction 1.0
import moneroComponents.NetworkType 1.0
import moneroComponents.Settings 1.0
import moneroComponents.P2PoolManager 1.0
import "components"
import "components" as MoneroComponents
@@ -93,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;
@@ -131,6 +132,17 @@ ApplicationWindow {
leftPanel.selectItem(page)
}
function lock() {
passwordDialog.onRejectedCallback = function() { appWindow.showWizard(); }
passwordDialog.onAcceptedCallback = function() {
if(walletPassword === passwordDialog.password)
passwordDialog.close();
else
passwordDialog.showError(qsTr("Wrong password") + translationManager.emptyString);
}
passwordDialog.open(usefulName(persistentSettings.wallet_path));
}
function sequencePressed(obj, seq) {
if(seq === undefined || !leftPanel.enabled)
return
@@ -139,6 +151,8 @@ ApplicationWindow {
return
}
// lock wallet on demand
if(seq === "Ctrl+L" && !passwordDialog.visible) lock()
if(seq === "Ctrl+S") middlePanel.state = "Transfer"
else if(seq === "Ctrl+R") middlePanel.state = "Receive"
else if(seq === "Ctrl+H") middlePanel.state = "History"
@@ -307,27 +321,6 @@ ApplicationWindow {
function connectWallet(wallet) {
currentWallet = wallet
// TODO:
// When the wallet variable is undefined, it yields a zero balance.
// This can scare users, restart the GUI (as a quick fix).
//
// To reproduce, follow these steps:
// 1) Open the GUI, load up a wallet that has a balance
// 2) Settings -> close wallet
// 3) Create a new wallet
// 4) Settings -> close wallet
// 5) Open the wallet from step 1
if(!wallet || wallet === undefined || wallet.path === undefined){
informationPopup.title = qsTr("Error") + translationManager.emptyString;
informationPopup.text = qsTr("Couldn't open wallet: ") + 'please restart GUI.';
informationPopup.icon = StandardIcon.Critical
informationPopup.open()
informationPopup.onCloseCallback = function() {
appWindow.close();
}
}
walletName = usefulName(wallet.path)
viewOnly = currentWallet.viewOnly;
@@ -476,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();
}
@@ -488,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();
}
}
}
@@ -607,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();
@@ -635,6 +633,10 @@ ApplicationWindow {
return;
console.log("disconnecting remote node");
p2poolManager.exit();
p2poolManager.getStatus();
persistentSettings.useRemoteNode = false;
currentDaemonAddress = localDaemonAddress
currentWallet.setDaemonLogin("", "");
@@ -699,7 +701,8 @@ ApplicationWindow {
// Daemon connected
leftPanel.networkStatus.connected = currentWallet ? currentWallet.connected() : Wallet.ConnectionStatus_Disconnected
currentWallet.refreshHeightAsync();
if (currentWallet)
currentWallet.refreshHeightAsync();
}
function startDaemon(flags){
@@ -718,7 +721,8 @@ ApplicationWindow {
if (splash) {
appWindow.showProcessingSplash(qsTr("Waiting for daemon to stop..."));
}
daemonManager.stopAsync(persistentSettings.nettype, function(result) {
p2poolManager.exit()
daemonManager.stopAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, function(result) {
daemonStartStopInProgress = 0;
if (splash) {
hideProcessingSplash();
@@ -730,14 +734,18 @@ ApplicationWindow {
function onDaemonStarted(){
console.log("daemon started");
daemonStartStopInProgress = 0;
currentWallet.connected(true);
// resume refresh
currentWallet.startRefresh();
if (currentWallet) {
currentWallet.connected(true);
// resume refresh
currentWallet.startRefresh();
}
// resume simplemode connection timer
appWindow.disconnectedEpoch = Utils.epoch();
}
function onDaemonStopped(){
currentWallet.connected(true);
if (currentWallet) {
currentWallet.connected(true);
}
}
function onDaemonStartFailure(error) {
@@ -747,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();
@@ -981,24 +995,28 @@ ApplicationWindow {
}
// called on "getProof"
function handleGetProof(txid, address, message) {
console.log("Getting payment proof: ")
console.log("\ttxid: ", txid,
", address: ", address,
", message: ", message);
function spendProofFallback(txid, result){
if (!result || result.indexOf("error|") === 0) {
currentWallet.getSpendProofAsync(txid, message, txProofComputed);
} else {
txProofComputed(txid, result);
function handleGetProof(txid, address, message, amount) {
if (amount !== null && amount.length > 0) {
var result = currentWallet.getReserveProof(false, currentWallet.currentSubaddressAccount, walletManager.amountFromString(amount), message)
txProofComputed(null, result)
} else {
console.log("Getting payment proof: ")
console.log("\ttxid: ", txid,
", address: ", address,
", message: ", message);
function spendProofFallback(txid, result){
if (!result || result.indexOf("error|") === 0) {
currentWallet.getSpendProofAsync(txid, message, txProofComputed);
} else {
txProofComputed(txid, result);
}
}
if (address.length > 0)
currentWallet.getTxProofAsync(txid, address, message, spendProofFallback);
else
spendProofFallback(txid, null);
}
if (address.length > 0)
currentWallet.getTxProofAsync(txid, address, message, spendProofFallback);
else
spendProofFallback(txid, null);
informationPopup.open()
}
function txProofComputed(txid, result){
@@ -1021,12 +1039,18 @@ ApplicationWindow {
", signature: ", signature);
var result;
if (address.length > 0)
var isReserveProof = signature.indexOf("ReserveProofV") === 0;
if (address.length > 0 && !isReserveProof) {
result = currentWallet.checkTxProof(txid, address, message, signature);
else
}
else if (isReserveProof) {
result = currentWallet.checkReserveProof(address, message, signature);
}
else {
result = currentWallet.checkSpendProof(txid, message, signature);
}
var results = result.split("|");
if (address.length > 0 && results.length == 5 && results[0] === "true") {
if (address.length > 0 && results.length == 5 && results[0] === "true" && !isReserveProof) {
var good = results[1] === "true";
var received = results[2];
var in_pool = results[3] === "true";
@@ -1054,6 +1078,12 @@ ApplicationWindow {
informationPopup.title = qsTr("Payment proof check") + translationManager.emptyString;
informationPopup.icon = good ? StandardIcon.Information : StandardIcon.Critical;
informationPopup.text = good ? qsTr("Good signature") : qsTr("Bad signature");
}
else if (isReserveProof && results[0] === "true") {
var good = results[1] === "true";
informationPopup.title = qsTr("Reserve proof check") + translationManager.emptyString;
informationPopup.icon = good ? StandardIcon.Information : StandardIcon.Critical;
informationPopup.text = good ? qsTr("Good signature on %1 total and %2 spent.").arg(results[2]).arg(results[3]) : qsTr("Bad signature");
}
else {
informationPopup.title = qsTr("Error") + translationManager.emptyString;
@@ -1102,6 +1132,7 @@ ApplicationWindow {
middlePanel.transferView.clearFields();
middlePanel.receiveView.clearFields();
middlePanel.historyView.clearFields();
middlePanel.advancedView.clearFields();
// disable timers
userInActivityTimer.running = false;
});
@@ -1121,13 +1152,10 @@ ApplicationWindow {
Timer {
id: fiatPriceTimer
interval: 1000 * 60;
running: persistentSettings.fiatPriceEnabled;
running: persistentSettings.fiatPriceEnabled && currentWallet !== undefined
repeat: true
onTriggered: {
if(persistentSettings.fiatPriceEnabled)
appWindow.fiatApiRefresh();
}
triggeredOnStart: false
onTriggered: appWindow.fiatApiRefresh()
triggeredOnStart: true
}
function fiatApiParseTicker(url, resp, currency){
@@ -1266,14 +1294,6 @@ ApplicationWindow {
leftPanel.balanceFiatString = bFiat;
}
function fiatTimerStart(){
fiatPriceTimer.start();
}
function fiatTimerStop(){
fiatPriceTimer.stop();
}
function fiatApiError(msg){
console.log("fiatPriceError: " + msg);
}
@@ -1329,12 +1349,8 @@ ApplicationWindow {
openWallet("wizard");
}
if(persistentSettings.fiatPriceEnabled){
appWindow.fiatApiRefresh();
appWindow.fiatTimerStart();
}
if (persistentSettings.askDesktopShortcut && !persistentSettings.portable) {
const desktopEntryEnabled = (typeof builtWithDesktopEntry != "undefined") && builtWithDesktopEntry;
if (persistentSettings.askDesktopShortcut && !persistentSettings.portable && desktopEntryEnabled) {
persistentSettings.askDesktopShortcut = false;
if (isTails) {
@@ -1365,13 +1381,18 @@ ApplicationWindow {
}
property bool askDesktopShortcut: isLinux
property bool askStopLocalNode: true
property string language: 'English (US)'
property string language_wallet: 'English'
property string locale: 'en_US'
property string account_name
property string wallet_path
property bool allow_background_mining : false
property bool allow_p2pool_mining : false
property bool allowRemoteNodeMining : false
property bool miningIgnoreBattery : true
property int miningModeSelected: 0
property int chainDropdownSelected: 0
property var nettype: NetworkType.MAINNET
property int restore_height : 0
property bool is_trusted_daemon : false // TODO: drop after v0.17.2.0 release
@@ -1379,6 +1400,7 @@ ApplicationWindow {
property bool is_recovering_from_device : false
property bool customDecorations : true
property string daemonFlags
property string p2poolFlags
property int logLevel: 0
property string logCategories: ""
property string daemonUsername: "" // TODO: drop after v0.17.2.0 release
@@ -1388,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,
@@ -1438,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: {
@@ -1688,6 +1717,9 @@ ApplicationWindow {
informationPopup.open();
}
onRejectedNewPassword: {}
Keys.enabled: !passwordDialog.visible && informationPopup.visible
Keys.onEnterPressed: informationPopup.close()
Keys.onReturnPressed: informationPopup.close()
}
DevicePassphraseDialog {
@@ -1899,6 +1931,7 @@ ApplicationWindow {
anchors.left: parent.left
anchors.right: parent.right
onCloseClicked: appWindow.close();
onLockWalletClicked: appWindow.lock();
onLanguageClicked: appWindow.toggleLanguageView();
onCloseWalletClicked: appWindow.showWizard();
onMaximizeClicked: appWindow.visibility = appWindow.visibility !== Window.Maximized ? Window.Maximized : Window.Windowed
@@ -2023,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)
@@ -2120,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();
@@ -2130,7 +2163,7 @@ ApplicationWindow {
if (currentWallet) {
handler(!currentWallet.disconnected);
} else {
daemonManager.runningAsync(persistentSettings.nettype, handler);
daemonManager.runningAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, handler);
}
}
}
@@ -2139,7 +2172,7 @@ ApplicationWindow {
console.log("close accepted");
// Close wallet non async on exit
daemonManager.exit();
p2poolManager.exit();
closeWallet(Qt.quit);
}
@@ -2245,7 +2278,7 @@ ApplicationWindow {
}
function getDefaultDaemonRpcPort(networkType) {
switch (networkType) {
switch (parseInt(networkType)) {
case NetworkType.STAGENET:
return 38081;
case NetworkType.TESTNET:

2
monero

Submodule monero updated: ab18fea350...99be9a044f

View File

@@ -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
}

View File

@@ -468,21 +468,25 @@ Rectangle {
text: (root.editEntry ? qsTr("Save") : qsTr("Add")) + translationManager.emptyString
enabled: root.checkInformation(addressLine.text, appWindow.persistentSettings.nettype)
onClicked: {
console.log("Add")
if (!root.editEntry && !currentWallet.addressBook.addRow(addressLine.text.trim(),"", descriptionLine.text)) {
informationPopup.title = qsTr("Error") + translationManager.emptyString;
// TODO: check currentWallet.addressBook.errorString() instead.
if(currentWallet.addressBook.errorCode() === AddressBook.Invalid_Address)
informationPopup.text = qsTr("Invalid address") + translationManager.emptyString
else if(currentWallet.addressBook.errorCode() === AddressBook.Invalid_Payment_Id)
informationPopup.text = currentWallet.addressBook.errorString()
else
informationPopup.text = qsTr("Can't create entry") + translationManager.emptyString
if (!root.editEntry) {
if (currentWallet.addressBook.addRow(addressLine.text.trim(),"", descriptionLine.text)) {
console.log("Entry added")
} else {
informationPopup.title = qsTr("Error") + translationManager.emptyString;
// TODO: check currentWallet.addressBook.errorString() instead.
if (currentWallet.addressBook.errorCode() === AddressBook.Invalid_Address)
informationPopup.text = qsTr("Invalid address") + translationManager.emptyString
else if (currentWallet.addressBook.errorCode() === AddressBook.Invalid_Payment_Id)
informationPopup.text = currentWallet.addressBook.errorString()
else
informationPopup.text = qsTr("Can't create entry") + translationManager.emptyString
informationPopup.onCloseCallback = null
informationPopup.open();
informationPopup.onCloseCallback = null
informationPopup.open();
}
} else {
currentWallet.addressBook.setDescription(addressBookListView.currentIndex, descriptionLine.text);
console.log("Description edited")
}
root.showAddressBook()
}

View File

@@ -40,9 +40,11 @@ ColumnLayout {
spacing: 0
property int panelHeight: 900
property alias miningView: stateView.miningView
property alias signView: stateView.signView
property alias state: stateView.state
MoneroComponents.Navbar {
id: navbarId
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: height
Layout.bottomMargin: height
@@ -51,6 +53,7 @@ ColumnLayout {
active: state == "Mining"
text: qsTr("Mining") + translationManager.emptyString
onSelected: state = "Mining"
visible: !isAndroid
}
MoneroComponents.NavbarItem {
active: state == "Prove"
@@ -80,7 +83,7 @@ ColumnLayout {
Layout.fillWidth: true
Layout.preferredHeight: panelHeight
color: "transparent"
state: "Mining"
state: isAndroid ? "Prove" : "Mining"
onCurrentViewChanged: {
if (previousView) {
@@ -119,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
@@ -128,7 +131,7 @@ ColumnLayout {
PropertyAnimation {
target: enterItem
property: "x"
from: 0 - target.width
from: (navbarId.currentIndex < navbarId.previousIndex ? 1 : -1) * - target.width
to: 0
duration: 300
easing.type: Easing.OutCubic
@@ -137,7 +140,7 @@ ColumnLayout {
target: exitItem
property: "x"
from: 0
to: target.width
to: (navbarId.currentIndex < navbarId.previousIndex ? 1 : -1) * target.width
duration: 300
easing.type: Easing.OutCubic
}
@@ -145,4 +148,9 @@ ColumnLayout {
}
}
}
function clearFields() {
signView.clearFields();
}
}

View File

@@ -1013,6 +1013,7 @@ Rectangle {
MoneroComponents.StandardButton {
visible: isout
enabled: currentWallet ? !currentWallet.isHwBacked() : false
anchors.left: btnDetails.right
anchors.leftMargin: 10
text: FontAwesome.productHunt
@@ -1719,7 +1720,7 @@ Rectangle {
}
console.log("getProof: Generate clicked: txid " + hash + ", address " + address);
middlePanel.getProofClicked(hash, address, '');
middlePanel.getProofClicked(hash, address, '', null);
informationPopup.title = qsTr("Payment proof") + translationManager.emptyString;
informationPopup.text = qsTr("Generating payment proof") + "..." + translationManager.emptyString;
informationPopup.onCloseCallback = null
@@ -1764,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;

View File

@@ -26,11 +26,14 @@
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQml.Models 2.2
import QtQuick 2.9
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.2
import "../components" as MoneroComponents
import moneroComponents.Wallet 1.0
import moneroComponents.P2PoolManager 1.0
import moneroComponents.DaemonManager 1.0
Rectangle {
id: root
@@ -38,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
@@ -52,13 +56,14 @@ Rectangle {
MoneroComponents.Label {
id: soloTitleLabel
fontSize: 24
text: qsTr("Solo mining") + translationManager.emptyString
text: qsTr("Mining") + translationManager.emptyString
}
MoneroComponents.WarningBox {
Layout.bottomMargin: 8
id: localDaemonWarning
text: qsTr("Mining is only available on local daemons.") + translationManager.emptyString
visible: persistentSettings.useRemoteNode
visible: persistentSettings.useRemoteNode && !persistentSettings.allowRemoteNodeMining
}
MoneroComponents.WarningBox {
@@ -69,7 +74,7 @@ Rectangle {
MoneroComponents.TextPlain {
id: soloMainLabel
text: qsTr("Mining with your computer helps strengthen the Monero network. The more that people mine, the harder it is for the network to be attacked, and every little bit helps.\n\nMining also gives you a small chance to earn some Monero. Your computer will create hashes looking for block solutions. If you find a block, you will get the associated reward. Good luck!") + translationManager.emptyString
text: qsTr("Mining with your computer helps strengthen the Monero network. The more people mine, the harder it is for the network to be attacked, and every little bit helps.\n\nMining also gives you a small chance to earn some Monero. Your computer will create hashes looking for block solutions. If you find a block, you will get the associated reward. Good luck!") + "\n\n" + qsTr("P2Pool mining is a decentralized way to pool mine that pays out more frequently compared to solo mining, while also supporting the network.") + translationManager.emptyString
wrapMode: Text.Wrap
Layout.fillWidth: true
font.family: MoneroComponents.Style.fontRegular.name
@@ -90,6 +95,44 @@ Rectangle {
columnSpacing: 20
rowSpacing: 16
ListModel {
id: miningModeModel
ListElement { column1: qsTr("Solo") ; column2: ""; priority: 0}
ListElement { column1: "P2Pool" ; column2: ""; priority: 1}
}
ColumnLayout {
Layout.fillWidth: true
Layout.alignment : Qt.AlignTop | Qt.AlignLeft
MoneroComponents.Label {
id: miningModeLabel
color: MoneroComponents.Style.defaultFontColor
text: qsTr("Mining mode") + translationManager.emptyString
fontSize: 16
}
}
ColumnLayout {
Layout.topMargin: 5
spacing: 10
MoneroComponents.StandardDropdown {
Layout.maximumWidth: 200
id: miningModeDropdown
visible: true
currentIndex: persistentSettings.miningModeSelected
dataModel: miningModeModel
onChanged: {
persistentSettings.allow_p2pool_mining = miningModeDropdown.currentIndex === 1;
persistentSettings.miningModeSelected = miningModeDropdown.currentIndex;
walletManager.stopMining();
p2poolManager.exit();
}
}
}
ColumnLayout {
Layout.fillWidth: true
Layout.alignment : Qt.AlignTop | Qt.AlignLeft
@@ -194,6 +237,7 @@ Rectangle {
MoneroComponents.Label {
id: optionsLabel
color: MoneroComponents.Style.defaultFontColor
visible: !persistentSettings.allow_p2pool_mining
text: qsTr("Options") + translationManager.emptyString
fontSize: 16
wrapMode: Text.Wrap
@@ -208,7 +252,8 @@ Rectangle {
RowLayout {
MoneroComponents.CheckBox {
id: backgroundMining
enabled: startSoloMinerButton.enabled
visible: !persistentSettings.allow_p2pool_mining
enabled: startSoloMinerButton.enabled && !persistentSettings.allow_p2pool_mining
checked: persistentSettings.allow_background_mining
onClicked: persistentSettings.allow_background_mining = checked
text: qsTr("Background mining (experimental)") + translationManager.emptyString
@@ -241,16 +286,53 @@ Rectangle {
primary: !stopSoloMinerButton.enabled
text: qsTr("Start mining") + translationManager.emptyString
onClicked: {
var success = walletManager.startMining(appWindow.currentWallet.address(0, 0), threads, persistentSettings.allow_background_mining, persistentSettings.miningIgnoreBattery)
if (success) {
update()
} else {
errorPopup.title = qsTr("Error starting mining") + translationManager.emptyString;
errorPopup.text = qsTr("Couldn't start mining.<br>") + translationManager.emptyString
if (persistentSettings.useRemoteNode)
errorPopup.text += qsTr("Mining is only available on local daemons. Run a local daemon to be able to mine.<br>") + translationManager.emptyString
errorPopup.icon = StandardIcon.Critical
errorPopup.open()
var daemonReady = appWindow.daemonSynced && appWindow.daemonRunning && !persistentSettings.useRemoteNode
if (persistentSettings.allowRemoteNodeMining) {
daemonReady = persistentSettings.useRemoteNode && appWindow.daemonSynced
}
if (daemonReady) {
var success;
if (persistentSettings.allow_p2pool_mining) {
if (p2poolManager.isInstalled()) {
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, persistentSettings.blockchainDataDir, startP2PoolLocal)
}
}
else {
confirmationDialog.title = qsTr("P2Pool installation") + translationManager.emptyString;
confirmationDialog.text = qsTr("P2Pool will be installed at %1. Proceed?").arg(applicationDirectory) + translationManager.emptyString;
confirmationDialog.icon = StandardIcon.Question;
confirmationDialog.cancelText = qsTr("No") + translationManager.emptyString;
confirmationDialog.okText = qsTr("Yes") + translationManager.emptyString;
confirmationDialog.onAcceptedCallback = function() {
p2poolManager.download();
statusMessageText.text = "Downloading P2Pool...";
statusMessage.visible = true
startSoloMinerButton.enabled = false;
stopSoloMinerButton.enabled = false;
}
confirmationDialog.open();
}
}
else
{
success = walletManager.startMining(appWindow.currentWallet.address(0, 0), threads, persistentSettings.allow_background_mining, persistentSettings.miningIgnoreBattery)
if (success)
{
update()
}
else
{
miningError(qsTr("Couldn't start mining.<br>") + translationManager.emptyString)
}
}
}
else {
miningError(qsTr("Couldn't start mining.<br>") + translationManager.emptyString)
}
}
}
@@ -263,6 +345,7 @@ Rectangle {
text: qsTr("Stop mining") + translationManager.emptyString
onClicked: {
walletManager.stopMining()
p2poolManager.exit()
update()
}
}
@@ -295,23 +378,162 @@ Rectangle {
inputPaddingLeft: 0
}
}
ListModel {
id: chainModel
ListElement { column1: qsTr("Mini") ; column2: ""; priority: 0}
ListElement { column1: qsTr("Main") ; column2: ""; priority: 1}
}
ColumnLayout {
Layout.fillWidth: true
Layout.alignment : Qt.AlignTop | Qt.AlignLeft
MoneroComponents.Label {
id: chainLabel
color: MoneroComponents.Style.defaultFontColor
visible: persistentSettings.allow_p2pool_mining
text: qsTr("Chain") + translationManager.emptyString
fontSize: 16
}
MoneroComponents.Tooltip {
id: chainsHelpTooltip
text: qsTr("Use the mini chain if you have a low hashrate.") + translationManager.emptyString
}
MouseArea {
id: chainsTooltipArea
width: parent.width
height: parent.height
enabled: persistentSettings.allow_p2pool_mining
hoverEnabled: true
onEntered: {
chainsHelpTooltip.tooltipPopup.open();
}
onExited: {
chainsHelpTooltip.tooltipPopup.close();
}
}
}
ColumnLayout {
Layout.topMargin: 5
spacing: 10
MoneroComponents.StandardDropdown {
Layout.maximumWidth: 200
id: chainDropdown
visible: persistentSettings.allow_p2pool_mining
currentIndex: persistentSettings.chainDropdownSelected
dataModel: chainModel
onChanged: persistentSettings.chainDropdownSelected = chainDropdown.currentIndex;
}
}
ColumnLayout {
Layout.fillWidth: true
Layout.alignment : Qt.AlignTop | Qt.AlignLeft
MoneroComponents.Label {
id: flagsLabel
visible: persistentSettings.allow_p2pool_mining
color: MoneroComponents.Style.defaultFontColor
text: qsTr("Flags") + translationManager.emptyString
fontSize: 16
}
MoneroComponents.Tooltip {
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
"
}
MouseArea {
id: flagsTooltipArea
width: parent.width
height: parent.height
enabled: persistentSettings.allow_p2pool_mining
hoverEnabled: true
onEntered: {
flagsHelpTooltip.tooltipPopup.open();
}
onExited: {
flagsHelpTooltip.tooltipPopup.close();
}
}
}
ColumnLayout {
Layout.fillWidth: true
MoneroComponents.LineEditMulti {
id: p2poolFlags
Layout.minimumWidth: 100
Layout.bottomMargin: 20
labelFontSize: 14
fontSize: 15
visible: persistentSettings.allow_p2pool_mining
wrapMode: Text.WrapAnywhere
labelText: qsTr("P2Pool startup flags") + translationManager.emptyString
placeholderText: qsTr("(optional)") + translationManager.emptyString
placeholderFontSize: 15
text: persistentSettings.p2poolFlags
addressValidation: false
onEditingFinished: {
persistentSettings.allowRemoteNodeMining = p2poolFlags.text.includes("--host");
persistentSettings.p2poolFlags = p2poolFlags.text;
}
}
}
}
}
function updateStatusText() {
function updateStatusText(p2poolHashrate) {
if (appWindow.isMining) {
var userHashRate = walletManager.miningHashRate();
if (userHashRate === 0) {
statusText.text = qsTr("Mining temporarily suspended.") + translationManager.emptyString;
if (persistentSettings.allow_p2pool_mining) {
if (p2poolHashrate === 0) {
statusText.text = qsTr("Starting P2Pool") + translationManager.emptyString;
}
else {
statusText.text = qsTr("Mining with P2Pool, at %1 H/s").arg(p2poolHashrate) + translationManager.emptyString;
}
}
else {
var blockTime = 120;
var blocksPerDay = 86400 / blockTime;
var globalHashRate = walletManager.networkDifficulty() / blockTime;
var probabilityFindNextBlock = userHashRate / globalHashRate;
var probabilityFindBlockDay = 1 - Math.pow(1 - probabilityFindNextBlock, blocksPerDay);
var chanceFindBlockDay = Math.round(1 / probabilityFindBlockDay);
statusText.text = qsTr("Mining at %1 H/s. It gives you a 1 in %2 daily chance of finding a block.").arg(userHashRate).arg(chanceFindBlockDay) + translationManager.emptyString;
var userHashRate = walletManager.miningHashRate();
if (userHashRate === 0) {
statusText.text = qsTr("Mining temporarily suspended.") + translationManager.emptyString;
}
else {
var blockTime = 120;
var blocksPerDay = 86400 / blockTime;
var globalHashRate = walletManager.networkDifficulty() / blockTime;
var probabilityFindNextBlock = userHashRate / globalHashRate;
var probabilityFindBlockDay = 1 - Math.pow(1 - probabilityFindNextBlock, blocksPerDay);
var chanceFindBlockDay = Math.round(1 / probabilityFindBlockDay);
statusText.text = qsTr("Mining at %1 H/s. It gives you a 1 in %2 daily chance of finding a block.").arg(userHashRate).arg(chanceFindBlockDay) + translationManager.emptyString;
}
}
}
else {
@@ -319,16 +541,35 @@ Rectangle {
}
}
function onMiningStatus(isMining) {
var daemonReady = !persistentSettings.useRemoteNode && appWindow.daemonSynced
function onMiningStatus(isMining, hashrate) {
var daemonReady = appWindow.daemonSynced
if (!persistentSettings.allowRemoteNodeMining) {
var daemonReady = !persistentSettings.useRemoteNode && daemonReady
}
appWindow.isMining = isMining;
updateStatusText()
updateStatusText(hashrate)
startSoloMinerButton.enabled = !appWindow.isMining && daemonReady
stopSoloMinerButton.enabled = !startSoloMinerButton.enabled && daemonReady
}
function update() {
walletManager.miningStatusAsync();
persistentSettings.allow_p2pool_mining = miningModeDropdown.currentIndex === 1;
if (persistentSettings.allow_p2pool_mining) {
p2poolManager.getStatus();
}
else {
walletManager.miningStatusAsync();
}
}
function miningError(message) {
p2poolManager.exit()
errorPopup.title = qsTr("Error starting mining") + translationManager.emptyString;
errorPopup.text = message
if (persistentSettings.useRemoteNode && !persistentSettings.allowRemoteNodeMining)
errorPopup.text += qsTr("Mining is only available on local daemons. Run a local daemon to be able to mine.<br>") + translationManager.emptyString
errorPopup.icon = StandardIcon.Critical
errorPopup.open()
}
MoneroComponents.StandardDialog {
@@ -338,21 +579,90 @@ Rectangle {
Timer {
id: timer
interval: 2000; running: false; repeat: true
interval: 2000
running: middlePanel.advancedView.state === "Mining" && middlePanel.state === "Advanced" && currentWallet !== undefined && (!persistentSettings.useRemoteNode || persistentSettings.allowRemoteNodeMining)
repeat: true
onTriggered: update()
}
function onPageCompleted() {
console.log("Mining page loaded");
update()
timer.running = !persistentSettings.useRemoteNode
function startP2PoolLocal() {
var noSync = false;
//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]
}
}
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()
}
else {
miningError(qsTr("Couldn't start mining.<br>") + translationManager.emptyString)
}
}
function onPageClosed() {
timer.running = false
function startP2Pool() {
var address = currentWallet.address(0, 0);
var chain = "mini"
if (chainDropdown.currentIndex === 1) {
chain = "main"
}
var p2poolArgs = persistentSettings.p2poolFlags;
var success = p2poolManager.start(p2poolArgs, address, chain, threads);
if (success)
{
update()
}
else {
miningError(qsTr("Couldn't start mining.<br>") + translationManager.emptyString)
}
}
function p2poolDownloadFailed() {
statusMessage.visible = false
errorPopup.title = qsTr("P2Pool Installation Failed") + translationManager.emptyString;
errorPopup.text = qsTr("P2Pool installation failed.") + isWindows ? (" " + qsTr("Try starting the program with administrator privileges.")) : ""
errorPopup.icon = StandardIcon.Critical
errorPopup.open()
update()
}
function p2poolDownloadSucceeded() {
statusMessage.visible = false
informationPopup.title = qsTr("P2Pool Installation Succeeded") + translationManager.emptyString;
informationPopup.text = qsTr("P2Pool has successfully installed.");
informationPopup.icon = StandardIcon.Critical
informationPopup.open()
update()
}
Component.onCompleted: {
walletManager.miningStatus.connect(onMiningStatus);
p2poolManager.p2poolStatus.connect(onMiningStatus);
p2poolManager.p2poolDownloadFailure.connect(p2poolDownloadFailed);
p2poolManager.p2poolDownloadSuccess.connect(p2poolDownloadSucceeded);
}
}

View File

@@ -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
}

View File

@@ -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");
}

View File

@@ -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
@@ -1030,24 +1030,7 @@ Rectangle {
// deleting transaction object, we don't want memleaks
transaction.destroy();
} else {
confirmationDialog.text = qsTr("\nNumber of transactions: ") + transaction.txCount
for (var i = 0; i < transaction.txCount; ++i) {
confirmationDialog.text += qsTr("\nTransaction #%1").arg(i+1)
+qsTr("\nRecipient: ") + transaction.recipientAddress[i]
+ (transaction.paymentId[i] == "" ? "" : qsTr("\n\payment ID: ") + transaction.paymentId[i])
+ qsTr("\nAmount: ") + walletManager.displayAmount(transaction.amount(i))
+ qsTr("\nFee: ") + walletManager.displayAmount(transaction.fee(i))
+ qsTr("\nRingsize: ") + (transaction.mixin(i)+1)
// TODO: add descriptions to unsigned_tx_set?
// + (transactionDescription === "" ? "" : (qsTr("\n\nDescription: ") + transactionDescription))
+ translationManager.emptyString
if (i > 0) {
confirmationDialog.text += "\n\n"
}
}
confirmationDialog.text = qsTr("\nConfirmation message:\n ") + transaction.confirmationMessage
console.log(transaction.confirmationMessage);
// Show confirmation dialog

View File

@@ -60,13 +60,13 @@ Rectangle {
MoneroComponents.Label {
id: soloTitleLabel
fontSize: 24
text: qsTr("Prove Transaction") + translationManager.emptyString
text: qsTr("Prove Transaction") + " / " + qsTr("Reserve") + translationManager.emptyString
}
MoneroComponents.TextPlain {
Layout.fillWidth: true
text: qsTr("Generate a proof of your incoming/outgoing payment by supplying the transaction ID, the recipient address and an optional message. \n" +
"For the case of outgoing payments, you can get a 'Spend Proof' that proves the authorship of a transaction. In this case, you don't need to specify the recipient address.") + translationManager.emptyString
"For the case of outgoing payments, you can get a 'Spend Proof' that proves the authorship of a transaction. In this case, you don't need to specify the recipient address.") + qsTr("\nFor reserve proofs you don't need to specify tx id or address.") + translationManager.emptyString
wrapMode: Text.Wrap
font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 14
@@ -83,6 +83,7 @@ Rectangle {
placeholderText: qsTr("Paste tx ID") + translationManager.emptyString
readOnly: false
copyButton: true
enabled: getReserveProofAmtLine.text.length === 0
}
MoneroComponents.LineEdit {
@@ -95,6 +96,38 @@ Rectangle {
placeholderText: qsTr("Recipient's wallet address") + translationManager.emptyString;
readOnly: false
copyButton: true
enabled: getReserveProofAmtLine.text.length === 0
}
MoneroComponents.LineEdit {
id: getReserveProofAmtLine
Layout.fillWidth: true
labelFontSize: 14
labelText: qsTr("Amount") + translationManager.emptyString
fontSize: 16
placeholderFontSize: 16
placeholderText: qsTr("Paste amount of XMR (reserve proof only)") + translationManager.emptyString
readOnly: false
copyButton: true
enabled: getProofAddressLine.text.length === 0 && getProofTxIdLine.text.length === 0
onTextChanged: {
text = text.trim().replace(",", ".");
const match = text.match(/^0+(\d.*)/);
if (match) {
const cursorPosition = cursorPosition;
text = match[1];
cursorPosition = Math.max(cursorPosition, 1) - 1;
} else if(text.indexOf('.') === 0) {
text = '0' + text;
if (text.length > 2) {
cursorPosition = 1;
}
}
error = walletManager.amountFromString(text) > appWindow.getUnlockedBalance();
}
validator: RegExpValidator {
regExp: /^\s*(\d{1,8})?([\.,]\d{1,12})?\s*$/
}
}
MoneroComponents.LineEdit {
@@ -113,10 +146,10 @@ Rectangle {
Layout.topMargin: 16
small: true
text: qsTr("Generate") + translationManager.emptyString
enabled: TxUtils.checkTxID(getProofTxIdLine.text) && (getProofAddressLine.text.length == 0 || TxUtils.checkAddress(getProofAddressLine.text, appWindow.persistentSettings.nettype))
enabled: TxUtils.checkTxID(getProofTxIdLine.text) && (getProofAddressLine.text.length == 0 || TxUtils.checkAddress(getProofAddressLine.text, appWindow.persistentSettings.nettype)) || getReserveProofAmtLine.text.length != 0 && walletManager.amountFromString(getReserveProofAmtLine.text) < appWindow.getUnlockedBalance() && walletManager.amountFromString(getReserveProofAmtLine.text) > 0
onClicked: {
console.log("getProof: Generate clicked: txid " + getProofTxIdLine.text + ", address " + getProofAddressLine.text + ", message: " + getProofMessageLine.text);
middlePanel.getProofClicked(getProofTxIdLine.text, getProofAddressLine.text, getProofMessageLine.text)
middlePanel.getProofClicked(getProofTxIdLine.text, getProofAddressLine.text, getProofMessageLine.text, getReserveProofAmtLine.text)
}
}
@@ -133,12 +166,12 @@ Rectangle {
MoneroComponents.Label {
id: soloTitleLabel2
fontSize: 24
text: qsTr("Check Transaction") + translationManager.emptyString
text: qsTr("Check Transaction") + " / " + qsTr("Reserve") + translationManager.emptyString
}
MoneroComponents.TextPlain {
text: qsTr("Verify that funds were paid to an address by supplying the transaction ID, the recipient address, the message used for signing and the signature.\n" +
"For the case with Spend Proof, you don't need to specify the recipient address.") + translationManager.emptyString
"For the case with Spend Proof, you don't need to specify the recipient address.") + "\n" + qsTr("Transaction is not needed for reserve proof.") + translationManager.emptyString
wrapMode: Text.Wrap
Layout.fillWidth: true
font.family: MoneroComponents.Style.fontRegular.name
@@ -189,7 +222,7 @@ Rectangle {
labelFontSize: 14
labelText: qsTr("Signature") + translationManager.emptyString
placeholderFontSize: 16
placeholderText: qsTr("Paste tx proof") + translationManager.emptyString;
placeholderText: qsTr("Paste tx proof") + " / " + qsTr("reserve proof") + translationManager.emptyString;
readOnly: false
copyButton: true
}
@@ -198,7 +231,7 @@ Rectangle {
Layout.topMargin: 16
small: true
text: qsTr("Check") + translationManager.emptyString
enabled: TxUtils.checkTxID(checkProofTxIdLine.text) && TxUtils.checkSignature(checkProofSignatureLine.text) && ((checkProofSignatureLine.text.indexOf("SpendProofV") === 0 && checkProofAddressLine.text.length == 0) || (checkProofSignatureLine.text.indexOf("SpendProofV") !== 0 && TxUtils.checkAddress(checkProofAddressLine.text, appWindow.persistentSettings.nettype)))
enabled: (TxUtils.checkTxID(checkProofTxIdLine.text) && TxUtils.checkSignature(checkProofSignatureLine.text) && ((checkProofSignatureLine.text.indexOf("SpendProofV") === 0 && checkProofAddressLine.text.length == 0) || (checkProofSignatureLine.text.indexOf("SpendProofV") !== 0 && TxUtils.checkAddress(checkProofAddressLine.text, appWindow.persistentSettings.nettype)))) || (TxUtils.checkSignature(checkProofSignatureLine.text) && checkProofSignatureLine.text.indexOf("ReserveProofV") === 0 && TxUtils.checkAddress(checkProofAddressLine.text, appWindow.persistentSettings.nettype))
onClicked: {
console.log("checkProof: Check clicked: txid " + checkProofTxIdLine.text + ", address " + checkProofAddressLine.text + ", message " + checkProofMessageLine.text + ", signature " + checkProofSignatureLine.text);
middlePanel.checkProofClicked(checkProofTxIdLine.text, checkProofAddressLine.text, checkProofMessageLine.text, checkProofSignatureLine.text)

View File

@@ -49,6 +49,7 @@ ColumnLayout {
property alias settingsStateViewState: settingsStateView.state
MoneroComponents.Navbar {
id: navbarId
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: height
Layout.bottomMargin: height
@@ -73,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"
@@ -145,7 +147,7 @@ ColumnLayout {
PropertyAnimation {
target: enterItem
property: "x"
from: 0 - target.width
from: (navbarId.currentIndex < navbarId.previousIndex ? 1 : -1) * - target.width
to: 0
duration: 300
easing.type: Easing.OutCubic
@@ -154,7 +156,7 @@ ColumnLayout {
target: exitItem
property: "x"
from: 0
to: target.width
to: (navbarId.currentIndex < navbarId.previousIndex ? 1 : -1) * target.width
duration: 300
easing.type: Easing.OutCubic
}

View File

@@ -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) {
@@ -409,7 +409,7 @@ Rectangle {
small: true
text: qsTr("Donate to Monero") + translationManager.emptyString
onClicked: {
middlePanel.sendTo("888tNkZrPN6JsEgekjMnABU4TBzc2Dt29EPAvkRxbANsAnjyPbb3iQ1YBRk1UXcdRsiKc9dhwMVgN5S9cQUiyoogDavup3H", "", "Donation to Monero Core Team");
middlePanel.sendTo("888tNkZrPN6JsEgekjMnABU4TBzc2Dt29EPAvkRxbANsAnjyPbb3iQ1YBRk1UXcdRsiKc9dhwMVgN5S9cQUiyoogDavup3H", "", qsTr("Donation to Monero Core Team") + translationManager.emptyString);
}
}
}

View File

@@ -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 {
@@ -165,7 +171,6 @@ Rectangle {
if (!checked) {
console.log("Disabled price conversion");
persistentSettings.fiatPriceEnabled = false;
appWindow.fiatTimerStop();
}
}
}
@@ -232,8 +237,6 @@ Rectangle {
onClicked: {
console.log("Enabled price conversion");
persistentSettings.fiatPriceEnabled = true;
appWindow.fiatApiRefresh();
appWindow.fiatTimerStart();
}
}
}

View File

@@ -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);
}

View File

@@ -55,6 +55,7 @@ Rectangle{
Layout.fillWidth: true
Layout.preferredHeight: 90
color: "transparent"
visible: !isAndroid
Rectangle {
id: localNodeDivider

View File

@@ -50,6 +50,14 @@ Rectangle {
anchors.topMargin: 0
spacing: 0
MoneroComponents.SettingsListItem {
iconText: FontAwesome.lock
description: qsTr("Locks the wallet on demand.") + translationManager.emptyString
title: qsTr("Lock this wallet") + translationManager.emptyString
symbol: (isMac ? "⌃" : qsTr("Ctrl+")) + "L" + translationManager.emptyString
onClicked: appWindow.lock();
}
MoneroComponents.SettingsListItem {
iconText: FontAwesome.signOutAlt
description: qsTr("Logs out of this wallet.") + translationManager.emptyString
@@ -91,6 +99,7 @@ Rectangle {
}
MoneroComponents.SettingsListItem {
enabled: leftPanel.progressBar.fillLevel == 100
iconText: FontAwesome.repeat
description: qsTr("Use this feature if you think the shown balance is not accurate.") + translationManager.emptyString
title: qsTr("Rescan wallet balance") + translationManager.emptyString
@@ -100,7 +109,11 @@ Rectangle {
if (!currentWallet.rescanSpent()) {
console.error("Error: ", currentWallet.errorString);
informationPopup.title = qsTr("Error") + translationManager.emptyString;
informationPopup.text = qsTr("Error: ") + currentWallet.errorString
if (currentWallet.errorString == "Rescan spent can only be used with a trusted daemon") {
informationPopup.text = qsTr("Error: ") + qsTr("Rescan spent can only be used with a trusted remote node. If you trust the current node you are connected to (%1), you can mark it as trusted in Settings > Node page.").arg(remoteNodesModel.currentRemoteNode().address) + translationManager.emptyString;
} else {
informationPopup.text = qsTr("Error: ") + currentWallet.errorString;
}
informationPopup.icon = StandardIcon.Critical
informationPopup.onCloseCallback = null
informationPopup.open();
@@ -114,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

35
qml.qrc
View File

@@ -97,6 +97,9 @@
<file>lang/flags/gb.png</file>
<file>lang/flags/us.png</file>
<file>lang/flags/nb_NO.png</file>
<file>lang/flags/el.png</file>
<file>lang/flags/vi.png</file>
<file>lang/flags/is.png</file>
<file>pages/Receive.qml</file>
<file>pages/TxKey.qml</file>
<file>pages/SharedRingDB.qml</file>
@@ -116,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>
@@ -189,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>
@@ -261,8 +279,21 @@
<file>components/SuccessfulTxDialog.qml</file>
<file>components/TxConfirmationDialog.qml</file>
<file>images/ledgerNanoS.png</file>
<file>images/ledgerNanoSPlus.png</file>
<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
View File

@@ -0,0 +1,2 @@
[Controls]
Style=Desktop

View File

@@ -36,6 +36,8 @@ file(GLOB SOURCE_FILES
"libwalletqt/UnsignedTransaction.h"
"daemon/*.h"
"daemon/*.cpp"
"p2pool/*.h"
"p2pool/*.cpp"
"model/*.h"
"model/*.cpp"
"qt/*.h"
@@ -97,6 +99,7 @@ target_include_directories(monero-wallet-gui PUBLIC
${CMAKE_SOURCE_DIR}/monero/external/qrcodegen
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/daemon
${CMAKE_CURRENT_SOURCE_DIR}/p2pool
${CMAKE_CURRENT_SOURCE_DIR}/libwalletqt
${CMAKE_CURRENT_SOURCE_DIR}/model
${CMAKE_CURRENT_SOURCE_DIR}/QR-Code-scanner

View File

@@ -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)

View File

@@ -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;
};

View File

@@ -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;
}
@@ -844,6 +869,25 @@ Q_INVOKABLE QString Wallet::checkSpendProof(const QString &txid, const QString &
return QString::fromStdString(result);
}
Q_INVOKABLE QString Wallet::getReserveProof(bool all, quint32 account_index, quint64 amount, const QString &message) const
{
qDebug("Generating reserve proof");
std::string result = m_walletImpl->getReserveProof(all, account_index, amount, message.toStdString());
if (result.empty())
result = "error|" + m_walletImpl->errorString();
return QString::fromStdString(result);
}
Q_INVOKABLE QString Wallet::checkReserveProof(const QString &address, const QString &message, const QString &signature) const
{
bool good;
uint64_t total;
uint64_t spent;
bool success = m_walletImpl->checkReserveProof(address.toStdString(), message.toStdString(), signature.toStdString(), good, total, spent);
std::string result = std::string(success ? "true" : "false") + "|" + std::string(good ? "true" : "false") + "|" + QString::number(total).toStdString() + "|" + QString::number(spent).toStdString();
return QString::fromStdString(result);
}
QString Wallet::signMessage(const QString &message, bool filename) const
{
if (filename) {
@@ -1106,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)
@@ -1164,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;
}
}

View File

@@ -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);
@@ -318,6 +321,8 @@ public:
Q_INVOKABLE QString getSpendProof(const QString &txid, const QString &message) const;
Q_INVOKABLE void getSpendProofAsync(const QString &txid, const QString &message, const QJSValue &callback);
Q_INVOKABLE QString checkSpendProof(const QString &txid, const QString &message, const QString &signature) const;
Q_INVOKABLE QString getReserveProof(bool all, quint32 account_index, quint64 amount, const QString &message) const;
Q_INVOKABLE QString checkReserveProof(const QString &address, const QString &message, const QString &signature) const;
// Rescan spent outputs
Q_INVOKABLE bool rescanSpent();
@@ -456,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;
@@ -468,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;

View File

@@ -36,7 +36,6 @@
#include <QObject>
#include <QDesktopWidget>
#include <QScreen>
#include <QRegExp>
#include <QThread>
#include <version.h>
@@ -79,6 +78,7 @@
// IOS exclusions
#ifndef Q_OS_IOS
#include "daemon/DaemonManager.h"
#include "p2pool/P2PoolManager.h"
#endif
#if defined(Q_OS_WIN)
@@ -205,6 +205,13 @@ int main(int argc, char *argv[])
qputenv("QML_DISABLE_DISK_CACHE", "1");
for (int i = 0; i < argc; i++) {
if (QString(argv[i]).contains("platformpluginpath")) {
qCritical() << "Setting -platformpluginpath as an argument is disabled"; // CVE-2021-3401
return 1;
}
}
MainApp app(argc, argv);
#if defined(Q_OS_WIN)
@@ -401,6 +408,8 @@ Verify update binary using 'shasum'-compatible (SHA256 algo) output signed by tw
#ifndef Q_OS_IOS
qmlRegisterUncreatableType<DaemonManager>("moneroComponents.DaemonManager", 1, 0, "DaemonManager",
"DaemonManager can't be instantiated directly");
qmlRegisterUncreatableType<P2PoolManager>("moneroComponents.P2PoolManager", 1, 0, "P2PoolManager",
"P2PoolManager can't be instantiated directly");
#endif
qmlRegisterUncreatableType<AddressBookModel>("moneroComponents.AddressBookModel", 1, 0, "AddressBookModel",
"AddressBookModel can't be instantiated directly");
@@ -462,7 +471,9 @@ Verify update binary using 'shasum'-compatible (SHA256 algo) output signed by tw
// Exclude daemon manager from IOS
#ifndef Q_OS_IOS
DaemonManager daemonManager;
P2PoolManager p2poolManager;
engine.rootContext()->setContextProperty("daemonManager", &daemonManager);
engine.rootContext()->setContextProperty("p2poolManager", &p2poolManager);
#endif
engine.rootContext()->setContextProperty("isWindows", isWindows);
@@ -493,7 +504,11 @@ Verify update binary using 'shasum'-compatible (SHA256 algo) output signed by tw
engine.rootContext()->setContextProperty("homePath", QDir::homePath());
engine.rootContext()->setContextProperty("applicationDirectory", QApplication::applicationDirPath());
engine.rootContext()->setContextProperty("idealThreadCount", QThread::idealThreadCount());
#ifdef WITH_UPDATER
engine.rootContext()->setContextProperty("disableCheckUpdatesFlag", parser.isSet(disableCheckUpdatesOption));
#else
engine.rootContext()->setContextProperty("disableCheckUpdatesFlag", true);
#endif
engine.rootContext()->setContextProperty("socksProxyFlag", parser.value(socksProxyOption));
engine.rootContext()->setContextProperty("socksProxyFlagSet", parser.isSet(socksProxyOption));
@@ -503,6 +518,12 @@ Verify update binary using 'shasum'-compatible (SHA256 algo) output signed by tw
#endif
engine.rootContext()->setContextProperty("builtWithScanner", builtWithScanner);
bool builtWithDesktopEntry = false;
#ifdef WITH_DESKTOP_ENTRY
builtWithDesktopEntry = true;
#endif
engine.rootContext()->setContextProperty("builtWithDesktopEntry", builtWithDesktopEntry);
engine.rootContext()->setContextProperty("moneroVersion", MONERO_VERSION_FULL);
// Load main window (context properties needs to be defined obove this line)

View File

@@ -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");
}

View File

@@ -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;

View File

@@ -0,0 +1,245 @@
// Copyright (c) 2014-2022, The Monero Project
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "P2PoolManager.h"
#include "net/http_client.h"
#include "common/util.h"
#include "qt/utils.h"
#include <QElapsedTimer>
#include <QFile>
#include <QMutexLocker>
#include <QFileInfo>
#include <QDir>
#include <QDebug>
#include <QUrl>
#include <QtConcurrent/QtConcurrent>
#include <QApplication>
#include <QProcess>
#include <QMap>
#include <QCryptographicHash>
void P2PoolManager::download() {
m_scheduler.run([this] {
QUrl url;
QString fileName;
QString validHash;
#ifdef Q_OS_WIN
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/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/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;
const epee::net_utils::http::http_response_info* response = NULL;
std::string userAgent = randomUserAgent().toStdString();
std::chrono::milliseconds timeout = std::chrono::seconds(10);
http_client.set_server(url.host().toStdString(), "443", {});
bool success = http_client.invoke_get(url.path().toStdString(), timeout, {}, std::addressof(response), {{"User-Agent", userAgent}});
if (response->m_response_code == 302) {
epee::net_utils::http::fields_list fields = response->m_header_info.m_etc_fields;
for (std::pair<std::string, std::string> i : fields) {
if (i.first == "Location") {
url = QString::fromStdString(i.second);
http_client.set_server(url.host().toStdString(), "443", {});
std::string query = url.query(QUrl::FullyEncoded).toStdString();
std::string path = url.path().toStdString() + "?" + query;
http_client.wipe_response();
success = http_client.invoke_get(path, timeout, {}, std::addressof(response), {{"User-Agent", userAgent}});
}
}
}
if (!success) {
emit p2poolDownloadFailure();
}
else {
std::string stringData = response->m_body;
QByteArray data(stringData.c_str(), stringData.length());
QByteArray hashData = QCryptographicHash::hash(data, QCryptographicHash::Sha256);
QString hash = hashData.toHex();
if (hash != validHash) {
emit p2poolDownloadFailure();
}
else {
file.open(QIODevice::WriteOnly);
file.write(data);
file.close();
QProcess::execute("tar", {"-xzf", fileName, "--strip=1", "-C", m_p2poolPath});
QFile::remove(fileName);
if (isInstalled()) {
emit p2poolDownloadSuccess();
}
else {
emit p2poolDownloadFailure();
}
}
}
});
return;
}
bool P2PoolManager::isInstalled() {
if (!QFileInfo(m_p2pool).isFile())
{
return false;
}
return true;
}
void P2PoolManager::getStatus() {
QString statsPath = m_p2poolPath + "/stats/local/miner";
bool status = true;
if (!QFileInfo(statsPath).isFile() || !started)
{
status = started;
emit p2poolStatus(status, 0);
return;
}
QFile statsFile(statsPath);
statsFile.open(QIODevice::ReadOnly);
QTextStream statsOut(&statsFile);
QByteArray data;
statsOut >> data;
statsFile.close();
QJsonDocument json = QJsonDocument::fromJson(data);
QJsonObject jsonObj = json.object();
int hashrate = jsonObj.value("current_hashrate").toInt();
emit p2poolStatus(status, hashrate);
return;
}
bool P2PoolManager::start(const QString &flags, const QString &address, const QString &chain, const QString &threads)
{
// prepare command line arguments and pass to p2pool
QStringList arguments;
// Custom startup flags for p2pool
foreach (const QString &str, flags.split(" ")) {
qDebug() << QString(" [%1] ").arg(str);
if (!str.isEmpty())
arguments << str;
}
if (!arguments.contains("--local-api")) {
arguments << "--local-api";
}
if (!arguments.contains("--data-api")) {
QDir dir;
QString dirName = m_p2poolPath + "/stats/";
QDir statsDir(dirName);
if (dir.exists(dirName)) {
statsDir.removeRecursively();
}
dir.mkdir(dirName);
arguments << "--data-api" << dirName;
}
if (!arguments.contains("--start-mining")) {
arguments << "--start-mining" << threads;
}
if (chain == "mini") {
arguments << "--mini";
}
if (!arguments.contains("--wallet")) {
arguments << "--wallet" << address;
}
qDebug() << "starting p2pool " + m_p2pool;
qDebug() << "With command line arguments " << arguments;
QMutexLocker locker(&m_p2poolMutex);
m_p2poold.reset(new QProcess());
// Set program parameters
m_p2poold->setProgram(m_p2pool);
m_p2poold->setArguments(arguments);
m_p2poold->setWorkingDirectory(m_p2poolPath);
// Start p2pool
started = m_p2poold->startDetached();
if (!started) {
qDebug() << "P2Pool start error: " + m_p2poold->errorString();
emit p2poolStartFailure();
return false;
}
return true;
}
void P2PoolManager::exit()
{
qDebug("P2PoolManager: exit()");
if (started) {
#ifdef Q_OS_WIN
QProcess::execute("taskkill", {"/F", "/IM", "p2pool.exe"});
#else
QProcess::execute("pkill", {"p2pool"});
#endif
started = false;
QString dirName = m_p2poolPath + "/stats/";
QDir dir(dirName);
dir.removeRecursively();
}
}
P2PoolManager::P2PoolManager(QObject *parent)
: QObject(parent)
, m_scheduler(this)
{
started = false;
// Platform dependent path to p2pool
#ifdef Q_OS_WIN
m_p2poolPath = QApplication::applicationDirPath() + "/p2pool";
if (!QDir(m_p2poolPath).exists()) {
QDir().mkdir(m_p2poolPath);
}
m_p2pool = m_p2poolPath + "/p2pool.exe";
#elif defined(Q_OS_UNIX)
m_p2poolPath = QApplication::applicationDirPath();
m_p2pool = m_p2poolPath + "/p2pool";
#endif
if (m_p2pool.length() == 0) {
qCritical() << "no p2pool binary defined for current platform";
}
}
P2PoolManager::~P2PoolManager() {
m_scheduler.shutdownWaitForFinished();
}

View File

@@ -0,0 +1,73 @@
// Copyright (c) 2014-2022, The Monero Project
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef P2POOLMANAGER_H
#define P2POOLMANAGER_H
#include <memory>
#include <QMutex>
#include <QObject>
#include <QUrl>
#include <QProcess>
#include "NetworkType.h"
#include "qt/FutureScheduler.h"
class P2PoolManager : public QObject
{
Q_OBJECT
public:
explicit P2PoolManager(QObject *parent = 0);
~P2PoolManager();
Q_INVOKABLE bool start(const QString &flags, const QString &address, const QString &chain, const QString &threads);
Q_INVOKABLE void exit();
Q_INVOKABLE bool isInstalled();
Q_INVOKABLE void getStatus();
Q_INVOKABLE void download();
private:
bool running(NetworkType::Type nettype) const;
signals:
void p2poolStartFailure() const;
void p2poolStatus(bool isMining, int hashrate) const;
void p2poolDownloadFailure() const;
void p2poolDownloadSuccess() const;
private:
std::unique_ptr<QProcess> m_p2poold;
QMutex m_p2poolMutex;
QString m_p2pool;
QString m_p2poolPath;
bool started = false;
mutable FutureScheduler m_scheduler;
};
#endif // P2POOLMANAGER_H

View File

@@ -53,9 +53,6 @@ private:
return qMakePair(false, QFuture<T>());
}
QFutureWatcher<void> schedule(std::function<void()> function);
QFutureWatcher<QJSValueList> schedule(std::function<QJSValueList() noexcept> function, const QJSValue &callback);
private:
size_t Alive;
QWaitCondition Condition;

View File

@@ -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 = QTextCodec::codecForMib(106)->toUnicode(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)));
}

View File

@@ -1,4 +1,3 @@
#include <QRegExp>
#include <QMessageBox>
#include <QPixmap>
#include <QTranslator>

View File

@@ -109,8 +109,7 @@ void IPC::handleConnection(){
clientConnection, &QLocalSocket::deleteLater);
clientConnection->waitForReadyRead(2);
QByteArray cmdArray = clientConnection->readAll();
QString cmdString = QTextCodec::codecForMib(106)->toUnicode(cmdArray); // UTF-8
QString cmdString = QString(clientConnection->readAll());
qDebug() << cmdString;
this->parseCommand(cmdString);

View File

@@ -26,6 +26,10 @@
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#if defined(_WIN32) && !defined(MONERO_GUI_STATIC)
#include <Winsock2.h>
#endif
#include "updater.h"
#include <common/util.h>

View File

@@ -30,7 +30,7 @@
#define UTILS_H
#include <QtCore>
#include <QRegExp>
#include <QRegularExpression>
#include <QApplication>
bool fileExists(QString path);
@@ -42,7 +42,7 @@ QString getAccountName();
QString xdgMime();
void registerXdgMime();
#endif
const static QRegExp reURI = QRegExp("^\\w+:\\/\\/([\\w+\\-?\\-_\\-=\\-&]+)");
const static QRegularExpression reURI = QRegularExpression("^\\w+:\\/\\/([\\w+\\-?\\-_\\-=\\-&]+)");
QString randomUserAgent();
#endif // UTILS_H

Some files were not shown because too many files have changed in this diff Show More