URI: 
       tMerge pull request #3047 from SomberNight/storage_upgrade_v13b - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 6b9bfddda2d9b8febf88f1264be70f1e0e359396
   DIR parent d55468d1a6f1bee8b42676acb81f19fb2a97128e
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Mon, 16 Oct 2017 07:18:04 +0200
       
       Merge pull request #3047 from SomberNight/storage_upgrade_v13b
       
       fix: storage upgrade of pre-2.8 imported key wallets, and tests
       Diffstat:
         M lib/storage.py                      |      43 +++++++++++++++++++++++++++++--
         M lib/tests/test_storage_upgrade.py   |     175 +++++++++++++++++++++++++++++--
       
       2 files changed, 210 insertions(+), 8 deletions(-)
       ---
   DIR diff --git a/lib/storage.py b/lib/storage.py
       t@@ -257,9 +257,10 @@ class WalletStorage(PrintError):
                self.convert_imported()
                self.convert_wallet_type()
                self.convert_account()
       +        self.convert_version_13_b()
                self.convert_version_14()
        
       -        self.put('seed_version', FINAL_SEED_VERSION)
       +        self.put('seed_version', FINAL_SEED_VERSION)  # just to be sure
                self.write()
        
            def convert_wallet_type(self):
       t@@ -348,10 +349,35 @@ class WalletStorage(PrintError):
                self.put('keypairs', None)
                self.put('key_type', None)
        
       +    def convert_version_13_b(self):
       +        # version 13 is ambiguous, and has an earlier and a later structure
       +        if not self._is_upgrade_method_needed(0, 13):
       +            return
       +
       +        if self.get('wallet_type') == 'standard':
       +            if self.get('keystore').get('type') == 'imported':
       +                pubkeys = self.get('keystore').get('keypairs').keys()
       +                if self.get('pubkeys'):
       +                    pubkeys2 = set(self.get('pubkeys').get('receiving'))
       +                    assert len(pubkeys) == len(pubkeys2)
       +                    for pubkey in pubkeys:
       +                        assert pubkey in pubkeys2
       +                d = {'change': []}
       +                receiving_addresses = []
       +                for pubkey in pubkeys:
       +                    addr = bitcoin.pubkey_to_address('p2pkh', pubkey)
       +                    receiving_addresses.append(addr)
       +                d['receiving'] = receiving_addresses
       +                self.put('addresses', d)
       +                self.put('pubkeys', None)
       +
       +        self.put('seed_version', 13)
       +
            def convert_version_14(self):
                # convert imported wallets for 3.0
       -        if self.get_seed_version() >= 14:
       +        if not self._is_upgrade_method_needed(13, 13):
                    return
       +
                if self.get('wallet_type') =='imported':
                    addresses = self.get('addresses')
                    if type(addresses) is list:
       t@@ -375,6 +401,8 @@ class WalletStorage(PrintError):
                        self.put('pubkeys', None)
                        self.put('wallet_type', 'imported')
        
       +        self.put('seed_version', 14)
       +
            def convert_imported(self):
                # '/x' is the internal ID for imported accounts
                d = self.get('accounts', {}).get('/x', {}).get('imported',{})
       t@@ -404,6 +432,17 @@ class WalletStorage(PrintError):
            def convert_account(self):
                self.put('accounts', None)
        
       +    def _is_upgrade_method_needed(self, min_version, max_version):
       +        cur_version = self.get_seed_version()
       +        if cur_version > max_version:
       +            return False
       +        elif cur_version < min_version:
       +            raise BaseException(
       +                ('storage upgrade: unexpected version %d (should be %d-%d)'
       +                 % (cur_version, min_version, max_version)))
       +        else:
       +            return True
       +
            def get_action(self):
                action = run_hook('get_action', self)
                if action:
   DIR diff --git a/lib/tests/test_storage_upgrade.py b/lib/tests/test_storage_upgrade.py
       t@@ -1,21 +1,24 @@
       +import shutil
       +import tempfile
       +
        from lib.storage import WalletStorage
        from lib.wallet import Wallet
        
        from lib.tests.test_wallet import WalletTestCase
        
        
       -# TODO add other wallet types: 2fa/multisig/hardware
       +# TODO add other wallet types: 2fa, xpub-only
       +# TODO hw wallet with client version 2.6.x (single-, and multiacc)
        class TestStorageUpgrade(WalletTestCase):
        
            def test_upgrade_from_client_1_9_8_seeded(self):
       -        # seed words: flirt angel five creation swim bridge chocolate sport another hill secret whatever
                wallet_str = "{'addr_history':{'177hEYTccmuYH8u68pYfaLteTxwJrVgvJj':[],'15V7MsQK2vjF5aEXLVG11qi2eZPZsXdnYc':[],'1DgrwN2JCDZ6uPMSvSz8dPeUtaxLxWM2kf':[],'1H3mPXHFzA8UbvhQVabcDjYw3CPb3djvxs':[],'1DjtUCcQwwzA3GSPA7Kd79PMnri7tLDPYC':[],'1PGEgaPG1XJqmuSj68GouotWeYkCtwo4wm':[],'1PAgpPxnL42Hp3cWxmSfdChPqqGiM8g7zj':[],'1HocPduHmQUJerpdaLG8DnmxvnDCVQwWsa':[]},'accounts_expanded':{},'master_public_key':'756d1fe6ded28d43d4fea902a9695feb785447514d6e6c3bdf369f7c3432fdde4409e4efbffbcf10084d57c5a98d1f34d20ac1f133bdb64fa02abf4f7bde1dfb','use_encryption':False,'seed':'2605aafe50a45bdf2eb155302437e678','accounts':{0:{0:['1DjtUCcQwwzA3GSPA7Kd79PMnri7tLDPYC','1PAgpPxnL42Hp3cWxmSfdChPqqGiM8g7zj','177hEYTccmuYH8u68pYfaLteTxwJrVgvJj','1PGEgaPG1XJqmuSj68GouotWeYkCtwo4wm','15V7MsQK2vjF5aEXLVG11qi2eZPZsXdnYc'],1:['1H3mPXHFzA8UbvhQVabcDjYw3CPb3djvxs','1HocPduHmQUJerpdaLG8DnmxvnDCVQwWsa','1DgrwN2JCDZ6uPMSvSz8dPeUtaxLxWM2kf']}},'seed_version':4}"
                self._upgrade_storage(wallet_str)
        
       -    def test_upgrade_from_client_1_9_8_mixed(self):
       -        # seed words: flirt angel five creation swim bridge chocolate sport another hill secret whatever
parazyd.org:70 /git/electrum/commit/6b9bfddda2d9b8febf88f1264be70f1e0e359396.gph:122: line too long