2018-12-27 18:50:45 +03:00
// Copyright (c) 2014-2018 Zano Project
// Copyright (c) 2014-2018 The Louisdor Project
// Copyright (c) 2012-2013 The Cryptonote developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
# include "include_base_utils.h"
using namespace epee ;
# include "wallet_rpc_server.h"
# include "common/command_line.h"
# include "currency_core/currency_format_utils.h"
# include "currency_core/account.h"
# include "misc_language.h"
# include "crypto/hash.h"
# include "wallet_rpc_server_error_codes.h"
2020-11-25 22:11:02 +01:00
# include "wallet_helpers.h"
2021-08-21 08:14:57 +02:00
# include "wrap_service.h"
2018-12-27 18:50:45 +03:00
2019-08-28 22:16:15 +02:00
# define WALLET_RPC_BEGIN_TRY_ENTRY() try {
# define WALLET_RPC_CATCH_TRY_ENTRY() } \
2021-03-18 22:35:11 +03:00
catch ( const tools : : error : : wallet_error & e ) \
{ \
er . code = WALLET_RPC_ERROR_CODE_GENERIC_TRANSFER_ERROR ; \
er . message = e . error_code ( ) ; \
return false ; \
} \
2019-08-28 22:16:15 +02:00
catch ( const std : : exception & e ) \
{ \
er . code = WALLET_RPC_ERROR_CODE_GENERIC_TRANSFER_ERROR ; \
er . message = e . what ( ) ; \
return false ; \
} \
catch ( . . . ) \
{ \
er . code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR ; \
er . message = " WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR " ; \
return false ; \
}
2018-12-27 18:50:45 +03:00
namespace tools
{
//-----------------------------------------------------------------------------------
2022-04-21 17:43:50 +02:00
const command_line : : arg_descriptor < std : : string > wallet_rpc_server : : arg_rpc_bind_port ( " rpc-bind-port " , " Starts wallet as rpc server for wallet operations, sets bind port for server " ) ;
const command_line : : arg_descriptor < std : : string > wallet_rpc_server : : arg_rpc_bind_ip ( " rpc-bind-ip " , " Specify ip to bind rpc server " , " 127.0.0.1 " ) ;
const command_line : : arg_descriptor < std : : string > wallet_rpc_server : : arg_miner_text_info ( " miner-text-info " , " Wallet password " ) ;
const command_line : : arg_descriptor < bool > wallet_rpc_server : : arg_deaf_mode ( " deaf " , " Put wallet into 'deaf' mode make it ignore any rpc commands(usable for safe PoS mining) " ) ;
2018-12-27 18:50:45 +03:00
void wallet_rpc_server : : init_options ( boost : : program_options : : options_description & desc )
{
command_line : : add_arg ( desc , arg_rpc_bind_ip ) ;
command_line : : add_arg ( desc , arg_rpc_bind_port ) ;
command_line : : add_arg ( desc , arg_miner_text_info ) ;
2019-08-01 22:08:12 +02:00
command_line : : add_arg ( desc , arg_deaf_mode ) ;
2018-12-27 18:50:45 +03:00
}
//------------------------------------------------------------------------------------------------------------------------------
2021-10-25 22:12:32 +02:00
wallet_rpc_server : : wallet_rpc_server ( wallet2 & w )
: m_wallet ( w )
, m_do_mint ( false )
, m_deaf ( false )
, m_last_wallet_store_height ( 0 )
2018-12-27 18:50:45 +03:00
{ }
//------------------------------------------------------------------------------------------------------------------------------
2019-12-10 00:50:30 +03:00
bool wallet_rpc_server : : run ( bool do_mint , bool offline_mode , const currency : : account_public_address & miner_address )
2018-12-27 18:50:45 +03:00
{
2020-01-14 23:27:05 +01:00
static const uint64_t wallet_rpc_idle_work_period_ms = 2000 ;
2019-06-27 02:30:43 +03:00
2018-12-27 18:50:45 +03:00
m_do_mint = do_mint ;
2019-04-12 09:48:33 +03:00
if ( ! offline_mode )
{
2019-12-10 00:50:30 +03:00
m_net_server . add_idle_handler ( [ this , & miner_address ] ( ) - > bool
2019-06-27 02:30:43 +03:00
{
2019-11-12 11:35:09 +03:00
try
2019-06-27 02:30:43 +03:00
{
2019-11-12 11:35:09 +03:00
size_t blocks_fetched = 0 ;
bool received_money = false , ok = false ;
std : : atomic < bool > stop ( false ) ;
LOG_PRINT_L2 ( " wallet RPC idle: refreshing... " ) ;
m_wallet . refresh ( blocks_fetched , received_money , ok , stop ) ;
if ( stop )
{
LOG_PRINT_L1 ( " wallet RPC idle: refresh failed " ) ;
return true ;
}
2019-04-12 09:48:33 +03:00
2020-04-07 16:29:03 +03:00
bool has_related_alias_in_unconfirmed = false ;
LOG_PRINT_L2 ( " wallet RPC idle: scanning tx pool... " ) ;
m_wallet . scan_tx_pool ( has_related_alias_in_unconfirmed ) ;
2019-11-12 11:35:09 +03:00
if ( m_do_mint )
{
LOG_PRINT_L2 ( " wallet RPC idle: trying to do PoS iteration... " ) ;
2019-12-10 00:50:30 +03:00
m_wallet . try_mint_pos ( miner_address ) ;
2019-11-12 11:35:09 +03:00
}
2021-10-04 13:11:56 +02:00
//auto-store wallet in server mode, let's do it every 24-hour
if ( m_wallet . get_top_block_height ( ) < m_last_wallet_store_height )
{
LOG_ERROR ( " Unexpected m_last_wallet_store_height = " < < m_last_wallet_store_height < < " or " < < m_wallet . get_top_block_height ( ) ) ;
}
else if ( m_wallet . get_top_block_height ( ) - m_last_wallet_store_height > CURRENCY_BLOCKS_PER_DAY )
{
//store wallet
m_wallet . store ( ) ;
m_last_wallet_store_height = m_wallet . get_top_block_height ( ) ;
}
2019-11-12 11:35:09 +03:00
}
catch ( error : : no_connection_to_daemon & )
{
LOG_PRINT_RED ( " no connection to the daemon " , LOG_LEVEL_0 ) ;
}
catch ( std : : exception & e )
{
LOG_ERROR ( " exeption caught in wallet_rpc_server::idle_handler: " < < e . what ( ) ) ;
}
catch ( . . . )
2019-06-27 02:30:43 +03:00
{
2019-11-12 11:35:09 +03:00
LOG_ERROR ( " unknown exeption caught in wallet_rpc_server::idle_handler " ) ;
2019-06-27 02:30:43 +03:00
}
2019-04-12 09:48:33 +03:00
return true ;
2020-01-14 23:27:05 +01:00
} , wallet_rpc_idle_work_period_ms ) ;
2019-04-12 09:48:33 +03:00
}
2018-12-27 18:50:45 +03:00
//DO NOT START THIS SERVER IN MORE THEN 1 THREADS WITHOUT REFACTORING
return epee : : http_server_impl_base < wallet_rpc_server , connection_context > : : run ( 1 , true ) ;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : handle_command_line ( const boost : : program_options : : variables_map & vm )
{
m_bind_ip = command_line : : get_arg ( vm , arg_rpc_bind_ip ) ;
m_port = command_line : : get_arg ( vm , arg_rpc_bind_port ) ;
2019-08-01 22:08:12 +02:00
m_deaf = command_line : : get_arg ( vm , arg_deaf_mode ) ;
if ( m_deaf )
{
LOG_PRINT_MAGENTA ( " Wallet launched in 'deaf' mode " , LOG_LEVEL_0 ) ;
}
2018-12-27 18:50:45 +03:00
if ( command_line : : has_arg ( vm , arg_miner_text_info ) )
{
m_wallet . set_miner_text_info ( command_line : : get_arg ( vm , arg_miner_text_info ) ) ;
}
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : init ( const boost : : program_options : : variables_map & vm )
{
2021-10-04 13:11:56 +02:00
m_last_wallet_store_height = m_wallet . get_top_block_height ( ) ;
2018-12-27 18:50:45 +03:00
m_net_server . set_threads_prefix ( " RPC " ) ;
bool r = handle_command_line ( vm ) ;
CHECK_AND_ASSERT_MES ( r , false , " Failed to process command line in core_rpc_server " ) ;
return epee : : http_server_impl_base < wallet_rpc_server , connection_context > : : init ( m_port , m_bind_ip ) ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-01 22:08:12 +02:00
bool wallet_rpc_server : : handle_http_request ( const epee : : net_utils : : http : : http_request_info & query_info , epee : : net_utils : : http : : http_response_info & response , connection_context & m_conn_context )
{
response . m_response_code = 200 ;
response . m_response_comment = " Ok " ;
std : : string reference_stub ;
bool call_found = false ;
if ( m_deaf )
{
response . m_response_code = 500 ;
response . m_response_comment = " Internal Server Error " ;
return true ;
}
if ( ! handle_http_request_map ( query_info , response , m_conn_context , call_found , reference_stub ) & & response . m_response_code = = 200 )
{
response . m_response_code = 500 ;
response . m_response_comment = " Internal Server Error " ;
return true ;
}
if ( ! call_found )
{
response . m_response_code = 404 ;
response . m_response_comment = " Not Found " ;
return true ;
}
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 17:36:53 +02:00
bool wallet_rpc_server : : on_getbalance ( const wallet_public : : COMMAND_RPC_GET_BALANCE : : request & req , wallet_public : : COMMAND_RPC_GET_BALANCE : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2018-12-27 18:50:45 +03:00
{
try
{
res . balance = m_wallet . balance ( ) ;
res . unlocked_balance = m_wallet . unlocked_balance ( ) ;
}
catch ( std : : exception & e )
{
er . code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR ;
er . message = e . what ( ) ;
return false ;
}
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 17:36:53 +02:00
bool wallet_rpc_server : : on_getaddress ( const wallet_public : : COMMAND_RPC_GET_ADDRESS : : request & req , wallet_public : : COMMAND_RPC_GET_ADDRESS : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2018-12-27 18:50:45 +03:00
{
try
{
res . address = m_wallet . get_account ( ) . get_public_address_str ( ) ;
}
catch ( std : : exception & e )
{
er . code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR ;
er . message = e . what ( ) ;
return false ;
}
return true ;
}
2020-01-23 03:26:25 +01:00
bool wallet_rpc_server : : on_getwallet_info ( const wallet_public : : COMMAND_RPC_GET_WALLET_INFO : : request & req , wallet_public : : COMMAND_RPC_GET_WALLET_INFO : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
try
{
res . address = m_wallet . get_account ( ) . get_public_address_str ( ) ;
res . is_whatch_only = m_wallet . is_watch_only ( ) ;
res . path = epee : : string_encoding : : convert_to_ansii ( m_wallet . get_wallet_path ( ) ) ;
res . transfers_count = m_wallet . get_recent_transfers_total_count ( ) ;
res . transfer_entries_count = m_wallet . get_transfer_entries_count ( ) ;
std : : map < uint64_t , uint64_t > distribution ;
m_wallet . get_utxo_distribution ( distribution ) ;
for ( const auto & ent : distribution )
2020-02-09 20:21:24 +01:00
res . utxo_distribution . push_back ( currency : : print_money_brief ( ent . first ) + " : " + std : : to_string ( ent . second ) ) ;
2020-01-23 03:26:25 +01:00
2021-07-01 23:00:28 +02:00
res . current_height = m_wallet . get_top_block_height ( ) ;
2020-01-23 03:26:25 +01:00
return true ;
}
catch ( std : : exception & e )
{
er . code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR ;
2020-02-03 16:58:02 +01:00
er . message = e . what ( ) ;
return false ;
}
}
2020-11-25 22:11:02 +01:00
bool wallet_rpc_server : : on_getwallet_restore_info ( const wallet_public : : COMMAND_RPC_GET_WALLET_RESTORE_INFO : : request & req , wallet_public : : COMMAND_RPC_GET_WALLET_RESTORE_INFO : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
try
{
2020-11-27 17:18:35 +01:00
res . seed_phrase = m_wallet . get_account ( ) . get_seed_phrase ( req . seed_password ) ;
2020-11-25 22:11:02 +01:00
return true ;
}
catch ( std : : exception & e )
{
er . code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR ;
er . message = e . what ( ) ;
return false ;
}
}
bool wallet_rpc_server : : on_get_seed_phrase_info ( const wallet_public : : COMMAND_RPC_GET_SEED_PHRASE_INFO : : request & req , wallet_public : : COMMAND_RPC_GET_SEED_PHRASE_INFO : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
tools : : get_seed_phrase_info ( req . seed_phrase , req . seed_password , res ) ;
return true ;
}
2020-02-03 16:58:02 +01:00
bool wallet_rpc_server : : on_get_recent_txs_and_info ( const wallet_public : : COMMAND_RPC_GET_RECENT_TXS_AND_INFO : : request & req , wallet_public : : COMMAND_RPC_GET_RECENT_TXS_AND_INFO : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
try
{
if ( req . update_provision_info )
{
res . pi . balance = m_wallet . balance ( res . pi . unlocked_balance ) ;
res . pi . transfer_entries_count = m_wallet . get_transfer_entries_count ( ) ;
res . pi . transfers_count = m_wallet . get_recent_transfers_total_count ( ) ;
2021-07-01 23:00:28 +02:00
res . pi . curent_height = m_wallet . get_top_block_height ( ) ;
2020-02-03 16:58:02 +01:00
}
2021-07-21 00:25:12 +02:00
if ( req . offset = = 0 & & ! req . exclude_unconfirmed )
2020-09-01 00:26:22 +02:00
m_wallet . get_unconfirmed_transfers ( res . transfers , req . exclude_mining_txs ) ;
2020-02-03 16:58:02 +01:00
2021-07-20 15:36:47 +02:00
bool start_from_end = true ;
if ( req . order = = ORDER_FROM_BEGIN_TO_END )
{
start_from_end = false ;
}
m_wallet . get_recent_transfers_history ( res . transfers , req . offset , req . count , res . total_transfers , res . last_item_index , req . exclude_mining_txs , start_from_end ) ;
2020-02-03 16:58:02 +01:00
return true ;
}
catch ( std : : exception & e )
{
er . code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR ;
2020-01-23 03:26:25 +01:00
er . message = e . what ( ) ;
return false ;
}
}
2018-12-27 18:50:45 +03:00
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 17:36:53 +02:00
bool wallet_rpc_server : : on_transfer ( const wallet_public : : COMMAND_RPC_TRANSFER : : request & req , wallet_public : : COMMAND_RPC_TRANSFER : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2018-12-27 18:50:45 +03:00
{
2020-07-21 14:32:56 +03:00
if ( req . fee < m_wallet . get_core_runtime_config ( ) . tx_pool_min_fee )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_ARGUMENT ;
er . message = std : : string ( " Given fee is too low: " ) + epee : : string_tools : : num_to_string_fast ( req . fee ) + " , minimum is: " + epee : : string_tools : : num_to_string_fast ( m_wallet . get_core_runtime_config ( ) . tx_pool_min_fee ) ;
return false ;
}
2018-12-27 18:50:45 +03:00
std : : string payment_id ;
if ( ! epee : : string_tools : : parse_hexstr_to_binbuff ( req . payment_id , payment_id ) )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_PAYMENT_ID ;
er . message = std : : string ( " invalid encoded payment id: " ) + req . payment_id + " , hex-encoded string was expected " ;
return false ;
}
2021-07-17 00:05:41 +02:00
construct_tx_param ctp = m_wallet . get_default_construct_tx_param_inital ( ) ;
if ( req . service_entries_permanent )
{
//put it to extra
ctp . extra . insert ( ctp . extra . end ( ) , req . service_entries . begin ( ) , req . service_entries . end ( ) ) ;
}
else
{
//put it to attachments
2021-10-20 21:18:21 +02:00
ctp . attachments . insert ( ctp . attachments . end ( ) , req . service_entries . begin ( ) , req . service_entries . end ( ) ) ;
2021-07-17 00:05:41 +02:00
}
2021-08-25 22:43:08 +02:00
bool wrap = false ;
2021-07-17 00:05:41 +02:00
std : : vector < currency : : tx_destination_entry > & dsts = ctp . dsts ;
2018-12-27 18:50:45 +03:00
for ( auto it = req . destinations . begin ( ) ; it ! = req . destinations . end ( ) ; it + + )
{
currency : : tx_destination_entry de ;
de . addr . resize ( 1 ) ;
std : : string embedded_payment_id ;
2021-08-21 08:14:57 +02:00
//check if address looks like wrapped address
if ( currency : : is_address_like_wrapped ( it - > address ) )
{
2021-08-25 22:43:08 +02:00
if ( wrap ) {
LOG_ERROR ( " More then one entries in transactions " ) ;
er . code = WALLET_RPC_ERROR_CODE_WRONG_ARGUMENT ;
er . message = " Second wrap entry not supported in transactions " ;
return false ;
}
2021-08-21 08:14:57 +02:00
LOG_PRINT_L0 ( " Address " < < it - > address < < " recognized as wrapped address, creating wrapping transaction... " ) ;
//put into service attachment specially encrypted entry which will contain wrap address and network
currency : : tx_service_attachment sa = AUTO_VAL_INIT ( sa ) ;
sa . service_id = BC_WRAP_SERVICE_ID ;
sa . instruction = BC_WRAP_SERVICE_INSTRUCTION_ERC20 ;
sa . flags = TX_SERVICE_ATTACHMENT_ENCRYPT_BODY | TX_SERVICE_ATTACHMENT_ENCRYPT_BODY_ISOLATE_AUDITABLE ;
sa . body = it - > address ;
ctp . extra . push_back ( sa ) ;
currency : : account_public_address acc = AUTO_VAL_INIT ( acc ) ;
currency : : get_account_address_from_str ( acc , BC_WRAP_SERVICE_CUSTODY_WALLET ) ;
de . addr . front ( ) = acc ;
2021-08-25 22:43:08 +02:00
wrap = true ;
2021-08-21 08:14:57 +02:00
//encrypt body with a special way
}
else if ( ! m_wallet . get_transfer_address ( it - > address , de . addr . back ( ) , embedded_payment_id ) )
2018-12-27 18:50:45 +03:00
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_ADDRESS ;
er . message = std : : string ( " WALLET_RPC_ERROR_CODE_WRONG_ADDRESS: " ) + it - > address ;
return false ;
}
if ( embedded_payment_id . size ( ) ! = 0 )
{
if ( payment_id . size ( ) ! = 0 )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_PAYMENT_ID ;
er . message = std : : string ( " embedded payment id: " ) + embedded_payment_id + " conflicts with previously set payment id: " + payment_id ;
return false ;
}
payment_id = embedded_payment_id ;
}
de . amount = it - > amount ;
dsts . push_back ( de ) ;
}
try
{
2021-07-17 00:05:41 +02:00
std : : vector < currency : : attachment_v > & attachments = ctp . attachments ;
std : : vector < currency : : extra_v > & extra = ctp . extra ;
2018-12-27 18:50:45 +03:00
if ( ! payment_id . empty ( ) & & ! currency : : set_payment_id_to_tx ( attachments , payment_id ) )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_PAYMENT_ID ;
er . message = std : : string ( " payment id " ) + payment_id + " is invalid and can't be set " ;
return false ;
}
if ( ! req . comment . empty ( ) )
{
currency : : tx_comment comment = AUTO_VAL_INIT ( comment ) ;
comment . comment = req . comment ;
attachments . push_back ( comment ) ;
}
2021-09-11 10:28:34 +03:00
if ( req . push_payer & & ! wrap )
2020-04-13 23:37:27 +02:00
{
2020-04-27 16:20:31 +03:00
currency : : create_and_add_tx_payer_to_container_from_address ( extra , m_wallet . get_account ( ) . get_keys ( ) . account_address , m_wallet . get_top_block_height ( ) , m_wallet . get_core_runtime_config ( ) ) ;
2020-04-13 23:37:27 +02:00
}
2020-04-28 16:41:04 +03:00
2020-04-13 23:37:27 +02:00
if ( ! req . hide_receiver )
{
for ( auto & d : dsts )
{
for ( auto & a : d . addr )
2020-04-28 16:41:04 +03:00
currency : : create_and_add_tx_receiver_to_container_from_address ( extra , a , m_wallet . get_top_block_height ( ) , m_wallet . get_core_runtime_config ( ) ) ;
2020-04-13 23:37:27 +02:00
}
}
2021-07-17 00:05:41 +02:00
currency : : finalized_tx result = AUTO_VAL_INIT ( result ) ;
2020-07-20 13:05:25 +03:00
std : : string unsigned_tx_blob_str ;
2021-07-17 00:05:41 +02:00
ctp . fee = req . fee ;
2021-10-20 21:18:21 +02:00
ctp . fake_outputs_count = req . mixin ;
2021-07-17 00:05:41 +02:00
m_wallet . transfer ( ctp , result , true , & unsigned_tx_blob_str ) ;
2019-04-08 14:16:11 +03:00
if ( m_wallet . is_watch_only ( ) )
{
2020-07-20 13:05:25 +03:00
res . tx_unsigned_hex = epee : : string_tools : : buff_to_hex_nodelimer ( unsigned_tx_blob_str ) ; // watch-only wallets could not sign and relay transactions
// leave res.tx_hash empty, because tx hash will change after signing
2019-04-08 14:16:11 +03:00
}
else
{
2021-07-17 00:05:41 +02:00
res . tx_hash = epee : : string_tools : : pod_to_hex ( currency : : get_transaction_hash ( result . tx ) ) ;
res . tx_size = get_object_blobsize ( result . tx ) ;
2019-04-08 14:16:11 +03:00
}
2018-12-27 18:50:45 +03:00
return true ;
}
catch ( const tools : : error : : daemon_busy & e )
{
er . code = WALLET_RPC_ERROR_CODE_DAEMON_IS_BUSY ;
er . message = e . what ( ) ;
return false ;
}
catch ( const std : : exception & e )
{
er . code = WALLET_RPC_ERROR_CODE_GENERIC_TRANSFER_ERROR ;
er . message = e . what ( ) ;
return false ;
}
catch ( . . . )
{
er . code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR ;
er . message = " WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR " ;
return false ;
}
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 17:36:53 +02:00
bool wallet_rpc_server : : on_store ( const wallet_public : : COMMAND_RPC_STORE : : request & req , wallet_public : : COMMAND_RPC_STORE : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2018-12-27 18:50:45 +03:00
{
2019-08-28 22:16:15 +02:00
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
m_wallet . store ( ) ;
2020-05-12 21:48:15 +02:00
boost : : system : : error_code ec = AUTO_VAL_INIT ( ec ) ;
2020-06-03 21:29:43 +02:00
res . wallet_file_size = m_wallet . get_wallet_file_size ( ) ;
2019-08-28 22:16:15 +02:00
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
2018-12-27 18:50:45 +03:00
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 17:36:53 +02:00
bool wallet_rpc_server : : on_get_payments ( const wallet_public : : COMMAND_RPC_GET_PAYMENTS : : request & req , wallet_public : : COMMAND_RPC_GET_PAYMENTS : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2018-12-27 18:50:45 +03:00
{
std : : string payment_id ;
2019-04-03 12:48:09 +03:00
if ( ! currency : : parse_payment_id_from_hex_str ( req . payment_id , payment_id ) )
2018-12-27 18:50:45 +03:00
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_PAYMENT_ID ;
er . message = std : : string ( " invalid payment id given: \' " ) + req . payment_id + " \' , hex-encoded string was expected " ;
return false ;
}
res . payments . clear ( ) ;
std : : list < wallet2 : : payment_details > payment_list ;
m_wallet . get_payments ( payment_id , payment_list ) ;
for ( auto payment : payment_list )
{
2019-05-09 21:37:16 +02:00
if ( payment . m_unlock_time & & ! req . allow_locked_transactions )
{
//check that transaction don't have locking for time longer then 10 blocks ahead
//TODO: add code for "unlock_time" set as timestamp, now it's all being filtered
if ( payment . m_unlock_time > payment . m_block_height + WALLET_DEFAULT_TX_SPENDABLE_AGE )
continue ;
}
2019-08-27 17:36:53 +02:00
wallet_public : : payment_details rpc_payment ;
2019-04-03 12:48:09 +03:00
rpc_payment . payment_id = req . payment_id ;
2018-12-27 18:50:45 +03:00
rpc_payment . tx_hash = epee : : string_tools : : pod_to_hex ( payment . m_tx_hash ) ;
rpc_payment . amount = payment . m_amount ;
rpc_payment . block_height = payment . m_block_height ;
rpc_payment . unlock_time = payment . m_unlock_time ;
res . payments . push_back ( rpc_payment ) ;
}
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 17:36:53 +02:00
bool wallet_rpc_server : : on_get_bulk_payments ( const wallet_public : : COMMAND_RPC_GET_BULK_PAYMENTS : : request & req , wallet_public : : COMMAND_RPC_GET_BULK_PAYMENTS : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2019-04-03 12:48:09 +03:00
{
res . payments . clear ( ) ;
for ( auto & payment_id_str : req . payment_ids )
{
currency : : payment_id_t payment_id ;
if ( ! currency : : parse_payment_id_from_hex_str ( payment_id_str , payment_id ) )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_PAYMENT_ID ;
er . message = std : : string ( " invalid payment id given: \' " ) + payment_id_str + " \' , hex-encoded string was expected " ;
return false ;
}
std : : list < wallet2 : : payment_details > payment_list ;
m_wallet . get_payments ( payment_id , payment_list , req . min_block_height ) ;
for ( auto & payment : payment_list )
{
2019-05-09 21:37:16 +02:00
if ( payment . m_unlock_time & & ! req . allow_locked_transactions )
{
//check that transaction don't have locking for time longer then 10 blocks ahead
//TODO: add code for "unlock_time" set as timestamp, now it's all being filtered
if ( payment . m_unlock_time > payment . m_block_height + WALLET_DEFAULT_TX_SPENDABLE_AGE )
continue ;
}
2019-08-27 17:36:53 +02:00
wallet_public : : payment_details rpc_payment ;
2019-04-03 12:48:09 +03:00
rpc_payment . payment_id = payment_id_str ;
rpc_payment . tx_hash = epee : : string_tools : : pod_to_hex ( payment . m_tx_hash ) ;
rpc_payment . amount = payment . m_amount ;
rpc_payment . block_height = payment . m_block_height ;
rpc_payment . unlock_time = payment . m_unlock_time ;
res . payments . push_back ( std : : move ( rpc_payment ) ) ;
}
}
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 17:36:53 +02:00
bool wallet_rpc_server : : on_make_integrated_address ( const wallet_public : : COMMAND_RPC_MAKE_INTEGRATED_ADDRESS : : request & req , wallet_public : : COMMAND_RPC_MAKE_INTEGRATED_ADDRESS : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2018-12-27 18:50:45 +03:00
{
std : : string payment_id ;
if ( ! epee : : string_tools : : parse_hexstr_to_binbuff ( req . payment_id , payment_id ) )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_PAYMENT_ID ;
er . message = std : : string ( " invalid payment id given: \' " ) + req . payment_id + " \' , hex-encoded string was expected " ;
return false ;
}
if ( ! currency : : is_payment_id_size_ok ( payment_id ) )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_PAYMENT_ID ;
er . message = std : : string ( " given payment id is too long: \' " ) + req . payment_id + " \' " ;
return false ;
}
if ( payment_id . empty ( ) )
{
payment_id = std : : string ( 8 , ' ' ) ;
crypto : : generate_random_bytes ( payment_id . size ( ) , & payment_id . front ( ) ) ;
}
res . integrated_address = currency : : get_account_address_and_payment_id_as_str ( m_wallet . get_account ( ) . get_public_address ( ) , payment_id ) ;
res . payment_id = epee : : string_tools : : buff_to_hex_nodelimer ( payment_id ) ;
return ! res . integrated_address . empty ( ) ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 17:36:53 +02:00
bool wallet_rpc_server : : on_split_integrated_address ( const wallet_public : : COMMAND_RPC_SPLIT_INTEGRATED_ADDRESS : : request & req , wallet_public : : COMMAND_RPC_SPLIT_INTEGRATED_ADDRESS : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2018-12-27 18:50:45 +03:00
{
currency : : account_public_address addr ;
std : : string payment_id ;
if ( ! currency : : get_account_address_and_payment_id_from_str ( addr , payment_id , req . integrated_address ) )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_ADDRESS ;
er . message = std : : string ( " invalid integrated address given: \' " ) + req . integrated_address + " \' " ;
return false ;
}
res . standard_address = currency : : get_account_address_as_str ( addr ) ;
res . payment_id = epee : : string_tools : : buff_to_hex_nodelimer ( payment_id ) ;
return true ;
}
2019-04-05 00:42:28 +03:00
//------------------------------------------------------------------------------------------------------------------------------
2019-12-17 12:24:28 +03:00
bool wallet_rpc_server : : on_sweep_below ( const wallet_public : : COMMAND_SWEEP_BELOW : : request & req , wallet_public : : COMMAND_SWEEP_BELOW : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
currency : : payment_id_t payment_id ;
if ( ! req . payment_id_hex . empty ( ) & & ! currency : : parse_payment_id_from_hex_str ( req . payment_id_hex , payment_id ) )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_PAYMENT_ID ;
er . message = std : : string ( " Invalid payment id: " ) + req . payment_id_hex ;
return false ;
}
currency : : account_public_address addr ;
currency : : payment_id_t integrated_payment_id ;
if ( ! m_wallet . get_transfer_address ( req . address , addr , integrated_payment_id ) )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_ADDRESS ;
er . message = std : : string ( " Invalid address: " ) + req . address ;
return false ;
}
if ( ! integrated_payment_id . empty ( ) )
{
if ( ! payment_id . empty ( ) )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_PAYMENT_ID ;
er . message = std : : string ( " address " ) + req . address + " has integrated payment id " + epee : : string_tools : : buff_to_hex_nodelimer ( integrated_payment_id ) +
" which is incompatible with payment id " + epee : : string_tools : : buff_to_hex_nodelimer ( payment_id ) + " that was already assigned to this transfer " ;
return false ;
}
payment_id = integrated_payment_id ;
}
if ( req . fee < m_wallet . get_core_runtime_config ( ) . tx_pool_min_fee )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_ARGUMENT ;
er . message = std : : string ( " Given fee is too low: " ) + epee : : string_tools : : num_to_string_fast ( req . fee ) + " , minimum is: " + epee : : string_tools : : num_to_string_fast ( m_wallet . get_core_runtime_config ( ) . tx_pool_min_fee ) ;
return false ;
}
try
{
currency : : transaction tx = AUTO_VAL_INIT ( tx ) ;
size_t outs_total = 0 , outs_swept = 0 ;
uint64_t amount_total = 0 , amount_swept = 0 ;
std : : string unsigned_tx_blob_str ;
m_wallet . sweep_below ( req . mixin , addr , req . amount , payment_id , req . fee , outs_total , amount_total , outs_swept , & tx , & unsigned_tx_blob_str ) ;
get_inputs_money_amount ( tx , amount_swept ) ;
res . amount_swept = amount_swept ;
res . amount_total = amount_total ;
res . outs_swept = outs_swept ;
res . outs_total = outs_total ;
if ( m_wallet . is_watch_only ( ) )
{
res . tx_unsigned_hex = epee : : string_tools : : buff_to_hex_nodelimer ( unsigned_tx_blob_str ) ; // watch-only wallets can't sign and relay transactions
// leave res.tx_hash empty, because tx has will change after signing
}
else
{
res . tx_hash = string_tools : : pod_to_hex ( currency : : get_transaction_hash ( tx ) ) ;
}
}
catch ( const tools : : error : : daemon_busy & e )
{
er . code = WALLET_RPC_ERROR_CODE_DAEMON_IS_BUSY ;
er . message = e . what ( ) ;
return false ;
}
catch ( const std : : exception & e )
{
er . code = WALLET_RPC_ERROR_CODE_GENERIC_TRANSFER_ERROR ;
er . message = e . what ( ) ;
return false ;
}
catch ( . . . )
{
er . code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR ;
er . message = " WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR " ;
return false ;
}
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 17:36:53 +02:00
bool wallet_rpc_server : : on_sign_transfer ( const wallet_public : : COMMAND_SIGN_TRANSFER : : request & req , wallet_public : : COMMAND_SIGN_TRANSFER : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2019-04-05 00:42:28 +03:00
{
2019-08-28 22:16:15 +02:00
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
currency : : transaction tx = AUTO_VAL_INIT ( tx ) ;
std : : string tx_unsigned_blob ;
if ( ! string_tools : : parse_hexstr_to_binbuff ( req . tx_unsigned_hex , tx_unsigned_blob ) )
2019-04-05 00:42:28 +03:00
{
2019-08-28 22:16:15 +02:00
er . code = WALLET_RPC_ERROR_CODE_WRONG_ARGUMENT ;
er . message = " tx_unsigned_hex is invalid " ;
2019-04-05 00:42:28 +03:00
return false ;
}
2019-08-28 22:16:15 +02:00
std : : string tx_signed_blob ;
m_wallet . sign_transfer ( tx_unsigned_blob , tx_signed_blob , tx ) ;
res . tx_signed_hex = epee : : string_tools : : buff_to_hex_nodelimer ( tx_signed_blob ) ;
res . tx_hash = epee : : string_tools : : pod_to_hex ( currency : : get_transaction_hash ( tx ) ) ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
2019-04-05 00:42:28 +03:00
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 17:36:53 +02:00
bool wallet_rpc_server : : on_submit_transfer ( const wallet_public : : COMMAND_SUBMIT_TRANSFER : : request & req , wallet_public : : COMMAND_SUBMIT_TRANSFER : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2019-04-05 00:42:28 +03:00
{
std : : string tx_signed_blob ;
if ( ! string_tools : : parse_hexstr_to_binbuff ( req . tx_signed_hex , tx_signed_blob ) )
{
er . code = WALLET_RPC_ERROR_CODE_WRONG_ARGUMENT ;
er . message = " tx_signed_hex is invalid " ;
return false ;
}
2019-08-28 22:16:15 +02:00
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
currency : : transaction tx = AUTO_VAL_INIT ( tx ) ;
m_wallet . submit_transfer ( tx_signed_blob , tx ) ;
res . tx_hash = epee : : string_tools : : pod_to_hex ( currency : : get_transaction_hash ( tx ) ) ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
2018-12-27 18:50:45 +03:00
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2020-04-07 14:30:38 +03:00
bool wallet_rpc_server : : on_search_for_transactions ( const wallet_public : : COMMAND_RPC_SEARCH_FOR_TRANSACTIONS : : request & req , wallet_public : : COMMAND_RPC_SEARCH_FOR_TRANSACTIONS : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
bool tx_id_specified = req . tx_id ! = currency : : null_hash ;
2020-04-07 16:29:03 +03:00
// process confirmed txs
2020-04-07 14:30:38 +03:00
m_wallet . enumerate_transfers_history ( [ & ] ( const wallet_public : : wallet_transfer_info & wti ) - > bool {
if ( tx_id_specified )
{
if ( wti . tx_hash ! = req . tx_id )
return true ; // continue
}
if ( req . filter_by_height )
{
if ( ! wti . height ) // unconfirmed
return true ; // continue
if ( wti . height < req . min_height )
{
// no need to scan more
return false ; // stop
}
if ( wti . height > req . max_height )
{
return true ; // continue
}
}
if ( wti . is_income & & req . in )
res . in . push_back ( wti ) ;
if ( ! wti . is_income & & req . out )
res . out . push_back ( wti ) ;
return true ; // continue
} , false /* enumerate_forward */ ) ;
2020-04-07 16:29:03 +03:00
// process unconfirmed txs
2020-04-07 14:30:38 +03:00
if ( req . pool )
{
m_wallet . enumerate_unconfirmed_transfers ( [ & ] ( const wallet_public : : wallet_transfer_info & wti ) - > bool {
if ( ( wti . is_income & & req . in ) | | ( ! wti . is_income & & req . out ) )
res . pool . push_back ( wti ) ;
return true ; // continue
} ) ;
}
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-28 22:16:15 +02:00
bool wallet_rpc_server : : on_contracts_send_proposal ( const wallet_public : : COMMAND_CONTRACTS_SEND_PROPOSAL : : request & req , wallet_public : : COMMAND_CONTRACTS_SEND_PROPOSAL : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2019-08-27 22:11:45 +02:00
{
2019-08-28 22:16:15 +02:00
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
currency : : transaction tx = AUTO_VAL_INIT ( tx ) ;
currency : : transaction template_tx = AUTO_VAL_INIT ( template_tx ) ;
m_wallet . send_escrow_proposal ( req , tx , template_tx ) ;
return true ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
2019-08-27 22:11:45 +02:00
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-28 22:16:15 +02:00
bool wallet_rpc_server : : on_contracts_accept_proposal ( const wallet_public : : COMMAND_CONTRACTS_ACCEPT_PROPOSAL : : request & req , wallet_public : : COMMAND_CONTRACTS_ACCEPT_PROPOSAL : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2019-08-27 22:11:45 +02:00
{
2019-08-28 22:16:15 +02:00
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
m_wallet . accept_proposal ( req . contract_id , req . acceptance_fee ) ;
return true ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
2019-08-27 22:11:45 +02:00
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-28 22:16:15 +02:00
bool wallet_rpc_server : : on_contracts_get_all ( const wallet_public : : COMMAND_CONTRACTS_GET_ALL : : request & req , wallet_public : : COMMAND_CONTRACTS_GET_ALL : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2019-08-27 22:11:45 +02:00
{
2019-08-28 22:16:15 +02:00
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
tools : : wallet2 : : escrow_contracts_container ecc ;
m_wallet . get_contracts ( ecc ) ;
res . contracts . resize ( ecc . size ( ) ) ;
size_t i = 0 ;
for ( auto & c : ecc )
2019-08-27 22:11:45 +02:00
{
2019-08-28 22:16:15 +02:00
static_cast < tools : : wallet_public : : escrow_contract_details_basic & > ( res . contracts [ i ] ) = c . second ;
res . contracts [ i ] . contract_id = c . first ;
i + + ;
2019-08-27 22:11:45 +02:00
}
2019-08-28 22:16:15 +02:00
return true ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
2019-08-27 22:11:45 +02:00
}
2019-08-28 22:16:15 +02:00
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_contracts_release ( const wallet_public : : COMMAND_CONTRACTS_RELEASE : : request & req , wallet_public : : COMMAND_CONTRACTS_RELEASE : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2019-08-27 22:11:45 +02:00
{
2019-08-28 22:16:15 +02:00
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
m_wallet . finish_contract ( req . contract_id , req . release_type ) ;
return true ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
2019-08-27 22:11:45 +02:00
}
2019-08-28 22:16:15 +02:00
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_contracts_request_cancel ( const wallet_public : : COMMAND_CONTRACTS_REQUEST_CANCEL : : request & req , wallet_public : : COMMAND_CONTRACTS_REQUEST_CANCEL : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2019-08-27 22:11:45 +02:00
{
2019-08-28 22:16:15 +02:00
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
m_wallet . request_cancel_contract ( req . contract_id , req . fee , req . expiration_period ) ;
return true ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
2019-08-27 22:11:45 +02:00
}
2019-08-28 22:16:15 +02:00
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_contracts_accept_cancel ( const wallet_public : : COMMAND_CONTRACTS_ACCEPT_CANCEL : : request & req , wallet_public : : COMMAND_CONTRACTS_ACCEPT_CANCEL : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
2019-08-27 22:11:45 +02:00
{
2019-08-28 22:16:15 +02:00
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
m_wallet . accept_cancel_contract ( req . contract_id ) ;
return true ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_marketplace_get_my_offers ( const wallet_public : : COMMAND_MARKETPLACE_GET_MY_OFFERS : : request & req , wallet_public : : COMMAND_MARKETPLACE_GET_MY_OFFERS : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
m_wallet . get_actual_offers ( res . offers ) ;
size_t offers_count_before_filtering = res . offers . size ( ) ;
bc_services : : filter_offers_list ( res . offers , req . filter , m_wallet . get_core_runtime_config ( ) . get_core_time ( ) ) ;
LOG_PRINT ( " get_my_offers(): " < < res . offers . size ( ) < < " offers returned ( " < < offers_count_before_filtering < < " was before filter) " , LOG_LEVEL_1 ) ;
return true ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
2019-08-27 22:11:45 +02:00
}
2019-08-28 22:16:15 +02:00
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_marketplace_push_offer ( const wallet_public : : COMMAND_MARKETPLACE_PUSH_OFFER : : request & req , wallet_public : : COMMAND_MARKETPLACE_PUSH_OFFER : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
currency : : transaction res_tx = AUTO_VAL_INIT ( res_tx ) ;
m_wallet . push_offer ( req . od , res_tx ) ;
res . tx_hash = string_tools : : pod_to_hex ( currency : : get_transaction_hash ( res_tx ) ) ;
res . tx_blob_size = currency : : get_object_blobsize ( res_tx ) ;
return true ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_marketplace_push_update_offer ( const wallet_public : : COMMAND_MARKETPLACE_PUSH_UPDATE_OFFER : : request & req , wallet_public : : COMMAND_MARKETPLACE_PUSH_UPDATE_OFFER : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
currency : : transaction res_tx = AUTO_VAL_INIT ( res_tx ) ;
m_wallet . update_offer_by_id ( req . tx_id , req . no , req . od , res_tx ) ;
res . tx_hash = string_tools : : pod_to_hex ( currency : : get_transaction_hash ( res_tx ) ) ;
res . tx_blob_size = currency : : get_object_blobsize ( res_tx ) ;
return true ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_marketplace_cancel_offer ( const wallet_public : : COMMAND_MARKETPLACE_CANCEL_OFFER : : request & req , wallet_public : : COMMAND_MARKETPLACE_CANCEL_OFFER : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
currency : : transaction res_tx = AUTO_VAL_INIT ( res_tx ) ;
m_wallet . cancel_offer_by_id ( req . tx_id , req . no , req . fee , res_tx ) ;
res . tx_hash = string_tools : : pod_to_hex ( currency : : get_transaction_hash ( res_tx ) ) ;
res . tx_blob_size = currency : : get_object_blobsize ( res_tx ) ;
return true ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
}
2021-03-18 22:35:11 +03:00
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_create_htlc_proposal ( const wallet_public : : COMMAND_CREATE_HTLC_PROPOSAL : : request & req , wallet_public : : COMMAND_CREATE_HTLC_PROPOSAL : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
currency : : transaction tx = AUTO_VAL_INIT ( tx ) ;
m_wallet . create_htlc_proposal ( req . amount , req . counterparty_address , req . lock_blocks_count , tx , req . htlc_hash , res . derived_origin_secret ) ;
res . result_tx_blob = currency : : tx_to_blob ( tx ) ;
res . result_tx_id = get_transaction_hash ( tx ) ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_get_list_of_active_htlc ( const wallet_public : : COMMAND_GET_LIST_OF_ACTIVE_HTLC : : request & req , wallet_public : : COMMAND_GET_LIST_OF_ACTIVE_HTLC : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
2021-03-24 01:00:12 +03:00
m_wallet . get_list_of_active_htlc ( res . htlcs , req . income_redeem_only ) ;
2021-03-18 22:35:11 +03:00
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_redeem_htlc ( const wallet_public : : COMMAND_REDEEM_HTLC : : request & req , wallet_public : : COMMAND_REDEEM_HTLC : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
currency : : transaction tx = AUTO_VAL_INIT ( tx ) ;
m_wallet . redeem_htlc ( req . tx_id , req . origin_secret , tx ) ;
res . result_tx_blob = currency : : tx_to_blob ( tx ) ;
res . result_tx_id = get_transaction_hash ( tx ) ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server : : on_check_htlc_redeemed ( const wallet_public : : COMMAND_CHECK_HTLC_REDEEMED : : request & req , wallet_public : : COMMAND_CHECK_HTLC_REDEEMED : : response & res , epee : : json_rpc : : error & er , connection_context & cntx )
{
WALLET_RPC_BEGIN_TRY_ENTRY ( ) ;
m_wallet . check_htlc_redeemed ( req . htlc_tx_id , res . origin_secrete , res . redeem_tx_id ) ;
WALLET_RPC_CATCH_TRY_ENTRY ( ) ;
return true ;
}
//------------------------------------------------------------------------------------------------------------------------------
2019-08-27 22:11:45 +02:00
2018-12-27 18:50:45 +03:00
2019-04-08 14:16:11 +03:00
} // namespace tools