electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit ab76a1fe5bf7360d93e2a00621f58ce08165d9db
parent ac329797e0f6b433686a917f9c642e597759009e
Author: SomberNight <somber.night@protonmail.com>
Date:   Tue,  3 Sep 2019 14:34:10 +0200

wallet.add_hw_info: also store "is_change" in output_info

as it seems every consumer wants to know this and has its own hacks to
figure it out

Diffstat:
Melectrum/address_synchronizer.py | 2+-
Melectrum/plugins/hw_wallet/plugin.py | 5++---
Melectrum/plugins/keepkey/keepkey.py | 5++---
Melectrum/plugins/ledger/ledger.py | 5++---
Melectrum/plugins/safe_t/safe_t.py | 5++---
Melectrum/plugins/trezor/trezor.py | 5++---
Melectrum/transaction.py | 3++-
Melectrum/wallet.py | 13+++++++++----
8 files changed, 22 insertions(+), 21 deletions(-)

diff --git 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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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):