big refactoring: command line options and electrum.conf options override settings...
[electrum-nvc.git] / lib / wallet.py
index d478eac..027d98c 100644 (file)
@@ -273,49 +273,40 @@ def format_satoshis(x, is_diff=False, num_zeros = 0):
 
 
 from version import ELECTRUM_VERSION, SEED_VERSION
-from interface import DEFAULT_SERVERS
-
 
 
 
 class Wallet:
-    def __init__(self):
+    def __init__(self, config={}):
 
+        self.config = config
         self.electrum_version = ELECTRUM_VERSION
-        self.seed_version = SEED_VERSION
         self.update_callbacks = []
 
-        self.gap_limit = 5           # configuration
-        self.use_change = True
-        self.fee = 100000
-        self.num_zeros = 0
-        self.master_public_key = ''
-        self.conversion_currency = None
-        self.theme = "Cleanlook"
-
         # saved fields
-        self.use_encryption = False
-        self.addresses = []          # receiving addresses visible for user
-        self.change_addresses = []   # addresses used as change
-        self.seed = ''               # encrypted
-        self.history = {}
-        self.labels = {}             # labels for addresses and transactions
-        self.aliases = {}            # aliases for addresses
-        self.authorities = {}        # trusted addresses
-        self.frozen_addresses = []
-        self.prioritized_addresses = []
-        self.gui_detailed_view = False
-        
-        self.receipts = {}           # signed URIs
-        self.receipt = None          # next receipt
-        self.addressbook = []        # outgoing addresses, for payments
-        self.debug_server = False    # write server communication debug info to stdout
+        self.seed_version          = config.get('seed_version', SEED_VERSION)
+        self.gap_limit             = config.get('gap_limit', 5)
+        self.use_change            = config.get('use_change',True)
+        self.fee                   = int(config.get('fee',100000))
+        self.num_zeros             = int(config.get('num_zeros',0))
+        self.master_public_key     = config.get('master_public_key','').decode('hex')
+        self.use_encryption        = config.get('use_encryption', False)
+        self.addresses             = config.get('addresses', [])          # receiving addresses visible for user
+        self.change_addresses      = config.get('change_addresses', [])   # addresses used as change
+        self.seed                  = config.get('seed', '')               # encrypted
+        self.history               = config.get('history',{})
+        self.labels                = config.get('labels',{})              # labels for addresses and transactions
+        self.aliases               = config.get('aliases', {})            # aliases for addresses
+        self.authorities           = config.get('authorities', {})        # trusted addresses
+        self.frozen_addresses      = config.get('frozen_addresses',[])
+        self.prioritized_addresses = config.get('prioritized_addresses',[])
+        self.receipts              = config.get('receipts',{})            # signed URIs
+        self.addressbook           = config.get('contacts', [])           # outgoing addresses, for payments
+        self.imported_keys         = config.get('imported_keys',{})
 
         # not saved
+        self.receipt = None          # next receipt
         self.tx_history = {}
-
-        self.imported_keys = {}
-
         self.was_updated = True
         self.blocks = -1
         self.banner = ''
@@ -329,7 +320,10 @@ class Wallet:
         self.lock = threading.Lock()
         self.tx_event = threading.Event()
 
-        self.pick_random_server()
+        self.update_tx_history()
+        if self.seed_version != SEED_VERSION:
+            raise ValueError("This wallet seed is deprecated. Please run upgrade.py for a diagnostic.")
+
 
     def register_callback(self, update_callback):
         with self.lock:
@@ -340,38 +334,9 @@ class Wallet:
             callbacks = self.update_callbacks[:]
         [update() for update in callbacks]
 
-    def pick_random_server(self):
-        self.server = random.choice( DEFAULT_SERVERS )         # random choice when the wallet is created
-
     def is_up_to_date(self):
         return self.interface.responses.empty() and not self.interface.unanswered_requests
 
-    def set_server(self, server, proxy=None):
-        # raise an error if the format isnt correct
-        a,b,c = server.split(':')
-        b = int(b)
-        assert c in ['t', 'h', 'n']
-        # set the server
-        if server != self.server or proxy != self.interface.proxy:
-            self.server = server
-            self.save()
-            self.interface.proxy = proxy
-            self.interface.is_connected = False  # this exits the polling loop
-            self.interface.poke()
-
-    def set_path(self, wallet_path):
-        """Set the path of the wallet."""
-        if wallet_path is not None:
-            self.path = wallet_path
-            return
-        # Look for wallet file in the default data directory.
-        # Keeps backwards compatibility.
-        wallet_dir = user_dir()
-
-        # Make wallet directory if it does not yet exist.
-        if not os.path.exists(wallet_dir):
-            os.mkdir(wallet_dir)
-        self.path = os.path.join(wallet_dir, "electrum.dat")
 
     def import_key(self, keypair, password):
         address, key = keypair.split(':')
@@ -390,6 +355,7 @@ class Wallet:
             raise BaseException('Address does not match private key')
         self.imported_keys[address] = self.pw_encode( key, password )
 
+
     def new_seed(self, password):
         seed = "%032x"%ecdsa.util.randrange( pow(2,128) )
         #self.init_mpk(seed)
@@ -630,91 +596,6 @@ class Wallet:
         self.update_tx_labels()
 
 
-    def save(self):
-        # TODO: Need special config storage class. Should not be mixed
-        # up with the wallet.
-        # Settings should maybe be stored in a flat ini file.
-        s = {
-            'seed_version': self.seed_version,
-            'use_encryption': self.use_encryption,
-            'use_change': self.use_change,
-            'master_public_key': self.master_public_key.encode('hex'),
-            'fee': self.fee,
-            'server': self.server,
-            'seed': self.seed,
-            'addresses': self.addresses,
-            'change_addresses': self.change_addresses,
-            'history': self.history, 
-            'labels': self.labels,
-            'contacts': self.addressbook,
-            'imported_keys': self.imported_keys,
-            'aliases': self.aliases,
-            'authorities': self.authorities,
-            'receipts': self.receipts,
-            'num_zeros': self.num_zeros,
-            'frozen_addresses': self.frozen_addresses,
-            'prioritized_addresses': self.prioritized_addresses,
-            'gui_detailed_view': self.gui_detailed_view,
-            'gap_limit': self.gap_limit,
-            'debug_server': self.debug_server,
-            'conversion_currency': self.conversion_currency,
-            'theme': self.theme
-        }
-        f = open(self.path,"w")
-        f.write( repr(s) )
-        f.close()
-        import stat
-        os.chmod(self.path,stat.S_IREAD | stat.S_IWRITE)
-
-    def read(self):
-        """Read the contents of the wallet file."""
-        import interface
-
-        self.file_exists = False
-        try:
-            with open(self.path, "r") as f:
-                data = f.read()
-        except IOError:
-            return
-        try:
-            d = ast.literal_eval( data )  #parse raw data from reading wallet file
-            interface.old_to_new(d)
-            
-            self.seed_version = d.get('seed_version')
-            self.master_public_key = d.get('master_public_key').decode('hex')
-            self.use_encryption = d.get('use_encryption')
-            self.use_change = bool(d.get('use_change', True))
-            self.fee = int(d.get('fee'))
-            self.seed = d.get('seed')
-            self.server = d.get('server')
-            self.addresses = d.get('addresses')
-            self.change_addresses = d.get('change_addresses')
-            self.history = d.get('history')
-            self.labels = d.get('labels')
-            self.addressbook = d.get('contacts')
-            self.imported_keys = d.get('imported_keys', {})
-            self.aliases = d.get('aliases', {})
-            self.authorities = d.get('authorities', {})
-            self.receipts = d.get('receipts', {})
-            self.num_zeros = d.get('num_zeros', 0)
-            self.frozen_addresses = d.get('frozen_addresses', [])
-            self.prioritized_addresses = d.get('prioritized_addresses', [])
-            self.gui_detailed_view = d.get('gui_detailed_view', False)
-            self.gap_limit = d.get('gap_limit', 5)
-            self.debug_server = d.get('debug_server', False)
-            self.conversion_currency = d.get('conversion_currency', 'USD')
-            self.theme = d.get('theme', 'Cleanlook')
-        except:
-            raise IOError("Cannot read wallet file.")
-
-        self.update_tx_history()
-
-        if self.seed_version != SEED_VERSION:
-            raise ValueError("This wallet seed is deprecated. Please run upgrade.py for a diagnostic.")
-
-        self.file_exists = True
-
-
     def get_address_flags(self, addr):
         flags = "C" if self.is_change(addr) else "I" if addr in self.imported_keys.keys() else "-" 
         flags += "F" if addr in self.frozen_addresses else "P" if addr in self.prioritized_addresses else "-"
@@ -1134,3 +1015,29 @@ class Wallet:
             return True
         else:
             return False
+
+    def save(self):
+        s = {
+            'seed_version': self.seed_version,
+            'use_encryption': self.use_encryption,
+            'use_change': self.use_change,
+            'master_public_key': self.master_public_key.encode('hex'),
+            'fee': self.fee,
+            'seed': self.seed,
+            'addresses': self.addresses,
+            'change_addresses': self.change_addresses,
+            'history': self.history, 
+            'labels': self.labels,
+            'contacts': self.addressbook,
+            'imported_keys': self.imported_keys,
+            'aliases': self.aliases,
+            'authorities': self.authorities,
+            'receipts': self.receipts,
+            'num_zeros': self.num_zeros,
+            'frozen_addresses': self.frozen_addresses,
+            'prioritized_addresses': self.prioritized_addresses,
+            'gap_limit': self.gap_limit,
+        }
+        for k, v in s.items():
+            self.config.set_key(k,v)
+        self.config.save()