diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index ecc80109b02ee3e36b83bdad6be0bc4668f43400..a921e72e2c747fde3e808bba8fe5b6888d4c4ff5 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -1975,6 +1975,7 @@ int com_help(int a_argc, char **a_argv, void **a_str_reply) */ int com_tx_wallet(int a_argc, char **a_argv, void **a_str_reply) { +json_object ** json_arr_reply = (json_object **) 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; @@ -1996,9 +1997,9 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; l_arg_index++; if(cmd_num == CMD_NONE) { - dap_cli_server_cmd_set_reply_text (a_str_reply, + dap_json_rpc_error_add(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 -1; + return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PARAM_ERR; } const char *l_addr_str = NULL, *l_wallet_name = NULL, *l_net_name = NULL, *l_sign_type_str = NULL, *l_restore_str = NULL, @@ -2013,20 +2014,26 @@ 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_cli_server_cmd_set_reply_text(a_str_reply, "Wallet name must contains digits and aplhabetical symbols"); - return -1; + dap_json_rpc_error_add(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; } dap_chain_net_t * l_net = l_net_name ? dap_chain_net_by_name(l_net_name) : NULL; - dap_string_t *l_string_ret = dap_string_new(NULL); + //dap_string_t *l_string_ret = dap_string_new(NULL); dap_chain_wallet_t *l_wallet = NULL; dap_chain_addr_t *l_addr = NULL; if(l_net_name && !l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Not found net by name '%s'", l_net_name); - return -1; + dap_json_rpc_error_add(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; + } + json_object * json_obj_out = NULL; + json_object * json_arr_out = json_object_new_array(); + if (!json_arr_out) { + return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_MEMORY_ERR; } - switch (cmd_num) { // wallet list case CMD_WALLET_LIST: { @@ -2035,6 +2042,11 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; struct dirent * l_dir_entry = NULL; while( (l_dir_entry = readdir(l_dir)) ) { + json_object * json_obj_wall = json_object_new_object(); + if (!json_obj_wall) { + json_object_put(json_arr_out); + return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_MEMORY_ERR; + } const char *l_file_name = l_dir_entry->d_name; size_t l_file_name_len = (l_file_name) ? strlen(l_file_name) : 0; @@ -2047,22 +2059,29 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; if (l_wallet) { l_addr = l_net ? dap_chain_wallet_get_addr(l_wallet, l_net->pub.id) : NULL; char *l_addr_str = dap_chain_addr_to_str(l_addr); - - dap_string_append_printf(l_string_ret, "Wallet: %.*s%s %s\n", (int) l_file_name_len - 8, l_file_name, - (l_wallet->flags & DAP_WALLET$M_FL_ACTIVE) ? " (Active)" : "", - dap_chain_wallet_check_sign(l_wallet)); - + json_object_object_add(json_obj_wall, "Wallet", json_object_new_string(l_file_name)); + if(l_wallet->flags & DAP_WALLET$M_FL_ACTIVE) + json_object_object_add(json_obj_wall, "status", json_object_new_string("Active")); + else + json_object_object_add(json_obj_wall, "status", json_object_new_string("not active")); + json_object_object_add(json_obj_wall, "sign_status", json_object_new_string( + strlen(dap_chain_wallet_check_sign(l_wallet))!=0 ? + dap_chain_wallet_check_sign(l_wallet) : "correct")); if (l_addr_str) { - dap_string_append_printf(l_string_ret, "addr: %s\n", (l_addr_str) ? l_addr_str : "-"); - DAP_DELETE(l_addr_str); + json_object_object_add(json_obj_wall, "addr", json_object_new_string(l_addr_str)); } dap_chain_wallet_close(l_wallet); - } else dap_string_append_printf(l_string_ret, "Wallet: %.*s (non-Active)\n", (int) l_file_name_len - 8, l_file_name); + } else{ + json_object_object_add(json_obj_wall, "Wallet", json_object_new_string(l_file_name)); + json_object_object_add(json_obj_wall, "status", json_object_new_string("can't open")); + } } else if ((l_file_name_len > 7) && (!strcmp(l_file_name + l_file_name_len - 7, ".backup"))) { - dap_string_append_printf(l_string_ret, "Wallet: %.*s (Backup)\n", (int) l_file_name_len - 7, l_file_name); + json_object_object_add(json_obj_wall, "Wallet", json_object_new_string(l_file_name)); + json_object_object_add(json_obj_wall, "status", json_object_new_string("Backup")); } + json_object_array_add(json_arr_out, json_obj_wall); } closedir(l_dir); } @@ -2072,15 +2091,17 @@ 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_cli_server_cmd_set_reply_text(a_str_reply, "You should use either the -w or -addr option for the wallet info command."); - dap_string_free(l_string_ret, true); - return -1; + dap_json_rpc_error_add(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_cli_server_cmd_set_reply_text(a_str_reply, "Subcommand info requires parameter '-net'"); - dap_string_free(l_string_ret, true); - return -1; + dap_json_rpc_error_add(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; } l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path); l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet, l_net->pub.id ); @@ -2091,51 +2112,59 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; if (!l_addr){ if(l_wallet) dap_chain_wallet_close(l_wallet); - dap_string_free(l_string_ret, true); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet not found"); - return -1; + dap_json_rpc_error_add(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; } else { l_net = dap_chain_net_by_id(l_addr->net_id); if(l_net) { l_ledger = l_net->pub.ledger; l_net_name = l_net->pub.name; } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't find network id 0x%016"DAP_UINT64_FORMAT_X" from address %s", - l_addr->net_id.uint64, l_addr_str); - dap_string_free(l_string_ret, true); - return -1; + dap_json_rpc_error_add(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); + return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_ERR; } } - + json_object * json_obj_wall = json_object_new_object(); char *l_l_addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) l_addr); if(l_wallet) - dap_string_append_printf(l_string_ret, "%swallet: %s\n", dap_chain_wallet_check_sign(l_wallet), l_wallet->name); - dap_string_append_printf(l_string_ret, "addr: %s\n", (l_l_addr_str) ? l_l_addr_str : "-"); - dap_string_append_printf(l_string_ret, "network: %s\n", (l_net_name ) ? l_net_name : "-"); + { + json_object_object_add(json_obj_wall, "sign", json_object_new_string( + strlen(dap_chain_wallet_check_sign(l_wallet))!=0 ? + dap_chain_wallet_check_sign(l_wallet) : "correct")); + json_object_object_add(json_obj_wall, "nwallet", json_object_new_string(l_wallet->name)); + } + json_object_object_add(json_obj_wall, "addr", (l_l_addr_str) ? json_object_new_string(l_l_addr_str) : json_object_new_string("-")); + json_object_object_add(json_obj_wall, "network", (l_net_name) ? json_object_new_string(l_net_name) : json_object_new_string("-")); size_t l_l_addr_tokens_size = 0; char **l_l_addr_tokens = NULL; dap_ledger_addr_get_token_ticker_all(l_ledger, l_addr, &l_l_addr_tokens, &l_l_addr_tokens_size); - if(l_l_addr_tokens_size > 0) - dap_string_append_printf(l_string_ret, "balance:\n"); - else - dap_string_append_printf(l_string_ret, "balance: 0"); - + if(l_l_addr_tokens_size <= 0) + json_object_object_add(json_obj_wall, "balance", json_object_new_string("0")); + json_object * j_arr_balance= json_object_new_array(); for(size_t i = 0; i < l_l_addr_tokens_size; i++) { if(l_l_addr_tokens[i]) { + json_object * j_balance_data = json_object_new_object(); uint256_t l_balance = dap_ledger_calc_balance(l_ledger, l_addr, l_l_addr_tokens[i]); char *l_balance_coins = dap_chain_balance_to_coins(l_balance); char *l_balance_datoshi = dap_chain_balance_print(l_balance); - dap_string_append_printf(l_string_ret, "\t%s (%s) %s\n", l_balance_coins, - l_balance_datoshi, l_l_addr_tokens[i]); - if(i < l_l_addr_tokens_size - 1) - dap_string_append_printf(l_string_ret, "\n"); + json_object_object_add(j_balance_data, "balance", json_object_new_string("")); + json_object_object_add(j_balance_data, "coins", json_object_new_string(l_balance_coins)); + json_object_object_add(j_balance_data, "datoshi", json_object_new_string(l_balance_datoshi)); + json_object_object_add(j_balance_data, "token", json_object_new_string(l_l_addr_tokens[i])); DAP_DELETE(l_balance_coins); DAP_DELETE(l_balance_datoshi); - + json_object_array_add(j_arr_balance, j_balance_data); } DAP_DELETE(l_l_addr_tokens[i]); } + json_object_object_add(json_obj_wall, "tokens", j_arr_balance); + json_object_array_add(json_arr_out, json_obj_wall); DAP_DELETE(l_l_addr_tokens); DAP_DELETE(l_l_addr_str); if(l_wallet) @@ -2144,22 +2173,28 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; } default: { if( !l_wallet_name ) { - dap_string_free(l_string_ret, true); - return dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet name option <-w> not defined"), -EINVAL; + dap_json_rpc_error_add(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_string_free(l_string_ret, true); - return dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet password option <-password> not defined"), -EINVAL; + dap_json_rpc_error_add(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_cli_server_cmd_set_reply_text(a_str_reply, "Wallet's password is too long ( > %d)", DAP_WALLET$SZ_PASS); + dap_json_rpc_error_add(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); - dap_string_free(l_string_ret, true); - return -EINVAL; + json_object_put(json_arr_out); + return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_TO_LONG_ERR; } switch (cmd_num) { case CMD_WALLET_ACTIVATE: case CMD_WALLET_DEACTIVATE: { + json_object * json_obj_wall = json_object_new_object(); const char *l_prefix = cmd_num == CMD_WALLET_ACTIVATE ? "" : "de"; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-ttl", &l_ttl_str); l_rc = l_ttl_str ? strtoul(l_ttl_str, NULL, 10) : 60; @@ -2170,52 +2205,68 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; switch (l_rc) { case 0: - dap_string_append_printf(l_string_ret, "Wallet %s is %sactivated\n", l_wallet_name, l_prefix); + json_object_object_add(json_obj_wall, "Wallet name", json_object_new_string(l_wallet_name)); + json_object_object_add(json_obj_wall, "protection", CMD_WALLET_ACTIVATE ? + json_object_new_string("is activated") : json_object_new_string("is deactivated")); break; case -EBUSY: - dap_string_append_printf(l_string_ret, "Error: wallet %s is already %sactivated\n", l_wallet_name, l_prefix); + dap_json_rpc_error_add(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_string_append_printf(l_string_ret, "Error: wrong password for wallet %s\n", l_wallet_name); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR, + "Error: wrong password for wallet %s\n", l_wallet_name); break; default: { char l_buf[512] = { '\0' }; strerror_r(l_rc, l_buf, sizeof(l_buf) - 1); - dap_string_append_printf(l_string_ret, "Wallet %s %sactivation error %d : %s\n", l_wallet_name, l_prefix, l_rc, l_buf); + dap_json_rpc_error_add(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; } } + json_object_array_add(json_arr_out, json_obj_wall); } break; // convert wallet case CMD_WALLET_CONVERT: { l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path); if (!l_wallet) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "wrong password"); - return -1; + dap_json_rpc_error_add(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_cli_server_cmd_set_reply_text(a_str_reply, "Wallet can't be converted twice"); - dap_string_free(l_string_ret, true); - return -1; + dap_json_rpc_error_add(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; } // create wallet backup 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_cli_server_cmd_set_reply_text(a_str_reply, "Can't create backup wallet file because of internal error"); - dap_string_free(l_string_ret, true); - return -1; + dap_json_rpc_error_add(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; } // 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_cli_server_cmd_set_reply_text(a_str_reply, "Wallet is not converted because of internal error"); - dap_string_free(l_string_ret, true); - return -1; + dap_json_rpc_error_add(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; } - + json_object * json_obj_wall = json_object_new_object(); log_it(L_INFO, "Wallet %s has been converted", l_wallet_name); - dap_string_append_printf(l_string_ret, "%sWallet: %s successfully converted\n", dap_chain_wallet_check_sign(l_wallet), l_wallet_name); + json_object_object_add(json_obj_wall, "Sign wallet", json_object_new_string( + strlen(dap_chain_wallet_check_sign(l_wallet))!=0 ? + dap_chain_wallet_check_sign(l_wallet) : "correct")); + json_object_object_add(json_obj_wall, "Wallet name", json_object_new_string(l_wallet_name)); + json_object_object_add(json_obj_wall, "Status", json_object_new_string("successfully converted")); dap_chain_wallet_close(l_wallet); + json_object_array_add(json_arr_out, json_obj_wall); break; } // new wallet @@ -2249,9 +2300,10 @@ 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_cli_server_cmd_set_reply_text(a_str_reply, "Unknown signature type, please use:\n sig_picnic\n sig_dil\n sig_falcon\n sig_multi_chained\n "); - dap_string_free(l_string_ret, true); - return -1; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, + "Unknown signature type, please use:\n sig_picnic\n sig_dil\n sig_falcon\n sig_multi\n sig_multi2\n",l_wallet_name); + json_object_put(json_arr_out); + return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR; } if (l_sign_types[0].type == SIG_TYPE_MULTI_CHAINED) { int l_sign_index = dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, l_sign_type_str, NULL); @@ -2264,9 +2316,10 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; l_sign_count++; } if (!l_sign_count) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Unknown signature type, please use:\n sig_picnic\n sig_dil\n sig_falcon\n sig_multi_chained\n "); - dap_string_free(l_string_ret, true); - return -1; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, + "Unknown signature type, please use:\n sig_picnic\n sig_dil\n sig_falcon\n sig_multi\n sig_multi2\n",l_wallet_name); + json_object_put(json_arr_out); + return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR; } } else { l_sign_count = 1; @@ -2277,11 +2330,14 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; for (size_t i = 0; i < l_sign_count; ++i) { if (l_sign_types[i].type == SIG_TYPE_TESLA || l_sign_types[i].type == SIG_TYPE_BLISS|| l_sign_types[i].type == SIG_TYPE_PICNIC) { if (l_restore_opt || l_restore_legacy_opt) { - dap_string_append_printf(l_string_ret, "CAUTION!!! CAUTION!!! CAUTION!!!\nThe Bliss, Tesla and Picnic signatures is deprecated. We recommend you to create a new wallet with another available signature and transfer funds there.\n"); + dap_json_rpc_error_add(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_string_free(l_string_ret, true); - return dap_cli_server_cmd_set_reply_text(a_str_reply, "The Bliss, Tesla and Picnic signature algorithms is no longer supported, please, use another variant"), -1; + dap_json_rpc_error_add(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; } } } @@ -2295,17 +2351,19 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; l_seed = DAP_NEW_Z_SIZE(uint8_t, l_seed_size); if(!l_seed) { log_it(L_CRITICAL, "Memory allocation error"); - dap_string_free(l_string_ret, true); - return -1; + json_object_put(json_arr_out); + return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_MEMORY_ERR; } dap_hex2bin(l_seed, l_restore_str + 2, l_restore_str_size - 2); if (l_restore_legacy_opt) { - dap_string_append_printf(l_string_ret, "CAUTION!!! CAUTION!!! CAUTION!!!\nYour wallet has a low level of protection. Please create a new wallet again with the option -restore\n"); + dap_json_rpc_error_add(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_cli_server_cmd_set_reply_text(a_str_reply, "Restored hash is invalid or too short, wallet is not created. Please use -restore 0x<hex_value> or -restore_legacy 0x<restore_string>"); - dap_string_free(l_string_ret, true); - return -1; + dap_json_rpc_error_add(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; } } @@ -2314,18 +2372,24 @@ 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_string_free(l_string_ret, true); - return dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet is not created because of internal error. Check name or password length (max 64 chars)"), -1; + dap_json_rpc_error_add(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; } l_addr = l_net ? dap_chain_wallet_get_addr(l_wallet,l_net->pub.id ) : NULL; char *l_l_addr_str = l_addr ? dap_chain_addr_to_str(l_addr) : NULL; - dap_string_append_printf(l_string_ret, "Wallet: %s (type=%s) successfully created\n", l_wallet->name, l_sign_type_str); + json_object * json_obj_wall = json_object_new_object(); + json_object_object_add(json_obj_wall, "Wallet name", json_object_new_string(l_wallet->name)); + json_object_object_add(json_obj_wall, "Sign type", json_object_new_string(l_sign_type_str)); + json_object_object_add(json_obj_wall, "Status", json_object_new_string("successfully created")); if ( l_l_addr_str ) { - dap_string_append_printf(l_string_ret, "new address %s", l_l_addr_str); + json_object_object_add(json_obj_wall, "new address", json_object_new_string(l_l_addr_str)); DAP_DELETE(l_l_addr_str); } + json_object_array_add(json_arr_out, json_obj_wall); dap_chain_wallet_close(l_wallet); break; } @@ -2333,7 +2397,11 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; } } - *a_str_reply = dap_string_free(l_string_ret, false); + if (json_arr_out) { + json_object_array_add(*json_arr_reply, json_arr_out); + } else { + json_object_array_add(*json_arr_reply, json_object_new_string("empty")); + } return 0; } diff --git a/modules/net/include/dap_chain_node_cli_cmd.h b/modules/net/include/dap_chain_node_cli_cmd.h index 9d0d7252cfe9df7ce12e3ca49a81db5a81c5698f..1ece69c544abb03ce69dcfb6cf7f0f642676ad69 100644 --- a/modules/net/include/dap_chain_node_cli_cmd.h +++ b/modules/net/include/dap_chain_node_cli_cmd.h @@ -100,6 +100,30 @@ int com_token_update_sign(int argc, char ** argv, void **a_str_reply); */ int com_token_emit (int a_argc, char **a_argv, void **a_str_reply); +typedef enum s_com_tx_wallet_err{ + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_MEMORY_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PARAM_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_FOUND_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PASS_TO_LONG_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_ADDR_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_ALREADY_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_ACTIVE_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_CONVERT_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_BACKUP_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PROTECTION_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_HASH_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_CHAIN_PARAM_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_WALLET_INTERNAL_ERR, + + /* add custom codes here */ + + DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */ +} s_com_tx_wallet_err_t; /** * com_tx_create command @@ -143,7 +167,7 @@ typedef enum s_com_tx_history_err{ /* add custom codes here */ - DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */ + //DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */ } s_com_tx_history_err_t; char *dap_chain_node_cli_com_tx_history_err(int a_code);