URI: 
       tmulti seed and mpk dialogs - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit a66df2a3fa77d85434a6fc36bc03df8ff8f58bb4
   DIR parent a6381271859d57a783167fed6e47e2a4778fc7d1
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Mon, 12 May 2014 10:53:04 +0200
       
       multi seed and mpk dialogs
       
       Diffstat:
         M gui/qt/installwizard.py             |     105 ++++++++++++++++++-------------
         M lib/wallet.py                       |       6 ++----
       
       2 files changed, 63 insertions(+), 48 deletions(-)
       ---
   DIR diff --git a/gui/qt/installwizard.py b/gui/qt/installwizard.py
       t@@ -192,66 +192,53 @@ class InstallWizard(QDialog):
                return self.get_seed_text(seed_e)
        
        
       -    def cold_mpk_dialog(self, xpub_hot):
       -        vbox = QVBoxLayout()
       -        vbox1, seed_e1 = seed_dialog.enter_seed_box(MSG_SHOW_MPK, 'hot')
       -        seed_e1.setText(xpub_hot)
       -        seed_e1.setReadOnly(True)
       -        vbox2, seed_e2 = seed_dialog.enter_seed_box(MSG_ENTER_COLD_MPK, 'cold')
       -        vbox.addLayout(vbox1)
       -        vbox.addLayout(vbox2)
       -        vbox.addStretch(1)
       -        hbox, button = ok_cancel_buttons2(self, _('Next'))
       -        vbox.addLayout(hbox)
       -        button.setEnabled(False)
       -        f = lambda: button.setEnabled(self.is_mpk(seed_e2))
       -        seed_e2.textChanged.connect(f)
       -        self.set_layout(vbox)
       -        if not self.exec_():
       -            return 
       -        return self.get_seed_text(seed_e2)
       -
       -
       -    def cold_mpk2_dialog(self, xpub_hot):
       +    def multi_mpk_dialog(self, xpub_hot, n):
                vbox = QVBoxLayout()
                vbox0, seed_e0 = seed_dialog.enter_seed_box(MSG_SHOW_MPK, 'hot')
       +        vbox.addLayout(vbox0)
                seed_e0.setText(xpub_hot)
                seed_e0.setReadOnly(True)
       -        vbox1, seed_e1 = seed_dialog.enter_seed_box(MSG_ENTER_COLD_MPK, 'cold')
       -        vbox2, seed_e2 = seed_dialog.enter_seed_box(MSG_ENTER_COLD_MPK, 'cold')
       -        vbox.addLayout(vbox0)
       -        vbox.addLayout(vbox1)
       -        vbox.addLayout(vbox2)
       +        entries = []
       +        for i in range(n):
       +            vbox2, seed_e2 = seed_dialog.enter_seed_box(MSG_ENTER_COLD_MPK, 'cold')
       +            vbox.addLayout(vbox2)
       +            entries.append(seed_e2)
                vbox.addStretch(1)
                hbox, button = ok_cancel_buttons2(self, _('Next'))
                vbox.addLayout(hbox)
                button.setEnabled(False)
       -        f = lambda: button.setEnabled(self.is_mpk(seed_e1) and self.is_mpk(seed_e2))
       -        seed_e1.textChanged.connect(f)
       -        seed_e2.textChanged.connect(f)
       +        f = lambda: button.setEnabled( map(lambda e: self.is_mpk(e), entries) == [True]*len(entries))
       +        for e in entries:
       +            e.textChanged.connect(f)
                self.set_layout(vbox)
                if not self.exec_():
       -            return 
       -        return self.get_seed_text(seed_e1), self.get_seed_text(seed_e2)
       +            return
       +        return map(lambda e: self.get_seed_text(e), entries)
        
        
       -    def double_seed_dialog(self):
       +    def multi_seed_dialog(self, n):
                vbox = QVBoxLayout()
                vbox1, seed_e1 = seed_dialog.enter_seed_box(MSG_ENTER_SEED_OR_MPK, 'hot')
       -        vbox2, seed_e2 = seed_dialog.enter_seed_box(MSG_ENTER_SEED_OR_MPK, 'cold')
                vbox.addLayout(vbox1)
       -        vbox.addLayout(vbox2)
       +        entries = [seed_e1]
       +        for i in range(n):
       +            vbox2, seed_e2 = seed_dialog.enter_seed_box(MSG_ENTER_SEED_OR_MPK, 'cold')
       +            vbox.addLayout(vbox2)
       +            entries.append(seed_e2)
                vbox.addStretch(1)
                hbox, button = ok_cancel_buttons2(self, _('Next'))
                vbox.addLayout(hbox)
                button.setEnabled(False)
       -        f = lambda: button.setEnabled(self.is_any(seed_e1) and self.is_any(seed_e2))
       -        seed_e1.textChanged.connect(f)
       -        seed_e2.textChanged.connect(f)
       +
       +        f = lambda: button.setEnabled( map(lambda e: self.is_any(e), entries) == [True]*len(entries))
       +        for e in entries:
       +            e.textChanged.connect(f)
       +
                self.set_layout(vbox)
                if not self.exec_():
                    return 
       -        return self.get_seed_text(seed_e1), self.get_seed_text(seed_e2)
       +        return map(lambda e: self.get_seed_text(e), entries)
       +
        
        
        
       t@@ -418,7 +405,7 @@ class InstallWizard(QDialog):
                        action = 'create_2of3_1'
        
        
       -        if action == 'create_2fa_2':
       +        if action in ['create_2fa_2', 'create_2of3_2']:
                    wallet = Wallet_2of3(self.storage)
        
                if action in ['create', 'create_2of2_1', 'create_2fa_2', 'create_2of3_1']:
       t@@ -442,7 +429,9 @@ class InstallWizard(QDialog):
        
                if action == 'create_2of2_2':
                    xpub_hot = wallet.master_public_keys.get("m/")
       -            xpub = self.cold_mpk_dialog(xpub_hot)
       +            xpub = self.multi_mpk_dialog(xpub_hot, 1)
       +            if not xpub:
       +                return
                    wallet.add_master_public_key("cold/", xpub)
                    wallet.create_account()
                    self.waiting_dialog(wallet.synchronize)
       t@@ -450,7 +439,10 @@ class InstallWizard(QDialog):
        
                if action == 'create_2of3_2':
                    xpub_hot = wallet.master_public_keys.get("m/")
       -            xpub1, xpub2 = self.cold_mpk2_dialog(xpub_hot)
       +            r = self.multi_mpk_dialog(xpub_hot, 2)
       +            if not r:
       +                return
       +            xpub1, xpub2 = r
                    wallet.add_master_public_key("cold/", xpub1)
                    wallet.add_master_public_key("remote/", xpub2)
                    wallet.create_account()
       t@@ -485,8 +477,8 @@ class InstallWizard(QDialog):
                        else:
                            raise
        
       -            elif t in ['2fa', '2of2','2of3']:
       -                r = self.double_seed_dialog()
       +            elif t in ['2fa', '2of2']:
       +                r = self.multi_seed_dialog(1)
                        if not r: 
                            return
                        text1, text2 = r
       t@@ -513,11 +505,36 @@ class InstallWizard(QDialog):
                                wallet.add_master_public_key("m/", text1)
                                wallet.add_master_public_key("cold/", text2)
        
       -                if t == '2of3':
       +                if t == '2fa':
                            run_hook('restore_third_key', wallet, self)
        
                        wallet.create_account()
        
       +            elif t in ['2of3']:
       +                r = self.multi_seed_dialog(2)
       +                if not r: 
       +                    return
       +                text1, text2, text3 = r
       +                password = self.password_dialog()
       +                wallet = Wallet_2of3(self.storage)
       +
       +                if Wallet.is_seed(text1):
       +                    wallet.add_seed(text1, password)
       +                    if Wallet.is_seed(text2):
       +                        wallet.add_cold_seed(text2, password)
       +                    else:
       +                        wallet.add_master_public_key("cold/", text2)
       +
       +                elif Wallet.is_mpk(text1):
       +                    if Wallet.is_seed(text2):
       +                        wallet.add_seed(text2, password)
       +                        wallet.add_master_public_key("cold/", text1)
       +                    else:
       +                        wallet.add_master_public_key("m/", text1)
       +                        wallet.add_master_public_key("cold/", text2)
       +
       +                wallet.create_account()
       +
                    else:
                        raise
        
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -1511,12 +1511,10 @@ class Wallet_2of3(Wallet_2of2):
                # fixme: we use order of creation
                if xpub2 and xpub1 is None:
                    return 'create_2fa_2'
       -        if xpub2 is None:
       -            return 'create_2of3_1'
                if xpub1 is None:
       +            return 'create_2of3_1'
       +        if xpub2 is None or xpub3 is None:
                    return 'create_2of3_2'
       -        if xpub3 is None:
       -            return 'create_2of3_3'