1
0

big refactoring: command line options and electrum.conf options override settings in wallet file.

This commit is contained in:
thomasv
2012-10-11 20:10:12 +02:00
parent 0d11aa75c4
commit 5444f55e6b
13 changed files with 384 additions and 364 deletions

View 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()