URI: 
       tIntroduce BIP32_RD_Wallet - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 637164d33550c46354cdcf13991088545e14a4f6
   DIR parent 3d781a2d1b93d33b7232ba95b8f11e583e8ad436
  HTML Author: Neil Booth <kyuupichan@gmail.com>
       Date:   Sun, 10 Jan 2016 20:17:11 +0900
       
       Introduce BIP32_RD_Wallet
       
       Represents a BIP_32 wallet with a root derivation.
       This permits us to see address derivation for NewWallet types
       in the QT Gui.
       
       Diffstat:
         M gui/qt/main_window.py               |       4 ++--
         M lib/wallet.py                       |      41 ++++++++++++++++++-------------
       
       2 files changed, 26 insertions(+), 19 deletions(-)
       ---
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -43,7 +43,7 @@ from electrum.util import PrintError, NotEnoughFunds, StoreDict
        from electrum import Transaction, mnemonic
        from electrum import util, bitcoin, commands
        from electrum import SimpleConfig, COIN_CHOOSERS, paymentrequest
       -from electrum.wallet import Wallet, BIP32_HD_Wallet
       +from electrum.wallet import Wallet, BIP32_RD_Wallet
        
        from amountedit import BTCAmountEdit, MyLineEdit, BTCkBEdit
        from network_dialog import NetworkDialog
       t@@ -2030,7 +2030,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
                d.setMinimumSize(600, 200)
                vbox = QVBoxLayout()
                vbox.addWidget( QLabel(_("Address") + ': ' + address))
       -        if isinstance(self.wallet, BIP32_HD_Wallet):
       +        if isinstance(self.wallet, BIP32_RD_Wallet):
                    derivation = self.wallet.address_id(address)
                    vbox.addWidget(QLabel(_("Derivation") + ': ' + derivation))
                vbox.addWidget(QLabel(_("Public key") + ':'))
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -1658,10 +1658,26 @@ class BIP32_Simple_Wallet(BIP32_Wallet):
                self.add_master_public_key(self.root_name, xpub)
                self.add_account('0', account)
        
       +class BIP32_RD_Wallet(BIP32_Wallet):
       +    # Abstract base class for a BIP32 wallet with a self.root_derivation
        
       -class BIP32_HD_Wallet(BIP32_Wallet):
       +    @classmethod
       +    def account_derivation(self, account_id):
       +        return self.root_derivation + account_id
       +
       +    @classmethod
       +    def address_derivation(self, account_id, change, address_index):
       +        account_derivation = self.account_derivation(account_id)
       +        return "%s/%d/%d" % (account_derivation, change, address_index)
       +
       +    def address_id(self, address):
       +        acc_id, (change, address_index) = self.get_address_index(address)
       +        return self.address_derivation(acc_id, change, address_index)
       +
       +
       +class BIP32_HD_Wallet(BIP32_RD_Wallet):
       +    # Abstract base class for a BIP32 wallet that admits account creation
        
       -    # wallet that can create accounts
            def __init__(self, storage):
                BIP32_Wallet.__init__(self, storage)
                # Backwards-compatibility.  Remove legacy "next_account2" and
       t@@ -1726,24 +1742,15 @@ class BIP32_HD_Wallet(BIP32_Wallet):
            def accounts_all_used(self):
                return all(self.account_is_used(acc_id) for acc_id in self.accounts)
        
       -    @classmethod
       -    def account_derivation(self, account_id):
       -        return self.root_derivation + "/" + account_id + "'"
       -
       -    @classmethod
       -    def address_derivation(self, account_id, change, address_index):
       -        account_derivation = self.account_derivation(account_id)
       -        return "%s/%d/%d" % (account_derivation, change, address_index)
       -
       -    def address_id(self, address):
       -        acc_id, (change, address_index) = self.get_address_index(address)
       -        return self.address_derivation(acc_id, change, address_index)
       -
        
        class BIP44_Wallet(BIP32_HD_Wallet):
       -    root_derivation = "m/44'/0'"
       +    root_derivation = "m/44'/0'/"
            wallet_type = 'bip44'
        
       +    @classmethod
       +    def account_derivation(self, account_id):
       +        return self.root_derivation + account_id + "'"
       +
            def can_sign_xpubkey(self, x_pubkey):
                xpub, sequence = BIP32_Account.parse_xpubkey(x_pubkey)
                return xpub in self.master_public_keys.values()
       t@@ -1778,7 +1785,7 @@ class BIP44_Wallet(BIP32_HD_Wallet):
                    return xpub, None
        
        
       -class NewWallet(BIP32_Wallet, Mnemonic):
       +class NewWallet(BIP32_RD_Wallet, Mnemonic):
            # Standard wallet
            root_derivation = "m/"
            wallet_type = 'standard'