diff --git a/dap_chain_net.c b/dap_chain_net.c
index b0455f71acd560860351a417cef7b18b93b59ea2..2aacd4d5a3bc1ac02c4ebe9d16b21ad2885aa3b9 100644
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -1,6 +1,7 @@
 /*
  * Authors:
  * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
+ * Alexander Lysikov <alexander.lysikov@demlabs.net>
  * DeM Labs Inc.   https://demlabs.net
  * Kelvin Project https://github.com/kelvinblockchain
  * Copyright  (c) 2017-2018
@@ -34,7 +35,6 @@
 #include "dap_strfuncs.h"
 #include "dap_config.h"
 #include "dap_hash.h"
-#include "dap_chain_utxo.h"
 #include "dap_chain_net.h"
 #include "dap_chain_node_client.h"
 #include "dap_chain_node_cli.h"
@@ -539,20 +539,20 @@ int dap_chain_net_load(const char * a_net_name)
                     dap_config_get_item_str_default(l_cfg , "general" , "gdb_groups_prefix","" ) );
 
 
-        // UTXO model
-        uint16_t l_utxo_flags = 0;
+        // LEDGER model
+        uint16_t l_ledger_flags = 0;
         switch ( PVT( l_net )->node_role.enums ) {
             case NODE_ROLE_ROOT_MASTER:
             case NODE_ROLE_ROOT:
             case NODE_ROLE_ARCHIVE:
-                l_utxo_flags |= DAP_CHAIN_UTXO_CHECK_TOKEN_EMISSION;
+                l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_TOKEN_EMISSION;
             case NODE_ROLE_MASTER:
-                l_utxo_flags |= DAP_CHAIN_UTXO_CHECK_CELLS_DS;
+                l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_CELLS_DS;
             case NODE_ROLE_CELL_MASTER:
-                l_utxo_flags |= DAP_CHAIN_UTXO_CHECK_TOKEN_EMISSION;
+                l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_TOKEN_EMISSION;
             case NODE_ROLE_FULL:
             case NODE_ROLE_LIGHT:
-                l_utxo_flags |= DAP_CHAIN_UTXO_CHECK_LOCAL_DS;
+                l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_LOCAL_DS;
         }
 
         // Check if seed nodes are present in local db alias
@@ -683,8 +683,8 @@ int dap_chain_net_load(const char * a_net_name)
         memcpy( l_net_item2,l_net_item,sizeof (*l_net_item));
         HASH_ADD(hh,s_net_items_ids,net_id,sizeof ( l_net_item2->net_id),l_net_item2);
 
-        // init UTXO model
-        dap_chain_utxo_init(l_utxo_flags);
+        // init LEDGER model
+        l_net->pub.ledger = dap_chain_ledger_create(l_ledger_flags);
 
         // Start the proc thread
         s_net_proc_thread_start(l_net);
@@ -715,6 +715,19 @@ dap_chain_net_t * dap_chain_net_by_name( const char * a_name)
         return NULL;
 }
 
+/**
+ * @brief dap_chain_ledger_by_net_name
+ * @param a_net_name
+ * @return
+ */
+dap_ledger_t * dap_chain_ledger_by_net_name( const char * a_net_name)
+{
+    dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name);
+    if(l_net)
+        return l_net->pub.ledger;
+    return NULL;
+}
+
 /**
  * @brief dap_chain_net_by_id
  * @param a_id
diff --git a/dap_chain_net.h b/dap_chain_net.h
index f1ff037a3f198fc4c697196951181ac01353a242..9a37113b814077692cb0f070d86e31891505999a 100644
--- a/dap_chain_net.h
+++ b/dap_chain_net.h
@@ -1,6 +1,7 @@
 /*
  * Authors:
  * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
+ * Alexander Lysikov <alexander.lysikov@demlabs.net>
  * DeM Labs Inc.   https://demlabs.net
  * Kelvin Project https://github.com/kelvinblockchain
  * Copyright  (c) 2017-2019
@@ -30,6 +31,7 @@
 #include "dap_chain_common.h"
 #include "dap_chain_node.h"
 #include "dap_chain.h"
+#include "dap_chain_ledger.h"
 
 
 #define DAP_CHAIN_NET_NAME_MAX 32
@@ -53,6 +55,7 @@ typedef struct dap_chain_net{
         char * name;
         char * gdb_groups_prefix;
         dap_chain_t * chains; // double-linked list of chains
+        dap_ledger_t  *ledger;
     } pub;
     uint8_t pvt[];
 } dap_chain_net_t;
@@ -78,6 +81,7 @@ void dap_chain_net_proc_datapool (dap_chain_net_t * a_net);
 dap_chain_net_t * dap_chain_net_by_name( const char * a_name);
 dap_chain_net_t * dap_chain_net_by_id( dap_chain_net_id_t a_id);
 dap_chain_net_id_t dap_chain_net_id_by_name( const char * a_name);
+dap_ledger_t * dap_chain_ledger_by_net_name( const char * a_net_name);
 
 dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const char * a_name);
 
diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c
index fa51f86ac79b5b0346607bd18810d2d2a0ba7575..97392aec3f8540f575c0d8ed68adf481f4e83673 100644
--- a/dap_chain_node_cli.c
+++ b/dap_chain_node_cli.c
@@ -1,7 +1,11 @@
 /*
  * Authors:
- * Dmitriy A. Gearasimov <naeper@demlabs.net>
+ * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
+ * Alexander Lysikov <alexander.lysikov@demlabs.net>
  * DeM Labs Inc.   https://demlabs.net
+ * Kelvin Project https://github.com/kelvinblockchain
+ * Copyright  (c) 2019
+ * All rights reserved.
 
  This file is part of DAP (Deus Applications Prototypes) the open source project
 
@@ -483,7 +487,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
                                         "\tObtain help for <command> or get the total list of the commands\n"
                                         );
     dap_chain_node_cli_cmd_item_create("wallet", com_tx_wallet, "Wallet operations",
-            "wallet [new -w <wallet_name> | list | info -addr <addr> -w <wallet_name>]\n");
+            "wallet [new -w <wallet_name> | list | info -addr <addr> -w <wallet_name> -net <net_name>]\n");
 
     // Token commands
     dap_chain_node_cli_cmd_item_create ("token_decl", com_token_decl, "Token declaration",
@@ -513,7 +517,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
 
     // Transaction commands
     dap_chain_node_cli_cmd_item_create ("tx_create", com_tx_create, "Make transaction",
-            "tx_create from_wallet_name <name> to_addr <addr> token <token> value <val> [fee <addr> value_fee <val>]\n" );
+            "tx_create from_wallet_name <name> to_addr <addr> token <token> value <val> net <net name> [fee <addr> value_fee <val>]\n" );
     dap_chain_node_cli_cmd_item_create ("tx_cond_create", com_tx_cond_create, "Make cond transaction",
             "tx_cond_create todo\n" );
     dap_chain_node_cli_cmd_item_create ("tx_verify", com_tx_verify, "Verifing transaction",
diff --git a/dap_chain_node_cli.h b/dap_chain_node_cli.h
index f7fd19f4c633070086cbd0d74b870835e2fcc0fc..f41b637254e1a356306010738f4e3f4df4e07ceb 100644
--- a/dap_chain_node_cli.h
+++ b/dap_chain_node_cli.h
@@ -1,23 +1,28 @@
 /*
  * Authors:
- * Dmitriy A. Gearasimov <naeper@demlabs.net>
+ * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
+ * Alexander Lysikov <alexander.lysikov@demlabs.net>
  * DeM Labs Inc.   https://demlabs.net
+ * Kelvin Project https://github.com/kelvinblockchain
+ * Copyright  (c) 2019
+ * All rights reserved.
 
  This file is part of DAP (Deus Applications Prototypes) the open source project
 
-    DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
+ DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
 
-    DAP is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+ DAP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
+ */
 
-    You should have received a copy of the GNU General Public License
-    along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
-*/
 #pragma once
 
 #include "dap_common.h"
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 1ee99b542e21cff0d18151a2315addf3821f0959..33fe355ad6dbd7e1b21c39472f5fd6f21bb8ba97 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -1,9 +1,10 @@
 /*
  * Authors:
  * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
+ * Alexander Lysikov <alexander.lysikov@demlabs.net>
  * DeM Labs Inc.   https://demlabs.net
  * Kelvin Project https://github.com/kelvinblockchain
- * Copyright  (c) 2017-2019
+ * Copyright  (c) 2019
  * All rights reserved.
 
  This file is part of DAP (Deus Applications Prototypes) the open source project
@@ -58,7 +59,7 @@
 
 #include "dap_chain_datum.h"
 #include "dap_chain_datum_tx_items.h"
-#include "dap_chain_utxo.h"
+#include "dap_chain_ledger.h"
 #include "dap_chain_mempool.h"
 #include "dap_chain_global_db.h"
 #include "dap_chain_global_db_remote.h"
@@ -147,7 +148,6 @@ static dap_chain_node_addr_t* com_global_db_get_addr(dap_chain_node_info_t *node
     return address;
 }
 
-
 /**
  * Read node from base
  */
@@ -204,15 +204,13 @@ static bool dap_chain_node_info_save_and_reply(dap_chain_node_info_t *node_info,
     }
     //char *a_value = dap_chain_node_info_serialize(node_info, NULL);
     size_t node_info_size = dap_chain_node_info_get_size(node_info);
-    bool res = dap_chain_global_db_gr_set(a_key, (const uint8_t *) node_info, node_info_size, GROUP_GLOBAL_ADDRS_LEASED);
+    bool res = dap_chain_global_db_gr_set(a_key, (const uint8_t *) node_info, node_info_size,
+    GROUP_GLOBAL_ADDRS_LEASED);
     DAP_DELETE(a_key);
     //DAP_DELETE(a_value);
     return res;
 }
 
-
-
-
 /**
  * Handler of command 'global_db node add'
  *
@@ -358,10 +356,9 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
         return -1;
     }
 
-
     dap_chain_node_info_t * l_node_info_read = dap_chain_node_info_read_and_reply(address, str_reply);
-    size_t l_node_info_read_size = dap_chain_node_info_get_size( l_node_info_read);
-    if(! l_node_info_read)
+    size_t l_node_info_read_size = dap_chain_node_info_get_size(l_node_info_read);
+    if(!l_node_info_read)
         return -1;
 
     int cmd_int = 0;
@@ -372,8 +369,8 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
 
     // find link in node_info_read
     int index_link = -1;
-    for(size_t i = 0; i <  l_node_info_read->hdr.links_number; i++) {
-        if( l_node_info_read->links[i].uint64 == link->uint64) {
+    for(size_t i = 0; i < l_node_info_read->hdr.links_number; i++) {
+        if(l_node_info_read->links[i].uint64 == link->uint64) {
             // link already present
             index_link = (int) i;
             break;
@@ -383,9 +380,9 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
     // add link
     if(cmd_int == 1) {
         if(index_link == -1) {
-            l_node_info_read = DAP_REALLOC ( l_node_info_read,l_node_info_read_size += sizeof (*link) );
-            memcpy(&( l_node_info_read->links[ l_node_info_read->hdr.links_number]), link, sizeof(dap_chain_node_addr_t));
-             l_node_info_read->hdr.links_number++;
+            l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size += sizeof(*link));
+            memcpy(&(l_node_info_read->links[l_node_info_read->hdr.links_number]), link, sizeof(dap_chain_node_addr_t));
+            l_node_info_read->hdr.links_number++;
             res_successful = true;
         }
     }
@@ -393,17 +390,17 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
     else if(cmd_int == 2) {
         // move link list to one item prev
         if(index_link >= 0) {
-            for(unsigned int j = (unsigned int) index_link; j < ( l_node_info_read->hdr.links_number - 1); j++) {
-                memcpy(&( l_node_info_read->links[j]), &( l_node_info_read->links[j + 1]), sizeof(dap_chain_node_addr_t));
+            for(unsigned int j = (unsigned int) index_link; j < (l_node_info_read->hdr.links_number - 1); j++) {
+                memcpy(&(l_node_info_read->links[j]), &(l_node_info_read->links[j + 1]), sizeof(dap_chain_node_addr_t));
             }
             l_node_info_read->hdr.links_number--;
             res_successful = true;
-            l_node_info_read = DAP_REALLOC ( l_node_info_read,l_node_info_read_size -= sizeof (*link) );
+            l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size -= sizeof(*link));
         }
     }
     // save edited node_info
     if(res_successful) {
-        bool res = dap_chain_node_info_save_and_reply( l_node_info_read, str_reply);
+        bool res = dap_chain_node_info_save_and_reply(l_node_info_read, str_reply);
         if(res) {
             res_successful = true;
             if(cmd_int == 1)
@@ -431,7 +428,7 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
     }
 
     DAP_DELETE(address);
-    DAP_DELETE( l_node_info_read);
+    DAP_DELETE(l_node_info_read);
     if(res_successful)
         return 0;
     return -1;
@@ -653,7 +650,7 @@ static int com_node_request_addr(dap_chain_node_info_t *a_node_info, const char
 
     // send request
     res = dap_chain_node_client_send_ch_pkt(client, dap_stream_ch_chain_net_get_id(),
-    DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST,NULL,0);
+    DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST, NULL, 0);
     if(res != 1) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "no request sent");
         // clean client struct
@@ -709,26 +706,32 @@ int com_global_db(int a_argc, const char ** a_argv, char **a_str_reply)
             != 0) {
         cmd_num = CMD_ADD;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del", NULL))
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del",
+    NULL))
             != 0) {
         cmd_num = CMD_DEL;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "link", NULL))
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "link",
+    NULL))
             != 0) {
         cmd_num = CMD_LINK;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "dump", NULL))
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "dump",
+    NULL))
             != 0) {
         cmd_num = CMD_DUMP;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "cur_node_get", NULL)) != 0) {
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1),
+            "cur_node_get", NULL)) != 0) {
         cmd_num = CMD_CUR_NODE_GET;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "cur_node_set", NULL)) != 0) {
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1),
+            "cur_node_set", NULL)) != 0) {
         cmd_num = CMD_CUR_NODE_SET;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "cur_node_set_from_remote",
-    NULL)) != 0) {
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1),
+            "cur_node_set_from_remote",
+            NULL)) != 0) {
         cmd_num = CMD_CUR_NODE_SET_FROM_REMOTE;
     }
     if(cmd_num == CMD_NONE) {
@@ -749,13 +752,13 @@ int com_global_db(int a_argc, const char ** a_argv, char **a_str_reply)
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-link", &l_link_str);
 
     // struct to write to the global db
-    dap_chain_node_addr_t l_link={0};
+    dap_chain_node_addr_t l_link = { 0 };
     dap_chain_node_info_t *l_node_info;
-    size_t l_node_info_size = sizeof (l_node_info->hdr)+sizeof(l_link);
-    l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t,l_node_info_size);
+    size_t l_node_info_size = sizeof(l_node_info->hdr) + sizeof(l_link);
+    l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size);
 
     if(l_addr_str) {
-        dap_digit_from_string(l_addr_str, l_node_info->hdr.address.raw, sizeof(l_node_info->hdr.address.raw) );
+        dap_digit_from_string(l_addr_str, l_node_info->hdr.address.raw, sizeof(l_node_info->hdr.address.raw));
     }
     if(l_cell_str) {
         dap_digit_from_string(l_cell_str, l_node_info->hdr.cell_id.raw, sizeof(l_node_info->hdr.cell_id.raw)); //DAP_CHAIN_CELL_ID_SIZE);
@@ -849,202 +852,207 @@ int com_node(int argc, const char ** argv, char **str_reply)
 
     dap_digit_from_string(addr_str, address.raw, sizeof(address.raw));
 
-    if( l_net_str == NULL){
+    if(l_net_str == NULL) {
         dap_chain_node_cli_set_reply_text(str_reply, "No -net <net name> option in command %s", argv[1]);
         return -11;
     }
 
     dap_chain_net_t * l_net = dap_chain_net_by_name(l_net_str);
 
-    if( l_net == NULL){
+    if(l_net == NULL) {
         dap_chain_node_cli_set_reply_text(str_reply, "%s: Can't find such network %s", argv[1], l_net_str);
         return -12;
     }
 
     switch (cmd_num)
-        {
-        // add alias
-        case CMD_ALIAS:
-            if(alias_str) {
-                if(addr_str) {
-                    // add alias
-                    if(!dap_chain_node_alias_register(alias_str, &address))
-                        log_it(L_WARNING, "can't save alias %s", alias_str);
-                    else {
-                        dap_chain_node_cli_set_reply_text(str_reply, "alias mapped successfully");
-                    }
-                }
+    {
+    // add alias
+    case CMD_ALIAS:
+        if(alias_str) {
+            if(addr_str) {
+                // add alias
+                if(!dap_chain_node_alias_register(alias_str, &address))
+                    log_it(L_WARNING, "can't save alias %s", alias_str);
                 else {
-                    dap_chain_node_cli_set_reply_text(str_reply, "alias can't be mapped because -addr is not found");
-                    return -1;
+                    dap_chain_node_cli_set_reply_text(str_reply, "alias mapped successfully");
                 }
             }
             else {
-                dap_chain_node_cli_set_reply_text(str_reply, "alias can't be mapped because -alias is not found");
+                dap_chain_node_cli_set_reply_text(str_reply, "alias can't be mapped because -addr is not found");
                 return -1;
             }
+        }
+        else {
+            dap_chain_node_cli_set_reply_text(str_reply, "alias can't be mapped because -alias is not found");
+            return -1;
+        }
 
-            break;
-            // make connect
-        case CMD_CONNECT: {
-            // get address from alias if addr not defined
-            if(alias_str && !address.uint64) {
-                dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(alias_str);
-                if(address_tmp) {
-                    memcpy(&address, address_tmp, sizeof(address_tmp));
-                    DAP_DELETE(address_tmp);
-                }
-                else {
-                    dap_chain_node_cli_set_reply_text(str_reply, "no address found by alias");
-                    return -1;
-                }
+        break;
+        // make connect
+    case CMD_CONNECT: {
+        // get address from alias if addr not defined
+        if(alias_str && !address.uint64) {
+            dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(alias_str);
+            if(address_tmp) {
+                memcpy(&address, address_tmp, sizeof(address_tmp));
+                DAP_DELETE(address_tmp);
             }
-            if(!address.uint64) {
-                dap_chain_node_cli_set_reply_text(str_reply, "addr not found");
+            else {
+                dap_chain_node_cli_set_reply_text(str_reply, "no address found by alias");
                 return -1;
             }
+        }
+        if(!address.uint64) {
+            dap_chain_node_cli_set_reply_text(str_reply, "addr not found");
+            return -1;
+        }
 
-            // get cur node addr
-            dap_chain_node_addr_t l_cur_node_addr;
-            l_cur_node_addr.uint64 = dap_db_get_cur_node_addr();  //0x12345
-            if(!l_cur_node_addr.uint64) {
-                dap_chain_node_cli_set_reply_text(str_reply, "Current node has no address");
-                return -1;
-            }
+        // get cur node addr
+        dap_chain_node_addr_t l_cur_node_addr;
+        l_cur_node_addr.uint64 = dap_db_get_cur_node_addr(); //0x12345
+        if(!l_cur_node_addr.uint64) {
+            dap_chain_node_cli_set_reply_text(str_reply, "Current node has no address");
+            return -1;
+        }
 
-            dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read_and_reply(&address, str_reply);
-            if(!l_remote_node_info) {
-                return -1;
-            }
-            // start connect
-            dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect(l_remote_node_info);
-            if(!l_node_client) {
-                dap_chain_node_cli_set_reply_text(str_reply, "can't connect");
-                DAP_DELETE(l_remote_node_info);
-                return -1;
-            }
-            // wait connected
-            int timeout_ms = 15000; //15 sec = 15000 ms
-            int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
-            if(res != 1) {
-                dap_chain_node_cli_set_reply_text(str_reply, "no response from node");
-                // clean client struct
-                dap_chain_node_client_close(l_node_client);
-                DAP_DELETE(l_remote_node_info);
-                return -1;
-            }
-            log_it(L_NOTICE, "Stream connection established, now lets sync all");
-            dap_stream_ch_chain_sync_request_t l_sync_request = {{0}};
-            dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id() );
-            l_sync_request.ts_start = (uint64_t) dap_db_log_get_last_timestamp_remote( l_remote_node_info->hdr.address.uint64 );
-            //l_sync_request.ts_end = (time_t) time(NULL);
-            l_sync_request.node_addr.uint64 = dap_chain_net_get_cur_addr(l_net)?dap_chain_net_get_cur_addr(l_net)->uint64:
-                                                                                dap_db_get_cur_node_addr();
-            dap_chain_id_t l_chain_id_null = {{0}};
-            dap_chain_cell_id_t l_chain_cell_id_null = {{0}};
-            log_it(L_INFO,"Requested GLOBAL_DB syncronizatoin, %llu:%llu period", l_sync_request.ts_start,
-                   l_sync_request.ts_end ) ;
-            if( 0 == dap_stream_ch_chain_pkt_write(l_ch_chain,DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB,
-                                                   l_net->pub.id, l_chain_id_null ,l_chain_cell_id_null ,&l_sync_request,
-                                                sizeof (l_sync_request))) {
+        dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read_and_reply(&address, str_reply);
+        if(!l_remote_node_info) {
+            return -1;
+        }
+        // start connect
+        dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect(l_remote_node_info);
+        if(!l_node_client) {
+            dap_chain_node_cli_set_reply_text(str_reply, "can't connect");
+            DAP_DELETE(l_remote_node_info);
+            return -1;
+        }
+        // wait connected
+        int timeout_ms = 15000; //15 sec = 15000 ms
+        int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
+        if(res != 1) {
+            dap_chain_node_cli_set_reply_text(str_reply, "no response from node");
+            // clean client struct
+            dap_chain_node_client_close(l_node_client);
+            DAP_DELETE(l_remote_node_info);
+            return -1;
+        }
+        log_it(L_NOTICE, "Stream connection established, now lets sync all");
+        dap_stream_ch_chain_sync_request_t l_sync_request = { { 0 } };
+        dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id());
+        l_sync_request.ts_start = (uint64_t) dap_db_log_get_last_timestamp_remote(
+                l_remote_node_info->hdr.address.uint64);
+        //l_sync_request.ts_end = (time_t) time(NULL);
+        l_sync_request.node_addr.uint64 =
+                dap_chain_net_get_cur_addr(l_net) ? dap_chain_net_get_cur_addr(l_net)->uint64 :
+                                                    dap_db_get_cur_node_addr();
+        dap_chain_id_t l_chain_id_null = { { 0 } };
+        dap_chain_cell_id_t l_chain_cell_id_null = { { 0 } };
+        log_it(L_INFO, "Requested GLOBAL_DB syncronizatoin, %llu:%llu period", l_sync_request.ts_start,
+                l_sync_request.ts_end);
+        if(0 == dap_stream_ch_chain_pkt_write(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB,
+                l_net->pub.id, l_chain_id_null, l_chain_cell_id_null, &l_sync_request,
+                sizeof(l_sync_request))) {
+            dap_chain_node_cli_set_reply_text(str_reply, "Error: Cant send sync chains request");
+            // clean client struct
+            dap_chain_node_client_close(l_node_client);
+            DAP_DELETE(l_remote_node_info);
+            return -1;
+        }
+        dap_stream_ch_set_ready_to_write(l_ch_chain, true);
+        // wait for finishing of request
+        timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms
+        // TODO add progress info to console
+        res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms);
+
+        // Requesting chains
+        dap_chain_t *l_chain = NULL;
+        DL_FOREACH(l_net->pub.chains, l_chain)
+        {
+            // send request
+            dap_stream_ch_chain_sync_request_t l_sync_request = { { 0 } };
+            if(0 == dap_stream_ch_chain_pkt_write(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS,
+                    l_net->pub.id, l_chain->id, l_remote_node_info->hdr.cell_id, &l_sync_request,
+                    sizeof(l_sync_request))) {
                 dap_chain_node_cli_set_reply_text(str_reply, "Error: Cant send sync chains request");
                 // clean client struct
                 dap_chain_node_client_close(l_node_client);
                 DAP_DELETE(l_remote_node_info);
                 return -1;
             }
-            dap_stream_ch_set_ready_to_write(l_ch_chain,true);
+            log_it(L_NOTICE, "Requested syncronization for chain \"%s\"", l_chain->name);
+            dap_stream_ch_set_ready_to_write(l_ch_chain, true);
+
             // wait for finishing of request
             timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms
             // TODO add progress info to console
             res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms);
+        }
+        log_it(L_INFO, "Chains and gdb are synced");
+        DAP_DELETE(l_remote_node_info);
+        dap_client_disconnect(l_node_client->client);
+        dap_chain_node_client_close(l_node_client);
+        dap_chain_node_cli_set_reply_text(str_reply, "Node sync completed: Chains and gdb are synced");
+        return 0;
 
-            // Requesting chains
-            dap_chain_t *l_chain = NULL;
-            DL_FOREACH(l_net->pub.chains, l_chain) {
-                // send request
-                dap_stream_ch_chain_sync_request_t l_sync_request = {{0}};
-                if( 0 == dap_stream_ch_chain_pkt_write(l_ch_chain,DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS,
-                                                    l_net->pub.id, l_chain->id ,l_remote_node_info->hdr.cell_id,&l_sync_request,
-                                                    sizeof (l_sync_request))) {
-                    dap_chain_node_cli_set_reply_text(str_reply, "Error: Cant send sync chains request");
-                    // clean client struct
-                    dap_chain_node_client_close(l_node_client);
-                    DAP_DELETE(l_remote_node_info);
-                    return -1;
-                }
-                log_it(L_NOTICE, "Requested syncronization for chain \"%s\"",l_chain->name);
-                dap_stream_ch_set_ready_to_write(l_ch_chain,true);
-
-                // wait for finishing of request
-                timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms
-                // TODO add progress info to console
-                res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms);
-            }
-            log_it(L_INFO,"Chains and gdb are synced");
-            DAP_DELETE(l_remote_node_info);
-            dap_client_disconnect(l_node_client->client);
-            dap_chain_node_client_close(l_node_client);
-            dap_chain_node_cli_set_reply_text(str_reply, "Node sync completed: Chains and gdb are synced");
-            return 0;
-
-        } break;
-            // make handshake
-        case CMD_HANDSHAKE: {
-            // get address from alias if addr not defined
-            if(alias_str && !address.uint64) {
-                dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(alias_str);
-                if(address_tmp) {
-                    memcpy(&address, address_tmp, sizeof(address_tmp));
-                    DAP_DELETE(address_tmp);
-                }
-                else {
-                    dap_chain_node_cli_set_reply_text(str_reply, "no address found by alias");
-                    return -1;
-                }
+    }
+        break;
+        // make handshake
+    case CMD_HANDSHAKE: {
+        // get address from alias if addr not defined
+        if(alias_str && !address.uint64) {
+            dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(alias_str);
+            if(address_tmp) {
+                memcpy(&address, address_tmp, sizeof(address_tmp));
+                DAP_DELETE(address_tmp);
             }
-            if(!address.uint64) {
-                dap_chain_node_cli_set_reply_text(str_reply, "addr not found");
+            else {
+                dap_chain_node_cli_set_reply_text(str_reply, "no address found by alias");
                 return -1;
             }
+        }
+        if(!address.uint64) {
+            dap_chain_node_cli_set_reply_text(str_reply, "addr not found");
+            return -1;
+        }
 
-            dap_chain_node_info_t *node_info = dap_chain_node_info_read_and_reply(&address, str_reply);
-            if(!node_info)
-                return -1;
-            int timeout_ms = 10000; //10 sec = 10000 ms
-            // start handshake
-            dap_chain_node_client_t *client = dap_chain_node_client_connect(node_info);
-            if(!client) {
-                dap_chain_node_cli_set_reply_text(str_reply, "can't connect");
-                DAP_DELETE(node_info);
-                return -1;
-            }
-            // wait handshake
-            int res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
-            if(res != 1) {
-                dap_chain_node_cli_set_reply_text(str_reply, "no response from node");
-                // clean client struct
-                dap_chain_node_client_close(client);
-                DAP_DELETE(node_info);
-                return -1;
-            }
+        dap_chain_node_info_t *node_info = dap_chain_node_info_read_and_reply(&address, str_reply);
+        if(!node_info)
+            return -1;
+        int timeout_ms = 10000; //10 sec = 10000 ms
+        // start handshake
+        dap_chain_node_client_t *client = dap_chain_node_client_connect(node_info);
+        if(!client) {
+            dap_chain_node_cli_set_reply_text(str_reply, "can't connect");
             DAP_DELETE(node_info);
+            return -1;
+        }
+        // wait handshake
+        int res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
+        if(res != 1) {
+            dap_chain_node_cli_set_reply_text(str_reply, "no response from node");
+            // clean client struct
+            dap_chain_node_client_close(client);
+            DAP_DELETE(node_info);
+            return -1;
+        }
+        DAP_DELETE(node_info);
 
-            //Add new established connection in the list
-            int ret = dap_chain_node_client_list_add(&address, client);
-            switch (ret)
-            {
-            case -1:
-                dap_chain_node_client_close(client);
-                dap_chain_node_cli_set_reply_text(str_reply, "connection established, but not saved");
-                return -1;
-            case -2:
-                dap_chain_node_client_close(client);
-                dap_chain_node_cli_set_reply_text(str_reply, "connection already present");
-                return -1;
-            }
-            dap_chain_node_cli_set_reply_text(str_reply, "connection established");
-        } break;
+        //Add new established connection in the list
+        int ret = dap_chain_node_client_list_add(&address, client);
+        switch (ret)
+        {
+        case -1:
+            dap_chain_node_client_close(client);
+            dap_chain_node_cli_set_reply_text(str_reply, "connection established, but not saved");
+            return -1;
+        case -2:
+            dap_chain_node_client_close(client);
+            dap_chain_node_cli_set_reply_text(str_reply, "connection already present");
+            return -1;
+        }
+        dap_chain_node_cli_set_reply_text(str_reply, "connection established");
+    }
+        break;
     }
     return 0;
 }
@@ -1316,16 +1324,17 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply)
     arg_index++;
     if(cmd_num == CMD_NONE) {
         dap_chain_node_cli_set_reply_text(str_reply,
-                "format of command: wallet [new -w <wallet_name> | list | info -addr <addr> -w <wallet_name>]");
+                "format of command: wallet [new -w <wallet_name> | list | info -addr <addr> -w <wallet_name> -net <net_name>]");
         return -1;
     }
 
     dap_chain_node_addr_t address;
     memset(&address, 0, sizeof(dap_chain_node_addr_t));
-    const char *addr_str = NULL, *wallet_name = NULL;
+    const char *addr_str = NULL, *wallet_name = NULL, *l_net_name = NULL;
     // find wallet addr
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-addr", &addr_str);
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-w", &wallet_name);
+    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_name); // for
 
     dap_string_t *l_string_ret = dap_string_new(NULL);
     switch (cmd_num) {
@@ -1355,12 +1364,12 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply)
         // wallet list
     case CMD_WALLET_LIST: {
         DIR * l_dir = opendir(c_wallets_path);
-        if( l_dir ) {
+        if(l_dir) {
             struct dirent * l_dir_entry;
-            while((l_dir_entry=readdir(l_dir))!=NULL){
+            while((l_dir_entry = readdir(l_dir)) != NULL) {
                 const char *l_file_name = l_dir_entry->d_name;
                 size_t l_file_name_len = (l_file_name) ? strlen(l_file_name) : 0;
-                if( (l_file_name_len > 8 )&& ( strcmp(l_file_name + l_file_name_len - 8, ".dwallet") == 0 ) ) {
+                if((l_file_name_len > 8) && (strcmp(l_file_name + l_file_name_len - 8, ".dwallet") == 0)) {
                     char *l_file_path_tmp = dap_strdup_printf("%s/%s", c_wallets_path, l_file_name);
                     dap_chain_wallet_t *l_wallet = dap_chain_wallet_open_file(l_file_path_tmp);
                     if(l_wallet) {
@@ -1391,6 +1400,18 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply)
         if(!l_addr && addr_str)
             l_addr = dap_chain_str_to_addr(addr_str);
 
+        dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name((const char *) l_net_name);
+        if(!l_net_name) {
+            dap_chain_node_cli_set_reply_text(str_reply, "wallet info requires parameter 'net'");
+            return -1;
+        }
+        else {
+            if((l_ledger = dap_chain_ledger_by_net_name(l_net_name)) == NULL) {
+                dap_chain_node_cli_set_reply_text(str_reply, "not found net by name '%s'", l_net_name);
+                return -1;
+            }
+        }
+
         if(l_addr) {
             char *l_addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) l_addr);
             if(l_wallet)
@@ -1399,14 +1420,14 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply)
 
             size_t l_addr_tokens_size = 0;
             char **l_addr_tokens = NULL;
-            dap_chain_utxo_addr_get_token_ticker_all(l_addr, &l_addr_tokens, &l_addr_tokens_size);
+            dap_chain_ledger_addr_get_token_ticker_all(l_ledger, l_addr, &l_addr_tokens, &l_addr_tokens_size);
             if(l_addr_tokens_size > 0)
                 dap_string_append_printf(l_string_ret, "balance:\n");
             else
                 dap_string_append_printf(l_string_ret, "balance: 0\n");
             for(size_t i = 0; i < l_addr_tokens_size; i++) {
                 if(l_addr_tokens[i]) {
-                    uint64_t balance = dap_chain_utxo_calc_balance(l_addr, l_addr_tokens[i]);
+                    uint64_t balance = dap_chain_ledger_calc_balance(l_ledger, l_addr, l_addr_tokens[i]);
                     dap_string_append_printf(l_string_ret, "          %llu %s\n", balance, l_addr_tokens[i]);
                 }
                 DAP_DELETE(l_addr_tokens[i]);
@@ -1443,43 +1464,44 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply)
  * @param l_net
  * @return
  */
-int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int argc, const char ** argv, char ** a_str_reply,
-                             dap_chain_t ** a_chain, dap_chain_net_t ** a_net)
+int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index, int argc, const char ** argv, char ** a_str_reply,
+        dap_chain_t ** a_chain, dap_chain_net_t ** a_net)
 {
     const char * l_chain_str = NULL;
     const char * l_net_str = NULL;
 
     // Net name
-    if ( a_net )
+    if(a_net)
         dap_chain_node_cli_find_option_val(argv, *a_arg_index, argc, "-net", &l_net_str);
     else
-       return -100;
+        return -100;
 
     // Select network
     if(!l_net_str) {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'net'",argv[0]);
+        dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'net'", argv[0]);
         return -101;
     }
 
-    if ( ( *a_net  = dap_chain_net_by_name(l_net_str) ) == NULL ){ // Can't find such network
-        dap_chain_node_cli_set_reply_text(a_str_reply, "%s cand find network \"%s\"",argv[0],l_net_str);
+    if((*a_net = dap_chain_net_by_name(l_net_str)) == NULL) { // Can't find such network
+        dap_chain_node_cli_set_reply_text(a_str_reply, "%s cand find network \"%s\"", argv[0], l_net_str);
         return -102;
     }
 
     // Chain name
-    if ( a_chain ){
+    if(a_chain) {
         dap_chain_node_cli_find_option_val(argv, *a_arg_index, argc, "-chain", &l_chain_str);
 
         // Select chain
         if(l_chain_str) {
-            if ( ( *a_chain  = dap_chain_net_get_chain_by_name(*a_net, l_chain_str ) ) == NULL ){ // Can't find such chain
-                dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'chain' to be valid chain name in chain net %s",
-                                                  argv[0] , l_net_str);
+            if((*a_chain = dap_chain_net_get_chain_by_name(*a_net, l_chain_str)) == NULL) { // Can't find such chain
+                dap_chain_node_cli_set_reply_text(a_str_reply,
+                        "%s requires parameter 'chain' to be valid chain name in chain net %s",
+                        argv[0], l_net_str);
                 return -103;
             }
         }
     }
-    return  0;
+    return 0;
 
 }
 
@@ -1498,7 +1520,7 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply)
     // Chain name
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "datum", &l_datum_hash_str);
 
-    if ( l_datum_hash_str ){
+    if(l_datum_hash_str) {
         const char * l_certs_str = NULL;
         dap_chain_cert_t ** l_certs = NULL;
         size_t l_certs_size = 0;
@@ -1506,11 +1528,11 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply)
 
         dap_chain_net_t * l_net = NULL;
 
-        if ( dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) < 0 )
+        if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) < 0)
             return -1;
 
         // Load certs lists
-        size_t l_signs_size = dap_chain_cert_parse_str_list(l_certs_str,&l_certs, &l_certs_size);
+        size_t l_signs_size = dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
         if(!l_certs_size) {
             dap_chain_node_cli_set_reply_text(a_str_reply,
                     "token_create command requres at least one valid certificate to sign the basic transaction of emission");
@@ -1520,16 +1542,16 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply)
 
         char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
 
-        log_it (L_DEBUG, "Requested to sign token declaration %s in gdb://%s with certs %s",
-                l_gdb_group_mempool,l_datum_hash_str,                l_certs_str);
+        log_it(L_DEBUG, "Requested to sign token declaration %s in gdb://%s with certs %s",
+                l_gdb_group_mempool, l_datum_hash_str, l_certs_str);
 
         dap_chain_datum_t * l_datum = NULL;
         size_t l_datum_size = 0;
-        if( (l_datum = (dap_chain_datum_t*) dap_chain_global_db_gr_get(
-                    l_datum_hash_str ,&l_datum_size,l_gdb_group_mempool )) != NULL ) {
+        if((l_datum = (dap_chain_datum_t*) dap_chain_global_db_gr_get(
+                l_datum_hash_str, &l_datum_size, l_gdb_group_mempool)) != NULL) {
 
             // Check if its token declaration
-            if ( l_datum->header.type_id == DAP_CHAIN_DATUM_TOKEN_DECL ){
+            if(l_datum->header.type_id == DAP_CHAIN_DATUM_TOKEN_DECL) {
                 dap_chain_datum_token_t * l_datum_token = (dap_chain_datum_token_t *) l_datum->data;
                 size_t l_datum_token_size = l_datum->header.data_size;
                 size_t l_signs_size = l_datum_token_size - sizeof(l_datum_token->header);
@@ -1537,81 +1559,85 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply)
                 // Check for signatures, are they all in set and are good enought?
                 size_t l_signs_count = 0;
 
-                for ( size_t l_offset = 0; l_offset < l_signs_size; l_signs_count++ ) {
+                for(size_t l_offset = 0; l_offset < l_signs_size; l_signs_count++) {
                     dap_chain_sign_t * l_sign = (dap_chain_sign_t *) l_datum_token->signs + l_offset;
                     l_offset += dap_chain_sign_get_size(l_sign);
-                    if ( dap_chain_sign_verify(l_sign,&l_datum_token->header,sizeof (l_datum_token->header) ) != 1 ){
-                        log_it(L_WARNING,"Wrong signature for datum_token with key %s in mempool!",l_datum_hash_str );
-                        dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s with datum token has wrong signature %u, break process and exit",
-                                                          l_datum_hash_str, l_signs_count+1);
+                    if(dap_chain_sign_verify(l_sign, &l_datum_token->header, sizeof(l_datum_token->header)) != 1) {
+                        log_it(L_WARNING, "Wrong signature for datum_token with key %s in mempool!", l_datum_hash_str);
+                        dap_chain_node_cli_set_reply_text(a_str_reply,
+                                "Datum %s with datum token has wrong signature %u, break process and exit",
+                                l_datum_hash_str, l_signs_count + 1);
                         DAP_DELETE(l_datum);
                         DAP_DELETE(l_datum_token);
                         DAP_DELETE(l_gdb_group_mempool);
                         return -666;
                     }
                 }
-                log_it( L_DEBUG,"Datum % with token declaration: %u signatures are verified well", l_signs_count);
+                log_it(L_DEBUG, "Datum % with token declaration: %u signatures are verified well", l_signs_count);
 
                 // Check if all signs are present
-                if ( l_signs_count == l_datum_token->header.signs_total ){
-                    dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s with datum token has all signs on board. Can't add anything in it");
+                if(l_signs_count == l_datum_token->header.signs_total) {
+                    dap_chain_node_cli_set_reply_text(a_str_reply,
+                            "Datum %s with datum token has all signs on board. Can't add anything in it");
                     DAP_DELETE(l_datum);
                     DAP_DELETE(l_datum_token);
                     DAP_DELETE(l_gdb_group_mempool);
                     return -7;
                 } // Check if more signs that could be (corrupted datum)
-                else if ( l_signs_count > l_datum_token->header.signs_total ){
-                    dap_chain_node_cli_set_reply_text(a_str_reply, "Warning! Datum %s with datum token has more signs on board (%u) than its possible to have (%u)!",
-                                                      l_signs_count, l_datum_token->header.signs_total );
+                else if(l_signs_count > l_datum_token->header.signs_total) {
+                    dap_chain_node_cli_set_reply_text(a_str_reply,
+                            "Warning! Datum %s with datum token has more signs on board (%u) than its possible to have (%u)!",
+                            l_signs_count, l_datum_token->header.signs_total);
                     DAP_DELETE(l_datum);
                     DAP_DELETE(l_datum_token);
                     DAP_DELETE(l_gdb_group_mempool);
                     return -8;
                 } // Check if we have enough place to sign the datum token declaration
-                else if (  l_datum_token->header.signs_total - l_signs_count < l_certs_count ){
-                    l_datum = DAP_REALLOC(l_datum, l_datum_size+ l_signs_size ); // add place for new signatures
-                    size_t l_offset =  0;
-                    for ( size_t i = 0 ; i < l_certs_count ; i++ ){
-                        dap_chain_sign_t * l_sign = dap_chain_sign_create( l_certs[i]->enc_key,
-                                                                           &l_datum_token->header,
-                                                                           sizeof (l_datum_token->header), 0 );
+                else if(l_datum_token->header.signs_total - l_signs_count < l_certs_count) {
+                    l_datum = DAP_REALLOC(l_datum, l_datum_size + l_signs_size); // add place for new signatures
+                    size_t l_offset = 0;
+                    for(size_t i = 0; i < l_certs_count; i++) {
+                        dap_chain_sign_t * l_sign = dap_chain_sign_create(l_certs[i]->enc_key,
+                                &l_datum_token->header,
+                                sizeof(l_datum_token->header), 0);
                         size_t l_sign_size = dap_chain_sign_get_size(l_sign);
-                        if ( l_offset + l_sign_size <= l_signs_size ){
-                            memcpy( l_datum_token->signs  + l_datum_token_size - sizeof (l_datum_token->header) + l_offset,
-                                l_sign,l_sign_size );
-                            log_it (L_DEBUG, "Added datum token declaration sign with cert %s", l_certs[i]->name);
+                        if(l_offset + l_sign_size <= l_signs_size) {
+                            memcpy(l_datum_token->signs + l_datum_token_size - sizeof(l_datum_token->header) + l_offset,
+                                    l_sign, l_sign_size);
+                            log_it(L_DEBUG, "Added datum token declaration sign with cert %s", l_certs[i]->name);
                         }
 
-                        DAP_DELETE( l_sign);
+                        DAP_DELETE(l_sign);
                         l_offset += l_sign_size;
-                        if (l_offset > l_signs_size ){
+                        if(l_offset > l_signs_size) {
                             break;
                         }
                     }
                     l_datum_size += l_signs_size;
 
-
                     // Recalc hash, string and place new datum
 
                     // Calc datum's hash
                     dap_chain_hash_fast_t l_key_hash;
-                    dap_hash_fast(l_datum,l_datum_size, &l_key_hash);
+                    dap_hash_fast(l_datum, l_datum_size, &l_key_hash);
                     char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
 
                     // Add datum to mempool with datum_token hash as a key
-                    if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size,l_gdb_group_mempool )) {
+                    if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
                         // Remove old datum from pool
-                        if (dap_chain_global_db_gr_del(l_datum_hash_str,l_gdb_group_mempool) ){
-                            dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s produced from %s is replacing the %s in datum pool",
-                                                              l_key_str, l_datum_hash_str,l_datum_hash_str);
+                        if(dap_chain_global_db_gr_del(l_datum_hash_str, l_gdb_group_mempool)) {
+                            dap_chain_node_cli_set_reply_text(a_str_reply,
+                                    "datum %s produced from %s is replacing the %s in datum pool",
+                                    l_key_str, l_datum_hash_str, l_datum_hash_str);
 
                             DAP_DELETE(l_datum);
                             DAP_DELETE(l_datum_token);
                             DAP_DELETE(l_gdb_group_mempool);
-                            return  0;
+                            return 0;
                         } else {
-                            dap_chain_node_cli_set_reply_text(a_str_reply, "Warning! Can't remove old datum %s ( new datum %s added normaly in datum pool)",
-                                                               l_datum_hash_str,l_key_str);
+                            dap_chain_node_cli_set_reply_text(a_str_reply,
+                                    "Warning! Can't remove old datum %s ( new datum %s added normaly in datum pool)",
+                                    l_datum_hash_str, l_key_str);
                             DAP_DELETE(l_datum);
                             DAP_DELETE(l_datum_token);
                             DAP_DELETE(l_gdb_group_mempool);
@@ -1619,9 +1645,10 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply)
                         }
 
                     }
-                    else{
-                        dap_chain_node_cli_set_reply_text(a_str_reply, "Error! datum %s produced from %s can't be placed in mempool",
-                                                          l_key_str, l_datum_hash_str);
+                    else {
+                        dap_chain_node_cli_set_reply_text(a_str_reply,
+                                "Error! datum %s produced from %s can't be placed in mempool",
+                                l_key_str, l_datum_hash_str);
                         DAP_DELETE(l_datum);
                         DAP_DELETE(l_datum_token);
                         DAP_DELETE(l_gdb_group_mempool);
@@ -1629,25 +1656,28 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply)
                     }
 
                 } else {
-                    dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Not enought place for new signature (%u is left when we need %u signatures)",
-                                                       l_datum_token->header.signs_total - l_signs_count, l_certs_count );
+                    dap_chain_node_cli_set_reply_text(a_str_reply,
+                            "Error! Not enought place for new signature (%u is left when we need %u signatures)",
+                            l_datum_token->header.signs_total - l_signs_count, l_certs_count);
                     return -6;
                 }
             } else {
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Wrong datum type. token_decl_sign sign only token declarations datum");
+                dap_chain_node_cli_set_reply_text(a_str_reply,
+                        "Error! Wrong datum type. token_decl_sign sign only token declarations datum");
                 return -61;
             }
-        }else {
-            dap_chain_node_cli_set_reply_text(a_str_reply, "token_decl_sign can't find datum with %s hash in the mempool of %s:%s", l_net->pub.name,l_chain->name);
+        } else {
+            dap_chain_node_cli_set_reply_text(a_str_reply,
+                    "token_decl_sign can't find datum with %s hash in the mempool of %s:%s", l_net->pub.name,
+                    l_chain->name);
             return -5;
         }
-    }else {
+    } else {
         dap_chain_node_cli_set_reply_text(a_str_reply, "token_decl_sign need datum <datum hash> argument");
         return -2;
     }
 }
 
-
 /**
  * @brief com_token_decl_list
  * @param argc
@@ -1661,35 +1691,36 @@ int com_mempool_list(int argc, const char ** argv, char ** a_str_reply)
     dap_chain_t * l_chain = NULL;
     dap_chain_net_t * l_net = NULL;
 
-    if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) != 0){
+    if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) != 0) {
         return -1;
     }
 
-    if ( l_chain && l_net ){
+    if(l_chain && l_net) {
         char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
         dap_string_t * l_str_tmp = dap_string_new(NULL);
 
         size_t l_objs_size = 0;
 
-        dap_global_db_obj_t ** l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool,&l_objs_size);
-        dap_string_append_printf(l_str_tmp,"%s.%s: Found %u records :\n",l_net->pub.name,l_chain->name,l_objs_size);
-        for ( size_t i = 0; i< l_objs_size; i++){
-            dap_chain_datum_t * l_datum =(dap_chain_datum_t* ) l_objs[i]->value;
+        dap_global_db_obj_t ** l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size);
+        dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records :\n", l_net->pub.name, l_chain->name, l_objs_size);
+        for(size_t i = 0; i < l_objs_size; i++) {
+            dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i]->value;
             char buf[50];
             time_t l_ts_create = (time_t) l_datum->header.ts_create;
-            dap_string_append_printf(l_str_tmp,"%s: type_id=%s  data_size=%u ts_create=%s",
-                                     l_objs[i]->key, c_datum_type_str[l_datum->header.type_id],
-                                        l_datum->header.data_size,ctime_r( &l_ts_create,buf ) );
+            dap_string_append_printf(l_str_tmp, "%s: type_id=%s  data_size=%u ts_create=%s",
+                    l_objs[i]->key, c_datum_type_str[l_datum->header.type_id],
+                    l_datum->header.data_size, ctime_r(&l_ts_create, buf));
         }
 
         // Clean up
         dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
         dap_chain_global_db_objs_delete(l_objs);
-        dap_string_free(l_str_tmp,false);
+        dap_string_free(l_str_tmp, false);
 
-        return  0;
-    }else {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Need both -net <network name> and -chain <chain name> params\n");
+        return 0;
+    } else {
+        dap_chain_node_cli_set_reply_text(a_str_reply,
+                "Error! Need both -net <network name> and -chain <chain name> params\n");
         return -2;
     }
 }
@@ -1707,29 +1738,31 @@ int com_mempool_delete(int argc, const char ** argv, char ** a_str_reply)
     dap_chain_t * l_chain = NULL;
     dap_chain_net_t * l_net = NULL;
 
-    if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) != 0){
-        dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Need both -net <network name> and -chain <chain name> params\n");
+    if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) != 0) {
+        dap_chain_node_cli_set_reply_text(a_str_reply,
+                "Error! Need both -net <network name> and -chain <chain name> params\n");
         return -1;
     }
 
-    if ( l_chain && l_net ){
+    if(l_chain && l_net) {
         const char * l_datum_hash_str = NULL;
         dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str);
-        if ( l_datum_hash_str ){
+        if(l_datum_hash_str) {
             char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
-            if ( dap_chain_global_db_gr_del(l_datum_hash_str,l_gdb_group_mempool) ) {
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s deleted",l_datum_hash_str);
-                return  0;
-            }else {
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s",l_datum_hash_str);
-                return  -4;
+            if(dap_chain_global_db_gr_del(l_datum_hash_str, l_gdb_group_mempool)) {
+                dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s deleted", l_datum_hash_str);
+                return 0;
+            } else {
+                dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s", l_datum_hash_str);
+                return -4;
             }
-        }else {
-            dap_chain_node_cli_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option",argv[0]);
+        } else {
+            dap_chain_node_cli_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option", argv[0]);
             return -3;
         }
-    }else {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Need both -net <network name> and -chain <chain name> params\n");
+    } else {
+        dap_chain_node_cli_set_reply_text(a_str_reply,
+                "Error! Need both -net <network name> and -chain <chain name> params\n");
         return -2;
     }
 }
@@ -1747,46 +1780,44 @@ int com_mempool_proc(int argc, const char ** argv, char ** a_str_reply)
     dap_chain_t * l_chain;
     dap_chain_net_t * l_net = NULL;
 
-    if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) < 0)
+    if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) < 0)
         return -1;
 
     char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
     size_t l_objs_size = 0;
-    dap_global_db_obj_t ** l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool,&l_objs_size);
+    dap_global_db_obj_t ** l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size);
     dap_string_t * l_str_tmp = dap_string_new(NULL);
-    if ( l_objs_size ) {
-        dap_string_append_printf(l_str_tmp,"%s.%s: Found %u records :\n",l_net->pub.name,l_chain->name);
-
+    if(l_objs_size) {
+        dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records :\n", l_net->pub.name, l_chain->name);
 
         size_t l_datums_size = l_objs_size;
-        dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*,sizeof(dap_chain_datum_t*)*l_datums_size);
-        for ( size_t i = 0; i< l_objs_size; i++){
-            dap_chain_datum_t * l_datum = (dap_chain_datum_t* ) l_objs[i]->value;
+        dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*, sizeof(dap_chain_datum_t*) * l_datums_size);
+        for(size_t i = 0; i < l_objs_size; i++) {
+            dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i]->value;
             l_datums[i] = l_datum;
             char buf[50];
             time_t l_ts_create = (time_t) l_datum->header.ts_create;
-            dap_string_append_printf(l_str_tmp,"0x%s: type_id=%s ts_create=%s data_size=%u\n",
-                                     l_objs[i]->key, c_datum_type_str[l_datum->header.type_id],
-                                        ctime_r( &l_ts_create,buf ),l_datum->header.data_size );
+            dap_string_append_printf(l_str_tmp, "0x%s: type_id=%s ts_create=%s data_size=%u\n",
+                    l_objs[i]->key, c_datum_type_str[l_datum->header.type_id],
+                    ctime_r(&l_ts_create, buf), l_datum->header.data_size);
         }
-        size_t l_objs_processed = l_chain->callback_datums_pool_proc(l_chain,l_datums,l_datums_size);
+        size_t l_objs_processed = l_chain->callback_datums_pool_proc(l_chain, l_datums, l_datums_size);
         // Delete processed objects
-        for ( size_t i = 0; i< l_objs_processed; i++){
-            dap_chain_global_db_gr_del(l_objs[i]->key,l_gdb_group_mempool);
-            dap_string_append_printf(l_str_tmp,"New event created, removed datum 0x%s from mempool \n",l_objs[i]->key);
+        for(size_t i = 0; i < l_objs_processed; i++) {
+            dap_chain_global_db_gr_del(l_objs[i]->key, l_gdb_group_mempool);
+            dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n",
+                    l_objs[i]->key);
         }
         dap_chain_global_db_objs_delete(l_objs);
 
         dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
-        dap_string_free(l_str_tmp,false);
-    }else {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "%s.^s: No records in mempool",l_net->pub.name,l_chain->name);
+        dap_string_free(l_str_tmp, false);
+    } else {
+        dap_chain_node_cli_set_reply_text(a_str_reply, "%s.^s: No records in mempool", l_net->pub.name, l_chain->name);
     }
     return 0;
 }
 
-
-
 /**
  * @brief com_token_decl
  * @param argc
@@ -1810,7 +1841,6 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
     const char * l_signs_total_str = NULL;
     uint16_t l_signs_total = 0;
 
-
     const char * l_certs_str = NULL;
 
     dap_chain_cert_t ** l_certs = NULL;
@@ -1819,18 +1849,15 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
     dap_chain_t * l_chain;
     dap_chain_net_t * l_net = NULL;
 
-    if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,str_reply,&l_chain, &l_net) < 0)
+    if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, str_reply, &l_chain, &l_net) < 0)
         return -1;
 
-
-
     // Total supply value
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "total_supply", &l_total_supply_str);
 
     // Token ticker
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "token", &l_ticker);
 
-
     // Certificates thats will be used to sign currend datum token
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "certs", &l_certs_str);
 
@@ -1843,10 +1870,11 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
     if(!l_total_supply_str) {
         dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'total_supply'");
         return -11;
-    }else {
+    } else {
         char * l_tmp = NULL;
-        if ( ( l_total_supply = strtoull(l_total_supply_str,&l_tmp,10) ) == 0 ){
-            dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'total_supply' to be unsigned integer value that fits in 8 bytes");
+        if((l_total_supply = strtoull(l_total_supply_str, &l_tmp, 10)) == 0) {
+            dap_chain_node_cli_set_reply_text(str_reply,
+                    "token_create requires parameter 'total_supply' to be unsigned integer value that fits in 8 bytes");
             return -2;
         }
     }
@@ -1855,10 +1883,11 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
     if(!l_signs_emission_str) {
         dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'signs_emission'");
         return -3;
-    }else {
+    } else {
         char * l_tmp = NULL;
-        if ( ( l_signs_emission  =(uint16_t)  strtol(l_signs_emission_str,&l_tmp,10) ) == 0 ){
-            dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'signs_emission' to be unsigned integer value that fits in 2 bytes");
+        if((l_signs_emission = (uint16_t) strtol(l_signs_emission_str, &l_tmp, 10)) == 0) {
+            dap_chain_node_cli_set_reply_text(str_reply,
+                    "token_create requires parameter 'signs_emission' to be unsigned integer value that fits in 2 bytes");
             return -4;
         }
     }
@@ -1867,22 +1896,21 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
     if(!l_signs_total_str) {
         dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'signs_total'");
         return -31;
-    }else {
+    } else {
         char * l_tmp = NULL;
-        if ( ( l_signs_total  =(uint16_t)  strtol(l_signs_total_str,&l_tmp,10) ) == 0 ){
-            dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'signs_total' to be unsigned integer value that fits in 2 bytes");
+        if((l_signs_total = (uint16_t) strtol(l_signs_total_str, &l_tmp, 10)) == 0) {
+            dap_chain_node_cli_set_reply_text(str_reply,
+                    "token_create requires parameter 'signs_total' to be unsigned integer value that fits in 2 bytes");
             return -41;
         }
     }
 
-
     // Check for ticker
     if(!l_ticker) {
         dap_chain_node_cli_set_reply_text(str_reply, "token_emit requires parameter 'token'");
         return -5;
     }
 
-
     // Check certs list
     if(!l_certs_str) {
         dap_chain_node_cli_set_reply_text(str_reply, "token_emit requires parameter 'certs'");
@@ -1890,7 +1918,7 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
     }
 
     // Load certs lists
-    size_t l_signs_size = dap_chain_cert_parse_str_list(l_certs_str,&l_certs, &l_certs_size);
+    size_t l_signs_size = dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
     if(!l_certs_size) {
         dap_chain_node_cli_set_reply_text(str_reply,
                 "token_create command requres at least one valid certificate to sign the basic transaction of emission");
@@ -1898,14 +1926,14 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
     }
 
     // If we have more certs than we need signs - use only first part of the list
-    if (l_certs_size > l_signs_total )
+    if(l_certs_size > l_signs_total)
         l_certs_size = l_signs_total;
 
     // Create new datum token
-    dap_chain_datum_token_t * l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t,sizeof(l_datum_token->header) +
-                                                             l_signs_size);
+    dap_chain_datum_token_t * l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(l_datum_token->header) +
+            l_signs_size);
     l_datum_token->header.version = 1; // Current version
-    snprintf(l_datum_token->header.ticker,sizeof(l_datum_token->header.ticker),"%s",l_ticker);
+    snprintf(l_datum_token->header.ticker, sizeof(l_datum_token->header.ticker), "%s", l_ticker);
     l_datum_token->header.total_supply = l_total_supply;
     l_datum_token->header.signs_total = l_signs_total;
     l_datum_token->header.signs_valid = l_signs_emission;
@@ -1913,35 +1941,37 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
     size_t l_signs_offset = 0;
     // Sign header with all certificates in the list and add signs to the end of ticker declaration
     // Important:
-    for ( size_t i = 0 ; i < l_certs_size; i++ ){
-        dap_chain_sign_t * l_sign = dap_chain_cert_sign( l_certs[i],
-                                                         l_datum_token,
-                                                         sizeof(l_datum_token->header),
-                                                         0);
+    for(size_t i = 0; i < l_certs_size; i++) {
+        dap_chain_sign_t * l_sign = dap_chain_cert_sign(l_certs[i],
+                l_datum_token,
+                sizeof(l_datum_token->header),
+                0);
         size_t l_sign_size = dap_chain_sign_get_size(l_sign);
-        memcpy(l_datum_token->signs+l_signs_offset,l_sign,l_sign_size);
+        memcpy(l_datum_token->signs + l_signs_offset, l_sign, l_sign_size);
         DAP_DELETE(l_sign);
     }
-    dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_DECL,l_datum_token,
-                                                         sizeof (l_datum_token->header)+ l_signs_size);
+    dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_DECL, l_datum_token,
+            sizeof(l_datum_token->header) + l_signs_size);
     size_t l_datum_size = dap_chain_datum_size(l_datum);
 
     // Calc datum's hash
     dap_chain_hash_fast_t l_key_hash;
-    dap_hash_fast(l_datum,l_datum_size, &l_key_hash);
+    dap_hash_fast(l_datum, l_datum_size, &l_key_hash);
     char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
 
     // Add datum to mempool with datum_token hash as a key
     char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
-    if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size,l_gdb_group_mempool )) {
-        dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum %s with token %s is placed in datum pool ", str_reply_tmp, l_key_str,l_ticker);
+    if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
+        dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum %s with token %s is placed in datum pool ",
+                str_reply_tmp, l_key_str, l_ticker);
         DAP_DELETE(l_datum);
         DAP_DELETE(l_datum_token);
         DAP_DELETE(l_gdb_group_mempool);
-        return  0;
+        return 0;
     }
-    else{
-        dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp, l_key_str);
+    else {
+        dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp,
+                l_key_str);
         DAP_DELETE(l_datum);
         DAP_DELETE(l_datum_token);
         DAP_DELETE(l_gdb_group_mempool);
@@ -1982,7 +2012,6 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     const char * l_net_str = NULL;
     dap_chain_net_t * l_net = NULL;
 
-
     // Wallet address that recieves the emission
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-certs", &l_certs_str);
 
@@ -2018,7 +2047,7 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     }
 
     // Load certs
-    dap_chain_cert_parse_str_list(l_certs_str,&l_certs,&l_certs_size);
+    dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
 
     if(!l_certs_size) {
         dap_chain_node_cli_set_reply_text(str_reply,
@@ -2026,7 +2055,6 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
         return -5;
     }
 
-
     dap_chain_addr_t * l_addr = dap_chain_str_to_addr(l_addr_str);
 
     if(!l_addr) {
@@ -2041,9 +2069,10 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     if(!l_net_str) {
         dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'net'");
         return -42;
-    }else {
-        if ( ( l_net  = dap_chain_net_by_name(l_net_str) ) == NULL ){ // Can't find such network
-            dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter '-net' to be valid chain network name");
+    } else {
+        if((l_net = dap_chain_net_by_name(l_net_str)) == NULL) { // Can't find such network
+            dap_chain_node_cli_set_reply_text(str_reply,
+                    "token_create requires parameter '-net' to be valid chain network name");
             return -43;
         }
     }
@@ -2055,9 +2084,11 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     if(!l_chain_emission_str) {
         dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter '-chain_emission'");
         return -44;
-    }else {
-        if ( ( l_chain_emission  = dap_chain_net_get_chain_by_name(l_net, l_chain_emission_str ) ) == NULL ){ // Can't find such chain
-            dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'chain_emission' to be valid chain name in chain net %s",l_net_str);
+    } else {
+        if((l_chain_emission = dap_chain_net_get_chain_by_name(l_net, l_chain_emission_str)) == NULL) { // Can't find such chain
+            dap_chain_node_cli_set_reply_text(str_reply,
+                    "token_create requires parameter 'chain_emission' to be valid chain name in chain net %s",
+                    l_net_str);
             return -45;
         }
     }
@@ -2066,9 +2097,11 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     if(!l_chain_base_tx_str) {
         dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'chain_base_tx'");
         return -46;
-    }else {
-        if ( ( l_chain_base_tx  = dap_chain_net_get_chain_by_name(l_net, l_chain_base_tx_str ) ) == NULL ){ // Can't find such chain
-            dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'chain_emission' to be valid chain name in chain net %s",l_net_str);
+    } else {
+        if((l_chain_base_tx = dap_chain_net_get_chain_by_name(l_net, l_chain_base_tx_str)) == NULL) { // Can't find such chain
+            dap_chain_node_cli_set_reply_text(str_reply,
+                    "token_create requires parameter 'chain_emission' to be valid chain name in chain net %s",
+                    l_net_str);
             return -47;
         }
     }
@@ -2077,7 +2110,6 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     char * l_gdb_group_mempool_emission = dap_chain_net_get_gdb_group_mempool(l_chain_emission);
     char * l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool(l_chain_base_tx);
 
-
     // Create emission datum
     dap_chain_datum_token_emission_t * l_token_emission;
     dap_chain_hash_fast_t l_token_emission_hash;
@@ -2148,12 +2180,12 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
     DAP_DELETE(l_tx);
 
-
     // Add to mempool tx token
     if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum_tx, l_datum_tx_size
             , l_gdb_group_mempool_base_tx)) {
-        dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp, l_key_str);
-        dap_chain_utxo_tx_add((dap_chain_datum_tx_t*) l_datum_tx->data);
+        dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp,
+                l_key_str);
+        dap_chain_ledger_tx_add(l_net->pub.ledger, (dap_chain_datum_tx_t*) l_datum_tx->data);
     }
     else {
         dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp,
@@ -2178,6 +2210,7 @@ int com_tx_cond_create(int argc, const char ** argv, char **str_reply)
     const char *c_wallets_path = dap_config_get_item_str(g_config, "general", "wallets_path");
     const char *c_wallet_name_from = "w_tesla"; // where to take coins for service
     const char *c_wallet_name_cond = "w_picnic"; // who will be use service, usually the same address (addr_from)
+    const char *c_net_name = "kelvin-testnet";
     uint64_t l_value = 50;
     //debug
     {
@@ -2199,7 +2232,9 @@ int com_tx_cond_create(int argc, const char ** argv, char **str_reply)
     dap_chain_net_srv_abstract_t l_cond;
 //    dap_chain_net_srv_abstract_set(&l_cond, SERV_CLASS_PERMANENT, SERV_ID_VPN, l_value, SERV_UNIT_MB,
 //            "test vpn service");
-    int res = dap_chain_mempool_tx_create_cond(l_key, l_key_cond, addr_from,
+    dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name((const char *) c_net_name);
+
+    int res = dap_chain_mempool_tx_create_cond(l_ledger, l_key, l_key_cond, addr_from,
             addr_cond,
             NULL, l_token_ticker, l_value, 0, (const void*) &l_cond, sizeof(dap_chain_net_srv_abstract_t));
 
@@ -2225,11 +2260,14 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
     const char *str_tmp = NULL;
     const char * l_from_wallet_name = NULL;
     const char * l_token_ticker = NULL;
+    const char * l_net_name = NULL;
+
     uint64_t value = 0;
     uint64_t value_fee = 0;
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "from_wallet_name", &l_from_wallet_name);
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "to_addr", &addr_base58_to);
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "token", &l_token_ticker);
+    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "net", &l_net_name);
 
     if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "fee", &addr_base58_fee)) {
         if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "value_fee", &str_tmp)) {
@@ -2256,6 +2294,18 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
         return -1;
     }
 
+    dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name((const char *) l_net_name);
+    if(!l_net_name) {
+        dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter 'net'");
+        return -1;
+    }
+    else {
+        if((l_ledger = dap_chain_ledger_by_net_name(l_net_name)) == NULL) {
+            dap_chain_node_cli_set_reply_text(str_reply, "not found net by name '%s'", l_net_name);
+            return -1;
+        }
+    }
+
     const char *c_wallets_path = dap_config_get_item_str(g_config, "general", "wallets_path");
     dap_chain_wallet_t * l_wallet = dap_chain_wallet_open(l_from_wallet_name, c_wallets_path);
 
@@ -2284,7 +2334,7 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
     //g_string_printf(string_ret, "from=%s\nto=%s\nval=%lld\nfee=%s\nval_fee=%lld\n\n",
     //        addr_base58_from, addr_base58_to, value, addr_base58_fee, value_fee);
 
-    int res = dap_chain_mempool_tx_create(dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to, addr_fee,
+    int res = dap_chain_mempool_tx_create(l_ledger, dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to, addr_fee,
             l_token_ticker, value, value_fee);
     dap_string_append_printf(string_ret, "transfer=%s\n",
             (res == 0) ? "Ok" : (res == -2) ? "False, not enough funds for transfer" : "False");
diff --git a/dap_chain_node_cli_cmd.h b/dap_chain_node_cli_cmd.h
index 98b77ac556cf053ef74c9fc6ab547995011e5ad9..999ac25f74aba9ff61decdaebfea58979512dce1 100644
--- a/dap_chain_node_cli_cmd.h
+++ b/dap_chain_node_cli_cmd.h
@@ -1,26 +1,27 @@
 /*
  * Authors:
  * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
+ * Alexander Lysikov <alexander.lysikov@demlabs.net>
  * DeM Labs Inc.   https://demlabs.net
  * Kelvin Project https://github.com/kelvinblockchain
- * Copyright  (c) 2017-2019
+ * Copyright  (c) 2019
  * All rights reserved.
 
  This file is part of DAP (Deus Applications Prototypes) the open source project
 
-    DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
+ DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
 
-    DAP is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+ DAP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
-*/
+ You should have received a copy of the GNU General Public License
+ along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
+ */
 
 #pragma once