sending fixed

This commit is contained in:
Dmitry Sorokin 2017-02-04 20:59:22 +03:00 committed by ThomasV
parent f02d18226b
commit 0693403358
8 changed files with 22 additions and 38 deletions

View File

@ -22,12 +22,6 @@
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE. # SOFTWARE.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import six
import sys, time, threading import sys, time, threading
import os, json, traceback import os, json, traceback
import shutil import shutil
@ -44,6 +38,7 @@ from PyQt4.QtGui import *
from PyQt4.QtCore import * from PyQt4.QtCore import *
import PyQt4.QtCore as QtCore import PyQt4.QtCore as QtCore
from lib.util import bh2u, bfh
from . import icons_rc from . import icons_rc
from electrum import keystore from electrum import keystore
@ -850,7 +845,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
if req.get('exp'): if req.get('exp'):
URI += "&exp=%d"%req.get('exp') URI += "&exp=%d"%req.get('exp')
if req.get('name') and req.get('sig'): if req.get('name') and req.get('sig'):
sig = req.get('sig').decode('hex') sig = bfh(req.get('sig'))
sig = bitcoin.base_encode(sig, base=58) sig = bitcoin.base_encode(sig, base=58)
URI += "&name=" + req['name'] + "&sig="+sig URI += "&name=" + req['name'] + "&sig="+sig
return str(URI) return str(URI)
@ -876,7 +871,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
else: else:
return return
def save_payment_request(self): def save_payment_request(self):
addr = str(self.receive_address_e.text()) addr = str(self.receive_address_e.text())
amount = self.receive_amount_e.get_amount() amount = self.receive_amount_e.get_amount()
@ -952,7 +946,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
self.expires_combo.show() self.expires_combo.show()
def toggle_qr_window(self): def toggle_qr_window(self):
import qrwindow from . import qrwindow
if not self.qr_window: if not self.qr_window:
self.qr_window = qrwindow.QR_Window(self) self.qr_window = qrwindow.QR_Window(self)
self.qr_window.setVisible(True) self.qr_window.setVisible(True)
@ -1646,7 +1640,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
self.contact_list.update() self.contact_list.update()
self.update_completions() self.update_completions()
def show_invoice(self, key): def show_invoice(self, key):
pr = self.invoices.get(key) pr = self.invoices.get(key)
pr.verify(self.contacts) pr.verify(self.contacts)
@ -1723,8 +1716,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
console.updateNamespace(methods) console.updateNamespace(methods)
def create_status_bar(self): def create_status_bar(self):
sb = QStatusBar() sb = QStatusBar()
@ -1761,7 +1752,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
self.send_button.setVisible(not self.wallet.is_watching_only()) self.send_button.setVisible(not self.wallet.is_watching_only())
def change_password_dialog(self): def change_password_dialog(self):
from password_dialog import ChangePasswordDialog from .password_dialog import ChangePasswordDialog
d = ChangePasswordDialog(self, self.wallet) d = ChangePasswordDialog(self, self.wallet)
ok, password, new_password, encrypt_file = d.run() ok, password, new_password, encrypt_file = d.run()
if not ok: if not ok:
@ -1823,9 +1814,9 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
if len(mpk_list) > 1: if len(mpk_list) > 1:
def label(key): def label(key):
if isinstance(self.wallet, Multisig_Wallet): if isinstance(self.wallet, Multisig_Wallet):
return _("cosigner") + ' ' + str(i+1) return _("cosigner") + ' ' + str(key+1)
return '' return ''
labels = [ label(i) for i in range(len(mpk_list))] labels = [label(i) for i in range(len(mpk_list))]
on_click = lambda clayout: show_mpk(clayout.selected_index()) on_click = lambda clayout: show_mpk(clayout.selected_index())
labels_clayout = ChoicesLayout(_("Master Public Keys"), labels, on_click) labels_clayout = ChoicesLayout(_("Master Public Keys"), labels, on_click)
vbox.addLayout(labels_clayout.layout()) vbox.addLayout(labels_clayout.layout())
@ -1900,6 +1891,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
self.show_message('Address not in wallet.') self.show_message('Address not in wallet.')
return return
task = partial(self.wallet.sign_message, address, message, password) task = partial(self.wallet.sign_message, address, message, password)
def show_signed_message(sig): def show_signed_message(sig):
signature.setText(base64.b64encode(sig).decode('ascii')) signature.setText(base64.b64encode(sig).decode('ascii'))
self.wallet.thread.add(task, on_success=show_signed_message) self.wallet.thread.add(task, on_success=show_signed_message)
@ -2049,7 +2041,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
# transactions are binary, but qrcode seems to return utf8... # transactions are binary, but qrcode seems to return utf8...
data = data.decode('utf8') data = data.decode('utf8')
z = bitcoin.base_decode(data, length=None, base=43) z = bitcoin.base_decode(data, length=None, base=43)
data = ''.join(chr(ord(b)) for b in z).encode('hex') data = bh2u(''.join(chr(ord(b)) for b in z))
tx = self.tx_from_text(data) tx = self.tx_from_text(data)
if not tx: if not tx:
return return
@ -2165,7 +2157,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
self.show_message(_("Private keys exported.")) self.show_message(_("Private keys exported."))
def do_export_privkeys(self, fileName, pklist, is_csv): def do_export_privkeys(self, fileName, pklist, is_csv):
with open(fileName, "w+") as f: with open(fileName, "w+") as f:
if is_csv: if is_csv:
@ -2177,7 +2168,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
import json import json
f.write(json.dumps(pklist, indent = 4)) f.write(json.dumps(pklist, indent = 4))
def do_import_labels(self): def do_import_labels(self):
labelsFile = self.getOpenFileName(_("Open labels file"), "*.json") labelsFile = self.getOpenFileName(_("Open labels file"), "*.json")
if not labelsFile: return if not labelsFile: return
@ -2204,7 +2194,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
except (IOError, os.error) as reason: except (IOError, os.error) as reason:
self.show_critical(_("Electrum was unable to export your labels.") + "\n" + str(reason)) self.show_critical(_("Electrum was unable to export your labels.") + "\n" + str(reason))
def export_history_dialog(self): def export_history_dialog(self):
d = WindowModalDialog(self, _('Export History')) d = WindowModalDialog(self, _('Export History'))
d.setMinimumSize(400, 200) d.setMinimumSize(400, 200)
@ -2279,7 +2268,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
import json import json
f.write(json.dumps(lines, indent = 4)) f.write(json.dumps(lines, indent = 4))
def sweep_key_dialog(self): def sweep_key_dialog(self):
d = WindowModalDialog(self, title=_('Sweep private keys')) d = WindowModalDialog(self, title=_('Sweep private keys'))
d.setMinimumSize(600, 300) d.setMinimumSize(600, 300)

View File

@ -249,19 +249,18 @@ class PayToEdit(ScanQRTextEdit):
hasModifier = (e.modifiers() != Qt.NoModifier) and not ctrlOrShift hasModifier = (e.modifiers() != Qt.NoModifier) and not ctrlOrShift
completionPrefix = self.textUnderCursor() completionPrefix = self.textUnderCursor()
if hasModifier or not e.text() or completionPrefix.length() < 1 or eow.contains(e.text().right(1)): if hasModifier or not e.text() or len(completionPrefix) < 1 or eow.find(e.text()[-1]) >= 0:
self.c.popup().hide() self.c.popup().hide()
return return
if completionPrefix != self.c.completionPrefix(): if completionPrefix != self.c.completionPrefix():
self.c.setCompletionPrefix(completionPrefix); self.c.setCompletionPrefix(completionPrefix)
self.c.popup().setCurrentIndex(self.c.completionModel().index(0, 0)) self.c.popup().setCurrentIndex(self.c.completionModel().index(0, 0))
cr = self.cursorRect() cr = self.cursorRect()
cr.setWidth(self.c.popup().sizeHintForColumn(0) + self.c.popup().verticalScrollBar().sizeHint().width()) cr.setWidth(self.c.popup().sizeHintForColumn(0) + self.c.popup().verticalScrollBar().sizeHint().width())
self.c.complete(cr) self.c.complete(cr)
def qr_input(self): def qr_input(self):
data = super(PayToEdit,self).qr_input() data = super(PayToEdit,self).qr_input()
if data.startswith("bitcoin:"): if data.startswith("bitcoin:"):

View File

@ -22,12 +22,6 @@
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE. # SOFTWARE.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import six
from .util import * from .util import *
from electrum.i18n import _ from electrum.i18n import _
from electrum.bitcoin import is_address from electrum.bitcoin import is_address

View File

@ -102,7 +102,7 @@ class CoinChooserBase(PrintError):
value = sum(coin['value'] for coin in coins) value = sum(coin['value'] for coin in coins)
return Bucket(desc, size, value, coins) return Bucket(desc, size, value, coins)
return map(make_Bucket, buckets.keys(), buckets.values()) return list(map(make_Bucket, buckets.keys(), buckets.values()))
def penalty_func(self, tx): def penalty_func(self, tx):
def penalty(candidate): def penalty(candidate):
@ -128,7 +128,7 @@ class CoinChooserBase(PrintError):
s = str(val) s = str(val)
return len(s) - len(s.rstrip('0')) return len(s) - len(s.rstrip('0'))
zeroes = map(trailing_zeroes, output_amounts) zeroes = [trailing_zeroes(i) for i in output_amounts]
min_zeroes = min(zeroes) min_zeroes = min(zeroes)
max_zeroes = max(zeroes) max_zeroes = max(zeroes)
zeroes = range(max(0, min_zeroes - 1), (max_zeroes + 1) + 1) zeroes = range(max(0, min_zeroes - 1), (max_zeroes + 1) + 1)
@ -137,7 +137,7 @@ class CoinChooserBase(PrintError):
remaining = change_amount remaining = change_amount
amounts = [] amounts = []
while n > 1: while n > 1:
average = remaining // n average = remaining / n
amount = self.p.randint(int(average * 0.7), int(average * 1.3)) amount = self.p.randint(int(average * 0.7), int(average * 1.3))
precision = min(self.p.choice(zeroes), int(floor(log10(amount)))) precision = min(self.p.choice(zeroes), int(floor(log10(amount))))
amount = int(round(amount, -precision)) amount = int(round(amount, -precision))
@ -214,6 +214,9 @@ class CoinChooserBase(PrintError):
return tx return tx
def choose_buckets(self, buckets, sufficient_funds, penalty_func):
raise NotImplemented('To be subclassed')
class CoinChooserOldestFirst(CoinChooserBase): class CoinChooserOldestFirst(CoinChooserBase):
'''Maximize transaction priority. Select the oldest unspent '''Maximize transaction priority. Select the oldest unspent
transaction outputs in your wallet, that are sufficient to cover transaction outputs in your wallet, that are sufficient to cover

View File

@ -602,8 +602,8 @@ class Commands:
else: else:
f = None f = None
if f is not None: if f is not None:
out = filter(lambda x: x.get('status')==f, out) out = list(filter(lambda x: x.get('status')==f, out))
return map(self._format_request, out) return list(map(self._format_request, out))
@command('w') @command('w')
def getunusedaddress(self,force=False): def getunusedaddress(self,force=False):

View File

@ -57,7 +57,7 @@ class KeyStore(PrintError):
if num_sig is None: if num_sig is None:
continue continue
x_signatures = txin['signatures'] x_signatures = txin['signatures']
signatures = filter(None, x_signatures) signatures = [sig for sig in x_signatures if sig]
if len(signatures) == num_sig: if len(signatures) == num_sig:
# input is complete # input is complete
continue continue
@ -667,7 +667,7 @@ def is_address_list(text):
def get_private_keys(text): def get_private_keys(text):
parts = text.split('\n') parts = text.split('\n')
parts = map(lambda x: ''.join(x.split()), parts) parts = map(lambda x: ''.join(x.split()), parts)
parts = filter(bool, parts) parts = list(filter(bool, parts))
if bool(parts) and all(bitcoin.is_private_key(x) for x in parts): if bool(parts) and all(bitcoin.is_private_key(x) for x in parts):
return parts return parts

View File

@ -814,7 +814,7 @@ class Transaction:
num = txin['num_sig'] num = txin['num_sig']
pubkeys, x_pubkeys = self.get_sorted_pubkeys(txin) pubkeys, x_pubkeys = self.get_sorted_pubkeys(txin)
for j, x_pubkey in enumerate(x_pubkeys): for j, x_pubkey in enumerate(x_pubkeys):
signatures = filter(None, txin['signatures']) signatures = list(filter(None, txin['signatures']))
if len(signatures) == num: if len(signatures) == num:
# txin is complete # txin is complete
break break

View File

@ -1028,7 +1028,7 @@ class Abstract_Wallet(PrintError):
txin['signatures'] = [None] * len(txin['signatures']) txin['signatures'] = [None] * len(txin['signatures'])
self.add_input_info(txin) self.add_input_info(txin)
# use own outputs # use own outputs
s = filter(lambda x: self.is_mine(x[1]), outputs) s = list(filter(lambda x: self.is_mine(x[1]), outputs))
# ... unless there is none # ... unless there is none
if not s: if not s:
s = outputs s = outputs