@ -229,12 +229,15 @@ namespace
const char * USAGE_HELP ( " help " ) ;
const char * USAGE_HELP_ADVANCED ( " help_advanced [<command>] " ) ;
std : : string input_line ( const std : : string & prompt )
std : : string input_line ( const std : : string & prompt , bool yesno = false )
{
# ifdef HAVE_READLINE
rdln : : suspend_readline pause_readline ;
# endif
std : : cout < < prompt ;
if ( yesno )
std : : cout < < " (Y/Yes/N/No) " ;
std : : cout < < " : " < < std : : flush ;
std : : string buf ;
# ifdef _WIN32
@ -424,10 +427,10 @@ namespace
< < " , " < < dnssec_str < < std : : endl
< < sw : : tr ( " Wownero Address = " ) < < addresses [ 0 ]
< < std : : endl
< < sw : : tr ( " Is this OK? (Y/n) " )
< < sw : : tr ( " Is this OK? " )
;
// prompt the user for confirmation given the dns query and dnssec status
std : : string confirm_dns_ok = input_line ( prompt . str ( ) );
std : : string confirm_dns_ok = input_line ( prompt . str ( ) , true );
if ( std : : cin . eof ( ) )
{
return { } ;
@ -595,7 +598,7 @@ namespace
fail_msg_writer ( ) < < boost : : format ( sw : : tr ( " File %s likely stores wallet private keys! Use a different file name. " ) ) % filename ;
return false ;
}
return command_line : : is_yes ( input_line ( ( boost : : format ( sw : : tr ( " File %s already exists. Are you sure to overwrite it? (Y/Yes/N/No): " ) ) % filename ) . str ( ) ) ) ;
return command_line : : is_yes ( input_line ( ( boost : : format ( sw : : tr ( " File %s already exists. Are you sure to overwrite it? " ) ) % filename ) . str ( ) , true ) ) ;
}
return true ;
}
@ -3153,9 +3156,9 @@ bool simple_wallet::ask_wallet_create_if_needed()
LOG_PRINT_L3 ( " User asked to specify wallet file name. " ) ;
wallet_path = input_line (
tr ( m_restoring ? " Specify a new wallet file name for your restored wallet (e.g., MyWallet). \n "
" Wallet file name (or Ctrl-C to quit) : " :
" Wallet file name (or Ctrl-C to quit) " :
" Specify wallet file name (e.g., MyWallet). If the wallet doesn't exist, it will be created. \n "
" Wallet file name (or Ctrl-C to quit) : " )
" Wallet file name (or Ctrl-C to quit) " )
) ;
if ( std : : cin . eof ( ) )
{
@ -3202,7 +3205,7 @@ bool simple_wallet::ask_wallet_create_if_needed()
if ( ! m_restoring )
{
message_writer ( ) < < tr ( " No wallet found with that name. Confirm creation of new wallet named: " ) < < wallet_path ;
confirm_creation = input_line ( tr ( " (Y/Yes/N/No): " ) ) ;
confirm_creation = input_line ( " " , true ) ;
if ( std : : cin . eof ( ) )
{
LOG_ERROR ( " Unexpected std::cin.eof() - Exited simple_wallet::ask_wallet_create_if_needed() " ) ;
@ -3411,7 +3414,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
{
m_wallet_file = m_generate_from_view_key ;
// parse address
std : : string address_string = input_line ( " Standard address : " ) ;
std : : string address_string = input_line ( " Standard address " ) ;
if ( std : : cin . eof ( ) )
return false ;
if ( address_string . empty ( ) ) {
@ -3486,7 +3489,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
{
m_wallet_file = m_generate_from_keys ;
// parse address
std : : string address_string = input_line ( " Standard address : " ) ;
std : : string address_string = input_line ( " Standard address " ) ;
if ( std : : cin . eof ( ) )
return false ;
if ( address_string . empty ( ) ) {
@ -3568,7 +3571,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
unsigned int multisig_n ;
// parse multisig type
std : : string multisig_type_string = input_line ( " Multisig type (input as M/N with M <= N and M > 1) : " ) ;
std : : string multisig_type_string = input_line ( " Multisig type (input as M/N with M <= N and M > 1) " ) ;
if ( std : : cin . eof ( ) )
return false ;
if ( multisig_type_string . empty ( ) )
@ -3594,7 +3597,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
message_writer ( ) < < boost : : format ( tr ( " Generating master wallet from %u of %u multisig wallet keys " ) ) % multisig_m % multisig_n ;
// parse multisig address
std : : string address_string = input_line ( " Multisig wallet address : " ) ;
std : : string address_string = input_line ( " Multisig wallet address " ) ;
if ( std : : cin . eof ( ) )
return false ;
if ( address_string . empty ( ) ) {
@ -3725,7 +3728,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
wrt < < tr ( " Assumed you are creating a new account, restore will be done from current estimated blockchain height. " ) ;
wrt < < tr ( " Use --restore-height or --restore-date if you want to restore an already setup account from a specific height " ) ;
}
std : : string confirm = input_line ( tr ( " Is this okay? (Y/Yes/N/No): " ) ) ;
std : : string confirm = input_line ( tr ( " Is this okay? " ) , true ) ;
if ( std : : cin . eof ( ) | | ! command_line : : is_yes ( confirm ) )
CHECK_AND_ASSERT_MES ( false , false , tr ( " account creation aborted " ) ) ;
@ -3781,9 +3784,9 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
{
std : : string heightstr ;
if ( ! connected | | version < MAKE_CORE_RPC_VERSION ( 1 , 6 ) )
heightstr = input_line ( " Restore from specific blockchain height (optional, default 0) : " ) ;
heightstr = input_line ( " Restore from specific blockchain height (optional, default 0) " ) ;
else
heightstr = input_line ( " Restore from specific blockchain height (optional, default 0), \n or alternatively from specific date (YYYY-MM-DD) : " ) ;
heightstr = input_line ( " Restore from specific blockchain height (optional, default 0), \n or alternatively from specific date (YYYY-MM-DD) " ) ;
if ( std : : cin . eof ( ) )
return false ;
if ( heightstr . empty ( ) )
@ -3812,7 +3815,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
return false ;
m_restore_height = m_wallet - > get_blockchain_height_by_date ( year , month , day ) ;
success_msg_writer ( ) < < tr ( " Restore height is: " ) < < m_restore_height ;
std : : string confirm = input_line ( tr ( " Is this okay? (Y/Yes/N/No): " ) ) ;
std : : string confirm = input_line ( tr ( " Is this okay? " ) , true ) ;
if ( std : : cin . eof ( ) )
return false ;
if ( command_line : : is_yes ( confirm ) )
@ -3835,7 +3838,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
if ( m_restore_height > = estimate_height )
{
success_msg_writer ( ) < < tr ( " Restore height " ) < < m_restore_height < < ( " is not yet reached. The current estimated height is " ) < < estimate_height ;
std : : string confirm = input_line ( tr ( " Still apply restore height? (Y/Yes/N/No): " ) ) ;
std : : string confirm = input_line ( tr ( " Still apply restore height? " ) , true ) ;
if ( std : : cin . eof ( ) | | command_line : : is_no ( confirm ) )
m_restore_height = 0 ;
}
@ -3967,7 +3970,7 @@ std::string simple_wallet::get_mnemonic_language()
}
while ( language_number < 0 )
{
language_choice = input_line ( tr ( " Enter the number corresponding to the language of your choice : " ) ) ;
language_choice = input_line ( tr ( " Enter the number corresponding to the language of your choice " ) ) ;
if ( std : : cin . eof ( ) )
return std : : string ( ) ;
try
@ -5394,7 +5397,7 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
// prompt is there is no payment id and confirmation is required
if ( ! payment_id_seen & & m_wallet - > confirm_missing_payment_id ( ) & & dsts . size ( ) > num_subaddresses )
{
std : : string accepted = input_line ( tr ( " There is no easy way for exchanges and large merchants to identify that this transaction came from you. Request a subaddress in these cases. Continue anyway? (Y/Yes/N/No): " ) ) ;
std : : string accepted = input_line ( tr ( " There is no easy way for exchanges and large merchants to identify that this transaction came from you. Request a subaddress in these cases. Continue anyway? " ) , true ) ;
if ( std : : cin . eof ( ) )
return false ;
if ( ! command_line : : is_yes ( accepted ) )
@ -5458,23 +5461,23 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
std : : vector < std : : pair < uint64_t , uint64_t > > nblocks = m_wallet - > estimate_backlog ( { std : : make_pair ( worst_fee_per_byte , worst_fee_per_byte ) } ) ;
if ( nblocks . size ( ) ! = 1 )
{
prompt < < " Internal error checking for backlog. " < < tr ( " Is this okay anyway? (Y/Yes/N/No): " ) ;
prompt < < " Internal error checking for backlog. " < < tr ( " Is this okay anyway? " ) ;
}
else
{
if ( nblocks [ 0 ] . first > m_wallet - > get_confirm_backlog_threshold ( ) )
prompt < < ( boost : : format ( tr ( " There is currently a %u block backlog at that fee level. Is this okay? (Y/Yes/N/No): " ) ) % nblocks [ 0 ] . first ) . str ( ) ;
prompt < < ( boost : : format ( tr ( " There is currently a %u block backlog at that fee level. Is this okay? " ) ) % nblocks [ 0 ] . first ) . str ( ) ;
}
}
catch ( const std : : exception & e )
{
prompt < < tr ( " Failed to check for backlog: " ) < < e . what ( ) < < ENDL < < tr ( " Is this okay anyway? (Y/Yes/N/No): " ) ;
prompt < < tr ( " Failed to check for backlog: " ) < < e . what ( ) < < ENDL < < tr ( " Is this okay anyway? " ) ;
}
std : : string prompt_str = prompt . str ( ) ;
if ( ! prompt_str . empty ( ) )
{
std : : string accepted = input_line ( prompt_str );
std : : string accepted = input_line ( prompt_str , true );
if ( std : : cin . eof ( ) )
return false ;
if ( ! command_line : : is_yes ( accepted ) )
@ -5560,9 +5563,9 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
{
prompt < < tr ( " WARNING: this is a non default ring size, which may harm your privacy. Default is recommended. " ) ;
}
prompt < < ENDL < < tr ( " Is this okay? (Y/Yes/N/No): " ) ;
prompt < < ENDL < < tr ( " Is this okay? " ) ;
std : : string accepted = input_line ( prompt . str ( ) );
std : : string accepted = input_line ( prompt . str ( ) , true );
if ( std : : cin . eof ( ) )
return false ;
if ( ! command_line : : is_yes ( accepted ) )
@ -5700,17 +5703,17 @@ bool simple_wallet::sweep_unmixable(const std::vector<std::string> &args_)
std : : string prompt_str = tr ( " Sweeping " ) + print_money ( total_unmixable ) ;
if ( ptx_vector . size ( ) > 1 ) {
prompt_str = ( boost : : format ( tr ( " Sweeping %s in %llu transactions for a total fee of %s. Is this okay? (Y/Yes/N/No): " ) ) %
prompt_str = ( boost : : format ( tr ( " Sweeping %s in %llu transactions for a total fee of %s. Is this okay? " ) ) %
print_money ( total_unmixable ) %
( ( unsigned long long ) ptx_vector . size ( ) ) %
print_money ( total_fee ) ) . str ( ) ;
}
else {
prompt_str = ( boost : : format ( tr ( " Sweeping %s for a total fee of %s. Is this okay? (Y/Yes/N/No): " ) ) %
prompt_str = ( boost : : format ( tr ( " Sweeping %s for a total fee of %s. Is this okay? " ) ) %
print_money ( total_unmixable ) %
print_money ( total_fee ) ) . str ( ) ;
}
std : : string accepted = input_line ( prompt_str );
std : : string accepted = input_line ( prompt_str , true );
if ( std : : cin . eof ( ) )
return true ;
if ( ! command_line : : is_yes ( accepted ) )
@ -5753,7 +5756,7 @@ bool simple_wallet::sweep_unmixable(const std::vector<std::string> &args_)
catch ( const tools : : error : : not_enough_unlocked_money & e )
{
fail_msg_writer ( ) < < tr ( " Not enough money in unlocked balance " ) ;
std : : string accepted = input_line ( ( boost : : format ( tr ( " Discarding %s of unmixable outputs that cannot be spent, which can be undone by \" rescan_spent \" . Is this okay? (Y/Yes/N/No): " ) ) % print_money ( e . available ( ) ) ) . str ( ) ) ;
std : : string accepted = input_line ( ( boost : : format ( tr ( " Discarding %s of unmixable outputs that cannot be spent, which can be undone by \" rescan_spent \" . Is this okay? " ) ) % print_money ( e . available ( ) ) ) . str ( ) , true ) ;
if ( std : : cin . eof ( ) )
return true ;
if ( command_line : : is_yes ( accepted ) )
@ -5961,7 +5964,7 @@ bool simple_wallet::sweep_main(uint64_t below, bool locked, const std::vector<st
// prompt is there is no payment id and confirmation is required
if ( ! payment_id_seen & & m_wallet - > confirm_missing_payment_id ( ) & & ! info . is_subaddress )
{
std : : string accepted = input_line ( tr ( " There is no easy way for exchanges and large merchants to identify that this transaction came from you. Request a subaddress in these cases. Continue anyway? (Y/Yes/N/No): " ) ) ;
std : : string accepted = input_line ( tr ( " There is no easy way for exchanges and large merchants to identify that this transaction came from you. Request a subaddress in these cases. Continue anyway? " ) , true ) ;
if ( std : : cin . eof ( ) )
return true ;
if ( ! command_line : : is_yes ( accepted ) )
@ -6009,17 +6012,17 @@ bool simple_wallet::sweep_main(uint64_t below, bool locked, const std::vector<st
if ( m_wallet - > print_ring_members ( ) & & ! print_ring_members ( ptx_vector , prompt ) )
return true ;
if ( ptx_vector . size ( ) > 1 ) {
prompt < < boost : : format ( tr ( " Sweeping %s in %llu transactions for a total fee of %s. Is this okay? (Y/Yes/N/No): " ) ) %
prompt < < boost : : format ( tr ( " Sweeping %s in %llu transactions for a total fee of %s. Is this okay? " ) ) %
print_money ( total_sent ) %
( ( unsigned long long ) ptx_vector . size ( ) ) %
print_money ( total_fee ) ;
}
else {
prompt < < boost : : format ( tr ( " Sweeping %s for a total fee of %s. Is this okay? (Y/Yes/N/No): " ) ) %
prompt < < boost : : format ( tr ( " Sweeping %s for a total fee of %s. Is this okay? " ) ) %
print_money ( total_sent ) %
print_money ( total_fee ) ;
}
std : : string accepted = input_line ( prompt . str ( ) );
std : : string accepted = input_line ( prompt . str ( ) , true );
if ( std : : cin . eof ( ) )
return true ;
if ( ! command_line : : is_yes ( accepted ) )
@ -6229,7 +6232,7 @@ bool simple_wallet::sweep_single(const std::vector<std::string> &args_)
// prompt if there is no payment id and confirmation is required
if ( ! payment_id_seen & & m_wallet - > confirm_missing_payment_id ( ) & & ! info . is_subaddress )
{
std : : string accepted = input_line ( tr ( " There is no easy way for exchanges and large merchants to identify that this transaction came from you. Request a subaddress in these cases. Continue anyway? (Y/Yes/N/No): " ) ) ;
std : : string accepted = input_line ( tr ( " There is no easy way for exchanges and large merchants to identify that this transaction came from you. Request a subaddress in these cases. Continue anyway? " ) , true ) ;
if ( std : : cin . eof ( ) )
return true ;
if ( ! command_line : : is_yes ( accepted ) )
@ -6271,10 +6274,10 @@ bool simple_wallet::sweep_single(const std::vector<std::string> &args_)
std : : ostringstream prompt ;
if ( ! print_ring_members ( ptx_vector , prompt ) )
return true ;
prompt < < boost : : format ( tr ( " Sweeping %s for a total fee of %s. Is this okay? (Y/Yes/N/No): " ) ) %
prompt < < boost : : format ( tr ( " Sweeping %s for a total fee of %s. Is this okay? " ) ) %
print_money ( total_sent ) %
print_money ( total_fee ) ;
std : : string accepted = input_line ( prompt . str ( ) );
std : : string accepted = input_line ( prompt . str ( ) , true );
if ( std : : cin . eof ( ) )
return true ;
if ( ! command_line : : is_yes ( accepted ) )
@ -6552,8 +6555,8 @@ bool simple_wallet::accept_loaded_tx(const std::function<size_t()> get_num_txes,
change_string + = tr ( " no change " ) ;
uint64_t fee = amount - amount_to_dests ;
std : : string prompt_str = ( boost : : format ( tr ( " Loaded %lu transactions, for %s, fee %s, %s, %s, with min ring size %lu, %s. %sIs this okay? (Y/Yes/N/No): " ) ) % ( unsigned long ) get_num_txes ( ) % print_money ( amount ) % print_money ( fee ) % dest_string % change_string % ( unsigned long ) min_ring_size % payment_id_string % extra_message ) . str ( ) ;
return command_line : : is_yes ( input_line ( prompt_str )) ;
std : : string prompt_str = ( boost : : format ( tr ( " Loaded %lu transactions, for %s, fee %s, %s, %s, with min ring size %lu, %s. %sIs this okay? " ) ) % ( unsigned long ) get_num_txes ( ) % print_money ( amount ) % print_money ( fee ) % dest_string % change_string % ( unsigned long ) min_ring_size % payment_id_string % extra_message ) . str ( ) ;
return command_line : : is_yes ( input_line ( prompt_str , true )) ;
}
//----------------------------------------------------------------------------------------------------
bool simple_wallet : : accept_loaded_tx ( const tools : : wallet2 : : unsigned_tx_set & txs )
@ -7711,7 +7714,7 @@ bool simple_wallet::rescan_blockchain(const std::vector<std::string> &args_)
{
message_writer ( ) < < tr ( " Warning: this will lose any information which can not be recovered from the blockchain. " ) ;
message_writer ( ) < < tr ( " This includes destination addresses, tx secret keys, tx notes, etc " ) ;
std : : string confirm = input_line ( tr ( " Rescan anyway ? (Y/Yes/N/No): " ) ) ;
std : : string confirm = input_line ( tr ( " Rescan anyway ?" ) , true ) ;
if ( ! std : : cin . eof ( ) )
{
if ( ! command_line : : is_yes ( confirm ) )