diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c
index 1aaf97dbe823a9d93af5dd8e6b9d3078dd4808a0..d2e0f1776a17aedceaa7d619f8239311b25c8e71 100755
--- a/dap_chain_node_cli.c
+++ b/dap_chain_node_cli.c
@@ -806,7 +806,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> -net <net_name>]\n");
+            "wallet [new -w <wallet_name> [-sign <sign_type>] [-restore <hex value>] [-net <net_name>] [-force]| 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",
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index a741c5dad9637fb11cd46bedc1fa414bb25380cc..45fe200d70fc92100c41f9d01b5d972dd1399a8d 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -1506,11 +1506,11 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
 
     dap_chain_node_addr_t address;
     memset(&address, 0, sizeof(dap_chain_node_addr_t));
-    const char *addr_str = NULL, *wallet_name = NULL, *l_net_name = NULL;
+    const char *l_addr_str = NULL, *l_wallet_name = NULL, *l_net_name = NULL, *l_sign_type_str = NULL, *l_restore_str = 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_chain_node_cli_find_option_val(argv, arg_index, argc, "-addr", &l_addr_str);
+    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-w", &l_wallet_name);
+    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_name);
 
     dap_chain_net_t * l_net = l_net_name ? dap_chain_net_by_name( l_net_name) : NULL;
 
@@ -1518,21 +1518,53 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
     switch (cmd_num) {
     // new wallet
     case CMD_WALLET_NEW: {
-        if(!wallet_name) {
-            dap_chain_node_cli_set_reply_text(str_reply,
-                    "wallet name option <-w>  not defined");
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-sign", &l_sign_type_str);
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-restore", &l_restore_str);
+        // rewrite existing wallet
+        int l_is_force = dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-force", NULL);
+
+        if(!l_wallet_name) {
+            dap_chain_node_cli_set_reply_text(str_reply, "wallet name option <-w>  not defined");
             return -1;
         }
-        dap_sign_type_t l_sign_type = { SIG_TYPE_BLISS };
+        // check wallet existence
+        if(!l_is_force) {
+            dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path);
+            if(l_wallet) {
+                dap_chain_node_cli_set_reply_text(str_reply, "wallet already exists");
+                dap_chain_wallet_close(l_wallet);
+                return -1;
+            }
+        }
+
+//        dap_sign_type_t l_sign_type = { SIG_TYPE_BLISS };
+        dap_sign_type_t l_sign_type = dap_sign_type_from_str(l_sign_type_str);
+        if(l_sign_type.type == SIG_TYPE_NULL){
+            l_sign_type.type = SIG_TYPE_BLISS;
+            l_sign_type_str = dap_sign_type_to_str(l_sign_type);
+        }
+        uint8_t *l_seed = NULL;
+        size_t l_seed_size = 0;
+        size_t l_restore_str_size = dap_strlen(l_restore_str);
+        if(l_restore_str && l_restore_str_size > 2 && !dap_strncmp(l_restore_str, "0x", 2)) {
+            l_seed_size = (l_restore_str_size - 2) / 2;
+            l_seed = DAP_NEW_SIZE(uint8_t, l_seed_size);
+            if(!dap_hex2bin(l_seed, l_restore_str + 2, l_restore_str_size - 2)){
+                DAP_DELETE(l_seed);
+                l_seed = NULL;
+                l_seed_size = 0;
+            }
+        }
         // Creates new wallet
-        dap_chain_wallet_t *l_wallet = dap_chain_wallet_create(wallet_name, c_wallets_path,  l_sign_type);
+        dap_chain_wallet_t *l_wallet = dap_chain_wallet_create_with_seed(l_wallet_name, c_wallets_path, l_sign_type,
+                l_seed, l_seed_size);
         dap_chain_addr_t *l_addr = l_net? dap_chain_wallet_get_addr(l_wallet,l_net->pub.id ) : NULL;
-        if(!l_wallet ) {
+        if(!l_wallet) {
             dap_chain_node_cli_set_reply_text(str_reply, "wallet is not created");
             return -1;
         }
         char *l_addr_str = l_addr? dap_chain_addr_to_str(l_addr) : NULL;
-        dap_string_append_printf(l_string_ret, "wallet '%s' successfully created\n", l_wallet->name);
+        dap_string_append_printf(l_string_ret, "wallet '%s' (type=%s) successfully created\n", l_wallet->name, l_sign_type_str);
         if ( l_addr_str )
             dap_string_append_printf(l_string_ret, "new address %s", l_addr_str);
         DAP_DELETE(l_addr_str);
@@ -1573,13 +1605,13 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
         dap_chain_wallet_t *l_wallet = NULL;
         dap_chain_addr_t *l_addr = NULL;
 
-        if(wallet_name) {
-            l_wallet = dap_chain_wallet_open(wallet_name, c_wallets_path);
+        if(l_wallet_name) {
+            l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path);
             if ( l_net )
                 l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet, l_net->pub.id );
         }
-        if(!l_addr && addr_str)
-            l_addr = dap_chain_addr_from_str(addr_str);
+        if(!l_addr && l_addr_str)
+            l_addr = dap_chain_addr_from_str(l_addr_str);
 
         dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name((const char *) l_net_name);
         if(!l_net_name) {