diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index 089f06920..7e313e80a 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -99,7 +99,7 @@ class AddressSynchronizer(Logger): def synchronize(self): pass - def is_mine(self, address): + def is_mine(self, address) -> bool: return self.db.is_addr_in_history(address) def get_addresses(self): diff --git a/electrum/plugins/hw_wallet/plugin.py b/electrum/plugins/hw_wallet/plugin.py index fd3ed6979..8d3970524 100644 --- a/electrum/plugins/hw_wallet/plugin.py +++ b/electrum/plugins/hw_wallet/plugin.py @@ -132,14 +132,13 @@ class HW_PluginBase(BasePlugin): return self._ignore_outdated_fw -def is_any_tx_output_on_change_branch(tx: Transaction): +def is_any_tx_output_on_change_branch(tx: Transaction) -> bool: if not tx.output_info: return False for o in tx.outputs(): info = tx.output_info.get(o.address) if info is not None: - if info.address_index[0] == 1: - return True + return info.is_change return False diff --git a/electrum/plugins/keepkey/keepkey.py b/electrum/plugins/keepkey/keepkey.py index 549de1558..b39509fa2 100644 --- a/electrum/plugins/keepkey/keepkey.py +++ b/electrum/plugins/keepkey/keepkey.py @@ -407,7 +407,7 @@ class KeepKeyPlugin(HW_PluginBase): return inputs - def tx_outputs(self, derivation, tx): + def tx_outputs(self, derivation, tx: Transaction): def create_output_by_derivation(): script_type = self.get_keepkey_output_script_type(info.script_type) @@ -454,10 +454,9 @@ class KeepKeyPlugin(HW_PluginBase): info = tx.output_info.get(address) if info is not None and not has_change: index, xpubs, m = info.address_index, info.sorted_xpubs, info.num_sig - on_change_branch = index[0] == 1 # prioritise hiding outputs on the 'change' branch from user # because no more than one change address allowed - if on_change_branch == any_output_on_change_branch: + if info.is_change == any_output_on_change_branch: use_create_by_derivation = True has_change = True diff --git a/electrum/plugins/ledger/ledger.py b/electrum/plugins/ledger/ledger.py index ac76835bb..36c632d8d 100644 --- a/electrum/plugins/ledger/ledger.py +++ b/electrum/plugins/ledger/ledger.py @@ -318,7 +318,7 @@ class Ledger_KeyStore(Hardware_KeyStore): @test_pin_unlocked @set_and_unset_signing - def sign_transaction(self, tx, password): + def sign_transaction(self, tx: Transaction, password): if tx.is_complete(): return client = self.get_client() @@ -409,10 +409,9 @@ class Ledger_KeyStore(Hardware_KeyStore): if (info is not None) and len(tx.outputs()) > 1 \ and not has_change: index = info.address_index - on_change_branch = index[0] == 1 # prioritise hiding outputs on the 'change' branch from user # because no more than one change address allowed - if on_change_branch == any_output_on_change_branch: + if info.is_change == any_output_on_change_branch: changePath = self.get_derivation()[2:] + "/%d/%d"%index has_change = True else: diff --git a/electrum/plugins/safe_t/safe_t.py b/electrum/plugins/safe_t/safe_t.py index c03885019..a33965054 100644 --- a/electrum/plugins/safe_t/safe_t.py +++ b/electrum/plugins/safe_t/safe_t.py @@ -403,7 +403,7 @@ class SafeTPlugin(HW_PluginBase): return inputs - def tx_outputs(self, derivation, tx): + def tx_outputs(self, derivation, tx: Transaction): def create_output_by_derivation(): script_type = self.get_safet_output_script_type(info.script_type) @@ -450,12 +450,11 @@ class SafeTPlugin(HW_PluginBase): info = tx.output_info.get(address) if info is not None and not has_change: index, xpubs, m = info.address_index, info.sorted_xpubs, info.num_sig - on_change_branch = index[0] == 1 # prioritise hiding outputs on the 'change' branch from user # because no more than one change address allowed # note: ^ restriction can be removed once we require fw # that has https://github.com/trezor/trezor-mcu/pull/306 - if on_change_branch == any_output_on_change_branch: + if info.is_change == any_output_on_change_branch: use_create_by_derivation = True has_change = True diff --git a/electrum/plugins/trezor/trezor.py b/electrum/plugins/trezor/trezor.py index ecf3ebf22..82461edba 100644 --- a/electrum/plugins/trezor/trezor.py +++ b/electrum/plugins/trezor/trezor.py @@ -420,7 +420,7 @@ class TrezorPlugin(HW_PluginBase): signatures=signatures, m=m) - def tx_outputs(self, derivation, tx): + def tx_outputs(self, derivation, tx: Transaction): def create_output_by_derivation(): script_type = self.get_trezor_output_script_type(info.script_type) @@ -455,12 +455,11 @@ class TrezorPlugin(HW_PluginBase): info = tx.output_info.get(address) if info is not None and not has_change: index, xpubs, m = info.address_index, info.sorted_xpubs, info.num_sig - on_change_branch = index[0] == 1 # prioritise hiding outputs on the 'change' branch from user # because no more than one change address allowed # note: ^ restriction can be removed once we require fw # that has https://github.com/trezor/trezor-mcu/pull/306 - if on_change_branch == any_output_on_change_branch: + if info.is_change == any_output_on_change_branch: use_create_by_derivation = True has_change = True diff --git a/electrum/transaction.py b/electrum/transaction.py index b6cbddeaf..10ed1f546 100644 --- a/electrum/transaction.py +++ b/electrum/transaction.py @@ -81,9 +81,10 @@ class TxOutputForUI(NamedTuple): class TxOutputHwInfo(NamedTuple): address_index: Tuple - sorted_xpubs: Iterable[str] + sorted_xpubs: Sequence[str] num_sig: Optional[int] script_type: str + is_change: bool # whether the wallet considers the output to be change class BIP143SharedTxDigestFields(NamedTuple): diff --git a/electrum/wallet.py b/electrum/wallet.py index 75709a62d..d293b618f 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -351,10 +351,10 @@ class Abstract_Wallet(AddressSynchronizer): except: return - def is_mine(self, address): + def is_mine(self, address) -> bool: return bool(self.get_address_index(address)) - def is_change(self, address): + def is_change(self, address) -> bool: if not self.is_mine(address): return False return self.get_address_index(address)[0] @@ -1182,7 +1182,12 @@ class Abstract_Wallet(AddressSynchronizer): # sort xpubs using the order of pubkeys sorted_pubkeys, sorted_xpubs = zip(*sorted(zip(pubkeys, xpubs))) num_sig = self.m if isinstance(self, Multisig_Wallet) else None - info[o.address] = TxOutputHwInfo(index, sorted_xpubs, num_sig, self.txin_type) + is_change = self.is_change(o.address) + info[o.address] = TxOutputHwInfo(address_index=index, + sorted_xpubs=sorted_xpubs, + num_sig=num_sig, + script_type=self.txin_type, + is_change=is_change) tx.output_info = info def sign_transaction(self, tx, password): @@ -1738,7 +1743,7 @@ class Imported_Wallet(Simple_Wallet): self.save_keystore() self.storage.write() - def is_mine(self, address): + def is_mine(self, address) -> bool: return self.db.has_imported_address(address) def get_address_index(self, address):