From d011c085ad678089fd6f021e1ab146d5154df17b Mon Sep 17 00:00:00 2001
From: "alexey.stratulat" <alexey.stratulat@demlabs.net>
Date: Thu, 23 Dec 2021 06:17:49 +0000
Subject: [PATCH] Multiple change. Added work with item transactions, as well
 as bug fixes.

---
 CMakeLists.txt                                |   2 +
 CellFrame/python-cellframe.c                  |  44 +++++-
 include/python-cellframe.h                    |  15 ++
 .../chain/include/libdap-chain-python.h       |  11 ++
 .../include/libdap_chain_atom_iter_python.h   |   8 +-
 .../include/wrapping_dap_chain_atom_ptr.h     |  64 ++++++++
 .../chain/include/wrapping_dap_chain_ledger.h |   1 +
 .../chain/src/libdap-chain-python.c           |  77 +++++++++
 .../chain/src/wrapping_dap_chain_ledger.c     |  50 ++++--
 modules/cellframe-sdk/common/CMakeLists.txt   |   6 +-
 .../include/wrapping_dap_chain_common.h       |  38 ++++-
 .../common/include/wrapping_dap_chain_datum.h |  41 ++++-
 .../include/wrapping_dap_chain_datum_token.h  |  25 +++
 .../include/wrapping_dap_chain_datum_tx.h     | 105 +++++++------
 .../common/include/wrapping_dap_chain_tx_in.h |  97 ++++++++++++
 .../include/wrapping_dap_chain_tx_in_cond.h   | 100 ++++++++++++
 .../include/wrapping_dap_chain_tx_out.h       |  98 ++++++++++++
 .../include/wrapping_dap_chain_tx_out_cond.h  | 148 ++++++++++++++++++
 ...ng_dap_chain_tx_out_cond_subtype_srv_pay.h |  93 +++++++++++
 ..._dap_chain_tx_out_cond_subtype_srv_stake.h |  91 +++++++++++
 ...ap_chain_tx_out_cond_subtype_srv_xchange.h |  94 +++++++++++
 .../include/wrapping_dap_chain_tx_out_ext.h   | 101 ++++++++++++
 .../include/wrapping_dap_chain_tx_pkey.h      | 103 ++++++++++++
 .../include/wrapping_dap_chain_tx_receipt.h   | 112 +++++++++++++
 .../include/wrapping_dap_chain_tx_sig.h       | 101 ++++++++++++
 .../include/wrapping_dap_chain_tx_token.h     |  42 ++++-
 .../include/wrapping_dap_chain_tx_token_ext.h | 104 ++++++++++++
 .../common/src/wrapping_dap_chain_common.c    |  17 ++
 .../common/src/wrapping_dap_chain_datum.c     |  28 ++++
 .../common/src/wrapping_dap_chain_datum_tx.c  |  97 ++++++++++++
 .../common/src/wrapping_dap_chain_tx_in.c     |  14 ++
 .../src/wrapping_dap_chain_tx_in_cond.c       |  18 +++
 .../common/src/wrapping_dap_chain_tx_out.c    |  14 ++
 .../src/wrapping_dap_chain_tx_out_cond.c      |  29 ++++
 ...ng_dap_chain_tx_out_cond_subtype_srv_pay.c |  24 +++
 ..._dap_chain_tx_out_cond_subtype_srv_stake.c |  20 +++
 ...ap_chain_tx_out_cond_subtype_srv_xchange.c |  24 +++
 .../src/wrapping_dap_chain_tx_out_ext.c       |  17 ++
 .../common/src/wrapping_dap_chain_tx_pkey.c   |  23 +++
 .../src/wrapping_dap_chain_tx_receipt.c       |  57 +++++++
 .../common/src/wrapping_dap_chain_tx_sig.c    |  14 ++
 .../common/src/wrapping_dap_chain_tx_token.c  |  20 +++
 .../src/wrapping_dap_chain_tx_token_ext.c     |  35 +++++
 .../net/include/libdap_chain_net_python.h     |  29 ++++
 .../net/src/libdap_chain_net_python.c         |  39 ++++-
 .../crypto/include/wrapping_dap_hash.h        |   4 +-
 .../crypto/include/wrapping_dap_pkey.h        |  63 ++++++--
 .../crypto/include/wrapping_dap_sign.h        |  93 ++++++++++-
 .../dap-sdk/crypto/src/wrapping_dap_hash.c    |  20 ++-
 .../dap-sdk/crypto/src/wrapping_dap_pkey.c    |  25 +++
 .../dap-sdk/crypto/src/wrapping_dap_sign.c    |  24 +++
 .../net/server/json_rpc/CMakeLists.txt        |  49 ++++++
 .../include/wrapping_json_rpc_request.h       |  79 ++++++++++
 .../include/wrapping_json_rpc_response.h      |  67 ++++++++
 .../json_rpc/src/wrapping_json_rpc_request.c  |  92 +++++++++++
 .../json_rpc/src/wrapping_json_rpc_response.c |  96 ++++++++++++
 56 files changed, 2800 insertions(+), 102 deletions(-)
 create mode 100644 modules/cellframe-sdk/chain/include/wrapping_dap_chain_atom_ptr.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_in.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_in_cond.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_pay.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_stake.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_ext.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_pkey.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_receipt.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_sig.h
 create mode 100644 modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_token_ext.h
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_in.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_in_cond.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_pay.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_stake.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_ext.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_pkey.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_receipt.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_sig.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_token.c
 create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_token_ext.c
 create mode 100644 modules/dap-sdk/crypto/src/wrapping_dap_pkey.c
 create mode 100644 modules/dap-sdk/crypto/src/wrapping_dap_sign.c
 create mode 100644 modules/dap-sdk/net/server/json_rpc/CMakeLists.txt
 create mode 100644 modules/dap-sdk/net/server/json_rpc/include/wrapping_json_rpc_request.h
 create mode 100644 modules/dap-sdk/net/server/json_rpc/include/wrapping_json_rpc_response.h
 create mode 100644 modules/dap-sdk/net/server/json_rpc/src/wrapping_json_rpc_request.c
 create mode 100644 modules/dap-sdk/net/server/json_rpc/src/wrapping_json_rpc_response.c

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0016c9b4..8b4634c8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -37,6 +37,7 @@ add_subdirectory(modules/dap-sdk/net/core)
 add_subdirectory(modules/dap-sdk/net/client)
 add_subdirectory(modules/dap-sdk/net/server/enc)
 add_subdirectory(modules/dap-sdk/net/server/http)
+add_subdirectory(modules/dap-sdk/net/server/json_rpc)
 add_subdirectory(modules/cellframe-sdk/common)
 add_subdirectory(modules/cellframe-sdk/net)
 add_subdirectory(modules/cellframe-sdk/gdb)
@@ -180,6 +181,7 @@ target_link_libraries(${PROJECT_NAME} cellframe-sdk dap_python_module
                       dap_chain_gdb_python_module
                       dap_app_cli_python_module
                       dap_chain_wallet_python_module
+                      dap_server_json_rpc_python_module
                       ${PYTHON_LIBRARIES}
                      )
 
diff --git a/CellFrame/python-cellframe.c b/CellFrame/python-cellframe.c
index 8c64ec7f..af45ad84 100644
--- a/CellFrame/python-cellframe.c
+++ b/CellFrame/python-cellframe.c
@@ -368,17 +368,20 @@ PyObject *python_cellframe_init(PyObject *self, PyObject *args){
 PyMODINIT_FUNC PyInit_libCellFrame(void){
 
     if (    PyType_Ready( &DapCoreObjectType ) < 0 ||
-            PyType_Ready( &g_crypto_type_py ) < 0  ||
-            PyType_Ready( &g_crypto_cert_type_py ) < 0  ||
+            PyType_Ready( &g_crypto_type_py ) < 0 ||
+            PyType_Ready( &g_crypto_cert_type_py ) < 0 ||
             PyType_Ready( &ServerCore_ServerCoreType ) < 0 ||
             PyType_Ready( &dapEvents_dapEventsType ) < 0 ||
             PyType_Ready( &dapEventsSocket_dapEventsSocketType ) < 0 ||
             PyType_Ready( &CryptoKeyTypeObjecy_CryptoKeyTypeObjecyType ) < 0 ||
             PyType_Ready( &CryptoDataTypeObjecy_CryptoDataTypeObjecyType ) < 0 ||
+            PyType_Ready(&DapSignObject_DapSignObjectType) < 0 ||
+            PyType_Ready(&DapSignTypeObject_DapSignTypeObjectType) < 0 ||
             // === Chain ===
             PyType_Ready( &dapChainObject_dapChainType ) < 0 ||
             PyType_Ready( &dapChainTypeObject_dapChainTypeType ) < 0 ||
-            PyType_Ready( &dapChainAtomPtr_dapChainAtomPtrType ) < 0 ||
+            PyType_Ready( &DapChainAtomIter_DapChainAtomIterType ) < 0 ||
+            PyType_Ready(&DapChainAtomPtr_DapChainAtomPtrType) < 0 ||
             PyType_Ready( &DapChainCell_DapChainCellObjectType ) < 0 ||
 //            PyType_Ready(&ChainCommonObject_ChainCommonType) < 0 ||
 
@@ -395,12 +398,22 @@ PyMODINIT_FUNC PyInit_libCellFrame(void){
             PyType_Ready( &DapChainDatumObject_DapChainDatumObjectType) < 0 ||
             PyType_Ready(&DapChainDatumIterObject_DapChainDatumIterObjectType) < 0 ||
             PyType_Ready(&DapChainDatumToken_DapChainDatumTokenObjectType) < 0 ||
+            PyType_Ready(&DapChainTxTokenExt_DapChainTxTokenExtType) < 0 ||
             PyType_Ready(&DapChainDatumTokenEmission_DapChainDatumTokenEmissionObjectType) < 0 ||
             PyType_Ready(&DapChainTxItemObject_DapChainTxItemTypeObjectType) < 0 ||
             PyType_Ready(&DapChainTxCondType_DapChainTxCondTypeObject) < 0 ||
             PyType_Ready(&DapChainDatumTx_DapChainDatumTxObjectType) < 0 ||
-            PyType_Ready(&DapChainTxOutCond_DapChainTxOutCondObjectType) < 0 ||
+            PyType_Ready(&DapChainTxOutCond_DapChainTxOutCondType) < 0 ||
+            PyType_Ready(&DapChainTxOutCondSubTypeSrvPay_DapChainTxOutCondSubTypeSrvPayObject) < 0 ||
+            PyType_Ready(&DapChainTxOutCondSubTypeSrvStake_DapChainTxOutCondSubTypeSrvStakeObject) < 0 ||
+            PyType_Ready(&DapChainTxOutCondSubTypeSrvXchange_DapChainTxOutCondSubTypeSrvXchangeObject) < 0 ||
             PyType_Ready(&DapChainLedger_DapChainLedgerType) < 0 ||
+            PyType_Ready(&DapChainTxInObject_DapChainTxInTypeObjectType) < 0 ||
+            PyType_Ready(&DapChainTxInCondObject_DapChainTxInCondTypeObjectType) < 0 ||
+            PyType_Ready(&DapChainTxOutObject_DapChainTxOutTypeObjectType) < 0 ||
+            PyType_Ready(&DapChainTxPkeyObject_DapChainTxPkeyTypeObjectType) < 0 ||
+            PyType_Ready(&DapChainTxReceiptObject_DapChainTxReceiptTypeObjectType) < 0 ||
+            PyType_Ready(&DapChainTxOutExtObject_DapChainTxOutExtTypeObjectType) < 0 ||
             // =============
             // === Chain net ===
             PyType_Ready(&DapChainNetObject_DapChainNetObjectType) < 0 ||
@@ -422,6 +435,8 @@ PyMODINIT_FUNC PyInit_libCellFrame(void){
             PyType_Ready(&DapAppCli_dapAppCliType ) < 0 ||
             PyType_Ready(&DapChainWallet_dapChainWalletType) < 0 ||
             PyType_Ready(&HTTPCode_HTTPCodeType) < 0 ||
+            PyType_Ready(&DapJSONRPCRequest_DapJSONRPCRequestType) < 0 ||
+            PyType_Ready(&DapJSONRPCResponse_DapJSONRPCResponseType) < 0 ||
             #ifdef DAP_SUPPORT_PYTHON_PLUGINS
                 PyType_Ready(&DapHTTPSimple_DapHTTPSimpleType) < 0 ||
                 PyType_Ready(&dapAppContext_dapAppContextType) < 0
@@ -453,6 +468,8 @@ PyMODINIT_FUNC PyInit_libCellFrame(void){
 
     PyModule_AddObject(module, "Crypto", (PyObject*)&g_crypto_type_py);
     PyModule_AddObject(module, "Cert", (PyObject*)&g_crypto_cert_type_py);
+    PyModule_AddObject(module, "SignType", (PyObject*)&DapSignTypeObject_DapSignTypeObjectType);
+    PyModule_AddObject(module, "Sign", (PyObject*)&DapSignObject_DapSignObjectType);
 
     PyModule_AddObject(module, "ServerCore", (PyObject*)&ServerCore_ServerCoreType);
     PyModule_AddObject(module, "Events", (PyObject*)&dapEvents_dapEventsType);
@@ -464,7 +481,8 @@ PyMODINIT_FUNC PyInit_libCellFrame(void){
     // === Chain ===
     PyModule_AddObject(module, "Chain", (PyObject*)&dapChainObject_dapChainType);
     PyModule_AddObject(module, "ChainType", (PyObject*)&dapChainTypeObject_dapChainTypeType);
-    PyModule_AddObject(module, "ChainAtomIter", (PyObject*)&dapChainAtomPtr_dapChainAtomPtrType);
+    PyModule_AddObject(module, "ChainAtomIter", (PyObject*)&DapChainAtomIter_DapChainAtomIterType);
+    PyModule_AddObject(module, "ChainAtomPtr", (PyObject*)&DapChainAtomPtr_DapChainAtomPtrType);
     PyModule_AddObject(module, "ChainCell", (PyObject*)&DapChainCell_DapChainCellObjectType);
 //    PyModule_AddObject(module, "ChainCommon", (PyObject*)&ChainCommonObject_ChainCommonType);
 
@@ -482,15 +500,25 @@ PyMODINIT_FUNC PyInit_libCellFrame(void){
     PyModule_AddObject(module, "ChainDatum", (PyObject*)&DapChainDatumObject_DapChainDatumObjectType);
     PyModule_AddObject(module, "ChainDatumIter", (PyObject*)&DapChainDatumIterObject_DapChainDatumIterObjectType);
     PyModule_AddObject(module, "ChainDatumToken", (PyObject*)&DapChainDatumToken_DapChainDatumTokenObjectType);
+    PyModule_AddObject(module, "ChainDatumTokenExt", (PyObject*)&DapChainTxTokenExt_DapChainTxTokenExtType);
     PyModule_AddObject(module, "ChainDatumTokenEmisson", (PyObject*)&DapChainDatumTokenEmission_DapChainDatumTokenEmissionObjectType);
     PyModule_AddObject(module, "ChainTxItemType", (PyObject*)&DapChainTxItemObject_DapChainTxItemTypeObjectType);
     PyModule_AddObject(module, "ChainTxCondType", (PyObject*)&DapChainTxCondType_DapChainTxCondTypeObject);
     PyModule_AddObject(module, "ChainDatumTx", (PyObject*)&DapChainDatumTx_DapChainDatumTxObjectType);
-    PyModule_AddObject(module, "ChainTxOutCond", (PyObject*)&DapChainTxOutCond_DapChainTxOutCondObjectType);
+    PyModule_AddObject(module, "ChainTxOutCond", (PyObject*)&DapChainTxOutCond_DapChainTxOutCondType);
+    PyModule_AddObject(module, "ChainTxOutCondSubtypeSrvPay", (PyObject*)&DapChainTxOutCondSubTypeSrvPay_DapChainTxOutCondSubTypeSrvPayObject);
+    PyModule_AddObject(module, "ChainTxOutCondSubtypeSrvStake", (PyObject*)&DapChainTxOutCondSubTypeSrvStake_DapChainTxOutCondSubTypeSrvStakeObject);
+    PyModule_AddObject(module, "ChainTxOutCondSubtypeSrvXchange", (PyObject*)&DapChainTxOutCondSubTypeSrvXchange_DapChainTxOutCondSubTypeSrvXchangeObject);
     PyModule_AddObject(module, "ChainLedger", (PyObject*)&DapChainLedger_DapChainLedgerType);
+    PyModule_AddObject(module, "ChainTxIn", (PyObject*)&DapChainTxInObject_DapChainTxInTypeObjectType);
+    PyModule_AddObject(module, "ChainTxInCond", (PyObject*)&DapChainTxInCondObject_DapChainTxInCondTypeObjectType);
+    PyModule_AddObject(module, "ChainTxOut", (PyObject*)&DapChainTxOutObject_DapChainTxOutTypeObjectType);
+    PyModule_AddObject(module, "ChainTxPkey", (PyObject*)&DapChainTxPkeyObject_DapChainTxPkeyTypeObjectType);
+    PyModule_AddObject(module, "ChainTxReceipt", (PyObject*)&DapChainTxReceiptObject_DapChainTxReceiptTypeObjectType);
+    PyModule_AddObject(module, "ChainTxOutExt", (PyObject*)&DapChainTxOutExtObject_DapChainTxOutExtTypeObjectType);
     // =============
     // === Chain net ===
-//    PyModule_AddObject(module, "ChainNet", (PyObject*)&DapChainNetObject_DapChainNetObjectType);
+    PyModule_AddObject(module, "ChainNet", (PyObject*)&DapChainNetObject_DapChainNetObjectType);
     PyModule_AddObject(module, "ChainNodeClient", (PyObject*)&DapChainNodeClientObject_DapChainNodeClientObjectType);
     PyModule_AddObject(module, "ChainNodeInfo", (PyObject*)&DapChainNodeInfoObject_DapChainNodeInfoObjectType);
     PyModule_AddObject(module, "ChainNetNode", (PyObject*)&DapChainNetNodeObject_DapChainNetNodeObjectType);
@@ -514,6 +542,8 @@ PyMODINIT_FUNC PyInit_libCellFrame(void){
     #ifdef DAP_SUPPORT_PYTHON_PLUGINS
         PyModule_AddObject(module, "AppContext", (PyObject*)&dapAppContext_dapAppContextType);
     #endif
+    PyModule_AddObject(module, "JSONRPCRequest", (PyObject*)&DapJSONRPCRequest_DapJSONRPCRequestType);
+    PyModule_AddObject(module, "JSONRPCResponse", (PyObject*)&DapJSONRPCResponse_DapJSONRPCResponseType);
 
     return module;
 }
diff --git a/include/python-cellframe.h b/include/python-cellframe.h
index bcc68924..499c15b4 100644
--- a/include/python-cellframe.h
+++ b/include/python-cellframe.h
@@ -5,6 +5,7 @@
 #include "libdap-server-core-python.h"
 #include "libdap_crypto_key_type_python.h"
 #include "libdap_crypto_data_type.h"
+#include "wrapping_dap_sign.h"
 // === CHAIN ==
 #include "libdap-chain-python.h"
 #include "libdap_chain_type_python.h"
@@ -14,9 +15,20 @@
 #include "wrapping_dap_chain_cs.h"
 #include "wrapping_dap_chain_datum.h"
 #include "wrapping_dap_chain_datum_token.h"
+#include "wrapping_dap_chain_tx_token_ext.h"
 #include "wrapping_dap_chain_datum_tx.h"
 #include "wrapping_dap_chain_ledger.h"
 #include "wrapping_dap_chain_datum_tx.h"
+#include "wrapping_dap_chain_tx_in.h"
+#include "wrapping_dap_chain_tx_in_cond.h"
+#include "wrapping_dap_chain_tx_out.h"
+#include "wrapping_dap_chain_tx_out_cond.h"
+#include "wrapping_dap_chain_tx_out_cond_subtype_srv_pay.h"
+#include "wrapping_dap_chain_tx_out_cond_subtype_srv_stake.h"
+#include "wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.h"
+#include "wrapping_dap_chain_tx_pkey.h"
+#include "wrapping_dap_chain_tx_receipt.h"
+#include "wrapping_dap_chain_tx_out_ext.h"
 // ============
 // === Chain net ===
 #include "libdap_chain_net_python.h"
@@ -38,6 +50,7 @@
 //#include "dap_http_client_simple.h"
 //#include "dap_chain_wallet.h"
 #include "dap_chain_cs.h"
+#include "wrapping_dap_chain_atom_ptr.h"
 //#include "dap_chain_cs_dag.h"
 //#include "dap_chain_cs_dag_poa.h"
 //#include "dap_chain_cs_dag_pos.h"
@@ -61,6 +74,8 @@
 
 #include "dap_common.h"
 #include "dap_server.h"
+#include "wrapping_json_rpc_request.h"
+#include "wrapping_json_rpc_response.h"
 #ifdef _WIN32
 #include "Windows.h"
 
diff --git a/modules/cellframe-sdk/chain/include/libdap-chain-python.h b/modules/cellframe-sdk/chain/include/libdap-chain-python.h
index 3dee0e47..407be7df 100644
--- a/modules/cellframe-sdk/chain/include/libdap-chain-python.h
+++ b/modules/cellframe-sdk/chain/include/libdap-chain-python.h
@@ -8,6 +8,9 @@
 #include "dap_chain_node_client.h"
 #include "wrapping_dap_chain_ledger.h"
 #include "wrapping_dap_chain_common.h"
+#include "libdap_chain_atom_iter_python.h"
+#include "wrapping_dap_chain_atom_ptr.h"
+#include "wrapping_dap_chain_datum.h"
 
 
 typedef struct PyDapChain{
@@ -31,6 +34,10 @@ PyObject *dap_chain_load_from_cfg_py(PyObject *self, PyObject *args);
 //PyObject *dap_chain_init_net_cfg_name_py(PyObject *self, PyObject *args); //dap_chain_init_net_cfg_name
 //PyObject *dap_chain_close_py(PyObject *self, PyObject *args);
 //PyObject *dap_chain_info_dump_log_py(PyObject *self, PyObject *args); //dap_chain_info_dump_log
+PyObject *dap_chain_python_create_atom_iter(PyObject *self, PyObject *args);
+PyObject *dap_chain_python_atom_iter_get_first(PyObject *self, PyObject *args);
+PyObject *dap_chain_python_atom_get_datums(PyObject *self, PyObject *args);
+PyObject *dap_chain_python_atom_iter_get_next(PyObject *self, PyObject *args);
 
 static PyMethodDef DapChainMethods[] = {
     {"findById", (PyCFunction)dap_chain_find_by_id_py, METH_VARARGS|METH_STATIC, ""},
@@ -38,6 +45,10 @@ static PyMethodDef DapChainMethods[] = {
     {"hasFileStore", (PyCFunction)dap_chain_has_file_store_py, METH_NOARGS, ""},
     {"saveAll", (PyCFunction)dap_chain_save_all, METH_NOARGS, ""},
     {"loadAll", (PyCFunction)dap_chain_load_all_py, METH_NOARGS, ""},
+    {"createAtomItem", (PyCFunction) dap_chain_python_create_atom_iter, METH_NOARGS, ""},
+    {"atomIterGetFirst", (PyCFunction) dap_chain_python_atom_iter_get_first, METH_VARARGS, ""},
+    {"atomGetDatums", (PyCFunction) dap_chain_python_atom_get_datums, METH_VARARGS, ""},
+    {"atomIterGetNext", (PyCFunction)dap_chain_python_atom_iter_get_next, METH_VARARGS, ""},
     //{"close", (PyCFunction)dap_chain_close_py, METH_NOARGS, ""},
     {NULL, NULL, 0, NULL}
 };
diff --git a/modules/cellframe-sdk/chain/include/libdap_chain_atom_iter_python.h b/modules/cellframe-sdk/chain/include/libdap_chain_atom_iter_python.h
index 9e9b22a7..27171414 100644
--- a/modules/cellframe-sdk/chain/include/libdap_chain_atom_iter_python.h
+++ b/modules/cellframe-sdk/chain/include/libdap_chain_atom_iter_python.h
@@ -7,7 +7,7 @@
 extern "C" {
 #endif
 
-typedef struct PyChainAtomPtr{
+typedef struct PyChainAtomIter{
     PyObject_HEAD
     dap_chain_atom_iter_t *atom_iter;
 } PyChainAtomIterObject;
@@ -16,7 +16,7 @@ static PyMethodDef DapChainAtomIterMethods[] = {
     {NULL, NULL, 0, NULL}
 };
 
-static PyTypeObject dapChainAtomPtr_dapChainAtomPtrType = {
+static PyTypeObject DapChainAtomIter_DapChainAtomIterType = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "CellFrame.Chain.AtomIter",     /* tp_name */
     sizeof(PyChainAtomIterObject),       /* tp_basicsize */
@@ -59,6 +59,10 @@ static PyTypeObject dapChainAtomPtr_dapChainAtomPtrType = {
 
 };
 
+static bool PyDapChainAtomIter_Check(PyObject *obj){
+    return PyObject_TypeCheck(obj, &DapChainAtomIter_DapChainAtomIterType);
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/modules/cellframe-sdk/chain/include/wrapping_dap_chain_atom_ptr.h b/modules/cellframe-sdk/chain/include/wrapping_dap_chain_atom_ptr.h
new file mode 100644
index 00000000..6789b403
--- /dev/null
+++ b/modules/cellframe-sdk/chain/include/wrapping_dap_chain_atom_ptr.h
@@ -0,0 +1,64 @@
+#pragma once
+
+#include <Python.h>
+#include "dap_chain.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct PyChainAtomPtr{
+    PyObject_HEAD
+    dap_chain_atom_ptr_t ptr;
+}PyChainAtomPtrObject;
+
+static PyMethodDef DapChainAtomPtrMethods[] = {
+        {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainAtomPtr_DapChainAtomPtrType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.Chain.AtomPtr",     /* tp_name */
+        sizeof(PyChainAtomPtrObject),       /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        0,                                  /* 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 atom ptr objects",           /* tp_doc */
+        0,		                            /* tp_traverse */
+        0,		                            /* tp_clear */
+        0,		                            /* tp_richcompare */
+        0,		                            /* tp_weaklistoffset */
+        0,		                            /* tp_iter */
+        0,		                            /* tp_iternext */
+        DapChainAtomPtrMethods,             /* 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 */
+        PyType_GenericNew,                  /* tp_new */
+
+};
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/cellframe-sdk/chain/include/wrapping_dap_chain_ledger.h b/modules/cellframe-sdk/chain/include/wrapping_dap_chain_ledger.h
index 160ea180..51a47d75 100644
--- a/modules/cellframe-sdk/chain/include/wrapping_dap_chain_ledger.h
+++ b/modules/cellframe-sdk/chain/include/wrapping_dap_chain_ledger.h
@@ -8,6 +8,7 @@
 #include "wrapping_dap_chain_datum_token.h"
 #include "wrapping_dap_hash.h"
 #include "libdap-python.h"
+#include "wrapping_dap_chain_tx_out_cond.h"
 
 
 #ifdef __cplusplus
diff --git a/modules/cellframe-sdk/chain/src/libdap-chain-python.c b/modules/cellframe-sdk/chain/src/libdap-chain-python.c
index 397740e9..1b3961e3 100644
--- a/modules/cellframe-sdk/chain/src/libdap-chain-python.c
+++ b/modules/cellframe-sdk/chain/src/libdap-chain-python.c
@@ -77,3 +77,80 @@ void PyDapChainObject_dealloc(PyDapChainObject* chain){
     dap_chain_delete(chain->chain_t);
     Py_TYPE(chain)->tp_free((PyObject*)chain);
 }
+
+PyObject *dap_chain_python_create_atom_iter(PyObject *self, PyObject *args){
+    (void)args;
+    PyObject *obj_atom_iter = _PyObject_New(&DapChainAtomIter_DapChainAtomIterType);
+    PyObject_Init(obj_atom_iter, &DapChainAtomIter_DapChainAtomIterType);
+    PyObject_Dir(obj_atom_iter);
+    ((PyChainAtomIterObject*)obj_atom_iter)->atom_iter =
+            ((PyDapChainObject*)self)->chain_t->callback_atom_iter_create(((PyDapChainObject*)self)->chain_t);
+    return obj_atom_iter;
+}
+
+PyObject *dap_chain_python_atom_iter_get_first(PyObject *self, PyObject *args){
+    PyObject *obj_iter;
+    if (!PyArg_ParseTuple(args, "O", &obj_iter)){
+        PyErr_SetString(PyExc_AttributeError, "This function must take one argument.");
+        return NULL;
+    }
+    if (!PyDapChainAtomIter_Check(obj_iter)){
+        PyErr_SetString(PyExc_ValueError, "The type of the first argument is not valid. The first argument accepted by this function must be of type ChainAtomIter.");
+        return NULL;
+    }
+    PyObject *obj_atom_ptr = _PyObject_New(&DapChainAtomPtr_DapChainAtomPtrType);
+    obj_atom_ptr = PyObject_Init(obj_atom_ptr, &DapChainAtomPtr_DapChainAtomPtrType);
+    PyObject_Dir(obj_atom_ptr);
+    size_t l_atom_size = 0;
+    ((PyChainAtomPtrObject*)obj_atom_ptr)->ptr = ((PyDapChainObject*)self)->chain_t->callback_atom_iter_get_first(
+            ((PyChainAtomIterObject*)obj_iter)->atom_iter, &l_atom_size
+            );
+    if (((PyChainAtomPtrObject*)obj_atom_ptr)->ptr == NULL){
+        return Py_None;
+    }
+    return Py_BuildValue("On", obj_atom_ptr, l_atom_size);
+}
+
+PyObject *dap_chain_python_atom_get_datums(PyObject *self, PyObject *args){
+    PyObject *obj_atom = NULL;
+    size_t atom_size = 0;
+    if(!PyArg_ParseTuple(args, "On", &obj_atom, &atom_size)){
+        PyErr_SetString(PyExc_AttributeError, "The given function was passed incorrect arguments, it must accept an atom and its size.");
+        return NULL;
+    }
+    size_t datums_count = 0;
+    dap_chain_datum_t **l_datums = ((PyDapChainObject*)self)->chain_t->callback_atom_get_datums(((PyChainAtomPtrObject*)obj_atom)->ptr, atom_size, &datums_count);
+    PyObject *list_datums = PyList_New(datums_count);
+    for (int i=0; i < datums_count; i++){
+        PyObject *obj_datum = _PyObject_New(&DapChainDatumObject_DapChainDatumObjectType);
+        obj_datum = PyObject_Init(obj_datum, &DapChainDatumObject_DapChainDatumObjectType);
+        PyObject_Dir(obj_datum);
+        ((PyDapChainDatumObject*)obj_datum)->datum = l_datums[i];
+        PyList_SetItem(list_datums, i, obj_datum);
+    }
+    return list_datums;
+}
+
+PyObject *dap_chain_python_atom_iter_get_next(PyObject *self, PyObject *args){
+    //
+    size_t atom_size = 0;
+    PyObject *atom_iter = NULL;
+    if(!PyArg_ParseTuple(args, "O", &atom_iter)){
+        PyErr_SetString(PyExc_AttributeError, "This function must take only one argument.");
+        return NULL;
+    }
+    if (!PyDapChainAtomIter_Check(atom_iter)){
+        PyErr_SetString(PyExc_AttributeError, "The first argument to this function must be of type ChainAtomIter.");
+        return NULL;
+    }
+    PyObject *obj_atom_ptr = _PyObject_New(&DapChainAtomPtr_DapChainAtomPtrType);
+    obj_atom_ptr = PyObject_Init(obj_atom_ptr, &DapChainAtomPtr_DapChainAtomPtrType);
+    PyObject_Dir(obj_atom_ptr);
+    ((PyChainAtomPtrObject*)obj_atom_ptr)->ptr = ((PyDapChainObject*)self)->chain_t->callback_atom_iter_get_next(
+            ((PyChainAtomIterObject*)atom_iter)->atom_iter,
+            &atom_size);
+    if (((PyChainAtomPtrObject*)obj_atom_ptr)->ptr == NULL){
+        return Py_BuildValue("On", Py_None, 0);
+    }
+    return Py_BuildValue("On", obj_atom_ptr, atom_size);
+}
diff --git a/modules/cellframe-sdk/chain/src/wrapping_dap_chain_ledger.c b/modules/cellframe-sdk/chain/src/wrapping_dap_chain_ledger.c
index 372ed760..8f84a056 100644
--- a/modules/cellframe-sdk/chain/src/wrapping_dap_chain_ledger.c
+++ b/modules/cellframe-sdk/chain/src/wrapping_dap_chain_ledger.c
@@ -90,14 +90,19 @@ PyObject *dap_chain_ledger_addr_get_token_ticker_all_py(PyObject *self, PyObject
 }
 PyObject *dap_chain_ledger_addr_get_token_ticker_all_fast_py(PyObject *self, PyObject *args){
     PyObject *obj_addr;
-    PyObject *obj_tickers;
-    PyObject *obj_tickers_size;
-    if (!PyArg_ParseTuple(args, "O|O|O", &obj_addr, &obj_tickers, &obj_tickers_size))
+    if (!PyArg_ParseTuple(args, "O", &obj_addr)) {
+        PyErr_SetString(PyExc_AttributeError, "This function must take an object of type ChainAddr as its first argument. ");
         return NULL;
-    char ***tickers = ListStringToArrayStringFormatChar(obj_tickers);
-    size_t *tickers_size = ListIntToSizeT(obj_tickers_size);
-    dap_chain_ledger_addr_get_token_ticker_all_fast(((PyDapChainLedgerObject*)self)->ledger, ((PyDapChainAddrObject*)obj_addr)->addr, tickers, tickers_size);
-    return PyLong_FromLong(0);
+    }
+    char **tickers = NULL;
+    size_t ticker_size = 0;
+    dap_chain_ledger_addr_get_token_ticker_all_fast(((PyDapChainLedgerObject*)self)->ledger, ((PyDapChainAddrObject*)obj_addr)->addr, &tickers, &ticker_size);
+    PyObject *obj_list = PyList_New(ticker_size);
+    for (int i=0; i < ticker_size;i++){
+        PyObject *str = PyUnicode_FromString(tickers[i]);
+        PyList_SetItem(obj_list, i, str);
+    }
+    return obj_list;
 }
 PyObject *dap_chain_ledger_tx_cache_check_py(PyObject *self, PyObject *args){
     PyObject *obj_datum_tx;
@@ -148,8 +153,16 @@ PyObject *dap_chain_ledger_tx_remove_py(PyObject *self, PyObject *args){
     return PyLong_FromLong(res);
 }
 PyObject *dap_chain_ledger_purge_py(PyObject *self, PyObject *args){
-    dap_chain_ledger_purge(((PyDapChainLedgerObject*)self)->ledger, false);
-    return PyLong_FromLong(0);
+    PyObject *obj_boolean = NULL;
+    if(!PyArg_ParseTuple(args, "O", &obj_boolean)){
+        return NULL;
+    }
+    if(!PyBool_Check(obj_boolean)){
+        return NULL;
+    }
+    bool preserve_db = obj_boolean == Py_True ? true : false;
+    dap_chain_ledger_purge(((PyDapChainLedgerObject*)self)->ledger, preserve_db);
+    return Py_None;
 }
 PyObject *dap_chain_ledger_count_py(PyObject *self, PyObject *args){
     long long  res = (long long)dap_chain_ledger_count(((PyDapChainLedgerObject*)self)->ledger);
@@ -178,11 +191,12 @@ PyObject *dap_chain_ledger_calc_balance_py(PyObject *self, PyObject *args){
     const char *token_ticker;
     if (!PyArg_ParseTuple(args, "O|s", &addr, &token_ticker))
         return NULL;
-    uint64_t res = dap_chain_uint128_to(
-                        dap_chain_ledger_calc_balance(
-                            ((PyDapChainLedgerObject*)self)->ledger,
-                            ((PyDapChainAddrObject*)addr)->addr, token_ticker));
-    return Py_BuildValue("k", res);
+    uint128_t  balance = dap_chain_ledger_calc_balance(
+            ((PyDapChainLedgerObject*)self)->ledger,
+            ((PyDapChainAddrObject*)addr)->addr, token_ticker);
+    uint64_t res = dap_chain_uint128_to(balance);
+    char* coins = dap_chain_balance_to_coins(res);
+    return Py_BuildValue("sk", coins, res);
 }
 PyObject *dap_chain_ledger_calc_balance_full_py(PyObject *self, PyObject *args){
     PyObject *addr;
@@ -200,7 +214,13 @@ PyObject *dap_chain_ledger_tx_find_by_hash_py(PyObject *self, PyObject *args){
     if (!PyArg_ParseTuple(args, "O", &h_fast))
         return NULL;
     PyObject *res = _PyObject_New(&DapChainDatumTx_DapChainDatumTxObjectType);
+    res = PyObject_Init(res, &DapChainDatumTx_DapChainDatumTxObjectType);
+    PyObject_Dir(res);
     ((PyDapChainDatumTxObject*)res)->datum_tx = dap_chain_ledger_tx_find_by_hash(((PyDapChainLedgerObject*)self)->ledger, ((PyDapHashFastObject*)h_fast)->hash_fast);
+    if (((PyDapChainDatumTxObject*)res)->datum_tx == NULL) {
+        PyObject_DEL(res);
+        return Py_None;
+    }
     return Py_BuildValue("O", res);
 }
 PyObject *dap_chain_ledger_tx_find_by_addr_py(PyObject *self, PyObject *args){
@@ -248,7 +268,7 @@ PyObject *dap_chain_ledger_tx_cache_get_out_cond_value_py(PyObject *self, PyObje
     uint64_t res = dap_chain_ledger_tx_cache_get_out_cond_value(((PyDapChainLedgerObject*)self)->ledger,
                                                                 ((PyDapChainAddrObject*)obj_addr)->addr,
                                                                 out_conds);
-    PyObject *obj_out_conds = _PyObject_New(&DapChainTxOutCond_DapChainTxOutCondObjectType);
+    PyObject *obj_out_conds = _PyObject_New(&DapChainTxOutCond_DapChainTxOutCondType);
     ((PyDapChainTxOutCondObject*)obj_out_conds)->out_cond = *out_conds;
     PyObject *obj_res = PyLong_FromUnsignedLongLong(res);
     return Py_BuildValue("OO", obj_res, obj_out_conds);
diff --git a/modules/cellframe-sdk/common/CMakeLists.txt b/modules/cellframe-sdk/common/CMakeLists.txt
index 8279dab9..fab7b4be 100644
--- a/modules/cellframe-sdk/common/CMakeLists.txt
+++ b/modules/cellframe-sdk/common/CMakeLists.txt
@@ -208,7 +208,11 @@ add_library(${PROJECT_NAME} STATIC ${CHAIN_COMMON_PYTHON_SRCS} ${CHAIN_COMMON_PY
 
 target_link_libraries(${PROJECT_NAME})
 
-target_link_libraries(${PROJECT_NAME} dap_chain_common dap_core dap_crypto dap_crypto_python_module)
+target_link_libraries(${PROJECT_NAME} dap_chain_common
+        dap_core
+        dap_crypto
+        dap_crypto_python_module
+        dap_chain_python_module)
 
 target_include_directories(${PROJECT_NAME} PUBLIC include/ )
 
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_common.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_common.h
index 16c37836..d70c37d3 100644
--- a/modules/cellframe-sdk/common/include/wrapping_dap_chain_common.h
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_common.h
@@ -1,8 +1,35 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
 #ifndef _WRAPPING_DAP_CHAIN_COMMON_
 #define _WRAPPING_DAP_CHAIN_COMMON_
 #include <Python.h>
 #include "dap_chain_common.h"
 #include "libdap_crypto_key_python.h"
+#include "wrapping_dap_chain_ledger.h"
+//#include "wrapping_dap_chain_ledger"
 
 #ifdef __cplusplus
 extern "C" {
@@ -77,11 +104,16 @@ PyObject *dap_chain_addr_from_str_py(PyObject *self, PyObject *args);
 PyObject *dap_chain_addr_fill_py(PyObject *self, PyObject *args);
 PyObject *dap_chain_addr_check_sum_py(PyObject *self, PyObject *args);
 
+PyObject *dap_chain_addr_get_net_id_py(PyObject *self, PyObject *args);
+
+PyObject *obj_addr_str(PyObject *self);
+
 static PyMethodDef DapChainAddrMethods[] = {
     {"toStr", (PyCFunction)dap_chain_addr_to_str_py, METH_VARARGS, ""},
     {"fromStr", (PyCFunction)dap_chain_addr_from_str_py, METH_VARARGS | METH_STATIC, ""},
     {"fill", (PyCFunction)dap_chain_addr_fill_py, METH_VARARGS, ""},
     {"checkSum", (PyCFunction)dap_chain_addr_check_sum_py, METH_VARARGS, ""},
+    {"getNetId", (PyCFunction)dap_chain_addr_get_net_id_py, METH_NOARGS, ""},
     {NULL, NULL, 0, NULL}
 };
 
@@ -101,7 +133,7 @@ static PyTypeObject DapChainAddrObject_DapChainAddrObjectType = {
     0,                               /* tp_as_mapping */
     0,                               /* tp_hash  */
     0,                               /* tp_call */
-    0,                               /* tp_str */
+    obj_addr_str,                               /* tp_str */
     0,                               /* tp_getattro */
     0,                               /* tp_setattro */
     0,                               /* tp_as_buffer */
@@ -301,6 +333,8 @@ typedef struct PyDapChainID{
     dap_chain_id_t *chain_id;
 }PyDapChainIDObject;
 
+PyObject *DapChainIdObject_str(PyObject *self);
+
 static PyTypeObject DapChainIDObject_DapChainIDType = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "CellFrame.ChainID"  ,       /* tp_name */
@@ -317,7 +351,7 @@ static PyTypeObject DapChainIDObject_DapChainIDType = {
     0,                               /* tp_as_mapping */
     0,                               /* tp_hash  */
     0,                               /* tp_call */
-    0,                               /* tp_str */
+    DapChainIdObject_str,                               /* tp_str */
     0,                               /* tp_getattro */
     0,                               /* tp_setattro */
     0,                               /* tp_as_buffer */
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum.h
index 2b4cc890..148bbed1 100644
--- a/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum.h
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum.h
@@ -1,7 +1,34 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
 #ifndef _WRAPPING_DAP_CHAIN_DATUM_
 #define _WRAPPING_DAP_CHAIN_DATUM_
 #include "Python.h"
 #include "dap_chain_datum.h"
+#include "datetime.h"
+#include "wrapping_dap_chain_datum_tx.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -64,12 +91,22 @@ typedef struct PyDapChainDatum{
 //void PyDapChainDatumObject_dealloc(PyDapChainDatumObject* object);
 PyObject *PyDapChainDatumObject_new(PyTypeObject *type_object, PyObject *args, PyObject *kwds);
 PyObject *dap_chain_datum_size_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_datum_get_ts_created(PyObject *self, void* closure);
+PyObject *dap_chain_datum_is_type_tx(PyObject *self, PyObject *args);
+PyObject *wrapping_dap_chain_datum_get_datum_tx(PyObject *self, PyObject *args);
 
 static PyMethodDef DapChainDatumMethods[] = {
     {"size", dap_chain_datum_size_py, METH_VARARGS, ""},
+    {"isDatumTX", dap_chain_datum_is_type_tx, METH_NOARGS, ""},
+    {"getDatumTX", wrapping_dap_chain_datum_get_datum_tx, METH_NOARGS, ""},
     {NULL, NULL, 0, NULL}
 };
 
+static PyGetSetDef  DapChainDatumGetSet[] = {
+        {"tsCreated", (getter)dap_chain_datum_get_ts_created, NULL, NULL, NULL},
+        {NULL}
+};
+
 static PyTypeObject DapChainDatumObject_DapChainDatumObjectType = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "CellFrame.Chain.Datum",          /* tp_name */
@@ -99,9 +136,9 @@ static PyTypeObject DapChainDatumObject_DapChainDatumObjectType = {
     0,                               /* tp_weaklistoffset */
     0,		                         /* tp_iter */
     0,		                         /* tp_iternext */
-    0,                               /* tp_methods */
+    DapChainDatumMethods,                               /* tp_methods */
     0,                               /* tp_members */
-    0,                               /* tp_getset */
+    DapChainDatumGetSet,                               /* tp_getset */
     0,                               /* tp_base */
     0,                               /* tp_dict */
     0,                               /* tp_descr_get */
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_token.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_token.h
index 727f8eae..1da688e3 100644
--- a/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_token.h
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_token.h
@@ -1,3 +1,28 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
 #ifndef _WRAPPING_DAP_CHAIN_DATUM_TOKEN_
 #define _WRAPPING_DAP_CHAIN_DATUM_TOKEN_
 
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_tx.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_tx.h
index 4991798e..875b712f 100644
--- a/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_tx.h
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_tx.h
@@ -1,12 +1,52 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
 #ifndef _WRAPPING_DAP_CHAIN_DATUM_TX_
 #define _WRAPPING_DAP_CHAIN_DATUM_TX_
 
 #include "Python.h"
+#include "datetime.h"
 #include "wrapping_dap_chain_common.h"
 #include "libdap_crypto_key_python.h"
 #include "dap_chain_datum_tx_out_cond.h"
 #include "wrapping_dap_hash.h"
 #include "dap_chain_datum_tx_items.h"
+#include "wrapping_dap_hash.h"
+#include "wrapping_dap_chain_tx_in.h"
+#include "wrapping_dap_chain_tx_in_cond.h"
+#include "wrapping_dap_chain_tx_out.h"
+#include "wrapping_dap_chain_tx_out_cond.h"
+#include "wrapping_dap_chain_tx_out_cond_subtype_srv_pay.h"
+#include "wrapping_dap_chain_tx_out_cond_subtype_srv_stake.h"
+#include "wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.h"
+#include "wrapping_dap_chain_tx_out_ext.h"
+#include "wrapping_dap_chain_tx_pkey.h"
+#include "wrapping_dap_chain_tx_sig.h"
+#include "wrapping_dap_chain_tx_receipt.h"
+#include "wrapping_dap_chain_tx_token.h"
+#include "wrapping_dap_chain_tx_token_ext.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -159,6 +199,17 @@ PyObject *dap_chain_datum_tx_add_out_cond_item_py(PyObject *self, PyObject *args
 PyObject *dap_chain_datum_tx_add_sign_item_py(PyObject *self, PyObject *args);
 PyObject *dap_chain_datum_tx_verify_sign_py(PyObject *self, PyObject *args);
 
+PyObject *wrapping_dap_chain_datum_tx_get_items(PyObject *self, PyObject *args);
+
+PyObject *wrapping_dap_chain_datum_tx_get_hash(PyObject *self, void* closure);
+PyObject *wrapping_dap_chain_datum_tx_get_tsCreated(PyObject *self, void* closure);
+
+static PyGetSetDef PyDaoChainDatumTxObjectGetsSets[] = {
+        {"hash", (getter) wrapping_dap_chain_datum_tx_get_hash, NULL, NULL, NULL},
+        {"dateCreated", (getter) wrapping_dap_chain_datum_tx_get_tsCreated, NULL, NULL, NULL},
+        {NULL}
+};
+
 static PyMethodDef PyDapChainDatumTxObjectMethods[] ={
     {"getSize", (PyCFunction)dap_chain_datum_tx_get_size_py, METH_VARARGS, ""},
     {"addItem", (PyCFunction)dap_chain_datum_tx_add_item_py, METH_VARARGS, ""},
@@ -168,6 +219,7 @@ static PyMethodDef PyDapChainDatumTxObjectMethods[] ={
     {"addOutCond", (PyCFunction)dap_chain_datum_tx_add_out_cond_item_py, METH_VARARGS, ""},
     {"addSignItem", (PyCFunction)dap_chain_datum_tx_add_sign_item_py, METH_VARARGS, ""},
     {"verifySign", (PyCFunction)dap_chain_datum_tx_verify_sign_py, METH_VARARGS, ""},
+    {"getItems", (PyCFunction)wrapping_dap_chain_datum_tx_get_items, METH_NOARGS, ""},
     {NULL, NULL, 0, NULL}
 };
 
@@ -176,7 +228,7 @@ static PyTypeObject DapChainDatumTx_DapChainDatumTxObjectType = {
     "CellFrame.Chain.DatumTx",                      /* tp_name */
     sizeof(PyDapChainDatumTxObject),               /* tp_basicsize */
     0,                                             /* tp_itemsize */
-    (destructor)PyDapChainDatumTxObject_delete,    /* tp_dealloc */
+    0,//(destructor)PyDapChainDatumTxObject_delete,    /* tp_dealloc */
     0,                                              /* tp_print */
     0,                                              /* tp_getattr */
     0,                                              /* tp_setattr */
@@ -202,7 +254,7 @@ static PyTypeObject DapChainDatumTx_DapChainDatumTxObjectType = {
     0,		                                        /* tp_iternext */
     PyDapChainDatumTxObjectMethods,                 /* tp_methods */
     0,                                              /* tp_members */
-    0,                                              /* tp_getset */
+    PyDaoChainDatumTxObjectGetsSets,                /* tp_getset */
     0,                                              /* tp_base */
     0,                                              /* tp_dict */
     0,                                              /* tp_descr_get */
@@ -215,55 +267,6 @@ static PyTypeObject DapChainDatumTx_DapChainDatumTxObjectType = {
 
 /* -------------------------------------- */
 
-typedef struct PyDapChainTxOutCond{
-    PyObject_HEAD
-    dap_chain_tx_out_cond_t *out_cond;
-}PyDapChainTxOutCondObject;
-
-static PyTypeObject DapChainTxOutCond_DapChainTxOutCondObjectType = {
-    PyVarObject_HEAD_INIT(NULL, 0)
-    "CellFrame.Chain.TxOutCond",                      /* tp_name */
-    sizeof(PyDapChainTxOutCondObject),               /* tp_basicsize */
-    0,                                             /* tp_itemsize */
-    0,                                             /* 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 tx out cond object",                        /* tp_doc */
-    0,		                                        /* tp_traverse */
-    0,		                                        /* tp_clear */
-    0,		                                        /* tp_richcompare */
-    0,                                              /* tp_weaklistoffset */
-    0,		                                        /* tp_iter */
-    0,		                                        /* tp_iternext */
-    0,                                              /* 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 */
-    PyType_GenericNew,                              /* tp_new */
-};
-
-/* -------------------------------------- */
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_in.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_in.h
new file mode 100644
index 00000000..787680a8
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_in.h
@@ -0,0 +1,97 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#ifndef _WRAPPING_DAP_CHAIN_TX_IN_
+#define _WRAPPING_DAP_CHAIN_TX_IN_
+
+#include <Python.h>
+#include "dap_chain_datum_tx_in.h"
+#include "wrapping_dap_hash.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct PyDapChainTXIn{
+    PyObject_HEAD
+    dap_chain_tx_in_t *tx_in;
+}PyDapChainTXInObject;
+
+PyObject *wrapping_dap_chain_tx_in_get_prev_hash(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_in_get_out_prev_idx(PyObject *self, void *closure);
+
+static PyGetSetDef DapChainTxGetsSetsDef[] = {
+        {"prevHash", (getter)wrapping_dap_chain_tx_in_get_prev_hash, NULL, NULL, NULL},
+        {"prevIdx", (getter)wrapping_dap_chain_tx_in_get_out_prev_idx, NULL, NULL, NULL},
+        {NULL}
+};
+
+static PyTypeObject DapChainTxInObject_DapChainTxInTypeObjectType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxIn",        /* tp_name */
+        sizeof(PyDapChainTXInObject), /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        0,                                  /* 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 tx in object",        /* tp_doc */
+        0,		                            /* tp_traverse */
+        0,		                            /* tp_clear */
+        0,		                            /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+        0,		                            /* tp_iter */
+        0,		                            /* tp_iternext */
+        0,  /* tp_methods */
+        0,                                  /* tp_members */
+        DapChainTxGetsSetsDef,                                  /* 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 */
+        PyType_GenericNew,                  /* tp_new */
+};
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#endif //_WRAPPING_DAP_CHAIN_TX_IN_
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_in_cond.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_in_cond.h
new file mode 100644
index 00000000..d5933865
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_in_cond.h
@@ -0,0 +1,100 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#pragma once
+
+#include <Python.h>
+#include "dap_chain_datum_tx_in_cond.h"
+#include "wrapping_dap_hash.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct PyDapChainTXInCond{
+    PyObject_HEAD
+    dap_chain_tx_in_cond_t *tx_in_cond;
+}PyDapChainTXInCondObject;
+
+PyObject *wrapping_dap_chain_tx_in_cond_get_receipt_prev_idx(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_in_cond_get_prev_hash(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_in_cond_get_out_prev_idx(PyObject *self, void *closure);
+
+static PyGetSetDef DapChainTxInCondGetsSetsDef[] = {
+        {"receiptPrevIdx",(getter)wrapping_dap_chain_tx_in_cond_get_receipt_prev_idx, NULL, NULL, NULL},
+        {"prevHash", (getter)wrapping_dap_chain_tx_in_cond_get_prev_hash, NULL, NULL, NULL},
+        {"outPrevIdx", (getter)wrapping_dap_chain_tx_in_cond_get_out_prev_idx, NULL, NULL, NULL},
+        {NULL}
+};
+
+static PyMethodDef  DapChainTxInCondMethodsDef[] = {
+        {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainTxInCondObject_DapChainTxInCondTypeObjectType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxInCond",        /* tp_name */
+        sizeof(PyDapChainTXInCondObject), /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        0,                                  /* 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 tx in cond object",        /* tp_doc */
+        0,		                            /* tp_traverse */
+        0,		                            /* tp_clear */
+        0,		                            /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+        0,		                            /* tp_iter */
+        0,		                            /* tp_iternext */
+        DapChainTxInCondMethodsDef,  /* tp_methods */
+        0,                                  /* tp_members */
+        DapChainTxInCondGetsSetsDef,                                  /* 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 */
+        PyType_GenericNew,                  /* tp_new */
+};
+
+#ifdef __cplusplus
+extern "C"{
+#endif
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out.h
new file mode 100644
index 00000000..ff107e5f
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out.h
@@ -0,0 +1,98 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#pragma once
+
+#include <Python.h>
+#include "dap_chain_datum_tx_out.h"
+#include "wrapping_dap_chain_common.h"
+
+//#ifdef __cplusplus
+//extern "C"{
+//#endif
+
+typedef struct PyDapChainTXOut{
+    PyObject_HEAD
+    dap_chain_tx_out_t *tx_out;
+}PyDapChainTXOutObject;
+
+PyObject *wrapping_dap_chain_tx_out_get_addr(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_get_value(PyObject *self, void *closure);
+
+static PyGetSetDef DapChainTxOutGetsSetsDef[] = {
+        {"addr", (getter)wrapping_dap_chain_tx_out_get_addr, NULL, NULL, NULL},
+        {"value", (getter)wrapping_dap_chain_tx_out_get_value, NULL, NULL, NULL},
+        {NULL}
+};
+
+static PyMethodDef PyDapChainTxOutObjectMethods[] ={
+        {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainTxOutObject_DapChainTxOutTypeObjectType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxOut",        /* tp_name */
+        sizeof(PyDapChainTXOutObject), /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        0,                                  /* 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 tx out object",        /* tp_doc */
+        0,		                            /* tp_traverse */
+        0,		                            /* tp_clear */
+        0,		                            /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+        0,		                            /* tp_iter */
+        0,		                            /* tp_iternext */
+        PyDapChainTxOutObjectMethods,  /* tp_methods */
+        0,                                  /* tp_members */
+        DapChainTxOutGetsSetsDef,                                  /* 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 */
+        PyType_GenericNew,                  /* tp_new */
+};
+
+//#ifdef __cplusplus
+//extern "C"{
+//#endif
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond.h
new file mode 100644
index 00000000..7810e581
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond.h
@@ -0,0 +1,148 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#pragma once
+
+#include <Python.h>
+#include "dap_chain_datum_tx_out_cond.h"
+#include "datetime.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct PyDapChainTxOutCond{
+    PyObject_HEAD
+    dap_chain_tx_out_cond_t *out_cond;
+}PyDapChainTxOutCondObject;
+
+PyObject *wrapping_dap_chain_tx_out_cond_get_ts_expires(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_get_value(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_get_type_subtype(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_get_subtype(PyObject *self, void *closure);
+
+static PyGetSetDef PyDapChainTxOutCondGetsSetsDef[] = {
+        {"tsExpires", (getter)wrapping_dap_chain_tx_out_cond_get_ts_expires, NULL, NULL, NULL},
+        {"value", (getter)wrapping_dap_chain_tx_out_cond_get_value, NULL, NULL, NULL},
+        {"typeSubtype", (getter)wrapping_dap_chain_tx_out_cond_get_type_subtype, NULL, NULL, NULL},
+        {"subtype", (getter)wrapping_dap_chain_tx_out_cond_get_subtype, NULL, NULL, NULL},
+        {NULL}
+};
+
+static PyTypeObject DapChainTxOutCond_DapChainTxOutCondType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxOutCond",       /* tp_name */
+        sizeof(PyDapChainTxOutCondObject),      /* tp_basicsize */
+        0,                                       /* tp_itemsize */
+        0,                                       /* 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 tx out cond object",              /* tp_doc */
+        0,		                                 /* tp_traverse */
+        0,		                                 /* tp_clear */
+        0,		                                 /* tp_richcompare */
+        0,                                       /* tp_weaklistoffset */
+        0,		                                 /* tp_iter */
+        0,		                                 /* tp_iternext */
+        0,                                       /* tp_methods */
+        0,                                       /* tp_members */
+        PyDapChainTxOutCondGetsSetsDef,                                       /* 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 */
+        PyType_GenericNew,                       /* tp_new */
+};
+
+//============= DapChaTxOutCondSubtype
+typedef struct PyDapChainTxOutCondSubType{
+    PyObject_HEAD
+    dap_chain_tx_out_cond_subtype_t *out_cond_subtype;
+}PyDapChainTxOutCondSubTypeObject;
+
+PyObject *PyDapChainTxOutCondSubType_str(PyObject *self);
+
+static PyTypeObject DapChainTxOutCondSubType_DapChainTxOutCondSubTypeType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxOutCondSubType",       /* tp_name */
+        sizeof(PyDapChainTxOutCondSubTypeObject),      /* tp_basicsize */
+        0,                                       /* tp_itemsize */
+        0,                                       /* 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 */
+        PyDapChainTxOutCondSubType_str,          /* tp_str */
+        0,                                       /* tp_getattro */
+        0,                                       /* tp_setattro */
+        0,                                       /* tp_as_buffer */
+        Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,                 /* tp_flags */
+        "Chain tx out cond object",              /* tp_doc */
+        0,		                                 /* tp_traverse */
+        0,		                                 /* tp_clear */
+        0,		                                 /* tp_richcompare */
+        0,                                       /* tp_weaklistoffset */
+        0,		                                 /* tp_iter */
+        0,		                                 /* tp_iternext */
+        0,                                       /* 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 */
+        PyType_GenericNew,                       /* tp_new */
+};
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_pay.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_pay.h
new file mode 100644
index 00000000..c595ed07
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_pay.h
@@ -0,0 +1,93 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#pragma once
+
+#include <Python.h>
+#include "wrapping_dap_chain_tx_out_cond.h"
+#include "wrapping_dap_chain_common.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_unit(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_uid(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_pkey(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_map_price(PyObject *self, void *closure);
+
+    static PyGetSetDef DapChainTxOutCondSubtypeStvPayGetsSetsDef[]={
+        {"unit", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_unit,NULL,NULL,NULL},
+        {"uid", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_uid,NULL,NULL,NULL},
+        {"pkeyHash", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_pkey,NULL,NULL,NULL},
+        {"maxPrice", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_map_price,NULL,NULL,NULL},
+        {NULL}
+};
+
+static PyTypeObject DapChainTxOutCondSubTypeSrvPay_DapChainTxOutCondSubTypeSrvPayObject = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxOutCondSubTypeSrvPay",       /* tp_name */
+        sizeof(PyDapChainTxOutCondObject),/* tp_basicsize */
+        0,                               /* tp_itemsize */
+        0,                               /* 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_BASE_EXC_SUBCLASS,         /* tp_flags */
+        "Chain tx cond subtype srv pay object",             /* tp_doc */
+        0,                                 /* tp_traverse */
+        0,                                 /* tp_clear */
+        0,                                 /* tp_richcompare */
+        0,                               /* tp_weaklistoffset */
+        0,                                 /* tp_iter */
+        0,                                 /* tp_iternext */
+        0,       /* tp_methods */
+        0,                               /* tp_members */
+        DapChainTxOutCondSubtypeStvPayGetsSetsDef,                               /* tp_getset */
+        &DapChainTxOutCond_DapChainTxOutCondType,                               /* tp_base */
+        0,                               /* tp_dict */
+        0,                               /* tp_descr_get */
+        0,                               /* tp_descr_set */
+        0,                               /* tp_dictoffset */
+        0,                               /* tp_init */
+        0,                               /* tp_alloc */
+        PyType_GenericNew,               /* tp_new */
+};
+
+#ifdef __cplusplus
+};
+#endif
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_stake.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_stake.h
new file mode 100644
index 00000000..c479c463
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_stake.h
@@ -0,0 +1,91 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#pragma once
+
+#include <Python.h>
+#include "wrapping_dap_chain_tx_out_cond.h"
+#include "wrapping_dap_chain_common.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_stake_get_uid(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_stake_get_addr(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_stake_get_value(PyObject *self, void *closure);
+
+static PyGetSetDef DapChainTxOutCondSubtypeSrvStakeGetsSetsDef[]={
+        {"uid", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_stake_get_uid,NULL,NULL,NULL},
+        {"addr", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_stake_get_addr,NULL,NULL,NULL},
+        {"value", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_stake_get_value, NULL, NULL,NULL},
+        {NULL}
+};
+
+static PyTypeObject DapChainTxOutCondSubTypeSrvStake_DapChainTxOutCondSubTypeSrvStakeObject = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxOutCondSubTypeSrvStake",       /* tp_name */
+        sizeof(PyDapChainTxOutCondObject),/* tp_basicsize */
+        0,                               /* tp_itemsize */
+        0,                               /* 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_BASE_EXC_SUBCLASS,         /* tp_flags */
+        "Chain tx cond subtype srv stake object",             /* tp_doc */
+        0,                                 /* tp_traverse */
+        0,                                 /* tp_clear */
+        0,                                 /* tp_richcompare */
+        0,                               /* tp_weaklistoffset */
+        0,                                 /* tp_iter */
+        0,                                 /* tp_iternext */
+        0,       /* tp_methods */
+        0,                               /* tp_members */
+        DapChainTxOutCondSubtypeSrvStakeGetsSetsDef,                               /* tp_getset */
+        &DapChainTxOutCond_DapChainTxOutCondType,                               /* tp_base */
+        0,                               /* tp_dict */
+        0,                               /* tp_descr_get */
+        0,                               /* tp_descr_set */
+        0,                               /* tp_dictoffset */
+        0,                               /* tp_init */
+        0,                               /* tp_alloc */
+        PyType_GenericNew,               /* tp_new */
+};
+
+#ifdef __cplusplus
+};
+#endif
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.h
new file mode 100644
index 00000000..873d3b29
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.h
@@ -0,0 +1,94 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#pragma once
+
+#include <Python.h>
+#include "wrapping_dap_chain_tx_out_cond.h"
+#include "wrapping_dap_chain_common.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_uid(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_net_id(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_token(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_value(PyObject *self, void *closure);
+
+static PyGetSetDef DapChainTxOutCondSubtypeSrvXchangeGetsSetsDef[]={
+        {"uid", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_uid,NULL,NULL,NULL},
+        {"netId", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_net_id,NULL,NULL,NULL},
+        {"token", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_token,NULL,NULL,NULL},
+        {"value", (getter)wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_value,NULL,NULL,NULL},
+        {NULL}
+};
+
+static PyTypeObject DapChainTxOutCondSubTypeSrvXchange_DapChainTxOutCondSubTypeSrvXchangeObject = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxOutCondSubTypeSrvXchange",       /* tp_name */
+        sizeof(PyDapChainTxOutCondObject),/* tp_basicsize */
+        0,                               /* tp_itemsize */
+        0,                               /* 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_BASE_EXC_SUBCLASS,         /* tp_flags */
+        "Chain tx cond subtype srv xchange object",             /* tp_doc */
+        0,                                 /* tp_traverse */
+        0,                                 /* tp_clear */
+        0,                                 /* tp_richcompare */
+        0,                               /* tp_weaklistoffset */
+        0,                                 /* tp_iter */
+        0,                                 /* tp_iternext */
+        0,       /* tp_methods */
+        0,                               /* tp_members */
+        DapChainTxOutCondSubtypeSrvXchangeGetsSetsDef,                               /* tp_getset */
+        &DapChainTxOutCond_DapChainTxOutCondType,                               /* tp_base */
+        0,                               /* tp_dict */
+        0,                               /* tp_descr_get */
+        0,                               /* tp_descr_set */
+        0,                               /* tp_dictoffset */
+        0,                               /* tp_init */
+        0,                               /* tp_alloc */
+        PyType_GenericNew,               /* tp_new */
+};
+
+#ifdef __cplusplus
+};
+#endif
+
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_ext.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_ext.h
new file mode 100644
index 00000000..e8c84275
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_out_ext.h
@@ -0,0 +1,101 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#pragma once
+
+#include <Python.h>
+#include "wrapping_dap_chain_tx_out_ext.h"
+#include "wrapping_dap_chain_common.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct PyDapChainTXOutExt{
+    PyObject_HEAD
+    dap_chain_tx_out_ext_t *out_ext;
+}PyDapChainTXOutExtObject;
+
+PyObject *wrapping_dap_chain_tx_out_ext_get_addr(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_ext_get_token(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_out_ext_get_value(PyObject *self, void *closure);
+
+static PyGetSetDef DapChainTxOutExtGetsSetsDef[] = {
+        {"addr", (getter)wrapping_dap_chain_tx_out_ext_get_addr, NULL, NULL, NULL},
+        {"token", (getter)wrapping_dap_chain_tx_out_ext_get_token, NULL, NULL, NULL},
+        {"value", (getter)wrapping_dap_chain_tx_out_ext_get_value, NULL, NULL, NULL},
+        {NULL}
+};
+
+static PyMethodDef PyDapChainTxOutExtObjectMethods[] ={
+        {NULL, NULL, 0, NULL}
+};
+
+
+static PyTypeObject DapChainTxOutExtObject_DapChainTxOutExtTypeObjectType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxOutExt",        /* tp_name */
+        sizeof(PyDapChainTXOutExtObject), /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        0,                                  /* 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 tx out ext object",        /* tp_doc */
+        0,		                            /* tp_traverse */
+        0,		                            /* tp_clear */
+        0,		                            /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+        0,		                            /* tp_iter */
+        0,		                            /* tp_iternext */
+        PyDapChainTxOutExtObjectMethods,  /* tp_methods */
+        0,                                  /* tp_members */
+        DapChainTxOutExtGetsSetsDef,                                  /* 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 */
+        PyType_GenericNew,                  /* tp_new */
+};
+
+#ifdef __cplusplus
+extern "C"{
+#endif
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_pkey.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_pkey.h
new file mode 100644
index 00000000..e611e8c8
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_pkey.h
@@ -0,0 +1,103 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+#pragma once
+
+#include <Python.h>
+#include "dap_chain_datum_tx_pkey.h"
+#include "wrapping_dap_pkey.h"
+#include "wrapping_dap_sign.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct PyDapChainTXPkey{
+    PyObject_HEAD
+    dap_chain_tx_pkey_t *tx_pkey;
+}PyDapChainTXPkeyObject;
+
+PyObject *wrapping_dap_chain_tx_pkey_sig_type(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_pkey_sig_size(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_pkey_seq_no(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_pkey_get_pkey(PyObject *self, void *closure);
+
+
+static PyGetSetDef DapChainTxPkeyGetsSetsDef[] = {
+        {"sigType", (getter)wrapping_dap_chain_tx_pkey_sig_type, NULL, NULL, NULL},
+        {"sigSize", (getter)wrapping_dap_chain_tx_pkey_sig_size, NULL, NULL, NULL},
+        {"sequenceNumber", (getter)wrapping_dap_chain_tx_pkey_seq_no, NULL, NULL, NULL},
+        {"pkey", (getter)wrapping_dap_chain_tx_pkey_get_pkey, NULL, NULL, NULL},
+        {NULL}
+};
+
+static PyMethodDef PyDapChainTxPkeyObjectMethods[] ={
+        {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainTxPkeyObject_DapChainTxPkeyTypeObjectType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxPkey",        /* tp_name */
+        sizeof(PyDapChainTXPkeyObject), /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        0,                                  /* 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 tx pkey object",        /* tp_doc */
+        0,		                            /* tp_traverse */
+        0,		                            /* tp_clear */
+        0,		                            /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+        0,		                            /* tp_iter */
+        0,		                            /* tp_iternext */
+        PyDapChainTxPkeyObjectMethods,  /* tp_methods */
+        0,                                  /* tp_members */
+        DapChainTxPkeyGetsSetsDef,                                  /* 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 */
+        PyType_GenericNew,                  /* tp_new */
+};
+
+#ifdef __cplusplus
+extern "C"{
+#endif
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_receipt.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_receipt.h
new file mode 100644
index 00000000..1d868f1a
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_receipt.h
@@ -0,0 +1,112 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#ifndef _WRAPPING_DAP_CHAIN_TX_RECEIPT_
+#define _WRAPPING_DAP_CHAIN_TX_RECEIPT_
+
+#include <Python.h>
+#include "dap_chain_datum_tx_receipt.h"
+#include "wrapping_dap_sign.h"
+#include "dap_chain_common.h"
+#include "wrapping_dap_sign.h"
+#include "dap_sign.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct PyDapChainTXReceipt{
+    PyObject_HEAD
+    dap_chain_datum_tx_receipt_t *tx_receipt;
+}PyDapChainTXReceiptObject;
+
+PyObject *wrapping_dap_chain_tx_receipt_get_size(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_receipt_get_ext_size(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_receipt_get_units(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_receipt_get_uid(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_receipt_get_units_type(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_receipt_get_value(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_receipt_get_sig_provider(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_receipt_get_sig_client(PyObject *self, void *closure);
+
+static PyGetSetDef DapChainTxReceiptGetSetDefs[] = {
+        {"size", (getter)wrapping_dap_chain_tx_receipt_get_size, NULL, NULL, NULL},
+        {"extSize", (getter)wrapping_dap_chain_tx_receipt_get_ext_size, NULL, NULL, NULL},
+        {"units", (getter)wrapping_dap_chain_tx_receipt_get_units, NULL, NULL, NULL},
+        {"uid", (getter)wrapping_dap_chain_tx_receipt_get_uid, NULL, NULL, NULL},
+        {"unitsType", (getter)wrapping_dap_chain_tx_receipt_get_units_type, NULL, NULL, NULL},
+        {"value", (getter)wrapping_dap_chain_tx_receipt_get_value, NULL, NULL, NULL},
+        {"provider", (getter)wrapping_dap_chain_tx_receipt_get_sig_provider, NULL, NULL, NULL},
+        {"client", (getter)wrapping_dap_chain_tx_receipt_get_sig_client, NULL, NULL, NULL},
+        {NULL}
+};
+
+static PyTypeObject DapChainTxReceiptObject_DapChainTxReceiptTypeObjectType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxReceipt",        /* tp_name */
+        sizeof(PyDapChainTXReceiptObject), /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        0,                                  /* 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 tx item receipt object",        /* tp_doc */
+        0,		                            /* tp_traverse */
+        0,		                            /* tp_clear */
+        0,		                            /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+        0,		                            /* tp_iter */
+        0,		                            /* tp_iternext */
+        0,  /* tp_methods */
+        0,                                  /* tp_members */
+        DapChainTxReceiptGetSetDefs,                                  /* 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 */
+        PyType_GenericNew,                  /* tp_new */
+};
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#endif //_WRAPPING_DAP_CHAIN_TX_RECEIPT_
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_sig.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_sig.h
new file mode 100644
index 00000000..9b6b09ff
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_sig.h
@@ -0,0 +1,101 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#ifndef _WRAPPING_DAP_CHAIN_TX_SIG
+#define _WRAPPING_DAP_CHAIN_TX_SIG
+#endif
+
+#include <Python.h>
+#include "dap_chain_datum_tx_sig.h"
+#include "wrapping_dap_sign.h"
+#include "dap_sign.h"
+
+//#ifdef __cplusplus
+//extern "C"{
+//#endif
+
+typedef struct PyDapChainTXSig{
+    PyObject_HEAD
+    dap_chain_tx_sig_t *tx_sig;
+}PyDapChainTXSigObject;
+
+PyObject *wrapping_dap_chain_tx_sig_get_sign(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_sig_get_sig_size(PyObject *self, void *closure);
+
+static PyGetSetDef DapChainTxSigGetsSetsDef[] = {
+        {"sign", (getter)wrapping_dap_chain_tx_sig_get_sign, NULL, NULL, NULL},
+        {"sigSize", (getter)wrapping_dap_chain_tx_sig_get_sig_size, NULL, NULL, NULL},
+        {NULL}
+};
+
+static PyMethodDef PyDapChainTxSigObjectMethods[] ={
+        {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainTxSigObject_DapChainTxSigTypeObjectType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxSig",        /* tp_name */
+        sizeof(PyDapChainTXSigObject), /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        0,                                  /* 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 tx signature object",        /* tp_doc */
+        0,		                            /* tp_traverse */
+        0,		                            /* tp_clear */
+        0,		                            /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+        0,		                            /* tp_iter */
+        0,		                            /* tp_iternext */
+        PyDapChainTxSigObjectMethods,  /* tp_methods */
+        0,                                  /* tp_members */
+        DapChainTxSigGetsSetsDef,                                  /* 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 */
+        PyType_GenericNew,                  /* tp_new */
+};
+
+//#ifdef __cplusplus
+//}
+//#endif
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_token.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_token.h
index 1c80cdd3..c69361b3 100644
--- a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_token.h
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_token.h
@@ -1,7 +1,35 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
 #ifndef _WRAPPING_DAP_CHAIN_TX_TOKEN_
 #define _WRAPPING_DAP_CHAIN_TX_TOKEN_
 
 #include <Python.h>
+#include "dap_chain_datum_tx_token.h"
+#include "wrapping_dap_hash.h"
+#include "wrapping_dap_chain_common.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,8 +37,20 @@ extern "C" {
 
 typedef struct PyDapChainTxToken{
     PyObject_HEAD
+    dap_chain_tx_token_t *token;
 }PyDapChainTxTokenObject;
 
+PyObject *wrapping_dap_chain_tx_token_get_ticker(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_token_get_token_emission_hash(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_token_get_token_emission_chain_id(PyObject *self, void *closure);
+
+static PyGetSetDef PyDapChainTxTokenGetsSetsDef[] = {
+        {"ticker", (getter)wrapping_dap_chain_tx_token_get_ticker, NULL, NULL, NULL},
+        {"tokenEmissionHash", (getter)wrapping_dap_chain_tx_token_get_token_emission_hash, NULL, NULL, NULL},
+        {"tokenEmissionChainId", (getter)wrapping_dap_chain_tx_token_get_token_emission_chain_id, NULL, NULL, NULL},
+        {NULL}
+};
+
 static PyTypeObject DapChainTxToken_DapChainTxTokenType = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "CellFrame.ChainTxToken",       /* tp_name */
@@ -42,7 +82,7 @@ static PyTypeObject DapChainTxToken_DapChainTxTokenType = {
     0,		                                 /* tp_iternext */
     0,                                       /* tp_methods */
     0,                                       /* tp_members */
-    0,                                       /* tp_getset */
+    PyDapChainTxTokenGetsSetsDef,                                       /* tp_getset */
     0,                                       /* tp_base */
     0,                                       /* tp_dict */
     0,                                       /* tp_descr_get */
diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_token_ext.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_token_ext.h
new file mode 100644
index 00000000..58bdc7a5
--- /dev/null
+++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_tx_token_ext.h
@@ -0,0 +1,104 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
+#pragma once
+
+#include <Python.h>
+#include "dap_chain_datum_tx_token.h"
+#include "wrapping_dap_chain_common.h"
+#include "wrapping_dap_hash.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct PyDapChainTxTokenExt{
+    PyObject_HEAD
+    dap_chain_tx_token_ext_t *token_ext;
+}PyDapChainTxTokenExtObject;
+
+
+PyObject *wrapping_dap_chain_tx_token_ext_get_version(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_token_ext_get_ticker(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_token_get_chain_id(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_token_get_net_id(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_token_get_tx_hash(PyObject *self, void *closure);
+PyObject *wrapping_dap_chain_tx_token_get_tx_out_idx(PyObject *self, void *closure);
+
+static PyGetSetDef PyDapChainTxTokenExtGetsSetsDef[] = {
+        {"version", (getter)wrapping_dap_chain_tx_token_ext_get_version, NULL, NULL, NULL},
+        {"ticker", (getter)wrapping_dap_chain_tx_token_ext_get_ticker, NULL, NULL, NULL},
+        {"chainId", (getter)wrapping_dap_chain_tx_token_get_chain_id, NULL, NULL, NULL},
+        {"netId", (getter)wrapping_dap_chain_tx_token_get_net_id, NULL,NULL, NULL},
+        {"txHash", (getter)wrapping_dap_chain_tx_token_get_tx_hash, NULL, NULL, NULL},
+        {"txOutIdx", (getter)wrapping_dap_chain_tx_token_get_tx_out_idx, NULL, NULL, NULL},
+        {NULL}
+};
+
+static PyTypeObject DapChainTxTokenExt_DapChainTxTokenExtType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.ChainTxTokenExt",       /* tp_name */
+        sizeof(PyDapChainTxTokenExtObject),      /* tp_basicsize */
+        0,                                       /* tp_itemsize */
+        0,                                       /* 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 tx token ext object",              /* tp_doc */
+        0,		                                 /* tp_traverse */
+        0,		                                 /* tp_clear */
+        0,		                                 /* tp_richcompare */
+        0,                                       /* tp_weaklistoffset */
+        0,		                                 /* tp_iter */
+        0,		                                 /* tp_iternext */
+        0,                                       /* tp_methods */
+        0,                                       /* tp_members */
+        PyDapChainTxTokenExtGetsSetsDef,                                       /* 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 */
+        PyType_GenericNew,                       /* tp_new */
+};
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_common.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_common.c
index 15693de0..44c2d0f0 100644
--- a/modules/cellframe-sdk/common/src/wrapping_dap_chain_common.c
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_common.c
@@ -1,5 +1,9 @@
 #include "wrapping_dap_chain_common.h"
 
+PyObject *DapChainIdObject_str(PyObject *self){
+    return Py_BuildValue("s", dap_strdup_printf("0x%016"DAP_UINT64_FORMAT_x, ((PyDapChainIDObject*)self)->chain_id->uint64));
+}
+
 PyObject *dap_chain_hash_slow_to_str_py(PyObject *self, PyObject *args){
     PyObject *obj_hash_slow;
     char *str;
@@ -24,7 +28,9 @@ PyObject *dap_chain_addr_from_str_py(PyObject *self, PyObject *args){
     if (!PyArg_ParseTuple(args, "s", &str))
         return NULL;
     PyObject *obj = _PyObject_New(&DapChainAddrObject_DapChainAddrObjectType);
+    obj = PyObject_Init(obj, &DapChainAddrObject_DapChainAddrObjectType);
     ((PyDapChainAddrObject*)obj)->addr = dap_chain_addr_from_str(str);
+    PyObject_Dir(obj);
     return Py_BuildValue("O", obj);
 }
 
@@ -42,6 +48,17 @@ PyObject *dap_chain_addr_check_sum_py(PyObject *self, PyObject *args){
     return PyLong_FromLong(res);
 }
 
+PyObject *obj_addr_str(PyObject *self){
+    return Py_BuildValue("s", dap_chain_addr_to_str(((PyDapChainAddrObject*)self)->addr));
+}
+
+PyObject* dap_chain_addr_get_net_id_py(PyObject *self, PyObject *args){
+    (void)args;
+    PyObject *obj_net_id = _PyObject_New(&DapChainNetIdObject_DapChainNetIdObjectType);
+    ((PyDapChainNetIdObject*)obj_net_id)->net_id = ((PyDapChainAddrObject*)self)->addr->net_id;
+    return Py_BuildValue("O", obj_net_id);
+}
+
 PyObject *dap_chain_net_id_from_str_py(PyObject *self, PyObject *args){
     const char *str;
     if (!PyArg_ParseTuple(args, "s", &str))
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum.c
index a9ece238..260db6f3 100644
--- a/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum.c
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum.c
@@ -19,3 +19,31 @@ PyObject *dap_chain_datum_size_py(PyObject *self, PyObject *args){
     size_t size = dap_chain_datum_size(((PyDapChainDatumObject*)self)->datum);
     return PyLong_FromSize_t(size);
 }
+
+PyObject *dap_chain_datum_get_ts_created(PyObject *self, void* closure){
+    (void)closure;
+    return PyDateTime_FromTimestamp(((PyDapChainDatumObject*)self)->datum->header.ts_create);
+}
+
+PyObject *dap_chain_datum_is_type_tx(PyObject *self, PyObject *args){
+    (void)args;
+    if (((PyDapChainDatumObject*)self)->datum->header.type_id == DAP_CHAIN_DATUM_TX){
+        return Py_BuildValue("O", Py_True);
+    } else {
+        return Py_BuildValue("O", Py_False);
+    }
+}
+
+PyObject *wrapping_dap_chain_datum_get_datum_tx(PyObject *self, PyObject *args){
+    (void)args;
+    if(((PyDapChainDatumObject *)self)->datum->header.type_id == DAP_CHAIN_DATUM_TX){
+        PyObject *obj_datum_tx = _PyObject_New(&DapChainDatumTx_DapChainDatumTxObjectType);
+        obj_datum_tx = PyObject_Init(obj_datum_tx, &DapChainDatumTx_DapChainDatumTxObjectType);
+        PyObject_Dir(obj_datum_tx);
+        ((PyDapChainDatumTxObject*)obj_datum_tx)->datum_tx = ((PyDapChainDatumObject*)self)->datum->data;
+        return obj_datum_tx;
+    }else{
+        PyErr_SetString(PyExc_Exception, "Due to the type of this datum, it is not possible to get the transaction datum.");
+        return NULL;
+    }
+}
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum_tx.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum_tx.c
index 5241612d..292657e0 100644
--- a/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum_tx.c
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum_tx.c
@@ -134,4 +134,101 @@ PyObject *dap_chain_datum_tx_verify_sign_py(PyObject *self, PyObject *args){
     return PyLong_FromLong(res);
 }
 
+PyObject *wrapping_dap_chain_datum_tx_get_hash(PyObject *self, void* closure){
+    (void)closure;
+    dap_chain_hash_fast_t l_hash_datum;
+    PyObject *obj_hash_fast = _PyObject_New(&DapHashFastObject_DapHashFastObjectType);
+    obj_hash_fast = PyObject_Init(obj_hash_fast, &DapHashFastObject_DapHashFastObjectType);
+    PyObject_Dir(obj_hash_fast);
+    ((PyDapHashFastObject*)obj_hash_fast)->hash_fast = DAP_NEW(dap_chain_hash_fast_t);
+    dap_hash_fast(((PyDapChainDatumTxObject*)self)->datum_tx,
+                  dap_chain_datum_tx_get_size(((PyDapChainDatumTxObject*)self)->datum_tx),
+                  ((PyDapHashFastObject*)obj_hash_fast)->hash_fast);
+    return  obj_hash_fast;
+}
+PyObject *wrapping_dap_chain_datum_tx_get_tsCreated(PyObject *self, void* closure){
+    (void)closure;
+    PyObject *obj_ts_float = PyLong_FromLong(((PyDapChainDatumTxObject*)self)->datum_tx->header.ts_created);
+    PyObject *obj_ts = Py_BuildValue("(O)", obj_ts_float);
+    PyDateTime_IMPORT;
+    PyObject *obj_dt = PyDateTime_FromTimestamp(obj_ts);
+    return obj_dt;
+}
+
+PyObject *wrapping_dap_chain_datum_tx_get_items(PyObject *self, PyObject *args){
+    (void)args;
+    uint32_t l_tx_items_count = 0;
+    uint32_t l_tx_items_size = ((PyDapChainDatumTxObject*)self)->datum_tx->header.tx_items_size;
+    PyObject *obj_list = PyList_New(0);
+    while(l_tx_items_count < l_tx_items_size){
+        uint8_t *item = ((PyDapChainDatumTxObject*)self)->datum_tx->tx_items + l_tx_items_count;
+        size_t l_tx_item_size = dap_chain_datum_item_tx_get_size(item);
+        PyObject *obj_tx_item = NULL;
+        switch (dap_chain_datum_tx_item_get_type(item)) {
+            case TX_ITEM_TYPE_IN:
+                obj_tx_item = (PyObject*)PyObject_New(PyDapChainTXInObject, &DapChainTxInObject_DapChainTxInTypeObjectType);
+                ((PyDapChainTXInObject*)obj_tx_item)->tx_in = ((dap_chain_tx_in_t*)item);
+                break;
+            case TX_ITEM_TYPE_OUT:
+                obj_tx_item = (PyObject*)PyObject_New(PyDapChainTXOutObject, &DapChainTxOutObject_DapChainTxOutTypeObjectType);
+                ((PyDapChainTXOutObject*)obj_tx_item)->tx_out = ((dap_chain_tx_out_t*)item);
+                break;
+            case TX_ITEM_TYPE_TOKEN:
+                obj_tx_item = (PyObject*)PyObject_New(PyDapChainTxTokenObject, &DapChainTxToken_DapChainTxTokenType);
+                ((PyDapChainTxTokenObject*)obj_tx_item)->token = (dap_chain_tx_token_t*)item;
+                break;
+            case TX_ITEM_TYPE_TOKEN_EXT:
+                obj_tx_item = (PyObject*)PyObject_New(PyDapChainTxTokenExtObject, &DapChainTxTokenExt_DapChainTxTokenExtType);
+                ((PyDapChainTxTokenExtObject*)obj_tx_item)->token_ext = (dap_chain_tx_token_ext_t*)item;
+                break;
+            case TX_ITEM_TYPE_SIG:
+                obj_tx_item = (PyObject*)PyObject_New(PyDapChainTXSigObject, &DapChainTxSigObject_DapChainTxSigTypeObjectType);
+                ((PyDapChainTXSigObject*)obj_tx_item)->tx_sig = (dap_chain_tx_sig_t*)item;
+                break;
+            case TX_ITEM_TYPE_RECEIPT:
+                obj_tx_item = (PyObject*)PyObject_New(PyDapChainTXReceiptObject, &DapChainTxReceiptObject_DapChainTxReceiptTypeObjectType);
+                ((PyDapChainTXReceiptObject*)obj_tx_item)->tx_receipt = (dap_chain_datum_tx_receipt_t*)item;
+                break;
+            case TX_ITEM_TYPE_PKEY:
+                obj_tx_item = (PyObject*)PyObject_New(PyDapChainTXPkeyObject, &DapChainTxPkeyObject_DapChainTxPkeyTypeObjectType);
+                ((PyDapChainTXPkeyObject*)obj_tx_item)->tx_pkey = ((dap_chain_tx_pkey_t*)item);
+                break;
+            case TX_ITEM_TYPE_IN_COND:
+                obj_tx_item = (PyObject*)PyObject_New(PyDapChainTXInCondObject, &DapChainTxInCondObject_DapChainTxInCondTypeObjectType);
+                ((PyDapChainTXInCondObject*)obj_tx_item)->tx_in_cond = (dap_chain_tx_in_cond_t*)item;
+                break;
+            case TX_ITEM_TYPE_OUT_COND:
+                switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) {
+                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:
+                        obj_tx_item = (PyObject*)PyObject_New(PyDapChainTxOutCondObject, &DapChainTxOutCondSubTypeSrvPay_DapChainTxOutCondSubTypeSrvPayObject);
+                        ((PyDapChainTxOutCondObject*)obj_tx_item)->out_cond = ((dap_chain_tx_out_cond_t*)item);
+                        break;
+                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE:
+                        obj_tx_item = (PyObject*)PyObject_New(PyDapChainTxOutCondObject, &DapChainTxOutCondSubTypeSrvStake_DapChainTxOutCondSubTypeSrvStakeObject);
+                        ((PyDapChainTxOutCondObject*)obj_tx_item)->out_cond = ((dap_chain_tx_out_cond_t*)item);
+                        break;
+                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE:
+                        obj_tx_item = (PyObject*)PyObject_New(PyDapChainTxOutCondObject, &DapChainTxOutCondSubTypeSrvXchange_DapChainTxOutCondSubTypeSrvXchangeObject);
+                        ((PyDapChainTxOutCondObject*)obj_tx_item)->out_cond = ((dap_chain_tx_out_cond_t*)item);
+                        break;
+                    default:
+                        obj_tx_item = (PyObject*)PyObject_New(PyDapChainTxOutCondObject, &DapChainTxOutCond_DapChainTxOutCondType);
+                        ((PyDapChainTxOutCondObject*)obj_tx_item)->out_cond = ((dap_chain_tx_out_cond_t*)item);
+                }
+                break;
+            case TX_ITEM_TYPE_OUT_EXT:
+                obj_tx_item = (PyObject*)PyObject_New(PyDapChainTXOutExtObject, &DapChainTxOutExtObject_DapChainTxOutExtTypeObjectType);
+                ((PyDapChainTXOutExtObject*)obj_tx_item)->out_ext = (dap_chain_tx_out_ext_t*)item;
+                break;
+            default:
+                obj_tx_item = Py_None;
+                break;
+        }
+        PyObject_Dir(obj_tx_item);
+        PyList_Append(obj_list, obj_tx_item);
+        l_tx_items_count += l_tx_item_size;
+    }
+    return obj_list;
+}
+
 /* -------------------------------------- */
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_in.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_in.c
new file mode 100644
index 00000000..cf570791
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_in.c
@@ -0,0 +1,14 @@
+#include "wrapping_dap_chain_tx_in.h"
+
+PyObject *wrapping_dap_chain_tx_in_get_prev_hash(PyObject *self, void *closure){
+    (void)closure;
+    PyObject *obj_hash = _PyObject_New(&DapHashFastObject_DapHashFastObjectType);
+    obj_hash = PyObject_Init(obj_hash, &DapHashFastObject_DapHashFastObjectType);
+    PyObject_Dir(obj_hash);
+    ((PyDapHashFastObject*)obj_hash)->hash_fast = &((PyDapChainTXInObject*)self)->tx_in->header.tx_prev_hash;
+    return  obj_hash;
+}
+PyObject *wrapping_dap_chain_tx_in_get_out_prev_idx(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("I", ((PyDapChainTXInObject*)self)->tx_in->header.tx_out_prev_idx);
+}
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_in_cond.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_in_cond.c
new file mode 100644
index 00000000..01c5988f
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_in_cond.c
@@ -0,0 +1,18 @@
+#include "wrapping_dap_chain_tx_in_cond.h"
+
+PyObject *wrapping_dap_chain_tx_in_cond_get_receipt_prev_idx(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("I", ((PyDapChainTXInCondObject*)self)->tx_in_cond->header.receipt_idx);
+}
+PyObject *wrapping_dap_chain_tx_in_cond_get_prev_hash(PyObject *self, void *closure){
+    (void)closure;
+    PyObject *obj_hash = _PyObject_New(&DapHashFastObject_DapHashFastObjectType);
+    obj_hash = PyObject_Init(obj_hash, &DapHashFastObject_DapHashFastObjectType);
+    PyObject_Dir(obj_hash);
+    ((PyDapHashFastObject*)obj_hash)->hash_fast = &((PyDapChainTXInCondObject*)self)->tx_in_cond->header.tx_prev_hash;
+    return obj_hash;
+}
+PyObject *wrapping_dap_chain_tx_in_cond_get_out_prev_idx(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("I", ((PyDapChainTXInCondObject*)self)->tx_in_cond->header.tx_out_prev_idx);
+}
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out.c
new file mode 100644
index 00000000..b01c40da
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out.c
@@ -0,0 +1,14 @@
+#include "wrapping_dap_chain_tx_out.h"
+
+PyObject *wrapping_dap_chain_tx_out_get_addr(PyObject *self, void *closure){
+    (void)closure;
+    PyObject *obj_addr = _PyObject_New(&DapChainAddrObject_DapChainAddrObjectType);
+    obj_addr = PyObject_Init(obj_addr, &DapChainAddrObject_DapChainAddrObjectType);
+    PyObject_Dir(obj_addr);
+    ((PyDapChainAddrObject*)obj_addr)->addr = &((PyDapChainTXOutObject*)self)->tx_out->addr;
+    return obj_addr;
+}
+PyObject *wrapping_dap_chain_tx_out_get_value(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("K", ((PyDapChainTXOutObject*)self)->tx_out->header.value);
+}
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond.c
new file mode 100644
index 00000000..581d84ba
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond.c
@@ -0,0 +1,29 @@
+#include "wrapping_dap_chain_tx_out_cond.h"
+
+PyObject *wrapping_dap_chain_tx_out_cond_get_ts_expires(PyObject *self, void *closure){
+    (void)closure;
+    PyDateTime_IMPORT;
+    return PyDateTime_FromTimestamp((time_t)((PyDapChainTxOutCondObject*)self)->out_cond->header.ts_expires);
+}
+PyObject *wrapping_dap_chain_tx_out_cond_get_value(PyObject *self, void *closure){
+    (void)closure;
+    Py_BuildValue("k", ((PyDapChainTxOutCondObject*)self)->out_cond->header.value);
+}
+PyObject *wrapping_dap_chain_tx_out_cond_get_type_subtype(PyObject *self, void *closure){
+    (void)closure;
+    PyDapChainTxOutCondSubTypeObject *obj_type_subtype = PyObject_New(PyDapChainTxOutCondSubTypeObject,
+                                              &DapChainTxOutCondSubType_DapChainTxOutCondSubTypeType);
+    PyObject_Dir((PyObject*)obj_type_subtype);
+    obj_type_subtype->out_cond_subtype = ((PyDapChainTxOutCondObject*)self)->out_cond->header.subtype;
+    return (PyObject*)obj_type_subtype;
+}
+PyObject *wrapping_dap_chain_tx_out_cond_get_subtype(PyObject *self, void *closure){
+    (void)closure;
+    return Py_None;
+}
+
+PyObject *PyDapChainTxOutCondSubType_str(PyObject *self){
+    return Py_BuildValue("s",
+                         dap_chain_tx_out_cond_subtype_to_str(*((PyDapChainTxOutCondSubTypeObject*)self)->out_cond_subtype)
+                         );
+}
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_pay.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_pay.c
new file mode 100644
index 00000000..44e70156
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_pay.c
@@ -0,0 +1,24 @@
+#include "wrapping_dap_chain_tx_out_cond_subtype_srv_pay.h"
+
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_unit(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("I", ((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_pay.unit.uint32);
+}
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_uid(PyObject *self, void *closure){
+    (void)closure;
+    PyDapChainNetSrvUIDObject *obj_net_srv_uid = PyObject_New(PyDapChainNetSrvUIDObject, &DapChainNetSrvUIDObject_DapChainNetSrvUIDObjectType);
+    PyObject_Dir((PyObject*)obj_net_srv_uid);
+    obj_net_srv_uid->net_srv_uid = ((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_pay.srv_uid;
+    return (PyObject*)obj_net_srv_uid;
+}
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_pkey(PyObject *self, void *closure){
+    (void)closure;
+    PyDapHashFastObject *obj_hash = PyObject_New(PyDapHashFastObject, &DapHashFastObject_DapHashFastObjectType);
+    PyObject_Dir((PyObject*)obj_hash);
+    obj_hash->hash_fast = &((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_pay.pkey_hash;
+    return (PyObject*)obj_hash;
+}
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_pay_get_map_price(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("k", ((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_pay.unit_price_max_datoshi);
+}
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_stake.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_stake.c
new file mode 100644
index 00000000..dfe171b8
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_stake.c
@@ -0,0 +1,20 @@
+#include "wrapping_dap_chain_tx_out_cond_subtype_srv_stake.h"
+
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_stake_get_uid(PyObject *self, void *closure){
+    (void)closure;
+    PyDapChainNetSrvUIDObject *obj_net_srv_uid = PyObject_New(PyDapChainNetSrvUIDObject, &DapChainNetSrvUIDObject_DapChainNetSrvUIDObjectType);
+    PyObject_Dir((PyObject*)obj_net_srv_uid);
+    obj_net_srv_uid->net_srv_uid = ((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_stake.srv_uid;
+    return (PyObject*)obj_net_srv_uid;
+}
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_stake_get_addr(PyObject *self, void *closure){
+    (void)closure;
+    PyDapChainAddrObject *obj_addr = PyObject_New(PyDapChainAddrObject, &DapChainAddrObject_DapChainAddrObjectType);
+    PyObject_Dir((PyObject*)obj_addr);
+    obj_addr->addr = &((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_stake.fee_addr;
+    return (PyObject*)obj_addr;
+}
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_stake_get_value(PyObject *self, void *closure){
+    (void)closure;
+    return PyLong_FromDouble(((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_stake.fee_value);
+}
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.c
new file mode 100644
index 00000000..281adbac
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.c
@@ -0,0 +1,24 @@
+#include "wrapping_dap_chain_tx_out_cond_subtype_srv_xchange.h"
+
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_uid(PyObject *self, void *closure){
+    (void)closure;
+    PyDapChainNetSrvUIDObject *obj_net_srv_uid = PyObject_New(PyDapChainNetSrvUIDObject, &DapChainNetSrvUIDObject_DapChainNetSrvUIDObjectType);
+    PyObject_Dir((PyObject*)obj_net_srv_uid);
+    obj_net_srv_uid->net_srv_uid = ((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_stake.srv_uid;
+    return (PyObject*)obj_net_srv_uid;
+}
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_net_id(PyObject *self, void *closure){
+    (void)closure;
+    PyDapChainNetIdObject *obj_net_id = PyObject_New(PyDapChainNetIdObject, &DapChainNetIdObject_DapChainNetIdObjectType);
+    PyObject_Dir((PyObject*)obj_net_id);
+    obj_net_id->net_id = ((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_xchange.net_id;
+    return (PyObject*)obj_net_id;
+}
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_token(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("s", ((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_xchange.token);
+}
+PyObject *wrapping_dap_chain_tx_out_cond_subtype_srv_xchange_get_value(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("k", ((PyDapChainTxOutCondObject*)self)->out_cond->subtype.srv_xchange.value);
+}
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_ext.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_ext.c
new file mode 100644
index 00000000..092317b1
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_out_ext.c
@@ -0,0 +1,17 @@
+#include "wrapping_dap_chain_tx_out_ext.h"
+
+PyObject *wrapping_dap_chain_tx_out_ext_get_addr(PyObject *self, void *closure){
+    (void)closure;
+    PyObject *obj_addr = _PyObject_New(&DapChainAddrObject_DapChainAddrObjectType);
+    obj_addr = PyObject_Init(obj_addr, &DapChainAddrObject_DapChainAddrObjectType);
+    ((PyDapChainAddrObject*)obj_addr)->addr = &((PyDapChainTXOutExtObject*)self)->out_ext->addr;
+    return obj_addr;
+}
+PyObject *wrapping_dap_chain_tx_out_ext_get_token(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("s", ((PyDapChainTXOutExtObject*)self)->out_ext->token);
+}
+PyObject *wrapping_dap_chain_tx_out_ext_get_value(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("k", ((PyDapChainTXOutExtObject*)self)->out_ext->header.value);
+}
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_pkey.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_pkey.c
new file mode 100644
index 00000000..55468213
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_pkey.c
@@ -0,0 +1,23 @@
+#include "wrapping_dap_chain_tx_pkey.h"
+
+PyObject *wrapping_dap_chain_tx_pkey_sig_type(PyObject *self, void *closure){
+    (void)closure;
+    PyObject *obj_sign_type = _PyObject_New(&DapSignTypeObject_DapSignTypeObjectType);
+    obj_sign_type = PyObject_Init(obj_sign_type, &DapSignTypeObject_DapSignTypeObjectType);
+    PyObject_Dir(obj_sign_type);
+    ((PyDapSignTypeObject*)obj_sign_type)->sign_type= &((PyDapChainTXPkeyObject*)self)->tx_pkey->header.sig_type;
+    return obj_sign_type;
+}
+PyObject *wrapping_dap_chain_tx_pkey_sig_size(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("I", ((PyDapChainTXPkeyObject*)self)->tx_pkey->header.sig_size);
+}
+PyObject *wrapping_dap_chain_tx_pkey_seq_no(PyObject *self, void *closure){
+    return Py_BuildValue("I", ((PyDapChainTXPkeyObject*)self)->tx_pkey->seq_no);
+}
+PyObject *wrapping_dap_chain_tx_pkey_get_pkey(PyObject *self, void *closure){
+    (void)closure;
+    PyDapPkeyObject *obj_pkey = PyObject_NEW(PyDapPkeyObject, &DapPkeyTypeObject_DapPkeyTypeObjectType);
+    obj_pkey->pkey = ((PyDapChainTXPkeyObject*)self)->tx_pkey->pkey;
+    return (PyObject*)obj_pkey;
+}
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_receipt.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_receipt.c
new file mode 100644
index 00000000..0d351718
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_receipt.c
@@ -0,0 +1,57 @@
+#include "wrapping_dap_chain_tx_receipt.h"
+
+PyObject *wrapping_dap_chain_tx_receipt_get_size(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("H", ((PyDapChainTXReceiptObject*)self)->tx_receipt->size);
+}
+PyObject *wrapping_dap_chain_tx_receipt_get_ext_size(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("H", ((PyDapChainTXReceiptObject*)self)->tx_receipt->exts_size);
+}
+PyObject *wrapping_dap_chain_tx_receipt_get_units(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("k", ((PyDapChainTXReceiptObject*)self)->tx_receipt->receipt_info.units);
+}
+PyObject *wrapping_dap_chain_tx_receipt_get_uid(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("k", ((PyDapChainTXReceiptObject*)self)->tx_receipt->receipt_info.srv_uid.uint64);
+}
+PyObject *wrapping_dap_chain_tx_receipt_get_units_type(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("s", serv_unit_enum_to_str(&
+        ((PyDapChainTXReceiptObject*)self)->tx_receipt->receipt_info.units_type.enm));
+}
+PyObject *wrapping_dap_chain_tx_receipt_get_value(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("k", ((PyDapChainTXReceiptObject*)self)->tx_receipt->receipt_info.value_datoshi);
+}
+PyObject *wrapping_dap_chain_tx_receipt_get_sig_provider(PyObject *self, void *closure){
+    uint16_t l_exts_size = ((PyDapChainTXReceiptObject*)self)->tx_receipt->exts_size;
+    if (l_exts_size == sizeof(dap_sign_t) + sizeof(dap_sign_t) || l_exts_size == sizeof(dap_sign_t)){
+        PyObject *obj_sign_provider = _PyObject_New(&DapSignObject_DapSignObjectType);
+        obj_sign_provider = PyObject_Init(obj_sign_provider, &DapSignObject_DapSignObjectType);
+        PyObject_Dir(obj_sign_provider);
+        ((PyDapSignObject*)obj_sign_provider)->sign = DAP_NEW(dap_sign_t);
+        memcpy(
+                ((PyDapSignObject*)obj_sign_provider)->sign,
+                ((PyDapChainTXReceiptObject*)self)->tx_receipt->exts_n_signs,
+                sizeof(dap_sign_t));
+    } else {
+        return Py_None;
+    }
+}
+PyObject *wrapping_dap_chain_tx_receipt_get_sig_client(PyObject *self, void *closure){
+    uint16_t l_exts_size = ((PyDapChainTXReceiptObject*)self)->tx_receipt->exts_size;
+    if (l_exts_size == sizeof(dap_sign_t) + sizeof(dap_sign_t)){
+        PyObject *obj_sign_client = _PyObject_New(&DapSignObject_DapSignObjectType);
+        obj_sign_client = PyObject_Init(obj_sign_client, &DapSignObject_DapSignObjectType);
+        PyObject_Dir(obj_sign_client);
+        ((PyDapSignObject*)obj_sign_client)->sign = DAP_NEW(dap_sign_t);
+        memcpy(
+                ((PyDapSignObject*)obj_sign_client)->sign,
+               ((PyDapChainTXReceiptObject*)self)->tx_receipt->exts_n_signs + sizeof(dap_sign_t),
+               sizeof(dap_sign_t));
+    } else {
+        return Py_None;
+    }
+}
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_sig.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_sig.c
new file mode 100644
index 00000000..5516b5c9
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_sig.c
@@ -0,0 +1,14 @@
+#include "wrapping_dap_chain_tx_sig.h"
+
+PyObject *wrapping_dap_chain_tx_sig_get_sign(PyObject *self, void *closure){
+    (void)closure;
+    PyDapSignObject *obj_sign = PyObject_New(PyDapSignObject, &DapSignObject_DapSignObjectType);
+    PyObject_Dir((PyObject*)obj_sign);
+    obj_sign->sign = (dap_sign_t*)((PyDapChainTXSigObject*)self)->tx_sig->sig;
+    return (PyObject*)obj_sign;
+}
+
+PyObject *wrapping_dap_chain_tx_sig_get_sig_size(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("I", ((PyDapChainTXSigObject*)self)->tx_sig->header.sig_size);
+}
\ No newline at end of file
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_token.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_token.c
new file mode 100644
index 00000000..fdb6fe47
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_token.c
@@ -0,0 +1,20 @@
+#include "wrapping_dap_chain_tx_token.h"
+
+PyObject *wrapping_dap_chain_tx_token_get_ticker(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("s", ((PyDapChainTxTokenObject*)self)->token->header.ticker);
+}
+PyObject *wrapping_dap_chain_tx_token_get_token_emission_hash(PyObject *self, void *closure){
+    (void)closure;
+    PyDapHashFastObject *obj_hash = PyObject_New(PyDapHashFastObject, &DapHashFastObject_DapHashFastObjectType);
+    PyObject_Dir((PyObject*)obj_hash);
+    obj_hash->hash_fast = &((PyDapChainTxTokenObject*)self)->token->header.token_emission_hash;
+    return (PyObject*)obj_hash;
+}
+PyObject *wrapping_dap_chain_tx_token_get_token_emission_chain_id(PyObject *self, void *closure){
+    (void)closure;
+    PyDapChainIDObject *obj_chain_id = PyObject_New(PyDapChainIDObject, &DapChainIDObject_DapChainIDType);
+    PyObject_Dir((PyObject*)obj_chain_id);
+    obj_chain_id->chain_id = &((PyDapChainTxTokenObject*)self)->token->header.token_emission_chain_id;
+    return (PyObject*)obj_chain_id;
+}
diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_token_ext.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_token_ext.c
new file mode 100644
index 00000000..ec0932fc
--- /dev/null
+++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_tx_token_ext.c
@@ -0,0 +1,35 @@
+#include "wrapping_dap_chain_tx_token_ext.h"
+
+PyObject *wrapping_dap_chain_tx_token_ext_get_version(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("B", ((PyDapChainTxTokenExtObject*)self)->token_ext->header.version);
+}
+PyObject *wrapping_dap_chain_tx_token_ext_get_ticker(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("s", ((PyDapChainTxTokenExtObject*)self)->token_ext->header.ticker);
+}
+PyObject *wrapping_dap_chain_tx_token_get_chain_id(PyObject *self, void *closure){
+    (void)closure;
+    PyDapChainIDObject *obj_chain_id = PyObject_New(PyDapChainIDObject, &DapChainIDObject_DapChainIDType);
+    PyObject_Dir((PyObject*)obj_chain_id);
+    obj_chain_id->chain_id = &((PyDapChainTxTokenExtObject*)self)->token_ext->header.ext_chain_id;
+    return (PyObject*)obj_chain_id;
+}
+PyObject *wrapping_dap_chain_tx_token_get_net_id(PyObject *self, void *closure){
+    (void)closure;
+    PyDapChainNetIdObject *obj_net_id = PyObject_New(PyDapChainNetIdObject, &DapChainNetIdObject_DapChainNetIdObjectType);
+    PyObject_Dir((PyObject*)obj_net_id);
+    obj_net_id->net_id = ((PyDapChainTxTokenExtObject*)self)->token_ext->header.ext_net_id;
+    return (PyObject*)obj_net_id;
+}
+PyObject *wrapping_dap_chain_tx_token_get_tx_hash(PyObject *self, void *closure){
+    (void)closure;
+    PyDapHashFastObject *obj_hash = PyObject_New(PyDapHashFastObject, &DapHashFastObject_DapHashFastObjectType);
+    obj_hash->hash_fast = &((PyDapChainTxTokenExtObject*)self)->token_ext->header.ext_tx_hash;
+    PyObject_Dir((PyObject*)obj_hash);
+    return (PyObject*)obj_hash;
+}
+PyObject *wrapping_dap_chain_tx_token_get_tx_out_idx(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("H", ((PyDapChainTxTokenExtObject*)self)->token_ext->header.ext_tx_out_idx);
+}
\ No newline at end of file
diff --git a/modules/cellframe-sdk/net/include/libdap_chain_net_python.h b/modules/cellframe-sdk/net/include/libdap_chain_net_python.h
index 378d71bf..282da126 100644
--- a/modules/cellframe-sdk/net/include/libdap_chain_net_python.h
+++ b/modules/cellframe-sdk/net/include/libdap_chain_net_python.h
@@ -1,3 +1,28 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
 #ifndef _WRAPPING_DAP_NET_PYTHON_
 #define _WRAPPING_DAP_NET_PYTHON_
 
@@ -49,6 +74,8 @@ PyObject *dap_chain_net_get_gdb_group_mempool_py(PyObject *self, PyObject *args)
 PyObject *dap_chain_net_get_gdb_group_mempool_by_chain_type_py(PyObject *self, PyObject *args);
 PyObject *dap_chain_net_links_connect_py(PyObject *self, PyObject *args);
 PyObject *dap_chain_net_get_chain_by_chain_type_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_get_ledger_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_get_name_py(PyObject *self, PyObject *args);
 
 static PyMethodDef DapChainNetMethods[] = {
     {"loadAll", dap_chain_net_load_all_py, METH_NOARGS | METH_STATIC, ""},
@@ -71,6 +98,8 @@ static PyMethodDef DapChainNetMethods[] = {
     {"getGdbGroupMempoolByChainType", dap_chain_net_get_gdb_group_mempool_by_chain_type_py, METH_VARARGS, ""},
     {"linksConnect", dap_chain_net_links_connect_py, METH_VARARGS, ""},
     {"getChainByChainType", dap_chain_net_get_chain_by_chain_type_py, METH_VARARGS, ""},
+    {"getLedger", dap_chain_net_get_ledger_py, METH_NOARGS, ""},
+    {"getName", dap_chain_net_get_name_py, METH_NOARGS, ""},
     {NULL, NULL, 0, NULL}
 };
 
diff --git a/modules/cellframe-sdk/net/src/libdap_chain_net_python.c b/modules/cellframe-sdk/net/src/libdap_chain_net_python.c
index 18f0d5db..fb4aa6c4 100644
--- a/modules/cellframe-sdk/net/src/libdap_chain_net_python.c
+++ b/modules/cellframe-sdk/net/src/libdap_chain_net_python.c
@@ -52,10 +52,19 @@ PyObject *dap_chain_net_proc_datapool_py(PyObject *self, PyObject *args){
 
 PyObject *dap_chain_net_by_name_py(PyObject *self, PyObject *args){
     const char *a_name;
-    if (!PyArg_ParseTuple(args, "s", &a_name))
+    if (!PyArg_ParseTuple(args, "s", &a_name)) {
+        PyErr_SetString(PyExc_AttributeError,
+                        "Invalid argument specified. The first argument for this function must be a string. ");
         return NULL;
+    }
     PyObject *obj_chain_net = _PyObject_New(&DapChainNetObject_DapChainNetObjectType);
+    obj_chain_net = PyObject_Init(obj_chain_net, &DapChainNetObject_DapChainNetObjectType);
+    PyObject_Dir(obj_chain_net);
     ((PyDapChainNetObject*)obj_chain_net)->chain_net = dap_chain_net_by_name(a_name);
+    if (((PyDapChainNetObject*)obj_chain_net)->chain_net == NULL){
+        PyObject_Del(obj_chain_net);
+        return Py_None;
+    }
     return Py_BuildValue("O", obj_chain_net);
 }
 PyObject *dap_chain_net_by_id_py(PyObject *self, PyObject *args){
@@ -63,7 +72,9 @@ PyObject *dap_chain_net_by_id_py(PyObject *self, PyObject *args){
     if (!PyArg_ParseTuple(args, "O", &obj_net_id))
         return NULL;
     PyObject *obj_net = _PyObject_New(&DapChainNetObject_DapChainNetObjectType);
+    obj_net = PyObject_Init(obj_net, &DapChainNetObject_DapChainNetObjectType);
     ((PyDapChainNetObject*)obj_net)->chain_net = dap_chain_net_by_id(((PyDapChainNetIdObject*)obj_net_id)->net_id);
+    PyObject_Dir(obj_net);
     return Py_BuildValue("O", obj_net);
 }
 PyObject *dap_chain_net_id_by_name_py(PyObject *self, PyObject *args){
@@ -85,11 +96,15 @@ PyObject *dap_chain_ledger_by_net_name_py(PyObject *self, PyObject *args){
 
 PyObject *dap_chain_net_get_chain_by_name_py(PyObject *self, PyObject *args){
     const char* chain_name;
-    if (!PyArg_ParseTuple(args, "s", &chain_name))
+    if (!PyArg_ParseTuple(args, "s", &chain_name)) {
+        PyErr_SetString(PyExc_AttributeError, "This function takes one argument, which must be a string.");
         return NULL;
-      PyObject *obj_chain = _PyObject_New(&dapChainObject_dapChainType);
-      ((PyDapChainObject*)obj_chain)->chain_t = dap_chain_net_get_chain_by_name(((PyDapChainNetObject*)self)->chain_net, chain_name);
-      return Py_BuildValue("O", obj_chain);
+    }
+    PyObject *obj_chain = _PyObject_New(&dapChainObject_dapChainType);
+    obj_chain = PyObject_Init(obj_chain, &dapChainObject_dapChainType);
+    PyObject_Dir(obj_chain);
+    ((PyDapChainObject*)obj_chain)->chain_t = dap_chain_net_get_chain_by_name(((PyDapChainNetObject*)self)->chain_net, chain_name);
+    return Py_BuildValue("O", obj_chain);
 }
 
 PyObject *dap_chain_net_get_cur_addr_py(PyObject *self, PyObject *args){
@@ -138,3 +153,17 @@ PyObject *dap_chain_net_get_chain_by_chain_type_py(PyObject *self, PyObject *arg
                 ((PyChainTypeObject*)obj_chain_type)->chain_type);
     return Py_BuildValue("O", obj_chain);
 }
+
+PyObject *dap_chain_net_get_ledger_py(PyObject *self, PyObject *args){
+    (void)args;
+    PyObject *obj_ledger = PyObject_New(PyDapChainLedgerObject, &DapChainLedger_DapChainLedgerType);
+    PyObject_Dir(obj_ledger);
+    ((PyDapChainLedgerObject*)obj_ledger)->ledger = ((PyDapChainNetObject*)self)->chain_net->pub.ledger;
+    return obj_ledger;
+}
+
+PyObject *dap_chain_net_get_name_py(PyObject *self, PyObject *args){
+    (void)args;
+    PyObject *obj_name = PyUnicode_FromString(((PyDapChainNetObject*)self)->chain_net->pub.name);
+    return obj_name;
+}
diff --git a/modules/dap-sdk/crypto/include/wrapping_dap_hash.h b/modules/dap-sdk/crypto/include/wrapping_dap_hash.h
index d161aae3..2cc38398 100644
--- a/modules/dap-sdk/crypto/include/wrapping_dap_hash.h
+++ b/modules/dap-sdk/crypto/include/wrapping_dap_hash.h
@@ -101,6 +101,7 @@ PyObject *dap_hash_fast_compare_py(PyObject *self, PyObject *args);
 PyObject *dap_hash_fast_is_blank_py(PyObject *self, PyObject *args);
 PyObject *dap_chain_hash_fast_to_str_py(PyObject *self, PyObject *args);
 PyObject *dap_chain_hash_fast_to_str_new_py(PyObject *self, PyObject *args);
+PyObject *wrapping_dap_hash_to_str(PyObject *self);
 
 static PyMethodDef DapHashFastMethods[] = {
     {"strToHashFast", (PyCFunction)dap_chain_str_to_hash_fast_py, METH_VARARGS | METH_STATIC, ""},
@@ -109,6 +110,7 @@ static PyMethodDef DapHashFastMethods[] = {
     {"isBlank", (PyCFunction)dap_hash_fast_is_blank_py, METH_VARARGS, ""},
     {"toStr", (PyCFunction)dap_chain_hash_fast_to_str_py, METH_VARARGS, ""},
     {"toStrNew", (PyCFunction)dap_chain_hash_fast_to_str_new_py, METH_VARARGS, ""},
+    {"__str__", (PyCFunction)wrapping_dap_hash_to_str, METH_VARARGS, ""},
     {NULL, NULL, 0, NULL}
 };
 
@@ -128,7 +130,7 @@ static PyTypeObject DapHashFastObject_DapHashFastObjectType = {
     0,                               /* tp_as_mapping */
     0,                               /* tp_hash  */
     0,                               /* tp_call */
-    0,                               /* tp_str */
+    wrapping_dap_hash_to_str,                               /* tp_str */
     0,                               /* tp_getattro */
     0,                               /* tp_setattro */
     0,                               /* tp_as_buffer */
diff --git a/modules/dap-sdk/crypto/include/wrapping_dap_pkey.h b/modules/dap-sdk/crypto/include/wrapping_dap_pkey.h
index 088e244d..b9edef51 100644
--- a/modules/dap-sdk/crypto/include/wrapping_dap_pkey.h
+++ b/modules/dap-sdk/crypto/include/wrapping_dap_pkey.h
@@ -1,14 +1,42 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
 #ifndef _WRAPPING_DAP_PKEY_
 #define _WRAPPING_DAP_PKEY_
 
 #include <Python.h>
 #include "dap_pkey.h"
+#include "wrapping_dap_hash.h"
 
 typedef struct PyDapPkeyType{
     PyObject_HEAD
     dap_pkey_type_t *pkey_type;
 }PyDapPkeyTypeObject;
 
+PyObject *PyDapPkeyType_str(PyObject *self);
+
 static PyTypeObject DapPkeyTypeObject_DapPkeyTypeObjectType = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "CellFrame.PkeyType",       /* tp_name */
@@ -25,7 +53,7 @@ static PyTypeObject DapPkeyTypeObject_DapPkeyTypeObjectType = {
     0,                               /* tp_as_mapping */
     0,                               /* tp_hash  */
     0,                               /* tp_call */
-    0,                               /* tp_str */
+    PyDapPkeyType_str,                               /* tp_str */
     0,                               /* tp_getattro */
     0,                               /* tp_setattro */
     0,                               /* tp_as_buffer */
@@ -58,6 +86,21 @@ typedef struct PyDapPkey{
     dap_pkey_t *pkey;
 }PyDapPkeyObject;
 
+PyObject *wrapping_dap_pkey_get_type(PyObject *self, void *closure);
+PyObject *wrapping_dap_pkey_get_hash(PyObject *self, void *closure);
+PyObject *wrapping_dap_pkey_get_size(PyObject *self, void *closure);
+
+static  PyGetSetDef PyDapPkeyGetsSetsDef[] = {
+    {"hash", (getter)wrapping_dap_pkey_get_hash, NULL, NULL, NULL},
+    {"type", (getter)wrapping_dap_pkey_get_type, NULL, NULL, NULL},
+    {"size", (getter)wrapping_dap_pkey_get_size, NULL, NULL, NULL},
+    {NULL}
+};
+
+static PyMethodDef PyDapPkeyMethods[]={
+        {NULL, NULL, 0, NULL}
+};
+
 static PyTypeObject DapPkeyObject_DapPkeyObjectType = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "CellFrame.Pkey",       /* tp_name */
@@ -81,16 +124,16 @@ static PyTypeObject DapPkeyObject_DapPkeyObjectType = {
     Py_TPFLAGS_DEFAULT |
         Py_TPFLAGS_BASETYPE,         /* tp_flags */
     "Pkey object",        /* tp_doc */
-    0,		                         /* tp_traverse */
-    0,		                         /* tp_clear */
-    0,		                         /* tp_richcompare */
-    0,                               /* tp_weaklistoffset */
-    0,		                         /* tp_iter */
+    0,		                             /* tp_traverse */
+    0,		                        /* tp_clear */
+    0,		                           /* tp_richcompare */
+    0,                           /* tp_weaklistoffset */
+    0,		                  /* tp_iter */
     0,		                         /* tp_iternext */
-    0,                               /* tp_methods */
-    0,                               /* tp_members */
-    0,                               /* tp_getset */
-    0,                               /* tp_base */
+    PyDapPkeyMethods,                          /* tp_methods */
+    0,                              /* tp_members */
+    PyDapPkeyGetsSetsDef,                     /* tp_getset */
+    0,                              /* tp_base */
     0,                               /* tp_dict */
     0,                               /* tp_descr_get */
     0,                               /* tp_descr_set */
diff --git a/modules/dap-sdk/crypto/include/wrapping_dap_sign.h b/modules/dap-sdk/crypto/include/wrapping_dap_sign.h
index 1c944209..55fbaa5a 100644
--- a/modules/dap-sdk/crypto/include/wrapping_dap_sign.h
+++ b/modules/dap-sdk/crypto/include/wrapping_dap_sign.h
@@ -1,14 +1,42 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * CellFrame       https://cellframe.net
+ * Sources         https://gitlab.demlabs.net/cellframe
+ * Copyright  (c) 2017-2021
+ * 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 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/>.
+*/
+
 #ifndef _WRAPPING_DAP_SIGN_
 #define _WRAPPING_DAP_SIGN_
 
 #include <Python.h>
 #include "dap_sign.h"
+#include "wrapping_dap_pkey.h"
 
 typedef struct PyDapSignType{
     PyObject_HEAD
     dap_sign_type_t *sign_type;
 }PyDapSignTypeObject;
 
+PyObject *PyDapSignType_to_str(PyObject *self);
+
 static PyTypeObject DapSignTypeObject_DapSignTypeObjectType = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "CellFrame.SignType",       /* tp_name */
@@ -25,7 +53,7 @@ static PyTypeObject DapSignTypeObject_DapSignTypeObjectType = {
     0,                               /* tp_as_mapping */
     0,                               /* tp_hash  */
     0,                               /* tp_call */
-    0,                               /* tp_str */
+    PyDapSignType_to_str,                               /* tp_str */
     0,                               /* tp_getattro */
     0,                               /* tp_setattro */
     0,                               /* tp_as_buffer */
@@ -51,4 +79,67 @@ static PyTypeObject DapSignTypeObject_DapSignTypeObjectType = {
     PyType_GenericNew,               /* tp_new */
 };
 
+typedef struct PyDapSign{
+    PyObject_HEAD
+    dap_sign_t *sign;
+}PyDapSignObject;
+
+PyObject *wrapping_dap_sign_get_type(PyObject *self, void *closure);
+PyObject *wrapping_dap_sign_get_pkey(PyObject *self, void *closure);
+PyObject *wrapping_dap_sign_get_size(PyObject *self, void *closure);
+
+static PyGetSetDef DapSignObjectGetsSetsDef[] = {
+        {"type", (getter)wrapping_dap_sign_get_type, NULL, NULL, NULL},
+        {"pkey", (getter)wrapping_dap_sign_get_pkey, NULL, NULL, NULL},
+        {"size", (getter)wrapping_dap_sign_get_size, NULL, NULL, NULL},
+        {NULL}
+};
+
+static PyTypeObject DapSignObject_DapSignObjectType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "DAP.Sign",       /* tp_name */
+        sizeof(PyDapSignObject),/* tp_basicsize */
+        0,                               /* tp_itemsize */
+        0,                               /* 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 */
+        "Sign object",        /* tp_doc */
+        0,		                         /* tp_traverse */
+        0,		                         /* tp_clear */
+        0,		                         /* tp_richcompare */
+        0,                               /* tp_weaklistoffset */
+        0,		                         /* tp_iter */
+        0,		                         /* tp_iternext */
+        0,                               /* tp_methods */
+        0,                               /* tp_members */
+        DapSignObjectGetsSetsDef,                               /* 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 */
+        PyType_GenericNew,               /* tp_new */
+};
+
+static bool PyDapSignObject_Check(PyObject *self){
+    return PyObject_TypeCheck(self, &DapSignObject_DapSignObjectType);
+}
+
+
 #endif // _WRAPPING_DAP_SIGN_
diff --git a/modules/dap-sdk/crypto/src/wrapping_dap_hash.c b/modules/dap-sdk/crypto/src/wrapping_dap_hash.c
index ece1bd62..9d1eced2 100644
--- a/modules/dap-sdk/crypto/src/wrapping_dap_hash.c
+++ b/modules/dap-sdk/crypto/src/wrapping_dap_hash.c
@@ -13,11 +13,13 @@ PyObject *DAP_HASH_TYPE_SLOW_0_PY(){
 
 PyObject *dap_chain_str_to_hash_fast_py(PyObject *self, PyObject *args){
     const char *hash_str;
-    PyObject *obj_hash_fast;
-    if (!PyArg_ParseTuple(args, "s|O", &hash_str, &obj_hash_fast))
+    if (!PyArg_ParseTuple(args, "s", &hash_str))
         return NULL;
-    int res = dap_chain_hash_fast_from_str(hash_str, ((PyDapHashFastObject*)obj_hash_fast)->hash_fast);
-    return Py_BuildValue("nO", res, obj_hash_fast);
+    PyDapHashFastObject *obj_hash_fast = PyObject_New(PyDapHashFastObject, &DapHashFastObject_DapHashFastObjectType);
+    PyObject_Dir((PyObject*)obj_hash_fast);
+    obj_hash_fast->hash_fast = DAP_NEW(dap_hash_fast_t);
+    int res = dap_chain_hash_fast_from_str(hash_str, obj_hash_fast->hash_fast);
+    return Py_BuildValue("nO", res, (PyObject*)obj_hash_fast);
 }
 
 PyObject *dap_hash_fast_py(PyObject *self, PyObject *args){
@@ -66,3 +68,13 @@ PyObject *dap_chain_hash_fast_to_str_new_py(PyObject *self, PyObject *args){
     char *res = dap_chain_hash_fast_to_str_new(((PyDapHashFastObject*)self)->hash_fast);
     return Py_BuildValue("s", res);
 }
+
+PyObject *wrapping_dap_hash_to_str(PyObject *self){
+    char str[70];
+    if (((PyDapHashFastObject*)self)->hash_fast == NULL){
+        Py_BuildValue("s", "Hash is missing.");
+    }
+    int res = dap_chain_hash_fast_to_str(((PyDapHashFastObject*)self)->hash_fast, str, 70);
+    PyObject *obj_str = PyUnicode_FromStringAndSize(str, res);
+    return obj_str;
+}
diff --git a/modules/dap-sdk/crypto/src/wrapping_dap_pkey.c b/modules/dap-sdk/crypto/src/wrapping_dap_pkey.c
new file mode 100644
index 00000000..cacc8b05
--- /dev/null
+++ b/modules/dap-sdk/crypto/src/wrapping_dap_pkey.c
@@ -0,0 +1,25 @@
+#include "wrapping_dap_pkey.h"
+
+PyObject *PyDapPkeyType_str(PyObject *self){
+    const char *str = dap_pkey_type_to_str(*((PyDapPkeyTypeObject*)self)->pkey_type);
+    return Py_BuildValue("s", str);
+}
+
+PyObject *wrapping_dap_pkey_get_type(PyObject *self, void *closure){
+    (void)closure;
+    PyDapPkeyTypeObject *obj_type_pkey = PyObject_New(PyDapPkeyTypeObject, &DapPkeyTypeObject_DapPkeyTypeObjectType);
+    PyObject_Dir((PyObject*)obj_type_pkey);
+    obj_type_pkey->pkey_type = &((PyDapPkeyObject*)self)->pkey->header.type;
+    return (PyObject*)obj_type_pkey;
+}
+PyObject *wrapping_dap_pkey_get_hash(PyObject *self, void *closure){
+    (void)closure;
+    PyDapHashFastObject *obj_hash = PyObject_New(PyDapHashFastObject, &DapHashFastObject_DapHashFastObjectType);
+    PyObject_Dir((PyObject*)obj_hash);
+    dap_hash_fast(((PyDapPkeyObject*)self)->pkey->pkey, ((PyDapPkeyObject*)self)->pkey->header.size, obj_hash->hash_fast);
+    return (PyObject*)obj_hash;
+}
+PyObject *wrapping_dap_pkey_get_size(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("I", ((PyDapPkeyObject*)self)->pkey->header.size);
+}
diff --git a/modules/dap-sdk/crypto/src/wrapping_dap_sign.c b/modules/dap-sdk/crypto/src/wrapping_dap_sign.c
new file mode 100644
index 00000000..9ac7d275
--- /dev/null
+++ b/modules/dap-sdk/crypto/src/wrapping_dap_sign.c
@@ -0,0 +1,24 @@
+#include "wrapping_dap_sign.h"
+
+PyObject *PyDapSignType_to_str(PyObject *self){
+    return Py_BuildValue("s", dap_sign_type_to_str(*((PyDapSignTypeObject*)self)->sign_type));
+}
+
+PyObject *wrapping_dap_sign_get_type(PyObject *self, void *closure){
+    (void)closure;
+    PyDapSignTypeObject *obj_type_sign = PyObject_New(PyDapSignTypeObject, &DapSignTypeObject_DapSignTypeObjectType);
+    PyObject_Dir((PyObject*)obj_type_sign);
+    obj_type_sign->sign_type = &((PyDapSignObject*)self)->sign->header.type;
+    return (PyObject*)obj_type_sign;
+}
+PyObject *wrapping_dap_sign_get_pkey(PyObject *self, void *closure){
+    (void)closure;
+    PyDapPkeyObject *obj_pkey = PyObject_New(PyDapPkeyObject, &DapPkeyObject_DapPkeyObjectType);
+    PyObject_Dir((PyObject*)obj_pkey);
+    obj_pkey->pkey = (dap_pkey_t*)((PyDapSignObject*)self)->sign->pkey_n_sign;
+    return (PyObject*)obj_pkey;
+}
+PyObject *wrapping_dap_sign_get_size(PyObject *self, void *closure){
+    (void)closure;
+    return Py_BuildValue("I", ((PyDapSignObject*)self)->sign->header.sign_size);
+}
\ No newline at end of file
diff --git a/modules/dap-sdk/net/server/json_rpc/CMakeLists.txt b/modules/dap-sdk/net/server/json_rpc/CMakeLists.txt
new file mode 100644
index 00000000..6b09ef11
--- /dev/null
+++ b/modules/dap-sdk/net/server/json_rpc/CMakeLists.txt
@@ -0,0 +1,49 @@
+project(dap_server_json_rpc_python_module C)
+cmake_minimum_required(VERSION 3.0)
+
+set(CMAKE_VERBOSE_MAKEFILE ON)
+set(CMAKE_COLOR_MAKEFILE   ON)
+set(CMAKE_C_STANDARD 11)
+add_definitions("-fpic")
+
+if(NOT (${SUBMODULES_NO_BUILD} MATCHES ON))
+    if (NOT (TARGET dap_core))
+        add_subdirectory(libdap)
+        target_compile_options(
+            dap_core PRIVATE 
+            "-fpic"
+        )
+    endif()
+endif()
+
+file(GLOB SERVER_JSON_RPC_SIMPLE_SRCS src/*.c)
+file(GLOB SERVER_JSON_RPC_SIMPLE_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 ${SERVER_JSON_RPC_SIMPLE_SRCS} ${SERVER_JSON_RPC_SIMPLE_HEADERS} ${CORE_UNIX_SRCS})
+
+target_link_libraries(${PROJECT_NAME} ${PYTHON_LIBRARIES})
+
+target_compile_options(
+    dap_core PRIVATE 
+    "-fpic"
+)
+
+target_link_libraries(${PROJECT_NAME}
+    dap_core dap_http_server
+    dap_server_core_python_module
+    dap_json_rpc
+    dap_server_http_python_module
+    ${PYTHON_LIBRARIES})
+
+target_include_directories(${PROJECT_NAME} PUBLIC include/ )
+
+#if(BUILD_DAP_PYTHON_TESTS)
+#    add_subdirectory(test)
+#    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test/main_test.py
+#                DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/test/)
+#endif()
+
diff --git a/modules/dap-sdk/net/server/json_rpc/include/wrapping_json_rpc_request.h b/modules/dap-sdk/net/server/json_rpc/include/wrapping_json_rpc_request.h
new file mode 100644
index 00000000..c219c663
--- /dev/null
+++ b/modules/dap-sdk/net/server/json_rpc/include/wrapping_json_rpc_request.h
@@ -0,0 +1,79 @@
+#pragma once
+#include <Python.h>
+#include "wrapping_dap_http_simple.h"
+#include "uthash.h"
+#include "dap_common.h"
+#include "dap_strfuncs.h"
+#include "dap_json_rpc_request_handler.h"
+#include "dap_json_rpc_params.h"
+#include "wrapping_json_rpc_response.h"
+//#include "wrapping_dap_json_rpc_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct PyDAPJsonRPCRequest {
+    PyObject_HEAD
+    dap_json_rpc_request_t *request;
+} PyDAPJsonRPCRequestObject;
+
+struct _w_json_rpc_handler{
+    char *method;
+    PyObject *call_func;
+    UT_hash_handle hh;
+};
+
+PyObject* dap_json_roc_request_send_py(PyObject *self, PyObject *args);
+PyObject* dap_json_rpc_request_reg_handler_py(PyObject *self, PyObject *args);
+
+static PyMethodDef PyDapJSONRPCRequestMethods[] = {
+        {"registrationHandler", (PyCFunction)dap_json_rpc_request_reg_handler_py, METH_VARARGS | METH_STATIC    , ""},
+        {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapJSONRPCRequest_DapJSONRPCRequestType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.JSONRPC.Request",             /* tp_name */
+        sizeof(PyDAPJsonRPCRequestObject),                   /* tp_basicsize */
+        0,                                                 /* tp_itemsize */
+        0,                                                 /* 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 */
+        "Dap JSON RPC request object",                         /* tp_doc */
+        0,                                               /* tp_traverse */
+        0,                                               /* tp_clear */
+        0,                                               /* tp_richcompare */
+        0,                                               /* tp_weaklistoffset */
+        0,                                               /* tp_iter */
+        0,                                               /* tp_iternext */
+        PyDapJSONRPCRequestMethods,                   /* 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 */
+        PyType_GenericNew,                                 /* tp_new */
+};
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/dap-sdk/net/server/json_rpc/include/wrapping_json_rpc_response.h b/modules/dap-sdk/net/server/json_rpc/include/wrapping_json_rpc_response.h
new file mode 100644
index 00000000..91d5dd19
--- /dev/null
+++ b/modules/dap-sdk/net/server/json_rpc/include/wrapping_json_rpc_response.h
@@ -0,0 +1,67 @@
+#pragma once
+#include "Python.h"
+#include "dap_json_rpc_response.h"
+
+typedef struct PyDapJSONRPCResponse{
+    PyObject_HEAD
+    dap_json_rpc_response_t *response;
+}PyDapJSONRPCResponseObject;
+
+int wrapping_json_rpc_response_set_result(PyObject *self, PyObject *args, void *closure);
+PyObject *wrapping_json_rpc_response_get_result(PyObject *self, void *closure);
+PyObject *wrapping_json_rpc_response_get_error(PyObject *self, void *closure);
+int wrapping_json_rpc_response_set_error(PyObject *self, PyObject *args, void *closure);
+PyObject *wrapping_json_rpc_response_get_id(PyObject *self, void *closure);
+
+static PyMethodDef PyDapJSONRPCResponseMethods[] = {
+        {NULL, NULL, 0, NULL}
+};
+
+static PyGetSetDef PyDapJSONRPCResponseGetsSets[] = {
+    {"ID", (getter)wrapping_json_rpc_response_get_id, NULL, "ID request", NULL},
+    {"Error", (getter)wrapping_json_rpc_response_get_error, (setter)wrapping_json_rpc_response_set_error, "", NULL },
+    {"Result", (getter)wrapping_json_rpc_response_get_result, (setter)wrapping_json_rpc_response_set_result, "", NULL},
+    {NULL, NULL, NULL, NULL, NULL}
+};
+
+static PyTypeObject DapJSONRPCResponse_DapJSONRPCResponseType = {
+        PyVarObject_HEAD_INIT(NULL, 0)
+        "CellFrame.JSONRPC.Response",             /* tp_name */
+        sizeof(PyDapJSONRPCResponseObject),                   /* tp_basicsize */
+        0,                                                 /* tp_itemsize */
+        0,                                                 /* 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 */
+        "Dap JSON RPC response object",                         /* tp_doc */
+        0,                                               /* tp_traverse */
+        0,                                               /* tp_clear */
+        0,                                               /* tp_richcompare */
+        0,                                               /* tp_weaklistoffset */
+        0,                                               /* tp_iter */
+        0,                                               /* tp_iternext */
+        PyDapJSONRPCResponseMethods,                   /* tp_methods */
+        0,                                                 /* tp_members */
+        PyDapJSONRPCResponseGetsSets,                          /* 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 */
+        PyType_GenericNew,                                 /* tp_new */
+};
diff --git a/modules/dap-sdk/net/server/json_rpc/src/wrapping_json_rpc_request.c b/modules/dap-sdk/net/server/json_rpc/src/wrapping_json_rpc_request.c
new file mode 100644
index 00000000..53244c7c
--- /dev/null
+++ b/modules/dap-sdk/net/server/json_rpc/src/wrapping_json_rpc_request.c
@@ -0,0 +1,92 @@
+#include "wrapping_json_rpc_request.h"
+
+#define LOG_TAG "wrapping_json_rpc_request"
+
+struct _w_json_rpc_handler *handlers = NULL;
+
+void _w_dap_json_rpc_request_handler(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method){
+    int count_params = a_params->lenght;
+    PyDapJSONRPCResponseObject *obj_response = PyObject_NEW(PyDapJSONRPCResponseObject, &DapJSONRPCResponse_DapJSONRPCResponseType);
+    obj_response = PyObject_Init((PyObject*)obj_response, &DapJSONRPCResponse_DapJSONRPCResponseType);
+    obj_response->response = a_response;
+    PyObject *obj_params = PyList_New(count_params);
+    for (int i=0; i < count_params; i++) {
+        bool tmp_bool;
+        double tmp_double;
+        int tmp_int;
+        char *tmp_string;
+        PyObject *obj_ptr = NULL;
+        switch (a_params->params[i]->type) {
+            case TYPE_PARAM_BOOLEAN:
+                tmp_bool = *(bool *) a_params->params[i]->value_param;
+                obj_ptr = tmp_bool ? Py_True : Py_False;
+                break;
+            case TYPE_PARAM_DOUBLE:
+                tmp_double = *(double *) (a_params->params[i]->value_param);
+                obj_ptr = PyLong_FromDouble(tmp_double);
+                break;
+            case TYPE_PARAM_INTEGER:
+                tmp_int = *(int *) a_params->params[i]->value_param;
+                obj_ptr = PyLong_FromLong(tmp_int);
+                break;
+            case TYPE_PARAM_STRING:
+                tmp_string = (char *) a_params->params[i]->value_param;
+                obj_ptr = PyUnicode_FromString(tmp_string);
+                break;
+
+        }
+        if (obj_ptr != NULL) {
+            PyList_SetItem(obj_params, i, obj_ptr);
+        }
+    }
+    PyObject *args = Py_BuildValue("OO", obj_params, (PyObject*)obj_response);
+    Py_XINCREF(args);
+    struct _w_json_rpc_handler *func = NULL;
+    HASH_FIND_STR(handlers, a_method, func);
+    if (func != NULL){
+        PyGILState_STATE GILState = PyGILState_Ensure();
+        PyObject_Dir((PyObject*)obj_response);
+        //Called python func
+        PyObject *obj_result = PyObject_CallObject(func->call_func, args);
+        PyErr_Print();
+        PyGILState_Release(GILState);
+        if (!obj_result){
+            log_it(L_ERROR, "Can't called method: %s", a_method);
+            a_response->type_result = TYPE_RESPONSE_NULL;
+            a_response->error = dap_json_rpc_error_JSON_create();
+            a_response->error->code_error = 0xF1;
+            a_response->error->msg = "Can't called method";
+            //a_response->error = dap_json_rpc_error_search_by_code(1);
+            return;
+        }
+    } else {
+        log_it(L_WARNING, "%s method can't be called, it is not in the python function call table.");
+        a_response->type_result = TYPE_RESPONSE_NULL;
+        a_response->error = dap_json_rpc_error_search_by_code(1);
+    }
+    Py_XDECREF(args);
+}
+
+PyObject* dap_json_rpc_request_reg_handler_py(PyObject *self, PyObject *args){
+    PyObject *obj_func = NULL;
+    char *method = NULL;
+    if (!PyArg_ParseTuple(args, "sO", &method, &obj_func)) {
+        PyErr_SetString(PyExc_ValueError, "The function was called with invalid arguments , this function must take two"
+                                          "arguments, a string and a callback function.");
+        return NULL;
+    }
+    if(!PyCallable_Check(obj_func)){
+        PyErr_SetString(PyExc_ValueError, "The second argument is not a callback function.");
+        return NULL;
+    }
+    if (dap_json_rpc_registration_request_handler(method, _w_dap_json_rpc_request_handler) != 0){
+        PyErr_SetString(PyExc_IndexError, "A handler with this name has already been registered.");
+        return NULL;
+    }
+    struct _w_json_rpc_handler *handler = DAP_NEW(struct _w_json_rpc_handler);
+    handler->method = dap_strdup(method);
+    Py_INCREF(obj_func);
+    handler->call_func = obj_func;
+    HASH_ADD_STR(handlers, method, handler);
+    return Py_None;
+}
diff --git a/modules/dap-sdk/net/server/json_rpc/src/wrapping_json_rpc_response.c b/modules/dap-sdk/net/server/json_rpc/src/wrapping_json_rpc_response.c
new file mode 100644
index 00000000..463ff1ff
--- /dev/null
+++ b/modules/dap-sdk/net/server/json_rpc/src/wrapping_json_rpc_response.c
@@ -0,0 +1,96 @@
+#include "wrapping_json_rpc_response.h"
+
+#define LOG_TAG "wrapping_json_rpc_response"
+
+int wrapping_json_rpc_response_set_result(PyObject *self, PyObject *value, void *closure){
+    UNUSED(closure);
+    dap_json_rpc_response_t *l_resp = ((PyDapJSONRPCResponseObject*)self)->response;
+    if (value == NULL){
+        if (l_resp->type_result == TYPE_RESPONSE_STRING){
+            DAP_FREE(l_resp->result_string);
+        }
+        l_resp->type_result = TYPE_RESPONSE_NULL;
+        return 0;
+    }
+    if(PyUnicode_Check(value)){
+        const char *tmp_ptr = PyUnicode_AsUTF8(value);
+        size_t l_size_str = dap_strlen(tmp_ptr);
+        l_resp->result_string = DAP_NEW_SIZE(char, l_size_str);
+        memcpy(l_resp->result_string, tmp_ptr, l_size_str);
+        l_resp->type_result = TYPE_RESPONSE_STRING;
+    }
+    if (PyBool_Check(value)){
+        if (value == Py_True){
+            l_resp->result_boolean = true;
+        } else {
+            l_resp->result_boolean = false;
+        }
+        l_resp->type_result = TYPE_RESPONSE_BOOLEAN;
+    }
+    if (PyLong_Check(value)){
+        int tmp = _PyLong_AsInt(value);
+        l_resp->result_int = tmp;
+        l_resp->type_result = TYPE_RESPONSE_INTEGER;
+    }
+    if (PyFloat_Check(value)){
+        l_resp->result_double = PyFloat_AsDouble(value);
+        l_resp->type_result = TYPE_RESPONSE_DOUBLE;
+    }
+    return 0;
+}
+PyObject *wrapping_json_rpc_response_get_result(PyObject *self, void *closure){
+    UNUSED(closure);
+    dap_json_rpc_response_t *l_resp = ((PyDapJSONRPCResponseObject*)self)->response;
+    switch (l_resp->type_result) {
+    case TYPE_RESPONSE_BOOLEAN:
+        return l_resp->result_boolean ? Py_BuildValue("O", Py_True) : Py_BuildValue("O", Py_False);
+        break;
+    case TYPE_RESPONSE_INTEGER:
+        return PyLong_FromLong(l_resp->result_int);
+        break;
+    case TYPE_RESPONSE_DOUBLE:
+        return PyLong_FromDouble(l_resp->result_double);
+        break;
+    case TYPE_RESPONSE_STRING:
+        return Py_BuildValue("s", l_resp->result_string);
+        break;
+    case TYPE_RESPONSE_NULL:
+        return Py_BuildValue("O", Py_None);
+        break;
+    }
+}
+PyObject *wrapping_json_rpc_response_get_error(PyObject *self, void *closure){
+    UNUSED(closure);
+    dap_json_rpc_response_t* l_resp = ((PyDapJSONRPCResponseObject*)self)->response;
+    if (l_resp->error)
+        return Py_BuildValue("is", l_resp->error->code_error, l_resp->error->msg);
+    else
+        return PyTuple_New(2);
+}
+int wrapping_json_rpc_response_set_error(PyObject *self, PyObject *args, void *closure){
+    UNUSED(closure);
+    if (args == NULL){
+        if (((PyDapJSONRPCResponseObject*)self)->response->error == NULL){
+            return -1;
+        }
+        DAP_FREE(((PyDapJSONRPCResponseObject*)self)->response->error->msg);
+        DAP_FREE(((PyDapJSONRPCResponseObject*)self)->response->error);
+        return 0;
+    }
+    int code;
+    char *message;
+    if(!PyArg_ParseTuple(args, "is", &code, &message)){
+        return -1;
+    }
+    ((PyDapJSONRPCResponseObject*)self)->response->error = DAP_NEW(dap_json_rpc_error_t);
+    ((PyDapJSONRPCResponseObject*)self)->response->error->code_error = code;
+    size_t lenght_message = dap_strlen(message);
+    ((PyDapJSONRPCResponseObject*)self)->response->error->msg = DAP_NEW_SIZE(char, lenght_message);
+    memcpy(((PyDapJSONRPCResponseObject*)self)->response->error->msg, message, lenght_message);
+    return 0;
+}
+PyObject *wrapping_json_rpc_response_get_id(PyObject *self, void *closure){
+    UNUSED(closure);
+    dap_json_rpc_response_t* l_resp = ((PyDapJSONRPCResponseObject*)self)->response;
+    return  PyLong_FromLong(l_resp->id);
+}
-- 
GitLab