@ -39,39 +39,51 @@ def numbify(entry, is_int = False):
def init_wallet ( wallet ) :
def init_wallet ( wallet ) :
if not wallet . read ( ) :
if not wallet . read ( ) :
seed = None
while not seed :
# ask if the user wants to create a new wallet, or recover from a seed.
# if he wants to recover, and nothing is found, do not create wallet
dialog = gtk . Dialog ( " electrum " , parent = None ,
flags = gtk . DIALOG_MODAL | gtk . DIALOG_NO_SEPARATOR ,
buttons = ( " create " , 0 , " restore " , 1 , " cancel " , 2 ) )
label = gtk . Label ( " Wallet file not found. \n Do you want to create a new wallet, \n or to restore an existing one? " )
label . show ( )
dialog . vbox . pack_start ( label )
dialog . show ( )
r = dialog . run ( )
dialog . destroy ( )
if r == 2 :
exit ( 1 )
is_recovery = ( r == 1 )
if not is_recovery :
wallet . new_seed ( None )
# ask for the server.
run_settings_dialog ( wallet , is_create = True , is_recovery = False )
# generate first key
wallet . create_new_address ( False , None )
# run a dialog indicating the seed, ask the user to remember it
dialog = gtk . MessageDialog (
dialog = gtk . MessageDialog (
parent = None ,
parent = None ,
flags = gtk . DIALOG_MODAL ,
flags = gtk . DIALOG_MODAL ,
buttons = gtk . BUTTONS_OK_CANCEL ,
buttons = gtk . BUTTONS_OK ,
message_format = " Wallet not found. Please enter a seed to create or recover your wallet. Minimum length: 20 characters " )
message_format = " Your secret seed is: \n " + wallet . seed + " \n \n Please keep it in a safe place; if you lose it, you will not be able to restore your wallet. " )
p_box = gtk . HBox ( )
p_label = gtk . Label ( ' Seed: ' )
p_label . show ( )
p_box . pack_start ( p_label )
p_entry = gtk . Entry ( )
p_entry . show ( )
p_box . pack_start ( p_entry )
p_box . show ( )
dialog . vbox . pack_start ( p_box , False , True , 0 )
dialog . show ( )
dialog . show ( )
r = dialog . run ( )
r = dialog . run ( )
seed = p_entry . get_text ( )
dialog . destroy ( )
dialog . destroy ( )
if r == gtk . RESPONSE_CANCEL : exit ( 1 )
if len ( seed ) < 20 :
print len ( seed )
seed = None
# disable password during recovery
# change_password_dialog(None, wallet)
wallet . seed = seed
#ask for password
change_password_dialog ( wallet , None )
run_settings_dialog ( None , wallet , True )
else :
# ask for the server, seed and gap.
run_settings_dialog ( wallet , is_create = True , is_recovery = True )
dialog = gtk . MessageDialog (
dialog = gtk . MessageDialog (
parent = None ,
parent = None ,
@ -81,7 +93,8 @@ def init_wallet(wallet):
dialog . show ( )
dialog . show ( )
def recover_thread ( wallet , dialog , password ) :
def recover_thread ( wallet , dialog , password ) :
wallet . recover ( password )
wallet . is_found = wallet . recover ( password )
if wallet . is_found :
wallet . save ( )
wallet . save ( )
gobject . idle_add ( dialog . destroy )
gobject . idle_add ( dialog . destroy )
@ -89,17 +102,40 @@ def init_wallet(wallet):
r = dialog . run ( )
r = dialog . run ( )
dialog . destroy ( )
dialog . destroy ( )
if r == gtk . RESPONSE_CANCEL : exit ( 1 )
if r == gtk . RESPONSE_CANCEL : exit ( 1 )
if not wallet . is_found :
show_message ( " No transactions found for this seed " )
def settings_dialog ( wallet , is_recover ) :
def settings_dialog ( wallet , is_create , is_ recovery ) :
if is_create :
dialog = gtk . MessageDialog (
dialog = gtk . MessageDialog (
parent = None ,
parent = None ,
flags = gtk . DIALOG_MODAL ,
flags = gtk . DIALOG_MODAL ,
buttons = gtk . BUTTONS_OK_CANCEL ,
buttons = gtk . BUTTONS_OK_CANCEL ,
message_format = " Please indicate the server, and the gap limit if you are recovering a lost wallet. " if is_recover else ' Settings ' )
message_format = " Please indicate the server and port number " if not is_recovery else ' Please enter the seed, the server and gap ' )
else :
dialog = gtk . Dialog ( " settings " , parent = None ,
flags = gtk . DIALOG_MODAL | gtk . DIALOG_NO_SEPARATOR ,
buttons = ( " cancel " , 0 , " ok " , 1 ) )
vbox = dialog . vbox
dialog . set_default_response ( gtk . RESPONSE_OK )
dialog . set_default_response ( gtk . RESPONSE_OK )
if is_recovery :
# ask seed, server and gap in the same dialog
seed_box = gtk . HBox ( )
seed_label = gtk . Label ( ' Seed: ' )
seed_label . show ( )
seed_box . pack_start ( seed_label )
seed_entry = gtk . Entry ( )
seed_entry . show ( )
seed_box . pack_start ( seed_entry )
seed_box . show ( )
vbox . pack_start ( seed_box , False , False , 5 )
if is_recovery or ( not is_create ) :
gap = gtk . HBox ( )
gap = gtk . HBox ( )
gap_label = gtk . Label ( ' Max. gap: ' )
gap_label = gtk . Label ( ' Max. gap: ' )
gap_label . set_size_request ( 100 , 10 )
gap_label . set_size_request ( 100 , 10 )
@ -112,6 +148,7 @@ def settings_dialog(wallet, is_recover):
gap . pack_start ( gap_entry , False , False , 10 )
gap . pack_start ( gap_entry , False , False , 10 )
add_help_button ( gap , ' The maximum gap that is allowed between unused addresses in your wallet. During wallet recovery, this parameter is used to decide when to stop the recovery process. If you increase this value, you will need to remember it in order to be able to recover your wallet from seed. ' )
add_help_button ( gap , ' The maximum gap that is allowed between unused addresses in your wallet. During wallet recovery, this parameter is used to decide when to stop the recovery process. If you increase this value, you will need to remember it in order to be able to recover your wallet from seed. ' )
gap . show ( )
gap . show ( )
vbox . pack_start ( gap , False , False , 5 )
host = gtk . HBox ( )
host = gtk . HBox ( )
host_label = gtk . Label ( ' Server: ' )
host_label = gtk . Label ( ' Server: ' )
@ -124,10 +161,11 @@ def settings_dialog(wallet, is_recover):
host . pack_start ( host_entry , False , False , 10 )
host . pack_start ( host_entry , False , False , 10 )
add_help_button ( host , ' The name and port number of your Bitcoin server, separated by a colon. Example: ecdsa.org:50000 ' )
add_help_button ( host , ' The name and port number of your Bitcoin server, separated by a colon. Example: ecdsa.org:50000 ' )
host . show ( )
host . show ( )
vbox . pack_start ( host , False , False , 5 )
if not is_create :
fee = gtk . HBox ( )
fee = gtk . HBox ( )
fee_entry = gtk . Entry ( )
fee_entry = gtk . Entry ( )
if not is_recover :
fee_label = gtk . Label ( ' Tx. fee: ' )
fee_label = gtk . Label ( ' Tx. fee: ' )
fee_label . set_size_request ( 100 , 10 )
fee_label . set_size_request ( 100 , 10 )
fee_label . show ( )
fee_label . show ( )
@ -138,33 +176,41 @@ def settings_dialog(wallet, is_recover):
fee . pack_start ( fee_entry , False , False , 10 )
fee . pack_start ( fee_entry , False , False , 10 )
add_help_button ( fee , ' Transaction fee. Recommended value:0.005 ' )
add_help_button ( fee , ' Transaction fee. Recommended value:0.005 ' )
fee . show ( )
fee . show ( )
vbox . pack_start ( fee , False , False , 5 )
vbox = dialog . vbox
if not is_create :
vbox . pack_start ( host , False , False , 5 )
return dialog , fee_entry , gap_entry , host_entry
vbox . pack_start ( gap , False , False , 5 )
elif is_recovery :
vbox . pack_start ( fee , False , False , 5 )
return dialog , seed_entry , gap_entry , host_entry
return dialog , gap_entry , host_entry , fee_entry
else :
return dialog , host_entry
def run_settings_dialog ( widget , wallet , is_recovery ) :
def run_settings_dialog ( wallet , is_create , is_recovery ) :
dialog , gap_entry , host_entry , fee_entry = settings_dialog ( wallet , is_recovery )
if not is_create :
dialog , fee_entry , gap_entry , host_entry = settings_dialog ( wallet , is_create , is_recovery )
elif is_recovery :
dialog , seed_entry , gap_entry , host_entry = settings_dialog ( wallet , is_create , is_recovery )
else :
dialog , host_entry , = settings_dialog ( wallet , is_create , is_recovery )
dialog . show ( )
dialog . show ( )
r = dialog . run ( )
r = dialog . run ( )
gap = gap_entry . get_text ( )
hh = host_entry . get_text ( )
hh = host_entry . get_text ( )
fee = fee_entry . get_text ( )
if is_recovery :
gap = gap_entry . get_text ( )
seed = seed_entry . get_text ( )
dialog . destroy ( )
dialog . destroy ( )
if r == - 6 :
if r == - 6 :
if is_recovery :
exit ( 1 )
exit ( 1 )
else :
return
try :
try :
a , b = hh . split ( ' : ' )
a , b = hh . split ( ' : ' )
wallet . gap_limit = int ( gap )
wallet . host = a
wallet . host = a
wallet . port = int ( b )
wallet . port = int ( b )
wallet . fee = float ( fee )
if is_recovery :
wallet . seed = seed
wallet . gap_limit = int ( gap )
except :
except :
pass
pass
@ -205,9 +251,14 @@ def password_dialog():
dialog . destroy ( )
dialog . destroy ( )
if result : return pw
if result : return pw
def change_password_dialog ( button , wallet , icon ) :
def change_password_dialog ( wallet , icon ) :
dialog = gtk . MessageDialog ( None , gtk . DIALOG_MODAL | gtk . DIALOG_DESTROY_WITH_PARENT , gtk . MESSAGE_QUESTION , gtk . BUTTONS_OK_CANCEL ,
if icon :
' Your wallet is encrypted ' if wallet . use_encryption else ' Your wallet is not encrypted ' )
msg = ' Your wallet is encrypted ' if wallet . use_encryption else ' Your wallet is not encrypted '
else :
msg = " Please choose a password to encrypt your wallet keys "
dialog = gtk . MessageDialog ( None , gtk . DIALOG_MODAL | gtk . DIALOG_DESTROY_WITH_PARENT , gtk . MESSAGE_QUESTION , gtk . BUTTONS_OK_CANCEL , msg )
if wallet . use_encryption :
if wallet . use_encryption :
current_pw , current_pw_entry = password_line ( ' Current password: ' )
current_pw , current_pw_entry = password_line ( ' Current password: ' )
dialog . vbox . pack_start ( current_pw , False , True , 0 )
dialog . vbox . pack_start ( current_pw , False , True , 0 )
@ -308,7 +359,7 @@ class BitcoinGUI:
settings_icon . show ( )
settings_icon . show ( )
prefs_button = gtk . Button ( )
prefs_button = gtk . Button ( )
prefs_button . connect ( " clicked " , run_settings_dialog , self . wallet , False )
prefs_button . connect ( " clicked " , lambda x : run_settings_dialog ( self . wallet , False , False ) )
prefs_button . add ( settings_icon )
prefs_button . add ( settings_icon )
prefs_button . set_tooltip_text ( " Settings " )
prefs_button . set_tooltip_text ( " Settings " )
prefs_button . set_relief ( gtk . RELIEF_NONE )
prefs_button . set_relief ( gtk . RELIEF_NONE )
@ -322,7 +373,7 @@ class BitcoinGUI:
pw_icon . show ( )
pw_icon . show ( )
password_button = gtk . Button ( )
password_button = gtk . Button ( )
password_button . connect ( " clicked " , change_password_dialog , self . wallet , pw_icon )
password_button . connect ( " clicked " , lambda x : change_password_dialog ( self . wallet , pw_icon ) )
password_button . add ( pw_icon )
password_button . add ( pw_icon )
password_button . set_relief ( gtk . RELIEF_NONE )
password_button . set_relief ( gtk . RELIEF_NONE )
password_button . show ( )
password_button . show ( )