def __init__(self, config, daemon, plugins): self.config = config self.network = daemon.network storage = WalletStorage(config.get_wallet_path()) if not storage.file_exists: print "Wallet not found. try 'uwallet create'" exit() self.done = 0 self.last_balance = "" set_verbosity(False) self.str_recipient = "" self.str_description = "" self.str_amount = "" self.str_fee = "" self.wallet = Wallet(storage) self.wallet.start_threads(self.network) self.contacts = StoreDict(self.config, 'contacts') self.network.register_callback(self.on_network, ['updated', 'banner']) self.commands = [_("[h] - displays this help text"), \ _("[i] - display transaction history"), \ _("[o] - enter payment order"), \ _("[p] - print stored payment order"), \ _("[s] - send stored payment order"), \ _("[r] - show own receipt addresses"), \ _("[c] - display contacts"), \ _("[b] - print server banner"), \ _("[q] - quit") ] self.num_commands = len(self.commands)
def run_offline_command(config, config_options): cmdname = config.get('cmd') cmd = known_commands[cmdname] storage = WalletStorage(config.get_wallet_path()) wallet = Wallet(storage) if cmd.requires_wallet else None # check password if cmd.requires_password and storage.get('use_encryption'): password = config_options.get('password') try: seed = wallet.check_password(password) except InvalidPassword: print "Error: This password does not decode this wallet." sys.exit(1) if cmd.requires_network: print "Warning: running command offline" # arguments passed to function args = map(lambda x: config.get(x), cmd.params) # decode json arguments args = map(json_decode, args) # options args += map(lambda x: config.get(x), cmd.options) cmd_runner = Commands(config, wallet, None, password=config_options.get('password'), new_password=config_options.get('new_password')) func = getattr(cmd_runner, cmd.name) result = func(*args) # save wallet if wallet: wallet.storage.write() return result
def run_and_get_wallet(self): # Show network dialog if config does not exist if self.network: if self.config.get('auto_connect') is None: self.choose_server(self.network) path = self.storage.path if self.storage.requires_split(): self.hide() msg = _("The wallet '%s' contains multiple accounts, which are no longer supported in UWalletLite 2.7.\n\n" "Do you want to split your wallet into multiple files?" % path) if not self.question(msg): return file_list = '\n'.join(self.storage.split_accounts()) msg = _('Your accounts have been moved to') + ':\n' + file_list + '\n\n' + _( 'Do you want to delete the old file') + ':\n' + path if self.question(msg): os.remove(path) self.show_warning(_('The file was removed')) return if self.storage.requires_upgrade(): self.hide() msg = _( "The format of your wallet '%s' must be upgraded for UWalletLite. This change will not be backward compatible" % path) if not self.question(msg): return self.storage.upgrade() self.show_warning(_('Your wallet was upgraded successfully')) self.wallet = Wallet(self.storage) self.terminate() return self.wallet action = self.storage.get_action() if action and action != 'new': self.hide() msg = _("The file '%s' contains an incompletely created wallet.\n" "Do you want to complete its creation now?") % path if not self.question(msg): if self.question(_("Do you want to delete '%s'?") % path): os.remove(path) self.show_warning(_('The file was removed')) return self.show() if action: # self.wallet is set in run self.run(action) return self.wallet
def load_wallet(self, path, get_wizard=None): if path in self.wallets: wallet = self.wallets[path] else: storage = WalletStorage(path) if get_wizard: if storage.file_exists: wallet = Wallet(storage) action = wallet.get_action() else: action = 'new' if action: wizard = get_wizard() wallet = wizard.run(self.network, storage) else: wallet.start_threads(self.network) else: wallet = Wallet(storage) # automatically generate wallet for ulord if not storage.file_exists: seed = wallet.make_seed() wallet.add_seed(seed, None) wallet.create_master_keys(None) wallet.create_main_account() wallet.synchronize() wallet.start_threads(self.network) if wallet: self.wallets[path] = wallet return wallet
def run_non_RPC(config): cmdname = config.get('cmd') client = config.get('client') storage = WalletStorage(config.get_wallet_path()) if storage.file_exists: sys.exit("Error: Remove the existing wallet first!") def password_dialog(): return prompt_password( "Password (hit return if you do not wish to encrypt your wallet):") if cmdname == 'restore': text = config.get('text') password = password_dialog() if Wallet.is_seed(text) or Wallet.is_xprv( text) or Wallet.is_private_key(text) else None try: wallet = Wallet.from_text(text, password, storage) except BaseException as e: sys.exit(str(e)) if not config.get('offline'): network = Network(config) network.start() wallet.start_threads(network) log.info("Recovering wallet...") wallet.synchronize() wallet.wait_until_synchronized() msg = "Recovery successful" if wallet.is_found( ) else "Found no history for this wallet" else: msg = "This wallet was restored offline. It may contain more addresses than displayed." log.info(msg) elif cmdname == 'create': if client is True: # From the GUI start password = config.get('guipassword', None) else: password = password_dialog() wallet = Wallet(storage) seed = wallet.make_seed() wallet.add_seed(seed, password) wallet.create_master_keys(password) wallet.create_main_account() wallet.synchronize() if client is True: wallet.storage.write() return seed else: print "Your wallet generation seed is:\n\"%s\"" % seed print "Please keep it in a safe place; if you lose it, you will not be able to restore " \ "your wallet." elif cmdname == 'deseed': wallet = Wallet(storage) if not wallet.seed: log.info("Error: This wallet has no seed") else: ns = wallet.storage.path + '.seedless' print "Warning: you are going to create a seedless wallet'\n" \ "It will be saved in '%s'" % ns if raw_input("Are you sure you want to continue? (y/n) ") in [ 'y', 'Y', 'yes' ]: wallet.storage.path = ns wallet.seed = '' wallet.storage.put('seed', '') wallet.use_encryption = False wallet.storage.put('use_encryption', wallet.use_encryption) for k in wallet.imported_keys.keys(): wallet.imported_keys[k] = '' wallet.storage.put('imported_keys', wallet.imported_keys) print "Done." else: print "Action canceled." wallet.storage.write() else: raise Exception("Unknown command %s" % cmdname) wallet.storage.write() log.info("Wallet saved in '%s'", wallet.storage.path)
class InstallWizard(QDialog, MessageBoxMixin, BaseWizard): def __init__(self, config, app, plugins, network, storage): BaseWizard.__init__(self, config, network, storage) QDialog.__init__(self, None) self.MSG_GENERATING_WAIT = _("UWalletLite is generating your addresses, please wait...") self.MSG_ENTER_ANYTHING = _( "Please enter a seed phrase, a master key, a list of Ulord addresses, or a list of private keys") self.MSG_ENTER_SEED_OR_MPK = _("Please enter a seed phrase or a master key (xpub or xprv):") self.MSG_COSIGNER = _("Please enter the root public key of cosigner #%d:") self.MSG_ENTER_PASSWORD = _( "Set your password to protect your UT.") self.MSG_RESTORE_PASSPHRASE = \ _( "Please enter your seed derivation passphrase.Note: this is NOT your encryption password.Leave this field empty if you did not use one or are unsure.") self.setWindowTitle('UWalletLite - ' + _('Install Wizard')) self.app = app self.config = config f = QFile("wallet.qss") # f = QFile("F:\MyProject\Ulord\uwallet-client-pro\gui\qt\ui\wallet.qss") f.open(QFile.ReadOnly) styleSheet = unicode(f.readAll(), encoding='utf8') self.setStyleSheet(styleSheet) f.close() self.setWindowIcon(QIcon(':icons/electrum_light_icon.png')) self.setWindowFlags(Qt.Dialog | Qt.FramelessWindowHint) self.setAttribute(Qt.WA_TranslucentBackground) self.setContentsMargins(15, 9, 15, 15) # Set for base base class self.plugins = plugins self.language_for_seed = config.get('language') self.setMinimumSize(600, 400) self.connect(self, QtCore.SIGNAL('accept'), self.accept) self.title = QLabel() self.main_widget = QWidget() self.back_button = QPushButton(_("Back"), self) self.back_button.setText(_('Back') if self.can_go_back() else _('Cancel')) self.next_button = QPushButton(_("Next"), self) self.next_button.setDefault(True) self.logo = QLabel() self.please_wait = QLabel(_("Please wait...")) self.please_wait.setAlignment(Qt.AlignCenter) self.icon_filename = None self.loop = QEventLoop() self.rejected.connect(lambda: self.loop.exit(0)) self.back_button.clicked.connect(lambda: self.loop.exit(1)) self.next_button.clicked.connect(lambda: self.loop.exit(2)) outer_vbox = QVBoxLayout(self) self.setTitleBar(outer_vbox) inner_vbox = QVBoxLayout() inner_vbox = QVBoxLayout() inner_vbox.addWidget(self.title) inner_vbox.addWidget(self.main_widget) inner_vbox.addStretch(1) inner_vbox.addWidget(self.please_wait) inner_vbox.addStretch(1) icon_vbox = QVBoxLayout() icon_vbox.addWidget(self.logo) icon_vbox.addStretch(1) hbox = QHBoxLayout() hbox.addLayout(icon_vbox) hbox.addSpacing(5) hbox.addLayout(inner_vbox) hbox.setStretchFactor(inner_vbox, 1) outer_vbox.addLayout(hbox) outer_vbox.addLayout(Buttons(self.back_button, self.next_button)) # self.set_icon(':icons/electrum.png') self.show() self.raise_() self.refresh_gui() # Need for QT on MacOSX. Lame. def setTitleBar(self,vbox): tq = QLabel('UWalletLite - ' + _('Install Wizard')) tq.setObjectName("QDialogTitle") tq.setStyleSheet("font-family: \"Arial\";font:bold;font-size:18px;border-bottom: 2px solid #FFD100;border-color:rgb(200,200,200);") self.btn_close = QPushButton() self.btn_close.setMinimumSize(QSize(21, 21)) self.btn_close.setMaximumSize(QSize(21, 21)) self.btn_close.setObjectName("btn_close1") self.btn_close.clicked.connect(self.close) hbox = QHBoxLayout() hbox.addWidget(tq) hbox.addWidget(self.btn_close) toto = QFrame() toto.setFrameShape(QFrame.HLine) toto.setFrameShadow(QFrame.Sunken) titleVBox = QVBoxLayout() titleVBox.addLayout(hbox) titleVBox.addWidget(toto) vbox.insertLayout(0,titleVBox,1) def mousePressEvent(self, event): try: self.currentPos = event.pos() except Exception: return def mouseMoveEvent(self, event): try: self.move(QPoint(self.pos() + event.pos() - self.currentPos)) except Exception: return def paintEvent(self, event): m = 9 path = QPainterPath() path.setFillRule(Qt.WindingFill) path.addRect(m, m, self.width() - m * 2, self.height() - m * 2) painter = QPainter(self) painter.fillPath(path, QBrush(Qt.white)) color = QColor(100, 100, 100, 30) for i in range(m): path = QPainterPath() path.setFillRule(Qt.WindingFill) path.addRoundRect(m - i, m - i, self.width() - (m - i) * 2, self.height() - (m - i) * 2, 1, 1) color.setAlpha(90 - math.sqrt(i) * 30) painter.setPen(QPen(color, 1, Qt.SolidLine)) painter.drawRoundRect(QRect(m - i, m - i, self.width() - (m - i) * 2, self.height() - (m - i) * 2), 0, 0) def run_and_get_wallet(self): # Show network dialog if config does not exist if self.network: if self.config.get('auto_connect') is None: self.choose_server(self.network) path = self.storage.path if self.storage.requires_split(): self.hide() msg = _("The wallet '%s' contains multiple accounts, which are no longer supported in UWalletLite 2.7.\n\n" "Do you want to split your wallet into multiple files?" % path) if not self.question(msg): return file_list = '\n'.join(self.storage.split_accounts()) msg = _('Your accounts have been moved to') + ':\n' + file_list + '\n\n' + _( 'Do you want to delete the old file') + ':\n' + path if self.question(msg): os.remove(path) self.show_warning(_('The file was removed')) return if self.storage.requires_upgrade(): self.hide() msg = _( "The format of your wallet '%s' must be upgraded for UWalletLite. This change will not be backward compatible" % path) if not self.question(msg): return self.storage.upgrade() self.show_warning(_('Your wallet was upgraded successfully')) self.wallet = Wallet(self.storage) self.terminate() return self.wallet action = self.storage.get_action() if action and action != 'new': self.hide() msg = _("The file '%s' contains an incompletely created wallet.\n" "Do you want to complete its creation now?") % path if not self.question(msg): if self.question(_("Do you want to delete '%s'?") % path): os.remove(path) self.show_warning(_('The file was removed')) return self.show() if action: # self.wallet is set in run self.run(action) return self.wallet def finished(self): """Called in hardware client wrapper, in order to close popups.""" return def on_error(self, exc_info): if not isinstance(exc_info[1], UserCancelled): traceback.print_exception(*exc_info) self.show_error(str(exc_info[1])) def set_icon(self, filename): prior_filename, self.icon_filename = self.icon_filename, filename self.logo.setPixmap(QPixmap(filename).scaledToWidth(60)) return prior_filename def set_main_layout(self, layout, title=None, raise_on_cancel=True, next_enabled=True): self.title.setText("<b>%s</b>" % title if title else "") self.title.setVisible(bool(title)) # Get rid of any prior layout by assigning it to a temporary widget prior_layout = self.main_widget.layout() if prior_layout: QWidget().setLayout(prior_layout) self.main_widget.setLayout(layout) if _('encrypt wallet') == title: self.back_button.setEnabled(False) next_enabled = False else: self.back_button.setEnabled(True) self.next_button.setEnabled(next_enabled) if next_enabled: self.next_button.setFocus() self.main_widget.setVisible(True) self.please_wait.setVisible(False) result = self.loop.exec_() if not result and raise_on_cancel: raise UserCancelled if result == 1: raise GoBack self.title.setVisible(False) self.back_button.setEnabled(False) self.next_button.setEnabled(False) self.main_widget.setVisible(False) self.please_wait.setVisible(True) self.refresh_gui() return result def refresh_gui(self): # For some reason, to refresh the GUI this needs to be called twice self.app.processEvents() self.app.processEvents() def remove_from_recently_open(self, filename): self.config.remove_from_recently_open(filename) def text_input(self, title, message, is_valid): slayout = TextInputLayout(self, message, is_valid) self.set_main_layout(slayout.layout(), title, next_enabled=False) return slayout.get_text() def seed_input(self, title, message, is_seed): slayout = SeedInputLayout(self, message, is_seed) vbox = QVBoxLayout() vbox.addLayout(slayout.layout()) if self.opt_ext or self.opt_bip39: vbox.addStretch(1) # vbox.addWidget(QLabel(_('Options') + ':')) if self.opt_ext: cb_pass = QCheckBox(_('Add a passphrase to this seed')) # vbox.addWidget(cb_pass) if self.opt_bip39: def f(b): if b: msg = ' '.join([ '<b>' + _('Warning') + '</b>' + ': ', _('BIP39 seeds may not be supported in the future.'), '<br/><br/>', _('As technology matures, Ulord 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 UWalletLite.'), _('We recommend to use seeds generated by UWalletLite or compatible wallets.'), ]) # self.show_warning(msg) slayout.seed_type_label.setVisible(not b) slayout.is_seed = (lambda x: bool(x)) if b else is_seed slayout.on_edit() cb_bip39 = QCheckBox(_('BIP39 seed')) cb_bip39.toggled.connect(f) f(True) # vbox.addWidget(cb_bip39) self.set_main_layout(vbox, title, next_enabled=False) seed = slayout.get_seed() # if str(seed).split() != 12: # title = "UWalletLite" # text = _("Incorrect seed") # icontype = "warm" # qm = QMessageBoxEx(title, text, self, icontype) # qm.exec_() # return 'not seed' is_bip39 = cb_bip39.isChecked() if self.opt_bip39 else False is_ext = cb_pass.isChecked() if self.opt_ext else False return seed, True, is_ext def seed_input_bip39(self, title, message, is_seed): slayout = SeedInputLayout(self, message, is_seed) vbox = QVBoxLayout() vbox.addLayout(slayout.layout()) if self.opt_ext or self.opt_bip39: vbox.addStretch(1) # vbox.addWidget(QLabel(_('Options') + ':')) if self.opt_ext: cb_pass = QCheckBox(_('Add a passphrase to this seed')) # vbox.addWidget(cb_pass) if self.opt_bip39: def f(b): if b: msg = ' '.join([ '<b>' + _('Warning') + '</b>' + ': ', _('BIP39 seeds may not be supported in the future.'), '<br/><br/>', _('As technology matures, Ulord 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 UWalletLite.'), _('We recommend to use seeds generated by UWalletLite or compatible wallets.'), ]) # self.show_warning(msg) slayout.seed_type_label.setVisible(not b) slayout.is_seed = (lambda x: bool(x)) if b else is_seed slayout.on_edit() cb_bip39 = QCheckBox(_('BIP39 seed')) cb_bip39.toggled.connect(f) f(True) # vbox.addWidget(cb_bip39) self.set_main_layout(vbox, title, next_enabled=False) seed = slayout.get_seed() # is_bip39 = cb_bip39.isChecked() if self.opt_bip39 else False # is_ext = cb_pass.isChecked() if self.opt_ext else False # return seed, True, is_ext @wizard_dialog def add_xpub_dialog(self, title, message, is_valid, run_next): return self.text_input(title, message, is_valid) @wizard_dialog def add_cosigner_dialog(self, run_next, index, is_valid): title = _("Cosigner %d root public key")%index message = ' '.join([ _('Please enter the root public key (xpub) of your cosigner.'), # _('Enter their master private key (xprv) if you want to be able to sign for them.') ]) return self.text_input(title, message, is_valid) @wizard_dialog def restore_seed_dialog(self, run_next, test): title = _("Import mnemonic") message = _("Please enter your backup mnemonic.") # return self.seed_input(title, message, test) return self.seed_input(title, message, test) @wizard_dialog def restore_seed_dialog_bip39(self, run_next, test): title = _("Import mnemonic") message = ' '.join([ _("Please enter your backup mnemonic."), # _('If you lose your seed, your money will be permanently lost.'), # _('To make sure that you have properly saved your seed, please retype it here.') ]) return self.seed_input_bip39(title, message, test) @wizard_dialog def confirm_seed_dialog(self, run_next, test): self.app.clipboard().clear() title = _('Confirm Seed') message = ' '.join([ _('Your seed is important!'), _('If you lose your seed, your money will be permanently lost.'), _('To make sure that you have properly saved your seed, please retype it here.') ]) self.opt_ext = True self.opt_bip39 = True seed, is_bip39, is_ext = self.seed_input(title, message, test) return seed @wizard_dialog def show_seed_dialog(self, run_next, seed_text): vbox = QVBoxLayout() slayout = CreateSeedLayout(seed_text) vbox.addLayout(slayout.layout()) vbox.addStretch(1) # vbox.addWidget(QLabel(_('Option') + ':')) cb_pass = QCheckBox(_('Add a passphrase to this seed')) # vbox.addWidget(cb_pass) title = _("Mnemonic") self.set_main_layout(vbox,title) return cb_pass.isChecked() def pw_layout(self, msg, kind): playout = PasswordLayout(None, msg, kind, self.next_button) self.set_main_layout(playout.layout(),_('encrypt wallet')) return playout.new_password() @wizard_dialog def request_password(self, run_next): """Request the user enter a new password and confirm it. the password or None for no password.""" return self.pw_layout(self.MSG_ENTER_PASSWORD, PW_NEW) def show_restore(self, wallet, network): # FIXME: these messages are shown after the install wizard is # finished and the window closed. On MacOSX they appear parented # with a re-appeared ghost install wizard window... if network: def task(): wallet.wait_until_synchronized() if wallet.is_found(): msg = _("Recovery successful") else: msg = _("No transactions found for this seed") self.emit(QtCore.SIGNAL('synchronized'), msg) self.connect(self, QtCore.SIGNAL('synchronized'), self.show_message) t = threading.Thread(target=task) t.daemon = True t.start() else: msg = _("This wallet was restored offline. It may " "contain more addresses than displayed.") self.show_message(msg) @wizard_dialog def confirm_dialog(self, title, message, run_next): self.confirm(message, title) def confirm(self, message, title): vbox = QVBoxLayout() vbox.addWidget(WWLabel(message)) self.set_main_layout(vbox, title) @wizard_dialog def action_dialog(self, action, run_next): self.run(action) def terminate(self): self.wallet.start_threads(self.network) self.emit(QtCore.SIGNAL('accept')) def waiting_dialog(self, task, msg): self.please_wait.setText(self.MSG_GENERATING_WAIT) self.refresh_gui() # self.please_wait.hide() t = threading.Thread(target=task) t.start() t.join() # @wizard_dialog def choice_dialog(self, title, message, choices, run_next): c_values = map(lambda x: x[0], choices) if c_values[0]=='restore_from_key': return 'restore_from_key' #remve selection windows c_titles = map(lambda x: x[1], choices) clayout = ChoicesLayout(message, c_titles) vbox = QVBoxLayout() vbox.addLayout(clayout.layout()) self.set_main_layout(vbox, title) action = c_values[clayout.selected_index()] return action def query_choice(self, msg, choices): """called by hardware wallets""" clayout = ChoicesLayout(msg, choices) vbox = QVBoxLayout() vbox.addLayout(clayout.layout()) self.set_main_layout(vbox, '') return clayout.selected_index() @wizard_dialog def line_dialog(self, run_next, title, message, default, test, warning=''): vbox = QVBoxLayout() vbox.addWidget(WWLabel(message)) line = QLineEditEx() line.setText(default) def f(text): self.next_button.setEnabled(test(text)) line.textEdited.connect(f) vbox.addWidget(line) vbox.addWidget(WWLabel(warning)) self.set_main_layout(vbox, title, next_enabled=test(default)) return ' '.join(unicode(line.text()).split()) @wizard_dialog def show_xpub_dialog(self, xpub, run_next): msg = ' '.join([ _("Here is your master public key."), _("Please share it with your cosigners.") ]) vbox = QVBoxLayout() layout = SeedDisplayLayout(xpub, title=msg, icon=False) vbox.addLayout(layout.layout()) self.set_main_layout(vbox, _('Master Public Key')) return None def choose_server(self, network): title = _("UWalletLite communicates with remote servers to get information about your transactions and addresses.\r\n The servers all fulfil the same purpose only differing in hardware. In most cases you simply want to let Uwallet pick one at random.\r\nHowever if you prefer feel free to select a server manually.") choices = [_("Auto connect"), _("Select server manually")] choices_title = _("How do you want to connect to a server? ") clayout = ChoicesLayout(choices_title, choices) self.set_main_layout(clayout.layout(), title) auto_connect = True if clayout.selected_index() == 1: nlayout = NetworkChoiceLayout(network, self.config, wizard=True) if self.set_main_layout(nlayout.layout(), raise_on_cancel=False): nlayout.accept() auto_connect = False self.config.set_key('auto_connect', auto_connect, True) network.auto_connect = auto_connect @wizard_dialog def multisig_dialog(self, run_next): cw = CosignWidget(2, 2) m_edit = QSlider(Qt.Horizontal, self) n_edit = QSlider(Qt.Horizontal, self) n_edit.setMinimum(2) n_edit.setMaximum(15) m_edit.setMinimum(1) m_edit.setMaximum(2) n_edit.setValue(2) m_edit.setValue(2) n_label = QLabel() m_label = QLabel() grid = QGridLayout() grid.addWidget(n_label, 0, 0) grid.addWidget(n_edit, 0, 1) grid.addWidget(m_label, 1, 0) grid.addWidget(m_edit, 1, 1) def on_m(m): # m_label.setText('2') m_label.setText(_('Require %d signatures')%m) cw.set_m(m) def on_n(n): # n_label.setText('2') n_label.setText(_('From %d cosigners')%n) cw.set_n(n) m_edit.setMaximum(n) n_edit.valueChanged.connect(on_n) m_edit.valueChanged.connect(on_m) on_n(2) on_m(2) vbox = QVBoxLayout() vbox.addWidget(cw) vbox.addWidget(WWLabel(_("Select the number of cosigners and signatures to unlock"))) vbox.addLayout(grid) self.set_main_layout(vbox, _("Set multiple signatures")) m = int(m_edit.value()) n = int(n_edit.value()) return (m, n)
class UWalletGui: def __init__(self, config, daemon, plugins): self.config = config self.network = daemon.network storage = WalletStorage(config.get_wallet_path()) if not storage.file_exists: print "Wallet not found. try 'uwallet create'" exit() self.done = 0 self.last_balance = "" set_verbosity(False) self.str_recipient = "" self.str_description = "" self.str_amount = "" self.str_fee = "" self.wallet = Wallet(storage) self.wallet.start_threads(self.network) self.contacts = StoreDict(self.config, 'contacts') self.network.register_callback(self.on_network, ['updated', 'banner']) self.commands = [_("[h] - displays this help text"), \ _("[i] - display transaction history"), \ _("[o] - enter payment order"), \ _("[p] - print stored payment order"), \ _("[s] - send stored payment order"), \ _("[r] - show own receipt addresses"), \ _("[c] - display contacts"), \ _("[b] - print server banner"), \ _("[q] - quit") ] self.num_commands = len(self.commands) def on_network(self, event, *args): if event == 'updated': self.updated() elif event == 'banner': self.print_banner() def main_command(self): self.print_balance() c = raw_input("enter command: ") if c == "h": self.print_commands() elif c == "i": self.print_history() elif c == "o": self.enter_order() elif c == "p": self.print_order() elif c == "s": self.send_order() elif c == "r": self.print_addresses() elif c == "c": self.print_contacts() elif c == "b": self.print_banner() elif c == "n": self.network_dialog() elif c == "e": self.settings_dialog() elif c == "q": self.done = 1 else: self.print_commands() def updated(self): s = self.get_balance() if s != self.last_balance: print(s) self.last_balance = s return True def print_commands(self): self.print_list(self.commands, "Available commands") def print_history(self): width = [20, 40, 14, 14] delta = (80 - sum(width) - 4) / 3 format_str = "%"+"%d"%width[0]+"s"+"%"+"%d"%(width[1]+delta)+"s"+"%" \ + "%d"%(width[2]+delta)+"s"+"%"+"%d"%(width[3]+delta)+"s" b = 0 messages = [] for item in self.wallet.get_history(): tx_hash, confirmations, value, timestamp, balance = item if confirmations: try: time_str = datetime.datetime.fromtimestamp( timestamp).isoformat(' ')[:-3] except Exception: time_str = "unknown" else: time_str = _('unconfirmed') label = self.wallet.get_label(tx_hash) messages.append( format_str % (time_str, label, format_satoshis(value, whitespaces=True), format_satoshis(balance, whitespaces=True))) self.print_list( messages[::-1], format_str % (_("Date"), _("Description"), _("Amount"), _("Balance"))) def print_balance(self): print(self.get_balance()) def get_balance(self): if self.wallet.network.is_connected(): if not self.wallet.up_to_date: msg = _("Synchronizing...") else: c, u, x = self.wallet.get_balance() msg = _("Balance") + ": %f " % (Decimal(c) / COIN) if u: msg += " [%f unconfirmed]" % (Decimal(u) / COIN) if x: msg += " [%f unmatured]" % (Decimal(x) / COIN) else: msg = _("Not connected") return (msg) def print_contacts(self): messages = map(lambda x: "%20s %45s " % (x[0], x[1][1]), self.contacts.items()) self.print_list(messages, "%19s %25s " % ("Key", "Value")) def print_addresses(self): messages = map( lambda addr: "%30s %30s " % (addr, self.wallet.labels.get(addr, "")), self.wallet.addresses()) self.print_list(messages, "%19s %25s " % ("Address", "Label")) def print_order(self): print("send order to " + self.str_recipient + ", amount: " + self.str_amount \ + "\nfee: " + self.str_fee + ", desc: " + self.str_description) def enter_order(self): self.str_recipient = raw_input("Pay to: ") self.str_description = raw_input("Description : ") self.str_amount = raw_input("Amount: ") self.str_fee = raw_input("Fee: ") def send_order(self): self.do_send() def print_banner(self): for i, x in enumerate(self.wallet.network.banner.split('\n')): print(x) def print_list(self, list, firstline): self.maxpos = len(list) if not self.maxpos: return print(firstline) for i in range(self.maxpos): msg = list[i] if i < len(list) else "" print(msg) def main(self): while self.done == 0: self.main_command() def do_send(self): if not is_valid(self.str_recipient): print(_('Invalid Bitcoin address')) return try: amount = int(Decimal(self.str_amount) * COIN) except Exception: print(_('Invalid Amount')) return try: fee = int(Decimal(self.str_fee) * COIN) except Exception: print(_('Invalid Fee')) return if self.wallet.use_encryption: password = self.password_dialog() if not password: return else: password = None c = "" while c != "y": c = raw_input("ok to send (y/n)?") if c == "n": return try: tx = self.wallet.mktx([(TYPE_ADDRESS, self.str_recipient, amount)], password, self.config, fee) except Exception as e: print(str(e)) return if self.str_description: self.wallet.labels[tx.hash()] = self.str_description print(_("Please wait...")) status, msg = self.network.broadcast(tx) if status: print(_('Payment sent.')) #self.do_clear() #self.update_contacts_tab() else: print(_('Error')) def network_dialog(self): print( "use 'uwallet setconfig server/proxy' to change your network settings" ) return True def settings_dialog(self): print("use 'uwallet setconfig' to change your settings") return True def password_dialog(self): return getpass.getpass() # XXX unused def run_receive_tab(self, c): #if c == 10: # out = self.run_popup('Address', ["Edit label", "Freeze", "Prioritize"]) return def run_contacts_tab(self, c): pass
def set_enabled(): wizard.next_button.setEnabled( Wallet.is_xprv(clean_text(text)))
def load_wallet(self): mongo = pymongo.MongoClient('192.168.14.240') db = mongo.uwallet_user for col_name in db.list_collection_names(): col = db.get_collection(col_name) for user_name in col.find({}, {'_id': 1}): user = '******'.join([col_name, user_name['_id']]) storage = WalletStorage(user) wallet = Wallet(storage) # automatically generate wallet for ulord if not storage.file_exists: seed = wallet.make_seed() wallet.add_seed(seed, None) wallet.create_master_keys(None) wallet.create_main_account() wallet.synchronize() wallet.start_threads(self.network) if wallet: self.wallets[user] = wallet