@ -8583,6 +8583,54 @@ 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 )
{
// fetch tx from daemon and check if secret keys agree with corresponding public keys
COMMAND_RPC_GET_TRANSACTIONS : : request req = AUTO_VAL_INIT ( req ) ;
req . txs_hashes . push_back ( epee : : string_tools : : pod_to_hex ( txid ) ) ;
req . decode_as_json = false ;
req . prune = false ;
COMMAND_RPC_GET_TRANSACTIONS : : response res = AUTO_VAL_INIT ( res ) ;
bool r ;
{
const boost : : lock_guard < boost : : mutex > lock { m_daemon_rpc_mutex } ;
r = epee : : net_utils : : invoke_http_json ( " /gettransactions " , req , res , m_http_client , rpc_timeout ) ;
}
THROW_WALLET_EXCEPTION_IF ( ! r , error : : no_connection_to_daemon , " gettransactions " ) ;
THROW_WALLET_EXCEPTION_IF ( res . status = = CORE_RPC_STATUS_BUSY , error : : daemon_busy , " gettransactions " ) ;
THROW_WALLET_EXCEPTION_IF ( res . status ! = CORE_RPC_STATUS_OK , error : : wallet_internal_error , " gettransactions " ) ;
THROW_WALLET_EXCEPTION_IF ( res . txs . size ( ) ! = 1 , error : : wallet_internal_error ,
" daemon returned wrong response for gettransactions, wrong txs count = " +
std : : to_string ( res . txs . size ( ) ) + " , expected 1 " ) ;
cryptonote : : blobdata bd ;
THROW_WALLET_EXCEPTION_IF ( ! epee : : string_tools : : parse_hexstr_to_binbuff ( res . txs [ 0 ] . as_hex , bd ) , error : : wallet_internal_error , " failed to parse tx from hexstr " ) ;
cryptonote : : transaction tx ;
crypto : : hash tx_hash , tx_prefix_hash ;
THROW_WALLET_EXCEPTION_IF ( ! cryptonote : : parse_and_validate_tx_from_blob ( bd , tx , tx_hash , tx_prefix_hash ) , error : : wallet_internal_error , " failed to parse tx from blob " ) ;
THROW_WALLET_EXCEPTION_IF ( tx_hash ! = txid , error : : wallet_internal_error , " txid mismatch " ) ;
std : : vector < tx_extra_field > tx_extra_fields ;
THROW_WALLET_EXCEPTION_IF ( ! parse_tx_extra ( tx . extra , tx_extra_fields ) , error : : wallet_internal_error , " Transaction extra has unsupported format " ) ;
tx_extra_pub_key pub_key_field ;
bool found = false ;
size_t index = 0 ;
while ( find_tx_extra_field_by_type ( tx_extra_fields , pub_key_field , index + + ) )
{
crypto : : public_key calculated_pub_key ;
crypto : : secret_key_to_public_key ( tx_key , calculated_pub_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 ) ) ;
}
//----------------------------------------------------------------------------------------------------
std : : string wallet2 : : get_spend_proof ( const crypto : : hash & txid , const std : : string & message )
{
THROW_WALLET_EXCEPTION_IF ( m_watch_only , error : : wallet_internal_error ,