Skip to content

Commit

Permalink
Dependency updated and Bug fixes
Browse files Browse the repository at this point in the history
### New Features
- Implemented a custom relay list feature for enhanced customization

### Enhancements
- Updated translations
- Updated label export to export categories as "mylabel #mycategory"

### Dependency Management
- Updated the Briefcase tool to version "0.3.18"
  • Loading branch information
andreasgriffin committed Jun 6, 2024
1 parent d414006 commit c5fb129
Show file tree
Hide file tree
Showing 33 changed files with 284 additions and 152 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
- Label synchronization between trusted devices (via nostr)
- **Multi-Language**:
- 🇺🇸 English, 🇨🇳 Chinese - 简体中文, 🇪🇸 Spanish - español de España, 🇯🇵 Japanese - 日本語, 🇷🇺 Russian - русский, 🇵🇹 Portuguese - português europeu, 🇮🇳 Hindi - हिन्दी, Arabic - العربية, (more upon request)
- **Fast**: Electrum server and upgrade to **Compact Block Filters** for the Bitcoin Safe 2.0 release
- **Fast**: Electrum server connectivity and planned upgrade to **Compact Block Filters** for the Bitcoin Safe 2.0 release
- **Secure**: No seed generation or storage (on mainnet).
- A hardware signer/signing device for safe seed storage is needed (storing seeds on a computer is reckless)
- Powered by **[BDK](https://github.com/bitcoindevkit/bdk)**
Expand Down
2 changes: 1 addition & 1 deletion bitcoin_safe/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.6.2a0"
__version__ = "0.6.3a0"
2 changes: 1 addition & 1 deletion bitcoin_safe/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ def __init__(self):
self.opened_txlike: Dict[str, List[str]] = {} # network:[serializedtx, serialized psbt]
self.data_dir = appdirs.user_data_dir(self.app_name)
self.is_maximized = False
self.recently_open_wallets: Dict[bdk.Network, deque] = {
self.recently_open_wallets: Dict[bdk.Network, deque[str]] = {
network: deque(maxlen=5) for network in bdk.Network
}
self.language_code = None
Expand Down
2 changes: 1 addition & 1 deletion bitcoin_safe/descriptors.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
from typing import Sequence

import bdkpython as bdk
from bitcoin_qrreader.multipath_descriptor import (
from bitcoin_qr_tools.multipath_descriptor import (
MultipathDescriptor as BitcoinQRMultipathDescriptor,
)
from bitcoin_usb.address_types import (
Expand Down
4 changes: 2 additions & 2 deletions bitcoin_safe/gui/qt/address_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@

import logging

from bitcoin_qr_tools.qr_widgets import QRCodeWidgetSVG

from bitcoin_safe.config import UserConfig
from bitcoin_safe.gui.qt.buttonedit import ButtonEdit
from bitcoin_safe.mempool import MempoolData
from bitcoin_safe.util import serialized_to_hex

from .qr_components.image_widget import QRCodeWidgetSVG

logger = logging.getLogger(__name__)

import bdkpython as bdk
Expand Down
3 changes: 3 additions & 0 deletions bitcoin_safe/gui/qt/address_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,9 @@ def __init__(self, fx, config: UserConfig, wallet: Wallet, signals: Signals):
self.signals.category_updated.connect(self.update_with_filter)
self.signals.language_switch.connect(self.updateUi)

def updateUi(self):
self.update()

def dragEnterEvent(self, event: QDragEnterEvent):
# handle dropped files
super().dragEnterEvent(event)
Expand Down
7 changes: 4 additions & 3 deletions bitcoin_safe/gui/qt/buttonedit.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,16 +255,17 @@ def add_qr_input_from_camera_button(
custom_handle_input=None,
):
def input_qr_from_camera():
from bitcoin_qrreader import bitcoin_qr, bitcoin_qr_gui
from bitcoin_qr_tools.bitcoin_video_widget import BitcoinVideoWidget
from bitcoin_qr_tools.data import Data

def result_callback(data: bitcoin_qr.Data):
def result_callback(data: Data):
if custom_handle_input:
custom_handle_input(data, self)
else:
if hasattr(self, "setText"):
self.setText(str(data.data_as_string()))

window = bitcoin_qr_gui.BitcoinVideoWidget(result_callback=result_callback, network=network)
window = BitcoinVideoWidget(result_callback=result_callback, network=network)
window.show()

self.button_camera = self.add_button(
Expand Down
2 changes: 1 addition & 1 deletion bitcoin_safe/gui/qt/category_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ def __init__(
self.signals.language_switch.connect(self.updateUi)

def updateUi(self):
super().updateUi()
self.tag_name = self.tr("category")
super().updateUi()
self.refresh(UpdateFilter(refresh_all=True))

def on_added(self, category):
Expand Down
6 changes: 3 additions & 3 deletions bitcoin_safe/gui/qt/custom_edits.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@


import bdkpython as bdk
from bitcoin_qrreader.bitcoin_qr import MultipathDescriptor
from bitcoin_qr_tools.multipath_descriptor import MultipathDescriptor
from PyQt6.QtCore import QEvent, Qt, pyqtSignal
from PyQt6.QtGui import QFocusEvent, QKeyEvent
from PyQt6.QtWidgets import QLineEdit, QTextEdit
Expand Down Expand Up @@ -85,9 +85,9 @@ def do_pdf():

make_and_open_pdf(get_wallet())

from bitcoin_qrreader import bitcoin_qr
from bitcoin_qr_tools.data import Data

def custom_handle_camera_input(data: bitcoin_qr.Data, parent):
def custom_handle_camera_input(data: Data, parent):
self.setText(str(data.data_as_string()))
self.signal_change.emit(str(data.data_as_string()))

Expand Down
12 changes: 6 additions & 6 deletions bitcoin_safe/gui/qt/export_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@
import logging
from typing import Dict, Optional

from bitcoin_qrreader.bitcoin_qr import Data, DataType
from bitcoin_nostr_chat.connected_devices.connected_devices import short_key
from bitcoin_nostr_chat.nostr import BitcoinDM, ChatLabel
from bitcoin_qr_tools.data import Data, DataType
from bitcoin_qr_tools.qr_widgets import QRCodeWidgetSVG

from bitcoin_safe.gui.qt.keystore_ui import SignerUI
from bitcoin_safe.gui.qt.nostr_sync.connected_devices.connected_devices import short_key
from bitcoin_safe.gui.qt.nostr_sync.nostr import BitcoinDM, ChatLabel
from bitcoin_safe.threading_manager import TaskThread
from bitcoin_safe.tx import short_tx_id, transaction_to_dict

from .qr_components.image_widget import QRCodeWidgetSVG
from .sync_tab import SyncTab

logger = logging.getLogger(__name__)
Expand All @@ -47,6 +47,7 @@
import os

import bdkpython as bdk
from bitcoin_qr_tools.qr_generator import QRGenerator
from nostr_sdk import PublicKey
from PyQt6.QtCore import Qt, pyqtSignal
from PyQt6.QtGui import QAction, QIcon
Expand All @@ -63,7 +64,6 @@
)

from ...signals import SignalsMin, pyqtSignal
from .qr_components.qr import create_qr_svg
from .util import Message, MessageType, do_copy, read_QIcon, save_file_dialog


Expand Down Expand Up @@ -336,7 +336,7 @@ def lazy_load_qr(self, data: Data, max_length=200):
def do():
self.signal_set_qr_images.connect(self.qr_label.set_images)
fragments = data.generate_fragments_for_qr(max_qr_size=max_length)
images = [create_qr_svg(fragment) for fragment in fragments]
images = [QRGenerator.create_qr_svg(fragment) for fragment in fragments]
return images

def on_done(result):
Expand Down
1 change: 1 addition & 0 deletions bitcoin_safe/gui/qt/fee_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ def updateUi(self):

self.set_fiat_fee_label()
self.update_fee_rate_warning()
self.mempool.refresh()

def set_vsize(self, vsize):
self.vsize = vsize
Expand Down
21 changes: 17 additions & 4 deletions bitcoin_safe/gui/qt/hist_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
from typing import Dict, Iterable, List, Optional, Set, Tuple

import bdkpython as bdk
from bitcoin_qrreader.bitcoin_qr import Data, DataType
from bitcoin_qr_tools.data import Data, DataType
from PyQt6.QtCore import (
QModelIndex,
QPersistentModelIndex,
Expand Down Expand Up @@ -349,16 +349,29 @@ def update_with_filter(self, update_filter: UpdateFilter):
if update_filter.refresh_all:
return self.update()

def categories_intersect(model: MyStandardItemModel, row) -> Set:
return set(model.data(model.index(row, self.Columns.CATEGORIES))).intersection(
set(update_filter.categories)
)

def tx_involves_address(txid) -> Set:
(wallet, tx) = self._tx_dict[txid]
fulltxdetail = wallet.get_dict_fulltxdetail().get(txid)
if not fulltxdetail:
return set()
return update_filter.addresses.intersection(fulltxdetail.involved_addresses())

logger.debug(f"{self.__class__.__name__} update_with_filter {update_filter}")

log_info = []
model = self.std_model
# Select rows with an ID in id_list
for row in range(model.rowCount()):
txid = model.data(model.index(row, self.Columns.TXID))
if txid in update_filter.txids or set(
model.data(model.index(row, self.Columns.CATEGORIES))
).intersection(set(update_filter.categories)):

if any(
[txid in update_filter.txids, categories_intersect(model, row), tx_involves_address(txid)]
):
log_info.append((row, txid))
self.refresh_row(txid, row)

Expand Down
38 changes: 21 additions & 17 deletions bitcoin_safe/gui/qt/keystore_ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,13 @@
from typing import Callable, List

import bdkpython as bdk
from bitcoin_qrreader import bitcoin_qr
from bitcoin_qr_tools.data import (
Data,
DataType,
SignerInfo,
convert_slip132_to_bip32,
is_slip132,
)
from bitcoin_usb.address_types import AddressType
from bitcoin_usb.gui import USBGui
from bitcoin_usb.software_signer import SoftwareSigner
Expand Down Expand Up @@ -207,7 +213,7 @@ def seed_validator():
self.button_hwi.clicked.connect(lambda: self.on_hwi_click())

def process_input(s: str):
res = bitcoin_qr.Data.from_str(s, self.network)
res = Data.from_str(s, self.network)
self._on_handle_input(res)

self.button_file.clicked.connect(
Expand Down Expand Up @@ -336,8 +342,8 @@ def successful_import_signer_info(self):
def get_expected_key_origin(self) -> str:
return self.get_address_type().key_origin(self.network)

def set_using_signer_info(self, signer_info: bitcoin_qr.SignerInfo):
def check_key_origin(signer_info: bitcoin_qr.SignerInfo):
def set_using_signer_info(self, signer_info: SignerInfo):
def check_key_origin(signer_info: SignerInfo):
expected_key_origin = self.get_expected_key_origin()
if signer_info.key_origin != expected_key_origin:
Message(
Expand All @@ -356,11 +362,11 @@ def check_key_origin(signer_info: bitcoin_qr.SignerInfo):
self.edit_fingerprint.setText(signer_info.fingerprint)
self.successful_import_signer_info()

def _on_handle_input(self, data: bitcoin_qr.Data, parent: QWidget = None):
def _on_handle_input(self, data: Data, parent: QWidget = None):

if data.data_type == bitcoin_qr.DataType.SignerInfo:
if data.data_type == DataType.SignerInfo:
self.set_using_signer_info(data.data)
elif data.data_type == bitcoin_qr.DataType.SignerInfos:
elif data.data_type == DataType.SignerInfos:
expected_key_origin = self.get_expected_key_origin()
# pick the right signer data
for signer_info in data.data:
Expand All @@ -375,18 +381,18 @@ def _on_handle_input(self, data: bitcoin_qr.Data, parent: QWidget = None):
)
)

elif data.data_type == bitcoin_qr.DataType.Xpub:
elif data.data_type == DataType.Xpub:
self.edit_xpub.setText(data.data)
elif data.data_type == bitcoin_qr.DataType.Fingerprint:
elif data.data_type == DataType.Fingerprint:
self.edit_fingerprint.setText(data.data)
elif data.data_type in [
bitcoin_qr.DataType.Descriptor,
bitcoin_qr.DataType.MultiPathDescriptor,
DataType.Descriptor,
DataType.MultiPathDescriptor,
]:
Message(self.tr("Please paste descriptors into the descriptor field in the top right."))
elif isinstance(data.data, str) and parent:
parent.setText(data.data)
elif isinstance(data, bitcoin_qr.Data):
elif isinstance(data, Data):
Message(
self.tr("{data_type} cannot be used here.").format(data_type=data.data_type),
type=MessageType.Error,
Expand All @@ -397,13 +403,13 @@ def _on_handle_input(self, data: bitcoin_qr.Data, parent: QWidget = None):
def xpub_validator(self):
xpub = self.edit_xpub.text()
# automatically convert slip132
if bitcoin_qr.is_slip132(xpub):
if is_slip132(xpub):
Message(
self.tr("The xpub is in SLIP132 format. Converting to standard format."),
title="Converting format",
)
try:
self.edit_xpub.setText(bitcoin_qr.convert_slip132_to_bip32(xpub))
self.edit_xpub.setText(convert_slip132_to_bip32(xpub))
except:
return False

Expand Down Expand Up @@ -443,9 +449,7 @@ def on_hwi_click(self):
return

fingerprint, xpub = result
self.set_using_signer_info(
bitcoin_qr.SignerInfo(fingerprint=fingerprint, key_origin=key_origin, xpub=xpub)
)
self.set_using_signer_info(SignerInfo(fingerprint=fingerprint, key_origin=key_origin, xpub=xpub))

def get_ui_values_as_keystore(self) -> KeyStore:
seed_str = self.edit_seed.text().strip()
Expand Down
12 changes: 6 additions & 6 deletions bitcoin_safe/gui/qt/label_syncer.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,18 @@
from collections import deque
from typing import List

from bitcoin_nostr_chat.connected_devices.connected_devices import TrustedDevice
from bitcoin_nostr_chat.nostr import BitcoinDM, ChatLabel
from nostr_sdk import PublicKey

from bitcoin_safe.gui.qt.nostr_sync.connected_devices.connected_devices import (
TrustedDevice,
)
from bitcoin_safe.gui.qt.nostr_sync.nostr import BitcoinDM, ChatLabel
from bitcoin_safe.gui.qt.sync_tab import SyncTab

logger = logging.getLogger(__name__)
from bitcoin_nostr_chat.nostr_sync import Data, DataType

from bitcoin_safe.labels import Labels, LabelType
from bitcoin_safe.signals import Signals, UpdateFilter

from .nostr_sync.nostr_sync import Data, DataType


class LabelSyncer:
def __init__(self, labels: Labels, sync_tab: SyncTab, signals: Signals) -> None:
Expand Down Expand Up @@ -83,6 +81,8 @@ def on_nostr_label_bip329_received(self, data: Data):
logger.info(f"on_nostr_label_bip329_received {data}")
if data.data_type == DataType.LabelsBip329:
changed_labels = self.labels.import_dumps_data(data.data)
if not changed_labels:
return
logger.debug(f"on_nostr_label_bip329_received updated: {changed_labels} ")

addresses: List[str] = []
Expand Down
Loading

0 comments on commit c5fb129

Please sign in to comment.