Compare commits
88 Commits
upstreamMe
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d39cce124 | ||
|
|
5975c105d6 | ||
|
|
9ab1aab6f8 | ||
|
|
0de954546a | ||
|
|
92bf409bf0 | ||
|
|
25a460f855 | ||
|
|
52520490c5 | ||
|
|
5313591c28 | ||
|
|
7b8114f865 | ||
|
|
f60d1e7cb6 | ||
|
|
c725c05947 | ||
|
|
87c596fa1d | ||
|
|
0e78e15fa4 | ||
|
|
4e9dd679ab | ||
|
|
2867c2ef7a | ||
|
|
ec86850a2e | ||
|
|
e2eb051eed | ||
|
|
c8562f5362 | ||
|
|
086372f68a | ||
|
|
019884a98b | ||
|
|
2174fc0676 | ||
|
|
38ab7ee554 | ||
|
|
fd62ba874b | ||
|
|
026448837f | ||
|
|
8072ad1ad9 | ||
|
|
ebeed4736f | ||
|
|
c23b869d3c | ||
|
|
5aafcb2875 | ||
|
|
cd097d6bb8 | ||
|
|
eb96d422f7 | ||
|
|
d78537c8c4 | ||
|
|
df9087970b | ||
|
|
699562c78d | ||
|
|
01eaf0fe4e | ||
|
|
b06b8753e6 | ||
|
|
1da1f0bfea | ||
|
|
8f4967f7d0 | ||
|
|
beb9f63274 | ||
|
|
58c2c15266 | ||
|
|
fc72e661de | ||
|
|
89bb49e117 | ||
|
|
2c71b9da0c | ||
|
|
9beabc0311 | ||
|
|
ba08b2279d | ||
|
|
6fb974227b | ||
|
|
6ade5903dc | ||
|
|
7bb3e5336a | ||
|
|
4ed8787433 | ||
|
|
8f2a730b3b | ||
|
|
d6986347e6 | ||
|
|
a5ddb42bfd | ||
|
|
2de7fd5466 | ||
|
|
001b815c18 | ||
|
|
5a1778b7fe | ||
|
|
67d080b34a | ||
|
|
6926b8b2d4 | ||
|
|
68cd37282e | ||
|
|
9e58d56e6d | ||
|
|
8412b53ed5 | ||
|
|
9013f6d59e | ||
|
|
bc2a421d87 | ||
|
|
76ff2f53c5 | ||
|
|
66de511828 | ||
|
|
a754f9fe10 | ||
|
|
47b07f19b9 | ||
|
|
ca931f476f | ||
|
|
43487910c7 | ||
|
|
905e271db9 | ||
|
|
52d602b6c1 | ||
|
|
add3b36f32 | ||
|
|
819c3b81e3 | ||
|
|
4fa87d8595 | ||
|
|
7ea01e9e91 | ||
|
|
7266ecc2b8 | ||
|
|
f846d1d59a | ||
|
|
f05aabd802 | ||
|
|
16bac5fd73 | ||
|
|
185d02d9df | ||
|
|
3ad6f738bd | ||
|
|
8716bc8cfb | ||
|
|
7f3de8241c | ||
|
|
e7d3fd32fb | ||
|
|
3ca1b710d6 | ||
|
|
d4967faf28 | ||
|
|
8310195453 | ||
|
|
c399693049 | ||
|
|
9bbea9bf2f | ||
|
|
d820f9ad37 |
1
.gitignore
vendored
@ -17,7 +17,6 @@ bin/
|
|||||||
.idea
|
.idea
|
||||||
|
|
||||||
# icons
|
# icons
|
||||||
electrum/gui/qt/icons_rc.py
|
|
||||||
electrum/gui/kivy/theming/light-0.png
|
electrum/gui/kivy/theming/light-0.png
|
||||||
electrum/gui/kivy/theming/light.atlas
|
electrum/gui/kivy/theming/light.atlas
|
||||||
|
|
||||||
|
|||||||
3
.gitmodules
vendored
@ -1,6 +1,3 @@
|
|||||||
[submodule "contrib/deterministic-build/electrum-icons"]
|
|
||||||
path = contrib/deterministic-build/electrum-icons
|
|
||||||
url = https://github.com/spesmilo/electrum-icons
|
|
||||||
[submodule "contrib/deterministic-build/electrum-locale"]
|
[submodule "contrib/deterministic-build/electrum-locale"]
|
||||||
path = contrib/deterministic-build/electrum-locale
|
path = contrib/deterministic-build/electrum-locale
|
||||||
url = https://github.com/spesmilo/electrum-locale
|
url = https://github.com/spesmilo/electrum-locale
|
||||||
|
|||||||
15
.travis.yml
@ -44,9 +44,13 @@ jobs:
|
|||||||
- name: "Android build"
|
- name: "Android build"
|
||||||
language: python
|
language: python
|
||||||
python: 3.7
|
python: 3.7
|
||||||
|
env:
|
||||||
|
# reset API key to not have make_locale upload stuff here
|
||||||
|
- crowdin_api_key=
|
||||||
services:
|
services:
|
||||||
- docker
|
- docker
|
||||||
install:
|
install:
|
||||||
|
- pip install requests && ./contrib/make_locale
|
||||||
- ./contrib/make_packages
|
- ./contrib/make_packages
|
||||||
- sudo docker build --no-cache -t electrum-android-builder-img electrum/gui/kivy/tools
|
- sudo docker build --no-cache -t electrum-android-builder-img electrum/gui/kivy/tools
|
||||||
script:
|
script:
|
||||||
@ -70,6 +74,17 @@ jobs:
|
|||||||
script: ./contrib/osx/make_osx
|
script: ./contrib/osx/make_osx
|
||||||
after_script: ls -lah dist && md5 dist/*
|
after_script: ls -lah dist && md5 dist/*
|
||||||
after_success: true
|
after_success: true
|
||||||
|
- name: "AppImage build"
|
||||||
|
sudo: true
|
||||||
|
language: c
|
||||||
|
python: false
|
||||||
|
services:
|
||||||
|
- docker
|
||||||
|
install:
|
||||||
|
- sudo docker build --no-cache -t electrum-appimage-builder-img ./contrib/build-linux/appimage/
|
||||||
|
script:
|
||||||
|
- sudo docker run --name electrum-appimage-builder-cont -v $PWD:/opt/electrum --rm --workdir /opt/electrum/contrib/build-linux/appimage electrum-appimage-builder-img ./build.sh
|
||||||
|
after_success: true
|
||||||
- stage: release check
|
- stage: release check
|
||||||
install:
|
install:
|
||||||
- git fetch --all --tags
|
- git fetch --all --tags
|
||||||
|
|||||||
13
AUTHORS
@ -1,3 +1,5 @@
|
|||||||
|
Electrum-BTC
|
||||||
|
------------
|
||||||
ThomasV - Creator and maintainer.
|
ThomasV - Creator and maintainer.
|
||||||
Animazing / Tachikoma - Styled the new GUI. Mac version.
|
Animazing / Tachikoma - Styled the new GUI. Mac version.
|
||||||
Azelphur - GUI stuff.
|
Azelphur - GUI stuff.
|
||||||
@ -9,4 +11,13 @@ Genjix - Porting pro-mode functionality to lite-gui and worked on server
|
|||||||
Slush - Work on the server. Designed the original Stratum spec.
|
Slush - Work on the server. Designed the original Stratum spec.
|
||||||
Julian Toash (Tuxavant) - Various fixes to the client.
|
Julian Toash (Tuxavant) - Various fixes to the client.
|
||||||
rdymac - Website and translations.
|
rdymac - Website and translations.
|
||||||
kyuupichan - Miscellaneous.
|
kyuupichan - Miscellaneous.
|
||||||
|
|
||||||
|
|
||||||
|
FLO-Electrum
|
||||||
|
------------
|
||||||
|
vivekteega - Maintainer and remaining stuff
|
||||||
|
Bitspill - Bootstraped the project with core FLO changes
|
||||||
|
Rohit Tripathy - Ideation and problem solving
|
||||||
|
akhil2015 - Flodata and scrypt hashing
|
||||||
|
|
||||||
|
|||||||
@ -7,8 +7,6 @@ include contrib/requirements/requirements.txt
|
|||||||
include contrib/requirements/requirements-hw.txt
|
include contrib/requirements/requirements-hw.txt
|
||||||
recursive-include packages *.py
|
recursive-include packages *.py
|
||||||
recursive-include packages cacert.pem
|
recursive-include packages cacert.pem
|
||||||
include icons.qrc
|
|
||||||
graft icons
|
|
||||||
|
|
||||||
graft electrum
|
graft electrum
|
||||||
prune electrum/tests
|
prune electrum/tests
|
||||||
|
|||||||
@ -66,14 +66,6 @@ Run install (this should install dependencies)::
|
|||||||
|
|
||||||
python3 -m pip install .[fast]
|
python3 -m pip install .[fast]
|
||||||
|
|
||||||
Render the SVG icons to PNGs (optional)::
|
|
||||||
|
|
||||||
for i in lock unlock confirmed status_lagging status_disconnected status_connected_proxy status_connected status_waiting preferences; do convert -background none icons/$i.svg icons/$i.png; done
|
|
||||||
|
|
||||||
Compile the icons file for Qt::
|
|
||||||
|
|
||||||
sudo apt-get install pyqt5-dev-tools
|
|
||||||
pyrcc5 icons.qrc -o electrum/gui/qt/icons_rc.py
|
|
||||||
|
|
||||||
Compile the protobuf description file::
|
Compile the protobuf description file::
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,19 @@
|
|||||||
|
# Release 3.3.4 - (February 13, 2019)
|
||||||
|
|
||||||
|
* AppImage: we now also distribute self-contained binaries for x86_64
|
||||||
|
Linux in the form of an AppImage (#5042). The Python interpreter,
|
||||||
|
PyQt5, libsecp256k1, PyCryptodomex, zbar, hidapi/libusb (including
|
||||||
|
hardware wallet libraries) are all bundled. Note that users of
|
||||||
|
hw wallets still need to set udev rules themselves.
|
||||||
|
* hw wallets: fix a regression during transaction signing that prompts
|
||||||
|
the user too many times for confirmations (commit 2729909)
|
||||||
|
* transactions now set nVersion to 2, to mimic Bitcoin Core
|
||||||
|
* fix Qt bug that made all hw wallets unusable on Windows 8.1 (#4960)
|
||||||
|
* fix bugs in wallet creation wizard that resulted in corrupted
|
||||||
|
wallets being created in rare cases (#5082, #5057)
|
||||||
|
* fix compatibility with Qt 5.12 (#5109)
|
||||||
|
|
||||||
|
|
||||||
# Release 3.3.3 - (January 25, 2019)
|
# Release 3.3.3 - (January 25, 2019)
|
||||||
|
|
||||||
* Do not expose users to server error messages (#4968)
|
* Do not expose users to server error messages (#4968)
|
||||||
|
|||||||
25
contrib/build-linux/appimage/Dockerfile
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
FROM ubuntu:14.04@sha256:cac55e5d97fad634d954d00a5c2a56d80576a08dcc01036011f26b88263f1578
|
||||||
|
|
||||||
|
ENV LC_ALL=C.UTF-8 LANG=C.UTF-8
|
||||||
|
|
||||||
|
RUN apt-get update -q && \
|
||||||
|
apt-get install -qy \
|
||||||
|
git \
|
||||||
|
wget \
|
||||||
|
make \
|
||||||
|
autotools-dev \
|
||||||
|
autoconf \
|
||||||
|
libtool \
|
||||||
|
xz-utils \
|
||||||
|
libssl-dev \
|
||||||
|
zlib1g-dev \
|
||||||
|
libffi6 \
|
||||||
|
libffi-dev \
|
||||||
|
libusb-1.0-0-dev \
|
||||||
|
libudev-dev \
|
||||||
|
gettext \
|
||||||
|
libzbar0 \
|
||||||
|
&& \
|
||||||
|
rm -rf /var/lib/apt/lists/* && \
|
||||||
|
apt-get autoremove -y && \
|
||||||
|
apt-get clean
|
||||||
41
contrib/build-linux/appimage/README.md
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
AppImage binary for Electrum
|
||||||
|
============================
|
||||||
|
|
||||||
|
This assumes an Ubuntu host, but it should not be too hard to adapt to another
|
||||||
|
similar system. The docker commands should be executed in the project's root
|
||||||
|
folder.
|
||||||
|
|
||||||
|
1. Install Docker
|
||||||
|
|
||||||
|
```
|
||||||
|
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
|
||||||
|
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
|
||||||
|
$ sudo apt-get update
|
||||||
|
$ sudo apt-get install -y docker-ce
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Build image
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo docker build --no-cache -t electrum-appimage-builder-img contrib/build-linux/appimage
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Build binary
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo docker run -it \
|
||||||
|
--name electrum-appimage-builder-cont \
|
||||||
|
-v $PWD:/opt/electrum \
|
||||||
|
--rm \
|
||||||
|
--workdir /opt/electrum/contrib/build-linux/appimage \
|
||||||
|
electrum-appimage-builder-img \
|
||||||
|
./build.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
4. The generated binary is in `./dist`.
|
||||||
|
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
|
||||||
|
### How can I see what is included in the AppImage?
|
||||||
|
Execute the binary as follows: `./electrum*.AppImage --appimage-extract`
|
||||||
11
contrib/build-linux/appimage/apprun.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
APPDIR="$(dirname "$(readlink -e "$0")")"
|
||||||
|
|
||||||
|
export LD_LIBRARY_PATH="${APPDIR}/usr/lib/:${APPDIR}/usr/lib/x86_64-linux-gnu${LD_LIBRARY_PATH+:$LD_LIBRARY_PATH}"
|
||||||
|
export PATH="${APPDIR}/usr/bin:${PATH}"
|
||||||
|
export LDFLAGS="-L${APPDIR}/usr/lib/x86_64-linux-gnu -L${APPDIR}/usr/lib"
|
||||||
|
|
||||||
|
exec "${APPDIR}/usr/bin/python3.6" -s "${APPDIR}/usr/bin/electrum" "$@"
|
||||||
197
contrib/build-linux/appimage/build.sh
Executable file
@ -0,0 +1,197 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PROJECT_ROOT="$(dirname "$(readlink -e "$0")")/../../.."
|
||||||
|
CONTRIB="$PROJECT_ROOT/contrib"
|
||||||
|
DISTDIR="$PROJECT_ROOT/dist"
|
||||||
|
BUILDDIR="$CONTRIB/build-linux/appimage/build/appimage"
|
||||||
|
APPDIR="$BUILDDIR/electrum.AppDir"
|
||||||
|
CACHEDIR="$CONTRIB/build-linux/appimage/.cache/appimage"
|
||||||
|
|
||||||
|
# pinned versions
|
||||||
|
PYTHON_VERSION=3.6.8
|
||||||
|
PKG2APPIMAGE_COMMIT="83483c2971fcaa1cb0c1253acd6c731ef8404381"
|
||||||
|
LIBSECP_VERSION="b408c6a8b287003d1ade5709e6f7bc3c7f1d5be7"
|
||||||
|
|
||||||
|
|
||||||
|
VERSION=`git describe --tags --dirty --always`
|
||||||
|
APPIMAGE="$DISTDIR/electrum-$VERSION-x86_64.AppImage"
|
||||||
|
|
||||||
|
rm -rf "$BUILDDIR"
|
||||||
|
mkdir -p "$APPDIR" "$CACHEDIR" "$DISTDIR"
|
||||||
|
|
||||||
|
|
||||||
|
. "$CONTRIB"/build_tools_util.sh
|
||||||
|
|
||||||
|
|
||||||
|
info "downloading some dependencies."
|
||||||
|
download_if_not_exist "$CACHEDIR/functions.sh" "https://raw.githubusercontent.com/AppImage/pkg2appimage/$PKG2APPIMAGE_COMMIT/functions.sh"
|
||||||
|
verify_hash "$CACHEDIR/functions.sh" "a73a21a6c1d1e15c0a9f47f017ae833873d1dc6aa74a4c840c0b901bf1dcf09c"
|
||||||
|
|
||||||
|
download_if_not_exist "$CACHEDIR/appimagetool" "https://github.com/probonopd/AppImageKit/releases/download/11/appimagetool-x86_64.AppImage"
|
||||||
|
verify_hash "$CACHEDIR/appimagetool" "c13026b9ebaa20a17e7e0a4c818a901f0faba759801d8ceab3bb6007dde00372"
|
||||||
|
|
||||||
|
download_if_not_exist "$CACHEDIR/Python-$PYTHON_VERSION.tar.xz" "https://www.python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tar.xz"
|
||||||
|
verify_hash "$CACHEDIR/Python-$PYTHON_VERSION.tar.xz" "35446241e995773b1bed7d196f4b624dadcadc8429f26282e756b2fb8a351193"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
info "building python."
|
||||||
|
tar xf "$CACHEDIR/Python-$PYTHON_VERSION.tar.xz" -C "$BUILDDIR"
|
||||||
|
(
|
||||||
|
cd "$BUILDDIR/Python-$PYTHON_VERSION"
|
||||||
|
export SOURCE_DATE_EPOCH=1530212462
|
||||||
|
./configure \
|
||||||
|
--cache-file="$CACHEDIR/python.config.cache" \
|
||||||
|
--prefix="$APPDIR/usr" \
|
||||||
|
--enable-ipv6 \
|
||||||
|
--enable-shared \
|
||||||
|
--with-threads \
|
||||||
|
-q
|
||||||
|
make -s
|
||||||
|
make -s install > /dev/null
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
info "building libsecp256k1."
|
||||||
|
(
|
||||||
|
git clone https://github.com/bitcoin-core/secp256k1 "$CACHEDIR"/secp256k1 || (cd "$CACHEDIR"/secp256k1 && git pull)
|
||||||
|
cd "$CACHEDIR"/secp256k1
|
||||||
|
git reset --hard "$LIBSECP_VERSION"
|
||||||
|
git clean -f -x -q
|
||||||
|
export SOURCE_DATE_EPOCH=1530212462
|
||||||
|
./autogen.sh
|
||||||
|
echo "LDFLAGS = -no-undefined" >> Makefile.am
|
||||||
|
./configure \
|
||||||
|
--prefix="$APPDIR/usr" \
|
||||||
|
--enable-module-recovery \
|
||||||
|
--enable-experimental \
|
||||||
|
--enable-module-ecdh \
|
||||||
|
--disable-jni \
|
||||||
|
-q
|
||||||
|
make -s
|
||||||
|
make -s install > /dev/null
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
appdir_python() {
|
||||||
|
env \
|
||||||
|
PYTHONNOUSERSITE=1 \
|
||||||
|
LD_LIBRARY_PATH="$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu${LD_LIBRARY_PATH+:$LD_LIBRARY_PATH}" \
|
||||||
|
"$APPDIR/usr/bin/python3.6" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
python='appdir_python'
|
||||||
|
|
||||||
|
|
||||||
|
info "installing pip."
|
||||||
|
"$python" -m ensurepip
|
||||||
|
|
||||||
|
|
||||||
|
info "preparing electrum-locale."
|
||||||
|
(
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
git submodule update --init
|
||||||
|
|
||||||
|
pushd "$CONTRIB"/deterministic-build/electrum-locale
|
||||||
|
if ! which msgfmt > /dev/null 2>&1; then
|
||||||
|
echo "Please install gettext"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
for i in ./locale/*; do
|
||||||
|
dir="$PROJECT_ROOT/electrum/$i/LC_MESSAGES"
|
||||||
|
mkdir -p $dir
|
||||||
|
msgfmt --output-file="$dir/electrum.mo" "$i/electrum.po" || true
|
||||||
|
done
|
||||||
|
popd
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
info "installing electrum and its dependencies."
|
||||||
|
mkdir -p "$CACHEDIR/pip_cache"
|
||||||
|
"$python" -m pip install --cache-dir "$CACHEDIR/pip_cache" -r "$CONTRIB/deterministic-build/requirements.txt"
|
||||||
|
"$python" -m pip install --cache-dir "$CACHEDIR/pip_cache" -r "$CONTRIB/deterministic-build/requirements-binaries.txt"
|
||||||
|
"$python" -m pip install --cache-dir "$CACHEDIR/pip_cache" -r "$CONTRIB/deterministic-build/requirements-hw.txt"
|
||||||
|
"$python" -m pip install --cache-dir "$CACHEDIR/pip_cache" "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
|
||||||
|
info "copying zbar"
|
||||||
|
cp "/usr/lib/libzbar.so.0" "$APPDIR/usr/lib/libzbar.so.0"
|
||||||
|
|
||||||
|
|
||||||
|
info "desktop integration."
|
||||||
|
cp "$PROJECT_ROOT/electrum.desktop" "$APPDIR/electrum.desktop"
|
||||||
|
cp "$PROJECT_ROOT/electrum/gui/icons/electrum.png" "$APPDIR/electrum.png"
|
||||||
|
|
||||||
|
|
||||||
|
# add launcher
|
||||||
|
cp "$CONTRIB/build-linux/appimage/apprun.sh" "$APPDIR/AppRun"
|
||||||
|
|
||||||
|
info "finalizing AppDir."
|
||||||
|
(
|
||||||
|
export PKG2AICOMMIT="$PKG2APPIMAGE_COMMIT"
|
||||||
|
. "$CACHEDIR/functions.sh"
|
||||||
|
|
||||||
|
cd "$APPDIR"
|
||||||
|
# copy system dependencies
|
||||||
|
# note: temporarily move PyQt5 out of the way so
|
||||||
|
# we don't try to bundle its system dependencies.
|
||||||
|
mv "$APPDIR/usr/lib/python3.6/site-packages/PyQt5" "$BUILDDIR"
|
||||||
|
copy_deps; copy_deps; copy_deps
|
||||||
|
move_lib
|
||||||
|
mv "$BUILDDIR/PyQt5" "$APPDIR/usr/lib/python3.6/site-packages"
|
||||||
|
|
||||||
|
# apply global appimage blacklist to exclude stuff
|
||||||
|
# move usr/include out of the way to preserve usr/include/python3.6m.
|
||||||
|
mv usr/include usr/include.tmp
|
||||||
|
delete_blacklisted
|
||||||
|
mv usr/include.tmp usr/include
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
info "stripping binaries from debug symbols."
|
||||||
|
strip_binaries()
|
||||||
|
{
|
||||||
|
chmod u+w -R "$APPDIR"
|
||||||
|
{
|
||||||
|
printf '%s\0' "$APPDIR/usr/bin/python3.6"
|
||||||
|
find "$APPDIR" -type f -regex '.*\.so\(\.[0-9.]+\)?$' -print0
|
||||||
|
} | xargs -0 --no-run-if-empty --verbose -n1 strip
|
||||||
|
}
|
||||||
|
strip_binaries
|
||||||
|
|
||||||
|
remove_emptydirs()
|
||||||
|
{
|
||||||
|
find "$APPDIR" -type d -empty -print0 | xargs -0 --no-run-if-empty rmdir -vp --ignore-fail-on-non-empty
|
||||||
|
}
|
||||||
|
remove_emptydirs
|
||||||
|
|
||||||
|
|
||||||
|
info "removing some unneeded stuff to decrease binary size."
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/test
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/site-packages/PyQt5/Qt/translations/qtwebengine_locales
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/site-packages/PyQt5/Qt/resources/qtwebengine_*
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/site-packages/PyQt5/Qt/qml
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/site-packages/PyQt5/Qt/lib/libQt5Web*
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/site-packages/PyQt5/Qt/lib/libQt5Designer*
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/site-packages/PyQt5/Qt/lib/libQt5Qml*
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/site-packages/PyQt5/Qt/lib/libQt5Quick*
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/site-packages/PyQt5/Qt/lib/libQt5Location*
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/site-packages/PyQt5/Qt/lib/libQt5Test*
|
||||||
|
rm -rf "$APPDIR"/usr/lib/python3.6/site-packages/PyQt5/Qt/lib/libQt5Xml*
|
||||||
|
|
||||||
|
|
||||||
|
info "creating the AppImage."
|
||||||
|
(
|
||||||
|
cd "$BUILDDIR"
|
||||||
|
chmod +x "$CACHEDIR/appimagetool"
|
||||||
|
"$CACHEDIR/appimagetool" --appimage-extract
|
||||||
|
env VERSION="$VERSION" ./squashfs-root/AppRun --no-appstream --verbose "$APPDIR" "$APPIMAGE"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
info "done."
|
||||||
|
ls -la "$DISTDIR"
|
||||||
|
sha256sum "$DISTDIR"/*
|
||||||
@ -20,7 +20,7 @@ cd tmp
|
|||||||
|
|
||||||
pushd $WINEPREFIX/drive_c/electrum
|
pushd $WINEPREFIX/drive_c/electrum
|
||||||
|
|
||||||
# Load electrum-icons and electrum-locale for this release
|
# Load electrum-locale for this release
|
||||||
git submodule init
|
git submodule init
|
||||||
git submodule update
|
git submodule update
|
||||||
|
|
||||||
@ -43,7 +43,6 @@ find -exec touch -d '2000-11-11T11:11:11+00:00' {} +
|
|||||||
popd
|
popd
|
||||||
|
|
||||||
cp $WINEPREFIX/drive_c/electrum/LICENCE .
|
cp $WINEPREFIX/drive_c/electrum/LICENCE .
|
||||||
cp $WINEPREFIX/drive_c/electrum/contrib/deterministic-build/electrum-icons/icons_rc.py $WINEPREFIX/drive_c/electrum/electrum/gui/qt/
|
|
||||||
|
|
||||||
# Install frozen dependencies
|
# Install frozen dependencies
|
||||||
$PYTHON -m pip install -r ../../deterministic-build/requirements.txt
|
$PYTHON -m pip install -r ../../deterministic-build/requirements.txt
|
||||||
@ -51,7 +50,7 @@ $PYTHON -m pip install -r ../../deterministic-build/requirements.txt
|
|||||||
$PYTHON -m pip install -r ../../deterministic-build/requirements-hw.txt
|
$PYTHON -m pip install -r ../../deterministic-build/requirements-hw.txt
|
||||||
|
|
||||||
pushd $WINEPREFIX/drive_c/electrum
|
pushd $WINEPREFIX/drive_c/electrum
|
||||||
$PYTHON setup.py install
|
$PYTHON -m pip install .
|
||||||
popd
|
popd
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
@ -75,4 +74,4 @@ mv electrum-setup.exe $NAME_ROOT-$VERSION-setup.exe
|
|||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
echo "Done."
|
echo "Done."
|
||||||
md5sum dist/electrum*exe
|
sha256sum dist/electrum*exe
|
||||||
|
|||||||
@ -29,7 +29,8 @@ else
|
|||||||
git pull
|
git pull
|
||||||
fi
|
fi
|
||||||
|
|
||||||
git reset --hard 452d8e4d2a2f9f1b5be6b02e18f1ba102e5ca0b4
|
LIBSECP_VERSION="b408c6a8b287003d1ade5709e6f7bc3c7f1d5be7"
|
||||||
|
git reset --hard "$LIBSECP_VERSION"
|
||||||
git clean -f -x -q
|
git clean -f -x -q
|
||||||
|
|
||||||
build_dll i686-w64-mingw32 # 64-bit would be: x86_64-w64-mingw32
|
build_dll i686-w64-mingw32 # 64-bit would be: x86_64-w64-mingw32
|
||||||
|
|||||||
@ -23,6 +23,11 @@ hiddenimports += collect_submodules('keepkeylib')
|
|||||||
hiddenimports += collect_submodules('websocket')
|
hiddenimports += collect_submodules('websocket')
|
||||||
hiddenimports += collect_submodules('ckcc')
|
hiddenimports += collect_submodules('ckcc')
|
||||||
|
|
||||||
|
# safetlib imports PyQt5.Qt. We use a local updated copy of pinmatrix.py until they
|
||||||
|
# release a new version that includes https://github.com/archos-safe-t/python-safet/commit/b1eab3dba4c04fdfc1fcf17b66662c28c5f2380e
|
||||||
|
hiddenimports.remove('safetlib.qt.pinmatrix')
|
||||||
|
|
||||||
|
|
||||||
# Add libusb binary
|
# Add libusb binary
|
||||||
binaries = [(PYHOME+"/libusb-1.0.dll", ".")]
|
binaries = [(PYHOME+"/libusb-1.0.dll", ".")]
|
||||||
|
|
||||||
@ -37,6 +42,7 @@ datas = [
|
|||||||
(home+'electrum/locale', 'electrum/locale'),
|
(home+'electrum/locale', 'electrum/locale'),
|
||||||
(home+'electrum/plugins', 'electrum/plugins'),
|
(home+'electrum/plugins', 'electrum/plugins'),
|
||||||
('C:\\Program Files (x86)\\ZBar\\bin\\', '.'),
|
('C:\\Program Files (x86)\\ZBar\\bin\\', '.'),
|
||||||
|
(home+'electrum/gui/icons', 'electrum/gui/icons'),
|
||||||
]
|
]
|
||||||
datas += collect_data_files('trezorlib')
|
datas += collect_data_files('trezorlib')
|
||||||
datas += collect_data_files('safetlib')
|
datas += collect_data_files('safetlib')
|
||||||
@ -113,7 +119,7 @@ exe_standalone = EXE(
|
|||||||
debug=False,
|
debug=False,
|
||||||
strip=None,
|
strip=None,
|
||||||
upx=False,
|
upx=False,
|
||||||
icon=home+'icons/electrum.ico',
|
icon=home+'electrum/gui/icons/electrum.ico',
|
||||||
console=False)
|
console=False)
|
||||||
# console=True makes an annoying black box pop up, but it does make Electrum output command line commands, with this turned off no output will be given but commands can still be used
|
# console=True makes an annoying black box pop up, but it does make Electrum output command line commands, with this turned off no output will be given but commands can still be used
|
||||||
|
|
||||||
@ -126,7 +132,7 @@ exe_portable = EXE(
|
|||||||
debug=False,
|
debug=False,
|
||||||
strip=None,
|
strip=None,
|
||||||
upx=False,
|
upx=False,
|
||||||
icon=home+'icons/electrum.ico',
|
icon=home+'electrum/gui/icons/electrum.ico',
|
||||||
console=False)
|
console=False)
|
||||||
|
|
||||||
#####
|
#####
|
||||||
@ -140,7 +146,7 @@ exe_dependent = EXE(
|
|||||||
debug=False,
|
debug=False,
|
||||||
strip=None,
|
strip=None,
|
||||||
upx=False,
|
upx=False,
|
||||||
icon=home+'icons/electrum.ico',
|
icon=home+'electrum/gui/icons/electrum.ico',
|
||||||
console=False)
|
console=False)
|
||||||
|
|
||||||
coll = COLLECT(
|
coll = COLLECT(
|
||||||
@ -151,6 +157,6 @@ coll = COLLECT(
|
|||||||
strip=None,
|
strip=None,
|
||||||
upx=True,
|
upx=True,
|
||||||
debug=False,
|
debug=False,
|
||||||
icon=home+'icons/electrum.ico',
|
icon=home+'electrum/gui/icons/electrum.ico',
|
||||||
console=False,
|
console=False,
|
||||||
name=os.path.join('dist', 'electrum'))
|
name=os.path.join('dist', 'electrum'))
|
||||||
|
|||||||
@ -9,19 +9,10 @@ RUN dpkg --add-architecture i386 && \
|
|||||||
gnupg2=2.2.4-1ubuntu1.2 \
|
gnupg2=2.2.4-1ubuntu1.2 \
|
||||||
dirmngr=2.2.4-1ubuntu1.2 \
|
dirmngr=2.2.4-1ubuntu1.2 \
|
||||||
python3-software-properties=0.96.24.32.1 \
|
python3-software-properties=0.96.24.32.1 \
|
||||||
software-properties-common=0.96.24.32.1 \
|
software-properties-common=0.96.24.32.1
|
||||||
&& \
|
|
||||||
wget -nc https://dl.winehq.org/wine-builds/Release.key && \
|
RUN apt-get update -q && \
|
||||||
wget -nc https://dl.winehq.org/wine-builds/winehq.key && \
|
apt-get install -qy \
|
||||||
apt-key add Release.key && \
|
|
||||||
apt-key add winehq.key && \
|
|
||||||
apt-add-repository https://dl.winehq.org/wine-builds/ubuntu/ && \
|
|
||||||
apt-get update -q && \
|
|
||||||
apt-get install -qy \
|
|
||||||
wine-stable-amd64:amd64=3.0.1~bionic \
|
|
||||||
wine-stable-i386:i386=3.0.1~bionic \
|
|
||||||
wine-stable:amd64=3.0.1~bionic \
|
|
||||||
winehq-stable:amd64=3.0.1~bionic \
|
|
||||||
git=1:2.17.1-1ubuntu0.4 \
|
git=1:2.17.1-1ubuntu0.4 \
|
||||||
p7zip-full=16.02+dfsg-6 \
|
p7zip-full=16.02+dfsg-6 \
|
||||||
make=4.1-9.1ubuntu1 \
|
make=4.1-9.1ubuntu1 \
|
||||||
@ -29,8 +20,22 @@ RUN dpkg --add-architecture i386 && \
|
|||||||
autotools-dev=20180224.1 \
|
autotools-dev=20180224.1 \
|
||||||
autoconf=2.69-11 \
|
autoconf=2.69-11 \
|
||||||
libtool=2.4.6-2 \
|
libtool=2.4.6-2 \
|
||||||
gettext=0.19.8.1-6 \
|
gettext=0.19.8.1-6
|
||||||
&& \
|
|
||||||
rm -rf /var/lib/apt/lists/* && \
|
RUN wget -nc https://dl.winehq.org/wine-builds/Release.key && \
|
||||||
|
echo "c51bcb8cc4a12abfbd7c7660eaf90f49674d15e222c262f27e6c96429111b822 Release.key" | sha256sum -c - && \
|
||||||
|
apt-key add Release.key && \
|
||||||
|
wget -nc https://dl.winehq.org/wine-builds/winehq.key && \
|
||||||
|
echo "78b185fabdb323971d13bd329fefc8038e08559aa51c4996de18db0639a51df6 winehq.key" | sha256sum -c - && \
|
||||||
|
apt-key add winehq.key && \
|
||||||
|
apt-add-repository https://dl.winehq.org/wine-builds/ubuntu/ && \
|
||||||
|
apt-get update -q && \
|
||||||
|
apt-get install -qy \
|
||||||
|
wine-stable-amd64:amd64=4.0~bionic \
|
||||||
|
wine-stable-i386:i386=4.0~bionic \
|
||||||
|
wine-stable:amd64=4.0~bionic \
|
||||||
|
winehq-stable:amd64=4.0~bionic
|
||||||
|
|
||||||
|
RUN rm -rf /var/lib/apt/lists/* && \
|
||||||
apt-get autoremove -y && \
|
apt-get autoremove -y && \
|
||||||
apt-get clean
|
apt-get clean
|
||||||
|
|||||||
@ -20,7 +20,7 @@ folder.
|
|||||||
2. Build image
|
2. Build image
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo docker build --no-cache -t electrum-wine-builder-img contrib/build-wine/docker
|
$ sudo docker build -t electrum-wine-builder-img contrib/build-wine/docker
|
||||||
```
|
```
|
||||||
|
|
||||||
Note: see [this](https://stackoverflow.com/a/40516974/7499128) if having dns problems
|
Note: see [this](https://stackoverflow.com/a/40516974/7499128) if having dns problems
|
||||||
|
|||||||
@ -72,7 +72,7 @@
|
|||||||
!define MUI_ABORTWARNING
|
!define MUI_ABORTWARNING
|
||||||
!define MUI_ABORTWARNING_TEXT "Are you sure you wish to abort the installation of ${PRODUCT_NAME}?"
|
!define MUI_ABORTWARNING_TEXT "Are you sure you wish to abort the installation of ${PRODUCT_NAME}?"
|
||||||
|
|
||||||
!define MUI_ICON "c:\electrum\icons\electrum.ico"
|
!define MUI_ICON "c:\electrum\electrum\gui\icons\electrum.ico"
|
||||||
|
|
||||||
;--------------------------------
|
;--------------------------------
|
||||||
;Pages
|
;Pages
|
||||||
@ -111,7 +111,7 @@ Section
|
|||||||
|
|
||||||
;Files to pack into the installer
|
;Files to pack into the installer
|
||||||
File /r "dist\electrum\*.*"
|
File /r "dist\electrum\*.*"
|
||||||
File "c:\electrum\icons\electrum.ico"
|
File "c:\electrum\electrum\gui\icons\electrum.ico"
|
||||||
|
|
||||||
;Store installation folder
|
;Store installation folder
|
||||||
WriteRegStr HKCU "Software\${PRODUCT_NAME}" "" $INSTDIR
|
WriteRegStr HKCU "Software\${PRODUCT_NAME}" "" $INSTDIR
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Please update these carefully, some versions won't work under Wine
|
# Please update these carefully, some versions won't work under Wine
|
||||||
NSIS_FILENAME=nsis-3.03-setup.exe
|
NSIS_FILENAME=nsis-3.04-setup.exe
|
||||||
NSIS_URL=https://prdownloads.sourceforge.net/nsis/$NSIS_FILENAME?download
|
NSIS_URL=https://prdownloads.sourceforge.net/nsis/$NSIS_FILENAME?download
|
||||||
NSIS_SHA256=bd3b15ab62ec6b0c7a00f46022d441af03277be893326f6fea8e212dc2d77743
|
NSIS_SHA256=4e1db5a7400e348b1b46a4a11b6d9557fd84368e4ad3d4bc4c1be636c89638aa
|
||||||
|
|
||||||
ZBAR_FILENAME=zbarw-20121031-setup.exe
|
ZBAR_FILENAME=zbarw-20121031-setup.exe
|
||||||
ZBAR_URL=https://sourceforge.net/projects/zbarw/files/$ZBAR_FILENAME/download
|
ZBAR_URL=https://sourceforge.net/projects/zbarw/files/$ZBAR_FILENAME/download
|
||||||
@ -13,7 +13,7 @@ LIBUSB_FILENAME=libusb-1.0.22.7z
|
|||||||
LIBUSB_URL=https://prdownloads.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.22/$LIBUSB_FILENAME?download
|
LIBUSB_URL=https://prdownloads.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.22/$LIBUSB_FILENAME?download
|
||||||
LIBUSB_SHA256=671f1a420757b4480e7fadc8313d6fb3cbb75ca00934c417c1efa6e77fb8779b
|
LIBUSB_SHA256=671f1a420757b4480e7fadc8313d6fb3cbb75ca00934c417c1efa6e77fb8779b
|
||||||
|
|
||||||
PYTHON_VERSION=3.6.7
|
PYTHON_VERSION=3.6.8
|
||||||
|
|
||||||
## These settings probably don't need change
|
## These settings probably don't need change
|
||||||
export WINEPREFIX=/opt/wine64
|
export WINEPREFIX=/opt/wine64
|
||||||
@ -24,68 +24,14 @@ PYHOME="c:/$PYTHON_FOLDER"
|
|||||||
PYTHON="wine $PYHOME/python.exe -OO -B"
|
PYTHON="wine $PYHOME/python.exe -OO -B"
|
||||||
|
|
||||||
|
|
||||||
# based on https://superuser.com/questions/497940/script-to-verify-a-signature-with-gpg
|
|
||||||
verify_signature() {
|
|
||||||
local file=$1 keyring=$2 out=
|
|
||||||
if out=$(gpg --no-default-keyring --keyring "$keyring" --status-fd 1 --verify "$file" 2>/dev/null) &&
|
|
||||||
echo "$out" | grep -qs "^\[GNUPG:\] VALIDSIG "; then
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
echo "$out" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
download_if_not_exist() {
|
|
||||||
local file_name=$1 url=$2
|
|
||||||
if [ ! -e $file_name ] ; then
|
|
||||||
wget -O $PWD/$file_name "$url"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# https://github.com/travis-ci/travis-build/blob/master/lib/travis/build/templates/header.sh
|
|
||||||
retry() {
|
|
||||||
local result=0
|
|
||||||
local count=1
|
|
||||||
while [ $count -le 3 ]; do
|
|
||||||
[ $result -ne 0 ] && {
|
|
||||||
echo -e "\nThe command \"$@\" failed. Retrying, $count of 3.\n" >&2
|
|
||||||
}
|
|
||||||
! { "$@"; result=$?; }
|
|
||||||
[ $result -eq 0 ] && break
|
|
||||||
count=$(($count + 1))
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
|
|
||||||
[ $count -gt 3 ] && {
|
|
||||||
echo -e "\nThe command \"$@\" failed 3 times.\n" >&2
|
|
||||||
}
|
|
||||||
|
|
||||||
return $result
|
|
||||||
}
|
|
||||||
|
|
||||||
# Let's begin!
|
# Let's begin!
|
||||||
here=$(dirname $(readlink -e $0))
|
here="$(dirname "$(readlink -e "$0")")"
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
. $here/../build_tools_util.sh
|
||||||
|
|
||||||
wine 'wineboot'
|
wine 'wineboot'
|
||||||
|
|
||||||
# HACK to work around https://bugs.winehq.org/show_bug.cgi?id=42474#c22
|
|
||||||
# needed for python 3.6+
|
|
||||||
rm -f /opt/wine-stable/lib/wine/fakedlls/api-ms-win-core-path-l1-1-0.dll
|
|
||||||
rm -f /opt/wine-stable/lib/wine/api-ms-win-core-path-l1-1-0.dll.so
|
|
||||||
|
|
||||||
cd /tmp/electrum-build
|
cd /tmp/electrum-build
|
||||||
|
|
||||||
@ -109,11 +55,9 @@ for msifile in core dev exe lib pip tools; do
|
|||||||
wine msiexec /i "${msifile}.msi" /qb TARGETDIR=$PYHOME
|
wine msiexec /i "${msifile}.msi" /qb TARGETDIR=$PYHOME
|
||||||
done
|
done
|
||||||
|
|
||||||
# upgrade pip
|
# Install dependencies specific to binaries
|
||||||
$PYTHON -m pip install pip --upgrade
|
# note that this also installs pinned versions of both pip and setuptools
|
||||||
|
$PYTHON -m pip install -r "$here"/../deterministic-build/requirements-binaries.txt
|
||||||
|
|
||||||
$PYTHON -m pip install -r $here/../deterministic-build/requirements-binaries.txt
|
|
||||||
|
|
||||||
# Install PyInstaller
|
# Install PyInstaller
|
||||||
$PYTHON -m pip install pyinstaller==3.4 --no-use-pep517
|
$PYTHON -m pip install pyinstaller==3.4 --no-use-pep517
|
||||||
@ -123,9 +67,6 @@ download_if_not_exist $ZBAR_FILENAME "$ZBAR_URL"
|
|||||||
verify_hash $ZBAR_FILENAME "$ZBAR_SHA256"
|
verify_hash $ZBAR_FILENAME "$ZBAR_SHA256"
|
||||||
wine "$PWD/$ZBAR_FILENAME" /S
|
wine "$PWD/$ZBAR_FILENAME" /S
|
||||||
|
|
||||||
# Upgrade setuptools (so Electrum can be installed later)
|
|
||||||
$PYTHON -m pip install setuptools --upgrade
|
|
||||||
|
|
||||||
# Install NSIS installer
|
# Install NSIS installer
|
||||||
download_if_not_exist $NSIS_FILENAME "$NSIS_URL"
|
download_if_not_exist $NSIS_FILENAME "$NSIS_URL"
|
||||||
verify_hash $NSIS_FILENAME "$NSIS_SHA256"
|
verify_hash $NSIS_FILENAME "$NSIS_SHA256"
|
||||||
|
|||||||
69
contrib/build_tools_util.sh
Executable file
@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
RED='\033[0;31m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
YELLOW='\033[0;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
function info {
|
||||||
|
printf "\r💬 ${BLUE}INFO:${NC} ${1}\n"
|
||||||
|
}
|
||||||
|
function fail {
|
||||||
|
printf "\r🗯 ${RED}ERROR:${NC} ${1}\n"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
function warn {
|
||||||
|
printf "\r⚠️ ${YELLOW}WARNING:${NC} ${1}\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# based on https://superuser.com/questions/497940/script-to-verify-a-signature-with-gpg
|
||||||
|
function verify_signature() {
|
||||||
|
local file=$1 keyring=$2 out=
|
||||||
|
if out=$(gpg --no-default-keyring --keyring "$keyring" --status-fd 1 --verify "$file" 2>/dev/null) &&
|
||||||
|
echo "$out" | grep -qs "^\[GNUPG:\] VALIDSIG "; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "$out" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
function download_if_not_exist() {
|
||||||
|
local file_name=$1 url=$2
|
||||||
|
if [ ! -e $file_name ] ; then
|
||||||
|
wget -O $file_name "$url"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# https://github.com/travis-ci/travis-build/blob/master/lib/travis/build/templates/header.sh
|
||||||
|
function retry() {
|
||||||
|
local result=0
|
||||||
|
local count=1
|
||||||
|
while [ $count -le 3 ]; do
|
||||||
|
[ $result -ne 0 ] && {
|
||||||
|
echo -e "\nThe command \"$@\" failed. Retrying, $count of 3.\n" >&2
|
||||||
|
}
|
||||||
|
! { "$@"; result=$?; }
|
||||||
|
[ $result -eq 0 ] && break
|
||||||
|
count=$(($count + 1))
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
[ $count -gt 3 ] && {
|
||||||
|
echo -e "\nThe command \"$@\" failed 3 times.\n" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result
|
||||||
|
}
|
||||||
@ -18,13 +18,6 @@ function get_git_mtime {
|
|||||||
|
|
||||||
fail=0
|
fail=0
|
||||||
|
|
||||||
for f in icons/* "icons.qrc"; do
|
|
||||||
if (( $(get_git_mtime "$f") > $(get_git_mtime "contrib/deterministic-build/electrum-icons/") )); then
|
|
||||||
echo "Modification time of $f (" $(get_git_mtime --readable "$f") ") is newer than"\
|
|
||||||
"last update of electrum-icons"
|
|
||||||
fail=1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ $(date +%s -d "2 weeks ago") -gt $(get_git_mtime "contrib/deterministic-build/electrum-locale/") ]; then
|
if [ $(date +%s -d "2 weeks ago") -gt $(get_git_mtime "contrib/deterministic-build/electrum-locale/") ]; then
|
||||||
echo "Last update from electrum-locale is older than 2 weeks."\
|
echo "Last update from electrum-locale is older than 2 weeks."\
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
Subproject commit 201d45cd5d855c4f9de5680ab5c53621574dc6b6
|
|
||||||
@ -1 +1 @@
|
|||||||
Subproject commit e5b28e4717d8c8a736d6d4e5398fa4fa67db80d0
|
Subproject commit ff5ad3a4436dddcc82799f8a91793013240c3b7b
|
||||||
@ -48,9 +48,9 @@ PyQt5-sip==4.19.13 \
|
|||||||
--hash=sha256:a91a308a5e0cc99de1e97afd8f09f46dd7ca20cfaa5890ef254113eebaa1adff \
|
--hash=sha256:a91a308a5e0cc99de1e97afd8f09f46dd7ca20cfaa5890ef254113eebaa1adff \
|
||||||
--hash=sha256:b0342540da479d2713edc68fb21f307473f68da896ad5c04215dae97630e0069 \
|
--hash=sha256:b0342540da479d2713edc68fb21f307473f68da896ad5c04215dae97630e0069 \
|
||||||
--hash=sha256:f997e21b4e26a3397cb7b255b8d1db5b9772c8e0c94b6d870a5a0ab5c27eacaa
|
--hash=sha256:f997e21b4e26a3397cb7b255b8d1db5b9772c8e0c94b6d870a5a0ab5c27eacaa
|
||||||
setuptools==40.6.3 \
|
setuptools==40.8.0 \
|
||||||
--hash=sha256:3b474dad69c49f0d2d86696b68105f3a6f195f7ab655af12ef9a9c326d2b08f8 \
|
--hash=sha256:6e4eec90337e849ade7103723b9a99631c1f0d19990d6e8412dc42f5ae8b304d \
|
||||||
--hash=sha256:e2c1ce9a832f34cf7a31ed010aabcab5008eb65ce8f2aadc04622232c14bdd0b
|
--hash=sha256:e8496c0079f3ac30052ffe69b679bd876c5265686127a3159cfa415669b7f9ab
|
||||||
wheel==0.32.3 \
|
wheel==0.32.3 \
|
||||||
--hash=sha256:029703bf514e16c8271c3821806a1c171220cc5bdd325cbf4e7da1e056a01db6 \
|
--hash=sha256:029703bf514e16c8271c3821806a1c171220cc5bdd325cbf4e7da1e056a01db6 \
|
||||||
--hash=sha256:1e53cdb3f808d5ccd0df57f964263752aa74ea7359526d3da6c02114ec1e1d44
|
--hash=sha256:1e53cdb3f808d5ccd0df57f964263752aa74ea7359526d3da6c02114ec1e1d44
|
||||||
|
|||||||
@ -14,35 +14,35 @@ click==7.0 \
|
|||||||
--hash=sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7
|
--hash=sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7
|
||||||
construct==2.9.45 \
|
construct==2.9.45 \
|
||||||
--hash=sha256:2271a0efd0798679dea825ff47e22a4c550456a5db0ba8baa82f7eae0af0118c
|
--hash=sha256:2271a0efd0798679dea825ff47e22a4c550456a5db0ba8baa82f7eae0af0118c
|
||||||
Cython==0.29.3 \
|
Cython==0.29.4 \
|
||||||
--hash=sha256:1327655db47beb665961d3dc0365e20c9e8e80c234513ab2c7d06ec0dd9d63eb \
|
--hash=sha256:004eeb2fc64e9db4a3bc0d65583d69769c7242d29d9335121cbab776688dc122 \
|
||||||
--hash=sha256:142400f13102403f43576bb92d808a668e29deda5625388cfa39fe0bcf37b3d1 \
|
--hash=sha256:028ee8571884a129e0d5c4d48296f6b3ea679668c096bb65fe8b2ff7ac29d707 \
|
||||||
--hash=sha256:1b4204715141281a631337378f0c15fe660b35e1b6888ca05f1f3f49df3b97d5 \
|
--hash=sha256:162b8b794ca9210c7039d54b6d96cd342e0404e41e7e467baae69f0252d7e52a \
|
||||||
--hash=sha256:23aabaaf8887e6db99df2145de6742f8c92830134735778bf2ae26338f2b406f \
|
--hash=sha256:1aba4cf581d203e8fa3b6a7b432b09416e4f93c0d1f7744834acacfe3e9db424 \
|
||||||
--hash=sha256:2a724c6f21fdf4e3c1e8c5c862ff87f5420fdaecf53a5a0417915e483d90217f \
|
--hash=sha256:1be8f08c87b92a880f2fd19f93293e738ca8647834ad05625635320cec9ecad4 \
|
||||||
--hash=sha256:2c9c8c1c6e8bd3587e5f5db6f865a42195ff2dedcaf5cdb63fdea10c98bd6246 \
|
--hash=sha256:21c707a811912aeb65abe8a66e5adebc759889661c8f4cf677523cd33c609084 \
|
||||||
--hash=sha256:3a1be38b774423605189d60652b3d8a324fc81d213f96569720c8093784245ab \
|
--hash=sha256:234de250ef09ba667fc6a8f6ba07712d3fe5bb8d92d70d2b958d4c56e3172c4a \
|
||||||
--hash=sha256:46be5297a76513e4d5d6e746737d4866a762cfe457e57d7c54baa7ef8fea7e9a \
|
--hash=sha256:33dad82003df518e1242ac3b0592fc63c49d65d0d37b696cb43b7d35085e6bd5 \
|
||||||
--hash=sha256:48dc2ea4c4d3f34ddcad5bc71b1f1cf49830f868832d3e5df803c811e7395b6e \
|
--hash=sha256:54ee6cbc1397b27670e598ae15cab36e826a01605f63bf267a5fd2642bd8a147 \
|
||||||
--hash=sha256:53f33e04d2ed078ac02841741bcd536b546e1f416608084468ab30a87638a466 \
|
--hash=sha256:6058c57657d2704c9fad8a56458173d2f525dce4083ca46e9b99b1b35da2b27f \
|
||||||
--hash=sha256:57b10588618ca19a4cc870f381aa8805bc5fe0c62d19d7f940232ff8a373887c \
|
--hash=sha256:6d3065f39ea1354eba4807e2752e97d57f26d6f68bc4a4c561264ca4300c46cb \
|
||||||
--hash=sha256:6001038341b52301450bb9c62e5d5da825788944572679277e137ffb3596e718 \
|
--hash=sha256:7059e5acac1d7a82e75e553924d9ea59b0e79203adf903cb999287fbcc8f50f1 \
|
||||||
--hash=sha256:70bef52e735607060f327d729be35c820d9018d260a875e4f98b20ba8c4fff96 \
|
--hash=sha256:71c31e01f20a3a7273f6f38760d29170ee89e895be540481130cb173ef6b7246 \
|
||||||
--hash=sha256:7d0f76b251699be8f1f1064dcb12d4b3b2b676ce15ff30c104e0c2091a015142 \
|
--hash=sha256:89225447801e8bd0f6d8e2c0807ded83af8ad7bf4086b5ecf1f22c5a68d1b3e3 \
|
||||||
--hash=sha256:9440b64c1569c26a184b7c778bb221cf9987c5c8486d32cda02302c66ea78980 \
|
--hash=sha256:9783f11fe4a4af66b0aa0da68fda833c10b95edd9099a6dbe710d03bcb96adf2 \
|
||||||
--hash=sha256:956cc97eac6f9d3b16e3b2d2a94c5586af3403ba97945e9d88a4a0f029899646 \
|
--hash=sha256:9a0be0aac30d71fe490a2b0377fca6e13a5242ecc01d09c7a358f1f2fcb07a80 \
|
||||||
--hash=sha256:ae430ad8cce937e07ea566d1d7899eef1fedc8ec512b4d5fa37ebf2c1f879936 \
|
--hash=sha256:9a2cccc26dcf2df1e0048cdf63bd714f1d5dfad457f03b9938c5cc3eef74c9ab \
|
||||||
--hash=sha256:bdb575149881978d62167dd8427402a5872a79bd83e9d51219680670e9f80b40 \
|
--hash=sha256:b0889310f8558eb406a4a853d63553b90c621476f1b5b80b46b1ff57eef198cf \
|
||||||
--hash=sha256:c0ffcddd3dbdf22aae3980931112cc8b2732315a6273988f3205cf5dacf36f45 \
|
--hash=sha256:c46ef7b771c88512435399e5ffbc3a70079d4945123d6fbfc6211b4cfdc4e546 \
|
||||||
--hash=sha256:c133e2efc57426974366ac74f2ef0f1171b860301ac27f72316deacff4ccdc17 \
|
--hash=sha256:c71a77c1047d65e5b4e614053cbb7b567c36359b2bc1d27fba23b984ab6dddd0 \
|
||||||
--hash=sha256:c6e9521d0b77eb1da89e8264eb98c8f5cda7c49a49b8128acfd35f0ca50e56d0 \
|
--hash=sha256:c9361811a1a49db11efce54fedd01a5544af8db074fce471c720bdb85ec9c7a8 \
|
||||||
--hash=sha256:c7cac0220ecb733024e8acfcfb6b593a007185690f2ea470d2392b72510b7187 \
|
--hash=sha256:d021a8326a1d2cdb182b0dd7f49bb42d8a4e6ddfb3c8d388ee5be26d57d49f3b \
|
||||||
--hash=sha256:d53483820ac28f2be2ff13eedd56c0f36a4c583727b551d3d468023556e2336a \
|
--hash=sha256:d1ee3d39c73a094ae5b6e2f9263ae0dc61af1b549a0869ade8c3c30325ed9f26 \
|
||||||
--hash=sha256:d60210784186d61e0ec808d5dbee5d661c7457a57f93cb5fdc456394607ce98c \
|
--hash=sha256:d49d7cf82192edc6e386262a07ceb3515028afbd9009dd8ec669d2c0a9f20128 \
|
||||||
--hash=sha256:d687fb1cd9df28c1515666174c62e54bd894a6a6d0862f89705063cd47739f83 \
|
--hash=sha256:dc5fc1fa072a98f152e46465aaf3e02b3ea36a9d3b8c79bfabd47b0e3ad9226c \
|
||||||
--hash=sha256:d926764d9c768a48b0a16a91696aaa25498057e060934f968fa4c5629b942d85 \
|
--hash=sha256:e290fed7fe73860657af564e596fff87e75cfda861c067e89212970a47826cc6 \
|
||||||
--hash=sha256:d94a2f4ad74732f58d1c771fc5d90a62c4fe4c98d0adfecbc76cd0d8d14bf044 \
|
--hash=sha256:fcf9a9a566ab98495db641eefee471eb03df71e394ee51fdfa9b4c0b9f6928eb \
|
||||||
--hash=sha256:def76a546eeec059666f5f4117dfdf9c78e50fa1f95bdd23b04618c7adf845cd
|
--hash=sha256:fe8c1d2538867bf2753988a4a2d548bcb211fcbba125aa3e9092391b16f47b56
|
||||||
ecdsa==0.13 \
|
ecdsa==0.13 \
|
||||||
--hash=sha256:40d002cf360d0e035cf2cb985e1308d41aaa087cbfc135b2dc2d844296ea546c \
|
--hash=sha256:40d002cf360d0e035cf2cb985e1308d41aaa087cbfc135b2dc2d844296ea546c \
|
||||||
--hash=sha256:64cf1ee26d1cde3c73c6d7d107f835fed7c6a2904aef9eac223d57ad800c43fa
|
--hash=sha256:64cf1ee26d1cde3c73c6d7d107f835fed7c6a2904aef9eac223d57ad800c43fa
|
||||||
@ -110,9 +110,9 @@ requests==2.21.0 \
|
|||||||
safet==0.1.4 \
|
safet==0.1.4 \
|
||||||
--hash=sha256:522c257910f9472e9c77c487425ed286f6721c314653e232bc41c6cedece1bb1 \
|
--hash=sha256:522c257910f9472e9c77c487425ed286f6721c314653e232bc41c6cedece1bb1 \
|
||||||
--hash=sha256:b152874acdc89ff0c8b2d680bfbf020b3e53527c2ad3404489dd61a548aa56a1
|
--hash=sha256:b152874acdc89ff0c8b2d680bfbf020b3e53527c2ad3404489dd61a548aa56a1
|
||||||
setuptools==40.6.3 \
|
setuptools==40.8.0 \
|
||||||
--hash=sha256:3b474dad69c49f0d2d86696b68105f3a6f195f7ab655af12ef9a9c326d2b08f8 \
|
--hash=sha256:6e4eec90337e849ade7103723b9a99631c1f0d19990d6e8412dc42f5ae8b304d \
|
||||||
--hash=sha256:e2c1ce9a832f34cf7a31ed010aabcab5008eb65ce8f2aadc04622232c14bdd0b
|
--hash=sha256:e8496c0079f3ac30052ffe69b679bd876c5265686127a3159cfa415669b7f9ab
|
||||||
six==1.12.0 \
|
six==1.12.0 \
|
||||||
--hash=sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c \
|
--hash=sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c \
|
||||||
--hash=sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73
|
--hash=sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73
|
||||||
|
|||||||
@ -24,9 +24,9 @@ aiohttp==3.5.4 \
|
|||||||
aiohttp-socks==0.2.2 \
|
aiohttp-socks==0.2.2 \
|
||||||
--hash=sha256:e473ee222b001fe33798957b9ce3352b32c187cf41684f8e2259427925914993 \
|
--hash=sha256:e473ee222b001fe33798957b9ce3352b32c187cf41684f8e2259427925914993 \
|
||||||
--hash=sha256:eebd8939a7c3c1e3e7e1b2552c60039b4c65ef6b8b2351efcbdd98290538e310
|
--hash=sha256:eebd8939a7c3c1e3e7e1b2552c60039b4c65ef6b8b2351efcbdd98290538e310
|
||||||
aiorpcX==0.10.2 \
|
aiorpcX==0.10.4 \
|
||||||
--hash=sha256:23a59e625ca50cdf2866a2d8bd54256e648582a8d44d4495b34252f3dbc30e23 \
|
--hash=sha256:7130105d31230f069b0eea4e1893c7199cfe2d89a52a31aec718d37f4449935d \
|
||||||
--hash=sha256:d2bf57fc46ae37d769ab3f5e58ebee4b44acab626e597b5150a201284b9808dd
|
--hash=sha256:e6dfd584f597ee3aa6a8d4cb5755c8ffbbe42754f32728561d9e5940379d5096
|
||||||
async_timeout==3.0.1 \
|
async_timeout==3.0.1 \
|
||||||
--hash=sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f \
|
--hash=sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f \
|
||||||
--hash=sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3
|
--hash=sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3
|
||||||
@ -112,9 +112,9 @@ QDarkStyle==2.5.4 \
|
|||||||
qrcode==6.1 \
|
qrcode==6.1 \
|
||||||
--hash=sha256:3996ee560fc39532910603704c82980ff6d4d5d629f9c3f25f34174ce8606cf5 \
|
--hash=sha256:3996ee560fc39532910603704c82980ff6d4d5d629f9c3f25f34174ce8606cf5 \
|
||||||
--hash=sha256:505253854f607f2abf4d16092c61d4e9d511a3b4392e60bff957a68592b04369
|
--hash=sha256:505253854f607f2abf4d16092c61d4e9d511a3b4392e60bff957a68592b04369
|
||||||
setuptools==40.6.3 \
|
setuptools==40.8.0 \
|
||||||
--hash=sha256:3b474dad69c49f0d2d86696b68105f3a6f195f7ab655af12ef9a9c326d2b08f8 \
|
--hash=sha256:6e4eec90337e849ade7103723b9a99631c1f0d19990d6e8412dc42f5ae8b304d \
|
||||||
--hash=sha256:e2c1ce9a832f34cf7a31ed010aabcab5008eb65ce8f2aadc04622232c14bdd0b
|
--hash=sha256:e8496c0079f3ac30052ffe69b679bd876c5265686127a3159cfa415669b7f9ab
|
||||||
six==1.12.0 \
|
six==1.12.0 \
|
||||||
--hash=sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c \
|
--hash=sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c \
|
||||||
--hash=sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73
|
--hash=sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Run this after a new release to update dependencies
|
# Run this after a new release to update dependencies
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
venv_dir=~/.electrum-venv
|
venv_dir=~/.electrum-venv
|
||||||
contrib=$(dirname "$0")
|
contrib=$(dirname "$0")
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,22 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CONTRIB="$(dirname "$(readlink -e "$0")")"
|
||||||
|
ROOT_FOLDER="$CONTRIB"/..
|
||||||
|
PACKAGES="$ROOT_FOLDER"/packages/
|
||||||
|
LOCALE="$ROOT_FOLDER"/electrum/locale/
|
||||||
|
|
||||||
|
if [ ! -d "$LOCALE" ]; then
|
||||||
|
echo "Run make_locale first!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$PACKAGES" ]; then
|
||||||
|
echo "Run make_packages first!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
pushd ./electrum/gui/kivy/
|
pushd ./electrum/gui/kivy/
|
||||||
|
|
||||||
make theming
|
make theming
|
||||||
|
|||||||
@ -24,6 +24,7 @@ string = string.replace("##VERSION_APK##", APK_VERSION)
|
|||||||
|
|
||||||
files = {
|
files = {
|
||||||
'tgz': "Electrum-%s.tar.gz" % version,
|
'tgz': "Electrum-%s.tar.gz" % version,
|
||||||
|
'appimage': "electrum-%s-x86_64.AppImage" % version,
|
||||||
'zip': "Electrum-%s.zip" % version,
|
'zip': "Electrum-%s.zip" % version,
|
||||||
'mac': "electrum-%s.dmg" % version_mac,
|
'mac': "electrum-%s.dmg" % version_mac,
|
||||||
'win': "electrum-%s.exe" % version_win,
|
'win': "electrum-%s.exe" % version_win,
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
contrib=$(dirname "$0")
|
CONTRIB="$(dirname "$0")"
|
||||||
test -n "$contrib" -a -d "$contrib" || exit
|
test -n "$CONTRIB" -a -d "$CONTRIB" || exit
|
||||||
|
|
||||||
rm "$contrib"/../packages/ -r
|
rm "$CONTRIB"/../packages/ -r
|
||||||
|
|
||||||
#Install pure python modules in electrum directory
|
#Install pure python modules in electrum directory
|
||||||
python3 -m pip install -r $contrib/deterministic-build/requirements.txt -t $contrib/../packages
|
python3 -m pip install -r "$CONTRIB"/deterministic-build/requirements.txt -t "$CONTRIB"/../packages
|
||||||
|
|
||||||
|
|||||||
@ -1,11 +1,31 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
contrib=$(dirname "$0")
|
set -e
|
||||||
packages="$contrib"/../packages/
|
|
||||||
|
|
||||||
if [ ! -d "$packages" ]; then
|
CONTRIB="$(dirname "$(readlink -e "$0")")"
|
||||||
|
ROOT_FOLDER="$CONTRIB"/..
|
||||||
|
PACKAGES="$ROOT_FOLDER"/packages/
|
||||||
|
LOCALE="$ROOT_FOLDER"/electrum/locale/
|
||||||
|
|
||||||
|
if [ ! -d "$LOCALE" ]; then
|
||||||
|
echo "Run make_locale first!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$PACKAGES" ]; then
|
||||||
echo "Run make_packages first!"
|
echo "Run make_packages first!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
python3 setup.py sdist --format=zip,gztar
|
(
|
||||||
|
cd "$ROOT_FOLDER"
|
||||||
|
|
||||||
|
echo "'git clean -fx' would delete the following files: >>>"
|
||||||
|
git clean -fx --dry-run
|
||||||
|
echo "<<<"
|
||||||
|
|
||||||
|
# we could build the kivy atlas potentially?
|
||||||
|
#(cd electrum/gui/kivy/; make theming) || echo "building kivy atlas failed! skipping."
|
||||||
|
|
||||||
|
python3 setup.py --quiet sdist --format=zip,gztar
|
||||||
|
)
|
||||||
|
|||||||
@ -1,19 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
RED='\033[0;31m'
|
. $(dirname "$0")/../build_tools_util.sh
|
||||||
BLUE='\033[0,34m'
|
|
||||||
YELLOW='\033[0;33m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
function info {
|
|
||||||
printf "\r💬 ${BLUE}INFO:${NC} ${1}\n"
|
|
||||||
}
|
|
||||||
function fail {
|
|
||||||
printf "\r🗯 ${RED}ERROR:${NC} ${1}\n"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
function warn {
|
|
||||||
printf "\r⚠️ ${YELLOW}WARNING:${NC} ${1}\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
function DoCodeSignMaybe { # ARGS: infoName fileOrDirName codesignIdentity
|
function DoCodeSignMaybe { # ARGS: infoName fileOrDirName codesignIdentity
|
||||||
infoName="$1"
|
infoName="$1"
|
||||||
|
|||||||
@ -5,7 +5,7 @@ PYTHON_VERSION=3.6.4
|
|||||||
BUILDDIR=/tmp/electrum-build
|
BUILDDIR=/tmp/electrum-build
|
||||||
PACKAGE=Electrum
|
PACKAGE=Electrum
|
||||||
GIT_REPO=https://github.com/spesmilo/electrum
|
GIT_REPO=https://github.com/spesmilo/electrum
|
||||||
LIBSECP_VERSION=452d8e4d2a2f9f1b5be6b02e18f1ba102e5ca0b4
|
LIBSECP_VERSION="b408c6a8b287003d1ade5709e6f7bc3c7f1d5be7"
|
||||||
|
|
||||||
. $(dirname "$0")/base.sh
|
. $(dirname "$0")/base.sh
|
||||||
|
|
||||||
@ -48,8 +48,14 @@ pyenv global $PYTHON_VERSION || \
|
|||||||
fail "Unable to use Python $PYTHON_VERSION"
|
fail "Unable to use Python $PYTHON_VERSION"
|
||||||
|
|
||||||
|
|
||||||
|
info "install dependencies specific to binaries"
|
||||||
|
# note that this also installs pinned versions of both pip and setuptools
|
||||||
|
python3 -m pip install -Ir ./contrib/deterministic-build/requirements-binaries.txt --user \
|
||||||
|
|| fail "Could not install pyinstaller"
|
||||||
|
|
||||||
|
|
||||||
info "Installing pyinstaller"
|
info "Installing pyinstaller"
|
||||||
python3 -m pip install -I --user pyinstaller==3.4 || fail "Could not install pyinstaller"
|
python3 -m pip install -I --user pyinstaller==3.4 --no-use-pep517 || fail "Could not install pyinstaller"
|
||||||
|
|
||||||
info "Using these versions for building $PACKAGE:"
|
info "Using these versions for building $PACKAGE:"
|
||||||
sw_vers
|
sw_vers
|
||||||
@ -66,7 +72,6 @@ rm -rf $BUILDDIR > /dev/null 2>&1
|
|||||||
mkdir $BUILDDIR
|
mkdir $BUILDDIR
|
||||||
|
|
||||||
cp -R ./contrib/deterministic-build/electrum-locale/locale/ ./electrum/locale/
|
cp -R ./contrib/deterministic-build/electrum-locale/locale/ ./electrum/locale/
|
||||||
cp ./contrib/deterministic-build/electrum-icons/icons_rc.py ./electrum/gui/qt/
|
|
||||||
|
|
||||||
|
|
||||||
info "Downloading libusb..."
|
info "Downloading libusb..."
|
||||||
@ -99,8 +104,7 @@ DoCodeSignMaybe "CalinsQRReader.app" "${d}/build/Release/CalinsQRReader.app" "$A
|
|||||||
|
|
||||||
|
|
||||||
info "Installing requirements..."
|
info "Installing requirements..."
|
||||||
python3 -m pip install -Ir ./contrib/deterministic-build/requirements.txt --user && \
|
python3 -m pip install -Ir ./contrib/deterministic-build/requirements.txt --user || \
|
||||||
python3 -m pip install -Ir ./contrib/deterministic-build/requirements-binaries.txt --user || \
|
|
||||||
fail "Could not install requirements"
|
fail "Could not install requirements"
|
||||||
|
|
||||||
info "Installing hardware wallet requirements..."
|
info "Installing hardware wallet requirements..."
|
||||||
@ -108,7 +112,7 @@ python3 -m pip install -Ir ./contrib/deterministic-build/requirements-hw.txt --u
|
|||||||
fail "Could not install hardware wallet requirements"
|
fail "Could not install hardware wallet requirements"
|
||||||
|
|
||||||
info "Building $PACKAGE..."
|
info "Building $PACKAGE..."
|
||||||
python3 setup.py install --user > /dev/null || fail "Could not build $PACKAGE"
|
python3 -m pip install --user . > /dev/null || fail "Could not build $PACKAGE"
|
||||||
|
|
||||||
info "Faking timestamps..."
|
info "Faking timestamps..."
|
||||||
for d in ~/Library/Python/ ~/.pyenv .; do
|
for d in ~/Library/Python/ ~/.pyenv .; do
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import sys, os
|
|||||||
PACKAGE='Electrum'
|
PACKAGE='Electrum'
|
||||||
PYPKG='electrum'
|
PYPKG='electrum'
|
||||||
MAIN_SCRIPT='run_electrum'
|
MAIN_SCRIPT='run_electrum'
|
||||||
ICONS_FILE='electrum.icns'
|
ICONS_FILE=PYPKG + '/gui/icons/electrum.icns'
|
||||||
APP_SIGN = os.environ.get('APP_SIGN', '')
|
APP_SIGN = os.environ.get('APP_SIGN', '')
|
||||||
|
|
||||||
def fail(*msg):
|
def fail(*msg):
|
||||||
@ -66,11 +66,17 @@ hiddenimports += collect_submodules('keepkeylib')
|
|||||||
hiddenimports += collect_submodules('websocket')
|
hiddenimports += collect_submodules('websocket')
|
||||||
hiddenimports += collect_submodules('ckcc')
|
hiddenimports += collect_submodules('ckcc')
|
||||||
|
|
||||||
|
# safetlib imports PyQt5.Qt. We use a local updated copy of pinmatrix.py until they
|
||||||
|
# release a new version that includes https://github.com/archos-safe-t/python-safet/commit/b1eab3dba4c04fdfc1fcf17b66662c28c5f2380e
|
||||||
|
hiddenimports.remove('safetlib.qt.pinmatrix')
|
||||||
|
|
||||||
|
|
||||||
datas = [
|
datas = [
|
||||||
(electrum + PYPKG + '/*.json', PYPKG),
|
(electrum + PYPKG + '/*.json', PYPKG),
|
||||||
(electrum + PYPKG + '/wordlist/english.txt', PYPKG + '/wordlist'),
|
(electrum + PYPKG + '/wordlist/english.txt', PYPKG + '/wordlist'),
|
||||||
(electrum + PYPKG + '/locale', PYPKG + '/locale'),
|
(electrum + PYPKG + '/locale', PYPKG + '/locale'),
|
||||||
(electrum + PYPKG + '/plugins', PYPKG + '/plugins'),
|
(electrum + PYPKG + '/plugins', PYPKG + '/plugins'),
|
||||||
|
(electrum + PYPKG + '/gui/icons', PYPKG + '/gui/icons'),
|
||||||
]
|
]
|
||||||
datas += collect_data_files('trezorlib')
|
datas += collect_data_files('trezorlib')
|
||||||
datas += collect_data_files('safetlib')
|
datas += collect_data_files('safetlib')
|
||||||
|
|||||||
@ -85,4 +85,4 @@ dmg dmg Electrum_uncompressed.dmg electrum-$VERSION.dmg || fail "Unable to creat
|
|||||||
rm Electrum_uncompressed.dmg
|
rm Electrum_uncompressed.dmg
|
||||||
|
|
||||||
echo "Done."
|
echo "Done."
|
||||||
md5sum electrum-$VERSION.dmg
|
sha256sum electrum-$VERSION.dmg
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
Cython>=0.27
|
Cython>=0.27
|
||||||
trezor[hidapi]>=0.11.0
|
trezor[hidapi]>=0.11.1
|
||||||
safet[hidapi]>=0.1.0
|
safet[hidapi]>=0.1.0
|
||||||
keepkey
|
keepkey
|
||||||
btchip-python>=0.1.26
|
btchip-python>=0.1.26
|
||||||
|
|||||||
@ -6,7 +6,7 @@ dnspython
|
|||||||
jsonrpclib-pelix
|
jsonrpclib-pelix
|
||||||
qdarkstyle<2.6
|
qdarkstyle<2.6
|
||||||
aiorpcx>=0.9,<0.11
|
aiorpcx>=0.9,<0.11
|
||||||
aiohttp
|
aiohttp>=3.3.0
|
||||||
aiohttp_socks
|
aiohttp_socks
|
||||||
certifi
|
certifi
|
||||||
pylibscrypt=1.7.1
|
pylibscrypt==1.7.1
|
||||||
|
|||||||
4
contrib/sign_version
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
version=`python3 -c "import electrum; print(electrum.version.ELECTRUM_VERSION)"`
|
||||||
|
sig=`./run_electrum -w $SIGNING_WALLET signmessage $SIGNING_ADDRESS $version`
|
||||||
|
echo "{ \"version\":\"$version\", \"signatures\":{ \"$SIGNING_ADDRESS\":\"$sig\"}}"
|
||||||
@ -404,6 +404,7 @@ class AddressSynchronizer(PrintError):
|
|||||||
@profiler
|
@profiler
|
||||||
def load_local_history(self):
|
def load_local_history(self):
|
||||||
self._history_local = {} # address -> set(txid)
|
self._history_local = {} # address -> set(txid)
|
||||||
|
self._address_history_changed_events = defaultdict(asyncio.Event) # address -> Event
|
||||||
for txid in itertools.chain(self.txi, self.txo):
|
for txid in itertools.chain(self.txi, self.txo):
|
||||||
self._add_tx_to_local_history(txid)
|
self._add_tx_to_local_history(txid)
|
||||||
|
|
||||||
@ -543,6 +544,7 @@ class AddressSynchronizer(PrintError):
|
|||||||
cur_hist = self._history_local.get(addr, set())
|
cur_hist = self._history_local.get(addr, set())
|
||||||
cur_hist.add(txid)
|
cur_hist.add(txid)
|
||||||
self._history_local[addr] = cur_hist
|
self._history_local[addr] = cur_hist
|
||||||
|
self._mark_address_history_changed(addr)
|
||||||
|
|
||||||
def _remove_tx_from_local_history(self, txid):
|
def _remove_tx_from_local_history(self, txid):
|
||||||
with self.transaction_lock:
|
with self.transaction_lock:
|
||||||
@ -555,6 +557,21 @@ class AddressSynchronizer(PrintError):
|
|||||||
else:
|
else:
|
||||||
self._history_local[addr] = cur_hist
|
self._history_local[addr] = cur_hist
|
||||||
|
|
||||||
|
def _mark_address_history_changed(self, addr: str) -> None:
|
||||||
|
# history for this address changed, wake up coroutines:
|
||||||
|
self._address_history_changed_events[addr].set()
|
||||||
|
# clear event immediately so that coroutines can wait() for the next change:
|
||||||
|
self._address_history_changed_events[addr].clear()
|
||||||
|
|
||||||
|
async def wait_for_address_history_to_change(self, addr: str) -> None:
|
||||||
|
"""Wait until the server tells us about a new transaction related to addr.
|
||||||
|
|
||||||
|
Unconfirmed and confirmed transactions are not distinguished, and so e.g. SPV
|
||||||
|
is not taken into account.
|
||||||
|
"""
|
||||||
|
assert self.is_mine(addr), "address needs to be is_mine to be watched"
|
||||||
|
await self._address_history_changed_events[addr].wait()
|
||||||
|
|
||||||
def add_unverified_tx(self, tx_hash, tx_height):
|
def add_unverified_tx(self, tx_hash, tx_height):
|
||||||
if tx_hash in self.verified_tx:
|
if tx_hash in self.verified_tx:
|
||||||
if tx_height in (TX_HEIGHT_UNCONFIRMED, TX_HEIGHT_UNCONF_PARENT):
|
if tx_height in (TX_HEIGHT_UNCONFIRMED, TX_HEIGHT_UNCONF_PARENT):
|
||||||
|
|||||||
@ -27,7 +27,7 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from typing import List, TYPE_CHECKING, Tuple
|
from typing import List, TYPE_CHECKING, Tuple, NamedTuple, Any
|
||||||
|
|
||||||
from . import bitcoin
|
from . import bitcoin
|
||||||
from . import keystore
|
from . import keystore
|
||||||
@ -56,6 +56,12 @@ class ScriptTypeNotSupported(Exception): pass
|
|||||||
class GoBack(Exception): pass
|
class GoBack(Exception): pass
|
||||||
|
|
||||||
|
|
||||||
|
class WizardStackItem(NamedTuple):
|
||||||
|
action: Any
|
||||||
|
args: Any
|
||||||
|
storage_data: dict
|
||||||
|
|
||||||
|
|
||||||
class BaseWizard(object):
|
class BaseWizard(object):
|
||||||
|
|
||||||
def __init__(self, config: SimpleConfig, plugins: Plugins, storage: WalletStorage):
|
def __init__(self, config: SimpleConfig, plugins: Plugins, storage: WalletStorage):
|
||||||
@ -64,7 +70,7 @@ class BaseWizard(object):
|
|||||||
self.plugins = plugins
|
self.plugins = plugins
|
||||||
self.storage = storage
|
self.storage = storage
|
||||||
self.wallet = None # type: Abstract_Wallet
|
self.wallet = None # type: Abstract_Wallet
|
||||||
self.stack = []
|
self._stack = [] # type: List[WizardStackItem]
|
||||||
self.plugin = None
|
self.plugin = None
|
||||||
self.keystores = []
|
self.keystores = []
|
||||||
self.is_kivy = config.get('gui') == 'kivy'
|
self.is_kivy = config.get('gui') == 'kivy'
|
||||||
@ -76,7 +82,8 @@ class BaseWizard(object):
|
|||||||
def run(self, *args):
|
def run(self, *args):
|
||||||
action = args[0]
|
action = args[0]
|
||||||
args = args[1:]
|
args = args[1:]
|
||||||
self.stack.append((action, args))
|
storage_data = self.storage.get_all_data()
|
||||||
|
self._stack.append(WizardStackItem(action, args, storage_data))
|
||||||
if not action:
|
if not action:
|
||||||
return
|
return
|
||||||
if type(action) is tuple:
|
if type(action) is tuple:
|
||||||
@ -91,14 +98,23 @@ class BaseWizard(object):
|
|||||||
raise Exception("unknown action", action)
|
raise Exception("unknown action", action)
|
||||||
|
|
||||||
def can_go_back(self):
|
def can_go_back(self):
|
||||||
return len(self.stack)>1
|
return len(self._stack) > 1
|
||||||
|
|
||||||
def go_back(self):
|
def go_back(self):
|
||||||
if not self.can_go_back():
|
if not self.can_go_back():
|
||||||
return
|
return
|
||||||
self.stack.pop()
|
# pop 'current' frame
|
||||||
action, args = self.stack.pop()
|
self._stack.pop()
|
||||||
self.run(action, *args)
|
# pop 'previous' frame
|
||||||
|
stack_item = self._stack.pop()
|
||||||
|
# try to undo side effects since we last entered 'previous' frame
|
||||||
|
# FIXME only self.storage is properly restored
|
||||||
|
self.storage.overwrite_all_data(stack_item.storage_data)
|
||||||
|
# rerun 'previous' frame
|
||||||
|
self.run(stack_item.action, *stack_item.args)
|
||||||
|
|
||||||
|
def reset_stack(self):
|
||||||
|
self._stack = []
|
||||||
|
|
||||||
def new(self):
|
def new(self):
|
||||||
name = os.path.basename(self.storage.path)
|
name = os.path.basename(self.storage.path)
|
||||||
@ -150,8 +166,8 @@ class BaseWizard(object):
|
|||||||
|
|
||||||
def choose_multisig(self):
|
def choose_multisig(self):
|
||||||
def on_multisig(m, n):
|
def on_multisig(m, n):
|
||||||
self.multisig_type = "%dof%d"%(m, n)
|
multisig_type = "%dof%d" % (m, n)
|
||||||
self.storage.put('wallet_type', self.multisig_type)
|
self.storage.put('wallet_type', multisig_type)
|
||||||
self.n = n
|
self.n = n
|
||||||
self.run('choose_keystore')
|
self.run('choose_keystore')
|
||||||
self.multisig_dialog(run_next=on_multisig)
|
self.multisig_dialog(run_next=on_multisig)
|
||||||
@ -475,7 +491,7 @@ class BaseWizard(object):
|
|||||||
self.keystores.append(k)
|
self.keystores.append(k)
|
||||||
if len(self.keystores) == 1:
|
if len(self.keystores) == 1:
|
||||||
xpub = k.get_master_public_key()
|
xpub = k.get_master_public_key()
|
||||||
self.stack = []
|
self.reset_stack()
|
||||||
self.run('show_xpub_and_add_cosigners', xpub)
|
self.run('show_xpub_and_add_cosigners', xpub)
|
||||||
elif len(self.keystores) < self.n:
|
elif len(self.keystores) < self.n:
|
||||||
self.run('choose_keystore')
|
self.run('choose_keystore')
|
||||||
|
|||||||
@ -267,21 +267,21 @@ class Blockchain(util.PrintError):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def verify_header(cls, header: dict, prev_hash: str, target: int, expected_header_hash: str=None) -> None:
|
def verify_header(cls, header: dict, prev_hash: str, target: int, expected_header_hash: str=None) -> None:
|
||||||
_hash = hash_header(header)
|
_hash = hash_header(header)
|
||||||
#_powhash = pow_hash_header(header)
|
_powhash = pow_hash_header(header)
|
||||||
if expected_header_hash and expected_header_hash != _hash:
|
if expected_header_hash and expected_header_hash != _hash:
|
||||||
raise Exception("hash mismatches with expected: {} vs {}".format(expected_header_hash, _hash))
|
raise Exception("hash mismatches with expected: {} vs {}".format(expected_header_hash, _hash))
|
||||||
if prev_hash != header.get('prev_block_hash'):
|
if prev_hash != header.get('prev_block_hash'):
|
||||||
raise Exception("prev hash mismatch: %s vs %s" % (prev_hash, header.get('prev_block_hash')))
|
raise Exception("prev hash mismatch: %s vs %s" % (prev_hash, header.get('prev_block_hash')))
|
||||||
if constants.net.TESTNET:
|
if constants.net.TESTNET:
|
||||||
return
|
return
|
||||||
#bits = cls.target_to_bits(target)
|
bits = cls.target_to_bits(target)
|
||||||
bits = target
|
bits = target
|
||||||
if bits != header.get('bits'):
|
if bits != header.get('bits'):
|
||||||
raise Exception("bits mismatch: %s vs %s" % (bits, header.get('bits')))
|
raise Exception("bits mismatch: %s vs %s" % (bits, header.get('bits')))
|
||||||
block_hash_as_num = int.from_bytes(bfh(_hash), byteorder='big')
|
block_hash_as_num = int.from_bytes(bfh(_hash), byteorder='big')
|
||||||
#target_val = cls.bits_to_target(bits)
|
target_val = cls.bits_to_target(bits)
|
||||||
#if int('0x' + _powhash, 16) > target_val:
|
if int('0x' + _powhash, 16) > target_val:
|
||||||
# raise Exception("insufficient proof of work: %s vs target %s" % (int('0x' + _hash, 16), target_val))
|
raise Exception("insufficient proof of work: %s vs target %s" % (int('0x' + _hash, 16), target_val))
|
||||||
|
|
||||||
def verify_chunk(self, index: int, data: bytes) -> None:
|
def verify_chunk(self, index: int, data: bytes) -> None:
|
||||||
num = len(data) // HEADER_SIZE
|
num = len(data) // HEADER_SIZE
|
||||||
|
|||||||
@ -537,11 +537,14 @@ class Commands:
|
|||||||
return tx.as_dict()
|
return tx.as_dict()
|
||||||
|
|
||||||
@command('w')
|
@command('w')
|
||||||
def history(self, year=None, show_addresses=False, show_fiat=False, show_fees=False):
|
def history(self, year=None, show_addresses=False, show_fiat=False, show_fees=False,
|
||||||
|
from_height=None, to_height=None):
|
||||||
"""Wallet history. Returns the transaction history of your wallet."""
|
"""Wallet history. Returns the transaction history of your wallet."""
|
||||||
kwargs = {
|
kwargs = {
|
||||||
'show_addresses': show_addresses,
|
'show_addresses': show_addresses,
|
||||||
'show_fees': show_fees,
|
'show_fees': show_fees,
|
||||||
|
'from_height': from_height,
|
||||||
|
'to_height': to_height,
|
||||||
}
|
}
|
||||||
if year:
|
if year:
|
||||||
import time
|
import time
|
||||||
@ -831,7 +834,9 @@ command_options = {
|
|||||||
'show_fees': (None, "Show miner fees paid by transactions"),
|
'show_fees': (None, "Show miner fees paid by transactions"),
|
||||||
'year': (None, "Show history for a given year"),
|
'year': (None, "Show history for a given year"),
|
||||||
'fee_method': (None, "Fee estimation method to use"),
|
'fee_method': (None, "Fee estimation method to use"),
|
||||||
'fee_level': (None, "Float between 0.0 and 1.0, representing fee slider position")
|
'fee_level': (None, "Float between 0.0 and 1.0, representing fee slider position"),
|
||||||
|
'from_height': (None, "Only show transactions that confirmed after given block height"),
|
||||||
|
'to_height': (None, "Only show transactions that confirmed before given block height"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -843,6 +848,8 @@ arg_types = {
|
|||||||
'nbits': int,
|
'nbits': int,
|
||||||
'imax': int,
|
'imax': int,
|
||||||
'year': int,
|
'year': int,
|
||||||
|
'from_height': int,
|
||||||
|
'to_height': int,
|
||||||
'tx': tx_from_str,
|
'tx': tx_from_str,
|
||||||
'pubkeys': json_loads,
|
'pubkeys': json_loads,
|
||||||
'jsontx': json_loads,
|
'jsontx': json_loads,
|
||||||
|
|||||||
@ -49,8 +49,8 @@ class BitcoinMainnet(AbstractNet):
|
|||||||
TESTNET = False
|
TESTNET = False
|
||||||
WIF_PREFIX = 0xa3
|
WIF_PREFIX = 0xa3
|
||||||
ADDRTYPE_P2PKH = 35
|
ADDRTYPE_P2PKH = 35
|
||||||
ADDRTYPE_P2SH = 8
|
ADDRTYPE_P2SH = 94
|
||||||
SEGWIT_HRP = "ltc"
|
SEGWIT_HRP = "flo"
|
||||||
GENESIS = "09c7781c9df90708e278c35d38ea5c9041d7ecfcdd1c56ba67274b7cff3e1cea"
|
GENESIS = "09c7781c9df90708e278c35d38ea5c9041d7ecfcdd1c56ba67274b7cff3e1cea"
|
||||||
DEFAULT_PORTS = {'t': '50001', 's': '50002'}
|
DEFAULT_PORTS = {'t': '50001', 's': '50002'}
|
||||||
DEFAULT_SERVERS = read_json('servers.json', {})
|
DEFAULT_SERVERS = read_json('servers.json', {})
|
||||||
@ -70,7 +70,7 @@ class BitcoinMainnet(AbstractNet):
|
|||||||
'p2wpkh': 0x04b24746, # zpub
|
'p2wpkh': 0x04b24746, # zpub
|
||||||
'p2wsh': 0x02aa7ed3, # Zpub
|
'p2wsh': 0x02aa7ed3, # Zpub
|
||||||
}
|
}
|
||||||
BIP44_COIN_TYPE = 2
|
BIP44_COIN_TYPE = 216
|
||||||
# FLO Network constants
|
# FLO Network constants
|
||||||
fPowAllowMinDifficultyBlocks = False
|
fPowAllowMinDifficultyBlocks = False
|
||||||
fPowNoRetargeting = False
|
fPowNoRetargeting = False
|
||||||
@ -103,8 +103,8 @@ class BitcoinTestnet(AbstractNet):
|
|||||||
TESTNET = True
|
TESTNET = True
|
||||||
WIF_PREFIX = 0xef
|
WIF_PREFIX = 0xef
|
||||||
ADDRTYPE_P2PKH = 115
|
ADDRTYPE_P2PKH = 115
|
||||||
ADDRTYPE_P2SH = 198
|
ADDRTYPE_P2SH = 58
|
||||||
SEGWIT_HRP = "tltc"
|
SEGWIT_HRP = "tflo"
|
||||||
GENESIS = "9b7bc86236c34b5e3a39367c036b7fe8807a966c22a7a1f0da2a198a27e03731"
|
GENESIS = "9b7bc86236c34b5e3a39367c036b7fe8807a966c22a7a1f0da2a198a27e03731"
|
||||||
DEFAULT_PORTS = {'t': '51001', 's': '51002'}
|
DEFAULT_PORTS = {'t': '51001', 's': '51002'}
|
||||||
DEFAULT_SERVERS = read_json('servers_testnet.json', {})
|
DEFAULT_SERVERS = read_json('servers_testnet.json', {})
|
||||||
|
|||||||
@ -37,7 +37,7 @@ from .jsonrpc import VerifyingJSONRPCServer
|
|||||||
from .version import ELECTRUM_VERSION
|
from .version import ELECTRUM_VERSION
|
||||||
from .network import Network
|
from .network import Network
|
||||||
from .util import (json_decode, DaemonThread, print_error, to_string,
|
from .util import (json_decode, DaemonThread, print_error, to_string,
|
||||||
create_and_start_event_loop, profiler)
|
create_and_start_event_loop, profiler, standardize_path)
|
||||||
from .wallet import Wallet, Abstract_Wallet
|
from .wallet import Wallet, Abstract_Wallet
|
||||||
from .storage import WalletStorage
|
from .storage import WalletStorage
|
||||||
from .commands import known_commands, Commands
|
from .commands import known_commands, Commands
|
||||||
@ -235,6 +235,7 @@ class Daemon(DaemonThread):
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
def load_wallet(self, path, password) -> Optional[Abstract_Wallet]:
|
def load_wallet(self, path, password) -> Optional[Abstract_Wallet]:
|
||||||
|
path = standardize_path(path)
|
||||||
# wizard will be launched if we return
|
# wizard will be launched if we return
|
||||||
if path in self.wallets:
|
if path in self.wallets:
|
||||||
wallet = self.wallets[path]
|
wallet = self.wallets[path]
|
||||||
@ -262,6 +263,13 @@ class Daemon(DaemonThread):
|
|||||||
def get_wallet(self, path):
|
def get_wallet(self, path):
|
||||||
return self.wallets.get(path)
|
return self.wallets.get(path)
|
||||||
|
|
||||||
|
def delete_wallet(self, path):
|
||||||
|
self.stop_wallet(path)
|
||||||
|
if os.path.exists(path):
|
||||||
|
os.unlink(path)
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def stop_wallet(self, path):
|
def stop_wallet(self, path):
|
||||||
wallet = self.wallets.pop(path, None)
|
wallet = self.wallets.pop(path, None)
|
||||||
if not wallet: return
|
if not wallet: return
|
||||||
|
|||||||
@ -14,8 +14,8 @@ from typing import Sequence
|
|||||||
|
|
||||||
from .bitcoin import COIN
|
from .bitcoin import COIN
|
||||||
from .i18n import _
|
from .i18n import _
|
||||||
from .util import PrintError, ThreadJob, make_dir, log_exceptions
|
from .util import (PrintError, ThreadJob, make_dir, log_exceptions,
|
||||||
from .util import make_aiohttp_session
|
make_aiohttp_session, resource_path)
|
||||||
from .network import Network
|
from .network import Network
|
||||||
from .simple_config import SimpleConfig
|
from .simple_config import SimpleConfig
|
||||||
|
|
||||||
@ -402,7 +402,7 @@ def dictinvert(d):
|
|||||||
return inv
|
return inv
|
||||||
|
|
||||||
def get_exchanges_and_currencies():
|
def get_exchanges_and_currencies():
|
||||||
path = os.path.join(os.path.dirname(__file__), 'currencies.json')
|
path = resource_path('currencies.json')
|
||||||
try:
|
try:
|
||||||
with open(path, 'r', encoding='utf-8') as f:
|
with open(path, 'r', encoding='utf-8') as f:
|
||||||
return json.loads(f.read())
|
return json.loads(f.read())
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 687 B After Width: | Height: | Size: 687 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 528 B After Width: | Height: | Size: 528 B |
|
Before Width: | Height: | Size: 788 B After Width: | Height: | Size: 788 B |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 199 B After Width: | Height: | Size: 199 B |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 463 B After Width: | Height: | Size: 463 B |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 314 B After Width: | Height: | Size: 314 B |
|
Before Width: | Height: | Size: 380 B After Width: | Height: | Size: 380 B |
|
Before Width: | Height: | Size: 272 B After Width: | Height: | Size: 272 B |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 392 B After Width: | Height: | Size: 392 B |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |