diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index b8e892c4f6c46ef25637fdbb618078723de985cf..90ad7a05a418c839de12a0b91cc6cd76a6d8da3a 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -809,9 +809,6 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast
     uint256_t l_value_transfer = {};
     dap_chain_addr_t l_addr_fee = {};
     dap_chain_addr_t* l_addr_from = NULL;
-    //dap_chain_tx_out_cond_t *l_tx_out_fee = NULL;
-    //dap_chain_tx_out_t *l_out_fee_net;
-    //dap_chain_tx_in_t *l_in;
     dap_list_t *l_list_used_out;
     const char *l_native_ticker = dap_chain_net_by_id(a_chain->net_id)->pub.native_ticker;
     bool not_native = dap_strcmp(a_ticker, l_native_ticker);
@@ -821,7 +818,15 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast
 
     dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t));
     l_tx->header.ts_created = time(NULL);
-
+    //in_ems
+    dap_chain_tx_in_ems_t *l_in_ems = dap_chain_datum_tx_item_in_ems_create(a_emission_chain_id, a_emission_hash, a_ticker);
+    if (l_in_ems) {
+        dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*)l_in_ems);
+        DAP_DELETE(l_in_ems);
+    } else {
+        dap_chain_datum_tx_delete(l_tx);
+        return NULL;
+    }
     if (not_native)
     {
         l_addr_from = DAP_NEW_Z(dap_chain_addr_t);
@@ -869,9 +874,7 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast
             dap_chain_datum_tx_delete(l_tx);
             return NULL;
         }
-    }
-    else
-    {//nativ ticker
+    } else { //native ticker
         if (!IS_ZERO_256(a_value_fee))
             SUBTRACT_256_256(l_value_need, a_value_fee, &l_value_need);
         if(l_net_fee_used){
@@ -886,17 +889,6 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast
             return NULL;
         }        
     }
-    //in_ems
-    dap_chain_tx_in_ems_t    *l_tx_token = dap_chain_datum_tx_item_in_ems_create(a_emission_chain_id, a_emission_hash, a_ticker);
-    if(l_tx_token){
-        dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_tx_token);
-        DAP_DEL_Z(l_tx_token);
-    }
-    else
-    {
-        dap_chain_datum_tx_delete(l_tx);
-        return NULL;
-    }
     if (!IS_ZERO_256(a_value_fee)){
         if (!dap_chain_datum_tx_add_fee_item(&l_tx, a_value_fee)){
             dap_chain_datum_tx_delete(l_tx);
diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c
index 3c32c1f4c5c581dfb40b954bd224bbb240328e98..7174f34d2011c8a50d5b433c00c4797454a7aaa2 100644
--- a/modules/net/dap_chain_node_cli.c
+++ b/modules/net/dap_chain_node_cli.c
@@ -278,7 +278,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
 
     // Transaction history
     dap_cli_server_cmd_add("tx_history", com_tx_history, "Transaction history (for address or by hash)",
-            "tx_history  {-addr <addr> | -w <wallet_name> | -tx <tx_hash>} -net <net_name> -chain <chain_name>\n");
+            "tx_history  {-addr <addr> | -w <wallet_name> | -tx <tx_hash>} [-net <net_name>] [-chain <chain_name>]\n");
 
 	// Ledger info
     dap_cli_server_cmd_add("ledger", com_ledger, "Ledger information",
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index ff6f17506b8d70174b07d7b40f5eddcdc48420c4..a1a8da9573a31406e11065adc058e4429b07245a 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -3839,9 +3839,6 @@ int com_token_emit(int a_argc, char **a_argv, char **a_str_reply)
     const char * l_chain_emission_str = NULL;
     dap_chain_t * l_chain_emission = NULL;
 
-    const char * l_chain_base_tx_str = NULL;
-    dap_chain_t * l_chain_base_tx = NULL;
-
     dap_chain_net_t * l_net = NULL;
 
     const char * l_hash_out_type = NULL;
@@ -3882,7 +3879,6 @@ int com_token_emit(int a_argc, char **a_argv, char **a_str_reply)
     }
     const char *l_add_sign = NULL;
     dap_chain_addr_t *l_addr = NULL;
-    dap_chain_addr_t *l_addr_from = NULL;
     dap_cli_server_cmd_find_option_val(a_argv, arg_index, arg_index + 1, "sign", &l_add_sign);
     if (!l_add_sign) {      //Create the emission
         // Emission value
@@ -3916,8 +3912,8 @@ int com_token_emit(int a_argc, char **a_argv, char **a_str_reply)
         if(l_chain_emission_str) {
             if((l_chain_emission = dap_chain_net_get_chain_by_name(l_net, l_chain_emission_str)) == NULL) { // Can't find such chain
                 dap_cli_server_cmd_set_reply_text(a_str_reply,
-                                      "token_emit requires parameter '-chain_base_tx' to be valid chain name in chain net %s or set default datum type in chain configuration file "
-                                      "but, if you need create emission has no base transaction, use flag '-no_base_tx'", l_net->pub.name);
+                                      "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;
             }
         }
@@ -5191,82 +5187,83 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply)
     dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-chain", &l_chain_str);
     dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-tx", &l_tx_hash_str);
 
-    if(!l_addr_base58 && !l_wallet_name && !l_tx_hash_str) {
+    if (!l_addr_base58 && !l_wallet_name && !l_tx_hash_str) {
         dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-addr' or '-w' or '-tx'");
         return -1;
     }
 
-    // Select chain network
-    if(!l_net_str) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-net'");
+    if (!l_net_str && !l_addr_base58) {
+        dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-net' or '-addr'");
         return -2;
-    } else {
-        if((l_net = dap_chain_net_by_name(l_net_str)) == NULL) { // Can't find such network
-            dap_cli_server_cmd_set_reply_text(a_str_reply,
-                    "tx_history requires parameter '-net' to be valid chain network name");
-            return -3;
-        }
     }
-    //Select chain emission
-	if (l_chain_str) {
-		l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str);
-	}
-	else {
-		l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_EMISSION);
-	}
-
-	if(!l_chain) {
-		dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-chain' to be valid chain name in chain net %s. You can set default datum type in chain configuration file",
-										  l_net_str);
-		return -8;
-	}
-/*    if(!l_chain_str) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-chain'");
-        return -4;
-    } else {
-        if((l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str)) == NULL) { // Can't find such chain
-            dap_cli_server_cmd_set_reply_text(a_str_reply,
-                    "tx_history requires parameter '-chain' to be valid chain name in chain net %s",
-                    l_net_str);
-            return -5;
-        }
-    }*/
-    //char *l_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
-    //const char *l_chain_group = dap_chain_gdb_get_group(l_chain);
 
     dap_chain_hash_fast_t l_tx_hash;
-    if(l_tx_hash_str) {
-        if(dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) {
-            l_tx_hash_str = NULL;
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "tx hash not recognized");
-            return -1;
+    if (l_tx_hash_str && dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) {
+        dap_cli_server_cmd_set_reply_text(a_str_reply, "tx hash not recognized");
+        return -3;
+    }
+    // Select chain network
+    if (l_net_str) {
+        l_net = dap_chain_net_by_name(l_net_str);
+        if (!l_net) { // Can't find such network
+            dap_cli_server_cmd_set_reply_text(a_str_reply,
+                    "tx_history requires parameter '-net' to be valid chain network name");
+            return -3;
         }
-//        char hash_str[99];
-//        dap_chain_hash_fast_to_str(&l_tx_hash, hash_str,99);
-//        int gsdgsd=523;
     }
+    // Get chain address
     dap_chain_addr_t *l_addr = NULL;
-    // if need addr
-    if(!l_tx_hash_str) {
-        if(l_wallet_name) {
-            const char *c_wallets_path = dap_chain_wallet_get_path(g_config);
-            dap_chain_wallet_t * l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path);
-            if(l_wallet) {
-                dap_chain_addr_t *l_addr_tmp = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet, l_net->pub.id);
-                l_addr = DAP_NEW_SIZE(dap_chain_addr_t, sizeof(dap_chain_addr_t));
-                memcpy(l_addr, l_addr_tmp, sizeof(dap_chain_addr_t));
-                dap_chain_wallet_close(l_wallet);
-            }
+    if (l_addr_base58) {
+        if (l_tx_hash_str) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Incomatible params '-addr' & '-tx'");
+            return -4;
         }
-        if(!l_addr && l_addr_base58) {
-            l_addr = dap_chain_addr_from_str(l_addr_base58);
+        l_addr = dap_chain_addr_from_str(l_addr_base58);
+        if (!l_addr) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet address not recognized");
+            return -5;
         }
-        if(!l_addr && !l_tx_hash_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "wallet address not recognized");
-            return -1;
+        if (l_net) {
+            if (l_net->pub.id.uint64 != l_addr->net_id.uint64) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply,
+                                                  "Network ID with '-net' param and network ID with '-addr' param are different");
+                DAP_DELETE(l_addr);
+                return -6;
+            }
+        } else
+            l_net = dap_chain_net_by_id(l_addr->net_id);
+    }
+    if (l_wallet_name) {
+        const char *c_wallets_path = dap_chain_wallet_get_path(g_config);
+        dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path);
+        if (l_wallet) {
+            dap_chain_addr_t *l_addr_tmp = dap_chain_wallet_get_addr(l_wallet, l_net->pub.id);
+            if (l_addr) {
+                if (!dap_chain_addr_compare(l_addr, l_addr_tmp)) {
+                    dap_cli_server_cmd_set_reply_text(a_str_reply,
+                                                      "Address with '-addr' param and address with '-w' param are different");
+                    DAP_DELETE(l_addr);
+                    DAP_DELETE(l_addr_tmp);
+                    return -7;
+                }
+                DAP_DELETE(l_addr_tmp);
+            } else
+                l_addr = l_addr_tmp;
+            dap_chain_wallet_close(l_wallet);
         }
     }
+    // Select chain, if any
+    if (l_chain_str)
+        l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str);
+    else
+        l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TX);
 
+    if(!l_chain) {
+        dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-chain' to be valid chain name in chain net %s."
+                                                        " You can set default datum type in chain configuration file",
+                                          l_net_str);
+        return -8;
+    }
     char *l_str_out = l_tx_hash_str ?
                                       dap_db_history_tx(&l_tx_hash, l_chain, l_hash_out_type) :
                                       dap_db_history_addr(l_addr, l_chain, l_hash_out_type);
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index b278fab3614b66fc0f90bdd1590d0b4adaf41e5e..3e257fa427150b5c30e5e2cf6b96ff56698c540d 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -211,7 +211,13 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const
         log_it(L_WARNING, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name);
         return NULL;
     }
-    dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger;
+    dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id);
+    if (!l_net) {
+        log_it(L_WARNING, "Can't find net by specified chain %s", a_chain->name);
+        return NULL;
+    }
+    dap_ledger_t *l_ledger = l_net->pub.ledger;
+    const char *l_native_ticker = l_net->pub.native_ticker;
 
     while (l_atom && l_atom_size) {
         size_t l_datums_count = 0;
@@ -238,23 +244,26 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const
                 dap_chain_hash_fast_t *l_tx_prev_hash;
                 int l_tx_prev_out_idx;
                 dap_chain_datum_tx_t *l_tx_prev = NULL;
-                if (*(byte_t *)l_list_in_items->data == TX_ITEM_TYPE_IN) {
-                    dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)l_list_in_items->data;
+                switch (*(byte_t *)it->data) {
+                case TX_ITEM_TYPE_IN: {
+                    dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)it->data;
                     l_tx_prev_hash = &l_tx_in->header.tx_prev_hash;
                     l_tx_prev_out_idx = l_tx_in->header.tx_out_prev_idx;
-                } else { // TX_ITEM_TYPE_IN_COND
-                    dap_chain_tx_in_cond_t *l_tx_in_cond = (dap_chain_tx_in_cond_t *)l_list_in_items->data;
+                } break;
+                case TX_ITEM_TYPE_IN_COND: {
+                    dap_chain_tx_in_cond_t *l_tx_in_cond = (dap_chain_tx_in_cond_t *)it->data;
                     l_tx_prev_hash = &l_tx_in_cond->header.tx_prev_hash;
                     l_tx_prev_out_idx = l_tx_in_cond->header.tx_out_prev_idx;
-                }
-                if (dap_hash_fast_is_blank(l_tx_prev_hash)) {
+                } break;
+                case TX_ITEM_TYPE_IN_EMS: {
+                    dap_chain_tx_in_ems_t *l_in_ems = (dap_chain_tx_in_ems_t *)it->data;
                     l_base_tx = true;
-                    dap_chain_tx_in_ems_t *l_token = (dap_chain_tx_in_ems_t *)dap_chain_datum_tx_item_get(
-                                                                            l_tx, NULL, TX_ITEM_TYPE_IN_EMS, NULL);
-                    if (l_token)
-                        l_src_token = l_token->header.ticker;
-                    break;
+                    l_src_token = l_in_ems->header.ticker;
+                }
+                default:
+                    continue;
                 }
+
                 l_tx_prev = a_chain->callback_tx_find_by_hash(a_chain, l_tx_prev_hash);
                 if (l_tx_prev) {
                     uint8_t *l_prev_out_union = dap_chain_datum_tx_item_get_nth(l_tx_prev, TX_ITEM_TYPE_OUT_ALL, l_tx_prev_out_idx);
@@ -270,87 +279,103 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const
                         break;
                     case TX_ITEM_TYPE_OUT_COND:
                         l_src_subtype = ((dap_chain_tx_out_cond_t *)l_prev_out_union)->header.subtype;
+                        if (l_src_subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE)
+                            l_src_token = l_native_ticker;
                     default:
                         break;
                     }
                 }
                 if (!l_src_token)
                     l_src_token = dap_chain_ledger_tx_get_token_ticker_by_hash(l_ledger, l_tx_prev_hash);
-                if (l_src_addr && memcmp(l_src_addr, a_addr, sizeof(dap_chain_addr_t)))
+                if (l_src_addr && !dap_chain_addr_compare(l_src_addr, a_addr))
                     break;  //it's not our addr
             }
             dap_list_free(l_list_in_items);
 
             // find OUT items
             bool l_header_printed = false;
+            uint256_t l_fee_sum = {};
             dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_ALL, NULL);
-            for (dap_list_t *l_list_out = l_list_out_items; l_list_out; l_list_out = dap_list_next(l_list_out)) {
+            for (dap_list_t *it = l_list_out_items; it; it = it->next) {
                 dap_chain_addr_t *l_dst_addr = NULL;
-                uint8_t l_type = *(uint8_t *)l_list_out->data;
+                uint8_t l_type = *(uint8_t *)it->data;
                 uint256_t l_value;
+                const char *l_dst_token = NULL;
                 switch (l_type) {
                 case TX_ITEM_TYPE_OUT:
-                    l_dst_addr = &((dap_chain_tx_out_t *)l_list_out->data)->addr;
-                    l_value = ((dap_chain_tx_out_t *)l_list_out->data)->header.value;
+                    l_dst_addr = &((dap_chain_tx_out_t *)it->data)->addr;
+                    l_value = ((dap_chain_tx_out_t *)it->data)->header.value;
                     break;
                 case TX_ITEM_TYPE_OUT_EXT:
-                    l_dst_addr = &((dap_chain_tx_out_ext_t *)l_list_out->data)->addr;
-                    l_value = ((dap_chain_tx_out_ext_t *)l_list_out->data)->header.value;
+                    l_dst_addr = &((dap_chain_tx_out_ext_t *)it->data)->addr;
+                    l_value = ((dap_chain_tx_out_ext_t *)it->data)->header.value;
+                    l_dst_token = ((dap_chain_tx_out_ext_t *)it->data)->token;
                     break;
                 case TX_ITEM_TYPE_OUT_COND:
-                    l_value = ((dap_chain_tx_out_cond_t *)l_list_out->data)->header.value;
+                    l_value = ((dap_chain_tx_out_cond_t *)it->data)->header.value;
+                    if (((dap_chain_tx_out_cond_t *)it->data)->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) {
+                        SUM_256_256(l_fee_sum, ((dap_chain_tx_out_cond_t *)it->data)->header.value, &l_fee_sum);
+                        l_dst_token = l_native_ticker;
+                    }
                 default:
                     break;
                 }
-                if (l_src_addr && l_dst_addr && !memcmp(l_dst_addr, l_src_addr, sizeof(dap_chain_addr_t)))
-                    continue;   // send to self
-                if (l_src_addr && !memcmp(l_src_addr, a_addr, sizeof(dap_chain_addr_t))) {
+                if (l_src_addr && l_dst_addr && dap_chain_addr_compare(l_dst_addr, l_src_addr) &&
+                        (!l_base_tx || dap_strcmp(l_dst_token, l_src_token)))
+                    continue;   // sent to self (coinback)
+                if (l_src_addr && dap_chain_addr_compare(l_src_addr, a_addr) &&
+                        (!l_base_tx || dap_strcmp(l_dst_token, l_src_token))) {
                     if (!l_header_printed) {
                         s_tx_header_print(l_str_out, l_tx_data_ht, l_tx, l_atom_iter, a_hash_out_type, l_ledger, &l_tx_hash);
                         l_header_printed = true;
                     }
-                    //const char *l_token_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(l_ledger, &l_tx_hash);
                     const char *l_dst_addr_str = l_dst_addr ? dap_chain_addr_to_str(l_dst_addr)
                                                             : dap_chain_tx_out_cond_subtype_to_str(
-                                                                  ((dap_chain_tx_out_cond_t *)l_list_out->data)->header.subtype);
+                                                                  ((dap_chain_tx_out_cond_t *)it->data)->header.subtype);
                     char *l_value_str = dap_chain_balance_print(l_value);
                     char *l_coins_str = dap_chain_balance_to_coins(l_value);
                     dap_string_append_printf(l_str_out, "\tsend %s (%s) %s to %s\n",
                                              l_coins_str,
                                              l_value_str,
-                                             l_src_token ? l_src_token : "UNKNOWN",
+                                             l_dst_token ? l_dst_token :
+                                                           (l_src_token ? l_src_token : "UNKNOWN"),
                                              l_dst_addr_str);
                     if (l_dst_addr)
                         DAP_DELETE(l_dst_addr_str);
                     DAP_DELETE(l_value_str);
                     DAP_DELETE(l_coins_str);
                 }
-                if (l_dst_addr && !memcmp(l_dst_addr, a_addr, sizeof(dap_chain_addr_t))) {
+                if (l_dst_addr && dap_chain_addr_compare(l_dst_addr, a_addr)) {
                     if (!l_header_printed) {
                         s_tx_header_print(l_str_out, l_tx_data_ht, l_tx, l_atom_iter, a_hash_out_type, l_ledger, &l_tx_hash);
                         l_header_printed = true;
                     }
-                    const char *l_dst_token = (l_type == TX_ITEM_TYPE_OUT_EXT) ?
-                                (const char *)(((dap_chain_tx_out_ext_t *)l_list_out->data)->token) : NULL;
-                    const char *l_src_addr_str = l_base_tx ? "emission"
-                                                           : (l_src_addr ? dap_chain_addr_to_str(l_src_addr)
-                                                                         : dap_chain_tx_out_cond_subtype_to_str(
-                                                                               l_src_subtype));
+                    const char *l_src_addr_str = l_base_tx ? "emission" :
+                                                 (l_src_addr ? dap_chain_addr_to_str(l_src_addr)
+                                                             : dap_chain_tx_out_cond_subtype_to_str(l_src_subtype));
                     char *l_value_str = dap_chain_balance_print(l_value);
                     char *l_coins_str = dap_chain_balance_to_coins(l_value);
                     dap_string_append_printf(l_str_out, "\trecv %s (%s) %s from %s\n",
                                              l_coins_str,
                                              l_value_str,
-                                             l_dst_token ? l_dst_token :
-                                                           (l_src_token ? l_src_token : "UNKNOWN"),
+                                             l_src_token ? l_src_token : "UNKNOWN",
                                              l_src_addr_str);
-                    if (l_src_addr)
+                    if (l_src_addr && !l_base_tx)
                         DAP_DELETE(l_src_addr_str);
                     DAP_DELETE(l_value_str);
                     DAP_DELETE(l_coins_str);
                 }
             }
             dap_list_free(l_list_out_items);
+            // fee for base TX in native token
+            if (l_header_printed && l_base_tx && !dap_strcmp(l_native_ticker, l_src_token)) {
+                char *l_fee_value_str = dap_chain_balance_print(l_fee_sum);
+                char *l_fee_coins_str = dap_chain_balance_to_coins(l_fee_sum);
+                dap_string_append_printf(l_str_out, "\t\tpay %s (%s) fee\n",
+                                                   l_fee_value_str, l_fee_coins_str);
+                DAP_DELETE(l_fee_value_str);
+                DAP_DELETE(l_fee_coins_str);
+            }
         }
         DAP_DELETE(l_datums);
         // go to next atom (event or block)
diff --git a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c
index 53892153dc6eb70c4264b9794123fc59602e54bb..7b1e52bf0ec5deccb645a3717d7be26d331b3399 100644
--- a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c
+++ b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c
@@ -154,18 +154,18 @@ void dap_chain_net_srv_stake_key_delegate(dap_chain_net_t *a_net, dap_chain_addr
     HASH_FIND(hh, s_srv_stake->itemlist, a_signing_addr, sizeof(dap_chain_addr_t), l_stake);
     if (!l_stake)
         l_stake = DAP_NEW_Z(dap_chain_net_srv_stake_item_t);
-    else
+    else {
         l_found = true;
+        HASH_DELETE(ht, s_srv_stake->tx_itemlist, l_stake);
+    }
     l_stake->net = a_net;
     l_stake->node_addr = *a_node_addr;
     l_stake->signing_addr = *a_signing_addr;
     l_stake->value = a_value;
     l_stake->tx_hash = *a_stake_tx_hash;
     if (!l_found)
-    {
         HASH_ADD(hh, s_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake);
-        HASH_ADD(ht, s_srv_stake->h_itemlist, tx_hash, sizeof(dap_chain_hash_fast_t), l_stake);
-    }
+    HASH_ADD(ht, s_srv_stake->tx_itemlist, tx_hash, sizeof(dap_chain_hash_fast_t), l_stake);
 
 }
 
@@ -178,6 +178,7 @@ void dap_chain_net_srv_stake_key_invalidate(dap_chain_addr_t *a_signing_addr)
     HASH_FIND(hh, s_srv_stake->itemlist, a_signing_addr, sizeof(dap_chain_addr_t), l_stake);
     if (l_stake) {
         HASH_DEL(s_srv_stake->itemlist, l_stake);
+        HASH_DELETE(ht, s_srv_stake->tx_itemlist, l_stake);
         DAP_DELETE(l_stake);
     }
 }
@@ -1089,7 +1090,7 @@ static void s_get_tx_filter_callback(dap_chain_net_t* a_net, dap_chain_datum_tx_
         if(dap_chain_ledger_tx_hash_is_used_out_item(a_net->pub.ledger,&l_datum_hash,l_out_idx_tmp)==NULL)
         {
             dap_chain_net_srv_stake_item_t *l_stake = NULL;
-            HASH_FIND(ht, s_srv_stake->h_itemlist, &l_datum_hash, sizeof(dap_hash_fast_t), l_stake);
+            HASH_FIND(ht, s_srv_stake->tx_itemlist, &l_datum_hash, sizeof(dap_hash_fast_t), l_stake);
             if(!l_stake){
                 l_args->ret = dap_list_append(l_args->ret,a_tx);
             }
@@ -1307,15 +1308,14 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply)
             DAP_DELETE(l_decree_hash_str);
         } break;
         case CMD_LIST: {
-            const char * sub_com = NULL;
             l_arg_index++;
-            if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "keys", &sub_com)){
+            if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "keys", NULL)) {
                 const char *l_net_str = NULL,
                            *l_cert_str = NULL;
                 l_arg_index++;
                 dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
                 if (!l_net_str) {
-                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'keylist' requires parameter -net");
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'list keys' requires parameter -net");
                     return -3;
                 }
                 dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str);
@@ -1356,13 +1356,12 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply)
                     dap_string_append(l_reply_str, "No keys found");
                 }
                 *a_str_reply = dap_string_free(l_reply_str, false);
-            }else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "tx", &sub_com))
-            {
+            } else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "tx", NULL)) {
                 const char *l_net_str = NULL;
                 l_arg_index++;
                 dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
                 if (!l_net_str) {
-                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'approve' requires parameter -net");
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'list tx' requires parameter -net");
                     return -3;
                 }
                 dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str);
@@ -1416,8 +1415,10 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply)
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str);
                 dap_string_free(l_str_tmp, true);
                DAP_DELETE(l_args);
+            } else {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Subcommand '%s' not recognized", a_argv[l_arg_index]);
+                return -2;
             }
-
         } break;
         case CMD_INVALIDATE: {
             const char *l_net_str = NULL,
diff --git a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h
index df399d9e6b144dc0907ced263b1888815156f27d..20da2e8348cdcf72a7f9537c668cb0ce2a1cc3e5 100644
--- a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h
+++ b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h
@@ -54,7 +54,8 @@ typedef struct dap_chain_net_srv_stake_cache_item {
 
 typedef struct dap_chain_net_srv_stake {
     uint256_t delegate_allowed_min;
-    dap_chain_net_srv_stake_item_t *itemlist, *h_itemlist;
+    dap_chain_net_srv_stake_item_t *itemlist;
+    dap_chain_net_srv_stake_item_t *tx_itemlist;
     dap_chain_net_srv_stake_cache_item_t *cache;
 } dap_chain_net_srv_stake_t;