From c70b705bcd6922a71c8200762f7f1fa8c7189ada Mon Sep 17 00:00:00 2001
From: Roman Khlopkov <roman.khlopkov@demlabs.net>
Date: Mon, 14 Mar 2022 13:15:56 +0000
Subject: [PATCH] features-5796

---
 dap-sdk/core/src/dap_string.c                 |  6 +--
 modules/chain/dap_chain_pvt.c                 |  7 +++
 modules/chain/include/dap_chain.h             | 10 +++-
 modules/chain/include/dap_chain_pvt.h         |  5 +-
 modules/channel/chain/dap_stream_ch_chain.c   | 43 ++++-------------
 .../chain/include/dap_stream_ch_chain.h       |  2 +-
 modules/consensus/none/dap_chain_cs_none.c    |  1 -
 modules/global-db/dap_chain_global_db.c       |  2 +-
 modules/net/dap_chain_net.c                   | 48 ++++++++++++-------
 modules/net/dap_chain_node.c                  | 44 +++++++----------
 modules/net/include/dap_chain_net.h           |  3 +-
 modules/net/include/dap_chain_node.h          |  3 --
 modules/net/srv/dap_chain_net_srv_order.c     | 16 +++++--
 .../net/srv/include/dap_chain_net_srv_order.h |  2 +-
 14 files changed, 92 insertions(+), 100 deletions(-)

diff --git a/dap-sdk/core/src/dap_string.c b/dap-sdk/core/src/dap_string.c
index 0f5a56bfce..ac05cc758a 100755
--- a/dap-sdk/core/src/dap_string.c
+++ b/dap-sdk/core/src/dap_string.c
@@ -833,8 +833,8 @@ dap_string_t* dap_string_up(dap_string_t *string)
  */
 void dap_string_append_vprintf(dap_string_t *string, const char *format, va_list args)
 {
-    const char l_oom [] = { "Out of memory@%s!" }, l_buf[128];
-    char *buf;
+    const char l_oom [] = { "Out of memory@%s!" };
+    char *buf, l_buf[128];
     int len;
 
     dap_return_if_fail(string != NULL);
@@ -852,7 +852,7 @@ void dap_string_append_vprintf(dap_string_t *string, const char *format, va_list
         memcpy(string->str + string->len, buf, len + 1);
         string->len += len;
     } else {
-        len = sprintf(l_buf, l_oom, __func__ );
+        len = dap_sprintf(l_buf, l_oom, __func__ );
         if ( (string->str = DAP_NEW_SIZE(char, sizeof(l_buf ))) )
             memcpy(string->str, l_buf , len);
     }
diff --git a/modules/chain/dap_chain_pvt.c b/modules/chain/dap_chain_pvt.c
index afb7af0186..33f233562a 100644
--- a/modules/chain/dap_chain_pvt.c
+++ b/modules/chain/dap_chain_pvt.c
@@ -34,6 +34,13 @@
 #define LOG_TAG "dap_chain_pvt"
 
 
+void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_global_db_obj_callback_notify_t a_callback, void *a_cb_arg)
+{
+    dap_chain_gdb_notifier_t *l_notifier = DAP_NEW(dap_chain_gdb_notifier_t);
+    l_notifier->callback = a_callback;
+    l_notifier->cb_arg = a_cb_arg;
+    DAP_CHAIN_PVT(a_chain)->mempool_notifires = dap_list_append(DAP_CHAIN_PVT(a_chain)->mempool_notifires, l_notifier);
+}
 
 
 
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index f0d2b64a1f..eafbdb94cc 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -31,10 +31,10 @@
 
 #include "dap_chain_datum.h"
 #include "dap_chain_datum_tx.h"
-struct dap_chain;
+#include "dap_chain_global_db.h"
+
 typedef struct dap_chain dap_chain_t;
 
-struct dap_chain_cell;
 typedef struct dap_chain_cell dap_chain_cell_t;
 
 typedef struct dap_ledger dap_ledger_t;
@@ -164,6 +164,11 @@ typedef struct dap_chain{
     void * _inheritor; // inheritor object
 } dap_chain_t;
 
+typedef struct dap_chain_gdb_notifier {
+    dap_global_db_obj_callback_notify_t callback;
+    void *cb_arg;
+} dap_chain_gdb_notifier_t;
+
 #define DAP_CHAIN(a) ( (dap_chain_t *) (a)->_inheritor)
 
 int dap_chain_init(void);
@@ -190,3 +195,4 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not
 dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size);
 bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cel_id);
 ssize_t dap_chain_atom_save(dap_chain_t *a_chain, const uint8_t *a_atom, size_t a_atom_size, dap_chain_cell_id_t a_cell_id);
+void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_global_db_obj_callback_notify_t a_callback, void *a_cb_arg);
diff --git a/modules/chain/include/dap_chain_pvt.h b/modules/chain/include/dap_chain_pvt.h
index 4af990d5fc..6e50793adb 100644
--- a/modules/chain/include/dap_chain_pvt.h
+++ b/modules/chain/include/dap_chain_pvt.h
@@ -26,12 +26,9 @@
 #include <stdint.h>
 #include "dap_common.h"
 #include "dap_chain.h"
-
 #include "dap_chain_cs.h"
 #include "dap_chain_cell.h"
 
-
-
 /**
   * @struct dap_chain_pvt
   * @brief Internal blochain data, mostly aggregated
@@ -43,6 +40,7 @@ typedef struct dap_chain_pvt
     char * file_storage_dir;
     char * cs_name;
     int celled;
+    dap_list_t *mempool_notifires;
 } dap_chain_pvt_t;
 
 #define DAP_CHAIN_PVT(a) ((dap_chain_pvt_t *) a->_pvt  )
@@ -50,4 +48,3 @@ typedef struct dap_chain_pvt
 #define DAP_CHAIN_PVT_LOCAL(a) dap_chain_pvt_t * l_chain_pvt = DAP_CHAIN_PVT(a)
 
 #define DAP_CHAIN_PVT_LOCAL_NEW(a) dap_chain_pvt_t * l_chain_pvt = DAP_NEW_Z(dap_chain_pvt_t); a->_pvt = l_chain_pvt
-
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index be041c9fcf..16cf0202ad 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -634,47 +634,24 @@ static void s_gdb_sync_tsd_worker_callback(dap_worker_t *a_worker, void *a_arg)
  * @param group_name 
  * @return dap_chain_t* 
  */
-dap_chain_t *dap_chain_get_chain_from_group_name(dap_chain_net_id_t net_id, const char *group_name)
+dap_chain_t *dap_chain_get_chain_from_group_name(dap_chain_net_id_t a_net_id, const char *a_group_name)
 {
-    if (!group_name)
-    {
+    if (!a_group_name) {
         log_it(L_ERROR, "GDB group name is NULL ");
         return NULL;
     }
-    
-    dap_chain_net_t *l_net = dap_chain_net_by_id(net_id); 
-
+    dap_chain_net_t *l_net = dap_chain_net_by_id(a_net_id);
     if (!l_net)
         return false;
-
-    dap_chain_t *l_chain;
-
-    DL_FOREACH(l_net->pub.chains, l_chain) 
-    {
-        char *s_chain_group_name = dap_chain_net_get_gdb_group_from_chain(l_chain);    
-
-        if (!strcmp(group_name,s_chain_group_name))
-        {
-            DAP_DELETE(s_chain_group_name);
-            return l_chain;
-        }             
-        DAP_DELETE(s_chain_group_name);
-
-        //
-        // if we don't get GDB group name, we get it from mempool group
-        //
-
-        s_chain_group_name = dap_chain_net_get_gdb_group_mempool(l_chain);
-
-        if (!strcmp(group_name,s_chain_group_name))
-        {
-            DAP_DELETE(s_chain_group_name);
+    dap_chain_t *l_chain = NULL;
+    DL_FOREACH(l_net->pub.chains, l_chain) {
+        char *l_chain_group_name = dap_chain_net_get_gdb_group_from_chain(l_chain);
+        if (!strcmp(a_group_name, l_chain_group_name)) {
+            DAP_DELETE(l_chain_group_name);
             return l_chain;
         }
-
-        DAP_DELETE(s_chain_group_name);
-    }    
-    
+        DAP_DELETE(l_chain_group_name);
+    }
     return NULL;
 }
 
diff --git a/modules/channel/chain/include/dap_stream_ch_chain.h b/modules/channel/chain/include/dap_stream_ch_chain.h
index 82dc678168..a4600374ba 100644
--- a/modules/channel/chain/include/dap_stream_ch_chain.h
+++ b/modules/channel/chain/include/dap_stream_ch_chain.h
@@ -92,5 +92,5 @@ void dap_stream_ch_chain_deinit(void);
 
 inline static uint8_t dap_stream_ch_chain_get_id(void) { return (uint8_t) 'C'; }
 void dap_stream_ch_chain_go_idle ( dap_stream_ch_chain_t * a_ch_chain);
-dap_chain_t * dap_chain_get_chain_from_group_name(dap_chain_net_id_t net_id, const char *group_name);
+dap_chain_t * dap_chain_get_chain_from_group_name(dap_chain_net_id_t a_net_id, const char *a_group_name);
 void dap_stream_ch_chain_create_sync_request_gdb(dap_stream_ch_chain_t * a_ch_chain, dap_chain_net_t * a_net);
diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c
index 610845e57b..ff89056db6 100644
--- a/modules/consensus/none/dap_chain_cs_none.c
+++ b/modules/consensus/none/dap_chain_cs_none.c
@@ -141,7 +141,6 @@ static void s_history_callback_notify(void * a_arg, const char a_op_code, const
         dap_chain_net_t *l_net = dap_chain_net_by_id( l_gdb->chain->net_id);
         log_it(L_DEBUG,"%s.%s: op_code='%c' group=\"%s\" key=\"%s\" value_size=%zu",l_net->pub.name,
                l_gdb->chain->name, a_op_code, a_group, a_key, a_value_size);
-        dap_chain_node_mempool_autoproc_notify((void *)l_net, a_op_code, a_group, a_key, a_value, a_value_size);
         dap_chain_net_sync_gdb_broadcast((void *)l_net, a_op_code, a_group, a_key, a_value, a_value_size);
     }
 }
diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c
index f2ebde4d2e..e874bb9723 100644
--- a/modules/global-db/dap_chain_global_db.c
+++ b/modules/global-db/dap_chain_global_db.c
@@ -211,7 +211,7 @@ int dap_chain_global_db_init(dap_config_t * g_config)
     s_track_history = dap_config_get_item_bool_default(g_config, "resources", "dap_global_db_track_history", s_track_history);
 
     s_db_drvmode_async = dap_config_get_item_bool(g_config, "resources", "dap_global_db_drvmode_async");
-    log_it(L_NOTICE,"DB Driver Async mode: %s", s_db_drvmode_async ? "ON": "Off");
+    log_it(L_NOTICE,"DB Driver Async mode: %s", s_db_drvmode_async ? "ON": "OFF");
 
     lock();
     int res = dap_db_driver_init(l_driver_name, l_storage_path, s_db_drvmode_async);
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 04848913bb..602e6e6812 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -186,7 +186,7 @@ typedef struct dap_chain_net_pvt{
     // General rwlock for structure
     pthread_rwlock_t rwlock;
 
-    dap_list_t *notify_callbacks;
+    dap_list_t *gdb_notifiers;
 } dap_chain_net_pvt_t;
 
 typedef struct dap_chain_net_item{
@@ -388,12 +388,14 @@ dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net)
  *
  * @param a_callback dap_global_db_obj_callback_notify_t callback function
  */
-void dap_chain_net_add_notify_callback(dap_chain_net_t *a_net, dap_global_db_obj_callback_notify_t a_callback)
+void dap_chain_net_add_gdb_notify_callback(dap_chain_net_t *a_net, dap_global_db_obj_callback_notify_t a_callback, void *a_cb_arg)
 {
-   PVT(a_net)->notify_callbacks = dap_list_append(PVT(a_net)->notify_callbacks, a_callback);
+    dap_chain_gdb_notifier_t *l_notifier = DAP_NEW(dap_chain_gdb_notifier_t);
+    l_notifier->callback = a_callback;
+    l_notifier->cb_arg = a_cb_arg;
+    PVT(a_net)->gdb_notifiers = dap_list_append(PVT(a_net)->gdb_notifiers, l_notifier);
 }
 
-
 /**
  * @brief if current network in ONLINE state send to all connected node
  * executes, when you add data to gdb chain (class=gdb in chain config)
@@ -434,14 +436,6 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c
         dap_store_obj_pkt_t *l_data_out = dap_store_packet_single(l_obj);
         dap_store_obj_free(l_obj, 1);
         dap_chain_t *l_chain = dap_chain_get_chain_from_group_name(l_net->pub.id, a_group);
-
-        if (!l_chain)
-        {     
-            log_it(L_WARNING, "chain object is not found for group %s", a_group);
-            DAP_DELETE(l_data_out);
-            return;
-        }
-
         dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t) {};
         dap_chain_cell_id_t l_cell_id = l_chain ? l_chain->cells->id : (dap_chain_cell_id_t){};
         pthread_rwlock_rdlock(&PVT(l_net)->rwlock);
@@ -478,10 +472,31 @@ static void s_gbd_history_callback_notify(void *a_arg, const char a_op_code, con
         return;
     }
     dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg;
-    for (dap_list_t *it = PVT(l_net)->notify_callbacks; it; it = it->next) {
-        dap_global_db_obj_callback_notify_t l_callback = (dap_global_db_obj_callback_notify_t)it->data;
+    for (dap_list_t *it = PVT(l_net)->gdb_notifiers; it; it = it->next) {
+        dap_chain_gdb_notifier_t *el = (dap_chain_gdb_notifier_t *)it->data;
+        if (!el)
+            continue;
+        dap_global_db_obj_callback_notify_t l_callback = el->callback;
         if (l_callback)
-            l_callback(a_arg, a_op_code, a_group, a_key, a_value, a_value_len);
+            l_callback(el->cb_arg, a_op_code, a_group, a_key, a_value, a_value_len);
+    }
+    dap_chain_t *l_chain;
+    DL_FOREACH(l_net->pub.chains, l_chain) {
+        if (!l_chain) {
+            continue;
+        }
+        char *l_gdb_group_str = dap_chain_net_get_gdb_group_mempool(l_chain);
+        if (!strcmp(a_group, l_gdb_group_str)) {
+            for (dap_list_t *it = DAP_CHAIN_PVT(l_chain)->mempool_notifires; it; it = it->next) {
+                dap_chain_gdb_notifier_t *el = (dap_chain_gdb_notifier_t *)it->data;
+                if (!el)
+                    continue;
+                dap_global_db_obj_callback_notify_t l_callback = el->callback;
+                if (l_callback)
+                    l_callback(el->cb_arg, a_op_code, a_group, a_key, a_value, a_value_len);
+            }
+        }
+        DAP_DELETE(l_gdb_group_str);
     }
 }
 
@@ -2476,7 +2491,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
         // reload ledger cache at once
         s_chain_net_reload_ledger_cache_once(l_net);
 
-        dap_chain_net_add_notify_callback(l_net, dap_chain_net_sync_gdb_broadcast);
+        dap_chain_net_add_gdb_notify_callback(l_net, dap_chain_net_sync_gdb_broadcast, l_net);
         if (l_target_state != l_net_pvt->state_target)
             dap_chain_net_state_go_to(l_net, l_target_state);
 
@@ -2785,7 +2800,6 @@ bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net)
  */
 void dap_chain_net_proc_mempool (dap_chain_net_t * a_net)
 {
-
     dap_string_t * l_str_tmp = dap_string_new(NULL);
     dap_chain_t *l_chain;
     DL_FOREACH(a_net->pub.chains, l_chain) {
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index 4d42872cab..de32cd4f0e 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -234,6 +234,22 @@ int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_da
     return (int)a_chain->callback_add_datums(a_chain, &a_datum, 1);
 }
 
+static void s_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_group,
+                                             const char *a_key, const void *a_value, const size_t a_value_len)
+{
+    UNUSED(a_value_len);
+    if (!a_arg || !a_value || a_op_code != 'a') {
+        return;
+    }
+    dap_chain_t *l_chain =(dap_chain_t *)a_arg;
+    dap_chain_net_t *l_net = dap_chain_net_by_id(l_chain->net_id);
+    if (!l_net->pub.mempool_autoproc)
+        return;
+    dap_chain_datum_t *l_datum = (dap_chain_datum_t *)a_value;
+    if (dap_chain_node_mempool_process(l_chain, l_datum) >= 0) {
+        dap_chain_global_db_gr_del(a_key, a_group);
+    }
+}
 
 /**
  * @brief
@@ -285,8 +301,8 @@ bool dap_chain_node_mempool_autoproc_init()
                     dap_chain_global_db_objs_delete(l_objs, l_objs_size);
                 }
                 DAP_DELETE(l_gdb_group_mempool);
+                dap_chain_add_mempool_notify_callback(l_chain, s_chain_node_mempool_autoproc_notify, l_chain);
             }
-            dap_chain_net_add_notify_callback(l_net_list[i], dap_chain_node_mempool_autoproc_notify);
         }
     }
     DAP_DELETE(l_net_list);
@@ -299,29 +315,3 @@ bool dap_chain_node_mempool_autoproc_init()
 void dap_chain_node_mempool_autoproc_deinit()
 {
 }
-
-void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_group,
-                                             const char *a_key, const void *a_value, const size_t a_value_len)
-{
-    UNUSED(a_value_len);
-    if (!a_arg || !a_value || a_op_code != 'a') {
-        return;
-    }
-    dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg;
-    if (!l_net->pub.mempool_autoproc)
-        return;
-    dap_chain_t *l_chain;
-    DL_FOREACH(l_net->pub.chains, l_chain) {
-        if (!l_chain) {
-            continue;
-        }
-        char *l_gdb_group_str = dap_chain_net_get_gdb_group_mempool(l_chain);
-        if (!strcmp(a_group, l_gdb_group_str)) {
-            dap_chain_datum_t *l_datum = (dap_chain_datum_t *)a_value;
-            if (dap_chain_node_mempool_process(l_chain, l_datum) >= 0) {
-                dap_chain_global_db_gr_del( a_key, l_gdb_group_str);
-            }
-        }
-        DAP_DELETE(l_gdb_group_str);
-    }
-}
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index 07468926d7..8de81bd720 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -83,7 +83,6 @@ typedef struct dap_chain_net{
     uint8_t pvt[];
 } dap_chain_net_t;
 
-
 int dap_chain_net_init(void);
 void dap_chain_net_deinit(void);
 
@@ -185,7 +184,7 @@ bool dap_chain_net_get_add_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr
 
 int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t * a_datum );
 void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type);
-void dap_chain_net_add_notify_callback(dap_chain_net_t *a_net, dap_global_db_obj_callback_notify_t a_callback);
+void dap_chain_net_add_gdb_notify_callback(dap_chain_net_t *a_net, dap_global_db_obj_callback_notify_t a_callback, void *a_cb_arg);
 void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const char *a_group,
                                       const char *a_key, const void *a_value, const size_t a_value_len);
 
diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h
index 447527b6a5..8b5c36720c 100644
--- a/modules/net/include/dap_chain_node.h
+++ b/modules/net/include/dap_chain_node.h
@@ -147,6 +147,3 @@ inline static char* dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *addre
 int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_datum);
 bool dap_chain_node_mempool_autoproc_init();
 void dap_chain_node_mempool_autoproc_deinit();
-void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_group,
-                                             const char *a_key, const void *a_value, const size_t a_value_len);
-
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index ff03823de2..79ddfab3f4 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -59,7 +59,9 @@ char *s_server_continents[]={
 struct dap_order_notify {
     dap_chain_net_t *net;
     dap_global_db_obj_callback_notify_t callback;
+    void *cb_arg;
 };
+
 static dap_list_t *s_order_notify_callbacks = NULL;
 static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const char *a_group,
                                    const char *a_key, const void *a_value, const size_t a_value_len);
@@ -73,7 +75,7 @@ int dap_chain_net_srv_order_init(void)
     uint16_t l_net_count;
     dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count);
     for (uint16_t i = 0; i < l_net_count; i++) {
-        dap_chain_net_add_notify_callback(l_net_list[i], s_srv_order_callback_notify);
+        dap_chain_net_add_gdb_notify_callback(l_net_list[i], s_srv_order_callback_notify, l_net_list[i]);
     }
     //geoip_info_t *l_ipinfo = chain_net_geoip_get_ip_info("8.8.8.8");
     return 0;
@@ -583,17 +585,20 @@ static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const
             struct dap_order_notify *l_notifier = (struct dap_order_notify *)it->data;
             if ((l_notifier->net == NULL || l_notifier->net == l_net) &&
                         l_notifier->callback) {
-                l_notifier->callback(a_arg, a_op_code, a_group, a_key, a_value, a_value_len);
+                l_notifier->callback(l_notifier->cb_arg, a_op_code, a_group,
+                                     a_key, a_value, a_value_len);
             }
         }
-        if (a_value && a_op_code != 'a' && dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) {
+        if (a_value && a_op_code == DAP_DB$K_OPTYPE_ADD &&
+                dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) {
             dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_value;
             if (l_order->version != 2) {
                 dap_chain_global_db_gr_del( a_key, a_group);
             } else {
                 dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext_n_sign[l_order->ext_size];
                 if (!dap_sign_verify_size(l_sign, a_value_len) ||
-                        dap_sign_verify(l_sign, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size) != 1) {
+                        dap_sign_verify(l_sign, l_order,
+                                        sizeof(dap_chain_net_srv_order_t) + l_order->ext_size) != 1) {
                     dap_chain_global_db_gr_del( a_key, a_group);
                     DAP_DELETE(l_gdb_group_str);
                     return;
@@ -617,10 +622,11 @@ static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const
     DAP_DELETE(l_gdb_group_str);
 }
 
-void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_global_db_obj_callback_notify_t a_callback)
+void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_global_db_obj_callback_notify_t a_callback, void *a_cb_arg)
 {
     struct dap_order_notify *l_notifier = DAP_NEW(struct dap_order_notify);
     l_notifier->net = a_net;
     l_notifier->callback = a_callback;
+    l_notifier->cb_arg = a_cb_arg;
     s_order_notify_callbacks = dap_list_append(s_order_notify_callbacks, l_notifier);
 }
diff --git a/modules/net/srv/include/dap_chain_net_srv_order.h b/modules/net/srv/include/dap_chain_net_srv_order.h
index 64ba42eff1..4c959be7e9 100644
--- a/modules/net/srv/include/dap_chain_net_srv_order.h
+++ b/modules/net/srv/include/dap_chain_net_srv_order.h
@@ -148,7 +148,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose(
 
 char *dap_chain_net_srv_order_save(dap_chain_net_t *a_net, dap_chain_net_srv_order_t *a_order);
 void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,dap_string_t * a_str_out, const char *a_hash_out_type);
-void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_global_db_obj_callback_notify_t a_callback);
+void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_global_db_obj_callback_notify_t a_callback, void *a_cb_arg);
 /**
 * @brief dap_chain_net_srv_order_get_gdb_group_mempool
 * @param l_chain
-- 
GitLab