|
|
@ -31,44 +31,6 @@ from util import * |
|
|
|
from qrtextedit import ShowQRTextEdit, ScanQRTextEdit |
|
|
|
|
|
|
|
|
|
|
|
class SeedLayoutBase(object): |
|
|
|
|
|
|
|
def _seed_layout(self, seed=None, title=None, icon=True): |
|
|
|
if seed: |
|
|
|
self.seed_e = ShowQRTextEdit() |
|
|
|
self.seed_e.setText(seed) |
|
|
|
else: |
|
|
|
self.seed_e = ScanQRTextEdit() |
|
|
|
self.seed_e.setTabChangesFocus(True) |
|
|
|
self.seed_e.setMaximumHeight(75) |
|
|
|
hbox = QHBoxLayout() |
|
|
|
if icon: |
|
|
|
logo = QLabel() |
|
|
|
logo.setPixmap(QPixmap(":icons/seed.png").scaledToWidth(64)) |
|
|
|
logo.setMaximumWidth(60) |
|
|
|
hbox.addWidget(logo) |
|
|
|
hbox.addWidget(self.seed_e) |
|
|
|
if not title: |
|
|
|
return hbox |
|
|
|
vbox = QVBoxLayout() |
|
|
|
vbox.addWidget(WWLabel(title)) |
|
|
|
vbox.addLayout(hbox) |
|
|
|
return vbox |
|
|
|
|
|
|
|
def layout(self): |
|
|
|
return self.layout_ |
|
|
|
|
|
|
|
def seed_edit(self): |
|
|
|
return self.seed_e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SeedDisplayLayout(SeedLayoutBase): |
|
|
|
def __init__(self, seed, title=None, icon=True): |
|
|
|
self.layout_ = self._seed_layout(seed=seed, title=title, icon=icon) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def seed_warning_msg(seed): |
|
|
|
return ''.join([ |
|
|
|
"<p>", |
|
|
@ -85,50 +47,93 @@ def seed_warning_msg(seed): |
|
|
|
]) % len(seed.split()) |
|
|
|
|
|
|
|
|
|
|
|
class CreateSeedLayout(SeedLayoutBase): |
|
|
|
|
|
|
|
def __init__(self, seed): |
|
|
|
title = _("Your wallet generation seed is:") |
|
|
|
vbox = QVBoxLayout() |
|
|
|
vbox.addLayout(self._seed_layout(seed=seed, title=title)) |
|
|
|
msg = seed_warning_msg(seed) |
|
|
|
vbox.addWidget(WWLabel(msg)) |
|
|
|
self.layout_ = vbox |
|
|
|
|
|
|
|
|
|
|
|
class TextInputLayout(SeedLayoutBase): |
|
|
|
|
|
|
|
def __init__(self, parent, title, is_valid): |
|
|
|
self.is_valid = is_valid |
|
|
|
class SeedLayout(QVBoxLayout): |
|
|
|
#options |
|
|
|
is_bip39 = False |
|
|
|
is_ext = False |
|
|
|
|
|
|
|
def seed_options(self): |
|
|
|
dialog = QDialog() |
|
|
|
vbox = QVBoxLayout(dialog) |
|
|
|
if 'ext' in self.options: |
|
|
|
cb_ext = QCheckBox(_('Extend this seed with custom words')) |
|
|
|
vbox.addWidget(cb_ext) |
|
|
|
if 'bip39' in self.options: |
|
|
|
def f(b): |
|
|
|
if b: |
|
|
|
msg = ' '.join([ |
|
|
|
'<b>' + _('Warning') + '</b>' + ': ', |
|
|
|
_('BIP39 seeds may not be supported in the future.'), |
|
|
|
'<br/><br/>', |
|
|
|
_('As technology matures, Bitcoin address generation may change.'), |
|
|
|
_('However, BIP39 seeds do not include a version number.'), |
|
|
|
_('As a result, it is not possible to infer your wallet type from a BIP39 seed.'), |
|
|
|
'<br/><br/>', |
|
|
|
_('We do not guarantee that BIP39 seeds will be supported in future versions of Electrum.'), |
|
|
|
_('We recommend to use seeds generated by Electrum or compatible wallets.'), |
|
|
|
]) |
|
|
|
#self.parent.show_warning(msg) |
|
|
|
self.seed_type_label.setVisible(not b) |
|
|
|
self.is_seed = (lambda x: bool(x)) if b else self.saved_is_seed |
|
|
|
self.on_edit() |
|
|
|
cb_bip39 = QCheckBox(_('BIP39 seed')) |
|
|
|
cb_bip39.toggled.connect(f) |
|
|
|
vbox.addWidget(cb_bip39) |
|
|
|
vbox.addLayout(Buttons(OkButton(dialog))) |
|
|
|
if not dialog.exec_(): |
|
|
|
return None |
|
|
|
self.is_ext = cb_ext.isChecked() if 'ext' in self.options else False |
|
|
|
self.is_bip39 = cb_bip39.isChecked() if 'bip39' in self.options else False |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, seed=None, title=None, icon=True, msg=None, options=None, is_seed=None, passphrase=None, parent=None): |
|
|
|
QVBoxLayout.__init__(self) |
|
|
|
self.parent = parent |
|
|
|
self.layout_ = self._seed_layout(title=title, icon=False) |
|
|
|
self.seed_e.textChanged.connect(self.on_edit) |
|
|
|
|
|
|
|
def get_text(self): |
|
|
|
return clean_text(self.seed_edit()) |
|
|
|
|
|
|
|
def on_edit(self): |
|
|
|
self.parent.next_button.setEnabled(self.is_valid(self.get_text())) |
|
|
|
|
|
|
|
|
|
|
|
class SeedInputLayout(SeedLayoutBase): |
|
|
|
|
|
|
|
def __init__(self, parent, title, is_seed): |
|
|
|
vbox = QVBoxLayout() |
|
|
|
vbox.addLayout(self._seed_layout(title=title)) |
|
|
|
self.options = options |
|
|
|
if title: |
|
|
|
self.addWidget(WWLabel(title)) |
|
|
|
if seed: |
|
|
|
self.seed_e = ShowQRTextEdit() |
|
|
|
self.seed_e.setText(seed) |
|
|
|
else: |
|
|
|
self.seed_e = ScanQRTextEdit() |
|
|
|
self.seed_e.setTabChangesFocus(True) |
|
|
|
self.is_seed = is_seed |
|
|
|
self.saved_is_seed = self.is_seed |
|
|
|
self.seed_e.textChanged.connect(self.on_edit) |
|
|
|
self.seed_e.setMaximumHeight(75) |
|
|
|
hbox = QHBoxLayout() |
|
|
|
if icon: |
|
|
|
logo = QLabel() |
|
|
|
logo.setPixmap(QPixmap(":icons/seed.png").scaledToWidth(64)) |
|
|
|
logo.setMaximumWidth(60) |
|
|
|
hbox.addWidget(logo) |
|
|
|
hbox.addWidget(self.seed_e) |
|
|
|
self.addLayout(hbox) |
|
|
|
hbox = QHBoxLayout() |
|
|
|
hbox.addStretch(1) |
|
|
|
hbox.addWidget(QLabel('')) |
|
|
|
self.seed_type_label = QLabel('') |
|
|
|
hbox.addWidget(self.seed_type_label) |
|
|
|
vbox.addLayout(hbox) |
|
|
|
self.layout_ = vbox |
|
|
|
self.parent = parent |
|
|
|
self.is_seed = is_seed |
|
|
|
self.seed_e.textChanged.connect(self.on_edit) |
|
|
|
if options: |
|
|
|
opt_button = EnterButton(_('Options'), self.seed_options) |
|
|
|
hbox.addWidget(opt_button) |
|
|
|
self.addLayout(hbox) |
|
|
|
if passphrase: |
|
|
|
hbox = QHBoxLayout() |
|
|
|
passphrase_e = QLineEdit() |
|
|
|
passphrase_e.setText(passphrase) |
|
|
|
passphrase_e.setReadOnly(True) |
|
|
|
hbox.addWidget(QLabel(_("Your seed extension is") + ':')) |
|
|
|
hbox.addWidget(passphrase_e) |
|
|
|
self.addLayout(hbox) |
|
|
|
self.addStretch(1) |
|
|
|
if msg: |
|
|
|
msg = seed_warning_msg(seed) |
|
|
|
self.addWidget(WWLabel(msg)) |
|
|
|
|
|
|
|
def get_seed(self): |
|
|
|
return clean_text(self.seed_edit()) |
|
|
|
return clean_text(self.seed_e) |
|
|
|
|
|
|
|
def on_edit(self): |
|
|
|
from electrum.bitcoin import seed_type |
|
|
@ -141,29 +146,29 @@ class SeedInputLayout(SeedLayoutBase): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ShowSeedLayout(SeedLayoutBase): |
|
|
|
class TextInputLayout(SeedLayout): |
|
|
|
|
|
|
|
def __init__(self, parent, title, is_valid): |
|
|
|
self.is_valid = is_valid |
|
|
|
self.parent = parent |
|
|
|
self.layout_ = self._seed_layout(title=title, icon=False) |
|
|
|
self.seed_e.textChanged.connect(self.on_edit) |
|
|
|
|
|
|
|
def get_text(self): |
|
|
|
return clean_text(self.seed_edit()) |
|
|
|
|
|
|
|
def on_edit(self): |
|
|
|
self.parent.next_button.setEnabled(self.is_valid(self.get_text())) |
|
|
|
|
|
|
|
def __init__(self, seed, passphrase): |
|
|
|
title = _("Your wallet generation seed is:") |
|
|
|
vbox = QVBoxLayout() |
|
|
|
vbox.addLayout(self._seed_layout(seed=seed, title=title)) |
|
|
|
if passphrase: |
|
|
|
hbox = QHBoxLayout() |
|
|
|
passphrase_e = QLineEdit() |
|
|
|
passphrase_e.setText(passphrase) |
|
|
|
passphrase_e.setReadOnly(True) |
|
|
|
hbox.addWidget(QLabel(_("Your seed extension is") + ':')) |
|
|
|
hbox.addWidget(passphrase_e) |
|
|
|
vbox.addLayout(hbox) |
|
|
|
msg = seed_warning_msg(seed) |
|
|
|
vbox.addWidget(WWLabel(msg)) |
|
|
|
self.layout_ = vbox |
|
|
|
|
|
|
|
|
|
|
|
class SeedDialog(WindowModalDialog): |
|
|
|
|
|
|
|
def __init__(self, parent, seed, passphrase): |
|
|
|
WindowModalDialog.__init__(self, parent, ('Electrum - ' + _('Seed'))) |
|
|
|
self.setMinimumWidth(400) |
|
|
|
vbox = QVBoxLayout(self) |
|
|
|
vbox.addLayout(ShowSeedLayout(seed, passphrase).layout()) |
|
|
|
title = _("Your wallet generation seed is:") |
|
|
|
slayout = SeedLayout(title=title, seed=seed, msg=True, passphrase=passphrase) |
|
|
|
vbox.addLayout(slayout) |
|
|
|
vbox.addLayout(Buttons(CloseButton(self))) |
|
|
|