@ -576,6 +576,8 @@ simple_wallet::simple_wallet()
m_cmd_binder . set_handler ( " check_tx_key " , boost : : bind ( & simple_wallet : : check_tx_key , this , _1 ) , tr ( " Check amount going to <address> in <txid> " ) ) ;
m_cmd_binder . set_handler ( " show_transfers " , boost : : bind ( & simple_wallet : : show_transfers , this , _1 ) , tr ( " show_transfers [in|out] [<min_height> [<max_height>]] - Show incoming/outgoing transfers within an optional height range " ) ) ;
m_cmd_binder . set_handler ( " rescan_bc " , boost : : bind ( & simple_wallet : : rescan_blockchain , this , _1 ) , tr ( " Rescan blockchain from scratch " ) ) ;
m_cmd_binder . set_handler ( " set_tx_note " , boost : : bind ( & simple_wallet : : set_tx_note , this , _1 ) , tr ( " Set an arbitrary string note for a txid " ) ) ;
m_cmd_binder . set_handler ( " get_tx_note " , boost : : bind ( & simple_wallet : : get_tx_note , this , _1 ) , tr ( " Get a string note for a txid " ) ) ;
m_cmd_binder . set_handler ( " help " , boost : : bind ( & simple_wallet : : help , this , _1 ) , tr ( " Show this help " ) ) ;
}
//----------------------------------------------------------------------------------------------------
@ -2935,6 +2937,23 @@ bool simple_wallet::check_tx_key(const std::vector<std::string> &args_)
return true ;
}
//----------------------------------------------------------------------------------------------------
static std : : string get_human_readable_timestamp ( uint64_t ts )
{
char buffer [ 64 ] ;
if ( ts < 1234567890 )
return " <unknown> " ;
time_t tt = ts ;
struct tm tm ;
gmtime_r ( & tt , & tm ) ;
uint64_t now = time ( NULL ) ;
uint64_t diff = ts > now ? ts - now : now - ts ;
if ( diff > 24 * 3600 )
strftime ( buffer , sizeof ( buffer ) , " %F " , & tm ) ;
else
strftime ( buffer , sizeof ( buffer ) , " %r " , & tm ) ;
return std : : string ( buffer ) ;
}
//----------------------------------------------------------------------------------------------------
bool simple_wallet : : show_transfers ( const std : : vector < std : : string > & args_ )
{
std : : vector < std : : string > local_args = args_ ;
@ -3009,7 +3028,8 @@ bool simple_wallet::show_transfers(const std::vector<std::string> &args_)
std : : string payment_id = string_tools : : pod_to_hex ( i - > first ) ;
if ( payment_id . substr ( 16 ) . find_first_not_of ( ' 0 ' ) = = std : : string : : npos )
payment_id = payment_id . substr ( 0 , 16 ) ;
output . insert ( std : : make_pair ( pd . m_block_height , std : : make_pair ( true , ( boost : : format ( " %20.20s %s %s %s " ) % print_money ( pd . m_amount ) % string_tools : : pod_to_hex ( pd . m_tx_hash ) % payment_id % " - " ) . str ( ) ) ) ) ;
std : : string note = m_wallet - > get_tx_note ( pd . m_tx_hash ) ;
output . insert ( std : : make_pair ( pd . m_block_height , std : : make_pair ( true , ( boost : : format ( " %16.16s %20.20s %s %s %s %s " ) % get_human_readable_timestamp ( pd . m_timestamp ) % print_money ( pd . m_amount ) % string_tools : : pod_to_hex ( pd . m_tx_hash ) % payment_id % " - " % note ) . str ( ) ) ) ) ;
}
}
@ -3029,7 +3049,8 @@ bool simple_wallet::show_transfers(const std::vector<std::string> &args_)
std : : string payment_id = string_tools : : pod_to_hex ( i - > second . m_payment_id ) ;
if ( payment_id . substr ( 16 ) . find_first_not_of ( ' 0 ' ) = = std : : string : : npos )
payment_id = payment_id . substr ( 0 , 16 ) ;
output . insert ( std : : make_pair ( pd . m_block_height , std : : make_pair ( false , ( boost : : format ( " %20.20s %s %s %14.14s %s " ) % print_money ( pd . m_amount_in - change - fee ) % string_tools : : pod_to_hex ( i - > first ) % payment_id % print_money ( fee ) % dests ) . str ( ) ) ) ) ;
std : : string note = m_wallet - > get_tx_note ( i - > first ) ;
output . insert ( std : : make_pair ( pd . m_block_height , std : : make_pair ( false , ( boost : : format ( " %16.16s %20.20s %s %s %14.14s %s %s " ) % get_human_readable_timestamp ( pd . m_timestamp ) % print_money ( pd . m_amount_in - change - fee ) % string_tools : : pod_to_hex ( i - > first ) % payment_id % print_money ( fee ) % dests % note ) . str ( ) ) ) ) ;
}
}
@ -3052,9 +3073,10 @@ bool simple_wallet::show_transfers(const std::vector<std::string> &args_)
std : : string payment_id = string_tools : : pod_to_hex ( i - > second . m_payment_id ) ;
if ( payment_id . substr ( 16 ) . find_first_not_of ( ' 0 ' ) = = std : : string : : npos )
payment_id = payment_id . substr ( 0 , 16 ) ;
std : : string note = m_wallet - > get_tx_note ( i - > first ) ;
bool is_failed = pd . m_state = = tools : : wallet2 : : unconfirmed_transfer_details : : failed ;
if ( ( failed & & is_failed ) | | ( ! is_failed & & pending ) ) {
message_writer ( ) < < ( boost : : format ( " %8.8s %6.6s % 20.20s %s %s %14.14s" ) % ( is_failed ? tr ( " failed " ) : tr ( " pending " ) ) % tr ( " out " ) % print_money( amount - pd . m_change ) % string_tools : : pod_to_hex ( i - > first ) % payment_id % print_money ( fee ) ) . str ( ) ;
message_writer ( ) < < ( boost : : format ( " %8.8s %6.6s % 16.16s % 20.20s %s %s %14.14s % s" ) % ( is_failed ? tr ( " failed " ) : tr ( " pending " ) ) % tr ( " out " ) % get_human_readable_timestamp( pd . m_timestamp ) % print_money( amount - pd . m_change ) % string_tools : : pod_to_hex ( i - > first ) % payment_id % print_money ( fee ) % note ) . str ( ) ;
}
}
}
@ -3162,6 +3184,59 @@ bool simple_wallet::print_integrated_address(const std::vector<std::string> &arg
return true ;
}
//----------------------------------------------------------------------------------------------------
bool simple_wallet : : set_tx_note ( const std : : vector < std : : string > & args )
{
if ( args . size ( ) = = 0 )
{
fail_msg_writer ( ) < < tr ( " usage: set_tx_note [txid] free text note " ) ;
return true ;
}
cryptonote : : blobdata txid_data ;
if ( ! epee : : string_tools : : parse_hexstr_to_binbuff ( args . front ( ) , txid_data ) )
{
fail_msg_writer ( ) < < tr ( " failed to parse txid " ) ;
return false ;
}
crypto : : hash txid = * reinterpret_cast < const crypto : : hash * > ( txid_data . data ( ) ) ;
std : : string note = " " ;
for ( size_t n = 1 ; n < args . size ( ) ; + + n )
{
if ( n > 1 )
note + = " " ;
note + = args [ n ] ;
}
m_wallet - > set_tx_note ( txid , note ) ;
return true ;
}
//----------------------------------------------------------------------------------------------------
bool simple_wallet : : get_tx_note ( const std : : vector < std : : string > & args )
{
if ( args . size ( ) ! = 1 )
{
fail_msg_writer ( ) < < tr ( " usage: get_tx_note [txid] " ) ;
return true ;
}
cryptonote : : blobdata txid_data ;
if ( ! epee : : string_tools : : parse_hexstr_to_binbuff ( args . front ( ) , txid_data ) )
{
fail_msg_writer ( ) < < tr ( " failed to parse txid " ) ;
return false ;
}
crypto : : hash txid = * reinterpret_cast < const crypto : : hash * > ( txid_data . data ( ) ) ;
std : : string note = m_wallet - > get_tx_note ( txid ) ;
if ( note . empty ( ) )
success_msg_writer ( ) < < " no note found " ;
else
success_msg_writer ( ) < < " note found: " < < note ;
return true ;
}
//----------------------------------------------------------------------------------------------------
bool simple_wallet : : process_command ( const std : : vector < std : : string > & args )
{
return m_cmd_binder . process_command_vec ( args ) ;