diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
index ff25920ff09e6046d81f1f6977b2452dff2d0e17..280795fc482adf9089c425562ed24ecfd857649a 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -822,6 +822,7 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_
         l_event_new_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash);
         if (dap_chain_cs_dag_event_gdb_set(a_dag, l_event_new_hash_hex_str, l_event,
                                             l_event_size_new, l_round_item, a_group)) {
+            // a_dag->callback_broadcast(a_dag, l_round_item);
             // dap_chain_global_db_gr_del(a_key, a_group); // Delete old event
         }
         bool l_event_is_ready = s_round_event_ready_minimum_check(a_dag, l_event, l_event_size_new,
diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c
index 08a60601aa7e3e57e8e2f175492e19363ff0c4e4..9edc1f3b0720df6149bc499006f7d1c166a88772 100644
--- a/modules/service/stake/dap_chain_net_srv_stake.c
+++ b/modules/service/stake/dap_chain_net_srv_stake.c
@@ -68,7 +68,9 @@ int dap_chain_net_srv_stake_init()
     "srv_stake invalidate -net <net name> -tx <transaction hash> -wallet <wallet name>\n"
          "\tInvalidate requested stake transaction by hash within net name and return stake to specified wallet\n"
     );
+
     s_srv_stake = DAP_NEW_Z(dap_chain_net_srv_stake_t);
+    
     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++) {
@@ -150,11 +152,16 @@ void dap_chain_net_srv_stake_deinit()
 static void s_stake_update(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_authorized)
 {
     dap_chain_net_srv_stake_item_t *l_stake;
-    if (a_cond)
+    if (a_cond) {
         HASH_FIND(hh, s_srv_stake->itemlist, &a_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t), l_stake);
-    else
+    }
+    else {
         l_stake = DAP_NEW_Z(dap_chain_net_srv_stake_item_t);
-    assert(l_stake);
+    }
+    // assert(l_stake);
+    if (!l_stake) {
+        return;
+    }
     dap_chain_tx_out_cond_t *l_out_cond = (dap_chain_tx_out_cond_t *)dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_OUT_COND, NULL);
     if (!l_out_cond || l_out_cond->header.subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE) {
         // Stake tx is used out
@@ -167,7 +174,8 @@ static void s_stake_update(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t
         // New stake transaction
         memcpy(&l_stake->signing_addr, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t));
         HASH_ADD(hh, s_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake);
-    } else if (memcmp(&a_cond->subtype.srv_stake.signing_addr, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t))) {
+    }
+    else if (memcmp(&a_cond->subtype.srv_stake.signing_addr, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t))) {
         HASH_DEL(s_srv_stake->itemlist, l_stake);
         dap_chain_net_srv_stake_item_t *l_stake_cur = NULL;
         HASH_FIND(hh, s_srv_stake->itemlist, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t), l_stake_cur);
@@ -179,8 +187,9 @@ static void s_stake_update(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t
         if (l_stake_cur)
             HASH_ADD(hh, s_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake);
     }
-    if (a_authorized)
+    if (a_authorized) {
         l_stake->is_active = true;
+    }
     memcpy(&l_stake->addr_hldr, &l_out_cond->subtype.srv_stake.hldr_addr, sizeof(dap_chain_addr_t));
     memcpy(&l_stake->addr_fee, &l_out_cond->subtype.srv_stake.fee_addr, sizeof(dap_chain_addr_t));
     l_stake->fee_value = l_out_cond->subtype.srv_stake.fee_value;
@@ -233,11 +242,17 @@ static bool s_stake_conditions_calc(dap_chain_tx_out_cond_t *a_cond, dap_chain_d
 
 bool dap_chain_net_srv_stake_verificator(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner)
 {
+    if (!s_srv_stake) {
+        return false;
+    }
     return s_stake_conditions_calc(a_cond, a_tx, a_owner, false);
 }
 
 bool dap_chain_net_srv_stake_updater(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner)
 {
+    if (!s_srv_stake) {
+        return false;
+    }
     return s_stake_conditions_calc(a_cond, a_tx, a_owner, true);
 }
 
@@ -416,7 +431,8 @@ static bool s_stake_tx_put(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_net)
     // Put the transaction to mempool or directly to chains
     size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx);
     dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, a_tx, l_tx_size);
-    DAP_DELETE(a_tx);
+    // don't delete a_tx because in s_cli_srv_stake() after this function calc hash this tx
+    // DAP_DELETE(a_tx);
     dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX);
     if (!l_chain) {
         return false;
@@ -1246,7 +1262,8 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply)
             dap_chain_wallet_close(l_wallet);
             if (l_success) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Stake successfully returned to owner");
-                HASH_DEL(s_srv_stake->itemlist, l_stake);
+                // don't delete stake here because it delete in s_stake_update after invalidate tx approve
+                // HASH_DEL(s_srv_stake->itemlist, l_stake);
             } else {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Can't invalidate transaction %s", l_tx_hash_str);
                 return -21;
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 05b6d6e5d7ce2d57d3dba31bb2305f74d9fcf48f..c43ae400ba1f4d20ceae5041b33bec4c9f1a466e 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -171,7 +171,7 @@ void dap_chain_cs_dag_deinit(void)
 }
 
 static void s_history_callback_round_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_size)
+                                        const char *a_key, const void *a_value, const size_t a_value_size)
 {
     dap_chain_cs_dag_t *l_dag = (dap_chain_cs_dag_t *)a_arg;
     if (a_arg && !l_dag->broadcast_disable){
@@ -192,11 +192,16 @@ static void s_history_callback_round_notify(void *a_arg, const char a_op_code, c
         else if ( a_op_code == DAP_DB$K_OPTYPE_DEL ) {
             dap_chain_cs_new_event_add_datums(l_dag->chain, true);
         }
-        dap_chain_cs_dag_event_broadcast(l_dag, a_op_code, a_group,
-            a_key, a_value, a_value_size);
     }
 }
 
+static void s_dag_chain_cs_event_round_broadcast(dap_chain_cs_dag_t *a_dag, 
+                                    dap_chain_cs_dag_event_round_item_t *a_round_item, const char *a_key) {
+    size_t l_round_item_size = dap_chain_cs_dag_event_round_item_get_size(a_round_item);
+    dap_chain_cs_dag_event_broadcast(a_dag, DAP_DB$K_OPTYPE_ADD, a_dag->gdb_group_events_round_new,
+            a_key, a_round_item, l_round_item_size);
+}
+
 /**
  * @brief dap_chain_cs_dag_new
  * @param a_chain
@@ -276,6 +281,7 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     l_dag->datum_add_hashes_count = dap_config_get_item_uint16_default(a_chain_cfg,"dag","datum_add_hashes_count",1);
     l_dag->use_event_round_info = false;
     l_dag->callback_cs_set_event_round_info = s_dag_chain_cs_set_event_round_info;
+    l_dag->callback_broadcast = s_dag_chain_cs_event_round_broadcast;
     char * l_round_new_str = dap_strdup( dap_config_get_item_str_default(a_chain_cfg,"dag","gdb_group_events_round_new", "new"));
     dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id);
     
diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c
index 994c451d996678f17d5de963bd1abd4b7236da5a..c020316381993712c5dffc91c91940886aa8f2c9 100644
--- a/modules/type/dag/dap_chain_cs_dag_event.c
+++ b/modules/type/dag/dap_chain_cs_dag_event.c
@@ -314,6 +314,7 @@ bool dap_chain_cs_dag_event_gdb_set(dap_chain_cs_dag_t *a_dag, char *a_event_has
             dap_chain_cs_dag_event_round_item_get_size(l_round_item),
             a_group);
 
+    a_dag->callback_broadcast(a_dag, l_round_item, a_event_hash_str);
     DAP_DELETE(l_round_item);
     return ret;
 }
diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h
index 9431e95de1313c80756843337b6cae14d9458378..d96bb74b1f52ed67d096a7ac2f1d358f9a01e6c4 100644
--- a/modules/type/dag/include/dap_chain_cs_dag.h
+++ b/modules/type/dag/include/dap_chain_cs_dag.h
@@ -29,6 +29,8 @@
 typedef struct dap_chain_cs_dag dap_chain_cs_dag_t;
 
 typedef void (*dap_chain_cs_dag_callback_t)(dap_chain_cs_dag_t *);
+typedef void (*dap_chain_cs_dag_callback_broadcast_t)(dap_chain_cs_dag_t *,
+                                    dap_chain_cs_dag_event_round_item_t *, const char *a_key);
 typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *,size_t);
 
 typedef dap_chain_cs_dag_event_t * (*dap_chain_cs_dag_callback_event_create_t)(dap_chain_cs_dag_t *,
@@ -66,6 +68,7 @@ typedef struct dap_chain_cs_dag
     char *gdb_group_datums_queue;
 
     dap_chain_cs_dag_callback_t callback_delete;
+    dap_chain_cs_dag_callback_broadcast_t callback_broadcast;
     dap_chain_cs_dag_callback_event_create_t callback_cs_event_create;
     dap_chain_cs_dag_callback_event_t callback_cs_verify;
     dap_chain_cs_dag_callback_get_round_info_t callback_cs_get_round_info;