parser.add_option("-g", "--gui", dest="gui", help="User interface: qt, lite, gtk, text or stdio")
parser.add_option("-w", "--wallet", dest="wallet_path", help="wallet path (default: electrum.dat)")
parser.add_option("-o", "--offline", action="store_true", dest="offline", default=False, help="remain offline")
+ parser.add_option("-C", "--concealed", action="store_true", dest="concealed", default=False, help="don't echo seed to console when restoring")
parser.add_option("-a", "--all", action="store_true", dest="show_all", default=False, help="show all addresses")
- parser.add_option("-b", "--balance", action="store_true", dest="show_balance", default=False, help="show the balance of listed addresses")
parser.add_option("-l", "--labels", action="store_true", dest="show_labels", default=False, help="show the labels of listed addresses")
parser.add_option("-f", "--fee", dest="tx_fee", default=None, help="set tx fee")
parser.add_option("-F", "--fromaddr", dest="from_addr", default=None, help="set source address for payto/mktx. if it isn't in the wallet, it will ask for the private key unless supplied in the format public_key:private_key. It's not saved in the wallet.")
parser.add_option("-u", "--usb", dest="bitkey", action="store_true", help="Turn on support for hardware wallets (EXPERIMENTAL)")
parser.add_option("-G", "--gap", dest="gap_limit", default=None, help="gap limit")
parser.add_option("-W", "--password", dest="password", default=None, help="set password for usage with commands (currently only implemented for create command, do not use it for longrunning gui session since the password is visible in /proc)")
+ parser.add_option("-1", "--oneserver", action="store_true", dest="oneserver", default=False, help="connect to one server only")
return parser
def print_help(parser):
def run_command(cmd, password = None, args = []):
cmd_runner = Commands(wallet, network)
- func = eval('cmd_runner.' + cmd)
+ func = getattr(cmd_runner, cmd)
cmd_runner.password = password
try:
result = func(*args[1:])
- except BaseException, e:
+ except Exception as e:
import traceback
traceback.print_exc(file=sys.stdout)
sys.exit(1)
parser = arg_parser()
options, args = parser.parse_args()
if options.portable and options.wallet_path is None:
- options.wallet_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'electrum.dat')
+ options.electrum_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'electrum_data')
# config is an object passed to the various constructors (wallet, interface, gui)
if is_android:
config_options = {'portable':True, 'verbose':True, 'gui':'android', 'auto_cycle':True}
else:
- config_options = eval(str(options))
+ config_options = vars(options)
for k, v in config_options.items():
if v is None: config_options.pop(k)
#sys.exit("Error: Unknown GUI: " + gui_name )
# network interface
- network = Network(config)
- network.start()
+ if not options.offline:
+ network = Network(config)
+ network.start()
+ else:
+ network = None
gui = gui.ElectrumGui(config, network)
gui.main(url)
- network.stop()
+ if network:
+ network.stop()
+
# we use daemon threads, their termination is enforced.
# this sleep command gives them time to terminate cleanly.
time.sleep(0.1)
if gap: wallet.change_gap_limit(int(gap))
if cmd.name == 'restore':
- seed = raw_input("seed:")
+ import getpass
+ seed = getpass.getpass(prompt = "seed:", stream = None) if options.concealed else raw_input("seed:")
try:
seed.decode('hex')
- except:
+ except Exception:
print_error("Warning: Not hex, trying decode.")
seed = mnemonic_decode( seed.split(' ') )
if not seed:
wallet.init_seed( str(seed) )
wallet.save_seed()
- network = Network(config)
- network.start()
- wallet.start_threads(network)
-
- print_msg("Recovering wallet...")
- wallet.restore(lambda x: x)
-
- if wallet.is_found():
- print_msg("Recovery successful")
+ if not options.offline:
+ network = Network(config)
+ network.start()
+ wallet.start_threads(network)
+
+ print_msg("Recovering wallet...")
+ wallet.restore(lambda x: x)
+
+ if wallet.is_found():
+ print_msg("Recovery successful")
+ else:
+ print_msg("Warning: Found no history for this wallet")
else:
- print_msg("Warning: Found no history for this wallet")
+ wallet.synchronize()
+ print_msg("Warning: This wallet was restored offline. It may contain more addresses than displayed.")
else:
wallet.init_seed(None)
wallet.save_seed()
- wallet.create_accounts()
wallet.synchronize()
- print_msg("Your wallet generation seed is: " + wallet.seed)
+ print_msg("Your wallet generation seed is:\n\"%s\""% wallet.get_mnemonic(None))
print_msg("Please keep it in a safe place; if you lose it, you will not be able to restore your wallet.")
- print_msg("Equivalently, your wallet seed can be stored and recovered with the following mnemonic code:")
- print_msg("\""+' '.join(mnemonic_encode(wallet.seed))+"\"")
print_msg("Wallet saved in '%s'"%wallet.storage.path)
if password:
- wallet.update_password(wallet.seed, None, password)
+ wallet.update_password(None, password)
# terminate
sys.exit(0)
exit(1)
# check password
try:
- seed = wallet.decode_seed(password)
- except:
+ seed = wallet.get_seed(password)
+ except Exception:
print_msg("Error: This password does not decode this wallet.")
exit(1)
else:
password = None
- seed = wallet.seed
+ seed = wallet.get_seed(None)
else:
password = None
args = [ cmd, json.loads(args[1]), json.loads(args[2])]
elif cmd.name == 'listaddresses':
- args = [cmd, options.show_all, options.show_balance, options.show_labels]
+ args = [cmd, options.show_all, options.show_labels]
elif cmd.name in ['payto', 'mktx']:
domain = [options.from_addr] if options.from_addr else None
if not wallet.seed:
print_msg("Error: This wallet has no seed")
else:
- ns = wallet.config.path + '.seedless'
+ ns = wallet.storage.path + '.seedless'
print_msg("Warning: you are going to create a seedless wallet'\nIt will be saved in '%s'"%ns)
if raw_input("Are you sure you want to continue? (y/n) ") in ['y','Y','yes']:
- wallet.config.path = ns
+ wallet.storage.path = ns
wallet.seed = ''
wallet.storage.put('seed', '', True)
wallet.use_encryption = False
wallet.storage.put('use_encryption', wallet.use_encryption, True)
for k in wallet.imported_keys.keys(): wallet.imported_keys[k] = ''
- wallet.config.set_key('imported_keys',wallet.imported_keys, True)
+ wallet.storage.put('imported_keys',wallet.imported_keys, True)
print_msg("Done.")
else:
print_msg("Action canceled.")
elif cmd.name == 'getconfig':
key = args[1]
- print_msg(config.get(key))
+ out = config.get(key)
+ print_msg(out)
elif cmd.name == 'setconfig':
key, value = args[1:3]
- if key not in ['seed', 'seed_version', 'master_public_key', 'use_encryption']:
- config.set_key(key, value, True)
- print_msg(True)
- else:
- print_msg(False)
+ config.set_key(key, value, True)
+ print_msg(True)
elif cmd.name == 'password':
new_password = prompt_password('New password:')