diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 294b287..eb84072 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,7 +34,7 @@ repos: rev: v1.11.2 # Use the latest MyPy version hooks: - id: mypy - files: ^bitcoin_safe/ + files: ^bitcoin_safe/|^tools/ args: - --check-untyped-defs # - --disallow-untyped-defs diff --git a/bitcoin_safe/fx.py b/bitcoin_safe/fx.py index 5c8f000..cf64a3f 100644 --- a/bitcoin_safe/fx.py +++ b/bitcoin_safe/fx.py @@ -43,9 +43,9 @@ class FX(QObject, ThreadingManager): signal_data_updated: TypedPyQtSignalNo = pyqtSignal() # type: ignore - def __init__(self, threading_parent: ThreadingManager | None = None) -> None: + def __init__(self, proxies: Dict | None, threading_parent: ThreadingManager | None = None) -> None: super().__init__(threading_parent=threading_parent) # type: ignore - + self.proxies = proxies self.rates: Dict[str, Dict] = {} self.update() logger.debug(f"initialized {self}") @@ -89,7 +89,6 @@ def on_success(data) -> None: self.append_thread( threaded_fetch( - "https://api.coingecko.com/api/v3/exchange_rates", - on_success, + "https://api.coingecko.com/api/v3/exchange_rates", on_success, proxies=self.proxies ) ) diff --git a/bitcoin_safe/gui/icons/status_connected_proxy.svg b/bitcoin_safe/gui/icons/status_connected_proxy.svg new file mode 100644 index 0000000..88c8ae8 --- /dev/null +++ b/bitcoin_safe/gui/icons/status_connected_proxy.svg @@ -0,0 +1,306 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + Record + + + record + media + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + diff --git a/bitcoin_safe/gui/locales/app_ar_AE.qm b/bitcoin_safe/gui/locales/app_ar_AE.qm index 37889be..517d37f 100644 Binary files a/bitcoin_safe/gui/locales/app_ar_AE.qm and b/bitcoin_safe/gui/locales/app_ar_AE.qm differ diff --git a/bitcoin_safe/gui/locales/app_ar_AE.ts b/bitcoin_safe/gui/locales/app_ar_AE.ts index 4eaf096..daa2bf3 100644 --- a/bitcoin_safe/gui/locales/app_ar_AE.ts +++ b/bitcoin_safe/gui/locales/app_ar_AE.ts @@ -83,6 +83,10 @@ Copy as csv نسخ كملف csv + + Set category + تعيين الفئة + Tx تحويلة @@ -438,6 +442,17 @@ Please back up this descriptor to be able to recover the funds! اختر الجهاز المكتشف + + DeviceManager + + Trusted + موثوق + + + Untrusted + غير موثوق + + DisplayAddressDialog @@ -1413,6 +1428,14 @@ Location of signing device: ..... Mempool Instance URL عنوان Mempool Instance + + The proxy does not apply to the Sync&Chat feature! + الوكيل لا ينطبق على ميزة المزامنة والدردشة! + + + Proxy: + بروكسي: + Apply && Shutdown تطبيق && إيقاف @@ -1721,10 +1744,26 @@ Location of signing device: ..... Choose a new name, or an existing name for merging: اختر اسمًا جديدًا، أو اسمًا موجودًا للدمج: + + Syncing with {server} + مزامنة مع {server} + + + Connected to {server} + متصل بـ {server} + + + Disconnected from {server} + منفصل عن {server} + Click for new address انقر للحصول على عنوان جديد + + Sync && Chat + المزامنة && الدردشة + Export labels تصدير التسميات @@ -1737,10 +1776,6 @@ Location of signing device: ..... Import labels استيراد التسميات - - Sync && Chat - المزامنة && الدردشة - All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json) جميع الملفات (*);;ملفات JSONL (*.jsonl);;ملفات JSON (*.json) @@ -2333,18 +2368,10 @@ You can restore your labels at a later time with 'Import Sync Key'. - TrustedDevice - - Connected to {id} - متصل ب{id} - - - Syncing Address labels - مزامنة تسميات العناوين - + TrustedDeviceItem - Can share Transactions - يمكن مشاركة المعاملات + Untrust device + جهاز غير موثوق @@ -2403,14 +2430,6 @@ You can restore your labels at a later time with 'Import Sync Key'.Set custom Relay list تعيين قائمة تتابع مخصصة - - Trusted - موثوق - - - UnTrusted - غير موثوق - My Device: {id} جهازي: {id} @@ -2625,14 +2644,14 @@ below {rate} - UnTrustedDevice + UntrustedDeviceItem - Trust {id} - ثق {id} + Trust + ثقة - Accept trust request from {other} - قبول طلب الثقة من {other} + Trust this device + ثق بهذا الجهاز @@ -3212,6 +3231,10 @@ Please install it. This is a private and fast way to connect to the bitcoin network. هذه طريقة خاصة وسريعة للاتصال بشبكة البيتكوين. + + Run your bitcoind with "bitcoind -chain=test" + قم بتشغيل bitcoind الخاص بك باستخدام "bitcoind -chain=test" + Run your bitcoind with "bitcoind -chain=signet" This however is a different signet than mutinynet.com. قم بتشغيل bitcoind الخاص بك باستخدام "bitcoind -chain=signet" ومع ذلك، فإن هذا التوقيع مختلف عن mutinynet.com. @@ -3222,20 +3245,24 @@ It is best to use your own server, such as {link}. يمكن للخادم ربط عنوان IP الخاص بك بعناوين المحفظة. من الأفضل استخدام خادمك الخاص، مثل {link}. - You can setup {link} with an electrum server on {server} and a block explorer on {explorer} - يمكنك إعداد {link} مع خادم إليكتروم على {server} ومستكشف الكتل على {explorer} + You can setup {electrum} with an electrum server on {server} and a block explorer on {explorer} + يمكنك إعداد {electrum} بخادم إلكتروم على {server} ومستكشف البلوك على {explorer} + + + A good option is {electrum_testnet4} and as block explorer {explorer_testnet4} + خيار جيد هو {electrum_testnet4} وكمستكشف بلوك {explorer_testnet4} - A good option is {link} and a block explorer on {explorer}. - الخيار الجيد هو {link} ومستكشف الكتل على {explorer}. + Signet choose {electrum} and a block explorer on {mempool_url}. + اختر Signet {electrum} ومستكشف بلوك على {mempool_url}. You can setup {setup} with an esplora server on {server} and a block explorer on {explorer} يمكنك إعداد {setup} باستخدام خادم esplora على {server} ومستكشف الكتل على {explorer} - A good option is {link} and a block explorer on {explorer}. There is a {faucet}. - الخيار الجيد هو {link} ومستكشف الكتل على {explorer}. هناك {faucet}. + A (somtimes working) server is {link} and a block explorer on {explorer}. There is a {faucet}. + خادم (يعمل أحياناً) هو {link} ومستكشف بلوك على {explorer}. هناك {faucet}. You can connect your own Bitcoin node, such as {link}. @@ -3245,9 +3272,16 @@ It is best to use your own server, such as {link}. Run your bitcoind with "bitcoind -chain=regtest" قم بتشغيل bitcoind الخاص بك باستخدام "bitcoind -chain=regtest" + + + network_config - Run your bitcoind with "bitcoind -chain=test" - قم بتشغيل bitcoind الخاص بك باستخدام "bitcoind -chain=test" + {server_name} via the proxy {proxy} + {server_name} عبر البروكسي {proxy} + + + {server_name} + {server_name} diff --git a/bitcoin_safe/gui/locales/app_de_DE.qm b/bitcoin_safe/gui/locales/app_de_DE.qm index 48b1c81..75f7b5d 100644 Binary files a/bitcoin_safe/gui/locales/app_de_DE.qm and b/bitcoin_safe/gui/locales/app_de_DE.qm differ diff --git a/bitcoin_safe/gui/locales/app_de_DE.ts b/bitcoin_safe/gui/locales/app_de_DE.ts index a4882b4..6b0c105 100644 --- a/bitcoin_safe/gui/locales/app_de_DE.ts +++ b/bitcoin_safe/gui/locales/app_de_DE.ts @@ -83,6 +83,10 @@ Copy as csv Als CSV kopieren + + Set category + Kategorie festlegen + Tx Tx @@ -438,6 +442,17 @@ Please back up this descriptor to be able to recover the funds! Erkanntes Gerät auswählen + + DeviceManager + + Trusted + Vertrauenswürdig + + + Untrusted + Nicht vertrauenswürdig + + DisplayAddressDialog @@ -1413,6 +1428,14 @@ Location of signing device: ..... Mempool Instance URL Mempool Instance-URL + + The proxy does not apply to the Sync&Chat feature! + Der Proxy gilt nicht für die Sync&Chat-Funktion! + + + Proxy: + Proxy: + Apply && Shutdown Anwenden && Herunterfahren @@ -1718,10 +1741,26 @@ Location of signing device: ..... Choose a new name, or an existing name for merging: Wählen Sie einen neuen Namen oder einen bestehenden Namen zum Zusammenführen: + + Syncing with {server} + Synchronisierung mit {server} + + + Connected to {server} + Verbunden mit {server} + + + Disconnected from {server} + Getrennt von {server} + Click for new address Für neue Adresse klicken + + Sync && Chat + Synchronisieren && Chatten + Export labels Etiketten exportieren @@ -1734,10 +1773,6 @@ Location of signing device: ..... Import labels Etiketten importieren - - Sync && Chat - Synchronisieren && Chatten - All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json) Alle Dateien (*);;JSONL-Dateien (*.jsonl);;JSON-Dateien (*.json) @@ -2330,18 +2365,10 @@ You can restore your labels at a later time with 'Import Sync Key'. - TrustedDevice - - Connected to {id} - Verbunden mit {id} - - - Syncing Address labels - Adresslabels synchronisieren - + TrustedDeviceItem - Can share Transactions - Kann Transaktionen teilen + Untrust device + Gerät nicht vertrauen @@ -2400,14 +2427,6 @@ You can restore your labels at a later time with 'Import Sync Key'.Set custom Relay list Benutzerdefinierte Relay-Liste festlegen - - Trusted - Vertrauenswürdig - - - UnTrusted - Nicht vertrauenswürdig - My Device: {id} Mein Gerät: {id} @@ -2622,14 +2641,14 @@ below {rate} - UnTrustedDevice + UntrustedDeviceItem - Trust {id} - Vertrauen {id} + Trust + Vertrauen - Accept trust request from {other} - Vertrauensanfrage von {other} akzeptieren + Trust this device + Diesem Gerät vertrauen @@ -3209,6 +3228,10 @@ Please install it. This is a private and fast way to connect to the bitcoin network. Dies ist eine private und schnelle Möglichkeit, sich mit dem Bitcoin-Netzwerk zu verbinden. + + Run your bitcoind with "bitcoind -chain=test" + Führen Sie Ihren bitcoind mit "bitcoind -chain=test" aus + Run your bitcoind with "bitcoind -chain=signet" This however is a different signet than mutinynet.com. Führen Sie Ihren bitcoind mit "bitcoind -chain=signet" aus. Dies ist jedoch ein anderes Signet als mutinynet.com. @@ -3219,20 +3242,24 @@ It is best to use your own server, such as {link}. Der Server kann Ihre IP-Adresse den Wallet-Adressen zuordnen. Es ist am besten, Ihren eigenen Server zu verwenden, wie {link}. - You can setup {link} with an electrum server on {server} and a block explorer on {explorer} - Sie können {link} mit einem Electrum-Server auf {server} und einem Block-Explorer auf {explorer} einrichten + You can setup {electrum} with an electrum server on {server} and a block explorer on {explorer} + Sie können {electrum} mit einem Electrum-Server auf {server} und einem Block-Explorer auf {explorer} einrichten + + + A good option is {electrum_testnet4} and as block explorer {explorer_testnet4} + Eine gute Option ist {electrum_testnet4} und als Block-Explorer {explorer_testnet4} - A good option is {link} and a block explorer on {explorer}. - Eine gute Option ist {link} und ein Block-Explorer auf {explorer}. + Signet choose {electrum} and a block explorer on {mempool_url}. + Signet wählen {electrum} und einen Block-Explorer auf {mempool_url}. You can setup {setup} with an esplora server on {server} and a block explorer on {explorer} Sie können {setup} mit einem Esplora-Server auf {server} und einem Block-Explorer auf {explorer} einrichten - A good option is {link} and a block explorer on {explorer}. There is a {faucet}. - Eine gute Option ist {link} und ein Block-Explorer auf {explorer}. Dort gibt es ein {faucet}. + A (somtimes working) server is {link} and a block explorer on {explorer}. There is a {faucet}. + Ein (manchmal funktionierender) Server ist {link} und ein Block-Explorer auf {explorer}. Es gibt ein {faucet}. You can connect your own Bitcoin node, such as {link}. @@ -3242,9 +3269,16 @@ It is best to use your own server, such as {link}. Run your bitcoind with "bitcoind -chain=regtest" Führen Sie Ihren bitcoind mit "bitcoind -chain=regtest" aus + + + network_config - Run your bitcoind with "bitcoind -chain=test" - Führen Sie Ihren bitcoind mit "bitcoind -chain=test" aus + {server_name} via the proxy {proxy} + {server_name} über den Proxy {proxy} + + + {server_name} + {server_name} diff --git a/bitcoin_safe/gui/locales/app_es_ES.qm b/bitcoin_safe/gui/locales/app_es_ES.qm index 20ce15f..7e8e909 100644 Binary files a/bitcoin_safe/gui/locales/app_es_ES.qm and b/bitcoin_safe/gui/locales/app_es_ES.qm differ diff --git a/bitcoin_safe/gui/locales/app_es_ES.ts b/bitcoin_safe/gui/locales/app_es_ES.ts index 6a27833..f82fbd5 100644 --- a/bitcoin_safe/gui/locales/app_es_ES.ts +++ b/bitcoin_safe/gui/locales/app_es_ES.ts @@ -83,6 +83,10 @@ Copy as csv Copiar como csv + + Set category + Establecer categoría + Tx Tx @@ -438,6 +442,17 @@ Please back up this descriptor to be able to recover the funds! Seleccionar el dispositivo detectado + + DeviceManager + + Trusted + Confiado + + + Untrusted + No confiado + + DisplayAddressDialog @@ -1413,6 +1428,14 @@ Location of signing device: ..... Mempool Instance URL URL de instancia de Mempool + + The proxy does not apply to the Sync&Chat feature! + ¡El proxy no se aplica a la función de Sincronización y Chat! + + + Proxy: + Proxy: + Apply && Shutdown Aplicar && Apagar @@ -1721,10 +1744,26 @@ Location of signing device: ..... Choose a new name, or an existing name for merging: Elige un nuevo nombre o un nombre existente para fusionar: + + Syncing with {server} + Sincronizando con {server} + + + Connected to {server} + Conectado a {server} + + + Disconnected from {server} + Desconectado de {server} + Click for new address Haz clic para una nueva dirección + + Sync && Chat + Sincronizar && Chatear + Export labels Exportar etiquetas @@ -1737,10 +1776,6 @@ Location of signing device: ..... Import labels Importar etiquetas - - Sync && Chat - Sincronizar && Chatear - All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json) Todos los archivos (*);;Archivos JSONL (*.jsonl);;Archivos JSON (*.json) @@ -2333,18 +2368,10 @@ You can restore your labels at a later time with 'Import Sync Key'. - TrustedDevice - - Connected to {id} - Conectado a {id} - - - Syncing Address labels - Sincronizando etiquetas de direcciones - + TrustedDeviceItem - Can share Transactions - Puede compartir transacciones + Untrust device + Dispositivo no confiable @@ -2403,14 +2430,6 @@ You can restore your labels at a later time with 'Import Sync Key'.Set custom Relay list Establecer lista personalizada de Relay - - Trusted - Confiado - - - UnTrusted - No confiado - My Device: {id} Mi dispositivo: {id} @@ -2625,14 +2644,14 @@ below {rate} - UnTrustedDevice + UntrustedDeviceItem - Trust {id} - Confiar {id} + Trust + Confianza - Accept trust request from {other} - Aceptar solicitud de confianza de {other} + Trust this device + Confía en este dispositivo @@ -3212,6 +3231,10 @@ Please install it. This is a private and fast way to connect to the bitcoin network. Esta es una forma privada y rápida de conectarse a la red bitcoin. + + Run your bitcoind with "bitcoind -chain=test" + Ejecuta tu bitcoind con "bitcoind -chain=test" + Run your bitcoind with "bitcoind -chain=signet" This however is a different signet than mutinynet.com. Ejecuta tu bitcoind con "bitcoind -chain=signet" Sin embargo, este es un signet diferente al de mutinynet.com. @@ -3222,20 +3245,24 @@ It is best to use your own server, such as {link}. El servidor puede asociar tu dirección IP con las direcciones de la cartera. Es mejor usar tu propio servidor, como {link}. - You can setup {link} with an electrum server on {server} and a block explorer on {explorer} - Puedes configurar {link} con un servidor de electrum en {server} y un explorador de bloques en {explorer} + You can setup {electrum} with an electrum server on {server} and a block explorer on {explorer} + Puedes configurar {electrum} con un servidor electrum en {server} y un explorador de bloques en {explorer} + + + A good option is {electrum_testnet4} and as block explorer {explorer_testnet4} + Una buena opción es {electrum_testnet4} y como explorador de bloques {explorer_testnet4} - A good option is {link} and a block explorer on {explorer}. - Una buena opción es {link} y un explorador de bloques en {explorer}. + Signet choose {electrum} and a block explorer on {mempool_url}. + Signet elige {electrum} y un explorador de bloques en {mempool_url}. You can setup {setup} with an esplora server on {server} and a block explorer on {explorer} Puedes configurar {setup} con un servidor esplora en {server} y un explorador de bloques en {explorer} - A good option is {link} and a block explorer on {explorer}. There is a {faucet}. - Una buena opción es {link} y un explorador de bloques en {explorer}. Hay un {faucet}. + A (somtimes working) server is {link} and a block explorer on {explorer}. There is a {faucet}. + Un servidor (a veces funciona) es {link} y un explorador de bloques en {explorer}. Hay un {faucet}. You can connect your own Bitcoin node, such as {link}. @@ -3245,9 +3272,16 @@ It is best to use your own server, such as {link}. Run your bitcoind with "bitcoind -chain=regtest" Ejecuta tu bitcoind con "bitcoind -chain=regtest" + + + network_config - Run your bitcoind with "bitcoind -chain=test" - Ejecuta tu bitcoind con "bitcoind -chain=test" + {server_name} via the proxy {proxy} + {server_name} a través del proxy {proxy} + + + {server_name} + {server_name} diff --git a/bitcoin_safe/gui/locales/app_fr_FR.qm b/bitcoin_safe/gui/locales/app_fr_FR.qm index 1baab8c..4aaf410 100644 Binary files a/bitcoin_safe/gui/locales/app_fr_FR.qm and b/bitcoin_safe/gui/locales/app_fr_FR.qm differ diff --git a/bitcoin_safe/gui/locales/app_fr_FR.ts b/bitcoin_safe/gui/locales/app_fr_FR.ts index 39655cd..dd51731 100644 --- a/bitcoin_safe/gui/locales/app_fr_FR.ts +++ b/bitcoin_safe/gui/locales/app_fr_FR.ts @@ -83,6 +83,10 @@ Copy as csv Copier en csv + + Set category + Définir la catégorie + Tx Tx @@ -438,6 +442,17 @@ Please back up this descriptor to be able to recover the funds! Scanner les adresses à l'avance + + DeviceManager + + Trusted + Exporter la clé de synchronisation + + + Untrusted + Non fiable + + DisplayAddressDialog @@ -1413,6 +1428,14 @@ Location of signing device: ..... Mempool Instance URL URL de l'instance Mempool + + The proxy does not apply to the Sync&Chat feature! + Le proxy ne s'applique pas à la fonctionnalité de Synchronisation et de Chat ! + + + Proxy: + Proxy : + Apply && Shutdown Appliquer && Arrêter @@ -1721,10 +1744,26 @@ Voulez-vous continuer malgré tout ? Choose a new name, or an existing name for merging: Choisissez un nouveau nom, ou un nom existant pour la fusion: + + Syncing with {server} + Synchronisation avec {server} + + + Connected to {server} + Connecté à {server} + + + Disconnected from {server} + Déconnecté de {server} + Click for new address Cliquez pour une nouvelle adresse + + Sync && Chat + Synchroniser && Discuter + Export labels Exporter les étiquettes @@ -1737,10 +1776,6 @@ Voulez-vous continuer malgré tout ? Import labels Importer les étiquettes - - Sync && Chat - Synchroniser && Discuter - All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json) Tous les fichiers (*);;Fichiers JSONL (*.jsonl);;Fichiers JSON (*.json) @@ -2333,18 +2368,10 @@ You can restore your labels at a later time with 'Import Sync Key'. - TrustedDevice - - Connected to {id} - Connecté à {id} - - - Syncing Address labels - Synchronisation des étiquettes d'adresse - + TrustedDeviceItem - Can share Transactions - Peut partager des Transactions + Untrust device + Appareil non fiable @@ -2403,14 +2430,6 @@ You can restore your labels at a later time with 'Import Sync Key'.Set custom Relay list Exportation de clé de synchronisation - - Trusted - Exporter la clé de synchronisation - - - UnTrusted - Importer la clé de synchronisation - My Device: {id} Réinitialiser la clé de synchronisation @@ -2625,14 +2644,14 @@ below {rate} - UnTrustedDevice + UntrustedDeviceItem - Trust {id} - Faire confiance à {id} + Trust + Confiance - Accept trust request from {other} - Accepter la demande de confiance de {other} + Trust this device + Faire confiance à cet appareil @@ -3212,6 +3231,10 @@ Please install it. This is a private and fast way to connect to the bitcoin network. C'est un moyen privé et rapide de se connecter au réseau bitcoin. + + Run your bitcoind with "bitcoind -chain=test" + Exécutez votre bitcoind avec "bitcoind -chain=test" + Run your bitcoind with "bitcoind -chain=signet" This however is a different signet than mutinynet.com. Exécutez votre bitcoind avec "bitcoind -chain=signet" Cependant, c'est un signet différent de mutinynet.com. @@ -3222,20 +3245,24 @@ It is best to use your own server, such as {link}. Le serveur peut associer votre adresse IP aux adresses des portefeuilles. Il est préférable d'utiliser votre propre serveur, tel que {link}. - You can setup {link} with an electrum server on {server} and a block explorer on {explorer} - Vous pouvez configurer {link} avec un serveur Electrum sur {server} et un explorateur de blocs sur {explorer} + You can setup {electrum} with an electrum server on {server} and a block explorer on {explorer} + Vous pouvez configurer {electrum} avec un serveur electrum sur {server} et un explorateur de blocs sur {explorer} + + + A good option is {electrum_testnet4} and as block explorer {explorer_testnet4} + Une bonne option est {electrum_testnet4} et comme explorateur de blocs {explorer_testnet4} - A good option is {link} and a block explorer on {explorer}. - Une bonne option est {link} et un explorateur de blocs sur {explorer}. + Signet choose {electrum} and a block explorer on {mempool_url}. + Signet choisit {electrum} et un explorateur de blocs sur {mempool_url}. You can setup {setup} with an esplora server on {server} and a block explorer on {explorer} Vous pouvez configurer {setup} avec un serveur esplora sur {server} et un explorateur de blocs sur {explorer} - A good option is {link} and a block explorer on {explorer}. There is a {faucet}. - Une bonne option est {link} et un explorateur de blocs sur {explorer}. Il y a un {faucet}. + A (somtimes working) server is {link} and a block explorer on {explorer}. There is a {faucet}. + Un serveur (parfois fonctionnel) est {link} et un explorateur de blocs sur {explorer}. Il y a un {faucet}. You can connect your own Bitcoin node, such as {link}. @@ -3245,9 +3272,16 @@ It is best to use your own server, such as {link}. Run your bitcoind with "bitcoind -chain=regtest" Exécutez votre bitcoind avec "bitcoind -chain=regtest" + + + network_config - Run your bitcoind with "bitcoind -chain=test" - Exécutez votre bitcoind avec "bitcoind -chain=test" + {server_name} via the proxy {proxy} + {server_name} via le proxy {proxy} + + + {server_name} + {server_name} diff --git a/bitcoin_safe/gui/locales/app_hi_IN.qm b/bitcoin_safe/gui/locales/app_hi_IN.qm index b131cb9..8c26a34 100644 Binary files a/bitcoin_safe/gui/locales/app_hi_IN.qm and b/bitcoin_safe/gui/locales/app_hi_IN.qm differ diff --git a/bitcoin_safe/gui/locales/app_hi_IN.ts b/bitcoin_safe/gui/locales/app_hi_IN.ts index d9540ec..6abe581 100644 --- a/bitcoin_safe/gui/locales/app_hi_IN.ts +++ b/bitcoin_safe/gui/locales/app_hi_IN.ts @@ -83,6 +83,10 @@ Copy as csv सीएसवी के रूप में कॉपी करें + + Set category + श्रेणी सेट करें + Tx टीएक्स @@ -438,6 +442,17 @@ Please back up this descriptor to be able to recover the funds! पता लगाए गए उपकरण का चयन करें + + DeviceManager + + Trusted + विश्वसनीय + + + Untrusted + अविश्वसनीय + + DisplayAddressDialog @@ -1413,6 +1428,14 @@ Location of signing device: ..... Mempool Instance URL मेमपूल इंस्टेंस URL + + The proxy does not apply to the Sync&Chat feature! + प्रॉक्सी सिंक और चैट सुविधा पर लागू नहीं होती! + + + Proxy: + प्रॉक्सी: + Apply && Shutdown लागू करें && बंद करें @@ -1721,10 +1744,26 @@ Location of signing device: ..... Choose a new name, or an existing name for merging: नया नाम चुनें, या विलय के लिए मौजूदा नाम चुनें: + + Syncing with {server} + {server} के साथ सिंकिंग + + + Connected to {server} + {server} से जुड़ा हुआ + + + Disconnected from {server} + {server} से डिस्कनेक्टेड + Click for new address नया पता के लिए क्लिक करें + + Sync && Chat + सिंक && चैट + Export labels लेबल निर्यात करें @@ -1737,10 +1776,6 @@ Location of signing device: ..... Import labels लेबल आयात करें - - Sync && Chat - सिंक && चैट - All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json) सभी फ़ाइलें (*);;JSONL फ़ाइलें (*.jsonl);;JSON फ़ाइलें (*.json) @@ -2333,18 +2368,10 @@ You can restore your labels at a later time with 'Import Sync Key'. - TrustedDevice - - Connected to {id} - {id} से जुड़ा हुआ - - - Syncing Address labels - पता लेबल सिंक करना - + TrustedDeviceItem - Can share Transactions - लेन-देन साझा कर सकते हैं + Untrust device + डिवाइस पर भरोसा नहीं @@ -2403,14 +2430,6 @@ You can restore your labels at a later time with 'Import Sync Key'.Set custom Relay list कस्टम रिले सूची सेट करें - - Trusted - विश्वसनीय - - - UnTrusted - अविश्वसनीय - My Device: {id} मेरा उपकरण: {id} @@ -2625,14 +2644,14 @@ below {rate} - UnTrustedDevice + UntrustedDeviceItem - Trust {id} - {id} पर भरोसा करें + Trust + भरोसा - Accept trust request from {other} - {other} से भरोसा अनुरोध स्वीकार करें + Trust this device + इस डिवाइस पर भरोसा करें @@ -3212,6 +3231,10 @@ Please install it. This is a private and fast way to connect to the bitcoin network. यह बिटकॉइन नेटवर्क से जुड़ने का एक निजी और तेज़ तरीका है। + + Run your bitcoind with "bitcoind -chain=test" + "bitcoind -chain=test" के साथ अपना bitcoind चलाएं + Run your bitcoind with "bitcoind -chain=signet" This however is a different signet than mutinynet.com. "bitcoind -chain=signet" के साथ अपना bitcoind चलाएं यह हालांकि mutinynet.com के अलग signet है। @@ -3222,20 +3245,24 @@ It is best to use your own server, such as {link}. सर्वर आपके IP पते को वॉलेट पतों के साथ जोड़ सकता है। अपना खुद का सर्वर उपयोग करना सबसे अच्छा है, जैसे कि {link}। - You can setup {link} with an electrum server on {server} and a block explorer on {explorer} - आप {link} के साथ एक इलेक्ट्रम सर्वर पर {server} और एक ब्लॉक एक्सप्लोरर पर {explorer} के साथ सेटअप कर सकते हैं + You can setup {electrum} with an electrum server on {server} and a block explorer on {explorer} + आप {server} पर एक इलेक्ट्रम सर्वर के साथ {electrum} सेटअप कर सकते हैं और एक ब्लॉक एक्सप्लोरर {explorer} पर + + + A good option is {electrum_testnet4} and as block explorer {explorer_testnet4} + एक अच्छा विकल्प है {electrum_testnet4} और ब्लॉक एक्सप्लोरर के रूप में {explorer_testnet4} - A good option is {link} and a block explorer on {explorer}. - एक अच्छा विकल्प है {link} और एक ब्लॉक एक्सप्लोरर पर {explorer}। + Signet choose {electrum} and a block explorer on {mempool_url}. + Signet चुनें {electrum} और एक ब्लॉक एक्सप्लोरर पर {mempool_url}। You can setup {setup} with an esplora server on {server} and a block explorer on {explorer} आप {setup} के साथ एक esplora सर्वर पर {server} और एक ब्लॉक एक्सप्लोरर पर {explorer} के साथ सेटअप कर सकते हैं - A good option is {link} and a block explorer on {explorer}. There is a {faucet}. - एक अच्छा विकल्प है {link} और एक ब्लॉक एक्सप्लोरर पर {explorer}। वहाँ एक {faucet} है। + A (somtimes working) server is {link} and a block explorer on {explorer}. There is a {faucet}. + एक (कभी-कभी काम करने वाला) सर्वर है {link} और एक ब्लॉक एक्सप्लोरर पर {explorer}। एक {faucet} है। You can connect your own Bitcoin node, such as {link}. @@ -3245,9 +3272,16 @@ It is best to use your own server, such as {link}. Run your bitcoind with "bitcoind -chain=regtest" "bitcoind -chain=regtest" के साथ अपना bitcoind चलाएं + + + network_config - Run your bitcoind with "bitcoind -chain=test" - "bitcoind -chain=test" के साथ अपना bitcoind चलाएं + {server_name} via the proxy {proxy} + प्रॉक्सी {proxy} के माध्यम से {server_name} + + + {server_name} + {server_name} diff --git a/bitcoin_safe/gui/locales/app_it_IT.qm b/bitcoin_safe/gui/locales/app_it_IT.qm index 706b698..7ac65fd 100644 Binary files a/bitcoin_safe/gui/locales/app_it_IT.qm and b/bitcoin_safe/gui/locales/app_it_IT.qm differ diff --git a/bitcoin_safe/gui/locales/app_it_IT.ts b/bitcoin_safe/gui/locales/app_it_IT.ts index 3d9acca..ad866cf 100644 --- a/bitcoin_safe/gui/locales/app_it_IT.ts +++ b/bitcoin_safe/gui/locales/app_it_IT.ts @@ -83,6 +83,10 @@ Copy as csv Copia come csv + + Set category + Imposta categoria + Tx Tx @@ -438,6 +442,17 @@ Please back up this descriptor to be able to recover the funds! Seleziona il dispositivo rilevato + + DeviceManager + + Trusted + Fidato + + + Untrusted + Non fidato + + DisplayAddressDialog @@ -1413,6 +1428,14 @@ Location of signing device: ..... Mempool Instance URL URL dell'istanza Mempool + + The proxy does not apply to the Sync&Chat feature! + Il proxy non si applica alla funzione di Sincronizzazione e Chat! + + + Proxy: + Proxy: + Apply && Shutdown Applica && Spegni @@ -1721,10 +1744,26 @@ Vuoi procedere comunque? Choose a new name, or an existing name for merging: Scegli un nuovo nome, o un nome esistente per la fusione: + + Syncing with {server} + Sincronizzazione con {server} + + + Connected to {server} + Connesso a {server} + + + Disconnected from {server} + Disconnesso da {server} + Click for new address Clicca per un nuovo indirizzo + + Sync && Chat + Sincronizza && Chatta + Export labels Esporta etichette @@ -1737,10 +1776,6 @@ Vuoi procedere comunque? Import labels Importa etichette - - Sync && Chat - Sincronizza && Chatta - All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json) Tutti i File (*);;File JSONL (*.jsonl);;File JSON (*.json) @@ -2333,18 +2368,10 @@ You can restore your labels at a later time with 'Import Sync Key'. - TrustedDevice - - Connected to {id} - Connesso a {id} - - - Syncing Address labels - Sincronizzazione etichette indirizzi - + TrustedDeviceItem - Can share Transactions - Può condividere transazioni + Untrust device + Dispositivo non fidato @@ -2403,14 +2430,6 @@ You can restore your labels at a later time with 'Import Sync Key'.Set custom Relay list Imposta l'elenco dei Relay personalizzati - - Trusted - Fidato - - - UnTrusted - Non fidato - My Device: {id} Il mio dispositivo: {id} @@ -2625,14 +2644,14 @@ below {rate} - UnTrustedDevice + UntrustedDeviceItem - Trust {id} - Fidati di {id} + Trust + Fiducia - Accept trust request from {other} - Accetta la richiesta di fiducia da {other} + Trust this device + Fidati di questo dispositivo @@ -3212,6 +3231,10 @@ Please install it. This is a private and fast way to connect to the bitcoin network. Questo è un modo privato e veloce per connettersi alla rete bitcoin. + + Run your bitcoind with "bitcoind -chain=test" + Esegui il tuo bitcoind con "bitcoind -chain=test" + Run your bitcoind with "bitcoind -chain=signet" This however is a different signet than mutinynet.com. Esegui il tuo bitcoind con "bitcoind -chain=signet" Questo tuttavia è un signet diverso da mutinynet.com. @@ -3222,20 +3245,24 @@ It is best to use your own server, such as {link}. Il server può associare il tuo indirizzo IP agli indirizzi del portafoglio. È meglio usare il proprio server, come {link}. - You can setup {link} with an electrum server on {server} and a block explorer on {explorer} - Puoi configurare {link} con un server electrum su {server} e un block explorer su {explorer} + You can setup {electrum} with an electrum server on {server} and a block explorer on {explorer} + Puoi impostare {electrum} con un server electrum su {server} e un esploratore di blocchi su {explorer} + + + A good option is {electrum_testnet4} and as block explorer {explorer_testnet4} + Una buona opzione è {electrum_testnet4} e come esploratore di blocchi {explorer_testnet4} - A good option is {link} and a block explorer on {explorer}. - Una buona opzione è {link} e un block explorer su {explorer}. + Signet choose {electrum} and a block explorer on {mempool_url}. + Signet sceglie {electrum} e un esploratore di blocchi su {mempool_url}. You can setup {setup} with an esplora server on {server} and a block explorer on {explorer} Puoi configurare {setup} con un server esplora su {server} e un block explorer su {explorer} - A good option is {link} and a block explorer on {explorer}. There is a {faucet}. - Una buona opzione è {link} e un block explorer su {explorer}. C'è un {faucet}. + A (somtimes working) server is {link} and a block explorer on {explorer}. There is a {faucet}. + Un server (a volte funzionante) è {link} e un esploratore di blocchi su {explorer}. C'è un {faucet}. You can connect your own Bitcoin node, such as {link}. @@ -3245,9 +3272,16 @@ It is best to use your own server, such as {link}. Run your bitcoind with "bitcoind -chain=regtest" Esegui il tuo bitcoind con "bitcoind -chain=regtest" + + + network_config - Run your bitcoind with "bitcoind -chain=test" - Esegui il tuo bitcoind con "bitcoind -chain=test" + {server_name} via the proxy {proxy} + {server_name} tramite il proxy {proxy} + + + {server_name} + {server_name} diff --git a/bitcoin_safe/gui/locales/app_ja_JP.qm b/bitcoin_safe/gui/locales/app_ja_JP.qm index 2c1e214..62ae1bc 100644 Binary files a/bitcoin_safe/gui/locales/app_ja_JP.qm and b/bitcoin_safe/gui/locales/app_ja_JP.qm differ diff --git a/bitcoin_safe/gui/locales/app_ja_JP.ts b/bitcoin_safe/gui/locales/app_ja_JP.ts index 9a50377..2aa7937 100644 --- a/bitcoin_safe/gui/locales/app_ja_JP.ts +++ b/bitcoin_safe/gui/locales/app_ja_JP.ts @@ -83,6 +83,10 @@ Copy as csv CSVとしてコピー + + Set category + カテゴリを設定 + Tx トランザクション @@ -438,6 +442,17 @@ Please back up this descriptor to be able to recover the funds! 検出されたデバイスを選択する + + DeviceManager + + Trusted + 信頼済み + + + Untrusted + 信頼されていない + + DisplayAddressDialog @@ -1413,6 +1428,14 @@ Location of signing device: ..... Mempool Instance URL 新しいウォレットを作成 + + The proxy does not apply to the Sync&Chat feature! + プロキシは同期&チャット機能には適用されません! + + + Proxy: + プロキシ: + Apply && Shutdown 適用 && シャットダウン @@ -1721,10 +1744,26 @@ Location of signing device: ..... Choose a new name, or an existing name for merging: 新しい名前、またはマージするための既存の名前を選択してください: + + Syncing with {server} + {server} と同期中 + + + Connected to {server} + {server} に接続しました + + + Disconnected from {server} + {server} から切断しました + Click for new address ウォレットの設定がまだありません + + Sync && Chat + 同期 && チャット + Export labels 新規 @@ -1737,10 +1776,6 @@ Location of signing device: ..... Import labels ラベルのインポート - - Sync && Chat - 同期 && チャット - All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json) すべてのファイル (*);;JSONL ファイル (*.jsonl);;JSON ファイル (*.json) @@ -2333,18 +2368,10 @@ You can restore your labels at a later time with 'Import Sync Key'. - TrustedDevice - - Connected to {id} - {id}に接続済み - - - Syncing Address labels - アドレスラベルを同期する - + TrustedDeviceItem - Can share Transactions - トランザクションを共有することができます + Untrust device + デバイスを信頼しない @@ -2403,14 +2430,6 @@ You can restore your labels at a later time with 'Import Sync Key'.Set custom Relay list カスタムリレーリストを設定する - - Trusted - 信頼済み - - - UnTrusted - 信頼されていない - My Device: {id} 私のデバイス:{id} @@ -2625,14 +2644,14 @@ below {rate} - UnTrustedDevice + UntrustedDeviceItem - Trust {id} - {id}を信頼する + Trust + 信頼 - Accept trust request from {other} - {other}からの信頼リクエストを受け入れる + Trust this device + このデバイスを信頼する @@ -3212,6 +3231,10 @@ Please install it. This is a private and fast way to connect to the bitcoin network. これはビットコインネットワークに接続するためのプライベートかつ高速な方法です。 + + Run your bitcoind with "bitcoind -chain=test" + "bitcoind -chain=test"でbitcoindを実行してください + Run your bitcoind with "bitcoind -chain=signet" This however is a different signet than mutinynet.com. "bitcoind -chain=signet"でbitcoindを実行してください。ただし、これはmutinynet.comの別のsignetです。 @@ -3222,20 +3245,24 @@ It is best to use your own server, such as {link}. サーバーはIPアドレスをウォレットアドレスに関連付けることができます。{link}など、独自のサーバーを使用するのが最適です。 - You can setup {link} with an electrum server on {server} and a block explorer on {explorer} - {link}を{server}上のElectrumサーバーと{explorer}上のブロックエクスプローラーに設定できます。 + You can setup {electrum} with an electrum server on {server} and a block explorer on {explorer} + {server} でエレクトラムサーバーを使用して {electrum} を設定し、{explorer} でブロックエクスプローラーを使用することができます + + + A good option is {electrum_testnet4} and as block explorer {explorer_testnet4} + 良い選択肢は {electrum_testnet4} としてブロックエクスプローラー {explorer_testnet4} - A good option is {link} and a block explorer on {explorer}. - 良いオプションは{link}と{explorer}上のブロックエクスプローラーです。 + Signet choose {electrum} and a block explorer on {mempool_url}. + Signet は {electrum} と {mempool_url} でブロックエクスプローラーを選択します。 You can setup {setup} with an esplora server on {server} and a block explorer on {explorer} {setup}を{server}上のEsploraサーバーと{explorer}上のブロックエクスプローラーに設定できます。 - A good option is {link} and a block explorer on {explorer}. There is a {faucet}. - 良いオプションは{link}と{explorer}上のブロックエクスプローラーです。蛇口があります。 + A (somtimes working) server is {link} and a block explorer on {explorer}. There is a {faucet}. + (時々動作する)サーバーは {link} と {explorer} でブロックエクスプローラーです。{faucet} があります。 You can connect your own Bitcoin node, such as {link}. @@ -3245,9 +3272,16 @@ It is best to use your own server, such as {link}. Run your bitcoind with "bitcoind -chain=regtest" "bitcoind -chain=regtest"でbitcoindを実行してください + + + network_config - Run your bitcoind with "bitcoind -chain=test" - "bitcoind -chain=test"でbitcoindを実行してください + {server_name} via the proxy {proxy} + プロキシ {proxy} 経由の {server_name} + + + {server_name} + {server_name} diff --git a/bitcoin_safe/gui/locales/app_pt_PT.qm b/bitcoin_safe/gui/locales/app_pt_PT.qm index 8502cfa..75f7c22 100644 Binary files a/bitcoin_safe/gui/locales/app_pt_PT.qm and b/bitcoin_safe/gui/locales/app_pt_PT.qm differ diff --git a/bitcoin_safe/gui/locales/app_pt_PT.ts b/bitcoin_safe/gui/locales/app_pt_PT.ts index 4d8ff04..6a68ed2 100644 --- a/bitcoin_safe/gui/locales/app_pt_PT.ts +++ b/bitcoin_safe/gui/locales/app_pt_PT.ts @@ -83,6 +83,10 @@ Copy as csv Copiar como csv + + Set category + Definir categoria + Tx Tx @@ -438,6 +442,17 @@ Please back up this descriptor to be able to recover the funds! Selecionar o dispositivo detetado + + DeviceManager + + Trusted + Confiável + + + Untrusted + Não confiado + + DisplayAddressDialog @@ -1413,6 +1428,14 @@ Location of signing device: ..... Mempool Instance URL URL da Instância do Mempool + + The proxy does not apply to the Sync&Chat feature! + O proxy não se aplica à função de Sincronização e Chat! + + + Proxy: + Proxy: + Apply && Shutdown Aplicar && Encerrar @@ -1721,10 +1744,26 @@ Deseja prosseguir mesmo assim? Choose a new name, or an existing name for merging: Escolha um novo nome, ou um nome existente para fusão: + + Syncing with {server} + Sincronizando com {server} + + + Connected to {server} + Conectado a {server} + + + Disconnected from {server} + Desconectado de {server} + Click for new address Clique para novo endereço + + Sync && Chat + Sincronizar && Conversar + Export labels Exportar etiquetas @@ -1737,10 +1776,6 @@ Deseja prosseguir mesmo assim? Import labels Importar etiquetas - - Sync && Chat - Sincronizar && Conversar - All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json) Todos os Ficheiros (*);;Ficheiros JSONL (*.jsonl);;Ficheiros JSON (*.json) @@ -2333,18 +2368,10 @@ You can restore your labels at a later time with 'Import Sync Key'. - TrustedDevice - - Connected to {id} - Conectado a {id} - - - Syncing Address labels - Sincronizando etiquetas de endereços - + TrustedDeviceItem - Can share Transactions - Pode partilhar Transações + Untrust device + Dispositivo não confiável @@ -2403,14 +2430,6 @@ You can restore your labels at a later time with 'Import Sync Key'.Set custom Relay list Definir lista personalizada de Relay - - Trusted - Confiável - - - UnTrusted - Não confiável - My Device: {id} Meu dispositivo: {id} @@ -2625,14 +2644,14 @@ below {rate} - UnTrustedDevice + UntrustedDeviceItem - Trust {id} - Confiar {id} + Trust + Confiar - Accept trust request from {other} - Aceitar pedido de confiança de {other} + Trust this device + Confiar neste dispositivo @@ -3212,6 +3231,10 @@ Please install it. This is a private and fast way to connect to the bitcoin network. Esta é uma maneira privada e rápida de se conectar à rede bitcoin. + + Run your bitcoind with "bitcoind -chain=test" + Execute seu bitcoind com "bitcoind -chain=test" + Run your bitcoind with "bitcoind -chain=signet" This however is a different signet than mutinynet.com. Execute seu bitcoind com "bitcoind -chain=signet" No entanto, este é um signet diferente de mutinynet.com. @@ -3222,20 +3245,24 @@ It is best to use your own server, such as {link}. O servidor pode associar seu endereço IP aos endereços da carteira. É melhor usar seu próprio servidor, como {link}. - You can setup {link} with an electrum server on {server} and a block explorer on {explorer} - Você pode configurar {link} com um servidor electrum em {server} e um explorador de blocos em {explorer} + You can setup {electrum} with an electrum server on {server} and a block explorer on {explorer} + Você pode configurar {electrum} com um servidor electrum em {server} e um explorador de blocos em {explorer} + + + A good option is {electrum_testnet4} and as block explorer {explorer_testnet4} + Uma boa opção é {electrum_testnet4} e como explorador de blocos {explorer_testnet4} - A good option is {link} and a block explorer on {explorer}. - Uma boa opção é {link} e um explorador de blocos em {explorer}. + Signet choose {electrum} and a block explorer on {mempool_url}. + Signet escolha {electrum} e um explorador de blocos em {mempool_url}. You can setup {setup} with an esplora server on {server} and a block explorer on {explorer} Você pode configurar {setup} com um servidor esplora em {server} e um explorador de blocos em {explorer} - A good option is {link} and a block explorer on {explorer}. There is a {faucet}. - Uma boa opção é {link} e um explorador de blocos em {explorer}. Há uma {faucet}. + A (somtimes working) server is {link} and a block explorer on {explorer}. There is a {faucet}. + Um servidor (às vezes funciona) é {link} e um explorador de blocos em {explorer}. Há um {faucet}. You can connect your own Bitcoin node, such as {link}. @@ -3245,9 +3272,16 @@ It is best to use your own server, such as {link}. Run your bitcoind with "bitcoind -chain=regtest" Execute seu bitcoind com "bitcoind -chain=regtest" + + + network_config - Run your bitcoind with "bitcoind -chain=test" - Execute seu bitcoind com "bitcoind -chain=test" + {server_name} via the proxy {proxy} + {server_name} através do proxy {proxy} + + + {server_name} + {server_name} diff --git a/bitcoin_safe/gui/locales/app_ru_RU.qm b/bitcoin_safe/gui/locales/app_ru_RU.qm index bbe4491..2a8bfc8 100644 Binary files a/bitcoin_safe/gui/locales/app_ru_RU.qm and b/bitcoin_safe/gui/locales/app_ru_RU.qm differ diff --git a/bitcoin_safe/gui/locales/app_ru_RU.ts b/bitcoin_safe/gui/locales/app_ru_RU.ts index a73e56d..4a13b0e 100644 --- a/bitcoin_safe/gui/locales/app_ru_RU.ts +++ b/bitcoin_safe/gui/locales/app_ru_RU.ts @@ -83,6 +83,10 @@ Copy as csv Копировать в CSV + + Set category + Установить категорию + Tx Транзакция @@ -438,6 +442,17 @@ Please back up this descriptor to be able to recover the funds! Выберите обнаруженное устройство + + DeviceManager + + Trusted + Доверенный + + + Untrusted + Недоверие + + DisplayAddressDialog @@ -1413,6 +1428,14 @@ Location of signing device: ..... Mempool Instance URL URL экземпляра Mempool + + The proxy does not apply to the Sync&Chat feature! + Прокси не применяется к функции Синхронизация и Чат! + + + Proxy: + Прокси: + Apply && Shutdown Применить && Завершить работу @@ -1721,10 +1744,26 @@ Location of signing device: ..... Choose a new name, or an existing name for merging: Выберите новое имя или существующее имя для объединения: + + Syncing with {server} + Синхронизация с {server} + + + Connected to {server} + Подключено к {server} + + + Disconnected from {server} + Отключено от {server} + Click for new address Нажмите для нового адреса + + Sync && Chat + Синхронизация && Чат + Export labels Экспортировать метки @@ -1737,10 +1776,6 @@ Location of signing device: ..... Import labels Импортировать метки - - Sync && Chat - Синхронизация && Чат - All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json) Все файлы (*);;Файлы JSONL (*.jsonl);;Файлы JSON (*.json) @@ -2333,18 +2368,10 @@ You can restore your labels at a later time with 'Import Sync Key'. - TrustedDevice - - Connected to {id} - Подключено к {id} - - - Syncing Address labels - Синхронизация меток адресов - + TrustedDeviceItem - Can share Transactions - Может делиться транзакциями + Untrust device + Недоверие устройству @@ -2403,14 +2430,6 @@ You can restore your labels at a later time with 'Import Sync Key'.Set custom Relay list Установить пользовательский список реле - - Trusted - Доверенный - - - UnTrusted - Не доверенный - My Device: {id} Мое устройство: {id} @@ -2625,14 +2644,14 @@ below {rate} - UnTrustedDevice + UntrustedDeviceItem - Trust {id} - Доверять {id} + Trust + Доверие - Accept trust request from {other} - Принять запрос доверия от {other} + Trust this device + Доверять этому устройству @@ -3212,6 +3231,10 @@ Please install it. This is a private and fast way to connect to the bitcoin network. Это приватный и быстрый способ подключения к биткойн-сети. + + Run your bitcoind with "bitcoind -chain=test" + Запустите ваш bitcoind с "bitcoind -chain=test" + Run your bitcoind with "bitcoind -chain=signet" This however is a different signet than mutinynet.com. Запустите ваш bitcoind с "bitcoind -chain=signet" Это, однако, другой signet, чем mutinynet.com. @@ -3222,20 +3245,24 @@ It is best to use your own server, such as {link}. Сервер может ассоциировать ваш IP-адрес с адресами кошелька. Лучше всего использовать свой собственный сервер, например {link}. - You can setup {link} with an electrum server on {server} and a block explorer on {explorer} - Вы можете настроить {link} с электрум-сервером на {server} и блок-эксплорером на {explorer} + You can setup {electrum} with an electrum server on {server} and a block explorer on {explorer} + Вы можете настроить {electrum} с сервером электрума на {server} и блок-эксплорером на {explorer} + + + A good option is {electrum_testnet4} and as block explorer {explorer_testnet4} + Хорошим вариантом будет {electrum_testnet4} и как блок-эксплорер {explorer_testnet4} - A good option is {link} and a block explorer on {explorer}. - Хороший вариант - {link} и блок-эксплорер на {explorer}. + Signet choose {electrum} and a block explorer on {mempool_url}. + Signet выберите {electrum} и блок-эксплорер на {mempool_url}. You can setup {setup} with an esplora server on {server} and a block explorer on {explorer} Вы можете настроить {setup} с сервером esplora на {server} и блок-эксплорером на {explorer} - A good option is {link} and a block explorer on {explorer}. There is a {faucet}. - Хороший вариант - {link} и блок-эксплорер на {explorer}. Есть {faucet}. + A (somtimes working) server is {link} and a block explorer on {explorer}. There is a {faucet}. + Работающий (иногда) сервер - {link} и блок-эксплорер на {explorer}. Есть {faucet}. You can connect your own Bitcoin node, such as {link}. @@ -3245,9 +3272,16 @@ It is best to use your own server, such as {link}. Run your bitcoind with "bitcoind -chain=regtest" Запустите ваш bitcoind с "bitcoind -chain=regtest" + + + network_config - Run your bitcoind with "bitcoind -chain=test" - Запустите ваш bitcoind с "bitcoind -chain=test" + {server_name} via the proxy {proxy} + {server_name} через прокси {proxy} + + + {server_name} + {server_name} diff --git a/bitcoin_safe/gui/locales/app_zh_CN.qm b/bitcoin_safe/gui/locales/app_zh_CN.qm index c17439d..5a5e3ab 100644 Binary files a/bitcoin_safe/gui/locales/app_zh_CN.qm and b/bitcoin_safe/gui/locales/app_zh_CN.qm differ diff --git a/bitcoin_safe/gui/locales/app_zh_CN.ts b/bitcoin_safe/gui/locales/app_zh_CN.ts index df2a49f..df93f83 100644 --- a/bitcoin_safe/gui/locales/app_zh_CN.ts +++ b/bitcoin_safe/gui/locales/app_zh_CN.ts @@ -83,6 +83,10 @@ Copy as csv 复制为csv + + Set category + 设置类别 + Tx 交易 @@ -438,6 +442,17 @@ Please back up this descriptor to be able to recover the funds! 选择检测到的设备 + + DeviceManager + + Trusted + 信任 + + + Untrusted + 不受信任 + + DisplayAddressDialog @@ -1414,6 +1429,14 @@ Location of signing device: ..... Mempool Instance URL Mempool实例URL + + The proxy does not apply to the Sync&Chat feature! + 代理不适用于同步和聊天功能! + + + Proxy: + 代理: + Apply && Shutdown 应用&&关闭 @@ -1724,10 +1747,26 @@ Location of signing device: ..... Choose a new name, or an existing name for merging: 选择一个新名称,或一个已有名称以进行合并: + + Syncing with {server} + 与 {server} 同步 + + + Connected to {server} + 已连接到 {server} + + + Disconnected from {server} + 已从 {server} 断开 + Click for new address 点击获取新地址 + + Sync && Chat + 同步 && 聊天 + Export labels 导出标签 @@ -1740,10 +1779,6 @@ Location of signing device: ..... Import labels 导入标签 - - Sync && Chat - 同步 && 聊天 - All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json) 所有文件 (*);;JSONL 文件 (*.jsonl);;JSON 文件 (*.json) @@ -2336,18 +2371,10 @@ You can restore your labels at a later time with 'Import Sync Key'. - TrustedDevice - - Connected to {id} - 已连接至{id} - + TrustedDeviceItem - Syncing Address labels - 同步地址标签 - - - Can share Transactions - 可以分享交易 + Untrust device + 不信任设备 @@ -2406,14 +2433,6 @@ You can restore your labels at a later time with 'Import Sync Key'.Set custom Relay list 设置自定义中继列表 - - Trusted - 信任 - - - UnTrusted - 未受信任 - My Device: {id} 我的设备:{id} @@ -2631,14 +2650,14 @@ below {rate} - UnTrustedDevice + UntrustedDeviceItem - Trust {id} - 信任{id} + Trust + 信任 - Accept trust request from {other} - 接受{other}的信任请求 + Trust this device + 信任此设备 @@ -3219,6 +3238,10 @@ Please install it. This is a private and fast way to connect to the bitcoin network. 这是一种私密且快速的连接到比特币网络的方式。 + + Run your bitcoind with "bitcoind -chain=test" + 使用 "bitcoind -chain=test" 运行您的bitcoind + Run your bitcoind with "bitcoind -chain=signet" This however is a different signet than mutinynet.com. 使用 "bitcoind -chain=signet" 运行您的bitcoind,但这和mutinynet.com的signet不同。 @@ -3229,20 +3252,24 @@ It is best to use your own server, such as {link}. 服务器可以将您的IP地址与钱包地址关联。最好使用您自己的服务器,如 {link}。 - You can setup {link} with an electrum server on {server} and a block explorer on {explorer} - 您可以在 {server} 上设置 {link},并在 {explorer} 上设置一个区块浏览器 + You can setup {electrum} with an electrum server on {server} and a block explorer on {explorer} + 你可以在 {server} 上设置 {electrum} 与一个区块浏览器在 {explorer} + + + A good option is {electrum_testnet4} and as block explorer {explorer_testnet4} + 一个好的选择是 {electrum_testnet4} 和作为区块浏览器的 {explorer_testnet4} - A good option is {link} and a block explorer on {explorer}. - 一个好选择是 {link} 和一个在 {explorer} 上的区块浏览器。 + Signet choose {electrum} and a block explorer on {mempool_url}. + Signet 选择 {electrum} 和一个区块浏览器在 {mempool_url}。 You can setup {setup} with an esplora server on {server} and a block explorer on {explorer} 您可以在 {server} 上设置 {setup},并在 {explorer} 上设置一个esplora服务器 - A good option is {link} and a block explorer on {explorer}. There is a {faucet}. - 一个好选择是 {link} 和一个在 {explorer} 上的区块浏览器。这里有一个 {faucet}。 + A (somtimes working) server is {link} and a block explorer on {explorer}. There is a {faucet}. + 一个(有时有效的)服务器是 {link} 和一个区块浏览器在 {explorer}。这里有一个 {faucet}。 You can connect your own Bitcoin node, such as {link}. @@ -3252,9 +3279,16 @@ It is best to use your own server, such as {link}. Run your bitcoind with "bitcoind -chain=regtest" 使用 "bitcoind -chain=regtest" 运行您的bitcoind + + + network_config - Run your bitcoind with "bitcoind -chain=test" - 使用 "bitcoind -chain=test" 运行您的bitcoind + {server_name} via the proxy {proxy} + 通过代理 {proxy} 的 {server_name} + + + {server_name} + {server_name} diff --git a/bitcoin_safe/gui/qt/address_list.py b/bitcoin_safe/gui/qt/address_list.py index 7d56183..80c27f4 100644 --- a/bitcoin_safe/gui/qt/address_list.py +++ b/bitcoin_safe/gui/qt/address_list.py @@ -102,7 +102,15 @@ needs_frequent_flag, ) from .taglist import AddressDragInfo -from .util import ColorScheme, Message, do_copy, read_QIcon, sort_id_to_icon, webopen +from .util import ( + ColorScheme, + Message, + create_color_square, + do_copy, + read_QIcon, + sort_id_to_icon, + webopen, +) class ImportLabelMenu: @@ -605,6 +613,8 @@ def create_menu(self, position: QPoint) -> Menu: ) menu.addSeparator() + self._add_category_menu(menu, idx) + menu.addSeparator() self.add_copy_menu(menu, idx, include_columns_even_if_hidden=[self.key_column]) @@ -623,6 +633,34 @@ def create_menu(self, position: QPoint) -> Menu: return menu + def _add_category_menu(self, menu: Menu, idx: QModelIndex): + copy_menu = menu.add_menu(self.tr("Set category")) + + def factory(category, address): + def f(category=category, address=address): + drag_info = AddressDragInfo([category], [address]) + logger.debug(f"_add_category_menu set {drag_info}") + self.signal_tag_dropped.emit(drag_info) + + return f + + for category in self.wallet.labels.categories: + item = self.sourceModel().horizontalHeaderItem(self.Columns.ADDRESS) + if not item: + continue + item_col = self.item_from_index(idx.sibling(idx.row(), self.Columns.ADDRESS)) + if not item_col: + continue + address = item_col.data(MyItemDataRole.ROLE_CLIPBOARD_DATA) + if address is None: + address = item_col.text().strip() + + copy_menu.add_action( + category, + factory(category=category, address=address), + icon=create_color_square(CategoryEditor.color(category)), + ) + # def place_text_on_clipboard(self, text: str, *, title: str = None) -> None: # if bdk.Address(text): # try: diff --git a/bitcoin_safe/gui/qt/downloader.py b/bitcoin_safe/gui/qt/downloader.py index 798f096..8a7a5b3 100644 --- a/bitcoin_safe/gui/qt/downloader.py +++ b/bitcoin_safe/gui/qt/downloader.py @@ -30,6 +30,7 @@ import logging import sys from pathlib import Path +from typing import Dict import requests from PyQt6.QtCore import QThread, pyqtSignal @@ -55,15 +56,16 @@ class DownloadThread(QThread): finished: TypedPyQtSignalNo = pyqtSignal() # type: ignore aborted: TypedPyQtSignalNo = pyqtSignal() # type: ignore - def __init__(self, url, destination_dir) -> None: + def __init__(self, url, destination_dir, proxies: Dict | None) -> None: super().__init__() self.url = url self.destination_dir = Path(destination_dir) + self.proxies = proxies self.filename: Path = self.destination_dir / Path(url).name def run(self) -> None: try: - response = requests.get(self.url, stream=True, timeout=10) + response = requests.get(self.url, stream=True, timeout=10, proxies=self.proxies) content_length = response.headers.get("content-length") if content_length is None: # no content length header @@ -85,11 +87,12 @@ def run(self) -> None: class Downloader(QWidget): finished: TypedPyQtSignal[DownloadThread] = pyqtSignal(DownloadThread) # type: ignore - def __init__(self, url, destination_dir) -> None: + def __init__(self, url, destination_dir, proxies: Dict | None) -> None: super().__init__() self.url = url self.destination_dir = Path(destination_dir) self.filename = Path(url).name # Extract filename from URL + self.proxies = proxies self.initUI() def initUI(self) -> None: @@ -121,7 +124,7 @@ def initUI(self) -> None: def startDownload(self) -> None: self.startButton.hide() self.progress.show() - self.mythread = DownloadThread(self.url, str(self.destination_dir)) + self.mythread = DownloadThread(self.url, str(self.destination_dir), proxies=self.proxies) self.mythread.progress.connect(self.progress.setValue) self.mythread.finished.connect(self.downloadFinished) self.mythread.aborted.connect(self.download_aborted) @@ -147,7 +150,9 @@ def showFile(self) -> None: app = QApplication(sys.argv) # Example usage downloader = Downloader( - "https://github.com/sparrowwallet/sparrow/releases/download/1.8.4/sparrow_1.8.4-1_amd64.deb", "/tmp" + "https://github.com/sparrowwallet/sparrow/releases/download/1.8.4/sparrow_1.8.4-1_amd64.deb", + "/tmp", + proxies=None, ) downloader.show() sys.exit(app.exec()) diff --git a/bitcoin_safe/gui/qt/main.py b/bitcoin_safe/gui/qt/main.py index de99dc6..082c078 100644 --- a/bitcoin_safe/gui/qt/main.py +++ b/bitcoin_safe/gui/qt/main.py @@ -47,6 +47,7 @@ from bitcoin_safe.gui.qt.wrappers import Menu, MenuBar from bitcoin_safe.keystore import KeyStoreImporterTypes from bitcoin_safe.logging_setup import get_log_file +from bitcoin_safe.network_config import ProxyInfo from bitcoin_safe.pdf_statement import make_and_open_pdf_statement from bitcoin_safe.pdfrecovery import make_and_open_pdf from bitcoin_safe.threading_manager import ThreadingManager @@ -134,7 +135,14 @@ def __init__( self.qt_wallets: Dict[str, QTWallet] = {} self.threading_manager = ThreadingManager(threading_manager_name=self.__class__.__name__) - self.fx = FX(threading_parent=self.threading_manager) + self.fx = FX( + threading_parent=self.threading_manager, + proxies=( + ProxyInfo.parse(self.config.network_config.proxy_url).get_requests_proxy_dist() + if self.config.network_config.proxy_url + else None + ), + ) self.language_chooser = LanguageChooser(self, self.config, [self.signals.language_switch]) if not config_present: self.config.language_code = self.language_chooser.dialog_choose_language(self) @@ -148,7 +156,13 @@ def __init__( signals_min=self.signals, threading_parent=self.threading_manager, ) - self.mempool_data.set_data_from_mempoolspace() + self.mempool_data.set_data_from_mempoolspace( + proxies=( + ProxyInfo.parse(self.config.network_config.proxy_url).get_requests_proxy_dist() + if self.config.network_config.proxy_url + else None + ) + ) self.last_qtwallet: Optional[QTWallet] = None # connect the listeners @@ -287,7 +301,13 @@ def setupUi(self) -> None: vbox.addWidget(self.notification_bar_testnet) self.update_notification_bar = UpdateNotificationBar( - signals_min=self.signals, threading_parent=self.threading_manager + signals_min=self.signals, + threading_parent=self.threading_manager, + proxies=( + ProxyInfo.parse(self.config.network_config.proxy_url).get_requests_proxy_dist() + if self.config.network_config.proxy_url + else None + ), ) self.update_notification_bar.check() # TODO: disable this, after it got more stable vbox.addWidget(self.update_notification_bar) @@ -1311,10 +1331,11 @@ def create_qtwallet_from_ui(): return qtprotowallet - def set_tab_widget_icon(self, tab: QWidget, icon: QIcon) -> None: + def set_tab_widget_icon(self, tab: QWidget, icon: QIcon, tooltip: str | None) -> None: idx = self.tab_wallets.indexOf(tab) if idx != -1: self.tab_wallets.setTabIcon(idx, icon) + self.tab_wallets.setTabToolTip(idx, tooltip if tooltip else "") def add_qt_wallet( self, qt_wallet: QTWallet, file_path: str | None = None, password: str | None = None diff --git a/bitcoin_safe/gui/qt/network_settings/__main__.py b/bitcoin_safe/gui/qt/network_settings/__main__.py index b7b9075..065d773 100644 --- a/bitcoin_safe/gui/qt/network_settings/__main__.py +++ b/bitcoin_safe/gui/qt/network_settings/__main__.py @@ -4,10 +4,9 @@ import numpy as np from PyQt6.QtWidgets import QApplication +from bitcoin_safe.gui.qt.network_settings.main import NetworkSettingsUI from bitcoin_safe.network_config import NetworkConfigs -from .main import NetworkSettingsUI - logging.basicConfig(level=logging.DEBUG) if __name__ == "__main__": diff --git a/bitcoin_safe/gui/qt/network_settings/main.py b/bitcoin_safe/gui/qt/network_settings/main.py index fbfb1bc..fe4d5f0 100644 --- a/bitcoin_safe/gui/qt/network_settings/main.py +++ b/bitcoin_safe/gui/qt/network_settings/main.py @@ -27,17 +27,39 @@ # SOFTWARE. +import json import logging -from typing import Optional, Tuple +import socket +import ssl +from typing import Dict, Optional, Tuple import bdkpython as bdk import numpy as np import requests +import socks # Import the socks module from PySocks +from PyQt6.QtCore import Qt, pyqtSignal +from PyQt6.QtGui import QColor, QKeyEvent +from PyQt6.QtWidgets import ( + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QFormLayout, + QGroupBox, + QHBoxLayout, + QLabel, + QPushButton, + QStackedWidget, + QVBoxLayout, + QWidget, +) from bitcoin_safe.gui.qt.custom_edits import QCompleterLineEdit from bitcoin_safe.gui.qt.dialogs import question_dialog +from bitcoin_safe.gui.qt.notification_bar import NotificationBar from bitcoin_safe.gui.qt.util import ( Message, + adjust_bg_color_for_darkmode, ensure_scheme, get_host_and_port, read_QIcon, @@ -47,6 +69,7 @@ from bitcoin_safe.network_config import ( NetworkConfig, NetworkConfigs, + ProxyInfo, get_default_port, get_description, get_electrum_configs, @@ -61,39 +84,24 @@ logger = logging.getLogger(__name__) -import json -import socket -import ssl - -from PyQt6.QtCore import Qt, pyqtSignal -from PyQt6.QtGui import QKeyEvent -from PyQt6.QtWidgets import ( - QCheckBox, - QComboBox, - QDialog, - QDialogButtonBox, - QFormLayout, - QGroupBox, - QHBoxLayout, - QLabel, - QPushButton, - QStackedWidget, - QVBoxLayout, - QWidget, -) - -def test_mempool_space_server(url: str) -> bool: +def test_mempool_space_server(url: str, proxies: Dict | None) -> bool: try: - response = requests.get(f"{url}/api/blocks/tip/height", timeout=2) + response = requests.get(f"{url}/api/blocks/tip/height", timeout=2, proxies=proxies) return response.status_code == 200 except Exception as e: logger.warning(f"Mempool.space server connection test failed: {e}") return False -def get_electrum_server_version(host: str, port: int, use_ssl: bool = True, timeout=2) -> Optional[str]: +def get_electrum_server_version( + host: str, port: int, use_ssl: bool = True, timeout: int = 2, proxy_info: Optional[ProxyInfo] = None +) -> Optional[str]: try: + if proxy_info: + socks.set_default_proxy(proxy_info.get_socks_scheme(), proxy_info.host, proxy_info.port) + socket.socket = socks.socksocket # type: ignore + # Connect to the server with socket.create_connection((host, port), timeout=timeout) as sock: # Wrap the socket with SSL if required @@ -117,12 +125,12 @@ def get_electrum_server_version(host: str, port: int, use_ssl: bool = True, time if use_ssl: ssock.close() - # Check and print the server version + # Check and return the server version if "result" in response_json: logger.debug(f"Server version: {response_json['result']}") return response_json["result"] else: - logger.debug(f"Failed to retrieve server version of {host , port , use_ssl}.") + logger.debug(f"Failed to retrieve server version of {host, port, use_ssl}.") return None except Exception as e: logger.debug(f"Connection or communication error: {e}") @@ -133,11 +141,15 @@ def test_connection(network_config: NetworkConfig) -> Optional[str]: if network_config.server_type == BlockchainType.Electrum: try: host, port = get_host_and_port(network_config.electrum_url) - if host is None or port is None: logger.warning(f"No host or port given") return None - return get_electrum_server_version(host=host, port=port, use_ssl=network_config.electrum_use_ssl) + return get_electrum_server_version( + host=host, + port=port, + use_ssl=network_config.electrum_use_ssl, + proxy_info=ProxyInfo.parse(network_config.proxy_url) if network_config.proxy_url else None, + ) except Exception as e: logger.warning(f"Electrum connection test failed: {e}") return None @@ -145,7 +157,15 @@ def test_connection(network_config: NetworkConfig) -> Optional[str]: elif network_config.server_type == BlockchainType.Esplora: try: # Assuming Esplora's REST API for testing connection - response = requests.get(f"{network_config.esplora_url}/blocks/tip/height", timeout=2) + response = requests.get( + f"{network_config.esplora_url}/blocks/tip/height", + timeout=2, + proxies=( + ProxyInfo.parse(network_config.proxy_url).get_requests_proxy_dist() + if network_config.proxy_url + else None + ), + ) if response.status_code == 200: return response.json() else: @@ -348,6 +368,7 @@ def __init__( self.stackedWidget.addWidget(self.rpcTab) + # mempool self.groupbox_blockexplorer = QGroupBox() self.groupbox_blockexplorer_layout = QHBoxLayout(self.groupbox_blockexplorer) button_mempool = QPushButton(self) @@ -361,6 +382,24 @@ def __init__( self.groupbox_blockexplorer_layout.addWidget(self.edit_mempool_url) self._layout.addWidget(self.groupbox_blockexplorer) + # proxy + self.groupbox_proxy = QGroupBox() + self.groupbox_proxy_layout = QHBoxLayout(self.groupbox_proxy) + + self.proxy_url_edit = QCompleterLineEdit( + network=network, + suggestions={network: ["127.0.0.1:9050"] for network in bdk.Network}, + ) + self.proxy_url_edit.textChanged.connect(self.on_proxy_url_changed) + self.proxy_url_edit_label = QLabel() + self.groupbox_proxy_layout.addWidget(self.proxy_url_edit_label) + self.groupbox_proxy_layout.addWidget(self.proxy_url_edit) + self._layout.addWidget(self.groupbox_proxy) + self.proxy_warning_label = NotificationBar("") + self.proxy_warning_label.set_background_color(adjust_bg_color_for_darkmode(QColor("#FFDF00"))) + self.proxy_warning_label.set_icon(read_QIcon("warning.png")) + self._layout.addWidget(self.proxy_warning_label) + # Create buttons and layout self.button_box = QDialogButtonBox( QDialogButtonBox.StandardButton.Help @@ -404,6 +443,10 @@ def updateUi(self): self.rpc_username_edit_label.setText(self.tr("Username:")) self.rpc_password_edit_label.setText(self.tr("Password:")) self.groupbox_blockexplorer.setTitle(self.tr("Mempool Instance URL")) + self.proxy_warning_label.textLabel.setText( + self.tr("The proxy does not apply to the Sync&Chat feature!") + ) + self.proxy_url_edit_label.setText(self.tr("Proxy:")) if ok_button := self.button_box.button(QDialogButtonBox.StandardButton.Ok): ok_button.setText(self.tr("Apply && Shutdown")) @@ -420,10 +463,21 @@ def get_use_ssl(url: str): logger.debug(f"set use_ssl = {use_ssl}") self.electrum_use_ssl = use_ssl + def on_proxy_url_changed(self): + is_proxy = bool(self.proxy_url_edit.text().strip()) + self.proxy_warning_label.setHidden(not is_proxy) + def _test_connection(self, network_config: NetworkConfig) -> Tuple[str | None, bool]: server_connection = test_connection(network_config=network_config) - mempool_server = test_mempool_space_server(url=network_config.mempool_url) + mempool_server = test_mempool_space_server( + url=network_config.mempool_url, + proxies=( + ProxyInfo.parse(network_config.proxy_url).get_requests_proxy_dist() + if network_config.proxy_url + else None + ), + ) return server_connection, mempool_server def _format_test_responses( @@ -470,6 +524,7 @@ def _edits_set_network(self, network: bdk.Network): self.rpc_username_edit.set_network(network) self.rpc_password_edit.set_network(network) self.edit_mempool_url.set_network(network) + self.proxy_url_edit.set_network(network) def add_to_completer_memory(self): self.compactblockfilters_ip_address_edit.add_current_to_memory() @@ -479,6 +534,7 @@ def add_to_completer_memory(self): self.rpc_username_edit.add_current_to_memory() self.rpc_password_edit.add_current_to_memory() self.edit_mempool_url.add_current_to_memory() + self.proxy_url_edit.add_current_to_memory() def on_apply_click(self): new_network_config = self.get_network_settings_from_ui() @@ -565,18 +621,6 @@ def enableIPPortLineEdit(self, index: int): self.compactblockfilters_port_edit.setEnabled(False) # Properties for all user entries - - @property - def mempool_url(self) -> str: - url = self.edit_mempool_url.text() - url = url if url.endswith("/") else f"{url}/" - url = url.replace("api/", "") if url.endswith("api/") else url - return ensure_scheme(url) - - @mempool_url.setter - def mempool_url(self, value: str): - self.edit_mempool_url.setText(value) - @property def network(self) -> bdk.Network: return self.network_combobox.currentData() @@ -685,3 +729,24 @@ def rpc_password(self) -> str: @rpc_password.setter def rpc_password(self, password: str): self.rpc_password_edit.setText(password if password else "") + + @property + def mempool_url(self) -> str: + url = self.edit_mempool_url.text() + url = url if url.endswith("/") else f"{url}/" + url = url.replace("api/", "") if url.endswith("api/") else url + return ensure_scheme(url) + + @mempool_url.setter + def mempool_url(self, value: str): + self.edit_mempool_url.setText(value) + + @property + def proxy_url(self) -> str | None: + text = self.proxy_url_edit.text() + return text if text else None + + @proxy_url.setter + def proxy_url(self, url: str | None): + self.proxy_url_edit.setText(url if url else "") + self.on_proxy_url_changed() diff --git a/bitcoin_safe/gui/qt/qt_wallet.py b/bitcoin_safe/gui/qt/qt_wallet.py index bcfef87..6ee3e77 100644 --- a/bitcoin_safe/gui/qt/qt_wallet.py +++ b/bitcoin_safe/gui/qt/qt_wallet.py @@ -205,7 +205,7 @@ def __init__( fx: FX, get_lang_code: Callable[[], str], sync_tab: SyncTab | None = None, - set_tab_widget_icon: Optional[Callable[[QWidget, QIcon], None]] = None, + set_tab_widget_icon: Optional[Callable[[QWidget, QIcon, str | None], None]] = None, password: str | None = None, file_path: str | None = None, threading_parent: ThreadingManager | None = None, @@ -320,7 +320,7 @@ def from_file( mempool_data: MempoolData, fx: FX, get_lang_code: Callable[[], str], - set_tab_widget_icon: Optional[Callable[[QWidget, QIcon], None]] = None, + set_tab_widget_icon: Optional[Callable[[QWidget, QIcon, str | None], None]] = None, password: str | None = None, threading_parent: ThreadingManager | None = None, ) -> "QTWallet": @@ -976,18 +976,34 @@ def update_status_visualization(self, sync_status: SyncStatus) -> None: return icon = None + tooltip = None if sync_status == SyncStatus.syncing: icon = read_QIcon("status_waiting.svg") self.history_tab_with_toolbar.sync_button.set_icon_is_syncing() + tooltip = self.tr("Syncing with {server}").format( + server=self.config.network_config.description_short() + ) elif self.wallet.get_height() and sync_status in [SyncStatus.synced]: - icon = read_QIcon("status_connected.svg") + using_proxy = self.config.network_config.proxy_url + icon = ( + read_QIcon("status_connected_proxy.svg") + if using_proxy + else read_QIcon("status_connected.svg") + ) + tooltip = self.config.network_config.description_short() + tooltip = self.tr("Connected to {server}").format( + server=self.config.network_config.description_short() + ) self.history_tab_with_toolbar.sync_button.set_icon_allow_refresh() else: icon = read_QIcon("status_disconnected.svg") + tooltip = self.tr("Disconnected from {server}").format( + server=self.config.network_config.description_short() + ) self.history_tab_with_toolbar.sync_button.set_icon_allow_refresh() if self.set_tab_widget_icon: - self.set_tab_widget_icon(self.tab, icon) + self.set_tab_widget_icon(self.tab, icon, tooltip) def create_list_tab( self, diff --git a/bitcoin_safe/gui/qt/ui_tx.py b/bitcoin_safe/gui/qt/ui_tx.py index 22ffe6f..bea1780 100644 --- a/bitcoin_safe/gui/qt/ui_tx.py +++ b/bitcoin_safe/gui/qt/ui_tx.py @@ -64,7 +64,7 @@ import bdkpython as bdk from PyQt6.QtCore import Qt, pyqtSignal -from PyQt6.QtGui import QColor, QFont, QIcon +from PyQt6.QtGui import QColor, QFont from PyQt6.QtWidgets import ( QCheckBox, QDialogButtonBox, @@ -124,7 +124,6 @@ add_to_buttonbox, caught_exception_message, clear_layout, - icon_path, read_QIcon, ) from .utxo_list import UTXOList, UtxoListWithToolbar @@ -140,7 +139,7 @@ def __init__(self, signals_min: SignalsMin) -> None: self.category_dict: Dict[str, Set[str]] = {} self.signals_min = signals_min self.set_background_color(adjust_bg_color_for_darkmode(QColor("#FFDF00"))) - self.set_icon(QIcon(icon_path("warning.png"))) + self.set_icon(read_QIcon("warning.png")) self.optionalButton.setVisible(False) self.textLabel.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) diff --git a/bitcoin_safe/gui/qt/update_notification_bar.py b/bitcoin_safe/gui/qt/update_notification_bar.py index ceae129..5bcb143 100644 --- a/bitcoin_safe/gui/qt/update_notification_bar.py +++ b/bitcoin_safe/gui/qt/update_notification_bar.py @@ -33,7 +33,7 @@ import shutil import tempfile from pathlib import Path -from typing import Any, List, Optional +from typing import Any, Dict, List, Optional from packaging import version from PyQt6.QtCore import pyqtSignal @@ -63,8 +63,13 @@ class UpdateNotificationBar(NotificationBar, ThreadingManager): key = KnownGPGKeys.andreasgriffin def __init__( - self, signals_min: SignalsMin, parent=None, threading_parent: ThreadingManager | None = None + self, + signals_min: SignalsMin, + proxies: Dict | None, + parent=None, + threading_parent: ThreadingManager | None = None, ) -> None: + self.proxies = proxies self.download_container = QWidget() self.download_container_layout = QHBoxLayout(self.download_container) current_margins = self.download_container_layout.contentsMargins() @@ -86,7 +91,7 @@ def __init__( refresh_icon = (self.style() or QStyle()).standardIcon(QStyle.StandardPixmap.SP_BrowserReload) self.optionalButton.setIcon(refresh_icon) - self.verifyer = SignatureVerifyer(list_of_known_keys=[self.key]) + self.verifyer = SignatureVerifyer(list_of_known_keys=[self.key], proxies=self.proxies) self.assets: List[Asset] = [] self.setVisible(False) @@ -126,7 +131,9 @@ def refresh(self) -> None: self.setVisible(True) for asset in self.assets: - downloader = Downloader(url=asset.url, destination_dir=tempfile.gettempdir()) + downloader = Downloader( + url=asset.url, destination_dir=tempfile.gettempdir(), proxies=self.proxies + ) downloader.finished.connect(self.on_download_finished) self.download_container_layout.addWidget(downloader) else: @@ -206,7 +213,7 @@ def get_filtered_assets(self, assets: List[Asset]) -> List[Asset]: def check(self) -> None: def do() -> Any: - return GitHubAssetDownloader(self.key.repository).get_assets_latest() + return GitHubAssetDownloader(self.key.repository, proxies=self.proxies).get_assets_latest() def on_done(result) -> None: pass diff --git a/bitcoin_safe/gui/qt/util.py b/bitcoin_safe/gui/qt/util.py index 3e71adb..52d29ff 100644 --- a/bitcoin_safe/gui/qt/util.py +++ b/bitcoin_safe/gui/qt/util.py @@ -882,3 +882,17 @@ def hash_color(text: str) -> QColor: def category_color(text: str) -> QColor: return adjust_bg_color_for_darkmode(hash_color(text)) + + +def create_color_square(color: QColor, length=24) -> QIcon: + # Define the size of the square icon + size = QSize(length, length) + + # Create a QPixmap of defined size + pixmap = QPixmap(size) + + # Fill the QPixmap with the provided color + pixmap.fill(color) + + # Create and return a QIcon from the QPixmap + return QIcon(pixmap) diff --git a/bitcoin_safe/mempool.py b/bitcoin_safe/mempool.py index 4c01fd4..ab4cc25 100644 --- a/bitcoin_safe/mempool.py +++ b/bitcoin_safe/mempool.py @@ -182,11 +182,11 @@ def fee_to_color(fee, colors=chartColors) -> str: return colors[indizes[-1]] -def fetch_from_url(url: str, is_json=True) -> Optional[Any]: +def fetch_from_url(url: str, proxies: Dict | None, is_json=True) -> Optional[Any]: logger.debug(f"fetch_json_from_url requests.get({url}, timeout=10)") try: - response = requests.get(url, timeout=10) + response = requests.get(url, timeout=10, proxies=proxies) # Check if the request was successful (status code 200) if response.status_code == 200: # Parse the JSON response @@ -201,9 +201,9 @@ def fetch_from_url(url: str, is_json=True) -> Optional[Any]: return None -def threaded_fetch(url: str, on_success, is_json=True) -> TaskThread: +def threaded_fetch(url: str, on_success, proxies: Dict | None, is_json=True) -> TaskThread: def do() -> Any: - return fetch_from_url(url, is_json=is_json) + return fetch_from_url(url, is_json=is_json, proxies=proxies) def on_error(packed_error_info) -> None: custom_exception_handler(*packed_error_info) @@ -296,7 +296,7 @@ def max_reasonable_fee_rate(self) -> float: return average_fee_rate * (1 + slack) - def set_data_from_mempoolspace(self, force=False) -> None: + def set_data_from_mempoolspace(self, proxies: Dict | None, force=False) -> None: if not force and datetime.datetime.now() - self.time_of_data < datetime.timedelta(minutes=9): logger.debug( f"Do not fetch data from {self.network_config.mempool_url} because data is only {datetime.datetime.now()- self.time_of_data } old." @@ -314,6 +314,7 @@ def on_mempool_blocks(mempool_blocks) -> None: threaded_fetch( f"{self.network_config.mempool_url}api/v1/fees/mempool-blocks", on_mempool_blocks, + proxies=proxies, ) ) logger.debug(f"started on_mempool_blocks") @@ -325,8 +326,7 @@ def on_recommended(recommended) -> None: self.append_thread( threaded_fetch( - f"{self.network_config.mempool_url}api/v1/fees/recommended", - on_recommended, + f"{self.network_config.mempool_url}api/v1/fees/recommended", on_recommended, proxies=proxies ) ) logger.debug(f"started on_recommended") @@ -338,15 +338,12 @@ def on_mempool_dict(mempool_dict) -> None: self.signal_data_updated.emit() self.append_thread( - threaded_fetch( - f"{self.network_config.mempool_url}api/mempool", - on_mempool_dict, - ) + threaded_fetch(f"{self.network_config.mempool_url}api/mempool", on_mempool_dict, proxies=proxies) ) logger.debug(f"started on_mempool_dict") - def fetch_block_tip_height(self) -> int: - response = fetch_from_url(f"{self.network_config.mempool_url}api/blocks/tip/height") + def fetch_block_tip_height(self, proxies: Dict | None) -> int: + response = fetch_from_url(f"{self.network_config.mempool_url}api/blocks/tip/height", proxies=proxies) return response if response else 0 def fee_rate_to_projected_block_index(self, fee_rate: float) -> int: diff --git a/bitcoin_safe/network_config.py b/bitcoin_safe/network_config.py index f32401a..a476dd8 100644 --- a/bitcoin_safe/network_config.py +++ b/bitcoin_safe/network_config.py @@ -29,14 +29,16 @@ import logging from dataclasses import dataclass +from urllib.parse import urlparse from packaging import version logger = logging.getLogger(__name__) -from typing import Any, Dict +from typing import Any, Dict, Literal import bdkpython as bdk +import socks from bitcoin_safe.pythonbdk_types import BlockchainType, CBFServerType from bitcoin_safe.storage import BaseSaveableClass, filtered_for_init @@ -48,6 +50,38 @@ FEE_RATIO_HIGH_WARNING = 0.05 # warn user if fee/amount for on-chain tx is higher than this +@dataclass +class ProxyInfo: + host: str | None + port: int | None + scheme: str = "socks5" + + def get_socks_scheme(self) -> Literal[1] | Literal[2]: + if self.scheme == "socks4": + return socks.SOCKS4 + return socks.SOCKS5 + + def get_url(self): + return f"{self.scheme}://{self.host}:{self.port}" + + def get_requests_proxy_dist(self): + return {"http": self.get_url(), "https": self.get_url()} + + @classmethod + def parse(cls, proxy_url: str): + # Prepend "socks5h://" if the proxy string does not contain a scheme + if "://" not in proxy_url: + proxy_url = f"{cls.scheme}://{proxy_url}" # Default to SOCKS5 with remote DNS + parsed_proxy = urlparse(proxy_url) + return cls(host=parsed_proxy.hostname, port=parsed_proxy.port, scheme=parsed_proxy.scheme) + + +def clean_electrum_url(url: str, electrum_use_ssl: bool) -> str: + if electrum_use_ssl and not url.startswith("ssl://"): + url = "ssl://" + url + return url + + def get_mempool_url(network: bdk.Network) -> Dict[str, str]: d = { bdk.Network.BITCOIN: { @@ -300,6 +334,25 @@ def __init__(self, network: bdk.Network) -> None: self.esplora_url: str = get_esplora_urls(network)["default"] self.mempool_url: str = get_mempool_url(network)["default"] + self.proxy_url: str | None = None + + def description_short(self): + server_name = "" + if self.server_type == BlockchainType.Electrum: + server_name = f"{self.electrum_url}" + elif self.server_type == BlockchainType.Esplora: + server_name = f"{self.esplora_url}" + elif self.server_type == BlockchainType.CompactBlockFilter: + server_name = f"{self.server_type.name}" + elif self.server_type == BlockchainType.RPC: + server_name = f"{self.server_type.name}" + + if self.proxy_url: + return translate("network_config", "{server_name} via the proxy {proxy}").format( + server_name=server_name, proxy=self.proxy_url + ) + else: + return translate("network_config", "{server_name}").format(server_name=server_name) def dump(self) -> Dict[str, Any]: d = super().dump() diff --git a/bitcoin_safe/signature_manager.py b/bitcoin_safe/signature_manager.py index 62d9c48..5365e42 100644 --- a/bitcoin_safe/signature_manager.py +++ b/bitcoin_safe/signature_manager.py @@ -123,14 +123,15 @@ class Asset: class GitHubAssetDownloader: - def __init__(self, repository: str) -> None: + def __init__(self, repository: str, proxies: Dict | None) -> None: self.repository = repository + self.proxies = proxies logger.debug(f"initialized {self}") def _get_assets(self, api_url) -> List[Asset]: try: logger.debug(f"Get assets from {api_url}") - response = requests.get(api_url, timeout=2) + response = requests.get(api_url, timeout=2, proxies=self.proxies) response.raise_for_status() assets = response.json().get("assets", []) @@ -154,12 +155,10 @@ def get_assets_latest(self) -> List[Asset]: class SignatureVerifyer: - def __init__( - self, - list_of_known_keys: Optional[List[SimpleGPGKey]], - ) -> None: + def __init__(self, list_of_known_keys: Optional[List[SimpleGPGKey]], proxies: Dict | None) -> None: self.list_of_known_keys = list_of_known_keys if list_of_known_keys else [] self.public_keys: Dict[str, pgpy.PGPKey] = {} + self.proxies = proxies self.import_known_keys() def import_public_key_file(self, path: Path) -> pgpy.PGPKey: @@ -300,8 +299,8 @@ def _get_asset_url(assets: List[Asset], ending: str) -> Optional[str]: return None @staticmethod - def _download_file(download_url: str, filename: Path) -> Path: - sig_response = requests.get(download_url, timeout=2) + def _download_file(download_url: str, filename: Path, proxies: Dict | None) -> Path: + sig_response = requests.get(download_url, timeout=2, proxies=proxies) sig_response.raise_for_status() with open(filename, "wb") as f: f.write(sig_response.content) @@ -309,12 +308,12 @@ def _download_file(download_url: str, filename: Path) -> Path: @staticmethod def _download_asset_file( - assets: List[Asset], target_directory: Path, asset_ending: str + assets: List[Asset], target_directory: Path, asset_ending: str, proxies: Dict | None ) -> Optional[Path]: if url := SignatureVerifyer._get_asset_url(assets, asset_ending): url_filename = Path(url).name filename = target_directory / url_filename - SignatureVerifyer._download_file(url, filename) + SignatureVerifyer._download_file(url, filename, proxies=proxies) return filename return None @@ -350,22 +349,27 @@ def get_signature_from_web(self, binary_filename: Path) -> Optional[Path]: if not tag: return None - assets = GitHubAssetDownloader(repository=key.repository).get_assets_by_tag(tag) + assets = GitHubAssetDownloader(repository=key.repository, proxies=self.proxies).get_assets_by_tag(tag) if assets: if key.manifest_ending: self._download_asset_file( - assets, target_directory=binary_filename.parent, asset_ending=key.manifest_ending + assets, + target_directory=binary_filename.parent, + asset_ending=key.manifest_ending, + proxies=self.proxies, ) sig_filename = self._download_asset_file( assets, target_directory=binary_filename.parent, asset_ending=f"{key.manifest_ending}.asc", + proxies=self.proxies, ) else: sig_filename = self._download_asset_file( assets, target_directory=binary_filename.parent, asset_ending=f"{binary_filename.name}.asc", + proxies=self.proxies, ) return sig_filename diff --git a/bitcoin_safe/wallet.py b/bitcoin_safe/wallet.py index 1965386..f2bfd77 100644 --- a/bitcoin_safe/wallet.py +++ b/bitcoin_safe/wallet.py @@ -33,6 +33,7 @@ import random from time import time +from bitcoin_safe.network_config import ProxyInfo, clean_electrum_url from bitcoin_safe.psbt_util import FeeInfo from .signals import Signals, UpdateFilter @@ -807,13 +808,16 @@ def init_blockchain(self) -> bdk.Blockchain: blockchain_config = None if self.config.network_config.server_type == BlockchainType.Electrum: - full_url = ( - "ssl://" if self.config.network_config.electrum_use_ssl else "" - ) + self.config.network_config.electrum_url blockchain_config = bdk.BlockchainConfig.ELECTRUM( bdk.ElectrumConfig( - url=full_url, - socks5=None, + url=clean_electrum_url( + self.config.network_config.electrum_url, self.config.network_config.electrum_use_ssl + ), + socks5=( + ProxyInfo.parse(self.config.network_config.proxy_url).get_url() + if self.config.network_config.proxy_url + else None + ), retry=2, timeout=10, stop_gap=max(self.gap, self.gap_change), @@ -824,7 +828,11 @@ def init_blockchain(self) -> bdk.Blockchain: blockchain_config = bdk.BlockchainConfig.ESPLORA( bdk.EsploraConfig( base_url=self.config.network_config.esplora_url, - proxy=None, + proxy=( + ProxyInfo.parse(self.config.network_config.proxy_url).get_url() + if self.config.network_config.proxy_url + else None + ), concurrency=1, stop_gap=max(self.gap, self.gap_change), timeout=10, diff --git a/poetry.lock b/poetry.lock index afff6f5..7959f04 100644 --- a/poetry.lock +++ b/poetry.lock @@ -791,61 +791,61 @@ typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "fonttools" -version = "4.55.5" +version = "4.55.6" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.55.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:58fbc0dba6c87a9ec57be7e6751a6442911e546750e362b39ff07e30445c355f"}, - {file = "fonttools-4.55.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b788742d99e7e62b3428728f3af743c6e169b53796c2b885adb0080c256c523e"}, - {file = "fonttools-4.55.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f64266bbeccd1c289f4ea2ae4cc8b87daa51ba44bdbf27b3950f6f303ee2ee9"}, - {file = "fonttools-4.55.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d073d6e0a5576c7b82d7926c8489f326b6c9381871660bbdeeafe5e9a7b400f7"}, - {file = "fonttools-4.55.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:57e79e3fdb011792be6e9f73cb2154c37a2b3f14ff09ddec32f4d1591ba56d64"}, - {file = "fonttools-4.55.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:53f9b4bf0c4744bfabdd488db6eb374beb3ee4778f54019b48486aebbcc6c77d"}, - {file = "fonttools-4.55.5-cp310-cp310-win32.whl", hash = "sha256:4f47f9b4f2674b5841d119a5bffade603777729a23cb6d9413146b6b109cd04e"}, - {file = "fonttools-4.55.5-cp310-cp310-win_amd64.whl", hash = "sha256:01bf83e07a44a34d58d22a6af0013c94ed7d876c081ed04e6a6db368db3ec4f2"}, - {file = "fonttools-4.55.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:019ab35daacec241d567174e1e8068191b059a7e171f68483778a91485e8e27b"}, - {file = "fonttools-4.55.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:59fbfd348fe3c15b4cb31f0cb81a9fad67c1419596e2f349be0a1e48955775fd"}, - {file = "fonttools-4.55.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3686e74b372313495ffbe58b23304772bc2f7c7fb947da382f250bfc1b0417c"}, - {file = "fonttools-4.55.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f8065f503b2abc9d8d2b241da307c58c80df0e28c5ea8464fe8d2ba3bb76990"}, - {file = "fonttools-4.55.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac1e3139c9776eb3a5119a25da5665fd961f6b39a5307b62bd427afba69b7c5e"}, - {file = "fonttools-4.55.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1bf14bcec231408581ee3cafcb23a0ef1821a974a6ff5031ccbc1aad65192de9"}, - {file = "fonttools-4.55.5-cp311-cp311-win32.whl", hash = "sha256:aa7868dd7d42992ccd722d70a3bd413d875ca51633b094b5867ab09ed8e78bbe"}, - {file = "fonttools-4.55.5-cp311-cp311-win_amd64.whl", hash = "sha256:d895f363e03697f7941c278fb7a42fca63d52de5416180ef1892dfd67a136698"}, - {file = "fonttools-4.55.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5ad2b4a8bfd94ae6792c2f00e585fcdaa5c7803d87eedaeaa30e81616283e712"}, - {file = "fonttools-4.55.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:928d0a093eaab9bde8b295f01859b0463384b86ba800eb959370734588347444"}, - {file = "fonttools-4.55.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59b10b408a68f5c1ecb927ad11860bf534312a236c61f3b20cb6e22bb55265b9"}, - {file = "fonttools-4.55.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a06e77f956a5857a4444f689f0ca4a1c4bdbcb38c812805f54a1b21380cc24"}, - {file = "fonttools-4.55.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:85dc010bb9dc0fc9cfdb050ace4fb810ff5d5edb6a34045bce83dd4307b1a27c"}, - {file = "fonttools-4.55.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:546b195de57360e52b6f94bf126b1400004643fc2754705b6ae659293c34e449"}, - {file = "fonttools-4.55.5-cp312-cp312-win32.whl", hash = "sha256:8c9061a4027bfc62b22c55885e561d6eb36d3f6d058f7894e4d84eb778580e3f"}, - {file = "fonttools-4.55.5-cp312-cp312-win_amd64.whl", hash = "sha256:742c63ba8e2888dc6cf4cce98d16fe77d79a6c283f5c6d1a8e17d128ecde45fc"}, - {file = "fonttools-4.55.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a853ee8ac47c2e2e68d5a0f07f7f38eb616d60c4438bcff5c0312322451f15c6"}, - {file = "fonttools-4.55.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:444e84d8158ed40427827e5ff8db4d05d89560e19f2a6baf90565880d1c7c08f"}, - {file = "fonttools-4.55.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8eb7ca7b3ef580114edd6f9ce9424e534b9cb1a98c918a42930f196b1ac59e"}, - {file = "fonttools-4.55.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c27b2084eb715bce93b4c3cc2080a8b3fb6aff5a105c221f150df42e79120a"}, - {file = "fonttools-4.55.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb11588c41c9e867cebbf72485963252b2d782e97514845aa3fd372b31f63afe"}, - {file = "fonttools-4.55.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a65d4407ca31ec582d1a7105ee08986f6ef964ddcbe0a2878881926bc23cfba3"}, - {file = "fonttools-4.55.5-cp313-cp313-win32.whl", hash = "sha256:7cf3dc8051c0b37034c2661934e8795a1e95ac5cf4f97ce9935cf6f10ba481f0"}, - {file = "fonttools-4.55.5-cp313-cp313-win_amd64.whl", hash = "sha256:b5e6868d8952a31cb3643080ea1594adde971bf2a05aae5bc47bf0ac91e79575"}, - {file = "fonttools-4.55.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a7b3c77c5dcf0a1b4e3b57e976253f5ef09966f811b4b06d36f8eb8672c209fb"}, - {file = "fonttools-4.55.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91e989b53cdcb301ebd599c32a95cf397082184d46ec73125dbdc83b56720e2e"}, - {file = "fonttools-4.55.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:240927333041df5377a86d4458bdadea1573bd29589040dcab4e52b6277dfae1"}, - {file = "fonttools-4.55.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41b52283f68b090b85ba5fd94541ef15c21a17b7c7e3917fd9520297975838fc"}, - {file = "fonttools-4.55.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:686ee7f1d0ef1d8d540039219d256ee89724e9dc3db4c394b4c65f6512228924"}, - {file = "fonttools-4.55.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a0723737a3fb16e7d359df797c9c4d8a3fd974dfff1c27d245f6670efb4b8ab6"}, - {file = "fonttools-4.55.5-cp38-cp38-win32.whl", hash = "sha256:365e7f9005df0a0125d0728aa49340030431ba54b33f20226c5529a26ce4980f"}, - {file = "fonttools-4.55.5-cp38-cp38-win_amd64.whl", hash = "sha256:f51572d1c8277f91b2be575b7069f8765170cbf7c2d5b1cdd53d40dd2323b792"}, - {file = "fonttools-4.55.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9e747a98062af9dca29d035417c6f547b956908a0711a66697125596c40ad05a"}, - {file = "fonttools-4.55.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:96f6a1ed5181e80b1db8c1352d5f45c8cef875a9633ad69df6af4ee7c6895077"}, - {file = "fonttools-4.55.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ed53c04d444660a2eeef3d8a8fe8c62d9bd99d50a03b0400624144d3131cf4a"}, - {file = "fonttools-4.55.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25362494d1f9ef467c210fc1d73116811a01fd507345e865c14ecbd80b323380"}, - {file = "fonttools-4.55.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:acd86a4605586502f6716a543183dcedc4497a7cbce7fb1ca4e793daa5bfdc12"}, - {file = "fonttools-4.55.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2c14aae1b255767f2cb2f8c8de4c50d45f94bf125a5149325d3af0e4f6b39060"}, - {file = "fonttools-4.55.5-cp39-cp39-win32.whl", hash = "sha256:a8602b04451e7f62eda75071210ebea4e2ba7d2a24868eba2cf541232b88357c"}, - {file = "fonttools-4.55.5-cp39-cp39-win_amd64.whl", hash = "sha256:17a14d3a23e894289288d77abcf4b2e6e198c0e1ec6798522bcc51f1ffbfdf6d"}, - {file = "fonttools-4.55.5-py3-none-any.whl", hash = "sha256:6261deeaa54a720405fc4a21dc92f722d1b2c5a977910d464029534b9475f716"}, - {file = "fonttools-4.55.5.tar.gz", hash = "sha256:87afe2a1e81a55131bbae66f3f1718b1faee3218b1261abce036d7d189094c36"}, + {file = "fonttools-4.55.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:57d55fc965e5dd20c8a60d880e0f43bafb506be87af0b650bdc42591e41e0d0d"}, + {file = "fonttools-4.55.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:127999618afe3a2490fad54bab0650c5fbeab1f8109bdc0205f6ad34306deb8b"}, + {file = "fonttools-4.55.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3226d40cb92787e09dcc3730f54b3779dfe56bdfea624e263685ba17a6faac4"}, + {file = "fonttools-4.55.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e82772f70b84e17aa36e9f236feb2a4f73cb686ec1e162557a36cf759d1acd58"}, + {file = "fonttools-4.55.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a632f85bd73e002b771bcbcdc512038fa5d2e09bb18c03a22fb8d400ea492ddf"}, + {file = "fonttools-4.55.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:791e0cf862cdd3a252df395f1bb5f65e3a760f1da3c7ce184d0f7998c266614d"}, + {file = "fonttools-4.55.6-cp310-cp310-win32.whl", hash = "sha256:94f7f2c5c5f3a6422e954ecb6d37cc363e27d6f94050a7ed3f79f12157af6bb2"}, + {file = "fonttools-4.55.6-cp310-cp310-win_amd64.whl", hash = "sha256:2d15e02b93a46982a8513a208e8f89148bca8297640527365625be56151687d0"}, + {file = "fonttools-4.55.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0879f99eabbf2171dfadd9c8c75cec2b7b3aa9cd1f3955dd799c69d60a5189ef"}, + {file = "fonttools-4.55.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d77d83ca77a4c3156a2f4cbc7f09f5a8503795da658fa255b987ad433a191266"}, + {file = "fonttools-4.55.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07478132407736ee5e54f9f534e73923ae28e9bb6dba17764a35e3caf7d7fea3"}, + {file = "fonttools-4.55.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c06fbc2fd76b9bab03eddfd8aa9fb7c0981d314d780e763c80aa76be1c9982"}, + {file = "fonttools-4.55.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:09ed667c4753e1270994e5398cce8703e6423c41702a55b08f843b2907b1be65"}, + {file = "fonttools-4.55.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0ee6ed68af8d57764d69da099db163aaf37d62ba246cfd42f27590e3e6724b55"}, + {file = "fonttools-4.55.6-cp311-cp311-win32.whl", hash = "sha256:9f99e7876518b2d059a9cc67c506168aebf9c71ac8d81006d75e684222f291d2"}, + {file = "fonttools-4.55.6-cp311-cp311-win_amd64.whl", hash = "sha256:3aa6c684007723895aade9b2fe76d07008c9dc90fd1ef6c310b3ca9c8566729f"}, + {file = "fonttools-4.55.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:51120695ee13001533e50abd40eec32c01b9c6f44c5567db38a7acd3eedcd19d"}, + {file = "fonttools-4.55.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:76ac5a595f86892b49ba86ba2e46185adc76328ce6eff0583b30e5c3ab02a914"}, + {file = "fonttools-4.55.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7535a5ac386e549e2b00b34c59b53f805e2423000676723b6867df3c10df04"}, + {file = "fonttools-4.55.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c42009177d3690894288082d5e3dac6bdc9f5d38e25054535e341a19cf5183a4"}, + {file = "fonttools-4.55.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:88f74bc19dbab3dee6a00ca67ca54bb4793e44ff0c4dcf1fa61d68651ae3fa0a"}, + {file = "fonttools-4.55.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bc6f58976ffc19fe1630119a2736153b66151d023c6f30065f31c9e8baed1303"}, + {file = "fonttools-4.55.6-cp312-cp312-win32.whl", hash = "sha256:4259159715142c10b0f4d121ef14da3fa6eafc719289d9efa4b20c15e57fef82"}, + {file = "fonttools-4.55.6-cp312-cp312-win_amd64.whl", hash = "sha256:d91fce2e9a87cc0db9f8042281b6458f99854df810cfefab2baf6ab2acc0f4b4"}, + {file = "fonttools-4.55.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9394813cc73fa22c5413ec1c5745c0a16f68dd2b890f7c55eaba5cb40187ed55"}, + {file = "fonttools-4.55.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ac817559a7d245454231374e194b4e457dca6fefa5b52af466ab0516e9a09c6e"}, + {file = "fonttools-4.55.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34405f1314f1e88b1877a9f9e497fe45190e8c4b29a6c7cd85ed7f666a57d702"}, + {file = "fonttools-4.55.6-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af5469bbf555047efd8752d85faeb2a3510916ddc6c50dd6fb168edf1677408f"}, + {file = "fonttools-4.55.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8a8004a19195eb8a8a13de69e26ec9ed60a5bc1fde336d0021b47995b368fac9"}, + {file = "fonttools-4.55.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:73a4aaf672e7b2265c6354a69cbbadf71b7f3133ecb74e98fec4c67c366698a3"}, + {file = "fonttools-4.55.6-cp313-cp313-win32.whl", hash = "sha256:73bdff9c44d36c57ea84766afc20517eda0c9bb1571b4a09876646264bd5ff3b"}, + {file = "fonttools-4.55.6-cp313-cp313-win_amd64.whl", hash = "sha256:132fa22be8a99784de8cb171b30425a581f04a40ec1c05183777fb2b1fe3bac9"}, + {file = "fonttools-4.55.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8398928acb8a57073606feb9a310682d4a7e2d7536f2c61719261f4c0974504c"}, + {file = "fonttools-4.55.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c2f78ebfdef578d4db7c44bc207ac5f9a5c1f22c9db606460dcc8ad48e183338"}, + {file = "fonttools-4.55.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb545f3a4ebada908fa717ec732277de18dd10161f03ee3b3144d34477804de"}, + {file = "fonttools-4.55.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1062daa0390b32bfd062ded2b450db9e9cf10e5a9919561c13f535e818b1952b"}, + {file = "fonttools-4.55.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:860ab9ed3f9e088d3bdb77b9074e656635f173b039e77d550b603cba052a0dca"}, + {file = "fonttools-4.55.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:03701e7de70c71eb5965cb200986b0c11dfa3cf8e843e4f517ee30a0f43f0a25"}, + {file = "fonttools-4.55.6-cp38-cp38-win32.whl", hash = "sha256:f66561fbfb75785d06513b8025a50be37bf970c3c413e87581cc6eff10bc78f1"}, + {file = "fonttools-4.55.6-cp38-cp38-win_amd64.whl", hash = "sha256:edf159a8f1e48dc4683a715b36da76dd2f82954b16bfe11a215d58e963d31cfc"}, + {file = "fonttools-4.55.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61aa1997c520bee4cde14ffabe81efc4708c500c8c81dce37831551627a2be56"}, + {file = "fonttools-4.55.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7954ea66a8d835f279c17d8474597a001ddd65a2c1ca97e223041bfbbe11f65e"}, + {file = "fonttools-4.55.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f4e88f15f5ed4d2e4bdfcc98540bb3987ae25904f9be304be9a604e7a7050a1"}, + {file = "fonttools-4.55.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d419483a6295e83cabddb56f1c7b7bfdc8169de2fcb5c68d622bd11140355f9"}, + {file = "fonttools-4.55.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:acc74884afddc2656bffc50100945ff407574538c152931c402fccddc46f0abc"}, + {file = "fonttools-4.55.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a55489c7e9d5ea69690a2afad06723c3d0c48c6d276a25391ea97cb31a16b37c"}, + {file = "fonttools-4.55.6-cp39-cp39-win32.whl", hash = "sha256:8c9de8d16d02ecc8b65e3f3d2d1e3002be2c4a3f094d580faf76d7f768bd45fe"}, + {file = "fonttools-4.55.6-cp39-cp39-win_amd64.whl", hash = "sha256:471961af7a4b8461fac0c8ee044b4986e6fe3746d4c83a1aacbdd85b4eb53f93"}, + {file = "fonttools-4.55.6-py3-none-any.whl", hash = "sha256:d20ab5a78d0536c26628eaadba661e7ae2427b1e5c748a0a510a44d914e1b155"}, + {file = "fonttools-4.55.6.tar.gz", hash = "sha256:1beb4647a0df5ceaea48015656525eb8081af226fe96554089fd3b274d239ef0"}, ] [package.extras] @@ -1832,22 +1832,22 @@ virtualenv = ">=20.10.0" [[package]] name = "protobuf" -version = "4.25.5" +version = "4.25.6" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, - {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, - {file = "protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173"}, - {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d"}, - {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"}, - {file = "protobuf-4.25.5-cp38-cp38-win32.whl", hash = "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1"}, - {file = "protobuf-4.25.5-cp38-cp38-win_amd64.whl", hash = "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a"}, - {file = "protobuf-4.25.5-cp39-cp39-win32.whl", hash = "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f"}, - {file = "protobuf-4.25.5-cp39-cp39-win_amd64.whl", hash = "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45"}, - {file = "protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41"}, - {file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"}, + {file = "protobuf-4.25.6-cp310-abi3-win32.whl", hash = "sha256:61df6b5786e2b49fc0055f636c1e8f0aff263808bb724b95b164685ac1bcc13a"}, + {file = "protobuf-4.25.6-cp310-abi3-win_amd64.whl", hash = "sha256:b8f837bfb77513fe0e2f263250f423217a173b6d85135be4d81e96a4653bcd3c"}, + {file = "protobuf-4.25.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:6d4381f2417606d7e01750e2729fe6fbcda3f9883aa0c32b51d23012bded6c91"}, + {file = "protobuf-4.25.6-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:5dd800da412ba7f6f26d2c08868a5023ce624e1fdb28bccca2dc957191e81fb5"}, + {file = "protobuf-4.25.6-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:4434ff8bb5576f9e0c78f47c41cdf3a152c0b44de475784cd3fd170aef16205a"}, + {file = "protobuf-4.25.6-cp38-cp38-win32.whl", hash = "sha256:8bad0f9e8f83c1fbfcc34e573352b17dfce7d0519512df8519994168dc015d7d"}, + {file = "protobuf-4.25.6-cp38-cp38-win_amd64.whl", hash = "sha256:b6905b68cde3b8243a198268bb46fbec42b3455c88b6b02fb2529d2c306d18fc"}, + {file = "protobuf-4.25.6-cp39-cp39-win32.whl", hash = "sha256:3f3b0b39db04b509859361ac9bca65a265fe9342e6b9406eda58029f5b1d10b2"}, + {file = "protobuf-4.25.6-cp39-cp39-win_amd64.whl", hash = "sha256:6ef2045f89d4ad8d95fd43cd84621487832a61d15b49500e4c1350e8a0ef96be"}, + {file = "protobuf-4.25.6-py3-none-any.whl", hash = "sha256:07972021c8e30b870cfc0863409d033af940213e0e7f64e27fe017b929d2c9f7"}, + {file = "protobuf-4.25.6.tar.gz", hash = "sha256:f8cfbae7c5afd0d0eaccbe73267339bff605a2315860bb1ba08eb66670a9a91f"}, ] [[package]] @@ -2168,6 +2168,18 @@ files = [ [package.extras] cp2110 = ["hidapi"] +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, +] + [[package]] name = "pytest" version = "8.3.4" @@ -2527,13 +2539,13 @@ files = [ [[package]] name = "semver" -version = "3.0.2" +version = "3.0.4" description = "Python helper for Semantic Versioning (https://semver.org)" optional = false python-versions = ">=3.7" files = [ - {file = "semver-3.0.2-py3-none-any.whl", hash = "sha256:b1ea4686fe70b981f85359eda33199d60c53964284e0cfb4977d243e37cf4bf4"}, - {file = "semver-3.0.2.tar.gz", hash = "sha256:6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc"}, + {file = "semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746"}, + {file = "semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"}, ] [[package]] @@ -2891,4 +2903,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "076f4a1421554bb518a174588ec5cf8ae92191bb4ffdcf56b3a2590f6ce93784" +content-hash = "a6b00c64503f23653b582636a2bff1fc014ab339bb36683b4823469f03f460af" diff --git a/pyproject.toml b/pyproject.toml index 061adde..22143c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,7 @@ numpy = "2.2.1" # error in wine/pyinstaller when increased bitcoin-qr-tools = "^1.0.3" bitcoin-nostr-chat = "^0.6.1" # { git = "https://github.com/andreasgriffin/bitcoin-nostr-chat.git", rev = "1707c7479d9de4c1915f2b0d907b27f58703e7c0" } bitcoin-usb = "^0.7.4" +pysocks = "^1.7.1" [tool.poetry.group.dev.dependencies] diff --git a/tests/non_gui/test_signature_manager.py b/tests/non_gui/test_signature_manager.py index 5b5b02d..7234c8e 100644 --- a/tests/non_gui/test_signature_manager.py +++ b/tests/non_gui/test_signature_manager.py @@ -36,7 +36,7 @@ def test_download_manifest_and_verify() -> None: - manager = SignatureVerifyer(list_of_known_keys=KnownGPGKeys.all()) + manager = SignatureVerifyer(list_of_known_keys=KnownGPGKeys.all(), proxies=None) with tempfile.TemporaryDirectory() as tempdir: logger.debug(f"tempdir {tempdir}") @@ -53,7 +53,7 @@ def test_download_manifest_and_verify() -> None: def test_download_manifest_and_verify_wrong_signature() -> None: - manager = SignatureVerifyer(list_of_known_keys=KnownGPGKeys.all()) + manager = SignatureVerifyer(list_of_known_keys=KnownGPGKeys.all(), proxies=None) with tempfile.TemporaryDirectory() as tempdir: logger.debug(f"tempdir {tempdir}") diff --git a/tools/build.py b/tools/build.py index f9cabf7..a89d9b3 100644 --- a/tools/build.py +++ b/tools/build.py @@ -35,7 +35,7 @@ import shutil import subprocess from pathlib import Path -from typing import Dict, List, Literal +from typing import Callable, Dict, List, Literal from translation_handler import TranslationHandler, run_local @@ -227,21 +227,21 @@ def build_in_docker( run_local(f'docker build {DOCKER_BUILD_FLAGS} -t {docker_image} "{path_build}"') # Possibly do a fresh clone - FRESH_CLONE = False + cloned_path: Path | None = None if build_commit: logger.info(f"BITCOINSAFE_BUILD_COMMIT={build_commit}. Doing fresh clone and git checkout.") - FRESH_CLONE = Path(f"/tmp/{docker_image.replace(' ','')}/fresh_clone/bitcoin_safe") + cloned_path = Path(f"/tmp/{docker_image.replace(' ','')}/fresh_clone/bitcoin_safe") try: - run_local(f'rm -rf "{FRESH_CLONE}"') + run_local(f'rm -rf "{cloned_path}"') except subprocess.CalledProcessError: logger.info("We need sudo to remove previous FRESH_CLONE.") - run_local(f'sudo rm -rf "{FRESH_CLONE}"') + run_local(f'sudo rm -rf "{cloned_path}"') os.umask(0o022) - run_local(f'git clone "{PROJECT_ROOT}" "{FRESH_CLONE}"') - os.chdir(str(FRESH_CLONE)) + run_local(f'git clone "{PROJECT_ROOT}" "{cloned_path}"') + os.chdir(str(cloned_path)) run_local(f'git checkout "{build_commit}"') os.chdir(original_dir) - PROJECT_ROOT_OR_FRESHCLONE_ROOT = FRESH_CLONE + PROJECT_ROOT_OR_FRESHCLONE_ROOT = cloned_path else: logger.info("Not doing fresh clone.") @@ -290,20 +290,20 @@ def build_dmg( logger.info(f"Building within current project") # Possibly do a fresh clone - FRESH_CLONE = False + cloned_path: Path | None = None if build_commit: logger.info(f"BITCOINSAFE_BUILD_COMMIT={build_commit}. Doing fresh clone and git checkout.") - FRESH_CLONE = Path(f"/tmp/{build_commit.replace(' ','')}/fresh_clone/bitcoin_safe") + cloned_path = Path(f"/tmp/{build_commit.replace(' ','')}/fresh_clone/bitcoin_safe") try: - run_local(f'rm -rf "{FRESH_CLONE}"') + run_local(f'rm -rf "{cloned_path}"') except subprocess.CalledProcessError: logger.info("We need sudo to remove previous FRESH_CLONE.") - run_local(f'sudo rm -rf "{FRESH_CLONE}"') + run_local(f'sudo rm -rf "{cloned_path}"') os.umask(0o022) - run_local(f'git clone "{PROJECT_ROOT}" "{FRESH_CLONE}"') - os.chdir(str(FRESH_CLONE)) + run_local(f'git clone "{PROJECT_ROOT}" "{cloned_path}"') + os.chdir(str(cloned_path)) run_local(f'git checkout "{build_commit}"') - PROJECT_ROOT_OR_FRESHCLONE_ROOT = FRESH_CLONE + PROJECT_ROOT_OR_FRESHCLONE_ROOT = cloned_path else: logger.info("Not doing fresh clone.") @@ -354,7 +354,7 @@ def package_application( ): # self.update_briefcase_requires() - f_map = { + f_map: Dict[str, Callable[..., None]] = { "appimage": self.build_appimage_docker, "windows": self.build_windows_exe_and_installer_docker, "mac": self.build_dmg, @@ -398,9 +398,7 @@ def lock(self): run_local("poetry lock --no-cache --no-update") def verify(self, signed_files: List[Path]): - manager = SignatureVerifyer( - list_of_known_keys=[KnownGPGKeys.andreasgriffin], - ) + manager = SignatureVerifyer(list_of_known_keys=[KnownGPGKeys.andreasgriffin], proxies=None) assert signed_files for filepath in signed_files: @@ -576,7 +574,7 @@ def get_default_targets() -> List[TARGET_LITERAL]: targets = get_default_targets() else: print(f"--targets was given with the values: {args.targets}") - targets = [t.replace(",", "") for t in targets] + targets = [t.replace(",", "") for t in targets] # type: ignore builder = Builder(module_name="bitcoin_safe", clean_all=args.clean) builder.package_application(targets=targets, build_commit=args.commit)