diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5f27c0e7d0eea587e87e5b3b5959debdcd9eaeb7
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,30 @@
+project(dap_chain_wallet_python_module C)
+cmake_minimum_required(VERSION 2.8)
+
+set(CMAKE_VERBOSE_MAKEFILE ON)
+set(CMAKE_COLOR_MAKEFILE   ON)
+set(CMAKE_C_STANDARD 11)
+add_definitions("-fpic")
+add_definitions("-DDAP_LOG_MT")
+
+file(GLOB CHAIN_WALLET_PYTHON_SRCS src/*.c)
+file(GLOB CHAIN_WALLET_PYTHON_HEADERS include/*.h)
+
+set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5 3.4)
+find_package (PythonLibs REQUIRED)
+include_directories(${PYTHON_INCLUDE_DIR} include/)
+
+add_library(${PROJECT_NAME} STATIC ${CHAIN_WALLET_PYTHON_SRCS} ${CHAIN_WALLET_PYTHON_HEADERS})
+
+target_link_libraries(${PROJECT_NAME})
+
+target_link_libraries(${PROJECT_NAME} dap_core
+                        dap_crypto
+                        dap_crypto_python_module
+                        dap_chain dap_chain_crypto
+                        dap_chain_python_module
+                        dap_chain_net
+                        dap_chain_wallet )
+
+target_include_directories(${PROJECT_NAME} PUBLIC include/ )
+
diff --git a/include/dap_chain_wallet_python.h b/include/dap_chain_wallet_python.h
new file mode 100644
index 0000000000000000000000000000000000000000..52b033c9cd17a06e085d119c93061aeb1e216e2d
--- /dev/null
+++ b/include/dap_chain_wallet_python.h
@@ -0,0 +1,119 @@
+#ifndef _DAP_CHAIN_WALLET_PYTHON_
+#define _DAP_CHAIN_WALLET_PYTHON_
+
+#include <Python.h>
+#include "dap_common.h"
+#include "dap_chain_wallet.h"
+#include "wrapping_dap_chain_common.h"
+#include "libdap_crypto_key_python.h"
+#include "wrapping_dap_sign.h"
+#include "wrapping_dap_pkey.h"
+#include "wrapping_cert.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#undef LOG_TAG
+#define LOG_TAG "dap_chain_wallet_python"
+
+typedef struct PyDapChainWallet{
+    PyObject_HEAD
+    dap_chain_wallet_t *wallet;
+}PyDapChainWalletObject;
+
+int dap_chain_wallet_init_py(void);
+void dap_chain_wallet_deinit_py(void);
+
+PyObject *dap_chain_wallet_get_path_py(PyObject *self, PyObject *argv);
+
+PyObject *dap_chain_wallet_create_with_seed_py(PyObject *self, PyObject *argv);
+PyObject *dap_chain_wallet_create_py(PyTypeObject *type, PyObject *argv, PyObject *kwds);
+PyObject *dap_chain_wallet_open_file_py(PyObject *self, PyObject *argv);
+PyObject *dap_chain_wallet_open_py(PyObject *self, PyObject *argv);
+PyObject *dap_chain_wallet_save_py(PyObject *self, PyObject *argv);
+
+void dap_chain_wallet_close_py(PyDapChainWalletObject *self);
+
+PyObject *dap_cert_to_addr_py(PyObject *self, PyObject *argv);
+
+PyObject *dap_chain_wallet_get_addr_py(PyObject *self, PyObject *argv);
+PyObject *dap_chain_wallet_get_certs_number_py(PyObject *self, PyObject *argv);
+PyObject *dap_chain_wallet_get_pkey_py(PyObject *self, PyObject *argv);
+PyObject *dap_chain_wallet_get_key_py(PyObject *self, PyObject *argv);
+
+//PyObject *dap_chain_wallet_save_file_py(PyObject *self, PyObject *argv);
+
+static PyMethodDef ChainWalletMethods[] = {
+    {"getPath", (PyCFunction)dap_chain_wallet_get_path_py, METH_VARARGS | METH_STATIC, ""},
+    {"createWithSeed", (PyCFunction)dap_chain_wallet_create_with_seed_py, METH_VARARGS | METH_STATIC, ""},
+    {"openFile", (PyCFunction)dap_chain_wallet_open_file_py, METH_VARARGS | METH_STATIC, ""},
+    {"open", (PyCFunction)dap_chain_wallet_open_py, METH_VARARGS | METH_STATIC, ""},
+    {"save", (PyCFunction)dap_chain_wallet_save_py, METH_NOARGS, ""},
+    {"certToAddr", (PyCFunction)dap_cert_to_addr_py, METH_VARARGS | METH_STATIC, ""},
+    {"getAddr", (PyCFunction)dap_chain_wallet_get_addr_py, METH_VARARGS, ""},
+    {"getCertsNumber", (PyCFunction)dap_chain_wallet_get_certs_number_py, METH_NOARGS, ""},
+    {"getPKey", (PyCFunction)dap_chain_wallet_get_pkey_py, METH_VARARGS, ""},
+    {"getKey", (PyCFunction)dap_chain_wallet_get_key_py, METH_VARARGS, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainWallet_dapChainWalletType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "ChainWallet",             /* tp_name */
+    sizeof(PyDapChainWalletObject),         /* tp_basicsize */
+    0,                         /* tp_itemsize */
+    (destructor)dap_chain_wallet_close_py, /* tp_dealloc */
+    0,                         /* tp_print */
+    0,                         /* tp_getattr */
+    0,                         /* tp_setattr */
+    0,                         /* tp_reserved */
+    0,                         /* tp_repr */
+    0,                         /* tp_as_number */
+    0,                         /* tp_as_sequence */
+    0,                         /* tp_as_mapping */
+    0,                         /* tp_hash  */
+    0,                         /* tp_call */
+    0,                         /* tp_str */
+    0,                         /* tp_getattro */
+    0,                         /* tp_setattro */
+    0,                         /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,   /* tp_flags */
+    "Chain wallet object",           /* tp_doc */
+    0,		               /* tp_traverse */
+    0,		               /* tp_clear */
+    0,		               /* tp_richcompare */
+    0,		               /* tp_weaklistoffset */
+    0,		               /* tp_iter */
+    0,		               /* tp_iternext */
+    ChainWalletMethods,             /* tp_methods */
+    0,                         /* tp_members */
+    0,                         /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    0,                         /* tp_init */
+    0,                         /* tp_alloc */
+    dap_chain_wallet_create_py,/* tp_new */
+    0,                         /* tp_free */
+    0,                         /* tp_is_gc*/
+    0,                          /* tp_bases*/
+    0,                           /* tp_mro */
+    0,                           /* tp_cache */
+    0,                           /* tp_subclasses */
+    0,                           /* tp_weaklist */
+    0,                           /* tp_del */
+    0,                          /* tp_version_tag*/
+    0,                         /* tp_finalize*/
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // _DAP_CHAIN_WALLET_PYTHON_
diff --git a/src/dap_chain_wallet_python.c b/src/dap_chain_wallet_python.c
new file mode 100644
index 0000000000000000000000000000000000000000..df71af90e3f61d967522875adfc213398406d9e2
--- /dev/null
+++ b/src/dap_chain_wallet_python.c
@@ -0,0 +1,137 @@
+#include "dap_chain_wallet_python.h"
+
+int dap_chain_wallet_init_py(void){
+    return dap_chain_wallet_init();
+}
+void dap_chain_wallet_deinit_py(void){
+    dap_chain_wallet_deinit();
+}
+
+PyObject *dap_chain_wallet_get_path_py(PyObject *self, PyObject *argv){
+    (void)self;
+    (void)argv;
+    const char *path = dap_chain_wallet_get_path(g_config);
+    return Py_BuildValue("(s)", path);
+}
+
+PyObject *dap_chain_wallet_create_with_seed_py(PyObject *self, PyObject *argv){
+    (void)self;
+    const char *wallet_name;
+    const char *path_wallets;
+    PyObject *obj_sig_type;
+    PyObject *obj_seed;
+    if (!PyArg_ParseTuple(argv, "ssOO", &wallet_name, &path_wallets, &obj_sig_type, &obj_seed))
+        return NULL;
+    if (PyBytes_Check(obj_seed)){
+        PyErr_SetString(PyExc_TypeError, "Fourth argument to not have a Bytes object type");
+        return NULL;
+    }
+    void *seed = (void *)PyBytes_AsString(obj_seed);
+    size_t seed_size = PyBytes_Size(obj_seed);
+    PyObject *obj_wallet = _PyObject_New(&DapChainWallet_dapChainWalletType);
+    ((PyDapChainWalletObject*)obj_wallet)->wallet = dap_chain_wallet_create_with_seed(
+                wallet_name,
+                path_wallets,
+                *((PyDapSignTypeObject*)obj_sig_type)->sign_type,
+                seed,
+                seed_size);
+    return Py_BuildValue("(O)", obj_wallet);
+}
+PyObject *dap_chain_wallet_create_py(PyTypeObject *type, PyObject *argv, PyObject *kwds){
+    (void)kwds;
+    PyDapChainWalletObject *self;
+    const char *wallet_name;
+    const char *path_wallets;
+    PyObject *obj_sign_type;
+    if (!PyArg_ParseTuple(argv, "ssO", &wallet_name, &path_wallets, &obj_sign_type))
+        return NULL;
+    self = (PyDapChainWalletObject*)type->tp_alloc(type, 0);
+    if (self != NULL){
+        self->wallet = dap_chain_wallet_create(wallet_name, path_wallets, *((PyDapSignTypeObject*)obj_sign_type)->sign_type);
+        if (self->wallet == NULL){
+            Py_XDECREF(self);
+            return NULL;
+        }
+    }
+    return (PyObject*)self;
+}
+PyObject *dap_chain_wallet_open_file_py(PyObject *self, PyObject *argv){
+    (void)self;
+    const char *file_path;
+    if (!PyArg_ParseTuple(argv, "s", &file_path))
+        return NULL;
+    PyObject *obj_wallet = _PyObject_New(&DapChainWallet_dapChainWalletType);
+    ((PyDapChainWalletObject*)obj_wallet)->wallet = dap_chain_wallet_open_file(file_path);
+    return Py_BuildValue("(O)", obj_wallet);
+}
+PyObject *dap_chain_wallet_open_py(PyObject *self, PyObject *argv){
+    (void)self;
+    const char *wallet_name;
+    const char *wallet_path;
+    if (!PyArg_ParseTuple(argv, "ss", &wallet_name, &wallet_path))
+        return NULL;
+    PyObject *obj_wallet = _PyObject_New(&DapChainWallet_dapChainWalletType);
+    ((PyDapChainWalletObject*)obj_wallet)->wallet = dap_chain_wallet_open(wallet_name, wallet_path);
+    return Py_BuildValue("(O)", obj_wallet);
+}
+PyObject *dap_chain_wallet_save_py(PyObject *self, PyObject *argv){
+    (void)argv;
+    int result = dap_chain_wallet_save(((PyDapChainWalletObject*)self)->wallet);
+    return PyLong_FromLong(result);
+}
+
+void dap_chain_wallet_close_py(PyDapChainWalletObject *self){
+    dap_chain_wallet_close(self->wallet);
+    Py_TYPE(self)->tp_free((PyObject*)self);
+}
+
+PyObject *dap_cert_to_addr_py(PyObject *self, PyObject *argv){
+    (void)self;
+    PyObject *obj_cert;
+    PyObject *obj_net_id;
+    if (!PyArg_ParseTuple(argv, "OO", &obj_cert, &obj_net_id))
+        return NULL;
+    PyObject *obj_addr = _PyObject_New(&DapChainAddrObject_DapChainAddrObjectType);
+    ((PyDapChainAddrObject*)obj_addr)->addr = dap_cert_to_addr(
+                ((PyCryptoCertObject*)obj_cert)->cert,
+                ((PyDapChainNetIdObject*)obj_net_id)->net_id
+                );
+    return Py_BuildValue("(O)", obj_addr);
+}
+
+PyObject *dap_chain_wallet_get_addr_py(PyObject *self, PyObject *argv){
+    PyObject *obj_net_id;
+    if (!PyArg_ParseTuple(argv, "O", &obj_net_id))
+        return NULL;
+    PyObject *obj_addr = _PyObject_New(&DapChainAddrObject_DapChainAddrObjectType);
+    ((PyDapChainAddrObject*)obj_addr)->addr = dap_chain_wallet_get_addr(
+                ((PyDapChainWalletObject*)self)->wallet,
+                ((PyDapChainNetIdObject*)obj_net_id)->net_id
+                );
+    return Py_BuildValue("(O)", obj_addr);
+}
+PyObject *dap_chain_wallet_get_certs_number_py(PyObject *self, PyObject *argv){
+    (void)argv;
+    size_t result = dap_chain_wallet_get_certs_number(((PyDapChainWalletObject*)self)->wallet);
+    return PyLong_FromLong(result);
+}
+PyObject *dap_chain_wallet_get_pkey_py(PyObject *self, PyObject *argv){
+    uint32_t key_idx;
+    if (!PyArg_ParseTuple(argv, "I", &key_idx))
+            return NULL;
+    PyObject *obj_pkey = _PyObject_New(&DapPkeyObject_DapPkeyObjectType);
+    ((PyDapPkeyObject*)obj_pkey)->pkey = dap_chain_wallet_get_pkey(((PyDapChainWalletObject*)self)->wallet,
+                                                                   key_idx);
+    return Py_BuildValue("(O)", obj_pkey);
+}
+PyObject *dap_chain_wallet_get_key_py(PyObject *self, PyObject *argv){
+    uint32_t key_idx;
+    if (!PyArg_ParseTuple(argv, "I", &key_idx))
+            return NULL;
+    PyObject *obj_key = _PyObject_New(&PyCryptoKeyObject_PyCryptoKeyType);
+    ((PyCryptoKeyObject*)obj_key)->key = dap_chain_wallet_get_key(
+                ((PyDapChainWalletObject*)self)->wallet,
+                key_idx
+                );
+    return Py_BuildValue("(O)", obj_key);
+}