URI: 
       tPartially restore prior - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 791d3a2aa2393b61c64ae76e7222016724aa4304
   DIR parent 9d9fcbde647316d4fe178fe2c5df58c61be26c02
  HTML Author: Neil Booth <kyuupichan@gmail.com>
       Date:   Mon, 28 Dec 2015 21:58:09 +0900
       
       Partially restore prior
       
       It was breaking hardware wallet creation
       
       Diffstat:
         M plugins/trezor/plugin.py            |      39 +++++++++++++++++++++++++++++--
       
       1 file changed, 37 insertions(+), 2 deletions(-)
       ---
   DIR diff --git a/plugins/trezor/plugin.py b/plugins/trezor/plugin.py
       t@@ -1,23 +1,27 @@
        import re
        from binascii import unhexlify
       +from struct import pack
        
        from electrum.account import BIP32_Account
       -from electrum.bitcoin import bc_address_to_hash_160, xpub_from_pubkey
       +from electrum.bitcoin import (bc_address_to_hash_160, xpub_from_pubkey,
       +                              bip32_private_derivation, EncodeBase58Check)
        from electrum.i18n import _
        from electrum.plugins import BasePlugin, hook
        from electrum.transaction import (deserialize, is_extended_pubkey,
                                          Transaction, x_to_xpub)
       -from electrum.wallet import BIP44_Wallet
       +from electrum.wallet import BIP32_HD_Wallet, BIP44_Wallet
        
        class TrezorCompatibleWallet(BIP44_Wallet):
            # Extend BIP44 Wallet as required by hardware implementation.
            # Derived classes must set:
            #   - device
            #   - wallet_type
       +
            restore_wallet_class = BIP44_Wallet
        
            def __init__(self, storage):
                BIP44_Wallet.__init__(self, storage)
       +        self.mpk = None
                self.checked_device = False
                self.proper_device = False
        
       t@@ -25,6 +29,10 @@ class TrezorCompatibleWallet(BIP44_Wallet):
                self.print_error(message)
                raise Exception(message)
        
       +    def get_action(self):
       +        if not self.accounts:
       +            return 'create_accounts'
       +
            def can_export(self):
                return False
        
       t@@ -37,6 +45,33 @@ class TrezorCompatibleWallet(BIP44_Wallet):
            def get_client(self):
                return self.plugin.get_client()
        
       +    def derive_xkeys(self, root, derivation, password):
       +        x = self.master_private_keys.get(root)
       +        if x:
       +            root_xprv = pw_decode(x, password)
       +            xprv, xpub = bip32_private_derivation(root_xprv, root, derivation)
       +            return xpub, xprv
       +        else:
       +            derivation = derivation.replace(self.root_name, self.prefix()+"/")
       +            xpub = self.get_public_key(derivation)
       +            return xpub, None
       +
       +    def get_public_key(self, bip32_path):
       +        address_n = self.get_client().expand_path(bip32_path)
       +        node = self.get_client().get_public_node(address_n).node
       +        xpub = ("0488B21E".decode('hex') + chr(node.depth)
       +                + self.i4b(node.fingerprint) + self.i4b(node.child_num)
       +                + node.chain_code + node.public_key)
       +        return EncodeBase58Check(xpub)
       +
       +    def get_master_public_key(self):
       +        if not self.mpk:
       +            self.mpk = self.get_public_key(self.prefix())
       +        return self.mpk
       +
       +    def i4b(self, x):
       +        return pack('>I', x)
       +
            def decrypt_message(self, pubkey, message, password):
                raise RuntimeError(_('Decrypt method is not implemented'))