@ -5330,7 +5330,7 @@ uint64_t wallet2::import_key_images(const std::string &filename, uint64_t &spent
}
//----------------------------------------------------------------------------------------------------
uint64_t wallet2 : : import_key_images ( const std : : vector < std : : pair < crypto : : key_image , crypto : : signature > > & signed_key_images , uint64_t & spent , uint64_t & unspent )
uint64_t wallet2 : : import_key_images ( const std : : vector < std : : pair < crypto : : key_image , crypto : : signature > > & signed_key_images , uint64_t & spent , uint64_t & unspent , bool check_spent )
{
COMMAND_RPC_IS_KEY_IMAGE_SPENT : : request req = AUTO_VAL_INIT ( req ) ;
COMMAND_RPC_IS_KEY_IMAGE_SPENT : : response daemon_resp = AUTO_VAL_INIT ( daemon_resp ) ;
@ -5379,34 +5379,88 @@ uint64_t wallet2::import_key_images(const std::vector<std::pair<crypto::key_imag
m_transfers [ n ] . m_key_image_known = true ;
}
m_daemon_rpc_mutex . lock ( ) ;
bool r = epee : : net_utils : : invoke_http_json ( " /is_key_image_spent " , req , daemon_resp , m_http_client , rpc_timeout ) ;
m_daemon_rpc_mutex . unlock ( ) ;
THROW_WALLET_EXCEPTION_IF ( ! r , error : : no_connection_to_daemon , " is_key_image_spent " ) ;
THROW_WALLET_EXCEPTION_IF ( daemon_resp . status = = CORE_RPC_STATUS_BUSY , error : : daemon_busy , " is_key_image_spent " ) ;
THROW_WALLET_EXCEPTION_IF ( daemon_resp . status ! = CORE_RPC_STATUS_OK , error : : is_key_image_spent_error , daemon_resp . status ) ;
THROW_WALLET_EXCEPTION_IF ( daemon_resp . spent_status . size ( ) ! = signed_key_images . size ( ) , error : : wallet_internal_error ,
" daemon returned wrong response for is_key_image_spent, wrong amounts count = " +
std : : to_string ( daemon_resp . spent_status . size ( ) ) + " , expected " + std : : to_string ( signed_key_images . size ( ) ) ) ;
if ( check_spent )
{
m_daemon_rpc_mutex . lock ( ) ;
bool r = epee : : net_utils : : invoke_http_json ( " /is_key_image_spent " , req , daemon_resp , m_http_client , rpc_timeout ) ;
m_daemon_rpc_mutex . unlock ( ) ;
THROW_WALLET_EXCEPTION_IF ( ! r , error : : no_connection_to_daemon , " is_key_image_spent " ) ;
THROW_WALLET_EXCEPTION_IF ( daemon_resp . status = = CORE_RPC_STATUS_BUSY , error : : daemon_busy , " is_key_image_spent " ) ;
THROW_WALLET_EXCEPTION_IF ( daemon_resp . status ! = CORE_RPC_STATUS_OK , error : : is_key_image_spent_error , daemon_resp . status ) ;
THROW_WALLET_EXCEPTION_IF ( daemon_resp . spent_status . size ( ) ! = signed_key_images . size ( ) , error : : wallet_internal_error ,
" daemon returned wrong response for is_key_image_spent, wrong amounts count = " +
std : : to_string ( daemon_resp . spent_status . size ( ) ) + " , expected " + std : : to_string ( signed_key_images . size ( ) ) ) ;
for ( size_t n = 0 ; n < daemon_resp . spent_status . size ( ) ; + + n )
{
transfer_details & td = m_transfers [ n ] ;
td . m_spent = daemon_resp . spent_status [ n ] ! = COMMAND_RPC_IS_KEY_IMAGE_SPENT : : UNSPENT ;
}
}
spent = 0 ;
unspent = 0 ;
for ( size_t n = 0 ; n < daemon_resp . spent_status . size ( ) ; + + n )
for ( size_t i = 0 ; i < m_transfers . size ( ) ; + + i )
{
transfer_details & td = m_transfers [ n ] ;
transfer_details & td = m_transfers [ i ] ;
uint64_t amount = td . amount ( ) ;
td . m_spent = daemon_resp . spent_status [ n ] ! = COMMAND_RPC_IS_KEY_IMAGE_SPENT : : UNSPENT ;
if ( td . m_spent )
spent + = amount ;
else
unspent + = amount ;
LOG_PRINT_L2 ( " Transfer " < < n < < " : " < < print_money ( amount ) < < " ( " < < td . m_global_output_index < < " ): "
< < ( td . m_spent ? " spent " : " unspent " ) < < " (key image " < < req . key_images [ n ] < < " ) " ) ;
LOG_PRINT_L2 ( " Transfer " < < i < < " : " < < print_money ( amount ) < < " ( " < < td . m_global_output_index < < " ): "
< < ( td . m_spent ? " spent " : " unspent " ) < < " (key image " < < req . key_images [ i ] < < " ) " ) ;
}
LOG_PRINT_L1 ( " Total: " < < print_money ( spent ) < < " spent, " < < print_money ( unspent ) < < " unspent " ) ;
MDEBUG ( " Total: " < < print_money ( spent ) < < " spent, " < < print_money ( unspent ) < < " unspent " ) ;
return m_transfers [ signed_key_images . size ( ) - 1 ] . m_block_height ;
}
wallet2 : : payment_container wallet2 : : export_payments ( ) const
{
payment_container payments ;
for ( auto const & p : m_payments )
{
payments . emplace ( p ) ;
}
return payments ;
}
void wallet2 : : import_payments ( const payment_container & payments )
{
m_payments . clear ( ) ;
for ( auto const & p : payments )
{
m_payments . emplace ( p ) ;
}
}
void wallet2 : : import_payments_out ( const std : : list < std : : pair < crypto : : hash , wallet2 : : confirmed_transfer_details > > & confirmed_payments )
{
m_confirmed_txs . clear ( ) ;
for ( auto const & p : confirmed_payments )
{
m_confirmed_txs . emplace ( p ) ;
}
}
std : : vector < crypto : : hash > wallet2 : : export_blockchain ( ) const
{
std : : vector < crypto : : hash > bc ;
for ( auto const & b : m_blockchain )
{
bc . push_back ( b ) ;
}
return bc ;
}
void wallet2 : : import_blockchain ( const std : : vector < crypto : : hash > & bc )
{
m_blockchain . clear ( ) ;
for ( auto const & b : bc )
{
m_blockchain . push_back ( b ) ;
}
cryptonote : : block genesis ;
generate_genesis ( genesis ) ;
crypto : : hash genesis_hash = get_block_hash ( genesis ) ;
check_genesis ( genesis_hash ) ;
m_local_bc_height = m_blockchain . size ( ) ;
}
//----------------------------------------------------------------------------------------------------
std : : vector < tools : : wallet2 : : transfer_details > wallet2 : : export_outputs ( ) const
{