def update(self):
        format_amount = self.app.format_amount_and_units
        tx_hash, self.status_str, self.description, self.can_broadcast, amount, fee, height, conf, timestamp, exp_n = self.wallet.get_tx_info(self.tx)
        self.tx_hash = tx_hash or ''
        if timestamp:
            self.date_label = _('Date')
            self.date_str = datetime.fromtimestamp(timestamp).isoformat(' ')[:-3]
        elif exp_n:
            self.date_label = _('Mempool depth')
            self.date_str = _('{} from tip').format('%.2f MB'%(exp_n/1000000))
        else:
            self.date_label = ''
            self.date_str = ''

        if amount is None:
            self.amount_str = _("Transaction unrelated to your wallet")
        elif amount > 0:
            self.is_mine = False
            self.amount_str = format_amount(amount)
        else:
            self.is_mine = True
            self.amount_str = format_amount(-amount)
        self.fee_str = format_amount(fee) if fee is not None else _('unknown')
        self.can_sign = self.wallet.can_sign(self.tx)
        self.ids.output_list.update(self.tx.outputs())
Exemple #2
0
    def update(self):
        format_amount = self.app.format_amount_and_units
        tx_hash, self.status_str, self.description, self.can_broadcast, amount, fee, height, conf, timestamp, exp_n = self.wallet.get_tx_info(
            self.tx)
        self.tx_hash = tx_hash or ''
        if timestamp:
            self.date_str = datetime.fromtimestamp(timestamp).isoformat(
                ' ')[:-3]
        elif exp_n:
            self.date_str = _('Within %d blocks') % exp_n if exp_n > 0 else _(
                'unknown (low fee)')
        else:
            self.date_str = ''

        if amount is None:
            self.amount_str = _("Transaction unrelated to your wallet")
        elif amount > 0:
            self.is_mine = False
            self.amount_str = format_amount(amount)
        else:
            self.is_mine = True
            self.amount_str = format_amount(-amount)
        self.fee_str = format_amount(fee) if fee is not None else _('unknown')
        self.can_sign = self.wallet.can_sign(self.tx)
        self.ids.output_list.update(self.tx.outputs())
Exemple #3
0
 def do_new(self):
     addr = self.get_new_address()
     if not addr:
         self.app.show_info(_('Please use the existing requests first.'))
     else:
         self.save_request()
         self.app.show_info(_('New request added to your list.'))
 def update(self):
     self.menu_actions = [(_('Use'), self.do_use),
                          (_('Details'), self.do_view)]
     wallet = self.app.wallet
     if self.show_change == 0:
         _list = wallet.get_receiving_addresses()
     elif self.show_change == 1:
         _list = wallet.get_change_addresses()
     else:
         _list = wallet.get_addresses()
     search = self.message
     container = self.ids.search_container
     n = 0
     cards = []
     for address in _list:
         label = wallet.labels.get(address, '')
         balance = sum(wallet.get_addr_balance(address))
         is_used = wallet.is_used(address)
         if self.show_used == 1 and (balance or is_used):
             continue
         if self.show_used == 2 and balance == 0:
             continue
         if self.show_used == 3 and not is_used:
             continue
         card = self.get_card(address, balance, is_used, label)
         if search and not self.ext_search(card, search):
             continue
         cards.append(card)
         n += 1
     container.data = cards
     if not n:
         self.app.show_error('No address matching your search')
 def update_status(self, *dt):
     self.num_blocks = self.network.get_local_height()
     if not self.wallet:
         self.status = _("No Wallet")
         return
     if self.network is None or not self.network.is_running():
         status = _("Offline")
     elif self.network.is_connected():
         server_height = self.network.get_server_height()
         server_lag = self.network.get_local_height() - server_height
         if not self.wallet.up_to_date or server_height == 0:
             status = _("Synchronizing...")
         elif server_lag > 1:
             status = _("Server lagging")
         else:
             status = ''
     else:
         status = _("Disconnected")
     self.status = self.wallet.basename() + (' [size=15dp](%s)[/size]' %
                                             status if status else '')
     # balance
     c, u, x = self.wallet.get_balance()
     text = self.format_amount(c + x + u)
     self.balance = str(
         text.strip()) + ' [size=22dp]%s[/size]' % self.base_unit
     self.fiat_balance = self.fx.format_amount(
         c + u + x) + ' [size=22dp]%s[/size]' % self.fx.ccy
Exemple #6
0
 def do_send(self):
     if self.screen.is_pr:
         if self.payment_request.has_expired():
             self.app.show_error(_('Payment request has expired'))
             return
         outputs = self.payment_request.get_outputs()
     else:
         address = str(self.screen.address)
         if not address:
             self.app.show_error(
                 _('Recipient not specified.') + ' ' +
                 _('Please scan a AXE address or a payment request'))
             return
         if not bitcoin.is_address(address):
             self.app.show_error(_('Invalid AXE Address') + ':\n' + address)
             return
         try:
             amount = self.app.get_amount(self.screen.amount)
         except:
             self.app.show_error(
                 _('Invalid amount') + ':\n' + self.screen.amount)
             return
         outputs = [(bitcoin.TYPE_ADDRESS, address, amount)]
     message = unicode(self.screen.message)
     amount = sum(map(lambda x: x[2], outputs))
     self._do_send(amount, message, outputs)
 def update(self):
     self.menu_actions = [(_('Show'), self.do_show), (_('Delete'), self.do_delete)]
     requests_list = self.ids.requests_container
     requests_list.clear_widgets()
     _list = self.app.wallet.get_sorted_requests(self.app.electrum_config)
     for pr in _list:
         ci = self.get_card(pr)
         requests_list.add_widget(ci)
 def get_card(self, addr, balance, is_used, label):
     ci = {}
     ci['screen'] = self
     ci['address'] = addr
     ci['memo'] = label
     ci['amount'] = self.app.format_amount_and_units(balance)
     ci['status'] = _('Used') if is_used else _(
         'Funded') if balance > 0 else _('Unused')
     return ci
 def __init__(self, wizard, **kwargs):
     super(RestoreSeedDialog, self).__init__(wizard, **kwargs)
     self._test = kwargs['test']
     from electrum_axe.mnemonic import Mnemonic
     from electrum_axe.old_mnemonic import words as old_wordlist
     self.words = set(Mnemonic('en').wordlist).union(set(old_wordlist))
     self.ids.text_input_seed.text = test_seed if is_test else ''
     self.message = _(
         'Please type your seed phrase using the virtual keyboard.')
     self.title = _('Enter Seed')
     self.ext = False
Exemple #10
0
 def _show_seed(self, label, password):
     if self.wallet.has_password() and password is None:
         return
     keystore = self.wallet.keystore
     try:
         seed = keystore.get_seed(password)
         passphrase = keystore.get_passphrase(password)
     except:
         self.show_error("Invalid PIN")
         return
     label.text = _('Seed') + ':\n' + seed
     if passphrase:
         label.text += '\n\n' + _('Passphrase') + ': ' + passphrase
 def invoices_dialog(self, screen):
     from .uix.dialogs.invoices import InvoicesDialog
     if len(self.wallet.invoices.sorted_list()) == 0:
         self.show_info(' '.join([
             _('No saved invoices.'),
             _('Signed invoices are saved automatically when you scan them.'
               ),
             _('You may also save unsigned requests or contact addresses using the save button.'
               )
         ]))
         return
     popup = InvoicesDialog(self, screen, None)
     popup.update()
     popup.open()
Exemple #12
0
 def get_card(self, tx_hash, height, conf, timestamp, value, balance):
     status, status_str = self.app.wallet.get_tx_status(
         tx_hash, height, conf, timestamp)
     icon = "atlas://gui/kivy/theming/light/" + TX_ICONS[status]
     label = self.app.wallet.get_label(tx_hash) if tx_hash else _(
         'Pruned transaction outputs')
     ri = {}
     ri['screen'] = self
     ri['tx_hash'] = tx_hash
     ri['icon'] = icon
     ri['date'] = status_str
     ri['message'] = label
     ri['confirmations'] = conf
     if value is not None:
         ri['is_mine'] = value < 0
         if value < 0: value = -value
         ri['amount'] = self.app.format_amount_and_units(value)
         if self.app.fiat_unit:
             fx = self.app.fx
             fiat_value = value / Decimal(
                 bitcoin.COIN) * self.app.wallet.price_at_timestamp(
                     tx_hash, fx.timestamp_rate)
             fiat_value = Fiat(fiat_value, fx.ccy)
             ri['quote_text'] = str(fiat_value)
     return ri
Exemple #13
0
 def update(self):
     if not self.screen.address:
         self.get_new_address()
     else:
         status = self.app.wallet.get_request_status(self.screen.address)
         self.screen.status = _(
             'Payment received') if status == PR_PAID else ''
Exemple #14
0
 def get_card(self, tx_hash, height, conf, timestamp, value, balance):
     status, status_str = self.app.wallet.get_tx_status(
         tx_hash, height, conf, timestamp)
     icon = "atlas://gui/kivy/theming/light/" + TX_ICONS[status]
     label = self.app.wallet.get_label(tx_hash) if tx_hash else _(
         'Pruned transaction outputs')
     date = timestamp_to_datetime(timestamp)
     ri = self.cards.get(tx_hash)
     if ri is None:
         ri = Factory.HistoryItem()
         ri.screen = self
         ri.tx_hash = tx_hash
         self.cards[tx_hash] = ri
     ri.icon = icon
     ri.date = status_str
     ri.message = label
     ri.value = value or 0
     ri.amount = self.app.format_amount(value,
                                        True) if value is not None else '--'
     ri.confirmations = conf
     if self.app.fiat_unit and date:
         rate = self.app.fx.history_rate(date)
         if rate:
             s = self.app.fx.value_str(value, rate)
             ri.quote_text = '' if s is None else s + ' ' + self.app.fiat_unit
     return ri
Exemple #15
0
 def description_dialog(self, screen):
     from uix.dialogs.label_dialog import LabelDialog
     text = screen.message
     def callback(text):
         screen.message = text
     d = LabelDialog(_('Enter description'), text, callback)
     d.open()
Exemple #16
0
 def _sign_tx(self, tx, password, on_success, on_failure):
     try:
         self.wallet.sign_transaction(tx, password)
     except InvalidPassword:
         Clock.schedule_once(lambda dt: on_failure(_("Invalid PIN")))
         return
     Clock.schedule_once(lambda dt: on_success(tx))
 def on_resume(self):
     now = time.time()
     if self.wallet and self.wallet.has_password(
     ) and now - self.pause_time > 60:
         self.password_dialog(self.wallet, _('Enter PIN'), None, self.stop)
     if self.nfcscanner:
         self.nfcscanner.nfc_enable()
Exemple #18
0
    def get_card(self, req):
        address = req['address']
        timestamp = req.get('time', 0)
        amount = req.get('amount')
        expiration = req.get('exp', None)
        status = req.get('status')
        signature = req.get('sig')

        ci = self.cards.get(address)
        if ci is None:
            ci = Factory.RequestItem()
            ci.screen = self
            ci.address = address
            self.cards[address] = ci

        ci.memo = self.app.wallet.get_label(address)
        if amount:
            status = req.get('status')
            ci.status = request_text[status]
        else:
            received = self.app.wallet.get_addr_received(address)
            ci.status = self.app.format_amount_and_units(amount)
        ci.icon = pr_icon[status]
        ci.amount = self.app.format_amount_and_units(amount) if amount else _(
            'No Amount')
        ci.date = format_time(timestamp)
        return ci
Exemple #19
0
 def fx_status(self):
     fx = self.app.fx
     if fx.is_enabled():
         source = fx.exchange.name()
         ccy = fx.get_currency()
         return '%s [%s]' % (ccy, source)
     else:
         return _('None')
Exemple #20
0
 def on_currency(self, ccy):
     b = (ccy != _('None'))
     self.fx.set_enabled(b)
     if b:
         if ccy != self.fx.get_currency():
             self.fx.set_currency(ccy)
         self.app.fiat_unit = ccy
     Clock.schedule_once(lambda dt: self.add_exchanges())
Exemple #21
0
 def on_ref_label(self, label, touch):
     if label.touched:
         label.touched = False
         self.qr_dialog(label.name, label.data, True)
     else:
         label.touched = True
         self._clipboard.copy(label.data)
         Clock.schedule_once(lambda dt: self.show_info(_('Text copied to clipboard.\nTap again to display it as QR code.')))
 def requests_dialog(self, screen):
     from .uix.dialogs.requests import RequestsDialog
     if len(self.wallet.get_sorted_requests(self.electrum_config)) == 0:
         self.show_info(_('No saved requests.'))
         return
     popup = RequestsDialog(self, screen, None)
     popup.update()
     popup.open()
Exemple #23
0
    def _do_send(self, amount, message, outputs):
        # make unsigned transaction
        config = self.app.electrum_config
        coins = self.app.wallet.get_spendable_coins(None, config)
        try:
            tx = self.app.wallet.make_unsigned_transaction(
                coins, outputs, config, None)
        except NotEnoughFunds:
            self.app.show_error(_("Not enough funds"))
            return
        except Exception as e:
            traceback.print_exc(file=sys.stdout)
            self.app.show_error(str(e))
            return
        fee = tx.get_fee()
        msg = [
            _("Amount to be sent") + ": " +
            self.app.format_amount_and_units(amount),
            _("Mining fee") + ": " + self.app.format_amount_and_units(fee),
        ]
        x_fee = run_hook('get_tx_extra_fee', self.app.wallet, tx)
        if x_fee:
            x_fee_address, x_fee_amount = x_fee
            msg.append(
                _("Additional fees") + ": " +
                self.app.format_amount_and_units(x_fee_amount))

        if fee >= config.get('confirm_fee', 10000):
            msg.append(
                _('Warning') + ': ' +
                _("The fee for this transaction seems unusually high."))
        msg.append(_("Enter your PIN code to proceed"))
        self.app.protected('\n'.join(msg), self.send_tx, (tx, message))
Exemple #24
0
 def do_delete(self, req):
     from .question import Question
     def cb(result):
         if result:
             self.app.wallet.remove_payment_request(req.address, self.app.electrum_config)
             self.hide_menu()
             self.update()
     d = Question(_('Delete request'), cb)
     d.open()
Exemple #25
0
    def broadcast(self, tx, pr=None):
        def on_complete(ok, msg):
            if ok:
                self.show_info(_('Payment sent.'))
                if self.send_screen:
                    self.send_screen.do_clear()
                if pr:
                    self.wallet.invoices.set_paid(pr, tx.txid())
                    self.wallet.invoices.save()
                    self.update_tab('invoices')
            else:
                self.show_error(msg)

        if self.network and self.network.is_connected():
            self.show_info(_('Sending'))
            threading.Thread(target=self._broadcast_thread, args=(tx, on_complete)).start()
        else:
            self.show_info(_('Cannot broadcast transaction') + ':\n' + _('Not connected'))
Exemple #26
0
 def do_delete(self, obj):
     from .question import Question
     def cb(result):
         if result:
             self.app.wallet.invoices.remove(obj.key)
         self.hide_menu()
         self.update()
     d = Question(_('Delete invoice?'), cb)
     d.open()
Exemple #27
0
 def on_keyboard(self, instance, key, keycode, codepoint, modifiers):
     if key == 27 and self.is_exit is False:
         self.is_exit = True
         self.show_info(_('Press again to exit'))
         return True
     # override settings button
     if key in (319, 282): #f1/settings button on android
         #self.gui.main_gui.toggle_settings(self)
         return True
    def change_password(self, cb):
        from .uix.dialogs.password_dialog import PasswordDialog
        if self._password_dialog is None:
            self._password_dialog = PasswordDialog()
        message = _("Changing PIN code.") + '\n' + _("Enter your current PIN:")

        def on_success(old_password, new_password):
            self.wallet.update_password(old_password, new_password)
            self.show_info(_("Your PIN code was updated"))

        on_failure = lambda: self.show_error(_("PIN codes do not match"))
        self._password_dialog.init(self,
                                   self.wallet,
                                   message,
                                   on_success,
                                   on_failure,
                                   is_change=1)
        self._password_dialog.open()
 def _sign_tx(self, tx, password, on_success, on_failure):
     try:
         self.wallet.sign_transaction(tx, password)
     except InvalidPassword:
         Clock.schedule_once(lambda dt: on_failure(_("Invalid PIN")))
         return
     on_success = run_hook('tc_sign_wrapper', self.wallet, tx, on_success,
                           on_failure) or on_success
     Clock.schedule_once(lambda dt: on_success(tx))
    def load_wallet_by_name(self, path, ask_if_wizard=False):
        if not path:
            return
        if self.wallet and self.wallet.storage.path == path:
            return
        wallet = self.daemon.load_wallet(path, None)
        if wallet:
            if wallet.has_password():
                self.password_dialog(wallet, _('Enter PIN code'),
                                     lambda x: self.load_wallet(wallet),
                                     self.stop)
            else:
                self.load_wallet(wallet)
        else:
            Logger.debug(
                'Electrum-AXE: Wallet not found or action needed. Launching install wizard'
            )

            def launch_wizard():
                storage = WalletStorage(path, manual_upgrades=True)
                wizard = Factory.InstallWizard(self.electrum_config,
                                               self.plugins, storage)
                wizard.bind(on_wizard_complete=self.on_wizard_complete)
                action = wizard.storage.get_action()
                wizard.run(action)

            if not ask_if_wizard:
                launch_wizard()
            else:
                from .uix.dialogs.question import Question

                def handle_answer(b: bool):
                    if b:
                        launch_wizard()
                    else:
                        try:
                            os.unlink(path)
                        except FileNotFoundError:
                            pass
                        self.stop()

                d = Question(_('Do you want to launch the wizard again?'),
                             handle_answer)
                d.open()