URI: 
       timported_keys and accounts - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit e9968e4a393c59b467a6a7aa0ea2131981754a73
   DIR parent 4a33cf256bd339e9faca92050fc9b63e482bd5dd
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Sun,  4 May 2014 13:46:37 +0200
       
       imported_keys and accounts
       
       Diffstat:
         M lib/account.py                      |      25 +++++++++++++++++++++++++
         M lib/wallet.py                       |      64 +++++++++----------------------
       
       2 files changed, 44 insertions(+), 45 deletions(-)
       ---
   DIR diff --git a/lib/account.py b/lib/account.py
       t@@ -49,6 +49,10 @@ class Account(object):
            def has_change(self):
                return True
        
       +    def get_name(self, k):
       +        return _('Main account')
       +
       +
        class PendingAccount(Account):
            def __init__(self, v):
                self.addresses = [ v['pending'] ]
       t@@ -60,13 +64,21 @@ class PendingAccount(Account):
            def dump(self):
                return {'pending':self.addresses[0]}
        
       +    def get_name(self):
       +        return _('Pending account')
       +
       +
        class ImportedAccount(Account):
            def __init__(self, d):
                self.addresses = d.keys()
       +        self.change = []
        
            def has_change(self):
                return False
        
       +    def get_name(self, k):
       +        return _('Imported keys')
       +
        
        class OldAccount(Account):
            """  Privatekey(type,n) = Master_private_key + H(n|S|type)  """
       t@@ -192,6 +204,19 @@ class BIP32_Account(Account):
                s = '/' + '/'.join( map(lambda x:str(x), sequence) )
                return '&'.join( map(lambda x: 'bip32(%s,%s)'%(x, s), self.get_master_pubkeys() ) )
        
       +    def get_name(self, k):
       +        name = "Unnamed account"
       +        m = re.match("m/(\d+)'", k)
       +        if m:
       +            num = m.group(1)
       +            if num == '0':
       +                name = "Main account"
       +            else:
       +                name = "Account %s"%num
       +                    
       +        return name
       +
       +
        
        class BIP32_Account_2of2(BIP32_Account):
        
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -176,8 +176,6 @@ class Abstract_Wallet:
                self.frozen_addresses      = storage.get('frozen_addresses',[])
                self.addressbook           = storage.get('contacts', [])
        
       -        self.imported_keys         = storage.get('imported_keys',{})
       -
                self.history               = storage.get('addr_history',{})        # address -> list(txid, height)
        
                self.fee                   = int(storage.get('fee_per_kb', 10000))
       t@@ -246,6 +244,9 @@ class Abstract_Wallet:
        
            def load_accounts(self):
                self.accounts = {}
       +        self.imported_keys = self.storage.get('imported_keys',{})
       +        if self.imported_keys:
       +            self.accounts[-1] = ImportedAccount(self.imported_keys)
        
            def synchronize(self):
                pass
       t@@ -284,6 +285,8 @@ class Abstract_Wallet:
                # store the originally requested keypair into the imported keys table
                self.imported_keys[address] = pw_encode(sec, password )
                self.storage.put('imported_keys', self.imported_keys, True)
       +        self.accounts[-1] = ImportedAccount(self.imported_keys)
       +        
                if self.synchronizer:
                    self.synchronizer.subscribe_to_addresses([address])
                return address
       t@@ -293,7 +296,10 @@ class Abstract_Wallet:
                if addr in self.imported_keys:
                    self.imported_keys.pop(addr)
                    self.storage.put('imported_keys', self.imported_keys, True)
       -
       +            if self.imported_keys:
       +                self.accounts[-1] = ImportedAccount(self.imported_keys)
       +            else:
       +                self.accounts.pop(-1)
        
        
            def set_label(self, name, text = None):
       t@@ -318,7 +324,7 @@ class Abstract_Wallet:
        
        
            def addresses(self, include_change = True, _next=True):
       -        o = self.get_account_addresses(-1, include_change)
       +        o = []
                for a in self.accounts.keys():
                    o += self.get_account_addresses(a, include_change)
        
       t@@ -335,15 +341,12 @@ class Abstract_Wallet:
        
            def is_change(self, address):
                if not self.is_mine(address): return False
       -        if address in self.imported_keys.keys(): return False
                acct, s = self.get_address_index(address)
                if s is None: return False
                return s[0] == 1
        
        
            def get_address_index(self, address):
       -        if address in self.imported_keys.keys():
       -            return -1, None
        
                for account in self.accounts.keys():
                    for for_change in [0,1]:
       t@@ -605,37 +608,19 @@ class Abstract_Wallet:
        
        
            def get_account_name(self, k):
       -        default = "Unnamed account"
       -        m = re.match("m/0'/(\d+)", k)
       -        if m:
       -            num = m.group(1)
       -            if num == '0':
       -                default = "Main account"
       -            else:
       -                default = "Account %s"%num
       -                    
       -        m = re.match("m/1'/(\d+) & m/2'/(\d+)", k)
       -        if m:
       -            num = m.group(1)
       -            default = "2of2 account %s"%num
       -        name = self.labels.get(k, default)
       -        return name
       +        return self.labels.get(k, self.accounts[k].get_name(k))
        
        
            def get_account_names(self):
       -        accounts = {}
       -        for k, account in self.accounts.items():
       -            accounts[k] = self.get_account_name(k)
       -        if self.imported_keys:
       -            accounts[-1] = 'Imported keys'
       -        return accounts
       +        account_names = {}
       +        for k in self.accounts.keys():
       +            account_names[k] = self.get_account_name(k)
       +        return account_names
        
        
            def get_account_addresses(self, a, include_change=True):
                if a is None:
                    o = self.addresses(True)
       -        elif a == -1:
       -            o = self.imported_keys.keys()
                elif a in self.accounts:
                    ac = self.accounts[a]
                    o = ac.get_addresses(0)
       t@@ -1106,6 +1091,8 @@ class Abstract_Wallet:
            def restore(self, cb):
                pass
        
       +    def get_accounts(self):
       +        return self.accounts
        
        
        class Imported_Wallet(Abstract_Wallet):
       t@@ -1130,8 +1117,6 @@ class Imported_Wallet(Abstract_Wallet):
                    address = address_from_private_key(sec)
                    assert address == k
        
       -    def get_accounts(self):
       -        return { -1: ImportedAccount(self.imported_keys) }
        
        
        
       t@@ -1279,7 +1264,7 @@ class Deterministic_Wallet(Abstract_Wallet):
                self.check_pending_accounts()
                new = []
                for account in self.accounts.values():
       -            if type(account) == PendingAccount:
       +            if type(account) in [ImportedAccount, PendingAccount]:
                        continue
                    new += self.synchronize_account(account)
                if new:
       t@@ -1345,8 +1330,8 @@ class Deterministic_Wallet(Abstract_Wallet):
            
        
            def load_accounts(self):
       +        Abstract_Wallet.load_accounts(self)
                d = self.storage.get('accounts', {})
       -        self.accounts = {}
                for k, v in d.items():
                    if k == 0:
                        v['mpk'] = self.storage.get('master_public_key')
       t@@ -1377,11 +1362,6 @@ class Deterministic_Wallet(Abstract_Wallet):
                self.accounts[account_id] = PendingAccount({'pending':addr})
                self.save_accounts()
        
       -    def get_accounts(self):
       -        out = sorted(self.accounts.items())
       -        if self.imported_keys:
       -            out.append( (-1, ImportedAccount(self.imported_keys) ))
       -        return dict(out)
        
        
        
       t@@ -1657,12 +1637,6 @@ class OldWallet(Deterministic_Wallet):
                        keypairs[pubkey] = pk
        
        
       -    def get_account_name(self, k):
       -        if k == 0:
       -            return 'Main account' 
       -        elif k == -1:
       -            return 'Imported'
       -
        
            def get_private_key(self, address, password):
                if self.is_watching_only():