diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index f59d350f1..1b08b7c2e 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -29,7 +29,7 @@ from typing import TYPE_CHECKING, Dict, Optional from . import bitcoin from .bitcoin import COINBASE_MATURITY, TYPE_ADDRESS, TYPE_PUBKEY -from .util import PrintError, profiler, bfh, VerifiedTxInfo, TxMinedStatus +from .util import PrintError, profiler, bfh, TxMinedInfo from .transaction import Transaction, TxOutput from .synchronizer import Synchronizer from .verifier import SPV @@ -70,11 +70,15 @@ class AddressSynchronizer(PrintError): self.transaction_lock = threading.RLock() # address -> list(txid, height) self.history = storage.get('addr_history',{}) - # Verified transactions. txid -> VerifiedTxInfo. Access with self.lock. + # Verified transactions. txid -> TxMinedInfo. Access with self.lock. verified_tx = storage.get('verified_tx3', {}) - self.verified_tx = {} + self.verified_tx = {} # type: Dict[str, TxMinedInfo] for txid, (height, timestamp, txpos, header_hash) in verified_tx.items(): - self.verified_tx[txid] = VerifiedTxInfo(height, timestamp, txpos, header_hash) + self.verified_tx[txid] = TxMinedInfo(height=height, + conf=None, + timestamp=timestamp, + txpos=txpos, + header_hash=header_hash) # Transactions pending verification. txid -> tx_height. Access with self.lock. self.unverified_tx = defaultdict(int) # true when synchronized @@ -562,7 +566,7 @@ class AddressSynchronizer(PrintError): if new_height == tx_height: self.unverified_tx.pop(tx_hash, None) - def add_verified_tx(self, tx_hash: str, info: VerifiedTxInfo): + def add_verified_tx(self, tx_hash: str, info: TxMinedInfo): # Remove from the unverified map and add to the verified map with self.lock: self.unverified_tx.pop(tx_hash, None) @@ -605,19 +609,18 @@ class AddressSynchronizer(PrintError): return cached_local_height return self.network.get_local_height() if self.network else self.storage.get('stored_height', 0) - def get_tx_height(self, tx_hash: str) -> TxMinedStatus: - """ Given a transaction, returns (height, conf, timestamp, header_hash) """ + def get_tx_height(self, tx_hash: str) -> TxMinedInfo: with self.lock: if tx_hash in self.verified_tx: info = self.verified_tx[tx_hash] conf = max(self.get_local_height() - info.height + 1, 0) - return TxMinedStatus(info.height, conf, info.timestamp, info.header_hash) + return info._replace(conf=conf) elif tx_hash in self.unverified_tx: height = self.unverified_tx[tx_hash] - return TxMinedStatus(height, 0, None, None) + return TxMinedInfo(height=height, conf=0) else: # local transaction - return TxMinedStatus(TX_HEIGHT_LOCAL, 0, None, None) + return TxMinedInfo(height=TX_HEIGHT_LOCAL, conf=0) def set_up_to_date(self, up_to_date): with self.lock: diff --git a/electrum/gui/qt/history_list.py b/electrum/gui/qt/history_list.py index d5dbd1071..b60f29d5f 100644 --- a/electrum/gui/qt/history_list.py +++ b/electrum/gui/qt/history_list.py @@ -31,7 +31,7 @@ from collections import OrderedDict from electrum.address_synchronizer import TX_HEIGHT_LOCAL from electrum.i18n import _ -from electrum.util import block_explorer_URL, profiler, print_error, TxMinedStatus, OrderedDictWithIndex +from electrum.util import block_explorer_URL, profiler, print_error, TxMinedInfo, OrderedDictWithIndex from .util import * @@ -275,7 +275,7 @@ class HistoryList(MyTreeView, AcceptFileDragDrop): value = tx_item['value'].value balance = tx_item['balance'].value label = tx_item['label'] - tx_mined_status = TxMinedStatus(height, conf, timestamp, None) + tx_mined_status = TxMinedInfo(height=height, conf=conf, timestamp=timestamp) status, status_str = self.wallet.get_tx_status(tx_hash, tx_mined_status) has_invoice = self.wallet.invoices.paid.get(tx_hash) v_str = self.parent.format_amount(value, is_diff=True, whitespaces=True) diff --git a/electrum/tests/test_wallet.py b/electrum/tests/test_wallet.py index 275f20bba..aaa7ad107 100644 --- a/electrum/tests/test_wallet.py +++ b/electrum/tests/test_wallet.py @@ -11,7 +11,7 @@ from io import StringIO from electrum.storage import WalletStorage, FINAL_SEED_VERSION from electrum.wallet import Abstract_Wallet from electrum.exchange_rate import ExchangeBase, FxThread -from electrum.util import TxMinedStatus +from electrum.util import TxMinedInfo from electrum.bitcoin import COIN from . import SequentialTestCase @@ -99,7 +99,7 @@ class FakeWallet: def get_tx_height(self, txid): # because we use a current timestamp, and history is empty, # FxThread.history_rate will use spot prices - return TxMinedStatus(height=10, conf=10, timestamp=time.time(), header_hash='def') + return TxMinedInfo(height=10, conf=10, timestamp=int(time.time()), header_hash='def') default_fiat_value = Abstract_Wallet.default_fiat_value price_at_timestamp = Abstract_Wallet.price_at_timestamp diff --git a/electrum/util.py b/electrum/util.py index 047206e6b..f770c67cc 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -879,18 +879,12 @@ def ignore_exceptions(func): return wrapper -class TxMinedStatus(NamedTuple): - height: int - conf: int - timestamp: Optional[int] - header_hash: Optional[str] - - -class VerifiedTxInfo(NamedTuple): - height: int - timestamp: int - txpos: int - header_hash: str +class TxMinedInfo(NamedTuple): + height: int # height of block that mined tx + conf: Optional[int] = None # number of confirmations (None means unknown) + timestamp: Optional[int] = None # timestamp of block that mined tx + txpos: Optional[int] = None # position of tx in serialized block + header_hash: Optional[str] = None # hash of block that mined tx def make_aiohttp_session(proxy: dict, headers=None, timeout=None): diff --git a/electrum/verifier.py b/electrum/verifier.py index 27913ce13..247d124db 100644 --- a/electrum/verifier.py +++ b/electrum/verifier.py @@ -26,7 +26,7 @@ from typing import Sequence, Optional, TYPE_CHECKING import aiorpcx -from .util import bh2u, VerifiedTxInfo, NetworkJobOnDefaultServer +from .util import bh2u, TxMinedInfo, NetworkJobOnDefaultServer from .crypto import sha256d from .bitcoin import hash_decode, hash_encode from .transaction import Transaction @@ -124,8 +124,11 @@ class SPV(NetworkJobOnDefaultServer): except KeyError: pass self.print_error("verified %s" % tx_hash) header_hash = hash_header(header) - vtx_info = VerifiedTxInfo(tx_height, header.get('timestamp'), pos, header_hash) - self.wallet.add_verified_tx(tx_hash, vtx_info) + tx_info = TxMinedInfo(height=tx_height, + timestamp=header.get('timestamp'), + txpos=pos, + header_hash=header_hash) + self.wallet.add_verified_tx(tx_hash, tx_info) if self.is_up_to_date() and self.wallet.is_up_to_date(): self.wallet.save_verified_tx(write=True)