diff --git a/bitcoin_safe/__init__.py b/bitcoin_safe/__init__.py index 8fe1c72d..d08ab14e 100644 --- a/bitcoin_safe/__init__.py +++ b/bitcoin_safe/__init__.py @@ -26,4 +26,4 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # -__version__ = "1.7.1" +__version__ = "2.0.0rc0" diff --git a/bitcoin_safe/gui/qt/initial_cbf_sync_widget.py b/bitcoin_safe/gui/qt/initial_cbf_sync_widget.py index f4fcff85..34304383 100644 --- a/bitcoin_safe/gui/qt/initial_cbf_sync_widget.py +++ b/bitcoin_safe/gui/qt/initial_cbf_sync_widget.py @@ -34,9 +34,11 @@ from dataclasses import dataclass from enum import Enum from pathlib import Path +from typing import cast +from bitcoin_safe_lib.gui.qt.signal_tracker import SignalProtocol from bitcoin_safe_lib.gui.qt.util import age -from PyQt6.QtCore import QLocale, QPointF, QRectF, Qt +from PyQt6.QtCore import QLocale, QPointF, QRectF, Qt, pyqtSignal from PyQt6.QtGui import ( QColor, QFont, @@ -48,7 +50,15 @@ QPen, QRadialGradient, ) -from PyQt6.QtWidgets import QHBoxLayout, QLabel, QSizePolicy, QToolTip, QVBoxLayout, QWidget +from PyQt6.QtWidgets import ( + QHBoxLayout, + QLabel, + QPushButton, + QSizePolicy, + QToolTip, + QVBoxLayout, + QWidget, +) from bitcoin_safe.client import ProgressInfo from bitcoin_safe.config import UserConfig @@ -402,6 +412,7 @@ class InitialCbfSyncWidget(QWidget): """Shown while CBF sync is running and history list is still empty.""" _PRIVACY_INFO_URL = "https://bitcoin-safe.org/knowledge/compact-block-filters/" + signal_request_open_network_settings = cast(SignalProtocol[[]], pyqtSignal()) def __init__(self, config: UserConfig, parent: QWidget | None = None) -> None: super().__init__(parent=parent) @@ -439,6 +450,22 @@ def _build_ui(self) -> None: ) self.privacy_help_label.textLabel.setWordWrap(False) + self.network_settings_hint_label = QLabel(self) + self.network_settings_hint_label.setWordWrap(True) + self.network_settings_hint_label.setAlignment(Qt.AlignmentFlag.AlignHCenter) + + self.network_settings_button = QPushButton(self) + self.network_settings_button.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + self.network_settings_button.clicked.connect(self._open_network_settings) + + self.network_settings_row = QVBoxLayout() + self.network_settings_row.setContentsMargins(0, 0, 0, 0) + self.network_settings_row.setSpacing(6) + self.network_settings_row.addWidget(self.network_settings_hint_label) + self.network_settings_row.addWidget( + self.network_settings_button, alignment=Qt.AlignmentFlag.AlignHCenter + ) + self.map_widget = WorldPeerMapWidget(parent=self) self.progress_label = QLabel(self) @@ -467,6 +494,7 @@ def _build_ui(self) -> None: layout.addWidget(self.title_label) layout.addWidget(self.subtitle_label) layout.addWidget(self.privacy_help_label, alignment=Qt.AlignmentFlag.AlignHCenter) + layout.addLayout(self.network_settings_row) layout.addWidget(self.map_widget) layout.addWidget(self.progress_label) layout.addWidget(self.progress_bar) @@ -515,8 +543,7 @@ def updateUi(self) -> None: self.title_label.setText(self.tr("Scanning Bitcoin blockchain")) self.subtitle_label.setText( self.tr( - "During first sync, Bitcoin Safe fetches compact block summaries from multiple Bitcoin nodes. " - "This is a private way to download block data." + "Bitcoin Safe downloads block summaries from multiple nodes for privacy. After this initial sync, updates will be fast." ) ) self.privacy_help_label.set_icon_as_help( @@ -527,6 +554,13 @@ def updateUi(self) -> None: click_url=self._PRIVACY_INFO_URL, ) self.privacy_help_label.setText(self.tr("Why this protects privacy (learn more)")) + self.network_settings_hint_label.setText( + self.tr( + "If you have your own Electrum server or do not want to wait, connect to a public " + "Electrum server in network settings." + ) + ) + self.network_settings_button.setText(self.tr("Network settings")) if self._last_progress_info: self.set_progress_info(self._last_progress_info) else: @@ -611,3 +645,6 @@ def _refresh_points_and_legend(self) -> None: ) ) self.node_legend_label.set_icon_as_help(tooltip=self.tr("Discovered bitcoin nodes.")) + + def _open_network_settings(self) -> None: + self.signal_request_open_network_settings.emit() diff --git a/bitcoin_safe/gui/qt/main.py b/bitcoin_safe/gui/qt/main.py index 9b2cdb19..e705587e 100644 --- a/bitcoin_safe/gui/qt/main.py +++ b/bitcoin_safe/gui/qt/main.py @@ -2453,6 +2453,9 @@ def add_qt_wallet( self.language_chooser.add_signal_language_switch(self.signals.language_switch) self.wallet_functions.wallet_signals[qt_wallet.wallet.id].show_address.connect(self.show_address) + self.signal_tracker.connect( + qt_wallet.signal_request_open_network_settings, self.open_network_settings + ) self.p2p_listening_update_lists(UpdateFilter()) qt_wallet.wallet_signals.updated.emit(UpdateFilter(reason=UpdateFilterReason.WalletOpened)) diff --git a/bitcoin_safe/gui/qt/qt_wallet.py b/bitcoin_safe/gui/qt/qt_wallet.py index 0fa75410..fafc7e0f 100644 --- a/bitcoin_safe/gui/qt/qt_wallet.py +++ b/bitcoin_safe/gui/qt/qt_wallet.py @@ -256,6 +256,7 @@ class QTWallet(QtWalletBase, BaseSaveableClass): signal_client_log_str = cast(SignalProtocol[[str]], pyqtSignal(str)) signal_wallet_update = cast(SignalProtocol[[UpdateInfo]], pyqtSignal(UpdateInfo)) signal_refresh_sync_status = cast(SignalProtocol[[]], pyqtSignal()) + signal_request_open_network_settings = cast(SignalProtocol[[]], pyqtSignal()) @staticmethod def cls_kwargs( @@ -1453,6 +1454,10 @@ def _create_hist_tab( self.history_tab_content_stack.addWidget(self.history_tab_content) self.history_initial_sync_widget = InitialCbfSyncWidget(config=self.config, parent=tab) + self.signal_tracker.connect( + self.history_initial_sync_widget.signal_request_open_network_settings, + self.signal_request_open_network_settings.emit, + ) self.history_tab_content_stack.addWidget(self.history_initial_sync_widget) if history_list_with_toolbar: diff --git a/bitcoin_safe/network_config.py b/bitcoin_safe/network_config.py index a7859e68..3e37b87a 100644 --- a/bitcoin_safe/network_config.py +++ b/bitcoin_safe/network_config.py @@ -452,7 +452,12 @@ def __init__( """Initialize instance.""" super().__init__() self.network = network - self.server_type: BlockchainType = BlockchainType.Electrum + active_types = BlockchainType.active_types(network) + self.server_type: BlockchainType = ( + BlockchainType.CompactBlockFilter + if BlockchainType.CompactBlockFilter in active_types + else BlockchainType.Electrum + ) electrum_config = get_electrum_configs(network)["default"] self.electrum_url: str = electrum_config.url self.electrum_use_ssl: bool = electrum_config.use_ssl diff --git a/pyproject.toml b/pyproject.toml index 96eb237f..3acff4b9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ name = "bitcoin-safe" # the version here and in all other places in this toml are updated automatically # from the source: bitcoin_safe/__init__.py -version = "1.7.1" +version = "2.0.0rc0" description = "A bitcoin savings wallet for the entire family." authors = [ "andreasgriffin ",] license = "GPL-3.0" diff --git a/tests/data/bacon.wallet b/tests/data/bacon.wallet index 267bfc4c..2be84ab1 100644 --- a/tests/data/bacon.wallet +++ b/tests/data/bacon.wallet @@ -1,778 +1,489 @@ { - "VERSION": "0.1.1", + "VERSION": "0.3.0", "__class__": "QTWallet", - "display_balance": { - "VERSION": "0.0.1", - "__class__": "Balance", - "confirmed": 0, - "immature": 0, - "trusted_pending": 0, - "untrusted_pending": 0 - }, - "notified_tx_ids": [ - "dab8c15bda36c12e7e118a1125dcaaae1e825e0fc2d211a02c9f9d48bb01d40e", - "dc229c078d4a792379f3ab0cdba0c22d269362b9c2dbb50e3cf85c683e895225", - "451826334d06f8d53f018751147c7b13c12bdaf1cdfefd99a3b01b7f696f2d78", - "65b060e69498704bbca473573499d6c844882f46a34827d42b97779846f10709", - "0833b35f4cb1fa9ed941647dca7c8e0d4e88679c9078e28f32cacddb1af5e038", - "4cd97314a596200e4c1f89fe9117c7dd8ebd7219d96165e9581803eaa18b4140", - "6f9fd049746b6564b762f19cb390b986cc958cef52e043a73607f40c5eeca8fd", - "5e9b588977658948c8013ab74ffff91ad993c677eef5ef1558ba696d1efac895", - "74a57d3bce49df5ab0a58b17864e1f0c09c11bb3f5d6d497a96a408b4eb0068f", - "94aa3bfec6b21b6c924bfa7097851e4ab337ab2e6c501e2d68367d2b2e1353f6", - "b5247fc44d21f43528663510ef56c614fe5efc4c49832e248c6b667c4ff0be57", - "f84248219056c8cfff9c1ff6678689aa80d68aa1935e75c7990ba0537625f77a", - "5d321554674865dffb7a5406002ba5d68d4819d0eff805393d4917921d68f3c5", - "97f630d951d98f465ee2b92bc8d243e60d73f522bf7cb1dfb3fc5993f4daef65", - "385d96ffe503b794d84acc5081c082d3758f05ead05450f9ce94ac53415be8f5", - "a2812b4895e26889f657c849ad402fde59e979cbccd84b8df863d69f8acb65f1", - "b8a826a22da14f1e85672dea02411542105301f6a55fb2ab49a1f4348b148141", - "7af44a58e753d52ff3c86ee2715ef3eaa326936909e657adaebc6ab72c4e5064", - "e93b17627b378c33bad3ca1201330d3c265198fd1af216a9edef5801b9f5c3cb", - "557d4b85001e84824cd5ea1ad2dc1c3f1b4b8a875a4dc9ecdc18774a6eaa9ab5", - "9bedf63253fd02d706ef8f8cdcb40e30d3fd0501e226a76fdc1888ccd4776402", - "3cdf4066349ec9cf595a3d67939b14ed475d745e7f063b4d78f4711dca8e3eec", - "c9dc8b4475999b00603917a4c9dba1f9540fa264f7c18810eeda0bd195c32571", - "a145cdfd526538808da009879cd0352a21a11e0d45d2f7415f97439c5d03b367", - "92772ee4086ef45331bb28b298910e73fd8857d36b6fdf52b2089777864de362", - "cfa9d712faaf2be3256cb3b5579accabc1a35482787ff2d4e0a3959f6f171e80", - "9c2cc703090b55b71bc21ff9c328caa86f8a5c2c19df1ab61eb22541afe3aa80", - "a490babcd9fc47db240bd234ca0ee386826fb138fd1e0cb61d69d691e9ecaa22" - ], - "sync_tab": { - "auto_open_psbts": true, - "enabled": false, - "nostr_sync_dump": { - "debug": false, - "group_chat": { - "dm_connection_dump": { - "dms_from_dump": [], - "keys": "nsec137mg4c0328kljqqp2qehf87p2nun6dhag7907j4scypurj3tg5qqly3pc5", - "relay_list": { - "last_updated": 1734716981.999696, - "max_age": 30, - "relays": [ - "wss://nostr.btc-library.com", - "wss://nostr.hubmaker.io", - "wss://relay.primal.net", - "wss://nostrue.com", - "wss://nostr.schneimi.de", - "wss://nostr.sathoarder.com", - "wss://bitcoiner.social", - "wss://nostr.swiss-enigma.ch", - "wss://nostr.blockpower.capital", - "wss://ch.purplerelay.com", - "wss://relay.poster.place", - "wss://nostr.satstralia.com", - "wss://nostr.einundzwanzig.space", - "wss://nostr.vulpem.com", - "wss://nostr-1.nbo.angani.co", - "wss://relay.wellorder.net", - "wss://relay.dwadziesciajeden.pl", - "wss://e.nos.lol", - "wss://nostr.data.haus", - "wss://nostr21.com", - "wss://relay.nostromo.social", - "wss://offchain.pub", - "wss://nproxy.kristapsk.lv", - "wss://nostr.topeth.info", - "wss://nostr.bitcoiner.social", - "wss://nostr.roundrockbitcoiners.com", - "wss://nr.yay.so", - "wss://nostr.lu.ke", - "wss://relay.nostr.bg", - "wss://slick.mjex.me", - "wss://nostr.yael.at", - "wss://nostr.cercatrova.me", - "wss://nostr.oxtr.dev", - "wss://nostr.liberty.fans", - "wss://nostr.cro.social", - "wss://nostr.ginuerzh.xyz", - "wss://nostr.namek.link", - "wss://nostr-02.dorafactory.org", - "wss://relay.hodl.ar", - "wss://nostr.middling.mydns.jp", - "wss://nostr.filmweb.pl", - "wss://nostr.openhoofd.nl", - "wss://rs2.abaiba.top", - "wss://ithurtswhenip.ee", - "wss://relay2.nostrchat.io", - "wss://relay1.nostrchat.io", - "wss://relay.nostr.hu", - "wss://nostr.dakukitsune.ca", - "wss://nostr.hifish.org", - "wss://nostr2.sanhauf.com", - "wss://nostrua.com", - "wss://relay.nostr.youlot.org", - "wss://relay.nostr.directory", - "wss://relay.wavlake.com", - "wss://nostr.fbxl.net", - "wss://relay.nostrcn.com", - "wss://nostr-01.yakihonne.com", - "wss://relap.orzv.workers.dev", - "wss://wbc.nostr1.com", - "wss://nostr.heliodex.cf", - "wss://nostr-relay.psfoundation.info", - "wss://purplerelay.com", - "wss://soloco.nl", - "wss://nostr.dlsouza.lol", - "wss://relay.kamp.site", - "wss://relay.keychat.io", - "wss://nostr.2b9t.xyz", - "wss://relay.momostr.pink", - "wss://unhostedwallet.com", - "wss://21ideas.nostr1.com", - "wss://nostr.stakey.net", - "wss://unostr.site", - "wss://frens.nostr1.com", - "wss://nostr.dodge.me.uk", - "wss://relay.magiccity.live", - "wss://nostr.notribe.net", - "wss://theforest.nostr1.com", - "wss://us.purplerelay.com", - "wss://nostr1.daedaluslabs.io", - "wss://freelay.sovbit.host", - "wss://nostr.huszonegy.world", - "wss://dev-relay.kube.b-n.space", - "wss://relay.nos.social", - "wss://ditto.slothy.win/relay", - "wss://nostr.javi.space", - "wss://gleasonator.dev/relay", - "wss://bucket.coracle.social", - "wss://relay.artx.market", - "wss://nfrelay.app", - "wss://relay.notoshi.win", - "wss://relay.highlighter.com", - "wss://nostr.petrkr.net/strfry", - "wss://n.ok0.org", - "wss://nostr-02.yakihonne.com", - "wss://nostr-03.dorafactory.org", - "wss://relay.zhoushen929.com", - "wss://relay.bitdevs.tw", - "wss://nostr.btczh.tw", - "wss://nostrich.adagio.tw", - "wss://nostr.zoel.network", - "wss://thecitadel.nostr1.com", - "wss://nostr2.daedaluslabs.io", - "wss://fiatjaf.nostr1.com", - "wss://nostr.daedaluslabs.io", - "wss://nostr.gerbils.online", - "wss://jingle.carlos-cdb.top", - "wss://carlos-cdb.top", - "wss://jp.purplerelay.com", - "wss://ir.purplerelay.com", - "wss://me.purplerelay.com", - "wss://nostr.0x7e.xyz", - "wss://strfry.openhoofd.nl", - "wss://nostr.kolbers.de", - "wss://relay.nostr.net", - "wss://v1250.planz.io/nostr", - "wss://relay.13room.space", - "wss://relay.usefusion.ai", - "wss://ae.purplerelay.com", - "wss://nostrasia.mom", - "wss://au.purplerelay.com", - "wss://in.purplerelay.com", - "wss://bostr.bitcointxoko.com", - "wss://test.nfrelay.app", - "wss://relay.fanfares.io", - "wss://relay.varke.eu", - "wss://relay.nostr.jabber.ch", - "wss://ftp.halifax.rwth-aachen.de/nostr", - "wss://tw.purplerelay.com", - "wss://eu.purplerelay.com", - "wss://testnet.plebnet.dev/nostrrelay/1", - "wss://hivetalk.nostr1.com", - "wss://relay.earthly.land", - "wss://relay.piazza.today", - "wss://bostr.nokotaro.work", - "wss://orangepiller.org", - "wss://bostr.nokotaro.com", - "wss://nostr.animeomake.com", - "wss://nostr.openordex.org", - "wss://lnbits.papersats.io/nostrclient/api/v1/relay", - "wss://strfry.chatbett.de", - "wss://nostr.plantroon.com", - "wss://relay.corpum.com", - "wss://relay.proxymana.net", - "wss://nsrelay.assilvestrar.club", - "wss://nostr.atitlan.io", - "wss://relay.livefreebtc.dev", - "wss://nostr.tavux.tech", - "wss://nostr.girino.org", - "wss://relay.nostrich.cc", - "wss://support.nostr1.com", - "wss://ca.purplerelay.com", - "wss://chefstr.nostr1.com", - "wss://nostr.babyshark.win", - "wss://relay.agorist.space", - "wss://relay.nostrhub.fr", - "wss://hk.purplerelay.com", - "wss://lnbits.satoshibox.io/nostrclient/api/v1/relay", - "wss://relay.cosmicbolt.net", - "wss://nostr.drafted.pro", - "wss://nostr.a2x.pub", - "wss://bostr.lightningspore.com", - "wss://de.purplerelay.com", - "wss://obiurgator.thewhall.com", - "wss://slime.church/relay", - "wss://relay.unknown.cloud", - "wss://relay.gems.xyz", - "wss://onlynotes.lol", - "wss://relay2.nostrasia.net", - "wss://relay.zone667.com", - "wss://relay.mostro.network", - "wss://relay5.bitransfer.org", - "wss://brisceaux.com", - "wss://nostr.polonkai.eu", - "wss://libretechsystems.nostr1.com", - "wss://nostr.kloudcover.com", - "wss://relay.alex71btc.com", - "wss://nostr3.daedaluslabs.io", - "wss://relay1.xfire.to:", - "wss://nostr.brackrat.com", - "wss://relay.satlantis.io", - "wss://relay.illuminodes.com", - "wss://relay.arrakis.lat", - "wss://nostr.manasiwibi.com", - "wss://junxingwang.org", - "wss://relay2.angor.io", - "wss://history.nostr.watch", - "wss://relay.angor.io", - "wss://nostr.tbai.me:592", - "wss://strfry.iris.to", - "wss://orangesync.tech", - "wss://nostr.chaima.info", - "wss://relay.minibolt.info", - "wss://kr.purplerelay.com", - "wss://relay.tapestry.ninja", - "wss://fl.purplerelay.com", - "wss://nostr.bilthon.dev", - "wss://relay.gasteazi.net", - "wss://relay.mattybs.lol", - "wss://nostr2.girino.org", - "wss://relay.s-w.art", - "wss://uk.purplerelay.com", - "wss://relay.coinos.io", - "wss://relay.nostriot.com", - "wss://relay.sovereign.app", - "wss://frysian.nostrich.casa", - "wss://memrelay.girino.org", - "wss://relay.lnfi.network", - "wss://relay.nostrdice.com", - "wss://nostr.azzamo.net", - "wss://wheat.happytavern.co", - "wss://strfry.bonsai.com", - "wss://devs.nostr1.com", - "wss://relay.notestack.com", - "wss://relay.sigit.io", - "wss://nostr.noderunners.network", - "wss://thebarn.nostr1.com", - "wss://nostr.grooveix.com", - "wss://travis-shears-nostr-relay-v2.fly.dev", - "wss://nostr.x0f.org", - "wss://bostr.syobon.net", - "wss://art.nostrfreaks.com", - "wss://cobrafuma.com/relay", - "wss://alru07.nostr1.com", - "wss://relay.flirtingwithbitcoin.com", - "wss://relay.nostrpunk.com", - "wss://relay.botev.sv", - "wss://relay.degmods.com", - "wss://untreu.me", - "wss://reimagine.nostr1.com", - "wss://nostr.takasaki.dev", - "wss://nostr.coincrowd.fund", - "wss://nostr.inaridiy.com", - "wss://nostr.community.ath.cx", - "wss://relay.xeble.me", - "wss://strfry.shock.network", - "wss://relay02.lnfi.network", - "wss://filter.weme.wtf", - "wss://relay.nostrfreaks.com", - "wss://cyberspace.nostr1.com", - "wss://nostr-rs-relay.dev.fedibtc.com", - "wss://relay.cyphernomad.com", - "wss://relay.jellyfish.land", - "wss://articles.layer3.news", - "wss://ghost.dolu.dev", - "wss://thebarn.nostrfreaks.com", - "wss://nostr.thebiglake.org", - "wss://nostr-news.nostr1.com", - "wss://nostr.mikoshi.de", - "wss://relay.nuts.cash", - "wss://nostr.agentcampfire.com", - "wss://nostr.me/relay", - "wss://dwebcamp.nos.social", - "wss://henhouse.social/relay", - "wss://relay.stewlab.win", - "wss://relay.crbl.io", - "wss://rl.baud.one", - "wss://schnorr.me", - "wss://relay.axeldolce.xyz", - "wss://relay.i9.eti.br", - "wss://immo.jellyfish.land", - "wss://relay.hunstr.mywire.org", - "wss://pareto.nostr1.com", - "wss://bonifatius.nostr1.com", - "wss://relay.xplbzx.uk", - "wss://nostr.tac.lol", - "wss://btcpay2.nisaba.solutions/nostr", - "wss://nostream-stg.ordlify.com", - "wss://dev-relay.lnfi.network", - "wss://nostr.allgemeinheit.info", - "wss://straylight.cafe/relay", - "wss://relay.bitcoinveneto.org", - "wss://relay.gnostr.cloud", - "wss://nostr-relay.apps.den.ratwater.xyz", - "wss://nostr.red5d.dev", - "wss://relay-testnet.k8s.layer3.news", - "wss://nostr.pistaum.com", - "wss://relay-nwc.rizful.com/v1", - "wss://eupo43gj24.execute-api.us-east-1.amazonaws.com/test", - "wss://backup.keychat.io", - "wss://relay.newatlantis.top", - "wss://relay.openbalance.app", - "wss://nostr-relay.kloudcover.com", - "wss://social.proxymana.net", - "wss://inbox.azzamo.net", - "wss://nostr.lojong.info", - "wss://nostr.nwe.li", - "wss://nostr-rs-relay-ishosta.phamthanh.me", - "wss://nostr.rblb.it:7777", - "wss://nostr.basedpotato.org", - "wss://sources.nostr1.com", - "wss://relay.nostronautti.fi", - "wss://nostr.d3id.xyz/relay", - "wss://relay.nostrtalk.org", - "wss://ditto.openbalance.app/relay", - "wss://relay.tv-base.com", - "wss://nostr.itdestro.cc", - "wss://nostr.tegila.com.br", - "wss://nostream.oviato.com", - "wss://relay.devs.tools", - "wss://relay.stream.labs.h3.se", - "wss://mls.akdeniz.edu.tr/nostr", - "wss://tollbooth.stens.dev", - "wss://nostr.casaalmida.com", - "wss://nostrich.zonemix.tech" - ] - }, - "use_timer": false - }, - "members": [], - "network": "BITCOIN", - "sync_start": 1734717000.774228, - "use_compression": true - }, - "individual_chats_visible": false, - "network": "BITCOIN", - "nostr_protocol": { - "dm_connection_dump": { - "dms_from_dump": [], - "keys": "nsec1sqjw25vvs50wsz85nrxlv0nuvvyaysde0x78r4elsp60dck0dyzqyedxgx", - "relay_list": { - "last_updated": 1734716981.996493, - "max_age": 30, - "relays": [ - "wss://nostr.btc-library.com", - "wss://nostr.hubmaker.io", - "wss://relay.primal.net", - "wss://nostrue.com", - "wss://nostr.schneimi.de", - "wss://nostr.sathoarder.com", - "wss://bitcoiner.social", - "wss://nostr.swiss-enigma.ch", - "wss://nostr.blockpower.capital", - "wss://ch.purplerelay.com", - "wss://relay.poster.place", - "wss://nostr.satstralia.com", - "wss://nostr.einundzwanzig.space", - "wss://nostr.vulpem.com", - "wss://nostr-1.nbo.angani.co", - "wss://relay.wellorder.net", - "wss://relay.dwadziesciajeden.pl", - "wss://e.nos.lol", - "wss://nostr.data.haus", - "wss://nostr21.com", - "wss://relay.nostromo.social", - "wss://offchain.pub", - "wss://nproxy.kristapsk.lv", - "wss://nostr.topeth.info", - "wss://nostr.bitcoiner.social", - "wss://nostr.roundrockbitcoiners.com", - "wss://nr.yay.so", - "wss://nostr.lu.ke", - "wss://relay.nostr.bg", - "wss://slick.mjex.me", - "wss://nostr.yael.at", - "wss://nostr.cercatrova.me", - "wss://nostr.oxtr.dev", - "wss://nostr.liberty.fans", - "wss://nostr.cro.social", - "wss://nostr.ginuerzh.xyz", - "wss://nostr.namek.link", - "wss://nostr-02.dorafactory.org", - "wss://relay.hodl.ar", - "wss://nostr.middling.mydns.jp", - "wss://nostr.filmweb.pl", - "wss://nostr.openhoofd.nl", - "wss://rs2.abaiba.top", - "wss://ithurtswhenip.ee", - "wss://relay2.nostrchat.io", - "wss://relay1.nostrchat.io", - "wss://relay.nostr.hu", - "wss://nostr.dakukitsune.ca", - "wss://nostr.hifish.org", - "wss://nostr2.sanhauf.com", - "wss://nostrua.com", - "wss://relay.nostr.youlot.org", - "wss://relay.nostr.directory", - "wss://relay.wavlake.com", - "wss://nostr.fbxl.net", - "wss://relay.nostrcn.com", - "wss://nostr-01.yakihonne.com", - "wss://relap.orzv.workers.dev", - "wss://wbc.nostr1.com", - "wss://nostr.heliodex.cf", - "wss://nostr-relay.psfoundation.info", - "wss://purplerelay.com", - "wss://soloco.nl", - "wss://nostr.dlsouza.lol", - "wss://relay.kamp.site", - "wss://relay.keychat.io", - "wss://nostr.2b9t.xyz", - "wss://relay.momostr.pink", - "wss://unhostedwallet.com", - "wss://21ideas.nostr1.com", - "wss://nostr.stakey.net", - "wss://unostr.site", - "wss://frens.nostr1.com", - "wss://nostr.dodge.me.uk", - "wss://relay.magiccity.live", - "wss://nostr.notribe.net", - "wss://theforest.nostr1.com", - "wss://us.purplerelay.com", - "wss://nostr1.daedaluslabs.io", - "wss://freelay.sovbit.host", - "wss://nostr.huszonegy.world", - "wss://dev-relay.kube.b-n.space", - "wss://relay.nos.social", - "wss://ditto.slothy.win/relay", - "wss://nostr.javi.space", - "wss://gleasonator.dev/relay", - "wss://bucket.coracle.social", - "wss://relay.artx.market", - "wss://nfrelay.app", - "wss://relay.notoshi.win", - "wss://relay.highlighter.com", - "wss://nostr.petrkr.net/strfry", - "wss://n.ok0.org", - "wss://nostr-02.yakihonne.com", - "wss://nostr-03.dorafactory.org", - "wss://relay.zhoushen929.com", - "wss://relay.bitdevs.tw", - "wss://nostr.btczh.tw", - "wss://nostrich.adagio.tw", - "wss://nostr.zoel.network", - "wss://thecitadel.nostr1.com", - "wss://nostr2.daedaluslabs.io", - "wss://fiatjaf.nostr1.com", - "wss://nostr.daedaluslabs.io", - "wss://nostr.gerbils.online", - "wss://jingle.carlos-cdb.top", - "wss://carlos-cdb.top", - "wss://jp.purplerelay.com", - "wss://ir.purplerelay.com", - "wss://me.purplerelay.com", - "wss://nostr.0x7e.xyz", - "wss://strfry.openhoofd.nl", - "wss://nostr.kolbers.de", - "wss://relay.nostr.net", - "wss://v1250.planz.io/nostr", - "wss://relay.13room.space", - "wss://relay.usefusion.ai", - "wss://ae.purplerelay.com", - "wss://nostrasia.mom", - "wss://au.purplerelay.com", - "wss://in.purplerelay.com", - "wss://bostr.bitcointxoko.com", - "wss://test.nfrelay.app", - "wss://relay.fanfares.io", - "wss://relay.varke.eu", - "wss://relay.nostr.jabber.ch", - "wss://ftp.halifax.rwth-aachen.de/nostr", - "wss://tw.purplerelay.com", - "wss://eu.purplerelay.com", - "wss://testnet.plebnet.dev/nostrrelay/1", - "wss://hivetalk.nostr1.com", - "wss://relay.earthly.land", - "wss://relay.piazza.today", - "wss://bostr.nokotaro.work", - "wss://orangepiller.org", - "wss://bostr.nokotaro.com", - "wss://nostr.animeomake.com", - "wss://nostr.openordex.org", - "wss://lnbits.papersats.io/nostrclient/api/v1/relay", - "wss://strfry.chatbett.de", - "wss://nostr.plantroon.com", - "wss://relay.corpum.com", - "wss://relay.proxymana.net", - "wss://nsrelay.assilvestrar.club", - "wss://nostr.atitlan.io", - "wss://relay.livefreebtc.dev", - "wss://nostr.tavux.tech", - "wss://nostr.girino.org", - "wss://relay.nostrich.cc", - "wss://support.nostr1.com", - "wss://ca.purplerelay.com", - "wss://chefstr.nostr1.com", - "wss://nostr.babyshark.win", - "wss://relay.agorist.space", - "wss://relay.nostrhub.fr", - "wss://hk.purplerelay.com", - "wss://lnbits.satoshibox.io/nostrclient/api/v1/relay", - "wss://relay.cosmicbolt.net", - "wss://nostr.drafted.pro", - "wss://nostr.a2x.pub", - "wss://bostr.lightningspore.com", - "wss://de.purplerelay.com", - "wss://obiurgator.thewhall.com", - "wss://slime.church/relay", - "wss://relay.unknown.cloud", - "wss://relay.gems.xyz", - "wss://onlynotes.lol", - "wss://relay2.nostrasia.net", - "wss://relay.zone667.com", - "wss://relay.mostro.network", - "wss://relay5.bitransfer.org", - "wss://brisceaux.com", - "wss://nostr.polonkai.eu", - "wss://libretechsystems.nostr1.com", - "wss://nostr.kloudcover.com", - "wss://relay.alex71btc.com", - "wss://nostr3.daedaluslabs.io", - "wss://relay1.xfire.to:", - "wss://nostr.brackrat.com", - "wss://relay.satlantis.io", - "wss://relay.illuminodes.com", - "wss://relay.arrakis.lat", - "wss://nostr.manasiwibi.com", - "wss://junxingwang.org", - "wss://relay2.angor.io", - "wss://history.nostr.watch", - "wss://relay.angor.io", - "wss://nostr.tbai.me:592", - "wss://strfry.iris.to", - "wss://orangesync.tech", - "wss://nostr.chaima.info", - "wss://relay.minibolt.info", - "wss://kr.purplerelay.com", - "wss://relay.tapestry.ninja", - "wss://fl.purplerelay.com", - "wss://nostr.bilthon.dev", - "wss://relay.gasteazi.net", - "wss://relay.mattybs.lol", - "wss://nostr2.girino.org", - "wss://relay.s-w.art", - "wss://uk.purplerelay.com", - "wss://relay.coinos.io", - "wss://relay.nostriot.com", - "wss://relay.sovereign.app", - "wss://frysian.nostrich.casa", - "wss://memrelay.girino.org", - "wss://relay.lnfi.network", - "wss://relay.nostrdice.com", - "wss://nostr.azzamo.net", - "wss://wheat.happytavern.co", - "wss://strfry.bonsai.com", - "wss://devs.nostr1.com", - "wss://relay.notestack.com", - "wss://relay.sigit.io", - "wss://nostr.noderunners.network", - "wss://thebarn.nostr1.com", - "wss://nostr.grooveix.com", - "wss://travis-shears-nostr-relay-v2.fly.dev", - "wss://nostr.x0f.org", - "wss://bostr.syobon.net", - "wss://art.nostrfreaks.com", - "wss://cobrafuma.com/relay", - "wss://alru07.nostr1.com", - "wss://relay.flirtingwithbitcoin.com", - "wss://relay.nostrpunk.com", - "wss://relay.botev.sv", - "wss://relay.degmods.com", - "wss://untreu.me", - "wss://reimagine.nostr1.com", - "wss://nostr.takasaki.dev", - "wss://nostr.coincrowd.fund", - "wss://nostr.inaridiy.com", - "wss://nostr.community.ath.cx", - "wss://relay.xeble.me", - "wss://strfry.shock.network", - "wss://relay02.lnfi.network", - "wss://filter.weme.wtf", - "wss://relay.nostrfreaks.com", - "wss://cyberspace.nostr1.com", - "wss://nostr-rs-relay.dev.fedibtc.com", - "wss://relay.cyphernomad.com", - "wss://relay.jellyfish.land", - "wss://articles.layer3.news", - "wss://ghost.dolu.dev", - "wss://thebarn.nostrfreaks.com", - "wss://nostr.thebiglake.org", - "wss://nostr-news.nostr1.com", - "wss://nostr.mikoshi.de", - "wss://relay.nuts.cash", - "wss://nostr.agentcampfire.com", - "wss://nostr.me/relay", - "wss://dwebcamp.nos.social", - "wss://henhouse.social/relay", - "wss://relay.stewlab.win", - "wss://relay.crbl.io", - "wss://rl.baud.one", - "wss://schnorr.me", - "wss://relay.axeldolce.xyz", - "wss://relay.i9.eti.br", - "wss://immo.jellyfish.land", - "wss://relay.hunstr.mywire.org", - "wss://pareto.nostr1.com", - "wss://bonifatius.nostr1.com", - "wss://relay.xplbzx.uk", - "wss://nostr.tac.lol", - "wss://btcpay2.nisaba.solutions/nostr", - "wss://nostream-stg.ordlify.com", - "wss://dev-relay.lnfi.network", - "wss://nostr.allgemeinheit.info", - "wss://straylight.cafe/relay", - "wss://relay.bitcoinveneto.org", - "wss://relay.gnostr.cloud", - "wss://nostr-relay.apps.den.ratwater.xyz", - "wss://nostr.red5d.dev", - "wss://relay-testnet.k8s.layer3.news", - "wss://nostr.pistaum.com", - "wss://relay-nwc.rizful.com/v1", - "wss://eupo43gj24.execute-api.us-east-1.amazonaws.com/test", - "wss://backup.keychat.io", - "wss://relay.newatlantis.top", - "wss://relay.openbalance.app", - "wss://nostr-relay.kloudcover.com", - "wss://social.proxymana.net", - "wss://inbox.azzamo.net", - "wss://nostr.lojong.info", - "wss://nostr.nwe.li", - "wss://nostr-rs-relay-ishosta.phamthanh.me", - "wss://nostr.rblb.it:7777", - "wss://nostr.basedpotato.org", - "wss://sources.nostr1.com", - "wss://relay.nostronautti.fi", - "wss://nostr.d3id.xyz/relay", - "wss://relay.nostrtalk.org", - "wss://ditto.openbalance.app/relay", - "wss://relay.tv-base.com", - "wss://nostr.itdestro.cc", - "wss://nostr.tegila.com.br", - "wss://nostream.oviato.com", - "wss://relay.devs.tools", - "wss://relay.stream.labs.h3.se", - "wss://mls.akdeniz.edu.tr/nostr", - "wss://tollbooth.stens.dev", - "wss://nostr.casaalmida.com", - "wss://nostrich.zonemix.tech" - ] - }, - "use_timer": false - }, - "network": "BITCOIN", - "sync_start": null, - "use_compression": true - } - } - }, + "last_tab_title": "History", "tutorial_index": null, "wallet": { - "VERSION": "0.2.2", + "VERSION": "0.3.3", "__class__": "Wallet", - "_blockchain_height": 875618, - "_tips": [ - 30, - 5 - ], - "auto_opportunistic_coin_select": true, + "cbf_uuid": "a76e038b79f54d749f94413cb3d7d344", "descriptor_str": "wpkh([9a6a2580/84'/0'/0']xpub6DEzNop46vmxR49zYWFnMwmEfawSNmAMf6dLH5YKDY463twtvw1XD7ihwJRLPRGZJz799VPFzXHpZu6WdhT29WnaeuChS6aZHZPFmqczR5K/<0;1>/*)#77mrjnmt", "gap": 20, - "gap_change": 5, "id": "test_custom_wallet_bacon", - "keystores": [ - { - "VERSION": "0.0.2", - "__class__": "KeyStore", - "derivation_path": "/0/*", - "description": "", - "fingerprint": "9A6A2580", - "key_origin": "m/84h/0h/0h", - "label": "Signer 1", - "mnemonic": null, - "network": { - "__enum__": true, - "name": "Network", - "value": "BITCOIN" - }, - "xpub": "xpub6DEzNop46vmxR49zYWFnMwmEfawSNmAMf6dLH5YKDY463twtvw1XD7ihwJRLPRGZJz799VPFzXHpZu6WdhT29WnaeuChS6aZHZPFmqczR5K" - } - ], - "labels": { - "VERSION": "0.1.0", - "__class__": "Labels", - "categories": [ - "KYC Exchange", - "Private" - ], - "data": { - "bc1q8fxfd8jg6s9y66ydpxhmqaaw65f8qeg5huynyq": { - "VERSION": "0.0.3", - "__class__": "Label", - "category": "Private", - "label": null, - "ref": "bc1q8fxfd8jg6s9y66ydpxhmqaaw65f8qeg5huynyq", - "timestamp": 1734716996.16675, - "type": "addr" - }, - "bc1qplw7z8kf3l63ea0y6hyalhqk55fnjex5rhelfc": { - "VERSION": "0.0.3", - "__class__": "Label", - "category": "KYC Exchange", - "label": null, - "ref": "bc1qplw7z8kf3l63ea0y6hyalhqk55fnjex5rhelfc", - "timestamp": 1734716996.839067, - "type": "addr" - }, - "bc1qqluk7cennnnfvuq28v2rcxf9mjkzjkdzlnev45": { - "VERSION": "0.0.3", - "__class__": "Label", - "category": "Private", - "label": null, - "ref": "bc1qqluk7cennnnfvuq28v2rcxf9mjkzjkdzlnev45", - "timestamp": 1734716996.868092, - "type": "addr" - }, - "bc1qyngkwkslw5ng4v7m42s8t9j6zldmhyvrnnn9k5": { - "VERSION": "0.0.3", - "__class__": "Label", - "category": "KYC Exchange", - "label": null, - "ref": "bc1qyngkwkslw5ng4v7m42s8t9j6zldmhyvrnnn9k5", - "timestamp": 1734716996.135044, - "type": "addr" - } + "initialization_tips": [30, 5], + "keystores": [{ + "VERSION": "0.0.2", + "__class__": "KeyStore", + "derivation_path": "/0/*", + "description": "", + "fingerprint": "9A6A2580", + "key_origin": "m/84h/0h/0h", + "label": "Signer 1", + "mnemonic": null, + "network": { + "__enum__": true, + "name": "Network", + "value": "BITCOIN" }, - "default_category": "KYC Exchange" - }, + "xpub": "xpub6DEzNop46vmxR49zYWFnMwmEfawSNmAMf6dLH5YKDY463twtvw1XD7ihwJRLPRGZJz799VPFzXHpZu6WdhT29WnaeuChS6aZHZPFmqczR5K" + }], "network": { "__enum__": true, "name": "Network", "value": "BITCOIN" }, - "refresh_wallet": false - } + "refresh_wallet": false, + "serialize_persistence": { + "VERSION": "0.0.0", + "__class__": "SerializePersistence", + "chain_prune_depth": 10, + "change_set": { + "change_descriptor": "wpkh([9a6a2580/84'/0'/0']xpub6DEzNop46vmxR49zYWFnMwmEfawSNmAMf6dLH5YKDY463twtvw1XD7ihwJRLPRGZJz799VPFzXHpZu6WdhT29WnaeuChS6aZHZPFmqczR5K/1/*)#59p60w58", + "descriptor": "wpkh([9a6a2580/84'/0'/0']xpub6DEzNop46vmxR49zYWFnMwmEfawSNmAMf6dLH5YKDY463twtvw1XD7ihwJRLPRGZJz799VPFzXHpZu6WdhT29WnaeuChS6aZHZPFmqczR5K/0/*)#93ymjmyl", + "indexer": { + "last_revealed": { + "3e480e6ffb6cfd14efabbe329bf16a69f6e1b83d9cc19527bea196fc2640b4fa": 5, + "cf7e4b5ea120ceea5ebf716beb2384475e4b401d4b50322554cd64206e12d813": 30 + } + }, + "local_chain": { + "changes": [{ + "hash": "204b1066e499032c6811c544a9a65940972f2a427b7700000000000000000000", + "height": 942613 + }, { + "hash": "96965c8edc3aad2859c3fe0c87f457ed53a5c2e8ea6f00000000000000000000", + "height": 942614 + }, { + "hash": "8979967d47c6fbea40ba033ee6307d44faffa3c42a0401000000000000000000", + "height": 942615 + }, { + "hash": "1ad046422807a8be6cc4fa983c8982e85bc5fb1d558d00000000000000000000", + "height": 942616 + }, { + "hash": "dc7c8036895cb65adc83bbacb36fc9db8ed59de3fb2100000000000000000000", + "height": 942617 + }, { + "hash": "52eb26b9677ce5183855e5c01306966a605c3566be6701000000000000000000", + "height": 942618 + }, { + "hash": "ae3b0fffd0d903609c249d4d01ad5b04aa3df6c7f10b01000000000000000000", + "height": 942619 + }, { + "hash": "2bac3746f71bd1827a9710b3c2c34c78ffb74c0b50d001000000000000000000", + "height": 942620 + }, { + "hash": "660b6a1b2798dc9a79a41200d3dc522f109925fd31b001000000000000000000", + "height": 942621 + }, { + "hash": "758a0f7bcfa26ea92659d188e7bb2196e05ed7579df800000000000000000000", + "height": 942622 + }, { + "hash": "a08a5956b40fb3a72340ba3f4a9c5e0e9c29ec6a641702000000000000000000", + "height": 942623 + }, { + "hash": "6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000", + "height": 0 + }, { + "hash": "0159cedeeada20181778981a15d5891aa0bc100dbf5303000000000000000000", + "height": 715101 + }, { + "hash": "f88a9bf4f91143ec94f6377cf984b4a629073d817c0703000000000000000000", + "height": 722099 + }, { + "hash": "1ff14cfce48634a19a180939fb9d9cc6f61d9ce0e9cd06000000000000000000", + "height": 724556 + }, { + "hash": "2e0c9a3300fc66fe37f1350726da355eb1b18ce093e506000000000000000000", + "height": 729015 + }, { + "hash": "5f707f6e693ef1d603db610b0b1abc3e059f54551ca900000000000000000000", + "height": 738328 + }, { + "hash": "c26a11b09f5027cbf8d10de3ddafaa6d9c2fc03b74cc06000000000000000000", + "height": 755705 + }, { + "hash": "8ba2ab08e4c5a07d2c134725e787f5fd6e33b611b52207000000000000000000", + "height": 755706 + }, { + "hash": "2b0b1b95202716d7cc85eee0bf9b79ab8e0e89cc3ff906000000000000000000", + "height": 763666 + }, { + "hash": "f84576f635f976d545a1bafb572c0a078858274e7dfd04000000000000000000", + "height": 772472 + }, { + "hash": "12eee689e365399131cd463a696fdb53a3181fdd7a6304000000000000000000", + "height": 772475 + }, { + "hash": "182fd1b3314c0266282127e73ec58ce7c9a50fc8691c04000000000000000000", + "height": 784150 + }, { + "hash": "5a705c483994419f31e04bd078fc0443e55162bb8f6e02000000000000000000", + "height": 798590 + }, { + "hash": "fe64b65cdb28f7cf0b8d0c3fc442f5170e0fab17752c05000000000000000000", + "height": 800671 + }, { + "hash": "51d1ea4745a24f7e9d9a9096e14b4e755291d7496f2802000000000000000000", + "height": 809141 + }, { + "hash": "23eed92a6a43d598a38c8af2b516a79e3b6d67f9c62004000000000000000000", + "height": 810015 + }, { + "hash": "f926a310fa667db6a72a7161d11dc0eccd6399957c0802000000000000000000", + "height": 810541 + }, { + "hash": "75ea3d54bae6e83632eaac413e9f8f39461a9dc30ce200000000000000000000", + "height": 810958 + }, { + "hash": "75829198047fa1fa5da74699e85f3a0701c54427dbb401000000000000000000", + "height": 888082 + }, { + "hash": "db8a47a54558f0d3b6bab94311af2318e705af97958e00000000000000000000", + "height": 905527 + }, { + "hash": "fd4a40cd88f45d62f2c70e06b1870567eb11a6242d7f00000000000000000000", + "height": 905561 + }, { + "hash": "d5b475ecb8e82961f0687e9d5d67f78b51d472ddea4700000000000000000000", + "height": 906278 + }] + }, + "network": "BITCOIN", + "tx_graph": { + "anchors": [{ + "confirmation_block_time": { + "block_id": { + "hash": "0159cedeeada20181778981a15d5891aa0bc100dbf5303000000000000000000", + "height": 715101 + }, + "confirmation_time": 1640096530 + }, + "txid": "c5f3681d9217493d3905f8efd019488dd6a52b0006547afbdf6548675415325d" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "0159cedeeada20181778981a15d5891aa0bc100dbf5303000000000000000000", + "height": 715101 + }, + "confirmation_time": 1640096530 + }, + "txid": "cbc3f5b90158efeda916f21afd9851263c0d330112cad3ba338c377b62173be9" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "f88a9bf4f91143ec94f6377cf984b4a629073d817c0703000000000000000000", + "height": 722099 + }, + "confirmation_time": 1644177996 + }, + "txid": "7af7257653a00b99c7755e93a18ad680aa898667f61f9cffcfc85690214842f8" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "f88a9bf4f91143ec94f6377cf984b4a629073d817c0703000000000000000000", + "height": 722099 + }, + "confirmation_time": 1644177996 + }, + "txid": "801e176f9f95a3e0d4f27f788254a3c1abcc9a57b5b36c25e32baffa12d7a9cf" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "1ff14cfce48634a19a180939fb9d9cc6f61d9ce0e9cd06000000000000000000", + "height": 724556 + }, + "confirmation_time": 1645591495 + }, + "txid": "f165cb8a9fd663f88d4bd8cccb79e959de2f40ad49c857f68968e295482b81a2" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "2e0c9a3300fc66fe37f1350726da355eb1b18ce093e506000000000000000000", + "height": 729015 + }, + "confirmation_time": 1648251171 + }, + "txid": "38e0f51adbcdca328fe278909c67884e0d8e7cca7d6441d99efab14c5fb33308" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "5f707f6e693ef1d603db610b0b1abc3e059f54551ca900000000000000000000", + "height": 738328 + }, + "confirmation_time": 1653772622 + }, + "txid": "22aaece991d6691db60c1efd38b16f8286e30eca34d20b24db47fcd9bcba90a4" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "5f707f6e693ef1d603db610b0b1abc3e059f54551ca900000000000000000000", + "height": 738328 + }, + "confirmation_time": 1653772622 + }, + "txid": "fda8ec5e0cf40736a743e052ef8c95cc86b990b39cf162b764656b7449d09f6f" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "c26a11b09f5027cbf8d10de3ddafaa6d9c2fc03b74cc06000000000000000000", + "height": 755705 + }, + "confirmation_time": 1664149042 + }, + "txid": "95c8fa1e6d69ba5815eff5ee77c693d91af9ff4fb73a01c84889657789589b5e" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "c26a11b09f5027cbf8d10de3ddafaa6d9c2fc03b74cc06000000000000000000", + "height": 755705 + }, + "confirmation_time": 1664149042 + }, + "txid": "b59aaa6e4a7718dcecc94d5a878a4b1b3f1cdcd21aead54c82841e00854b7d55" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "8ba2ab08e4c5a07d2c134725e787f5fd6e33b611b52207000000000000000000", + "height": 755706 + }, + "confirmation_time": 1664149788 + }, + "txid": "ec3e8eca1d71f4784d3b067f5e745d47ed149b93673d5a59cfc99e346640df3c" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "8ba2ab08e4c5a07d2c134725e787f5fd6e33b611b52207000000000000000000", + "height": 755706 + }, + "confirmation_time": 1664149788 + }, + "txid": "f5e85b4153ac94cef95054d0ea058f75d382c08150cc4ad894b703e5ff965d38" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "2b0b1b95202716d7cc85eee0bf9b79ab8e0e89cc3ff906000000000000000000", + "height": 763666 + }, + "confirmation_time": 1668750936 + }, + "txid": "4181148b34f4a149abb25fa5f601531042154102ea2d67851e4fa12da226a8b8" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "2b0b1b95202716d7cc85eee0bf9b79ab8e0e89cc3ff906000000000000000000", + "height": 763666 + }, + "confirmation_time": 1668750936 + }, + "txid": "67b3035d9c43975f41f7d2450d1ea1212a35d09c8709a08d80386552fdcd45a1" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "f84576f635f976d545a1bafb572c0a078858274e7dfd04000000000000000000", + "height": 772472 + }, + "confirmation_time": 1674016749 + }, + "txid": "62e34d86779708b252df6f6bd35788fd730e9198b228bb3153f46e08e42e7792" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "12eee689e365399131cd463a696fdb53a3181fdd7a6304000000000000000000", + "height": 772475 + }, + "confirmation_time": 1674019512 + }, + "txid": "0907f1469877972bd42748a3462f8844c8d699345773a4bc4b709894e660b065" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "182fd1b3314c0266282127e73ec58ce7c9a50fc8691c04000000000000000000", + "height": 784150 + }, + "confirmation_time": 1680759292 + }, + "txid": "57bef04f7c666b8c242e83494cfc5efe14c656ef1035662835f4214dc47f24b5" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "182fd1b3314c0266282127e73ec58ce7c9a50fc8691c04000000000000000000", + "height": 784150 + }, + "confirmation_time": 1680759292 + }, + "txid": "64504e2cb76abcaead57e609699326a3eaf35e71e26ec8f32fd553e7584af47a" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "5a705c483994419f31e04bd078fc0443e55162bb8f6e02000000000000000000", + "height": 798590 + }, + "confirmation_time": 1689296999 + }, + "txid": "782d6f697f1bb0a399fdfecdf1da2bc1137b7c145187013fd5f8064d33261845" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "5a705c483994419f31e04bd078fc0443e55162bb8f6e02000000000000000000", + "height": 798590 + }, + "confirmation_time": 1689296999 + }, + "txid": "8f06b04e8b406aa997d4d6f5b31bc1090c1f4e86178ba5b05adf49ce3b7da574" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "fe64b65cdb28f7cf0b8d0c3fc442f5170e0fab17752c05000000000000000000", + "height": 800671 + }, + "confirmation_time": 1690575400 + }, + "txid": "65efdaf49359fcb3dfb17cbf22f5730de643d2c82bb9e25e468fd951d930f697" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "fe64b65cdb28f7cf0b8d0c3fc442f5170e0fab17752c05000000000000000000", + "height": 800671 + }, + "confirmation_time": 1690575400 + }, + "txid": "80aae3af4125b21eb61adf192c5c8a6fa8ca28c3f91fc21bb7550b0903c72c9c" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "51d1ea4745a24f7e9d9a9096e14b4e755291d7496f2802000000000000000000", + "height": 809141 + }, + "confirmation_time": 1695556676 + }, + "txid": "40418ba1ea031858e96561d91972bd8eddc71791fe891f4c0e2096a51473d94c" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "23eed92a6a43d598a38c8af2b516a79e3b6d67f9c62004000000000000000000", + "height": 810015 + }, + "confirmation_time": 1696076470 + }, + "txid": "0ed401bb489d9f2ca011d2c20f5e821eaeaadc25118a117e2ec136da5bc1b8da" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "23eed92a6a43d598a38c8af2b516a79e3b6d67f9c62004000000000000000000", + "height": 810015 + }, + "confirmation_time": 1696076470 + }, + "txid": "7125c395d10bdaee1088c1f764a20f54f9a1dbc9a4173960009b9975448bdcc9" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "f926a310fa667db6a72a7161d11dc0eccd6399957c0802000000000000000000", + "height": 810541 + }, + "confirmation_time": 1696378127 + }, + "txid": "f653132e2b7d36682d1e506c2eab37b34a1e859770fa4b926c1bb2c6fe3baa94" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "75ea3d54bae6e83632eaac413e9f8f39461a9dc30ce200000000000000000000", + "height": 810958 + }, + "confirmation_time": 1696628613 + }, + "txid": "026477d4cc8818dc6fa726e20105fdd3300eb4dc8c8fef06d702fd5332f6ed9b" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "75ea3d54bae6e83632eaac413e9f8f39461a9dc30ce200000000000000000000", + "height": 810958 + }, + "confirmation_time": 1696628613 + }, + "txid": "2552893e685cf83c0eb5dbc2b96293262dc2a0db0cabf37923794a8d079c22dc" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "75829198047fa1fa5da74699e85f3a0701c54427dbb401000000000000000000", + "height": 888082 + }, + "confirmation_time": 1742147987 + }, + "txid": "70fb951aa0b79c5c4d793cfe60548e8270c2f5db2ff1b9503655450c35556623" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "75829198047fa1fa5da74699e85f3a0701c54427dbb401000000000000000000", + "height": 888082 + }, + "confirmation_time": 1742147987 + }, + "txid": "94c78bf3942f96a7fe39c476ecd0096cbdd23cbc6cf39af198e94e7169702d31" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "db8a47a54558f0d3b6bab94311af2318e705af97958e00000000000000000000", + "height": 905527 + }, + "confirmation_time": 1752507729 + }, + "txid": "a95bd213d9a1c487c9b02e9ff672ce9c181859a510651ca4b970590e3a688aa5" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "db8a47a54558f0d3b6bab94311af2318e705af97958e00000000000000000000", + "height": 905527 + }, + "confirmation_time": 1752507729 + }, + "txid": "d92075f8e1d76a19d5f62c963cb30c28375c2ed3414221289e1d692c38fc4787" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "fd4a40cd88f45d62f2c70e06b1870567eb11a6242d7f00000000000000000000", + "height": 905561 + }, + "confirmation_time": 1752527466 + }, + "txid": "1619a800654ba92f1df44e5582bedd873d7f25e18ca7d69ba02686e37753bc2f" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "fd4a40cd88f45d62f2c70e06b1870567eb11a6242d7f00000000000000000000", + "height": 905561 + }, + "confirmation_time": 1752527466 + }, + "txid": "f32e80a683fdaa590ad4714612afc396c6c7cd55efaaa3ff420a4e3c75f2134b" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "d5b475ecb8e82961f0687e9d5d67f78b51d472ddea4700000000000000000000", + "height": 906278 + }, + "confirmation_time": 1752958279 + }, + "txid": "3337c845c10f0e41b1049da0186cd97d8fbc6c074a258cf5c5ec7886ee811352" + }, { + "confirmation_block_time": { + "block_id": { + "hash": "d5b475ecb8e82961f0687e9d5d67f78b51d472ddea4700000000000000000000", + "height": 906278 + }, + "confirmation_time": 1752958279 + }, + "txid": "5b086b5c6092dd93b9553488cd480cd67dca714540cd7ab9bedd385273e8ca3f" + }], + "first_seen": {}, + "last_evicted": {}, + "last_seen": {}, + "txouts": {}, + "txs": ["01000000010e6bc7b695cc0f6f961455e6d1bddcace39842a6e6b442ab043c6af84b108cae0100000000ffffffff02a99f57050000000016001421be6b5e5f7cc65b319d9a662e31ebab1a418b3a802e00000000000016001424d1675a1f75268ab3dbaaa075965a17dbbb918300000000", "01000000011619a800654ba92f1df44e5582bedd873d7f25e18ca7d69ba02686e37753bc2f0000000000ffffffff012b000000000000000f6a0d234672656553616d6f7572616900000000", "010000000122aaece991d6691db60c1efd38b16f8286e30eca34d20b24db47fcd9bcba90a40100000000ffffffff015002000000000000160014ac300331705cd20c94ad62b5ec54310a2141881a00000000", "01000000014a9847f03cdd4ef35c3e59992a88bec9abb427084bdf0db2c83376c882cba7df0b00000000ffffffff112413000000000000160014c068787f33e7dfa8100555ce3a787f0c02fd8ead64850000000000002200201078047b8d36517d6de0bbdf5a988b070bb2c67adfbec7f6cb1c7878a90e8a691aa6030000000000220020fd0805c5caa4f9007c992ebce4f1da9c7f53943a4960c03cd22ef94bffce4f0d51480000000000001600148db11a62301a61c45410282dc2a0325fdd3cadb8c34800000000000017a91463046359ee0803269b1583f7cc28dc7cf7bd99b3874c3e0500000000001600140cae7573bb093761cf875bb02c09ddae6a44ce6bd86600000000000016001424d1675a1f75268ab3dbaaa075965a17dbbb918300770100000000001600146301ba3ff3ec62ccda3115839647eb4f0c2bd15f4af90000000000001600148fc5e187c1f231bd52c43d1a4a911cd0d2d05e584ddf00000000000016001431eeea988c4cc91bca9b8069ec9bb8e49d3b38c6bf7401000000000017a91407d703465907f130371333ec1c088d86e6a17aa08716950000000000001976a91472fd99aab879affd33857a4fbd1e4c1c8ba2a94888ac8ef000000000000022002073ae08c012901a902b4dcbab5305b84d3973b167cfef75fe1db497056502388ac761000000000000160014317a278be0c26042de4730ac2f18338103694f032f360200000000001600147c37fe42c29c9dec616b25bc9ddb12d9c9b11f50ca4800000000000016001431eeea988c4cc91bca9b8069ec9bb8e49d3b38c666fe317201000000160014eed12e1ba4703f0a6afe1a3dd4a3b1de8680393600000000", "010000000157bef04f7c666b8c242e83494cfc5efe14c656ef1035662835f4214dc47f24b50000000000ffffffff015e01000000000000160014ac300331705cd20c94ad62b5ec54310a2141881a00000000", "010000000157c2fa20d7b78cb8d5aaa053f9e00060feb89a724f3431506ad3dff3856582530900000000ffffffff0ae803000000000000160014104a530761a2c5da4257a8d47cf092349f3542d687f72b0000000000160014d4858f13553bf7d15668e699fcaf54e8a549a31adf0d00000000000017a9144de023f9502429892179f25300af91524ff10300879f9103000000000017a9143905bc57120c9dad857f1015cd36a86cf12f0a1a879f0911000000000016001488451cbbc9babdd1c9289c897f42b59bf04d579ee8030000000000001976a91498b3f6c3eb73c46e9578a51d894b206d65dbf61788ac0f422d0000000000160014db171b69978b1fee51a1618427b6244787c5f2e2a65c10000000000017a9143c99f7b2db9de6a4df397f47bc66cd60838a707887c57f00000000000017a9143e6dc9149bf678d131294fec085a28bec15b21cc876a72d93e0b000000160014da25173faea569421615126eb82ac6dd4105b89200000000", "010000000184aeb297ee24b6eb81026e37458f837422f8091ba52095bbe6ef1cc93a58852c0000000000ffffffff0211ef01000000000022512029fafb33e5e728167bd36f4599e6816216bf62a43ba9145676405a1561c062d5c30200000000000016001480f62b3b2986144b850ed00057330edbf104081800000000", "0100000001c9b37453ac81c87ed728110753921f6b1792e8eeb94d8405f164d6691f965f140000000000fdffffff050000000000000000136a11546f6d2048206c6f766573206261636f6e3408000000000000160014f705fe23fe55f9b3dee90126af938a95ff52cb0234080000000000002251209eb331ed094250e32a02ca47093b155c10c7ba79de74fafdddcfb3651df339b734080000000000001976a914bb143045695fade0d57249a7abcd8baabd1a14bd88acb0080000000000001600148f67a1a951b0ad28797c60e4e14fcc197b5f43d000000000", "0100000001d92075f8e1d76a19d5f62c963cb30c28375c2ed3414221289e1d692c38fc47870000000000ffffffff011d000000000000000f6a0d234672656553616d6f7572616900000000", "020000000105341123600356bf90679b7339361976b7da5e97f4d94723fa0d22461e3ec3cf5a0000000000000080027105000000000000160014c02aee140c200c4e204d1adf5ce7507d7a3d8f47591b000000000000160014841ec205002c2b54a0c2d5a7cb5e6b1999cee44a00000000", "02000000010ed401bb489d9f2ca011d2c20f5e821eaeaadc25118a117e2ec136da5bc1b8da0100000000ffffffff01f4010000000000001600140388e59bfe6deea3b8c232b583b2919de13c3de100000000", "02000000012552893e685cf83c0eb5dbc2b96293262dc2a0db0cabf37923794a8d079c22dc0e00000000ffffffff019601000000000000160014e2f6c99e7f9431477ec7bdf1380784292928a5f300000000", "020000000140418ba1ea031858e96561d91972bd8eddc71791fe891f4c0e2096a51473d94c0000000000ffffffff019c010000000000001600142536c46ebc96607f7041434033207b7c16f581d700000000", "02000000015575a9ac8d4b21d205f872d5286cc0f3138a4797898235966b87a6f9096a5102000000000000000080028b01000000000000160014355e773cde13fa43dc65cba76218512824592c97cb9d000000000000160014040c593428df7c22697bc3126295650de6ee153200000000", "02000000015b086b5c6092dd93b9553488cd480cd67dca714540cd7ab9bedd385273e8ca3f0000000000ffffffff014a010000000000001600141ef97891158848014f1775bea82f1dc289a4f34500000000", "02000000015e067387acb16602887de77bd1e0b562f52f97359ff56be2fa437267d3dc413d0100000000fdffffff020e57000000000000160014770ea7b5e2c62e70b8a2828e4ff9baef3663c8f594e13400000000001600143c14820c5349e7df9453a40bc33b55548c811dff00000000", "02000000016164311cb58a0ea83773058c2b25c22bbd1af38f7a141aee41a6181961acc2940900000000fdffffff032a1c0000000000001600141bf50057c8ce420853f53714d0f00eacb2274d53d837010000000000160014d9dda0affbec593b37d9ebbbec433824fb56c51bf836bd0b00000000160014f95fcead5c985ef732cb9a232bb95ccc66ce3ade00000000", "020000000162e34d86779708b252df6f6bd35788fd730e9198b228bb3153f46e08e42e77920000000000ffffffff015203000000000000160014c0c23a9217aadd42434b8c62a407565c90b7e83f00000000", "020000000165efdaf49359fcb3dfb17cbf22f5730de643d2c82bb9e25e468fd951d930f6970000000000ffffffff01624e000000000000160014fcc5e86336ad4c6826ca8b5b56a4e4cf22ad07d300000000", "020000000167b3035d9c43975f41f7d2450d1ea1212a35d09c8709a08d80386552fdcd45a10100000000ffffffff01bc240000000000001600145fc8e854994406f93ea5c7f3abccc5d319ae2a3100000000", "020000000170afb4586209f6136541a166858c90f19bbb3e32775d247439a6a11da8f0749b0100000000ffffffff570903000000000000225120d67e4935b58c715f08f5148daf69532b624305348fa19f406a8565e6029ef63ae9020000000000002251202a56c4412beca184c3c7d19bb1c77840c414608616cf02708915fb14f4c9c7e3c90200000000000017a91405a2c9fe5b165323424c819ea22fd38b33ab54b087c9020000000000002251203d0a79af0c935ea45ef873020bd658cdda9302e43948ac0c1ea0286111b1f34c090300000000000022512037e5c0632d0774f894eb028e47d06f999f5d11c179d5be21c798885856f9934ac902000000000000225120b344d8c7764f46dcc5ac60bfdc175ee1b8afa978b65c630348bb799ea8c1c909e902000000000000225120e8d106b08f964760e8b883c97c28ff85d5a3df6bd63d83d88e41afb22ee1e9e6c90200000000000022512099e36900520326c770b3917bf77ffd9eb61d96a9a0d2c42dd16b5ece4bfa8050c902000000000000225120e3e36aaff52ea19a4c87f9daafec9b375aa60a4c534236f5eabfc7f7365c061ae902000000000000225120fb24d64f8e25502f6aff581de44de271e5c83c3f4253f0b11f6b60e6fe4ae741e40200000000000016001456b6c423618c9fe9d4938a8bf894af558103f677c9020000000000002251202698023591c36608c28cc6a61a96c57e7a59e9a2a70a3d2681f922d10acab7b7e9020000000000002251203b0a582ad6e6842341541aa1acb8ba3c043282a1c2ac1b789176d7c3a2474b78c602000000000000225120d00f51ee0433bc14a639281bfe216683b91960c973db4343582e724a4898bbb72c030000000000001600147941dad331c73222dd6475a6f2820034048c710aec0200000000000022512043082001e992377691637de86db81b530bc9df39cc9a58fcd1b2ee5d4953004e090300000000000017a914c0f096cf9e9b9512d90a97b33dcd6fad1226d04387c9020000000000002251204bd88c3434cffdf5b0841f15727ba12e12e31dba3078ebb30bd68f20babe5cb4e90200000000000017a914fa7c980d04b1d3a3a995d391e67f1c738836bf9a872903000000000000225120616e7dd915805783d071b3f8c5ebdd014350cbc8f59f1207b41a8a2cd819b6bfc902000000000000225120fb28d1f73fbb6e56f586c3a96fee0686e10f15ec28f1d6fee8f96880914f8c6dc9020000000000001976a914d82204a0812037fc0d5424cc04c04a12297c842d88ac0c030000000000002251207c46aa4a0a984f9a34810d38a66cfc356cf09f1f55800d1adcb8ffc98fc200840c030000000000002251204188c16d65d149270c51b8ff64ec742fcd9c26b110e88fe8691bcf77c2f2eee0e9020000000000002251207a065ffb1fa7ced435e010f38f3cab01cb56ff3cf921b66e7418dc9df3b667c60903000000000000225120e0a06fc315a6d98b4e350c53ada5cb68c39c7eeca18da610a5d9b9b2c8e01cf3c9020000000000002251209bf9522187bdc32011af5ca723c0ec2fb843be7471b04ba783db550068f3b723e90200000000000022002045811cbb0e55b186fec90aebef550d72a085ade55572ee325ae5b6432ec83c380903000000000000160014ffb1fa9e82a05fa077dae09a819779ea9cda2fd4c902000000000000225120655cebb0570048cddb1338469d0109fdb5e28a5cc1181b9f9b7e8816cc0990aa0903000000000000225120bda54f6a544c74228ece050ca257c5f38999093324e7b68ec275833f96e29f25e902000000000000225120dfdbb980bf25bf51d2abc4ae789d1766d07e6489367294a1bd18ef003160e48f290300000000000022512074c6a6a70247ffe52b1bf3867b8d9ad35ea0572f78138654ea84e7fcd7ab3423c90200000000000022512066bd6ed7550f73dafacadaf290b9bc396dd37765c40ae2d5b87ad752dddc8209c90200000000000022512068230c72a257f677b83f77c23d76fcbac95e97d6d31cf1561a87931108c53a1dc90200000000000017a914503ea57c7ffb7fccd3a8e5826d11ee7d6a74687187e90200000000000022512032651dc574a0459db28f8351caef3e5797e6471983592430a1d31cae3997f27be9020000000000001600142a94c953ec91f30b10ce3be6f9d72a8decaa94a8e902000000000000225120817169da9439e5bf04529d6c5bc7c3d3f147b59682c123300f67ce57974d49ece902000000000000225120b9a2a4d75102e1affd74d398b0cf6a6ec0a742ac9ec4e002ceb7f30be6c1ef91e902000000000000225120c8d3ebb267e40b390b2f13deeb6a8445b5dcddeb9439a2a8c012a8ba71bec5e0e9020000000000002251200edf8210687a8cfdec45914e2d633637e8738016d1b46ccaed89fd3ae691b8080b030000000000002251205f31319b34b088899c9ccabbbda3de2bd0871470403625bc4d8190bb0f6383580b03000000000000225120ad2fec34b9b274e58788652fdcbab02ba8b997a895fae09a58851ad47f98014c0703000000000000225120fd590ad8ff2b23fbcfdd8262b190f1f2119b08761d81ad993027d4e0655e462ce902000000000000225120f82d640d78a4b7677853e0e030defb9bfad50e308aa7c882e467e434d5fc74abe9020000000000002251207cfb21dd6351783914670ae7f978689090bbc99539bc5a51415e8997755629aae90200000000000017a914125c8f972b50e85caa949fdaf77d543ce956a4ff87e9020000000000002251203761cd98c864313d77c92d88cfa75c726cdbb543886cb3e7ae44a3a38522806b2903000000000000220020aa4e7121005beeb6be38be8e7ece090cbd0528cf110d4cab283d5a9ad5a741cce9020000000000002251200ec638a467dd41b09bf258e4e2a59963b439f21edd103d100df17b8db588020009030000000000002251205e94baff00b576cb49e00cbb291bb9aee8ced8dec4df0f904d08b0381b313103e902000000000000225120be2d89fddd4ca03291fd3e8234989f7be42fe235d1a7c1591618d2873ccd2334e902000000000000225120ca74f19869d8dc7c8a7a4395563a9ff2937175d08f3cf32b88ffa23fd32969e5e9020000000000002251201989e84d60f1e0432dc673bcd48c0b913a84ae690411ab22fa0a8a158a23cd2231030000000000002251203717cb0b652220121c7216df80e3456fdf356224667e9efdaaef10751f4d8a62e902000000000000225120f184e338c812f58a0723b389686c108bc8fc99839295ecb00f56aedbd2100077a9020000000000002251206152577c88e54083e7f86d74c26b28d600b65455863d08364f431b49c44bdbfba602000000000000225120510194d1d771c43b369ef845d0cc0ca3de3fd86ca903b992e45bd70098ad91390903000000000000225120c7ae5917bd5be0de4cb28f96f5991b0c36694ad2e17efc8005b8f1cd3749c742090300000000000016001446d732a5a5c82ff6b306907630f455c9b3bb2932c902000000000000225120af3f43ae1cc5b33e6c2b5d88109244a4c628f11bf08eba3c77bf0e89148c7019e90200000000000022512034d81a4aef75b55ea7b5738e9d5d7692937cc7d75b7d3c9de14d7a8680f81392e90200000000000022512011662dc339bbf53022dae41e263465596766d202a8444ca1d3e2bdc4ff5c8564e90200000000000017a9149027f9d0b6f4c593247c3a3bffe93758f69f5c9d87e902000000000000225120a16a82aae848dd218374933260c40522acd7cfc1dc55b0f7c97dced51de804a0c902000000000000225120a9c92e22a7f4bf56396182d5bc09e801451e753e25b1408fc2198171a99ee312c9020000000000002251209a79105afc5a62c24658d2e5a8d0f525c4b3bd8d567a5e926ad69e759bf41bc381020000000000002251208463abff91c5122dfa92cf16c4155918c6e9bfa3a2e9c4ef0decabc5b03ee803ec02000000000000225120f3db157a4196fc1ff62b8343e4bda53ba96f65061e47b71a1267bf3300bd851a4c030000000000002251209c22971c55419d7332b3aab452e35dfa89d38fd714a79d1b7ccf812a53990dade902000000000000225120acfce4cb3be96e8492a8048189673dd6c200c4d791ee2d78894dcbb9518574fce902000000000000225120bf4c9034b71f34485244254b17b801e19a3eb9f1cc87fa2a5c2c6c5a3d6e59fce90200000000000022512064b962c5010809c091b4831f7b2e276a37b7750f820d38225d69b5b3ecada4ee29030000000000001976a91467de17cbc58324087553b3133e32c8643749884588ace902000000000000225120e3a6bc7d1f1abfd256bb9f59c625e801fa10ab1be02e5d5ad880de9cd349def3c602000000000000225120e5ba87ec6b1b46decd3d03cc73f53adc3b2f3f2d7a337c4479512379e84daba5e902000000000000225120884a93adf1f0a76e4ee5a5dad17c7ee3159616dccbf900e69b2f6599212c973fc902000000000000160014e587b419f60313b2319237c3b9be7b27f4082235e902000000000000225120e605f63484467ce41fba379e08f6b6f1d88adb6891b7b99cb1e9951d6ada6d11e9020000000000002251201fb733197c74ee63aa6e5d1d8d8be4d4954290a653e0f5dc9138f1dfe660d924c6020000000000002251202622cd202fb2cadddefd4d7ac54fb9fc98cf2f4b02f3d8e4ba4162e4ea253dd20903000000000000225120e94e65ea966754abddf71bcc77b141a813d99b097e7fe29b14443f6a9efbcf1ae9020000000000001600146ec573c17efa73e5da9ccdf954a4f3b5b098d0b909030000000000002251200bc6f49a9a3e78355f17d24cdf5afe085ff7f983ea650983a05c9a49dc36f2678602000000000000225120bc982b0c4e91ee891c520ff81b6ee1a7c96e8ffb5de5c6e87bcfa99a525cd0bbe9020000000000002251200197675180094093a6f29cef7236c503c7fad75273744b891317c91509a9254100000000", "020000000170fb951aa0b79c5c4d793cfe60548e8270c2f5db2ff1b9503655450c355566230600000000ffffffff012302000000000000160014c74bfce5b9a7b7a145f0fc5efd395da76fe92a0600000000", "02000000018f06b04e8b406aa997d4d6f5b31bc1090c1f4e86178ba5b05adf49ce3b7da5740100000000ffffffff018601000000000000160014e9907d1e2105fee921c1dabecf683fbb950dee2400000000", "020000000190bbbbcef479e5c7f56c947684f475c2267b0fdef86c45b68cf340096540f61ee700000000fdffffff0216040000000000001600141f57c20b7b6cfec647a8188ceeab3cc2ef0832b2b47f11000000000016001466530aeea33d87fa91071164a83e474556ea47ff00000000", "020000000195c8fa1e6d69ba5815eff5ee77c693d91af9ff4fb73a01c84889657789589b5e0000000000ffffffff017d0300000000000016001459c2519bbc588a94b6ffa6aefcf696e2a75f8afe00000000", "020000000195c8fa1e6d69ba5815eff5ee77c693d91af9ff4fb73a01c84889657789589b5e010000000000000080020e04000000000000160014b2dab0057746982386c2bc48577b0edcbc089bebb916000000000000160014a31aba6190c6f3b545d22c2a266c8c352bf05ea100000000", "0200000001b22daf183be5805d1739442c4bb1bef8c3f5334cc758f90efb6ca5caef541c890000000000000000800126020000000000001600147941dad331c73222dd6475a6f2820034048c710a00000000", "0200000001dc8d9522cd30e4bd11a6c740fcf48f935357a90155a9bd8cd85437090c4f6a352b00000000000000000250c30000000000001600143a4c969e48d40a4d688d09afb077aed51270651418451c0300000000160014ac8f3db3d1194362c8ee598b1e2383c03ce9bd4400000000", "0200000001ec3e8eca1d71f4784d3b067f5e745d47ed149b93673d5a59cfc99e346640df3c0000000000ffffffff011a02000000000000160014fc9f3ce7553d16d3975e12cb3a3595537e67064200000000", "0200000001ec4965f1bae756fa8a300d47a329dc8c02c95397f1d078ae121205ea55f68cbe0100000000000000800234080000000000001600144594ca7137971855d244da06dfb464b8aa13bee3cb2c020000000000160014b5c19582f593769e88bbb5a8068fbe964d37988a00000000", "02000000019acc65d2daecd5f7f4663ec8a4f031e975891034183c7aca1f366555b0b3d2e40000000000fdffffff018d4502000000000016001424d1675a1f75268ab3dbaaa075965a17dbbb91834ee90a00", "0200000001c5f3681d9217493d3905f8efd019488dd6a52b0006547afbdf6548675415325d0000000000fdffffff015c430200000000001600144bce0fd21a3dae159ba5364305b697269f470e4c5ce90a00", "0200000001801e176f9f95a3e0d4f27f788254a3c1abcc9a57b5b36c25e32baffa12d7a9cf0000000000fdffffff01dfc20000000000001976a9149963c8b13ab547d7269fc67329dc04ea1e8b221b88acb1040b00", "0200000002f165cb8a9fd663f88d4bd8cccb79e959de2f40ad49c857f68968e295482b81a20000000000fdffffff4259118fe92f729c5866f6e404f0ff532b42c77dac5f3daf780bcee366f391ae0c00000000fdffffff01186e4e00000000001976a9149963c8b13ab547d7269fc67329dc04ea1e8b221b88acb61f0b00", "02000000017fb22884820d4fde670110648f1c943ca41f9137ae550e66768d602e9308d74c0100000000fdffffff02a406000000000000160014ce4107f3a8dd2a0c9f07153f3a8728bb114a5cebe8030000000000001600147941dad331c73222dd6475a6f2820034048c710a46490c00", "02000000010f5278b2f09a0ebe65e20d574ae184d060d3f6d5cbca3ed00da2103038b6c55e0000000000fdffffff02391b0000000000001600140fdde11ec98ff51cf5e4d5c9dfdc16a5133964d4e5210e000000000016001477d79e66ed87a43840264e3f725e25705724770b36d10d00"] + } + }, + "restrict_chain_changes": true + } + }, + "warned_change_without_input_txids": [] } \ No newline at end of file diff --git a/tests/gui/qt/test_default_network_config.py b/tests/gui/qt/test_default_network_config.py index bec55e18..3f0f6b81 100644 --- a/tests/gui/qt/test_default_network_config.py +++ b/tests/gui/qt/test_default_network_config.py @@ -95,8 +95,16 @@ def sync() -> None: shutter.save(main_window) + tx_list = qt_wallet.wallet.sorted_delta_list_transactions() # Sanity check that some transaction history is available. - assert len(qt_wallet.wallet.sorted_delta_list_transactions()) >= 28 + assert len(tx_list) >= 28 + assert tx_list[0].txid == "5d321554674865dffb7a5406002ba5d68d4819d0eff805393d4917921d68f3c5" + + # The bacon wallet fixture has only spent outputs, so each address balance is zero. + addresses = qt_wallet.wallet.get_addresses() + assert addresses + for address in addresses: + assert qt_wallet.wallet.get_addr_balance(address).total == 0 sync() diff --git a/tests/helpers.py b/tests/helpers.py index 07f76114..85473beb 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -56,13 +56,19 @@ def _configure_network_backend(config: TestConfig, backend: str, fulcrum: str | config.network_config.manual_peers.append( Peer.parse(url=f"{BITCOIN_HOST}:{BITCOIN_LISTEN_PORT}", network=config.network) ) - config.network_config.p2p_autodiscover_additional_peers = False + + # additional peers only on mainnet + config.network_config.p2p_autodiscover_additional_peers = config.network == bdk.Network.BITCOIN else: assert fulcrum, "Fulcrum backend requested but no server URL provided" config.network_config.server_type = BlockchainType.Electrum - config.network_config.electrum_url = fulcrum - config.network_config.electrum_use_ssl = False - config.network_config.p2p_listener_type = P2pListenerType.deactive + + if config.network == bdk.Network.BITCOIN: + pass + else: + config.network_config.electrum_url = fulcrum + config.network_config.electrum_use_ssl = False + config.network_config.p2p_listener_type = P2pListenerType.deactive class TestConfig(UserConfig): @@ -93,9 +99,10 @@ def test_config_session(backend: str, fulcrum: str | None) -> TestConfig: @pytest.fixture() -def test_config_main_chain() -> TestConfig: +def test_config_main_chain(backend: str, fulcrum: str | None) -> TestConfig: """Test config main chain.""" config = TestConfig() logger.info(f"Setting config_dir = {config.config_dir} and config_file = {config.config_file}") + _configure_network_backend(config, backend, fulcrum) return config diff --git a/tests/non_gui/test_wallet.py b/tests/non_gui/test_wallet.py index a1d9afd1..5eeb9e5c 100644 --- a/tests/non_gui/test_wallet.py +++ b/tests/non_gui/test_wallet.py @@ -29,18 +29,14 @@ from __future__ import annotations -import asyncio import logging -import bdkpython as bdk import pytest from bitcoin_safe.wallet import Wallet, WalletInputsInconsistentError from ..helpers import TestConfig -from .test_signers import bacon_seed from .utils import ( - create_keystore, create_multisig_protowallet, create_test_seed_keystores, ) @@ -412,40 +408,3 @@ def test_wallet_dump_and_restore(test_config: TestConfig) -> None: assert len(wallet.keystores) == len(restored_wallet.keystores) for org_keystore, restored_keystore in zip(wallet.keystores, restored_wallet.keystores, strict=False): assert org_keystore.is_equal(restored_keystore) - - -def test_bacon_wallet_tx_are_fetched(test_config_main_chain: TestConfig) -> None: - """Test bacon wallet tx are fetched.""" - wallet_id = "bacon wallet" - expected_descriptor = "wpkh([9a6a2580/84h/0h/0h]xpub6DEzNop46vmxR49zYWFnMwmEfawSNmAMf6dLH5YKDY463twtvw1XD7ihwJRLPRGZJz799VPFzXHpZu6WdhT29WnaeuChS6aZHZPFmqczR5K/<0;1>/*)#fkxd7j3k" - - keystore = create_keystore( - seed_str=bacon_seed, key_origin="m/84h/0h/0h", label=wallet_id, network=bdk.Network.BITCOIN - ) - - # Create a mainnet wallet from the bacon seed descriptor. - wallet = Wallet( - id=wallet_id, - descriptor_str=expected_descriptor, - keystores=[keystore], - network=test_config_main_chain.network, - config=test_config_main_chain, - loop_in_thread=None, - ) - - assert not wallet.is_multisig() - - assert wallet.get_addresses()[0] == "bc1qyngkwkslw5ng4v7m42s8t9j6zldmhyvrnnn9k5" - # Trigger sync and ensure transactions are loaded. - wallet.trigger_sync() - asyncio.run(wallet.update()) - - tx_list = wallet.sorted_delta_list_transactions() - assert len(tx_list) >= 28 - assert tx_list[0].txid == "5d321554674865dffb7a5406002ba5d68d4819d0eff805393d4917921d68f3c5" - - # Check that spent UTXOs do not count into the address balance. - addresses = wallet.get_addresses() - assert addresses - for address in addresses: - assert wallet.get_addr_balance(address).total == 0