diff --git a/dap-sdk b/dap-sdk index bf5454ceadc27aa0d053fb593833f960c008485b..ca3f2ee9fcee947212cbe88403fcf9018d67329a 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit bf5454ceadc27aa0d053fb593833f960c008485b +Subproject commit ca3f2ee9fcee947212cbe88403fcf9018d67329a diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h index e1a0550c9edd8b70c71e854e752bf4949a2203dd..b1eb88165ea4980b4862e5fa581796adf3c70baf 100644 --- a/modules/net/include/dap_chain_node.h +++ b/modules/net/include/dap_chain_node.h @@ -77,7 +77,12 @@ typedef enum dap_chain_node_cli_cmd_values_parse_net_chain_err_to_json { DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CONFIG_DEFAULT_DATUM, DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_CONVERT_BASE58_TO_ADDR_WALLET, 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_VALUE_PARSE_CAN_NOT_FIND_DEFAULT_CHAIN_WITH_TYPE, + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_LEDGER_TOKEN_TICKER, + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_UNKNOWN_TOKEN_TYPE, + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_FLAG_UNDEF, + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_REQUIRES_PARAM, + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_PARAMS_MUST_BE_UNSIGNED } dap_chain_node_cli_cmd_values_parse_net_chain_err_to_json; /** diff --git a/modules/node-cli/dap_chain_node_cli_cmd.c b/modules/node-cli/dap_chain_node_cli_cmd.c index 6c4fd4c6f24f305e857a86360138440dc88c0b8c..cc590fcfcc756ba206c24af8627d45912ab86296 100644 --- a/modules/node-cli/dap_chain_node_cli_cmd.c +++ b/modules/node-cli/dap_chain_node_cli_cmd.c @@ -1414,13 +1414,19 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply) */ int com_version(int argc, char ** argv, void **a_str_reply) { + json_object **a_json_arr_reply = (json_object **)a_str_reply; (void) argc; (void) argv; #ifndef DAP_VERSION #pragma message "[!WRN!] DAP_VERSION IS NOT DEFINED. Manual override engaged." #define DAP_VERSION "0.9-15" #endif - return dap_cli_server_cmd_set_reply_text(a_str_reply, "%s version "DAP_VERSION"\n", dap_get_appname()), 0; + json_object* json_obj_out = json_object_new_object(); + char *l_vers = dap_strdup_printf("%s version "DAP_VERSION"\n", dap_get_appname()); + json_object_object_add(json_obj_out, "status", json_object_new_string(l_vers)); + DAP_DELETE(l_vers); + json_object_array_add(*a_json_arr_reply, json_obj_out); + return 0; } @@ -3812,6 +3818,7 @@ int com_chain_ca_copy( int a_argc, char ** a_argv, void **a_str_reply) */ int com_chain_ca_pub( int a_argc, char ** a_argv, void **a_str_reply) { + json_object ** a_json_arr_reply = (json_object **) a_str_reply; int arg_index = 1; // Read params const char * l_ca_name = NULL; @@ -3819,20 +3826,20 @@ int com_chain_ca_pub( int a_argc, char ** a_argv, void **a_str_reply) dap_chain_t * l_chain = NULL; dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-ca_name", &l_ca_name); - dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,a_argc, a_argv, a_str_reply, &l_chain, &l_net, CHAIN_TYPE_CA); + 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_CA); dap_cert_t * l_cert = dap_cert_find_by_name( l_ca_name ); if( l_cert == NULL ){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't find \"%s\" certificate", l_ca_name ); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_FIND_CERT_ERR, + "Can't find \"%s\" certificate", l_ca_name ); + return -DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_FIND_CERT_ERR; } if( l_cert->enc_key == NULL ){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Corrupted certificate \"%s\" without keys certificate", l_ca_name ); - return -5; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CORRUPTED_CERT_ERR, + "Corrupted certificate \"%s\" without keys certificate", l_ca_name ); + return -DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CORRUPTED_CERT_ERR; } // Create empty new cert @@ -3861,31 +3868,31 @@ int com_chain_ca_pub( int a_argc, char ** a_argv, void **a_str_reply) uint32_t l_cert_serialized_size = 0; byte_t * l_cert_serialized = dap_cert_mem_save( l_cert_new, &l_cert_serialized_size ); if(!l_cert_serialized){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't serialize in memory certificate" ); - return -7; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_SERIALIZE_MEMORY_CERT_ERR, + "Can't serialize in memory certificate" ); + return -DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_SERIALIZE_MEMORY_CERT_ERR; } // Now all the chechs passed, forming datum for mempool 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_cli_server_cmd_set_reply_text(a_str_reply, - "Can't produce datum from certificate"); - return -7; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_PRODUCE_CERT_ERR, + "Can't serialize in memory certificate" ); + return -DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_PRODUCE_CERT_ERR; } // Finaly add datum to mempool char *l_hash_str = dap_chain_mempool_datum_add(l_datum, l_chain, "hex"); DAP_DELETE(l_datum); if (l_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Datum %s was successfully placed to mempool", l_hash_str); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_OK, + "Datum %s was successfully placed to mempool", l_hash_str); DAP_DELETE(l_hash_str); return 0; } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't place certificate \"%s\" to mempool", l_ca_name); - return -8; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_PLACE_CERT_ERR, + "Can't place certificate \"%s\" to mempool", l_ca_name); + return -DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_PLACE_CERT_ERR; } } @@ -4475,6 +4482,7 @@ int cmd_decree(int a_argc, char **a_argv, void **a_str_reply) */ int com_stats(int argc, char **a_argv, void **a_str_reply) { + json_object **a_json_arr_reply = (json_object **)a_str_reply; enum { CMD_NONE, CMD_STATS_CPU }; @@ -4487,39 +4495,42 @@ int com_stats(int argc, char **a_argv, void **a_str_reply) switch (cmd_num) { case CMD_NONE: default: - dap_cli_server_cmd_set_reply_text(a_str_reply, "format of command: stats cpu"); - return -1; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_STATS_WRONG_FORMAT_ERR, + "format of command: stats cpu"); + return -DAP_CHAIN_NODE_CLI_COM_STATS_WRONG_FORMAT_ERR; case CMD_STATS_CPU: #if (defined DAP_OS_UNIX) || (defined __WIN32) { dap_cpu_monitor_init(); dap_usleep(500000); - char *l_str_reply_prev = DAP_NEW_Z_SIZE(char, 1); + json_object* json_arr_cpu_out = json_object_new_array(); char *l_str_delimiter; + char *l_str_cpu_num; dap_cpu_stats_t s_cpu_stats = dap_cpu_get_stats(); for (uint32_t n_cpu_num = 0; n_cpu_num < s_cpu_stats.cpu_cores_count; n_cpu_num++) { - if ((n_cpu_num % 4 == 0) && (n_cpu_num != 0)) { - l_str_delimiter = dap_strdup_printf("\n"); - } else if (n_cpu_num == s_cpu_stats.cpu_cores_count - 1) { - l_str_delimiter = DAP_NEW_Z_SIZE(char, 1); - } else { - l_str_delimiter = dap_strdup_printf(" "); - } - *a_str_reply = dap_strdup_printf("%sCPU-%d: %f%%%s", l_str_reply_prev, n_cpu_num, s_cpu_stats.cpus[n_cpu_num].load, l_str_delimiter); - DAP_DELETE(l_str_reply_prev); + json_object* json_obj_cpu = json_object_new_object(); + l_str_cpu_num = dap_strdup_printf("CPU-%d", n_cpu_num); + l_str_delimiter = dap_strdup_printf("%f%%", s_cpu_stats.cpus[n_cpu_num].load); + json_object_object_add(json_obj_cpu, l_str_cpu_num, json_object_new_string(l_str_delimiter)); + json_object_array_add(json_arr_cpu_out, json_obj_cpu); + DAP_DELETE(l_str_cpu_num); DAP_DELETE(l_str_delimiter); - l_str_reply_prev = *a_str_reply; } - *a_str_reply = dap_strdup_printf("%s\nTotal: %f%%", l_str_reply_prev, s_cpu_stats.cpu_summary.load); - DAP_DELETE(l_str_reply_prev); + json_object* json_obj_total = json_object_new_object(); + l_str_delimiter = dap_strdup_printf("%f%%", s_cpu_stats.cpu_summary.load); + json_object_object_add(json_obj_total, "Total", json_object_new_string(l_str_delimiter)); + json_object_array_add(json_arr_cpu_out, json_obj_total); + DAP_DELETE(l_str_delimiter); + json_object_array_add(*a_json_arr_reply, json_arr_cpu_out); break; } #else - dap_cli_server_cmd_set_reply_text(a_str_reply, "only Linux or Windows environment supported"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_STATS_BAD_SYS_ERR, + "only Linux or Windows environment supported"); return -1; #endif // DAP_OS_UNIX } - return 0; + return DAP_CHAIN_NODE_CLI_COM_STATS_OK; } /** @@ -4665,18 +4676,21 @@ int cmd_gdb_export(int a_argc, char **a_argv, void **a_str_reply) */ int cmd_gdb_import(int a_argc, char **a_argv, void **a_str_reply) { + json_object **a_json_arr_reply = (json_object **)a_str_reply; int arg_index = 1; const char *l_filename = NULL; dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "filename", &l_filename); if (!l_filename) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "gdb_import requires parameter 'filename'"); - return -1; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GDB_IMPORT_REQUIRES_PARAMETER_FILENAME, + "gdb_import requires parameter 'filename'"); + return -DAP_CHAIN_NODE_CLI_COM_GDB_IMPORT_REQUIRES_PARAMETER_FILENAME; } const char *l_gdb_path = dap_config_get_item_str(g_config, "global_db", "path"); if (!l_gdb_path) { log_it(L_ERROR, "Can't find gdb path in config file"); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't find gdb path in the config file"); - return -1; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GDB_IMPORT_CANT_FIND_GDB_PATH_ERR, + "Can't find gdb path in the config file"); + return -DAP_CHAIN_NODE_CLI_COM_GDB_IMPORT_CANT_FIND_GDB_PATH_ERR; } char l_path[MAX_PATH + 1]; snprintf(l_path, sizeof(l_path), "%s/%s.json", l_gdb_path, l_filename); @@ -4684,10 +4698,11 @@ int cmd_gdb_import(int a_argc, char **a_argv, void **a_str_reply) if (!l_json) { #if JSON_C_MINOR_VERSION<15 log_it(L_CRITICAL, "Import error occured: code %d", errno); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Import error occured: code %d",errno); + dap_json_rpc_error_add(*a_json_arr_reply, "Import error occured: code %d",errno); #else log_it(L_CRITICAL, "Import error occured: %s", json_util_get_last_err()); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", json_util_get_last_err()); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_GENERAL_ERR, + "%s", json_util_get_last_err()); #endif return -1; } @@ -4791,6 +4806,7 @@ typedef struct _pvt_net_nodes_list { int cmd_remove(int a_argc, char **a_argv, void **a_str_reply) { + json_object **a_json_arr_reply = (json_object **)a_str_reply; //default init const char *return_message = NULL; const char *l_gdb_path = NULL; @@ -4911,14 +4927,21 @@ int cmd_remove(int a_argc, char **a_argv, void **a_str_reply) "'net list'"; } + json_object* json_obj_out; + char *l_out_mes; if (error) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Error when deleting, because:\n%s", return_message); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_REMOVE_GENERAL_ERR, "Error when deleting, because:\n%s", return_message); } else if (successful) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Successful removal: %s", successful & REMOVED_GDB && successful & REMOVED_CHAINS ? "gdb, chains" : successful & REMOVED_GDB ? "gdb" : successful & REMOVED_CHAINS ? "chains" : ""); + json_obj_out = json_object_new_object(); + l_out_mes = dap_strdup_printf("Successful removal: %s", successful & REMOVED_GDB && successful & REMOVED_CHAINS ? "gdb, chains" : successful & REMOVED_GDB ? "gdb" : successful & REMOVED_CHAINS ? "chains" : ""); + json_object_object_add(json_obj_out, "status", json_object_new_string(l_out_mes)); + DAP_DELETE(l_out_mes); + json_object_array_add(*a_json_arr_reply,json_obj_out); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Nothing to delete. Check if the command is correct.\nUse flags: -gdb or/and -chains [-net <net_name> | -all]\n" - "Be careful, the '-all' option will delete ALL CHAINS and won't ask you for permission!"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_REMOVE_NOTHING_TO_DEL_ERR, + "Nothing to delete. Check if the command is correct.\nUse flags: -gdb or/and -chains [-net <net_name> | -all]\n" + "Be careful, the '-all' option will delete ALL CHAINS and won't ask you for permission!"); } for (dap_list_t *it = l_net_returns; it; it = it->next) diff --git a/modules/node-cli/dap_chain_node_cli_cmd_token.c b/modules/node-cli/dap_chain_node_cli_cmd_token.c index 938e5f665687f32e91421c10494a5be78c158e6b..67cb06d23e9c731864aa5c235f02f5c87fcc6770 100644 --- a/modules/node-cli/dap_chain_node_cli_cmd_token.c +++ b/modules/node-cli/dap_chain_node_cli_cmd_token.c @@ -110,6 +110,7 @@ static dap_chain_datum_token_t * s_sign_cert_in_cycle(dap_cert_t ** l_certs, dap */ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply) { + json_object ** a_json_arr_reply = (json_object **) a_str_reply; int arg_index = 1; const char * l_hash_out_type = NULL; @@ -117,7 +118,8 @@ int com_token_decl_sign(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_cli_server_cmd_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_H_PARAM_ERR, + "invalid parameter -H, valid values: -H <hex | base58>"); return -1; } @@ -132,16 +134,10 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply) dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; - dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net, + 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_TOKEN); if(!l_net) - return -1; - else { - if(*a_str_reply) { - DAP_DELETE(*a_str_reply); - *a_str_reply = NULL; - } - } + return -1; // Certificates thats will be used to sign currend datum token dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-certs", &l_certs_str); @@ -151,8 +147,8 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply) dap_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_count); if(!l_certs_count) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "token_sign command requres at least one valid certificate to sign the basic transaction of emission"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_NOT_VALID_CERT_ERR, + "token_sign command requres at least one valid certificate to sign the basic transaction of emission"); return -7; } @@ -196,9 +192,9 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply) dap_sign_t *l_sign = (dap_sign_t *)(l_datum_token->tsd_n_signs + l_tsd_size + l_signs_size); if( dap_sign_verify(l_sign, l_datum_token, sizeof(*l_datum_token) + l_tsd_size) ) { log_it(L_WARNING, "Wrong signature %zu for datum_token with key %s in mempool!", i, l_datum_hash_out_str); - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Datum %s with datum token has wrong signature %zu, break process and exit", - l_datum_hash_out_str, i); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_DATUM_HAS_WRONG_SIGNATURE_ERR, + "Datum %s with datum token has wrong signature %zu, break process and exit", + l_datum_hash_out_str, i); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); return -6; @@ -218,7 +214,8 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply) &l_sign_counter); log_it(L_DEBUG, "Apply %hu signs to datum %s", l_sign_counter, l_datum_hash_hex_str); if (!l_sign_counter) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! Used certs not valid"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_SERT_NOT_VALID_ERR, + "Error! Used certs not valid"); DAP_DEL_MULTY(l_datum_token, l_datum_hash_hex_str, l_datum_hash_base58_str, l_gdb_group_mempool); return -9; } @@ -241,37 +238,39 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply) char* l_hash_str = l_datum_hash_hex_str; // Remove old datum from pool if( dap_global_db_del_sync(l_gdb_group_mempool, l_hash_str ) == 0) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum was replaced in datum pool:\n\tOld: %s\n\tNew: %s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_OK, + "Datum was replaced in datum pool:\n\tOld: %s\n\tNew: %s", l_datum_hash_out_str, l_key_out_str); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Warning! Can't remove old datum %s ( new datum %s added normaly in datum pool)", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_CANT_REMOVE_OLD_DATUM_ERR, + "Warning! Can't remove old datum %s ( new datum %s added normaly in datum pool)", l_datum_hash_out_str, l_key_out_str); - rc = -3; + rc = -DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_CANT_REMOVE_OLD_DATUM_ERR; } } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Error! datum %s produced from %s can't be placed in mempool", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_DATUM_CANT_BE_PL_MEMPOOL_ERR, + "Error! datum %s produced from %s can't be placed in mempool", l_key_out_str, l_datum_hash_out_str); - rc = -2; + rc = -DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_DATUM_CANT_BE_PL_MEMPOOL_ERR; } DAP_DEL_MULTY(l_datum_hash_hex_str, l_datum_hash_base58_str, l_datum, l_gdb_group_mempool); return rc; } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Error! Wrong datum type. token_decl_sign sign only token declarations datum"); - return -61; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_WRONG_DATUM_TYPE_ERR, + "Error! Wrong datum type. token_decl_sign sign only token declarations datum"); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_WRONG_DATUM_TYPE_ERR; } } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "token_decl_sign can't find datum with %s hash in the mempool of %s:%s",l_datum_hash_out_str,l_net? l_net->pub.name: "<undefined>", - l_chain?l_chain->name:"<undefined>"); - return -5; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_CANT_FIND_DATUM_ERR, + "token_decl_sign can't find datum with %s hash in the mempool of %s:%s",l_datum_hash_out_str,l_net? l_net->pub.name: "<undefined>", + l_chain?l_chain->name:"<undefined>"); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_CANT_FIND_DATUM_ERR; } DAP_DEL_MULTY(l_datum_hash_hex_str, l_datum_hash_base58_str); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "token_decl_sign need -datum <datum hash> argument"); - return -2; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_NEED_DATUM_ARG_ERR, + "token_decl_sign need -datum <datum hash> argument"); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_NEED_DATUM_ARG_ERR; } return 0; } @@ -310,29 +309,24 @@ typedef struct _dap_sdk_cli_params { dap_cli_token_additional_params ext; } dap_sdk_cli_params, *pdap_sdk_cli_params; -static int s_parse_common_token_decl_arg(int a_argc, char ** a_argv, void **a_str_reply, dap_sdk_cli_params* a_params, bool a_update_token) +static int s_parse_common_token_decl_arg(int a_argc, char ** a_argv, json_object* a_json_arr_reply, dap_sdk_cli_params* a_params, bool a_update_token) { a_params->type = DAP_CHAIN_DATUM_TOKEN_TYPE_DECL; dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-H", &a_params->hash_out_type); if(!a_params->hash_out_type) a_params->hash_out_type = "hex"; if(dap_strcmp(a_params->hash_out_type,"hex") && dap_strcmp(a_params->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_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING, + "invalid parameter -H, valid values: -H <hex | base58>"); + return -DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING; } int l_arg_index = 0; - int l_res = dap_chain_node_cli_cmd_values_parse_net_chain(&l_arg_index, a_argc, a_argv, a_str_reply, + int l_res = dap_chain_node_cli_cmd_values_parse_net_chain_for_json(a_json_arr_reply, &l_arg_index, a_argc, a_argv, &a_params->chain, &a_params->net, CHAIN_TYPE_TOKEN); if(!a_params->net || !a_params->chain) return l_res; - else { - if(*a_str_reply) { - DAP_DELETE(*a_str_reply); - *a_str_reply = NULL; - } - } //net name dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-net", &a_params->net_str); //chainname @@ -346,9 +340,10 @@ static int s_parse_common_token_decl_arg(int a_argc, char ** a_argv, void **a_st { dap_chain_datum_token_t* l_current_token = dap_ledger_token_ticker_check(a_params->net->pub.ledger, a_params->ticker); if (!l_current_token) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The updated token '%s' was not found in the '%s' network ledger.", + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_LEDGER_TOKEN_TICKER, + "The updated token '%s' was not found in the '%s' network ledger.", a_params->ticker, a_params->net->pub.name); - return -7; + return -DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_LEDGER_TOKEN_TICKER; } a_params->type = DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE; a_params->subtype = l_current_token->subtype; @@ -359,12 +354,15 @@ static int s_parse_common_token_decl_arg(int a_argc, char ** a_argv, void **a_st } else if (strcmp(a_params->type_str, "CF20") == 0) { a_params->type = a_update_token ? DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE : DAP_CHAIN_DATUM_TOKEN_TYPE_DECL; // 256 a_params->subtype = DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE; + } else if (strcmp(a_params->type_str, "public_simple") == 0 && !a_update_token) { + a_params->type = DAP_CHAIN_DATUM_TOKEN_TYPE_DECL; + a_params->subtype = DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC; // 256 } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_UNKNOWN_TOKEN_TYPE, "Unknown token type %s was specified. Supported types:\n" " private\n" " CF20\n" - "Default token type is private_simple.\n", a_params->type_str); + "Default token type is CF20.\n", a_params->type_str); return -1; } } @@ -379,8 +377,8 @@ static int s_parse_common_token_decl_arg(int a_argc, char ** a_argv, void **a_st char* l_tmp = NULL; if(l_signs_total_str){ if((a_params->signs_total = (uint16_t) strtol(l_signs_total_str, &l_tmp, 10)) == 0){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "'signs_total' parameter must be unsigned integer value that fits in 2 bytes"); + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_PARAMS_MUST_BE_UNSIGNED, + "'signs_total' parameter must be unsigned integer value that fits in 2 bytes"); return -8; } } @@ -390,8 +388,8 @@ static int s_parse_common_token_decl_arg(int a_argc, char ** a_argv, void **a_st dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-signs_emission", &l_signs_emission_str); if (l_signs_emission_str){ if((a_params->signs_emission = (uint16_t) strtol(l_signs_emission_str, &l_tmp, 10)) == 0){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "%s requires parameter 'signs_emission' to be unsigned integer value that fits in 2 bytes", a_update_token ? "token_update" : "token_decl"); + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_PARAMS_MUST_BE_UNSIGNED, + "%s requires parameter 'signs_emission' to be unsigned integer value that fits in 2 bytes", a_update_token ? "token_update" : "token_decl"); return -6; } } @@ -402,10 +400,11 @@ static int s_parse_common_token_decl_arg(int a_argc, char ** a_argv, void **a_st if (l_total_supply_str){ a_params->total_supply = dap_chain_balance_scan(l_total_supply_str); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "'-total_supply' must be unsigned integer value that fits in 32 bytes\n" - "You are update a token, be careful!\n" - "You can reset total_supply and make it infinite for native (CF20) tokens only, if set 0" - "for private tokens, you must specify the same or more total_supply."); + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_PARAMS_MUST_BE_UNSIGNED, + "'-total_supply' must be unsigned integer value that fits in 32 bytes\n" + "You are update a token, be careful!\n" + "You can reset total_supply and make it infinite for native (CF20) tokens only, if set 0" + "for private tokens, you must specify the same or more total_supply."); return -4; } } @@ -454,7 +453,7 @@ dap_list_t* s_parse_wallet_addresses(const char *a_tx_address, dap_list_t *l_tsd return l_tsd_list; } -static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, void **a_str_reply, dap_sdk_cli_params* a_params, bool a_update_token) +static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, json_object* a_json_arr_reply, dap_sdk_cli_params* a_params, bool a_update_token) { dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-flags", &a_params->ext.flags); dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-total_signs_valid", &a_params->ext.total_signs_valid); @@ -482,7 +481,8 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, void ** while (l_str_flags && *l_str_flags){ uint16_t l_flag = dap_chain_datum_token_flag_from_str(*l_str_flags); if (l_flag == DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED ){ - dap_cli_server_cmd_set_reply_text(a_str_reply, "Flag can't be \"%s\"",*l_str_flags); + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_FLAG_UNDEF, + "Flag can't be \"%s\"",*l_str_flags); return -20; } l_flags |= l_flag; // if we have multiple flags @@ -499,7 +499,8 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, void ** while (l_str_flags && *l_str_flags){ uint16_t l_flag = dap_chain_datum_token_flag_from_str(*l_str_flags); if (l_flag == DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED ){ - dap_cli_server_cmd_set_reply_text(a_str_reply, "Flag can't be \"%s\"",*l_str_flags); + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_FLAG_UNDEF, + "Flag can't be \"%s\"",*l_str_flags); return -20; } l_flags |= l_flag; // if we have multiple flags @@ -515,7 +516,8 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, void ** while (l_str_flags && *l_str_flags){ uint16_t l_flag = dap_chain_datum_token_flag_from_str(*l_str_flags); if (l_flag == DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED ){ - dap_cli_server_cmd_set_reply_text(a_str_reply, "Flag can't be \"%s\"",*l_str_flags); + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_FLAG_UNDEF, + "Flag can't be \"%s\"",*l_str_flags); return -20; } l_flags |= l_flag; // if we have multiple flags @@ -615,7 +617,8 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, void ** if (dap_strcmp(a_params->ext.total_supply_change, "INF")) { l_total_supply = dap_chain_balance_scan(a_params->ext.total_supply_change); if (IS_ZERO_256(l_total_supply)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Unable to convert value '%s' to uint256_t, use INF, number, or integer.0e+degree to represent infinity", + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_FLAG_UNDEF, + "Unable to convert value '%s' to uint256_t, use INF, number, or integer.0e+degree to represent infinity", a_params->ext.total_supply_change); return -2; } @@ -691,6 +694,57 @@ static int s_token_decl_check_params(int a_argc, char **a_argv, void **a_str_rep return 0; } +static int s_token_decl_check_params_json(int a_argc, char **a_argv, json_object* a_json_arr_reply, dap_sdk_cli_params *a_params, bool a_update_token) +{ + int l_parse_params = s_parse_common_token_decl_arg(a_argc,a_argv, a_json_arr_reply, a_params, a_update_token); + if (l_parse_params) + return l_parse_params; + + l_parse_params = s_parse_additional_token_decl_arg(a_argc,a_argv, a_json_arr_reply, a_params, a_update_token); + if (l_parse_params) + return l_parse_params; + + //DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL uses decimals parameter + if (!a_update_token) { + //// check l_decimals in CF20 token TODO: At the moment the checks are the same. + if(!a_params->decimals_str) { + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_REQUIRES_PARAM, + "token_decl requires parameter '-decimals'"); + return -3; + } else if (dap_strcmp(a_params->decimals_str, "18")) { + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_REQUIRES_PARAM, + "token_decl support '-decimals' to be 18 only"); + return -4; + } + } + + if (!a_params->signs_emission && !a_update_token) { + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_REQUIRES_PARAM, + "token_decl requires parameter '-signs_emission'"); + return -5; + } + + if (!a_params->signs_total && !a_update_token){ + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_REQUIRES_PARAM, + "token_decl requires parameter '-signs_total'"); + return -7; + } + + if(!a_params->ticker){ + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_REQUIRES_PARAM, + "%s requires parameter '-token'", a_update_token ? "token_update" : "token_decl"); + return -2; + } + + // Check certs list + if(!a_params->certs_str){ + dap_json_rpc_error_add(a_json_arr_reply, DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_REQUIRES_PARAM, + "%s requires parameter 'certs'", a_update_token ? "token_update" : "token_decl"); + return -9; + } + return 0; +} + /** * @brief com_token_decl * @param argc @@ -736,6 +790,7 @@ static int s_token_decl_check_params(int a_argc, char **a_argv, void **a_str_rep */ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) { + json_object ** a_json_arr_reply = (json_object **) a_str_reply; const char * l_ticker = NULL; uint256_t l_total_supply = {}; // 256 uint16_t l_signs_emission = 0; @@ -749,7 +804,7 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) dap_sdk_cli_params l_params = { .type = DAP_CHAIN_DATUM_TOKEN_TYPE_DECL, .subtype = DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE }; - int l_parse_params = s_token_decl_check_params(a_argc, a_argv, a_str_reply, &l_params, false); + int l_parse_params = s_token_decl_check_params_json(a_argc,a_argv,*a_json_arr_reply, &l_params, false); if (l_parse_params) return l_parse_params; @@ -759,8 +814,8 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) // Load certs lists dap_cert_parse_str_list(l_params.certs_str, &l_certs, &l_certs_count); if(!l_certs_count){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "token_decl command requres at least one valid certificate to sign token"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_NOT_VALID_CERT_ERR, + "token_decl command requres at least one valid certificate to sign token"); return -10; } @@ -783,11 +838,13 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) if (l_params.ext.delegated_token_from){ dap_chain_datum_token_t *l_delegated_token_from; if (NULL == (l_delegated_token_from = dap_ledger_token_ticker_check(l_net->pub.ledger, l_params.ext.delegated_token_from))) { - dap_cli_server_cmd_set_reply_text(a_str_reply,"To create a delegated token %s, can't find token by ticket %s", l_ticker,l_params.ext.delegated_token_from); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_FIND_TICKER_ERR, + "To create a delegated token %s, can't find token by ticket %s", l_ticker, l_params.ext.delegated_token_from); return -91; } if (!dap_strcmp(l_ticker, l_params.ext.delegated_token_from)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Delegated token ticker cannot match the original ticker"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_TOKEN_CANNOT_MATCH, + "Delegated token ticker cannot match the original ticker"); return -92; } @@ -817,8 +874,8 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t) + l_tsd_total_size); if (!l_datum_token) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Out of memory in com_token_decl"); - + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_CANT_CREATE_DATUM, + "Out of memory in com_token_decl"); return -1; } l_datum_token->version = 2; @@ -909,8 +966,8 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)); if (!l_datum_token) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Out of memory in com_token_decl"); - + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_CANT_CREATE_DATUM, + "Out of memory in com_token_decl"); return -1; } l_datum_token->version = 2; @@ -922,9 +979,8 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) l_datum_token->header_simple.decimals = atoi(l_params.decimals_str); }break; default: - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Unknown token type"); - + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_UNKNOWN_TOKEN_TYPE, + "Unknown token type"); return -8; } dap_uuid_generate_nonce(&l_datum_token->nonce, DAP_CHAIN_DATUM_NONCE_SIZE); @@ -939,9 +995,8 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) // We skip datum creation opeartion, if count of signed certificates in s_sign_cert_in_cycle is 0. // Usually it happen, when certificate in token_decl or token_update command doesn't contain private data or broken if (!l_datum_token || l_datum_token->signs_total == 0){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Token declaration failed. Successful count of certificate signing is 0"); - + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_FAILED, + "Token declaration failed. Successful count of certificate signing is 0"); return -9; } @@ -963,14 +1018,15 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) ? dap_chain_mempool_group_new(l_chain) : dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN); if (!l_gdb_group_mempool) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "No suitable chain for placing token datum found"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_NO_SUITABLE_CHAIN, + "No suitable chain for placing token datum found"); DAP_DELETE(l_datum); - return -10; } bool l_placed = dap_global_db_set_sync(l_gdb_group_mempool, l_key_str, l_datum, l_datum_size, false) == 0; DAP_DELETE(l_gdb_group_mempool); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s with token %s is%s placed in datum pool", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_OK, + "Datum %s with token %s is%s placed in datum pool", l_key_str_out, l_ticker, l_placed ? "" : " not"); DAP_DELETE(l_key_str); DAP_DELETE(l_datum); @@ -1028,6 +1084,7 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) */ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) { + json_object ** a_json_arr_reply = (json_object **) a_str_reply; const char * l_ticker = NULL; uint256_t l_total_supply = {}; // 256 uint16_t l_signs_emission = 0; @@ -1039,7 +1096,7 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) const char * l_hash_out_type = NULL; dap_sdk_cli_params l_params = { .type = DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE, .subtype = DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE }; - int l_parse_params = s_token_decl_check_params(a_argc, a_argv, a_str_reply, &l_params, true); + int l_parse_params = s_token_decl_check_params_json(a_argc,a_argv,*a_json_arr_reply, &l_params, true); if (l_parse_params) return l_parse_params; @@ -1049,8 +1106,8 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) // Load certs lists dap_cert_parse_str_list(l_params.certs_str, &l_certs, &l_certs_count); if(!l_certs_count){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "com_token_update command requres at least one valid certificate to sign token"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_UPDATE_NOT_VALID_CERT_ERR, + "com_token_update command requres at least one valid certificate to sign token"); return -10; } @@ -1116,8 +1173,8 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) l_datum_token->header_simple.decimals = 0; }break; default: - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Unknown token type"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_UPDATE_UNKNOWN_TOKEN_TYPE, + "Unknown token type"); return -8; } dap_uuid_generate_nonce(&l_datum_token->nonce, DAP_CHAIN_DATUM_NONCE_SIZE); @@ -1144,17 +1201,18 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) ? dap_chain_mempool_group_new(l_chain) : dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN); if (!l_gdb_group_mempool) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "No suitable chain for placing token datum found"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_UPDATE_NO_SUITABLE_CHAIN, + "No suitable chain for placing token datum found"); DAP_DELETE(l_datum); return -10; } bool l_placed = !dap_global_db_set_sync(l_gdb_group_mempool, l_key_str, (uint8_t *)l_datum, l_datum_size, false); DAP_DELETE(l_gdb_group_mempool); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s with token update for ticker %s is%s placed in datum pool", - l_key_str_out, l_ticker, l_placed ? "" : " not"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_UPDATE_OK, + "Datum %s with token update for ticker %s is%s placed in datum pool", + l_key_str_out, l_ticker, l_placed ? "" : " not"); DAP_DELETE(l_key_str); DAP_DELETE(l_datum); - return l_placed ? 0 : -2; } @@ -1168,6 +1226,7 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) */ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply) { + json_object ** a_json_arr_reply = (json_object **) a_str_reply; int arg_index = 1; const char *str_tmp = NULL; //const char *str_fee = NULL; @@ -1199,11 +1258,12 @@ int com_token_emit(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_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_COM_TOKEN_EMIT_H_PARAM_ERR, + "invalid parameter -H, valid values: -H <hex | base58>"); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_H_PARAM_ERR; } - dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,a_argc,a_argv,a_str_reply,NULL, &l_net, CHAIN_TYPE_INVALID); + dap_chain_node_cli_cmd_values_parse_net_chain_for_json(*a_json_arr_reply, &arg_index,a_argc,a_argv,NULL, &l_net, CHAIN_TYPE_INVALID); if( ! l_net) { // Can't find such network return -43; } @@ -1220,15 +1280,16 @@ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-token", &l_ticker); if(!l_certs_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "token_emit requires parameter '-certs'"); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_CERTS, + "token_emit requires parameter '-certs'"); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_CERTS; } dap_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size); if(!l_certs_size) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "token_emit command requres at least one valid certificate to sign the basic transaction of emission"); - return -5; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_NOT_VALID_CERT_ERRS, + "token_emit command requres at least one valid certificate to sign the basic transaction of emission"); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_NOT_VALID_CERT_ERRS; } const char *l_add_sign = NULL; dap_chain_addr_t *l_addr = NULL; @@ -1240,25 +1301,29 @@ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply) } if (IS_ZERO_256(l_emission_value)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "token_emit requires parameter '-emission_value'"); - return -1; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_EMISSION_VAL, + "token_emit requires parameter '-emission_value'"); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_EMISSION_VAL; } if(!l_addr_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "token_emit requires parameter '-addr'"); - return -2; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_ADDR, + "token_emit requires parameter '-addr'"); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_ADDR; } if(!l_ticker) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "token_emit requires parameter '-token'"); - return -3; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_TOKEN, + "token_emit requires parameter '-token'"); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_TOKEN; } l_addr = dap_chain_addr_from_str(l_addr_str); if(!l_addr) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "address \"%s\" is invalid", l_addr_str); - return -4; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_ADDR_INVALID_ERR, + "address \"%s\" is invalid", l_addr_str); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_ADDR_INVALID_ERR; } dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-chain_emission", &l_chain_emission_str); @@ -1268,10 +1333,10 @@ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply) l_chain_emission = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_EMISSION); if (l_chain_emission == NULL) { // Can't find such chain - dap_cli_server_cmd_set_reply_text(a_str_reply, - "token_emit requires parameter '-chain_emission' to be valid chain name in chain net %s" - " or set default datum type in chain configuration file", l_net->pub.name); - return -45; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_CHAIN_EMISSION, + "token_emit requires parameter '-chain_emission' to be valid chain name in chain net %s" + "or set default datum type in chain configuration file", l_net->pub.name); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_CHAIN_EMISSION; } } else { if (l_emission_hash_str) { @@ -1283,20 +1348,23 @@ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply) } } if (!l_emission){ - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can' find emission with hash \"%s\" for token %s on network %s", + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_CANT_FIND_EMI_ERR, + "Can't find emission with hash \"%s\" for token %s on network %s", l_emission_hash_str, l_ticker, l_net->pub.name); - return -32; + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_CANT_FIND_EMI_ERR; } } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Subcommand 'sign' recuires parameter '-emission'"); - return -31; + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_EMISSION, + "Subcommand 'sign' recuires parameter '-emission'"); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_EMISSION; } } if (!l_add_sign) { // Check, if network ID is same as ID in destination wallet address. If not - operation is cancelled. if (!dap_chain_addr_is_blank(l_addr) && l_addr->net_id.uint64 != l_net->pub.id.uint64) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "destination wallet network ID=0x%"DAP_UINT64_FORMAT_x + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_EMISSION, + "destination wallet network ID=0x%"DAP_UINT64_FORMAT_x " and network ID=0x%"DAP_UINT64_FORMAT_x" is not equal." " Please, change network name or wallet address", l_addr->net_id.uint64, l_net->pub.id.uint64); @@ -1306,18 +1374,19 @@ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply) } if(!l_ticker) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "token_emit requires parameter '-token'"); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_TOKEN, + "token_emit requires parameter '-token'"); DAP_DEL_Z(l_addr); - return -3; + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_TOKEN; } if (!l_chain_emission) { if ( (l_chain_emission = dap_chain_net_get_default_chain_by_chain_type(l_net,CHAIN_TYPE_EMISSION)) == NULL ) { DAP_DEL_Z(l_addr); - dap_cli_server_cmd_set_reply_text(a_str_reply, + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_CHAIN_EMISSION, "token_create requires parameter '-chain_emission' to be valid chain name in chain net %s or set default datum type in chain configuration file", - l_net->pub.name); - return -50; + l_net->pub.name); + return -DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_CHAIN_EMISSION; } } // Create emission datum @@ -1349,6 +1418,8 @@ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply) dap_global_db_del_sync(l_gdb_group_mempool_emission, l_emission_hash_str_remove); DAP_DEL_Z(l_gdb_group_mempool_emission); } - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_reply_tmp); + json_object* json_obj_out = json_object_new_object(); + json_object_object_add(json_obj_out, "result", json_object_new_string(l_str_reply_tmp)); + json_object_array_add(*a_json_arr_reply, json_obj_out); return DAP_DEL_MULTY(l_certs, l_str_reply_tmp, l_addr), 0; } diff --git a/modules/node-cli/include/dap_chain_node_cli_cmd.h b/modules/node-cli/include/dap_chain_node_cli_cmd.h index ac4ae9bd4fdd6e35388c0636c7a1a3c503692f9a..410fe095bf1a9b66282831b788e5067796e19d69 100644 --- a/modules/node-cli/include/dap_chain_node_cli_cmd.h +++ b/modules/node-cli/include/dap_chain_node_cli_cmd.h @@ -267,6 +267,94 @@ typedef enum s_com_tx_cond_remove{ DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_CAN_FIND_DEFAULT_CHAIN_WITH_TX_FOR_NET, DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_OTHER_ERROR }s_com_tx_cond_remove_t; +typedef enum s_com_token_decl_err{ + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_OK = 0, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_FIND_TICKER_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_NOT_VALID_CERT_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_TOKEN_CANNOT_MATCH, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_CANT_CREATE_DATUM, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_UNKNOWN_TOKEN_TYPE, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_FAILED, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_NO_SUITABLE_CHAIN + +}s_com_token_decl_err_t; + +typedef enum s_com_token_update_err{ + DAP_CHAIN_NODE_CLI_COM_TOKEN_UPDATE_OK = 0, + DAP_CHAIN_NODE_CLI_COM_TOKEN_UPDATE_NOT_VALID_CERT_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_UPDATE_UNKNOWN_TOKEN_TYPE, + DAP_CHAIN_NODE_CLI_COM_TOKEN_UPDATE_NO_SUITABLE_CHAIN + +}s_com_token_update_err_t; + +typedef enum s_com_token_decl_sign_err{ + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_OK = 0, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_H_PARAM_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_UPDATE_UNKNOWN_TOKEN_TYPE, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_NOT_VALID_CERT_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_DATUM_HAS_WRONG_SIGNATURE_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_SERT_NOT_VALID_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_CANT_REMOVE_OLD_DATUM_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_DATUM_CANT_BE_PL_MEMPOOL_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_WRONG_DATUM_TYPE_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_CANT_FIND_DATUM_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_DECL_SIGN_NEED_DATUM_ARG_ERR + +}s_com_token_decl_sign_err_t; + +typedef enum s_com_token_emit_err{ + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_OK = 0, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_H_PARAM_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_CERTS, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_EMISSION_VAL, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_ADDR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_TOKEN, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_CHAIN_EMISSION, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_REQUIRES_PARAMETER_EMISSION, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_CANT_FIND_EMI_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_ADDR_INVALID_ERR, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_NOT_VALID_CERT_ERRS, + DAP_CHAIN_NODE_CLI_COM_TOKEN_EMIT_NO_SUITABLE_CHAIN + +}s_com_token_emit_err_t; + +typedef enum s_com_chain_ca_pub_err{ + DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_OK = 0, + DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_FIND_CERT_ERR, + DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CORRUPTED_CERT_ERR, + DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_PRODUCE_CERT_ERR, + DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_SERIALIZE_MEMORY_CERT_ERR, + DAP_CHAIN_NODE_CLI_COM_CHAIN_CA_PUB_CANT_PLACE_CERT_ERR + +}s_com_chain_ca_pub_err_t; + +typedef enum s_com_remove_err{ + DAP_CHAIN_NODE_CLI_COM_REMOVE_OK = 0, + DAP_CHAIN_NODE_CLI_COM_REMOVE_GENERAL_ERR, + DAP_CHAIN_NODE_CLI_COM_REMOVE_NOTHING_TO_DEL_ERR + +}s_com_remove_err_t; + +typedef enum s_com_gdb_import_err{ + DAP_CHAIN_NODE_CLI_COM_GDB_IMPORT_OK = 0, + DAP_CHAIN_NODE_CLI_COM_GDB_IMPORT_REQUIRES_PARAMETER_FILENAME, + DAP_CHAIN_NODE_CLI_COM_GENERAL_ERR, + DAP_CHAIN_NODE_CLI_COM_GDB_IMPORT_CANT_FIND_GDB_PATH_ERR + +}s_com_gdb_import_err_t; + +typedef enum s_com_stats_err{ + DAP_CHAIN_NODE_CLI_COM_STATS_OK = 0, + DAP_CHAIN_NODE_CLI_COM_STATS_WRONG_FORMAT_ERR +}s_com_stats_err_t; + +typedef enum s_com_print_log_err{ + DAP_CHAIN_NODE_CLI_COM_PRINT_LOG_OK = 0, + DAP_CHAIN_NODE_CLI_COM_PRINT_LOG_REQUIRES_PARAMETER_AFTER, + DAP_CHAIN_NODE_CLI_COM_PRINT_LOG_REQUIRES_PARAMETER_LIMIT, + DAP_CHAIN_NODE_CLI_COM_PRINT_LOG_NO_LOGS +}s_com_print_log_err_t; + int com_tx_cond_remove(int a_argc, char **a_argv, void **reply); typedef enum s_com_tx_cond_unspent_find{ DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_OK = 0, diff --git a/modules/service/stake/dap_chain_net_srv_stake_lock.c b/modules/service/stake/dap_chain_net_srv_stake_lock.c index 64412050d2ee96c6e5ee3267df82474bfab1ce84..a778139bb5ca8d9f12a4fdc7362e695141dc1724 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_lock.c +++ b/modules/service/stake/dap_chain_net_srv_stake_lock.c @@ -308,7 +308,7 @@ static enum error_code s_cli_hold(int a_argc, char **a_argv, int a_arg_index, da dap_chain_addr_t *l_addr_holder; dap_chain_datum_token_t *l_delegated_token; - dap_string_append_printf(output_line, "---> HOLD <---\n"); + dap_string_append_printf(output_line, "\n---> HOLD <---\n"); const char *l_hash_out_type = NULL; dap_cli_server_cmd_find_option_val(a_argv, 1, a_argc, "-H", &l_hash_out_type); @@ -484,7 +484,7 @@ static enum error_code s_cli_take(int a_argc, char **a_argv, int a_arg_index, da dap_chain_t *l_chain; dap_chain_datum_token_t *l_delegated_token; - dap_string_append_printf(output_line, "---> TAKE <---\n"); + dap_string_append_printf(output_line, "\n---> TAKE <---\n"); const char *l_hash_out_type = NULL; dap_cli_server_cmd_find_option_val(a_argv, 1, a_argc, "-H", &l_hash_out_type); @@ -806,6 +806,7 @@ static void s_error_handler(enum error_code errorCode, dap_string_t *output_line */ static int s_cli_stake_lock(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_HOLD, CMD_TAKE }; @@ -831,20 +832,25 @@ static int s_cli_stake_lock(int a_argc, char **a_argv, void **a_str_reply) } break; default: { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command %s not recognized", a_argv[l_arg_index]); + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_STAKE_LOCK_NOT_RECOGNIZED_ERR, + "Command %s not recognized", a_argv[l_arg_index]); dap_string_free(output_line, false); } return 1; } - if (STAKE_NO_ERROR != errorCode) + json_object* json_obj_out = json_object_new_object(); + if (STAKE_NO_ERROR != errorCode) { s_error_handler(errorCode, output_line); - else - dap_string_append_printf(output_line, "Contribution successfully made"); - - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", output_line->str); + json_object_object_add(json_obj_out, "status", json_object_new_string(output_line->str)); + } + else { + dap_string_append_printf(output_line, "\nContribution successfully made"); + json_object_object_add(json_obj_out, "status", json_object_new_string(output_line->str)); + } + json_object_array_add(*a_json_arr_reply, json_obj_out); dap_string_free(output_line, true); - return 0; + return DAP_CHAIN_NODE_CLI_COM_STAKE_LOCK_OK; } /** diff --git a/modules/service/stake/include/dap_chain_net_srv_stake_lock.h b/modules/service/stake/include/dap_chain_net_srv_stake_lock.h index 8939cb339daccad56827c5c1f8b5f10577305fe9..5b04e25e207eb489cc38796b6835c0bd11e45c97 100644 --- a/modules/service/stake/include/dap_chain_net_srv_stake_lock.h +++ b/modules/service/stake/include/dap_chain_net_srv_stake_lock.h @@ -28,3 +28,8 @@ int dap_chain_net_srv_stake_lock_init(void); void dap_chain_net_srv_stake_lock_deinit(void); + +typedef enum s_com_stake_lock_err{ + DAP_CHAIN_NODE_CLI_COM_STAKE_LOCK_OK = 0, + DAP_CHAIN_NODE_CLI_COM_STAKE_LOCK_NOT_RECOGNIZED_ERR +}s_com_stake_lock_err_t; diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index d1dd08176964c1f33e747cbd59c114de36dedf14..ed2ce1a4e71a052ddb0295f76ffdcf32db0160ea 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -3461,4 +3461,4 @@ static void s_ledger_tx_remove_notify(dap_ledger_t *a_ledger, dap_chain_datum_tx DAP_DELETE(l_cache_found); } } -} \ No newline at end of file +}