URI: 
       ttests: bip32 extended version bytes - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 7218bf1d14f963c7f35cb6649677ef4eee4cfa20
   DIR parent 9b7a449057eb897cb2fa8f609d43f71e15646015
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Mon, 28 May 2018 20:27:08 +0200
       
       ttests: bip32 extended version bytes
       
       Diffstat:
         M lib/keystore.py                     |       6 ++++--
         M lib/tests/test_wallet_vertical.py   |     121 +++++++++++++++++++++++++++++++
       
       2 files changed, 125 insertions(+), 2 deletions(-)
       ---
   DIR diff --git a/lib/keystore.py b/lib/keystore.py
       t@@ -590,10 +590,12 @@ def bip39_is_checksum_valid(mnemonic):
            calculated_checksum = hashed >> (256 - checksum_length)
            return checksum == calculated_checksum, True
        
       -def from_bip39_seed(seed, passphrase, derivation):
       +
       +def from_bip39_seed(seed, passphrase, derivation, xtype=None):
            k = BIP32_KeyStore({})
            bip32_seed = bip39_to_seed(seed, passphrase)
       -    xtype = xtype_from_derivation(derivation)
       +    if xtype is None:
       +        xtype = xtype_from_derivation(derivation)
            k.add_xprv_from_seed(bip32_seed, xtype, derivation)
            return k
        
   DIR diff --git a/lib/tests/test_wallet_vertical.py b/lib/tests/test_wallet_vertical.py
       t@@ -9,6 +9,7 @@ from lib import storage, bitcoin, keystore, constants
        from lib.transaction import Transaction
        from lib.simple_config import SimpleConfig
        from lib.wallet import TX_HEIGHT_UNCONFIRMED, TX_HEIGHT_UNCONF_PARENT
       +from lib.util import bfh, bh2u
        
        from plugins.trustedcoin import trustedcoin
        
       t@@ -303,6 +304,66 @@ class TestWalletKeystoreAddressIntegrityForMainnet(SequentialTestCase):
                self.assertEqual(w.get_receiving_addresses()[0], '35LeC45QgCVeRor1tJD6LiDgPbybBXisns')
                self.assertEqual(w.get_change_addresses()[0], '39RhtDchc6igmx5tyoimhojFL1ZbQBrXa6')
        
       +    @needs_test_with_all_ecc_implementations
       +    @mock.patch.object(storage.WalletStorage, '_write')
       +    def test_bip32_extended_version_bytes(self, mock_write):
       +        seed_words = 'crouch dumb relax small truck age shine pink invite spatial object tenant'
       +        self.assertEqual(keystore.bip39_is_checksum_valid(seed_words), (True, True))
       +        bip32_seed = keystore.bip39_to_seed(seed_words, '')
       +        self.assertEqual('0df68c16e522eea9c1d8e090cfb2139c3b3a2abed78cbcb3e20be2c29185d3b8df4e8ce4e52a1206a688aeb88bfee249585b41a7444673d1f16c0d45755fa8b9',
       +                         bh2u(bip32_seed))
       +
       +        def create_keystore_from_bip32seed(xtype):
       +            ks = keystore.BIP32_KeyStore({})
       +            ks.add_xprv_from_seed(bip32_seed, xtype=xtype, derivation='m/')
       +            return ks
       +
       +        ks = create_keystore_from_bip32seed(xtype='standard')
       +        self.assertEqual('033a05ec7ae9a9833b0696eb285a762f17379fa208b3dc28df1c501cf84fe415d0', ks.derive_pubkey(0, 0))
       +        self.assertEqual('02bf27f41683d84183e4e930e66d64fc8af5508b4b5bf3c473c505e4dbddaeed80', ks.derive_pubkey(1, 0))
       +
       +        ks = create_keystore_from_bip32seed(xtype='standard')  # p2pkh
       +        w = WalletIntegrityHelper.create_standard_wallet(ks)
       +        self.assertEqual(ks.xprv, 'xprv9s21ZrQH143K3nyWMZVjzGL4KKAE1zahmhTHuV5pdw4eK3o3igC5QywgQG7UTRe6TGBniPDpPFWzXMeMUFbBj8uYsfXGjyMmF54wdNt8QBm')
       +        self.assertEqual(ks.xpub, 'xpub661MyMwAqRbcGH3yTb2kMQGnsLziRTJZ8vNthsVSCGbdBr8CGDWKxnGAFYgyKTzBtwvPPmfVAWJuFmxRXjSbUTg87wDkWQ5GmzpfUcN9t8Z')
       +        self.assertEqual(w.get_receiving_addresses()[0], '19fWEVaXqgJFFn7JYNr6ouxyjZy3uK7CdK')
       +        self.assertEqual(w.get_change_addresses()[0], '1EEX7da31qndYyeKdbM665w1ze5gbkkAZZ')
       +
       +        ks = create_keystore_from_bip32seed(xtype='p2wpkh-p2sh')
       +        w = WalletIntegrityHelper.create_standard_wallet(ks)
       +        self.assertEqual(ks.xprv, 'yprvABrGsX5C9janu6AdBvHNCMRZVHJfxcaCgoyWgsyi1wSXN9cGyLMe33bpRU54TLJ1ruJbTrpNqusYQeFvBx1CXNb9k1DhKtBFWo8b1sLbXhN')
       +        self.assertEqual(ks.xpub, 'ypub6QqdH2c5z7967aF6HwpNZVNJ3K9AN5J442u7VGPKaGyWEwwRWsftaqvJGkeZKNe7Jb3C9FG3dAfT94ZzFRrcGhMizGvB6Jtm3itJsEFhxMC')
       +        self.assertEqual(w.get_receiving_addresses()[0], '34SAT5gGF5UaBhhSZ8qEuuxYvZ2cm7Zi23')
       +        self.assertEqual(w.get_change_addresses()[0], '38unULZaetSGSKvDx7Krukh8zm8NQnxGiA')
       +
       +        ks = create_keystore_from_bip32seed(xtype='p2wpkh')
       +        w = WalletIntegrityHelper.create_standard_wallet(ks)
       +        self.assertEqual(ks.xprv, 'zprvAWgYBBk7JR8GkPMk2H4zQSX4fFT7uEZhbvVjUGsbPwpQRFRWDzXCf7FxSg2eTEwwGYRQDLQwJaE6HvsUueRDKcGkcLv7unzjnXCEQVWhrF9')
       +        self.assertEqual(ks.xpub, 'zpub6jftahH18ngZxsSD8JbzmaToDHHcJhHYy9RLGfHCxHMPJ3kemXqTCuaSHxc9KHJ2iE9ztirc5q212MBYy8Gd4w3KrccbgDiFKSwxFpYKEH6')
       +        self.assertEqual(w.get_receiving_addresses()[0], 'bc1qtuynwzd0d6wptvyqmc6ehkm70zcamxpshyzu5e')
       +        self.assertEqual(w.get_change_addresses()[0], 'bc1qjy5zunxh6hjysele86qqywfa437z4xwmleq8wk')
       +
       +        ks = create_keystore_from_bip32seed(xtype='standard')  # p2sh
       +        w = WalletIntegrityHelper.create_multisig_wallet([ks], '1of1')
       +        self.assertEqual(ks.xprv, 'xprv9s21ZrQH143K3nyWMZVjzGL4KKAE1zahmhTHuV5pdw4eK3o3igC5QywgQG7UTRe6TGBniPDpPFWzXMeMUFbBj8uYsfXGjyMmF54wdNt8QBm')
       +        self.assertEqual(ks.xpub, 'xpub661MyMwAqRbcGH3yTb2kMQGnsLziRTJZ8vNthsVSCGbdBr8CGDWKxnGAFYgyKTzBtwvPPmfVAWJuFmxRXjSbUTg87wDkWQ5GmzpfUcN9t8Z')
       +        self.assertEqual(w.get_receiving_addresses()[0], '3F4nm8Vunb7mxVvqhUP238PYge2hpU5qYv')
       +        self.assertEqual(w.get_change_addresses()[0], '3N8jvKGmxzVHENn6B4zTdZt3N9bmRKjj96')
       +
       +        ks = create_keystore_from_bip32seed(xtype='p2wsh-p2sh')
       +        w = WalletIntegrityHelper.create_multisig_wallet([ks], '1of1')
       +        self.assertEqual(ks.xprv, 'YprvANkMzkodih9AKfL18akM2RmND5LwAyFo15dBc9FFPiGvzLBBjjjv8ATkEB2Y1mWv6NNaLSpVj8G3XosgVBA9frhpaUL6jHeFQXQTbqVPcv2')
       +        self.assertEqual(ks.xpub, 'Ypub6bjiQGLXZ4hTY9QUEcHMPZi6m7BRaRyeNJYnQXerx3ous8WLHH4AfxnE5Tc2sos1Y47B1qGAWP3xGEBkYf1ZRBUPpk2aViMkwTABT6qoiBb')
       +        self.assertEqual(w.get_receiving_addresses()[0], '3L1BxLLASGKE3DR1ruraWm3hZshGCKqcJx')
       +        self.assertEqual(w.get_change_addresses()[0], '3NDGcbZVXTpaQWRhiuVPpXsNt4g2JiCX4E')
       +
       +        ks = create_keystore_from_bip32seed(xtype='p2wsh')
       +        w = WalletIntegrityHelper.create_multisig_wallet([ks], '1of1')
       +        self.assertEqual(ks.xprv, 'ZprvAhadJRUYsNgeAxX7xwXyEWrsP3VP7bFHvC9QPY98miep3RzQzPuUkE7tFNz81gAqW1VP5vR4BncbR6VFCsaAU6PRSp2XKCTjgFU6zRpk6Xp')
       +        self.assertEqual(ks.xpub, 'Zpub6vZyhw1ShkEwPSbb4y4ybeobw5KsX3y9HR51BvYkL4BnvEKZXwDjJ2SN6fZcsiWvwhDymJriy3QW9WoKGMRaDR9zh5j15dBFDBDpqjK1ekQ')
       +        self.assertEqual(w.get_receiving_addresses()[0], 'bc1q84x0yrztvcjg88qef4d6978zccxulcmc9y88xcg4ghjdau999x7q7zv2qe')
       +        self.assertEqual(w.get_change_addresses()[0], 'bc1q0fj5mra96hhnum80kllklc52zqn6kppt3hyzr49yhr3ecr42z3tsrkg3gs')
       +
        
        class TestWalletKeystoreAddressIntegrityForTestnet(TestCaseForTestnet):
        
       t@@ -327,6 +388,66 @@ class TestWalletKeystoreAddressIntegrityForTestnet(TestCaseForTestnet):
                self.assertEqual(w.get_receiving_addresses()[0], '2MzsfTfTGomPRne6TkctMmoDj6LwmVkDrMt')
                self.assertEqual(w.get_change_addresses()[0], '2NFp9w8tbYYP9Ze2xQpeYBJQjx3gbXymHX7')
        
       +    @needs_test_with_all_ecc_implementations
       +    @mock.patch.object(storage.WalletStorage, '_write')
       +    def test_bip32_extended_version_bytes(self, mock_write):
       +        seed_words = 'crouch dumb relax small truck age shine pink invite spatial object tenant'
       +        self.assertEqual(keystore.bip39_is_checksum_valid(seed_words), (True, True))
       +        bip32_seed = keystore.bip39_to_seed(seed_words, '')
       +        self.assertEqual('0df68c16e522eea9c1d8e090cfb2139c3b3a2abed78cbcb3e20be2c29185d3b8df4e8ce4e52a1206a688aeb88bfee249585b41a7444673d1f16c0d45755fa8b9',
       +                         bh2u(bip32_seed))
       +
       +        def create_keystore_from_bip32seed(xtype):
       +            ks = keystore.BIP32_KeyStore({})
       +            ks.add_xprv_from_seed(bip32_seed, xtype=xtype, derivation='m/')
       +            return ks
       +
       +        ks = create_keystore_from_bip32seed(xtype='standard')
       +        self.assertEqual('033a05ec7ae9a9833b0696eb285a762f17379fa208b3dc28df1c501cf84fe415d0', ks.derive_pubkey(0, 0))
       +        self.assertEqual('02bf27f41683d84183e4e930e66d64fc8af5508b4b5bf3c473c505e4dbddaeed80', ks.derive_pubkey(1, 0))
       +
       +        ks = create_keystore_from_bip32seed(xtype='standard')  # p2pkh
       +        w = WalletIntegrityHelper.create_standard_wallet(ks)
       +        self.assertEqual(ks.xprv, 'tprv8ZgxMBicQKsPecD328MF9ux3dSaSFWci7FNQmuWH7uZ86eY8i3XpvjK8KSH8To2QphiZiUqaYc6nzDC6bTw8YCB9QJjaQL5pAApN4z7vh2B')
       +        self.assertEqual(ks.xpub, 'tpubD6NzVbkrYhZ4Y5Epun1qZKcACU6NQqocgYyC4RYaYBMWw8nuLSMR7DvzVamkqxwRgrTJ1MBMhc8wwxT2vbHqMu8RBXy4BvjWMxR5EdZroxE')
       +        self.assertEqual(w.get_receiving_addresses()[0], 'mpBTXYfWehjW2tavFwpUdqBJbZZkup13k2')
       +        self.assertEqual(w.get_change_addresses()[0], 'mtkUQgf1psDtL67wMAKTv19LrdgPWy6GDQ')
       +
       +        ks = create_keystore_from_bip32seed(xtype='p2wpkh-p2sh')
       +        w = WalletIntegrityHelper.create_standard_wallet(ks)
       +        self.assertEqual(ks.xprv, 'uprv8tXDerPXZ1QsVuQ9rV8sN13YoQitC8cD2MtdZJQAVuw19kMMxhhPYnyGLeEiThgLELqNTxS91GTLsVofKAM9LRrkGeRzzEuJRtt1Tcostr7')
       +        self.assertEqual(ks.xpub, 'upub57Wa4MvRPNyAiPUcxWfsj8zHMSZNbbL4PapEMgon4FTz2YgWWF1e6bHkBvpDKk2Rg2Zy9LsonXFFbv7jNeCZ5kdKWv8UkfcoxpdjJrZuBX6')
       +        self.assertEqual(w.get_receiving_addresses()[0], '2MuzNWpcHrXyvPVKzEGT7Xrwp8uEnXXjWnK')
       +        self.assertEqual(w.get_change_addresses()[0], '2MzTzY5VcGLwce7YmdEwjXhgQD7LYEKLJTm')
       +
       +        ks = create_keystore_from_bip32seed(xtype='p2wpkh')
       +        w = WalletIntegrityHelper.create_standard_wallet(ks)
       +        self.assertEqual(ks.xprv, 'vprv9DMUxX4ShgxMMCbGgqvVa693yNsL8kbhwUQrLhJ3svJtCrAbDMrxArdQMrCJTcLFdyxBDS2hTvotknRE2rmA8fYM8z8Ra9inhcwerEsG6Ev')
       +        self.assertEqual(ks.xpub, 'vpub5SLqN2bLY4WeZgfjnsTVwE5nXQhpYDKZJhLT95hfSFqs5eVjkuBCiewtD8moKegM5fgmtpUNFBboVCjJ6LcZszJvPFpuLaSJEYhNhUAnrCS')
       +        self.assertEqual(w.get_receiving_addresses()[0], 'tb1qtuynwzd0d6wptvyqmc6ehkm70zcamxpsaze002')
       +        self.assertEqual(w.get_change_addresses()[0], 'tb1qjy5zunxh6hjysele86qqywfa437z4xwm4lm549')
       +
       +        ks = create_keystore_from_bip32seed(xtype='standard')  # p2sh
       +        w = WalletIntegrityHelper.create_multisig_wallet([ks], '1of1')
       +        self.assertEqual(ks.xprv, 'tprv8ZgxMBicQKsPecD328MF9ux3dSaSFWci7FNQmuWH7uZ86eY8i3XpvjK8KSH8To2QphiZiUqaYc6nzDC6bTw8YCB9QJjaQL5pAApN4z7vh2B')
       +        self.assertEqual(ks.xpub, 'tpubD6NzVbkrYhZ4Y5Epun1qZKcACU6NQqocgYyC4RYaYBMWw8nuLSMR7DvzVamkqxwRgrTJ1MBMhc8wwxT2vbHqMu8RBXy4BvjWMxR5EdZroxE')
       +        self.assertEqual(w.get_receiving_addresses()[0], '2N6czpsRwQ3d8AHZPNbztf5NotzEsaZmVQ8')
       +        self.assertEqual(w.get_change_addresses()[0], '2NDgwz4CoaSzdSAQdrCcLFWsJaVowCNgiPA')
       +
       +        ks = create_keystore_from_bip32seed(xtype='p2wsh-p2sh')
       +        w = WalletIntegrityHelper.create_multisig_wallet([ks], '1of1')
       +        self.assertEqual(ks.xprv, 'Uprv95RJn67y7xyEvUZXo9brC5PMXCm9QVHoLdYJUZfhsgmQmvvGj75fduqC9MCC28uETouMLYSFtUqqzfRRcPW6UuyR77YQPeNJKd9t3XutF8b')
       +        self.assertEqual(ks.xpub, 'Upub5JQfBberxLXY8xdzuB8rZDL65Ebdox1ehrTuGx5KS2JPejFRGePvBi9fzdmgtBFKuVdx1vsvfjdkj5jVfsMWEEjzMPEtA55orYubtrCZmRr')
       +        self.assertEqual(w.get_receiving_addresses()[0], '2NBZQ25GC3ipaF13ZY3UT8i2xnDuS17pJqx')
       +        self.assertEqual(w.get_change_addresses()[0], '2NDmUgLVX8vKvcJ4FQ37GSUre6QtBzKkb6k')
       +
       +        ks = create_keystore_from_bip32seed(xtype='p2wsh')
       +        w = WalletIntegrityHelper.create_multisig_wallet([ks], '1of1')
       +        self.assertEqual(ks.xprv, 'Vprv16YtLrHXxePM6noKqtFtMtmUgBE9bEpF3fPLmpvuPksssLostujtdHBwqhEeVuzESz22UY8hyPx9ed684SQpCmUKSVhpxPFbvVNY7qnviNR')
       +        self.assertEqual(ks.xpub, 'Vpub5dEvVGKn7251zFq7jXvUmJRbFCk5ka19cxz84LyCp2gGhq4eXJZUomop1qjGt5uFK8kkmQUV8PzJcNM4PZmX2URbDiwJjyuJ8GyFHRrEmmG')
       +        self.assertEqual(w.get_receiving_addresses()[0], 'tb1q84x0yrztvcjg88qef4d6978zccxulcmc9y88xcg4ghjdau999x7qf2696k')
       +        self.assertEqual(w.get_change_addresses()[0], 'tb1q0fj5mra96hhnum80kllklc52zqn6kppt3hyzr49yhr3ecr42z3ts5777jl')
       +
        
        class TestWalletSending(TestCaseForTestnet):