diff --git a/dap-sdk b/dap-sdk
index 634bf59c2a94a7dec82fcd9304e2f160b3419c45..95eff772b40056a7fab20438556257ee1ac7bd78 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 634bf59c2a94a7dec82fcd9304e2f160b3419c45
+Subproject commit 95eff772b40056a7fab20438556257ee1ac7bd78
diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c
index feb006a65927b814bd3c76345f60612f02fd4417..4099260c113ba0d5e282eb8412f50a9dea5eeb08 100644
--- a/modules/net/dap_chain_ledger.c
+++ b/modules/net/dap_chain_ledger.c
@@ -2230,6 +2230,81 @@ dap_list_t * dap_ledger_token_auth_pkeys_hashes(dap_ledger_t *a_ledger, const ch
     return l_ret;
 }
 
+json_object *s_token_item_to_json(dap_ledger_token_item_t *a_token_item) {
+    json_object *json_obj_datum = json_object_new_object();
+    const char *l_type_str;
+    switch (a_token_item->type) {
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL: {
+            switch (a_token_item->subtype) {
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE:
+                    l_type_str = "SIMPLE"; break;
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE:
+                    l_type_str = "PRIVATE"; break;
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE:
+                    l_type_str = "CF20"; break;
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC:
+                    l_type_str = "PUBLIC"; break;
+                default: l_type_str = "UNKNOWN"; break;
+            }
+        }break;
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE: {
+            switch (a_token_item->subtype) {
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE:
+                    l_type_str = "SIMPLE"; break;
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE:
+                    l_type_str = "PRIVATE_UPDATE"; break;
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE:
+                    l_type_str = "CF20_UPDATE"; break;
+                default: l_type_str = "UNKNOWN"; break;
+            }
+        } break;
+        default:
+            l_type_str = "UNKNOWN"; break;
+    }
+    if ((a_token_item->subtype != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE)
+            ||	(a_token_item->type != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC)) {
+        char *l_balance_cur = dap_chain_balance_print(a_token_item->current_supply);
+        char *l_balance_total = dap_chain_balance_print(a_token_item->total_supply);
+        json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(a_token_item->ticker));
+        json_object_object_add(json_obj_datum, "type", json_object_new_string(l_type_str));
+        json_object_object_add(json_obj_datum, "flags", json_object_new_string(s_flag_str_from_code(a_token_item->datum_token->header_native_decl.flags)));
+        json_object_object_add(json_obj_datum, "description", a_token_item->description_token_size != 0 ?
+                               json_object_new_string(a_token_item->description_token) :
+                               json_object_new_string("The token description is not set"));
+        json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur));
+        json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total));
+        json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18"));
+        json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(a_token_item->auth_signs_valid));
+        json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(a_token_item->auth_signs_total));
+        json_object_object_add(json_obj_datum, "TSD and Signs", json_object_new_string(""));
+        dap_datum_token_dump_tsd_to_json(json_obj_datum, a_token_item->datum_token, a_token_item->datum_token_size, "hex");
+        size_t l_certs_field_size = a_token_item->datum_token_size - sizeof(*a_token_item->datum_token) - a_token_item->datum_token->header_native_decl.tsd_total_size;
+        dap_chain_datum_token_certs_dump_to_json(json_obj_datum, a_token_item->datum_token->data_n_tsd + a_token_item->datum_token->header_native_decl.tsd_total_size,
+                                                l_certs_field_size, "hex");
+        json_object_object_add(json_obj_datum, "and TSD and Signs", json_object_new_string(""));
+        json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(a_token_item->token_emissions)));
+        DAP_DEL_Z(l_balance_cur);
+        DAP_DEL_Z(l_balance_total);
+    } else {
+            char *l_balance_cur = dap_chain_balance_print(a_token_item->current_supply);
+            char *l_balance_total = dap_chain_balance_print(a_token_item->total_supply);
+            json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(a_token_item->ticker));
+            json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur));
+            json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total));
+            json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18"));
+            json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(a_token_item->auth_signs_valid));
+            json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(a_token_item->auth_signs_total));
+            json_object_object_add(json_obj_datum, "Signs", json_object_new_string(""));
+            size_t l_certs_field_size = a_token_item->datum_token_size - sizeof(*a_token_item->datum_token);
+            dap_chain_datum_token_certs_dump_to_json(json_obj_datum, a_token_item->datum_token->data_n_tsd,
+                                                     l_certs_field_size, "hex");
+            json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(a_token_item->token_emissions)));
+            DAP_DEL_Z(l_balance_cur);
+            DAP_DEL_Z(l_balance_total);
+    }
+    return json_obj_datum;
+}
+
 /**
  * @brief Compose string list of all tokens with information
  * @param a_ledger
@@ -2264,85 +2339,32 @@ json_object *dap_ledger_token_info(dap_ledger_t *a_ledger, size_t a_limit, size_
             i_tmp++;
             continue;
         }
+        json_obj_datum = s_token_item_to_json(l_token_item);
+        json_object_array_add(json_arr_out, json_obj_datum);
         i_tmp++;
-        json_obj_datum = json_object_new_object();
-        const char *l_type_str;
-        switch (l_token_item->type) {
-            case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL: {
-                switch (l_token_item->subtype) {
-                    case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE:
-                        l_type_str = "SIMPLE"; break;
-                    case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE:
-                        l_type_str = "PRIVATE"; break;
-                    case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE:
-                        l_type_str = "CF20"; break;
-                    case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC:
-                        l_type_str = "PUBLIC"; break;
-                    default: l_type_str = "UNKNOWN"; break;
-                }
-            }break;
-            case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE: {
-                switch (l_token_item->subtype) {
-                    case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE:
-                        l_type_str = "SIMPLE"; break;
-                    case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE:
-                        l_type_str = "PRIVATE_UPDATE"; break;
-                    case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE:
-                        l_type_str = "CF20_UPDATE"; break;
-                    default: l_type_str = "UNKNOWN"; break;
-                }
-            } break;
-            default:
-                l_type_str = "UNKNOWN"; break;
-        }
-        if ((l_token_item->subtype != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE)
-                ||	(l_token_item->type != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC)) {
-            char *l_balance_cur = dap_chain_balance_print(l_token_item->current_supply);
-            char *l_balance_total = dap_chain_balance_print(l_token_item->total_supply);
-            json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(l_token_item->ticker));
-            json_object_object_add(json_obj_datum, "type", json_object_new_string(l_type_str));
-            json_object_object_add(json_obj_datum, "flags", json_object_new_string(s_flag_str_from_code(l_token_item->datum_token->header_native_decl.flags)));
-            json_object_object_add(json_obj_datum, "description", l_token_item->description_token_size != 0 ?
-                                   json_object_new_string(l_token_item->description_token) :
-                                   json_object_new_string("The token description is not set"));
-            json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur));
-            json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total));
-            json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18"));
-            json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(l_token_item->auth_signs_valid));
-            json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(l_token_item->auth_signs_total));
-            json_object_object_add(json_obj_datum, "TSD and Signs", json_object_new_string(""));
-            dap_datum_token_dump_tsd_to_json(json_obj_datum, l_token_item->datum_token, l_token_item->datum_token_size, "hex");
-            size_t l_certs_field_size = l_token_item->datum_token_size - sizeof(*l_token_item->datum_token) - l_token_item->datum_token->header_native_decl.tsd_total_size;
-            dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_token_item->datum_token->data_n_tsd + l_token_item->datum_token->header_native_decl.tsd_total_size,
-                                                    l_certs_field_size, "hex");
-            json_object_object_add(json_obj_datum, "and TSD and Signs", json_object_new_string(""));
-            json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(l_token_item->token_emissions)));
-            json_object_array_add(json_arr_out, json_obj_datum);
-            DAP_DEL_Z(l_balance_cur);
-            DAP_DEL_Z(l_balance_total);
-        } else {
-                char *l_balance_cur = dap_chain_balance_print(l_token_item->current_supply);
-                char *l_balance_total = dap_chain_balance_print(l_token_item->total_supply);
-                json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(l_token_item->ticker));
-                json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur));
-                json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total));
-                json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18"));
-                json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(l_token_item->auth_signs_valid));
-                json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(l_token_item->auth_signs_total));
-                json_object_object_add(json_obj_datum, "Signs", json_object_new_string(""));
-                size_t l_certs_field_size = l_token_item->datum_token_size - sizeof(*l_token_item->datum_token);
-                dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_token_item->datum_token->data_n_tsd,
-                                                         l_certs_field_size, "hex");
-                json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(l_token_item->token_emissions)));
-                json_object_array_add(json_arr_out, json_obj_datum);
-                DAP_DEL_Z(l_balance_cur);
-                DAP_DEL_Z(l_balance_total);
-        }
+
     }
     pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
     return json_arr_out;
 }
 
+/**
+ * @breif Forms a JSON object with a token description for the specified ticker.
+ * @param a_ledger
+ * @param a_token_ticker
+ * @return
+ */
+json_object *dap_ledger_token_info_by_name(dap_ledger_t *a_ledger, const char *a_token_ticker) {
+    json_object *l_jobj = NULL;
+    dap_ledger_token_item_t *l_token_item = NULL;
+    HASH_FIND_STR(PVT(a_ledger)->tokens, a_token_ticker, l_token_item);
+    if (l_token_item) {
+        return s_token_item_to_json(l_token_item);
+    } else {
+        return json_object_new_null();
+    }
+}
+
 /**
  * @brief Get all token declatations
  * @param a_ledger
@@ -5608,7 +5630,7 @@ unsigned dap_ledger_count(dap_ledger_t *a_ledger)
  * @param a_ts_to
  * @return
  */
-uint64_t dap_ledger_count_from_to(dap_ledger_t * a_ledger, dap_time_t a_ts_from, dap_time_t a_ts_to)
+uint64_t dap_ledger_count_from_to(dap_ledger_t * a_ledger, dap_nanotime_t a_ts_from, dap_nanotime_t a_ts_to)
 {
     uint64_t l_ret = 0;
     dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger);
@@ -5616,17 +5638,17 @@ uint64_t dap_ledger_count_from_to(dap_ledger_t * a_ledger, dap_time_t a_ts_from,
     pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock);
     if ( a_ts_from && a_ts_to) {
         HASH_ITER(hh, l_ledger_pvt->ledger_items , l_iter_current, l_item_tmp){
-            if ( l_iter_current->tx->header.ts_created >= a_ts_from && l_iter_current->tx->header.ts_created <= a_ts_to )
+            if ( l_iter_current->ts_added >= a_ts_from && l_iter_current->ts_added <= a_ts_to )
                 l_ret++;
         }
     } else if ( a_ts_to ){
         HASH_ITER(hh, l_ledger_pvt->ledger_items , l_iter_current, l_item_tmp){
-            if ( l_iter_current->tx->header.ts_created <= a_ts_to )
+            if ( l_iter_current->ts_added <= a_ts_to )
                 l_ret++;
         }
     } else if ( a_ts_from ){
         HASH_ITER(hh, l_ledger_pvt->ledger_items , l_iter_current, l_item_tmp){
-            if ( l_iter_current->tx->header.ts_created >= a_ts_from )
+            if ( l_iter_current->ts_added >= a_ts_from )
                 l_ret++;
         }
     } else {
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 1dc2e92778eaca44f2bcc5d92dd92376a8fdcee3..f3ebff86c008c53bdaf9f960d5426e475cdbaa87 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -1199,8 +1199,6 @@ static int s_cli_net(int argc, char **argv, void **reply)
                 time_t l_from_ts = mktime(&l_from_tm);
                 time_t l_to_ts = mktime(&l_to_tm);
                 // Produce strings
-                char l_from_str_new[50];
-                char l_to_str_new[50];
                 strftime(l_from_str_new, sizeof(l_from_str_new), c_time_fmt,&l_from_tm );
                 strftime(l_to_str_new, sizeof(l_to_str_new), c_time_fmt,&l_to_tm );
                 json_object *l_jobj_stats = json_object_new_object();
@@ -1222,7 +1220,7 @@ static int s_cli_net(int argc, char **argv, void **reply)
                 json_object_object_add(l_jobj_stats, "from", l_jobj_from);
                 json_object_object_add(l_jobj_stats, "to", l_jobj_to);
                 log_it(L_INFO, "Calc TPS from %s to %s", l_from_str_new, l_to_str_new);
-                uint64_t l_tx_count = dap_ledger_count_from_to ( l_net->pub.ledger, l_from_ts, l_to_ts);
+                uint64_t l_tx_count = dap_ledger_count_from_to ( l_net->pub.ledger, l_from_ts * 1000000000, l_to_ts * 1000000000);
                 long double l_tpd = l_to_ts == l_from_ts ? 0 :
                                                      (long double) l_tx_count / (long double) ((long double)(l_to_ts - l_from_ts) / 86400);
                 char *l_tpd_str = dap_strdup_printf("%.3Lf", l_tpd);
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index f48a4fcce0ad2f686369f599b78f2d3d7bb5a49b..3ab907653d4e1793692bf5e5ada09723fb71a6b1 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -290,10 +290,38 @@ void dap_chain_node_mempool_process_all(dap_chain_t *a_chain, bool a_force)
     dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id);
     if (!a_force && !l_net->pub.mempool_autoproc)
         return;
+#ifdef DAP_TPS_TEST
+    FILE *l_file = fopen("/opt/cellframe-node/share/ca/mempool_start.txt", "r");
+    if (l_file) {
+        fclose(l_file);
+        l_file = fopen("/opt/cellframe-node/share/ca/mempool_finish.txt", "r");
+        if(!l_file) {
+            log_it(L_TPS, "Wait mempool");
+            return;
+        }
+        log_it(L_TPS, "Mempool ready");
+        fclose(l_file);
+        l_file = fopen("/opt/cellframe-node/share/ca/tps_start.txt", "r");
+        if (!l_file) {
+            l_file = fopen("/opt/cellframe-node/share/ca/tps_start.txt", "w");
+            char l_from_str[50];
+            const char c_time_fmt[]="%Y-%m-%d_%H:%M:%S";
+            struct tm l_from_tm = {};
+            time_t l_ts_now = time(NULL);
+            localtime_r(&l_ts_now, &l_from_tm);
+            strftime(l_from_str, sizeof(l_from_str), c_time_fmt, &l_from_tm);
+            fputs(l_from_str, l_file);
+        }
+        fclose(l_file);
+    }
+#endif
     char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
     size_t l_objs_size = 0;
     dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_gdb_group_mempool, &l_objs_size);
     if (l_objs_size) {
+#ifdef DAP_TPS_TEST
+        log_it(L_TPS, "Get %zu datums from mempool", l_objs_size);
+#endif
         for (size_t i = 0; i < l_objs_size; i++) {
             if (!l_objs[i].value_len)
                 continue;
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index 4f1c02a87a17575ed083f3af432f9ee5ead18754..55d3b8280512ebfea6672442d2e75ff75e3cb990 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -802,6 +802,15 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net,
         return json_arr_out;
 }
 
+json_object *s_get_ticker(json_object *a_jobj_tickers, const char *a_token_ticker) {
+    json_object_object_foreach(a_jobj_tickers, key, value){
+        if (dap_strcmp(a_token_ticker, key) == 0) {
+            return value;
+        }
+    }
+    return NULL;
+}
+
 /**
  * @brief show all tokens in chain
  *
@@ -813,37 +822,68 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net,
  */
 static json_object* dap_db_chain_history_token_list(dap_chain_t * a_chain, const char *a_token_name, const char *a_hash_out_type, size_t *a_token_num)
 {
+    json_object *l_jobj_tickers = json_object_new_object();
     if (!a_chain->callback_datum_iter_create) {
         log_it(L_WARNING, "Not defined datum iterators for chain \"%s\"", a_chain->name);
         return NULL;
     }    
     size_t l_token_num  = 0;
-    json_object* json_arr_history_token_out = json_object_new_array();    
     dap_chain_datum_iter_t *l_datum_iter = a_chain->callback_datum_iter_create(a_chain);
     for (dap_chain_datum_t *l_datum = a_chain->callback_datum_iter_get_first(l_datum_iter);
             l_datum; l_datum = a_chain->callback_datum_iter_get_next(l_datum_iter)) {
         if (l_datum->header.type_id != DAP_CHAIN_DATUM_TOKEN_DECL)
             continue;
+        size_t l_token_size = l_datum->header.data_size;
+        dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(l_datum->data, &l_token_size);
         if (a_token_name) {
-            size_t l_token_size = l_datum->header.data_size;
-            dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(l_datum->data, &l_token_size);
-            int l_cmp = dap_strcmp(l_token->ticker, a_token_name);
-            DAP_DELETE(l_token);
-            if (l_cmp)
+            if (dap_strcmp(a_token_name, l_token->ticker) != 0) {
+                DAP_DELETE(l_token);
                 continue;
+            }
+        }
+        json_object *l_jobj_ticker = s_get_ticker(l_jobj_tickers, l_token->ticker);
+        json_object *l_jobj_decls = NULL;
+        json_object *l_jobj_updates = NULL;
+        if (!l_jobj_ticker) {
+            l_jobj_ticker = json_object_new_object();
+            dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger;
+            json_object *l_current_state = dap_ledger_token_info_by_name(l_ledger, l_token->ticker);
+            json_object_object_add(l_jobj_ticker, "current state", l_current_state);
+            l_jobj_decls = json_object_new_array();
+            l_jobj_updates = json_object_new_array();
+            json_object_object_add(l_jobj_ticker, "declarations", l_jobj_decls);
+            json_object_object_add(l_jobj_ticker, "updates", l_jobj_updates);
+            json_object_object_add(l_jobj_tickers, l_token->ticker, l_jobj_ticker);
+        } else {
+            l_jobj_decls = json_object_object_get(l_jobj_ticker, "declarations");
+            l_jobj_updates = json_object_object_get(l_jobj_ticker, "updates");
         }
         int l_ret_code = l_datum_iter->ret_code;
         json_object* json_history_token = json_object_new_object();
         json_object_object_add(json_history_token, "status", json_object_new_string(l_ret_code ? "DECLINED" : "ACCEPTED"));
         json_object_object_add(json_history_token, "Ledger return code", json_object_new_int(l_ret_code));
         dap_chain_datum_dump_json(json_history_token, l_datum, a_hash_out_type, a_chain->net_id);
-        json_object_array_add(json_arr_history_token_out, json_history_token);
+        switch (l_token->type) {
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC:
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL:
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_DECL:
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL:
+                json_object_array_add(l_jobj_decls, json_history_token);
+                break;
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_UPDATE:
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE:
+                json_object_array_add(l_jobj_updates, json_history_token);
+                break;
+        }
+        DAP_DELETE(l_token);
         l_token_num++;
     }
     a_chain->callback_datum_iter_delete(l_datum_iter);
     if (a_token_num)
         *a_token_num = l_token_num;
-    return json_arr_history_token_out;
+    return l_jobj_tickers;
 }
 
 /**
diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h
index e6d04d4ad2755d757b107ed9cd41489933ebba2a..57a457f65c424d6b64f86821ea42a3de5043083a 100644
--- a/modules/net/include/dap_chain_ledger.h
+++ b/modules/net/include/dap_chain_ledger.h
@@ -264,6 +264,7 @@ int dap_ledger_token_load(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_toke
 int dap_ledger_token_decl_add_check(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size);
 char *dap_ledger_token_decl_add_err_code_to_str(int a_code);
 json_object *dap_ledger_token_info(dap_ledger_t *a_ledger, size_t a_limit, size_t a_offset);
+json_object *dap_ledger_token_info_by_name(dap_ledger_t *a_ledger, const char *a_token_ticker);
 
 // Get all token-declarations
 dap_list_t* dap_ledger_token_decl_all(dap_ledger_t *a_ledger);
@@ -338,7 +339,7 @@ void dap_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db);
  * Return number transactions from the cache
  */
 unsigned dap_ledger_count(dap_ledger_t *a_ledger);
-uint64_t dap_ledger_count_from_to(dap_ledger_t * a_ledger, dap_time_t a_ts_from, dap_time_t a_ts_to);
+uint64_t dap_ledger_count_from_to(dap_ledger_t * a_ledger, dap_nanotime_t a_ts_from, dap_nanotime_t a_ts_to);
 
 /**
  * Check whether used 'out' items
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 1f497a38fe10d53650e91fe61f6ec3ff252df9c5..a4eaa6675376fc3c32503a85fb57f25d8e4eb60c 100644
--- a/modules/service/stake/dap_chain_net_srv_stake_lock.c
+++ b/modules/service/stake/dap_chain_net_srv_stake_lock.c
@@ -1393,7 +1393,11 @@ dap_chain_datum_t *s_stake_unlock_datum_create(dap_chain_net_t *a_net, dap_enc_k
         // coin back
         //SUBTRACT_256_256(l_fee_transfer, l_value_pack, &l_value_back);
         if(l_main_native){
-            SUBTRACT_256_256(a_value, l_value_pack, &l_value_back);
+            if (SUBTRACT_256_256(a_value, l_value_pack, &l_value_back)) {
+                dap_chain_datum_tx_delete(l_tx);
+                *result = -13;
+                return NULL;
+            }
             if(!IS_ZERO_256(l_value_back)) {
                 if (dap_chain_datum_tx_add_out_ext_item(&l_tx, &l_addr, l_value_back, a_main_ticker)!=1) {
                     dap_chain_datum_tx_delete(l_tx);
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index 977a85e4009fa824b0f99626c8bb4d1adb8d1a18..ec33832dbd6980605d48c290448c67951ae931d5 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -2241,6 +2241,9 @@ static size_t s_callback_add_datums(dap_chain_t *a_chain, dap_chain_datum_t **a_
 
     size_t l_datum_processed = 0;
     pthread_rwlock_wrlock(&l_blocks_pvt->rwlock);
+#ifdef DAP_TPS_TEST
+    log_it(L_TPS, "Start tps %zu datums add", a_datums_count);
+#endif
     for (size_t i = 0; i < a_datums_count; ++i) {
         dap_chain_datum_t *l_datum = a_datums[i];
         size_t l_datum_size = dap_chain_datum_size(l_datum);
@@ -2259,10 +2262,12 @@ static size_t s_callback_add_datums(dap_chain_t *a_chain, dap_chain_datum_t **a_
             l_blocks->block_new->hdr.cell_id.uint64 = a_chain->cells->id.uint64;
             l_blocks->block_new->hdr.chain_id.uint64 = l_blocks->chain->id.uint64;
         }
-
         l_blocks->block_new_size = dap_chain_block_datum_add(&l_blocks->block_new, l_blocks->block_new_size, l_datum, l_datum_size);
         l_datum_processed++;
     }
+#ifdef DAP_TPS_TEST
+    log_it(L_TPS, "Finish tps %zu datums add", a_datums_count);
+#endif
     pthread_rwlock_unlock(&l_blocks_pvt->rwlock);
     return l_datum_processed;
 }