@ -6524,8 +6524,8 @@ void wallet2::commit_tx(pending_tx& ptx)
add_unconfirmed_tx ( ptx . tx , amount_in , dests , payment_id , ptx . change_dts . amount , ptx . construction_data . subaddr_account , ptx . construction_data . subaddr_indices ) ;
if ( store_tx_info ( ) & & ptx . tx_key ! = crypto : : null_skey )
{
m_tx_keys .insert ( std : : make_pair ( txid , ptx . tx_key ) ) ;
m_additional_tx_keys .insert ( std : : make_pair ( txid , ptx . additional_tx_keys ) ) ;
m_tx_keys [txid ] = ptx . tx_key ;
m_additional_tx_keys [txid ] = ptx . additional_tx_keys ;
}
LOG_PRINT_L2 ( " transaction " < < txid < < " generated ok and sent to daemon, key_images: [ " < < ptx . key_images < < " ] " ) ;
@ -6745,8 +6745,8 @@ bool wallet2::sign_tx(unsigned_tx_set &exported_txs, std::vector<wallet2::pendin
if ( store_tx_info ( ) & & tx_key ! = crypto : : null_skey )
{
const crypto : : hash txid = get_transaction_hash ( ptx . tx ) ;
m_tx_keys .insert ( std : : make_pair ( txid , tx_key ) ) ;
m_additional_tx_keys .insert ( std : : make_pair ( txid , additional_tx_keys ) ) ;
m_tx_keys [txid ] = tx_key ;
m_additional_tx_keys [txid ] = additional_tx_keys ;
}
std : : string key_images ;
@ -7194,8 +7194,8 @@ bool wallet2::load_multisig_tx(cryptonote::blobdata s, multisig_tx_set &exported
const crypto : : hash txid = get_transaction_hash ( ptx . tx ) ;
if ( store_tx_info ( ) )
{
m_tx_keys .insert ( std : : make_pair ( txid , ptx . tx_key ) ) ;
m_additional_tx_keys .insert ( std : : make_pair ( txid , ptx . additional_tx_keys ) ) ;
m_tx_keys [txid ] = ptx . tx_key ;
m_additional_tx_keys [txid ] = ptx . additional_tx_keys ;
}
}
}
@ -7315,8 +7315,8 @@ bool wallet2::sign_multisig_tx(multisig_tx_set &exported_txs, std::vector<crypto
const crypto : : hash txid = get_transaction_hash ( ptx . tx ) ;
if ( store_tx_info ( ) )
{
m_tx_keys .insert ( std : : make_pair ( txid , ptx . tx_key ) ) ;
m_additional_tx_keys .insert ( std : : make_pair ( txid , ptx . additional_tx_keys ) ) ;
m_tx_keys [txid ] = ptx . tx_key ;
m_additional_tx_keys [txid ] = ptx . additional_tx_keys ;
}
txids . push_back ( txid ) ;
}
@ -11006,7 +11006,7 @@ bool wallet2::get_tx_key(const crypto::hash &txid, crypto::secret_key &tx_key, s
return true ;
}
//----------------------------------------------------------------------------------------------------
void wallet2 : : set_tx_key ( const crypto : : hash & txid , const crypto : : secret_key & tx_key , const std : : vector < crypto : : secret_key > & additional_tx_keys )
void wallet2 : : set_tx_key ( const crypto : : hash & txid , const crypto : : secret_key & tx_key , const std : : vector < crypto : : secret_key > & additional_tx_keys , const boost : : optional < cryptonote : : account_public_address > & single_destination_subaddress )
{
// fetch tx from daemon and check if secret keys agree with corresponding public keys
COMMAND_RPC_GET_TRANSACTIONS : : request req = AUTO_VAL_INIT ( req ) ;
@ -11047,13 +11047,23 @@ void wallet2::set_tx_key(const crypto::hash &txid, const crypto::secret_key &tx_
found = true ;
break ;
}
// when sent to a single subaddress, the derivation is different
if ( single_destination_subaddress )
{
calculated_pub_key = rct : : rct2pk ( rct : : scalarmultKey ( rct : : pk2rct ( single_destination_subaddress - > m_spend_public_key ) , rct : : sk2rct ( tx_key ) ) ) ;
if ( calculated_pub_key = = pub_key_field . pub_key )
{
found = true ;
break ;
}
}
}
THROW_WALLET_EXCEPTION_IF ( ! found , error : : wallet_internal_error , " Given tx secret key doesn't agree with the tx public key in the blockchain " ) ;
tx_extra_additional_pub_keys additional_tx_pub_keys ;
find_tx_extra_field_by_type ( tx_extra_fields , additional_tx_pub_keys ) ;
THROW_WALLET_EXCEPTION_IF ( additional_tx_keys . size ( ) ! = additional_tx_pub_keys . data . size ( ) , error : : wallet_internal_error , " The number of additional tx secret keys doesn't agree with the number of additional tx public keys in the blockchain " ) ;
m_tx_keys . insert ( std : : make_pair ( txid , tx_key ) ) ;
m_additional_tx_keys . insert ( std : : make_pair ( txid , additional_tx_keys ) ) ;
m_tx_keys [txid ] = tx_key ;
m_additional_tx_keys [txid ] = additional_tx_keys ;
}
//----------------------------------------------------------------------------------------------------
std : : string wallet2 : : get_spend_proof ( const crypto : : hash & txid , const std : : string & message )