Browse Source

Merge branch 'master' of https://github.com/spesmilo/electrum into uncopyable-seed

283
Fredrick Brennan 9 years ago
parent
commit
939ed8fe40
  1. 5
      MANIFEST.in
  2. 7
      RELEASE-NOTES
  3. 12
      gui/qt/themes/README
  4. 1
      gui/qt/themes/cleanlook/name.cfg
  5. 62
      gui/qt/themes/cleanlook/style.css
  6. 1
      gui/qt/themes/dark/name.cfg
  7. 35
      gui/qt/themes/dark/style.css
  8. 1
      gui/qt/themes/sahara/name.cfg
  9. 102
      gui/qt/themes/sahara/style.css
  10. 2
      lib/transaction.py
  11. 2
      lib/version.py
  12. 8
      lib/wallet.py
  13. 6
      lib/websockets.py
  14. 17
      setup.py

5
MANIFEST.in

@ -1,4 +1,5 @@
include README LICENCE RELEASE-NOTES AUTHORS include LICENCE RELEASE-NOTES AUTHORS
include README.rst
include electrum.conf.sample include electrum.conf.sample
include electrum.desktop include electrum.desktop
include *.py include *.py
@ -12,4 +13,4 @@ include app.fil
include icons.qrc include icons.qrc
recursive-include icons * recursive-include icons *
recursive-include scripts * recursive-include scripts *
recursive-include docs *

7
RELEASE-NOTES

@ -1,3 +1,10 @@
# Release 2.5.1 (bugfixes)
* signatures in transactions were still using the old class
* make sure that setup.py uses python2
* fix wizard crash with trustedcoin plugin
* fix socket infinite loop
* fix history bug #1479
# Release 2.5 # Release 2.5
* Low-S values are used in signatures (BIP 62). * Low-S values are used in signatures (BIP 62).
* The Kivy GUI has been merged into master. * The Kivy GUI has been merged into master.

12
gui/qt/themes/README

@ -1,12 +0,0 @@
To add a new theme, simply create a new directory in the electrum data directory (either ./data or your system wide local data).
Inside your directory create a file called name.cfg with the name of that theme.
Create another file called style.css - this will be your CSS for the theme (see other themes for reference).
Documentation on Qt's stylesheets (used by Electrum):
Overview: http://qt-project.org/doc/qt-4.8/stylesheet.html
Examples: http://qt-project.org/doc/qt-4.8/stylesheet-examples.html
Reference manual: http://doc.qt.nokia.com/4.7-snapshot/stylesheet-reference.html

1
gui/qt/themes/cleanlook/name.cfg

@ -1 +0,0 @@
Cleanlook

62
gui/qt/themes/cleanlook/style.css

@ -1,62 +0,0 @@
#main_window
{
background: qlineargradient(x1: 0, y1: 0, x2:0,y2:1, stop: 0 white , stop: 1 #E8E8E8);
}
MiniWindow QPushButton {
color: #777;
border: 1px solid #CCC;
border-radius: 0px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 white, stop: 1 #E6E6E6);
min-height: 30px;
min-width: 30px;
}
#send_button{
color: #FFF;
border: 1px solid #3786E6;
border-radius: 4px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #72B2F8, stop: 1 #3484E6);
padding: 2px;
width: 20px;
}
#send_button:disabled{
color: #D3E8FE;
border: 1px solid #6DAEF7;
border-radius: 4px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #A5CFFA, stop: 1 #72B2F8);
}
#address_input, #amount_input, #label_input
{
color: #000;
padding: 5px;
border-radius: 5px;
min-height: 23px;
border: 1px solid #AAA9A9;
width: 200px;
}
#address_input[isValid=true]
{
color: #4D9948;
}
#address_input[isValid=false]
{
color: #CE4141;
}
#balance_label
{
color: #333;
}
#history
{
color: #888;
}

1
gui/qt/themes/dark/name.cfg

@ -1 +0,0 @@
Dark

35
gui/qt/themes/dark/style.css

@ -1,35 +0,0 @@
#main_window
{
background-image: url(:/icons/dark_background.png);
}
#address_input[readOnly=true], #amount_input[readOnly=true]
{
font: italic;
color: gray;
}
#address_input[readOnly=false], #amount_input[readOnly=false]
{
font: normal;
color: black;
}
#valid_address::indicator
{
width: 24px;
height: 24px;
}
#valid_address::indicator:checked
{
image: url(confirmed.png);
}
#valid_address::indicator:unchecked
{
image: url(unconfirmed.png);
}
#balance_label
{
color: white;
}

1
gui/qt/themes/sahara/name.cfg

@ -1 +0,0 @@
Sahara

102
gui/qt/themes/sahara/style.css

@ -1,102 +0,0 @@
#main_window
{
background: qlineargradient(x1: 0, y1: 0, x2:0,y2:1, stop: 0 white , stop: 1 #F2E3BE);
}
MiniWindow QPushButton {
color: #C1A76D;
border: 1px solid #A7811C;
border-radius: 0px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 white, stop: 1 #F2E3BE);
min-height: 25px;
min-width: 30px;
}
#send_button{
color: #FEEBA7;
border: 1px solid #AD8B35;
border-radius: 4px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #E0A035, stop: 1 #AD8B35);
min-width: 80px;
min-height: 23px;
padding: 2px;
}
#send_button:disabled{
color: #FEEDD3;
border: 1px solid #F7D46D;
border-radius: 4px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #FAEEA5, stop: 1 #DBC050);
min-width: 80px;
min-height: 23px;
padding: 2px;
}
#receive_button
{
color: #FEEBA7;
border: 1px solid #AD8B35;
border-radius: 4px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #E0A035, stop: 1 #AD8B35);
min-height: 25px;
min-width: 30px;
}
#receive_button[isActive=true]
{
color: #FEEBA7;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #E0A035, stop: 1 #987620);
}
#address_input, #amount_input
{
color: #000;
padding: 5px;
border-radius: 4px;
border: 1px solid #CBAE69;
width: 225px;
}
#address_input[isValid=true]
{
color: #4D9948;
padding: 5px;
border-radius: 4px;
border: 1px solid #CBAE69;
width: 225px;
margin-top: 4px;
}
#address_input[isValid=false]
{
color: #CE4141;
padding: 5px;
border-radius: 4px;
border: 1px solid #CBAE69;
width: 225px;
margin-top: 4px;
}
#address_input[isValid=placeholder]
{
color: #DEC58D;
padding: 5px;
border-radius: 4px;
border: 1px solid #CBAE69;
width: 225px;
margin-top: 4px;
}
#balance_label
{
color: #7E5907;
}
#history
{
color: #8B6914;
}

2
lib/transaction.py

@ -745,7 +745,7 @@ class Transaction:
for_sig = Hash(self.tx_for_sig(i).decode('hex')) for_sig = Hash(self.tx_for_sig(i).decode('hex'))
pkey = regenerate_key(sec) pkey = regenerate_key(sec)
secexp = pkey.secret secexp = pkey.secret
private_key = ecdsa.SigningKey.from_secret_exponent( secexp, curve = SECP256k1 ) private_key = bitcoin.MySigningKey.from_secret_exponent( secexp, curve = SECP256k1 )
public_key = private_key.get_verifying_key() public_key = private_key.get_verifying_key()
sig = private_key.sign_digest_deterministic( for_sig, hashfunc=hashlib.sha256, sigencode = ecdsa.util.sigencode_der ) sig = private_key.sign_digest_deterministic( for_sig, hashfunc=hashlib.sha256, sigencode = ecdsa.util.sigencode_der )
assert public_key.verify_digest( sig, for_sig, sigdecode = ecdsa.util.sigdecode_der) assert public_key.verify_digest( sig, for_sig, sigdecode = ecdsa.util.sigdecode_der)

2
lib/version.py

@ -1,4 +1,4 @@
ELECTRUM_VERSION = '2.5' # version of the client package ELECTRUM_VERSION = '2.5.1' # version of the client package
PROTOCOL_VERSION = '0.10' # protocol version requested PROTOCOL_VERSION = '0.10' # protocol version requested
NEW_SEED_VERSION = 11 # electrum versions >= 2.0 NEW_SEED_VERSION = 11 # electrum versions >= 2.0
OLD_SEED_VERSION = 4 # electrum versions < 2.0 OLD_SEED_VERSION = 4 # electrum versions < 2.0

8
lib/wallet.py

@ -769,9 +769,11 @@ class Abstract_Wallet(PrintError):
dd.pop(addr) dd.pop(addr)
else: else:
dd[addr] = l dd[addr] = l
self.txi.pop(tx_hash) try:
self.txo.pop(tx_hash) self.txi.pop(tx_hash)
self.txo.pop(tx_hash)
except KeyError:
self.print_error("tx was not in history", tx_hash)
def receive_tx_callback(self, tx_hash, tx, tx_height): def receive_tx_callback(self, tx_hash, tx, tx_height):
self.add_transaction(tx_hash, tx) self.add_transaction(tx_hash, tx)

6
lib/websockets.py

@ -21,8 +21,8 @@ from collections import defaultdict
try: try:
from SimpleWebSocketServer import WebSocket, SimpleSSLWebSocketServer from SimpleWebSocketServer import WebSocket, SimpleSSLWebSocketServer
except ImportError: except ImportError:
print "install SimpleWebSocketServer" import sys
sys.exit() sys.exit("install SimpleWebSocketServer")
import util import util
@ -93,7 +93,7 @@ class WsClientThread(util.DaemonThread):
except Queue.Empty: except Queue.Empty:
continue continue
id = r.get('id') id = r.get('id')
if id is None: if id is None:
method = r.get('method') method = r.get('method')
params = r.get('params') params = r.get('params')
else: else:

17
setup.py

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python2
# python setup.py sdist --format=zip,gztar # python setup.py sdist --format=zip,gztar
@ -8,23 +8,20 @@ import sys
import platform import platform
import imp import imp
version = imp.load_source('version', 'lib/version.py') version = imp.load_source('version', 'lib/version.py')
if sys.version_info[:3] < (2, 7, 0): if sys.version_info[:3] < (2, 7, 0):
sys.exit("Error: Electrum requires Python version >= 2.7.0...") sys.exit("Error: Electrum requires Python version >= 2.7.0...")
data_files = [] data_files = []
if platform.system() in [ 'Linux', 'FreeBSD', 'DragonFly']:
if platform.system() in ['Linux', 'FreeBSD', 'DragonFly']:
usr_share = os.path.join(sys.prefix, "share") usr_share = os.path.join(sys.prefix, "share")
data_files += [ data_files += [
(os.path.join(usr_share, 'applications/'), ['electrum.desktop']), (os.path.join(usr_share, 'applications/'), ['electrum.desktop']),
(os.path.join(usr_share, 'pixmaps/'), ['icons/electrum.png']) (os.path.join(usr_share, 'pixmaps/'), ['icons/electrum.png'])
] ]
setup( setup(
name="Electrum", name="Electrum",
version=version.ELECTRUM_VERSION, version=version.ELECTRUM_VERSION,
@ -48,14 +45,6 @@ setup(
'www/index.html', 'www/index.html',
'wordlist/*.txt', 'wordlist/*.txt',
'locale/*/LC_MESSAGES/electrum.mo', 'locale/*/LC_MESSAGES/electrum.mo',
],
'electrum_gui': [
"qt/themes/cleanlook/name.cfg",
"qt/themes/cleanlook/style.css",
"qt/themes/sahara/name.cfg",
"qt/themes/sahara/style.css",
"qt/themes/dark/name.cfg",
"qt/themes/dark/style.css",
] ]
}, },
scripts=['electrum'], scripts=['electrum'],

Loading…
Cancel
Save