diff --git a/dap-sdk b/dap-sdk index ea267c0f9432a1fb94d70a4d400c265c63405ef8..3f75cc73ff155c9ae97682059535dd5a23b0c42f 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit ea267c0f9432a1fb94d70a4d400c265c63405ef8 +Subproject commit 3f75cc73ff155c9ae97682059535dd5a23b0c42f diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index 8412b79e584db73e41f71bb03eb3a902ce7c8cec..ba76d6f8253f3d8783678bb6e3ed8b0895cd49a3 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -551,6 +551,7 @@ static int s_cell_file_atom_add(dap_chain_cell_t *a_cell, dap_chain_atom_ptr_t a a_atom_size, a_cell->file_storage_path, ftello(a_cell->file_storage), (size_t)(a_cell->map_pos - a_cell->map)); #ifdef DAP_OS_DARWIN + fflush(a_cell->file_storage); if (a_cell->chain->is_mapped) { if ( MAP_FAILED == (a_cell->map = mmap(a_cell->map, dap_page_roundup(DAP_MAPPED_VOLUME_LIMIT), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, fileno(a_cell->file_storage), a_cell->cur_vol_start)) ) { @@ -641,7 +642,9 @@ ssize_t dap_chain_cell_file_append(dap_chain_cell_t *a_cell, const void *a_atom, } if (l_total_res) { +#ifndef DAP_OS_DARWIN fflush(a_cell->file_storage); +#endif #ifdef DAP_OS_WINDOWS if (a_cell->chain->is_mapped) { off_t l_off = ftello(a_cell->file_storage); diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index 14e8c79d094406edb53ac64d59fd19806dcf9ef6..013cf17523ba86d30df0ee3e5b1a5281208ee210 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -217,7 +217,8 @@ void dap_datum_token_dump_tsd_to_json(json_object * json_obj_out, dap_chain_datu * @param a_tx_hash_processed * @param l_tx_num */ -bool dap_chain_datum_dump_tx_json(dap_chain_datum_tx_t *a_datum, +bool dap_chain_datum_dump_tx_json(json_object* a_json_arr_reply, + dap_chain_datum_tx_t *a_datum, const char *a_ticker, json_object* json_obj_out, const char *a_hash_out_type, @@ -297,7 +298,7 @@ bool dap_chain_datum_dump_tx_json(dap_chain_datum_tx_t *a_datum, case TX_ITEM_TYPE_SIG: { dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig((dap_chain_tx_sig_t*)item); json_object_object_add(json_obj_item,"item type", json_object_new_string("SIG")); - dap_sign_get_information_json(l_sign, json_obj_item, a_hash_out_type); + dap_sign_get_information_json(a_json_arr_reply, l_sign, json_obj_item, a_hash_out_type); dap_chain_addr_t l_sender_addr; dap_chain_addr_fill_from_sign(&l_sender_addr, l_sign, a_net_id); json_object_object_add(json_obj_item,"Sender addr", json_object_new_string(dap_chain_addr_to_str_static(&l_sender_addr))); @@ -319,12 +320,12 @@ bool dap_chain_datum_dump_tx_json(dap_chain_datum_tx_t *a_datum, case (sizeof(dap_sign_t) * 2): { dap_sign_t *l_client = DAP_CAST_PTR( dap_sign_t, ((dap_chain_datum_tx_receipt_t*)item)->exts_n_signs + sizeof(dap_sign_t) ); json_object_object_add(json_obj_item,"Client", json_object_new_string("")); - dap_sign_get_information_json(l_client, json_obj_item, a_hash_out_type); + dap_sign_get_information_json(a_json_arr_reply, l_client, json_obj_item, a_hash_out_type); } case (sizeof(dap_sign_t)): { dap_sign_t *l_provider = DAP_CAST_PTR( dap_sign_t, ((dap_chain_datum_tx_receipt_t*)item)->exts_n_signs ); json_object_object_add(json_obj_item,"Provider", json_object_new_string("")); - dap_sign_get_information_json(l_provider,json_obj_item, a_hash_out_type); + dap_sign_get_information_json(a_json_arr_reply, l_provider,json_obj_item, a_hash_out_type); break; } } @@ -489,10 +490,10 @@ bool dap_chain_datum_dump_tx_json(dap_chain_datum_tx_t *a_datum, * @param a_obj_out * @param a_datum */ -void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type, dap_chain_net_id_t a_net_id) +void dap_chain_datum_dump_json(json_object* a_json_arr_reply, json_object *a_obj_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type, dap_chain_net_id_t a_net_id) { if( a_datum == NULL){ - dap_json_rpc_error_add(-1,"==Datum is NULL"); + dap_json_rpc_error_add(a_json_arr_reply, -1,"==Datum is NULL"); return; } json_object * json_obj_datum = json_object_new_object(); @@ -506,7 +507,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat size_t l_token_size = a_datum->header.data_size; dap_chain_datum_token_t * l_token = dap_chain_datum_token_read(a_datum->data, &l_token_size); if(l_token_size < sizeof(dap_chain_datum_token_t)){ - dap_json_rpc_error_add(-2,"==Datum has incorrect size. Only %zu, while at least %zu is expected\n", + dap_json_rpc_error_add(a_json_arr_reply, -2,"==Datum has incorrect size. Only %zu, while at least %zu is expected\n", l_token_size, sizeof(dap_chain_datum_token_t)); DAP_DEL_Z(l_token); return; @@ -624,7 +625,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat { log_it(L_ERROR, "Illformed DATUM type %d, TSD section is out-of-buffer (%" DAP_UINT64_FORMAT_U " vs %zu)", l_emission->hdr.type, l_emission->data.type_auth.tsd_total_size, l_emission_size); - dap_json_rpc_error_add(-3,"Skip incorrect or illformed DATUM"); + dap_json_rpc_error_add(a_json_arr_reply, -3,"Skip incorrect or illformed DATUM"); break; } dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size, @@ -653,7 +654,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat } break; case DAP_CHAIN_DATUM_TX: { dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)a_datum->data; - dap_chain_datum_dump_tx_json(l_tx, NULL, json_obj_datum, a_hash_out_type, &l_datum_hash, a_net_id); + dap_chain_datum_dump_tx_json(a_json_arr_reply, l_tx, NULL, json_obj_datum, a_hash_out_type, &l_datum_hash, a_net_id); } break; case DAP_CHAIN_DATUM_DECREE:{ dap_chain_datum_decree_t *l_decree = (dap_chain_datum_decree_t *)a_datum->data; diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h index a384070e6576e76bbe71b254db267907b667bd75..db94b8a2519274ce5237715f314ec0dbc2739217 100644 --- a/modules/common/include/dap_chain_datum.h +++ b/modules/common/include/dap_chain_datum.h @@ -159,11 +159,12 @@ DAP_STATIC_INLINE const char *dap_chain_datum_type_id_to_str(uint16_t a_type_id) } void dap_datum_token_dump_tsd_to_json(json_object * json_obj_out, dap_chain_datum_token_t *a_token, size_t a_token_size, const char *a_hash_out_type); -bool dap_chain_datum_dump_tx_json(dap_chain_datum_tx_t *a_datum, +bool dap_chain_datum_dump_tx_json(json_object* a_json_arr_reply, + dap_chain_datum_tx_t *a_datum, const char *a_ticker, json_object* json_obj_out, const char *a_hash_out_type, dap_hash_fast_t *a_tx_hash, dap_chain_net_id_t a_net_id); json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum); -void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type, dap_chain_net_id_t a_net_id); +void dap_chain_datum_dump_json(json_object* a_json_arr_reply,json_object *a_obj_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type, dap_chain_net_id_t a_net_id); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index cd30474fbdd7ad68a12b9e18e0ab5c6e2a7cb599..9fd9268069034d733d6b478769f5e4ee6668c7fd 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -271,11 +271,14 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) log_it(L_ERROR, "Can't find cert \"%s\" possibly for address \"%s\"", l_cert_name, l_addrs[i]); l_ret = -6; goto lb_err; + l_ret = -8; + goto lb_err; } } dap_chain_addr_t l_signing_addr; log_it(L_NOTICE, "Initialized auth cert \"%s\"", l_cert_name); l_inited_cert++; + l_inited_cert++; dap_chain_addr_fill_from_key(&l_signing_addr, l_cert_cur->enc_key, a_chain->net_id); l_esbocs_pvt->emergency_validator_addrs = dap_list_append(l_esbocs_pvt->emergency_validator_addrs, @@ -312,6 +315,10 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_ret = -1; goto lb_err; } + if (!l_inited_cert) { + l_ret = -7; + goto lb_err; + } // Preset reward for block signs, before first reward decree const char *l_preset_reward_str = dap_config_get_item_str(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "preset_reward"); if (l_preset_reward_str) { @@ -3005,14 +3012,14 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) int l_arg_index = 1; dap_chain_net_t *l_chain_net = NULL; dap_chain_t *l_chain = NULL; - json_object **json_arr_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; - if (dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&l_arg_index, a_argc, a_argv, &l_chain, &l_chain_net, + if (dap_chain_node_cli_cmd_values_parse_net_chain_for_json(a_json_arr_reply, &l_arg_index, a_argc, a_argv, &l_chain, &l_chain_net, CHAIN_TYPE_ANCHOR)) return -3; const char *l_chain_type = dap_chain_get_cs_type(l_chain); if (strcmp(l_chain_type, DAP_CHAIN_ESBOCS_CS_TYPE_STR)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHAIN_TYPE_ERR,"Type of chain \"%s\" is not block. Chain with current consensus \"%s\" is not supported by this command", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHAIN_TYPE_ERR,"Type of chain \"%s\" is not block. Chain with current consensus \"%s\" is not supported by this command", l_chain->name, l_chain_type); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHAIN_TYPE_ERR; } @@ -3058,22 +3065,22 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) const char *l_cert_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-cert", &l_cert_str); if (!l_cert_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR,"Command 'min_validators_count' requires parameter -cert"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR,"Command 'min_validators_count' requires parameter -cert"); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR; } l_poa_cert = dap_cert_find_by_name(l_cert_str); if (!l_poa_cert) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_CERT_ERR,"Specified certificate not found"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_CERT_ERR,"Specified certificate not found"); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_CERT_ERR; } if (!l_poa_cert->enc_key || !l_poa_cert->enc_key->priv_key_data) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_PVT_KEY_ERR,"Specified certificate doesn't contain a private key"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_PVT_KEY_ERR,"Specified certificate doesn't contain a private key"); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_PVT_KEY_ERR; } } else if (dap_cli_server_cmd_check_option(a_argv, l_arg_index, l_arg_index + 1, "show") > 0) l_subcommand_show = true; else - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_UNKNOWN,"Unrecognized subcommand '%s'", a_argv[l_arg_index]); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_UNKNOWN,"Unrecognized subcommand '%s'", a_argv[l_arg_index]); } int ret = 0; @@ -3085,12 +3092,12 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) const char *l_value_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-val_count", &l_value_str); if (!l_value_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR,"Command '%s' requires parameter -val_count", l_subcmd_strs[l_subcmd]); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR,"Command '%s' requires parameter -val_count", l_subcmd_strs[l_subcmd]); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR; } uint256_t l_value = dap_uint256_scan_uninteger(l_value_str); if (IS_ZERO_256(l_value)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_UNREC_COM_ERR,"Unrecognized number in '-val_count' param"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_UNREC_COM_ERR,"Unrecognized number in '-val_count' param"); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_UNREC_COM_ERR; } dap_chain_datum_decree_t *l_decree = s_esbocs_decree_set_min_validators_count( @@ -3100,17 +3107,17 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) json_object * json_obj_out = json_object_new_object(); json_object_object_add(json_obj_out,"status", json_object_new_string("Minimum validators count has been set")); json_object_object_add(json_obj_out,"decree hash", json_object_new_string(l_decree_hash_str)); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); DAP_DEL_MULTY(l_decree, l_decree_hash_str); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_MINVALSET_ERR,"Minimum validators count setting failed"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_MINVALSET_ERR,"Minimum validators count setting failed"); DAP_DEL_Z(l_decree); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_MINVALSET_ERR; } } else{ json_object * json_obj_out = json_object_new_object(); json_object_object_add(json_obj_out,"Minimum validators count", json_object_new_uint64(l_esbocs_pvt->min_validators_count)); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } } break; @@ -3122,17 +3129,17 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) if (l_decree && (l_decree_hash_str = s_esbocs_decree_put(l_decree, l_chain_net))) { json_object_object_add(json_obj_out,"Checking signs structure has been", l_subcommand_add ? json_object_new_string("enabled") : json_object_new_string("disabled")); json_object_object_add(json_obj_out,"Decree hash", json_object_new_string(l_decree_hash_str)); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); DAP_DEL_MULTY(l_decree, l_decree_hash_str); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHECKING_ERR,"Checking signs structure setting failed"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHECKING_ERR,"Checking signs structure setting failed"); DAP_DEL_Z(l_decree); json_object_put(json_obj_out); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHECKING_ERR; } } else{ json_object_object_add(json_obj_out,"Checking signs structure is", l_esbocs_pvt->check_signs_structure ? json_object_new_string("enabled") : json_object_new_string("disabled")); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } } break; @@ -3141,12 +3148,12 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) const char *l_hash_str = NULL, *l_type_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-pkey_hash", &l_hash_str); if (!l_hash_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_ERR,"Command '%s' requires parameter -pkey_hash", l_subcmd_strs[l_subcmd]); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_ERR,"Command '%s' requires parameter -pkey_hash", l_subcmd_strs[l_subcmd]); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_ERR; } dap_hash_fast_t l_pkey_hash; if (dap_chain_hash_fast_from_str(l_hash_str, &l_pkey_hash)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_FORMAT_ERR,"Invalid hash format in 'pkey_hash' param"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_FORMAT_ERR,"Invalid hash format in 'pkey_hash' param"); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_FORMAT_ERR; } dap_sign_type_t l_sig_type = { .type = SIG_TYPE_DILITHIUM }; @@ -3160,10 +3167,10 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) json_object_object_add(json_obj_out,"Emergency validator", json_object_new_string(dap_chain_hash_fast_to_str_static(&l_pkey_hash))); json_object_object_add(json_obj_out,"status", l_subcommand_add ? json_object_new_string("added") : json_object_new_string("deleted")); json_object_object_add(json_obj_out,"Decree hash", json_object_new_string(l_decree_hash_str)); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); DAP_DEL_MULTY(l_decree, l_decree_hash_str); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_ADD_DEL_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_ADD_DEL_ERR, "Emergency validator %s failed", l_subcommand_add ? "adding" : "deleting"); DAP_DEL_Z(l_decree); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_ADD_DEL_ERR; @@ -3171,12 +3178,12 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) } else{ json_object * json_obj_out = json_object_new_object(); s_print_emergency_validators(json_obj_out, l_esbocs_pvt->emergency_validator_addrs); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } } break; default: - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_SUB_ERR,"Unrecognized subcommand '%s'", a_argv[l_arg_index - 1]); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_ESBOCS_SUB_ERR,"Unrecognized subcommand '%s'", a_argv[l_arg_index - 1]); } return ret; } diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 594cb98472109285614b1f9002caef06e7c731fb..735f63c89d0f415e99791ccdf7ea237b1f6f4871 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -771,12 +771,6 @@ dap_string_t* dap_cli_list_net() json_object* s_set_reply_text_node_status_json(dap_chain_net_t *a_net) { json_object *l_jobj_ret = json_object_new_object(); json_object *l_jobj_net_name = json_object_new_string(a_net->pub.name); - if (!l_jobj_ret || !l_jobj_net_name) { - json_object_put(l_jobj_ret); - json_object_put(l_jobj_net_name); - dap_json_rpc_allocation_error; - return NULL; - } json_object_object_add(l_jobj_ret, "net", l_jobj_net_name); dap_chain_node_addr_t l_cur_node_addr = { 0 }; l_cur_node_addr.uint64 = dap_chain_net_get_cur_addr_int(a_net); @@ -797,14 +791,6 @@ json_object* s_set_reply_text_node_status_json(dap_chain_net_t *a_net) { json_object *l_jobj_links = json_object_new_object(); json_object *l_jobj_active_links = json_object_new_uint64(dap_link_manager_links_count(a_net->pub.id.uint64)); json_object *l_jobj_required_links = json_object_new_uint64(dap_link_manager_required_links_count(a_net->pub.id.uint64)); - if (!l_jobj_links || !l_jobj_active_links || !l_jobj_required_links) { - json_object_put(l_jobj_ret); - json_object_put(l_jobj_links); - json_object_put(l_jobj_active_links); - json_object_put(l_jobj_required_links); - dap_json_rpc_allocation_error; - return NULL; - } json_object_object_add(l_jobj_links, "active", l_jobj_active_links); json_object_object_add(l_jobj_links, "required", l_jobj_required_links); json_object_object_add(l_jobj_ret, "links", l_jobj_links); @@ -960,10 +946,10 @@ static const char *s_chain_type_convert_to_string(dap_chain_type_t a_type) */ static int s_cli_net(int argc, char **argv, void **reply) { - json_object ** json_arr_reply = (json_object **) reply; + json_object ** a_json_arr_reply = (json_object **) reply; json_object *l_jobj_return = json_object_new_object(); if (!l_jobj_return) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } int arg_index = 1; @@ -975,7 +961,7 @@ static int s_cli_net(int argc, char **argv, void **reply) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_INVALID_PARAMETER_HASH, "%s", "invalid parameter -H, valid values: -H <hex | base58>"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_INVALID_PARAMETER_HASH, "%s", "invalid parameter -H, valid values: -H <hex | base58>"); return DAP_CHAIN_NET_JSON_RPC_INVALID_PARAMETER_HASH; } @@ -989,14 +975,14 @@ static int s_cli_net(int argc, char **argv, void **reply) dap_chain_net_t* l_net = NULL; if (dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-net", &l_net_str) && !l_net_str) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_CAN_NOT_PARAMETER_NET_REQUIRE, "%s", "Parameter '-net' require <net name>"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_CAN_NOT_PARAMETER_NET_REQUIRE, "%s", "Parameter '-net' require <net name>"); return DAP_CHAIN_NET_JSON_RPC_CAN_NOT_PARAMETER_NET_REQUIRE; } l_net = dap_chain_net_by_name(l_net_str); if (l_net_str && !l_net) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_WRONG_NET, "%s", "Wrong <net name>, use 'net list' " + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_WRONG_NET, "%s", "Wrong <net name>, use 'net list' " "command to display a list of available networks"); return DAP_CHAIN_NET_JSON_RPC_WRONG_NET; } @@ -1008,7 +994,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_return); json_object_put(l_jobj_net_name); json_object_put(l_jobj_chains); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } dap_chain_t * l_chain = l_net->pub.chains; @@ -1019,7 +1005,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_net_name); json_object_put(l_jobj_chains); json_object_put(l_jobj_chain_name); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_array_add(l_jobj_chains, l_jobj_chain_name); @@ -1038,7 +1024,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_network); json_object_put(l_jobj_chains); json_object_put(l_jobj_network_name); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_network, "name", l_jobj_network_name); @@ -1053,7 +1039,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_chains); json_object_put(l_jobj_chain); json_object_put(l_jobj_chain_name); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_chain, "name", l_jobj_chain_name); @@ -1065,7 +1051,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_chains); json_object_put(l_jobj_network); json_object_put(l_jobj_networks); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } for (uint16_t i = 0; i < l_chain->default_datum_types_count; i++) { @@ -1078,7 +1064,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_chains); json_object_put(l_jobj_network); json_object_put(l_jobj_networks); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_array_add(l_jobj_default_types, l_jobj_type_str); @@ -1097,7 +1083,7 @@ static int s_cli_net(int argc, char **argv, void **reply) // plug for wrong command arguments if (argc > 2) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_MANY_ARGUMENT_FOR_COMMAND_NET_LIST, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_MANY_ARGUMENT_FOR_COMMAND_NET_LIST, "%s", "To many arguments for 'net list' command see help"); return DAP_CHAIN_NET_JSON_RPC_MANY_ARGUMENT_FOR_COMMAND_NET_LIST; } @@ -1114,7 +1100,7 @@ static int s_cli_net(int argc, char **argv, void **reply) return 0; } - int l_ret = dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&arg_index, argc, argv, NULL, &l_net, + int l_ret = dap_chain_node_cli_cmd_values_parse_net_chain_for_json(*a_json_arr_reply, &arg_index, argc, argv, NULL, &l_net, CHAIN_TYPE_INVALID); if ( l_net ) { @@ -1178,7 +1164,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_stats = json_object_new_object(); if (!l_jobj_stats) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object *l_jobj_from = json_object_new_string(l_from_str_new); @@ -1188,7 +1174,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_stats); json_object_put(l_jobj_from); json_object_put(l_jobj_to); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_stats, "from", l_jobj_from); @@ -1219,7 +1205,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_to); json_object_put(l_jobj_tpd); json_object_put(l_jobj_total); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } #ifdef DAP_TPS_TEST @@ -1231,7 +1217,7 @@ static int s_cli_net(int argc, char **argv, void **reply) l_ret = DAP_CHAIN_NET_JSON_RPC_OK; } else { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_STATS, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_STATS, "%s", "Subcommand 'stats' requires one of parameter: tx"); return DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_STATS; } @@ -1242,7 +1228,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_return); json_object_put(l_jobj_net); json_object_put(l_jobj_current_status); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "net", l_jobj_net); @@ -1251,7 +1237,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_to = json_object_new_string(c_net_states[NET_STATE_ONLINE]); if (!l_jobj_to) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "to", l_jobj_to); @@ -1261,7 +1247,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_to = json_object_new_string(c_net_states[NET_STATE_OFFLINE]); if (!l_jobj_to) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "to", l_jobj_to); @@ -1271,7 +1257,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_to = json_object_new_string("resynchronizing"); if (!l_jobj_to) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "start", l_jobj_to); @@ -1282,7 +1268,7 @@ static int s_cli_net(int argc, char **argv, void **reply) l_ret = DAP_CHAIN_NET_JSON_RPC_OK; } else { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_GO, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_GO, "%s", "Subcommand 'go' requires one of parameters: online, offline, sync\n"); return DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_GO; } @@ -1302,7 +1288,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_return); json_object_put(l_jobj_fees); json_object_put(l_jobj_network_name); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_fees, "network", l_jobj_network_name); @@ -1325,7 +1311,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_native_ticker); json_object_put(l_jobj_fee_addr); json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_network, "coins", l_jobj_fee_coins); @@ -1338,7 +1324,7 @@ static int s_cli_net(int argc, char **argv, void **reply) if (!l_jobj_validators) { json_object_put(l_jobj_fees); json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } //Get services fee @@ -1347,7 +1333,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_validators); json_object_put(l_jobj_fees); json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_fees, "validators", l_jobj_validators); @@ -1363,7 +1349,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_net_name); json_object_put(l_jobj_id); json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "network", l_jobj_net_name); @@ -1371,7 +1357,7 @@ static int s_cli_net(int argc, char **argv, void **reply) l_ret = DAP_CHAIN_NET_JSON_RPC_OK; } else { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_UNKNOWN_SUBCOMMANDS, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_UNKNOWN_SUBCOMMANDS, "Unknown \"%s\" subcommand, net get commands.", l_get_str); return DAP_CHAIN_NET_JSON_RPC_UNKNOWN_SUBCOMMANDS; } @@ -1380,14 +1366,14 @@ static int s_cli_net(int argc, char **argv, void **reply) dap_cluster_t *l_net_cluster = dap_cluster_by_mnemonim(l_net->pub.name); if (!l_net_cluster) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_CAN_NOT_GET_CLUSTER, "%s", "Failed to obtain a cluster for " + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_CAN_NOT_GET_CLUSTER, "%s", "Failed to obtain a cluster for " "the specified network."); return DAP_CHAIN_NET_JSON_RPC_CAN_NOT_GET_CLUSTER; } json_object *l_jobj_links = dap_cluster_get_links_info_json(l_net_cluster); if (!l_jobj_links) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "links", l_jobj_links); @@ -1396,7 +1382,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_not_implemented = json_object_new_string("Not implemented"); if (!l_jobj_not_implemented) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "add", l_jobj_not_implemented); @@ -1405,7 +1391,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_not_implemented = json_object_new_string("Not implemented"); if (!l_jobj_not_implemented) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "del", l_jobj_not_implemented); @@ -1414,7 +1400,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_not_implemented = json_object_new_string("Not implemented"); if (!l_jobj_not_implemented) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "info", l_jobj_not_implemented); @@ -1424,14 +1410,14 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_ret = json_object_new_string("Stopped network"); if (!l_jobj_ret) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "message", l_jobj_ret); l_ret = DAP_CHAIN_NET_JSON_RPC_OK; }else { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_COMMAND_LINK, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_COMMAND_LINK, "%s", "Subcommand 'link' requires one of parameters: list, add, del, info, disconnect_all"); return DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_COMMAND_LINK; } @@ -1444,7 +1430,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_state_machine); json_object_put(l_jobj_current); json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } dap_chain_net_sync(l_net); @@ -1452,7 +1438,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_put(l_jobj_state_machine); json_object_put(l_jobj_current); json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_state_machine, "current", l_jobj_current); @@ -1468,7 +1454,7 @@ static int s_cli_net(int argc, char **argv, void **reply) if (!l_cert_string && !l_hash_string) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_CA_ADD, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_CA_ADD, "%s", "One of -cert or -hash parameters is mandatory"); return DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_CA_ADD; } @@ -1479,13 +1465,13 @@ static int s_cli_net(int argc, char **argv, void **reply) dap_cert_t * l_cert = dap_cert_find_by_name(l_cert_string); if (l_cert == NULL) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_CAN_NOT_FIND_CERT_CA_ADD, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_CAN_NOT_FIND_CERT_CA_ADD, "Can't find \"%s\" certificate", l_cert_string); return DAP_CHAIN_NET_JSON_RPC_CAN_NOT_FIND_CERT_CA_ADD; } if (l_cert->enc_key == NULL) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_CAN_NOT_KEY_IN_CERT_CA_ADD, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_CAN_NOT_KEY_IN_CERT_CA_ADD, "No key found in \"%s\" certificate", l_cert_string); return DAP_CHAIN_NET_JSON_RPC_CAN_NOT_KEY_IN_CERT_CA_ADD; } @@ -1494,7 +1480,7 @@ static int s_cli_net(int argc, char **argv, void **reply) uint8_t *l_pub_key = dap_enc_key_serialize_pub_key(l_cert->enc_key, &l_pub_key_size);; if (l_pub_key == NULL) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_CAN_SERIALIZE_PUBLIC_KEY_CERT_CA_ADD, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_CAN_SERIALIZE_PUBLIC_KEY_CERT_CA_ADD, "Can't serialize public key of certificate \"%s\"", l_cert_string); return DAP_CHAIN_NET_JSON_RPC_CAN_SERIALIZE_PUBLIC_KEY_CERT_CA_ADD; } @@ -1513,7 +1499,7 @@ static int s_cli_net(int argc, char **argv, void **reply) if (!l_gdb_group_str) { DAP_DELETE(l_hash_hex_str); json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_ADD, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_ADD, "%s", "Database ACL group not defined for this network"); return DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_ADD; } @@ -1522,7 +1508,7 @@ static int s_cli_net(int argc, char **argv, void **reply) DAP_DELETE(l_gdb_group_str); if (l_ret) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_CAN_NOT_SAVE_PUBLIC_KEY_IN_DATABASE, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_CAN_NOT_SAVE_PUBLIC_KEY_IN_DATABASE, "Can't save public key hash %s in database", l_hash_hex_str); DAP_DELETE(l_hash_hex_str); return DAP_CHAIN_NET_JSON_RPC_CAN_NOT_SAVE_PUBLIC_KEY_IN_DATABASE; @@ -1530,7 +1516,7 @@ static int s_cli_net(int argc, char **argv, void **reply) DAP_DELETE(l_hash_hex_str); } else{ json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_CAN_NOT_SAVE_PUBLIC_KEY_IN_DATABASE, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_CAN_NOT_SAVE_PUBLIC_KEY_IN_DATABASE, "%s", "Can't save NULL public key hash in database"); return DAP_CHAIN_NET_JSON_RPC_CAN_NOT_SAVE_PUBLIC_KEY_IN_DATABASE; } @@ -1538,7 +1524,7 @@ static int s_cli_net(int argc, char **argv, void **reply) } else if (strcmp(l_ca_str, "list") == 0 ) { char *l_gdb_group_str = dap_chain_net_get_gdb_group_acl(l_net); if (!l_gdb_group_str) { - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_LIST, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_LIST, "%s", "Database ACL group not defined for this network"); return DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_LIST; } @@ -1548,7 +1534,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_list_ca = json_object_new_array(); if (!l_jobj_list_ca) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } for (size_t i = 0; i < l_objs_count; i++) { @@ -1556,7 +1542,7 @@ static int s_cli_net(int argc, char **argv, void **reply) if (!l_jobj_key) { json_object_put(l_jobj_list_ca); json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } } @@ -1568,7 +1554,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_str_ret = json_object_new_string("No entries found"); if (!l_jobj_list_ca) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_return, "ca_list", l_jobj_str_ret); @@ -1578,13 +1564,13 @@ static int s_cli_net(int argc, char **argv, void **reply) const char *l_hash_string = NULL; dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-hash", &l_hash_string); if (!l_hash_string) { - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_UNKNOWN_HASH_CA_DEL, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_UNKNOWN_HASH_CA_DEL, "%s", "Format should be 'net ca del -hash <hash string>"); return DAP_CHAIN_NET_JSON_RPC_UNKNOWN_HASH_CA_DEL; } char *l_gdb_group_str = dap_chain_net_get_gdb_group_acl(l_net); if (!l_gdb_group_str) { - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_DEL, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_DEL, "%s", "Database ACL group not defined for this network"); return DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_DEL; } @@ -1593,14 +1579,14 @@ static int s_cli_net(int argc, char **argv, void **reply) DAP_DELETE(l_ret_msg_str); if (l_jobj_ret) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } l_ret = dap_global_db_del_sync(l_gdb_group_str, l_hash_string); DAP_DELETE(l_gdb_group_str); if (l_ret) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_CAN_NOT_FIND_CERT_CA_DEL, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_CAN_NOT_FIND_CERT_CA_DEL, "%s", "Can't find certificate public key hash in database"); return DAP_CHAIN_NET_JSON_RPC_CAN_NOT_FIND_CERT_CA_DEL; } @@ -1608,7 +1594,7 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object_array_add(*reply, l_jobj_ret); return DAP_CHAIN_NET_JSON_RPC_OK; } else { - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_INVALID_PARAMETER_COMMAND_CA, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_INVALID_PARAMETER_COMMAND_CA, "%s", "Subcommand 'ca' requires one of parameter: add, list, del"); return DAP_CHAIN_NET_JSON_RPC_INVALID_PARAMETER_COMMAND_CA; } @@ -1621,14 +1607,14 @@ static int s_cli_net(int argc, char **argv, void **reply) } else if (l_list_str && !strcmp(l_list_str, "list")) { if (!l_net->pub.keys) { json_object_put(l_jobj_return); - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_NO_POA_CERTS_FOUND_POA_CERTS, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_NO_POA_CERTS_FOUND_POA_CERTS, "%s", "No PoA certs found for this network"); return DAP_CHAIN_NET_JSON_RPC_NO_POA_CERTS_FOUND_POA_CERTS; } json_object *l_jobj_pkeys = json_object_new_array(); if (!l_jobj_pkeys) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } for (dap_list_t *it = l_net->pub.keys; it; it = it->next) { @@ -1640,7 +1626,7 @@ static int s_cli_net(int argc, char **argv, void **reply) if (!l_jobj_hash_key) { json_object_put(l_jobj_pkeys); json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_array_add(l_jobj_pkeys, l_jobj_hash_key); @@ -1652,14 +1638,14 @@ static int s_cli_net(int argc, char **argv, void **reply) json_object *l_jobj_info = json_object_new_string("empty"); if (!l_jobj_info) { json_object_put(l_jobj_return); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_pkeys, "poa_certs", l_jobj_info); } l_ret = DAP_CHAIN_NET_JSON_RPC_OK; } else { - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_UNKNOWN_SUBCOMMANDS, "%s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NET_JSON_RPC_UNKNOWN_SUBCOMMANDS, "%s", "Command 'net' requires one of subcomands: sync, link, go, get, stats, ca, ledger"); l_ret = DAP_CHAIN_NET_JSON_RPC_UNKNOWN_SUBCOMMANDS; } @@ -1668,7 +1654,7 @@ static int s_cli_net(int argc, char **argv, void **reply) l_jobj_return = NULL; } if (l_jobj_return) { - json_object_array_add(*json_arr_reply, l_jobj_return); + json_object_array_add(*a_json_arr_reply, l_jobj_return); } return l_ret; } diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 99484040afdbafea0b96c545aa5140b59a76b1e8..47dcd39d5eedaa662121278838f8d8661d57f9c2 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -121,7 +121,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "wallet new -w <wallet_name> [-sign <sign_type>] [-restore <hex_value> | -restore_legacy <restore_string>] [-net <net_name>] [-force] [-password <password>]\n" "wallet info {-addr <addr> | -w <wallet_name>} -net <net_name>\n" "wallet activate -w <wallet_name> -password <password> [-ttl <password_ttl_in_minutes>]\n" - "wallet deactivate -w <wallet_name> -password <password>\n" + "wallet deactivate -w <wallet_name>>\n" "wallet convert -w <wallet_name> -password <password>\n"); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 2aa446bd15e95d5425477696196e8a9ec6aee3a4..3d4fee8dff31e24b91a510aba89b4782ccb79811 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -396,7 +396,7 @@ static int s_node_info_list_with_reply(dap_chain_net_t *a_net, dap_chain_node_ad */ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) { - json_object **json_arr_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; enum { CMD_NONE, CMD_NAME_CELL, CMD_ADD, CMD_FLUSH, CMD_RECORD, CMD_WRITE, CMD_READ, CMD_DELETE, CMD_DROP, CMD_GET_KEYS, CMD_GROUP_LIST @@ -428,13 +428,13 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) { if(!arg_index || a_argc < 3) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "parameters are not valid"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "parameters are not valid"); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; - if (dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&arg_index, a_argc, a_argv, &l_chain, &l_net, CHAIN_TYPE_INVALID) < 0) + if (dap_chain_node_cli_cmd_values_parse_net_chain_for_json(*a_json_arr_reply, &arg_index, a_argc, a_argv, &l_chain, &l_net, CHAIN_TYPE_INVALID) < 0) return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; const char *l_cell_str = NULL, *l_chain_str = NULL; @@ -460,7 +460,7 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) // add new node to global_db case CMD_ADD: if(!arg_index || a_argc < 7) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "invalid parameters"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "invalid parameters"); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } dap_chain_cell_t *l_cell = dap_chain_cell_create_fill(l_chain, l_cell_id); @@ -469,17 +469,17 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) { json_object* json_obj_name = json_object_new_object(); json_object_object_add(json_obj_name, "comand status", json_object_new_string("cell added successfully")); - json_object_array_add(*json_arr_reply, json_obj_name); + json_object_array_add(*a_json_arr_reply, json_obj_name); } else - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_CREATE_CELL_ERR, "can't create file for cell 0x%016"DAP_UINT64_FORMAT_X" ( %s )", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_CREATE_CELL_ERR, "can't create file for cell 0x%016"DAP_UINT64_FORMAT_X" ( %s )", l_cell->id.uint64,l_cell->file_storage_path); dap_chain_cell_close(l_cell); return l_ret; //case CMD_NONE: default: - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_COMMAND_ERR, "command %s not recognized", a_argv[1]); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_COMMAND_ERR, "command %s not recognized", a_argv[1]); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_COMMAND_ERR; } } @@ -492,25 +492,25 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) case 0: json_obj_flush = json_object_new_object(); json_object_object_add(json_obj_flush, "command status", json_object_new_string("Commit data base and filesystem caches to disk completed.\n\n")); - json_object_array_add(*json_arr_reply, json_obj_flush); + json_object_array_add(*a_json_arr_reply, json_obj_flush); break; case -1: - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_OPEN_DIR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_OPEN_DIR, "Couldn't open db directory. Can't init cdb\n" "Reboot the node.\n\n"); break; case -2: - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_INIT_DB, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_INIT_DB, "Couldn't open db directory. Can't init cdb\n" "Reboot the node.\n\n"); break; case -3: - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_INIT_SQL, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_INIT_SQL, "Can't init sqlite\n" "Reboot the node.\n\n"); break; default: - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_COMMIT_TO_DISK, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_COMMIT_TO_DISK, "Can't commit data base caches to disk completed.\n" "Reboot the node.\n\n"); break; @@ -523,7 +523,7 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) SUMCMD_GET, SUMCMD_PIN, SUMCMD_UNPIN }; if(!arg_index || a_argc < 3) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"parameters are not valid"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"parameters are not valid"); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } int arg_index_n = ++arg_index; @@ -541,7 +541,7 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) l_subcmd = SUMCMD_UNPIN; } else{ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "Subcommand '%s' not recognized, available subcommands are 'get', 'pin' or 'unpin'", a_argv[2]); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } @@ -556,7 +556,7 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) dap_nanotime_t l_ts =0; uint8_t *l_value = dap_global_db_get_sync(l_group, l_key, &l_value_len, &l_is_pinned, &l_ts); if(!l_value || !l_value_len) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_FOUND, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_FOUND, "Record not found\n\n"); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_FOUND; } @@ -594,7 +594,7 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) json_object_object_add(json_obj_rec, "pinned status", json_object_new_string("record successfully pinned")); } else{ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_PINED, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_PINED, "can't pin the record"); l_ret = -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_PINED; } @@ -610,14 +610,14 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) json_object_object_add(json_obj_rec, "unpinned status", json_object_new_string("record successfully unpinned")); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_UNPINED, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_UNPINED, "can't unpin the record"); l_ret = -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_UNPINED; } break; } } - json_object_array_add(*json_arr_reply, json_obj_rec); + json_object_array_add(*a_json_arr_reply, json_obj_rec); DAP_DELETE(l_value); return l_ret; } @@ -632,21 +632,21 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-value", &l_value_str); if (!l_group_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "%s requires parameter 'group' to be valid", a_argv[0]); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } if (!l_key_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "%s requires parameter 'key' to be valid", a_argv[0]); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } if (!l_value_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "%s requires parameter 'value' to be valid", a_argv[0]); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; @@ -655,10 +655,10 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) if (!dap_global_db_set_sync(l_group_str, l_key_str, l_value_str, strlen(l_value_str) +1 , false)) { json_object* json_obj_write = json_object_new_object(); json_object_object_add(json_obj_write, "write status", json_object_new_string("Data has been successfully written to the database")); - json_object_array_add(*json_arr_reply, json_obj_write); + json_object_array_add(*a_json_arr_reply, json_obj_write); return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK; } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_WRITING_FILED, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_WRITING_FILED, "Data writing is failed"); } } @@ -671,13 +671,13 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); if(!l_group_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "%s requires parameter 'group' to be valid", a_argv[0]); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } if(!l_key_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "%s requires parameter 'key' to be valid", a_argv[0]); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } @@ -701,16 +701,16 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) json_object_object_add(json_obj_read, "time", json_object_new_string(l_ts_str)); json_object_object_add(json_obj_read, "value len", json_object_new_uint64(l_out_len)); json_object_object_add(json_obj_read, "value hex", json_object_new_string(l_value_hexdump)); - json_object_array_add(*json_arr_reply, json_obj_read); + json_object_array_add(*a_json_arr_reply, json_obj_read); DAP_DELETE(l_value_hexdump); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_TIME_NO_VALUE, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_TIME_NO_VALUE, "\n\"%s : %s\"\nTime: %s\nNo value\n", l_group_str, l_key_str, l_ts_str); } DAP_DELETE(l_value_out); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_FOUND, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_FOUND, "\nRecord \"%s : %s\" not found\n", l_group_str, l_key_str); } @@ -725,13 +725,13 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); if(!l_group_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "%s requires parameter 'group' to be valid", a_argv[0]); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } if(!l_key_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_KEY_PROVIDED, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_KEY_PROVIDED, "No key provided, entire table %s will be altered", l_group_str); size_t l_objs_count = 0; @@ -739,7 +739,7 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) if (!l_obj || !l_objs_count) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP, "No data in group %s.", l_group_str); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP; } @@ -756,7 +756,7 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) json_object_object_add(json_obj_del, "Removed records", json_object_new_uint64(j)); json_object_object_add(json_obj_del, "of records", json_object_new_uint64(i)); json_object_object_add(json_obj_del, "in table", json_object_new_string(l_group_str)); - json_object_array_add(*json_arr_reply, json_obj_del); + json_object_array_add(*a_json_arr_reply, json_obj_del); return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK; } @@ -765,10 +765,10 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) json_object_object_add(json_obj_del, "Record key", json_object_new_string(l_key_str)); json_object_object_add(json_obj_del, "Group name", json_object_new_string(l_group_str)); json_object_object_add(json_obj_del, "status", json_object_new_string("deleted")); - json_object_array_add(*json_arr_reply, json_obj_del); + json_object_array_add(*a_json_arr_reply, json_obj_del); return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK; } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_DELETE_FAILD, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_DELETE_FAILD, "Record with key %s in group %s deleting failed", l_group_str, l_key_str); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_DELETE_FAILD; } @@ -779,7 +779,7 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); if(!l_group_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"%s requires parameter 'group' to be valid", a_argv[0]); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"%s requires parameter 'group' to be valid", a_argv[0]); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } @@ -787,10 +787,10 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) { json_object* json_obj_drop = json_object_new_object(); json_object_object_add(json_obj_drop, "Dropped table", json_object_new_string(l_group_str)); - json_object_array_add(*json_arr_reply, json_obj_drop); + json_object_array_add(*a_json_arr_reply, json_obj_drop); return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK; } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_DROP_FAILED,"Failed to drop table %s", l_group_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_DROP_FAILED,"Failed to drop table %s", l_group_str); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_DROP_FAILED; } } @@ -800,7 +800,7 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); if(!l_group_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"%s requires parameter 'group' to be valid", a_argv[0]); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"%s requires parameter 'group' to be valid", a_argv[0]); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } @@ -809,10 +809,8 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) if (!l_objs || !l_objs_count) { - char *l_str_tmp = dap_strdup_printf("No data in group '%s' or group not found.", l_group_str); - json_object *l_jobj_msg = json_object_new_string(l_str_tmp); - json_object_array_add(*json_arr_reply, l_jobj_msg); - return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP,"No data in group %s.", l_group_str); + return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP; } json_object* json_arr_keys = json_object_new_array(); @@ -832,7 +830,7 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) json_object* json_keys_list = json_object_new_object(); json_object_object_add(json_keys_list, "group name", json_object_new_string(l_group_str)); json_object_object_add(json_keys_list, "keys list", json_arr_keys); - json_object_array_add(*json_arr_reply, json_keys_list); + json_object_array_add(*a_json_arr_reply, json_keys_list); return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK; } case CMD_GROUP_LIST: { @@ -849,12 +847,12 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) } json_object_object_add(json_group_list, "group list", json_arr_group); json_object_object_add(json_group_list, "total count", json_object_new_uint64(l_count)); - json_object_array_add(*json_arr_reply, json_group_list); + json_object_array_add(*a_json_arr_reply, json_group_list); dap_list_free(l_group_list); return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK; } default: - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"parameters are not valid"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"parameters are not valid"); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR; } } @@ -1811,9 +1809,9 @@ int com_help(int a_argc, char **a_argv, void **a_str_reply) * @param str_reply * @return int */ -int com_tx_wallet(int a_argc, char **a_argv, void **reply) +int com_tx_wallet(int a_argc, char **a_argv, void **a_str_reply) { -json_object ** json_arr_reply = (json_object **) reply; +json_object ** a_json_arr_reply = (json_object **) a_str_reply; const char *c_wallets_path = dap_chain_wallet_get_path(g_config); enum { CMD_NONE, CMD_WALLET_NEW, CMD_WALLET_LIST, CMD_WALLET_INFO, CMD_WALLET_ACTIVATE, CMD_WALLET_DEACTIVATE, CMD_WALLET_CONVERT }; int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; @@ -1835,7 +1833,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; l_arg_index++; if(cmd_num == CMD_NONE) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PARAM_ERR, "Format of command: wallet {new -w <wallet_name> | list | info [-addr <addr>]|[-w <wallet_name> -net <net_name>]}"); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PARAM_ERR; } @@ -1852,7 +1850,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; // Check if wallet name has only digits and English letter if (l_wallet_name && !dap_isstralnum(l_wallet_name)){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR, "Wallet name must contains digits and aplhabetical symbols"); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR; } @@ -1862,7 +1860,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; dap_chain_addr_t *l_addr = NULL; if(l_net_name && !l_net) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR, "Not found net by name '%s'", l_net_name); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR; } @@ -1932,14 +1930,14 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; case CMD_WALLET_INFO: { dap_ledger_t *l_ledger = NULL; if ((l_wallet_name && l_addr_str) || (!l_wallet_name && !l_addr_str)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR, "You should use either the -w or -addr option for the wallet info command."); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR; } if(l_wallet_name) { if(!l_net) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR, "Subcommand info requires parameter '-net'"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR; @@ -1953,7 +1951,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; if (!l_addr){ if(l_wallet) dap_chain_wallet_close(l_wallet); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_FOUND_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_FOUND_ERR, "Wallet not found"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_FOUND_ERR; @@ -1963,7 +1961,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; l_ledger = l_net->pub.ledger; l_net_name = l_net->pub.name; } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_ERR, "Can't find network id 0x%016"DAP_UINT64_FORMAT_X" from address %s", l_addr->net_id.uint64, l_addr_str); json_object_put(json_arr_out); @@ -2045,19 +2043,19 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; } default: { if( !l_wallet_name ) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR, "Wallet name option <-w> not defined"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR; } if( cmd_num != CMD_WALLET_DEACTIVATE && !l_pass_str && cmd_num != CMD_WALLET_NEW) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR, "Wallet password option <-password> not defined"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR; } if ( cmd_num != CMD_WALLET_DEACTIVATE && l_pass_str && DAP_WALLET$SZ_PASS < strnlen(l_pass_str, DAP_WALLET$SZ_PASS + 1) ) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_TO_LONG_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_TO_LONG_ERR, "Wallet's password is too long ( > %d)", DAP_WALLET$SZ_PASS); log_it(L_ERROR, "Wallet's password is too long ( > %d)", DAP_WALLET$SZ_PASS); json_object_put(json_arr_out); @@ -2082,21 +2080,21 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; json_object_new_string("is activated") : json_object_new_string("is deactivated")); break; case -EBUSY: - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_ALREADY_ERR, - "Wallet %s is already %sactivated\n", l_wallet_name, l_prefix); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_ALREADY_ERR, + "Error: wallet %s is already %sactivated\n", l_wallet_name, l_prefix); break; case -EAGAIN: - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR, "Wrong password for wallet %s\n", l_wallet_name); break; case -101: - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR, - "Can't activate unprotected wallet %s\n", l_wallet_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR, + "Can't active unprotected wallet: %s\n", l_wallet_name); break; default: { char l_buf[512] = { '\0' }; strerror_r(l_rc, l_buf, sizeof(l_buf) - 1); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_ACTIVE_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_ACTIVE_ERR, "Wallet %s %sactivation error %d : %s\n", l_wallet_name, l_prefix, l_rc, l_buf); break; } @@ -2107,12 +2105,12 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; case CMD_WALLET_CONVERT: { l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path, NULL); if (!l_wallet) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR, "wrong password"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR; } else if (l_wallet->flags & DAP_WALLET$M_FL_ACTIVE) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_CONVERT_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_CONVERT_ERR, "Wallet can't be converted twice"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_CONVERT_ERR; @@ -2121,7 +2119,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; dap_chain_wallet_internal_t* l_file_name = DAP_CHAIN_WALLET_INTERNAL(l_wallet); snprintf(l_file_name->file_name, sizeof(l_file_name->file_name) - 1, "%s/%s_%012lu%s", c_wallets_path, l_wallet_name, time(NULL),".backup"); if ( dap_chain_wallet_save(l_wallet, NULL) ) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_BACKUP_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_BACKUP_ERR, "Can't create backup wallet file because of internal error"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_BACKUP_ERR; @@ -2129,7 +2127,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; // change to old filename snprintf(l_file_name->file_name, sizeof(l_file_name->file_name) - 1, "%s/%s%s", c_wallets_path, l_wallet_name, ".dwallet"); if ( dap_chain_wallet_save(l_wallet, l_pass_str) ) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_CONVERT_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_CONVERT_ERR, "Wallet is not converted because of internal error"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_CONVERT_ERR; @@ -2160,7 +2158,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; FILE *l_exists = fopen(l_file_name, "rb"); DAP_DELETE(l_file_name); if (l_exists) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_ALREADY_ERR,"Wallet %s already exists",l_wallet_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_ALREADY_ERR,"Wallet %s already exists",l_wallet_name); fclose(l_exists); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_ALREADY_ERR; @@ -2176,7 +2174,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; } else { l_sign_types[0] = dap_sign_type_from_str(l_sign_type_str); if (l_sign_types[0].type == SIG_TYPE_NULL){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, "'%s' unknown signature type, please use:\n%s", l_sign_type_str, dap_sign_get_str_recommended_types()); json_object_put(json_arr_out); @@ -2194,7 +2192,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; l_sign_count++; } if (l_sign_count < 2) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, "You did not specify an additional signature after " "sig_multi_chained. You must specify at least two more " "signatures other than sig_multi_chained.\n" @@ -2212,11 +2210,11 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; for (size_t i = 0; i < l_sign_count; ++i) { if (dap_sign_type_is_depricated(l_sign_types[i])) { if (l_restore_opt || l_restore_legacy_opt) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, "CAUTION!!! CAUTION!!! CAUTION!!!\nThe Bliss, Tesla and Picnic signatures are deprecated. We recommend you to create a new wallet with another available signature and transfer funds there.\n"); break; } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, "This signature algorithm is no longer supported, please, use another variant"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR; @@ -2238,11 +2236,11 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; } dap_hex2bin(l_seed, l_restore_str + 2, l_restore_str_size - 2); if (l_restore_legacy_opt) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PROTECTION_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PROTECTION_ERR, "CAUTION!!! CAUTION!!! CAUTION!!!\nYour wallet has a low level of protection. Please create a new wallet again with the option -restore\n"); } } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_HASH_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_HASH_ERR, "Restored hash is invalid or too short, wallet is not created. Please use -restore 0x<hex_value> or -restore_legacy 0x<restore_string>"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_HASH_ERR; @@ -2254,7 +2252,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; l_seed, l_seed_size, l_pass_str); DAP_DELETE(l_seed); if (!l_wallet) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_INTERNAL_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_INTERNAL_ERR, "Wallet is not created because of internal error. Check name or password length (max 64 chars)"); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_INTERNAL_ERR; @@ -2288,9 +2286,9 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; } if (json_arr_out) { - json_object_array_add(*json_arr_reply, json_arr_out); + json_object_array_add(*a_json_arr_reply, json_arr_out); } else { - json_object_array_add(*json_arr_reply, json_object_new_string("empty")); + json_object_array_add(*a_json_arr_reply, json_object_new_string("empty")); } return 0; } @@ -2307,7 +2305,7 @@ typedef enum dap_chain_node_cli_cmd_values_parse_net_chain_err_to_json { DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_FAST_AND_BASE58_ADDR, DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_CAN_NOT_FIND_DEFAULT_CHAIN_WITH_TYPE } dap_chain_node_cli_cmd_values_parse_net_chain_err_to_json; -int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(int *a_arg_index, int a_argc, +int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(json_object* a_json_arr_reply, int *a_arg_index, int a_argc, char **a_argv, dap_chain_t **a_chain, dap_chain_net_t **a_net, dap_chain_type_t a_default_chain_type) { @@ -2318,14 +2316,14 @@ int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(int *a_arg_index, int if(a_net) dap_cli_server_cmd_find_option_val(a_argv, *a_arg_index, a_argc, "-net", &l_net_str); else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING, + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING, "Error in internal command processing."); return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING; } // Select network if(!l_net_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_STR_IS_NUL, "%s requires parameter '-net'", a_argv[0]); + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_STR_IS_NUL, "%s requires parameter '-net'", a_argv[0]); return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_STR_IS_NUL; } @@ -2336,7 +2334,7 @@ int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(int *a_arg_index, int l_str_to_reply = dap_strcat2(l_str_to_reply,l_str_to_reply_chain); dap_string_t* l_net_str = dap_cli_list_net(); l_str_to_reply = dap_strcat2(l_str_to_reply,l_net_str->str); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_NOT_FOUND, "%s", l_str_to_reply); + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_NOT_FOUND, "%s", l_str_to_reply); DAP_DELETE(l_str_to_reply); dap_string_free(l_net_str, true); return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_NOT_FOUND; @@ -2362,14 +2360,14 @@ int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(int *a_arg_index, int l_str_to_reply = dap_strcat2(l_str_to_reply,l_chain->name); l_str_to_reply = dap_strcat2(l_str_to_reply,"\n"); } - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_NOT_FOUND, l_str_to_reply); + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_NOT_FOUND, l_str_to_reply); return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_NOT_FOUND; } } else if (a_default_chain_type != CHAIN_TYPE_INVALID) { if ((*a_chain = dap_chain_net_get_default_chain_by_chain_type(*a_net, a_default_chain_type)) != NULL) { return 0; } else { - dap_json_rpc_error_add( + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_CAN_NOT_FIND_DEFAULT_CHAIN_WITH_TYPE, "Unable to get the default chain of type %s for the network.", dap_chain_type_to_str(a_default_chain_type)); return DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_CAN_NOT_FIND_DEFAULT_CHAIN_WITH_TYPE; @@ -2694,16 +2692,16 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply) * @param a_str_tmp * @param a_hash_out_type */ -void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a_chain, const char * a_add, +void s_com_mempool_list_print_for_chain(json_object* a_json_arr_reply, dap_chain_net_t * a_net, dap_chain_t * a_chain, const char * a_add, json_object *a_json_obj, const char *a_hash_out_type, bool a_fast, size_t a_limit, size_t a_offset) { dap_chain_addr_t *l_wallet_addr = dap_chain_addr_from_str(a_add); if (a_add && !l_wallet_addr) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_CONVERT_BASE58_TO_ADDR_WALLET, "Cannot convert " + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_CONVERT_BASE58_TO_ADDR_WALLET, "Cannot convert " "string '%s' to binary address.\n", a_add); return; } if (l_wallet_addr && a_fast) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_FAST_AND_BASE58_ADDR, + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_FAST_AND_BASE58_ADDR, "In fast mode, it is impossible to count the number of transactions and emissions " "for a specific address. The -brief and -addr options are mutually exclusive.\n"); DAP_DELETE(l_wallet_addr); @@ -2711,7 +2709,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a } char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); if(!l_gdb_group_mempool){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_CAN_NOT_GET_MEMPOOL_GROUP, + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_CAN_NOT_GET_MEMPOOL_GROUP, "%s.%s: chain not found\n", a_net->pub.name, a_chain->name); return; } @@ -2720,7 +2718,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object *l_obj_chain_name = json_object_new_string(a_chain->name); if (!l_obj_chain_name || !l_obj_chain) { json_object_put(l_obj_chain); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } json_object_object_add(l_obj_chain, "name", l_obj_chain_name); @@ -2728,7 +2726,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object *l_jobj_removed = json_object_new_int(l_removed); if (!l_jobj_removed) { json_object_put(l_obj_chain); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } json_object_object_add(l_obj_chain, "removed", l_jobj_removed); @@ -2742,7 +2740,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a l_jobj_datums = json_object_new_array(); if (!l_jobj_datums) { json_object_put(l_obj_chain); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } @@ -2791,7 +2789,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } json_object_object_add(l_jobj_ts_created, "time_stamp", l_jobj_ts_created_time_stamp); @@ -2806,7 +2804,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } if (!dap_hash_fast_compare(&l_datum_real_hash, &l_datum_hash_from_key)) { @@ -2822,7 +2820,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_hash); json_object_put(l_jobj_ts_created); json_object_put(l_jobj_datums); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } json_object *l_jobj_warning = json_object_new_string(l_wgn); @@ -2835,7 +2833,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_hash); json_object_put(l_jobj_ts_created); json_object_put(l_jobj_datums); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } json_object_object_add(l_jobj_datum, "warning", l_jobj_warning); @@ -2866,7 +2864,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } @@ -2911,7 +2909,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return; } for (dap_list_t *it = l_list_in_reward; it; it = it->next) { @@ -2926,7 +2924,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return; } json_object_array_add(l_obj_in_reward_arary, l_jobj_block_hash); @@ -2940,7 +2938,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } json_object_object_add(l_jobj_datum, "from", l_jobj_addr_from); @@ -2972,7 +2970,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } enum { @@ -3050,7 +3048,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } const char *l_value_coins_str, *l_value_str = dap_uint256_to_char(l_value, &l_value_coins_str); @@ -3068,7 +3066,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } json_object_object_add(l_jobj_money, "token", l_jobj_token); @@ -3089,7 +3087,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } json_object_object_add(l_jobj_f, "money", l_jobj_money); @@ -3115,7 +3113,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object_put(l_obj_chain); json_object_put(l_jobj_f); dap_global_db_objs_delete(l_objs, l_objs_count); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } json_object_object_add(l_jobj_f, "token_emission_hash", l_obj_ems_hash); @@ -3199,11 +3197,11 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a if (l_wallet_addr && l_emi && dap_chain_addr_compare(l_wallet_addr, &l_emi->hdr.address)) datum_is_accepted_addr = true; DAP_DELETE(l_emi); - dap_chain_datum_dump_json(l_jobj_datum,l_datum,a_hash_out_type,a_net->pub.id); + dap_chain_datum_dump_json(a_json_arr_reply, l_jobj_datum,l_datum,a_hash_out_type,a_net->pub.id); } break; default: - dap_chain_datum_dump_json(l_jobj_datum,l_datum,a_hash_out_type,a_net->pub.id); + dap_chain_datum_dump_json(a_json_arr_reply, l_jobj_datum,l_datum,a_hash_out_type,a_net->pub.id); } } if (l_wallet_addr) { @@ -3226,7 +3224,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a json_object * l_object_total = json_object_new_string(l_net_chain_count_total); if (!l_object_total) { json_object_put(l_obj_chain); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); return; } json_object_object_add(l_obj_chain, "total", l_object_total); @@ -3235,7 +3233,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a DAP_DELETE(l_gdb_group_mempool); } -static int mempool_delete_for_chain(dap_chain_t *a_chain, const char * a_datum_hash_str, json_object **a_json_reply) { +static int mempool_delete_for_chain(dap_chain_t *a_chain, const char * a_datum_hash_str, json_object **a_json_arr_reply) { char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); uint8_t *l_data_tmp = dap_global_db_get_sync(l_gdb_group_mempool, a_datum_hash_str, NULL, NULL, NULL); @@ -3268,9 +3266,9 @@ typedef enum cmd_mempool_delete_err_list{ */ int _cmd_mempool_delete(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, void **a_str_reply) { - json_object **a_json_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; if (!a_net || !a_datum_hash) { - dap_json_rpc_error_add(COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND_IN_ARGUMENT, "Net or datum hash not specified"); + dap_json_rpc_error_add(*a_json_arr_reply, COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND_IN_ARGUMENT, "Net or datum hash not specified"); return COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND_IN_ARGUMENT; } int res = 0; @@ -3281,14 +3279,14 @@ int _cmd_mempool_delete(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char if (!a_chain) { dap_chain_t * l_chain = s_get_chain_with_datum(a_net, a_datum_hash); if (l_chain) { - res = mempool_delete_for_chain(l_chain, a_datum_hash, a_json_reply); + res = mempool_delete_for_chain(l_chain, a_datum_hash, a_json_arr_reply); l_jobj_chain = json_object_new_string(l_chain->name); } else { res = 1; l_jobj_chain = json_object_new_string("empty chain parameter"); } } else { - res = mempool_delete_for_chain(a_chain, a_datum_hash, a_json_reply); + res = mempool_delete_for_chain(a_chain, a_datum_hash, a_json_arr_reply); l_jobj_chain = json_object_new_string(a_chain->name); } json_object_object_add(l_jobj_ret, "net", l_jobj_net); @@ -3306,7 +3304,7 @@ int _cmd_mempool_delete(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char l_jobj_status = json_object_new_string("datum was found but could not be deleted"); } json_object_object_add(l_jobj_ret, "status", l_jobj_status); - json_object_array_add(*a_json_reply, l_jobj_ret); + json_object_array_add(*a_json_arr_reply, l_jobj_ret); if (res) { return COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND; } @@ -3349,10 +3347,10 @@ typedef enum cmd_mempool_check_err_list { */ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char *a_hash_out_type, void **a_str_reply) { - json_object **a_json_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; if (!a_net || !a_datum_hash) { - dap_json_rpc_error_add(COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_NET, "Error! Both -net <network_name> " + dap_json_rpc_error_add(*a_json_arr_reply, COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_NET, "Error! Both -net <network_name> " "and -datum <data_hash> parameters are required."); return COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_NET; } @@ -3377,7 +3375,7 @@ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char l_found_in_chains = true; dap_hash_fast_t l_datum_hash; if (dap_chain_hash_fast_from_hex_str(a_datum_hash, &l_datum_hash)) { - dap_json_rpc_error_add(COM_MEMPOOL_CHECK_ERR_INCORRECT_HASH_STR, + dap_json_rpc_error_add(*a_json_arr_reply, COM_MEMPOOL_CHECK_ERR_INCORRECT_HASH_STR, "Incorrect hash string %s", a_datum_hash); return COM_MEMPOOL_CHECK_ERR_INCORRECT_HASH_STR; } @@ -3401,7 +3399,7 @@ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char json_object_put(l_jobj_datum); json_object_put(l_datum_hash); json_object_put(l_net_obj); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object *l_chain_obj; @@ -3411,7 +3409,7 @@ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char json_object_put(l_jobj_datum); json_object_put(l_datum_hash); json_object_put(l_net_obj); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } } else @@ -3427,7 +3425,7 @@ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char json_object_put(l_find_chain_or_mempool); json_object_put(l_find_bool); json_object_put(l_jobj_datum); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_datum, "find", l_find_bool); @@ -3443,7 +3441,7 @@ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char json_object_put(l_obj_atom); json_object_put(l_jobj_atom_hash); json_object_put(l_jobj_atom_err); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_obj_atom, "hash", l_jobj_atom_hash); @@ -3452,29 +3450,29 @@ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char } json_object *l_datum_obj_inf = json_object_new_object(); - dap_chain_datum_dump_json(l_datum_obj_inf, l_datum, a_hash_out_type, a_net->pub.id); + dap_chain_datum_dump_json(a_json_arr_reply, l_datum_obj_inf, l_datum, a_hash_out_type, a_net->pub.id); if (!l_datum_obj_inf) { if (!l_found_in_chains) DAP_DELETE(l_datum); json_object_put(l_jobj_datum); - dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_DATUM_TO_JSON, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_JSON_RPC_ERR_CODE_SERIALIZATION_DATUM_TO_JSON, "Failed to serialize datum to JSON."); return DAP_JSON_RPC_ERR_CODE_SERIALIZATION_DATUM_TO_JSON; } json_object_object_add(l_jobj_datum, "datum", l_datum_obj_inf); if (!l_found_in_chains) DAP_DELETE(l_datum); - json_object_array_add(*a_json_reply, l_jobj_datum); + json_object_array_add(*a_json_arr_reply, l_jobj_datum); return 0; } else { l_find_bool = json_object_new_boolean(FALSE); if (!l_find_bool) { json_object_put(l_jobj_datum); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_datum, "find", l_find_bool); - json_object_array_add(*a_json_reply, l_jobj_datum); + json_object_array_add(*a_json_arr_reply, l_jobj_datum); return COM_MEMPOOL_CHECK_ERR_DATUM_NOT_FIND; } } @@ -3503,10 +3501,10 @@ typedef enum cmd_mempool_proc_list_error{ */ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, void **a_str_reply) { - json_object **a_json_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; // If full or light it doesnt work if(dap_chain_net_get_role(a_net).enums>= NODE_ROLE_FULL){ - dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_NODE_ROLE_NOT_FULL, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_COM_MEMPOOL_PROC_LIST_ERROR_NODE_ROLE_NOT_FULL, "Need master node role or higher for network %s to process this command", a_net->pub.name); return DAP_COM_MEMPOOL_PROC_LIST_ERROR_NODE_ROLE_NOT_FULL; } @@ -3515,7 +3513,7 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * int ret = 0; char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); if (!l_gdb_group_mempool){ - dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_GROUP_NAME, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_GROUP_NAME, "Failed to get mempool group name on network %s", a_net->pub.name); return DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_GROUP_NAME; } @@ -3525,20 +3523,20 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * &l_datum_size, NULL, NULL ); size_t l_datum_size2 = l_datum? dap_chain_datum_size( l_datum): 0; if (l_datum_size != l_datum_size2) { - dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_DATUM_CORRUPT_SIZE_DATUM_NOT_EQUALS_SIZE_RECORD, "Error! Corrupted datum %s, size by datum headers is %zd when in mempool is only %zd bytes", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_COM_MEMPOOL_PROC_LIST_ERROR_DATUM_CORRUPT_SIZE_DATUM_NOT_EQUALS_SIZE_RECORD, "Error! Corrupted datum %s, size by datum headers is %zd when in mempool is only %zd bytes", a_datum_hash, l_datum_size2, l_datum_size); DAP_DELETE(l_gdb_group_mempool); return DAP_COM_MEMPOOL_PROC_LIST_ERROR_DATUM_CORRUPT_SIZE_DATUM_NOT_EQUALS_SIZE_RECORD; } if (!l_datum) { - dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_FIND_DATUM, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_FIND_DATUM, "Error! Can't find datum %s", a_datum_hash); DAP_DELETE(l_gdb_group_mempool); return DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_FIND_DATUM; } dap_hash_fast_t l_datum_hash, l_real_hash; if (dap_chain_hash_fast_from_hex_str(a_datum_hash, &l_datum_hash)) { - dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_CONVERT_DATUM_HASH_TO_DIGITAL_FORM, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_CONVERT_DATUM_HASH_TO_DIGITAL_FORM, "Error! Can't convert datum hash string %s to digital form", a_datum_hash); DAP_DELETE(l_gdb_group_mempool); @@ -3546,7 +3544,7 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * } dap_chain_datum_calc_hash(l_datum, &l_real_hash); if (!dap_hash_fast_compare(&l_datum_hash, &l_real_hash)) { - dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_REAL_HASH_DATUM_DOES_NOT_MATCH_HASH_DATA_STRING, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_COM_MEMPOOL_PROC_LIST_ERROR_REAL_HASH_DATUM_DOES_NOT_MATCH_HASH_DATA_STRING, "Error! Datum's real hash doesn't match datum's hash string %s", a_datum_hash); DAP_DELETE(l_gdb_group_mempool); @@ -3571,7 +3569,7 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * json_object_put(l_jobj_type); json_object_put(l_jobj_ts_created); json_object_put(l_jobj_ts_created_time_stamp); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object *l_jobj_ts_created_str = json_object_new_string(buf); @@ -3585,7 +3583,7 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * json_object_put(l_jobj_ts_created_time_stamp); json_object_put(l_jobj_ts_created_str); json_object_put(l_jobj_data_size); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_datum, "hash", l_jobj_hash); @@ -3598,7 +3596,7 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * json_object *l_jobj_verify = json_object_new_object(); if (!l_jobj_verify) { json_object_put(l_jobj_res); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } int l_verify_datum = dap_chain_net_verify_datum_for_add(l_chain, l_datum, &l_datum_hash); @@ -3610,7 +3608,7 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * json_object_put(l_jobj_verify_err); json_object_put(l_jobj_verify); json_object_put(l_jobj_res); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_verify, "isProcessed", l_jobj_verify_status); @@ -3624,7 +3622,7 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * json_object_put(l_jobj_verify_status); json_object_put(l_jobj_verify); json_object_put(l_jobj_res); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_verify, "isProcessed", l_jobj_verify_status); @@ -3634,7 +3632,7 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * if (!l_jobj_verify_status) { json_object_put(l_jobj_verify); json_object_put(l_jobj_res); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_verify, "isProcessed", l_jobj_verify_status); @@ -3643,7 +3641,7 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * if (!l_jobj_wrn_text) { json_object_put(l_jobj_verify); json_object_put(l_jobj_res); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_verify, "warning", l_jobj_wrn_text); @@ -3652,20 +3650,20 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * if (!l_jobj_text) { json_object_put(l_jobj_verify); json_object_put(l_jobj_res); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_verify, "notice", l_jobj_text); } } } else { - dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_MOVE_TO_NO_CONCENSUS_FROM_MEMPOOL, "Error! Can't move to no-concensus chains from mempool"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_MOVE_TO_NO_CONCENSUS_FROM_MEMPOOL, "Error! Can't move to no-concensus chains from mempool"); ret = DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_MOVE_TO_NO_CONCENSUS_FROM_MEMPOOL; } } DAP_DELETE(l_gdb_group_mempool); json_object_object_add(l_jobj_res, "verify", l_jobj_verify); - json_object_array_add(*a_json_reply, l_jobj_res); + json_object_array_add(*a_json_arr_reply, l_jobj_res); return ret; } @@ -3679,15 +3677,15 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * */ int _cmd_mempool_proc_all(dap_chain_net_t *a_net, dap_chain_t *a_chain, void **a_str_reply) { - json_object **a_json_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; if (!a_net || !a_chain) { - dap_json_rpc_error_add(-2, "The net and chain argument is not set"); + dap_json_rpc_error_add(*a_json_arr_reply, -2, "The net and chain argument is not set"); return -2; } json_object *l_ret = json_object_new_object(); if (!l_ret){ - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } if(!dap_chain_net_by_id(a_chain->net_id)) { @@ -3695,14 +3693,14 @@ int _cmd_mempool_proc_all(dap_chain_net_t *a_net, dap_chain_t *a_chain, void **a a_chain->name); if (!l_warn_str) { json_object_put(l_ret); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object *l_warn_obj = json_object_new_string(l_warn_str); DAP_DELETE(l_warn_str); if (!l_warn_obj){ json_object_put(l_ret); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_ret, "warning", l_warn_obj); @@ -3713,18 +3711,18 @@ int _cmd_mempool_proc_all(dap_chain_net_t *a_net, dap_chain_t *a_chain, void **a a_net->pub.name, a_chain->name); if (!l_str_result) { json_object_put(l_ret); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object *l_obj_result = json_object_new_string(l_str_result); DAP_DEL_Z(l_str_result); if (!l_obj_result) { json_object_put(l_ret); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_ret, "result", l_obj_result); - json_object_array_add(*a_json_reply, l_obj_result); + json_object_array_add(*a_json_arr_reply, l_obj_result); return 0; } @@ -3735,46 +3733,46 @@ typedef enum _cmd_mempool_dump_error_list{ }_cmd_mempool_dump_error_list_t; int _cmd_mempool_dump_from_group(dap_chain_net_id_t a_net_id, const char *a_group_gdb, const char *a_datum_hash, - const char *a_hash_out_type, json_object **a_json_reply) + const char *a_hash_out_type, json_object **a_json_arr_reply) { size_t l_datum_size = 0; dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_global_db_get_sync(a_group_gdb, a_datum_hash, &l_datum_size, NULL, NULL ); size_t l_datum_size2 = l_datum? dap_chain_datum_size( l_datum): 0; if (l_datum_size != l_datum_size2) { - dap_json_rpc_error_add(COM_DUMP_ERROR_LIST_CORRUPTED_SIZE, "Error! Corrupted datum %s, size by datum headers " + dap_json_rpc_error_add(*a_json_arr_reply, COM_DUMP_ERROR_LIST_CORRUPTED_SIZE, "Error! Corrupted datum %s, size by datum headers " "is %zd when in mempool is only %zd bytes", a_datum_hash, l_datum_size2, l_datum_size); return COM_DUMP_ERROR_LIST_CORRUPTED_SIZE; } if (!l_datum) { - dap_json_rpc_error_add(COM_DUMP_ERROR_LIST_CORRUPTED_SIZE, "Error! Can't find datum %s in %s", a_datum_hash, a_group_gdb); + dap_json_rpc_error_add(*a_json_arr_reply, COM_DUMP_ERROR_LIST_CORRUPTED_SIZE, "Error! Can't find datum %s in %s", a_datum_hash, a_group_gdb); return COM_DUMP_ERROR_CAN_NOT_FIND_DATUM; } json_object *l_jobj_datum = json_object_new_object(); - dap_chain_datum_dump_json(l_jobj_datum, l_datum, a_hash_out_type, a_net_id); - json_object_array_add(*a_json_reply, l_jobj_datum); + dap_chain_datum_dump_json(*a_json_arr_reply, l_jobj_datum, l_datum, a_hash_out_type, a_net_id); + json_object_array_add(*a_json_arr_reply, l_jobj_datum); return 0; } -int _cmd_mempool_dump(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char *a_hash_out_type, json_object **a_json_reply) +int _cmd_mempool_dump(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char *a_hash_out_type, json_object **a_json_arr_reply) { if (!a_net || !a_datum_hash || !a_hash_out_type) { - dap_json_rpc_error_add(COM_DUMP_ERROR_NULL_IS_ARGUMENT_FUNCTION, "The following arguments are not set: network," + dap_json_rpc_error_add(*a_json_arr_reply, COM_DUMP_ERROR_NULL_IS_ARGUMENT_FUNCTION, "The following arguments are not set: network," " datum hash, and output hash type. " "Functions required for operation."); return COM_DUMP_ERROR_NULL_IS_ARGUMENT_FUNCTION; } if (a_chain) { char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); - _cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, a_json_reply); + _cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, a_json_arr_reply); DAP_DELETE(l_group_mempool); } else { dap_chain_t *l_chain = NULL; DL_FOREACH(a_net->pub.chains, l_chain){ char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); - if (!_cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, a_json_reply)){ + if (!_cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, a_json_arr_reply)){ DAP_DELETE(l_group_mempool); break; } @@ -3786,7 +3784,7 @@ int _cmd_mempool_dump(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * int com_mempool(int a_argc, char **a_argv, void **a_str_reply) { - json_object **a_json_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; int arg_index = 1; dap_chain_net_t *l_net = NULL; dap_chain_t *l_chain = NULL; @@ -3814,22 +3812,22 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) char *l_str_err = dap_strdup_printf("Invalid sub command specified. Sub command %s " "is not supported.", a_argv[1]); if (!l_str_err) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return -1; } json_object *l_jobj_str_err = json_object_new_string(l_str_err); DAP_DELETE(l_str_err); if (!l_jobj_str_err) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return -1; } - json_object_array_add(*a_json_reply, l_jobj_str_err); + json_object_array_add(*a_json_arr_reply, l_jobj_str_err); return -2; } } - int cmd_parse_status = dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&arg_index, a_argc, a_argv, &l_chain, &l_net, CHAIN_TYPE_INVALID); + int cmd_parse_status = dap_chain_node_cli_cmd_values_parse_net_chain_for_json(a_json_arr_reply, &arg_index, a_argc, a_argv, &l_chain, &l_net, CHAIN_TYPE_INVALID); if (cmd_parse_status != 0){ - dap_json_rpc_error_add(cmd_parse_status, "Request parsing error (code: %d)", cmd_parse_status); + dap_json_rpc_error_add(*a_json_arr_reply, cmd_parse_status, "Request parsing error (code: %d)", cmd_parse_status); return cmd_parse_status; } const char *l_hash_out_type = "hex"; @@ -3843,7 +3841,7 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) } else l_datum_hash = dap_strdup(l_datum_hash_in); if (!l_datum_hash) { - dap_json_rpc_error_add(-4, "Can't convert hash string %s to hex string", l_datum_hash_in); + dap_json_rpc_error_add(*a_json_arr_reply, -4, "Can't convert hash string %s to hex string", l_datum_hash_in); return -4; } } @@ -3851,7 +3849,7 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) switch (l_cmd) { case SUBCMD_LIST: { if (!l_net) { - dap_json_rpc_error_add(-5, "The command does not include the net parameter. Please specify the " + dap_json_rpc_error_add(*a_json_arr_reply, -5, "The command does not include the net parameter. Please specify the " "parameter something like this mempool list -net <net_name>"); return -5; } @@ -3860,7 +3858,7 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) if (!obj_ret || !obj_net) { json_object_put(obj_ret); json_object_put(obj_net); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return -1; } json_object_object_add(obj_ret, "net", obj_net); @@ -3868,16 +3866,16 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_wallet_addr) && !l_wallet_addr) { json_object *l_jobj_err = json_object_new_string("Parameter '-addr' require <addr>"); if (!l_jobj_err) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return -1; } - json_object_array_add(*a_json_reply, l_jobj_err); + json_object_array_add(*a_json_arr_reply, l_jobj_err); return -3; } json_object *l_jobj_chains = json_object_new_array(); if (!l_jobj_chains) { json_object_put(obj_ret); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return -1; } bool l_fast = (dap_cli_server_cmd_check_option(a_argv, arg_index, a_argc, "-brief") != -1) ? true : false; @@ -3888,14 +3886,14 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) l_limit = l_limit_str ? strtoul(l_limit_str, NULL, 10) : 1000; l_offset = l_offset_str ? strtoul(l_offset_str, NULL, 10) : 0; if(l_chain) { - s_com_mempool_list_print_for_chain(l_net, l_chain, l_wallet_addr, l_jobj_chains, l_hash_out_type, l_fast, l_limit, l_offset); + s_com_mempool_list_print_for_chain(*a_json_arr_reply, l_net, l_chain, l_wallet_addr, l_jobj_chains, l_hash_out_type, l_fast, l_limit, l_offset); } else { DL_FOREACH(l_net->pub.chains, l_chain) { - s_com_mempool_list_print_for_chain(l_net, l_chain, l_wallet_addr, l_jobj_chains, l_hash_out_type, l_fast, l_limit, l_offset); + s_com_mempool_list_print_for_chain(*a_json_arr_reply, l_net, l_chain, l_wallet_addr, l_jobj_chains, l_hash_out_type, l_fast, l_limit, l_offset); } } json_object_object_add(obj_ret, "chains", l_jobj_chains); - json_object_array_add(*a_json_reply, obj_ret); + json_object_array_add(*a_json_arr_reply, obj_ret); ret = 0; } break; case SUBCMD_PROC: { @@ -3908,7 +3906,7 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) if (l_datum_hash) { ret = _cmd_mempool_delete(l_net, l_chain, l_datum_hash, a_str_reply); } else { - dap_json_rpc_error_add(-3, "Error! %s requires -datum <datum hash> option", a_argv[0]); + dap_json_rpc_error_add(*a_json_arr_reply, -3, "Error! %s requires -datum <datum hash> option", a_argv[0]); ret = -3; } } break; @@ -3916,12 +3914,12 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) const char *l_ca_name = NULL; dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-ca_name", &l_ca_name); if (!l_ca_name) { - dap_json_rpc_error_add(-3, "mempool add_ca requires parameter '-ca_name' to specify the certificate name"); + dap_json_rpc_error_add(*a_json_arr_reply, -3, "mempool add_ca requires parameter '-ca_name' to specify the certificate name"); ret = -3; } dap_cert_t *l_cert = dap_cert_find_by_name(l_ca_name); if (!l_cert) { - dap_json_rpc_error_add(-4, "Cert with name '%s' not found.", l_ca_name); + dap_json_rpc_error_add(*a_json_arr_reply, -4, "Cert with name '%s' not found.", l_ca_name); ret = -4; } ret = _cmd_mempool_add_ca(l_net, l_chain, l_cert, a_str_reply); @@ -3931,7 +3929,7 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) ret = _cmd_mempool_check(l_net, l_chain, l_datum_hash, l_hash_out_type, a_str_reply); } break; case SUBCMD_DUMP: { - ret = _cmd_mempool_dump(l_net, l_chain, l_datum_hash, l_hash_out_type, a_json_reply); + ret = _cmd_mempool_dump(l_net, l_chain, l_datum_hash, l_hash_out_type, a_json_arr_reply); } break; case SUBCMD_COUNT: { char *l_mempool_group; @@ -3940,14 +3938,14 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) if (!obj_ret || !obj_net) { json_object_put(obj_ret); json_object_put(obj_net); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(obj_ret, "net", obj_net); json_object *l_jobj_chains = json_object_new_array(); if (!l_jobj_chains) { json_object_put(obj_ret); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } if(l_chain) { @@ -3965,7 +3963,7 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) json_object_put(l_jobj_chain_name); json_object_put(l_jobj_count); json_object_put(obj_ret); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_chain, "name", l_jobj_chain_name); @@ -3987,7 +3985,7 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) json_object_put(l_jobj_chain_name); json_object_put(l_jobj_count); json_object_put(obj_ret); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object_object_add(l_jobj_chain, "name", l_jobj_chain_name); @@ -3996,7 +3994,7 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) } } json_object_object_add(obj_ret, "chains", l_jobj_chains); - json_object_array_add(*a_json_reply, obj_ret); + json_object_array_add(*a_json_arr_reply, obj_ret); ret = 0; } break; } @@ -5136,9 +5134,10 @@ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply) * @param a_str_reply * @return int */ -int com_tx_cond_create(int a_argc, char ** a_argv, void **a_reply) +int com_tx_cond_create(int a_argc, char ** a_argv, void **a_str_reply) { (void) a_argc; + json_object** a_json_arr_reply = (json_object**)a_str_reply; int arg_index = 1; const char *c_wallets_path = dap_chain_wallet_get_path(g_config); const char * l_token_ticker = NULL; @@ -5156,7 +5155,7 @@ int com_tx_cond_create(int a_argc, char ** a_argv, void **a_reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_INVALID_PARAMETER_HEX, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_INVALID_PARAMETER_HEX, "Invalid parameter -H, valid values: -H <hex | base58>"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_INVALID_PARAMETER_HEX; } @@ -5179,76 +5178,76 @@ int com_tx_cond_create(int a_argc, char ** a_argv, void **a_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-srv_uid", &l_srv_uid_str); if(!l_token_ticker) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_TOKEN, "tx_cond_create requires parameter '-token'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_TOKEN, "tx_cond_create requires parameter '-token'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_TOKEN; } if (!l_wallet_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_W, "tx_cond_create requires parameter '-w'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_W, "tx_cond_create requires parameter '-w'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_W; } if (!l_cert_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_CERT, "tx_cond_create requires parameter '-cert'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_CERT, "tx_cond_create requires parameter '-cert'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_CERT; } if(!l_value_datoshi_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_VALUE, "tx_cond_create requires parameter '-value'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_VALUE, "tx_cond_create requires parameter '-value'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_VALUE; } if(!l_value_fee_str){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_FEE, "tx_cond_create requires parameter '-fee'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_FEE, "tx_cond_create requires parameter '-fee'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_FEE; } if(!l_net_name) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_NET, "tx_cond_create requires parameter '-net'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_NET, "tx_cond_create requires parameter '-net'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_NET; } if(!l_unit_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_UNIT, "tx_cond_create requires parameter '-unit'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_UNIT, "tx_cond_create requires parameter '-unit'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_UNIT; } if(!l_srv_uid_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_SRV_UID, "tx_cond_create requires parameter '-srv_uid'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_SRV_UID, "tx_cond_create requires parameter '-srv_uid'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_REQUIRES_PARAMETER_SRV_UID; } dap_chain_net_srv_uid_t l_srv_uid = {}; l_srv_uid.uint64 = strtoll(l_srv_uid_str, NULL, 10); if (!l_srv_uid.uint64) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_FIND_SERVICE_UID, "Can't find service UID %s ", l_srv_uid_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_FIND_SERVICE_UID, "Can't find service UID %s ", l_srv_uid_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_FIND_SERVICE_UID; } dap_chain_net_srv_price_unit_uid_t l_price_unit = { .enm = dap_chain_srv_str_to_unit_enum((char*)l_unit_str)}; if(l_price_unit.enm == SERV_UNIT_UNDEFINED) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_RECOGNIZE_UNIT, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_RECOGNIZE_UNIT, "Can't recognize unit '%s'. Unit must look like { B | SEC }", l_unit_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_RECOGNIZE_UNIT; } l_value_datoshi = dap_chain_balance_scan(l_value_datoshi_str); if(IS_ZERO_256(l_value_datoshi)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_RECOGNIZE_VALUE, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_RECOGNIZE_VALUE, "Can't recognize value '%s' as a number", l_value_datoshi_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_RECOGNIZE_VALUE; } l_value_fee = dap_chain_balance_scan(l_value_fee_str); if(IS_ZERO_256(l_value_fee)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_RECOGNIZE_VALUE_FEE, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_RECOGNIZE_VALUE_FEE, "Can't recognize value '%s' as a number", l_value_fee_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_RECOGNIZE_VALUE_FEE; } dap_chain_net_t * l_net = l_net_name ? dap_chain_net_by_name(l_net_name) : NULL; if(!l_net) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_FIND_NET, "Can't find net '%s'", l_net_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_FIND_NET, "Can't find net '%s'", l_net_name); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_FIND_NET; } dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, c_wallets_path, NULL); // const char* l_sign_str = ""; if(!l_wallet) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_OPEN_WALLET, "Can't open wallet '%s'", l_wallet_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_OPEN_WALLET, "Can't open wallet '%s'", l_wallet_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_OPEN_WALLET; } else { // l_sign_str = dap_chain_wallet_check_sign(l_wallet); @@ -5257,7 +5256,7 @@ int com_tx_cond_create(int a_argc, char ** a_argv, void **a_reply) dap_cert_t *l_cert_cond = dap_cert_find_by_name(l_cert_str); if(!l_cert_cond) { dap_chain_wallet_close(l_wallet); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_FIND_CERT, "Can't find cert '%s'", l_cert_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_FIND_CERT, "Can't find cert '%s'", l_cert_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_FIND_CERT; } @@ -5266,7 +5265,7 @@ int com_tx_cond_create(int a_argc, char ** a_argv, void **a_reply) if (!l_key_cond) { dap_chain_wallet_close(l_wallet); dap_enc_key_delete(l_key_from); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CERT_DOES_NOT_CONATIN_VALID_PUBLIC_KEY, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CERT_DOES_NOT_CONATIN_VALID_PUBLIC_KEY, "Cert '%s' doesn't contain a valid public key", l_cert_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CERT_DOES_NOT_CONATIN_VALID_PUBLIC_KEY; } @@ -5285,14 +5284,14 @@ int com_tx_cond_create(int a_argc, char ** a_argv, void **a_reply) json_object *l_jobj_hash = json_object_new_string(l_hash_str); json_object_object_add(l_jobj_ret, "create_tx_cond", l_jobj_tx_cond_transfer); json_object_object_add(l_jobj_ret, "hash", l_jobj_hash); - json_object_array_add(*a_reply, l_jobj_ret); + json_object_array_add(*a_json_arr_reply, l_jobj_ret); DAP_DELETE(l_hash_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_OK; } json_object *l_jobj_ret = json_object_new_object(); json_object *l_jobj_tx_cond_transfer = json_object_new_boolean(false); json_object_object_add(l_jobj_ret, "create_tx_cond", l_jobj_tx_cond_transfer); - json_object_array_add(*a_reply, l_jobj_ret); + json_object_array_add(*a_json_arr_reply, l_jobj_ret); return DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_CONDITIONAL_TX_CREATE; } @@ -5328,7 +5327,7 @@ static dap_list_t* s_hashes_parse_str_list(const char * a_hashes_str) return l_ret_list; } -int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) +int com_tx_cond_remove(int a_argc, char ** a_argv, void **a_json_arr_reply) { (void) a_argc; int arg_index = 1; @@ -5345,7 +5344,7 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_INVALID_PARAMETER_HEX, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_INVALID_PARAMETER_HEX, "Invalid parameter -H, valid values: -H <hex | base58>"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_INVALID_PARAMETER_HEX; } @@ -5362,42 +5361,42 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-srv_uid", &l_srv_uid_str); if (!l_wallet_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_W, "com_txs_cond_remove requires parameter '-w'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_W, "com_txs_cond_remove requires parameter '-w'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_W; } if(!l_value_fee_str){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_FEE, "com_txs_cond_remove requires parameter '-fee'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_FEE, "com_txs_cond_remove requires parameter '-fee'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_FEE; } if(!l_net_name) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_NET, "com_txs_cond_remove requires parameter '-net'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_NET, "com_txs_cond_remove requires parameter '-net'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_NET; } if(!l_hashes_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_HASHES, "com_txs_cond_remove requires parameter '-hashes'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_HASHES, "com_txs_cond_remove requires parameter '-hashes'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_HASHES; } if(!l_srv_uid_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_SRV_UID, "com_txs_cond_remove requires parameter '-srv_uid'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_SRV_UID, "com_txs_cond_remove requires parameter '-srv_uid'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUIRES_PARAMETER_SRV_UID; } dap_chain_net_srv_uid_t l_srv_uid = {}; l_srv_uid.uint64 = strtoll(l_srv_uid_str, NULL, 10); if (!l_srv_uid.uint64) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_SERVICE_UID, "Can't find service UID %s ", l_srv_uid_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_SERVICE_UID, "Can't find service UID %s ", l_srv_uid_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_SERVICE_UID; } dap_chain_net_t * l_net = l_net_name ? dap_chain_net_by_name(l_net_name) : NULL; if(!l_net) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_NET, "Can't find net '%s'", l_net_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_NET, "Can't find net '%s'", l_net_name); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_NET; } dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, c_wallets_path, NULL); // const char* l_sign_str = ""; if(!l_wallet) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_OPEN_WALLET, "Can't open wallet '%s'", l_wallet_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_OPEN_WALLET, "Can't open wallet '%s'", l_wallet_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_OPEN_WALLET; } @@ -5406,30 +5405,30 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) l_value_fee = dap_chain_balance_scan(l_value_fee_str); if(IS_ZERO_256(l_value_fee)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_RECOGNIZE_VALUE_FEE, "Can't recognize value '%s' as a number", l_value_fee_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_RECOGNIZE_VALUE_FEE, "Can't recognize value '%s' as a number", l_value_fee_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_RECOGNIZE_VALUE_FEE; } const char *l_native_ticker = l_net->pub.native_ticker; if (!l_native_ticker){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_NATIVE_TICKER_IN_NET, "Can't find native ticker for net %s", l_net->pub.name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_NATIVE_TICKER_IN_NET, "Can't find native ticker for net %s", l_net->pub.name); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_NATIVE_TICKER_IN_NET; } dap_ledger_t *l_ledger = dap_ledger_by_net_name(l_net->pub.name); if (!l_ledger){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_LEDGER_FOR_NET, "Can't find ledger for net %s", l_net->pub.name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_LEDGER_FOR_NET, "Can't find ledger for net %s", l_net->pub.name); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_FIND_LEDGER_FOR_NET; } // create empty transaction dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create(); if (!l_ledger){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_CREATE_NEW_TX, "Can't create new tx"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_CREATE_NEW_TX, "Can't create new tx"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_CREATE_NEW_TX; } dap_list_t *l_hashes_list = s_hashes_parse_str_list(l_hashes_str); if (!l_hashes_list){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUESTED_COND_TX_WITH_HASH_NOT_FOUND, "Requested conditional transaction with hash not found"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUESTED_COND_TX_WITH_HASH_NOT_FOUND, "Requested conditional transaction with hash not found"); dap_chain_datum_tx_delete(l_tx); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_REQUESTED_COND_TX_WITH_HASH_NOT_FOUND; } @@ -5517,7 +5516,7 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) dap_list_free_full(l_hashes_list, NULL); if (IS_ZERO_256(l_cond_value_sum)){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_UNSPENT_COND_TX_IN_HASH_LIST_FOR_WALLET, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_UNSPENT_COND_TX_IN_HASH_LIST_FOR_WALLET, "No unspent conditional transactions in hashes list for wallet %s. Check input parameters.", l_wallet_str); dap_chain_datum_tx_delete(l_tx); dap_chain_wallet_close(l_wallet); @@ -5533,7 +5532,7 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) SUM_256_256(l_total_fee, l_net_fee, &l_total_fee); if (compare256(l_total_fee, l_cond_value_sum) >= 0 ){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_SUM_COND_OUTPUTS_MUST_GREATER_THAN_FEES_SUM, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_SUM_COND_OUTPUTS_MUST_GREATER_THAN_FEES_SUM, "Sum of conditional outputs must be greater than fees sum."); dap_chain_datum_tx_delete(l_tx); dap_chain_wallet_close(l_wallet); @@ -5547,7 +5546,7 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) // return coins to owner if (dap_chain_datum_tx_add_out_item(&l_tx, l_wallet_addr, l_coin_back) == -1) { dap_chain_datum_tx_delete(l_tx); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_RETURNING_COINS_OUTPUT, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_RETURNING_COINS_OUTPUT, "Can't create new TX. Something went wrong.\n"); log_it(L_ERROR, "Can't add returning coins output"); DAP_DELETE(l_wallet_addr); @@ -5562,7 +5561,7 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) dap_chain_datum_tx_delete(l_tx); dap_chain_wallet_close(l_wallet); DAP_DEL_Z(l_wallet_pkey); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_NETWORK_FEE_OUTPUT, "Can't create new TX. Something went wrong.\n"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_NETWORK_FEE_OUTPUT, "Can't create new TX. Something went wrong.\n"); log_it(L_ERROR, "Cant add network fee output"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_NETWORK_FEE_OUTPUT; } @@ -5571,7 +5570,7 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) dap_chain_datum_tx_delete(l_tx); dap_chain_wallet_close(l_wallet); DAP_DEL_Z(l_wallet_pkey); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_VALIDATORS_FEE_OUTPUT, "Can't create new TX. Something went wrong.\n"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_VALIDATORS_FEE_OUTPUT, "Can't create new TX. Something went wrong.\n"); log_it(L_ERROR, "Cant add validator's fee output"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_VALIDATORS_FEE_OUTPUT; } @@ -5581,7 +5580,7 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) if(dap_chain_datum_tx_add_sign_item(&l_tx, l_owner_key) != 1) { dap_chain_datum_tx_delete(l_tx); dap_enc_key_delete(l_owner_key); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_SIGN_OUTPUT, "Can't create new TX. Something went wrong.\n"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_SIGN_OUTPUT, "Can't create new TX. Something went wrong.\n"); log_it( L_ERROR, "Can't add sign output"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_NOT_ADD_SIGN_OUTPUT; } @@ -5594,7 +5593,7 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) dap_chain_datum_tx_delete(l_tx); dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TX); if (!l_chain) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_FIND_DEFAULT_CHAIN_WITH_TX_FOR_NET, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_FIND_DEFAULT_CHAIN_WITH_TX_FOR_NET, "Can't create new TX. Something went wrong.\n"); DAP_DELETE(l_datum); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_FIND_DEFAULT_CHAIN_WITH_TX_FOR_NET; @@ -5610,10 +5609,10 @@ int com_tx_cond_remove(int a_argc, char ** a_argv, void **reply) json_object_object_add(l_jobj_ret, "tx_create", l_jobj_tx_status); json_object_object_add(l_jobj_ret, "hash", l_jobj_tx_hash); DAP_DELETE(l_hash_str); - json_object_array_add(*reply, l_jobj_ret); + json_object_array_add(*a_json_arr_reply, l_jobj_ret); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_OK; } - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_OTHER_ERROR, "Can't create new TX. Something went wrong."); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_OTHER_ERROR, "Can't create new TX. Something went wrong."); return DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_OTHER_ERROR; } @@ -5635,7 +5634,7 @@ void s_tx_is_srv_pay_check (dap_chain_net_t* a_net, dap_chain_datum_tx_t *a_tx, } -int com_tx_cond_unspent_find(int a_argc, char **a_argv, void **reply) +int com_tx_cond_unspent_find(int a_argc, char **a_argv, void **a_json_arr_reply) { (void) a_argc; int arg_index = 1; @@ -5649,7 +5648,7 @@ int com_tx_cond_unspent_find(int a_argc, char **a_argv, void **reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_HEX, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_HEX, "Invalid parameter -H, valid values: -H <hex | base58>"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_HEX; } @@ -5662,17 +5661,17 @@ int com_tx_cond_unspent_find(int a_argc, char **a_argv, void **reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-srv_uid", &l_srv_uid_str); if (!l_wallet_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_W, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_W, "com_txs_cond_remove requires parameter '-w'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_W; } if(!l_net_name) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_NET, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_NET, "com_txs_cond_remove requires parameter '-net'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_NET; } if(!l_srv_uid_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_SRV_UID, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_SRV_UID, "com_txs_cond_remove requires parameter '-srv_uid'"); return DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_SRV_UID; } @@ -5680,21 +5679,21 @@ int com_tx_cond_unspent_find(int a_argc, char **a_argv, void **reply) dap_chain_net_srv_uid_t l_srv_uid = {}; l_srv_uid.uint64 = strtoll(l_srv_uid_str, NULL, 10); if (!l_srv_uid.uint64) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_SERVICE_UID, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_SERVICE_UID, "Can't find service UID %s ", l_srv_uid_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_SERVICE_UID; } dap_chain_net_t * l_net = l_net_name ? dap_chain_net_by_name(l_net_name) : NULL; if(!l_net) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_NET, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_NET, "Can't find net '%s'", l_net_name); return DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_NET; } dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, c_wallets_path, NULL); if(!l_wallet) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_OPEN_WALLET, "Can't open wallet '%s'", l_wallet_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_OPEN_WALLET, "Can't open wallet '%s'", l_wallet_str); return DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_OPEN_WALLET; } @@ -5703,13 +5702,13 @@ int com_tx_cond_unspent_find(int a_argc, char **a_argv, void **reply) const char *l_native_ticker = l_net->pub.native_ticker; if (!l_native_ticker){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_NATIVE_TICKER_IN_NET, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_NATIVE_TICKER_IN_NET, "Can't find native ticker for net %s", l_net->pub.name); return DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_NATIVE_TICKER_IN_NET; } dap_ledger_t *l_ledger = dap_ledger_by_net_name(l_net->pub.name); if (!l_ledger){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_LEDGER_FOR_NET, "Can't find ledger for net %s", l_net->pub.name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_LEDGER_FOR_NET, "Can't find ledger for net %s", l_net->pub.name); return DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_LEDGER_FOR_NET; } @@ -5794,7 +5793,7 @@ int com_tx_cond_unspent_find(int a_argc, char **a_argv, void **reply) json_object_object_add(l_jobj_ret, "transactions_out_cond", l_jobj_tx_list_cond_outs); json_object_object_add(l_jobj_ret, "total", l_jobj_total); dap_list_free_full(l_tx_list, NULL); - json_object_array_add(*reply, l_jobj_ret); + json_object_array_add(*a_json_arr_reply, l_jobj_ret); DAP_DEL_Z(l_wallet_pkey); dap_chain_wallet_close(l_wallet); return DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_OK; @@ -5820,9 +5819,9 @@ typedef enum cmd_mempool_add_ca_error_list{ */ int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t *a_cert, void **a_str_reply) { - json_object **a_json_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; if (!a_net || !a_chain || !a_cert){ - dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_NET_NOT_FOUND, "The network or certificate attribute was not passed."); + dap_json_rpc_error_add(*a_json_arr_reply, COM_MEMPOOL_ADD_CA_ERROR_NET_NOT_FOUND, "The network or certificate attribute was not passed."); return COM_MEMPOOL_ADD_CA_ERROR_NET_NOT_FOUND; } dap_chain_t *l_chain = NULL; @@ -5832,19 +5831,19 @@ int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_CA); if (!l_chain) { // If can't auto detect // clean previous error code - dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_NO_CAINS_FOR_CA_DATUM_IN_NET, + dap_json_rpc_error_add(*a_json_arr_reply, COM_MEMPOOL_ADD_CA_ERROR_NO_CAINS_FOR_CA_DATUM_IN_NET, "No chains for CA datum in network \"%s\"", a_net->pub.name); return COM_MEMPOOL_ADD_CA_ERROR_NO_CAINS_FOR_CA_DATUM_IN_NET; } } if(!a_cert->enc_key){ - dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CORRUPTED_CERTIFICATE_WITHOUT_KEYS, + dap_json_rpc_error_add(*a_json_arr_reply, COM_MEMPOOL_ADD_CA_ERROR_CORRUPTED_CERTIFICATE_WITHOUT_KEYS, "Corrupted certificate \"%s\" without keys certificate", a_cert->name); return COM_MEMPOOL_ADD_CA_ERROR_CORRUPTED_CERTIFICATE_WITHOUT_KEYS; } if (a_cert->enc_key->priv_key_data_size || a_cert->enc_key->priv_key_data){ - dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CERTIFICATE_HAS_PRIVATE_KEY_DATA, + dap_json_rpc_error_add(*a_json_arr_reply, COM_MEMPOOL_ADD_CA_ERROR_CERTIFICATE_HAS_PRIVATE_KEY_DATA, "Certificate \"%s\" has private key data. Please export public only key certificate without private keys", a_cert->name); return COM_MEMPOOL_ADD_CA_ERROR_CERTIFICATE_HAS_PRIVATE_KEY_DATA; } @@ -5853,7 +5852,7 @@ int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t uint32_t l_cert_serialized_size = 0; byte_t * l_cert_serialized = dap_cert_mem_save(a_cert, &l_cert_serialized_size); if(!l_cert_serialized){ - dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE, + dap_json_rpc_error_add(*a_json_arr_reply, COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE, "Can't serialize in memory certificate \"%s\"", a_cert->name); return COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE; } @@ -5861,7 +5860,7 @@ int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t dap_chain_datum_t * l_datum = dap_chain_datum_create( DAP_CHAIN_DATUM_CA, l_cert_serialized , l_cert_serialized_size); DAP_DELETE( l_cert_serialized); if(!l_datum){ - dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE, + dap_json_rpc_error_add(*a_json_arr_reply, COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE, "Can't produce datum from certificate \"%s\"", a_cert->name); return COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE; } @@ -5872,31 +5871,31 @@ int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t if (l_hash_str) { char *l_msg = dap_strdup_printf("Datum %s was successfully placed to mempool", l_hash_str); if (!l_msg) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object *l_obj_message = json_object_new_string(l_msg); DAP_DELETE(l_msg); DAP_DELETE(l_hash_str); if (!l_obj_message) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } - json_object_array_add(*a_json_reply, l_obj_message); + json_object_array_add(*a_json_arr_reply, l_obj_message); return 0; } else { char *l_msg = dap_strdup_printf("Can't place certificate \"%s\" to mempool", a_cert->name); if (!l_msg) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } json_object *l_obj_msg = json_object_new_string(l_msg); DAP_DELETE(l_msg); if (!l_obj_msg) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } - json_object_array_add(*a_json_reply, l_obj_msg); + json_object_array_add(*a_json_arr_reply, l_obj_msg); return COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_PLACE_CERTIFICATE; } } @@ -6142,7 +6141,7 @@ static dap_pkey_t* s_json_get_pkey(struct json_object *a_json) * @param str_reply * @return int */ -int com_tx_create_json(int a_argc, char ** a_argv, void **reply) +int com_tx_create_json(int a_argc, char ** a_argv, void **a_json_arr_reply) { int l_arg_index = 1; const char *l_net_name = NULL; // optional parameter @@ -6156,19 +6155,19 @@ int com_tx_create_json(int a_argc, char ** a_argv, void **reply) dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-json", &l_json_file_path); if(!l_json_file_path) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_REQUIRE_PARAMETER_JSON, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_REQUIRE_PARAMETER_JSON, "Command requires one of parameters '-json <json file path>'"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_REQUIRE_PARAMETER_JSON; } // Open json file struct json_object *l_json = json_object_from_file(l_json_file_path); if(!l_json) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_CAN_NOT_OPEN_JSON_FILE, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_CAN_NOT_OPEN_JSON_FILE, "Can't open json file: %s", json_util_get_last_err()); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_CAN_NOT_OPEN_JSON_FILE; } if(!json_object_is_type(l_json, json_type_object)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_WRONG_JSON_FORMAT, "Wrong json format"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_WRONG_JSON_FORMAT, "Wrong json format"); json_object_put(l_json); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_WRONG_JSON_FORMAT; } @@ -6181,7 +6180,7 @@ int com_tx_create_json(int a_argc, char ** a_argv, void **reply) l_net_name = json_object_get_string(l_json_net); } if(!l_net_name) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_REQUIRE_PARAMETER_NET, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_REQUIRE_PARAMETER_NET, "Command requires parameter '-net' or set net in the json file"); json_object_put(l_json); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_REQUIRE_PARAMETER_NET; @@ -6190,7 +6189,7 @@ int com_tx_create_json(int a_argc, char ** a_argv, void **reply) dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_name); l_native_token = l_net->pub.native_ticker; if(!l_net) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_NOT_FOUNT_NET_BY_NAME, "Not found net by name '%s'", l_net_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_NOT_FOUNT_NET_BY_NAME, "Not found net by name '%s'", l_net_name); json_object_put(l_json); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_NOT_FOUNT_NET_BY_NAME; } @@ -6207,7 +6206,7 @@ int com_tx_create_json(int a_argc, char ** a_argv, void **reply) l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_TX); } if(!l_chain) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_NOT_FOUNT_CHAIN_BY_NAME, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_NOT_FOUNT_CHAIN_BY_NAME, "Chain name '%s' not found, try use parameter '-chain' or set chain in the json file", l_chain_name); json_object_put(l_json); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_NOT_FOUNT_CHAIN_BY_NAME; @@ -6218,7 +6217,7 @@ int com_tx_create_json(int a_argc, char ** a_argv, void **reply) struct json_object *l_json_items = json_object_object_get(l_json, "items"); size_t l_items_count = json_object_array_length(l_json_items); if(!l_json_items || !json_object_is_type(l_json_items, json_type_array) || !(l_items_count = json_object_array_length(l_json_items))) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_NOT_FOUNT_ARRAY_ITEMS, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_NOT_FOUNT_ARRAY_ITEMS, "Wrong json format: not found array 'items' or array is empty"); json_object_put(l_json); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_NOT_FOUNT_ARRAY_ITEMS; @@ -6229,7 +6228,7 @@ int com_tx_create_json(int a_argc, char ** a_argv, void **reply) dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t)); if(!l_tx) { json_object_put(l_json); - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(*a_json_arr_reply); return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } l_tx->header.ts_created = time(NULL); @@ -6801,7 +6800,7 @@ int com_tx_create_json(int a_argc, char ** a_argv, void **reply) json_object_object_add(l_jobj_ret, "valid_items", l_jobj_valid_items); json_object_object_add(l_jobj_ret, "total_items", l_jobj_total_items); json_object_object_add(l_jobj_ret, "errors", l_jobj_errors); - json_object_array_add(*reply, l_jobj_ret); + json_object_array_add(*a_json_arr_reply, l_jobj_ret); DAP_DELETE(l_tx); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_INVALID_ITEMS; } @@ -6820,7 +6819,7 @@ int com_tx_create_json(int a_argc, char ** a_argv, void **reply) DAP_DEL_Z(l_datum_tx); DAP_DELETE(l_gdb_group_mempool_base_tx); if(!l_placed) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_CAN_NOT_ADD_TRANSACTION_TO_MEMPOOL, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_CAN_NOT_ADD_TRANSACTION_TO_MEMPOOL, "Can't add transaction to mempool"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_CAN_NOT_ADD_TRANSACTION_TO_MEMPOOL; } @@ -6831,7 +6830,7 @@ int com_tx_create_json(int a_argc, char ** a_argv, void **reply) json_object_object_add(l_jobj_ret, "tx_create", l_jobj_tx_create); json_object_object_add(l_jobj_ret, "hash", l_jobj_hash); json_object_object_add(l_jobj_ret, "total_items", l_jobj_total_items); - json_object_array_add(*reply, l_jobj_ret); + json_object_array_add(*a_json_arr_reply, l_jobj_ret); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_JSON_OK; } @@ -6844,7 +6843,7 @@ int com_tx_create_json(int a_argc, char ** a_argv, void **reply) * @param str_reply * @return int */ -int com_tx_create(int a_argc, char **a_argv, void **reply) +int com_tx_create(int a_argc, char **a_argv, void **a_json_arr_reply) { int arg_index = 1; // int cmd_num = 1; @@ -6871,14 +6870,14 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_HASH_INVALID, "Invalid parameter -H, valid values: -H <hex | base58>"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_HASH_INVALID, "Invalid parameter -H, valid values: -H <hex | base58>"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_HASH_INVALID; } dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-net", &l_net_name); dap_chain_net_t * l_net = dap_chain_net_by_name(l_net_name); if (l_net == NULL) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_NET_NOT_FOUND, "not found net by name '%s'", l_net_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_NET_NOT_FOUND, "not found net by name '%s'", l_net_name); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_NET_NOT_FOUND; } @@ -6897,15 +6896,20 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) l_tx_num = strtoul(l_tx_num_str, NULL, 10); // Validator's fee - if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-fee", &str_tmp)) + if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-fee", &str_tmp)) { + if (!str_tmp) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_FEE, "tx_create requires parameter '-fee'"); + return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_FEE; + } l_value_fee = dap_chain_balance_scan(str_tmp); + } if (IS_ZERO_256(l_value_fee) && (!l_emission_hash_str || (str_tmp && strcmp(str_tmp, "0")))) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_FEE_IS_UINT256, "tx_create requires parameter '-fee' to be valid uint256"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_FEE_IS_UINT256, "tx_create requires parameter '-fee' to be valid uint256"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_FEE_IS_UINT256; } if((!l_from_wallet_name && !l_emission_hash_str)||(l_from_wallet_name && l_emission_hash_str)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_WALLET_OR_FROM_EMISSION, "tx_create requires one of parameters '-from_wallet' or '-from_emission'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_WALLET_OR_FROM_EMISSION, "tx_create requires one of parameters '-from_wallet' or '-from_emission'"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_WALLET_OR_FROM_EMISSION; } @@ -6914,7 +6918,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) dap_chain_t *l_emission_chain = NULL; if (l_emission_hash_str) { if (dap_chain_hash_fast_from_str(l_emission_hash_str, &l_emission_hash)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_EMISSION, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_EMISSION, "tx_create requires parameter '-from_emission' " "to be valid string containing hash in hex or base58 format"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_EMISSION; @@ -6925,7 +6929,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) l_emission_chain = dap_chain_net_get_default_chain_by_chain_type(l_net,CHAIN_TYPE_EMISSION); } if (!l_emission_chain) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_CHAIN_EMISSION, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_CHAIN_EMISSION, "tx_create requires parameter '-chain_emission' " "to be a valid chain name or set default datum type in chain configuration file"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_CHAIN_EMISSION; @@ -6934,7 +6938,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) if (l_wallet_fee_name){ l_wallet_fee = dap_chain_wallet_open(l_wallet_fee_name, c_wallets_path, NULL); if (!l_wallet_fee) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_WALLET_FEE, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_WALLET_FEE, "Wallet %s does not exist", l_wallet_fee_name); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_WALLET_FEE; } @@ -6942,40 +6946,40 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) } else if (l_cert_str) { l_cert = dap_cert_find_by_name(l_cert_str); if (!l_cert) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_CERT_IS_INVALID, "Certificate %s is invalid", l_cert_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_CERT_IS_INVALID, "Certificate %s is invalid", l_cert_str); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_CERT_IS_INVALID; } l_priv_key = l_cert->enc_key; } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_CERT_OR_WALLET_FEE, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_CERT_OR_WALLET_FEE, "tx_create requires parameter '-cert' or '-wallet_fee' for create base tx for emission"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_CERT_OR_WALLET_FEE; } } else { dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-token", &l_token_ticker); if (!l_token_ticker) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_TOKEN, "tx_create requires parameter '-token'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_TOKEN, "tx_create requires parameter '-token'"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_TOKEN; } if (!dap_ledger_token_ticker_check(l_net->pub.ledger, l_token_ticker)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_TOKEN_NOT_DECLARATED_IN_NET, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_TOKEN_NOT_DECLARATED_IN_NET, "Ticker '%s' is not declared on network '%s'.", l_token_ticker, l_net_name); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_TOKEN_NOT_DECLARATED_IN_NET; } dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-to_addr", &addr_base58_to); if (!addr_base58_to) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_TO_ADDR, "tx_create requires parameter '-to_addr'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_TO_ADDR, "tx_create requires parameter '-to_addr'"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_TO_ADDR; } l_addr_to = dap_chain_addr_from_str(addr_base58_to); if(!l_addr_to) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_DESTINATION_ADDRESS_INVALID, "destination address is invalid"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_DESTINATION_ADDRESS_INVALID, "destination address is invalid"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_DESTINATION_ADDRESS_INVALID; } if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-value", &str_tmp)) l_value = dap_chain_balance_scan(str_tmp); if (IS_ZERO_256(l_value)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_VALUE_OR_INVALID_FORMAT_VALUE, "tx_create requires parameter '-value' to be valid uint256 value"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_VALUE_OR_INVALID_FORMAT_VALUE, "tx_create requires parameter '-value' to be valid uint256 value"); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_VALUE_OR_INVALID_FORMAT_VALUE; } } @@ -6988,7 +6992,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) } if(!l_chain) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_NOT_FOUND_CHAIN, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_NOT_FOUND_CHAIN, "not found chain name '%s', try use parameter '-chain' or set default datum type in chain configuration file", l_chain_name); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_NOT_FOUND_CHAIN; @@ -6998,7 +7002,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) if (l_emission_hash_str) { char *l_tx_hash_str = NULL; if (!l_priv_key) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_NO_PRIVATE_KEY_DEFINED, "No private key defined for creating the underlying " + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_NO_PRIVATE_KEY_DEFINED, "No private key defined for creating the underlying " "transaction no '-wallet_fee' or '-cert' parameter specified."); l_ret = DAP_CHAIN_NODE_CLI_COM_TX_CREATE_NO_PRIVATE_KEY_DEFINED; } @@ -7021,7 +7025,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) json_object_object_add(l_jobj_emission, "message", l_jobj_msg); l_ret = DAP_CHAIN_NODE_CLI_COM_TX_CREATE_CAN_NOT_ADD_DATUM_IN_MEMPOOL; } - json_object_array_add(*reply, l_jobj_emission); + json_object_array_add(*a_json_arr_reply, l_jobj_emission); DAP_DELETE(l_addr_to); if (l_wallet_fee) { dap_chain_wallet_close(l_wallet_fee); @@ -7034,7 +7038,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) json_object *l_jobj_result = json_object_new_object(); if(!l_wallet) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_WALLET_DOES_NOT_EXIST, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_WALLET_DOES_NOT_EXIST, "wallet %s does not exist", l_from_wallet_name); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_WALLET_DOES_NOT_EXIST; } else { @@ -7050,7 +7054,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) DAP_DELETE(l_addr_to); dap_chain_wallet_close(l_wallet); dap_enc_key_delete(l_priv_key); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_SOURCE_ADDRESS_INVALID, "source address is invalid"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_SOURCE_ADDRESS_INVALID, "source address is invalid"); json_object_put(l_jobj_result); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_SOURCE_ADDRESS_INVALID; } @@ -7059,7 +7063,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) DAP_DELETE(l_addr_to); dap_chain_wallet_close(l_wallet); dap_enc_key_delete(l_priv_key); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_EQ_SOURCE_DESTINATION_ADDRESS, "The transaction cannot be directed to the same address as the source."); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_EQ_SOURCE_DESTINATION_ADDRESS, "The transaction cannot be directed to the same address as the source."); json_object_put(l_jobj_result); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_EQ_SOURCE_DESTINATION_ADDRESS; } @@ -7078,7 +7082,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) dap_string_append_printf(l_allowed_list, "0x%016"DAP_UINT64_FORMAT_X, l_net->pub.id.uint64); for (i = 0; i < l_net->pub.bridged_networks_count; ++i) dap_string_append_printf(l_allowed_list, ", 0x%016"DAP_UINT64_FORMAT_X, l_net->pub.bridged_networks[i].uint64); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_DESTINATION_NETWORK_IS_UNREACHEBLE, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_DESTINATION_NETWORK_IS_UNREACHEBLE, "Destination network ID=0x%"DAP_UINT64_FORMAT_x " is unreachable. List of available network IDs:\n%s" " Please, change network name or wallet address", @@ -7113,7 +7117,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) l_ret = DAP_CHAIN_NODE_CLI_COM_TX_CREATE_CAN_NOT_CREATE_TRANSACTION; } } - json_object_array_add(*reply, l_jobj_result); + json_object_array_add(*a_json_arr_reply, l_jobj_result); DAP_DELETE(l_addr_to); dap_chain_wallet_close(l_wallet); @@ -7132,8 +7136,9 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) * @param str_reply * @return int */ -int com_tx_verify(int a_argc, char **a_argv, void **reply) +int com_tx_verify(int a_argc, char **a_argv, void **a_str_reply) { + json_object **a_json_arr_reply = (json_object **)a_str_reply; const char * l_tx_hash_str = NULL; dap_chain_net_t * l_net = NULL; dap_chain_t * l_chain = NULL; @@ -7141,10 +7146,10 @@ int com_tx_verify(int a_argc, char **a_argv, void **reply) dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-tx", &l_tx_hash_str); if(!l_tx_hash_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_REQUIRE_PARAMETER_TX, "tx_verify requires parameter '-tx'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_REQUIRE_PARAMETER_TX, "tx_verify requires parameter '-tx'"); return DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_REQUIRE_PARAMETER_TX; } - dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&l_arg_index, a_argc, a_argv, &l_chain, &l_net, + dap_chain_node_cli_cmd_values_parse_net_chain_for_json(*a_json_arr_reply, &l_arg_index, a_argc, a_argv, &l_chain, &l_net, CHAIN_TYPE_TX); if (!l_net || !l_chain) { return DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_NET_CHAIN_UNDEFINED; @@ -7154,7 +7159,7 @@ int com_tx_verify(int a_argc, char **a_argv, void **reply) if (dap_chain_hash_fast_from_hex_str(l_tx_hash_str, &l_tx_hash)) { l_hex_str_from58 = dap_enc_base58_to_hex_str_from_str(l_tx_hash_str); if (dap_chain_hash_fast_from_hex_str(l_hex_str_from58, &l_tx_hash)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_INVALID_TX_HASH, "Invalid tx hash format, need hex or base58"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_INVALID_TX_HASH, "Invalid tx hash format, need hex or base58"); return DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_INVALID_TX_HASH; } } @@ -7163,13 +7168,13 @@ int com_tx_verify(int a_argc, char **a_argv, void **reply) dap_chain_datum_t *l_datum = (dap_chain_datum_t*)dap_global_db_get_sync(l_gdb_group, l_hex_str_from58 ? l_hex_str_from58 : l_tx_hash_str, &l_datum_size, NULL, NULL); DAP_DEL_Z(l_hex_str_from58); if (!l_datum) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_SPECIFIED_TX_NOT_FOUND, "Specified tx not found"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_SPECIFIED_TX_NOT_FOUND, "Specified tx not found"); return DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_SPECIFIED_TX_NOT_FOUND; } if (l_datum->header.type_id != DAP_CHAIN_DATUM_TX){ char *l_str_err = dap_strdup_printf("Based on the specified hash, the type %s was found and not a transaction.", dap_chain_datum_type_id_to_str(l_datum->header.type_id)); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_HASH_IS_NOT_TX_HASH, l_str_err); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_HASH_IS_NOT_TX_HASH, l_str_err); DAP_DELETE(l_str_err); return DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_HASH_IS_NOT_TX_HASH; } @@ -7189,14 +7194,14 @@ int com_tx_verify(int a_argc, char **a_argv, void **reply) json_object_object_add(l_jobj_error, "message", l_jobj_err_str); json_object_object_add(l_obj_ret, "verify", l_jobj_verfiy); json_object_object_add(l_obj_ret, "error", l_jobj_error); - json_object_array_add(*reply, l_obj_ret); + json_object_array_add(*a_json_arr_reply, l_obj_ret); return DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_TX_NOT_VERIFY; } else { l_jobj_verfiy = json_object_new_boolean(true); l_jobj_error = json_object_new_null(); json_object_object_add(l_obj_ret, "verify", l_jobj_verfiy); json_object_object_add(l_obj_ret, "error", l_jobj_error); - json_object_array_add(*reply, l_obj_ret); + json_object_array_add(*a_json_arr_reply, l_obj_ret); return DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_OK; } } @@ -7213,7 +7218,7 @@ int com_tx_verify(int a_argc, char **a_argv, void **reply) */ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) { - json_object **json_arr_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; int arg_index = 1; const char *l_addr_base58 = NULL; const char *l_wallet_name = NULL; @@ -7234,7 +7239,7 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR, "Invalid parameter -H, valid values: -H <hex | base58>"); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR; @@ -7264,13 +7269,13 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) bool l_is_tx_count = dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-count", NULL); if (!l_addr_base58 && !l_wallet_name && !l_tx_hash_str && !l_is_tx_all && !l_is_tx_count) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR, "tx_history requires parameter '-addr' or '-w' or '-tx'"); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR; } if (!l_net_str && !l_addr_base58&& !l_is_tx_all) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR, "tx_history requires parameter '-net' or '-addr'"); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR; } @@ -7278,7 +7283,7 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) dap_chain_hash_fast_t l_tx_hash; if (l_tx_hash_str && dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) != 0) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_HASH_REC_ERR, "tx hash not recognized"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_HASH_REC_ERR, "tx hash not recognized"); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_HASH_REC_ERR; } @@ -7286,7 +7291,7 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) if (!l_addr_base58 && l_net_str) { l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { // Can't find such network - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_PARAM_ERR, "tx_history requires parameter '-net' to be valid chain network name"); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_PARAM_ERR; } @@ -7295,19 +7300,19 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) dap_chain_addr_t *l_addr = NULL; if (l_addr_base58) { if (l_tx_hash_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_INCOMPATIBLE_PARAMS_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_INCOMPATIBLE_PARAMS_ERR, "Incompatible params '-addr' & '-tx'"); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_INCOMPATIBLE_PARAMS_ERR; } l_addr = dap_chain_addr_from_str(l_addr_base58); if (!l_addr) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ADDR_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ADDR_ERR, "Wallet address not recognized"); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ADDR_ERR; } if (l_net) { if (l_net->pub.id.uint64 != l_addr->net_id.uint64) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ID_NET_ADDR_DIF_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ID_NET_ADDR_DIF_ERR, "Network ID with '-net' param and network ID with '-addr' param are different"); DAP_DELETE(l_addr); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ID_NET_ADDR_DIF_ERR; @@ -7324,7 +7329,7 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) dap_chain_addr_t *l_addr_tmp = dap_chain_wallet_get_addr(l_wallet, l_net->pub.id); if (l_addr) { if (!dap_chain_addr_compare(l_addr, l_addr_tmp)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ADDR_WALLET_DIF_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ADDR_WALLET_DIF_ERR, "Address with '-addr' param and address with '-w' param are different"); DAP_DELETE(l_addr); DAP_DELETE(l_addr_tmp); @@ -7335,7 +7340,7 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) l_addr = l_addr_tmp; dap_chain_wallet_close(l_wallet); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ERR, "The wallet %s is not activated or it doesn't exist", l_wallet_name); DAP_DELETE(l_addr); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ERR; @@ -7343,7 +7348,7 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) } // Select chain, if any if (!l_net) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_ERR, "Could not determine the network from which to " + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_ERR, "Could not determine the network from which to " "extract data for the tx_history command to work."); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_ERR; } @@ -7353,7 +7358,7 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TX); if(!l_chain) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_CHAIN_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_CHAIN_PARAM_ERR, "tx_history requires parameter '-chain' to be valid chain name in chain net %s." " You can set default datum type in chain configuration file", l_net_str); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_CHAIN_PARAM_ERR; @@ -7362,9 +7367,9 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) json_object * json_obj_out = NULL; if (l_tx_hash_str) { // history tx hash - json_obj_out = dap_db_history_tx(&l_tx_hash, l_chain, l_hash_out_type, l_net); + json_obj_out = dap_db_history_tx(*a_json_arr_reply, &l_tx_hash, l_chain, l_hash_out_type, l_net); if (!json_obj_out) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_TX_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_TX_ERR, "something went wrong in tx_history"); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_TX_ERR; } @@ -7374,15 +7379,15 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) if (!json_obj_summary) { return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_MEMORY_ERR; } - json_obj_out = dap_db_history_addr(l_addr, l_chain, l_hash_out_type, dap_chain_addr_to_str_static(l_addr), json_obj_summary, l_limit, l_offset, l_brief, l_tx_srv_str, l_action, l_head); + json_obj_out = dap_db_history_addr(*a_json_arr_reply, l_addr, l_chain, l_hash_out_type, dap_chain_addr_to_str_static(l_addr), json_obj_summary, l_limit, l_offset, l_brief, l_tx_srv_str, l_action, l_head); if (!json_obj_out) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ADDR_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ADDR_ERR, "something went wrong in tx_history"); json_object_put(json_obj_summary); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ADDR_ERR; } - json_object_array_add(*json_arr_reply, json_obj_out); - json_object_array_add(*json_arr_reply, json_obj_summary); + json_object_array_add(*a_json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_summary); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_OK; } else if (l_is_tx_all) { // history all @@ -7391,28 +7396,32 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_MEMORY_ERR; } - json_object* json_arr_history_all = dap_db_history_tx_all(l_chain, l_net, l_hash_out_type, json_obj_summary, + json_object* json_arr_history_all = dap_db_history_tx_all(*a_json_arr_reply, l_chain, l_net, l_hash_out_type, json_obj_summary, l_limit, l_offset, l_brief, l_tx_srv_str, l_action, l_head); if (!json_arr_history_all) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ALL_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ALL_ERR, "something went wrong in tx_history"); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ALL_ERR; } - json_object_array_add(*json_arr_reply, json_arr_history_all); - json_object_array_add(*json_arr_reply, json_obj_summary); + json_object_array_add(*a_json_arr_reply, json_arr_history_all); + json_object_array_add(*a_json_arr_reply, json_obj_summary); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_OK; } else if (l_is_tx_count) { json_object * json_count_obj= json_object_new_object(); json_object_object_add(json_count_obj, "Number of transaction", json_object_new_uint64(l_chain->callback_count_tx(l_chain))); - json_object_array_add(*json_arr_reply, json_count_obj); + json_object_array_add(*a_json_arr_reply, json_count_obj); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_OK; } if (json_obj_out) { - json_object_array_add(*json_arr_reply, json_obj_out); + const char* json_string_sdfasf = json_object_to_json_string(*a_json_arr_reply); + char* result_string_sadfasf = strdup(json_string_sdfasf); + json_object_array_add(*a_json_arr_reply, json_obj_out); + const char* json_string = json_object_to_json_string(*a_json_arr_reply); + char* result_string = strdup(json_string); } else { - json_object_array_add(*json_arr_reply, json_object_new_string("empty")); + json_object_array_add(*a_json_arr_reply, json_object_new_string("empty")); } return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_OK; diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index a59d2e279bc81a92b9b749a6b4ccbf2ee5b492ab..c8e234b3ffa68953e022e89e4a3a6249f558b312 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -79,7 +79,8 @@ void s_dap_chain_tx_hash_processed_ht_free(dap_chain_tx_hash_processed_ht_t **l_ * @param l_tx_num */ -bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, +bool s_dap_chain_datum_tx_out_data(json_object* a_json_arr_reply, + dap_chain_datum_tx_t *a_datum, dap_ledger_t *a_ledger, json_object * json_obj_out, const char *a_hash_out_type, @@ -100,7 +101,7 @@ bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, json_object_object_add(json_obj_out, "Token_ticker", json_object_new_string(l_ticker)); json_object_object_add(json_obj_out, "Token_description", l_description ? json_object_new_string(l_description) : json_object_new_null()); - dap_chain_datum_dump_tx_json(a_datum, l_ticker, json_obj_out, a_hash_out_type, a_tx_hash, a_ledger->net->pub.id); + dap_chain_datum_dump_tx_json(a_json_arr_reply, a_datum, l_ticker, json_obj_out, a_hash_out_type, a_tx_hash, a_ledger->net->pub.id); json_object* json_arr_items = json_object_new_array(); bool l_spent = false; byte_t *l_item; size_t l_size; int i, l_out_idx = -1; @@ -123,7 +124,8 @@ bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, return true; } -json_object * dap_db_tx_history_to_json(dap_chain_hash_fast_t* a_tx_hash, +json_object * dap_db_tx_history_to_json(json_object* a_json_arr_reply, + dap_chain_hash_fast_t* a_tx_hash, dap_hash_fast_t * l_atom_hash, dap_chain_datum_tx_t * l_tx, dap_chain_t * a_chain, @@ -197,13 +199,14 @@ json_object * dap_db_tx_history_to_json(dap_chain_hash_fast_t* a_tx_hash, if(!brief_out) { - dap_chain_datum_dump_tx_json(l_tx,NULL,json_obj_datum,a_hash_out_type,a_tx_hash,a_chain->net_id); + dap_chain_datum_dump_tx_json(a_json_arr_reply, l_tx,NULL,json_obj_datum,a_hash_out_type,a_tx_hash,a_chain->net_id); } return json_obj_datum; } -json_object * dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, +json_object * dap_db_history_tx(json_object* a_json_arr_reply, + dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type, dap_chain_net_t * l_net) @@ -223,12 +226,12 @@ json_object * dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, (dap_chain_datum_tx_t *)l_datum->data : NULL; if (l_tx) { - return dap_db_tx_history_to_json(a_tx_hash, &l_atom_hash,l_tx, a_chain, a_hash_out_type, NULL, l_ret_code, &accepted_tx, false); + return dap_db_tx_history_to_json(a_json_arr_reply, a_tx_hash, &l_atom_hash,l_tx, a_chain, a_hash_out_type, NULL, l_ret_code, &accepted_tx, false); } else { const char *l_tx_hash_str = dap_strcmp(a_hash_out_type, "hex") ? dap_enc_base58_encode_hash_to_str_static(a_tx_hash) : dap_chain_hash_fast_to_str_static(a_tx_hash); - dap_json_rpc_error_add(-1, "TX hash %s not founds in chains", l_tx_hash_str); + dap_json_rpc_error_add(a_json_arr_reply, -1, "TX hash %s not founds in chains", l_tx_hash_str); return NULL; } } @@ -308,14 +311,14 @@ static void s_tx_header_print(json_object* json_obj_datum, dap_chain_tx_hash_pro * @param a_hash_out_type * @return char* */ -json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, +json_object* dap_db_history_addr(json_object* a_json_arr_reply, dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const char *a_hash_out_type, const char * l_addr_str, json_object *json_obj_summary, size_t a_limit, size_t a_offset, bool a_brief, const char *a_srv, dap_chain_tx_tag_action_type_t a_action, bool a_head) { json_object* json_obj_datum = json_object_new_array(); if (!json_obj_datum){ log_it(L_CRITICAL, "%s", c_error_memory_alloc); - dap_json_rpc_error_add(-44, "Memory allocation error"); + dap_json_rpc_error_add(a_json_arr_reply, -44, "Memory allocation error"); return NULL; } @@ -328,7 +331,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); if (!l_net) { log_it(L_WARNING, "Can't find net by specified chain %s", a_chain->name); - dap_json_rpc_error_add(-1, "Can't find net by specified chain %s", a_chain->name); + dap_json_rpc_error_add(a_json_arr_reply, -1, "Can't find net by specified chain %s", a_chain->name); json_object_put(json_obj_datum); return NULL; } @@ -336,7 +339,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const char *l_native_ticker = l_net->pub.native_ticker; if (!a_chain->callback_datum_iter_create) { log_it(L_WARNING, "Not defined callback_datum_iter_create for chain \"%s\"", a_chain->name); - dap_json_rpc_error_add(-1, "Not defined callback_datum_iter_create for chain \"%s\"", a_chain->name); + dap_json_rpc_error_add(a_json_arr_reply, -1, "Not defined callback_datum_iter_create for chain \"%s\"", a_chain->name); json_object_put(json_obj_datum); return NULL; } @@ -463,7 +466,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, json_object * j_arr_data = json_object_new_array(); json_object * j_obj_tx = json_object_new_object(); if (!j_obj_tx || !j_arr_data) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); json_object_put(j_obj_tx); json_object_put(j_arr_data); return NULL; @@ -580,7 +583,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, json_object * j_obj_data = json_object_new_object(); if (!j_obj_data) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); json_object_put(j_obj_tx); json_object_put(j_arr_data); return NULL; @@ -630,7 +633,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, json_object * j_obj_data = json_object_new_object(); if (!j_obj_data) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); json_object_put(j_obj_tx); json_object_put(j_arr_data); return NULL; @@ -699,7 +702,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, if (json_object_array_length(json_obj_datum) == 2) { json_object * json_empty_tx = json_object_new_object(); if (!json_empty_tx) { - dap_json_rpc_allocation_error; + dap_json_rpc_allocation_error(a_json_arr_reply); json_object_put(json_obj_datum); return NULL; } @@ -714,7 +717,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, return json_obj_datum; } -static int s_json_tx_history_pack(json_object** a_json_obj_datum, dap_chain_datum_iter_t *a_datum_iter, +static int s_json_tx_history_pack(json_object* a_json_arr_reply, json_object** a_json_obj_datum, dap_chain_datum_iter_t *a_datum_iter, dap_chain_datum_t * a_datum, dap_chain_t *a_chain, dap_chain_tx_tag_action_type_t a_action, const char *a_hash_out_type, bool a_out_brief, size_t* a_accepted, @@ -749,7 +752,7 @@ static int s_json_tx_history_pack(json_object** a_json_obj_datum, dap_chain_datu } bool accepted_tx; - *a_json_obj_datum = dap_db_tx_history_to_json(&l_ttx_hash, NULL, l_tx, a_chain, a_hash_out_type, a_datum_iter, 0, &accepted_tx, a_out_brief); + *a_json_obj_datum = dap_db_tx_history_to_json(a_json_arr_reply, &l_ttx_hash, NULL, l_tx, a_chain, a_hash_out_type, a_datum_iter, 0, &accepted_tx, a_out_brief); if (!*a_json_obj_datum) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); return 2; @@ -763,7 +766,7 @@ static int s_json_tx_history_pack(json_object** a_json_obj_datum, dap_chain_datu } -json_object *dap_db_history_tx_all(dap_chain_t *a_chain, dap_chain_net_t *a_net, +json_object *dap_db_history_tx_all(json_object* a_json_arr_reply, dap_chain_t *a_chain, dap_chain_net_t *a_net, const char *a_hash_out_type, json_object *json_obj_summary, size_t a_limit, size_t a_offset, bool out_brief, const char *a_srv, dap_chain_tx_tag_action_type_t a_action, bool a_head) @@ -806,7 +809,7 @@ json_object *dap_db_history_tx_all(dap_chain_t *a_chain, dap_chain_net_t *a_net, i_tmp++; continue; } - res = s_json_tx_history_pack(&json_tx_history, l_datum_iter, l_datum, a_chain, a_action, a_hash_out_type, out_brief, + res = s_json_tx_history_pack(a_json_arr_reply, &json_tx_history, l_datum_iter, l_datum, a_chain, a_action, a_hash_out_type, out_brief, &l_tx_ledger_accepted, &l_tx_ledger_rejected, look_for_unknown_service, a_srv); if (res == 1) continue; @@ -849,7 +852,7 @@ json_object *s_get_ticker(json_object *a_jobj_tickers, const char *a_token_ticke * @param a_token_num * @return char* */ -static json_object* dap_db_chain_history_token_list(dap_chain_t * a_chain, const char *a_token_name, const char *a_hash_out_type, size_t *a_token_num) +static json_object* dap_db_chain_history_token_list(json_object* a_json_arr_reply, dap_chain_t * a_chain, const char *a_token_name, const char *a_hash_out_type, size_t *a_token_num) { json_object *l_jobj_tickers = json_object_new_object(); if (!a_chain->callback_datum_iter_create) { @@ -892,7 +895,7 @@ static json_object* dap_db_chain_history_token_list(dap_chain_t * a_chain, const json_object* json_history_token = json_object_new_object(); json_object_object_add(json_history_token, "status", json_object_new_string(l_ret_code ? "DECLINED" : "ACCEPTED")); json_object_object_add(json_history_token, "Ledger return code", json_object_new_int(l_ret_code)); - dap_chain_datum_dump_json(json_history_token, l_datum, a_hash_out_type, a_chain->net_id); + dap_chain_datum_dump_json(a_json_arr_reply, json_history_token, l_datum, a_hash_out_type, a_chain->net_id); switch (l_token->type) { case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: @@ -925,14 +928,14 @@ static json_object* dap_db_chain_history_token_list(dap_chain_t * a_chain, const * @return char* */ -static size_t dap_db_net_history_token_list(dap_chain_net_t * l_net, const char *a_token_name, const char *a_hash_out_type, json_object* a_obj_out) { +static size_t dap_db_net_history_token_list(json_object* a_json_arr_reply, dap_chain_net_t * l_net, const char *a_token_name, const char *a_hash_out_type, json_object* a_obj_out) { size_t l_token_num_total = 0; dap_chain_t *l_chain_cur; json_object* json_arr_obj_tx = json_object_new_array(); DL_FOREACH(l_net->pub.chains, l_chain_cur) { size_t l_token_num = 0; json_object* json_obj_tx = NULL; - json_obj_tx = dap_db_chain_history_token_list(l_chain_cur, a_token_name, a_hash_out_type, &l_token_num); + json_obj_tx = dap_db_chain_history_token_list(a_json_arr_reply, l_chain_cur, a_token_name, a_hash_out_type, &l_token_num); if(json_obj_tx) json_object_array_add(json_arr_obj_tx, json_obj_tx); l_token_num_total += l_token_num; @@ -953,7 +956,7 @@ static size_t dap_db_net_history_token_list(dap_chain_net_t * l_net, const char */ int com_ledger(int a_argc, char ** a_argv, void **reply) { - json_object ** json_arr_reply = (json_object **) reply; + json_object ** a_json_arr_reply = (json_object **) reply; enum { CMD_NONE, CMD_LIST, CMD_TX_INFO }; int arg_index = 1; const char *l_net_str = NULL; @@ -964,7 +967,7 @@ int com_ledger(int a_argc, char ** a_argv, void **reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR, "invalid parameter -H, valid values: -H <hex | base58>"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR, "invalid parameter -H, valid values: -H <hex | base58>"); return DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR; } @@ -998,13 +1001,13 @@ int com_ledger(int a_argc, char ** a_argv, void **reply) l_sub_cmd = SUB_CMD_LIST_LEDGER_THRESHOLD_WITH_HASH; if (dap_chain_hash_fast_from_str(l_tx_threshold_hash_str, &l_tx_threshold_hash)){ l_tx_hash_str = NULL; - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_TRESHOLD_ERR, "tx threshold hash not recognized"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_TRESHOLD_ERR, "tx threshold hash not recognized"); return DAP_CHAIN_NODE_CLI_COM_LEDGER_TRESHOLD_ERR; } } } if (l_sub_cmd == SUBCMD_NONE) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR, "Command 'list' requires subcommands 'coins' or 'threshold'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR, "Command 'list' requires subcommands 'coins' or 'threshold'"); return DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR; } dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-net", &l_net_str); @@ -1014,39 +1017,39 @@ int com_ledger(int a_argc, char ** a_argv, void **reply) size_t l_limit = l_limit_str ? strtoul(l_limit_str, NULL, 10) : 0; size_t l_offset = l_offset_str ? strtoul(l_offset_str, NULL, 10) : 0; if (l_net_str == NULL){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_PARAM_ERR, "Command 'list' requires key -net"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_PARAM_ERR, "Command 'list' requires key -net"); return DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_PARAM_ERR; } dap_ledger_t *l_ledger = dap_ledger_by_net_name(l_net_str); if (l_ledger == NULL){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR, "Can't get ledger for net %s", l_net_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR, "Can't get ledger for net %s", l_net_str); return DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR; } if (l_sub_cmd == SUB_CMD_LIST_LEDGER_THRESHOLD) { json_object* json_obj_out = dap_ledger_threshold_info(l_ledger, l_limit, l_offset, NULL, l_head); if (json_obj_out){ - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } return 0; } if (l_sub_cmd == SUB_CMD_LIST_LEDGER_THRESHOLD_WITH_HASH) { json_object *json_obj_out = dap_ledger_threshold_info(l_ledger, 0, 0, &l_tx_threshold_hash, l_head); if (json_obj_out){ - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } return 0; } if (l_sub_cmd == SUB_CMD_LIST_LEDGER_BALANCE) { json_object *json_obj_out = dap_ledger_balance_info(l_ledger, l_limit, l_offset, l_head); if (json_obj_out){ - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } return 0; } json_object *json_obj_datum = dap_ledger_token_info(l_ledger, l_limit, l_offset); if (json_obj_datum) { - json_object_array_add(*json_arr_reply, json_obj_datum); + json_object_array_add(*a_json_arr_reply, json_obj_datum); } return 0; } else if (l_cmd == CMD_TX_INFO){ @@ -1058,45 +1061,45 @@ int com_ledger(int a_argc, char ** a_argv, void **reply) bool l_unspent_flag = dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-unspent", NULL); //check input if (l_tx_hash_str == NULL){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR, "Subcommand 'info' requires key -hash"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR, "Subcommand 'info' requires key -hash"); return DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR; } if (l_net_str == NULL){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_PARAM_ERR, "Subcommand 'info' requires key -net"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_PARAM_ERR, "Subcommand 'info' requires key -net"); return DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_PARAM_ERR; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_FIND_ERR, "Can't find net %s", l_net_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_FIND_ERR, "Can't find net %s", l_net_str); return DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_FIND_ERR; } dap_chain_hash_fast_t *l_tx_hash = DAP_NEW(dap_chain_hash_fast_t); if (dap_chain_hash_fast_from_str(l_tx_hash_str, l_tx_hash)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_HASH_GET_ERR, "Can't get hash_fast from %s, check that the hash is correct", l_tx_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_HASH_GET_ERR, "Can't get hash_fast from %s, check that the hash is correct", l_tx_hash_str); DAP_DEL_Z(l_tx_hash); return DAP_CHAIN_NODE_CLI_COM_LEDGER_HASH_GET_ERR; } dap_chain_datum_tx_t *l_datum_tx = dap_chain_net_get_tx_by_hash(l_net, l_tx_hash, l_unspent_flag ? TX_SEARCH_TYPE_NET_UNSPENT : TX_SEARCH_TYPE_NET); if (l_datum_tx == NULL) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_TX_HASH_ERR, "Can't find datum for transaction hash %s in chains", l_tx_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_TX_HASH_ERR, "Can't find datum for transaction hash %s in chains", l_tx_hash_str); DAP_DEL_Z(l_tx_hash); return DAP_CHAIN_NODE_CLI_COM_LEDGER_TX_HASH_ERR; } json_object* json_datum = json_object_new_object(); - if (!s_dap_chain_datum_tx_out_data(l_datum_tx, l_net->pub.ledger, json_datum, l_hash_out_type, l_tx_hash)){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_TX_HASH_ERR, "Can't find transaction hash %s in ledger", l_tx_hash_str); + if (!s_dap_chain_datum_tx_out_data(*a_json_arr_reply,l_datum_tx, l_net->pub.ledger, json_datum, l_hash_out_type, l_tx_hash)){ + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_TX_HASH_ERR, "Can't find transaction hash %s in ledger", l_tx_hash_str); json_object_put(json_datum); DAP_DEL_Z(l_tx_hash); return DAP_CHAIN_NODE_CLI_COM_LEDGER_TX_HASH_ERR; } DAP_DEL_Z(l_tx_hash); if (json_datum){ - json_object_array_add(*json_arr_reply, json_datum); + json_object_array_add(*a_json_arr_reply, json_datum); } } else{ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR, "Command 'ledger' requires parameter 'list' or 'info'", l_tx_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR, "Command 'ledger' requires parameter 'list' or 'info'", l_tx_hash_str); return DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR; } return 0; @@ -1114,7 +1117,7 @@ int com_ledger(int a_argc, char ** a_argv, void **reply) */ int com_token(int a_argc, char ** a_argv, void **a_str_reply) { - json_object **json_arr_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; enum { CMD_NONE, CMD_LIST, CMD_INFO, CMD_TX }; int arg_index = 1; const char *l_net_str = NULL; @@ -1125,18 +1128,18 @@ int com_token(int a_argc, char ** a_argv, void **a_str_reply) if (!l_hash_out_type) l_hash_out_type = "hex"; if (dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR, "invalid parameter -H, valid values: -H <hex | base58>"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR, "invalid parameter -H, valid values: -H <hex | base58>"); return -DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR; } dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-net", &l_net_str); // Select chain network if(!l_net_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR, "command requires parameter '-net'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR, "command requires parameter '-net'"); return -DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR; } else { if((l_net = dap_chain_net_by_name(l_net_str)) == NULL) { // Can't find such network - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR, "command requires parameter '-net' to be valid chain network name"); return -DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR; } @@ -1152,11 +1155,11 @@ int com_token(int a_argc, char ** a_argv, void **a_str_reply) // token list if(l_cmd == CMD_LIST) { json_object* json_obj_tx = json_object_new_object(); - size_t l_total_all_token = dap_db_net_history_token_list(l_net, NULL, l_hash_out_type, json_obj_tx); + size_t l_total_all_token = dap_db_net_history_token_list(*a_json_arr_reply, l_net, NULL, l_hash_out_type, json_obj_tx); json_object_object_length(json_obj_tx); json_object_object_add(json_obj_tx, "tokens", json_object_new_uint64(l_total_all_token)); - json_object_array_add(*json_arr_reply, json_obj_tx); + json_object_array_add(*a_json_arr_reply, json_obj_tx); return 0; } // token info @@ -1164,20 +1167,20 @@ int com_token(int a_argc, char ** a_argv, void **a_str_reply) const char *l_token_name_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-name", &l_token_name_str); if(!l_token_name_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR, "command requires parameter '-name' <token name>"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR, "command requires parameter '-name' <token name>"); return -DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR; } json_object *json_obj_tx = json_object_new_object(); - if (!dap_db_net_history_token_list(l_net, l_token_name_str, l_hash_out_type, json_obj_tx)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TOKEN_FOUND_ERR, "token '%s' not found\n", l_token_name_str);\ + if (!dap_db_net_history_token_list(*a_json_arr_reply, l_net, l_token_name_str, l_hash_out_type, json_obj_tx)) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_FOUND_ERR, "token '%s' not found\n", l_token_name_str);\ return -DAP_CHAIN_NODE_CLI_COM_TOKEN_UNKNOWN; } - json_object_array_add(*json_arr_reply, json_obj_tx); + json_object_array_add(*a_json_arr_reply, json_obj_tx); return DAP_CHAIN_NODE_CLI_COM_TOKEN_OK; } // command tx history else if(l_cmd == CMD_TX) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TOKEN_UNKNOWN, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_UNKNOWN, "The cellframe-node-cli token tx command is deprecated and no longer supported.\n"); return DAP_CHAIN_NODE_CLI_COM_TOKEN_UNKNOWN; @@ -1318,7 +1321,7 @@ int com_token(int a_argc, char ** a_argv, void **a_str_reply) #endif } - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TOKEN_UNKNOWN, "unknown command code %d", l_cmd); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_UNKNOWN, "unknown command code %d", l_cmd); return -DAP_CHAIN_NODE_CLI_COM_TOKEN_UNKNOWN; } diff --git a/modules/net/include/dap_chain_node_cli_cmd.h b/modules/net/include/dap_chain_node_cli_cmd.h index bf894e41236abcffc9815d3fa6984d4f17ae755c..253a0bf8b9aa920b0120d201fe57c87c928e8b27 100644 --- a/modules/net/include/dap_chain_node_cli_cmd.h +++ b/modules/net/include/dap_chain_node_cli_cmd.h @@ -31,7 +31,7 @@ #include "dap_chain_node_cli.h" #include "json.h" -int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(int *a_arg_index, int a_argc, +int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(json_object* a_json_arr_reply, int *a_arg_index, int a_argc, char **a_argv, dap_chain_t **a_chain, dap_chain_net_t **a_net, dap_chain_type_t a_default_chain_type); @@ -186,6 +186,7 @@ typedef enum s_com_tx_create_err{ DAP_CHAIN_NODE_CLI_COM_TX_CREATE_OK = 0, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_HASH_INVALID = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_NET_NOT_FOUND, + DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_FEE, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_FEE_IS_UINT256, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_WALLET_OR_FROM_EMISSION, DAP_CHAIN_NODE_CLI_COM_TX_CREATE_REQUIRE_PARAMETER_FROM_EMISSION, diff --git a/modules/net/include/dap_chain_node_cli_cmd_tx.h b/modules/net/include/dap_chain_node_cli_cmd_tx.h index 375f1f34f2474baf60f60e02f6916f11028c1834..442f895e7edd3ad5173681ecfd8903cb0741744b 100644 --- a/modules/net/include/dap_chain_node_cli_cmd_tx.h +++ b/modules/net/include/dap_chain_node_cli_cmd_tx.h @@ -40,12 +40,13 @@ void s_dap_chain_tx_hash_processed_ht_free(dap_chain_tx_hash_processed_ht_t **l_ * * return history json */ -json_object * dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type, dap_chain_net_t * l_net); -json_object * dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, const char *a_hash_out_type, const char * l_addr_str, json_object *json_obj_summary, size_t a_limit, size_t a_offset, +json_object * dap_db_history_tx(json_object* a_json_arr_reply, dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type, dap_chain_net_t * l_net); +json_object * dap_db_history_addr(json_object* a_json_arr_reply, dap_chain_addr_t * a_addr, dap_chain_t * a_chain, const char *a_hash_out_type, const char * l_addr_str, json_object *json_obj_summary, size_t a_limit, size_t a_offset, bool a_brief, const char *a_srv, dap_chain_tx_tag_action_type_t a_action, bool a_head); -json_object * dap_db_tx_history_to_json(dap_chain_hash_fast_t* a_tx_hash, +json_object * dap_db_tx_history_to_json(json_object* a_json_arr_reply, + dap_chain_hash_fast_t* a_tx_hash, dap_hash_fast_t * l_atom_hash, dap_chain_datum_tx_t * l_tx, dap_chain_t * a_chain, @@ -55,13 +56,14 @@ json_object * dap_db_tx_history_to_json(dap_chain_hash_fast_t* a_tx_hash, bool *accepted_tx, bool out_brief); -json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net, +json_object *dap_db_history_tx_all(json_object* a_json_arr_reply, dap_chain_t *l_chain, dap_chain_net_t *l_net, const char *l_hash_out_type, json_object *json_obj_summary, size_t a_limit, size_t a_offset, bool out_brief, const char *a_srv, dap_chain_tx_tag_action_type_t a_action, bool a_head); -bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, +bool s_dap_chain_datum_tx_out_data(json_object* a_json_arr_reply, + dap_chain_datum_tx_t *a_datum, dap_ledger_t *a_ledger, json_object * json_obj_out, const char *a_hash_out_type, diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 9dd95fdcd9a700e4a42a94a599c65311b39b5693..abd9d5d4d295aa7b66de478ec82dde8774e217d8 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -560,3 +560,77 @@ void dap_chain_net_srv_order_dump_to_string(const dap_chain_net_srv_order_t *a_o DAP_DELETE(l_ext_out); } } + + + +void dap_chain_net_srv_order_dump_to_json(const dap_chain_net_srv_order_t *a_order, json_object *a_json_obj_out, + const char *a_hash_out_type, const char *a_native_ticker) +{ + if (a_order && a_json_obj_out ){ + dap_chain_hash_fast_t l_hash; + dap_hash_fast(a_order, dap_chain_net_srv_order_get_size(a_order), &l_hash); + const char *l_hash_str = dap_strcmp(a_hash_out_type,"hex") + ? dap_enc_base58_encode_hash_to_str_static(&l_hash) + : dap_chain_hash_fast_to_str_static(&l_hash); + + json_object_object_add(a_json_obj_out, "order", json_object_new_string(l_hash_str)); + json_object_object_add(a_json_obj_out, "version", json_object_new_int(a_order->version)); + + switch ( a_order->direction) { + case SERV_DIR_UNDEFINED: json_object_object_add(a_json_obj_out, "direction", json_object_new_string("SERV_DIR_UNDEFINED")); break; + case SERV_DIR_SELL: json_object_object_add(a_json_obj_out, "direction", json_object_new_string("SERV_DIR_SELL")); break; + case SERV_DIR_BUY: json_object_object_add(a_json_obj_out, "direction", json_object_new_string("SERV_DIR_BUY")); break; + } + char buf_time[DAP_TIME_STR_SIZE]; + dap_time_to_str_rfc822(buf_time, DAP_TIME_STR_SIZE, a_order->ts_created); + json_object_object_add(a_json_obj_out, "created", json_object_new_string(buf_time)); + //timestamp remove after sort + json_object_object_add(a_json_obj_out, "timestamp", json_object_new_uint64(a_order->ts_created)); + char buf_srv_uid[64]; + sprintf(buf_srv_uid, "0x%016"DAP_UINT64_FORMAT_X"", a_order->srv_uid.uint64); + json_object_object_add(a_json_obj_out, "srv_uid", json_object_new_string(buf_srv_uid)); + + const char *l_balance_coins, *l_balance = dap_uint256_to_char(a_order->price, &l_balance_coins); + json_object_object_add(a_json_obj_out, "price_coins", json_object_new_string(l_balance_coins)); + json_object_object_add(a_json_obj_out, "price_datoshi", json_object_new_string(l_balance)); + json_object_object_add(a_json_obj_out, "price_token", json_object_new_string((*a_order->price_ticker) ? a_order->price_ticker: a_native_ticker)); + json_object_object_add(a_json_obj_out, "units", json_object_new_int(a_order->units)); + if( a_order->price_unit.uint32 ) + json_object_object_add(a_json_obj_out, "price_unit", json_object_new_string(dap_chain_net_srv_price_unit_uid_to_str(a_order->price_unit))); + if ( a_order->node_addr.uint64) { + char buf_node_addr[64]; + sprintf(buf_node_addr, ""NODE_ADDR_FP_STR"", NODE_ADDR_FP_ARGS_S(a_order->node_addr)); + json_object_object_add(a_json_obj_out, "node_addr", json_object_new_string(buf_node_addr)); + } + + char *l_region = NULL; + uint8_t l_continent_num = 0; + const char *l_continent_str = NULL; + if(dap_chain_net_srv_order_get_continent_region(a_order, &l_continent_num, &l_region)) + l_continent_str = dap_chain_net_srv_order_continent_to_str(l_continent_num); + char buf_location[64]; + sprintf(buf_location, "%s - %s", l_continent_str ? l_continent_str : "None" , l_region ? l_region : "None"); + json_object_object_add(a_json_obj_out, "node_location", json_object_new_string(buf_location)); + DAP_DELETE(l_region); + + l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str_static(&a_order->tx_cond_hash) + : dap_chain_hash_fast_to_str_static(&a_order->tx_cond_hash); + json_object_object_add(a_json_obj_out, "tx_cond_hash", json_object_new_string(l_hash_str)); + char *l_ext_out = a_order->ext_size ? DAP_NEW_Z_SIZE(char, a_order->ext_size * 2 + 1) : NULL; + if(l_ext_out) { + dap_bin2hex(l_ext_out, a_order->ext_n_sign, a_order->ext_size); + char buf_ext[a_order->ext_size*2+3]; + sprintf(buf_ext, "0x%s", l_ext_out); + json_object_object_add(a_json_obj_out, "ext", json_object_new_string(buf_ext)); + } + else + json_object_object_add(a_json_obj_out, "ext", json_object_new_string("0x0")); + dap_sign_t *l_sign = (dap_sign_t*)((byte_t*)a_order->ext_n_sign + a_order->ext_size); + dap_hash_fast_t l_sign_pkey = {0}; + dap_sign_get_pkey_hash(l_sign, &l_sign_pkey); + const char *l_sign_pkey_hash_str = dap_hash_fast_to_str_static(&l_sign_pkey); + json_object_object_add(a_json_obj_out, "pkey", json_object_new_string(l_sign_pkey_hash_str)); + DAP_DELETE(l_ext_out); + } +} diff --git a/modules/net/srv/include/dap_chain_net_srv_order.h b/modules/net/srv/include/dap_chain_net_srv_order.h index 5d20752b1e153aadc26f97ae6b63f39c5423fb29..e0271c10a89b27e056e8ee2a918430b9afd1c53c 100644 --- a/modules/net/srv/include/dap_chain_net_srv_order.h +++ b/modules/net/srv/include/dap_chain_net_srv_order.h @@ -141,6 +141,8 @@ char *dap_chain_net_srv_order_save(dap_chain_net_t *a_net, dap_chain_net_srv_ord void dap_chain_net_srv_order_dump_to_string(const dap_chain_net_srv_order_t *a_order, dap_string_t *a_str_out, const char *a_hash_out_type, const char *a_native_ticker); +void dap_chain_net_srv_order_dump_to_json(const dap_chain_net_srv_order_t *a_order, json_object *a_json_obj_out, + const char *a_hash_out_type, const char *a_native_ticker); void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg); /** diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index 52be033cad1ff4caa897d29d92d3edc187003e85..283f78856f8622a16833a82f823d5e8b57d281d1 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -39,6 +39,7 @@ #include "dap_chain_node_client.h" #include "dap_stream_ch_chain_net_pkt.h" #include "json_object.h" +#include "dap_json_rpc_errors.h" #include "dap_cli_server.h" #include "dap_chain_net_srv_order.h" @@ -46,6 +47,38 @@ #define DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_GDB_GROUP "delegate_keys" +typedef enum s_cli_srv_stake_err{ + DAP_CHAIN_NODE_CLI_SRV_STAKE_OK = 0, + DAP_CHAIN_NODE_CLI_SRV_STAKE_MEMORY_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_HASH_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_WRONG_HASH_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_NEED_TX_NOT_OUTPUT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_TX_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_HASH_ADDR_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_NODE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_NODE_BAD_SIZE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CON_TO_NODE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_RES_FROM_NODE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_SEND_PKT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CERT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_WRONG_CERT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_CERT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_NOT_POA_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DECREE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_STAKE_IN_NET_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_WRONG_SUB_COMMAND_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ANCHOR_NOT_SUPPORT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_MIN_STAKE_SET_FAILED_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_MAX_WEIGHT_SET_FAILED_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_PERCENT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_UNRECOGNIZE_COM_ERR, + + /* add custom codes here */ + + //DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */ +} s_cli_srv_stake_err_t; static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply); static int s_stake_verificator_callback(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_cond, @@ -1454,8 +1487,47 @@ static int time_compare_orders(const void *a, const void *b) { return 0; } +int json_object_compare_by_timestamp(const void *a, const void *b) { + struct json_object *obj_a = *(struct json_object **)a; + struct json_object *obj_b = *(struct json_object **)b; + + struct json_object *timestamp_a = json_object_object_get(obj_a, "timestamp"); + struct json_object *timestamp_b = json_object_object_get(obj_b, "timestamp"); + + int64_t time_a = json_object_get_int64(timestamp_a); + int64_t time_b = json_object_get_int64(timestamp_b); + + return time_a - time_b; +} + +typedef enum s_cli_srv_stake_order_err{ + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_OK = 0, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_MEMORY_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_FORMAT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NET_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_CERT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_PKEY_IN_CERT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_VAL_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_TAX_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_WALLET_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_UNRECOGNIZED_ADDR_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_ADDR_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_STAKER_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_ORDER_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_ORDER_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_REMOVE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_SUB_COM_ERR, + + + /* add custom codes here */ + + //DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */ +} s_cli_srv_stake_order_err_t; static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, void **a_str_reply, const char *a_hash_out_type) { + json_object **a_json_arr_reply = (json_object **)a_str_reply; enum { CMD_NONE, CMD_CREATE_FEE, CMD_CREATE_VALIDATOR, CMD_CREATE_STAKER, CMD_UPDATE, CMD_LIST, CMD_LIST_STAKER, CMD_LIST_VALIDATOR, CMD_LIST_FEE, CMD_REMOVE @@ -1481,13 +1553,13 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi const char *l_net_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'order' requires parameter -net"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Command 'order' requires parameter -net"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NET_ERR, "Network %s not found", l_net_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NET_ERR; } switch (l_cmd_num) { @@ -1496,36 +1568,39 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi *l_cert_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-value", &l_value_str); if (!l_value_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Fee order creation requires parameter -value"); - return -5; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Fee order creation requires parameter -value"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } uint256_t l_value = dap_chain_balance_scan(l_value_str); if (IS_ZERO_256(l_value)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -value <256 bit integer>"); - return -6; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_FORMAT_ERR, "Format -value <256 bit integer>"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_FORMAT_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-cert", &l_cert_str); if (!l_cert_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Fee order creation requires parameter -cert"); - return -7; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Fee order creation requires parameter -cert"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_str); if (!l_cert) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't load cert %s", l_cert_str); - return -8; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_CERT_ERR, "Can't load cert %s", l_cert_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_CERT_ERR; } if (!l_cert->enc_key || !l_cert->enc_key->priv_key_data || !l_cert->enc_key->priv_key_data_size) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Certificate \"%s\" has no private key", l_cert_str); - return -20; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_PKEY_IN_CERT_ERR, "Certificate \"%s\" has no private key", l_cert_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_PKEY_IN_CERT_ERR; } // Create the order & put it in GDB char *l_order_hash_str = s_fee_order_create(l_net, &l_value, l_cert->enc_key, a_hash_out_type); if (l_order_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_str); + json_object * l_json_obj_create = json_object_new_object(); + json_object_object_add(l_json_obj_create, "status", json_object_new_string("success")); + json_object_object_add(l_json_obj_create, "order_hash", json_object_new_string(l_order_hash_str)); + json_object_array_add(*a_json_arr_reply, l_json_obj_create); DAP_DELETE(l_order_hash_str); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose the order"); - return -9; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_ERR, "Can't compose the order"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_ERR; } } break; @@ -1535,49 +1610,49 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi *l_tax_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-value_min", &l_value_min_str); if (!l_value_min_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Validator order creation requires parameter -value_min"); - return -5; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Validator order creation requires parameter -value_min"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } uint256_t l_value_min = dap_chain_balance_scan(l_value_min_str); if (IS_ZERO_256(l_value_min)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -value_min <256 bit integer>"); - return -6; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_FORMAT_ERR, "Format -value_min <256 bit integer>"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_FORMAT_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-value_max", &l_value_max_str); if (!l_value_max_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Validator order creation requires parameter -value_max"); - return -7; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Validator order creation requires parameter -value_max"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } uint256_t l_value_max = dap_chain_balance_scan(l_value_max_str); if (IS_ZERO_256(l_value_max)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -value_max <256 bit integer>"); - return -8; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_FORMAT_ERR, "Format -value_max <256 bit integer>"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_FORMAT_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-tax", &l_tax_str); if (!l_tax_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Validator order creation requires parameter -tax"); - return -9; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Validator order creation requires parameter -tax"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } uint256_t l_tax = dap_chain_coins_to_balance(l_tax_str); if (compare256(l_tax, dap_chain_coins_to_balance("100.0")) == 1 || compare256(l_tax, GET_256_FROM_64(100)) == -1) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Tax must be lower or equal than 100%% and higher or equal than 1.0e-16%%"); - return -10; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_TAX_ERR, "Tax must be lower or equal than 100%% and higher or equal than 1.0e-16%%"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_TAX_ERR; } const char *l_cert_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-cert", &l_cert_str); if (!l_cert_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Validator order creation requires parameter -cert"); - return -7; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Validator order creation requires parameter -cert"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_str); if (!l_cert) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't load cert %s", l_cert_str); - return -8; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_CERT_ERR, "Can't load cert %s", l_cert_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_CERT_ERR; } if (!l_cert->enc_key || !l_cert->enc_key->priv_key_data || !l_cert->enc_key->priv_key_data_size) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Certificate \"%s\" has no private key", l_cert_str); - return -20; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_PKEY_IN_CERT_ERR, "Certificate \"%s\" has no private key", l_cert_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_PKEY_IN_CERT_ERR; } dap_chain_addr_t l_signing_addr; dap_chain_addr_fill_from_key(&l_signing_addr, l_cert->enc_key, l_net->pub.id); @@ -1586,23 +1661,26 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-node_addr", &l_node_addr_str); if (l_node_addr_str) { if (dap_chain_node_addr_from_str(&l_node_addr, l_node_addr_str)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized node addr %s", l_node_addr_str); - return -14; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_UNRECOGNIZED_ADDR_ERR, "Unrecognized node addr %s", l_node_addr_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_UNRECOGNIZED_ADDR_ERR; } } int l_result = dap_chain_net_srv_stake_verify_key_and_node(&l_signing_addr, &l_node_addr); if (l_result) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Key and node verification error"); + dap_json_rpc_error_add(*a_json_arr_reply, l_result, "Key and node verification error"); return l_result; } // Create the order & put it in GDB char *l_order_hash_str = s_validator_order_create(l_net, l_value_min, l_value_max, l_tax, l_cert->enc_key, a_hash_out_type, l_node_addr); if (l_order_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_str); + json_object * l_json_obj_create_val = json_object_new_object(); + json_object_object_add(l_json_obj_create_val, "status", json_object_new_string("success")); + json_object_object_add(l_json_obj_create_val, "order_hash", json_object_new_string(l_order_hash_str)); + json_object_array_add(*a_json_arr_reply, l_json_obj_create_val); DAP_DELETE(l_order_hash_str); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose the order"); - return -9; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_VAL_ERR, "Can't compose the order"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_VAL_ERR; } } break; @@ -1614,44 +1692,44 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi *l_fee_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-value", &l_value_str); if (!l_value_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Staker order creation requires parameter -value"); - return -5; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Staker order creation requires parameter -value"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } uint256_t l_value = dap_chain_balance_scan(l_value_str); if (IS_ZERO_256(l_value)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -value <256 bit integer>"); - return -6; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Format -value <256 bit integer>"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-fee", &l_fee_str); if (!l_fee_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Staker order creation requires parameter -fee"); - return -7; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Staker order creation requires parameter -fee"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } uint256_t l_fee = dap_chain_balance_scan(l_fee_str); if (IS_ZERO_256(l_fee)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -fee <256 bit integer>"); - return -8; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_FORMAT_ERR, "Format -fee <256 bit integer>"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_FORMAT_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-tax", &l_tax_str); if (!l_tax_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Staker order creation requires parameter -tax"); - return -9; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Staker order creation requires parameter -tax"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } uint256_t l_tax = dap_chain_coins_to_balance(l_tax_str); if (compare256(l_tax, dap_chain_coins_to_balance("100.0")) == 1 || compare256(l_tax, GET_256_FROM_64(100)) == -1) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Tax must be lower or equal than 100%% and higher or equal than 1.0e-16%%"); - return -10; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_TAX_ERR, "Tax must be lower or equal than 100%% and higher or equal than 1.0e-16%%"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_TAX_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-w", &l_wallet_str); if (!l_wallet_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Staker order creation requires parameter -w"); - return -17; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Staker order creation requires parameter -w"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config),NULL); if (!l_wallet) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified wallet not found"); - return -18; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_WALLET_ERR, "Specified wallet not found"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_WALLET_ERR; } // Create conditional transaction for order const char *l_sign_str = dap_chain_wallet_check_sign(l_wallet); @@ -1662,9 +1740,9 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi if (l_addr_str) { dap_chain_addr_t *l_spec_addr = dap_chain_addr_from_str(l_addr_str); if (!l_spec_addr) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified address is ivalid"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_ADDR_ERR, "Specified address is ivalid"); DAP_DELETE(l_enc_key); - return -24; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_ADDR_ERR; } l_addr = *l_spec_addr; DAP_DELETE(l_spec_addr); @@ -1675,9 +1753,9 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi DAP_DEL_Z(l_enc_key); char *l_tx_hash_str = NULL; if (!l_tx || !(l_tx_hash_str = s_stake_tx_put(l_tx, l_net, a_hash_out_type))) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose transaction for order, examine log files for details"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_STAKER_ERR, "Can't compose transaction for order, examine log files for details"); DAP_DEL_Z(l_tx); - return -21; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_STAKER_ERR; } DAP_DELETE(l_tx); // Create the order & put it in GDB @@ -1689,21 +1767,27 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi l_cert_str = "node-addr"; dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_str); if (!l_cert) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't load cert %s", l_cert_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_CERT_ERR, "Can't load cert %s", l_cert_str); DAP_DELETE(l_tx_hash_str); - return -8; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_CERT_ERR; } if (!l_cert->enc_key || !l_cert->enc_key->priv_key_data || !l_cert->enc_key->priv_key_data_size) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Certificate \"%s\" has no private key", l_cert_str); - return -20; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_PKEY_IN_CERT_ERR, "Certificate \"%s\" has no private key", l_cert_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_PKEY_IN_CERT_ERR; } char *l_order_hash_str = s_staker_order_create(l_net, l_value, &l_tx_hash, l_cert->enc_key, a_hash_out_type); if (!l_order_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose the order"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_STAKER_ERR, "Can't compose the order"); DAP_DELETE(l_tx_hash_str); - return -9; - } - dap_cli_server_cmd_set_reply_text(a_str_reply, "%sSuccessfully created order %s\nSAVE TO TAKE ===>>> Order tx hash = %s", l_sign_str, l_order_hash_str, l_tx_hash_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_CREATE_STAKER_ERR; + } + json_object * l_json_obj_create_val = json_object_new_object(); + json_object_object_add(l_json_obj_create_val, "status", json_object_new_string("success")); + if (dap_strcmp(l_sign_str, "")) + json_object_object_add(l_json_obj_create_val, "sign", json_object_new_string(l_sign_str)); + json_object_object_add(l_json_obj_create_val, "order_hash", json_object_new_string(l_order_hash_str)); + json_object_object_add(l_json_obj_create_val, "tx_hash", json_object_new_string(l_tx_hash_str)); + json_object_array_add(*a_json_arr_reply, l_json_obj_create_val); DAP_DELETE(l_order_hash_str); DAP_DELETE(l_tx_hash_str); } break; @@ -1713,9 +1797,9 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi const char *l_order_hash_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-order", &l_order_hash_str); if (!l_order_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'srv_stake order %s' requires prameter -order\n", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Command 'srv_stake order %s' requires prameter -order\n", l_cmd_num == CMD_REMOVE ? "remove" : "update"); - return -4; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } char *l_order_hash_hex_str; // datum hash may be in hex or base58 format @@ -1725,22 +1809,24 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi l_order_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_order_hash_str); dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_hex_str); if (!l_order) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't find order %s\n", l_order_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_ORDER_ERR, "Can't find order %s\n", l_order_hash_str); DAP_DELETE(l_order_hash_hex_str); - return -5; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_ORDER_ERR; } if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID && l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ORDERS) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Order %s is not a delegated stake order\n", l_order_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_ORDER_ERR, "Order %s is not a delegated stake order\n", l_order_hash_str); DAP_DELETE(l_order_hash_hex_str); - return -6; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_ORDER_ERR; } if (l_cmd_num == CMD_REMOVE) { if (dap_chain_net_srv_order_delete_by_hash_str_sync(l_net, l_order_hash_hex_str)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't remove order %s\n", l_order_hash_str); - return -14; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_REMOVE_ERR, "Can't remove order %s\n", l_order_hash_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_REMOVE_ERR; } - dap_cli_server_cmd_set_reply_text(a_str_reply, "Stake order successfully removed"); + json_object * l_json_obj_create_val = json_object_new_object(); + json_object_object_add(l_json_obj_create_val, "status", json_object_new_string("success")); + json_object_array_add(*a_json_arr_reply, l_json_obj_create_val); DAP_DELETE(l_order_hash_hex_str); } else { // l_cmd_num == CMD_UPDATE const char *l_cert_str = NULL, *l_value_str = NULL; @@ -1780,8 +1866,8 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi const char *l_net_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'order list' requires parameter -net"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR, "Command 'order list' requires parameter -net"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_PARAM_ERR; } const char * l_list_type = NULL; int l_list_filter = 0; @@ -1794,10 +1880,10 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NET_ERR, "Network %s not found", l_net_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NET_ERR; } - dap_string_t *l_reply_str = dap_string_new(""); + json_object* l_json_arr_reply = json_object_new_array(); for (int i = 0; i < 2; i++) { char *l_gdb_group_str = i ? dap_chain_net_srv_order_get_gdb_group(l_net) : dap_chain_net_srv_order_get_common_group(l_net); @@ -1831,21 +1917,23 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi break; } // TODO add filters to list (token, address, etc.) - dap_string_append(l_reply_str, "\n"); - dap_chain_net_srv_order_dump_to_string(l_order, l_reply_str, a_hash_out_type, l_net->pub.native_ticker); + json_object* l_json_obj_order = json_object_new_object(); + dap_chain_net_srv_order_dump_to_json(l_order, l_json_obj_order, a_hash_out_type, l_net->pub.native_ticker); if (l_order->srv_uid.uint64 == DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ORDERS) { if (l_order->direction == SERV_DIR_SELL) { - dap_string_append(l_reply_str, "Value in this order type means minimum value of m-tokens for validator acceptable for key delegation with supplied tax\n" - "Order external params:\n"); + json_object_object_add(l_json_obj_order, "message", + json_object_new_string("Value in this order type means minimum value of m-tokens for validator acceptable for key delegation with supplied tax")); struct validator_odrer_ext *l_ext = (struct validator_odrer_ext *)l_order->ext_n_sign; + json_object* l_json_obj_ext_params = json_object_new_object(); const char *l_coins_str; dap_uint256_to_char(l_ext->tax, &l_coins_str); - dap_string_append_printf(l_reply_str, " tax: %s%%\n", l_coins_str); + json_object_object_add(l_json_obj_ext_params, "tax", json_object_new_string(l_coins_str)); dap_uint256_to_char(l_ext->value_max, &l_coins_str); - dap_string_append_printf(l_reply_str, " maximum_value: %s\n", l_coins_str); + json_object_object_add(l_json_obj_ext_params, "maximum_value", json_object_new_string(l_coins_str)); + json_object_object_add(l_json_obj_order, "external_params", l_json_obj_ext_params); } else { // l_order->direction = SERV_DIR_BUY - dap_string_append(l_reply_str, "Value in this order type means value of m-tokens locked in conditional transaction attached to the order\n" - "Order conditional tx params:\n"); + json_object_object_add(l_json_obj_order, "message", + json_object_new_string("Value in this order type means value of m-tokens locked in conditional transaction attached to the order")); bool l_error = true; dap_chain_addr_t l_addr = {}; uint256_t l_tax = uint256_0; @@ -1860,34 +1948,81 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi MULT_256_256(l_tax, GET_256_FROM_64(100), &l_tax); l_error = false; } - } + } if (!l_error) { const char *l_tax_str; dap_uint256_to_char(l_tax, &l_tax_str); - dap_string_append_printf(l_reply_str, " sovereign_tax: %s%%\n sovereign_addr: %s\n", - l_tax_str, dap_chain_addr_to_str_static(&l_addr)); + json_object* l_json_obj_cond_tx_params = json_object_new_object(); + json_object_object_add(l_json_obj_cond_tx_params, "sovereign_tax", json_object_new_string(l_tax_str)); + json_object_object_add(l_json_obj_cond_tx_params, "sovereign_addr", json_object_new_string(dap_chain_addr_to_str_static(&l_addr))); + json_object_object_add(l_json_obj_order, "conditional_tx_params", l_json_obj_cond_tx_params); } else - dap_string_append(l_reply_str, " Conditional tx not found or illegal\n"); + json_object_object_add(l_json_obj_order, "conditional_tx_params", json_object_new_string("Conditional tx not found or illegal")); } } else - dap_string_append(l_reply_str, "Value in this order type means minimum fee for validator acceptable for process transactions\n"); + json_object_object_add(l_json_obj_order, "message", + json_object_new_string("Value in this order type means minimum fee for validator acceptable for process transactions")); + json_object_array_add(l_json_arr_reply, l_json_obj_order); } dap_global_db_objs_delete(l_orders, l_orders_count); DAP_DELETE(l_gdb_group_str); } - if (!l_reply_str->len) - dap_string_append(l_reply_str, "No orders found"); - *a_str_reply = dap_string_free(l_reply_str, false); + size_t json_array_lenght = json_object_array_length(l_json_arr_reply); + if (!json_array_lenght) + json_object_array_add(l_json_arr_reply, json_object_new_string( "No orders found")); + else { + //sort by time + json_object_array_sort(l_json_arr_reply, json_object_compare_by_timestamp); + // Remove the timestamp + for (size_t i = 0; i < json_array_lenght; i++) { + struct json_object *obj = json_object_array_get_idx(l_json_arr_reply, i); + json_object_object_del(obj, "timestamp"); + } + } + json_object_array_add(*a_json_arr_reply, l_json_arr_reply); } break; default: - dap_cli_server_cmd_set_reply_text(a_str_reply, "Subcommand %s not recognized", a_argv[a_arg_index]); - return -2; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_SUB_COM_ERR, "Subcommand %s not recognized", a_argv[a_arg_index]); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ORDER_NO_SUB_COM_ERR; } return 0; } +typedef enum s_cli_srv_stake_delegate_err{ + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_OK = 0, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_MEMORY_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_FORMAT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NET_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_WALLET_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_CERT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_WRONG_CERT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_UNRECOGNIZED_ADDR_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_ORDER_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_ORDER_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ORDER_SIZE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_TX_IN_LEDGER_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_COND_TX_TYPE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_COND_TX_FORMAT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_COND_TX_DIF_VALUE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_COND_TX_NO_ADDR_OR_KEY_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_TX_ALREADY_SENT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ANOTHER_TICKER_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ADDR_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_LOW_VALUE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_HIGH_VALUE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_UNSIGNED_ORDER_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_TAX_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_VERIFICATION_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_STAKE_ERR, + + /* add custom codes here */ + + //DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */ +} s_cli_srv_stake_delegate_err_t; static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, void **a_str_reply, const char *a_hash_out_type) { + json_object **a_json_arr_reply = (json_object **)a_str_reply; const char *l_net_str = NULL, *l_wallet_str = NULL, *l_cert_str = NULL, @@ -1897,24 +2032,24 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, *l_order_hash_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'delegate' requires parameter -net"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, "Command 'delegate' requires parameter -net"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NET_ERR, "Network %s not found", l_net_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NET_ERR; } dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-w", &l_wallet_str); if (!l_wallet_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'delegate' requires parameter -w"); - return -17; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, "Command 'delegate' requires parameter -w"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR; } const char* l_sign_str = ""; dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config), NULL); if (!l_wallet) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified wallet not found"); - return -18; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_WALLET_ERR, "Specified wallet not found"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_WALLET_ERR; } else l_sign_str = dap_chain_wallet_check_sign(l_wallet); dap_enc_key_t *l_enc_key = dap_chain_wallet_get_key(l_wallet, 0); @@ -1924,114 +2059,114 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-cert", &l_cert_str); dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-order", &l_order_hash_str); if (!l_cert_str && !l_order_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'delegate' requires parameter -cert and/or -order"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, "Command 'delegate' requires parameter -cert and/or -order"); dap_enc_key_delete(l_enc_key); - return -13; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR; } uint256_t l_value = uint256_0; dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-value", &l_value_str); if (!l_value_str) { if (!l_order_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'delegate' requires parameter -value"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, "Command 'delegate' requires parameter -value"); dap_enc_key_delete(l_enc_key); - return -9; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR; } } else { l_value = dap_chain_balance_scan(l_value_str); if (IS_ZERO_256(l_value)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized number in '-value' param"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, "Unrecognized number in '-value' param"); dap_enc_key_delete(l_enc_key); - return -10; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR; } } dap_chain_datum_tx_t *l_prev_tx = NULL; if (l_cert_str) { dap_cert_t *l_signing_cert = dap_cert_find_by_name(l_cert_str); if (!l_signing_cert) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate not found"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_CERT_ERR, "Specified certificate not found"); dap_enc_key_delete(l_enc_key); - return -19; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_CERT_ERR; } if (dap_chain_addr_fill_from_key(&l_signing_addr, l_signing_cert->enc_key, l_net->pub.id)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate is wrong"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_WRONG_CERT_ERR, "Specified certificate is wrong"); dap_enc_key_delete(l_enc_key); - return -20; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_WRONG_CERT_ERR; } dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-node_addr", &l_node_addr_str); } dap_chain_node_addr_t l_node_addr = g_node_addr; if (l_node_addr_str) { if (dap_chain_node_addr_from_str(&l_node_addr, l_node_addr_str)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized node addr %s", l_node_addr_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_UNRECOGNIZED_ADDR_ERR, "Unrecognized node addr %s", l_node_addr_str); dap_enc_key_delete(l_enc_key); - return -14; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_UNRECOGNIZED_ADDR_ERR; } } if (l_order_hash_str) { dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str); if (!l_order) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order not found"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_ORDER_ERR, "Specified order not found"); dap_enc_key_delete(l_enc_key); - return -25; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_ORDER_ERR; } if (l_order->direction == SERV_DIR_BUY) { // Staker order if (!l_cert_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'delegate' requires parameter -cert with this order type"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, "Command 'delegate' requires parameter -cert with this order type"); dap_enc_key_delete(l_enc_key); - return -22; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR; } if (l_order->ext_size != 0) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order has invalid size"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ORDER_SIZE_ERR, "Specified order has invalid size"); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_order); - return -26; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ORDER_SIZE_ERR; } l_prev_tx = dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_order->tx_cond_hash); if (!l_prev_tx) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The order's conditional transaction not found in ledger"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_TX_IN_LEDGER_ERR, "The order's conditional transaction not found in ledger"); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_order); - return -30; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_TX_IN_LEDGER_ERR; } int l_out_num = 0; dap_chain_tx_out_cond_t *l_cond = dap_chain_datum_tx_out_cond_get(l_prev_tx, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, &l_out_num); if (!l_cond) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The order's conditional transaction has invalid type"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_COND_TX_TYPE_ERR, "The order's conditional transaction has invalid type"); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_order); - return -31; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_COND_TX_TYPE_ERR; } if (dap_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, &l_order->tx_cond_hash, l_out_num, NULL)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The order's conditional transaction is already spent"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_TX_ALREADY_SENT_ERR, "The order's conditional transaction is already spent"); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_order); - return -32; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_TX_ALREADY_SENT_ERR; } char l_delegated_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; dap_chain_datum_token_get_delegated_ticker(l_delegated_ticker, l_net->pub.native_ticker); const char *l_tx_ticker = dap_ledger_tx_get_token_ticker_by_hash(l_net->pub.ledger, &l_order->tx_cond_hash); if (dap_strcmp(l_tx_ticker, l_delegated_ticker)) { log_it(L_WARNING, "Requested conditional transaction have another ticker (not %s)", l_delegated_ticker); - return -38; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ANOTHER_TICKER_ERR; } if (l_cond->tsd_size != dap_chain_datum_tx_item_out_cond_create_srv_stake_get_tsd_size()) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The order's conditional transaction has invalid format"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_COND_TX_FORMAT_ERR, "The order's conditional transaction has invalid format"); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_order); - return -33; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_COND_TX_FORMAT_ERR; } if (compare256(l_cond->header.value, l_order->price)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The order's conditional transaction has different value"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_COND_TX_DIF_VALUE_ERR, "The order's conditional transaction has different value"); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_order); - return -34; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_COND_TX_DIF_VALUE_ERR; } if (!dap_chain_addr_is_blank(&l_cond->subtype.srv_stake_pos_delegate.signing_addr) || l_cond->subtype.srv_stake_pos_delegate.signer_node_addr.uint64) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The order's conditional transaction gas not blank address or key"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_COND_TX_NO_ADDR_OR_KEY_ERR, "The order's conditional transaction gas not blank address or key"); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_order); - return -35; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_COND_TX_NO_ADDR_OR_KEY_ERR; } l_value = l_order->price; dap_tsd_t *l_tsd = dap_tsd_find(l_cond->tsd, l_cond->tsd_size, DAP_CHAIN_TX_OUT_COND_TSD_ADDR); @@ -2050,17 +2185,17 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, #endif } else { if (!l_value_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'delegate' requires parameter -value with this order type"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, "Command 'delegate' requires parameter -value with this order type"); dap_enc_key_delete(l_enc_key); - return -23; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR; } const char *l_sovereign_addr_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-tax_addr", &l_sovereign_addr_str); if (l_sovereign_addr_str) { dap_chain_addr_t *l_spec_addr = dap_chain_addr_from_str(l_sovereign_addr_str); if (!l_spec_addr) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified address is ivalid"); - return -24; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ADDR_ERR, "Specified address is ivalid"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ADDR_ERR; } l_sovereign_addr = *l_spec_addr; DAP_DELETE(l_spec_addr); @@ -2068,82 +2203,82 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, dap_chain_addr_fill_from_key(&l_sovereign_addr, l_enc_key, l_net->pub.id); if (l_order->ext_size != sizeof(struct validator_odrer_ext)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order has invalid size"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ORDER_SIZE_ERR, "Specified order has invalid size"); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_order); - return -26; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ORDER_SIZE_ERR; } struct validator_odrer_ext *l_ext = (struct validator_odrer_ext *)l_order->ext_n_sign; l_sovereign_tax = l_ext->tax; if (l_order_hash_str && compare256(l_value, l_order->price) == -1) { const char *l_coin_min_str, *l_value_min_str = dap_uint256_to_char(l_order->price, &l_coin_min_str); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Number in '-value' param %s is lower than order minimum allowed value %s(%s)", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_LOW_VALUE_ERR, "Number in '-value' param %s is lower than order minimum allowed value %s(%s)", l_value_str, l_coin_min_str, l_value_min_str); dap_enc_key_delete(l_enc_key); - return -13; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_LOW_VALUE_ERR; } if (l_order_hash_str && compare256(l_value, l_ext->value_max) == 1) { const char *l_coin_max_str, *l_value_max_str = dap_uint256_to_char(l_ext->value_max, &l_coin_max_str); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Number in '-value' param %s is higher than order minimum allowed value %s(%s)", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_HIGH_VALUE_ERR, "Number in '-value' param %s is higher than order minimum allowed value %s(%s)", l_value_str, l_coin_max_str, l_value_max_str); dap_enc_key_delete(l_enc_key); - return -14; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_HIGH_VALUE_ERR; } dap_sign_t *l_sign = (dap_sign_t *)(l_order->ext_n_sign + l_order->ext_size); if (l_sign->header.type.type == SIG_TYPE_NULL) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order is unsigned"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_UNSIGNED_ORDER_ERR, "Specified order is unsigned"); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_order); - return -27; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_UNSIGNED_ORDER_ERR; } dap_chain_addr_fill_from_sign(&l_signing_addr, l_sign, l_net->pub.id); char l_delegated_ticker_str[DAP_CHAIN_TICKER_SIZE_MAX]; dap_chain_datum_token_get_delegated_ticker(l_delegated_ticker_str, l_net->pub.native_ticker); if (dap_strcmp(l_order->price_ticker, l_delegated_ticker_str)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order is invalid"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_ORDER_ERR, "Specified order is invalid"); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_order); - return -28; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_ORDER_ERR; } l_node_addr = l_order->node_addr; } DAP_DELETE(l_order); if (compare256(l_sovereign_tax, dap_chain_coins_to_balance("100.0")) == 1 || compare256(l_sovereign_tax, GET_256_FROM_64(100)) == -1) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Tax must be lower or equal than 100%% and higher or equal than 1.0e-16%%"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_TAX_ERR, "Tax must be lower or equal than 100%% and higher or equal than 1.0e-16%%"); dap_enc_key_delete(l_enc_key); - return -29; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_TAX_ERR; } DIV_256(l_sovereign_tax, GET_256_FROM_64(100), &l_sovereign_tax); } int l_check_result = dap_chain_net_srv_stake_verify_key_and_node(&l_signing_addr, &l_node_addr); if (l_check_result) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Key and node verification error"); + dap_json_rpc_error_add(*a_json_arr_reply, l_check_result, "Key and node verification error"); dap_enc_key_delete(l_enc_key); return l_check_result; } uint256_t l_allowed_min = dap_chain_net_srv_stake_get_allowed_min_value(l_net->pub.id); if (compare256(l_value, l_allowed_min) == -1) { const char *l_coin_min_str, *l_value_min_str = dap_uint256_to_char(l_allowed_min, &l_coin_min_str); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Number in '-value' param %s is lower than service minimum allowed value %s(%s)", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_LOW_VALUE_ERR, "Number in '-value' param %s is lower than minimum allowed value %s(%s)", l_value_str, l_coin_min_str, l_value_min_str); dap_enc_key_delete(l_enc_key); - return -11; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_LOW_VALUE_ERR; } dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-fee", &l_fee_str); if (!l_fee_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'delegate' requires parameter -fee"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, "Command 'delegate' requires parameter -fee"); dap_enc_key_delete(l_enc_key); - return -15; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR; } uint256_t l_fee = dap_chain_balance_scan(l_fee_str); if (IS_ZERO_256(l_fee)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized number in '-fee' param"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, "Unrecognized number in '-fee' param"); dap_enc_key_delete(l_enc_key); - return -16; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR; } // Create conditional transaction @@ -2152,13 +2287,16 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, dap_enc_key_delete(l_enc_key); char *l_tx_hash_str; if (!l_tx || !(l_tx_hash_str = s_stake_tx_put(l_tx, l_net, a_hash_out_type))) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Stake transaction error"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_STAKE_ERR, "Stake transaction error"); DAP_DEL_Z(l_tx); - return -12; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_STAKE_ERR; } DAP_DELETE(l_tx); - const char *c_save_to_take = l_prev_tx ? "" : "SAVE TO TAKE ===>>> "; - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s%sStake transaction %s has done", l_sign_str, c_save_to_take, l_tx_hash_str); + json_object* l_json_obj_deligate = json_object_new_object(); + json_object_object_add(l_json_obj_deligate, "status", json_object_new_string("success")); + json_object_object_add(l_json_obj_deligate, "sign", json_object_new_string(l_sign_str)); + json_object_object_add(l_json_obj_deligate, "tx_hash", json_object_new_string(l_tx_hash_str)); + json_object_array_add(*a_json_arr_reply, l_json_obj_deligate); DAP_DELETE(l_tx_hash_str); return 0; } @@ -2300,10 +2438,35 @@ static int s_cli_srv_stake_update(int a_argc, char **a_argv, int a_arg_index, vo } +typedef enum s_cli_srv_stake_invalidate_err{ + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_OK = 0, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_MEMORY_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NET_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_INVALID_PKEY_TYPE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_CERT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_POA_CERT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_WRONG_CERT_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PKEY_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_INVALID_PKEY_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NET_NO_STAKE_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_CERT_PKEY_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_TX_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_INVALID_TX_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_PREV_TX_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_DELEGATED_TX_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_WALLET_ERR, + DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_TX_INVALIDATE_ERR, + /* add custom codes here */ + + //DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */ +} s_cli_srv_stake_invalidate_err_t; static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index, void **a_str_reply, const char *a_hash_out_type) { + json_object **a_json_arr_reply = (json_object **)a_str_reply; const char *l_net_str = NULL, *l_wallet_str = NULL, + *l_cert_str = NULL, *l_fee_str = NULL, *l_tx_hash_str = NULL, *l_poa_cert_str = NULL, @@ -2311,49 +2474,52 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index *l_signing_pkey_type_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'invalidate' requires parameter -net"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR, "Command 'invalidate' requires parameter -net"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NET_ERR, "Network %s not found", l_net_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NET_ERR; } uint256_t l_fee = {}; dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-w", &l_wallet_str); if (!l_wallet_str) { dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-poa_cert", &l_poa_cert_str); if (!l_poa_cert_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'invalidate' requires parameter -w or -poa_cert"); - return -17; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR, "Command 'invalidate' requires parameter -w or -poa_cert"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR; } } else { dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-fee", &l_fee_str); if (!l_fee_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'invalidate' requires parameter -fee"); - return -5; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR, "Command 'delegate' requires parameter -fee"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR; } l_fee = dap_chain_balance_scan(l_fee_str); if (IS_ZERO_256(l_fee)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized number in '-fee' param"); - return -6; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR, "Unrecognized number in '-fee' param"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR; } } dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-tx", &l_tx_hash_str); if (!l_tx_hash_str) { - dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-signing_pkey_hash", &l_signing_pkey_hash_str); - if (!l_signing_pkey_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'invalidate' requires parameter -tx or -signing_pkey_hash"); - return -13; - } - dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-signing_pkey_type", &l_signing_pkey_type_str); - if (!l_signing_pkey_type_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'invalidate' requires parameter -signing_pkey_type"); - return -14; - } - if (dap_sign_type_from_str(l_signing_pkey_type_str).type == SIG_TYPE_NULL) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Invalid signing_pkey_type %s", l_signing_pkey_type_str); - return -15; + dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-cert", &l_cert_str); + if (!l_cert_str) { + dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-signing_pkey_hash", &l_signing_pkey_hash_str); + if (!l_signing_pkey_hash_str) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR, "Command 'invalidate' requires parameter -tx or -cert or -signing_pkey_hash"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR; + } + dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-signing_pkey_type", &l_signing_pkey_type_str); + if (!l_signing_pkey_type_str) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR, "Command 'invalidate' requires parameter -signing_pkey_type"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PARAM_ERR; + } + if (dap_sign_type_from_str(l_signing_pkey_type_str).type == SIG_TYPE_NULL) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_INVALID_PKEY_TYPE_ERR, "Invalid signing_pkey_type %s", l_signing_pkey_type_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_INVALID_PKEY_TYPE_ERR; + } } } @@ -2361,24 +2527,40 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index if (l_tx_hash_str) { dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash); } else { - dap_hash_fast_t l_pkey_hash = {}; - if (dap_chain_hash_fast_from_str(l_signing_pkey_hash_str, &l_pkey_hash)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Invalid pkey hash format"); - return -23; - } dap_chain_addr_t l_signing_addr; - dap_chain_addr_fill(&l_signing_addr, dap_sign_type_from_str(l_signing_pkey_type_str), &l_pkey_hash, l_net->pub.id); + if (l_cert_str) { + dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_str); + if (!l_cert) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_CERT_ERR, "Specified certificate not found"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_CERT_ERR; + } + if (!l_cert->enc_key->priv_key_data || l_cert->enc_key->priv_key_data_size == 0) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PKEY_ERR, "It is not possible to invalidate a stake using a public key."); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_PKEY_ERR; + } + if (dap_chain_addr_fill_from_key(&l_signing_addr, l_cert->enc_key, l_net->pub.id)) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_WRONG_CERT_ERR, "Specified certificate is wrong"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_WRONG_CERT_ERR; + } + } else { + dap_hash_fast_t l_pkey_hash = {}; + if (dap_chain_hash_fast_from_str(l_signing_pkey_hash_str, &l_pkey_hash)) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_INVALID_PKEY_ERR, "Invalid pkey hash format"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_INVALID_PKEY_ERR; + } + dap_chain_addr_fill(&l_signing_addr, dap_sign_type_from_str(l_signing_pkey_type_str), &l_pkey_hash, l_net->pub.id); + } dap_chain_net_srv_stake_t *l_srv_stake = s_srv_stake_by_net_id(l_net->pub.id); if (!l_srv_stake) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified net have no stake service activated"); - return -25; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NET_NO_STAKE_ERR, "Specified net have no stake service activated"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NET_NO_STAKE_ERR; } dap_chain_net_srv_stake_item_t *l_stake = NULL; HASH_FIND(hh, l_srv_stake->itemlist, &l_signing_addr.data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (!l_stake) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate/pkey hash is not delegated nor this delegating is approved." + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_CERT_PKEY_ERR, "Specified certificate/pkey hash is not delegated nor this delegating is approved." " Try to invalidate with tx hash instead"); - return -24; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_CERT_PKEY_ERR; } l_tx_hash = l_stake->tx_hash; } @@ -2386,34 +2568,38 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index const char *l_tx_hash_str_tmp = l_tx_hash_str ? l_tx_hash_str : dap_hash_fast_to_str_static(&l_tx_hash); dap_chain_datum_tx_t *l_tx = dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_tx_hash); if (!l_tx) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s not found", l_tx_hash_str_tmp); - return -21; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_TX_ERR, "Transaction %s not found", l_tx_hash_str_tmp); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_TX_ERR; } int l_out_num = 0; if (!dap_chain_datum_tx_out_cond_get(l_tx, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, &l_out_num)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s is invalid", l_tx_hash_str_tmp); - return -22; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_INVALID_TX_ERR, "Transaction %s is invalid", l_tx_hash_str_tmp); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_INVALID_TX_ERR; } dap_hash_fast_t l_spender_hash = {}; if (dap_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, &l_tx_hash, l_out_num, &l_spender_hash)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s is spent", l_tx_hash_str_tmp); - return -23; + l_tx_hash = l_spender_hash; + l_tx_hash_str_tmp = dap_hash_fast_to_str_static(&l_spender_hash); + if (!dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_tx_hash)) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_PREV_TX_ERR, "Previous transaction %s is not found", l_tx_hash_str_tmp); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_PREV_TX_ERR; + } } if (l_tx_hash_str) { dap_chain_net_srv_stake_t *l_srv_stake = s_srv_stake_by_net_id(l_net->pub.id); if (!l_srv_stake) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified net have no stake service activated"); - return -25; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NET_NO_STAKE_ERR, "Specified net have no stake service activated"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NET_NO_STAKE_ERR; } dap_chain_net_srv_stake_item_t *l_stake = NULL; HASH_FIND(ht, l_srv_stake->tx_itemlist, &l_tx_hash, sizeof(dap_hash_t), l_stake); if (l_stake) { char l_pkey_hash_str[DAP_HASH_FAST_STR_SIZE]; dap_hash_fast_to_str(&l_stake->signing_addr.data.hash_fast, l_pkey_hash_str, DAP_HASH_FAST_STR_SIZE); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s has active delegated key %s, need to revoke it first", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_DELEGATED_TX_ERR, "Transaction %s has active delegated key %s, need to revoke it first", l_tx_hash_str_tmp, l_pkey_hash_str); - return -30; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_DELEGATED_TX_ERR; } } @@ -2421,8 +2607,8 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index const char* l_sign_str = ""; dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config),NULL); if (!l_wallet) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified wallet not found"); - return -18; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_WALLET_ERR, "Specified wallet not found"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_WALLET_ERR; } else { l_sign_str = dap_chain_wallet_check_sign(l_wallet); } @@ -2432,47 +2618,55 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index dap_enc_key_delete(l_enc_key); char *l_out_hash_str = NULL; if (l_tx && (l_out_hash_str = s_stake_tx_put(l_tx, l_net, a_hash_out_type))) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "%sAll m-tokens will be returned to " - "owner. Returning tx hash %s.", l_sign_str, l_out_hash_str); + json_object* l_json_object_invalidate = json_object_new_object(); + json_object_object_add(l_json_object_invalidate, "status", json_object_new_string("success")); + json_object_object_add(l_json_object_invalidate, "sign", json_object_new_string(l_sign_str)); + json_object_object_add(l_json_object_invalidate, "tx_hash", json_object_new_string(l_out_hash_str)); + json_object_object_add(l_json_object_invalidate, "message", json_object_new_string("All m-tokens successfully returned to owner")); + json_object_array_add(*a_json_arr_reply, l_json_object_invalidate); DAP_DELETE(l_out_hash_str); DAP_DELETE(l_tx); } else { l_tx_hash_str = dap_chain_hash_fast_to_str_static(&l_tx_hash); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose invalidation transaction %s, examine log files for details", l_tx_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_TX_INVALIDATE_ERR, "Can't invalidate transaction %s, examine log files for details", l_tx_hash_str); DAP_DEL_Z(l_tx); - return -21; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_TX_INVALIDATE_ERR; } } else { dap_cert_t *l_poa_cert = dap_cert_find_by_name(l_poa_cert_str); if (!l_poa_cert) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate not found"); - return -25; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_CERT_ERR, "Specified certificate not found"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_NO_CERT_ERR; } if (!s_srv_stake_is_poa_cert(l_net, l_poa_cert->enc_key)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate is not PoA root one"); - return -26; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_POA_CERT_ERR, "Specified certificate is not PoA root one"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_POA_CERT_ERR; } dap_chain_datum_decree_t *l_decree = s_stake_decree_invalidate(l_net, &l_tx_hash, l_poa_cert); char *l_decree_hash_str = NULL; if (l_decree && (l_decree_hash_str = s_stake_decree_put(l_decree, l_net))) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified delegated key invalidated. " - "Created key invalidation decree %s." - "Try to execute this command with -w to return m-tokens to owner", l_decree_hash_str); + json_object* l_json_object_invalidate = json_object_new_object(); + json_object_object_add(l_json_object_invalidate, "status", json_object_new_string("success")); + json_object_object_add(l_json_object_invalidate, "decree", json_object_new_string(l_decree_hash_str)); + json_object_object_add(l_json_object_invalidate, "message", json_object_new_string("Specified delegated key invalidated." + "Try to execute this command with -w to return m-tokens to owner")); + json_object_array_add(*a_json_arr_reply, l_json_object_invalidate); DAP_DELETE(l_decree); DAP_DELETE(l_decree_hash_str); } else { char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_to_str(&l_tx_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't invalidate transaction %s, examine log files for details", l_tx_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_TX_INVALIDATE_ERR, "Can't invalidate transaction %s, examine log files for details", l_tx_hash_str); DAP_DEL_Z(l_decree); - return -21; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_INVALIDATE_TX_INVALIDATE_ERR; } } return 0; } -static void s_srv_stake_print(dap_chain_net_srv_stake_item_t *a_stake, uint256_t a_total_weight, dap_string_t *a_string) +static void s_srv_stake_print(dap_chain_net_srv_stake_item_t *a_stake, uint256_t a_total_weight, json_object *a_json_arr) { + json_object * l_json_obj_stake = json_object_new_object(); char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE], l_pkey_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_to_str(&a_stake->tx_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); dap_chain_hash_fast_to_str(&a_stake->signing_addr.data.hash_fast, l_pkey_hash_str, sizeof(l_pkey_hash_str)); @@ -2482,26 +2676,24 @@ static void s_srv_stake_print(dap_chain_net_srv_stake_item_t *a_stake, uint256_t MULT_256_256(a_stake->value, GET_256_FROM_64(100), &l_tmp); DIV_256_COIN(l_tmp, a_total_weight, &l_rel_weight); char *l_rel_weight_str = dap_chain_balance_to_coins(l_rel_weight); - char l_active_str[32] = {}; - if (dap_chain_esbocs_started(a_stake->signing_addr.net_id)) - snprintf(l_active_str, 32, "\tActive: %s\n", a_stake->is_active ? "true" : "false"); + // snprintf(l_active_str, 32, "\tActive: %s\n", a_stake->is_active ? "true" : "false"); const char *l_sov_addr_str = dap_chain_addr_is_blank(&a_stake->sovereign_addr) ? "null" : dap_chain_addr_to_str_static(&a_stake->sovereign_addr); uint256_t l_sov_tax_percent = uint256_0; MULT_256_256(a_stake->sovereign_tax, GET_256_FROM_64(100), &l_sov_tax_percent); char *l_sov_tax_str = dap_chain_balance_to_coins(l_sov_tax_percent); - dap_string_append_printf(a_string, "Pkey hash: %s\n" - "\tStake value: %s\n" - "\tEffective value: %s\n" - "\tRelated weight: %s%%\n" - "\tTx hash: %s\n" - "\tNode addr: "NODE_ADDR_FP_STR"\n" - "\tSovereign addr: %s\n" - "\tSovereign tax: %s%%\n" - "%s\n", - l_pkey_hash_str, l_balance, l_effective_weight, l_rel_weight_str, - l_tx_hash_str, NODE_ADDR_FP_ARGS_S(a_stake->node_addr), - l_sov_addr_str, l_sov_tax_str, l_active_str); + char l_node_addr[32] = {}; + snprintf(l_node_addr, 32, ""NODE_ADDR_FP_STR"", NODE_ADDR_FP_ARGS_S(a_stake->node_addr)); + json_object_object_add(l_json_obj_stake, "pkey_hash", json_object_new_string(l_pkey_hash_str)); + json_object_object_add(l_json_obj_stake, "stake_value", json_object_new_string(l_balance)); + json_object_object_add(l_json_obj_stake, "related_weight", json_object_new_string(l_rel_weight_str)); + json_object_object_add(l_json_obj_stake, "tx_hash", json_object_new_string(l_tx_hash_str)); + json_object_object_add(l_json_obj_stake, "node_addr", json_object_new_string(l_node_addr)); + json_object_object_add(l_json_obj_stake, "sovereign_addr", json_object_new_string(l_sov_addr_str)); + json_object_object_add(l_json_obj_stake, "sovereign_tax", json_object_new_string(l_sov_tax_str)); + if (dap_chain_esbocs_started(a_stake->signing_addr.net_id)) + json_object_object_add(l_json_obj_stake, "active", json_object_new_string(a_stake->is_active ? "true" : "false")); + json_object_array_add(a_json_arr, l_json_obj_stake); DAP_DELETE(l_balance); DAP_DELETE(l_effective_weight); DAP_DELETE(l_rel_weight_str); @@ -2567,6 +2759,9 @@ int dap_chain_net_srv_stake_check_validator(dap_chain_net_t * a_net, dap_hash_fa dap_chain_node_info_t *l_remote_node_info = NULL; dap_ledger_t *l_ledger = dap_ledger_by_net_name(a_net->pub.name); dap_chain_datum_tx_t *l_tx = dap_ledger_tx_find_by_hash(l_ledger, a_tx_hash); + if (!l_tx) { + return -11; + } int l_overall_correct = false; int l_prev_cond_idx = 0; @@ -2663,6 +2858,7 @@ uint256_t dap_chain_net_srv_stake_get_total_weight(dap_chain_net_id_t a_net_id, static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) { + json_object **a_json_arr_reply = (json_object **)a_str_reply; enum { CMD_NONE, CMD_ORDER, CMD_DELEGATE, CMD_UPDATE, CMD_APPROVE, CMD_LIST, CMD_INVALIDATE, CMD_MIN_VALUE, CMD_CHECK, CMD_MAX_WEIGHT }; @@ -2673,8 +2869,9 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) if (!l_hash_out_type) l_hash_out_type = "hex"; else if (dap_strcmp(l_hash_out_type," hex") && dap_strcmp(l_hash_out_type, "base58")) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>"); - return -1; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, + "Invalid parameter -H, valid values: -H <hex | base58>"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } int l_cmd_num = CMD_NONE; if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, dap_min(a_argc, l_arg_index + 1), "order", NULL)) { @@ -2737,71 +2934,66 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-tx", &str_tx_hash); l_net = dap_chain_net_by_name(l_netst); if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_netst); - return -1; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR, "Network %s not found", l_netst); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR; } if (!str_tx_hash) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command check requires parameter -tx"); - return -2; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command check requires parameter -tx"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } if (dap_chain_hash_fast_from_str(str_tx_hash, &l_tx)){ - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't get hash_fast from %s, check that the hash is correct", str_tx_hash); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_HASH_ERR, "Can't get hash_fast from %s, check that the hash is correct", str_tx_hash); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_HASH_ERR; } int res = dap_chain_net_srv_stake_check_validator(l_net, &l_tx, &l_out, 10000, 15000); switch (res) { case -4: - dap_cli_server_cmd_set_reply_text(a_str_reply,"Requested conditional transaction has no required conditional output"); - return -30; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NEED_TX_NOT_OUTPUT_ERR,"Requested conditional transaction has no required conditional output"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NEED_TX_NOT_OUTPUT_ERR; break; case -5: - dap_cli_server_cmd_set_reply_text(a_str_reply,"Can't calculate hash of addr"); - return -31; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_HASH_ADDR_ERR,"Can't calculate hash of addr"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_HASH_ADDR_ERR; break; case -6: - dap_cli_server_cmd_set_reply_text(a_str_reply,"Node not found in base"); - return -32; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_NODE_ERR,"Node not found in base"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_NODE_ERR; break; case -7: - dap_cli_server_cmd_set_reply_text(a_str_reply,"Node has bad size in base, see log file"); - return -33; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NODE_BAD_SIZE_ERR,"Node has bad size in base, see log file"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NODE_BAD_SIZE_ERR; break; case -8: - dap_cli_server_cmd_set_reply_text(a_str_reply,"Can't connect to remote node"); - return -34; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CON_TO_NODE_ERR,"Can't connect to remote node"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CON_TO_NODE_ERR; break; case -9: - dap_cli_server_cmd_set_reply_text(a_str_reply,"No response from node"); - return -35; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_RES_FROM_NODE_ERR,"No response from node"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_RES_FROM_NODE_ERR; break; case -10: - dap_cli_server_cmd_set_reply_text(a_str_reply,"Can't send DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST packet"); - return -36; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_SEND_PKT_ERR,"Can't send DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST packet"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_SEND_PKT_ERR; + break; + case -11: + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_TX_ERR,"Can't find conditional tx"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_TX_ERR; break; default: break; } - dap_cli_server_cmd_set_reply_text(a_str_reply, - "-------------------------------------------------\n" - "VERSION \t | %s \n" - "AUTO_PROC \t | %s \n" - "ORDER \t\t | %s \n" - "AUTO_ONLINE \t | %s \n" - "AUTO_UPDATE \t | %s \n" - "DATA_SIGNED \t | %s \n" - "FOUND CERT \t | %s\n" - "SIGN CORRECT \t | %s\n" - "SUMMARY \t | %s\n", - l_out.header.version, - (l_out.header.flags & A_PROC)?"true":"false", - (l_out.header.flags & F_ORDR)?"true":"false", - (l_out.header.flags & A_ONLN)?"true":"false", - (l_out.header.flags & A_UPDT)?"true":"false", - (l_out.header.flags & D_SIGN)?"true":"false", - (l_out.header.flags & F_CERT)?"true":"false", - l_out.header.sign_correct ? "true":"false", - l_out.header.overall_correct ? "Validator ready" : "There are unresolved issues"); + json_object* json_obj_order = json_object_new_object(); + json_object_object_add(json_obj_order, "VERSION", json_object_new_int(*(int*)l_out.header.version)); + json_object_object_add(json_obj_order, "AUTO_PROC", json_object_new_string((l_out.header.flags & A_PROC)?"true":"false")); + json_object_object_add(json_obj_order, "ORDER", json_object_new_string((l_out.header.flags & F_ORDR)?"true":"false")); + json_object_object_add(json_obj_order, "AUTO_ONLINE", json_object_new_string((l_out.header.flags & A_ONLN)?"true":"false")); + json_object_object_add(json_obj_order, "AUTO_UPDATE", json_object_new_string((l_out.header.flags & A_UPDT)?"true":"false")); + json_object_object_add(json_obj_order, "DATA_SIGNED", json_object_new_string((l_out.header.flags & D_SIGN)?"true":"false")); + json_object_object_add(json_obj_order, "FOUND_CERT", json_object_new_string((l_out.header.flags & F_CERT)?"true":"false")); + json_object_object_add(json_obj_order, "SIGN_CORRECT", json_object_new_string(l_out.header.sign_correct ? "true":"false")); + json_object_object_add(json_obj_order, "SUMMARY", json_object_new_string(l_out.header.overall_correct ? "Validator ready" : "There are unresolved issues")); + json_object_array_add(*a_json_arr_reply, json_obj_order); } break; @@ -2810,47 +3002,48 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) l_arg_index++; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'approve' requires parameter -net"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'approve' requires parameter -net"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR, "Network %s not found", l_net_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-poa_cert", &l_cert_str); if (!l_cert_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'approve' requires parameter -poa_cert"); - return -17; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'approve' requires parameter -poa_cert"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_str); if (!l_cert) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate not found"); - return -18; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CERT_ERR, "Specified certificate not found"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CERT_ERR; } if (!s_srv_stake_is_poa_cert(l_net, l_cert->enc_key)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate is not PoA root one"); - return -21; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NOT_POA_ERR, "Specified certificate is not PoA root one"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NOT_POA_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-tx", &l_tx_hash_str); if (!l_tx_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'approve' requires parameter -tx"); - return -13; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'approve' requires parameter -tx"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } dap_chain_hash_fast_t l_tx_hash = {}; if (dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Invalid transaction hash format"); - return -14; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_HASH_ERR, "Invalid transaction hash format"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_HASH_ERR; } dap_chain_datum_decree_t *l_decree = dap_chain_net_srv_stake_decree_approve(l_net, &l_tx_hash, l_cert); char *l_decree_hash_str = NULL; if (!l_decree || !(l_decree_hash_str = s_stake_decree_put(l_decree, l_net))) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Approve decree error"); - return -12; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DECREE_ERR, "Approve decree error"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_DECREE_ERR; } DAP_DELETE(l_decree); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Approve decree %s successfully created", - l_decree_hash_str); + char l_approve_str[128] = {'\0'}; + sprintf(l_approve_str,"Approve decree %s successfully created", l_decree_hash_str); + json_object_array_add(*a_json_arr_reply, json_object_new_string(l_approve_str)); DAP_DELETE(l_decree_hash_str); } break; @@ -2863,36 +3056,36 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) l_arg_index++; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'list keys' requires parameter -net"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'list keys' requires parameter -net"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR, "Network %s not found", l_net_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR; } dap_chain_net_srv_stake_t *l_srv_stake = s_srv_stake_by_net_id(l_net->pub.id); if (!l_srv_stake) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified net have no stake service activated"); - return -25; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_STAKE_IN_NET_ERR, "Specified net have no stake service activated"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_STAKE_IN_NET_ERR; } dap_chain_net_srv_stake_item_t *l_stake = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-cert", &l_cert_str); if (l_cert_str) { dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_str); if (!l_cert) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate not found"); - return -18; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CERT_ERR, "Specified certificate not found"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CERT_ERR; } dap_chain_addr_t l_signing_addr; if (dap_chain_addr_fill_from_key(&l_signing_addr, l_cert->enc_key, l_net->pub.id)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate is wrong"); - return -20; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_WRONG_CERT_ERR,"Specified certificate is wrong"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_WRONG_CERT_ERR; } HASH_FIND(hh, l_srv_stake->itemlist, &l_signing_addr.data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (!l_stake) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate isn't delegated nor approved"); - return -21; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_CERT_ERR, "Specified certificate isn't delegated nor approved"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_CERT_ERR; } } if (!l_cert_str) @@ -2900,87 +3093,88 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) if (l_pkey_hash_str) { dap_hash_fast_t l_pkey_hash; if (dap_chain_hash_fast_from_str(l_pkey_hash_str, &l_pkey_hash)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified pkey hash is wrong"); - return -20; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_WRONG_HASH_ERR, "Specified pkey hash is wrong"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_WRONG_HASH_ERR; } l_stake = dap_chain_net_srv_stake_check_pkey_hash(l_net->pub.id, &l_pkey_hash); if (!l_stake) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified pkey hash isn't delegated nor approved"); - return -21; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_HASH_ERR, "Specified pkey hash isn't delegated nor approved"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_HASH_ERR; } } - dap_string_t *l_reply_str = dap_string_new(""); + json_object* l_json_arr_list = json_object_new_array(); size_t l_inactive_count = 0, l_total_count = 0; uint256_t l_total_locked_weight = {}, l_total_weight = dap_chain_net_srv_stake_get_total_weight(l_net->pub.id, &l_total_locked_weight); if (l_stake) - s_srv_stake_print(l_stake, l_total_weight, l_reply_str); + s_srv_stake_print(l_stake, l_total_weight, l_json_arr_list); else for (l_stake = l_srv_stake->itemlist; l_stake; l_stake = l_stake->hh.next) { l_total_count++; if (!l_stake->is_active) l_inactive_count++; - s_srv_stake_print(l_stake, l_total_weight, l_reply_str); + s_srv_stake_print(l_stake, l_total_weight, l_json_arr_list); } + json_object* l_json_obj_keys_count = json_object_new_object(); if (!HASH_CNT(hh, l_srv_stake->itemlist)) { - dap_string_append(l_reply_str, "No keys found\n"); + json_object_object_add(l_json_obj_keys_count, "total_keys", json_object_new_int(0)); } else { if (!l_cert_str && !l_pkey_hash_str) - dap_string_append_printf(l_reply_str, "Total keys count: %zu\n", l_total_count); + json_object_object_add(l_json_obj_keys_count, "total_keys", json_object_new_int(l_total_count)); if (dap_chain_esbocs_started(l_net->pub.id)) - dap_string_append_printf(l_reply_str, "Inactive keys count: %zu\n", l_inactive_count); - const char *l_total_weight_coins, *l_total_weight_str = dap_uint256_to_char(l_total_locked_weight, &l_total_weight_coins); - dap_string_append_printf(l_reply_str, "Total weight: %s (%s)\n", l_total_weight_coins, l_total_weight_str); - l_total_weight_str = dap_uint256_to_char(l_total_weight, &l_total_weight_coins); - dap_string_append_printf(l_reply_str, "Total effective weight: %s (%s)\n", l_total_weight_coins, l_total_weight_str); + json_object_object_add(l_json_obj_keys_count, "inactive_keys", json_object_new_int(l_inactive_count)); + const char *l_total_weight_coins, *l_total_weight_str = + dap_uint256_to_char(l_total_weight, &l_total_weight_coins); + json_object_object_add(l_json_obj_keys_count, "total_weight_coins", json_object_new_string(l_total_weight_coins)); + json_object_object_add(l_json_obj_keys_count, "total_weight_str", json_object_new_string(l_total_weight_str)); } const char *l_delegate_min_str; dap_uint256_to_char(dap_chain_net_srv_stake_get_allowed_min_value(l_net->pub.id), &l_delegate_min_str); char l_delegated_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; dap_chain_datum_token_get_delegated_ticker(l_delegated_ticker, l_net->pub.native_ticker); - dap_string_append_printf(l_reply_str, "Minimum value for key delegating: %s %s\n", - l_delegate_min_str, l_delegated_ticker); + json_object_object_add(l_json_obj_keys_count, "key_delegating_min_value", json_object_new_string(l_delegate_min_str)); + json_object_object_add(l_json_obj_keys_count, "key_delegating_min_value_ticker", json_object_new_string(l_delegated_ticker)); uint256_t l_percent_max = dap_chain_net_srv_stake_get_percent_max(l_net->pub.id); const char *l_percent_max_str = NULL; if (!IS_ZERO_256(l_percent_max)) { MULT_256_256(l_percent_max, GET_256_FROM_64(100), &l_percent_max); dap_uint256_to_char(l_percent_max, &l_percent_max_str); } - dap_string_append_printf(l_reply_str, "Maximum related weight of each validator: %s%%\n", - IS_ZERO_256(l_percent_max) ? "100" : l_percent_max_str); - *a_str_reply = dap_string_free(l_reply_str, false); + json_object_object_add(l_json_obj_keys_count, "each_validator_max_related_weight", json_object_new_string(IS_ZERO_256(l_percent_max) ? "100" : l_percent_max_str)); + json_object_array_add(l_json_arr_list, l_json_obj_keys_count); + json_object_array_add(*a_json_arr_reply, l_json_arr_list); } else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "tx", NULL)) { const char *l_net_str = NULL; l_arg_index++; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'list tx' requires parameter -net"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'list tx' requires parameter -net"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR, "Network %s not found", l_net_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR; } struct get_tx_cond_pos_del_from_tx * l_args = DAP_NEW_Z(struct get_tx_cond_pos_del_from_tx); if(!l_args) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Out of memory"); - return -1; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_MEMORY_ERR, "Out of memory"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_MEMORY_ERR; } - dap_string_t * l_str_tmp = dap_string_new(NULL); + json_object * l_json_arr_tx = json_object_new_array(); dap_hash_fast_t l_datum_hash; dap_chain_datum_tx_t *l_datum_tx = NULL; dap_chain_tx_out_cond_t *l_tx_out_cond = NULL; int l_out_idx_tmp = 0; - char *spaces = {"--------------------------------------------------------------------------------------------------------------------"}; const char *l_signing_addr_str = NULL, *l_balance = NULL, *l_coins = NULL; char* l_node_address_text_block = NULL; dap_chain_net_get_tx_all(l_net,TX_SEARCH_TYPE_NET,s_get_tx_filter_callback, l_args); l_args->ret = dap_list_sort(l_args->ret, s_callback_compare_tx_list); for(dap_list_t *tx = l_args->ret; tx; tx = tx->next) { + json_object* l_json_obj_tx = json_object_new_object(); l_datum_tx = (dap_chain_datum_tx_t*)tx->data; char buf[DAP_TIME_STR_SIZE]; dap_hash_fast(l_datum_tx, dap_chain_datum_tx_get_size(l_datum_tx), &l_datum_hash); @@ -2989,28 +3183,29 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_to_str(&l_datum_hash, l_hash_str, sizeof(l_hash_str)); dap_time_to_str_rfc822(buf, DAP_TIME_STR_SIZE, l_datum_tx->header.ts_created); - dap_string_append_printf(l_str_tmp,"%s \n%s \ntx_hash:\t%s \n",spaces, buf, l_hash_str); + json_object_object_add(l_json_obj_tx, "date", json_object_new_string(buf)); + json_object_object_add(l_json_obj_tx, "tx_hash", json_object_new_string(l_hash_str)); char l_pkey_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_to_str(&l_tx_out_cond->subtype.srv_stake_pos_delegate.signing_addr.data.hash_fast, l_pkey_hash_str, sizeof(l_pkey_hash_str)); l_balance = dap_uint256_to_char(l_tx_out_cond->header.value, &l_coins); l_signing_addr_str = dap_chain_addr_to_str_static(&l_tx_out_cond->subtype.srv_stake_pos_delegate.signing_addr); - dap_string_append_printf(l_str_tmp,"signing_addr:\t%s \n",l_signing_addr_str); - dap_string_append_printf(l_str_tmp,"signing_hash:\t%s \n",l_pkey_hash_str); + json_object_object_add(l_json_obj_tx, "signing_addr", json_object_new_string(l_signing_addr_str)); + json_object_object_add(l_json_obj_tx, "signing_hash", json_object_new_string(l_pkey_hash_str)); l_node_address_text_block = dap_strdup_printf("node_address:\t" NODE_ADDR_FP_STR,NODE_ADDR_FP_ARGS_S(l_tx_out_cond->subtype.srv_stake_pos_delegate.signer_node_addr)); - dap_string_append_printf(l_str_tmp,"%s \n",l_node_address_text_block); - dap_string_append_printf(l_str_tmp,"value:\t\t%s (%s) \n",l_coins,l_balance); - + json_object_object_add(l_json_obj_tx, "node_address", json_object_new_string(l_node_address_text_block)); + json_object_object_add(l_json_obj_tx, "value_coins", json_object_new_string(l_coins)); + json_object_object_add(l_json_obj_tx, "value_datoshi", json_object_new_string(l_balance)); + json_object_array_add(l_json_arr_tx, l_json_obj_tx); DAP_DELETE(l_node_address_text_block); } - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); - dap_string_free(l_str_tmp, true); - DAP_DELETE(l_args); + json_object_array_add(*a_json_arr_reply, l_json_arr_tx); + DAP_DELETE(l_args); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Subcommand '%s' not recognized", a_argv[l_arg_index]); - return -2; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_WRONG_SUB_COMMAND_ERR, "Subcommand '%s' not recognized", a_argv[l_arg_index]); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_WRONG_SUB_COMMAND_ERR; } } break; @@ -3021,58 +3216,60 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) l_arg_index++; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'min_value' requires parameter -net"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'min_value' requires parameter -net"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR, "Network %s not found", l_net_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR; } dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_ANCHOR); if (!l_chain) l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_ANCHOR); if (!l_chain) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "No chain supported anchor datum type"); - return -2; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ANCHOR_NOT_SUPPORT_ERR, "No chain supported anchor datum type"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ANCHOR_NOT_SUPPORT_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-poa_cert", &l_cert_str); if (!l_cert_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'min_value' requires parameter -poa_cert"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'min_value' requires parameter -poa_cert"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } dap_cert_t *l_poa_cert = dap_cert_find_by_name(l_cert_str); if (!l_poa_cert) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate not found"); - return -25; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CERT_ERR, "Specified certificate not found"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CERT_ERR; } if (!s_srv_stake_is_poa_cert(l_net, l_poa_cert->enc_key)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate is not PoA root one"); - return -26; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NOT_POA_ERR, "Specified certificate is not PoA root one"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NOT_POA_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-value", &l_value_str); if (!l_value_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'min_value' requires parameter -value"); - return -9; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'min_value' requires parameter -value"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } uint256_t l_value = dap_chain_balance_scan(l_value_str); if (IS_ZERO_256(l_value)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized number in '-value' param"); - return -10; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Unrecognized number in '-value' param"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } dap_chain_datum_decree_t *l_decree = s_stake_decree_set_min_stake(l_net, l_chain, l_value, l_poa_cert); char *l_decree_hash_str = NULL; if (l_decree && (l_decree_hash_str = s_stake_decree_put(l_decree, l_net))) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Minimum stake value has been set." - " Decree hash %s", l_decree_hash_str); + json_object* l_json_obj_min_val = json_object_new_object(); + json_object_object_add(l_json_obj_min_val, "status", json_object_new_string("success")); + json_object_object_add(l_json_obj_min_val, "decree_hash", json_object_new_string(l_decree_hash_str)); + json_object_array_add(*a_json_arr_reply, l_json_obj_min_val); DAP_DELETE(l_decree); DAP_DELETE(l_decree_hash_str); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Minimum stake value setting failed"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_MIN_STAKE_SET_FAILED_ERR, "Minimum stake value setting failed"); DAP_DEL_Z(l_decree); - return -21; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_MIN_STAKE_SET_FAILED_ERR; } } break; @@ -3083,68 +3280,70 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) l_arg_index++; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'max_weight' requires parameter -net"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'max_weight' requires parameter -net"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR, "Network %s not found", l_net_str); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR; } dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_ANCHOR); if (!l_chain) l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_ANCHOR); if (!l_chain) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "No chain supported anchor datum type"); - return -2; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ANCHOR_NOT_SUPPORT_ERR, "No chain supported anchor datum type"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_ANCHOR_NOT_SUPPORT_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-poa_cert", &l_cert_str); if (!l_cert_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'max_weight' requires parameter -poa_cert"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'max_weight' requires parameter -poa_cert"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } dap_cert_t *l_poa_cert = dap_cert_find_by_name(l_cert_str); if (!l_poa_cert) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate not found"); - return -25; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CERT_ERR, "Specified certificate not found"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NO_CERT_ERR; } if (!s_srv_stake_is_poa_cert(l_net, l_poa_cert->enc_key)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate is not PoA root one"); - return -26; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NOT_POA_ERR, "Specified certificate is not PoA root one"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_NOT_POA_ERR; } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-percent", &l_value_str); if (!l_value_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'max_weight' requires parameter -percent"); - return -9; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Command 'max_weight' requires parameter -percent"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } uint256_t l_value = dap_chain_coins_to_balance(l_value_str); if (IS_ZERO_256(l_value)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized number in '-percent' param"); - return -10; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR, "Unrecognized number in '-percent' param"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PARAM_ERR; } if (compare256(l_value, dap_chain_coins_to_balance("100.0")) >= 0) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Percent must be lower than 100%%"); - return -29; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_PERCENT_ERR, "Percent must be lower than 100%%"); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_PERCENT_ERR; } DIV_256(l_value, GET_256_FROM_64(100), &l_value); dap_chain_datum_decree_t *l_decree = s_stake_decree_set_max_weight(l_net, l_chain, l_value, l_poa_cert); char *l_decree_hash_str = NULL; if (l_decree && (l_decree_hash_str = s_stake_decree_put(l_decree, l_net))) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Maximum weight has been set." - " Decree hash %s", l_decree_hash_str); + json_object* l_json_obj_max_weight = json_object_new_object(); + json_object_object_add(l_json_obj_max_weight, "status", json_object_new_string("success")); + json_object_object_add(l_json_obj_max_weight, "decree_hash", json_object_new_string(l_decree_hash_str)); + json_object_array_add(*a_json_arr_reply, l_json_obj_max_weight); DAP_DELETE(l_decree); DAP_DELETE(l_decree_hash_str); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Maximum weight setting failed"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_MAX_WEIGHT_SET_FAILED_ERR, "Maximum weight setting failed"); DAP_DEL_Z(l_decree); - return -21; + return DAP_CHAIN_NODE_CLI_SRV_STAKE_MAX_WEIGHT_SET_FAILED_ERR; } } break; default: { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command %s not recognized", a_argv[l_arg_index]); - return -1; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_UNRECOGNIZE_COM_ERR, "Command %s not recognized", a_argv[l_arg_index]); + return DAP_CHAIN_NODE_CLI_SRV_STAKE_UNRECOGNIZE_COM_ERR; } } return 0; diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 3f03db28c6eac948f4d8513835fcc04922cce7ef..ce18790e5e56d05d2c77c8e00623cabae4ee7e5c 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -558,7 +558,7 @@ static int block_list_sort_by_date(const void *a, const void *b) */ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) { - json_object **json_arr_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; //char ** a_str_reply = (char **) reply; enum { SUBCMD_UNDEFINED =0, @@ -608,13 +608,13 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) dap_chain_net_t * l_net = NULL; // Parse default values - if (dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&arg_index, a_argc, a_argv, &l_chain, &l_net, CHAIN_TYPE_TX)) + if (dap_chain_node_cli_cmd_values_parse_net_chain_for_json(*a_json_arr_reply, &arg_index, a_argc, a_argv, &l_chain, &l_net, CHAIN_TYPE_TX)) return -DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; const char *l_chain_type = dap_chain_get_cs_type(l_chain); if (!strstr(l_chain_type, "block_") && strcmp(l_chain_type, "esbocs")){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CHAIN_TYPE_ERR, "Type of chain %s is not block. This chain with type %s is not supported by this command", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CHAIN_TYPE_ERR, "Type of chain %s is not block. This chain with type %s is not supported by this command", l_chain->name, l_chain_type); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CHAIN_TYPE_ERR; } @@ -658,7 +658,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) s_cli_parse_cmd_hash(a_argv,arg_index,a_argc,a_str_reply,"-datum", &l_datum_hash ); l_blocks->block_new_size=dap_chain_block_datum_del_by_hash( &l_blocks->block_new, l_blocks->block_new_size, &l_datum_hash ); }else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_DATUM_DEL_ERR, "Error! Can't delete datum from hash because no forming new block! Check pls you role, it must be MASTER NODE or greater"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_DATUM_DEL_ERR, "Error! Can't delete datum from hash because no forming new block! Check pls you role, it must be MASTER NODE or greater"); ret = DAP_CHAIN_NODE_CLI_COM_BLOCK_DATUM_DEL_ERR; } pthread_rwlock_unlock( &PVT(l_blocks)->rwlock ); @@ -670,7 +670,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) sizeof(dap_chain_datum_t*)*l_datums_count); if (!l_datums) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_MEMORY_ERR, "Out of memory in s_cli_blocks"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_MEMORY_ERR, "Out of memory in s_cli_blocks"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_MEMORY_ERR; } size_t l_datum_size = 0; @@ -681,7 +681,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) for (size_t i = 0; i < l_datums_count; i++) { bool l_err = dap_chain_node_mempool_process(l_chain, l_datums[i], l_subcmd_str_arg); if (l_err) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_VERIF_ERR, "Error! Datum %s doesn't pass verifications, examine node log files", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_VERIF_ERR, "Error! Datum %s doesn't pass verifications, examine node log files", l_subcmd_str_arg); ret = DAP_CHAIN_NODE_CLI_COM_BLOCK_VERIF_ERR; } else @@ -691,7 +691,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) break; } json_object* json_obj_out = json_object_new_string("All datums processed"); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); ret = DAP_CHAIN_NODE_CLI_COM_BLOCK_OK; DAP_DEL_Z(l_datums); DAP_DELETE(l_gdb_group_mempool); @@ -712,17 +712,17 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "invalid parameter -H, valid values: -H <hex | base58>"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "invalid parameter -H, valid values: -H <hex | base58>"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } if (!l_subcmd_str_arg) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_HASH_ERR, "Enter block hash "); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_HASH_ERR, "Enter block hash "); return DAP_CHAIN_NODE_CLI_COM_BLOCK_HASH_ERR; } dap_chain_hash_fast_from_str(l_subcmd_str_arg, &l_block_hash); // Convert argument to hash dap_chain_block_cache_t *l_block_cache = dap_chain_block_cache_get_by_hash(l_blocks, &l_block_hash); if (!l_block_cache) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_FIND_ERR, "Can't find block %s ", l_subcmd_str_arg); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_FIND_ERR, "Can't find block %s ", l_subcmd_str_arg); return DAP_CHAIN_NODE_CLI_COM_BLOCK_FIND_ERR; } dap_chain_block_t *l_block = l_block_cache->block; @@ -746,7 +746,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) size_t l_offset = 0; json_object_object_add(json_obj_inf, "Metadata: count", json_object_new_int(l_block->hdr.meta_count)); json_object* json_arr_meta_out = json_object_new_array(); - json_object_array_add(*json_arr_reply, json_obj_inf); + json_object_array_add(*a_json_arr_reply, json_obj_inf); for (uint32_t i=0; i < l_block->hdr.meta_count; i++) { json_object* json_obj_meta = json_object_new_object(); dap_chain_block_meta_t *l_meta = (dap_chain_block_meta_t *)(l_block->meta_n_datum_n_sign + l_offset); @@ -781,10 +781,10 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) json_object_array_add(json_arr_meta_out, json_obj_meta); l_offset += sizeof(l_meta->hdr) + l_meta->hdr.data_size; } - json_object_array_add(*json_arr_reply, json_arr_meta_out); + json_object_array_add(*a_json_arr_reply, json_arr_meta_out); json_object* json_obj_datum = json_object_new_object(); json_object_object_add(json_obj_datum, "Datums: count", json_object_new_uint64(l_block_cache->datum_count)); - json_object_array_add(*json_arr_reply, json_obj_datum); + json_object_array_add(*a_json_arr_reply, json_obj_datum); json_object* json_arr_datum_out = json_object_new_array(); for (uint32_t i=0; i < l_block_cache->datum_count ; i++){ json_object* json_obj_tx = json_object_new_object(); @@ -792,7 +792,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) size_t l_datum_size = dap_chain_datum_size(l_datum); json_object_object_add(json_obj_tx, "datum size ",json_object_new_uint64(l_datum_size)); if (l_datum_size < sizeof (l_datum->header) ){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_DATUM_SIZE_ERR, "ERROR: datum size %zu is smaller than header size %zu \n",l_datum_size, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_DATUM_SIZE_ERR, "ERROR: datum size %zu is smaller than header size %zu \n",l_datum_size, sizeof (l_datum->header)); break; } @@ -805,15 +805,15 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) dap_time_to_str_rfc822(l_time_buf, DAP_TIME_STR_SIZE, l_datum->header.ts_create); json_object_object_add(json_obj_tx, "ts_create",json_object_new_string(l_time_buf)); json_object_object_add(json_obj_tx, "data_size",json_object_new_int(l_datum->header.data_size)); - dap_chain_datum_dump_json(json_obj_tx,l_datum,l_hash_out_type,l_net->pub.id); + dap_chain_datum_dump_json(*a_json_arr_reply, json_obj_tx,l_datum,l_hash_out_type,l_net->pub.id); json_object_array_add(json_arr_datum_out, json_obj_tx); } // Signatures - json_object_array_add(*json_arr_reply, json_arr_datum_out); + json_object_array_add(*a_json_arr_reply, json_arr_datum_out); // Signatures json_object* json_obj_sig = json_object_new_object(); json_object_object_add(json_obj_sig, "signatures count", json_object_new_uint64(l_block_cache->sign_count)); - json_object_array_add(*json_arr_reply, json_obj_sig); + json_object_array_add(*a_json_arr_reply, json_obj_sig); json_object* json_arr_sign_out = json_object_new_array(); for (uint32_t i=0; i < l_block_cache->sign_count ; i++) { json_object* json_obj_sign = json_object_new_object(); @@ -828,7 +828,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) json_object_object_add(json_obj_sign, "pkey_hash",json_object_new_string(l_pkey_hash_str)); json_object_array_add(json_arr_sign_out, json_obj_sign); } - json_object_array_add(*json_arr_reply, json_arr_sign_out); + json_object_array_add(*a_json_arr_reply, json_arr_sign_out); } break; case SUBCMD_LIST:{ @@ -845,8 +845,8 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-pkey_hash", &l_pkey_hash_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-from_hash", &l_from_hash_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-to_hash", &l_to_hash_str); - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-from_dt", &l_from_date_str); - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-to_dt", &l_to_date_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-from_date", &l_from_date_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-to_date", &l_to_date_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-limit", &l_limit_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-offset", &l_offset_str); bool l_head = dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-head", &l_head_str) ? true : false; @@ -854,28 +854,28 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) size_t l_limit = l_limit_str ? strtoul(l_limit_str, NULL, 10) : 0; if (l_signed_flag && l_first_signed_flag) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Choose only one option from 'singed' and 'first_signed'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Choose only one option from 'singed' and 'first_signed'"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } if ((l_signed_flag || l_first_signed_flag) && !l_cert_name && !l_pkey_hash_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Option from '%s' requires parameter '-cert' or 'pkey_hash'", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Option from '%s' requires parameter '-cert' or 'pkey_hash'", l_first_signed_flag ? "first_signed" : "signed"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } if (l_cert_name) { dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_name); if (!l_cert) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR, "Can't find \"%s\" certificate", l_cert_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR, "Can't find \"%s\" certificate", l_cert_name); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR; } l_pub_key = dap_pkey_from_enc_key(l_cert->enc_key); if (!l_pub_key) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PUB_KEY_ERR, "Corrupted certificate \"%s\" have no public key data", l_cert_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PUB_KEY_ERR, "Corrupted certificate \"%s\" have no public key data", l_cert_name); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PUB_KEY_ERR; } } else if (l_pkey_hash_str) { if (dap_chain_hash_fast_from_str(l_pkey_hash_str, &l_pkey_hash)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert \"%s\" to hash", l_pkey_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert \"%s\" to hash", l_pkey_hash_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR; } } @@ -886,13 +886,13 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) if (l_from_hash_str) { if (dap_chain_hash_fast_from_str(l_from_hash_str, &l_from_hash)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert \"%s\" to hash", l_from_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert \"%s\" to hash", l_from_hash_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR; } } if (l_to_hash_str) { if (dap_chain_hash_fast_from_str(l_to_hash_str, &l_to_hash)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert \"%s\" to hash", l_to_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert \"%s\" to hash", l_to_hash_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR; } } @@ -900,14 +900,14 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) if (l_from_date_str) { l_from_time = dap_time_from_str_simplified(l_from_date_str); if (!l_from_time) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert \"%s\" to date", l_from_date_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert \"%s\" to date", l_from_date_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR; } } if (l_to_date_str) { l_to_time = dap_time_from_str_simplified(l_to_date_str); if (!l_to_time) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert \"%s\" to date", l_to_date_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert \"%s\" to date", l_to_date_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR; } struct tm *l_localtime = localtime((time_t *)&l_to_time); @@ -1014,7 +1014,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) if (json_object_object_get_ex(obj, "block", NULL)) json_object_object_add(obj, "block", json_object_new_uint64(i)); } - json_object_array_add(*json_arr_reply, json_arr_bl_cache_out); + json_object_array_add(*a_json_arr_reply, json_arr_bl_cache_out); char *l_filtered_criteria = "none"; json_object* json_obj_out = json_object_new_object(); @@ -1023,7 +1023,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) char *l_key = dap_strdup_printf("%s.%s with filter - %s, have blocks",l_net->pub.name,l_chain->name,l_filtered_criteria); json_object_object_add(json_obj_out, l_key, json_object_new_uint64(i_tmp)); DAP_DELETE(l_key); - json_object_array_add(*json_arr_reply,json_obj_out); + json_object_array_add(*a_json_arr_reply,json_obj_out); } break; case SUBCMD_LAST: { json_object* json_obj_out = json_object_new_object(); @@ -1038,14 +1038,14 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) char *l_key = dap_strdup_printf("%s.%s has blocks", l_net->pub.name, l_chain->name); json_object_object_add(json_obj_out, l_key, json_object_new_uint64(PVT(l_blocks)->blocks_count)); DAP_DELETE(l_key); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } break; case SUBCMD_FIND: { const char* l_datum_hash_str = NULL; json_object* json_obj_out = json_object_new_object(); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-datum", &l_datum_hash_str); if (!l_datum_hash_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'event find' requires parameter '-datum'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'event find' requires parameter '-datum'"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } dap_hash_fast_t l_datum_hash = {}; @@ -1067,14 +1067,14 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) pthread_rwlock_unlock(&PVT(l_blocks)->datums_rwlock); json_object_object_add(json_obj_out, "Blocks", json_arr_bl_cache_out); json_object_object_add(json_obj_out, "Total",json_object_new_int(l_atoms_cnt)); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } break; case SUBCMD_COUNT: { json_object* json_obj_out = json_object_new_object(); char *l_key = dap_strdup_printf("%s.%s has blocks - ", l_net->pub.name,l_chain->name); json_object_object_add(json_obj_out, l_key, json_object_new_uint64(PVT(l_blocks)->blocks_count)); DAP_DELETE(l_key); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } break; @@ -1093,7 +1093,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) if (l_subcmd == SUBCMD_FEE) { if (dap_cli_server_cmd_check_option(a_argv, arg_index, a_argc, "collect") == -1) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block fee' requires subcommand 'collect'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block fee' requires subcommand 'collect'"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } } else { // l_sumcmd == SUBCMD_REWARD @@ -1101,36 +1101,36 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) const char *l_value_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-poa_cert", &l_cert_name); if(!l_cert_name) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block reward set' requires parameter '-poa_cert'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block reward set' requires parameter '-poa_cert'"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_name); if (!l_cert) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR, "Can't find \"%s\" certificate", l_cert_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR, "Can't find \"%s\" certificate", l_cert_name); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR; } if (!l_cert->enc_key || !l_cert->enc_key->priv_key_data || !l_cert->enc_key->priv_key_data_size) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PVT_KEY_ERR, "Certificate \"%s\" doesn't contains private key", l_cert_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PVT_KEY_ERR, "Certificate \"%s\" doesn't contains private key", l_cert_name); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PVT_KEY_ERR; } dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-value", &l_value_str); uint256_t l_value = dap_chain_balance_scan(l_value_str); if (!l_value_str || IS_ZERO_256(l_value)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block reward set' requires parameter '-value' to be valid 256-bit unsigned integer"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block reward set' requires parameter '-value' to be valid 256-bit unsigned integer"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } char *l_decree_hash_str = s_blocks_decree_set_reward(l_net, l_chain, l_value, l_cert); if (l_decree_hash_str) { - //dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_OK, "Decree with hash %s created to set basic block sign reward", l_decree_hash_str); + //dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_OK, "Decree with hash %s created to set basic block sign reward", l_decree_hash_str); json_object* json_obj_out = json_object_new_object(); char *l_val = dap_strdup_printf("Decree with hash %s created to set basic block sign reward", l_decree_hash_str); DAP_DELETE(l_decree_hash_str); json_object_object_add(json_obj_out, "status", json_object_new_string(l_val)); DAP_DELETE(l_val); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_SIGN_ERR, "Basic block sign reward setting failed. Examine log file for details"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_SIGN_ERR, "Basic block sign reward setting failed. Examine log file for details"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_SIGN_ERR; } break; @@ -1141,10 +1141,10 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) char *l_val = dap_strdup_printf("Current base block reward is %s\n", l_reward_str); json_object_object_add(json_obj_out, "status", json_object_new_string(l_val)); DAP_DELETE(l_val); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); break; } else if (dap_cli_server_cmd_check_option(a_argv, arg_index, a_argc, "collect") == -1) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block reward' requires subcommands 'set' or 'show' or 'collect'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block reward' requires subcommands 'set' or 'show' or 'collect'"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } } @@ -1154,7 +1154,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "invalid parameter -H, valid values: -H <hex | base58>"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "invalid parameter -H, valid values: -H <hex | base58>"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } @@ -1166,42 +1166,42 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-fee", &l_fee_value_str); if (!l_addr_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block %s collect' requires parameter '-addr'", l_subcmd_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block %s collect' requires parameter '-addr'", l_subcmd_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } l_addr = dap_chain_addr_from_str(l_addr_str); if(!l_cert_name) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block %s collect' requires parameter '-cert'", l_subcmd_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block %s collect' requires parameter '-cert'", l_subcmd_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_name); if (!l_cert) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR, "Can't find \"%s\" certificate", l_cert_name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR, "Can't find \"%s\" certificate", l_cert_name); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR; } if (!l_cert->enc_key || !l_cert->enc_key->priv_key_data || !l_cert->enc_key->priv_key_data_size) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR, "Certificate \"%s\" doesn't contains private key", l_cert_name); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR; } if (!l_fee_value_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block %s collect' requires parameter '-fee'", l_subcmd_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block %s collect' requires parameter '-fee'", l_subcmd_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } l_fee_value = dap_chain_balance_scan(l_fee_value_str); if (!l_fee_value_str || IS_ZERO_256(l_fee_value)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block %s collect' requires parameter '-fee' to be valid uint256", l_subcmd_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block %s collect' requires parameter '-fee' to be valid uint256", l_subcmd_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } if (!l_hash_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block fee collect' requires parameter '-hashes'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block fee collect' requires parameter '-hashes'"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } // NOTE: This call will modify source string l_block_list = s_block_parse_str_list((char *)l_hash_str, &l_hashes_count, l_chain); if (!l_block_list || !l_hashes_count) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_HASH_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_HASH_ERR, "Block fee collection requires at least one hash to create a transaction"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_HASH_ERR; } @@ -1215,9 +1215,10 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) DAP_DELETE(l_hash_tx); json_object_object_add(json_obj_out, "status", json_object_new_string(l_val ? l_val : "(null)")); DAP_DELETE(l_val); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); + DAP_DELETE(l_hash_tx); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_HASH_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_HASH_ERR, "Can't create %s collect TX\n", l_subcmd_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_HASH_ERR; } @@ -1231,36 +1232,36 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) if (dap_cli_server_cmd_check_option(a_argv, arg_index,a_argc, "renew") > 0) { dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-cert", &l_cert_name); if(!l_cert_name) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block autocollect renew' requires parameter '-cert'", l_subcmd_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_name); if (!l_cert) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR, "Can't find \"%s\" certificate", l_cert_name); return DAP_CHAIN_NODE_CLI_COM_BLOCK_CERT_ERR; } dap_pkey_t *l_pub_key = dap_pkey_from_enc_key(l_cert->enc_key); if (!l_pub_key) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PUB_KEY_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PUB_KEY_ERR, "Corrupted certificate \"%s\" have no public key data", l_cert_name); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PUB_KEY_ERR; } dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_str); if (!l_addr_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block autocollect renew' requires parameter '-addr'", l_subcmd_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } dap_chain_addr_t *l_addr = dap_chain_addr_from_str(l_addr_str); if (!l_addr) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_CONVERT_ERR, "Can't convert sring %s to wallet address", l_addr_str); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } if (l_addr->net_id.uint64 != l_net->pub.id.uint64) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_NET_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_NET_ERR, "Wallet address should be from the collecting network"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_NET_ERR; } @@ -1342,21 +1343,21 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) json_object_array_add(json_arr_bl_out, json_obj_bl); l_block_count++; } - json_object_array_add(*json_arr_reply, json_arr_bl_out); + json_object_array_add(*a_json_arr_reply, json_arr_bl_out); json_object* json_obj_out = json_object_new_object(); char *l_val = dap_strdup_printf("%s.%s: Have %"DAP_UINT64_FORMAT_U" blocks\n", l_net->pub.name, l_chain->name, l_block_count); json_object_object_add(json_obj_out, "status", json_object_new_string(l_val)); DAP_DELETE(l_val); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } else { if (dap_cli_server_cmd_check_option(a_argv, arg_index, a_argc, "status") == -1) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'block autocollect' requires subcommand 'status'"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } json_object* json_obj_out = json_object_new_object(); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); bool l_status = dap_chain_esbocs_get_autocollect_status(l_net->pub.id); char *l_val = dap_strdup_printf("for network %s is %s\n", l_net->pub.name, l_status ? "active" : "inactive cause of the network config or consensus starting problems"); @@ -1375,7 +1376,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) char *l_val = dap_strdup_printf("Undefined block subcommand \"%s\" ", l_subcmd_str); json_object_object_add(json_obj_out, "status", json_object_new_string(l_val)); DAP_DELETE(l_val); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); ret = DAP_CHAIN_NODE_CLI_COM_BLOCK_UNKNOWN; } break; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index f81527ebc8f6906e4f61ca7c40e46ac24502da41..2ed4ade008364f8bc4ee883ccea668fbcf78403d 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -1305,7 +1305,7 @@ static void s_json_dag_pack_event(json_object * a_json_out, dap_chain_cs_dag_eve */ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) { - json_object **json_arr_reply = (json_object **)a_str_reply; + json_object **a_json_arr_reply = (json_object **)a_str_reply; enum { SUBCMD_EVENT_LIST, SUBCMD_EVENT_DUMP, @@ -1341,11 +1341,11 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR,"invalid parameter -H, valid values: -H <hex | base58>"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR,"invalid parameter -H, valid values: -H <hex | base58>"); return -DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR; } - if(dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&arg_index, argc, argv, &l_chain, &l_net,CHAIN_TYPE_TX) < 0) + if(dap_chain_node_cli_cmd_values_parse_net_chain_for_json(a_json_arr_reply, &arg_index, argc, argv, &l_chain, &l_net,CHAIN_TYPE_TX) < 0) return -DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR; if ((l_net == NULL) || (l_chain == NULL)){ @@ -1356,7 +1356,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) const char *l_chain_type = dap_chain_get_cs_type(l_chain); if (!strstr(l_chain_type, "dag_")){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_CHAIN_TYPE_ERR,"Type of chain %s is not dag. This chain with type %s is not supported by this command", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_CHAIN_TYPE_ERR,"Type of chain %s is not dag. This chain with type %s is not supported by this command", l_chain->name, l_chain_type); return -DAP_CHAIN_NODE_CLI_COM_DAG_CHAIN_TYPE_ERR; } @@ -1394,7 +1394,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) dap_hash_fast(l_event, l_event_size, &l_event_hash); int l_ret_event_verify; if ( ( l_ret_event_verify = l_dag->callback_cs_verify(l_dag, l_event, &l_event_hash) ) !=0 ) {// if consensus accept the event - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_EVENT_ERR,"Error! Event %s is not passing consensus verification, ret code %d\n", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_EVENT_ERR,"Error! Event %s is not passing consensus verification, ret code %d\n", l_objs[i].key, l_ret_event_verify ); ret = -DAP_CHAIN_NODE_CLI_COM_DAG_EVENT_ERR; break; @@ -1431,7 +1431,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) // Cleaning up dap_global_db_objs_delete(l_objs, l_objs_size); - json_object_array_add(*json_arr_reply, json_obj_round); + json_object_array_add(*a_json_arr_reply, json_obj_round); // Spread new mempool changes and dag events in network - going to SYNC_ALL // dap_chain_net_sync_all(l_net); @@ -1446,14 +1446,14 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) l_datum_in_hash = dap_enc_base58_to_hex_str_from_str(l_datum_hash_str); } } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR,"The -datum option was not specified, so " + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR,"The -datum option was not specified, so " "no datum is known to look for in rounds.\n"); return 0; } dap_hash_fast_t l_datum_hash = {0}; dap_chain_hash_fast_from_str(l_datum_in_hash, &l_datum_hash); if (dap_hash_fast_is_blank(&l_datum_hash)) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR,"The -datum parameter is not a valid hash.\n"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR,"The -datum parameter is not a valid hash.\n"); return 0; } size_t l_objs_size = 0; @@ -1551,7 +1551,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) l_event = l_event_item->event; else { ret = -DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR; - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event %s in events_last table\n", l_event_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event %s in events_last table\n", l_event_hash_str); break; } } else if (!l_from_events_str || strcmp(l_from_events_str,"events") == 0) { @@ -1564,7 +1564,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) l_event_size = l_event_item->event_size; } else { ret = -DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR; - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event %s in events table\n", l_event_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event %s in events table\n", l_event_hash_str); break; } } else if (l_from_events_str && strcmp(l_from_events_str,"threshold") == 0) { @@ -1576,12 +1576,12 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) l_event = l_event_item->event; else { ret = -DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR; - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event %s in threshold table\n", l_event_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event %s in threshold table\n", l_event_hash_str); break; } } else { ret = -DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR; - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR, "Wrong events_from option \"%s\", need one of variant: events, round.new, events_lasts, threshold", l_from_events_str); break; @@ -1642,7 +1642,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) dap_sign_t * l_sign =(dap_sign_t *) (l_event->hashes_n_datum_n_signs +l_offset); size_t l_sign_size = dap_sign_get_size(l_sign); if (l_sign_size == 0 ){ - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR," wrong sign size 0, stop parsing headers"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR," wrong sign size 0, stop parsing headers"); break; } dap_chain_hash_fast_t l_pkey_hash; @@ -1656,12 +1656,12 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) l_offset += l_sign_size; } - dap_chain_datum_dump_json(json_obj_event, l_datum, l_hash_out_type, l_net->pub.id); - json_object_array_add(*json_arr_reply, json_obj_event); + dap_chain_datum_dump_json(a_json_arr_reply, json_obj_event, l_datum, l_hash_out_type, l_net->pub.id); + json_object_array_add(*a_json_arr_reply, json_obj_event); ret=0; }else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event 0x%s in the new forming round ", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event 0x%s in the new forming round ", l_event_hash_str); ret=-10; } @@ -1704,10 +1704,10 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) dap_global_db_objs_delete(l_objs, l_objs_count); ret = 0; } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_GLOBALDB_ERR, "%s.%s: Error! No GlobalDB group!\n", l_net->pub.name, l_chain->name); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_GLOBALDB_ERR, "%s.%s: Error! No GlobalDB group!\n", l_net->pub.name, l_chain->name); ret = -2; } - json_object_array_add(*json_arr_reply, json_obj_event_list); + json_object_array_add(*a_json_arr_reply, json_obj_event_list); } else if (!l_from_events_str || (strcmp(l_from_events_str,"events") == 0)) { pthread_mutex_lock(&PVT(l_dag)->events_mutex); size_t l_arr_start = 0; @@ -1746,7 +1746,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) json_object_object_add(json_obj_event_list,"chain", json_object_new_string(l_chain->name)); json_object_object_add(json_obj_event_list,"total events", json_object_new_uint64(l_events_count)); - json_object_array_add(*json_arr_reply, json_obj_event_list); + json_object_array_add(*a_json_arr_reply, json_obj_event_list); }else if (l_from_events_str && (strcmp(l_from_events_str,"threshold") == 0) ){ pthread_mutex_lock(&PVT(l_dag)->events_mutex); dap_chain_cs_dag_event_item_t * l_event_item = NULL,*l_event_item_tmp = NULL; @@ -1783,10 +1783,10 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) json_object_object_add(json_obj_event_list,"chain", json_object_new_string(l_chain->name)); json_object_object_add(json_obj_event_list,"total events", json_object_new_uint64(l_events_count)); - json_object_array_add(*json_arr_reply, json_obj_event_list); + json_object_array_add(*a_json_arr_reply, json_obj_event_list); }else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_UNDEF_ERR, "Undefined events source for listing "); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_UNDEF_ERR, "Undefined events source for listing "); ret=-14; } @@ -1805,7 +1805,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) size_t l_event_treshold_count = HASH_COUNT(PVT(l_dag)->events_treshold); json_object_object_add(json_obj_event_count,"atom in events", json_object_new_uint64(l_event_count)); json_object_object_add(json_obj_event_count,"atom in threshold", json_object_new_uint64(l_event_treshold_count)); - json_object_array_add(*json_arr_reply, json_obj_event_count); + json_object_array_add(*a_json_arr_reply, json_obj_event_count); } break; case SUBCMD_EVENT_LAST:{ json_object * json_obj_out = json_object_new_object(); @@ -1824,14 +1824,14 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) size_t l_event_count = HASH_COUNT(PVT(l_dag)->events); sprintf(l_tmp_buff,"%s.%s has events", l_net->pub.name, l_chain->name); json_object_object_add(json_obj_out, l_tmp_buff, json_object_new_uint64(l_event_count)); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } break; case SUBCMD_EVENT_FIND:{ const char* l_datum_hash_str = NULL; json_object* json_obj_out = json_object_new_object(); dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str); if (!l_datum_hash_str) { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR, "Command 'event find' requires parameter '-datum'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR, "Command 'event find' requires parameter '-datum'"); ret = DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR; } dap_hash_fast_t l_datum_hash = {}; @@ -1855,7 +1855,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) pthread_mutex_unlock(&PVT(l_dag)->events_mutex); json_object_object_add(json_obj_out, "Events", json_arr_bl_cache_out); json_object_object_add(json_obj_out, "Total",json_object_new_int(l_atoms_cnt)); - json_object_array_add(*json_arr_reply, json_obj_out); + json_object_array_add(*a_json_arr_reply, json_obj_out); } break; case SUBCMD_EVENT_SIGN: { // Sign event command json_object * json_obj_event_count = json_object_new_object(); @@ -1890,33 +1890,33 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) json_object_array_add(json_arr_obj_event, json_obj_sign); json_object_object_add(json_obj_event_count,"Added new sign with cert, event placed back in round.new", json_arr_obj_event); - json_object_array_add(*json_arr_reply, json_obj_event_count); + json_object_array_add(*a_json_arr_reply, json_obj_event_count); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR,"GDB Error: Can't place event %s with new sign back in round.new\n", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR,"GDB Error: Can't place event %s with new sign back in round.new\n", l_event_new_hash_base58_str ? l_event_new_hash_base58_str : l_event_new_hash_hex_str); ret = -DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR; } DAP_DELETE(l_event); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR,"Can't sign event %s in round.new\n", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR,"Can't sign event %s in round.new\n", l_event_hash_str); ret=-DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR; } } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_CERT_ERR,"No valid certificate provided for event %s signing\n", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_CERT_ERR,"No valid certificate provided for event %s signing\n", l_event_hash_str); ret = -DAP_CHAIN_NODE_CLI_COM_DAG_CERT_ERR; } DAP_DELETE(l_round_item); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_FIND_EVENT_ERR,"Can't find event %s in round.new - only place where could be signed the new event\n", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_FIND_EVENT_ERR,"Can't find event %s in round.new - only place where could be signed the new event\n", l_event_hash_str); ret = -DAP_CHAIN_NODE_CLI_COM_DAG_FIND_EVENT_ERR; } } break; case SUBCMD_UNDEFINED: { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_UNKNOWN,"Undefined event subcommand \"%s\" ", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_UNKNOWN,"Undefined event subcommand \"%s\" ", l_event_cmd_str); ret=-DAP_CHAIN_NODE_CLI_COM_DAG_UNKNOWN; } @@ -1926,7 +1926,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) DAP_DEL_Z(l_event_hash_hex_str); DAP_DEL_Z(l_event_hash_base58_str); } else { - dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_UNDEF_SUB_ERR,"Undefined subcommand"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_DAG_UNDEF_SUB_ERR,"Undefined subcommand"); ret = -DAP_CHAIN_NODE_CLI_COM_DAG_UNDEF_SUB_ERR; } return ret;