コード例 #1
0
    def make_model(self, htlcs) -> QtGui.QStandardItemModel:
        model = QtGui.QStandardItemModel(0, 2)
        model.setHorizontalHeaderLabels(['HTLC', 'Property value'])
        parentItem = model.invisibleRootItem()
        folder_types = {
            'settled': _('Fulfilled HTLCs'),
            'inflight': _('HTLCs in current commitment transaction'),
            'failed': _('Failed HTLCs')
        }
        self.folders = {}
        self.keyname_rows = {}

        for keyname, i in folder_types.items():
            myFont = QtGui.QFont()
            myFont.setBold(True)
            folder = HTLCItem(i)
            folder.setFont(myFont)
            parentItem.appendRow(folder)
            self.folders[keyname] = folder
            mapping = {}
            num = 0
            for item in htlcs:
                pay_hash, chan_id, i, direction, status = item
                if status != keyname:
                    continue
                it = self.make_htlc_item(i, direction)
                self.folders[keyname].appendRow(it)
                mapping[i.payment_hash] = num
                num += 1
            self.keyname_rows[keyname] = mapping
        return model
コード例 #2
0
 def get_tooltip(self, pos, fee_rate):
     mempool = self.config.use_mempool_fees()
     target, estimate = self.config.get_fee_text(pos, self.dyn, mempool, fee_rate)
     if self.dyn:
         return _('Target') + ': ' + target + '\n' + _('Current rate') + ': ' + estimate
     else:
         return _('Fixed rate') + ': ' + target + '\n' + _('Estimate') + ': ' + estimate
コード例 #3
0
    def __init__(self, parent):
        super(MatrixDialog, self).__init__(parent)
        self.setWindowTitle(_("Trezor Matrix Recovery"))
        self.num = 9
        self.loop = QEventLoop()

        vbox = QVBoxLayout(self)
        vbox.addWidget(WWLabel(MATRIX_RECOVERY))

        grid = QGridLayout()
        grid.setSpacing(0)
        self.char_buttons = []
        for y in range(3):
            for x in range(3):
                button = QPushButton('?')
                button.clicked.connect(
                    partial(self.process_key,
                            ord('1') + y * 3 + x))
                grid.addWidget(button, 3 - y, x)
                self.char_buttons.append(button)
        vbox.addLayout(grid)

        self.backspace_button = QPushButton("<=")
        self.backspace_button.clicked.connect(
            partial(self.process_key, Qt.Key_Backspace))
        self.cancel_button = QPushButton(_("Cancel"))
        self.cancel_button.clicked.connect(
            partial(self.process_key, Qt.Key_Escape))
        buttons = Buttons(self.backspace_button, self.cancel_button)
        vbox.addSpacing(40)
        vbox.addLayout(buttons)
        self.refresh()
        self.show()
コード例 #4
0
 def get_library_not_available_message(self) -> str:
     if hasattr(self, 'libraries_available_message'):
         message = self.libraries_available_message
     else:
         message = _("Missing libraries for {}.").format(self.name)
     message += '\n' + _("Make sure you install it with python3")
     return message
コード例 #5
0
    def initialize_device(self, device_id, wizard, handler):
        # Initialization method
        msg = _("Choose how you want to initialize your {}.").format(
            self.device, self.device)
        choices = [
            # Must be short as QT doesn't word-wrap radio button text
            (TIM_NEW,
             _("Let the device generate a completely new seed randomly")),
            (TIM_RECOVER,
             _("Recover from a seed you have previously written down")),
        ]

        def f(method):
            import threading
            settings = self.request_trezor_init_settings(
                wizard, method, device_id)
            t = threading.Thread(target=self._initialize_device_safe,
                                 args=(settings, method, device_id, wizard,
                                       handler))
            t.setDaemon(True)
            t.start()
            exit_code = wizard.loop.exec_()
            if exit_code != 0:
                # this method (initialize_device) was called with the expectation
                # of leaving the device in an initialized state when finishing.
                # signal that this is not the case:
                raise UserCancelled()

        wizard.choice_dialog(title=_('Initialize Device'),
                             message=msg,
                             choices=choices,
                             run_next=f)
コード例 #6
0
ファイル: qt.py プロジェクト: Actinium-project/Actilectrum
    def __init__(self, parent):
        super(CharacterDialog, self).__init__(parent)
        self.setWindowTitle(_("KeepKey Seed Recovery"))
        self.character_pos = 0
        self.word_pos = 0
        self.loop = QEventLoop()
        self.word_help = QLabel()
        self.char_buttons = []

        vbox = QVBoxLayout(self)
        vbox.addWidget(WWLabel(CHARACTER_RECOVERY))
        hbox = QHBoxLayout()
        hbox.addWidget(self.word_help)
        for i in range(4):
            char_button = CharacterButton('*')
            char_button.setMaximumWidth(36)
            self.char_buttons.append(char_button)
            hbox.addWidget(char_button)
        self.accept_button = CharacterButton(_("Accept Word"))
        self.accept_button.clicked.connect(partial(self.process_key, 32))
        self.rejected.connect(partial(self.loop.exit, 1))
        hbox.addWidget(self.accept_button)
        hbox.addStretch(1)
        vbox.addLayout(hbox)

        self.finished_button = QPushButton(_("Seed Entered"))
        self.cancel_button = QPushButton(_("Cancel"))
        self.finished_button.clicked.connect(
            partial(self.process_key, Qt.Key_Return))
        self.cancel_button.clicked.connect(self.rejected)
        buttons = Buttons(self.finished_button, self.cancel_button)
        vbox.addSpacing(40)
        vbox.addLayout(buttons)
        self.refresh()
        self.show()
コード例 #7
0
 def __init__(self, gui_object: 'ElectrumGui'):
     QDialog.__init__(self)
     self.gui_object = gui_object
     self.config = gui_object.config
     self.network = gui_object.daemon.network
     assert self.network
     self.setWindowTitle(_('Lightning Network'))
     self.setMinimumSize(600, 20)
     vbox = QVBoxLayout(self)
     self.num_peers = QLabel('')
     vbox.addWidget(self.num_peers)
     self.num_nodes = QLabel('')
     vbox.addWidget(self.num_nodes)
     self.num_channels = QLabel('')
     vbox.addWidget(self.num_channels)
     self.status = QLabel('')
     vbox.addWidget(self.status)
     vbox.addStretch(1)
     b = QPushButton(_('Close'))
     b.clicked.connect(self.close)
     vbox.addLayout(Buttons(b))
     util.register_callback(self.on_channel_db, ['channel_db'])
     util.register_callback(self.set_num_peers, ['gossip_peers'])
     util.register_callback(self.set_unknown_channels, ['unknown_channels'])
     self.network.channel_db.update_counts()  # trigger callback
     self.set_num_peers('', self.network.lngossip.num_peers())
     self.set_unknown_channels('', len(self.network.lngossip.unknown_ids))
コード例 #8
0
 def insert_utxo(self, idx, utxo: PartialTxInput):
     address = utxo.address
     height = utxo.block_height
     name = utxo.prevout.to_str()
     name_short = utxo.prevout.txid.hex()[:16] + '...' + ":%d" % utxo.prevout.out_idx
     self._utxo_dict[name] = utxo
     label = self.wallet.get_label(utxo.prevout.txid.hex())
     amount = self.parent.format_amount(utxo.value_sats(), whitespaces=True)
     labels = [name_short, address, label, amount, '%d'%height]
     utxo_item = [QStandardItem(x) for x in labels]
     self.set_editability(utxo_item)
     utxo_item[self.Columns.OUTPOINT].setData(name, self.ROLE_CLIPBOARD_DATA)
     utxo_item[self.Columns.ADDRESS].setFont(QFont(MONOSPACE_FONT))
     utxo_item[self.Columns.AMOUNT].setFont(QFont(MONOSPACE_FONT))
     utxo_item[self.Columns.OUTPOINT].setFont(QFont(MONOSPACE_FONT))
     utxo_item[self.Columns.ADDRESS].setData(name, Qt.UserRole)
     SELECTED_TO_SPEND_TOOLTIP = _('Coin selected to be spent')
     if name in (self._spend_set or set()):
         for col in utxo_item:
             col.setBackground(ColorScheme.GREEN.as_color(True))
             if col != self.Columns.OUTPOINT:
                 col.setToolTip(SELECTED_TO_SPEND_TOOLTIP)
     if self.wallet.is_frozen_address(address):
         utxo_item[self.Columns.ADDRESS].setBackground(ColorScheme.BLUE.as_color(True))
         utxo_item[self.Columns.ADDRESS].setToolTip(_('Address is frozen'))
     if self.wallet.is_frozen_coin(utxo):
         utxo_item[self.Columns.OUTPOINT].setBackground(ColorScheme.BLUE.as_color(True))
         utxo_item[self.Columns.OUTPOINT].setToolTip(f"{name}\n{_('Coin is frozen')}")
     else:
         tooltip = ("\n" + SELECTED_TO_SPEND_TOOLTIP) if name in (self._spend_set or set()) else ""
         utxo_item[self.Columns.OUTPOINT].setToolTip(name + tooltip)
     self.model().insertRow(idx, utxo_item)
コード例 #9
0
    def make_cypherseed(self, img, rawnoise, calibration=False, is_seed=True):
        img = img.convertToFormat(QImage.Format_Mono)
        p = QPainter()
        p.begin(img)
        p.setCompositionMode(26)  #xor
        p.drawImage(0, 0, rawnoise)
        p.end()
        cypherseed = self.pixelcode_2x2(img)
        cypherseed = QBitmap.fromImage(cypherseed)
        cypherseed = cypherseed.scaled(self.f_size, Qt.KeepAspectRatio)
        cypherseed = self.overlay_marks(cypherseed, True, calibration)

        if not is_seed:
            self.filename_prefix = 'custom_secret_'
            self.was = _('Custom secret')
        else:
            self.filename_prefix = self.wallet_name + '_seed_'
            self.was = self.wallet_name + ' ' + _('seed')
            if self.extension:
                self.ext_warning(self.c_dialog)

        if not calibration:
            self.toPdf(QImage(cypherseed))
            QDesktopServices.openUrl(
                QUrl.fromLocalFile(self.get_path_to_revealer_file('.pdf')))
            cypherseed.save(self.get_path_to_revealer_file('.png'))
            self.bcrypt(self.c_dialog)
        return cypherseed
コード例 #10
0
 def toggle_passphrase(self):
     if self.features.passphrase_protection:
         self.msg = _("Confirm on your {} device to disable passphrases")
     else:
         self.msg = _("Confirm on your {} device to enable passphrases")
     enabled = not self.features.passphrase_protection
     self.apply_settings(use_passphrase=enabled)
コード例 #11
0
    def export_to_file(self, *, tx: Transaction = None):
        if tx is None:
            tx = self.tx
        if isinstance(tx, PartialTransaction):
            tx.finalize_psbt()
        if tx.is_complete():
            name = 'signed_%s' % (tx.txid()[0:8])
            extension = 'txn'
            default_filter = TRANSACTION_FILE_EXTENSION_FILTER_ONLY_COMPLETE_TX
        else:
            name = self.wallet.basename() + time.strftime('-%Y%m%d-%H%M')
            extension = 'psbt'
            default_filter = TRANSACTION_FILE_EXTENSION_FILTER_ONLY_PARTIAL_TX
        name = f'{name}.{extension}'
        fileName = self.main_window.getSaveFileName(
            _("Select where to save your transaction"),
            name,
            TRANSACTION_FILE_EXTENSION_FILTER_SEPARATE,
            default_extension=extension,
            default_filter=default_filter)
        if not fileName:
            return
        if tx.is_complete():  # network tx hex
            with open(fileName, "w+") as f:
                network_tx_hex = tx.serialize_to_network()
                f.write(network_tx_hex + '\n')
        else:  # if partial: PSBT bytes
            assert isinstance(tx, PartialTransaction)
            with open(fileName, "wb+") as f:
                f.write(tx.serialize_as_bytes())

        self.show_message(_("Transaction exported successfully"))
        self.saved = True
コード例 #12
0
    def create_menu(self, position):
        item = self.currentItem()
        if not item:
            return
        item_type = item.data(0, self.ITEMTYPE_ROLE)
        menu = QMenu()
        if item_type == self.ItemType.CONNECTED_SERVER:
            server = item.data(0, self.SERVER_ADDR_ROLE)  # type: ServerAddr
            menu.addAction(_("Use as server"),
                           lambda: self.parent.follow_server(server))
        elif item_type == self.ItemType.DISCONNECTED_SERVER:
            server = item.data(0, self.SERVER_ADDR_ROLE)  # type: ServerAddr

            def func():
                self.parent.server_e.setText(server.net_addr_str())
                self.parent.set_server()

            menu.addAction(_("Use as server"), func)
        elif item_type == self.ItemType.CHAIN:
            chain_id = item.data(0, self.CHAIN_ID_ROLE)
            menu.addAction(_("Follow this branch"),
                           lambda: self.parent.follow_branch(chain_id))
        else:
            return
        menu.exec_(self.viewport().mapToGlobal(position))
コード例 #13
0
 def show_address(self, sequence, txin_type):
     client = self.get_client()
     address_path = self.get_derivation_prefix()[2:] + "/%d/%d" % sequence
     self.handler.show_message(_("Showing address ..."))
     segwit = is_segwit_script_type(txin_type)
     segwitNative = txin_type == 'p2wpkh'
     try:
         client.getWalletPublicKey(address_path,
                                   showOnScreen=True,
                                   segwit=segwit,
                                   segwitNative=segwitNative)
     except BTChipException as e:
         if e.sw == 0x6985:  # cancelled by user
             pass
         elif e.sw == 0x6982:
             raise  # pin lock. decorator will catch it
         elif e.sw == 0x6b00:  # hw.1 raises this
             self.handler.show_error('{}\n{}\n{}'.format(
                 _('Error showing address') + ':', e,
                 _('Your device might not have support for this functionality.'
                   )))
         else:
             self.logger.exception('')
             self.handler.show_error(e)
     except BaseException as e:
         self.logger.exception('')
         self.handler.show_error(e)
     finally:
         self.handler.finished()
コード例 #14
0
 def set_pin(self, remove):
     if remove:
         self.msg = _("Confirm on your {} device to disable PIN protection")
     elif self.features.pin_protection:
         self.msg = _("Confirm on your {} device to change your PIN")
     else:
         self.msg = _("Confirm on your {} device to set a PIN")
     self.change_pin(remove)
コード例 #15
0
 def __init__(self, text="", allow_multi=False):
     ButtonsTextEdit.__init__(self, text)
     self.allow_multi = allow_multi
     self.setReadOnly(0)
     self.addButton("file.png", self.file_input, _("Read file"))
     icon = "camera_white.png" if ColorScheme.dark_scheme else "camera_dark.png"
     self.addButton(icon, self.qr_input, _("Read QR code"))
     run_hook('scan_text_edit', self)
コード例 #16
0
 def set_pin(self, remove):
     if remove:
         msg = _("Confirm on your {} device to disable PIN protection")
     elif self.features.pin_protection:
         msg = _("Confirm on your {} device to change your PIN")
     else:
         msg = _("Confirm on your {} device to set a PIN")
     with self.run_flow(msg):
         trezorlib.device.change_pin(self.client, remove)
コード例 #17
0
 def ext_warning(self, dialog):
     dialog.show_message(''.join([
         "<b>",
         _("Warning"), ": </b>",
         _("your seed extension will <b>not</b> be included in the encrypted backup."
           )
     ]),
                         rich_text=True)
     dialog.close()
コード例 #18
0
 def toggle_passphrase(self):
     if self.features.passphrase_protection:
         msg = _("Confirm on your {} device to disable passphrases")
     else:
         msg = _("Confirm on your {} device to enable passphrases")
     enabled = not self.features.passphrase_protection
     with self.run_flow(msg):
         trezorlib.device.apply_settings(self.client,
                                         use_passphrase=enabled)
コード例 #19
0
 def populate_modes(self):
     self.modes.blockSignals(True)
     self.modes.clear()
     self.modes.addItem(
         _("Summary Text PIN (requires dongle replugging)"
           ) if self.txdata['confirmationType'] ==
         1 else _("Summary Text PIN is Disabled"))
     if self.txdata['confirmationType'] > 1:
         self.modes.addItem(_("Security Card Challenge"))
     self.modes.blockSignals(False)
コード例 #20
0
 def create_password_layout(self, wallet, is_encrypted, OK_button):
     if not is_encrypted:
         msg = _('Your wallet file is NOT encrypted.')
     else:
         msg = _('Your wallet file is encrypted.')
     msg += '\n' + _(
         'Note: If you enable this setting, you will need your hardware device to open your wallet.'
     )
     msg += '\n' + _('Use this dialog to toggle encryption.')
     self.playout = PasswordLayoutForHW(msg)
コード例 #21
0
 def text_ignore_old_fw_and_continue(self) -> str:
     suffix = (_(
         "The firmware of your hardware device is too old. "
         "If possible, you should upgrade it. "
         "You can ignore this error and try to continue, however things are likely to break."
     ) + "\n\n" + _("Ignore and continue?"))
     if str(self):
         return str(self) + "\n\n" + suffix
     else:
         return suffix
コード例 #22
0
ファイル: qt.py プロジェクト: Actinium-project/Actilectrum
 def wipe_device():
     wallet = window.wallet
     if wallet and sum(wallet.get_balance()):
         title = _("Confirm Device Wipe")
         msg = _("Are you SURE you want to wipe the device?\n"
                 "Your wallet still has actiniums in it!")
         if not self.question(
                 msg, title=title, icon=QMessageBox.Critical):
             return
     invoke_client('wipe_device', unpair_after=True)
コード例 #23
0
 def create_toolbar_buttons(self):
     self.period_combo = QComboBox()
     self.start_button = QPushButton('-')
     self.start_button.pressed.connect(self.select_start_date)
     self.start_button.setEnabled(False)
     self.end_button = QPushButton('-')
     self.end_button.pressed.connect(self.select_end_date)
     self.end_button.setEnabled(False)
     self.period_combo.addItems([_('All'), _('Custom')])
     self.period_combo.activated.connect(self.on_combo)
コード例 #24
0
 def closeEvent(self, event):
     if (self.prompt_if_unsaved and not self.saved and not self.question(
             _('This transaction is not saved. Close anyway?'),
             title=_("Warning"))):
         event.ignore()
     else:
         event.accept()
         try:
             dialogs.remove(self)
         except ValueError:
             pass  # was not in list already
コード例 #25
0
    def export_multisig_setup(self, main_window, wallet):

        basename = wallet.basename().rsplit('.', 1)[0]  # trim .json
        name = f'{basename}-cc-export.txt'.replace(' ', '-')
        fileName = main_window.getSaveFileName(
            _("Select where to save the setup file"), name, "*.txt")
        if fileName:
            with open(fileName, "wt") as f:
                ColdcardPlugin.export_ms_wallet(wallet, f, basename)
            main_window.show_message(
                _("Wallet setup file exported successfully"))
コード例 #26
0
ファイル: util.py プロジェクト: Actinium-project/Actilectrum
def import_meta_gui(actilectrum_window, title, importer, on_success):
    filter_ = "JSON (*.json);;All files (*)"
    filename = actilectrum_window.getOpenFileName(_("Open {} file").format(title), filter_)
    if not filename:
        return
    try:
        importer(filename)
    except FileImportFailed as e:
        actilectrum_window.show_critical(str(e))
    else:
        actilectrum_window.show_message(_("Your {} were successfully imported").format(title))
        on_success()
コード例 #27
0
 def bcrypt(self, dialog):
     self.rawnoise = False
     version = self.versioned_seed.version
     code_id = self.versioned_seed.checksum
     dialog.show_message(''.join([
         _("{} encrypted for Revealer {}_{} saved as PNG and PDF at: ").
         format(self.was, version, code_id), "<b>",
         self.get_path_to_revealer_file(), "</b>", "<br/>", "<br/>", "<b>",
         _("Always check your backups.")
     ]),
                         rich_text=True)
     dialog.close()
コード例 #28
0
 def update(self):
     if self.parent.lnwatcher is None:
         return
     self.model().clear()
     self.update_headers({0: _('Outpoint'), 1: _('Tx'), 2: _('Status')})
     lnwatcher = self.parent.lnwatcher
     l = lnwatcher.list_sweep_tx()
     for outpoint in l:
         n = lnwatcher.get_num_tx(outpoint)
         status = lnwatcher.get_channel_status(outpoint)
         items = [QStandardItem(e) for e in [outpoint, "%d" % n, status]]
         self.model().insertRow(self.model().rowCount(), items)
コード例 #29
0
 def plot_history_dialog(self):
     if plot_history is None:
         self.parent.show_message(
             _("Can't plot history.") + '\n' +
             _("Perhaps some dependencies are missing...") +
             " (matplotlib?)")
         return
     try:
         plt = plot_history(list(self.hm.transactions.values()))
         plt.show()
     except NothingToPlotException as e:
         self.parent.show_message(str(e))
コード例 #30
0
 def scan_and_create_client_for_device(
         self, *, device_id: str,
         wizard: 'BaseWizard') -> 'HardwareClientBase':
     devmgr = self.device_manager()
     client = wizard.run_task_without_blocking_gui(
         task=partial(devmgr.client_by_id, device_id))
     if client is None:
         raise UserFacingException(
             _('Failed to create a client for this device.') + '\n' +
             _('Make sure it is in the correct state.'))
     client.handler = self.create_handler(wizard)
     return client