Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
732f34b595 | ||
|
|
eb2f004d45 | ||
|
|
8b6eff5fb8 | ||
|
|
af743fc62f | ||
|
|
2c33333000 | ||
|
|
2548134302 | ||
|
|
7a995706b7 | ||
|
|
47aca44551 | ||
|
|
08e069b3d9 | ||
|
|
6b7b4badcd | ||
|
|
a6cec46ecc | ||
|
|
5ae3d42d1f | ||
|
|
fedeaa5c0d | ||
|
|
ecca86a1ce | ||
|
|
ea08119fa3 | ||
|
|
c3b7ae3ab1 | ||
|
|
6bb1f00082 | ||
|
|
d6eea75b6a | ||
|
|
341f83f71f | ||
|
|
10be6d49cb | ||
|
|
09c0e488a8 | ||
|
|
57736b1fee | ||
|
|
e284c2e349 | ||
|
|
675fe02cb1 | ||
|
|
5fe631037c | ||
|
|
736f10eb8a | ||
|
|
c7c4237d10 | ||
|
|
5e6bd0b9bb | ||
|
|
c1699c2c79 | ||
|
|
d7364e1d80 | ||
|
|
d248aaf8b3 | ||
|
|
67dff741dd | ||
|
|
21fe180a84 | ||
|
|
3f83d74bac | ||
|
|
ec142556d8 | ||
|
|
fc426abfc0 | ||
|
|
6241c2e1de | ||
|
|
ba940d6df4 | ||
|
|
29f4d627d2 | ||
|
|
774fa969a3 | ||
|
|
f7d76eef98 | ||
|
|
63dc0179c1 | ||
|
|
0131476a5d | ||
|
|
1b89370c1c | ||
|
|
c8606126f0 | ||
|
|
52850ccf23 | ||
|
|
60540b87d0 | ||
|
|
db5ba12190 | ||
|
|
7cf050ff8e | ||
|
|
b9d8128880 | ||
|
|
3e10b25068 | ||
|
|
bb85f020d5 | ||
|
|
a9ab338060 | ||
|
|
c305bfd5a6 | ||
|
|
69551efde3 | ||
|
|
6dc9258a5b | ||
|
|
cfd1942b38 | ||
|
|
0efce33634 | ||
|
|
23eb71e337 | ||
|
|
9beece6105 | ||
|
|
b06d8e9727 | ||
|
|
0f9cd68b97 | ||
|
|
3b829ec433 | ||
|
|
0d6f5c6242 | ||
|
|
9d45975ddc | ||
|
|
41635e39bb | ||
|
|
9803f66cc2 | ||
|
|
08ee34c9a6 | ||
|
|
348685a025 | ||
|
|
0a7261d05d | ||
|
|
7556670f88 | ||
|
|
ac2ca5a81b | ||
|
|
c296eab191 | ||
|
|
7f23eed890 | ||
|
|
346e24d2f8 | ||
|
|
038eee5f42 | ||
|
|
904432ea82 | ||
|
|
126becf47a | ||
|
|
f9b0cc1d1e | ||
|
|
662d165beb | ||
|
|
ffd7879096 | ||
|
|
d2beb77288 | ||
|
|
3f489b3558 | ||
|
|
e0f7473ed4 | ||
|
|
6bc886f53a | ||
|
|
c6129b7713 | ||
|
|
7dda93db57 | ||
|
|
a80bfcc325 | ||
|
|
1a2ba0f200 | ||
|
|
d0b54f13c6 | ||
|
|
e3f6b73ab2 | ||
|
|
9e96f4183a | ||
|
|
9d8897d29c | ||
|
|
aa6533b37d | ||
|
|
9ead5c29cd | ||
|
|
22abca4578 | ||
|
|
7c1b66faf5 | ||
|
|
3e534fd536 | ||
|
|
f05435d694 | ||
|
|
68a5469b97 | ||
|
|
045d9ec2d2 | ||
|
|
9fc77f3bc9 | ||
|
|
f10bdc1634 | ||
|
|
574b0ebf0c | ||
|
|
3987569d55 | ||
|
|
b7362b3125 | ||
|
|
3d47b453a8 | ||
|
|
3b8adcbf98 | ||
|
|
0ca853edaf | ||
|
|
2ab1b900f4 | ||
|
|
696149096d | ||
|
|
292f452cfe | ||
|
|
33c2342c8a | ||
|
|
e6532ab706 | ||
|
|
8c6fb5df9b | ||
|
|
c379456221 | ||
|
|
e17c7ae13d | ||
|
|
7627c89162 | ||
|
|
71fb639c16 | ||
|
|
58c9c1a006 | ||
|
|
2237d5eff8 | ||
|
|
f343398479 | ||
|
|
433c9ca5e6 | ||
|
|
9ddb68c82b | ||
|
|
ff2f325c51 | ||
|
|
aa3d674242 | ||
|
|
a736f5f5c6 | ||
|
|
3593d8f400 | ||
|
|
dc98b702d6 | ||
|
|
f7a26eaf72 | ||
|
|
99dd0944cf | ||
|
|
177773eb66 | ||
|
|
c2b5a13f59 | ||
|
|
a2d60f6593 | ||
|
|
0c4c99b63b | ||
|
|
3ccf20e2ea | ||
|
|
518ce674e6 | ||
|
|
60e6f563c6 | ||
|
|
46875b24c3 | ||
|
|
75e137f0d0 | ||
|
|
2b6145ea4f | ||
|
|
c78007a1f3 | ||
|
|
a18aeab6c3 | ||
|
|
5f205ac49c | ||
|
|
4f5ad63bf9 | ||
|
|
4036d299eb | ||
|
|
8c80685686 | ||
|
|
fc004aa254 | ||
|
|
2771ba8773 | ||
|
|
b3b1ac1c47 | ||
|
|
c2ec2c5dc9 | ||
|
|
c2e335e439 | ||
|
|
38c3a3a816 | ||
|
|
7762e283db | ||
|
|
469c783a48 | ||
|
|
0869b4e456 | ||
|
|
cc9b8a9e6d | ||
|
|
5b679da427 | ||
|
|
fc7762c457 | ||
|
|
e53e70cc9b | ||
|
|
a7f7f5dec4 | ||
|
|
1c088cc925 | ||
|
|
ac598bb801 | ||
|
|
c399bc1068 | ||
|
|
2f14184928 | ||
|
|
80bb515438 | ||
|
|
f1b3fedb5f | ||
|
|
cd0c110df8 | ||
|
|
95fcb6bc62 | ||
|
|
eac6ec661e | ||
|
|
d8269441eb | ||
|
|
e7b0dd9e9e | ||
|
|
5cf37918e7 | ||
|
|
94a53abb00 | ||
|
|
99a10c4e25 | ||
|
|
9bfce25666 | ||
|
|
b758cc1918 | ||
|
|
f488dd9116 | ||
|
|
918172c252 | ||
|
|
b3a1c552ce | ||
|
|
b4fd07ff8b | ||
|
|
0346488e0f | ||
|
|
eb2e6c1cec | ||
|
|
eab5145f34 | ||
|
|
a2c7245e46 | ||
|
|
4aa57f2684 | ||
|
|
d8625fdb29 | ||
|
|
207180396f | ||
|
|
b544e6dfce | ||
|
|
bc2cac672a | ||
|
|
6003ffebec | ||
|
|
51b3781c09 | ||
|
|
14e3422423 | ||
|
|
0e5ab21205 | ||
|
|
a11dc3f4b2 | ||
|
|
f5255440e4 | ||
|
|
0dc196e76d | ||
|
|
136f877778 | ||
|
|
3b7731d44f | ||
|
|
b51e1f3b0c | ||
|
|
ae3c214c3f | ||
|
|
200f16ecf2 | ||
|
|
ecd840c03a | ||
|
|
7092116efd | ||
|
|
68c493b736 | ||
|
|
4f62d52e5e | ||
|
|
c8be1e4966 | ||
|
|
c964cd5349 | ||
|
|
3fbf58f64d | ||
|
|
bd4400a7f2 | ||
|
|
c0e4d48fae | ||
|
|
8668f2beb2 | ||
|
|
628da207d0 | ||
|
|
677f7df376 | ||
|
|
580675e8a0 | ||
|
|
900a9b3fac | ||
|
|
f8f1e824a1 | ||
|
|
441c32bc30 | ||
|
|
41a0fb3b10 | ||
|
|
a38912a348 | ||
|
|
d568e4e1b6 | ||
|
|
12849c8571 | ||
|
|
f7fb051b67 | ||
|
|
693a6bc0df | ||
|
|
ccd19edf2f | ||
|
|
f2f6bf30b3 | ||
|
|
45b3f1ebde | ||
|
|
b4af2f75b1 | ||
|
|
fdabaf3374 | ||
|
|
2e481507e8 | ||
|
|
9b4e0e29e4 | ||
|
|
80bd8e085d | ||
|
|
7d2748c0bc | ||
|
|
2c0b04559e | ||
|
|
4476741ace | ||
|
|
68f8be01ac | ||
|
|
d84ee4692d | ||
|
|
a0fe51f318 | ||
|
|
70810ce6a2 | ||
|
|
f75d1f546b | ||
|
|
6c8255b12b | ||
|
|
f39cdb393f | ||
|
|
d4fda0f5f3 | ||
|
|
9afefa75a0 | ||
|
|
32c21ae81b | ||
|
|
ca1c2fa5ba | ||
|
|
6619927a7d | ||
|
|
e805dd04cb | ||
|
|
dbc3bed669 | ||
|
|
55aab1683f | ||
|
|
33978bda4f | ||
|
|
4c9ece5025 | ||
|
|
a984d64add | ||
|
|
cb95e89773 | ||
|
|
f8361fb31c | ||
|
|
5ceac87e6e | ||
|
|
e058f3bad1 | ||
|
|
460a44ba34 | ||
|
|
8c197f26ea | ||
|
|
6f17a1dfaa | ||
|
|
2217ae602a | ||
|
|
75743e8897 | ||
|
|
169d14ab3a | ||
|
|
710556a580 | ||
|
|
15211ce5fa | ||
|
|
66f53d865e | ||
|
|
ea81b308f7 | ||
|
|
9016fa13dc | ||
|
|
cee70a997d | ||
|
|
041c11f618 | ||
|
|
c5f0962e40 | ||
|
|
85a06007a1 | ||
|
|
b6459d1b64 | ||
|
|
653e59f5ec | ||
|
|
71e28831d8 | ||
|
|
874748ea7f | ||
|
|
d3e55c4510 | ||
|
|
147ee8ef8b | ||
|
|
5ec641bc6f | ||
|
|
4a37be1ce7 | ||
|
|
d1b4db2be4 | ||
|
|
1e2fa51b98 | ||
|
|
743c5fa9a4 | ||
|
|
ae1d6a2d1c | ||
|
|
5e246519c2 | ||
|
|
8b5cb8ba2c | ||
|
|
3ea7e5932e | ||
|
|
97b4fcb958 | ||
|
|
80c1c66bea | ||
|
|
be61c803bf | ||
|
|
a0a307f3bd | ||
|
|
1d8f4f0bfd | ||
|
|
7c288570b1 | ||
|
|
02d71ebf02 | ||
|
|
6ef4eaa39f | ||
|
|
d3ee2744d4 | ||
|
|
61b54efb97 | ||
|
|
91b00da4af | ||
|
|
2b72624ec0 | ||
|
|
55bb304dc2 | ||
|
|
8ffd2293f4 | ||
|
|
3df2e591fe | ||
|
|
785771cb90 | ||
|
|
aa14a2dcbb | ||
|
|
c9e2ce3770 | ||
|
|
835e4aaca3 | ||
|
|
97900bcbe6 | ||
|
|
a9ec69afd0 | ||
|
|
a008f1f45f | ||
|
|
fbd6b8eb53 | ||
|
|
855755fea3 | ||
|
|
302e585af4 | ||
|
|
9592335fa1 | ||
|
|
c874220b4e | ||
|
|
5d792ddf4c | ||
|
|
e942685c23 | ||
|
|
11800bec35 | ||
|
|
1b1bb7d76d | ||
|
|
394ff96aa2 | ||
|
|
34c1ef6126 | ||
|
|
58af196f84 | ||
|
|
564ec31c2d | ||
|
|
0f96dd7fb5 | ||
|
|
f42fb96b9d | ||
|
|
8401b79bf9 | ||
|
|
c4c8a43eb7 | ||
|
|
ecc88e1d48 | ||
|
|
b73233df77 | ||
|
|
f94d4e6bb2 | ||
|
|
6cfd0794eb | ||
|
|
42a64f9b0a | ||
|
|
33a85e1bd8 | ||
|
|
fde578aac9 | ||
|
|
925ef56830 | ||
|
|
585c850dd5 | ||
|
|
72f33da508 | ||
|
|
480ecfd047 | ||
|
|
1a6024c697 | ||
|
|
a11dd576e4 | ||
|
|
9fed3eb171 | ||
|
|
20156a7440 | ||
|
|
ca5b1df7df | ||
|
|
474ee2100c | ||
|
|
1ccedea1dd | ||
|
|
70dd25c477 | ||
|
|
bce983a6a5 | ||
|
|
eb8d150a9d | ||
|
|
841739cee9 | ||
|
|
d4dbc748c8 | ||
|
|
5ce6c8933d | ||
|
|
f61355c409 | ||
|
|
edad1928ab | ||
|
|
4201167477 | ||
|
|
16414ba2e9 | ||
|
|
1d001322cc | ||
|
|
9d781d1b57 | ||
|
|
3453e5ef34 | ||
|
|
76da957b81 | ||
|
|
35438792a0 | ||
|
|
01966df866 | ||
|
|
e2eb32ce78 | ||
|
|
03f484c2ae | ||
|
|
c44ee73ed0 | ||
|
|
e6e669845c | ||
|
|
5a08bc353e | ||
|
|
c8bc66a287 | ||
|
|
3beb470bbd | ||
|
|
b875ee362e | ||
|
|
4e3a977995 | ||
|
|
eb801ed9d4 | ||
|
|
d9dfef021f | ||
|
|
d2d3978de6 | ||
|
|
02f7249e6e | ||
|
|
a3309cea91 | ||
|
|
137ef6da72 | ||
|
|
4f56147319 | ||
|
|
d58259cefe | ||
|
|
9be79bba48 | ||
|
|
64db32dca9 | ||
|
|
774b4ed15f | ||
|
|
d337653e53 | ||
|
|
b06b7fca2a | ||
|
|
169720002c | ||
|
|
d7135393cd | ||
|
|
1e4a442b16 | ||
|
|
519df3f5a1 | ||
|
|
2a03ca9eda | ||
|
|
ff5dff26bb | ||
|
|
cbd29e6290 | ||
|
|
0f3c005b60 | ||
|
|
39c1d3bbf7 | ||
|
|
b66aceccc8 | ||
|
|
e9a4a828d6 | ||
|
|
bd60e30c3f | ||
|
|
046b2cfc4c | ||
|
|
24133ac390 | ||
|
|
8aecf79647 | ||
|
|
780a35fabe | ||
|
|
0e7c773bfd | ||
|
|
11f8406be3 | ||
|
|
2c99454565 | ||
|
|
cd96abe545 | ||
|
|
d76b688ec4 | ||
|
|
ed47e8e05c | ||
|
|
268b87a803 | ||
|
|
318690681b | ||
|
|
b1e37e714d | ||
|
|
18b514351d | ||
|
|
63c120bdb0 | ||
|
|
96409ecc17 | ||
|
|
c1cba44cba | ||
|
|
7a1ac42b1e | ||
|
|
87fd142ffd | ||
|
|
62ad0d9527 | ||
|
|
4f9e4ac93d | ||
|
|
cb6f2873a9 | ||
|
|
20b741d30d | ||
|
|
7ed2ff15d5 | ||
|
|
da4b2d16ef | ||
|
|
4521223413 | ||
|
|
0dd81c4873 | ||
|
|
df2ff26c0f | ||
|
|
e657e2a6b0 | ||
|
|
34a63897d6 | ||
|
|
6279591d1b | ||
|
|
403b8140b3 | ||
|
|
71ba9f6d4a | ||
|
|
3d5dae1f42 | ||
|
|
78eabc5ae7 | ||
|
|
485fb89941 | ||
|
|
df280cdd91 | ||
|
|
9b96ece2f9 | ||
|
|
a44087b750 | ||
|
|
70cbf59ce8 | ||
|
|
4aeaf2660f | ||
|
|
9b7849c5be | ||
|
|
51a0f86652 | ||
|
|
fa6ee35fb0 | ||
|
|
b1160280fe | ||
|
|
7441d6cb4a | ||
|
|
23000c6e60 | ||
|
|
75edc6e5bb | ||
|
|
06f649cbb7 | ||
|
|
ff78b5a6c2 | ||
|
|
47d965c6cd | ||
|
|
d6c26d4159 | ||
|
|
78516f4546 | ||
|
|
49f072eea4 | ||
|
|
302c258e6b | ||
|
|
70f1846de6 | ||
|
|
ae2815c1c6 | ||
|
|
24993bc0b2 | ||
|
|
216b2e0c5e | ||
|
|
44a2fc30dc | ||
|
|
aee60f33b7 | ||
|
|
5d8700370b | ||
|
|
1ef29207d5 | ||
|
|
497567e61f | ||
|
|
15c51e2e2b | ||
|
|
c5a055eb70 | ||
|
|
1b9cc7c679 | ||
|
|
0f0b033fe4 | ||
|
|
3feda6d6c7 | ||
|
|
103965ef40 | ||
|
|
3ee5e003a7 | ||
|
|
96ac717ede | ||
|
|
d0260ce018 | ||
|
|
61a135e1c2 | ||
|
|
98db512164 | ||
|
|
a325883b62 | ||
|
|
5c7c13d76a | ||
|
|
06cee3f03e | ||
|
|
ec0d88cf1b | ||
|
|
eca37f934c | ||
|
|
18cf749ad9 | ||
|
|
1febbc869f | ||
|
|
ea49097ab3 | ||
|
|
1dcc69db39 | ||
|
|
fc3ac2eb33 | ||
|
|
0289aba113 | ||
|
|
15f076f7d6 | ||
|
|
63e2ba799d | ||
|
|
1ff8a2aaf4 | ||
|
|
980340546a | ||
|
|
ebde5a1cb7 | ||
|
|
ffa8c3e5bf | ||
|
|
5a8641660c | ||
|
|
36641d73a6 | ||
|
|
eac29cd0b6 | ||
|
|
e8a5f59b4c | ||
|
|
7526714b4a | ||
|
|
2ab78022f5 | ||
|
|
363bf0ea38 | ||
|
|
d465639d2a | ||
|
|
0790b30b5d | ||
|
|
8c8d6250d9 | ||
|
|
657cd6340b | ||
|
|
cd1cd5cb75 | ||
|
|
3f50564f11 | ||
|
|
48fb92dc60 | ||
|
|
5641cf4d9e | ||
|
|
d9eb521e9f | ||
|
|
970f8e084d | ||
|
|
bd7ebdf947 | ||
|
|
64da8f217c | ||
|
|
a104a05cfa | ||
|
|
17c1526057 | ||
|
|
2bddad004d | ||
|
|
9c139e40d3 | ||
|
|
a12b3e0c77 | ||
|
|
2ffd5f234b | ||
|
|
89ea34cfb7 | ||
|
|
892416bc51 | ||
|
|
12940361d8 | ||
|
|
3df0786fb0 | ||
|
|
3668f0e27e | ||
|
|
b114ef1710 | ||
|
|
ad7b278508 | ||
|
|
e362f2b45d | ||
|
|
df93b7672a | ||
|
|
7822992837 | ||
|
|
3f9080332b | ||
|
|
db689870f1 | ||
|
|
c3fe46c609 | ||
|
|
4ce0b284a6 | ||
|
|
e017f3619a | ||
|
|
3d58f13724 | ||
|
|
e001e3120f | ||
|
|
0ff0fd0a26 | ||
|
|
996d9cf9c8 | ||
|
|
d4359758be | ||
|
|
8b8ee32214 | ||
|
|
423b339ab5 | ||
|
|
3888e121d5 | ||
|
|
a0c6a75c09 | ||
|
|
b24b57bd2d | ||
|
|
1337c1708d | ||
|
|
a0daadc0cb | ||
|
|
36495922a1 | ||
|
|
18543ad33b |
@@ -1,160 +1,50 @@
|
||||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: linux-release
|
||||
name: linux-build
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: feather:linux
|
||||
- name: linux-build
|
||||
image: wowlet/wowlet-linux:v0.1
|
||||
volumes:
|
||||
- name: ccache_linux_release
|
||||
path: /root/.ccache
|
||||
- name: files_linux_release
|
||||
path: /files
|
||||
- name: cache
|
||||
path: /drone/src/monero
|
||||
- name: files
|
||||
path: /tmp/wowlet_linux
|
||||
commands:
|
||||
- git config --global url."http://gitea:3000/tor/".insteadOf https://git.torproject.org/
|
||||
- git config --global url."http://gitea:3000/".insteadOf https://github.com/
|
||||
- git submodule update --init --depth 50 contrib/tor
|
||||
- git submodule update --init --depth 50 contrib/torsocks
|
||||
- git submodule update --init --depth 120 monero
|
||||
- git submodule update --init --depth 120 --recursive monero
|
||||
- make -j8 release-static
|
||||
environment:
|
||||
OPENSSL_ROOT_DIR: /usr/local/openssl/
|
||||
CMAKEFLAGS_EXTRA: -DFETCH_DEPS=Off
|
||||
- name: deploy
|
||||
image: feather:linux
|
||||
volumes:
|
||||
- name: ccache_linux_release
|
||||
path: /root/.ccache
|
||||
- name: files_linux_release
|
||||
path: /files
|
||||
commands:
|
||||
- export FN="feather-`git rev-parse --short HEAD`.zip"
|
||||
- export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH"
|
||||
- mkdir -p "$TARGET_DIR"
|
||||
- echo "writing to $TARGET_DIR/$FN"
|
||||
- strip -s build/bin/feather
|
||||
- zip -j "$TARGET_DIR/$FN" build/feather.log build/bin/feather
|
||||
- echo "[*] written to https://build.featherwallet.org/files/linux-release/$DRONE_SOURCE_BRANCH/$FN"
|
||||
|
||||
- make release-static -j3
|
||||
- export WOW="wowlet-`echo $DRONE_COMMIT_AFTER | cut -c 1-10`"
|
||||
- cp build/bin/wowlet /tmp/wowlet_linux/$WOW
|
||||
volumes:
|
||||
- name: ccache_linux_release
|
||||
- name: cache
|
||||
host:
|
||||
path: /var/drone/ccache_linux_release/
|
||||
- name: files_linux_release
|
||||
path: /home/wow/wowlet_wownero
|
||||
- name: files
|
||||
host:
|
||||
path: /mnt/storage1/feather_files/files/linux-release/
|
||||
path: /home/wow/wowlet_linux
|
||||
|
||||
---
|
||||
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: linux-release-appimage
|
||||
|
||||
name: windows-build
|
||||
steps:
|
||||
- name: build
|
||||
image: feather:appimage
|
||||
commands:
|
||||
- export FN="feather-`git rev-parse --short HEAD`.zip"
|
||||
- export BRANCH="$DRONE_SOURCE_BRANCH"
|
||||
- bash ./contrib/build-appimage.sh
|
||||
- name: deploy
|
||||
image: feather:appimage
|
||||
- name: windows-build
|
||||
image: wowlet/wowlet-win:v0.1
|
||||
volumes:
|
||||
- name: files_linux_appimage
|
||||
path: /files
|
||||
- name: cache
|
||||
path: /drone/src/monero
|
||||
- name: files
|
||||
path: /tmp/wowlet_windows
|
||||
commands:
|
||||
- export FN="feather-`git rev-parse --short HEAD`.AppImage"
|
||||
- export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH"
|
||||
- mkdir -p "$TARGET_DIR"
|
||||
- echo "writing to $TARGET_DIR/$FN"
|
||||
- mv "Feather-1.0-x86_64.AppImage" "$TARGET_DIR/$FN"
|
||||
- echo "[*] written to https://build.featherwallet.org/files/linux-release-appimage/$DRONE_SOURCE_BRANCH/$FN"
|
||||
|
||||
- make depends root=/depends target=x86_64-w64-mingw32 tag=win-x64 -j3
|
||||
- export WOW="wowlet-`echo $DRONE_COMMIT_AFTER | cut -c 1-10`.exe"
|
||||
- cp build/x86_64-w64-mingw32/release/bin/wowlet.exe /tmp/wowlet_windows/$WOW
|
||||
volumes:
|
||||
- name: files_linux_appimage
|
||||
host:
|
||||
path: /mnt/storage1/feather_files/files/linux-release-appimage/
|
||||
|
||||
---
|
||||
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: windows-mxe-release
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: feather:win
|
||||
volumes:
|
||||
- name: ccache_win_release
|
||||
path: /root/.ccache
|
||||
- name: files_win_release
|
||||
path: /files
|
||||
commands:
|
||||
- git config --global url."http://gitea:3000/tor/".insteadOf https://git.torproject.org/
|
||||
- git config --global url."http://gitea:3000/".insteadOf https://github.com/
|
||||
- git submodule update --init --depth 50 contrib/tor
|
||||
- git submodule update --init --depth 50 contrib/torsocks
|
||||
- git submodule update --init --depth 120 monero
|
||||
- git submodule update --init --depth 120 --recursive monero
|
||||
- PATH=/mxe/usr/bin/:$PATH make -j8 windows-mxe-release
|
||||
environment:
|
||||
CMAKEFLAGS_EXTRA: -DFETCH_DEPS=Off
|
||||
- name: deploy
|
||||
image: feather:win
|
||||
volumes:
|
||||
- name: ccache_win_release
|
||||
path: /root/.ccache
|
||||
- name: files_win_release
|
||||
path: /files
|
||||
commands:
|
||||
- export FN="feather-`git rev-parse --short HEAD`.zip"
|
||||
- export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH"
|
||||
- mkdir -p "$TARGET_DIR"
|
||||
- echo "writing to $TARGET_DIR/$FN"
|
||||
- zip -j "$TARGET_DIR/$FN" build/feather.log build/bin/feather.exe
|
||||
- echo "[*] written to https://build.featherwallet.org/files/windows-mxe-release/$DRONE_SOURCE_BRANCH/$FN"
|
||||
|
||||
volumes:
|
||||
- name: ccache_win_release
|
||||
- name: cache
|
||||
host:
|
||||
path: /var/drone/ccache_win_release/
|
||||
- name: files_win_release
|
||||
path: /home/wow/wowlet_wownero
|
||||
- name: files
|
||||
host:
|
||||
path: /mnt/storage1/feather_files/files/windows-mxe-release/
|
||||
path: /home/wow/wowlet_windows
|
||||
|
||||
---
|
||||
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: mac-release
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: feather:mac
|
||||
volumes:
|
||||
- name: files_mac_release
|
||||
path: /files
|
||||
commands:
|
||||
- mkdir -p build
|
||||
- scp -P22 utils/build_macos.sh administrator@steve.jobs.xmr.pm:build_macos.sh
|
||||
- ssh administrator@steve.jobs.xmr.pm "chmod +x build_macos.sh && PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin ~/build_macos.sh $DRONE_COMMIT_SHA"
|
||||
- scp -P22 administrator@steve.jobs.xmr.pm:feather.zip build/feather.zip
|
||||
- name: deploy
|
||||
image: feather:mac
|
||||
volumes:
|
||||
- name: files_mac_release
|
||||
path: /files
|
||||
commands:
|
||||
- export FN="feather-`git rev-parse --short HEAD`.zip"
|
||||
- export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH"
|
||||
- mkdir -p "$TARGET_DIR"
|
||||
- echo "writing to $TARGET_DIR/$FN"
|
||||
- mv build/feather.zip "$TARGET_DIR/$FN"
|
||||
- echo "[*] written to https://build.featherwallet.org/files/mac-release/$DRONE_SOURCE_BRANCH/$FN"
|
||||
|
||||
volumes:
|
||||
- name: files_mac_release
|
||||
host:
|
||||
path: /mnt/storage1/feather_files/files/mac-release/
|
||||
...
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
[submodule "contrib/KDMacTouchBar"]
|
||||
path = contrib/KDMacTouchBar
|
||||
url = https://github.com/KDAB/KDMacTouchBar.git
|
||||
[submodule "monero"]
|
||||
path = monero
|
||||
url = https://git.wownero.com/feather/monero.git
|
||||
[submodule "contrib/torsocks"]
|
||||
path = contrib/torsocks
|
||||
url = https://git.torproject.org/torsocks.git
|
||||
[submodule "contrib/tor"]
|
||||
path = contrib/tor
|
||||
url = https://git.torproject.org/tor.git
|
||||
url = https://git.wownero.com/wownero/wownero
|
||||
branch = wowlet
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Buildbot builds
|
||||
## Buildbot builds
|
||||
|
||||
The docker build bins can be found here: https://build.featherwallet.org/files/
|
||||
The docker build bins can be found here: https://build.wownero.org/files/
|
||||
|
||||
## Docker static builds
|
||||
|
||||
@@ -10,70 +10,77 @@ Static builds via Docker are done in 3 steps:
|
||||
2. Creating a base Docker image
|
||||
3. Using the base image to compile a build
|
||||
|
||||
### Windows
|
||||
### Linux (reproducible)
|
||||
|
||||
The docker image for Windows static compiles uses Ubuntu 18.04 and installs [mxe](https://mxe.cc) from [our git](https://git.wownero.com/feather/mxe/src/branch/feather-patch),
|
||||
which comes with: OpenSSL 1.1.1g, Qt 5.15.0 (OpenGL via mesa). For more information, check the Dockerfile: `Dockerfile_windows`.
|
||||
The docker image for reproducible Linux static builds uses Ubuntu 16.04 and compiles the required libraries statically
|
||||
so that the resulting Feather binary is static. For more information, check the Dockerfile: `Dockerfile`.
|
||||
|
||||
#### 1. Clone
|
||||
|
||||
```bash
|
||||
git clone --recursive https://git.wownero.com/feather/feather.git
|
||||
cd feather
|
||||
git clone --branch master --recursive https://git.wownero.com/wowlet/wowlet.git
|
||||
cd wowlet
|
||||
```
|
||||
|
||||
Replace `master` with the desired version tag (e.g. `beta-4`) to build the release binary.
|
||||
|
||||
#### 2. Base image
|
||||
|
||||
Warning: Building the MXE base image takes up to a hour, so go watch a movie.
|
||||
|
||||
```bash
|
||||
docker build -f Dockerfile_windows --tag feather:win --build-arg THREADS=8 .
|
||||
docker build --tag wowlet:linux --build-arg THREADS=4 .
|
||||
```
|
||||
|
||||
Note: You only need to build the base image once.
|
||||
Building the base image takes a while. You only need to build the base image once.
|
||||
|
||||
#### 3. Build
|
||||
|
||||
##### Standalone binary
|
||||
|
||||
```bash
|
||||
docker run --rm -it -v /tmp/ccache:/root/.ccache -v /root/feather:/feather -w /feather feather:win /bin/bash -c 'PATH=/mxe/usr/bin/:$PATH make windows-mxe-release -j8'
|
||||
docker run --rm -it -v $PWD:/wowlet -w /wowlet wowlet:linux sh -c 'make release-static -j4'
|
||||
```
|
||||
|
||||
Replace `PATH_TO_FEATHER` with the absolute path to Feather locally.
|
||||
If you're re-running a build make sure to `rm -rf build/` first.
|
||||
|
||||
The resulting binary can be found in `build/bin/feather.exe`.
|
||||
The resulting binary can be found in `build/bin/wowlet`.
|
||||
|
||||
### Linux
|
||||
##### AppImage
|
||||
|
||||
The docker image for Linux static compiles uses Ubuntu 18.04 and compiles the required libraries statically so that
|
||||
the resulting Feather binary is static. It comes with OpenSSL 1.1.1g, Qt 5.15.0 (OpenGL disabled). For more information,
|
||||
check the Dockerfile: `Dockerfile`.
|
||||
First create the standalone binary using the Docker command in the previous step.
|
||||
|
||||
```bash
|
||||
docker run --rm -it -v $PWD:/wowlet -w /wowlet wowlet:linux contrib/build-appimage.sh
|
||||
```
|
||||
|
||||
### Windows (reproducible)
|
||||
|
||||
#### 1. Clone
|
||||
|
||||
```bash
|
||||
git clone --recursive https://git.wownero.com/feather/feather.git
|
||||
cd feather
|
||||
git clone --branch master --recursive https://git.wownero.com/wowlet/wowlet.git
|
||||
cd wowlet
|
||||
```
|
||||
|
||||
Replace `master` with the desired version tag (e.g. `beta-4`) to build the release binary.
|
||||
|
||||
#### 2. Base image
|
||||
|
||||
Warning: Building the base image takes a while, go prepare some dinner.
|
||||
|
||||
```bash
|
||||
docker build --tag feather:linux --build-arg THREADS=8 .
|
||||
docker build -f Dockerfile.windows --tag wowlet:win --build-arg THREADS=4 .
|
||||
```
|
||||
|
||||
Note: You only need to build the base image once.
|
||||
Building the base image takes a while. You only need to build the base image once.
|
||||
|
||||
#### 3. Build
|
||||
|
||||
```bash
|
||||
docker run --env OPENSSL_ROOT_DIR=/usr/local/openssl/ --rm -it -v /tmp/ccache:/root/.ccache -v PATH_TO_FEATHER:/feather -w /feather feather:linux sh -c 'make release-static -j8'
|
||||
docker run --rm -it -v $PWD:/wowlet -w /wowlet wowlet:win sh -c 'make depends root=/depends target=x86_64-w64-mingw32 tag=win-x64 -j4'
|
||||
```
|
||||
|
||||
Replace `PATH_TO_FEATHER` with the absolute path to Feather locally.
|
||||
If you're re-running a build make sure to `rm -rf build/` first.
|
||||
|
||||
The resulting binary can be found in `build/bin/feather`.
|
||||
The resulting binary can be found in `build/x86_64-w64-mingw32/release/bin/wowlet.exe`.
|
||||
|
||||
## macOS
|
||||
|
||||
@@ -87,7 +94,7 @@ HOMEBREW_OPTFLAGS="-march=core2" HOMEBREW_OPTIMIZATION_LEVEL="O0" \
|
||||
Clone the repository.
|
||||
|
||||
```bash
|
||||
git clone --recursive https://git.wownero.com/feather/feather.git
|
||||
git clone --recursive https://git.wownero.com/wowlet/wowlet.git
|
||||
```
|
||||
|
||||
Get the latest LTS from here: https://www.qt.io/offline-installers and install.
|
||||
@@ -98,4 +105,4 @@ Build Feather.
|
||||
CMAKE_PREFIX_PATH=~/Qt5.15.1/5.15.1/clang_64 make mac-release
|
||||
```
|
||||
|
||||
The resulting Mac OS application can be found `build/bin/feather.app`.
|
||||
The resulting Mac OS application can be found `build/bin/wowlet.app` and will **not** have Tor embedded.
|
||||
|
||||
@@ -7,11 +7,11 @@ set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
set(VERSION_MAJOR "0")
|
||||
set(VERSION_MINOR "1")
|
||||
set(VERSION_REVISION "0")
|
||||
set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}")
|
||||
set(VERSION "beta-1")
|
||||
|
||||
option(FETCH_DEPS "Download dependencies if they are not found" ON)
|
||||
option(XMRTO "Include Xmr.To module" ON)
|
||||
option(BUILD_TOR "Build Tor" OFF)
|
||||
option(XMRIG "Include XMRig module" ON)
|
||||
option(TOR_BIN "Path to Tor binary to embed inside Feather" OFF)
|
||||
option(STATIC "Link libraries statically, requires static Qt")
|
||||
option(USE_DEVICE_TREZOR "Trezor support compilation" OFF)
|
||||
option(DONATE_BEG "Prompt donation window every once in a while" ON)
|
||||
@@ -28,7 +28,16 @@ if(DEBUG)
|
||||
set(CMAKE_VERBOSE_MAKEFILE ON)
|
||||
endif()
|
||||
|
||||
set(MONERO_HEAD "a1404e92cb439ba0f120e7c4a579ed0b9a0372a4")
|
||||
# Update and init submodules by default
|
||||
if(NOT MANUAL_SUBMODULES)
|
||||
find_package(Git)
|
||||
if(GIT_FOUND)
|
||||
message(STATUS "Initializing submodules")
|
||||
execute_process(COMMAND git "submodule" "update" "--init" "--recursive")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(WOWNERO_HEAD "f611d5c9e32bc62f1735f6571b0bdb95cc020531")
|
||||
set(BUILD_GUI_DEPS ON)
|
||||
set(ARCH "x86-64")
|
||||
set(BUILD_64 ON)
|
||||
@@ -81,11 +90,11 @@ endfunction()
|
||||
|
||||
find_package(Git)
|
||||
if(GIT_FOUND)
|
||||
execute_process(COMMAND git rev-parse "HEAD" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/monero OUTPUT_VARIABLE _MONERO_HEAD OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
if(NOT _MONERO_HEAD STREQUAL MONERO_HEAD)
|
||||
message(FATAL_ERROR "[submodule] Monero HEAD was at ${_MONERO_HEAD} but should be at ${MONERO_HEAD}")
|
||||
execute_process(COMMAND git rev-parse "HEAD" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/monero OUTPUT_VARIABLE _WOWNERO_HEAD OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
if(NOT _WOWNERO_HEAD STREQUAL WOWNERO_HEAD)
|
||||
message(FATAL_ERROR "[submodule] Monero HEAD was at ${_WOWNERO_HEAD} but should be at ${WOWNERO_HEAD}")
|
||||
else()
|
||||
message(STATUS "[submodule] Monero HEAD @ ${MONERO_HEAD}")
|
||||
message(STATUS "[submodule] Monero HEAD @ ${WOWNERO_HEAD}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -145,6 +154,9 @@ endif()
|
||||
if(APPLE AND NOT BOOST_ROOT)
|
||||
execute_process(COMMAND brew --prefix boost OUTPUT_VARIABLE BOOST_ROOT OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
endif()
|
||||
if(MINGW)
|
||||
set(Boost_THREADAPI win32)
|
||||
endif()
|
||||
find_package(Boost 1.58 REQUIRED COMPONENTS
|
||||
system
|
||||
filesystem
|
||||
@@ -157,6 +169,11 @@ find_package(Boost 1.58 REQUIRED COMPONENTS
|
||||
locale)
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
# https://github.com/monero-project/monero-gui/issues/3142#issuecomment-705940446
|
||||
set(CMAKE_SKIP_RPATH ON)
|
||||
endif()
|
||||
|
||||
find_package(X11 REQUIRED)
|
||||
message(STATUS "X11_FOUND = ${X11_FOUND}")
|
||||
message(STATUS "X11_INCLUDE_DIR = ${X11_INCLUDE_DIR}")
|
||||
@@ -169,36 +186,41 @@ if(UNIX AND NOT APPLE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Tor/torsocks
|
||||
set(TOR_TAG "tor-0.4.3.5")
|
||||
set(TOR_DIR "${CMAKE_SOURCE_DIR}/contrib/tor")
|
||||
if(UNIX AND NOT APPLE)
|
||||
set(TOR_LIB "libtorsocks.so")
|
||||
elseif(APPLE)
|
||||
set(TOR_LIB "libtorsocks.dylib")
|
||||
endif()
|
||||
if("$ENV{DRONE}" STREQUAL "true" AND STATIC AND BUILD_TOR)
|
||||
if("$ENV{DRONE}" STREQUAL "true")
|
||||
message(STATUS "We are inside a static compile with Drone CI")
|
||||
if(MINGW)
|
||||
execute_process(COMMAND bash -c "cp /mxe/usr/x86_64-w64-mingw32.static/bin/tor.exe ${CMAKE_SOURCE_DIR}/src/tor/tor.exe")
|
||||
elseif(UNIX AND NOT APPLE)
|
||||
execute_process(COMMAND bash -c "cp /usr/local/tor/bin/tor ${CMAKE_SOURCE_DIR}/src/tor/tor")
|
||||
execute_process(COMMAND bash -c "cp /usr/local/torsocks/lib/torsocks/* ${CMAKE_SOURCE_DIR}/src/tor/")
|
||||
endif()
|
||||
|
||||
# To build Feather with embedded (and static) Tor, pass CMake -DTOR_BIN=/path/to/tor
|
||||
if(TOR_BIN)
|
||||
if(APPLE)
|
||||
execute_process(COMMAND bash -c "touch ${CMAKE_CURRENT_SOURCE_DIR}/src/tor/libevent-2.1.7.dylib")
|
||||
endif()
|
||||
else()
|
||||
if(BUILD_TOR)
|
||||
if(UNIX OR APPLE)
|
||||
execute_process(COMMAND bash -c "ls -al src/tor/${TOR_LIB} 2>/dev/null" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE TOR_FOUND OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
if(TOR_FOUND)
|
||||
message(STATUS "${TOR_LIB} found, skipping Tor build")
|
||||
else()
|
||||
message(STATUS "${TOR_LIB} not found, building Tor")
|
||||
execute_process(COMMAND bash -c "bash build_tor.sh ${TOR_TAG} ${CMAKE_SOURCE_DIR} 'ON'" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/contrib)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND bash -c "${TOR_BIN} --version --quiet" OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE out RESULT_VARIABLE ret)
|
||||
if (ret EQUAL "0")
|
||||
set(TOR_VERSION "${out}")
|
||||
endif()
|
||||
message(STATUS "${TOR_VERSION}")
|
||||
configure_file("cmake/config-feather.h.cmake" "${CMAKE_CURRENT_SOURCE_DIR}/src/config-feather.h")
|
||||
|
||||
# on the buildbot Tor is baked into the image
|
||||
# - linux: See `Dockerfile`
|
||||
# - windows: See `Dockerfile.windows`
|
||||
# - macos: taken from Tor Browser official release
|
||||
if(REPRODUCIBLE) # Always copy Tor when doing a reproducible build to prevent old versions from getting included
|
||||
set(TOR_COPY_CMD "cp ${TOR_BIN} ${CMAKE_CURRENT_SOURCE_DIR}/src/assets/exec/tor")
|
||||
else()
|
||||
message(STATUS "Skipping Tor build because -DBUILD_TOR=OFF")
|
||||
set(TOR_COPY_CMD "cp -u ${TOR_BIN} ${CMAKE_CURRENT_SOURCE_DIR}/src/assets/exec/tor")
|
||||
endif()
|
||||
message(STATUS "${TOR_COPY_CMD}")
|
||||
execute_process(COMMAND bash -c "${TOR_COPY_CMD}" RESULT_VARIABLE ret)
|
||||
if(ret EQUAL "1")
|
||||
message(FATAL_ERROR "Tor copy failure: ${TOR_COPY_CMD}")
|
||||
endif()
|
||||
|
||||
message(STATUS "Embedding Tor binary at ${TOR_BIN}")
|
||||
else()
|
||||
message(STATUS "Skipping Tor inclusion because -DTOR_BIN=Off")
|
||||
endif()
|
||||
|
||||
if(MINGW)
|
||||
@@ -222,7 +244,7 @@ if(MINGW)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wa,-mbig-obj")
|
||||
set(EXTRA_LIBRARIES mswsock;ws2_32;iphlpapi;crypt32;bcrypt)
|
||||
if(DEPENDS)
|
||||
set(ICU_LIBRARIES icuio icui18n icuuc icudata icutu iconv)
|
||||
set(ICU_LIBRARIES iconv)
|
||||
else()
|
||||
set(ICU_LIBRARIES icuio icuin icuuc icudt icutu iconv)
|
||||
endif()
|
||||
@@ -346,4 +368,8 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 ${C_SECURITY_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${CXX_SECURITY_FLAGS}")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LD_SECURITY_FLAGS} ${STATIC_FLAGS}")
|
||||
|
||||
if(APPLE)
|
||||
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/contrib/KDMacTouchBar")
|
||||
endif()
|
||||
|
||||
add_subdirectory(src)
|
||||
|
||||
@@ -1,188 +1,308 @@
|
||||
FROM ubuntu:18.04
|
||||
FROM ubuntu:18.04 AS tor
|
||||
|
||||
ARG THREADS=1
|
||||
ENV CFLAGS="-fPIC"
|
||||
ENV CPPFLAGS="-fPIC"
|
||||
ENV CXXFLAGS="-fPIC"
|
||||
ENV SOURCE_DATE_EPOCH=1397818193
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt clean && apt update
|
||||
RUN apt install -y gnupg
|
||||
RUN apt-get update && \
|
||||
apt-get install -y build-essential wget git automake pkg-config python python3 && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY utils/pubkeys/kitware.asc /kitware.asc
|
||||
RUN cat /kitware.asc | gpg --dearmor - | tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null
|
||||
RUN apt install -y automake git pkg-config python wget python3.6-distutils software-properties-common
|
||||
RUN apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' && apt update
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
ENV TZ=Europe/Amsterdam
|
||||
RUN apt install -y build-essential nano vim aptitude ccache libusb-1.0-0-dev tzdata
|
||||
|
||||
RUN apt install -y xutils-dev && \
|
||||
git clone -b xorgproto-2020.1 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xorgproto && \
|
||||
cd xorgproto && \
|
||||
git reset --hard c62e8203402cafafa5ba0357b6d1c019156c9f36 && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
RUN wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz && \
|
||||
echo "e8be6a35fe41d10603c3cc635e93289ed00bf34b79671a3a4de64fcee00d5242 openssl-1.1.1i.tar.gz" | sha256sum -c && \
|
||||
tar -xzf openssl-1.1.1i.tar.gz && \
|
||||
rm openssl-1.1.1i.tar.gz && \
|
||||
cd openssl-1.1.1i && \
|
||||
./config no-shared no-dso --prefix=/usr/local/openssl && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make test && \
|
||||
make -j$THREADS install_sw && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b xcb-proto-1.13 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xcbproto && \
|
||||
cd xcbproto && \
|
||||
git reset --hard 94228cde97d9aecfda04a8e699d462ba2b89e3a0 && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
RUN wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz && \
|
||||
echo "92e6de1be9ec176428fd2367677e61ceffc2ee1cb119035037a27d346b0403bb libevent-2.1.12-stable.tar.gz" | sha256sum -c && \
|
||||
tar -zxvf libevent-2.1.12-stable.tar.gz && \
|
||||
cd libevent-2.1.12-stable && \
|
||||
PKG_CONFIG_PATH=/usr/local/openssl/lib/pkgconfig/ \
|
||||
./configure --prefix=/usr/local/libevent \
|
||||
--disable-shared \
|
||||
--enable-static \
|
||||
--with-pic && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN apt install -y libtool-bin && \
|
||||
git clone -b libXau-1.0.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxau && \
|
||||
cd libxau && \
|
||||
git reset --hard d9443b2c57b512cfb250b35707378654d86c7dea && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN apt install -y libpthread-stubs0-dev && \
|
||||
git clone -b 1.13.1 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb && \
|
||||
cd libxcb && \
|
||||
git reset --hard 8287ebd7b752c33b0cabc4982606fe4831106f7e && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN git clone -b 0.4.0 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-util.git && \
|
||||
cd libxcb-util && \
|
||||
git reset --hard acf790d7752f36e450d476ad79807d4012ec863b && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN git clone -b xtrans-1.3.5 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxtrans.git && \
|
||||
cd libxtrans && \
|
||||
git reset --hard 7cbad9fe2e61cd9d5caeaf361826a6f4bd320f03 && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN git clone -b 0.4.0 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-image.git && \
|
||||
cd libxcb-image && \
|
||||
git reset --hard d882052fb2ce439c6483fce944ba8f16f7294639 && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN git clone -b 0.4.0 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-keysyms.git && \
|
||||
cd libxcb-keysyms && \
|
||||
git reset --hard 0e51ee5570a6a80bdf98770b975dfe8a57f4eeb1 && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN git clone -b 0.3.9 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-render-util.git && \
|
||||
cd libxcb-render-util && \
|
||||
git reset --hard 0317caf63de532fd7a0493ed6afa871a67253747 && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN git clone -b 0.4.1 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-wm.git && \
|
||||
cd libxcb-wm && \
|
||||
git reset --hard 24eb17df2e1245885e72c9d4bbb0a0f69f0700f2 && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN git clone -b libX11-1.6.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libx11 && \
|
||||
cd libx11 && \
|
||||
git reset --hard db7cca17ad7807e92a928da9d4c68a00f4836da2 && \
|
||||
ACLOCAL='aclocal -I /usr/local/share/aclocal/' CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN git clone -b libXext-1.3.4 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxext && \
|
||||
cd libxext && \
|
||||
git reset --hard ebb167f34a3514783966775fb12573c4ed209625 && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN apt install -y libpthread-stubs0-dev && \
|
||||
git clone -b libXinerama-1.1.4 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxinerama.git && \
|
||||
cd libxinerama && \
|
||||
git reset --hard c3ab2361f13154921df2992f9eacc1ea1b3f946b && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v1.2.11 --depth 1 https://github.com/madler/zlib && \
|
||||
cd zlib && \
|
||||
git reset --hard cacf7f1d4e3d44d871b605da3b647f07d718623f && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --static && \
|
||||
./configure --static --prefix=/usr/local/zlib && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --static --prefix=/usr/local/zlib && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b VER-2-10-2 https://git.sv.nongnu.org/r/freetype/freetype2.git && \
|
||||
RUN git clone -b tor-0.4.5.5-rc --depth 1 https://git.torproject.org/tor.git && \
|
||||
cd tor && \
|
||||
git reset --hard b36a00e9a9d3eb4b2949951afaa72e45fb7e68cd && \
|
||||
./autogen.sh && \
|
||||
./configure \
|
||||
--disable-asciidoc \
|
||||
--disable-manpage \
|
||||
--disable-html-manual \
|
||||
--disable-system-torrc \
|
||||
--disable-module-relay \
|
||||
--disable-lzma \
|
||||
--disable-zstd \
|
||||
--enable-static-tor \
|
||||
--with-libevent-dir=/usr/local/libevent \
|
||||
--with-openssl-dir=/usr/local/openssl \
|
||||
--with-zlib-dir=/usr/local/zlib \
|
||||
--disable-tool-name-check \
|
||||
--enable-fatal-warnings \
|
||||
--prefix=/usr/local/tor && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd) && \
|
||||
strip -s -D /usr/local/tor/bin/tor
|
||||
|
||||
FROM ubuntu:16.04
|
||||
|
||||
ARG THREADS=1
|
||||
ARG QT_VERSION=5.15.2
|
||||
|
||||
ENV CFLAGS="-fPIC"
|
||||
ENV CPPFLAGS="-fPIC"
|
||||
ENV CXXFLAGS="-fPIC"
|
||||
ENV SOURCE_DATE_EPOCH=1397818193
|
||||
|
||||
ENV OPENSSL_ROOT_DIR=/usr/local/openssl/
|
||||
ENV TOR_BIN=/usr/local/tor/bin/tor
|
||||
|
||||
COPY --from=tor ${TOR_BIN} /usr/local/tor/bin/tor
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y \
|
||||
# dev tools
|
||||
nano vim ccache \
|
||||
# build tools
|
||||
software-properties-common automake pkg-config python \
|
||||
libtool-bin wget zip \
|
||||
# dependencies
|
||||
libusb-1.0-0-dev \
|
||||
# Qt
|
||||
libgl1-mesa-dev libglib2.0-dev mesa-common-dev \
|
||||
# libusb
|
||||
libudev-dev \
|
||||
# fontconfig
|
||||
autopoint gettext gperf libpng12-dev \
|
||||
# libxcb
|
||||
libpthread-stubs0-dev \
|
||||
# xorgproto
|
||||
xutils-dev \
|
||||
# libxkbcommon
|
||||
bison \
|
||||
# zeromq
|
||||
libsodium-dev \
|
||||
# AppImage tools
|
||||
file squashfs-tools desktop-file-utils patchelf
|
||||
|
||||
RUN add-apt-repository ppa:git-core/ppa && \
|
||||
apt-get update && \
|
||||
apt-get install -y git && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN mkdir appimagetool && \
|
||||
cd appimagetool && \
|
||||
wget https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage && \
|
||||
echo "d918b4df547b388ef253f3c9e7f6529ca81a885395c31f619d9aaf7030499a13 appimagetool-x86_64.AppImage" | sha256sum -c && \
|
||||
chmod +x appimagetool-x86_64.AppImage && \
|
||||
./appimagetool-x86_64.AppImage --appimage-extract && \
|
||||
rm appimagetool-x86_64.AppImage
|
||||
|
||||
RUN git clone -b xorgproto-2020.1 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xorgproto && \
|
||||
cd xorgproto && \
|
||||
git reset --hard c62e8203402cafafa5ba0357b6d1c019156c9f36 && \
|
||||
./autogen.sh && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b 1.12 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xcbproto && \
|
||||
cd xcbproto && \
|
||||
git reset --hard 6398e42131eedddde0d98759067dde933191f049 && \
|
||||
./autogen.sh && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libXau-1.0.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxau && \
|
||||
cd libxau && \
|
||||
git reset --hard d9443b2c57b512cfb250b35707378654d86c7dea && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b 1.12 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb && \
|
||||
cd libxcb && \
|
||||
git reset --hard d34785a34f28fa6a00f8ce00d87e3132ff0f6467 && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
make -j$THREADS clean && \
|
||||
rm /usr/local/lib/libxcb-xinerama.so && \
|
||||
./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
cp src/.libs/libxcb-xinerama.a /usr/local/lib/ && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b 0.4.0 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-util && \
|
||||
cd libxcb-util && \
|
||||
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 && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b 0.4.0 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-image && \
|
||||
cd libxcb-image && \
|
||||
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 && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b 0.4.0 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-keysyms && \
|
||||
cd libxcb-keysyms && \
|
||||
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 && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b 0.3.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-render-util && \
|
||||
cd libxcb-render-util && \
|
||||
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 && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b 0.4.1 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-wm && \
|
||||
cd libxcb-wm && \
|
||||
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 && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b xkbcommon-0.5.0 --depth 1 https://github.com/xkbcommon/libxkbcommon && \
|
||||
cd libxkbcommon && \
|
||||
git reset --hard c43c3c866eb9d52cd8f61e75cbef1c30d07f3a28 && \
|
||||
./autogen.sh --prefix=/usr --enable-shared --disable-static --enable-x11 --disable-docs && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v1.2.11 --depth 1 https://github.com/madler/zlib && \
|
||||
cd zlib && \
|
||||
git reset --hard cacf7f1d4e3d44d871b605da3b647f07d718623f && \
|
||||
./configure --static --prefix=/usr/local/zlib && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b VER-2-10-2 --depth 1 https://git.savannah.gnu.org/git/freetype/freetype2.git && \
|
||||
cd freetype2 && \
|
||||
git reset --hard 132f19b779828b194b3fede187cee719785db4d8 && \
|
||||
./autogen.sh && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --with-zlib=no && \
|
||||
./configure --disable-shared --enable-static --with-zlib=no && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b R_2_2_9 --depth 1 https://github.com/libexpat/libexpat && \
|
||||
cd libexpat/expat && \
|
||||
git reset --hard a7bc26b69768f7fb24f0c7976fae24b157b85b13 && \
|
||||
./buildconf.sh && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static && \
|
||||
./configure --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y autopoint gettext gperf libpng-dev && \
|
||||
git clone -b 2.13.92 --depth 1 https://gitlab.freedesktop.org/fontconfig/fontconfig && \
|
||||
RUN git clone -b 2.13.92 --depth 1 https://gitlab.freedesktop.org/fontconfig/fontconfig && \
|
||||
cd fontconfig && \
|
||||
git reset --hard b1df1101a643ae16cdfa1d83b939de2497b1bf27 && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static --sysconfdir=/etc --localstatedir=/var && \
|
||||
./autogen.sh --disable-shared --enable-static --sysconfdir=/etc --localstatedir=/var && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b release-64-2 --depth 1 https://github.com/unicode-org/icu && \
|
||||
cd icu/icu4c/source && \
|
||||
git reset --hard e2d85306162d3a0691b070b4f0a73e4012433444 && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-tests --disable-samples && \
|
||||
./configure --disable-shared --enable-static --disable-tests --disable-samples && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y wget && \
|
||||
wget https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.gz && \
|
||||
echo "9995e192e68528793755692917f9eb6422f3052a53c5e13ba278a228af6c7acf boost_1_73_0.tar.gz" > hashsum.txt && \
|
||||
sha256sum -c hashsum.txt && \
|
||||
tar -xvzf boost_1_73_0.tar.gz && \
|
||||
RUN wget https://dl.bintray.com/boostorg/release/1.73.0/source/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 && \
|
||||
./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='-fPIC' cxxflags='-fPIC' install -a --prefix=/usr
|
||||
./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" > hashsum.txt && \
|
||||
sha256sum -c hashsum.txt && \
|
||||
tar -xzf openssl-1.1.1g.tar.gz && \
|
||||
cd openssl-1.1.1g && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./config no-shared no-zlib-dynamic --prefix=/usr/local/openssl && \
|
||||
RUN wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz && \
|
||||
echo "e8be6a35fe41d10603c3cc635e93289ed00bf34b79671a3a4de64fcee00d5242 openssl-1.1.1i.tar.gz" | sha256sum -c && \
|
||||
tar -xzf openssl-1.1.1i.tar.gz && \
|
||||
rm openssl-1.1.1i.tar.gz && \
|
||||
cd openssl-1.1.1i && \
|
||||
./config no-shared no-dso --prefix=/usr/local/openssl && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make test && \
|
||||
make -j$THREADS install_sw && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN wget https://download.qt.io/archive/qt/5.15/5.15.0/single/qt-everywhere-src-5.15.0.tar.xz && \
|
||||
echo "22b63d7a7a45183865cc4141124f12b673e7a17b1fe2b91e433f6547c5d548c3 qt-everywhere-src-5.15.0.tar.xz" > hashsum.txt && \
|
||||
sha256sum -c hashsum.txt && \
|
||||
tar -xf qt-everywhere-src-5.15.0.tar.xz
|
||||
|
||||
COPY contrib/Qt5.15_LinuxPatch.json /qt-everywhere-src-5.15.0/qtbase/src/gui/configure.json
|
||||
RUN apt install -y libgl1-mesa-dev libglib2.0-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||||
|
||||
RUN cd /qt-everywhere-src-5.15.0 && \
|
||||
RUN rm /usr/lib/x86_64-linux-gnu/libX11.a && \
|
||||
rm /usr/lib/x86_64-linux-gnu/libXext.a && \
|
||||
rm /usr/lib/x86_64-linux-gnu/libX11-xcb.a && \
|
||||
git clone git://code.qt.io/qt/qt5.git -b ${QT_VERSION} --depth 1 && \
|
||||
cd qt5 && \
|
||||
git clone git://code.qt.io/qt/qtbase.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qtimageformats.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qtmultimedia.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qtsvg.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qttools.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qttranslations.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qtx11extras.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qtwebsockets.git -b ${QT_VERSION} --depth 1 && \
|
||||
sed -ri s/\(Libs:.*\)/\\1\ -lexpat/ /usr/local/lib/pkgconfig/fontconfig.pc && \
|
||||
sed -ri s/\(Libs:.*\)/\\1\ -lz/ /usr/local/lib/pkgconfig/freetype2.pc && \
|
||||
sed -ri s/\(Libs:.*\)/\\1\ -lXau/ /usr/local/lib/pkgconfig/xcb.pc && \
|
||||
sed -i s/\\/usr\\/X11R6\\/lib64/\\/usr\\/local\\/lib/ qtbase/mkspecs/linux-g++-64/qmake.conf && \
|
||||
OPENSSL_LIBS="-lssl -lcrypto -lpthread -ldl" \
|
||||
./configure --prefix=/usr -platform linux-g++-64 -opensource -confirm-license -release -static -no-avx \
|
||||
-no-opengl -qpa xcb -openssl-linked -I /usr/local/openssl/include -L /usr/local/openssl/lib -system-freetype -fontconfig -glib \
|
||||
-no-opengl -qpa xcb --xcb -xcb-xlib -feature-xlib -openssl-linked -I /usr/local/openssl/include \
|
||||
-L /usr/local/openssl/lib -system-freetype -fontconfig -glib \
|
||||
-no-dbus -no-sql-sqlite -no-use-gold-linker -no-kms \
|
||||
-qt-harfbuzz -qt-libjpeg -qt-libpng -qt-pcre -qt-zlib \
|
||||
-skip qt3d -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d \
|
||||
@@ -191,117 +311,106 @@ RUN cd /qt-everywhere-src-5.15.0 && \
|
||||
-skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qttools \
|
||||
-skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebview \
|
||||
-skip qtwinextras -skip qtx11extras -skip gamepad -skip serialbus -skip location -skip webengine \
|
||||
-skip qtdeclarative -skip qtmultimedia \
|
||||
-skip qtdeclarative \
|
||||
-no-feature-cups -no-feature-ftp -no-feature-pdf -no-feature-animation \
|
||||
-nomake examples -nomake tests -nomake tools
|
||||
|
||||
RUN cd /qt-everywhere-src-5.15.0 && \
|
||||
-nomake examples -nomake tests -nomake tools && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN cd qt-everywhere-src-5.15.0/qttools/src/linguist/lrelease && \
|
||||
qmake && \
|
||||
make -j$THREADS install && \
|
||||
cd qttools/src/linguist/lrelease && \
|
||||
../../../../qtbase/bin/qmake && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
cd ../../../.. && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libudev-dev && \
|
||||
git clone -b v1.0.23 --depth 1 https://github.com/libusb/libusb && \
|
||||
RUN git clone -b v1.0.23 --depth 1 https://github.com/libusb/libusb && \
|
||||
cd libusb && \
|
||||
git reset --hard e782eeb2514266f6738e242cdcb18e3ae1ed06fa && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||
./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b hidapi-0.9.0 --depth 1 https://github.com/libusb/hidapi && \
|
||||
cd hidapi && \
|
||||
git reset --hard 7da5cc91fc0d2dbe4df4f08cd31f6ca1a262418f && \
|
||||
./bootstrap && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static && \
|
||||
./configure --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libsodium-dev && \
|
||||
git clone -b v4.3.2 --depth 1 https://github.com/zeromq/libzmq && \
|
||||
RUN git clone -b v4.3.2 --depth 1 https://github.com/zeromq/libzmq && \
|
||||
cd libzmq && \
|
||||
git reset --hard a84ffa12b2eb3569ced199660bac5ad128bff1f0 && \
|
||||
./autogen.sh && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-libunwind --with-libsodium && \
|
||||
./configure --disable-shared --enable-static --disable-libunwind --with-libsodium && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgpg-error-1.38 --depth 1 git://git.gnupg.org/libgpg-error.git && \
|
||||
cd libgpg-error && \
|
||||
git reset --hard 71d278824c5fe61865f7927a2ed1aa3115f9e439 && \
|
||||
./autogen.sh && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-doc --disable-tests && \
|
||||
./configure --disable-shared --enable-static --disable-doc --disable-tests && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgcrypt-1.8.5 --depth 1 git://git.gnupg.org/libgcrypt.git && \
|
||||
cd libgcrypt && \
|
||||
git reset --hard 56606331bc2a80536db9fc11ad53695126007298 && \
|
||||
./autogen.sh && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-doc && \
|
||||
./configure --disable-shared --enable-static --disable-doc && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v3.10.0 --depth 1 https://github.com/protocolbuffers/protobuf && \
|
||||
cd protobuf && \
|
||||
git reset --hard 6d4e7fd7966c989e38024a8ea693db83758944f1 && \
|
||||
./autogen.sh && \
|
||||
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --enable-static --disable-shared && \
|
||||
./configure --enable-static --disable-shared && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y zip cmake && git clone -b v4.0.2 --depth 1 https://github.com/fukuchi/libqrencode.git && \
|
||||
RUN git clone -b v3.18.4 --depth 1 https://github.com/Kitware/CMake && \
|
||||
cd CMake && \
|
||||
git reset --hard 3cc3d42aba879fff5e85b363ae8f21386a3f9f9b && \
|
||||
./bootstrap && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v4.0.2 --depth 1 https://github.com/fukuchi/libqrencode.git && \
|
||||
cd libqrencode && \
|
||||
git reset --hard 59ee597f913fcfda7a010a6e106fbee2595f68e4 && \
|
||||
cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/usr . && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN apt install -y libmbedtls-dev && git clone -b release-2.1.12-stable --depth 1 https://github.com/libevent/libevent.git && \
|
||||
cd libevent && \
|
||||
mkdir build && cd build && \
|
||||
cmake -DEVENT_LIBRARY_STATIC=ON -DOPENSSL_ROOT_DIR=/usr/local/openssl -DCMAKE_INSTALL_PREFIX=/usr/local/libevent .. && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN git clone -b tor-0.4.3.5 --depth 1 https://git.torproject.org/tor.git && \
|
||||
cd tor && \
|
||||
bash autogen.sh && \
|
||||
LDFLAGS="-L/usr/local/openssl/lib/" LIBS="-lssl -lcrypto -lpthread -ldl" CPPFLAGS="-I/usr/local/openssl/include/" ./configure \
|
||||
--enable-static-zlib \
|
||||
--enable-static-openssl \
|
||||
--enable-static-libevent \
|
||||
--disable-system-torrc \
|
||||
--with-libevent-dir=/usr/local/libevent \
|
||||
--with-openssl-dir=/usr/local/openssl/ \
|
||||
--with-zlib-dir=/usr/local/zlib \
|
||||
--disable-system-torrc \
|
||||
--disable-tool-name-check \
|
||||
--disable-systemd \
|
||||
--disable-lzma \
|
||||
--disable-unittests \
|
||||
--disable-zstd \
|
||||
--disable-seccomp \
|
||||
--disable-asciidoc \
|
||||
--disable-manpage \
|
||||
--disable-html-manual \
|
||||
--disable-system-torrc \
|
||||
--prefix=/usr/local/tor && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
|
||||
RUN git clone https://git.torproject.org/torsocks.git && \
|
||||
cd torsocks && \
|
||||
bash autogen.sh && \
|
||||
./configure --prefix=/usr/local/torsocks && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone https://git.wownero.com/feather/monero-seed.git && \
|
||||
cd monero-seed && \
|
||||
git reset --hard 4674ef09b6faa6fe602ab5ae0b9ca8e1fd7d5e1b && \
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -Bbuild && \
|
||||
make -Cbuild -j$THREADS && \
|
||||
make -Cbuild install
|
||||
make -Cbuild install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone https://github.com/plougher/squashfs-tools.git && \
|
||||
cd squashfs-tools/squashfs-tools && \
|
||||
git reset --hard 38fa0720526222827da44b3b6c3f7eb63e8f5c2f && \
|
||||
make && \
|
||||
make install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN mkdir linuxdeployqt && \
|
||||
cd linuxdeployqt && \
|
||||
wget https://github.com/probonopd/linuxdeployqt/releases/download/7/linuxdeployqt-7-x86_64.AppImage && \
|
||||
echo "645276306a801d7154d59e5b4b3c2fac3d34e09be57ec31f6d9a09814c6c162a linuxdeployqt-7-x86_64.AppImage" | sha256sum -c && \
|
||||
chmod +x linuxdeployqt-7-x86_64.AppImage && \
|
||||
./linuxdeployqt-7-x86_64.AppImage --appimage-extract && \
|
||||
rm linuxdeployqt-7-x86_64.AppImage
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
FROM ubuntu:20.04
|
||||
|
||||
ARG THREADS=1
|
||||
ARG QT_VERSION=5.15.2
|
||||
ENV SOURCE_DATE_EPOCH=1397818193
|
||||
|
||||
ENV OPENSSL_ROOT_DIR=/usr/local/openssl/
|
||||
ENV TOR_BIN=/usr/local/tor/bin/tor.exe
|
||||
|
||||
RUN apt update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt install -y curl wget zip automake build-essential cmake gcc-mingw-w64 g++-mingw-w64 gettext git libtool pkg-config \
|
||||
python && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
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.1.9 --depth 1 https://github.com/monero-project/monero && \
|
||||
cd monero && \
|
||||
git reset --hard 8fef32e45c80aec41f25be9d1d8fb75adc883c64 && \
|
||||
cp -a contrib/depends / && \
|
||||
cd .. && \
|
||||
rm -rf monero
|
||||
|
||||
RUN make -j$THREADS -C /depends HOST=x86_64-w64-mingw32 NO_QT=1
|
||||
|
||||
RUN git clone git://code.qt.io/qt/qt5.git -b ${QT_VERSION} --depth 1 && \
|
||||
cd qt5 && \
|
||||
git clone git://code.qt.io/qt/qtbase.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qtimageformats.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qtmultimedia.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qtsvg.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qttools.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qttranslations.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qtxmlpatterns.git -b ${QT_VERSION} --depth 1 && \
|
||||
git clone git://code.qt.io/qt/qtwebsockets.git -b ${QT_VERSION} --depth 1 && \
|
||||
OPENSSL_LIBS="-lssl -lcrypto -lpthread -ldl" \
|
||||
./configure --prefix=/depends/x86_64-w64-mingw32 -xplatform win32-g++ \
|
||||
-device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- \
|
||||
-I $(pwd)/qtbase/src/3rdparty/angle/include \
|
||||
-opensource -confirm-license -release -static -static-runtime -no-opengl \
|
||||
-no-avx -openssl -I /depends/x86_64-w64-mingw32/include -L /depends/x86_64-w64-mingw32/lib \
|
||||
-qt-freetype -qt-harfbuzz -qt-libjpeg -qt-libpng -qt-pcre -qt-zlib \
|
||||
-skip gamepad -skip location -skip qt3d -skip qtactiveqt -skip qtandroidextras \
|
||||
-skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdoc \
|
||||
-skip qtgamepad -skip qtlocation -skip qtmacextras -skip qtnetworkauth -skip qtpurchasing \
|
||||
-skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport \
|
||||
-skip qtspeech -skip qttools -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel \
|
||||
-skip qtwebengine -skip qtwebview -skip qtwinextras -skip qtx11extras \
|
||||
-skip qtdeclarative -skip qtquickcontrols -skip qtquickcontrols2 \
|
||||
-skip serialbus -skip webengine \
|
||||
-nomake examples -nomake tests -nomake tools && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
cd qttools/src/linguist/lrelease && \
|
||||
../../../../qtbase/bin/qmake && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
cd ../../../.. && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgpg-error-1.38 --depth 1 git://git.gnupg.org/libgpg-error.git && \
|
||||
cd libgpg-error && \
|
||||
git reset --hard 71d278824c5fe61865f7927a2ed1aa3115f9e439 && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --disable-doc --disable-tests \
|
||||
--host=x86_64-w64-mingw32 --prefix=/depends/x86_64-w64-mingw32 && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
cd .. && \
|
||||
rm -rf libgpg-error
|
||||
|
||||
RUN git clone -b libgcrypt-1.8.5 --depth 1 git://git.gnupg.org/libgcrypt.git && \
|
||||
cd libgcrypt && \
|
||||
git reset --hard 56606331bc2a80536db9fc11ad53695126007298 && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --disable-doc \
|
||||
--host=x86_64-w64-mingw32 --prefix=/depends/x86_64-w64-mingw32 \
|
||||
--with-gpg-error-prefix=/depends/x86_64-w64-mingw32 && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
cd .. && \
|
||||
rm -rf libgcrypt
|
||||
|
||||
# zlib -> libpng, Tor
|
||||
RUN git clone -b v1.2.11 --depth 1 https://github.com/madler/zlib && \
|
||||
cd zlib && \
|
||||
git reset --hard cacf7f1d4e3d44d871b605da3b647f07d718623f && \
|
||||
CC=x86_64-w64-mingw32-gcc AR=x86_64-w64-mingw32-ar ./configure --static --prefix=/usr/x86_64-w64-mingw32 && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
# libpng -> libqrencode
|
||||
RUN git clone -b libpng16 --depth 1 https://github.com/glennrp/libpng.git && \
|
||||
cd libpng && \
|
||||
git reset --hard dbe3e0c43e549a1602286144d94b0666549b18e6 && \
|
||||
CPPFLAGS="-I/depends/x86_64-w64-mingw32/include" LDFLAGS="-L/depends/x86_64-w64-mingw32/lib" \
|
||||
./configure --host=x86_64-w64-mingw32 --prefix=/depends/x86_64-w64-mingw32 && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v4.0.2 --depth 1 https://github.com/fukuchi/libqrencode.git && \
|
||||
cd libqrencode && \
|
||||
git reset --hard 59ee597f913fcfda7a010a6e106fbee2595f68e4 && \
|
||||
./autogen.sh && \
|
||||
CPPFLAGS="-I/depends/x86_64-w64-mingw32/include" LDFLAGS="-L/depends/x86_64-w64-mingw32/lib" \
|
||||
./configure --disable-shared --enable-static --host=x86_64-w64-mingw32 --prefix=/depends/x86_64-w64-mingw32 && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz && \
|
||||
echo "e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04 libiconv-1.16.tar.gz" | sha256sum -c && \
|
||||
tar -xzf libiconv-1.16.tar.gz && \
|
||||
rm libiconv-1.16.tar.gz && \
|
||||
cd libiconv-1.16 && \
|
||||
./configure --enable-static --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32 && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
# OpenSSL -> Tor
|
||||
RUN wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz && \
|
||||
echo "e8be6a35fe41d10603c3cc635e93289ed00bf34b79671a3a4de64fcee00d5242 openssl-1.1.1i.tar.gz" | sha256sum -c && \
|
||||
tar -xzf openssl-1.1.1i.tar.gz && \
|
||||
rm openssl-1.1.1i.tar.gz && \
|
||||
cd openssl-1.1.1i && \
|
||||
./Configure mingw64 no-shared no-dso --cross-compile-prefix=x86_64-w64-mingw32- --prefix=/usr/local/openssl && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install_sw && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
# libevent -> Tor
|
||||
RUN wget https://github.com/libevent/libevent/releases/download/release-2.1.11-stable/libevent-2.1.11-stable.tar.gz && \
|
||||
echo "a65bac6202ea8c5609fd5c7e480e6d25de467ea1917c08290c521752f147283d libevent-2.1.11-stable.tar.gz" | sha256sum -c && \
|
||||
tar -zxvf libevent-2.1.11-stable.tar.gz && \
|
||||
cd libevent-2.1.11-stable && \
|
||||
./configure --prefix=/usr/local/libevent \
|
||||
--disable-shared \
|
||||
--enable-static \
|
||||
--with-pic \
|
||||
--host=x86_64-w64-mingw32 && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
ENV TOR_VERSION=0.4.5.5-rc
|
||||
RUN git clone -b tor-0.4.5.5-rc --depth 1 https://git.torproject.org/tor.git && \
|
||||
cd tor && \
|
||||
git reset --hard b36a00e9a9d3eb4b2949951afaa72e45fb7e68cd && \
|
||||
./autogen.sh && \
|
||||
./configure --host=x86_64-w64-mingw32 \
|
||||
--disable-asciidoc \
|
||||
--disable-zstd \
|
||||
--disable-lzma \
|
||||
--disable-manpage \
|
||||
--disable-html-manual \
|
||||
--disable-system-torrc \
|
||||
--disable-module-relay \
|
||||
--enable-static-tor \
|
||||
--with-libevent-dir=/usr/local/libevent \
|
||||
--with-openssl-dir=/usr/local/openssl \
|
||||
--with-zlib-dir=/usr/x86_64-w64-mingw32 \
|
||||
--disable-tool-name-check \
|
||||
--enable-fatal-warnings \
|
||||
--prefix=/usr/local/tor \
|
||||
LIBS=-lcrypt32 && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd) && \
|
||||
strip -s -D /usr/local/tor/bin/tor.exe
|
||||
|
||||
RUN git clone https://git.wownero.com/feather/monero-seed.git && \
|
||||
cd monero-seed && \
|
||||
git reset --hard 4674ef09b6faa6fe602ab5ae0b9ca8e1fd7d5e1b && \
|
||||
cmake -DCMAKE_INSTALL_PREFIX=/depends/x86_64-w64-mingw32 \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_TOOLCHAIN_FILE=/depends/x86_64-w64-mingw32/share/toolchain.cmake -Bbuild && \
|
||||
make -Cbuild -j$THREADS && \
|
||||
make -Cbuild install && \
|
||||
rm -rf $(pwd)
|
||||
@@ -50,7 +50,7 @@ RUN apt install -y \
|
||||
|
||||
RUN git clone -b feather-patch --depth 1 https://git.wownero.com/feather/mxe.git && \
|
||||
cd mxe && \
|
||||
make -j$THREADS MXE_TARGETS='x86_64-w64-mingw32.static' gcc libqrencode pkgconf libgpg_error libgcrypt cmake libsodium lzma readline libzmq boost qtbase qtsvg qtwebsockets qtimageformats
|
||||
make -j$THREADS MXE_TARGETS='x86_64-w64-mingw32.static' gcc libqrencode pkgconf libgpg_error libgcrypt cmake libsodium lzma readline libzmq boost qtbase qtsvg qtwebsockets qtimageformats qtmultimedia
|
||||
|
||||
# plugins
|
||||
RUN cd mxe && make -j$THREADS MXE_PLUGIN_DIRS='/mxe/plugins/apps/' MXE_TARGETS='x86_64-w64-mingw32.static' tor
|
||||
@@ -1,18 +0,0 @@
|
||||
FROM ubuntu:20.04
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt clean && apt update
|
||||
RUN apt install -y golang git build-essential wget curl ngrep unzip file squashfs-tools desktop-file-utils patchelf libxkbcommon-x11-dev
|
||||
|
||||
RUN go get github.com/probonopd/go-appimage/src/appimagetool
|
||||
RUN go build -trimpath -ldflags="-s -w" github.com/probonopd/go-appimage/src/appimagetool
|
||||
RUN chmod +x appimagetool
|
||||
|
||||
RUN cd /usr/bin && \
|
||||
wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh -O uploadtool && \
|
||||
chmod +x uploadtool
|
||||
|
||||
RUN cd / && \
|
||||
wget -c https://github.com/AppImage/AppImageKit/releases/download/continuous/runtime-x86_64 && \
|
||||
chmod +x runtime-x86_64
|
||||
@@ -41,8 +41,8 @@ via the `CMAKE_PREFIX_PATH` definition. For me this is:
|
||||
|
||||
There are some Monero/Feather related options/definitions that you may pass:
|
||||
|
||||
- `-DXMRTO=OFF` - disable Xmr.To feature
|
||||
- `-DBUILD_TOR=OFF` - disable embedded Tor
|
||||
- `-DXMRIG=OFF` - disable XMRig feature
|
||||
- `-DTOR_BIN=/path/to/tor` - Embed a Tor executable inside Feather
|
||||
- `-DDONATE_BEG=OFF` - disable the dreaded donate requests
|
||||
|
||||
And:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2020, The Monero Project
|
||||
Copyright (c) 2020-2021, The Monero Project
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
||||
@@ -30,7 +30,8 @@ CMAKEFLAGS = \
|
||||
-DARCH=x86_64 \
|
||||
-DBUILD_64=On \
|
||||
-DBUILD_TESTS=Off \
|
||||
-DXMRTO=ON \
|
||||
-DXMRIG=Off \
|
||||
-DTOR_BIN=Off \
|
||||
-DCMAKE_CXX_STANDARD=11 \
|
||||
-DCMAKE_VERBOSE_MAKEFILE=On \
|
||||
-DINSTALL_VENDORED_LIBUNBOUND=Off \
|
||||
@@ -40,31 +41,36 @@ CMAKEFLAGS = \
|
||||
$(CMAKEFLAGS_EXTRA)
|
||||
|
||||
release-static: CMAKEFLAGS += -DBUILD_TAG="linux-x64"
|
||||
release-static: CMAKEFLAGS += -DBUILD_TOR=On
|
||||
release-static: CMAKEFLAGS += -DTOR_BIN=$(or ${TOR_BIN},OFF)
|
||||
release-static: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Release
|
||||
release-static: CMAKEFLAGS += -DREPRODUCIBLE=$(or ${SOURCE_DATE_EPOCH},OFF)
|
||||
release-static:
|
||||
cmake -Bbuild $(CMAKEFLAGS)
|
||||
$(MAKE) -Cbuild
|
||||
|
||||
depends:
|
||||
mkdir -p build/$(target)/release
|
||||
cd build/$(target)/release && cmake -D STATIC=ON -DREPRODUCIBLE=$(or ${SOURCE_DATE_EPOCH},OFF) -DTOR_VERSION=$(or ${TOR_VERSION}, OFF) -DTOR_BIN=$(or ${TOR_BIN},OFF) -D DEV_MODE=$(or ${DEV_MODE},OFF) -D BUILD_TAG=$(tag) -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=$(root)/$(target)/share/toolchain.cmake ../../.. && $(MAKE)
|
||||
|
||||
windows-mxe-release: CMAKEFLAGS += -DBUILD_TAG="win-x64"
|
||||
windows-mxe-release: CMAKEFLAGS += -DBUILD_TOR=On
|
||||
windows-mxe-release: CMAKEFLAGS += -DTOR_BIN=$(or ${TOR_BIN},OFF)
|
||||
windows-mxe-release: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Release
|
||||
windows-mxe-release:
|
||||
cmake -Bbuild $(CMAKEFLAGS)
|
||||
$(MAKE) -Cbuild
|
||||
|
||||
windows-mxe-debug: CMAKEFLAGS += -DBUILD_TAG="win-x64"
|
||||
windows-mxe-debug: CMAKEFLAGS += -DBUILD_TOR=Off
|
||||
windows-mxe-debug: CMAKEFLAGS += -DTOR_BIN=$(or ${TOR_BIN},OFF)
|
||||
windows-mxe-debug: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Debug
|
||||
windows-mxe-debug:
|
||||
cmake -Bbuild $(CMAKEFLAGS)
|
||||
$(MAKE) -Cbuild
|
||||
|
||||
mac-release: CMAKEFLAGS += -DSTATIC=Off
|
||||
mac-release: CMAKEFLAGS += -DTOR_BIN=$(or ${TOR_BIN},OFF)
|
||||
mac-release: CMAKEFLAGS += -DBUILD_TAG="mac-x64"
|
||||
mac-release: CMAKEFLAGS += -DBUILD_TOR=Off
|
||||
mac-release: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Release
|
||||
mac-release:
|
||||
cmake -Bbuild $(CMAKEFLAGS)
|
||||
$(MAKE) -Cbuild
|
||||
$(MAKE) -Cbuild deploy
|
||||
$(MAKE) -Cbuild deploy
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
# Maintainer: wowario <wowario[at]protonmail[dot]com>
|
||||
# Contributor: wowario <wowario[at]protonmail[dot]com>
|
||||
|
||||
pkgname='monero-feather-git'
|
||||
pkgver=0.1.0.925ef5683
|
||||
pkgrel=1
|
||||
pkgdesc='a free Monero desktop wallet'
|
||||
license=('BSD')
|
||||
arch=('x86_64')
|
||||
url="https://wownero.org"
|
||||
depends=('boost-libs' 'libunwind' 'openssl' 'readline' 'pcsclite' 'hidapi' 'protobuf' 'miniupnpc' 'libgcrypt' 'qrencode' 'libsodium' 'libpgm' 'expat' 'qt5-base' 'qt5-websockets' 'tor')
|
||||
makedepends=('git' 'cmake' 'boost')
|
||||
|
||||
source=("${pkgname}"::"git+https://git.wownero.com/feather/feather")
|
||||
|
||||
sha256sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "${srcdir}/${pkgname}"
|
||||
printf "%s.%s" "$(git describe --tags --abbrev=0)" "$(git rev-parse --short=9 HEAD)"
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname}"
|
||||
git submodule update --init --recursive
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake ..
|
||||
make
|
||||
}
|
||||
|
||||
package_monero-feather-git() {
|
||||
install -Dm644 "${srcdir}/${pkgname}/LICENSE" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
|
||||
install -Dm755 "${srcdir}/${pkgname}/build/bin/feather" "${pkgdir}/usr/bin/feather"
|
||||
}
|
||||
@@ -1,35 +1,12 @@
|
||||
# Feather - a free Monero desktop wallet
|
||||
[](https://ci.wownero.com/wowlet/wowlet)
|
||||
|
||||
[](https://build.featherwallet.org/feather/feather)
|
||||
# WOWlet- a free Wownero desktop wallet
|
||||
|
||||
Feather is a free, open-source Monero client Linux with ports for Mac OS and Windows written in C++ with the Qt framework. It is created and maintained by [dsc](dsc@xmr.pm) and [tobtoht](thotbot@protonmail.com).
|
||||
|
||||
WOWlet is a free, open-source Wownero client for Linux with ports for Mac OS and Windows.
|
||||
|
||||
## Development resources
|
||||
* Web: [featherwallet.org](https://featherwallet.org)
|
||||
* Git: [git.wownero.com/feather/feather](https://git.wownero.com/feather/feather)
|
||||
* IRC: `#feather` on OFTC
|
||||
* Development builds: [build.featherwallet.org/files](https://build.featherwallet.org/files/)
|
||||
* Git: [git.wownero.com/wowlet/wowlet](https://git.wownero.com/wowlet/wowlet)
|
||||
* IRC: `#wownero` on Freenode
|
||||
|
||||
Copyright (c) 2020-2021 The Monero Project.
|
||||
|
||||
## Compiling Feather from source
|
||||
|
||||
Feather uses Monero, as such it requires the same dependencies as outlined in [Monero's README](https://github.com/monero-project/monero#compiling-monero-from-source). Additionally, Feather uses:
|
||||
|
||||
- Qt 5.15.0
|
||||
- libqrencode
|
||||
- openpgp
|
||||
|
||||
See [BUILDING.md](https://git.wownero.com/feather/feather/src/branch/master/BUILDING.md) for information on how to compile a build.
|
||||
|
||||
## Supporting the project
|
||||
|
||||
Feather is a 100% community-sponsored endeavor. If you want to join our efforts, the easiest thing you can do is support the project financially.
|
||||
|
||||
`47ntfT2Z5384zku39pTM6hGcnLnvpRYW2Azm87GiAAH2bcTidtq278TL6HmwyL8yjMeERqGEBs3cqC8vvHPJd1cWQrGC65f`
|
||||
|
||||
## Developers
|
||||
|
||||
See [HACKING.md](https://git.wownero.com/feather/feather/src/branch/master/HACKING.md) for useful development resources.
|
||||
|
||||
It is HIGHLY recommended that you join the `#feather` IRC channel on OFTC if you are hacking on Feather. Due to the nature of this open source software project, joining this channel and idling is the best way to stay updated on best practices and new developments.
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
Please do not open an issue to report security issues.
|
||||
|
||||
To report a vulnerability send an email to dev@featherwallet.org
|
||||
To report a vulnerability send an email to dev@wownero.org
|
||||
|
||||
The following keys may be used to communicate sensitive information to developers:
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ if(APPLE OR (WIN32 AND NOT STATIC))
|
||||
find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${_qt_bin_dir}")
|
||||
add_custom_command(TARGET deploy
|
||||
POST_BUILD
|
||||
COMMAND "${MACDEPLOYQT_EXECUTABLE}" "$<TARGET_FILE_DIR:feather>/../.." -always-overwrite
|
||||
COMMAND "${MACDEPLOYQT_EXECUTABLE}" "$<TARGET_FILE_DIR:wowlet>/../.." -always-overwrite
|
||||
COMMENT "Running macdeployqt..."
|
||||
)
|
||||
|
||||
@@ -16,11 +16,11 @@ if(APPLE OR (WIN32 AND NOT STATIC))
|
||||
if(_qt_svg_dylib)
|
||||
add_custom_command(TARGET deploy
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${_qt_svg_dylib} $<TARGET_FILE_DIR:feather>/../PlugIns/imageformats/
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/5/QtGui" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:feather>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/5/QtWidgets" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:feather>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtSvg.framework/Versions/5/QtSvg" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:feather>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/5/QtCore" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:feather>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${_qt_svg_dylib} $<TARGET_FILE_DIR:wowlet>/../PlugIns/imageformats/
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/5/QtGui" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:wowlet>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/5/QtWidgets" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:wowlet>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtSvg.framework/Versions/5/QtSvg" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:wowlet>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/5/QtCore" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:wowlet>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMENT "Copying libqsvg.dylib, running install_name_tool"
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
find_path(QRENCODE_INCLUDE_DIR qrencode.h)
|
||||
message(STATUS "QRENCODE PATH ${QRENCODE_INCLUDE_DIR}")
|
||||
|
||||
find_library(QRENCODE_LIBRARY qrencode)
|
||||
message(STATUS "QRENCODE LIBARY ${QRENCODE_LIBRARY}")
|
||||
|
||||
mark_as_advanced(QRENCODE_LIBRARY QRENCODE_INCLUDE_DIR)
|
||||
|
||||
|
||||
@@ -7,4 +7,6 @@
|
||||
#define MONERO_VERSION "@MONERO_VERSION@"
|
||||
#define MONERO_BRANCH "@MONERO_BRANCH@"
|
||||
|
||||
#define TOR_VERSION "@TOR_VERSION@"
|
||||
|
||||
#endif //FEATHER_VERSION_H
|
||||
|
||||
@@ -1,40 +1,33 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
unset SOURCE_DATE_EPOCH
|
||||
|
||||
function verify_hash() {
|
||||
local file=$1 expected_hash=$2
|
||||
actual_hash=$(sha256sum $file | awk '{print $1}')
|
||||
if [ "$actual_hash" == "$expected_hash" ]; then
|
||||
return 0
|
||||
else
|
||||
echo "$file $actual_hash (unexpected hash)" >&2
|
||||
rm "$file"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
APPDIR="$PWD/wowlet.AppDir"
|
||||
|
||||
function download_if_not_exist() {
|
||||
local file_name=$1 url=$2
|
||||
if [ ! -e $file_name ] ; then
|
||||
wget -q -O $file_name "$url"
|
||||
fi
|
||||
}
|
||||
|
||||
APPDIR="$PWD/feather.AppDir"
|
||||
mkdir -p "$APPDIR"
|
||||
mkdir -p "$APPDIR/usr/share/applications/"
|
||||
mkdir -p "$APPDIR/usr/bin"
|
||||
|
||||
echo "Downloading dependencies"
|
||||
cp "$PWD/src/assets/wowlet.desktop" "$APPDIR/usr/share/applications/wowlet.desktop"
|
||||
cp "$PWD/src/assets/images/appicons/64x64.png" "$APPDIR/wowlet.png"
|
||||
cp "$PWD/build/bin/wowlet" "$APPDIR/usr/bin/wowlet"
|
||||
|
||||
download_if_not_exist "feather.zip" "https://build.featherwallet.org/files/linux-release/$BRANCH/$FN"
|
||||
unzip -q feather.zip
|
||||
LD_LIBRARY_PATH=/usr/local/lib /linuxdeployqt/squashfs-root/AppRun wowlet.AppDir/usr/share/applications/wowlet.desktop -bundle-non-qt-libs
|
||||
|
||||
cp "$PWD/src/assets/feather.desktop" "$APPDIR/usr/share/applications/feather.desktop"
|
||||
cp "$PWD/src/assets/images/appicons/64x64.png" "$APPDIR/feather.png"
|
||||
cp "$PWD/feather" "$APPDIR/usr/bin/feather"
|
||||
find wowlet.AppDir/ -exec touch -h -a -m -t 202101010100.00 {} \;
|
||||
|
||||
/appimagetool deploy "$APPDIR/usr/share/applications/feather.desktop"
|
||||
VERSION=1.0 /appimagetool ./feather.AppDir
|
||||
# Manually create AppImage (reproducibly)
|
||||
|
||||
# download runtime
|
||||
wget -nc https://github.com/AppImage/AppImageKit/releases/download/12/runtime-x86_64
|
||||
echo "24da8e0e149b7211cbfb00a545189a1101cb18d1f27d4cfc1895837d2c30bc30 runtime-x86_64" | sha256sum -c
|
||||
|
||||
mksquashfs wowlet.AppDir wowlet.squashfs -info -root-owned -no-xattrs -noappend -fstime 0
|
||||
# mksquashfs writes a timestamp to the header
|
||||
printf '\x00\x00\x00\x00' | dd conv=notrunc of=wowlet.squashfs bs=1 seek=$((0x8))
|
||||
|
||||
rm -f wowlet.AppImage
|
||||
cat runtime-x86_64 >> wowlet.AppImage
|
||||
cat wowlet.squashfs >> wowlet.AppImage
|
||||
chmod a+x wowlet.AppImage
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# this file is used by feather's CMake
|
||||
# arguments: ./build.tor $TAG $ROOT_FEATHER_DIR
|
||||
|
||||
set -ex
|
||||
|
||||
ERR_WIN="This script does not work on Windows"
|
||||
if [[ "$OSTYPE" == "msys" ]]; then
|
||||
echo "$ERR_WIN"
|
||||
exit 1
|
||||
elif [[ "$OSTYPE" == "win32" ]]; then
|
||||
echo "$ERR_WIN"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TOR_TAG="$1"
|
||||
ROOT_DIR="$2"
|
||||
STATIC="$3"
|
||||
TOR_DIR="$ROOT_DIR/contrib/tor"
|
||||
TORSOCKS_DIR="$ROOT_DIR/contrib/torsocks"
|
||||
TARGET_DIR="$ROOT_DIR/src/tor"
|
||||
|
||||
CPU_CORE_COUNT="$(nproc)"
|
||||
|
||||
#
|
||||
### tor
|
||||
#
|
||||
|
||||
pushd "$TOR_DIR"
|
||||
|
||||
rm -rf "$TOR_DIR/build"
|
||||
mkdir -p "$TOR_DIR/build"
|
||||
|
||||
# configure
|
||||
git -C "$TOR_DIR" fetch
|
||||
git -C "$TOR_DIR" checkout tor-0.4.3.5
|
||||
bash "$TOR_DIR/autogen.sh"
|
||||
|
||||
if [[ "$STATIC" = "ON" ]]; then
|
||||
# static assumes that openssl has been compiled with:
|
||||
# CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./config no-asm no-shared no-zlib-dynamic --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
|
||||
# and libevent with:
|
||||
# cmake -DEVENT_LIBRARY_STATIC=ON -DOPENSSL_ROOT_DIR=/usr/local/openssl -DCMAKE_INSTALL_PREFIX=/usr/local/libevent
|
||||
# and zlib with:
|
||||
# CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --static --prefix=/usr/local/zlib
|
||||
|
||||
LDFLAGS="-L/usr/local/openssl/lib/" LIBS="-lssl -lcrypto -lpthread -ldl" CPPFLAGS="-I/usr/local/openssl/include/" ./configure \
|
||||
--enable-static-zlib \
|
||||
--enable-static-openssl \
|
||||
--enable-static-libevent \
|
||||
--disable-system-torrc \
|
||||
--with-libevent-dir=/usr/local/libevent \
|
||||
--with-openssl-dir=/usr/local/openssl/ \
|
||||
--with-zlib-dir=/usr/local/zlib \
|
||||
--disable-system-torrc \
|
||||
--disable-tool-name-check \
|
||||
--disable-systemd \
|
||||
--disable-lzma \
|
||||
--disable-unittests \
|
||||
--disable-zstd \
|
||||
--disable-seccomp \
|
||||
--disable-asciidoc \
|
||||
--disable-manpage \
|
||||
--disable-html-manual \
|
||||
--disable-system-torrc \
|
||||
--prefix="$TOR_DIR/build"
|
||||
else
|
||||
bash "$TOR_DIR/configure" \
|
||||
--disable-tool-name-check \
|
||||
--disable-systemd \
|
||||
--disable-lzma \
|
||||
--disable-unittests \
|
||||
--disable-zstd \
|
||||
--disable-asciidoc \
|
||||
--disable-manpage \
|
||||
--disable-html-manual \
|
||||
--prefix="$TOR_DIR/build"
|
||||
fi
|
||||
|
||||
# build
|
||||
make -j "$CPU_CORE_COUNT"
|
||||
make install -j "$CPU_CORE_COUNT"
|
||||
|
||||
# copy to lib/tor
|
||||
cp "$TOR_DIR/build/bin/tor" "$TARGET_DIR"
|
||||
cp "$TOR_DIR/build/etc/tor/torrc.sample"* "$TARGET_DIR"
|
||||
|
||||
#
|
||||
### torsocks
|
||||
#
|
||||
|
||||
pushd "$TORSOCKS_DIR"
|
||||
mkdir -p "$TORSOCKS_DIR/build"
|
||||
|
||||
# configure
|
||||
bash "$TORSOCKS_DIR/autogen.sh"
|
||||
bash "$TORSOCKS_DIR/configure" --prefix="$TORSOCKS_DIR/build"
|
||||
|
||||
# build
|
||||
make -j "$CPU_CORE_COUNT"
|
||||
make install -j "$CPU_CORE_COUNT"
|
||||
|
||||
# copy to lib/torsocks
|
||||
cp "$TORSOCKS_DIR/build/lib/torsocks/"* "$TARGET_DIR"
|
||||
cp "$TORSOCKS_DIR/build/bin/"* "$TARGET_DIR"
|
||||
cp "$TORSOCKS_DIR/build/etc/tor/"* "$TARGET_DIR"
|
||||
|
||||
#
|
||||
### verify installation
|
||||
#
|
||||
|
||||
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||||
for fn in "$TARGET_DIR/libtorsocks.so" "$TARGET_DIR/tor"; do
|
||||
if [[ ! -f "$fn" ]]; then
|
||||
echo "[*] Failed to install tor or torsocks: no such file $fn"
|
||||
exit 1
|
||||
fi; done
|
||||
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
for fn in "$TARGET_DIR/libtorsocks.dylib" "$TARGET_DIR/tor"; do
|
||||
if [[ ! -f "$fn" ]]; then
|
||||
echo "[*] Failed to install tor or torsocks: no such file $fn"
|
||||
exit 1
|
||||
fi; done
|
||||
fi
|
||||
|
||||
echo "[*] Compiled tor/torsocks into $TARGET_DIR"
|
||||
@@ -1,53 +0,0 @@
|
||||
From fc5eafeb2886605d4de1546846f06a12a18c87ef Mon Sep 17 00:00:00 2001
|
||||
From: "J.W" <jakwings@gmail.com>
|
||||
Date: Mon, 22 Apr 2019 05:19:32 +0100
|
||||
Subject: [PATCH 1/2] Fix macros for accept4(2)
|
||||
|
||||
Both accept(2) and accept4(2) exist on linux but accept4(2) does not
|
||||
exist on macos 10.11.6 (and maybe other distros).
|
||||
---
|
||||
src/lib/torsocks.c | 9 ++++++++-
|
||||
src/lib/torsocks.h | 4 +++-
|
||||
2 files changed, 11 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/lib/torsocks.c b/src/lib/torsocks.c
|
||||
index 16f2da0..9527513 100644
|
||||
--- a/src/lib/torsocks.c
|
||||
+++ b/src/lib/torsocks.c
|
||||
@@ -234,9 +234,16 @@ static void init_libc_symbols(void)
|
||||
tsocks_libc_socket = dlsym(libc_ptr, LIBC_SOCKET_NAME_STR);
|
||||
tsocks_libc_syscall = dlsym(libc_ptr, LIBC_SYSCALL_NAME_STR);
|
||||
tsocks_libc_execve = dlsym(libc_ptr, LIBC_EXECVE_NAME_STR);
|
||||
+ tsocks_libc_accept = dlsym(libc_ptr, LIBC_ACCEPT_NAME_STR);
|
||||
+#if (defined(__linux__))
|
||||
tsocks_libc_accept4 = dlsym(libc_ptr, LIBC_ACCEPT4_NAME_STR);
|
||||
+#endif
|
||||
+
|
||||
if (!tsocks_libc_connect || !tsocks_libc_close || !tsocks_libc_socket ||
|
||||
- !tsocks_libc_syscall || !tsocks_libc_execve || ! tsocks_libc_accept4) {
|
||||
+#if (defined(__linux__))
|
||||
+ !tsocks_libc_accept4 ||
|
||||
+#endif
|
||||
+ !tsocks_libc_syscall || !tsocks_libc_execve || ! tsocks_libc_accept) {
|
||||
ERR("Unable to lookup symbols in " LIBC_NAME "(%s)", dlerror());
|
||||
goto error;
|
||||
}
|
||||
diff --git a/src/lib/torsocks.h b/src/lib/torsocks.h
|
||||
index 33da526..bf9109d 100644
|
||||
--- a/src/lib/torsocks.h
|
||||
+++ b/src/lib/torsocks.h
|
||||
@@ -30,8 +30,10 @@
|
||||
* libc call outside of torsocks can be used. These are declared for each
|
||||
* symbol torsocks hijacked.
|
||||
*/
|
||||
+#define TSOCKS_LIBC_FUNC(name) \
|
||||
+ tsocks_libc_##name
|
||||
#define TSOCKS_LIBC_DECL(name, type, sig) \
|
||||
- type (*tsocks_libc_##name)(sig);
|
||||
+ type (*TSOCKS_LIBC_FUNC(name))(sig);
|
||||
#define TSOCKS_DECL(name, type, sig) \
|
||||
extern type tsocks_##name(sig);
|
||||
|
||||
--
|
||||
2.21.0
|
||||
|
||||
@@ -42,14 +42,12 @@ file(GLOB SOURCE_FILES
|
||||
"dialog/*.cpp"
|
||||
)
|
||||
|
||||
if(APPLE AND BUILD_TOR)
|
||||
set(ASSETS_OS "assets_macos_tor.qrc")
|
||||
elseif(UNIX AND NOT APPLE AND BUILD_TOR)
|
||||
set(ASSETS_OS "assets_linux_tor.qrc")
|
||||
elseif(MINGW AND BUILD_TOR)
|
||||
set(ASSETS_OS "assets_windows_tor.qrc")
|
||||
else()
|
||||
message(STATUS "Building without embedded Tor")
|
||||
if(TOR_BIN)
|
||||
if(APPLE)
|
||||
set(ASSETS_TOR "assets_tor_macos.qrc")
|
||||
else()
|
||||
set(ASSETS_TOR "assets_tor.qrc")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(EXECUTABLE_FLAG)
|
||||
@@ -60,7 +58,8 @@ if(MINGW)
|
||||
set(ICON_RC ${CMAKE_CURRENT_BINARY_DIR}/icon.rc)
|
||||
set(ICON_RES ${CMAKE_CURRENT_BINARY_DIR}/icon.o)
|
||||
file(WRITE ${ICON_RC} "IDI_ICON1 ICON DISCARDABLE \"${ICON}\"")
|
||||
add_custom_command(OUTPUT ${ICON_RES} COMMAND windres ${ICON_RC} ${ICON_RES} MAIN_DEPENDENCY ${ICON_RC})
|
||||
find_program(Qt5_WINDRES_EXECUTABLE NAMES windres x86_64-w64-mingw32-windres REQUIRED CMAKE_FIND_ROOT_PATH_BOTH)
|
||||
add_custom_command(OUTPUT ${ICON_RES} COMMAND ${Qt5_WINDRES_EXECUTABLE} ${ICON_RC} ${ICON_RES} MAIN_DEPENDENCY ${ICON_RC})
|
||||
list(APPEND RESOURCES ${ICON_RES})
|
||||
endif()
|
||||
|
||||
@@ -71,28 +70,29 @@ if(APPLE)
|
||||
list(APPEND RESOURCES ${ICON})
|
||||
endif()
|
||||
|
||||
add_executable(feather ${EXECUTABLE_FLAG} main.cpp
|
||||
add_executable(wowlet ${EXECUTABLE_FLAG} main.cpp
|
||||
${SOURCE_FILES}
|
||||
${RESOURCES}
|
||||
${ASSETS_OS}
|
||||
)
|
||||
${ASSETS_TOR}
|
||||
)
|
||||
|
||||
# mac os bundle
|
||||
set_target_properties(feather PROPERTIES
|
||||
set_target_properties(wowlet PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
|
||||
MACOSX_BUNDLE TRUE
|
||||
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/utils/Info.plist"
|
||||
LINK_FLAGS_RELEASE -s
|
||||
)
|
||||
|
||||
set_property(TARGET feather PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||
set_property(TARGET wowlet PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||
|
||||
target_include_directories(feather PUBLIC ${OPENGL_INCLUDE_DIR})
|
||||
target_include_directories(feather PUBLIC ${Qt5Gui_PRIVATE_INCLUDE_DIRS})
|
||||
target_include_directories(wowlet PUBLIC ${OPENGL_INCLUDE_DIR})
|
||||
target_include_directories(wowlet PUBLIC ${Qt5Gui_PRIVATE_INCLUDE_DIRS})
|
||||
|
||||
file(GLOB_RECURSE SRC_SOURCES *.cpp)
|
||||
file(GLOB_RECURSE SRC_HEADERS *.h)
|
||||
|
||||
target_include_directories(feather PUBLIC
|
||||
target_include_directories(wowlet PUBLIC
|
||||
${CMAKE_BINARY_DIR}/src/feather_autogen/include
|
||||
${CMAKE_SOURCE_DIR}/monero/include
|
||||
${CMAKE_SOURCE_DIR}/monero/src
|
||||
@@ -119,30 +119,38 @@ target_include_directories(feather PUBLIC
|
||||
)
|
||||
|
||||
if(DONATE_BEG)
|
||||
target_compile_definitions(feather PRIVATE DONATE_BEG=1)
|
||||
target_compile_definitions(wowlet PRIVATE DONATE_BEG=1)
|
||||
endif()
|
||||
|
||||
if(BUILD_TOR)
|
||||
target_compile_definitions(feather PRIVATE BUILD_TOR=1)
|
||||
if(TOR_BIN)
|
||||
target_compile_definitions(wowlet PRIVATE HAS_TOR_BIN=1)
|
||||
endif()
|
||||
|
||||
if(XMRTO)
|
||||
target_compile_definitions(feather PRIVATE XMRTO=1)
|
||||
if(XMRIG)
|
||||
target_compile_definitions(wowlet PRIVATE HAS_XMRIG=1)
|
||||
endif()
|
||||
|
||||
if(HAVE_SYS_PRCTL_H)
|
||||
target_compile_definitions(feather PRIVATE HAVE_SYS_PRCTL_H=1)
|
||||
target_compile_definitions(wowlet PRIVATE HAVE_SYS_PRCTL_H=1)
|
||||
endif()
|
||||
|
||||
if(STATIC)
|
||||
target_compile_definitions(feather PRIVATE STATIC=1)
|
||||
target_compile_definitions(wowlet PRIVATE STATIC=1)
|
||||
endif()
|
||||
|
||||
if(STATIC)
|
||||
target_compile_definitions(wowlet PRIVATE STATIC=1)
|
||||
endif()
|
||||
|
||||
if("$ENV{DRONE}" STREQUAL "true")
|
||||
target_compile_definitions(wowlet PRIVATE DRONE=1)
|
||||
endif()
|
||||
|
||||
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
target_compile_definitions(feather PRIVATE QT_NO_DEBUG=1)
|
||||
target_compile_definitions(wowlet PRIVATE QT_NO_DEBUG=1)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(feather
|
||||
target_compile_definitions(wowlet
|
||||
PUBLIC
|
||||
${Qt5Core_DEFINITIONS}
|
||||
${Qt5Widgets_DEFINITIONS}
|
||||
@@ -158,12 +166,12 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
|
||||
if(UNIX AND NOT APPLE)
|
||||
# https://stackoverflow.com/questions/57766620/cmake-add-library-doesnt-initialize-static-global-variable
|
||||
# so that contrib/monero-seed/src/gf_elem.cpp properly initializes. A better solution is welcome.
|
||||
target_link_libraries(feather -Wl,--whole-archive monero-seed::monero-seed -Wl,--no-whole-archive)
|
||||
target_link_libraries(wowlet -Wl,--whole-archive monero-seed::monero-seed -Wl,--no-whole-archive)
|
||||
else()
|
||||
target_link_libraries(feather monero-seed::monero-seed)
|
||||
target_link_libraries(wowlet monero-seed::monero-seed)
|
||||
endif()
|
||||
|
||||
target_link_libraries(feather
|
||||
target_link_libraries(wowlet
|
||||
wallet_merged
|
||||
${LMDB_LIBRARY}
|
||||
epee
|
||||
@@ -171,7 +179,6 @@ target_link_libraries(feather
|
||||
${SODIUM_LIBRARY}
|
||||
easylogging
|
||||
blockchain_db
|
||||
randomx
|
||||
hardforks
|
||||
${Boost_LIBRARIES}
|
||||
${OPENSSL_LIBRARIES}
|
||||
@@ -190,31 +197,39 @@ target_link_libraries(feather
|
||||
${QRENCODE_LIBRARY}
|
||||
)
|
||||
|
||||
if(APPLE)
|
||||
target_link_libraries(wowlet
|
||||
KDMacTouchBar
|
||||
)
|
||||
target_include_directories(wowlet
|
||||
PUBLIC ../contrib/KDMacTouchBar)
|
||||
endif()
|
||||
|
||||
if(NOT APPLE)
|
||||
target_link_libraries(feather
|
||||
target_link_libraries(wowlet
|
||||
Qt5::QSvgIconPlugin
|
||||
Qt5::QSvgPlugin
|
||||
)
|
||||
endif()
|
||||
|
||||
if(STATIC)
|
||||
target_link_libraries(feather
|
||||
target_link_libraries(wowlet
|
||||
Qt5::QSvgIconPlugin
|
||||
Qt5::QSvgPlugin)
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_libraries(feather
|
||||
target_link_libraries(wowlet
|
||||
Qt5::QXcbIntegrationPlugin)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(X11_FOUND)
|
||||
target_link_libraries(feather ${X11_LIBRARIES})
|
||||
target_link_libraries(wowlet ${X11_LIBRARIES})
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
include(Deploy)
|
||||
endif()
|
||||
|
||||
install(TARGETS feather
|
||||
install(TARGETS wowlet
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
@@ -1,34 +1,18 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020, The Monero Project.
|
||||
// Copyright (c) 2020-2021, The Monero Project.
|
||||
|
||||
#include <stdexcept>
|
||||
#include <QDir>
|
||||
#include <QStandardPaths>
|
||||
#include <QMessageBox>
|
||||
#include <QClipboard>
|
||||
#include <QDesktopWidget>
|
||||
|
||||
#include "appcontext.h"
|
||||
#include "utils/tails.h"
|
||||
#include "utils/whonix.h"
|
||||
#include "utils/utils.h"
|
||||
#include "utils/prices.h"
|
||||
#include "utils/networktype.h"
|
||||
#include "utils/wsclient.h"
|
||||
#include "globals.h"
|
||||
|
||||
// libwalletqt
|
||||
#include "libwalletqt/WalletManager.h"
|
||||
#include "libwalletqt/Wallet.h"
|
||||
#include "libwalletqt/TransactionHistory.h"
|
||||
#include "libwalletqt/SubaddressAccount.h"
|
||||
#include "libwalletqt/Subaddress.h"
|
||||
#include "libwalletqt/Coins.h"
|
||||
#include "model/TransactionHistoryModel.h"
|
||||
#include "model/SubaddressAccountModel.h"
|
||||
#include "model/SubaddressModel.h"
|
||||
#include "utils/keysfiles.h"
|
||||
#include "utils/networktype.h"
|
||||
#include "utils/config.h"
|
||||
|
||||
|
||||
Prices *AppContext::prices = nullptr;
|
||||
@@ -36,6 +20,7 @@ WalletKeysFilesModel *AppContext::wallets = nullptr;
|
||||
TxFiatHistory *AppContext::txFiatHistory = nullptr;
|
||||
double AppContext::balance = 0;
|
||||
QMap<QString, QString> AppContext::txDescriptionCache;
|
||||
QMap<QString, QString> AppContext::txCache;
|
||||
|
||||
AppContext::AppContext(QCommandLineParser *cmdargs) {
|
||||
this->network = new QNetworkAccessManager();
|
||||
@@ -60,11 +45,11 @@ AppContext::AppContext(QCommandLineParser *cmdargs) {
|
||||
QString appImagePath = qgetenv("APPIMAGE");
|
||||
if (appImagePath.isEmpty()) {
|
||||
qDebug() << "Not an appimage, using currentPath()";
|
||||
return QDir::currentPath() + "/.feather";
|
||||
return QDir::currentPath() + "/.wowlet";
|
||||
}
|
||||
|
||||
QFileInfo appImageDir(appImagePath);
|
||||
return appImageDir.absoluteDir().path() + "/.feather";
|
||||
return appImageDir.absoluteDir().path() + "/.wowlet";
|
||||
}();
|
||||
|
||||
|
||||
@@ -78,53 +63,54 @@ AppContext::AppContext(QCommandLineParser *cmdargs) {
|
||||
this->accountName = Utils::getUnixAccountName();
|
||||
this->homeDir = QDir::homePath();
|
||||
|
||||
QString walletDir = config()->get(Config::walletDirectory).toString();
|
||||
if (walletDir.isEmpty()) {
|
||||
#if defined(Q_OS_LINUX) or defined(Q_OS_MAC)
|
||||
this->defaultWalletDir = QString("%1/Monero/wallets").arg(this->configRoot);
|
||||
this->defaultWalletDirRoot = QString("%1/Monero").arg(this->configRoot);
|
||||
this->defaultWalletDir = QString("%1/Wownero/wallets").arg(this->configRoot);
|
||||
this->defaultWalletDirRoot = QString("%1/Wownero").arg(this->configRoot);
|
||||
#elif defined(Q_OS_WIN)
|
||||
this->defaultWalletDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/Monero";
|
||||
this->defaultWalletDirRoot = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
|
||||
this->defaultWalletDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/Wownero";
|
||||
this->defaultWalletDirRoot = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
|
||||
#endif
|
||||
} else {
|
||||
this->defaultWalletDir = walletDir;
|
||||
this->defaultWalletDirRoot = walletDir;
|
||||
}
|
||||
|
||||
// Create wallet dirs
|
||||
if (!QDir().mkpath(defaultWalletDir))
|
||||
qCritical() << "Unable to create dir: " << defaultWalletDir;
|
||||
|
||||
this->configDirectory = QString("%1/.config/feather/").arg(this->configRoot);
|
||||
this->configDirectory = QString("%1/.config/wowlet/").arg(this->configRoot);
|
||||
#if defined(Q_OS_UNIX)
|
||||
if(!this->configDirectory.endsWith('/'))
|
||||
this->configDirectory = QString("%1/").arg(this->configDirectory);
|
||||
#endif
|
||||
this->sorry();
|
||||
|
||||
// Config
|
||||
createConfigDirectory(this->configDirectory);
|
||||
|
||||
if(this->cmdargs->isSet("stagenet"))
|
||||
this->networkType = NetworkType::STAGENET;
|
||||
else if(this->cmdargs->isSet("testnet"))
|
||||
this->networkType = NetworkType::TESTNET;
|
||||
else
|
||||
this->networkType = NetworkType::MAINNET;
|
||||
// if(this->cmdargs->isSet("stagenet"))
|
||||
// this->networkType = NetworkType::STAGENET;
|
||||
// else if(this->cmdargs->isSet("testnet"))
|
||||
// this->networkType = NetworkType::TESTNET;
|
||||
// else
|
||||
this->networkType = NetworkType::MAINNET;
|
||||
|
||||
// auto nodeSourceUInt = config()->get(Config::nodeSource).toUInt();
|
||||
// AppContext::nodeSource = static_cast<NodeSource>(nodeSourceUInt);
|
||||
this->nodes = new Nodes(this, this->networkClearnet);
|
||||
connect(this, &AppContext::nodeSourceChanged, this->nodes, &Nodes::onNodeSourceChanged);
|
||||
connect(this, &AppContext::setCustomNodes, this->nodes, &Nodes::setCustomNodes);
|
||||
connect(this, &AppContext::walletClosing, this->nodes, &Nodes::onWalletClosing);
|
||||
|
||||
// Tor & socks proxy
|
||||
this->ws = new WSClient(this, m_wsUrl);
|
||||
connect(this->ws, &WSClient::WSMessage, this, &AppContext::onWSMessage);
|
||||
|
||||
// timers
|
||||
m_storeTimer->setSingleShot(true);
|
||||
connect(this->m_storeTimer, &QTimer::timeout, [this](){
|
||||
if (!this->currentWallet)
|
||||
return;
|
||||
qDebug() << "Storing wallet";
|
||||
this->currentWallet->store();
|
||||
// Store the wallet every 2 minutes
|
||||
m_storeTimer.start(2 * 60 * 1000);
|
||||
connect(&m_storeTimer, &QTimer::timeout, [this](){
|
||||
this->storeWallet();
|
||||
});
|
||||
|
||||
// restore height lookup
|
||||
@@ -134,11 +120,11 @@ AppContext::AppContext(QCommandLineParser *cmdargs) {
|
||||
auto genesis_timestamp = this->restoreHeights[NetworkType::Type::MAINNET]->data.firstKey();
|
||||
AppContext::txFiatHistory = new TxFiatHistory(genesis_timestamp, this->configDirectory);
|
||||
connect(this->ws, &WSClient::connectionEstablished, AppContext::txFiatHistory, &TxFiatHistory::onUpdateDatabase);
|
||||
connect(AppContext::txFiatHistory, &TxFiatHistory::requestYear, [=](unsigned int year){
|
||||
connect(AppContext::txFiatHistory, &TxFiatHistory::requestYear, [=](int year){
|
||||
QByteArray data = QString(R"({"cmd": "txFiatHistory", "data": {"year": %1}})").arg(year).toUtf8();
|
||||
this->ws->sendMsg(data);
|
||||
});
|
||||
connect(AppContext::txFiatHistory, &TxFiatHistory::requestYearMonth, [=](unsigned int year, unsigned int month) {
|
||||
connect(AppContext::txFiatHistory, &TxFiatHistory::requestYearMonth, [=](int year, int month) {
|
||||
QByteArray data = QString(R"({"cmd": "txFiatHistory", "data": {"year": %1, "month": %2}})").arg(year).arg(month).toUtf8();
|
||||
this->ws->sendMsg(data);
|
||||
});
|
||||
@@ -146,9 +132,10 @@ AppContext::AppContext(QCommandLineParser *cmdargs) {
|
||||
// fiat/crypto lookup
|
||||
AppContext::prices = new Prices();
|
||||
|
||||
// xmr.to
|
||||
#if defined(XMRTO)
|
||||
this->XMRTo = new XmrTo(this);
|
||||
// XMRig
|
||||
#ifdef HAS_XMRIG
|
||||
this->XMRig = new XmRig(this->configDirectory, this);
|
||||
this->XMRig->prepare();
|
||||
#endif
|
||||
|
||||
this->walletManager = WalletManager::instance();
|
||||
@@ -173,22 +160,21 @@ void AppContext::initTor() {
|
||||
this->tor = new Tor(this, this);
|
||||
this->tor->start();
|
||||
|
||||
if (!(isTails || isWhonix)) {
|
||||
auto networkProxy = new QNetworkProxy(QNetworkProxy::Socks5Proxy, Tor::torHost, Tor::torPort);
|
||||
if (!(isWhonix)) {
|
||||
this->networkProxy = new QNetworkProxy(QNetworkProxy::Socks5Proxy, Tor::torHost, Tor::torPort);
|
||||
this->network->setProxy(*networkProxy);
|
||||
if (m_wsUrl.host().endsWith(".onion"))
|
||||
this->ws->webSocket.setProxy(*networkProxy);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void AppContext::initWS() {
|
||||
this->ws->start();
|
||||
}
|
||||
|
||||
void AppContext::onCancelTransaction(PendingTransaction *tx, const QString &address) {
|
||||
void AppContext::onCancelTransaction(PendingTransaction *tx, const QVector<QString> &address) {
|
||||
// tx cancelled by user
|
||||
double amount = tx->amount() / AppContext::cdiv;
|
||||
double amount = tx->amount() / globals::cdiv;
|
||||
emit createTransactionCancelled(address, amount);
|
||||
this->currentWallet->disposeTransaction(tx);
|
||||
}
|
||||
@@ -207,13 +193,7 @@ void AppContext::onSweepOutput(const QString &keyImage, QString address, bool ch
|
||||
this->currentWallet->createTransactionSingleAsync(keyImage, address, outputs, this->tx_priority);
|
||||
}
|
||||
|
||||
void AppContext::onCreateTransaction(XmrToOrder *order) {
|
||||
// tx creation via xmr.to
|
||||
const QString description = QString("XmrTo order %1").arg(order->uuid);
|
||||
this->onCreateTransaction(order->receiving_subaddress, order->incoming_amount_total, description, false);
|
||||
}
|
||||
|
||||
void AppContext::onCreateTransaction(const QString &address, const double amount, const QString &description, bool all) {
|
||||
void AppContext::onCreateTransaction(const QString &address, quint64 amount, const QString &description, bool all) {
|
||||
// tx creation
|
||||
this->tmpTxDescription = description;
|
||||
|
||||
@@ -222,13 +202,13 @@ void AppContext::onCreateTransaction(const QString &address, const double amount
|
||||
return;
|
||||
}
|
||||
|
||||
if (!all && amount <= 0) {
|
||||
if (!all && amount == 0) {
|
||||
emit createTransactionError("Cannot send nothing");
|
||||
return;
|
||||
}
|
||||
|
||||
auto balance = this->currentWallet->balance() / AppContext::cdiv;
|
||||
auto unlocked_balance = this->currentWallet->unlockedBalance() / AppContext::cdiv;
|
||||
auto balance = this->currentWallet->balance();
|
||||
auto unlocked_balance = this->currentWallet->unlockedBalance();
|
||||
if(!all && amount > unlocked_balance) {
|
||||
emit createTransactionError("Not enough money to spend");
|
||||
return;
|
||||
@@ -237,12 +217,35 @@ void AppContext::onCreateTransaction(const QString &address, const double amount
|
||||
return;
|
||||
}
|
||||
|
||||
auto amount_num = static_cast<quint64>(amount * AppContext::cdiv);
|
||||
qDebug() << "creating tx";
|
||||
if(all || amount == balance)
|
||||
if (all)
|
||||
this->currentWallet->createTransactionAllAsync(address, "", this->tx_mixin, this->tx_priority);
|
||||
else
|
||||
this->currentWallet->createTransactionAsync(address, "", amount_num, this->tx_mixin, this->tx_priority);
|
||||
this->currentWallet->createTransactionAsync(address, "", amount, this->tx_mixin, this->tx_priority);
|
||||
|
||||
emit initiateTransaction();
|
||||
}
|
||||
|
||||
void AppContext::onCreateTransactionMultiDest(const QVector<QString> &addresses, const QVector<quint64> &amounts, const QString &description) {
|
||||
this->tmpTxDescription = description;
|
||||
|
||||
if (this->currentWallet == nullptr) {
|
||||
emit createTransactionError("Cannot create transaction; no wallet loaded");
|
||||
return;
|
||||
}
|
||||
|
||||
quint64 total_amount = 0;
|
||||
for (auto &amount : amounts) {
|
||||
total_amount += amount;
|
||||
}
|
||||
|
||||
auto unlocked_balance = this->currentWallet->unlockedBalance();
|
||||
if (total_amount > unlocked_balance) {
|
||||
emit createTransactionError("Not enough money to spend");
|
||||
}
|
||||
|
||||
qDebug() << "Creating tx";
|
||||
this->currentWallet->createTransactionMultiDestAsync(addresses, amounts, this->tx_priority);
|
||||
|
||||
emit initiateTransaction();
|
||||
}
|
||||
@@ -252,16 +255,21 @@ void AppContext::onCreateTransactionError(const QString &msg) {
|
||||
emit endTransaction();
|
||||
}
|
||||
|
||||
void AppContext::walletClose(bool emitClosedSignal) {
|
||||
this->nodes->stopTimer();
|
||||
if(this->currentWallet == nullptr) return;
|
||||
emit walletClosing();
|
||||
//ctx->currentWallet->store(); @TODO: uncomment to store on wallet close
|
||||
void AppContext::closeWallet(bool emitClosedSignal, bool storeWallet) {
|
||||
if (this->currentWallet == nullptr)
|
||||
return;
|
||||
|
||||
emit walletAboutToClose();
|
||||
|
||||
if (storeWallet) {
|
||||
this->storeWallet();
|
||||
}
|
||||
|
||||
this->currentWallet->disconnect();
|
||||
this->walletManager->closeWallet();
|
||||
if(this->currentWallet != nullptr)
|
||||
this->currentWallet = nullptr;
|
||||
if(emitClosedSignal)
|
||||
this->currentWallet = nullptr;
|
||||
|
||||
if (emitClosedSignal)
|
||||
emit walletClosed();
|
||||
}
|
||||
|
||||
@@ -276,6 +284,10 @@ void AppContext::onOpenWallet(const QString &path, const QString &password){
|
||||
return;
|
||||
}
|
||||
|
||||
if (password.isEmpty()) {
|
||||
this->walletPassword = "";
|
||||
}
|
||||
|
||||
config()->set(Config::firstRun, false);
|
||||
|
||||
this->walletPath = path;
|
||||
@@ -286,7 +298,6 @@ void AppContext::onPreferredFiatCurrencyChanged(const QString &symbol) {
|
||||
if(this->currentWallet) {
|
||||
auto *model = this->currentWallet->transactionHistoryModel();
|
||||
if(model != nullptr) {
|
||||
model->preferredFiatSign = AppContext::prices->fiat[symbol];
|
||||
model->preferredFiatSymbol = symbol;
|
||||
}
|
||||
}
|
||||
@@ -299,24 +310,26 @@ void AppContext::onWalletOpened(Wallet *wallet) {
|
||||
if(errMsg == QString("basic_string::_M_replace_aux") || errMsg == QString("std::bad_alloc")) {
|
||||
qCritical() << errMsg;
|
||||
this->walletManager->clearWalletCache(this->walletPath);
|
||||
errMsg = QString("%1\n\nAttempted to clean wallet cache. Please restart Feather.").arg(errMsg);
|
||||
this->walletClose(false);
|
||||
errMsg = QString("%1\n\nAttempted to clean wallet cache. Please restart WOWlet.").arg(errMsg);
|
||||
this->closeWallet(false);
|
||||
emit walletOpenedError(errMsg);
|
||||
} else if(errMsg.contains("wallet cannot be opened as")) {
|
||||
this->walletClose(false);
|
||||
this->closeWallet(false);
|
||||
emit walletOpenedError(errMsg);
|
||||
} else if(errMsg.contains("is opened by another wallet program")) {
|
||||
this->walletClose(false);
|
||||
this->closeWallet(false);
|
||||
emit walletOpenedError(errMsg);
|
||||
} else {
|
||||
this->walletClose(false);
|
||||
emit walletOpenPasswordNeeded(this->walletPassword.isEmpty());
|
||||
this->closeWallet(false);
|
||||
emit walletOpenPasswordNeeded(!this->walletPassword.isEmpty(), wallet->path());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
this->refreshed = false;
|
||||
this->currentWallet = wallet;
|
||||
this->walletPath = this->currentWallet->path() + ".keys";
|
||||
this->walletViewOnly = this->currentWallet->viewOnly();
|
||||
config()->set(Config::walletPath, this->walletPath);
|
||||
|
||||
connect(this->currentWallet, &Wallet::moneySpent, this, &AppContext::onMoneySpent);
|
||||
@@ -328,11 +341,13 @@ void AppContext::onWalletOpened(Wallet *wallet) {
|
||||
connect(this->currentWallet, &Wallet::transactionCommitted, this, &AppContext::onTransactionCommitted);
|
||||
connect(this->currentWallet, &Wallet::heightRefreshed, this, &AppContext::onHeightRefreshed);
|
||||
connect(this->currentWallet, &Wallet::transactionCreated, this, &AppContext::onTransactionCreated);
|
||||
connect(this->currentWallet, &Wallet::connectionStatusChanged, this, &AppContext::onConnectionStatusChanged);
|
||||
|
||||
this->nodes->connectToNode();
|
||||
|
||||
emit walletOpened();
|
||||
|
||||
connect(this->currentWallet, &Wallet::connectionStatusChanged, [this]{
|
||||
this->nodes->autoConnect();
|
||||
});
|
||||
this->nodes->connectToNode();
|
||||
this->updateBalance();
|
||||
|
||||
#ifdef DONATE_BEG
|
||||
@@ -341,6 +356,18 @@ void AppContext::onWalletOpened(Wallet *wallet) {
|
||||
|
||||
// force trigger preferredFiat signal for history model
|
||||
this->onPreferredFiatCurrencyChanged(config()->get(Config::preferredFiatCurrency).toString());
|
||||
this->setWindowTitle();
|
||||
}
|
||||
|
||||
void AppContext::setWindowTitle(bool mining) {
|
||||
QFileInfo fileInfo(this->walletPath);
|
||||
auto title = QString("WOWlet - [%1]").arg(fileInfo.fileName());
|
||||
if(this->walletViewOnly)
|
||||
title += " [view-only]";
|
||||
if(mining)
|
||||
title += " [mining]";
|
||||
|
||||
emit setTitle(title);
|
||||
}
|
||||
|
||||
void AppContext::onWSMessage(const QJsonObject &msg) {
|
||||
@@ -353,22 +380,22 @@ void AppContext::onWSMessage(const QJsonObject &msg) {
|
||||
auto changed = false;
|
||||
|
||||
if(!this->heights.contains("mainnet")) {
|
||||
this->heights["mainnet"] = (unsigned int) mainnet;
|
||||
this->heights["mainnet"] = mainnet;
|
||||
changed = true;
|
||||
}
|
||||
else {
|
||||
if (mainnet > this->heights["mainnet"]) {
|
||||
this->heights["mainnet"] = (unsigned int) mainnet;
|
||||
this->heights["mainnet"] = mainnet;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
if(!this->heights.contains("stagenet")) {
|
||||
this->heights["stagenet"] = (unsigned int) stagenet;
|
||||
this->heights["stagenet"] = stagenet;
|
||||
changed = true;
|
||||
}
|
||||
else {
|
||||
if (stagenet > this->heights["stagenet"]) {
|
||||
this->heights["stagenet"] = (unsigned int) stagenet;
|
||||
this->heights["stagenet"] = stagenet;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
@@ -380,7 +407,11 @@ void AppContext::onWSMessage(const QJsonObject &msg) {
|
||||
else if(cmd == "nodes") {
|
||||
this->onWSNodes(msg.value("data").toArray());
|
||||
}
|
||||
|
||||
#if defined(HAS_XMRIG)
|
||||
else if(cmd == "xmrig") {
|
||||
this->XMRigDownloads(msg.value("data").toObject());
|
||||
}
|
||||
#endif
|
||||
else if(cmd == "crypto_rates") {
|
||||
QJsonArray crypto_rates = msg.value("data").toArray();
|
||||
AppContext::prices->cryptoPricesReceived(crypto_rates);
|
||||
@@ -390,22 +421,21 @@ void AppContext::onWSMessage(const QJsonObject &msg) {
|
||||
QJsonObject fiat_rates = msg.value("data").toObject();
|
||||
AppContext::prices->fiatPricesReceived(fiat_rates);
|
||||
}
|
||||
#if defined(XMRTO)
|
||||
else if(cmd == "xmrto_rates") {
|
||||
auto xmr_rates = msg.value("data").toObject();
|
||||
this->XMRTo->onRatesReceived(xmr_rates);
|
||||
}
|
||||
#endif
|
||||
else if(cmd == "reddit") {
|
||||
QJsonArray reddit_data = msg.value("data").toArray();
|
||||
this->onWSReddit(reddit_data);
|
||||
}
|
||||
|
||||
else if(cmd == "ccs") {
|
||||
else if(cmd == "wfs") {
|
||||
auto ccs_data = msg.value("data").toArray();
|
||||
this->onWSCCS(ccs_data);
|
||||
}
|
||||
|
||||
else if(cmd == "suchwow") {
|
||||
QJsonArray such_data = msg.value("data").toArray();
|
||||
emit suchWowUpdated(such_data);
|
||||
}
|
||||
|
||||
else if(cmd == "txFiatHistory") {
|
||||
auto txFiatHistory_data = msg.value("data").toObject();
|
||||
AppContext::txFiatHistory->onWSData(txFiatHistory_data);
|
||||
@@ -434,7 +464,8 @@ void AppContext::onWSNodes(const QJsonArray &nodes) {
|
||||
|
||||
auto node = new FeatherNode(
|
||||
obj.value("address").toString(),
|
||||
(unsigned int)obj.value("height").toInt(),
|
||||
obj.value("height").toInt(),
|
||||
obj.value("target_height").toInt(),
|
||||
obj.value("online").toBool());
|
||||
QSharedPointer<FeatherNode> r = QSharedPointer<FeatherNode>(node);
|
||||
l.append(r);
|
||||
@@ -450,7 +481,7 @@ void AppContext::onWSReddit(const QJsonArray& reddit_data) {
|
||||
auto redditPost = new RedditPost(
|
||||
obj.value("title").toString(),
|
||||
obj.value("author").toString(),
|
||||
obj.value("url").toString(),
|
||||
obj.value("permalink").toString(),
|
||||
obj.value("comments").toInt());
|
||||
QSharedPointer<RedditPost> r = QSharedPointer<RedditPost>(redditPost);
|
||||
l.append(r);
|
||||
@@ -487,38 +518,20 @@ void AppContext::onWSCCS(const QJsonArray &ccs_data) {
|
||||
l.append(c);
|
||||
}
|
||||
|
||||
if(l.count() == 0)
|
||||
emit ccsEmpty();
|
||||
|
||||
emit ccsUpdated(l);
|
||||
}
|
||||
|
||||
void AppContext::createConfigDirectory(const QString &dir) {
|
||||
if(!Utils::dirExists(dir)) {
|
||||
qDebug() << QString("Creating directory: %1").arg(dir);
|
||||
if(!QDir().mkpath(dir))
|
||||
throw std::runtime_error("Could not create directory " + dir.toStdString());
|
||||
}
|
||||
|
||||
QString config_dir_tor = QString("%1%2").arg(dir).arg("tor");
|
||||
if(!Utils::dirExists(config_dir_tor)) {
|
||||
qDebug() << QString("Creating directory: %1").arg(config_dir_tor);
|
||||
if (!QDir().mkpath(config_dir_tor))
|
||||
throw std::runtime_error("Could not create directory " + config_dir_tor.toStdString());
|
||||
}
|
||||
|
||||
QString config_dir_tordata = QString("%1%2").arg(dir).arg("tor/data");
|
||||
if(!Utils::dirExists(config_dir_tordata)) {
|
||||
qDebug() << QString("Creating directory: %1").arg(config_dir_tordata);
|
||||
if (!QDir().mkpath(config_dir_tordata))
|
||||
throw std::runtime_error("Could not create directory " + config_dir_tordata.toStdString());
|
||||
}
|
||||
|
||||
QString config_dir_torsocks = QString("%1%2").arg(dir).arg("torsocks");
|
||||
if(!Utils::dirExists(config_dir_torsocks)) {
|
||||
qDebug() << QString("Creating directory: %1").arg(config_dir_torsocks);
|
||||
if (!QDir().mkpath(config_dir_torsocks))
|
||||
throw std::runtime_error("Could not create directory " + config_dir_torsocks.toStdString());
|
||||
QStringList createDirs({dir, config_dir_tor, config_dir_tordata});
|
||||
for(const auto &d: createDirs) {
|
||||
if(!Utils::dirExists(d)) {
|
||||
qDebug() << QString("Creating directory: %1").arg(d);
|
||||
if (!QDir().mkpath(d))
|
||||
throw std::runtime_error("Could not create directory " + d.toStdString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -530,12 +543,63 @@ void AppContext::createWallet(FeatherSeed seed, const QString &path, const QStri
|
||||
return;
|
||||
}
|
||||
|
||||
this->currentWallet = seed.writeWallet(this->walletManager, this->networkType, path, password, this->kdfRounds);
|
||||
if(seed.mnemonic.isEmpty()) {
|
||||
emit walletCreatedError("Mnemonic seed error. Failed to write wallet.");
|
||||
return;
|
||||
}
|
||||
|
||||
Wallet *wallet = nullptr;
|
||||
if (seed.seedType == SeedType::TEVADOR) {
|
||||
wallet = this->walletManager->createDeterministicWalletFromSpendKey(path, password, seed.language, this->networkType, seed.spendKey, seed.restoreHeight, this->kdfRounds);
|
||||
wallet->setCacheAttribute("feather.seed", seed.mnemonic.join(" "));
|
||||
}
|
||||
if (seed.seedType == SeedType::MONERO) {
|
||||
wallet = this->walletManager->recoveryWallet(path, password, seed.mnemonic.join(" "), "", this->networkType, seed.restoreHeight, this->kdfRounds);
|
||||
}
|
||||
|
||||
this->currentWallet = wallet;
|
||||
if(this->currentWallet == nullptr) {
|
||||
emit walletCreatedError("Failed to write wallet");
|
||||
return;
|
||||
}
|
||||
|
||||
this->createWalletFinish(password);
|
||||
}
|
||||
|
||||
void AppContext::createWalletViewOnly(const QString &path, const QString &password, const QString &address, const QString &viewkey, const QString &spendkey, quint64 restoreHeight) {
|
||||
if(Utils::fileExists(path)) {
|
||||
auto err = QString("Failed to write wallet to path: \"%1\"; file already exists.").arg(path);
|
||||
qCritical() << err;
|
||||
emit walletCreatedError(err);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!this->walletManager->addressValid(address, this->networkType)) {
|
||||
auto err = QString("Failed to create wallet. Invalid address provided.").arg(path);
|
||||
qCritical() << err;
|
||||
emit walletCreatedError(err);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!this->walletManager->keyValid(viewkey, address, true, this->networkType)) {
|
||||
auto err = QString("Failed to create wallet. Invalid viewkey provided.").arg(path);
|
||||
qCritical() << err;
|
||||
emit walletCreatedError(err);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!spendkey.isEmpty() && !this->walletManager->keyValid(spendkey, address, false, this->networkType)) {
|
||||
auto err = QString("Failed to create wallet. Invalid spendkey provided.").arg(path);
|
||||
qCritical() << err;
|
||||
emit walletCreatedError(err);
|
||||
return;
|
||||
}
|
||||
|
||||
this->currentWallet = this->walletManager->createWalletFromKeys(path, this->seedLanguage, this->networkType, address, viewkey, spendkey, restoreHeight);
|
||||
this->createWalletFinish(password);
|
||||
}
|
||||
|
||||
void AppContext::createWalletFinish(const QString &password) {
|
||||
this->currentWallet->setPassword(password);
|
||||
this->currentWallet->store();
|
||||
this->walletPassword = password;
|
||||
@@ -543,12 +607,12 @@ void AppContext::createWallet(FeatherSeed seed, const QString &path, const QStri
|
||||
}
|
||||
|
||||
void AppContext::initRestoreHeights() {
|
||||
restoreHeights[NetworkType::TESTNET] = new RestoreHeightLookup(NetworkType::TESTNET);
|
||||
restoreHeights[NetworkType::STAGENET] = RestoreHeightLookup::fromFile(":/assets/restore_heights_monero_stagenet.txt", NetworkType::STAGENET);
|
||||
restoreHeights[NetworkType::MAINNET] = RestoreHeightLookup::fromFile(":/assets/restore_heights_monero_mainnet.txt", NetworkType::MAINNET);
|
||||
restoreHeights[NetworkType::TESTNET] = RestoreHeightLookup::fromFile(":/assets/restore_heights_wownero_mainnet.txt", NetworkType::TESTNET);
|
||||
restoreHeights[NetworkType::STAGENET] = RestoreHeightLookup::fromFile(":/assets/restore_heights_wownero_mainnet.txt", NetworkType::STAGENET);
|
||||
restoreHeights[NetworkType::MAINNET] = RestoreHeightLookup::fromFile(":/assets/restore_heights_wownero_mainnet.txt", NetworkType::MAINNET);
|
||||
}
|
||||
|
||||
void AppContext::onSetRestoreHeight(unsigned int height){
|
||||
void AppContext::onSetRestoreHeight(quint64 height){
|
||||
auto seed = this->currentWallet->getCacheAttribute("feather.seed");
|
||||
if(!seed.isEmpty()) {
|
||||
const auto msg = "This wallet has a 14 word mnemonic seed which has the restore height embedded.";
|
||||
@@ -557,7 +621,7 @@ void AppContext::onSetRestoreHeight(unsigned int height){
|
||||
}
|
||||
|
||||
this->currentWallet->setWalletCreationHeight(height);
|
||||
this->currentWallet->setPassword(this->walletPassword); // trigger .keys write
|
||||
this->currentWallet->setPassword(this->currentWallet->getPassword()); // trigger .keys write
|
||||
|
||||
// nuke wallet cache
|
||||
const auto fn = this->currentWallet->path();
|
||||
@@ -609,8 +673,9 @@ void AppContext::onOpenAliasResolve(const QString &openAlias) {
|
||||
}
|
||||
|
||||
void AppContext::donateBeg() {
|
||||
if(this->networkType != NetworkType::Type::MAINNET)
|
||||
return;
|
||||
if(this->currentWallet == nullptr) return;
|
||||
if(this->networkType != NetworkType::Type::MAINNET) return;
|
||||
if(this->currentWallet->viewOnly()) return;
|
||||
|
||||
auto donationCounter = config()->get(Config::donateBeg).toInt();
|
||||
if(donationCounter == -1)
|
||||
@@ -622,39 +687,28 @@ void AppContext::donateBeg() {
|
||||
config()->set(Config::donateBeg, donationCounter);
|
||||
}
|
||||
|
||||
void AppContext::sorry() {
|
||||
auto msg = "Unable to start Feather, error code 0xd34db33f. If this problem "
|
||||
"persists, please contact Technical Support.";
|
||||
QStringList paths = {"C:\\ProgramData\\ryo", this->homeDir + "/.ryo"};
|
||||
for(const QString &ryo: paths)
|
||||
if(Utils::dirExists(ryo))
|
||||
throw std::runtime_error(msg);
|
||||
}
|
||||
|
||||
AppContext::~AppContext() {
|
||||
this->walletClose(false);
|
||||
}
|
||||
AppContext::~AppContext() {}
|
||||
|
||||
// ############################################## LIBWALLET QT #########################################################
|
||||
|
||||
void AppContext::onMoneySpent(const QString &txId, quint64 amount) {
|
||||
auto amount_num = amount / AppContext::cdiv;
|
||||
auto amount_num = amount / globals::cdiv;
|
||||
qDebug() << Q_FUNC_INFO << txId << " " << QString::number(amount_num);
|
||||
}
|
||||
|
||||
void AppContext::onMoneyReceived(const QString &txId, quint64 amount) {
|
||||
// Incoming tx included in a block.
|
||||
auto amount_num = amount / AppContext::cdiv;
|
||||
auto amount_num = amount / globals::cdiv;
|
||||
qDebug() << Q_FUNC_INFO << txId << " " << QString::number(amount_num);
|
||||
}
|
||||
|
||||
void AppContext::onUnconfirmedMoneyReceived(const QString &txId, quint64 amount) {
|
||||
// Incoming transaction in pool
|
||||
auto amount_num = amount / AppContext::cdiv;
|
||||
auto amount_num = amount / globals::cdiv;
|
||||
qDebug() << Q_FUNC_INFO << txId << " " << QString::number(amount_num);
|
||||
|
||||
if(this->currentWallet->synchronized()) {
|
||||
auto notify = QString("%1 XMR (pending)").arg(amount_num);
|
||||
auto notify = QString("%1 WOW (pending)").arg(amount_num);
|
||||
Utils::desktopNotify("Payment received", notify, 5000);
|
||||
}
|
||||
}
|
||||
@@ -662,19 +716,23 @@ void AppContext::onUnconfirmedMoneyReceived(const QString &txId, quint64 amount)
|
||||
void AppContext::onWalletUpdate() {
|
||||
if (this->currentWallet->synchronized()) {
|
||||
this->refreshModels();
|
||||
this->storeWallet();
|
||||
}
|
||||
|
||||
this->updateBalance();
|
||||
this->storeWallet();
|
||||
}
|
||||
|
||||
void AppContext::onWalletRefreshed() {
|
||||
void AppContext::onWalletRefreshed(bool success) {
|
||||
if (!this->refreshed) {
|
||||
refreshModels();
|
||||
this->refreshed = true;
|
||||
this->storeWallet();
|
||||
emit walletRefreshed();
|
||||
// store wallet immediately upon finishing synchronization
|
||||
this->currentWallet->store();
|
||||
}
|
||||
|
||||
qDebug() << "Wallet refresh status: " << success;
|
||||
|
||||
this->currentWallet->refreshHeightAsync();
|
||||
}
|
||||
|
||||
@@ -691,7 +749,7 @@ void AppContext::onWalletNewBlock(quint64 blockheight, quint64 targetHeight) {
|
||||
void AppContext::onHeightRefreshed(quint64 walletHeight, quint64 daemonHeight, quint64 targetHeight) {
|
||||
qDebug() << Q_FUNC_INFO << walletHeight << daemonHeight << targetHeight;
|
||||
|
||||
if (!this->currentWallet->connected())
|
||||
if (this->currentWallet->connectionStatus() == Wallet::ConnectionStatus_Disconnected)
|
||||
return;
|
||||
|
||||
if (daemonHeight < targetHeight) {
|
||||
@@ -702,50 +760,56 @@ void AppContext::onHeightRefreshed(quint64 walletHeight, quint64 daemonHeight, q
|
||||
}
|
||||
}
|
||||
|
||||
void AppContext::onTransactionCreated(PendingTransaction *tx, const QString &address, const QString &paymentId, quint32 mixin) {
|
||||
if(address == this->featherDonationAddress)
|
||||
this->featherDonationSending = true;
|
||||
void AppContext::onTransactionCreated(PendingTransaction *tx, const QVector<QString> &address) {
|
||||
for (auto &addr : address) {
|
||||
if (addr == this->donationAddress) {
|
||||
this->donationSending = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Let UI know that the transaction was constructed
|
||||
emit endTransaction();
|
||||
|
||||
// tx created, but not sent yet. ask user to verify first.
|
||||
emit createTransactionSuccess(tx, address, mixin);
|
||||
emit endTransaction();
|
||||
emit createTransactionSuccess(tx, address);
|
||||
}
|
||||
|
||||
void AppContext::onTransactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid){
|
||||
this->currentWallet->history()->refresh(this->currentWallet->currentSubaddressAccount());
|
||||
this->currentWallet->coins()->refresh(this->currentWallet->currentSubaddressAccount());
|
||||
this->storeWallet();
|
||||
|
||||
// Store wallet immediately so we don't risk losing tx key if wallet crashes
|
||||
this->currentWallet->store();
|
||||
|
||||
this->updateBalance();
|
||||
|
||||
emit transactionCommitted(status, tx, txid);
|
||||
|
||||
// this tx was a donation to Feather, stop our nagging
|
||||
if(this->featherDonationSending) {
|
||||
this->featherDonationSending = false;
|
||||
if(this->donationSending) {
|
||||
this->donationSending = false;
|
||||
config()->set(Config::donateBeg, -1);
|
||||
}
|
||||
}
|
||||
|
||||
void AppContext::onConnectionStatusChanged(int status) {
|
||||
|
||||
}
|
||||
|
||||
void AppContext::storeWallet() {
|
||||
if (m_storeTimer->isActive())
|
||||
// Do not store a synchronizing wallet: store() is NOT thread safe and may crash the wallet
|
||||
if (this->currentWallet == nullptr || !this->currentWallet->synchronized())
|
||||
return;
|
||||
|
||||
m_storeTimer->start(60000);
|
||||
qDebug() << "Storing wallet";
|
||||
this->currentWallet->store();
|
||||
}
|
||||
|
||||
void AppContext::updateBalance() {
|
||||
if(!this->currentWallet)
|
||||
throw std::runtime_error("this should not happen, ever");
|
||||
if (!this->currentWallet)
|
||||
return;
|
||||
|
||||
AppContext::balance = this->currentWallet->balance() / AppContext::cdiv;
|
||||
auto balance_str = QString::number(balance);
|
||||
quint64 balance_u = this->currentWallet->balance();
|
||||
AppContext::balance = balance_u / globals::cdiv;
|
||||
double spendable = this->currentWallet->unlockedBalance();
|
||||
|
||||
double unlocked = this->currentWallet->unlockedBalance() / AppContext::cdiv;
|
||||
auto unlocked_str = QString::number(unlocked);
|
||||
|
||||
emit balanceUpdated(balance, unlocked, balance_str, unlocked_str);
|
||||
emit balanceUpdated(balance_u, spendable);
|
||||
}
|
||||
|
||||
void AppContext::syncStatusUpdated(quint64 height, quint64 target) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020, The Monero Project.
|
||||
// Copyright (c) 2020-2021, The Monero Project.
|
||||
|
||||
#ifndef FEATHER_APPCONTEXT_H
|
||||
#define FEATHER_APPCONTEXT_H
|
||||
@@ -10,15 +10,17 @@
|
||||
#include <QTimer>
|
||||
|
||||
#include "utils/tails.h"
|
||||
#include "utils/whonix.h"
|
||||
#include "utils/prices.h"
|
||||
#include "utils/networking.h"
|
||||
#include "utils/tor.h"
|
||||
#include "utils/xmrto.h"
|
||||
#include "utils/xmrig.h"
|
||||
#include "utils/wsclient.h"
|
||||
#include "utils/txfiathistory.h"
|
||||
#include "utils/FeatherSeed.h"
|
||||
#include "widgets/RedditPost.h"
|
||||
#include "widgets/CCSEntry.h"
|
||||
#include "utils/seeds.h"
|
||||
#include "utils/RestoreHeightLookup.h"
|
||||
#include "utils/nodes.h"
|
||||
|
||||
#include "libwalletqt/WalletManager.h"
|
||||
@@ -34,17 +36,19 @@ Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AppContext(QCommandLineParser *cmdargs);
|
||||
~AppContext();
|
||||
~AppContext() override;
|
||||
bool isTails = false;
|
||||
bool isWhonix = false;
|
||||
bool isDebug = false;
|
||||
const QString featherDonationAddress = "47ntfT2Z5384zku39pTM6hGcnLnvpRYW2Azm87GiAAH2bcTidtq278TL6HmwyL8yjMeERqGEBs3cqC8vvHPJd1cWQrGC65f";
|
||||
const int featherDonationAmount = 50; // euro
|
||||
bool featherDonationSending = false;
|
||||
|
||||
// Donation config
|
||||
const QString donationAddress = "Wo3MWeKwtA918DU4c69hVSNgejdWFCRCuWjShRY66mJkU2Hv58eygJWDJS1MNa2Ge5M1WjUkGHuLqHkweDxwZZU42d16v94mP";
|
||||
const int donationAmount = 25; // euro
|
||||
bool donationSending = false;
|
||||
|
||||
QCommandLineParser *cmdargs;
|
||||
|
||||
QString coinName = "monero";
|
||||
QString coinName = "wownero";
|
||||
bool isTorSocks = false;
|
||||
QString homeDir;
|
||||
QString accountName;
|
||||
@@ -56,58 +60,64 @@ public:
|
||||
|
||||
QString walletPath;
|
||||
QString walletPassword = "";
|
||||
bool walletViewOnly = false;
|
||||
NetworkType::Type networkType;
|
||||
|
||||
QString applicationPath;
|
||||
|
||||
static void createConfigDirectory(const QString &dir) ;
|
||||
|
||||
QMap<QString, unsigned int> heights;
|
||||
QMap<QString, int> heights;
|
||||
QMap<NetworkType::Type, RestoreHeightLookup*> restoreHeights;
|
||||
const unsigned int kdfRounds = 1;
|
||||
const quint64 kdfRounds = 1;
|
||||
PendingTransaction::Priority tx_priority = PendingTransaction::Priority::Priority_Low;
|
||||
quint32 tx_mixin = static_cast<const quint32 &>(10);
|
||||
static constexpr const double cdiv = 1e12;
|
||||
QString seedLanguage = "English"; // 14 word `monero-seed` only has English
|
||||
|
||||
QNetworkAccessManager *network;
|
||||
QNetworkAccessManager *networkClearnet;
|
||||
QNetworkProxy *networkProxy;
|
||||
QNetworkProxy *networkProxy{};
|
||||
|
||||
Tor *tor;
|
||||
Tor *tor{};
|
||||
WSClient *ws;
|
||||
XmrTo *XMRTo;
|
||||
XmRig *XMRig;
|
||||
Nodes *nodes;
|
||||
static Prices *prices;
|
||||
static WalletKeysFilesModel *wallets;
|
||||
static double balance;
|
||||
static QMap<QString, QString> txDescriptionCache;
|
||||
static QMap<QString, QString> txCache;
|
||||
static TxFiatHistory *txFiatHistory;
|
||||
|
||||
// libwalletqt
|
||||
unsigned int blockHeight = 0;
|
||||
bool refreshed = false;
|
||||
WalletManager *walletManager;
|
||||
Wallet *currentWallet = nullptr;
|
||||
void createWallet(FeatherSeed seed, const QString &path, const QString &password);
|
||||
void createWalletViewOnly(const QString &path, const QString &password, const QString &address, const QString &viewkey, const QString &spendkey, quint64 restoreHeight);
|
||||
void createWalletFinish(const QString &password);
|
||||
void syncStatusUpdated(quint64 height, quint64 target);
|
||||
void updateBalance();
|
||||
void initTor();
|
||||
void initRestoreHeights();
|
||||
void initWS();
|
||||
void donateBeg();
|
||||
void walletClose(bool emitClosedSignal = true);
|
||||
void storeWallet();
|
||||
void refreshModels();
|
||||
void setWindowTitle(bool mining = false);
|
||||
|
||||
// Closes the currently opened wallet
|
||||
void closeWallet(bool emitClosedSignal = true, bool storeWallet = false);
|
||||
void storeWallet();
|
||||
|
||||
public slots:
|
||||
void onOpenWallet(const QString& path, const QString &password);
|
||||
void onCreateTransaction(const QString &address, const double amount, const QString &description, bool all);
|
||||
void onCreateTransaction(XmrToOrder *order);
|
||||
void onCancelTransaction(PendingTransaction *tx, const QString &address);
|
||||
void onCreateTransaction(const QString &address, quint64 amount, const QString &description, bool all);
|
||||
void onCreateTransactionMultiDest(const QVector<QString> &addresses, const QVector<quint64> &amounts, const QString &description);
|
||||
void onCancelTransaction(PendingTransaction *tx, const QVector<QString> &address);
|
||||
void onSweepOutput(const QString &keyImage, QString address, bool churn, int outputs) const;
|
||||
void onCreateTransactionError(const QString &msg);
|
||||
void onOpenAliasResolve(const QString &openAlias);
|
||||
void onSetRestoreHeight(unsigned int height);
|
||||
void onSetRestoreHeight(quint64 height);
|
||||
void onPreferredFiatCurrencyChanged(const QString &symbol);
|
||||
|
||||
private slots:
|
||||
@@ -120,53 +130,56 @@ private slots:
|
||||
void onMoneyReceived(const QString &txId, quint64 amount);
|
||||
void onUnconfirmedMoneyReceived(const QString &txId, quint64 amount);
|
||||
void onWalletUpdate();
|
||||
void onWalletRefreshed();
|
||||
void onWalletRefreshed(bool success);
|
||||
void onWalletOpened(Wallet *wallet);
|
||||
void onWalletNewBlock(quint64 blockheight, quint64 targetHeight);
|
||||
void onHeightRefreshed(quint64 walletHeight, quint64 daemonHeight, quint64 targetHeight);
|
||||
void onTransactionCreated(PendingTransaction *tx, const QString &address, const QString &paymentId, quint32 mixin);
|
||||
void onTransactionCreated(PendingTransaction *tx, const QVector<QString> &address);
|
||||
void onTransactionCommitted(bool status, PendingTransaction *t, const QStringList& txid);
|
||||
void onConnectionStatusChanged(int status);
|
||||
|
||||
signals:
|
||||
void balanceUpdated(double balance, double unlocked, QString balance_str, QString unlocked_str);
|
||||
// Emitted just before the wallet is closed
|
||||
void walletAboutToClose();
|
||||
|
||||
// Emitted after a wallet has been closed
|
||||
void walletClosed();
|
||||
|
||||
void balanceUpdated(quint64 balance, quint64 spendable);
|
||||
void blockchainSync(int height, int target);
|
||||
void refreshSync(int height, int target);
|
||||
void synchronized();
|
||||
void blockHeightWSUpdated(QMap<QString, unsigned int> heights);
|
||||
void walletSynchronized();
|
||||
void blockHeightWSUpdated(QMap<QString, int> heights);
|
||||
void walletRefreshed();
|
||||
void walletOpened();
|
||||
void walletClosed();
|
||||
void walletCreatedError(const QString &msg);
|
||||
void walletCreated(Wallet *wallet);
|
||||
void walletOpenedError(QString msg);
|
||||
void walletOpenPasswordNeeded(bool invalidPassword);
|
||||
void walletOpenPasswordNeeded(bool invalidPassword, QString path);
|
||||
void transactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid);
|
||||
void createTransactionError(QString message);
|
||||
void createTransactionCancelled(QString address, double amount);
|
||||
void createTransactionSuccess(PendingTransaction *tx, const QString &address, const quint32 &mixin);
|
||||
void createTransactionCancelled(const QVector<QString> &address, double amount);
|
||||
void createTransactionSuccess(PendingTransaction *tx, const QVector<QString> &address);
|
||||
void redditUpdated(QList<QSharedPointer<RedditPost>> &posts);
|
||||
void nodesUpdated(QList<QSharedPointer<FeatherNode>> &nodes);
|
||||
void ccsUpdated(QList<QSharedPointer<CCSEntry>> &entries);
|
||||
void suchWowUpdated(const QJsonArray &such_data);
|
||||
void nodeSourceChanged(NodeSource nodeSource);
|
||||
void XMRigDownloads(const QJsonObject &data);
|
||||
void setCustomNodes(QList<FeatherNode> nodes);
|
||||
void ccsEmpty();
|
||||
void openAliasResolveError(const QString &msg);
|
||||
void openAliasResolved(const QString &address, const QString &openAlias);
|
||||
void setRestoreHeightError(const QString &msg);
|
||||
void customRestoreHeightSet(unsigned int height);
|
||||
void customRestoreHeightSet(int height);
|
||||
void closeApplication();
|
||||
void donationNag();
|
||||
void initiateTransaction();
|
||||
void endTransaction();
|
||||
void walletClosing();
|
||||
void setTitle(const QString &title); // set window title
|
||||
|
||||
private:
|
||||
void sorry();
|
||||
const unsigned int m_donationBoundary = 15;
|
||||
UtilsNetworking *m_utilsNetworkingNodes;
|
||||
QTimer *m_storeTimer = new QTimer(this);
|
||||
QUrl m_wsUrl = QUrl(QStringLiteral("ws://6wku2m4zrv6j666crlo7lzofv6ud6enzllyhou3ijeigpukymi37caad.onion/ws"));
|
||||
const int m_donationBoundary = 15;
|
||||
QTimer m_storeTimer;
|
||||
QUrl m_wsUrl = QUrl(QStringLiteral("ws://feathercitimllbmdktu6cmjo3fizgmyfrntntqzu6xguqa2rlq5cgid.onion/ws"));
|
||||
};
|
||||
|
||||
#endif //FEATHER_APPCONTEXT_H
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
<file>assets/about.txt</file>
|
||||
<file>assets/ack.txt</file>
|
||||
<file>assets/contributors.txt</file>
|
||||
<file>assets/feather.desktop</file>
|
||||
<file>assets/wowlet.desktop</file>
|
||||
<file>assets/nodes.json</file>
|
||||
<file>assets/images/appicons/32x32.png</file>
|
||||
<file>assets/images/appicons/48x48.png</file>
|
||||
<file>assets/images/appicons/64x64.png</file>
|
||||
@@ -11,6 +12,7 @@
|
||||
<file>assets/images/appicons/128x128.png</file>
|
||||
<file>assets/images/appicons/256x256.png</file>
|
||||
<file>assets/images/arrow.svg</file>
|
||||
<file>assets/images/banners/1.png</file>
|
||||
<file>assets/images/bitcoin.png</file>
|
||||
<file>assets/images/camera_dark.png</file>
|
||||
<file>assets/images/camera_white.png</file>
|
||||
@@ -23,17 +25,21 @@
|
||||
<file>assets/images/coldcard.png</file>
|
||||
<file>assets/images/coldcard_unpaired.png</file>
|
||||
<file>assets/images/confirmed.png</file>
|
||||
<file>assets/images/confirmed_icon.png</file>
|
||||
<file>assets/images/confirmed.svg</file>
|
||||
<file>assets/images/connect.svg</file>
|
||||
<file>assets/images/copy.png</file>
|
||||
<file>assets/images/cutexmrfox.png</file>
|
||||
<file>assets/images/edit.png</file>
|
||||
<file>assets/images/exchange.png</file>
|
||||
<file>assets/images/exchange_white.png</file>
|
||||
<file>assets/images/expired.png</file>
|
||||
<file>assets/images/expired_icon.png</file>
|
||||
<file>assets/images/eye1.png</file>
|
||||
<file>assets/images/feather.png</file>
|
||||
<file>assets/images/eye_blind.png</file>
|
||||
<file>assets/images/wowlet.png</file>
|
||||
<file>assets/images/file.png</file>
|
||||
<file>assets/images/ghost.png</file>
|
||||
<file>assets/images/gnome-calc.png</file>
|
||||
<file>assets/images/history.png</file>
|
||||
<file>assets/images/info.png</file>
|
||||
<file>assets/images/key.png</file>
|
||||
@@ -41,12 +47,61 @@
|
||||
<file>assets/images/ledger_unpaired.png</file>
|
||||
<file>assets/images/lightning.png</file>
|
||||
<file>assets/images/lock.png</file>
|
||||
<file>assets/images/lock_icon.png</file>
|
||||
<file>assets/images/lock.svg</file>
|
||||
<file>assets/images/microphone.png</file>
|
||||
<file>assets/images/mining.png</file>
|
||||
<file>assets/images/network.png</file>
|
||||
<file>assets/images/offline_tx.png</file>
|
||||
<file>assets/images/person.svg</file>
|
||||
<file>assets/images/photos/1.png</file>
|
||||
<file>assets/images/photos/illiterate_illuminati.png</file>
|
||||
<file>assets/images/photos/wow1.png</file>
|
||||
<file>assets/images/photos/wow2.png</file>
|
||||
<file>assets/images/photos/wow3.png</file>
|
||||
<file>assets/images/photos/wow4.png</file>
|
||||
<file>assets/images/photos/wow5.png</file>
|
||||
<file>assets/images/photos/wow6.png</file>
|
||||
<file>assets/images/photos/wow7.png</file>
|
||||
<file>assets/images/photos/wow8.png</file>
|
||||
<file>assets/images/photos/wow9.png</file>
|
||||
<file>assets/images/photos/wow10.png</file>
|
||||
<file>assets/images/photos/wow11.png</file>
|
||||
<file>assets/images/photos/wow12.png</file>
|
||||
<file>assets/images/photos/wow13.png</file>
|
||||
<file>assets/images/photos/wow14.png</file>
|
||||
<file>assets/images/photos/wow15.png</file>
|
||||
<file>assets/images/photos/wow16.png</file>
|
||||
<file>assets/images/photos/wow17.png</file>
|
||||
<file>assets/images/photos/wow18.png</file>
|
||||
<file>assets/images/photos/wow19.png</file>
|
||||
<file>assets/images/photos/wow20.png</file>
|
||||
<file>assets/images/photos/wow21.png</file>
|
||||
<file>assets/images/photos/wow22.png</file>
|
||||
<file>assets/images/photos/wow23.png</file>
|
||||
<file>assets/images/photos/wow24.png</file>
|
||||
<file>assets/images/photos/wow25.png</file>
|
||||
<file>assets/images/photos/wow26.png</file>
|
||||
<file>assets/images/photos/wow27.png</file>
|
||||
<file>assets/images/photos/wow28.png</file>
|
||||
<file>assets/images/photos/wow29.png</file>
|
||||
<file>assets/images/photos/wow30.png</file>
|
||||
<file>assets/images/photos/wow31.png</file>
|
||||
<file>assets/images/photos/wow32.png</file>
|
||||
<file>assets/images/photos/wow33.png</file>
|
||||
<file>assets/images/photos/wow34.png</file>
|
||||
<file>assets/images/photos/wow35.png</file>
|
||||
<file>assets/images/photos/wow36.png</file>
|
||||
<file>assets/images/photos/wow37.png</file>
|
||||
<file>assets/images/photos/wow38.png</file>
|
||||
<file>assets/images/photos/wow39.png</file>
|
||||
<file>assets/images/photos/wow40.png</file>
|
||||
<file>assets/images/photos/wow41.png</file>
|
||||
<file>assets/images/photos/wow42.png</file>
|
||||
<file>assets/images/photos/wow43.png</file>
|
||||
<file>assets/images/photos/wow44.png</file>
|
||||
<file>assets/images/photos/wow45.png</file>
|
||||
<file>assets/images/photos/wow46.png</file>
|
||||
<file>assets/images/photos/wow47.png</file>
|
||||
<file>assets/images/preferences.png</file>
|
||||
<file>assets/images/preferences.svg</file>
|
||||
<file>assets/images/qrcode.png</file>
|
||||
@@ -89,12 +144,10 @@
|
||||
<file>assets/images/unpaid.png</file>
|
||||
<file>assets/images/update.png</file>
|
||||
<file>assets/images/warning.png</file>
|
||||
<file>assets/images/xmrto_big.png</file>
|
||||
<file>assets/images/xmrto.png</file>
|
||||
<file>assets/images/xmrig.ico</file>
|
||||
<file>assets/images/xmrig.svg</file>
|
||||
<file>assets/images/zoom.png</file>
|
||||
<file>assets/mnemonic_25_english.txt</file>
|
||||
<file>assets/restore_heights_monero_mainnet.txt</file>
|
||||
<file>assets/restore_heights_monero_stagenet.txt</file>
|
||||
<file>assets/user_agents.txt</file>
|
||||
<file>assets/restore_heights_wownero_mainnet.txt</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
Feather <feather_version> (<feather_git_head>)
|
||||
WOWlet <feather_version> (<feather_git_head>)
|
||||
|
||||
https://featherwallet.org
|
||||
Website: https://wownero.org
|
||||
E-mail: dev@wownero.org
|
||||
|
||||
Created by dsc <dsc@xmr.pm>, tobtoht <thotbot@protonmail.com>, and contributors.
|
||||
Created by dsc, tobtoht, and contributors.
|
||||
|
||||
Copyright (c) 2020-<current_year>, The Monero Project
|
||||
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
Feather uses monero-seed written by Tevador, for 14 word mnemonic seeds.
|
||||
|
||||
Initial CMake support for the Monero GUI was coded by TheCharlatan/xiphon.
|
||||
WOWlet is a fork of Feather (https://git.featherwallet.org/feather/feather).
|
||||
|
||||
The wallet UI is heavily inspired by Electrum. We would like to recognize Thomas Voegtlin for his pioneering work on Bitcoin.
|
||||
|
||||
Huge thanks to nioc, fluffypony, wowario, thrmo for help during development.
|
||||
WOWlet uses monero-seed written by Tevador, for 14 word mnemonic seeds.
|
||||
|
||||
Some more shoutouts for people for hosting nodes and/or having good ideas:
|
||||
dnale0r, dEBRUYNE, binaryFate, lza_menace, jwinterm, kico, wowario
|
||||
Wizard banner art was adapted from a paper wallet design by the themonera (themonera.art).
|
||||
|
||||
Initial CMake support for the Monero GUI was coded by TheCharlatan/xiphon.
|
||||
|
||||
Huge thanks to dsc, tobtoht, nioc, fluffypony, wowario, thrmo for help during development.
|
||||
|
||||
rottensox for testing :-)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dsc <dsc@xmr.pm>
|
||||
tobtoht <thotbot@protonmail.com>
|
||||
selsta <selsta@sent.at>
|
||||
Diego Salazar <rehrar@tuta.io>
|
||||
Matt Smith <matt@offtopica.uk>
|
||||
dsc
|
||||
tobtoht
|
||||
selsta
|
||||
Diego Salazar
|
||||
Matt Smith
|
||||
@@ -1,14 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Comment=Lightweight Monero Wallet
|
||||
Exec=feather
|
||||
GenericName[en_US]=Monero Wallet
|
||||
GenericName=Monero Wallet
|
||||
Icon=feather
|
||||
Name[en_US]=Feather
|
||||
Name=Feather
|
||||
Categories=Finance;Network;
|
||||
StartupNotify=false
|
||||
StartupWMClass=feather
|
||||
Terminal=false
|
||||
Type=Application
|
||||
MimeType=x-scheme-handler/monero;
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 801 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1000 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 706 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 109 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 141 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 151 KiB |
|
After Width: | Height: | Size: 20 KiB |