@ -1842,7 +1842,11 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
// (that is, the prunable stuff may or may not be included)
if ( ! miner_tx & & ! pool )
process_unconfirmed ( txid , tx , height ) ;
std : : unordered_map < cryptonote : : subaddress_index , uint64_t > tx_money_got_in_outs ; // per receiving subaddress index
// per receiving subaddress index
std : : unordered_map < cryptonote : : subaddress_index , uint64_t > tx_money_got_in_outs ;
std : : unordered_map < cryptonote : : subaddress_index , amounts_container > tx_amounts_individual_outs ;
crypto : : public_key tx_pub_key = null_pkey ;
bool notify = false ;
@ -1971,6 +1975,10 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
{
hwdev . conceal_derivation ( tx_scan_info [ i ] . received - > derivation , tx_pub_key , additional_tx_pub_keys . data , derivation , additional_derivations ) ;
scan_output ( tx , miner_tx , tx_pub_key , i , tx_scan_info [ i ] , num_vouts_received , tx_money_got_in_outs , outs , pool ) ;
if ( ! tx_scan_info [ i ] . error )
{
tx_amounts_individual_outs [ tx_scan_info [ i ] . received - > index ] . push_back ( tx_scan_info [ i ] . money_transfered ) ;
}
}
}
}
@ -1994,6 +2002,10 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
{
hwdev . conceal_derivation ( tx_scan_info [ i ] . received - > derivation , tx_pub_key , additional_tx_pub_keys . data , derivation , additional_derivations ) ;
scan_output ( tx , miner_tx , tx_pub_key , i , tx_scan_info [ i ] , num_vouts_received , tx_money_got_in_outs , outs , pool ) ;
if ( ! tx_scan_info [ i ] . error )
{
tx_amounts_individual_outs [ tx_scan_info [ i ] . received - > index ] . push_back ( tx_scan_info [ i ] . money_transfered ) ;
}
}
}
}
@ -2010,6 +2022,10 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
hwdev . set_mode ( hw : : device : : NONE ) ;
hwdev . conceal_derivation ( tx_scan_info [ i ] . received - > derivation , tx_pub_key , additional_tx_pub_keys . data , derivation , additional_derivations ) ;
scan_output ( tx , miner_tx , tx_pub_key , i , tx_scan_info [ i ] , num_vouts_received , tx_money_got_in_outs , outs , pool ) ;
if ( ! tx_scan_info [ i ] . error )
{
tx_amounts_individual_outs [ tx_scan_info [ i ] . received - > index ] . push_back ( tx_scan_info [ i ] . money_transfered ) ;
}
}
}
}
@ -2118,6 +2134,12 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
THROW_WALLET_EXCEPTION_IF ( tx_money_got_in_outs [ tx_scan_info [ o ] . received - > index ] < tx_scan_info [ o ] . amount ,
error : : wallet_internal_error , " Unexpected values of new and old outputs " ) ;
tx_money_got_in_outs [ tx_scan_info [ o ] . received - > index ] - = tx_scan_info [ o ] . amount ;
amounts_container & tx_amounts_this_out = tx_amounts_individual_outs [ tx_scan_info [ o ] . received - > index ] ; // Only for readability on the following lines
auto amount_iterator = std : : find ( tx_amounts_this_out . begin ( ) , tx_amounts_this_out . end ( ) , tx_scan_info [ o ] . amount ) ;
THROW_WALLET_EXCEPTION_IF ( amount_iterator = = tx_amounts_this_out . end ( ) ,
error : : wallet_internal_error , " Unexpected values of new and old outputs " ) ;
tx_amounts_this_out . erase ( amount_iterator ) ;
}
else
{
@ -2183,6 +2205,8 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
}
}
THROW_WALLET_EXCEPTION_IF ( tx_money_got_in_outs . size ( ) ! = tx_amounts_individual_outs . size ( ) , error : : wallet_internal_error , " Inconsistent size of output arrays " ) ;
uint64_t tx_money_spent_in_ins = 0 ;
// The line below is equivalent to "boost::optional<uint32_t> subaddr_account;", but avoids the GCC warning: ‘ *((void*)& subaddr_account +4)’ may be used uninitialized in this function
// It's a GCC bug with boost::optional, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47679
@ -2286,6 +2310,7 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
if ( subaddr_account & & i - > first . major = = * subaddr_account )
{
sub_change + = i - > second ;
tx_amounts_individual_outs . erase ( i - > first ) ;
i = tx_money_got_in_outs . erase ( i ) ;
}
else
@ -2363,6 +2388,7 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
payment . m_tx_hash = txid ;
payment . m_fee = fee ;
payment . m_amount = i . second ;
payment . m_amounts = tx_amounts_individual_outs [ i . first ] ;
payment . m_block_height = height ;
payment . m_unlock_time = tx . unlock_time ;
payment . m_timestamp = ts ;