From f803bb3e30c0866b654f3d57d9cb174e2c72c735 Mon Sep 17 00:00:00 2001
From: "cellframe.docs" <artur.khudiaev@demlabs.net>
Date: Fri, 15 Apr 2022 10:36:45 +0000
Subject: [PATCH] hotfix-5161

---
 .../dap_chain_global_db_driver_sqlite.c       |  8 ++--
 modules/net/dap_chain_net.c                   | 15 +++++++
 modules/net/dap_chain_node_cli_cmd.c          | 31 +++++++-------
 modules/net/include/dap_chain_net.h           |  1 +
 modules/type/blocks/dap_chain_cs_blocks.c     |  9 +++++
 modules/type/dag/dap_chain_cs_dag.c           | 40 ++++++++++++++-----
 6 files changed, 77 insertions(+), 27 deletions(-)

diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c
index 33a025d245..551e70421f 100644
--- a/modules/global-db/dap_chain_global_db_driver_sqlite.c
+++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c
@@ -56,7 +56,7 @@ static struct conn_pool_item *s_trans = NULL;                               /* S
 static pthread_mutex_t s_trans_mtx = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t s_trans_cnd = PTHREAD_COND_INITIALIZER;
 
-
+bool s_debug_db_more = false;
 static char s_filename_db [MAX_PATH];
 
 static pthread_mutex_t s_conn_free_mtx = PTHREAD_MUTEX_INITIALIZER;        /* Lock to coordinate access to the free connections pool */
@@ -146,7 +146,8 @@ struct timespec tmo = {0};
                                                                             /* l_rc == 0 - so connection was free, */
                                                                             /* we got free connection, so, release mutex and get out */
                 atomic_fetch_add(&l_conn->usage, 1);
-                log_it(L_DEBUG, "Get l_conn: @%p", l_conn);
+                if (s_debug_db_more)
+                    log_it(L_DEBUG, "Get l_conn: @%p", l_conn);
                 return  l_conn;
                 }
         }
@@ -175,7 +176,8 @@ static inline int s_sqlite_free_connection(struct conn_pool_item *a_conn)
 {
 int     l_rc;
 
-    log_it(L_DEBUG, "Free l_conn: @%p", a_conn);
+    if (s_debug_db_more)
+        log_it(L_DEBUG, "Free l_conn: @%p", a_conn);
 
     atomic_flag_clear(&a_conn->busy);                                       /* Clear busy flag */
 
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 6aedddafbd..0a3a4d5529 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -1482,6 +1482,21 @@ void s_set_reply_text_node_status(char **a_str_reply, dap_chain_net_t * a_net){
     DAP_DELETE(l_node_address_text_block);
 }
 
+/**
+ * @brief get type of chain
+ * 
+ * @param l_chain 
+ * @return char* 
+ */
+const char* dap_chain_net_get_type(dap_chain_t *l_chain)
+{
+    if (!l_chain){
+        log_it(L_DEBUG, "dap_get_chain_type. Chain object is 0");
+        return NULL;
+    }
+    return (const char*)DAP_CHAIN_PVT(l_chain)->cs_name;
+}
+
 /**
  * @brief reload ledger
  * command cellframe-node-cli net -net <network_name> ledger reload
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 2958787059..e7342201a6 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -2864,7 +2864,12 @@ int s_parse_common_token_decl_arg(int a_argc, char ** a_argv, char ** a_str_repl
             l_params->l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL; // 256
         }else{
             dap_chain_node_cli_set_reply_text(a_str_reply,
-                        "uknown token type was specified. Simple token will be used by default");
+                        "Unknown token type %s was specified. Supported types:\n"
+                        "   private_simple\n"
+                        "   private\n"
+                        "   CF20\n"
+                        "Default token type is private_simple.\n", l_params->l_type_str);
+            return -1;
         }
     }
 
@@ -3032,12 +3037,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
     const char * l_ticker = NULL;
     uint256_t l_total_supply = {}; // 256
     uint16_t l_signs_emission = 0;
-
-    const char * l_signs_total_str = NULL;
     uint16_t l_signs_total = 0;
-
-    const char * l_certs_str = NULL;
-
     dap_cert_t ** l_certs = NULL;
     size_t l_certs_count = 0;
 
@@ -3117,18 +3117,18 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
                 l_tsd_list = dap_list_append(l_tsd_list, l_tsd);
                 l_tsd_total_size+= dap_tsd_size(l_tsd);
             }
-            if (l_params->ext.tx_receiver_allowed){
+            if (l_params->ext.tx_receiver_allowed)
                 l_tsd_list = s_parse_wallet_addresses(l_params->ext.tx_receiver_allowed, l_tsd_list, &l_tsd_total_size, DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD);
-            }
-            if (l_params->ext.tx_receiver_blocked){
+            
+            if (l_params->ext.tx_receiver_blocked)
                 l_tsd_list = s_parse_wallet_addresses(l_params->ext.tx_receiver_blocked, l_tsd_list, &l_tsd_total_size, DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD);
-            }
-            if (l_params->ext.tx_sender_allowed){
+
+            if (l_params->ext.tx_sender_allowed)
                 l_tsd_list = s_parse_wallet_addresses(l_params->ext.tx_sender_allowed, l_tsd_list, &l_tsd_total_size, DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD);
-            }
-            if (l_params->ext.tx_sender_blocked){ 
-                    l_tsd_list = s_parse_wallet_addresses(l_params->ext.tx_sender_blocked, l_tsd_list, &l_tsd_total_size, DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD);             
-            }
+
+            if (l_params->ext.tx_sender_blocked)
+                l_tsd_list = s_parse_wallet_addresses(l_params->ext.tx_sender_blocked, l_tsd_list, &l_tsd_total_size, DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD);             
+
 
             // Create new datum token
             l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t) + l_tsd_total_size) ;
@@ -3247,6 +3247,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
     else
         DAP_DELETE(l_key_str);
     DAP_DELETE(l_datum);
+    DAP_DELETE(l_params);
     if (!l_placed) {
         l_ret = -2;
     }
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index 908cc70e15..4e8d1438de 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -130,6 +130,7 @@ dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const ch
 dap_chain_node_addr_t * dap_chain_net_get_cur_addr( dap_chain_net_t * l_net);
 uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t * l_net);
 dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net);
+const char* dap_chain_net_get_type(dap_chain_t *l_chain);
 
 dap_list_t* dap_chain_net_get_link_node_list(dap_chain_net_t * l_net, bool a_is_only_cur_cell);
 dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * l_net);
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index 4f04edae2d..881842f060 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -368,6 +368,15 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply)
     if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net) < 0)
         return -11;
 
+    const char *l_chain_type = dap_chain_net_get_type(l_chain);
+
+    if (!strstr(l_chain_type, "block_")){
+            dap_chain_node_cli_set_reply_text(a_str_reply,
+                        "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 -42;
+    }
+
     l_blocks = DAP_CHAIN_CS_BLOCKS(l_chain);
 
     // Parse commands
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index f9f095ebe7..6cf24bebf1 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -142,19 +142,19 @@ int dap_chain_cs_dag_init(void)
     s_debug_more = dap_config_get_item_bool_default(g_config,"dag","debug_more",false);
 
     dap_chain_node_cli_cmd_item_create ("dag", s_cli_dag, "DAG commands",
-        "dag -net event create <chain net name> -chain <chain name> -datum <datum hash> [-H hex|base58(default)]\n"
+        "dag event create -net <chain net name> -chain <chain name> -datum <datum hash> [-H hex|base58(default)]\n"
             "\tCreate event from datum mempool element\n\n"
         "dag event cancel -net <chain net name> -chain <chain name> -event <event hash>\n"
             "\tRemove event from forming new round and put back its datum to mempool\n\n"
         "dag event sign -net <chain net name> -chain <chain name> -event <event hash>\n"
             "\tAdd sign to event <event hash> in round.new. Hash doesn't include other signs so event hash\n"
             "\tdoesn't changes after sign add to event. \n\n"
-        "dag event dump -net <chain net name> -chain <chain name> -event <event hash> -from < events | events_lasts | round.new  | round.<Round id in hex> > [-H hex|base58(default)]\n"
+        "dag event dump -net <chain net name> -chain <chain name> -event <event hash> -from <events | events_lasts | threshold | round.new | round.<Round id in hex>> [-H hex|base58(default)]\n"
             "\tDump event info\n\n"
-        "dag event list -net <chain net name> -chain <chain name> -from < events | events_lasts | threshold | round.new | round.<Round id in hex> \n\n"
+        "dag event list -net <chain net name> -chain <chain name> -from <events | events_lasts | threshold | round.new | round.<Round id in hex>> \n"
             "\tShow event list \n\n"
-        "dag round complete -net <chain net name> -chain <chain name> \n\n"
-                                        "\tComplete the current new round, verify it and if everything is ok - publish new events in chain\n\n"
+        "dag round complete -net <chain net name> -chain <chain name> \n"
+                                        "\tComplete the current new round, verify it and if everything is ok - publish new events in chain\n"
                                         );
     log_it(L_NOTICE,"Initialized DAG chain items organization class");
     return 0;
@@ -1358,7 +1358,7 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply)
 
     arg_index++;
     const char * l_hash_out_type = NULL;
-    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-H", &l_hash_out_type);
+    dap_chain_node_cli_find_option_val(argv, 0, argc, "-H", &l_hash_out_type);
     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")) {
@@ -1367,7 +1367,7 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply)
     }
 
     dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net);
-    if ( l_net == NULL ){
+    if ((l_net == NULL) || (l_chain == NULL)){
         return -1;
     } else if (a_str_reply && *a_str_reply) {
         DAP_DELETE(*a_str_reply);
@@ -1375,6 +1375,15 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply)
     }
     l_dag = DAP_CHAIN_CS_DAG(l_chain);
 
+    const char *l_chain_type = dap_chain_net_get_type(l_chain);
+
+    if (!strstr(l_chain_type, "dag_")){
+            dap_chain_node_cli_set_reply_text(a_str_reply,
+                        "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 -42;
+    }
+
     int ret = 0;
     if ( l_round_cmd_str ) {
         if ( strcmp(l_round_cmd_str,"complete") == 0 ){
@@ -1656,11 +1665,23 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply)
                                                               "Can't find event %s in events table\n", l_event_hash_str);
                             break;
                         }
-
+                    }else if ( strcmp(l_from_events_str,"threshold") == 0){
+                        dap_chain_cs_dag_event_item_t * l_event_item = NULL;
+                        pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock);
+                        HASH_FIND(hh,PVT(l_dag)->events_treshold,&l_event_hash,sizeof(l_event_hash),l_event_item);
+                        pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
+                        if (l_event_item)
+                            l_event = l_event_item->event;
+                        else {
+                            ret = -23;
+                            dap_chain_node_cli_set_reply_text(a_str_reply,
+                                                              "Can't find event %s in threshold table\n", l_event_hash_str);
+                            break;
+                        }
                     }else {
                         ret = -22;
                         dap_chain_node_cli_set_reply_text(a_str_reply,
-                                                          "Wrong events_from option \"%s\", need one of variant: events, round.new, events_lasts, round.0x0123456789ABCDEF", l_from_events_str);
+                                                          "Wrong events_from option \"%s\", need one of variant: events, round.new, events_lasts, round.0x0123456789ABCDEF, threshold", l_from_events_str);
                         break;
 
                     }
@@ -1765,6 +1786,7 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply)
             case SUBCMD_EVENT_LIST:{
                 if( (l_from_events_str == NULL) ||
                         (strcmp(l_from_events_str,"round.new") == 0) ){
+
                     char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new;
                     dap_string_t * l_str_tmp = dap_string_new("");
                     if ( l_gdb_group_events ){
-- 
GitLab