Compare commits

...

88 Commits

Author SHA1 Message Date
Vivek Teega
5d39cce124
Merge pull request #10 from bitspill/master
flo basic trezor support
2019-03-02 01:14:10 +05:30
Jeremiah Buddenhagen
5975c105d6 flo basic trezor support 2019-02-22 13:43:37 -08:00
Vivek Teega
9ab1aab6f8 Upstream Merge 2019-02-16 10:43:21 +05:30
SomberNight
0de954546a
test python version in main script
for better error text on old python

related: #5008, #5129
2019-02-15 22:06:10 +01:00
SomberNight
92bf409bf0
scripts: add "quick_start" to showcase some basic functionality 2019-02-15 21:14:08 +01:00
ThomasV
25a460f855 Merge branch 'network_walk' 2019-02-15 17:37:59 +01:00
ThomasV
52520490c5 improve network send_multiple_requests 2019-02-15 17:37:15 +01:00
SomberNight
5313591c28
synchronizer: disconnect from server if cannot deserialize txn 2019-02-15 17:22:24 +01:00
SomberNight
7b8114f865
synchronizer: allow server not finding txn sometimes
User has wallet file with history that includes some txid; corresponding
raw tx is not in the "transactions" dict in the file however.
When the synchronizer starts up, it requests this "missing" txn from
the server... but what if the server does not know about it?
Maybe it was reorged and is not in the new best chain,
and not even in mempool. This was not handled previously.

fix #5122
2019-02-14 20:54:55 +01:00
ThomasV
f60d1e7cb6 fix variable name in contrib/sign_version 2019-02-13 23:25:58 +01:00
ThomasV
c725c05947 update make_download 2019-02-13 23:19:34 +01:00
ThomasV
87c596fa1d prepare release 3.3.4 2019-02-13 22:23:30 +01:00
ThomasV
0e78e15fa4 update locale submodule 2019-02-13 22:20:56 +01:00
ThomasV
4e9dd679ab add contrib/sign_version 2019-02-13 21:46:48 +01:00
SomberNight
2867c2ef7a
update release notes 2019-02-13 20:23:54 +01:00
SomberNight
ec86850a2e
trezor: fix minor error handling issue
AttributeError: 'TrezorFailure' object has no attribute 'message'
2019-02-13 18:33:48 +01:00
SomberNight
e2eb051eed
keystore bip39: minor clean-up 2019-02-13 15:03:32 +01:00
ghost43
c8562f5362
network: reintroduce network.debug (#5093)
network.debug and interface.debug were removed during the asyncio-aiorpcx
network-rewrite.
2019-02-12 20:23:43 +01:00
SomberNight
086372f68a
wallet get_full_history: add from/to_height info to summary 2019-02-12 19:38:15 +01:00
SomberNight
019884a98b
network: follow-up 38ab7ee554 2019-02-12 19:23:58 +01:00
SomberNight
2174fc0676
cli history: add option to filter by block height 2019-02-12 18:38:35 +01:00
SomberNight
38ab7ee554
network: catch untrusted exceptions from server in public methods
and re-raise a wrapper exception (that retains the original exc in a field)

closes #5111
2019-02-12 17:02:15 +01:00
SomberNight
fd62ba874b
kivy: rm dead code 2019-02-11 20:22:03 +01:00
SomberNight
026448837f
no more "import *"
fixes #5101
fixes #5105
2019-02-11 20:21:24 +01:00
SomberNight
8072ad1ad9
network broadcast_transaction: make error text clearer 2019-02-11 16:36:01 +01:00
SomberNight
ebeed4736f
qt utxo_list: show full prevout_n in outpoint column
previously, if prevout_n was >=10, the ":" char or even digits were cut
2019-02-10 21:20:44 +01:00
SomberNight
c23b869d3c
qt MyTreeView subclasses: change "headers" from list to dict 2019-02-10 21:13:53 +01:00
SomberNight
5aafcb2875
qt MyTreeView subclasses: use IntEnum for columns 2019-02-10 21:00:08 +01:00
SomberNight
cd097d6bb8
qt history list: update_tx_mined_status was not updating 'date' for tx
fixes #5096
2019-02-10 06:36:58 +01:00
ThomasV
eb96d422f7 import version module 2019-02-09 12:15:46 +01:00
SomberNight
d78537c8c4
rerun freeze_packages 2019-02-08 19:19:02 +01:00
SomberNight
df9087970b
update block header checkpoints 2019-02-08 16:38:59 +01:00
SomberNight
699562c78d
bump libsecp256k1 version 2019-02-08 16:17:52 +01:00
ThomasV
01eaf0fe4e
Merge pull request #5052 from JeremyRand/utxolist-for-loop
Refactor for loop in UTXOList
2019-02-08 15:53:28 +01:00
ThomasV
b06b8753e6 fix #5088 2019-02-08 12:59:06 +01:00
ThomasV
1da1f0bfea fix #4984 2019-02-08 11:17:48 +01:00
ThomasV
8f4967f7d0 qt wizard: select_storage 2019-02-08 09:10:07 +01:00
ThomasV
beb9f63274 follow-up prev 2019-02-08 08:27:23 +01:00
ThomasV
58c2c15266 follow up 6fb974227b 2019-02-08 08:21:18 +01:00
SomberNight
fc72e661de
requirements: set min version for aiohttp 2019-02-08 02:24:44 +01:00
SomberNight
89bb49e117
mac build: install pinned pip and setuptools earlier
also add --no-use-pep517 option for pyinstaller (see 4b560250a6)
2019-02-07 20:19:07 +01:00
SomberNight
2c71b9da0c
icons: instead of symlinks, just mv "icons" dir
symlinks are really inconvenient on Windows
(when running from cloned source)

follow-up #5055
2019-02-07 20:01:52 +01:00
SomberNight
9beabc0311
fix prev: run make_locale before building android apk 2019-02-07 17:57:15 +01:00
SomberNight
ba08b2279d
kivy build: test and document that make_locale is to be run first 2019-02-07 16:45:09 +01:00
ThomasV
6fb974227b fix #5082 2019-02-07 13:56:11 +01:00
ThomasV
6ade5903dc network: fix send_multiple_requests 2019-02-07 13:30:14 +01:00
SomberNight
7bb3e5336a
trezor: PIN could not be disabled
fixes #5078
2019-02-06 15:50:57 +01:00
ThomasV
4ed8787433 remove 'util.py' from scripts 2019-02-05 20:33:50 +01:00
ThomasV
8f2a730b3b add more details values to history 2019-02-05 18:27:01 +01:00
SomberNight
d6986347e6
qt icons: update remaining QIcon() constructors
follow-up #5053
2019-02-05 00:59:09 +01:00
SomberNight
a5ddb42bfd
win/mac binaries: fix qt icons
follow-up #5055
2019-02-04 22:34:59 +01:00
SomberNight
2de7fd5466
wine build: small clean-up in prepare-wine.sh 2019-02-04 20:27:04 +01:00
SomberNight
001b815c18
wine build: upgrade wine, nsis, python
wine-specific hack no longer needed with new wine version
2019-02-04 20:27:04 +01:00
SomberNight
5a1778b7fe
start using util.resource_path 2019-02-04 20:27:03 +01:00
SomberNight
67d080b34a
mv qt update checker to its own file 2019-02-04 20:27:03 +01:00
SomberNight
6926b8b2d4
qt update checker: handle --offline 2019-02-04 20:27:02 +01:00
SomberNight
68cd37282e
qt: set default "window icon" (only visible on Windows) 2019-02-04 20:27:02 +01:00
SomberNight
9e58d56e6d
qt qrwindow: rm dead code 2019-02-04 20:27:01 +01:00
SomberNight
8412b53ed5
wizard: copy/restore storage when stepping through the wizard
When interacting with wizard, there is a single shared storage instance.
If you go down the tree of dialogs, press "back" a couple times, go
down another branch of dialogs, etc, there are side-effects on storage,
which are never undone.

fixes #5057
fixes #4496
2019-02-04 20:27:01 +01:00
SomberNight
9013f6d59e
wizard: make 'stack' private 2019-02-04 20:27:00 +01:00
SomberNight
bc2a421d87
network: clean up broadcast_transaction
Handle all exceptions in network.py, instead of in gui code.
Send some exceptions to crash reporter; previously gui code
would suppress them.
2019-02-04 20:27:00 +01:00
ThomasV
76ff2f53c5
Merge pull request #5042 from SomberNight/appimage
binaries for Linux: AppImage
2019-02-04 19:16:15 +01:00
SomberNight
66de511828
travis: build appimage for linux 2019-02-03 23:45:34 +01:00
SomberNight
a754f9fe10
initial commit for building AppImages for Linux x86_64 2019-02-03 23:45:30 +01:00
SomberNight
47b07f19b9
build: factor out some utilities to build_tools_util.sh 2019-02-03 23:44:34 +01:00
SomberNight
ca931f476f
fix android build: pin buildozer and pin kivy.
old p4a did not work with new buildozer. kivy master crashes.
kivy latest release has runtime issues (orientation was landscape).
these versions seem to work.
also updated dockerfile to more closely match p4a master.
2019-02-03 23:40:49 +01:00
SomberNight
43487910c7
qt network dialog: use intenum for columns 2019-02-03 20:04:33 +01:00
ThomasV
905e271db9 remove phishing server 2019-02-03 12:28:59 +01:00
SomberNight
52d602b6c1
network: fix get_servers to not modify default list 2019-02-02 20:10:12 +01:00
SomberNight
add3b36f32
build: replace remaining "python setup.py install" with "pip install" 2019-02-02 08:07:48 +01:00
ThomasV
819c3b81e3
Merge pull request #5055 from SomberNight/fix_qt_icons_when_pkg_installed
fix: qt icons not available when installed as python package
2019-02-02 06:26:47 +01:00
SomberNight
4fa87d8595
fix: qt icons not available when installed as python package
follow-up #5053
2019-02-01 23:32:24 +01:00
SomberNight
7ea01e9e91
qt inline icons: change mouse-over cursor 2019-02-01 21:57:18 +01:00
ghost43
7266ecc2b8
contrib/make_tgz: small improvements. (#5040) 2019-02-01 21:20:45 +01:00
ThomasV
f846d1d59a
Merge pull request #5039 from SomberNight/tx_version_bump_to_2
transaction: change default version to 2
2019-02-01 20:48:18 +01:00
ThomasV
f05aabd802
Merge pull request #5053 from SomberNight/qt_icons_file_rm
rm qt icons file
2019-02-01 20:47:16 +01:00
SomberNight
16bac5fd73
rm qt icons file
so we don't need pyrcc5, which is not deterministic,
and so we don't need the submodule for the icons

based on electrumsv/electrumsv@bf8802c2ea
2019-02-01 20:15:28 +01:00
SomberNight
185d02d9df
delete snap file
we don't distribute snaps; not sure if the file is useful for anyone
it's already not working because it references python 3.5
2019-02-01 19:46:20 +01:00
SomberNight
3ad6f738bd
util: rm hfu, cleaner bh2u 2019-02-01 19:02:02 +01:00
JeremyRand
8716bc8cfb
Refactor for loop in UTXOList
This refactor makes UTXOList somewhat easier to subclass.
2019-02-01 06:42:57 +00:00
SomberNight
7f3de8241c
qt/hww: temporarily bundle our own version of safetlib.qt.pinmatrix
until safetlib releases a new version that includes b1eab3dba4

closes #4960
2019-01-31 20:58:04 +01:00
SomberNight
e7d3fd32fb
contrib/freeze_packages.sh: should hard fail if there is an error
exceptions raised by find_restricted_dependencies.py were getting ignored
2019-01-31 19:44:04 +01:00
SomberNight
3ca1b710d6
build: use sha256sum instead of md5sum 2019-01-31 17:01:00 +01:00
SomberNight
d4967faf28
wine build: pin wine signing key. minor refactoring. 2019-01-31 16:37:27 +01:00
Vivek Teega
8310195453 Update authors & uncomment scrypt checking 2019-01-31 21:02:37 +05:30
SomberNight
c399693049
qt contact list: context menu fixups
fixes #5048
fixes #5049

follow-up 9cff42328d
2019-01-31 12:13:31 +01:00
SomberNight
9bbea9bf2f
wallet: implement wait_for_address_history_to_change API 2019-01-30 21:30:25 +01:00
SomberNight
d820f9ad37
transaction: change default version to 2 2019-01-28 15:11:03 +01:00
201 changed files with 74250 additions and 955 deletions

1
.gitignore vendored
View File

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

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

View File

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

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

View File

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

View File

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

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

View 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

View 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`

View 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" "$@"

View 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"/*

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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
View 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\"}}"

View File

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

View File

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

View File

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

View File

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

View File

@ -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', {})

View File

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

View File

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

View File

Before

Width:  |  Height:  |  Size: 687 B

After

Width:  |  Height:  |  Size: 687 B

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

Before

Width:  |  Height:  |  Size: 528 B

After

Width:  |  Height:  |  Size: 528 B

View File

Before

Width:  |  Height:  |  Size: 788 B

After

Width:  |  Height:  |  Size: 788 B

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 144 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 199 B

After

Width:  |  Height:  |  Size: 199 B

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 463 B

After

Width:  |  Height:  |  Size: 463 B

View File

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 314 B

After

Width:  |  Height:  |  Size: 314 B

View File

Before

Width:  |  Height:  |  Size: 380 B

After

Width:  |  Height:  |  Size: 380 B

View File

Before

Width:  |  Height:  |  Size: 272 B

After

Width:  |  Height:  |  Size: 272 B

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 392 B

After

Width:  |  Height:  |  Size: 392 B

View File

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

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